Browse Source

Fixed multiple viewports for doc and active window

Krzysztof Krysiński 1 year ago
parent
commit
e8273cc799

+ 20 - 7
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ViewportWindowViewModel.cs

@@ -11,25 +11,25 @@ using PixiEditor.DrawingApi.Core.Numerics;
 
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 #nullable enable
-internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockableContent, IDockableCloseEvents
+internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockableContent, IDockableCloseEvents, IDockableSelectionEvents
 {
     public DocumentViewModel Document { get; }
     public ExecutionTrigger<VecI> CenterViewportTrigger { get; } = new ExecutionTrigger<VecI>();
     public ExecutionTrigger<double> ZoomViewportTrigger { get; } = new ExecutionTrigger<double>();
 
-    public string Index => Owner.CalculateViewportIndex(this) ?? "";
+    public string Index => _index;
 
-    public RelayCommand RequestCloseCommand { get; }
-
-    public string Id => $"{Document.FileName}{Index}";
+    public string Id => id;
     public string Title => $"{Document.FileName}{Index}";
     public bool CanFloat => true;
     public bool CanClose => true;
     public TabCustomizationSettings TabCustomizationSettings { get; } = new(showCloseButton: true);
 
     private bool _closeRequested;
+    private string _index = "";
 
     private bool _flipX;
+    private string id = Guid.NewGuid().ToString();
 
     public bool FlipX
     {
@@ -55,7 +55,10 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
 
     public void IndexChanged()
     {
+        _index = Owner.CalculateViewportIndex(this) ?? "";
         OnPropertyChanged(nameof(Index));
+        OnPropertyChanged(nameof(Title));
+        OnPropertyChanged(nameof(Id));
     }
 
     public ViewportWindowViewModel(WindowViewModel owner, DocumentViewModel document) : base(owner)
@@ -63,7 +66,6 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
         Document = document;
         Document.SizeChanged += DocumentOnSizeChanged;
         TabCustomizationSettings.Icon = new SurfaceImage(Document.PreviewSurface);
-        RequestCloseCommand = new RelayCommand(() => Owner.OnViewportWindowCloseButtonPressed(this));
     }
 
     ~ViewportWindowViewModel()
@@ -74,6 +76,7 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
     private void DocumentOnSizeChanged(object? sender, DocumentSizeChangedEventArgs e)
     {
         TabCustomizationSettings.Icon = new SurfaceImage(Document.PreviewSurface);
+        OnPropertyChanged(nameof(TabCustomizationSettings));
     }
 
     bool IDockableCloseEvents.OnClose()
@@ -85,11 +88,21 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
                 await Dispatcher.UIThread.InvokeAsync(async () =>
                 {
                     _closeRequested =
-                        await Owner.Owner.DisposeDocumentWithSaveConfirmation(Document);
+                        await Owner.OnViewportWindowCloseButtonPressed(this);
                 });
             });
         }
 
         return _closeRequested;
     }
+
+    void IDockableSelectionEvents.OnSelected()
+    {
+        Owner.ActiveWindow = this;
+    }
+
+    void IDockableSelectionEvents.OnDeselected()
+    {
+
+    }
 }

+ 12 - 10
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/WindowViewModel.cs

@@ -1,5 +1,6 @@
 using System.Collections.ObjectModel;
 using System.Linq;
+using System.Threading.Tasks;
 using Avalonia.Input;
 using CommunityToolkit.Mvvm.Input;
 using PixiDocks.Core.Docking;
@@ -113,23 +114,24 @@ internal class WindowViewModel : SubViewModel<ViewModelMain>
         return $"[{Array.IndexOf(viewports, viewport) + 1}]";
     }
 
-    public void OnViewportWindowCloseButtonPressed(ViewportWindowViewModel viewport)
+    public async Task<bool> OnViewportWindowCloseButtonPressed(ViewportWindowViewModel viewport)
     {
         var viewports = Viewports.Where(vp => vp.Document == viewport.Document).ToArray();
         if (viewports.Length == 1)
         {
-            Owner.DisposeDocumentWithSaveConfirmation(viewport.Document);
+            return await Owner.DisposeDocumentWithSaveConfirmation(viewport.Document);
         }
-        else
-        {
-            Viewports.Remove(viewport);
-            foreach (var sibling in viewports)
-            {
-                sibling.IndexChanged();
-            }
 
-            ViewportClosed?.Invoke(viewport);
+        Viewports.Remove(viewport);
+
+        foreach (var sibling in viewports)
+        {
+            sibling.IndexChanged();
         }
+
+        ViewportClosed?.Invoke(viewport);
+
+        return true;
     }
 
     public void CloseViewportsForDocument(DocumentViewModel document)