From c39183f97e98a3cc59c716e2e68121eaf64d3fe8 Mon Sep 17 00:00:00 2001 From: John Wiggins Date: Fri, 26 Feb 2021 11:58:07 +0100 Subject: [PATCH] Don't mess up the component bounds in HiDPI mode (#635) --- enable/abstract_window.py | 9 ++++++--- enable/tests/test_component_editor.py | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/enable/abstract_window.py b/enable/abstract_window.py index 693226a13..6599f26d4 100644 --- a/enable/abstract_window.py +++ b/enable/abstract_window.py @@ -220,16 +220,19 @@ def _component_changed(self, old, new): size = self._get_control_size() if (size is not None) and hasattr(self.component, "bounds"): new.on_trait_change(self.component_bounds_changed, "bounds") + pix_scale = self.base_pixel_scale if getattr(self.component, "fit_window", False): self.component.outer_position = [0, 0] - self.component.outer_bounds = list(size) + self.component.outer_bounds = [ + size[0] / pix_scale, size[1] / pix_scale + ] elif hasattr(self.component, "resizable"): if "h" in self.component.resizable: self.component.outer_x = 0 - self.component.outer_width = size[0] + self.component.outer_width = size[0] / pix_scale if "v" in self.component.resizable: self.component.outer_y = 0 - self.component.outer_height = size[1] + self.component.outer_height = size[1] / pix_scale self._update_region = None self.redraw() diff --git a/enable/tests/test_component_editor.py b/enable/tests/test_component_editor.py index 7b27e2c9b..2ee2ed8bb 100644 --- a/enable/tests/test_component_editor.py +++ b/enable/tests/test_component_editor.py @@ -11,10 +11,11 @@ """ import unittest -from enable.component_editor import ComponentEditor from traits.api import Any, HasTraits from traitsui.api import Item, View +from enable.component import Component +from enable.component_editor import ComponentEditor from enable.tests._testing import get_dialog_size, skip_if_null ITEM_WIDTH, ITEM_HEIGHT = 700, 200 @@ -72,3 +73,19 @@ def test_initial_component_with_item_size(self): self.assertGreater(size[0], ITEM_WIDTH - 1) self.assertGreater(size[1], ITEM_HEIGHT - 1) + + @skip_if_null + def test_component_hidpi_size_stability(self): + # Issue #634: HiDPI doubles size of components when a component is + # replaced + dialog = _ComponentDialogWithSize(thing=Component()) + dialog.edit_traits() + + initial_bounds = dialog.thing.bounds + # Force the window into HiDPI mode + dialog.thing.window.base_pixel_scale = 2.0 + + dialog.thing = Component() + new_bounds = dialog.thing.bounds + + self.assertListEqual(initial_bounds, new_bounds)