From ca46fd35fe1b1060cc5170367422fecfa03cb86b Mon Sep 17 00:00:00 2001 From: Tsanie Lily Date: Fri, 8 May 2020 17:02:54 +0800 Subject: [PATCH] features: - launcher logo - tab bar tint color - favorites logic udpated --- .../LauncherLogo.imageset/Contents.json | 530 ++++++++++++++++++ .../LauncherLogo.imageset/pixiv.png | Bin 0 -> 6665 bytes .../LauncherLogo.imageset/pixiv@2x.png | Bin 0 -> 13864 bytes .../LauncherLogo.imageset/pixiv@3x.png | Bin 0 -> 21818 bytes Pixiview.iOS/Pixiview.iOS.csproj | 5 + Pixiview.iOS/Renderers/AppShellRenderer.cs | 17 +- .../AppShellSectionRootHeader.cs | 1 - .../Resources/LaunchScreen.storyboard | 19 + Pixiview/AppShell.xaml | 4 +- Pixiview/Illust/FavoritesPage.xaml.cs | 10 +- Pixiview/Illust/IllustCollectionPage.cs | 50 +- Pixiview/Illust/MainPage.xaml.cs | 5 - Pixiview/Illust/RankingPage.xaml | 2 +- Pixiview/Illust/RankingPage.xaml.cs | 5 - Pixiview/Illust/RecommendsPage.xaml.cs | 5 - Pixiview/Illust/ViewIllustPage.xaml.cs | 26 +- Pixiview/UI/Theme/DarkTheme.cs | 7 +- Pixiview/UI/Theme/LightTheme.cs | 9 +- Pixiview/UI/Theme/ThemeBase.cs | 51 +- Pixiview/Utils/Stores.cs | 63 ++- 20 files changed, 680 insertions(+), 129 deletions(-) create mode 100644 Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/Contents.json create mode 100644 Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv.png create mode 100644 Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv@2x.png create mode 100644 Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv@3x.png diff --git a/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/Contents.json b/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/Contents.json new file mode 100644 index 0000000..dcce229 --- /dev/null +++ b/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/Contents.json @@ -0,0 +1,530 @@ +{ + "images": [ + { + "idiom": "universal" + }, + { + "filename": "pixiv.png", + "scale": "1x", + "idiom": "universal" + }, + { + "filename": "pixiv@2x.png", + "scale": "2x", + "idiom": "universal" + }, + { + "filename": "pixiv@3x.png", + "scale": "3x", + "idiom": "universal" + }, + { + "idiom": "iphone" + }, + { + "scale": "1x", + "idiom": "iphone" + }, + { + "scale": "2x", + "idiom": "iphone" + }, + { + "subtype": "retina4", + "scale": "2x", + "idiom": "iphone" + }, + { + "scale": "3x", + "idiom": "iphone" + }, + { + "idiom": "ipad" + }, + { + "scale": "1x", + "idiom": "ipad" + }, + { + "scale": "2x", + "idiom": "ipad" + }, + { + "idiom": "watch" + }, + { + "scale": "2x", + "idiom": "watch" + }, + { + "screenWidth": "{130,145}", + "scale": "2x", + "idiom": "watch" + }, + { + "screenWidth": "{146,165}", + "scale": "2x", + "idiom": "watch" + }, + { + "idiom": "mac" + }, + { + "scale": "1x", + "idiom": "mac" + }, + { + "scale": "2x", + "idiom": "mac" + }, + { + "idiom": "car" + }, + { + "scale": "2x", + "idiom": "car" + }, + { + "scale": "3x", + "idiom": "car" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "1x", + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "3x", + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "1x", + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "iphone" + }, + { + "subtype": "retina4", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "3x", + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "ipad" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "1x", + "idiom": "ipad" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "ipad" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "watch" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "watch" + }, + { + "screenWidth": "{130,145}", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "watch" + }, + { + "screenWidth": "{146,165}", + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "watch" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "mac" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "1x", + "idiom": "mac" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "mac" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "car" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "2x", + "idiom": "car" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "scale": "3x", + "idiom": "car" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "1x", + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "3x", + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "1x", + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "iphone" + }, + { + "subtype": "retina4", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "3x", + "idiom": "iphone" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "idiom": "ipad" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "1x", + "idiom": "ipad" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "ipad" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "idiom": "watch" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "watch" + }, + { + "screenWidth": "{130,145}", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "watch" + }, + { + "screenWidth": "{146,165}", + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "watch" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "idiom": "mac" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "1x", + "idiom": "mac" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "mac" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "idiom": "car" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "2x", + "idiom": "car" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "light" + } + ], + "scale": "3x", + "idiom": "car" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +} \ No newline at end of file diff --git a/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv.png b/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0812fb7cbcddf123f02e44e0d1b44a820e0a8b GIT binary patch literal 6665 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 D`VYbz literal 0 HcmV?d00001 diff --git a/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv@2x.png b/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fedcabc7ddb2787e464ca9e1b0647592a0a0fb15 GIT binary patch literal 13864 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 literal 0 HcmV?d00001 diff --git a/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv@3x.png b/Pixiview.iOS/Assets.xcassets/LauncherLogo.imageset/pixiv@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..28b73cfcdeda8bb9d7b3d171107219043d256cbd GIT binary patch literal 21818 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 literal 0 HcmV?d00001 diff --git a/Pixiview.iOS/Pixiview.iOS.csproj b/Pixiview.iOS/Pixiview.iOS.csproj index e93e687..58f3b6b 100644 --- a/Pixiview.iOS/Pixiview.iOS.csproj +++ b/Pixiview.iOS/Pixiview.iOS.csproj @@ -125,6 +125,10 @@ false + + + + @@ -150,6 +154,7 @@ + diff --git a/Pixiview.iOS/Renderers/AppShellRenderer.cs b/Pixiview.iOS/Renderers/AppShellRenderer.cs index 904a200..6575d51 100644 --- a/Pixiview.iOS/Renderers/AppShellRenderer.cs +++ b/Pixiview.iOS/Renderers/AppShellRenderer.cs @@ -92,12 +92,13 @@ namespace Pixiview.iOS.Renderers tabBar.UnselectedItemTintColor = _defaultUnselectedTint; } + [SuppressMessage("Code Notifications", "XI0002:Notifies you from using newer Apple APIs when targeting an older OS version", Justification = "")] public void SetAppearance(UITabBarController controller, ShellAppearance appearance) { IShellAppearanceElement appearanceElement = appearance; //var backgroundColor = appearanceElement.EffectiveTabBarBackgroundColor; var unselectedColor = appearanceElement.EffectiveTabBarUnselectedColor; - var titleColor = appearanceElement.EffectiveTabBarTitleColor; + var tintColor = appearanceElement.EffectiveTabBarForegroundColor; // appearanceElement.EffectiveTabBarTitleColor; var tabBar = controller.TabBar; //bool operatingSystemSupportsUnselectedTint = Forms.IsiOS10OrNewer; @@ -115,12 +116,16 @@ namespace Pixiview.iOS.Renderers //if (!backgroundColor.IsDefault) // tabBar.BarTintColor = backgroundColor.ToUIColor(); - if (!UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) - { - if (!titleColor.IsDefault) - tabBar.TintColor = titleColor.ToUIColor(); - //if (operatingSystemSupportsUnselectedTint) + if (!tintColor.IsDefault) + tabBar.TintColor = tintColor.ToUIColor(); + //if (operatingSystemSupportsUnselectedTint) + { + if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) + { + //tabBar.UnselectedItemTintColor = UIColor.TertiaryLabelColor; + } + else { if (!unselectedColor.IsDefault) tabBar.UnselectedItemTintColor = unselectedColor.ToUIColor(); diff --git a/Pixiview.iOS/Renderers/AppShellSection/AppShellSectionRootHeader.cs b/Pixiview.iOS/Renderers/AppShellSection/AppShellSectionRootHeader.cs index bb1fb4a..663d910 100644 --- a/Pixiview.iOS/Renderers/AppShellSection/AppShellSectionRootHeader.cs +++ b/Pixiview.iOS/Renderers/AppShellSection/AppShellSectionRootHeader.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Specialized; using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; using CoreGraphics; using Foundation; using UIKit; diff --git a/Pixiview.iOS/Resources/LaunchScreen.storyboard b/Pixiview.iOS/Resources/LaunchScreen.storyboard index 3f84ee2..696c3e4 100644 --- a/Pixiview.iOS/Resources/LaunchScreen.storyboard +++ b/Pixiview.iOS/Resources/LaunchScreen.storyboard @@ -16,6 +16,22 @@ + + + + + + + + + + + + + + + + @@ -23,4 +39,7 @@ + + + \ No newline at end of file diff --git a/Pixiview/AppShell.xaml b/Pixiview/AppShell.xaml index e686802..1f8cfc5 100644 --- a/Pixiview/AppShell.xaml +++ b/Pixiview/AppShell.xaml @@ -8,8 +8,8 @@ xmlns:util="clr-namespace:Pixiview.Utils" x:Class="Pixiview.AppShell" BackgroundColor="{DynamicResource NavColor}" - ForegroundColor="{DynamicResource MainTextColor}" - TitleColor="{DynamicResource MainTextColor}" + ForegroundColor="{DynamicResource TintColor}" + TitleColor="{DynamicResource TextColor}" UnselectedColor="{DynamicResource SubTextColor}"> diff --git a/Pixiview/Illust/FavoritesPage.xaml.cs b/Pixiview/Illust/FavoritesPage.xaml.cs index 8dda895..7bd5c05 100644 --- a/Pixiview/Illust/FavoritesPage.xaml.cs +++ b/Pixiview/Illust/FavoritesPage.xaml.cs @@ -17,9 +17,9 @@ namespace Pixiview.Illust protected override void OnAppearing() { - base.OnAppearing(); - - StartLoad(true); + //base.OnAppearing(); + loaded = false; + StartLoad(); } protected override IEnumerable DoGetIllustList(IllustItem[] data, ICommand command) @@ -33,12 +33,12 @@ namespace Pixiview.Illust protected override IllustItem[] DoLoadIllustData(bool force) { - var favorites = Stores.LoadFavoritesIllusts(); + var favorites = Stores.FavoriteObject; if (favorites == null) { return null; } - return favorites.Illusts; + return favorites.Illusts.ToArray(); } } } diff --git a/Pixiview/Illust/IllustCollectionPage.cs b/Pixiview/Illust/IllustCollectionPage.cs index af674df..fb6581f 100644 --- a/Pixiview/Illust/IllustCollectionPage.cs +++ b/Pixiview/Illust/IllustCollectionPage.cs @@ -15,7 +15,6 @@ namespace Pixiview.Illust { public interface IIllustCollectionPage { - List Favorites { get; } IllustCollection IllustCollection { get; set; } } @@ -60,13 +59,13 @@ namespace Pixiview.Illust set => SetValue(LoadingProperty, value); } - public List Favorites { get; } = new List(); + #endregion + + protected static bool IsUpdated { get; private set; } = true; + public IllustCollection IllustCollection { get; set; } protected virtual bool IsFavoriteVisible => true; - - #endregion - protected Thickness totalBarOffset; protected Thickness navigationBarOffset; protected bool loaded; @@ -79,12 +78,6 @@ namespace Pixiview.Illust { BindingContext = this; commandIllustImageTapped = new Command(IllustImageTapped); - - var favorites = Stores.LoadFavoritesIllusts(); - if (favorites != null) - { - Favorites.AddRange(favorites.Illusts); - } } private void IllustImageTapped(IllustItem illust) @@ -97,22 +90,38 @@ namespace Pixiview.Illust protected override void OnAppearing() { base.OnAppearing(); - Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged; + + if (IsUpdated || !loaded) + { + IsUpdated = false; + loaded = false; + StartLoad(); + } + else if (IsFavoriteVisible) + { + var favorites = Stores.Favorites; + foreach (var item in IllustCollection) + { + item.IsFavorite = favorites.Any(i => i.Id == item.Id); + } + } } protected override void OnDisappearing() { - base.OnDisappearing(); - Connectivity.ConnectivityChanged -= Connectivity_ConnectivityChanged; + base.OnDisappearing(); } private void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs e) { if (e.NetworkAccess == NetworkAccess.Internet || e.NetworkAccess == NetworkAccess.ConstrainedInternet) { - StartLoad(); + if (!loaded) + { + StartLoad(true); + } } } @@ -293,7 +302,7 @@ namespace Pixiview.Illust } } } - .DynamicResource(BackgroundColorProperty, ThemeBase.SubColor); + .DynamicResource(BackgroundColorProperty, ThemeBase.CardBackgroundColor); }); } @@ -308,15 +317,20 @@ namespace Pixiview.Illust Loading = false; return; } + if (force) + { + IsUpdated = true; + } var data = DoGetIllustList(illustData, commandIllustImageTapped).Where(i => i != null); var collection = new IllustCollection(data); if (IsFavoriteVisible) { + var favorites = Stores.Favorites; foreach (var item in collection) { - item.IsFavorite = Favorites.Any(i => i.Id == item.Id); + item.IsFavorite = favorites.Any(i => i.Id == item.Id); } } IllustCollection = collection; @@ -404,7 +418,7 @@ namespace Pixiview.Illust public class IllustFavorite { public DateTime LastFavoriteUtc { get; set; } - public IllustItem[] Illusts { get; set; } + public List Illusts { get; set; } } [JsonObject(MemberSerialization.OptIn)] diff --git a/Pixiview/Illust/MainPage.xaml.cs b/Pixiview/Illust/MainPage.xaml.cs index 8951355..76bd2dc 100644 --- a/Pixiview/Illust/MainPage.xaml.cs +++ b/Pixiview/Illust/MainPage.xaml.cs @@ -14,11 +14,6 @@ namespace Pixiview.Illust InitializeComponent(); } - public override void OnLoad() - { - StartLoad(); - } - public override void OnUnload() { Illusts = IllustCollection.Empty; diff --git a/Pixiview/Illust/RankingPage.xaml b/Pixiview/Illust/RankingPage.xaml index d3d1f4a..ccee5e7 100644 --- a/Pixiview/Illust/RankingPage.xaml +++ b/Pixiview/Illust/RankingPage.xaml @@ -20,7 +20,7 @@ diff --git a/Pixiview/Illust/RankingPage.xaml.cs b/Pixiview/Illust/RankingPage.xaml.cs index a652218..b55f4b7 100644 --- a/Pixiview/Illust/RankingPage.xaml.cs +++ b/Pixiview/Illust/RankingPage.xaml.cs @@ -28,11 +28,6 @@ namespace Pixiview.Illust InitializeComponent(); } - public override void OnLoad() - { - StartLoad(); - } - public override void OnUnload() { Illusts = IllustCollection.Empty; diff --git a/Pixiview/Illust/RecommendsPage.xaml.cs b/Pixiview/Illust/RecommendsPage.xaml.cs index 7eca300..5d7c55f 100644 --- a/Pixiview/Illust/RecommendsPage.xaml.cs +++ b/Pixiview/Illust/RecommendsPage.xaml.cs @@ -36,11 +36,6 @@ namespace Pixiview.Illust InitializeComponent(); } - public override void OnLoad() - { - StartLoad(); - } - public override void OnUnload() { Illusts = IllustCollection.Empty; diff --git a/Pixiview/Illust/ViewIllustPage.xaml.cs b/Pixiview/Illust/ViewIllustPage.xaml.cs index 11b46ef..1b866fd 100644 --- a/Pixiview/Illust/ViewIllustPage.xaml.cs +++ b/Pixiview/Illust/ViewIllustPage.xaml.cs @@ -68,9 +68,10 @@ namespace Pixiview.Illust fontIconLove = (ImageSource)Application.Current.Resources[ThemeBase.FontIconLove]; fontIconNotLove = (ImageSource)Application.Current.Resources[ThemeBase.FontIconNotLove]; - if (page.Favorites != null) + var favorites = Stores.Favorites; + if (favorites != null) { - FavoriteIcon = page.Favorites.Any(i => i.Id == illust.Id) + FavoriteIcon = favorites.Any(i => i.Id == illust.Id) ? fontIconLove : fontIconNotLove; } @@ -100,12 +101,7 @@ namespace Pixiview.Illust if (collectionPage is IllustDataCollectionPage) { - var favorite = new IllustFavorite - { - LastFavoriteUtc = DateTime.UtcNow, - Illusts = collectionPage.Favorites.ToArray() - }; - Stores.SaveFavoritesIllusts(favorite); + Stores.SaveFavoritesIllusts(); } Screen.SetHomeIndicatorAutoHidden(Shell.Current, false); } @@ -236,21 +232,23 @@ namespace Pixiview.Illust private void Favorite_Clicked(object sender, EventArgs e) { - if (collectionPage.Favorites == null) + var favorites = Stores.Favorites; + if (favorites == null) { return; } - var index = collectionPage.Favorites.FindIndex(i => i.Id == IllustItem.Id); + var illust = IllustItem; + var index = favorites.FindIndex(i => i.Id == illust.Id); if (index < 0) { - collectionPage.Favorites.Insert(0, IllustItem); - IllustItem.IsFavorite = true; + illust.IsFavorite = true; + favorites.Insert(0, illust); FavoriteIcon = fontIconLove; } else { - collectionPage.Favorites.RemoveAt(index); - IllustItem.IsFavorite = false; + illust.IsFavorite = false; + favorites.RemoveAt(index); FavoriteIcon = fontIconNotLove; } } diff --git a/Pixiview/UI/Theme/DarkTheme.cs b/Pixiview/UI/Theme/DarkTheme.cs index 5a8247c..2b7daa2 100644 --- a/Pixiview/UI/Theme/DarkTheme.cs +++ b/Pixiview/UI/Theme/DarkTheme.cs @@ -3,7 +3,7 @@ using Xamarin.Forms; namespace Pixiview.UI.Theme { - public partial class DarkTheme : ThemeBase + public class DarkTheme : ThemeBase { private static DarkTheme _instance; @@ -29,11 +29,10 @@ namespace Pixiview.UI.Theme { Add(StatusBarStyle, StatusBarStyles.WhiteText); Add(WindowColor, Color.Black); + Add(TintColor, Color.FromRgb(0x00, 0x96, 0xfa)); Add(TextColor, Color.White); Add(SubTextColor, Color.LightGray); - Add(MainColor, Color.FromRgb(0x11, 0x11, 0x11)); - Add(MainTextColor, Color.White); - Add(SubColor, Color.FromRgb(0x33, 0x33, 0x33)); + Add(CardBackgroundColor, Color.FromRgb(0x33, 0x33, 0x33)); Add(MaskColor, Color.FromRgba(0xff, 0xff, 0xff, 0x50)); Add(NavColor, Color.Black); Add(NavSelectedColor, Color.FromRgb(0x22, 0x22, 0x22)); diff --git a/Pixiview/UI/Theme/LightTheme.cs b/Pixiview/UI/Theme/LightTheme.cs index 7cde795..cc67833 100644 --- a/Pixiview/UI/Theme/LightTheme.cs +++ b/Pixiview/UI/Theme/LightTheme.cs @@ -3,7 +3,7 @@ using Xamarin.Forms; namespace Pixiview.UI.Theme { - public partial class LightTheme : ThemeBase + public class LightTheme : ThemeBase { private static LightTheme _instance; @@ -29,13 +29,12 @@ namespace Pixiview.UI.Theme { Add(StatusBarStyle, StatusBarStyles.DarkText); Add(WindowColor, Color.White); + Add(TintColor, Color.FromRgb(0x00, 0x96, 0xfa)); // 0x7f, 0x99, 0xc6 Add(TextColor, Color.Black); Add(SubTextColor, Color.DimGray); - Add(MainColor, Color.FromRgb(0xf0, 0xf0, 0xf0)); // Color.FromRgb(0x7f, 0x99, 0xc6) - Add(MainTextColor, Color.Black); - Add(SubColor, Color.FromRgb(0xf0, 0xf0, 0xf0)); // Color.FromRgb(0xfa, 0xfa, 0xf0) + Add(CardBackgroundColor, Color.FromRgb(0xfa, 0xfa, 0xf0)); Add(MaskColor, Color.FromRgba(0, 0, 0, 0x50)); - Add(NavColor, Color.FromRgb(0xee, 0xee, 0xee)); + Add(NavColor, Color.FromRgb(0xf0, 0xf0, 0xf0)); Add(NavSelectedColor, Color.LightGray); } } diff --git a/Pixiview/UI/Theme/ThemeBase.cs b/Pixiview/UI/Theme/ThemeBase.cs index 901f61c..3c8a634 100644 --- a/Pixiview/UI/Theme/ThemeBase.cs +++ b/Pixiview/UI/Theme/ThemeBase.cs @@ -4,8 +4,6 @@ namespace Pixiview.UI.Theme { public class ThemeBase : ResourceDictionary { - public const string TitleButton = nameof(TitleButton); - public const string TitleLabel = nameof(TitleLabel); public const string FontIconUser = nameof(FontIconUser); public const string FontIconSparkles = nameof(FontIconSparkles); public const string FontIconOrder = nameof(FontIconOrder); @@ -18,11 +16,10 @@ namespace Pixiview.UI.Theme public const string StatusBarStyle = nameof(StatusBarStyle); public const string WindowColor = nameof(WindowColor); + public const string TintColor = nameof(TintColor); public const string TextColor = nameof(TextColor); public const string SubTextColor = nameof(SubTextColor); - public const string MainColor = nameof(MainColor); - public const string MainTextColor = nameof(MainTextColor); - public const string SubColor = nameof(SubColor); + public const string CardBackgroundColor = nameof(CardBackgroundColor); public const string MaskColor = nameof(MaskColor); public const string NavColor = nameof(NavColor); public const string NavSelectedColor = nameof(NavSelectedColor); @@ -58,43 +55,19 @@ namespace Pixiview.UI.Theme } } - var mainColor = (Color)this[MainTextColor]; + var tintColor = (Color)this[TextColor]; + var regularFontFamily = (string)this[IconRegularFontFamily]; var solidFontFamily = (string)this[IconSolidFontFamily]; - Add(TitleLabel, new Style(typeof(Label)) - { - Setters = - { - new Setter { Property = View.VerticalOptionsProperty, Value = LayoutOptions.Center }, - new Setter { Property = View.HorizontalOptionsProperty, Value = LayoutOptions.Fill }, - new Setter { Property = Label.HorizontalTextAlignmentProperty, Value = TextAlignment.Center }, - new Setter { Property = Label.FontSizeProperty, Value = StyleDefinition.FontSizeTitle }, - new Setter { Property = Label.TextColorProperty, Value = mainColor } - } - }); - - Add(TitleButton, new Style(typeof(Button)) - { - Setters = - { - new Setter { Property = Button.BorderWidthProperty, Value = 0.0 }, - new Setter { Property = VisualElement.BackgroundColorProperty, Value = Color.Transparent }, - new Setter { Property = Button.FontFamilyProperty, Value = solidFontFamily }, - new Setter { Property = Button.FontSizeProperty, Value = StyleDefinition.FontSizeTitleIcon }, - new Setter { Property = Button.TextColorProperty, Value = mainColor } - } - }); - - - Add(FontIconUser, GetSolidIcon(StyleDefinition.IconUser, solidFontFamily, mainColor)); - Add(FontIconSparkles, GetSolidIcon(StyleDefinition.IconSparkles, solidFontFamily, mainColor)); - Add(FontIconOrder, GetSolidIcon(StyleDefinition.IconOrder, solidFontFamily, mainColor)); - Add(FontIconRefresh, GetSolidIcon(StyleDefinition.IconRefresh, solidFontFamily, mainColor)); + Add(FontIconUser, GetSolidIcon(StyleDefinition.IconUser, solidFontFamily, tintColor)); + Add(FontIconSparkles, GetSolidIcon(StyleDefinition.IconSparkles, solidFontFamily, tintColor)); + Add(FontIconOrder, GetSolidIcon(StyleDefinition.IconOrder, solidFontFamily, tintColor)); + Add(FontIconRefresh, GetSolidIcon(StyleDefinition.IconRefresh, solidFontFamily, tintColor)); Add(FontIconLove, GetSolidIcon(StyleDefinition.IconLove, solidFontFamily, StyleDefinition.ColorRedBackground)); - Add(FontIconNotLove, GetSolidIcon(StyleDefinition.IconLove, (string)this[IconRegularFontFamily], mainColor)); - Add(FontIconOption, GetSolidIcon(StyleDefinition.IconOption, solidFontFamily, mainColor)); - Add(FontIconDownload, GetSolidIcon(StyleDefinition.IconDownload, solidFontFamily, mainColor)); - Add(FontIconFavorite, GetSolidIcon(StyleDefinition.IconFavorite, solidFontFamily, mainColor)); + Add(FontIconNotLove, GetSolidIcon(StyleDefinition.IconLove, regularFontFamily, tintColor)); + Add(FontIconOption, GetSolidIcon(StyleDefinition.IconOption, solidFontFamily, tintColor)); + Add(FontIconDownload, GetSolidIcon(StyleDefinition.IconDownload, solidFontFamily, tintColor)); + Add(FontIconFavorite, GetSolidIcon(StyleDefinition.IconFavorite, solidFontFamily, tintColor)); } private FontImageSource GetSolidIcon(string icon, string family, Color color) diff --git a/Pixiview/Utils/Stores.cs b/Pixiview/Utils/Stores.cs index ac7f4d3..d826ffa 100644 --- a/Pixiview/Utils/Stores.cs +++ b/Pixiview/Utils/Stores.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Http; @@ -11,7 +12,7 @@ using Xamarin.Forms; namespace Pixiview.Utils { - public class Stores + public static class Stores { public static readonly string PersonalFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal); public static readonly string CacheFolder = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); @@ -43,6 +44,48 @@ namespace Pixiview.Utils } } + private static IllustFavorite favoriteObject; + public static IllustFavorite FavoriteObject + { + get + { + lock (sync) + { + if (favoriteObject == null) + { + var favorites = LoadFavoritesIllusts(); + if (favorites != null) + { + favoriteObject = favorites; + } + } + return favoriteObject; + } + } + } + + public static List Favorites => FavoriteObject.Illusts; + + private static IllustFavorite LoadFavoritesIllusts() + { + var file = Path.Combine(PersonalFolder, favoriteFile); + lock (sync) + { + return ReadObject(file); + } + } + + public static void SaveFavoritesIllusts() + { + var file = Path.Combine(PersonalFolder, favoriteFile); + lock (sync) + { + var data = FavoriteObject; + data.LastFavoriteUtc = DateTime.UtcNow; + WriteObject(file, data); + } + } + private static T LoadObject(string file, string url, string referer = null, bool force = false) { string content = null; @@ -179,24 +222,6 @@ namespace Pixiview.Utils return result; } - public static IllustFavorite LoadFavoritesIllusts() - { - var file = Path.Combine(PersonalFolder, favoriteFile); - lock (sync) - { - return ReadObject(file); - } - } - - public static void SaveFavoritesIllusts(IllustFavorite data) - { - var file = Path.Combine(PersonalFolder, favoriteFile); - lock (sync) - { - WriteObject(file, data); - } - } - public static ImageSource LoadIllustImage(string url) { return LoadImage(url, PersonalFolder, imageFolder);