fixed bug in multiselection
Some checks failed
Python CI / test (push) Successful in 1m8s
Lint / lint (push) Successful in 1m11s
Tests / test (3.10) (push) Failing after 54s
Tests / test (3.11) (push) Failing after 51s
Tests / test (3.9) (push) Failing after 53s

This commit is contained in:
Duncan Tourolle 2025-11-11 14:02:00 +01:00
parent c0a6148f58
commit aa3eacf627
2 changed files with 22 additions and 15 deletions

View File

@ -28,6 +28,7 @@ class MouseInteractionMixin:
if event.button() == Qt.MouseButton.LeftButton: if event.button() == Qt.MouseButton.LeftButton:
x, y = event.position().x(), event.position().y() x, y = event.position().x(), event.position().y()
ctrl_pressed = event.modifiers() & Qt.KeyboardModifier.ControlModifier ctrl_pressed = event.modifiers() & Qt.KeyboardModifier.ControlModifier
shift_pressed = event.modifiers() & Qt.KeyboardModifier.ShiftModifier
# Check if clicking on ghost page button # Check if clicking on ghost page button
if self._check_ghost_page_click(x, y): if self._check_ghost_page_click(x, y):
@ -60,8 +61,9 @@ class MouseInteractionMixin:
element = self._get_element_at(x, y) element = self._get_element_at(x, y)
if element: if element:
# Check if Control is pressed and element is ImageData - enter image pan mode print(f"DEBUG: Clicked on element: {element}, ctrl_pressed: {ctrl_pressed}, shift_pressed: {shift_pressed}")
if ctrl_pressed and isinstance(element, ImageData) and not self.rotation_mode: # 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 # Enter image pan mode - pan image within frame
self.selected_elements = {element} self.selected_elements = {element}
self.drag_start_pos = (x, y) self.drag_start_pos = (x, y)
@ -73,12 +75,17 @@ class MouseInteractionMixin:
print(f"Entered image pan mode for {element}") print(f"Entered image pan mode for {element}")
elif ctrl_pressed: elif ctrl_pressed:
# Multi-select mode # Multi-select mode
print(f"DEBUG: Multi-select mode triggered")
if element in self.selected_elements: if element in self.selected_elements:
print(f"DEBUG: Removing element from selection")
self.selected_elements.remove(element) self.selected_elements.remove(element)
else: else:
print(f"DEBUG: Adding element to selection. Current count: {len(self.selected_elements)}")
self.selected_elements.add(element) self.selected_elements.add(element)
print(f"DEBUG: Total selected elements: {len(self.selected_elements)}")
else: else:
# Normal drag mode # Normal drag mode
print(f"DEBUG: Normal drag mode - single selection")
self.selected_elements = {element} self.selected_elements = {element}
self.drag_start_pos = (x, y) self.drag_start_pos = (x, y)
self.drag_start_element_pos = element.position self.drag_start_element_pos = element.position

View File

@ -95,29 +95,29 @@ class RenderingMixin:
element._page_renderer = renderer element._page_renderer = renderer
break break
# Draw selection handles # Draw selection handles for all selected elements
if self.selected_element: for element in self.selected_elements:
self._draw_selection_handles() self._draw_selection_handles(element)
# Render text overlays # Render text overlays
self._render_text_overlays() self._render_text_overlays()
def _draw_selection_handles(self): def _draw_selection_handles(self, element):
"""Draw selection handles around the selected element""" """Draw selection handles around the given element"""
if not self.selected_element: if not element:
return return
main_window = self.window() main_window = self.window()
if not hasattr(main_window, 'project') or not main_window.project or not main_window.project.pages: if not hasattr(main_window, 'project') or not main_window.project or not main_window.project.pages:
return return
if not hasattr(self.selected_element, '_page_renderer'): if not hasattr(element, '_page_renderer'):
return return
renderer = self.selected_element._page_renderer renderer = element._page_renderer
elem_x, elem_y = self.selected_element.position elem_x, elem_y = element.position
elem_w, elem_h = self.selected_element.size elem_w, elem_h = element.size
handle_size = 8 handle_size = 8
x, y = renderer.page_to_screen(elem_x, elem_y) x, y = renderer.page_to_screen(elem_x, elem_y)
@ -127,10 +127,10 @@ class RenderingMixin:
center_x = x + w / 2 center_x = x + w / 2
center_y = y + h / 2 center_y = y + h / 2
if self.selected_element.rotation != 0: if element.rotation != 0:
glPushMatrix() glPushMatrix()
glTranslatef(center_x, center_y, 0) 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) glTranslatef(-w / 2, -h / 2, 0)
x, y = 0, 0 x, y = 0, 0
@ -208,7 +208,7 @@ class RenderingMixin:
glVertex2f(hx, hy + handle_size) glVertex2f(hx, hy + handle_size)
glEnd() glEnd()
if self.selected_element.rotation != 0: if element.rotation != 0:
glPopMatrix() glPopMatrix()
def _render_text_overlays(self): def _render_text_overlays(self):