Jelajahi Sumber

Don't allow hiding the canvas while using color picker without reference layer

CPKreuz 2 tahun lalu
induk
melakukan
8d657485b0

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/ar.json

@@ -303,8 +303,8 @@
   "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "ارسم بالبكسل لجعلها أكثر قتامة. اترك Ctrl لتفتيح.",
   "COLOR_PICKER_TOOLTIP": "يختار اللون الأساسي من الصورة. ({0})",
   "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "انقر لاختيار الألوان. اضغط باستمرار على Ctrl لإخفاء الصورة. اضغط مع الاستمرار على Shift لإخفاء الطبقة المرجعية",
-  "COLOR_PICKER_ACTION_DISPLAY_CTRL": "انقر لاختيار الألوان من الطبقة المرجعية.",
-  "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "انقر لاختيار الألوان من الصورة.",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "انقر لاختيار الألوان من الطبقة المرجعية.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "انقر لاختيار الألوان من الصورة.",
   "ELLIPSE_TOOL_TOOLTIP": "رسم قطع ناقص على الصورة ({0}). اضغط مع الاستمرار على Shift لرسم دائرة.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "انقر وحرك الماوس لرسم شكل بيضاوي. اضغط مع الاستمرار على Shift لرسم دائرة.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "انقر وحرك الماوس لرسم دائرة.",

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/cs.json

@@ -303,8 +303,8 @@
     "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Kreslením na pixely je ztmavíš. Pusť \"Ctrl\" pro jejich zesvětlení.",
     "COLOR_PICKER_TOOLTIP": "Vybere hlavní barvu z canvasu. ({0})",
     "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Klikni pro výběr barev. Podrž \"Ctrl\" abys schoval canvas. Podrž \"Shift\" pro schování referenční vrstvy.",
-    "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Klikni pro vybrání barvy z referenční vrstvy.",
-    "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Klikni pro vybrání barvy z canvasu.",
+    "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Klikni pro vybrání barvy z referenční vrstvy.",
+    "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Klikni pro vybrání barvy z canvasu.",
     "ELLIPSE_TOOL_TOOLTIP": "Vytvoří elipsu na canvas ({0}). Podrž \"Shift\" pro přidání kružnice.",
     "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Klikni a posuň myší pro vytvoření elipsy. Podrž \"Shift\" pro vytvoření kružnice.",
     "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Klikni a posuň myší pro vytvoření kružnice.",

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/de.json

@@ -303,8 +303,8 @@
   "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Zeichne auf Pixel um sie dunkler zu machen. Lasse Strg los um sie zu heller zu machen.",
   "COLOR_PICKER_TOOLTIP": "Pickt die Farbe von der Leinwand. ({0})",
   "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Klick um eine Farbe zu picken. Halte Strg um die Referenzebene zu verstecken.",
-  "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Klick um eine Farbe von der Referenzebene zu picken.",
-  "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Klick um eine Farbe von der Leinwand zu picken.",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Klick um eine Farbe von der Referenzebene zu picken.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Klick um eine Farbe von der Leinwand zu picken.",
   "ELLIPSE_TOOL_TOOLTIP": "Zeichnet eine Ellipse auf die Leinwand ({0}). Halte die Umschalttaste/Shift um einen Kreis zu zeichnen.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Klicke und halte die Maus um eine Ellipse zu zeichnen. Halte die Umschalttaste/Shift um einen Kreis zu zeichnen.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Klicke und bewege die Maus um einen Kreis zu zeichnen.",

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/en.json

@@ -304,8 +304,8 @@
     "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Draw on pixels to make them darker. Release Ctrl to brighten.",
     "COLOR_PICKER_TOOLTIP": "Picks the primary color from the canvas. ({0})",
     "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Click to pick colors. Hold Ctrl to hide the canvas. Hold Shift to hide the reference layer",
-    "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Click to pick colors from the reference layer.",
-    "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Click to pick colors from the canvas.",
+    "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Click to pick colors from the reference layer.",
+    "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Click to pick colors from the canvas.",
     "ELLIPSE_TOOL_TOOLTIP": "Draws an ellipse on canvas ({0}). Hold Shift to draw a circle.",
     "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Click and move mouse to draw an ellipse. Hold Shift to draw a circle.",
     "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Click and move mouse to draw a circle.",

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/es.json

@@ -303,8 +303,8 @@
     "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Dibuja sobre los píxeles para oscurecerlos. Suelte Ctrl para aclarar.",
     "COLOR_PICKER_TOOLTIP": "Elige el color primario del canvas. ({0})",
     "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Haz clic para elegir colores. Mantenga pulsada la tecla Ctrl para ocultar el canvas. Mantenga pulsada la tecla Shift para ocultar la referencia.",
-    "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Haga clic para seleccionar los colores de la capa de referencia.",
-    "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Haz clic para elegir colores del canvas.",
+    "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Haga clic para seleccionar los colores de la capa de referencia.",
+    "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Haz clic para elegir colores del canvas.",
     "ELLIPSE_TOOL_TOOLTIP": "Dibuja una elipse en el canvas ({0}). Mantenga pulsada la tecla Shift para dibujar un círculo.",
     "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Haz clic y mueve el ratón para dibujar una elipse. Mantenga pulsada la tecla Shift para dibujar un círculo.",
     "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Haz clic y mueve el ratón para dibujar un círculo.",

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/pl.json

@@ -303,8 +303,8 @@
   "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Rysuj po pikselach aby je przyciemnić. Puść Ctrl aby rozjaśnić.",
   "COLOR_PICKER_TOOLTIP": "Pobiera kolor z płótna i ustawia go jako pierwszorzędny. ({0})",
   "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Kliknij aby pobrać kolor. Przytrzymaj Ctrl aby ukryć płótno. Przytrzymaj Shift aby ukryć warstwę referencyjną.",
-  "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Kliknij aby pobrać kolory z warstwy referencyjnej.",
-  "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Kliknij aby pobrać kolory z płótna.",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Kliknij aby pobrać kolory z warstwy referencyjnej.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Kliknij aby pobrać kolory z płótna.",
   "ELLIPSE_TOOL_TOOLTIP": "Rysuje elipsę na płótnie ({0}). Przytrzymaj Shift aby narysować koło.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Kliknij i porusz myszką aby narysować elipsę. Przytrzymaj Shift aby narysować koło.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Kliknij i porusz myszką aby narysować koło.",

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/uk.json

@@ -303,8 +303,8 @@
   "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "Малюйте на пікселях, щоб зробити їх темнішими. Відпустіть Ctrl, щоб зробити яскравішими.",
   "COLOR_PICKER_TOOLTIP": "Вибір основного кольору з полотна. ({0})",
   "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "Натисніть, щоб вибрати кольори. Утримуйте Ctrl, щоб приховати полотно. Утримуйте Shift, щоб приховати опорний шар",
-  "COLOR_PICKER_ACTION_DISPLAY_CTRL": "Натисніть, щоб вибрати кольори з опорного шару.",
-  "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "Натисніть, щоб вибрати кольори з полотна.",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "Натисніть, щоб вибрати кольори з опорного шару.",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "Натисніть, щоб вибрати кольори з полотна.",
   "ELLIPSE_TOOL_TOOLTIP": "Малювати еліпс на полотні ({0}). Утримуйте Shift, щоб намалювати коло.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "Натисніть і перемістіть мишу, щоб намалювати еліпс. Утримуйте Shift, щоб намалювати коло.",
   "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "Натисніть і перемістіть мишу, щоб намалювати коло.",

+ 2 - 2
src/PixiEditor/Data/Localization/Languages/zh.json

@@ -303,8 +303,8 @@
   "BRIGHTNESS_TOOL_ACTION_DISPLAY_CTRL": "在像素上绘画以将其变暗。松开Ctrl以变亮。",
   "COLOR_PICKER_TOOLTIP": "从画布中选取主要颜色。({0})",
   "COLOR_PICKER_ACTION_DISPLAY_DEFAULT": "单击以选取颜色。按住Ctrl以隐藏画布。按住Shift以隐藏参考画布。",
-  "COLOR_PICKER_ACTION_DISPLAY_CTRL": "单击以从参考图层中选取颜色。",
-  "COLOR_PICKER_ACTION_DISPLAY_SHIFT": "单击以从画布中选取颜色。",
+  "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY": "单击以从参考图层中选取颜色。",
+  "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY": "单击以从画布中选取颜色。",
   "ELLIPSE_TOOL_TOOLTIP": "在画布上绘制椭圆({0})。按住Shift以绘制圆形。",
   "ELLIPSE_TOOL_ACTION_DISPLAY_DEFAULT": "单击并拖动以绘制椭圆。按住Shift以绘制圆形。",
   "ELLIPSE_TOOL_ACTION_DISPLAY_SHIFT": "单击并拖动以绘制圆形。",

+ 61 - 12
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/ColorPickerToolViewModel.cs

@@ -1,9 +1,11 @@
-using System.Windows.Input;
-using ChunkyImageLib.DataHolders;
+using System.ComponentModel;
+using System.Windows.Input;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Localization;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Enums;
+using PixiEditor.Models.Events;
+using PixiEditor.ViewModels.SubViewModels.Document;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.Views.UserControls.Overlays.BrushShapeOverlay;
 
@@ -12,8 +14,10 @@ namespace PixiEditor.ViewModels.SubViewModels.Tools.Tools;
 [Command.Tool(Key = Key.O, Transient = Key.LeftAlt)]
 internal class ColorPickerToolViewModel : ToolViewModel
 {
-    private readonly string defaultActionDisplay = "COLOR_PICKER_ACTION_DISPLAY_DEFAULT";
-
+    private readonly string defaultReferenceActionDisplay = "COLOR_PICKER_ACTION_DISPLAY_DEFAULT";
+    
+    private readonly string defaultActionDisplay = "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY";
+    
     public override bool HideHighlight => true;
 
     public override string ToolNameLocalizationKey => "COLOR_PICKER_TOOL";
@@ -56,35 +60,80 @@ internal class ColorPickerToolViewModel : ToolViewModel
     {
         ActionDisplay = defaultActionDisplay;
         Toolbar = ToolbarFactory.Create<ColorPickerToolViewModel, EmptyToolbar>(this);
+        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocumentChanged += DocumentChanged;
     }
 
-    public override void OnLeftMouseButtonDown(VecD pos)
+    private void DocumentChanged(object sender, DocumentChangedEventArgs e)
     {
-        ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseColorPickerTool();
+        if (e.OldDocument != null)
+        {
+            e.OldDocument.ReferenceLayerViewModel.PropertyChanged -= ReferenceLayerChanged;
+        }
+
+        if (e.NewDocument != null)
+        {
+            e.NewDocument.ReferenceLayerViewModel.PropertyChanged += ReferenceLayerChanged;
+        }
+
+        UpdateActionDisplay();
     }
 
-    public override void ModifierKeyChanged(bool ctrlIsDown, bool shiftIsDown, bool altIsDown)
+    private void ReferenceLayerChanged(object sender, PropertyChangedEventArgs e)
     {
+        if (e.PropertyName == nameof(ReferenceLayerViewModel.ReferenceBitmap))
+        {
+            UpdateActionDisplay();
+        }
+    }
+
+    private void UpdateActionDisplay()
+    {
+        bool ctrlDown = (Keyboard.Modifiers & ModifierKeys.Control) != 0;
+        bool shiftDown = (Keyboard.Modifiers & ModifierKeys.Shift) != 0;
+        
+        UpdateActionDisplay(ctrlDown, shiftDown);
+    }
+    
+    private void UpdateActionDisplay(bool ctrlIsDown, bool shiftIsDown)
+    {
+        var referenceLayer = ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.ReferenceLayerViewModel;
+        
+        if (referenceLayer?.ReferenceBitmap == null)
+        {
+            PickFromCanvas = true;
+            PickFromReferenceLayer = true;
+            ActionDisplay = defaultActionDisplay;
+            return;
+        }
+    
         if (ctrlIsDown)
         {
             PickFromCanvas = false;
             PickFromReferenceLayer = true;
-            ActionDisplay = "COLOR_PICKER_ACTION_DISPLAY_CTRL";
+            ActionDisplay = "COLOR_PICKER_ACTION_DISPLAY_REFERENCE_ONLY";
         }
         else if (shiftIsDown)
         {
             PickFromCanvas = true;
             PickFromReferenceLayer = false;
-            ActionDisplay = "COLOR_PICKER_ACTION_DISPLAY_SHIFT";
+            ActionDisplay = "COLOR_PICKER_ACTION_DISPLAY_CANVAS_ONLY";
             return;
         }
         else
         {
             PickFromCanvas = true;
             PickFromReferenceLayer = true;
-            ActionDisplay = defaultActionDisplay;
+            ActionDisplay = defaultReferenceActionDisplay;
         }
-        
-        ViewModelMain.Current.DocumentManagerSubViewModel.ActiveDocument?.ReferenceLayerViewModel.RaiseShowHighestChanged();
+
+        referenceLayer.RaiseShowHighestChanged();
     }
+
+    public override void OnLeftMouseButtonDown(VecD pos)
+    {
+        ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument?.Tools.UseColorPickerTool();
+    }
+
+    public override void ModifierKeyChanged(bool ctrlIsDown, bool shiftIsDown, bool altIsDown) =>
+        UpdateActionDisplay(ctrlIsDown, shiftIsDown);
 }