Browse Source

NumberInput now updates on undo, changed previewWindow checker bg

flabbet 4 years ago
parent
commit
7044077070

+ 10 - 0
PixiEditor/Models/Controllers/UndoManager.cs

@@ -99,6 +99,16 @@ namespace PixiEditor.Models.Controllers
             UndoStack.Push(change);
         }
 
+        /// <summary>
+        /// Merges multiple undo changes into one.
+        /// </summary>
+        /// <param name="amount">Amount of changes to squash.</param>
+        public void SquashUndoChanges(int amount)
+        {
+            string description = UndoStack.ElementAt(UndoStack.Count - amount - 1).Description;
+            SquashUndoChanges(amount, description);
+        }
+
         /// <summary>
         /// Merges multiple undo changes into one.
         /// </summary>

+ 0 - 2
PixiEditor/Styles/TreeViewStyle.xaml

@@ -106,7 +106,6 @@
                                 <Condition Property="IsSelected" Value="true"/>
                                 <Condition Property="IsSelectionActive" Value="false"/>
                             </MultiTrigger.Conditions>
-                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                             <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                         </MultiTrigger>
                         <Trigger Property="IsEnabled" Value="false">
@@ -124,7 +123,6 @@
                 <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
             </Trigger>
         </Style.Triggers>
-        <!--<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />-->
         <Setter Property="HorizontalContentAlignment" Value="Stretch" />
     </Style>
 

+ 48 - 30
PixiEditor/Views/UserControls/LayersManager.xaml.cs

@@ -1,12 +1,10 @@
 using System;
-using System.Collections;
 using System.Collections.ObjectModel;
-using System.Diagnostics;
 using System.Windows;
 using System.Windows.Controls;
+using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Undo;
-using PixiEditor.ViewModels;
 using PixiEditor.ViewModels.SubViewModels.Main;
 
 namespace PixiEditor.Views.UserControls
@@ -31,32 +29,6 @@ namespace PixiEditor.Views.UserControls
                 typeof(ObservableCollection<object>),
                 typeof(LayersManager),
                 new PropertyMetadata(default(ObservableCollection<object>), ItemsChanged));
-
-        private static void ItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
-        {
-            var items = (ObservableCollection<object>)e.NewValue;
-            LayersManager manager = (LayersManager)d;
-            if (items != null && items.Count > 0 && (e.OldValue == null || ((ObservableCollection<object>)e.OldValue).Count == 0))
-            {
-                var item = items[0];
-                manager.cachedItem = item;
-                var numberInput = manager.numberInput;
-                SetInputOpacity(item, numberInput);
-            }
-        }
-
-        private static void SetInputOpacity(object item, NumberInput numberInput)
-        {
-            if (item is Layer layer)
-            {
-                numberInput.Value = layer.Opacity * 100f;
-            }
-            else if (item is LayerGroup group)
-            {
-                numberInput.Value = group.StructureData.Opacity * 100f;
-            }
-        }
-
         public LayersViewModel LayerCommandsViewModel
         {
             get { return (LayersViewModel)GetValue(LayerCommandsViewModelProperty); }
@@ -88,8 +60,36 @@ namespace PixiEditor.Views.UserControls
             {
                 DragDrop.DoDragDrop(container, container, DragDropEffects.Move);
             }
+        }
+
+        private static void ItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            var items = (ObservableCollection<object>)e.NewValue;
+            LayersManager manager = (LayersManager)d;
+            var numberInput = manager.numberInput;
+            object item = manager.treeView.SelectedItem;
+            if (items != null && items.Count > 0 && (e.OldValue == null || ((ObservableCollection<object>)e.OldValue).Count == 0))
+            {
+                item = items[0];
+                manager.cachedItem = item;
+            }
+
+            SetInputOpacity(item, numberInput);
         }
 
+        private static void SetInputOpacity(object item, NumberInput numberInput)
+        {
+            if (item is Layer layer)
+            {
+                numberInput.Value = layer.Opacity * 100f;
+            }
+            else if (item is LayerGroup group)
+            {
+                numberInput.Value = group.StructureData.Opacity * 100f;
+            }
+        }
+
+
         private void HandleGroupOpacityChange(LayerGroup group, float value)
         {
             if (LayerCommandsViewModel.Owner?.BitmapManager?.ActiveDocument != null)
@@ -119,7 +119,8 @@ namespace PixiEditor.Views.UserControls
                 var group = structure.GetGroupByGuid(groupGuid);
                 group.Opacity = opacity;
                 var layers = structure.GetGroupLayers(group);
-                layers.ForEach(x => x.Opacity = x.Opacity); // This might seems stupid, but it raises property changed, without setting any value. This is used to trigger converters that use group opacity
+                layers.ForEach(x => x.Opacity = x.Opacity); // This might seems stupid, but it raises property changed, without setting any value. This is used to trigger converters that use group opacity
+                numberInput.Value = opacity * 100;
             }
         }
 
@@ -144,7 +145,16 @@ namespace PixiEditor.Views.UserControls
 
             if (item is Layer layer)
             {
+                float oldOpacity = layer.Opacity;
                 layer.OpacityUndoTriggerable = val;
+                UndoManager undoManager = LayerCommandsViewModel.Owner.BitmapManager.ActiveDocument.UndoManager;
+                undoManager.AddUndoChange(
+                    new Change(
+                        UpdateNumberInputLayerOpacityProcess,
+                        new object[] { oldOpacity },
+                        UpdateNumberInputLayerOpacityProcess,
+                        new object[] { val }));
+                undoManager.SquashUndoChanges(2);
             }
             else if(item is LayerGroup group)
             {
@@ -152,6 +162,14 @@ namespace PixiEditor.Views.UserControls
             }
         }
 
+        private void UpdateNumberInputLayerOpacityProcess(object[] args)
+        {
+            if(args.Length > 0 && args[0] is float opacity)
+            {
+                numberInput.Value = opacity * 100;
+            }
+        }
+
         private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
         {
             SetInputOpacity(treeView.SelectedItem, numberInput);

+ 2 - 2
PixiEditor/Views/UserControls/PreviewWindow.xaml

@@ -21,7 +21,7 @@
         </Grid.RowDefinitions>
         
         <Viewbox Margin="30" VerticalAlignment="Top">
-            <Grid x:Name="imageGrid"
+            <Grid x:Name="imageGrid" RenderOptions.BitmapScalingMode="NearestNeighbor"
               Visibility="{Binding Document, Converter={StaticResource NullToVisibiltyConverter}, ElementName=uc}"
               Height="{Binding Document.Height, ElementName=uc}" Width="{Binding Document.Width, ElementName=uc}"
               Background="{Binding SelectedItem.Tag, ElementName=backgroundComboBox}" d:Width="8" d:Height="8">
@@ -95,7 +95,7 @@
                     </ComboBoxItem>
                     <ComboBoxItem Content="Checkered">
                         <ComboBoxItem.Tag>
-                            <ImageBrush ImageSource="/Images/transparentbg.png"/>
+                            <ImageBrush Viewport="0, 0, 0.05, 0.05" ImageSource="/Images/CheckerTile.png" TileMode="Tile" Stretch="Uniform"/>
                         </ComboBoxItem.Tag>
                     </ComboBoxItem>
                     <ComboBoxItem Content="Black">