Initial commit.

This commit is contained in:
Burak Kaan Köse
2024-04-18 01:44:37 +02:00
parent 524ea4c0e1
commit 12d3814626
671 changed files with 77295 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace Wino.Helpers
{
public static class JsonHelpers
{
public static async Task<T> ToObjectAsync<T>(string value)
{
return await Task.Run<T>(() =>
{
return JsonConvert.DeserializeObject<T>(value);
});
}
public static async Task<string> StringifyAsync(object value)
{
return await Task.Run<string>(() =>
{
return JsonConvert.SerializeObject(value);
});
}
}
}

View File

@@ -0,0 +1,119 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Windows.Storage;
using Windows.Storage.Streams;
namespace Wino.Helpers
{
// Use these extension methods to store and retrieve local and roaming app data
// More details regarding storing and retrieving app data at https://docs.microsoft.com/windows/uwp/app-settings/store-and-retrieve-app-data
public static class SettingsStorageExtensions
{
private const string FileExtension = ".json";
public static bool IsRoamingStorageAvailable(this ApplicationData appData)
{
return appData.RoamingStorageQuota == 0;
}
public static async Task SaveAsync<T>(this StorageFolder folder, string name, T content)
{
var file = await folder.CreateFileAsync(GetFileName(name), CreationCollisionOption.ReplaceExisting);
var fileContent = await JsonHelpers.StringifyAsync(content);
await FileIO.WriteTextAsync(file, fileContent);
}
public static async Task<T> ReadAsync<T>(this StorageFolder folder, string name)
{
if (!File.Exists(Path.Combine(folder.Path, GetFileName(name))))
{
return default;
}
var file = await folder.GetFileAsync($"{name}.json");
var fileContent = await FileIO.ReadTextAsync(file);
return await JsonHelpers.ToObjectAsync<T>(fileContent);
}
public static async Task SaveAsync<T>(this ApplicationDataContainer settings, string key, T value)
{
settings.SaveString(key, await JsonHelpers.StringifyAsync(value));
}
public static void SaveString(this ApplicationDataContainer settings, string key, string value)
{
settings.Values[key] = value;
}
public static async Task<T> ReadAsync<T>(this ApplicationDataContainer settings, string key)
{
object obj = null;
if (settings.Values.TryGetValue(key, out obj))
{
return await JsonHelpers.ToObjectAsync<T>((string)obj);
}
return default;
}
public static async Task<StorageFile> SaveFileAsync(this StorageFolder folder, byte[] content, string fileName, CreationCollisionOption options = CreationCollisionOption.ReplaceExisting)
{
if (content == null)
{
throw new ArgumentNullException(nameof(content));
}
if (string.IsNullOrEmpty(fileName))
{
throw new ArgumentException("File name is null or empty. Specify a valid file name", nameof(fileName));
}
var storageFile = await folder.CreateFileAsync(fileName, options);
await FileIO.WriteBytesAsync(storageFile, content);
return storageFile;
}
public static async Task<byte[]> ReadFileAsync(this StorageFolder folder, string fileName)
{
var item = await folder.TryGetItemAsync(fileName).AsTask().ConfigureAwait(false);
if ((item != null) && item.IsOfType(StorageItemTypes.File))
{
var storageFile = await folder.GetFileAsync(fileName);
byte[] content = await storageFile.ReadBytesAsync();
return content;
}
return null;
}
public static async Task<byte[]> ReadBytesAsync(this StorageFile file)
{
if (file != null)
{
using (IRandomAccessStream stream = await file.OpenReadAsync())
{
using (var reader = new DataReader(stream.GetInputStreamAt(0)))
{
await reader.LoadAsync((uint)stream.Size);
var bytes = new byte[stream.Size];
reader.ReadBytes(bytes);
return bytes;
}
}
}
return null;
}
private static string GetFileName(string name)
{
return string.Concat(name, FileExtension);
}
}
}

View File

@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Media;
namespace Wino.Helpers
{
public static class WinoVisualTreeHelper
{
public static T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
T grandChild = null;
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
{
return (T)child;
}
else
{
grandChild = GetChildObject<T>(child, name);
}
if (grandChild != null)
{
return grandChild;
}
}
return null;
}
}
}

View File

@@ -0,0 +1,399 @@
using System;
using System.Linq;
using Microsoft.Toolkit.Uwp.Helpers;
using Microsoft.UI.Xaml.Controls;
using Windows.UI;
using Windows.UI.Text;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Markup;
using Windows.UI.Xaml.Media;
using Wino.Controls;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.MailItem;
using Wino.Core.Domain.Models.Reader;
namespace Wino.Helpers
{
public static class XamlHelpers
{
#region Converters
public static Visibility ReverseBoolToVisibilityConverter(bool value) => value ? Visibility.Collapsed : Visibility.Visible;
public static Visibility ReverseVisibilityConverter(Visibility visibility) => visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
public static bool ReverseBoolConverter(bool value) => !value;
public static bool ShouldDisplayPreview(string text) => text.Any(x => char.IsLetter(x));
public static bool CountToBooleanConverter(int value) => value > 0;
public static bool ObjectEquals(object obj1, object obj2) => object.Equals(obj1, obj2);
public static Visibility CountToVisibilityConverter(int value) => value > 0 ? Visibility.Visible : Visibility.Collapsed;
public static InfoBarSeverity InfoBarSeverityConverter(InfoBarMessageType messageType)
{
switch (messageType)
{
case InfoBarMessageType.Information:
return InfoBarSeverity.Informational;
case InfoBarMessageType.Success:
return InfoBarSeverity.Success;
case InfoBarMessageType.Warning:
return InfoBarSeverity.Warning;
case InfoBarMessageType.Error:
return InfoBarSeverity.Error;
default:
return InfoBarSeverity.Informational;
}
}
public static SolidColorBrush GetSolidColorBrushFromHex(string colorHex) => string.IsNullOrEmpty(colorHex) ? new SolidColorBrush(Colors.Transparent) : new SolidColorBrush(colorHex.ToColor());
public static Visibility IsSelectionModeMultiple(ListViewSelectionMode mode) => mode == ListViewSelectionMode.Multiple ? Visibility.Visible : Visibility.Collapsed;
public static FontWeight GetFontWeightBySyncState(bool isSyncing) => isSyncing ? FontWeights.SemiBold : FontWeights.Normal;
public static FontWeight GetFontWeightByChildSelectedState(bool isChildSelected) => isChildSelected ? FontWeights.SemiBold : FontWeights.Normal;
public static Geometry GetPathIcon(string resourceName) => GetPathGeometry(Application.Current.Resources[$"{resourceName}"] as string);
public static GridLength GetGridLength(double width) => new GridLength(width, GridUnitType.Pixel);
public static double MailListAdaptivityConverter(double mailListPaneLength) => mailListPaneLength + 300d;
public static string GetMailItemDisplaySummaryForListing(bool isDraft, DateTime receivedDate, bool prefer24HourTime)
{
if (isDraft)
return Translator.Draft;
else
{
var localTime = receivedDate.ToLocalTime();
return prefer24HourTime ? localTime.ToString("HH:mm") : localTime.ToString("hh:mm tt");
}
}
public static string GetCreationDateString(DateTime date)
{
var localTime = date.ToLocalTime();
return $"{localTime.ToLongDateString()} {localTime.ToLongTimeString()}";
}
public static string GetMailGroupDateString(object groupObject)
{
if (groupObject is string stringObject)
return stringObject;
object dateObject = null;
// From regular mail header template
if (groupObject is DateTime groupedDate)
dateObject = groupedDate;
else if (groupObject is IGrouping<object, IMailItem> groupKey)
{
// From semantic group header.
dateObject = groupKey.Key;
}
if (dateObject != null)
{
if (dateObject is DateTime dateTimeValue)
{
if (dateTimeValue == DateTime.Today)
return Translator.Today;
else if (dateTimeValue == DateTime.Today.AddDays(-1))
return Translator.Yesterday;
else
return dateTimeValue.ToLongDateString();
}
else
return dateObject.ToString();
}
return Translator.UnknownDateHeader;
}
#endregion
#region Wino Font Icon Transformation
public static WinoIconGlyph GetWinoIconGlyph(FilterOptionType type)
{
switch (type)
{
case FilterOptionType.All:
return WinoIconGlyph.SpecialFolderCategory;
case FilterOptionType.Unread:
return WinoIconGlyph.MarkUnread;
case FilterOptionType.Flagged:
return WinoIconGlyph.Flag;
case FilterOptionType.Mentions:
return WinoIconGlyph.NewMail;
default:
return WinoIconGlyph.None;
}
}
public static WinoIconGlyph GetWinoIconGlyph(MailOperation operation)
{
switch (operation)
{
case MailOperation.None:
return WinoIconGlyph.None;
case MailOperation.Archive:
return WinoIconGlyph.Archive;
case MailOperation.UnArchive:
return WinoIconGlyph.UnArchive;
case MailOperation.SoftDelete:
case MailOperation.HardDelete:
return WinoIconGlyph.Delete;
case MailOperation.Move:
return WinoIconGlyph.Forward;
case MailOperation.MoveToJunk:
return WinoIconGlyph.Junk;
case MailOperation.MoveToFocused:
break;
case MailOperation.MoveToOther:
break;
case MailOperation.AlwaysMoveToOther:
break;
case MailOperation.AlwaysMoveToFocused:
break;
case MailOperation.SetFlag:
return WinoIconGlyph.Flag;
case MailOperation.ClearFlag:
return WinoIconGlyph.ClearFlag;
case MailOperation.MarkAsRead:
return WinoIconGlyph.MarkRead;
case MailOperation.MarkAsUnread:
return WinoIconGlyph.MarkUnread;
case MailOperation.MarkAsNotJunk:
return WinoIconGlyph.Junk;
case MailOperation.Ignore:
return WinoIconGlyph.Ignore;
case MailOperation.Reply:
return WinoIconGlyph.Reply;
case MailOperation.ReplyAll:
return WinoIconGlyph.ReplyAll;
case MailOperation.Zoom:
return WinoIconGlyph.Zoom;
case MailOperation.SaveAs:
return WinoIconGlyph.Save;
case MailOperation.Find:
return WinoIconGlyph.Find;
case MailOperation.Forward:
return WinoIconGlyph.Forward;
case MailOperation.DarkEditor:
return WinoIconGlyph.DarkEditor;
case MailOperation.LightEditor:
return WinoIconGlyph.LightEditor;
}
return WinoIconGlyph.None;
}
public static WinoIconGlyph GetPathGeometry(FolderOperation operation)
{
switch (operation)
{
case FolderOperation.None:
return WinoIconGlyph.None;
case FolderOperation.Pin:
return WinoIconGlyph.Pin;
case FolderOperation.Unpin:
return WinoIconGlyph.UnPin;
case FolderOperation.MarkAllAsRead:
return WinoIconGlyph.MarkRead;
case FolderOperation.DontSync:
return WinoIconGlyph.DontSync;
case FolderOperation.Empty:
return WinoIconGlyph.EmptyFolder;
case FolderOperation.Rename:
return WinoIconGlyph.Rename;
case FolderOperation.Delete:
return WinoIconGlyph.Delete;
case FolderOperation.Move:
return WinoIconGlyph.Forward;
case FolderOperation.TurnOffNotifications:
return WinoIconGlyph.TurnOfNotifications;
case FolderOperation.CreateSubFolder:
return WinoIconGlyph.CreateFolder;
}
return WinoIconGlyph.None;
}
public static WinoIconGlyph GetSpecialFolderPathIconGeometry(SpecialFolderType specialFolderType)
{
switch (specialFolderType)
{
case SpecialFolderType.Inbox:
return WinoIconGlyph.SpecialFolderInbox;
case SpecialFolderType.Starred:
return WinoIconGlyph.SpecialFolderStarred;
case SpecialFolderType.Important:
return WinoIconGlyph.SpecialFolderImportant;
case SpecialFolderType.Sent:
return WinoIconGlyph.SpecialFolderSent;
case SpecialFolderType.Draft:
return WinoIconGlyph.SpecialFolderDraft;
case SpecialFolderType.Archive:
return WinoIconGlyph.SpecialFolderArchive;
case SpecialFolderType.Deleted:
return WinoIconGlyph.SpecialFolderDeleted;
case SpecialFolderType.Junk:
return WinoIconGlyph.SpecialFolderJunk;
case SpecialFolderType.Chat:
return WinoIconGlyph.SpecialFolderChat;
case SpecialFolderType.Category:
return WinoIconGlyph.SpecialFolderCategory;
case SpecialFolderType.Unread:
return WinoIconGlyph.SpecialFolderUnread;
case SpecialFolderType.Forums:
return WinoIconGlyph.SpecialFolderForums;
case SpecialFolderType.Updates:
return WinoIconGlyph.SpecialFolderUpdated;
case SpecialFolderType.Personal:
return WinoIconGlyph.SpecialFolderPersonal;
case SpecialFolderType.Promotions:
return WinoIconGlyph.SpecialFolderPromotions;
case SpecialFolderType.Social:
return WinoIconGlyph.SpecialFolderSocial;
case SpecialFolderType.Other:
return WinoIconGlyph.SpecialFolderOther;
case SpecialFolderType.More:
return WinoIconGlyph.SpecialFolderMore;
}
return WinoIconGlyph.None;
}
public static WinoIconGlyph GetProviderIcon(MailProviderType providerType)
{
switch (providerType)
{
case MailProviderType.Outlook:
return WinoIconGlyph.Microsoft;
case MailProviderType.Gmail:
return WinoIconGlyph.Google;
case MailProviderType.Office365:
return WinoIconGlyph.Microsoft;
case MailProviderType.IMAP4:
return WinoIconGlyph.Mail;
}
return WinoIconGlyph.None;
}
public static Geometry GetPathGeometry(string pathMarkup)
{
string xaml =
"<Path " +
"xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
"<Path.Data>" + pathMarkup + "</Path.Data></Path>";
var path = XamlReader.Load(xaml) as Windows.UI.Xaml.Shapes.Path;
Geometry geometry = path.Data;
path.Data = null;
return geometry;
}
#endregion
#region Toolbar Section Initialization
public static Visibility IsFormatSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Format ? Visibility.Visible : Visibility.Collapsed;
public static Visibility IsInsertSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Insert ? Visibility.Visible : Visibility.Collapsed;
public static Visibility IsDrawSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Draw ? Visibility.Visible : Visibility.Collapsed;
public static Visibility IsOptionsSection(EditorToolbarSection section) => section?.SectionType == EditorToolbarSectionType.Options ? Visibility.Visible : Visibility.Collapsed;
#endregion
#region Internationalization
public static string GetOperationString(MailOperation operation)
{
switch (operation)
{
case MailOperation.None:
return "unknown";
case MailOperation.Archive:
return Translator.MailOperation_Archive;
case MailOperation.UnArchive:
return Translator.MailOperation_Unarchive;
case MailOperation.SoftDelete:
return Translator.MailOperation_Delete;
case MailOperation.HardDelete:
return Translator.MailOperation_Delete;
case MailOperation.Move:
return Translator.MailOperation_Move;
case MailOperation.MoveToJunk:
return Translator.MailOperation_MoveJunk;
case MailOperation.MoveToFocused:
return Translator.MailOperation_MoveFocused;
case MailOperation.MoveToOther:
return Translator.MailOperation_MoveOther;
case MailOperation.AlwaysMoveToOther:
return Translator.MailOperation_AlwaysMoveOther;
case MailOperation.AlwaysMoveToFocused:
return Translator.MailOperation_AlwaysMoveFocused;
case MailOperation.SetFlag:
return Translator.MailOperation_SetFlag;
case MailOperation.ClearFlag:
return Translator.MailOperation_ClearFlag;
case MailOperation.MarkAsRead:
return Translator.MailOperation_MarkAsRead;
case MailOperation.MarkAsUnread:
return Translator.MailOperation_MarkAsUnread;
case MailOperation.MarkAsNotJunk:
return Translator.MailOperation_MarkNotJunk;
case MailOperation.Seperator:
return string.Empty;
case MailOperation.Ignore:
return Translator.MailOperation_Ignore;
case MailOperation.Reply:
return Translator.MailOperation_Reply;
case MailOperation.ReplyAll:
return Translator.MailOperation_ReplyAll;
case MailOperation.Zoom:
return Translator.MailOperation_Zoom;
case MailOperation.SaveAs:
return Translator.MailOperation_SaveAs;
case MailOperation.Find:
return Translator.MailOperation_Find;
case MailOperation.Forward:
return Translator.MailOperation_Forward;
case MailOperation.DarkEditor:
return string.Empty;
case MailOperation.LightEditor:
return string.Empty;
case MailOperation.Print:
return Translator.MailOperation_Print;
case MailOperation.Navigate:
return Translator.MailOperation_Navigate;
default:
return "unknown";
}
}
public static string GetOperationString(FolderOperation operation)
{
switch (operation)
{
case FolderOperation.None:
break;
case FolderOperation.Pin:
return Translator.FolderOperation_Pin;
case FolderOperation.Unpin:
return Translator.FolderOperation_Unpin;
case FolderOperation.MarkAllAsRead:
return Translator.FolderOperation_MarkAllAsRead;
case FolderOperation.DontSync:
return Translator.FolderOperation_DontSync;
case FolderOperation.Empty:
return Translator.FolderOperation_Empty;
case FolderOperation.Rename:
return Translator.FolderOperation_Rename;
case FolderOperation.Delete:
return Translator.FolderOperation_Delete;
case FolderOperation.Move:
return Translator.FolderOperation_Move;
case FolderOperation.CreateSubFolder:
return Translator.FolderOperation_CreateSubFolder;
}
return string.Empty;
}
#endregion
}
}