From 6530ca726f403449f617449cec4e3d48f4128573 Mon Sep 17 00:00:00 2001 From: ARAKHNID Date: Thu, 6 Jun 2024 16:50:21 -0500 Subject: [PATCH] Fix scaling while preserving proportions This fixes issues with preserving proportions when editing the dimensions with the SpinButtons. Closes #637 --- src/tools/transform_tools/tool_scale.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/tools/transform_tools/tool_scale.py b/src/tools/transform_tools/tool_scale.py index afb0c397..4dc38208 100644 --- a/src/tools/transform_tools/tool_scale.py +++ b/src/tools/transform_tools/tool_scale.py @@ -131,6 +131,8 @@ def on_tool_selected(self, *args): self._spinbtns_disabled = False self._width_btn.set_value(width) self._height_btn.set_value(height) + self._previous_width = width + self._previous_height = height self.build_and_do_op() # Ensure a correct preview def _get_original_size(self): @@ -166,7 +168,10 @@ def set_preserve_ratio(self, for_spinbtns=False): if self._preserve_ratio == former_setting: return if self._preserve_ratio: - self._ratio = self._get_width() / self._get_height() + if for_spinbtns: + self._ratio = self._get_previous_width() / self._get_previous_height() + else: + self._ratio = self._get_width() / self._get_height() def _try_scale_dimensions(self): if self._reload_is_locked: @@ -226,6 +231,10 @@ def on_spinbtn_changed(self, *args): self.set_preserve_ratio(True) self._try_scale_dimensions() + if not self._preserve_ratio: + self._previous_width = self._get_width() + self._pervious_height = self._get_height() + def on_spinbtn100_changed(self, *args): if self._spinbtns_disabled: return @@ -249,6 +258,8 @@ def _apply_deltas_to_spinbtns(self, new_width, new_height, dx=0, dy=0): else: self._height_btn.set_value(new_height) self._width_btn.set_value(new_width) + self._previous_height = new_height + self._previous_width = new_width def _get_width(self): return self._width_btn.get_value_as_int() @@ -256,6 +267,18 @@ def _get_width(self): def _get_height(self): return self._height_btn.get_value_as_int() + def _get_previous_width(self): + try: + return self._previous_width + finally: + self._previous_width = self._get_width() + + def _get_previous_height(self): + try: + return self._previous_height + finally: + self._previous_height = self._get_height() + ############################################################################ def on_unclicked_motion_on_area(self, event, surface):