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:
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

View File

@ -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):