Custom selection markings (WIP)

Preparation for resizing and scaling items
This commit is contained in:
Rebecca Breu 2021-03-23 21:02:13 +01:00
parent bfce4f43aa
commit 25652a5f5f
3 changed files with 28 additions and 36 deletions

View file

@ -103,31 +103,21 @@ class BeePixmapItem(QtWidgets.QGraphicsPixmapItem):
return item
def create_selection(self):
SelectionItem(self)
def activate_selection(self):
if self.childItems():
self.childItems()[0].setVisible(True)
else:
SelectionItem(self)
def clear_selection(self):
for child in self.childItems():
logger.debug('Removing child item...')
self.scene().removeItem(child)
logger.debug('Child item removed')
self.childItems()[0].setVisible(False)
def itemChange(self, change, value):
ret = super().itemChange(change, value)
if change == self.GraphicsItemChange.ItemSelectedChange:
if value:
logger.debug('Item selected')
self.create_selection()
logger.debug(f'Item selected {self.filename}')
self.activate_selection()
else:
logger.debug('Item deselected')
logger.debug(f'Item deselected {self.filename}')
self.clear_selection()
return ret
def mousePressEvent(self, event):
print('????')
def sceneEvent(self, event):
print('********', event)
return super().sceneEvent(event)
return super().itemChange(change, value)

View file

@ -34,9 +34,14 @@ class SelectionItem(QtWidgets.QGraphicsItem):
def __init__(self, item):
super().__init__(parent=item)
self.single_select_mode = False
self.setAcceptHoverEvents(True)
self.setFlags(
QtWidgets.QGraphicsItem.GraphicsItemFlags.ItemIsSelectable
| QtWidgets.QGraphicsItem.GraphicsItemFlags.ItemIsMovable)
bounds = self.parentItem().boundingRect()
pos = bounds.bottomRight()
# The intercatable shape of the bottom right scale handle:
self.bottom_right_scale_bounds = QtCore.QRectF(
pos.x() - self.resize_size/2,
pos.y() - self.resize_size/2,
@ -53,7 +58,7 @@ class SelectionItem(QtWidgets.QGraphicsItem):
def shape(self):
path = QtGui.QPainterPath()
path.addRect(self.boundingRect())
path.addRect(self.bottom_right_scale_bounds)
return path
def draw_debug_rect(self, painter, rect):
@ -71,17 +76,11 @@ class SelectionItem(QtWidgets.QGraphicsItem):
bounds = self.parentItem().boundingRect()
painter.drawRect(bounds)
self.single_select_mode = self.parentItem()\
.scene().has_single_selection()
self.setAcceptHoverEvents(self.single_select_mode)
self.setAcceptDrops(self.single_select_mode)
single_select_mode = self.parentItem().scene().has_single_selection()
self.setEnabled(single_select_mode)
# If it's a single selection, draw the handles:
if self.single_select_mode:
self.setFlags(
QtWidgets.QGraphicsItem.GraphicsItemFlags.ItemIsSelectable)
if single_select_mode:
pos = bounds.bottomRight()
painter.fillRect(pos.x() - self.handle_size/2,
pos.y() - self.handle_size/2,
@ -94,14 +93,14 @@ class SelectionItem(QtWidgets.QGraphicsItem):
self.draw_debug_rect(painter, self.bottom_right_scale_bounds)
def hoverMoveEvent(self, event):
if not self.single_select_mode:
return
# In bottomright scale area?
if self.bottom_right_scale_bounds.contains(event.pos()):
self.setCursor(Qt.CursorShape.SizeFDiagCursor)
else:
self.setCursor(Qt.CursorShape.ArrowCursor)
def dragEnterEvent(self, event):
print('OOOOOOOOOOOOOOOdrag enter')
def mousePressEvent(self, event):
print('********mousepress')
def mouseMoveEvent(self, event):
print('*******mousemove')

View file

@ -290,8 +290,11 @@ class BeeGraphicsView(QtWidgets.QGraphicsView):
self.add_image(img, pos)
def on_selection_changed(self):
logger.debug('Currently selected items: %s',
len(self.scene.selectedItems()))
for action in self.actions_active_when_selection:
action.setEnabled(self.scene.has_selection())
self.viewport().repaint()
def recalc_scene_rect(self):
"""Resize the scene rectangle so that it is always one view width