Skip to content

Commit

Permalink
Fix too high scroll speed with high-resolution mouses
Browse files Browse the repository at this point in the history
Adjustment value/zoom level need to be updated in smaller
steps because of more dense events sent by the mouse.
  • Loading branch information
kbengs authored and jeromerobert committed Nov 4, 2023
1 parent ff2cbef commit a6c9d0c
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 26 deletions.
8 changes: 1 addition & 7 deletions pdfarranger/pageutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -576,13 +576,7 @@ def sw_scroll_event(self, sw, event):
maxfactor = (80000000 / (w * h)) ** .5 # Limit zoom at about 304Mb

if event.direction == Gdk.ScrollDirection.SMOOTH:
dy = event.get_scroll_deltas()[2]
if dy < 0:
factor = round(min(1.3, maxfactor), 2)
elif dy > 0:
factor = 0.7
else:
return Gdk.EVENT_PROPAGATE
factor = round(min(1 - event.get_scroll_deltas()[2] * 0.3, maxfactor), 2)
elif event.direction == Gdk.ScrollDirection.UP:
factor = round(min(1.3, maxfactor), 2)
elif event.direction == Gdk.ScrollDirection.DOWN:
Expand Down
31 changes: 12 additions & 19 deletions pdfarranger/pdfarranger.py
Original file line number Diff line number Diff line change
Expand Up @@ -1067,7 +1067,7 @@ def close_application(self, _widget=None, _event=None, _data=None):
gc.collect()
self.config.set_window_size(self.window.get_size())
self.config.set_maximized(self.window.is_maximized())
self.config.set_zoom_level(self.zoom_level)
self.config.set_zoom_level(round(self.zoom_level))
self.config.set_position(self.window.get_position())
self.config.save()
if os.path.isdir(self.tmp_dir):
Expand Down Expand Up @@ -2197,27 +2197,19 @@ def sw_scroll_event(self, _scrolledwindow, event):
return Gdk.EVENT_PROPAGATE
if event.direction == Gdk.ScrollDirection.SMOOTH:
dy = event.get_scroll_deltas()[2]
if dy < 0:
direction = 'UP'
elif dy > 0:
direction = 'DOWN'
else:
return Gdk.EVENT_PROPAGATE
elif event.direction == Gdk.ScrollDirection.UP:
direction = 'UP'
dy = -1
elif event.direction == Gdk.ScrollDirection.DOWN:
direction = 'DOWN'
dy = 1
else:
return Gdk.EVENT_PROPAGATE
if event.state & Gdk.ModifierType.CONTROL_MASK:
# Zoom
zoom_delta = 1 if direction == 'UP' else -1
self.zoom_set(self.zoom_level + zoom_delta)
self.zoom_set(self.zoom_level - dy)
else:
#Scroll. Also drag-select if mouse button is pressed
# Scroll. Also drag-select if mouse button is pressed
sw_vadj = self.sw.get_vadjustment()
step = sw_vadj.get_step_increment()
step = -step if direction == 'UP' else step
step = max(20, sw_vadj.get_step_increment()) * dy
with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event):
sw_vadj.set_value(sw_vadj.get_value() + step)
if event.state & Gdk.ModifierType.BUTTON1_MASK:
Expand All @@ -2244,13 +2236,14 @@ def update_max_zoom_level(self):
def zoom_set(self, level):
"""Sets the zoom level"""
lower, upper = self.zoom_level_limits
level = min(max(level, lower), upper)
self.enable_zoom_buttons(level != lower, level != upper)
if self.zoom_level == level:
self.zoom_level = min(max(level, lower), upper)
int_zoom_level = round(self.zoom_level)
self.enable_zoom_buttons(int_zoom_level != lower, int_zoom_level != upper)
zoom_scale = 0.2 * (1.1 ** int_zoom_level)
if zoom_scale == self.zoom_scale:
return
self.zoom_scale = zoom_scale
self.vadj_percent_handler(store=True)
self.zoom_level = level
self.zoom_scale = 0.2 * (1.1 ** level)
if self.id_scroll_to_sel:
GObject.source_remove(self.id_scroll_to_sel)
self.zoom_fit_page = False
Expand Down

0 comments on commit a6c9d0c

Please sign in to comment.