Source code for plotpy.tools.selection

# -*- coding: utf-8 -*-
#
# Licensed under the terms of the BSD 3-Clause
# (see plotpy/LICENSE for details)

# pylint: disable=C0103

"""Selection tools"""

from __future__ import annotations

import numpy as np
from qtpy import QtCore as QC
from qtpy import QtGui as QG

from plotpy.config import _
from plotpy.events import (
    KeyEventMatch,
    ObjectHandler,
    StandardKeyMatch,
    StatefulEventFilter,
    setup_standard_tool_filter,
)
from plotpy.items import TrImageItem
from plotpy.plot import BasePlot
from plotpy.tools.base import InteractiveTool


[docs] class SelectTool(InteractiveTool): """ Graphical Object Selection Tool """ TITLE = _("Selection") ICON = "select.svg" CURSOR = QC.Qt.CursorShape.ArrowCursor
[docs] def setup_filter(self, baseplot: BasePlot) -> int: """ Set up the event filter for the tool. Args: baseplot: Base plot instance Returns: Start state of the filter """ filter = baseplot.filter # Initialisation du filtre start_state = filter.new_state() # Bouton gauche : ObjectHandler(filter, QC.Qt.MouseButton.LeftButton, start_state=start_state) ObjectHandler( filter, QC.Qt.MouseButton.LeftButton, mods=QC.Qt.KeyboardModifier.ControlModifier, start_state=start_state, multiselection=True, ) filter.add_event( start_state, KeyEventMatch( (QC.Qt.Key.Key_Enter, QC.Qt.Key.Key_Return, QC.Qt.Key.Key_Space) ), self.validate, start_state, ) filter.add_event( start_state, StandardKeyMatch(QG.QKeySequence.SelectAll), self.select_all_items, start_state, ) filter.add_event( start_state, KeyEventMatch( ( QC.Qt.Key.Key_Left, QC.Qt.Key.Key_Right, QC.Qt.Key.Key_Up, QC.Qt.Key.Key_Down, ) ), self.move_with_arrow, start_state, ) filter.add_event( start_state, KeyEventMatch( [ (QC.Qt.Key.Key_Left, QC.Qt.KeyboardModifier.ControlModifier), (QC.Qt.Key.Key_Right, QC.Qt.KeyboardModifier.ControlModifier), (QC.Qt.Key.Key_Up, QC.Qt.KeyboardModifier.ControlModifier), (QC.Qt.Key.Key_Down, QC.Qt.KeyboardModifier.ControlModifier), ] ), self.move_with_arrow, start_state, ) filter.add_event( start_state, KeyEventMatch( [ (QC.Qt.Key.Key_Left, QC.Qt.KeyboardModifier.ShiftModifier), (QC.Qt.Key.Key_Right, QC.Qt.KeyboardModifier.ShiftModifier), ( QC.Qt.Key.Key_Left, QC.Qt.KeyboardModifier.ControlModifier | QC.Qt.KeyboardModifier.ShiftModifier, ), ( QC.Qt.Key.Key_Right, QC.Qt.KeyboardModifier.ControlModifier | QC.Qt.KeyboardModifier.ShiftModifier, ), ] ), self.rotate_with_arrow, start_state, ) return setup_standard_tool_filter(filter, start_state)
[docs] def select_all_items(self, filter: StatefulEventFilter, event: QC.QEvent) -> None: """ Select all items in the plot. Args: filter: Event filter event: Event that triggered the selection """ filter.plot.select_all() filter.plot.replot()
[docs] def move_with_arrow(self, filter: StatefulEventFilter, event: QG.QKeyEvent) -> None: """ Move selected items with arrow keys. Args: filter: Event filter event: Key event """ dx, dy = 0, 0 if event.modifiers() == QC.Qt.KeyboardModifier.NoModifier: if event.key() == QC.Qt.Key.Key_Left: dx = -10 elif event.key() == QC.Qt.Key.Key_Right: dx = 10 elif event.key() == QC.Qt.Key.Key_Up: dy = -10 elif event.key() == QC.Qt.Key.Key_Down: dy = 10 elif event.modifiers() == QC.Qt.KeyboardModifier.ControlModifier: if event.key() == QC.Qt.Key.Key_Left: dx = -1 elif event.key() == QC.Qt.Key.Key_Right: dx = 1 elif event.key() == QC.Qt.Key.Key_Up: dy = -1 elif event.key() == QC.Qt.Key.Key_Down: dy = 1 selected_items = filter.plot.get_selected_items() for item in selected_items: if isinstance(item, TrImageItem): item.move_with_arrows(dx, dy) filter.plot.replot()
[docs] def rotate_with_arrow( self, filter: StatefulEventFilter, event: QG.QKeyEvent ) -> None: """ Rotate selected items with arrow keys. Args: filter: Event filter event: Key event """ dangle = 0 if event.modifiers() == QC.Qt.KeyboardModifier.ShiftModifier: if event.key() == QC.Qt.Key.Key_Left: dangle = -np.deg2rad(0.5) elif event.key() == QC.Qt.Key.Key_Right: dangle = np.deg2rad(0.5) elif ( event.modifiers() & QC.Qt.KeyboardModifier.ControlModifier == QC.Qt.KeyboardModifier.ControlModifier ) and ( event.modifiers() & QC.Qt.KeyboardModifier.ShiftModifier == QC.Qt.KeyboardModifier.ShiftModifier ): if event.key() == QC.Qt.Key.Key_Left: dangle = -np.deg2rad(0.05) elif event.key() == QC.Qt.Key.Key_Right: dangle = np.deg2rad(0.05) selected_items = filter.plot.get_selected_items() for item in selected_items: if isinstance(item, TrImageItem): item.rotate_with_arrows(dangle) filter.plot.replot()