Kaynağa Gözat

Implement show grid lines

Equbuxu 3 yıl önce
ebeveyn
işleme
6cb6d2645a

+ 15 - 0
src/PixiEditor/Helpers/Converters/ReciprocalConverter.cs

@@ -0,0 +1,15 @@
+using System.Globalization;
+using System.Windows;
+
+namespace PixiEditor.Helpers.Converters;
+internal class ReciprocalConverter : SingleInstanceConverter<ReciprocalConverter>
+{
+    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+    {
+        if (value is not double num)
+            return DependencyProperty.UnsetValue;
+        if (parameter is not double mult)
+            return 1 / num;
+        return mult / num;
+    }
+}

+ 2 - 0
src/PixiEditor/Views/MainWindow.xaml

@@ -506,6 +506,8 @@
                                             MouseDownCommand="{Binding ElementName=mainWindow, Path=DataContext.IoSubViewModel.MouseDownCommand}"
                                             MouseMoveCommand="{Binding ElementName=mainWindow, Path=DataContext.IoSubViewModel.MouseMoveCommand}"
                                             MouseUpCommand="{Binding ElementName=mainWindow, Path=DataContext.IoSubViewModel.MouseUpCommand}"
+                                            Cursor="{Binding ElementName=mainWindow, Path=DataContext.ToolsSubViewModel.ToolCursor}"
+                                            GridLinesVisible="{Binding ElementName=mainWindow, Path=DataContext.ViewportSubViewModel.GridLinesEnabled}"
                                             Document="{Binding}"/>
                                         <!--<usercontrols:DrawingViewPort
                                         CenterViewportTrigger="{Binding CenterViewportTrigger}"

+ 25 - 19
src/PixiEditor/Views/UserControls/Viewport.xaml

@@ -94,27 +94,33 @@
                         LockRotation="{Binding Document.TransformViewModel.LockRotation}"
                         InternalState="{Binding Document.TransformViewModel.InternalState, Mode=TwoWay}"
                         ZoomboxScale="{Binding Zoombox.Scale}" />
+                    <Grid IsHitTestVisible="False" SnapsToDevicePixels="True"
+                        ShowGridLines="True" Width="{Binding Document.Width}" Height="{Binding Document.Height}" Panel.ZIndex="10" 
+                        Visibility="{Binding GridLinesVisible, Converter={converters:BoolToVisibilityConverter}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:Viewport}}">
+                        <Grid.Resources>
+                            <converters:ThresholdVisibilityConverter Threshold="10" x:Key="ThresholdVisibilityConverter"/>
+                        </Grid.Resources>
+                        <Rectangle Focusable="False" Visibility="{Binding Zoombox.Scale, Converter={StaticResource ThresholdVisibilityConverter}}">
+                            <Rectangle.Fill>
+                                <VisualBrush Viewport="{Binding Document.Height, Converter={converters:IntToViewportRectConverter}, ConverterParameter=vertical}" ViewboxUnits="Absolute" TileMode="Tile" >
+                                    <VisualBrush.Visual>
+                                        <Line X1="0" Y1="0" X2="0" Y2="1" Stroke="#88888888" StrokeThickness="{Binding Zoombox.Scale, Converter={converters:ReciprocalConverter}}"/>
+                                    </VisualBrush.Visual>
+                                </VisualBrush>
+                            </Rectangle.Fill>
+                        </Rectangle>
+                        <Rectangle Focusable="False" Visibility="{Binding Zoombox.Scale, Converter={StaticResource ThresholdVisibilityConverter}}">
+                            <Rectangle.Fill>
+                                <VisualBrush Viewport="{Binding Document.Height, Converter={converters:IntToViewportRectConverter}}" ViewboxUnits="Absolute" TileMode="Tile" >
+                                    <VisualBrush.Visual>
+                                        <Line X1="0" Y1="0" X2="1" Y2="0" Stroke="#88888888" StrokeThickness="{Binding Zoombox.Scale, Converter={converters:ReciprocalConverter}}"/>
+                                    </VisualBrush.Visual>
+                                </VisualBrush>
+                            </Rectangle.Fill>
+                        </Rectangle>
+                    </Grid>
                 </Grid>
             </Border>
         </zoombox:Zoombox>
-        <Grid
-            Focusable="False">
-            <Grid.ColumnDefinitions>
-                <ColumnDefinition
-                    Width="1*" />
-                <ColumnDefinition
-                    Width="2*" />
-                <ColumnDefinition
-                    Width="1*" />
-            </Grid.ColumnDefinitions>
-            <Grid.RowDefinitions>
-                <RowDefinition
-                    Height="1*" />
-                <RowDefinition
-                    Height="2*" />
-                <RowDefinition
-                    Height="1*" />
-            </Grid.RowDefinitions>
-        </Grid>
     </Grid>
 </UserControl>

+ 9 - 0
src/PixiEditor/Views/UserControls/Viewport.xaml.cs

@@ -44,6 +44,15 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
     public static readonly DependencyProperty DelayedProperty = DependencyProperty.Register(
         nameof(Delayed), typeof(bool), typeof(Viewport), new PropertyMetadata(false));
 
+    public static readonly DependencyProperty GridLinesVisibleProperty =
+        DependencyProperty.Register(nameof(GridLinesVisible), typeof(bool), typeof(Viewport), new(false));
+
+    public bool GridLinesVisible
+    {
+        get => (bool)GetValue(GridLinesVisibleProperty);
+        set => SetValue(GridLinesVisibleProperty, value);
+    }
+
     public bool Delayed
     {
         get => (bool)GetValue(DelayedProperty);