Browse Source

Added border

Krzysztof Krysiński 1 year ago
parent
commit
31a146d7c3

+ 0 - 57
src/PixiEditor.AvaloniaUI/Styles/Templates/ReferenceLayerOverlay.axaml

@@ -1,57 +0,0 @@
-<ResourceDictionary xmlns="https://github.com/avaloniaui"
-                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-                    xmlns:ui="clr-namespace:PixiEditor.AvaloniaUI.Helpers.UI"
-                    xmlns:converters="clr-namespace:PixiEditor.AvaloniaUI.Helpers.Converters"
-                    xmlns:visuals="clr-namespace:PixiEditor.AvaloniaUI.Views.Visuals"
-                    xmlns:overlays="clr-namespace:PixiEditor.AvaloniaUI.Views.Overlays"
-                    xmlns:document="clr-namespace:PixiEditor.AvaloniaUI.ViewModels.Document">
-    <!--<ControlTheme TargetType="overlays:ReferenceLayerOverlay" x:Key="{x:Type overlays:ReferenceLayerOverlay}">
-        <Setter Property="ZIndex" Value="0"/>
-        <Setter Property="Transitions">
-            <Transitions>
-                <DoubleTransition Property="Opacity" Duration="0:0:0.1"/>
-            </Transitions>
-        </Setter>
-        <Setter Property="Template">
-            <ControlTemplate TargetType="overlays:ReferenceLayerOverlay">
-                <Canvas
-                    IsHitTestVisible="{Binding ReferenceLayer.IsTransforming, RelativeSource={RelativeSource TemplatedParent}}"
-                    ui:RenderOptionsBindable.BitmapInterpolationMode="{Binding ReferenceLayerScale, Converter={converters:ScaleToBitmapScalingModeConverter}, RelativeSource={RelativeSource TemplatedParent}}">
-                    <visuals:SurfaceControl
-                        Focusable="False"
-                        Opacity="{TemplateBinding Opacity}"
-                        Width="{Binding ReferenceLayer.ReferenceBitmap.Size.X, RelativeSource={RelativeSource TemplatedParent}}"
-                        Height="{Binding ReferenceLayer.ReferenceBitmap.Size.Y, RelativeSource={RelativeSource TemplatedParent}}"
-                        Surface="{Binding ReferenceLayer.ReferenceBitmap, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
-                        IsVisible="{Binding ReferenceLayer.IsVisibleBindable, RelativeSource={RelativeSource TemplatedParent}}"
-                        RenderTransformOrigin="0, 0"
-                        FlowDirection="LeftToRight">
-                        <visuals:SurfaceControl.Transitions>
-                            <Transitions>
-                                <DoubleTransition Property="Opacity" Duration="0:0:0.1"/>
-                            </Transitions>
-                        </visuals:SurfaceControl.Transitions>
-                        <visuals:SurfaceControl.RenderTransform>
-                            <TransformGroup>
-                                <MatrixTransform
-                                    Matrix="{Binding ReferenceLayer.ReferenceTransformMatrix, RelativeSource={RelativeSource TemplatedParent}}" />
-                            </TransformGroup>
-                        </visuals:SurfaceControl.RenderTransform>
-                    </visuals:SurfaceControl>
-                </Canvas>
-            </ControlTemplate>
-        </Setter>
-
-        <Style Selector="^:showHighest">
-            <Setter Property="ZIndex" Value="1"/>
-        </Style>
-
-        <Style Selector="^:showHighest /template/ visuals|SurfaceControl">
-            <Setter Property="Opacity" Value="{x:Static document:ReferenceLayerViewModel.TopMostOpacity}"/>
-        </Style>
-
-        <Style Selector="^:fadedOut">
-            <Setter Property="Opacity" Value="0"/>
-        </Style>
-    </ControlTheme>-->
-</ResourceDictionary>

+ 20 - 5
src/PixiEditor.AvaloniaUI/Views/Overlays/ReferenceLayerOverlay.cs

@@ -57,6 +57,8 @@ internal class ReferenceLayerOverlay : Overlay
         ? OverlayRenderSorting.Foreground
         : OverlayRenderSorting.Background;
 
+    private Pen borderBen = new Pen(Brushes.Black, 2);
+
     static ReferenceLayerOverlay()
     {
         ReferenceLayerProperty.Changed.Subscribe(ReferenceLayerChanged);
@@ -65,23 +67,32 @@ internal class ReferenceLayerOverlay : Overlay
 
     public override void RenderOverlay(DrawingContext context, RectD dirtyCanvasBounds)
     {
-        //TODO: opacity + animation + border
         if (ReferenceLayer is { ReferenceBitmap: not null })
         {
             using var renderOptions = context.PushRenderOptions(new RenderOptions
             {
                 BitmapInterpolationMode = ScaleToBitmapScalingModeConverter.Calculate(ReferenceLayerScale)
             });
-            using var matrix = context.PushTransform(ReferenceLayer.ReferenceTransformMatrix);
+
+            var matrix = context.PushTransform(ReferenceLayer.ReferenceTransformMatrix);
 
             RectD dirty = new RectD(0, 0, ReferenceLayer.ReferenceBitmap.Size.X, ReferenceLayer.ReferenceBitmap.Size.Y);
             Rect dirtyRect = new Rect(dirty.X, dirty.Y, dirty.Width, dirty.Height);
             DrawSurfaceOperation drawOperation =
                 new DrawSurfaceOperation(dirtyRect, ReferenceLayer.ReferenceBitmap, Stretch.None, Opacity);
             context.Custom(drawOperation);
+
+            matrix.Dispose();
+
+            DrawBorder(context, dirtyCanvasBounds);
         }
     }
 
+    private void DrawBorder(DrawingContext context, RectD dirtyCanvasBounds)
+    {
+        context.DrawRectangle(borderBen, new Rect(0, 0, dirtyCanvasBounds.Width, dirtyCanvasBounds.Height));
+    }
+
     private static void ReferenceLayerChanged(AvaloniaPropertyChangedEventArgs<ReferenceLayerViewModel> obj)
     {
         ReferenceLayerOverlay objSender = (ReferenceLayerOverlay)obj.Sender;
@@ -96,10 +107,9 @@ internal class ReferenceLayerOverlay : Overlay
         }
     }
 
-    private static void FadeOutChanged(AvaloniaPropertyChangedEventArgs<bool> obj)
+    protected override void ZoomChanged(double newZoom)
     {
-        ReferenceLayerOverlay objSender = (ReferenceLayerOverlay)obj.Sender;
-        objSender.ToggleFadeOut(obj.NewValue.Value);
+        borderBen.Thickness = 2 / newZoom;
     }
 
     private void ToggleFadeOut(bool toggle)
@@ -112,6 +122,11 @@ internal class ReferenceLayerOverlay : Overlay
     {
         double targetOpaqueOpacity = ReferenceLayer.ShowHighest ? ReferenceLayerViewModel.TopMostOpacity : 1;
         TransitionTo(OpacityProperty, OpacityTransitionDuration, FadeOut ? 0 : targetOpaqueOpacity);
+    }
 
+    private static void FadeOutChanged(AvaloniaPropertyChangedEventArgs<bool> obj)
+    {
+        ReferenceLayerOverlay objSender = (ReferenceLayerOverlay)obj.Sender;
+        objSender.ToggleFadeOut(obj.NewValue.Value);
     }
 }