diff --git a/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs b/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs index 624c156b1..4dfa4811d 100644 --- a/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs +++ b/src/Greenshot.Base/Interfaces/Drawing/Adorners/IAdorner.cs @@ -98,5 +98,15 @@ namespace Greenshot.Base.Interfaces.Drawing.Adorners /// /// void AdjustToDpi(uint dpi); + + /// + /// The color of the lines around the adorner + /// + Color OutlineColor { get; set; } + + /// + /// The color of the fill of the adorner + /// + Color FillColor { get; set; } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs index 028306e24..dde10bb84 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/AbstractAdorner.cs @@ -137,12 +137,36 @@ namespace Greenshot.Editor.Drawing.Adorners _size = DpiHelper.ScaleWithDpi(DefaultSize, dpi); } + public Color OutlineColor { get; set; } = Color.White; + public Color FillColor { get; set; } = Color.Black; + /// /// Draw the adorner /// /// PaintEventArgs public virtual void Paint(PaintEventArgs paintEventArgs) { + Graphics targetGraphics = paintEventArgs.Graphics; + + var bounds = BoundsOnSurface; + GraphicsState state = targetGraphics.Save(); + + targetGraphics.CompositingMode = CompositingMode.SourceCopy; + + try + { + using var fillBrush = new SolidBrush(FillColor); + targetGraphics.FillRectangle(fillBrush, bounds); + using var lineBrush = new SolidBrush(OutlineColor); + using var pen = new Pen(lineBrush); + targetGraphics.DrawRectangle(pen, bounds); + } + catch + { + // Ignore, BUG-2065 + } + + targetGraphics.Restore(state); } /// diff --git a/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs index ad1355ced..7c20e6722 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/MoveAdorner.cs @@ -136,31 +136,5 @@ namespace Greenshot.Editor.Drawing.Adorners return new Point(x, y); } } - - /// - /// Draw the adorner - /// - /// PaintEventArgs - public override void Paint(PaintEventArgs paintEventArgs) - { - Graphics targetGraphics = paintEventArgs.Graphics; - - var bounds = BoundsOnSurface; - GraphicsState state = targetGraphics.Save(); - - targetGraphics.CompositingMode = CompositingMode.SourceCopy; - - try - { - targetGraphics.FillRectangle(Brushes.Black, bounds); - targetGraphics.DrawRectangle(new Pen(Brushes.White), bounds); - } - catch - { - // Ignore, BUG-2065 - } - - targetGraphics.Restore(state); - } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs index 052abaaa4..c99d4440f 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/ResizeAdorner.cs @@ -164,23 +164,5 @@ namespace Greenshot.Editor.Drawing.Adorners return new Point(x, y); } } - - /// - /// Draw the adorner - /// - /// PaintEventArgs - public override void Paint(PaintEventArgs paintEventArgs) - { - Graphics targetGraphics = paintEventArgs.Graphics; - - var bounds = BoundsOnSurface; - GraphicsState state = targetGraphics.Save(); - - targetGraphics.CompositingMode = CompositingMode.SourceCopy; - - targetGraphics.FillRectangle(Brushes.Black, bounds); - targetGraphics.DrawRectangle(new Pen(Brushes.White), bounds); - targetGraphics.Restore(state); - } } } \ No newline at end of file diff --git a/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs b/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs index 0dec40a5f..f39f535e6 100644 --- a/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs +++ b/src/Greenshot.Editor/Drawing/Adorners/TargetAdorner.cs @@ -29,11 +29,13 @@ namespace Greenshot.Editor.Drawing.Adorners /// /// This implements the special "gripper" for the Speech-Bubble tail /// - public class TargetAdorner : AbstractAdorner + public sealed class TargetAdorner : AbstractAdorner { - public TargetAdorner(IDrawableContainer owner, Point location) : base(owner) + public TargetAdorner(IDrawableContainer owner, Point location, Color? fillColor = null, Color? outlineColor = null) : base(owner) { Location = location; + FillColor = fillColor ?? Color.Green; + OutlineColor = outlineColor ?? Color.White; } /// @@ -90,19 +92,6 @@ namespace Greenshot.Editor.Drawing.Adorners Owner.Invalidate(); } - /// - /// Draw the adorner - /// - /// PaintEventArgs - public override void Paint(PaintEventArgs paintEventArgs) - { - Graphics targetGraphics = paintEventArgs.Graphics; - - var bounds = BoundsOnSurface; - targetGraphics.FillRectangle(Brushes.Green, bounds); - targetGraphics.DrawRectangle(new Pen(Brushes.White), bounds); - } - /// /// Made sure this adorner is transformed /// diff --git a/src/Greenshot.Editor/Drawing/DrawableContainer.cs b/src/Greenshot.Editor/Drawing/DrawableContainer.cs index b07974e61..38eab8b3f 100644 --- a/src/Greenshot.Editor/Drawing/DrawableContainer.cs +++ b/src/Greenshot.Editor/Drawing/DrawableContainer.cs @@ -363,7 +363,8 @@ namespace Greenshot.Editor.Drawing /// /// Initialize a target gripper /// - protected void InitAdorner(Color gripperColor, Point location) + /// Point + protected void InitTargetAdorner(Point location) { _targetAdorner = new TargetAdorner(this, location); Adorners.Add(_targetAdorner); diff --git a/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs b/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs index 0a19805e7..0e60765e9 100644 --- a/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs +++ b/src/Greenshot.Editor/Drawing/SpeechbubbleContainer.cs @@ -62,7 +62,7 @@ namespace Greenshot.Editor.Drawing protected override void OnDeserialized(StreamingContext streamingContext) { base.OnDeserialized(streamingContext); - InitAdorner(Color.Green, _storedTargetGripperLocation); + InitTargetAdorner(_storedTargetGripperLocation); } public SpeechbubbleContainer(ISurface parent) : base(parent) @@ -95,7 +95,7 @@ namespace Greenshot.Editor.Drawing if (TargetAdorner == null) { _initialGripperPoint = new Point(mouseX, mouseY); - InitAdorner(Color.Green, new Point(mouseX, mouseY)); + InitTargetAdorner(new Point(mouseX, mouseY)); } return base.HandleMouseDown(mouseX, mouseY);