Skip to content
Snippets Groups Projects

Legge til støtte for zoom med CTRL + scroll

Merged Thomas Holene Løkkeborg requested to merge zoom-fiks into master
All threads resolved!
1 file
+ 50
13
Compare changes
  • Side-by-side
  • Inline
@@ -30,7 +30,10 @@ from soitool.modules.module_base import qfont_with_pixel_size
ATTACHMENT_NUMBERING_SCHEME = list(string.ascii_uppercase)
# Amount to zoom on scroll
SCROLL_ZOOM_FACTOR = 1.1
SCROLL_ZOOM_INCREMENT = 0.1
ZOOM_LEVEL_MINIMUM = 0.2
ZOOM_LEVEL_MAXIMUM = 5
class QGraphicsViewWithCtrlScrollListener(QGraphicsView):
@@ -293,19 +296,21 @@ class InlineEditableSOIView(QScrollArea):
# when scrolling up
downward_scroll = bool(event.angleDelta().y() < 1)
zoom_factor = SCROLL_ZOOM_FACTOR
zoom_increment = SCROLL_ZOOM_INCREMENT
if downward_scroll:
zoom_factor = 1 / zoom_factor
zoom_increment *= -1
self.zoom(
zoom_factor, anchor=QGraphicsView.ViewportAnchor.AnchorUnderMouse
zoom_increment,
anchor=QGraphicsView.ViewportAnchor.AnchorUnderMouse,
)
self.show_zoom_level_in_statusbar()
def show_zoom_level_in_statusbar(self):
"""Show zoom level in statusbar."""
zoom_level_percentage_string = str(round(self.zoom_level * 100))
current_scale = self.get_current_scale()
zoom_level_percentage_string = str(round(current_scale * 100))
message = f"Zoom: {zoom_level_percentage_string}%"
get_main_window().statusBar().showMessage(message)
@@ -733,29 +738,61 @@ class InlineEditableSOIView(QScrollArea):
timer.start(10)
def zoom(
self, zoom_factor, anchor=QGraphicsView.ViewportAnchor.AnchorViewCenter
self,
zoom_increment,
anchor=QGraphicsView.ViewportAnchor.AnchorViewCenter,
):
"""Zoom GraphicsView by zoom_factor.
The zoom level is held within ZOOM_LEVEL_MINIMUM and
ZOOM_LEVEL_MAXIMUM.
Note that because of inaccuracy during floating point operations the
current scale is sometimes off by an insignificant fraction
(e.g. 0.0000000000000001)
source:
* https://stackoverflow.com/a/29026916/3545896
* https://stackoverflow.com/a/41688654/3545896
Parameters
----------
zoom_factor : float
> 1 to zoom in and < 1 to zoom out
zoom_increment : float
How much to increase zoom by. 1 means increase by 100%, -0.5 means
decrease by -50%, and so on.
anchor : QGraphicsView.ViewportAnchor
Anchor indicates where to aim the zoom. See the documentation for
QGraphicsView.ViewportAnchor.
QGraphicsView.ViewportAnchor.AnchorUnderMouse can be used to target
the mouse.
"""
self.zoom_level *= zoom_factor
viewport_anchor = self.view.transformationAnchor()
self.view.setTransformationAnchor(anchor)
self.view.scale(zoom_factor, zoom_factor)
self.view.setTransformationAnchor(viewport_anchor)
current_scale = self.get_current_scale()
# Only zoom if we are not breaching the minimum and maximum range
new_scale = current_scale + zoom_increment
if new_scale > ZOOM_LEVEL_MINIMUM and new_scale < ZOOM_LEVEL_MAXIMUM:
# We need a scalar such that:
# current_scale * scalar = current_scale + zoom_increment
scalar = (current_scale + zoom_increment) / current_scale
viewport_anchor = self.view.transformationAnchor()
self.view.setTransformationAnchor(anchor)
self.view.scale(
scalar, scalar,
)
self.view.setTransformationAnchor(viewport_anchor)
def get_current_scale(self):
"""Get current scale.
Returns
-------
scale : float
Horizontal and vertical scale. They should always be equal in our
case.
"""
scale_x = self.view.transform().m11()
return scale_x
def soi_date_string_to_user_friendly_string(date_string):
Loading