Misc improvements

This commit is contained in:
Julien Richard 2022-01-14 10:08:13 +01:00
commit 9d9ef12619

View file

@ -29,7 +29,6 @@ using System.Windows.Forms.Integration;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using Greenshot.Base.Interfaces.Drawing; using Greenshot.Base.Interfaces.Drawing;
using Greenshot.Editor.Drawing.Adorners;
using Greenshot.Editor.Helpers; using Greenshot.Editor.Helpers;
using log4net; using log4net;
using Point = System.Drawing.Point; using Point = System.Drawing.Point;
@ -46,8 +45,9 @@ namespace Greenshot.Editor.Drawing
private static readonly ILog Log = LogManager.GetLogger(typeof(IconContainer)); private static readonly ILog Log = LogManager.GetLogger(typeof(IconContainer));
[NonSerialized] private System.Windows.Controls.Image _image; [NonSerialized] private System.Windows.Controls.Image _image;
[NonSerialized] private ElementHost _emojiPicker;
[NonSerialized] private bool _firstSelection = true;
private int _rotateAngle;
private string _emoji; private string _emoji;
public string Emoji public string Emoji
@ -77,33 +77,53 @@ namespace Greenshot.Editor.Drawing
public override void OnDoubleClick() public override void OnDoubleClick()
{ {
var host = new ElementHost(); ShowEmojiPicker();
host.Dock = DockStyle.None; }
var rect = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height);
host.Width = rect.Width;
host.Height = rect.Height;
host.Left = rect.Left;
host.Top = rect.Top;
var picker = new Emoji.Wpf.Picker { Selection = Emoji }; private void ShowEmojiPicker()
picker.Picked += (o, args) => {
if (_emojiPicker == null)
{ {
Emoji = args.Emoji; var picker = new Emoji.Wpf.Picker();
_parent.Controls.Remove(host); picker.Picked += (_, args) =>
{
Emoji = args.Emoji;
Invalidate();
};
}; _emojiPicker = new ElementHost();
host.Child = picker; _emojiPicker.Dock = DockStyle.None;
_emojiPicker.Child = picker;
}
var emojiPickerChild = ((Emoji.Wpf.Picker)_emojiPicker.Child);
emojiPickerChild.Selection = Emoji;
var absRectangle = GuiRectangle.GetGuiRectangle(Left, Top, Width, Height);
var displayRectangle = Parent.ToSurfaceCoordinates(absRectangle);
_emojiPicker.Width = 0; // Trick to hide the picker's button
_emojiPicker.Height = displayRectangle.Height;
_emojiPicker.Left = displayRectangle.Left;
_emojiPicker.Top = displayRectangle.Top;
if (_parent != null) if (_parent != null)
{ {
_parent.KeysLocked = true; _parent.KeysLocked = true;
_parent.Controls.Add(host); _parent.Controls.Add(_emojiPicker);
} }
host.Show(); emojiPickerChild.ShowPopup = true;
host.Focus();
} }
private void HideEmojiPicker()
{
if (_parent != null && _emojiPicker != null)
{
_parent.Controls.Remove(_emojiPicker);
}
}
protected override void OnDeserialized(StreamingContext streamingContext) protected override void OnDeserialized(StreamingContext streamingContext)
{ {
base.OnDeserialized(streamingContext); base.OnDeserialized(streamingContext);
@ -117,13 +137,24 @@ namespace Greenshot.Editor.Drawing
// Create WPF control // Create WPF control
_image = new System.Windows.Controls.Image(); _image = new System.Windows.Controls.Image();
global::Emoji.Wpf.Image.SetSource(_image, Emoji); global::Emoji.Wpf.Image.SetSource(_image, Emoji);
PropertyChanged += OnPropertyChanged;
} }
public override void Transform(System.Drawing.Drawing2D.Matrix matrix) private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
_rotateAngle += CalculateAngle(matrix); if (e.PropertyName.Equals(nameof(Selected)))
_rotateAngle %= 360; {
base.Transform(matrix); if (!Selected)
{
HideEmojiPicker();
}
else if (Status == EditStatus.IDLE && _firstSelection)
{
ShowEmojiPicker();
_firstSelection = false;
}
}
} }
public override void Draw(Graphics graphics, RenderMode rm) public override void Draw(Graphics graphics, RenderMode rm)
@ -147,15 +178,32 @@ namespace Greenshot.Editor.Drawing
using var bitmap = BitmapFromSource(renderTargetBitmap); using var bitmap = BitmapFromSource(renderTargetBitmap);
if (_rotateAngle != 0) var rotationAngle = GetRotationAngle();
if (rotationAngle != 0)
{ {
graphics.DrawImage(RotateImage(bitmap, _rotateAngle), Bounds); graphics.DrawImage(RotateImage(bitmap, rotationAngle), Bounds);
return; return;
} }
graphics.DrawImage(bitmap, Bounds); graphics.DrawImage(bitmap, Bounds);
} }
} }
private int GetRotationAngle()
{
int rotationAngle = 0;
if (Width < 0)
{
rotationAngle = Height > 0 ? 90 : 180;
}
else if (Height < 0)
{
rotationAngle = 270;
}
return rotationAngle;
}
private Bitmap BitmapFromSource(BitmapSource bitmapSource) private Bitmap BitmapFromSource(BitmapSource bitmapSource)
{ {
var src = new FormatConvertedBitmap(); var src = new FormatConvertedBitmap();