flabbet 3 år sedan
förälder
incheckning
927c423cf3

+ 46 - 0
PixiEditor/Models/DataProviders/LocalPalettesFetcher.cs

@@ -21,6 +21,10 @@ namespace PixiEditor.Models.DataProviders
 
         public List<Palette> CachedPalettes { get; private set; }
 
+        public event Action<List<Palette>> CacheUpdated; 
+
+        private FileSystemWatcher _watcher;
+
         public override async Task<PaletteList> FetchPaletteList(int startIndex, int count, FilteringSettings filtering)
         {
             if(CachedPalettes == null)
@@ -48,6 +52,34 @@ namespace PixiEditor.Models.DataProviders
             return result;
         }
 
+        public static bool PaletteExists(string paletteName)
+        {
+            string finalFileName = paletteName;
+            if (!paletteName.EndsWith(".pal"))
+            {
+                finalFileName += ".pal";
+            }
+
+            return File.Exists(Path.Join(PathToPalettesFolder, finalFileName));
+        }
+
+        public static string GetNonExistingName(string currentName, bool appendExtension = false)
+        {
+            string newName = Path.GetFileNameWithoutExtension(currentName);
+
+            while (File.Exists(Path.Join(PathToPalettesFolder, newName + ".pal")))
+            {
+                newName += "(1)";
+            }
+
+            if (appendExtension)
+            {
+                newName += ".pal";
+            }
+
+            return newName;
+        }
+
         public async Task RefreshCache()
         {
             string[] files = DirectoryExtensions.GetFiles(PathToPalettesFolder, string.Join("|", AvailableParsers.SelectMany(x => x.SupportedFileExtensions)), SearchOption.TopDirectoryOnly);
@@ -99,6 +131,20 @@ namespace PixiEditor.Models.DataProviders
         public override void Initialize()
         {
             InitDir();
+            _watcher = new FileSystemWatcher(PathToPalettesFolder);
+            _watcher.Filter = "*.pal";
+            _watcher.Changed += FileSystemChanged;
+            _watcher.Deleted += FileSystemChanged;
+            _watcher.Renamed += FileSystemChanged;
+            _watcher.Created += FileSystemChanged;
+
+            _watcher.EnableRaisingEvents = true;
+        }
+
+        private async void FileSystemChanged(object sender, FileSystemEventArgs e)
+        {
+            await RefreshCache();
+            CacheUpdated?.Invoke(CachedPalettes);
         }
 
         private static void InitDir()

+ 36 - 15
PixiEditor/ViewModels/SubViewModels/Main/ColorsViewModel.cs

@@ -15,6 +15,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using System.Windows;
 using PixiEditor.Models.Controllers;
+using PixiEditor.Models.DataHolders.Palettes;
 using PixiEditor.Models.ExternalServices;
 using PixiEditor.Models.Undo;
 using PixiEditor.Views.Dialogs;
@@ -134,23 +135,22 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
                 var palette = await LospecPaletteFetcher.FetchPalette(lospecPaletteArg.Split(@"://")[1].Replace("/", ""));
                 if (palette != null)
                 {
-                    palette.FileName = $"{palette.Name}.pal";
-
-                    await LocalPalettesFetcher.SavePalette(
-                        palette.FileName,
-                        palette.Colors.Select(SKColor.Parse).ToArray());
-
-                    await browser.RefreshLocalCache();
-                    await browser.UpdatePaletteList();
-                    if(browser.SortedResults.Any(x => x.FileName == palette.FileName))
-                    {
-                        int indexOfImported = browser.SortedResults.IndexOf(browser.SortedResults.First(x => x.FileName == palette.FileName));
-                        browser.SortedResults.Move(indexOfImported, 0);
-                    }
-                    else
+                    if (LocalPalettesFetcher.PaletteExists(palette.Name))
                     {
-                        browser.SortedResults.Insert(0, palette);
+                        var consent = ConfirmationDialog.Show(
+                            $"Palette '{palette.Name}' already exists, do you want to overwrite it?", "Palette exists");
+                        if (consent == ConfirmationType.No)
+                        {
+                            palette.Name = LocalPalettesFetcher.GetNonExistingName(palette.Name);
+                        }
+                        else if (consent == ConfirmationType.Canceled)
+                        {
+                            browser.IsFetching = false;
+                            return;
+                        }
                     }
+
+                    await SavePalette(palette, browser);
                 }
                 else
                 {
@@ -159,6 +159,27 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             }
         }
 
+        private static async Task SavePalette(Palette palette, PalettesBrowser browser)
+        {
+            palette.FileName = $"{palette.Name}.pal";
+
+            await LocalPalettesFetcher.SavePalette(
+                palette.FileName,
+                palette.Colors.Select(SKColor.Parse).ToArray());
+
+            await browser.UpdatePaletteList();
+            if (browser.SortedResults.Any(x => x.FileName == palette.FileName))
+            {
+                int indexOfImported =
+                    browser.SortedResults.IndexOf(browser.SortedResults.First(x => x.FileName == palette.FileName));
+                browser.SortedResults.Move(indexOfImported, 0);
+            }
+            else
+            {
+                browser.SortedResults.Insert(0, palette);
+            }
+        }
+
         public void ImportPalette(List<string> palette)
         {
             var doc = Owner.BitmapManager.ActiveDocument;

+ 27 - 34
PixiEditor/Views/Dialogs/PalettesBrowser.xaml.cs

@@ -11,6 +11,7 @@ using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Input;
+using System.Windows.Threading;
 using PixiEditor.Views.UserControls.Palettes;
 using SkiaSharp;
 using PixiEditor.Helpers;
@@ -144,6 +145,14 @@ namespace PixiEditor.Views.Dialogs
         public WpfObservableRangeCollection<SKColor> CurrentEditingPalette { get; set; }
         public static PalettesBrowser Instance { get; internal set; }
 
+        private LocalPalettesFetcher localPalettesFetcher
+        {
+            get
+            {
+                return _localPalettesFetcher ??= (LocalPalettesFetcher)PaletteListDataSources.First(x => x is LocalPalettesFetcher);
+            }
+        }
+
         private static PaletteList _cachedPaletteList;
 
         private LocalPalettesFetcher _localPalettesFetcher;
@@ -154,7 +163,15 @@ namespace PixiEditor.Views.Dialogs
             Instance = this;
             DeletePaletteCommand = new RelayCommand<Palette>(DeletePalette);
             ToggleFavouriteCommand = new RelayCommand<Palette>(ToggleFavourite);
-            Closed += (s, e) => Instance = null;
+            Loaded += (sender, args) =>
+            {
+                localPalettesFetcher.CacheUpdated += LocalCacheRefreshed;
+            };
+            Closed += (s, e) =>
+            {
+                Instance = null;
+                localPalettesFetcher.CacheUpdated -= LocalCacheRefreshed;
+            };
         }
 
         public static PalettesBrowser Open(WpfObservableRangeCollection<PaletteListDataSource> dataSources, ICommand importPaletteCommand, WpfObservableRangeCollection<SKColor> currentEditingPalette)
@@ -183,6 +200,14 @@ namespace PixiEditor.Views.Dialogs
             return browser;
         }
 
+        private async void LocalCacheRefreshed(List<Palette> obj)
+        {
+            await Dispatcher.InvokeAsync(async () =>
+            {
+                await UpdatePaletteList();
+            });
+        }
+
         private async void ToggleFavourite(Palette palette)
         {
             palette.IsFavourite = !palette.IsFavourite;
@@ -212,9 +237,6 @@ namespace PixiEditor.Views.Dialogs
                 {
                     LocalPalettesFetcher.DeletePalette(palette.FileName);
                     RemoveFavouritePalette(palette);
-
-                    await RefreshLocalCache();
-                    await UpdatePaletteList();
                 }
             }
         }
@@ -260,18 +282,6 @@ namespace PixiEditor.Views.Dialogs
             browser.Sort();
         }
 
-        public async Task RefreshLocalCache()
-        {
-            if (_localPalettesFetcher == null)
-            {
-                _localPalettesFetcher = (LocalPalettesFetcher)PaletteListDataSources.First(x => x is LocalPalettesFetcher);
-
-            }
-
-            await _localPalettesFetcher.RefreshCache();
-        }
-
-
         public async Task UpdatePaletteList()
         {
             IsFetching = true;
@@ -435,8 +445,6 @@ namespace PixiEditor.Views.Dialogs
             }
 
             await LocalPalettesFetcher.SavePalette(finalFileName, CurrentEditingPalette.ToArray());
-            await RefreshLocalCache();
-            await UpdatePaletteList();
 
             var palette = _localPalettesFetcher.CachedPalettes.FirstOrDefault(x => x.FileName == finalFileName);
             if (palette != null)
@@ -475,26 +483,11 @@ namespace PixiEditor.Views.Dialogs
             }
 
             string finalNewName = $"{e.NewText}.pal";
-            string newPath = Path.Join(LocalPalettesFetcher.PathToPalettesFolder, finalNewName);
-
-            while (File.Exists(newPath))
-            {
-                finalNewName = Path.GetFileNameWithoutExtension(finalNewName) + "(1).pal";
-                if (finalNewName == oldFileName)
-                {
-                    item.Palette.FileName = oldFileName;
-                    item.Palette.Name = e.OldText;
-                    return;
-                }
-                newPath = Path.Join(LocalPalettesFetcher.PathToPalettesFolder, finalNewName);
-            }
+            string newPath = Path.Join(LocalPalettesFetcher.PathToPalettesFolder, LocalPalettesFetcher.GetNonExistingName(finalNewName, true));
 
             File.Move(oldPath, newPath);
 
             item.Palette.FileName = finalNewName;
-
-            await RefreshLocalCache();
-            await UpdatePaletteList();
         }
 
         private void BrowseOnLospec_OnClick(object sender, RoutedEventArgs e)