diff --git a/src/Greenshot.Base/Interfaces/DrawingModes.cs b/src/Greenshot.Base/Interfaces/DrawingModes.cs index cd84aea4f..da34ffeab 100644 --- a/src/Greenshot.Base/Interfaces/DrawingModes.cs +++ b/src/Greenshot.Base/Interfaces/DrawingModes.cs @@ -24,6 +24,7 @@ namespace Greenshot.Base.Interfaces public enum DrawingModes { None, + ColorPicker, Rect, Ellipse, Text, diff --git a/src/Greenshot.Editor/Controls/Pipette.cs b/src/Greenshot.Editor/Controls/Pipette.cs index dc1ae1046..5a2346b9f 100644 --- a/src/Greenshot.Editor/Controls/Pipette.cs +++ b/src/Greenshot.Editor/Controls/Pipette.cs @@ -65,7 +65,7 @@ namespace Greenshot.Editor.Controls /// Hotspot X coordinate /// Hotspot Y coordinate /// Cursor - private static Cursor CreateCursor(Bitmap bitmap, int hotspotX, int hotspotY) + public static Cursor CreateCursor(Bitmap bitmap, int hotspotX, int hotspotY) { using SafeIconHandle iconHandle = new SafeIconHandle(bitmap.GetHicon()); NativeIconMethods.GetIconInfo(iconHandle, out var iconInfo); diff --git a/src/Greenshot.Editor/Drawing/Surface.cs b/src/Greenshot.Editor/Drawing/Surface.cs index f050374a6..6524c8273 100644 --- a/src/Greenshot.Editor/Drawing/Surface.cs +++ b/src/Greenshot.Editor/Drawing/Surface.cs @@ -39,7 +39,9 @@ using Greenshot.Base.Interfaces; using Greenshot.Base.Interfaces.Drawing; using Greenshot.Base.Interfaces.Drawing.Adorners; using Greenshot.Editor.Configuration; +using Greenshot.Editor.Controls; using Greenshot.Editor.Drawing.Fields; +using Greenshot.Editor.Forms; using Greenshot.Editor.Memento; using log4net; @@ -61,6 +63,16 @@ namespace Greenshot.Editor.Drawing /// private int _counterStart = 1; + /// + /// The image used for the color picker cursor initialized once form has loaded + /// + private Cursor colorPickerCursor = null; + + /// + /// The image used for the color picker cursor initialized once form has loaded + /// + private MovableShowColorForm _movableShowColorForm = new MovableShowColorForm(); + /// /// The GUID of the surface /// @@ -483,6 +495,8 @@ namespace Greenshot.Editor.Drawing _elements = new DrawableContainerList(_uniqueId); selectedElements = new DrawableContainerList(_uniqueId); LOG.Debug("Creating surface!"); + MouseEnter += SurfaceMouseEnter; + MouseLeave += SurfaceMouseLeave; MouseDown += SurfaceMouseDown; MouseUp += SurfaceMouseUp; MouseMove += SurfaceMouseMove; @@ -502,6 +516,7 @@ namespace Greenshot.Editor.Drawing SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.ContainerControl | ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true); + colorPickerCursor = Pipette.CreateCursor((Bitmap)new ComponentResourceManager(typeof(ImageEditorForm)).GetObject("colorPicker.Image"), 1, 14); } /// @@ -788,6 +803,7 @@ namespace Greenshot.Editor.Drawing case DrawingModes.Path: _undrawnElement = new FreehandContainer(this); break; + case DrawingModes.ColorPicker: case DrawingModes.None: _undrawnElement = null; break; @@ -1415,6 +1431,7 @@ namespace Greenshot.Editor.Drawing private MouseEventArgs InverseZoomMouseCoordinates(MouseEventArgs e) => new MouseEventArgs(e.Button, e.Clicks, (int) (e.X / _zoomFactor), (int) (e.Y / _zoomFactor), e.Delta); + /// /// This event handler is called when someone presses the mouse on a surface. /// @@ -1473,7 +1490,14 @@ namespace Greenshot.Editor.Drawing _drawingElement = null; } - if (_drawingElement == null && DrawingMode != DrawingModes.None) + if (DrawingMode == DrawingModes.ColorPicker) + { + var color = _movableShowColorForm.Color; + var colorString = "#" + color.R.ToString("X2") + color.G.ToString("X2") + color.B.ToString("X2"); + ClipboardHelper.SetClipboardData(colorString); + SendMessageEvent(this, SurfaceMessageTyp.Info, colorString); + } + else if (_drawingElement == null && DrawingMode != DrawingModes.None) { if (_undrawnElement == null) { @@ -1612,6 +1636,32 @@ namespace Greenshot.Editor.Drawing } } + + /// + /// This event handler is called when the mouse enters the surface + /// + /// + private void SurfaceMouseEnter(object sender, EventArgs e) + { + if (DrawingMode == DrawingModes.ColorPicker) + { + _movableShowColorForm.Visible = true; + Focus(); // steal back focus after the movable form takes it + } + } + + /// + /// This event handler is called when the mouse leaves the surface + /// + /// + private void SurfaceMouseLeave(object sender, EventArgs e) + { + if (DrawingMode == DrawingModes.ColorPicker) + { + _movableShowColorForm.Visible = false; + } + } + /// /// This event handler is called when the mouse moves over the surface /// @@ -1619,6 +1669,11 @@ namespace Greenshot.Editor.Drawing /// private void SurfaceMouseMove(object sender, MouseEventArgs e) { + if (DrawingMode == DrawingModes.ColorPicker) + { + _movableShowColorForm.MoveTo(PointToScreen(new Point(e.X, e.Y))); + } + e = InverseZoomMouseCoordinates(e); // Handle Adorners @@ -1631,7 +1686,18 @@ namespace Greenshot.Editor.Drawing Point currentMouse = e.Location; - Cursor = DrawingMode != DrawingModes.None ? Cursors.Cross : Cursors.Default; + switch (DrawingMode) + { + case DrawingModes.None: + Cursor = Cursors.Default; + break; + case DrawingModes.ColorPicker: + Cursor = colorPickerCursor; + break; + default: + Cursor = Cursors.Cross; + break; + } if (!_mouseDown) return; @@ -2101,6 +2167,11 @@ namespace Greenshot.Editor.Drawing { ConfirmCrop(confirm); } + else if (DrawingMode == DrawingModes.ColorPicker && !confirm) + { + Cursor = Cursors.Default; + _movableShowColorForm.Visible = false; + } else { ConfirmSelectedConfirmableElements(confirm); diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs b/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs index c0a8f8a63..0d17b1cd1 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.Designer.cs @@ -60,7 +60,8 @@ namespace Greenshot.Editor.Forms { this.panel1 = new NonJumpingPanel(); this.toolsToolStrip = new ToolStripEx(); this.btnCursor = new GreenshotToolStripButton(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.btnColorPicker = new GreenshotToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.btnRect = new GreenshotToolStripButton(); this.btnEllipse = new GreenshotToolStripButton(); this.btnLine = new GreenshotToolStripButton(); @@ -327,7 +328,8 @@ namespace Greenshot.Editor.Forms { this.toolsToolStrip.Renderer = new CustomToolStripProfessionalRenderer(); this.toolsToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.btnCursor, - this.toolStripSeparator1, + this.btnColorPicker, + this.toolStripSeparator1, this.btnRect, this.btnEllipse, this.btnLine, @@ -362,10 +364,20 @@ namespace Greenshot.Editor.Forms { this.btnCursor.LanguageKey = "editor_cursortool"; this.btnCursor.Name = "btnCursor"; this.btnCursor.Click += new System.EventHandler(this.BtnCursorClick); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // btnColorPicker + // + this.btnColorPicker.CheckOnClick = true; + this.btnColorPicker.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnColorPicker.Image = ((System.Drawing.Image)(resources.GetObject("colorPicker.Image"))); + this.btnColorPicker.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnColorPicker.LanguageKey = "colorpicker_title"; + this.btnColorPicker.Name = "btnColorPicker"; + this.btnColorPicker.Click += new System.EventHandler(this.BtnColorPickerClick); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; // // btnRect // @@ -1969,7 +1981,8 @@ namespace Greenshot.Editor.Forms { private GreenshotToolStripMenuItem upOneLevelToolStripMenuItem; private GreenshotToolStripMenuItem arrangeToolStripMenuItem; private GreenshotToolStripButton btnCursor; - private ToolStripEx toolsToolStrip; + private GreenshotToolStripButton btnColorPicker; + private ToolStripEx toolsToolStrip; private GreenshotToolStripButton btnArrow; private GreenshotToolStripMenuItem drawArrowToolStripMenuItem; private GreenshotToolStripMenuItem drawFreehandToolStripMenuItem; diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.cs b/src/Greenshot.Editor/Forms/ImageEditorForm.cs index 87c3813c7..53f796796 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.cs +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.cs @@ -285,7 +285,7 @@ namespace Greenshot.Editor.Forms _toolbarButtons = new[] { - btnCursor, btnRect, btnEllipse, btnText, btnLine, btnArrow, btnFreehand, btnHighlight, btnObfuscate, btnCrop, btnStepLabel, btnSpeechBubble + btnCursor, btnColorPicker, btnRect, btnEllipse, btnText, btnLine, btnArrow, btnFreehand, btnHighlight, btnObfuscate, btnCrop, btnStepLabel, btnSpeechBubble }; //toolbarDropDownButtons = new ToolStripDropDownButton[]{btnBlur, btnPixeliate, btnTextHighlighter, btnAreaHighlighter, btnMagnifier}; @@ -598,6 +598,9 @@ namespace Greenshot.Editor.Forms case DrawingModes.None: SetButtonChecked(btnCursor); break; + case DrawingModes.ColorPicker: + SetButtonChecked(btnColorPicker); + break; case DrawingModes.Ellipse: SetButtonChecked(btnEllipse); break; @@ -683,6 +686,12 @@ namespace Greenshot.Editor.Forms RefreshFieldControls(); } + private void BtnColorPickerClick(object sender, EventArgs e) + { + _surface.DrawingMode = DrawingModes.ColorPicker; + RefreshFieldControls(); + } + private void BtnRectClick(object sender, EventArgs e) { _surface.DrawingMode = DrawingModes.Rect; @@ -1295,7 +1304,7 @@ namespace Greenshot.Editor.Forms private void RefreshFieldControls() { propertiesToolStrip.SuspendLayout(); - if (_surface.HasSelectedElements || _surface.DrawingMode != DrawingModes.None) + if (_surface.HasSelectedElements || (_surface.DrawingMode != DrawingModes.None && _surface.DrawingMode != DrawingModes.ColorPicker)) { var props = (FieldAggregator)_surface.FieldAggregator; btnFillColor.Visible = props.HasFieldValue(FieldType.FILL_COLOR); diff --git a/src/Greenshot.Editor/Forms/ImageEditorForm.resx b/src/Greenshot.Editor/Forms/ImageEditorForm.resx index 1c5b104fd..19c48df34 100644 --- a/src/Greenshot.Editor/Forms/ImageEditorForm.resx +++ b/src/Greenshot.Editor/Forms/ImageEditorForm.resx @@ -1086,6 +1086,9 @@ ..\icons\resize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\..\Greenshot\icons\pipette.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + 551, 17 diff --git a/src/Greenshot.Editor/Forms/MovableShowColorForm.Designer.cs b/src/Greenshot.Editor/Forms/MovableShowColorForm.Designer.cs index 856e59abb..62d52a12c 100644 --- a/src/Greenshot.Editor/Forms/MovableShowColorForm.Designer.cs +++ b/src/Greenshot.Editor/Forms/MovableShowColorForm.Designer.cs @@ -1,3 +1,5 @@ +using System.Windows.Forms; + namespace Greenshot.Editor.Forms { partial class MovableShowColorForm