Make scroll bars show the right position on scroll and zoom
This commit is contained in:
parent
0c5009ef44
commit
36ef0962f3
gaphas/view
@ -331,9 +331,11 @@ class GtkView(Gtk.DrawingArea, Gtk.Scrollable):
|
|||||||
qtree.add(item=item, bounds=(x, y, w, h))
|
qtree.add(item=item, bounds=(x, y, w, h))
|
||||||
|
|
||||||
def update_scrolling(self) -> None:
|
def update_scrolling(self) -> None:
|
||||||
self._scrolling.update_adjustments(
|
matrix = Matrix(*self._matrix) # type: ignore[misc]
|
||||||
self.get_width(), self.get_height(), self._qtree.soft_bounds
|
matrix.set(x0=0, y0=0)
|
||||||
)
|
bounds = Rectangle(*transform_rectangle(matrix, self._qtree.soft_bounds))
|
||||||
|
|
||||||
|
self._scrolling.update_adjustments(self.get_width(), self.get_height(), bounds)
|
||||||
|
|
||||||
def _debug_draw_bounding_box(self, cr, width, height):
|
def _debug_draw_bounding_box(self, cr, width, height):
|
||||||
for item in self.get_items_in_rectangle((0, 0, width, height)):
|
for item in self.get_items_in_rectangle((0, 0, width, height)):
|
||||||
@ -386,6 +388,7 @@ class GtkView(Gtk.DrawingArea, Gtk.Scrollable):
|
|||||||
# Test if scale or rotation changed
|
# Test if scale or rotation changed
|
||||||
if tuple(matrix)[:4] != old_matrix_values[:4]:
|
if tuple(matrix)[:4] != old_matrix_values[:4]:
|
||||||
self.update_scrolling()
|
self.update_scrolling()
|
||||||
|
self._scrolling.update_position(-matrix[4], -matrix[5])
|
||||||
self.update_back_buffer()
|
self.update_back_buffer()
|
||||||
|
|
||||||
def on_resize(self, _width: int, _height: int) -> None:
|
def on_resize(self, _width: int, _height: int) -> None:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from math import isclose
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
|
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
@ -57,6 +58,17 @@ class Scrolling:
|
|||||||
else:
|
else:
|
||||||
raise AttributeError(f"Unknown property {prop.name}")
|
raise AttributeError(f"Unknown property {prop.name}")
|
||||||
|
|
||||||
|
def update_position(self, x: float, y: float) -> None:
|
||||||
|
if self.hadjustment and not isclose(self.hadjustment.get_value(), x):
|
||||||
|
self.hadjustment.handler_block(self._hadjustment_handler_id)
|
||||||
|
self.hadjustment.set_value(x)
|
||||||
|
self.hadjustment.handler_unblock(self._hadjustment_handler_id)
|
||||||
|
|
||||||
|
if self.vadjustment and not isclose(self.vadjustment.get_value(), y):
|
||||||
|
self.vadjustment.handler_block(self._vadjustment_handler_id)
|
||||||
|
self.vadjustment.set_value(y)
|
||||||
|
self.vadjustment.handler_unblock(self._vadjustment_handler_id)
|
||||||
|
|
||||||
def update_adjustments(self, width: int, height: int, bounds: Rectangle) -> None:
|
def update_adjustments(self, width: int, height: int, bounds: Rectangle) -> None:
|
||||||
"""Update scroll bar values (adjustments in GTK).
|
"""Update scroll bar values (adjustments in GTK).
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user