Fix scroll-to-zoom in desktop form

#355
This commit is contained in:
Ben Olden-Cooligan 2024-04-13 20:09:24 -07:00
parent f5a5d5b2b4
commit b99d95bc58
4 changed files with 33 additions and 21 deletions

View File

@ -252,26 +252,25 @@ public class GtkEtoPlatform : EtoPlatform
{
var native = control.ToNative();
// Attach to the child so that the scrollbars don't steal the event from us
var child = (native as GTK.Bin)?.Child;
if (child == null)
if (native is GTK.EventBox eventBox)
{
Log.Error("Expected scrollable to be GTK.Bin");
base.AttachMouseWheelEvent(control, eventHandler);
native = eventBox.Child;
}
else
if (native is GTK.ScrolledWindow scrolledWindow)
{
child.ScrollEvent += (sender, args) =>
{
var ev = args.Event;
var newArgs = new MouseEventArgs(
MouseButtons.None,
ev.State.ToEtoKey(),
new PointF((float) ev.X, (float) ev.Y),
// Negate deltaY to match WinForms
new SizeF((float) ev.DeltaX, (float) -ev.DeltaY));
eventHandler.Invoke(sender, newArgs);
args.RetVal = newArgs.Handled;
};
native = scrolledWindow.Child;
}
native.ScrollEvent += (sender, args) =>
{
var ev = args.Event;
var newArgs = new MouseEventArgs(
MouseButtons.None,
ev.State.ToEtoKey(),
new PointF((float) ev.X, (float) ev.Y),
// Negate deltaY to match WinForms
new SizeF((float) ev.DeltaX, (float) -ev.DeltaY));
eventHandler.Invoke(sender, newArgs);
args.RetVal = newArgs.Handled;
};
}
}

View File

@ -286,10 +286,17 @@ public class WinFormsEtoPlatform : EtoPlatform
}
else
{
throw new NotImplementedException("Only implemented for Scrollable");
var wfControl = control.ToNative();
wfControl.MouseWheel += (sender, e) => eventHandler(sender, e.ToEto(wfControl));
}
}
public override void AttachMouseMoveEvent(Control control, EventHandler<MouseEventArgs> eventHandler)
{
var wfControl = control.ToNative();
wfControl.MouseMove += (sender, e) => eventHandler(sender, e.ToEto(wfControl));
}
private class ScrollableWithMouseWheelEvents : ScrollableHandler.CustomScrollable
{
private readonly EventHandler<MouseEventArgs> _mouseWheelHandler;

View File

@ -140,4 +140,9 @@ public abstract class EtoPlatform
{
control.MouseWheel += eventHandler;
}
public virtual void AttachMouseMoveEvent(Control control, EventHandler<MouseEventArgs> eventHandler)
{
control.MouseMove += eventHandler;
}
}

View File

@ -86,8 +86,8 @@ public abstract class DesktopForm : EtoFormBase
// TODO: Fix Eto so that we don't need to set an item here (otherwise the first time we right click nothing happens)
_contextMenu.Items.Add(Commands.SelectAll);
_contextMenu.Opening += OpeningContextMenu;
_listView.Control.MouseWheel += ListViewMouseWheel;
_listView.Control.MouseMove += ListViewMouseMove;
EtoPlatform.Current.AttachMouseWheelEvent(_listView.Control, ListViewMouseWheel);
EtoPlatform.Current.AttachMouseMoveEvent(_listView.Control, ListViewMouseMove);
EtoPlatform.Current.HandleKeyDown(this, _keyboardShortcuts.Perform);
EtoPlatform.Current.HandleKeyDown(_listView.Control, _keyboardShortcuts.Perform);
@ -526,7 +526,8 @@ public abstract class DesktopForm : EtoFormBase
{
if (e.Modifiers.HasFlag(Keys.Control))
{
_thumbnailController.StepSize(e.Delta.Height); // / (double) SystemInformation.MouseWheelScrollDelta
_thumbnailController.StepSize(e.Delta.Height);
e.Handled = true;
}
}