From aa3eacf627104008d37d2468230a5837c89774eb Mon Sep 17 00:00:00 2001 From: Duncan Tourolle Date: Tue, 11 Nov 2025 14:02:00 +0100 Subject: [PATCH] fixed bug in multiselection --- pyPhotoAlbum/mixins/mouse_interaction.py | 11 ++++++++-- pyPhotoAlbum/mixins/rendering.py | 26 ++++++++++++------------ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/pyPhotoAlbum/mixins/mouse_interaction.py b/pyPhotoAlbum/mixins/mouse_interaction.py index a114619..c39aab7 100644 --- a/pyPhotoAlbum/mixins/mouse_interaction.py +++ b/pyPhotoAlbum/mixins/mouse_interaction.py @@ -28,6 +28,7 @@ class MouseInteractionMixin: if event.button() == Qt.MouseButton.LeftButton: x, y = event.position().x(), event.position().y() ctrl_pressed = event.modifiers() & Qt.KeyboardModifier.ControlModifier + shift_pressed = event.modifiers() & Qt.KeyboardModifier.ShiftModifier # Check if clicking on ghost page button if self._check_ghost_page_click(x, y): @@ -60,8 +61,9 @@ class MouseInteractionMixin: element = self._get_element_at(x, y) if element: - # Check if Control is pressed and element is ImageData - enter image pan mode - if ctrl_pressed and isinstance(element, ImageData) and not self.rotation_mode: + print(f"DEBUG: Clicked on element: {element}, ctrl_pressed: {ctrl_pressed}, shift_pressed: {shift_pressed}") + # Check if Shift is pressed and element is ImageData - enter image pan mode + if shift_pressed and isinstance(element, ImageData) and not self.rotation_mode: # Enter image pan mode - pan image within frame self.selected_elements = {element} self.drag_start_pos = (x, y) @@ -73,12 +75,17 @@ class MouseInteractionMixin: print(f"Entered image pan mode for {element}") elif ctrl_pressed: # Multi-select mode + print(f"DEBUG: Multi-select mode triggered") if element in self.selected_elements: + print(f"DEBUG: Removing element from selection") self.selected_elements.remove(element) else: + print(f"DEBUG: Adding element to selection. Current count: {len(self.selected_elements)}") self.selected_elements.add(element) + print(f"DEBUG: Total selected elements: {len(self.selected_elements)}") else: # Normal drag mode + print(f"DEBUG: Normal drag mode - single selection") self.selected_elements = {element} self.drag_start_pos = (x, y) self.drag_start_element_pos = element.position diff --git a/pyPhotoAlbum/mixins/rendering.py b/pyPhotoAlbum/mixins/rendering.py index 6cd1353..b63d5a5 100644 --- a/pyPhotoAlbum/mixins/rendering.py +++ b/pyPhotoAlbum/mixins/rendering.py @@ -95,29 +95,29 @@ class RenderingMixin: element._page_renderer = renderer break - # Draw selection handles - if self.selected_element: - self._draw_selection_handles() + # Draw selection handles for all selected elements + for element in self.selected_elements: + self._draw_selection_handles(element) # Render text overlays self._render_text_overlays() - def _draw_selection_handles(self): - """Draw selection handles around the selected element""" - if not self.selected_element: + def _draw_selection_handles(self, element): + """Draw selection handles around the given element""" + if not element: return main_window = self.window() if not hasattr(main_window, 'project') or not main_window.project or not main_window.project.pages: return - if not hasattr(self.selected_element, '_page_renderer'): + if not hasattr(element, '_page_renderer'): return - renderer = self.selected_element._page_renderer + renderer = element._page_renderer - elem_x, elem_y = self.selected_element.position - elem_w, elem_h = self.selected_element.size + elem_x, elem_y = element.position + elem_w, elem_h = element.size handle_size = 8 x, y = renderer.page_to_screen(elem_x, elem_y) @@ -127,10 +127,10 @@ class RenderingMixin: center_x = x + w / 2 center_y = y + h / 2 - if self.selected_element.rotation != 0: + if element.rotation != 0: glPushMatrix() glTranslatef(center_x, center_y, 0) - glRotatef(self.selected_element.rotation, 0, 0, 1) + glRotatef(element.rotation, 0, 0, 1) glTranslatef(-w / 2, -h / 2, 0) x, y = 0, 0 @@ -208,7 +208,7 @@ class RenderingMixin: glVertex2f(hx, hy + handle_size) glEnd() - if self.selected_element.rotation != 0: + if element.rotation != 0: glPopMatrix() def _render_text_overlays(self):