Browse Source

Even more stuff

flabbet 3 năm trước cách đây
mục cha
commit
832ba109be

+ 24 - 0
PixiEditor/Helpers/Converters/CountToVisibilityConverter.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Data;
+
+namespace PixiEditor.Helpers.Converters
+{
+    public class CountToVisibilityConverter : SingleInstanceConverter<CountToVisibilityConverter>
+    {
+        public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+        {
+            if (value is int intVal)
+            {
+                return intVal == 0 ? Visibility.Visible : Visibility.Collapsed;
+            }
+
+            return Visibility.Visible;
+        }
+    }
+}

+ 21 - 0
PixiEditor/Helpers/PaletteHelpers.cs

@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+using PixiEditor.Models.IO;
+
+namespace PixiEditor.Helpers
+{
+    public static class PaletteHelpers
+    {
+        public static string GetFilter(IList<PaletteFileParser> parsers)
+        {
+            string filter = "";
+
+            foreach (var parser in parsers)
+            {
+                string supportedFormats = string.Join(';', parser.SupportedFileExtensions).Replace(".", "*.");
+                filter += $"{parser.FileName} ({supportedFormats})|{supportedFormats}|";
+            }
+
+            return filter.Remove(filter.Length - 1);
+        }
+    }
+}

BIN
PixiEditor/Images/Database.png


BIN
PixiEditor/Images/Search.png


BIN
PixiEditor/Images/hard-drive.png


+ 12 - 4
PixiEditor/Models/DataProviders/LocalPalettesFetcher.cs

@@ -82,8 +82,11 @@ namespace PixiEditor.Models.DataProviders
 
         public async Task RefreshCache()
         {
-            string[] files = DirectoryExtensions.GetFiles(PathToPalettesFolder, string.Join("|", AvailableParsers.SelectMany(x => x.SupportedFileExtensions)), SearchOption.TopDirectoryOnly);
+            string[] files = DirectoryExtensions.GetFiles(PathToPalettesFolder,
+                string.Join("|", AvailableParsers.SelectMany(x => x.SupportedFileExtensions)),
+                SearchOption.TopDirectoryOnly);
             CachedPalettes = await ParseAll(files);
+            CacheUpdated?.Invoke(CachedPalettes);
         }
 
         private async Task<List<Palette>> ParseAll(string[] files)
@@ -92,6 +95,7 @@ namespace PixiEditor.Models.DataProviders
             foreach (var file in files)
             {
                 string extension = Path.GetExtension(file);
+                if (!File.Exists(file)) continue;
                 var foundParser = AvailableParsers.First(x => x.SupportedFileExtensions.Contains(extension));
                 {
                     PaletteFileData fileData = await foundParser.Parse(file);
@@ -112,14 +116,19 @@ namespace PixiEditor.Models.DataProviders
             return result;
         }
 
-        public static async Task SavePalette(string fileName, SKColor[] colors)
+        public async Task SavePalette(string fileName, SKColor[] colors)
         {
+            _watcher.EnableRaisingEvents = false;
             string path = Path.Join(PathToPalettesFolder, fileName);
             InitDir();
             await JascFileParser.SaveFile(path, new PaletteFileData(colors));
+
+            
+            _watcher.EnableRaisingEvents = true;
+            await RefreshCache();
         }
 
-        public static void DeletePalette(string name)
+        public void DeletePalette(string name)
         {
             if (!Directory.Exists(PathToPalettesFolder)) return;
             string path = Path.Join(PathToPalettesFolder, name);
@@ -144,7 +153,6 @@ namespace PixiEditor.Models.DataProviders
         private async void FileSystemChanged(object sender, FileSystemEventArgs e)
         {
             await RefreshCache();
-            CacheUpdated?.Invoke(CachedPalettes);
         }
 
         private static void InitDir()

+ 4 - 0
PixiEditor/PixiEditor.csproj

@@ -140,6 +140,7 @@
 		<None Remove="Images\ChevronDown.png" />
 		<None Remove="Images\ChevronsDown.png" />
 		<None Remove="Images\CopyAdd.png" />
+		<None Remove="Images\Database.png" />
 		<None Remove="Images\DiagonalRed.png" />
 		<None Remove="Images\Download.png" />
 		<None Remove="Images\Edit.png" />
@@ -148,6 +149,7 @@
 		<None Remove="Images\Folder-add.png" />
 		<None Remove="Images\Folder.png" />
 		<None Remove="Images\Globe.png" />
+		<None Remove="Images\hard-drive.png" />
 		<None Remove="Images\Layer-add.png" />
 		<None Remove="Images\MoveImage.png" />
 		<None Remove="Images\MoveViewportImage.png" />
@@ -224,6 +226,7 @@
 		<Resource Include="Images\ChevronDown.png" />
 		<Resource Include="Images\ChevronsDown.png" />
 		<Resource Include="Images\CopyAdd.png" />
+		<Resource Include="Images\Database.png" />
 		<Resource Include="Images\DiagonalRed.png" />
 		<Resource Include="Images\Download.png" />
 		<Resource Include="Images\Edit.png" />
@@ -232,6 +235,7 @@
 		<Resource Include="Images\Folder-add.png" />
 		<Resource Include="Images\Folder.png" />
 		<Resource Include="Images\Globe.png" />
+		<Resource Include="Images\hard-drive.png" />
 		<Resource Include="Images\Layer-add.png" />
 		<Resource Include="Images\penMode.png" />
 		<Resource Include="Images\PixiBotLogo.png" />

+ 7 - 3
PixiEditor/ViewModels/SubViewModels/Main/ColorsViewModel.cs

@@ -39,7 +39,11 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
         public WpfObservableRangeCollection<PaletteFileParser> PaletteParsers { get; private set; }
         public WpfObservableRangeCollection<PaletteListDataSource> PaletteDataSources { get; private set; }
 
+        public LocalPalettesFetcher LocalPaletteFetcher => _localPaletteFetcher ??=
+            (LocalPalettesFetcher)PaletteDataSources.FirstOrDefault(x => x is LocalPalettesFetcher);
+
         private SKColor primaryColor = SKColors.Black;
+        private LocalPalettesFetcher _localPaletteFetcher;
 
         public SKColor PrimaryColor // Primary color, hooked with left mouse button
         {
@@ -159,11 +163,11 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             }
         }
 
-        private static async Task SavePalette(Palette palette, PalettesBrowser browser)
+        private async Task SavePalette(Palette palette, PalettesBrowser browser)
         {
             palette.FileName = $"{palette.Name}.pal";
-
-            await LocalPalettesFetcher.SavePalette(
+            
+            await LocalPaletteFetcher.SavePalette(
                 palette.FileName,
                 palette.Colors.Select(SKColor.Parse).ToArray());
 

+ 14 - 0
PixiEditor/Views/Dialogs/PalettesBrowser.xaml

@@ -99,11 +99,25 @@
                         CommandParameter="https://lospec.com/palette-list">
                     <Image Source="/Images/Globe.png"/>
                 </Button>
+                <Button HorizontalAlignment="Right" Margin="10 0 0 0" ToolTip="Import from file"
+                        Style="{StaticResource ImageButtonStyle}" Width="24" Height="24"
+                        Click="ImportFromFile_OnClick">
+                    <Image Source="/Images/hard-drive.png"/>
+                </Button>
             </StackPanel>
         </DockPanel>
         <Grid Grid.Row="2" Margin="10">
             <TextBlock Text="Couldn't fetch palettes" Foreground="White" FontSize="20" HorizontalAlignment="Center" 
                        VerticalAlignment="Center" Visibility="{Binding Visibility, Converter={converters:OppositeVisibilityConverter}, ElementName=itemsControl}"/>
+            <StackPanel Panel.ZIndex="10" Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding ElementName=palettesBrowser, Path=SortedResults.Count, Converter={converters:CountToVisibilityConverter}}">
+                <TextBlock Text="No palettes found." Foreground="White" FontSize="20" TextAlignment="Center"/>
+                <TextBlock Margin="0 10 0 0">
+                    <Hyperlink Foreground="Gray" Cursor="Hand" FontSize="18" NavigateUri="https://lospec.com/palette-list" RequestNavigate="Hyperlink_OnRequestNavigate">
+                        I heard you can find some here: lospec.com/palette-list
+                    </Hyperlink>
+                </TextBlock>
+                <Image Width="128" Height="128" Source="/Images/Search.png"/>
+            </StackPanel>
             <ScrollViewer x:Name="scrollViewer" Margin="5" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" ScrollChanged="ScrollViewer_ScrollChanged">
                 <ItemsControl x:Name="itemsControl" ItemsSource="{Binding SortedResults, ElementName=palettesBrowser}"
                           Visibility="{Binding PaletteList.FetchedCorrectly, Converter={StaticResource BoolToVisibilityConverter}, ElementName=palettesBrowser}">

+ 42 - 19
PixiEditor/Views/Dialogs/PalettesBrowser.xaml.cs

@@ -10,24 +10,28 @@ using System.Linq;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Documents;
 using System.Windows.Input;
+using System.Windows.Navigation;
 using System.Windows.Threading;
+using Microsoft.Win32;
 using PixiEditor.Views.UserControls.Palettes;
 using SkiaSharp;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Dialogs;
+using PixiEditor.Models.IO;
 using PixiEditor.Models.UserPreferences;
+using PixiEditor.ViewModels;
 
 namespace PixiEditor.Views.Dialogs
 {
-    public delegate void ListFetched(PaletteList list);
+    public delegate void ListFetched(PaletteList list, int cacheId);
 
     /// <summary>
     /// Interaction logic for LospecPalettesBrowser.xaml
     /// </summary>
     public partial class PalettesBrowser : Window
     {
-        public event ListFetched OnListFetched;
         public const int ItemsPerLoad = 10;
 
         public PaletteList PaletteList
@@ -153,8 +157,6 @@ namespace PixiEditor.Views.Dialogs
             }
         }
 
-        private static PaletteList _cachedPaletteList;
-
         private LocalPalettesFetcher _localPalettesFetcher;
 
         public PalettesBrowser()
@@ -163,9 +165,10 @@ namespace PixiEditor.Views.Dialogs
             Instance = this;
             DeletePaletteCommand = new RelayCommand<Palette>(DeletePalette);
             ToggleFavouriteCommand = new RelayCommand<Palette>(ToggleFavourite);
-            Loaded += (sender, args) =>
+            Loaded += async (sender, args) =>
             {
                 localPalettesFetcher.CacheUpdated += LocalCacheRefreshed;
+                await localPalettesFetcher.RefreshCache();
             };
             Closed += (s, e) =>
             {
@@ -184,16 +187,6 @@ namespace PixiEditor.Views.Dialogs
                 PaletteListDataSources = dataSources
             };
 
-            if (_cachedPaletteList != null)
-            {
-                browser.PaletteList = _cachedPaletteList;
-            }
-
-            browser.OnListFetched += list =>
-            {
-                _cachedPaletteList = list;
-            };
-
             browser.CurrentEditingPalette = currentEditingPalette;
 
             browser.Show();
@@ -235,7 +228,7 @@ namespace PixiEditor.Views.Dialogs
             {
                 if (ConfirmationDialog.Show("Are you sure you want to delete this palette? This cannot be undone.", "Warning!") == ConfirmationType.Yes)
                 {
-                    LocalPalettesFetcher.DeletePalette(palette.FileName);
+                    localPalettesFetcher.DeletePalette(palette.FileName);
                     RemoveFavouritePalette(palette);
                 }
             }
@@ -302,7 +295,6 @@ namespace PixiEditor.Views.Dialogs
             }
 
             Sort();
-            OnListFetched?.Invoke(PaletteList);
 
             IsFetching = false;
         }
@@ -338,7 +330,6 @@ namespace PixiEditor.Views.Dialogs
 
                 PaletteList.Palettes.AddRange(newPalettes.Palettes);
                 Sort();
-                OnListFetched?.Invoke(PaletteList);
                 IsFetching = false;
             }
         }
@@ -444,7 +435,7 @@ namespace PixiEditor.Views.Dialogs
                 i++;
             }
 
-            await LocalPalettesFetcher.SavePalette(finalFileName, CurrentEditingPalette.ToArray());
+            await localPalettesFetcher.SavePalette(finalFileName, CurrentEditingPalette.ToArray());
 
             var palette = _localPalettesFetcher.CachedPalettes.FirstOrDefault(x => x.FileName == finalFileName);
             if (palette != null)
@@ -499,5 +490,37 @@ namespace PixiEditor.Views.Dialogs
 
             ProcessHelpers.ShellExecute(url);
         }
+
+
+        private async void ImportFromFile_OnClick(object sender, RoutedEventArgs e)
+        {
+            var parsers = ViewModelMain.Current.ColorsSubViewModel.PaletteParsers;
+            OpenFileDialog openFileDialog = new OpenFileDialog
+            {
+                Filter = PaletteHelpers.GetFilter(parsers)
+            };
+
+            if (openFileDialog.ShowDialog() == true)
+            {
+                await ImportPalette(openFileDialog.FileName, parsers);
+            }
+        }
+
+        private async Task ImportPalette(string fileName, IList<PaletteFileParser> parsers)
+        {
+            var parser = parsers.FirstOrDefault(x => x.SupportedFileExtensions.Contains(Path.GetExtension(fileName)));
+            if (parser != null)
+            {
+                var data = await parser.Parse(fileName);
+
+                string name = LocalPalettesFetcher.GetNonExistingName(Path.GetFileName(fileName), true);
+                await localPalettesFetcher.SavePalette(name, data.Colors.ToArray());
+            }
+        }
+
+        private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e)
+        {
+            ProcessHelpers.ShellExecute(e.Uri.ToString());
+        }
     }
 }

+ 1 - 1
PixiEditor/Views/UserControls/Palettes/PaletteViewer.xaml

@@ -27,7 +27,7 @@
                 <Button Margin="0, 0, 5, 0" Style="{StaticResource ToolButtonStyle}" Click="BrowsePalettes_Click"
                 Cursor="Hand" Height="24" Width="24" ToolTip="Browse Palettes">
                         <Button.Background>
-                            <ImageBrush ImageSource="/Images/Search.png"/>
+                            <ImageBrush ImageSource="/Images/Database.png"/>
                         </Button.Background>
                     </Button>
                     <Button Margin="0, 0, 5, 0" Style="{StaticResource ToolButtonStyle}" 

+ 5 - 10
PixiEditor/Views/UserControls/Palettes/PaletteViewer.xaml.cs

@@ -1,4 +1,6 @@
-using System.IO;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Threading.Tasks;
 using System.Windows;
@@ -6,6 +8,7 @@ using System.Windows.Controls;
 using System.Windows.Input;
 using System.Windows.Media;
 using Microsoft.Win32;
+using PixiEditor.Helpers;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders.Palettes;
 using PixiEditor.Models.DataProviders;
@@ -104,15 +107,7 @@ namespace PixiEditor.Views.UserControls.Palettes
             {
                 if(_filesFilter == null)
                 {
-                    string filter = "";
-
-                    foreach (var parser in FileParsers)
-                    {
-                        string supportedFormats = string.Join(';', parser.SupportedFileExtensions).Replace(".", "*.");
-                        filter += $"{parser.FileName} ({supportedFormats})|{supportedFormats}|";
-                    }
-                    
-                    _filesFilter = filter.Remove(filter.Length - 1);
+                    _filesFilter = PaletteHelpers.GetFilter(FileParsers);
                 }
 
                 return _filesFilter;