Przeglądaj źródła

Fixed tab preview

flabbet 10 miesięcy temu
rodzic
commit
f554f900ce

+ 1 - 1
src/PixiDocks

@@ -1 +1 @@
-Subproject commit d55a7e27bbed73d19cc59d96b4b20ffdfee35634
+Subproject commit 9e426679d633b139df1af9b13d6d23de3e54b287

+ 37 - 22
src/PixiEditor/Styles/Templates/DocumentTabTemplate.axaml

@@ -3,36 +3,51 @@
                     xmlns:controls="clr-namespace:PixiDocks.Avalonia.Controls"
                     xmlns:docking="clr-namespace:PixiDocks.Core.Docking;assembly=PixiDocks.Core"
                     xmlns:dock="clr-namespace:PixiEditor.ViewModels.Dock"
-                    xmlns:helpers="clr-namespace:PixiDocks.Avalonia.Helpers;assembly=PixiDocks.Avalonia">
+                    xmlns:helpers="clr-namespace:PixiDocks.Avalonia.Helpers;assembly=PixiDocks.Avalonia"
+                    xmlns:converters="clr-namespace:PixiDocks.Avalonia.Converters;assembly=PixiDocks.Avalonia">
 
-    <DataTemplate DataType="dock:DocumentTabCustomizationSettings" x:Key="{x:Type dock:DocumentTabCustomizationSettings}">
+    <DataTemplate DataType="dock:DocumentTabCustomizationSettings"
+                  x:Key="{x:Type dock:DocumentTabCustomizationSettings}">
         <Grid Margin="5, 0">
             <Grid.Resources>
-                <helpers:ConditionToSizeConverter x:Key="ConditionToSizeConverter"/>
+                <helpers:ConditionToSizeConverter x:Key="ConditionToSizeConverter" />
+                <converters:ValidImageIconConverter x:Key="ValidIconConverter" />
+                <converters:SourceToImageConverter x:Key="SourceToImageConverter" />
+                <converters:ControlIconConverter x:Key="ControlIconConverter" />
             </Grid.Resources>
             <Grid.ColumnDefinitions>
-                <ColumnDefinition Width="{Binding Icon,
-                Converter={StaticResource ConditionToSizeConverter}, ConverterParameter=20}"/>
-                <ColumnDefinition Width="*"/>
-                <ColumnDefinition Width="{Binding !IsSaved,
-                Converter={StaticResource ConditionToSizeConverter}, ConverterParameter=8}"/>
-                <ColumnDefinition Width="{Binding ShowCloseButton,
-                Converter={StaticResource ConditionToSizeConverter}, ConverterParameter=20}"/>
+                <ColumnDefinition
+                    Width="{Binding Icon,
+                Converter={StaticResource ConditionToSizeConverter}, ConverterParameter=20}" />
+                <ColumnDefinition Width="*" />
+                <ColumnDefinition
+                    Width="{Binding !IsSaved,
+                Converter={StaticResource ConditionToSizeConverter}, ConverterParameter=8}" />
+                <ColumnDefinition
+                    Width="{Binding ShowCloseButton,
+                Converter={StaticResource ConditionToSizeConverter}, ConverterParameter=20}" />
             </Grid.ColumnDefinitions>
-            <Image IsVisible="{Binding !!Icon}" Source="{Binding Icon}"
+            <Image IsVisible="{Binding Icon, Converter={StaticResource ValidIconConverter}}"
+                   Source="{Binding Icon, Converter={StaticResource SourceToImageConverter}}"
                    VerticalAlignment="Center"
                    RenderOptions.BitmapInterpolationMode="None"
-                   DockPanel.Dock="Left" Width="16" Height="16"/>
-            <TextBlock Grid.Column="1" Padding="5" DockPanel.Dock="Left" Foreground="{DynamicResource ThemeForegroundBrush}"
-                       VerticalAlignment="Center"
-                       Text="{Binding $parent[ContentControl].Tag.Title, FallbackValue=TITLE}"/>
-            <Ellipse Grid.Column="2" Width="5" Height="5" Fill="White" IsVisible="{Binding !IsSaved}"/>
-            <Button Grid.Column="3" Classes="CloseTabButton"
-                    Height="16" Width="16" Margin="5, 0, 0, 0"
-                    VerticalAlignment="Center"
-                    Command="{Binding $parent[ContentControl].Tag.CloseDockable}"
-                    IsVisible="{Binding ShowCloseButton}"
-                    IsEnabled="{Binding $parent[ContentControl].Tag.CanClose}"/>
+                   DockPanel.Dock="Left" Width="16" Height="16" />
+            <ContentPresenter
+                Grid.Column="0" VerticalAlignment="Center"
+                DockPanel.Dock="Left" Width="16" Height="16"
+                Content="{Binding Icon}"
+                IsVisible="{Binding Icon, Converter={StaticResource ControlIconConverter}}"/>
+                <TextBlock Grid.Column="1" Padding="5" DockPanel.Dock="Left"
+                           Foreground="{DynamicResource ThemeForegroundBrush}"
+                           VerticalAlignment="Center"
+                           Text="{Binding $parent[ContentControl].Tag.Title, FallbackValue=TITLE}" />
+                <Ellipse Grid.Column="2" Width="5" Height="5" Fill="White" IsVisible="{Binding !IsSaved}" />
+                <Button Grid.Column="3" Classes="CloseTabButton"
+                        Height="16" Width="16" Margin="5, 0, 0, 0"
+                        VerticalAlignment="Center"
+                        Command="{Binding $parent[ContentControl].Tag.CloseDockable}"
+                        IsVisible="{Binding ShowCloseButton}"
+                        IsEnabled="{Binding $parent[ContentControl].Tag.CanClose}" />
         </Grid>
     </DataTemplate>
 </ResourceDictionary>

+ 8 - 3
src/PixiEditor/ViewModels/SubViewModels/ViewportWindowViewModel.cs

@@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.Input;
 using PixiDocks.Core.Docking;
 using PixiDocks.Core.Docking.Events;
 using Drawie.Backend.Core.Numerics;
+using Drawie.Interop.VulkanAvalonia.Controls;
 using PixiEditor.Helpers.UI;
 using PixiEditor.Models.Controllers.InputDevice;
 using PixiEditor.Models.DocumentModels;
@@ -68,6 +69,8 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
         set => SetProperty(ref _channels, value);
     }
 
+    private PreviewPainterControl previewPainterControl;
+
     public void IndexChanged()
     {
         _index = Owner.CalculateViewportIndex(this) ?? "";
@@ -81,7 +84,8 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
         Document = document;
         Document.SizeChanged += DocumentOnSizeChanged;
         Document.PropertyChanged += DocumentOnPropertyChanged;
-        TabCustomizationSettings.Icon = new PreviewPainterImage(Document.PreviewPainter, Document.AnimationDataViewModel.ActiveFrameTime.Frame);
+        previewPainterControl = new PreviewPainterControl(Document.PreviewPainter, Document.AnimationDataViewModel.ActiveFrameTime.Frame);
+        TabCustomizationSettings.Icon = previewPainterControl;
     }
 
     private void DocumentOnPropertyChanged(object? sender, PropertyChangedEventArgs e)
@@ -92,7 +96,8 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
         }
         else if (e.PropertyName == nameof(DocumentViewModel.PreviewPainter))
         {
-            TabCustomizationSettings.Icon = new PreviewPainterImage(Document.PreviewPainter, Document.AnimationDataViewModel.ActiveFrameTime.Frame); 
+            previewPainterControl.PreviewPainter = Document.PreviewPainter;
+            previewPainterControl.FrameToRender = Document.AnimationDataViewModel.ActiveFrameTime.Frame;
         }
         else if (e.PropertyName == nameof(DocumentViewModel.AllChangesSaved))
         {
@@ -108,7 +113,7 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
 
     private void DocumentOnSizeChanged(object? sender, DocumentSizeChangedEventArgs e)
     {
-        TabCustomizationSettings.Icon = new PreviewPainterImage(Document.PreviewPainter, e.Document.AnimationHandler.ActiveFrameTime.Frame);
+        previewPainterControl.QueueNextFrame();
         OnPropertyChanged(nameof(TabCustomizationSettings));
     }
 

+ 7 - 1
src/PixiEditor/Views/Visuals/PreviewPainterControl.cs

@@ -36,7 +36,13 @@ public class PreviewPainterControl : DrawieControl
     {
         PreviewPainterProperty.Changed.Subscribe(PainterChanged);
     }
-
+    
+    public PreviewPainterControl(PreviewPainter previewPainter, int frameToRender)
+    {
+        PreviewPainter = previewPainter;
+        FrameToRender = frameToRender;
+        PreviewPainterProperty.Changed.Subscribe(PainterChanged);
+    }
 
     private void PainterChanged(AvaloniaPropertyChangedEventArgs<PreviewPainter> args)
     {

+ 0 - 31
src/PixiEditor/Views/Visuals/PreviewPainterImage.cs

@@ -1,31 +0,0 @@
-using Avalonia;
-using Avalonia.Media;
-using PixiEditor.Models.Rendering;
-
-namespace PixiEditor.Views.Visuals;
-
-public class PreviewPainterImage : IImage
-{
-    public PreviewPainter PreviewPainter { get; set; }
-    
-    public int FrameToRender { get; set; }
-    public Size Size => new Size(
-        PreviewPainter?.PreviewRenderable.GetPreviewBounds(FrameToRender)?.Size.X ?? 0,
-        PreviewPainter?.PreviewRenderable.GetPreviewBounds(FrameToRender)?.Size.Y ?? 0); 
-    
-    public PreviewPainterImage(PreviewPainter previewPainter, int frameToRender)
-    {
-        PreviewPainter = previewPainter;
-        FrameToRender = frameToRender;
-    }
-    
-    public void Draw(DrawingContext context, Rect sourceRect, Rect destRect)
-    {
-        if (PreviewPainter.PreviewRenderable.GetPreviewBounds(FrameToRender) == null) return;
-        
-        context.PushClip(destRect);
-        //TODO: Implement this
-        //using DrawPreviewOperation drawPreviewOperation = new DrawPreviewOperation(destRect, PreviewPainter, FrameToRender); 
-        //context.Custom(drawPreviewOperation);
-    }
-}

+ 0 - 27
src/PixiEditor/Views/Visuals/TextureImage.cs

@@ -1,27 +0,0 @@
-using Avalonia;
-using Avalonia.Media;
-using ChunkyImageLib;
-using Drawie.Backend.Core;
-
-namespace PixiEditor.Views.Visuals;
-
-public class TextureImage : IImage
-{
-    public Texture Texture { get; set; }
-    public Stretch Stretch { get; set; } = Stretch.Uniform;
-
-    public Size Size { get; }
-
-    public TextureImage(Texture texture)
-    {
-        Texture = texture;
-        Size = new Size(texture.Size.X, texture.Size.Y);
-    }
-
-    public void Draw(DrawingContext context, Rect sourceRect, Rect destRect)
-    {
-        if(Texture.IsDisposed) return; 
-        // TODO: Implement this
-        //context.Custom(new DrawTextureOperation(destRect, Stretch, Texture));
-    }
-}