Skip to content

Commit

Permalink
AbstractDirectoryView: Use EventControllerScroll (#2408)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremypw authored Oct 8, 2024
1 parent 2f1a233 commit 37ead8a
Showing 1 changed file with 22 additions and 72 deletions.
94 changes: 22 additions & 72 deletions src/View/AbstractDirectoryView.vala
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ namespace Files {

protected Gtk.EventControllerKey key_controller;
protected Gtk.GestureMultiPress button_controller;
protected Gtk.EventControllerScroll scroll_controller;
protected Gtk.EventControllerMotion motion_controller;

public signal void path_change_request (GLib.File location, Files.OpenFlag flag, bool new_root);
Expand Down Expand Up @@ -327,10 +328,18 @@ namespace Files {
schedule_thumbnail_color_tag_timeout ();
});

scroll_controller = new Gtk.EventControllerScroll (view, NONE);
scroll_controller.scroll.connect (on_scroll_event);

key_controller = new Gtk.EventControllerKey (view) {
propagation_phase = BUBBLE
};
key_controller.key_pressed.connect (on_view_key_press_event);
// Workaround for scroll events getting consumed by scroll controller
// Only handle scroll events when a key is pressed (for zooming), otherwise they will be handled
// by the native widget
key_controller.key_pressed.connect (() => {scroll_controller.flags = VERTICAL; return false;});
key_controller.key_released.connect (() => scroll_controller.flags = NONE);

// Hack required to suppress native behaviour when dragging
// multiple selected items with GestureMultiPress event controller
Expand Down Expand Up @@ -385,8 +394,6 @@ namespace Files {
on_clipboard_changed ();
});

scroll_event.connect (on_scroll_event);

get_vadjustment ().value_changed.connect_after (() => {
schedule_thumbnail_color_tag_timeout ();
});
Expand Down Expand Up @@ -762,49 +769,6 @@ namespace Files {
return only_folders;
}

/** Handle scroll events */
protected bool handle_scroll_event (Gdk.EventScroll event) {
if (is_frozen) {
return true;
}

Gdk.ModifierType state;
event.get_state (out state);

if ((state & Gdk.ModifierType.CONTROL_MASK) > 0) {
Gdk.ScrollDirection direction;
double delta_x, delta_y;
if (event.get_scroll_direction (out direction)) { // Only true for discrete scrolling
if (direction == Gdk.ScrollDirection.UP) {
zoom_in ();
return true;

} else if (direction == Gdk.ScrollDirection.DOWN) {
zoom_out ();
return true;
}

return false;
} else if (event.get_scroll_deltas (out delta_x, out delta_y)) {
/* try to emulate a normal scrolling event by summing deltas.
* step size of 0.5 chosen to match sensitivity */
total_delta_y += delta_y;

if (total_delta_y >= 0.5) {
total_delta_y = 0;
zoom_out ();
} else if (total_delta_y <= -0.5) {
total_delta_y = 0;
zoom_in ();
}

return true;
}
}

return false;
}

protected GLib.List<Files.File>
get_selected_files_for_transfer (GLib.List<Files.File> selection = get_selected_files ()) {
return selection.copy_deep ((GLib.CopyFunc) GLib.Object.ref);
Expand Down Expand Up @@ -2921,10 +2885,6 @@ namespace Files {
}

var event = Gtk.get_current_event ();
if (((Gdk.EventKey)event).is_modifier == 1) {
return true;
}

cancel_hover ();

Gdk.ModifierType consumed_mods;
Expand Down Expand Up @@ -3251,35 +3211,25 @@ namespace Files {
hover_path = null;
}

protected virtual bool on_scroll_event (Gdk.EventScroll event) {
Gdk.ScrollDirection direction;
event.get_scroll_direction (out direction);
protected virtual void on_scroll_event (double dx, double dy) {
Gdk.ModifierType state;
event.get_state (out state);
if ((state & Gdk.ModifierType.CONTROL_MASK) == 0) {
double increment = 0.0;
Gtk.get_current_event_state (out state);

switch (direction) {
case Gdk.ScrollDirection.LEFT:
increment = 5.0;
break;
if (!is_frozen && (state & Gdk.ModifierType.CONTROL_MASK) > 0) {
/* try to emulate a normal scrolling event by summing deltas.
* step size of 0.5 chosen to match sensitivity */
total_delta_y += dy;

case Gdk.ScrollDirection.RIGHT:
increment = -5.0;
break;

case Gdk.ScrollDirection.SMOOTH:
double delta_x;
event.get_scroll_deltas (out delta_x, null);
increment = delta_x * 10.0;
break;

default:
break;
if (total_delta_y >= 0.5) {
total_delta_y = 0;
zoom_out ();
} else if (total_delta_y <= -0.5) {
total_delta_y = 0;
zoom_in ();
}
}

return handle_scroll_event (event);

}

/** name renderer signals */
Expand Down

0 comments on commit 37ead8a

Please sign in to comment.