Browse Source

Opacity works

TODO: preview opacity
Krzysztof Krysiński 4 years ago
parent
commit
d54960a0f5

+ 0 - 48
PixiEditor/Helpers/Converters/ActiveItemToOpacityConverter.cs

@@ -1,48 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Controls;
-using System.Windows.Data;
-using PixiEditor.Models.Layers;
-using PixiEditor.Models.Layers.Utils;
-using PixiEditor.ViewModels;
-
-namespace PixiEditor.Helpers.Converters
-{
-    [ValueConversion(typeof(object), typeof(float))]
-    public class ActiveItemToOpacityConverter : IValueConverter
-    {
-
-        public Layer lastLayer //TODO this (ConvertBack)
-        public GuidStructureItem structureItem;
-
-        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
-        {
-            if(value is Layer layer)
-            {
-                return layer.Opacity * 100;
-            }
-            else if(value is GuidStructureItem group)
-            {
-                return group.Opacity;
-            }
-
-            return Binding.DoNothing;
-        }
-
-        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
-        {
-            if (value is Layer layer)
-            {
-                return layer.Opacity * 100;
-            }
-            else if (value is GuidStructureItem group)
-            {
-                return group.Opacity;
-            }
-        }
-    }
-}

+ 1 - 0
PixiEditor/Styles/TreeViewStyle.xaml

@@ -124,6 +124,7 @@
                 <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>
 

+ 4 - 5
PixiEditor/Views/UserControls/LayersManager.xaml

@@ -11,7 +11,6 @@
              mc:Ignorable="d"
              d:DesignHeight="450" d:DesignWidth="250" Name="layersManager">
     <UserControl.Resources>
-        <converters:ActiveItemToOpacityConverter x:Key="ActiveItemToOpacityConverter"/>
         <converters:IndexOfConverter x:Key="IndexOfConverter"/>
     </UserControl.Resources>
     <Grid>
@@ -49,16 +48,16 @@
                 <Label Content="Opacity" Foreground="White" VerticalAlignment="Center"/>
                 <vws:NumberInput
                         Min="0" Max="100"
+                        x:Name="numberInput"
                         IsEnabled="{Binding Path=OpacityInputEnabled, ElementName=layersManager}" 
                         Width="40" Height="20"
                         VerticalAlignment="Center"
-                        Value="{Binding ElementName=treeView, Path=SelectedItem,
-                    Converter={StaticResource ActiveItemToOpacityConverter}}" />
+                        LostFocus="NumberInput_LostFocus"/>
                 <Label Content="%" Foreground="White" VerticalAlignment="Center"/>
             </StackPanel>
         </DockPanel>
         <Separator Grid.Row="1" Margin="0,-12, 0, 0" BorderBrush="{StaticResource DarkerAccentColor}" BorderThickness="2" />
-        <TreeView Name="treeView" Grid.Row="2" Margin="0, -12, 0, 0" ItemsSource="{Binding LayerTreeRoot, ElementName=layersManager}">
+        <TreeView Name="treeView" Grid.Row="2" Margin="0, -12, 0, 0" ItemsSource="{Binding LayerTreeRoot, ElementName=layersManager}"  SelectedItemChanged="TreeView_SelectedItemChanged">
                 <TreeView.ItemsPanel>
                     <ItemsPanelTemplate>
                         <ui:ReversedOrderStackPanel/>
@@ -71,7 +70,7 @@
                                              GroupOpacity="{Binding StructureData.Opacity}"
                                              LayersViewModel="{Binding LayerCommandsViewModel, ElementName=layersManager}" 
                                              GroupGuid="{Binding GroupGuid}" 
-                                             GroupData="{Binding StructureData}" 
+                                             GroupData="{Binding StructureData}"
                                              MouseMove="LayerGroup_MouseMove"/>
                     </HierarchicalDataTemplate>
                     <DataTemplate DataType="{x:Type layers:Layer}">

+ 59 - 2
PixiEditor/Views/UserControls/LayersManager.xaml.cs

@@ -1,7 +1,10 @@
-using System.Collections;
+using System;
+using System.Collections;
 using System.Collections.ObjectModel;
+using System.Diagnostics;
 using System.Windows;
 using System.Windows.Controls;
+using PixiEditor.Models.Layers;
 using PixiEditor.ViewModels.SubViewModels.Main;
 
 namespace PixiEditor.Views.UserControls
@@ -11,6 +14,8 @@ namespace PixiEditor.Views.UserControls
     /// </summary>
     public partial class LayersManager : UserControl
     {
+        private object cachedItem = null;
+
         public ObservableCollection<object> LayerTreeRoot
         {
             get { return (ObservableCollection<object>)GetValue(LayerTreeRootProperty); }
@@ -23,7 +28,32 @@ namespace PixiEditor.Views.UserControls
                 "LayerTreeRoot",
                 typeof(ObservableCollection<object>),
                 typeof(LayersManager),
-                new PropertyMetadata(default(ObservableCollection<object>)));
+                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 && ((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
         {
@@ -65,5 +95,32 @@ namespace PixiEditor.Views.UserControls
                 DragDrop.DoDragDrop(container, container, DragDropEffects.Move);
             }
         }
+
+        private void NumberInput_LostFocus(object sender, RoutedEventArgs e)
+        {
+            float val = numberInput.Value / 100f;
+
+            object item = treeView.SelectedItem;
+
+            if (item == null && cachedItem != null)
+            {
+                item = cachedItem;
+            }
+
+            if (item is Layer layer)
+            {
+                layer.Opacity = val;
+            }
+            else if(item is LayerGroup group)
+            {
+                var groupData = LayerCommandsViewModel.Owner.BitmapManager.ActiveDocument.LayerStructure.GetGroupByGuid(group.GroupGuid);
+                groupData.Opacity = val;
+            }
+        }
+
+        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
+        {
+            SetInputOpacity(treeView.SelectedItem, numberInput);
+        }
     }
 }