Browse Source

Bug fixes and QoL

CPKreuz 2 years ago
parent
commit
27c589282b

BIN
src/PixiEditor/Images/Commands/PixiEditor/Layer/ToggleMask.png


BIN
src/PixiEditor/Images/Commands/PixiEditor/Layer/ToggleVisible.png


+ 1 - 1
src/PixiEditor/Models/Commands/Search/ColorSearchResult.cs

@@ -15,7 +15,7 @@ internal class ColorSearchResult : SearchResult
     public override string Description => $"{color} rgba({color.R}, {color.G}, {color.B}, {color.A})";
 
     //public override bool CanExecute => !requiresDocument || (requiresDocument && ViewModelMain.Current.BitmapManager.ActiveDocument != null);
-    public override bool CanExecute => false;
+    public override bool CanExecute => true;
 
     public override ImageSource Icon => icon;
 

+ 4 - 0
src/PixiEditor/PixiEditor.csproj

@@ -352,6 +352,10 @@
 		<Resource Include="Images\Create-mask.png" />
 		<None Remove="Images\FlipHorizontal.png" />
 		<Resource Include="Images\FlipHorizontal.png" />
+		<None Remove="Images\Commands\PixiEditor\Layer\ToggleMask.png" />
+		<Resource Include="Images\Commands\PixiEditor\Layer\ToggleMask.png" />
+		<None Remove="Images\Commands\PixiEditor\Layer\ToggleVisible.png" />
+		<Resource Include="Images\Commands\PixiEditor\Layer\ToggleVisible.png" />
 	</ItemGroup>
 	<ItemGroup>
 		<None Include="..\LICENSE">

+ 37 - 5
src/PixiEditor/ViewModels/SubViewModels/Main/ClipboardViewModel.cs

@@ -1,4 +1,5 @@
-using System.Text.RegularExpressions;
+using System.Diagnostics.CodeAnalysis;
+using System.Text.RegularExpressions;
 using System.Windows;
 using System.Windows.Input;
 using System.Windows.Media;
@@ -36,7 +37,10 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
     [Command.Basic("PixiEditor.Clipboard.PasteColor", "Paste color", "Paste color from clipboard", CanExecute = "PixiEditor.Clipboard.CanPasteColor", IconEvaluator = "PixiEditor.Clipboard.PasteColorIcon")]
     public void PasteColor()
     {
-        Owner.ColorsSubViewModel.PrimaryColor = DrawingApi.Core.ColorsImpl.Color.Parse(Clipboard.GetText().Trim());
+        if (ParseAnyFormat(Clipboard.GetText().Trim(), out var result))
+        {
+            Owner.ColorsSubViewModel.PrimaryColor = result.Value;
+        }
     }
 
     [Command.Basic("PixiEditor.Clipboard.Copy", "Copy", "Copy to clipboard", CanExecute = "PixiEditor.Selection.IsNotEmpty", Key = Key.C, Modifiers = ModifierKeys.Control)]
@@ -55,16 +59,16 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
     }
 
     [Evaluator.CanExecute("PixiEditor.Clipboard.CanPasteColor")]
-    public static bool CanPasteColor() => Regex.IsMatch(Clipboard.GetText().Trim(), "^#?([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$");
+    public static bool CanPasteColor() => ParseAnyFormat(Clipboard.GetText().Trim(), out _);
 
     [Evaluator.Icon("PixiEditor.Clipboard.PasteColorIcon")]
     public static ImageSource GetPasteColorIcon()
     {
         Color color;
 
-        if (CanPasteColor())
+        if (ParseAnyFormat(Clipboard.GetText().Trim(), out var result))
         {
-            color = DrawingApi.Core.ColorsImpl.Color.Parse(Clipboard.GetText().Trim()).ToOpaqueMediaColor();
+            color = result.Value.ToOpaqueMediaColor();
         }
         else
         {
@@ -73,4 +77,32 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
 
         return ColorSearchResult.GetIcon(color.ToOpaqueColor());
     }
+
+    private static bool ParseAnyFormat(string value, [NotNullWhen(true)] out DrawingApi.Core.ColorsImpl.Color? result)
+    {
+        bool hex = Regex.IsMatch(Clipboard.GetText().Trim(), "^#?([a-fA-F0-9]{8}|[a-fA-F0-9]{6}|[a-fA-F0-9]{3})$");
+
+        if (hex)
+        {
+            result = DrawingApi.Core.ColorsImpl.Color.Parse(Clipboard.GetText().Trim());
+            return true;
+        }
+
+        var match = Regex.Match(Clipboard.GetText().Trim(), @"(?:rgba?\(?)? *(?<r>\d{1,3})(?:, *| +)(?<g>\d{1,3})(?:, *| +)(?<b>\d{1,3})(?:(?:, *| +)(?<a>\d{0,3}))?\)?");
+
+        if (!match.Success)
+        {
+            result = null;
+            return false;
+        }
+
+        byte r = byte.Parse(match.Groups["r"].ValueSpan);
+        byte g = byte.Parse(match.Groups["g"].ValueSpan);
+        byte b = byte.Parse(match.Groups["b"].ValueSpan);
+        byte a = match.Groups["a"].Success ? byte.Parse(match.Groups["a"].ValueSpan) : (byte)255;
+
+        result = new DrawingApi.Core.ColorsImpl.Color(r, g, b, a);
+        return true;
+
+    }
 }

+ 22 - 0
src/PixiEditor/ViewModels/SubViewModels/Main/LayersViewModel.cs

@@ -232,6 +232,28 @@ internal class LayersViewModel : SubViewModel<ViewModelMain>
         doc!.Operations.DeleteMask(member);
     }
 
+    [Command.Basic("PixiEditor.Layer.ToggleMask", "Toggle mask", "Toggle mask", CanExecute = "PixiEditor.Layer.ActiveLayerHasMask")]
+    public void ToggleMask()
+    {
+        var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
+        var member = doc?.SelectedStructureMember;
+        if (member is null || !member.HasMaskBindable)
+            return;
+        
+        member.MaskIsVisibleBindable = !member.MaskIsVisibleBindable;
+    }
+
+    [Command.Basic("PixiEditor.Layer.ToggleVisible", "Toggle visibility", "Toggle visibility", CanExecute = "PixiEditor.HasDocument")]
+    public void ToggleVisible()
+    {
+        var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
+        var member = doc?.SelectedStructureMember;
+        if (member is null)
+            return;
+        
+        member.IsVisibleBindable = !member.IsVisibleBindable;
+    }
+
     [Evaluator.CanExecute("PixiEditor.Layer.HasMemberAbove")]
     public bool HasMemberAbove(object property) => HasSelectedMember(true);
     [Evaluator.CanExecute("PixiEditor.Layer.HasMemberBelow")]

+ 15 - 1
src/PixiEditor/Views/UserControls/CommandSearch/CommandSearchControl.xaml.cs

@@ -174,6 +174,16 @@ internal partial class CommandSearchControl : UserControl, INotifyPropertyChange
         {
             SwitchColor(result.AsT0);
         }
+        else if (e.Key == Key.D && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
+        {
+            SearchTerm = "~/Documents/";
+            textBox.CaretIndex = SearchTerm.Length;
+        }
+        else if (e.Key == Key.P && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
+        {
+            SearchTerm = "~/Pictures/";
+            textBox.CaretIndex = SearchTerm.Length;
+        }
         else
         {
             e.Handled = false;
@@ -187,10 +197,12 @@ internal partial class CommandSearchControl : UserControl, INotifyPropertyChange
             if (color.A == 255)
             {
                 SearchTerm = $"rgb({color.R},{color.G},{color.B})";
+                textBox.CaretIndex = 4;
             }
             else
             {
                 SearchTerm = $"rgba({color.R},{color.G},{color.B},{color.A})";
+                textBox.CaretIndex = 5;
             }
         }
         else
@@ -198,10 +210,12 @@ internal partial class CommandSearchControl : UserControl, INotifyPropertyChange
             if (color.A == 255)
             {
                 SearchTerm = $"#{color.R:X2}{color.G:X2}{color.B:X2}";
+                textBox.CaretIndex = 1;
             }
             else
             {
                 SearchTerm = $"#{color.R:X2}{color.G:X2}{color.B:X2}{color.A:X2}";
+                textBox.CaretIndex = 1;
             }
         }
     }
@@ -212,7 +226,7 @@ internal partial class CommandSearchControl : UserControl, INotifyPropertyChange
             return;
         if (SelectedResult is null)
         {
-            SelectedResult = Results.First(x => x.CanExecute);
+            SelectedResult = Results.FirstOrDefault(x => x.CanExecute);
             return;
         }
 

+ 39 - 25
src/PixiEditor/Views/UserControls/DiscordRPPreview.xaml

@@ -6,10 +6,10 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:PixiEditor.Views.UserControls" xmlns:converters="clr-namespace:PixiEditor.Helpers.Converters"
              mc:Ignorable="d" 
-             d:DesignHeight="280" d:DesignWidth="300"
+             d:DesignWidth="300"
              x:Name="uc">
     <Grid>
-        <Border CornerRadius="5" Background="#18191C" x:Name="OutsideBorder">
+        <Border CornerRadius="5" Background="#292b2f" x:Name="OutsideBorder">
             <Grid>
                 <Grid.RowDefinitions>
                     <RowDefinition Height="Auto"/>
@@ -19,11 +19,10 @@
                 <Grid>
                     <Border CornerRadius="5,5,0,0" Background="#e3042c" Height="60" VerticalAlignment="Top"/>
                     <StackPanel>
-                        <Border HorizontalAlignment="Left" Width="85" Height="85" Margin="15" BorderThickness="6" BorderBrush="#18191C" CornerRadius="90">
+                        <Border HorizontalAlignment="Left" Width="85" Height="85" Margin="15" BorderThickness="6" BorderBrush="#292b2f" CornerRadius="90">
                             <Grid>
                                 <Image Source="{Binding ElementName=uc, Path=UserSource}"/>
-                                <Border Height="30" Width="30" Background="#FF43B581" CornerRadius="90" BorderThickness="6" 
-                                BorderBrush="#18191C">
+                                <Border Height="30" Width="30" Background="#FF43B581" CornerRadius="90" BorderThickness="6" BorderBrush="#292b2f">
                                     <Border.RenderTransform>
                                         <TransformGroup>
                                             <TranslateTransform X="27" Y="27"></TranslateTransform>
@@ -32,31 +31,46 @@
                                 </Border>
                             </Grid>
                         </Border>
-
-                        <StackPanel Orientation="Horizontal" Margin="15,0">
-                            <TextBlock Foreground="White" FontSize="22" FontWeight="SemiBold">PixiBot</TextBlock>
-                            <TextBlock Foreground="#b9bbbe" FontSize="22" FontWeight="SemiBold">#8523</TextBlock>
+                    </StackPanel>
+                </Grid>
+                <Border Grid.Row="1" Background="#18191C" Margin="10,10" CornerRadius="5" Padding="10">
+                    <StackPanel>
+                        <StackPanel Orientation="Horizontal" Margin="0,0">
+                            <TextBlock Foreground="White" FontSize="22" FontWeight="Black">PixiBot</TextBlock>
+                            <TextBlock Foreground="#b9bbbe" FontSize="22" FontWeight="Black">#8523</TextBlock>
                             <Border CornerRadius="3" BorderThickness="1" Background="#5865f2" Margin="5,0,0,0" VerticalAlignment="Center">
-                                <TextBlock Foreground="White" FontSize="12" Margin="4,2,4,2" FontWeight="Medium">BOT</TextBlock>
+                                <TextBlock Foreground="White" FontSize="10" Margin="4,2,4,2" FontWeight="Medium">BOT</TextBlock>
                             </Border>
                         </StackPanel>
-                    </StackPanel>
-                </Grid>
-                <Grid Grid.Row="1" Visibility="{Binding ElementName=uc, Path=IsPlaying, Converter={BoolToVisibilityConverter}}">
-                    <StackPanel Orientation="Vertical" Margin="15,0,15,15">
-                        <Grid Margin="0,15" Background="#262729" Height="1"/>
-                        <TextBlock FontWeight="Bold" FontSize="12" Foreground="White" Margin="0,0,0,10">PLAYING A "GAME"</TextBlock>
-                        <StackPanel Orientation="Horizontal">
-                            <Image Source="../../Images/PixiEditorLogo.png" Height="70"/>
-                            <StackPanel Margin="15,0,0,0" VerticalAlignment="Center">
-                                <TextBlock Foreground="White" FontSize="12" FontWeight="SemiBold">PixiEditor</TextBlock>
-                                <TextBlock Foreground="White" FontSize="12" Text="{Binding ElementName=uc, Path=Detail}" Visibility="{Binding ElementName=uc, Path=Detail, Converter={converters:EmptyStringToVisibilityConverter}}"/>
-                                <TextBlock Foreground="White" FontSize="12" Text="{Binding ElementName=uc, Path=State}" Visibility="{Binding ElementName=uc, Path=State, Converter={converters:EmptyStringToVisibilityConverter}}"/>
-                                <TextBlock Foreground="White" FontSize="12">00:00 elapsed</TextBlock>
+                        <Grid Margin="0,5">
+                            <StackPanel Orientation="Vertical">
+                                <Grid Margin="0,15" Background="#262729" Height="1"/>
+                                <TextBlock FontWeight="Black" FontSize="12" Foreground="White" Margin="0,0,0,10">ABOUT ME</TextBlock>
+                                <TextBlock Foreground="White" Text="Use me to display your .pixi files in Discord.&#x0a;Start by sending a file in any appropriate channel"></TextBlock>
                             </StackPanel>
-                        </StackPanel>
+                        </Grid>
+                        <Grid Margin="0,5">
+                            <StackPanel Orientation="Vertical">
+                                <TextBlock FontWeight="Black" FontSize="12" Foreground="White" Margin="0,0,0,10">DISCORD MEMBER SINCE</TextBlock>
+                                <TextBlock Foreground="White" Text="Oct 09, 2020"></TextBlock>
+                            </StackPanel>
+                        </Grid>
+                        <Grid Visibility="{Binding ElementName=uc, Path=IsPlaying, Converter={BoolToVisibilityConverter}}" Margin="0,5, 0, 0">
+                            <StackPanel Orientation="Vertical">
+                                <TextBlock FontWeight="Black" FontSize="12" Foreground="White" Margin="0,0,0,10">PLAYING A "GAME"</TextBlock>
+                                <StackPanel Orientation="Horizontal">
+                                    <Image Source="../../Images/PixiEditorLogo.png" Height="70"/>
+                                    <StackPanel Margin="15,0,0,0" VerticalAlignment="Center">
+                                        <TextBlock Foreground="White" FontSize="12" FontWeight="SemiBold">PixiEditor</TextBlock>
+                                        <TextBlock Foreground="White" FontSize="12" Text="{Binding ElementName=uc, Path=Detail}" Visibility="{Binding ElementName=uc, Path=Detail, Converter={converters:EmptyStringToVisibilityConverter}}"/>
+                                        <TextBlock Foreground="White" FontSize="12" Text="{Binding ElementName=uc, Path=State}" Visibility="{Binding ElementName=uc, Path=State, Converter={converters:EmptyStringToVisibilityConverter}}"/>
+                                        <TextBlock Foreground="White" FontSize="12">00:00 elapsed</TextBlock>
+                                    </StackPanel>
+                                </StackPanel>
+                            </StackPanel>
+                        </Grid>
                     </StackPanel>
-                </Grid>
+                </Border>
             </Grid>
         </Border>
     </Grid>

+ 7 - 12
src/PixiEditor/Views/UserControls/PreviewWindow.xaml.cs

@@ -47,15 +47,6 @@ internal partial class PreviewWindow : UserControl
         set => SetValue(PrimaryColorProperty, value);
     }
 
-    public static readonly DependencyProperty OptionsOpenProperty =
-        DependencyProperty.Register(nameof(OptionsOpen), typeof(bool), typeof(PreviewWindow));
-
-    public bool OptionsOpen
-    {
-        get => (bool)GetValue(OptionsOpenProperty);
-        set => SetValue(OptionsOpenProperty, value);
-    }
-
     public PreviewWindow()
     {
         InitializeComponent();
@@ -102,13 +93,17 @@ internal partial class PreviewWindow : UserControl
 
     private void CopyColorToClipboard()
     {
-        if (ColorCursorColor.A == 255)
+        if ((string)formatButton.ActiveItem.Value == "HEX")
         {
-            Clipboard.SetText(string.Format("#{0:X2}{1:X2}{2:X2}", ColorCursorColor.R, ColorCursorColor.G, ColorCursorColor.B));
+            Clipboard.SetText(ColorCursorColor.A == 255
+                ? $"#{ColorCursorColor.R:X2}{ColorCursorColor.G:X2}{ColorCursorColor.B:X2}"
+                : ColorCursorColor.ToString());
         }
         else
         {
-            Clipboard.SetText(ColorCursorColor.ToString());
+            Clipboard.SetText(ColorCursorColor.A == 255
+                ? $"rgb({ColorCursorColor.R},{ColorCursorColor.G},{ColorCursorColor.B})"
+                : $"rgba({ColorCursorColor.R},{ColorCursorColor.G},{ColorCursorColor.B},{ColorCursorColor.A})");
         }
     }