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