SciDAVis
1.D4
|
Handler for modifying one or more QWidget and/or QwtPlotMarker with mouse or keyboard. More...
#include <SelectionMoveResizer.h>
Public Slots | |
void | add (Legend *target) |
Add target to the list of items to be moved/resized together. | |
void | add (ArrowMarker *target) |
Add target to the list of items to be moved/resized together. | |
void | add (ImageMarker *target) |
Add target to the list of items to be moved/resized together. | |
void | add (QWidget *target) |
Add target to the list of items to be moved/resized together. | |
void | recalcBoundingRect () |
Calculate d_bounding_rect based on the bounding rectangles of all targets. | |
int | removeAll (Legend *target) |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed. | |
int | removeAll (ArrowMarker *target) |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed. | |
int | removeAll (ImageMarker *target) |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed. | |
int | removeAll (QWidget *target) |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed. |
Signals | |
void | targetsChanged () |
Emitted when the targets are modified (moved or resized). |
Public Member Functions | |
bool | contains (QWidget *w) const |
Returns true if w is one of targets, false else. | |
bool | contains (Legend *m) const |
Returns true if m is one of targets, false else. | |
bool | contains (ArrowMarker *m) const |
Returns true if m is one of targets, false else. | |
bool | contains (ImageMarker *m) const |
Returns true if m is one of targets, false else. | |
virtual bool | eventFilter (QObject *o, QEvent *e) |
React on geometry changes of parent and targets. | |
SelectionMoveResizer (Legend *target) | |
Construct a new MoveResizer with the given marker as the only target. | |
SelectionMoveResizer (ArrowMarker *target) | |
Construct a new MoveResizer with the given marker as the only target. | |
SelectionMoveResizer (ImageMarker *target) | |
Construct a new MoveResizer with the given marker as the only target. | |
SelectionMoveResizer (QWidget *target) | |
Construct a new MoveResizer with the given widget as the only target. | |
~SelectionMoveResizer () | |
Clean up after myself. |
Protected Types | |
enum | Operation { None = -2, Move, Resize_N, Resize_NE, Resize_E, Resize_SE, Resize_S, Resize_SW, Resize_W, Resize_NW } |
Available modes of operation. More... |
Protected Member Functions | |
virtual void | keyPressEvent (QKeyEvent *e) |
Allow keyboard-based moving of the selection. | |
virtual void | mouseDoubleClickEvent (QMouseEvent *e) |
Ignore double-clicks so that they can be used by my parent. | |
virtual void | mouseMoveEvent (QMouseEvent *e) |
Mouse movements need to be monitored for updating the frame during operation. | |
virtual void | mousePressEvent (QMouseEvent *e) |
Mouse button presses start move/resize operations. | |
virtual void | mouseReleaseEvent (QMouseEvent *e) |
Mouse releases end the current operation and apply it to the targets. | |
virtual void | paintEvent (QPaintEvent *e) |
Draw frame and resize handlers. |
Private Slots | |
void | removeWidget (QObject *w) |
A non-typesafe version of remvoveAll(QWidget*) needed for QObject::destroyed(). |
Private Member Functions | |
QRect | boundingRectOf (QwtPlotMarker *target) const |
Get the bounding rectangle of a marker in paint coordinates. | |
void | init () |
The initialization part common to all constructors. | |
QRect | operateOn (const QRect in) |
Apply operation specified by d_op and d_op_dp to in. | |
void | operateOnTargets () |
Apply operation specified by d_op and d_op_dp to all targets. |
Static Private Member Functions | |
static const QRect | handlerRect (QRect rect, Operation op) |
Return one of the rectangles to be filled for starting resize operations. |
Private Attributes | |
QRect | d_bounding_rect |
Bounding rectangle of all targets taken together, in drawing coordinates. | |
QList< ImageMarker * > | d_image_markers |
Target markers I'm handling. | |
QList< Legend * > | d_legend_markers |
Target markers I'm handling. | |
QList< ArrowMarker * > | d_line_markers |
Target markers I'm handling. | |
Operation | d_op |
The type of operation currently in progress. | |
QPoint | d_op_dp |
Difference between current and start position during operation. | |
QPoint | d_op_start |
Mouse position where an operation started; (-1,-1) means started by keyboard. | |
QList< QWidget * > | d_widgets |
Target widgets I'm handling. |
Static Private Attributes | |
static const int | handler_size = 10 |
Size of resize handle in pixels. |
Handler for modifying one or more QWidget and/or QwtPlotMarker with mouse or keyboard.
During initialization, the SelectionMoveResizer adds itself as a new child widget to the target's parentWidget() or QwtPlotCanvas. Because Qt 4.1 and beyond propagate a widget's background by default, frame and resize handlers can then simply be drawn on top of the usual content of the parent. Also, the SelectionMoveResizer gets to see mouse and key events first without the need to filter events for its parent. Note however that the latter must still be done in order to catch geometry changes and stay the same size as the parent.
At every point in time, the list of managed targets must be non-empty, so that the SelectionMoveResizer has a well-defined bounding rectangle. When there are no more selected targets, it deletes itself, so references to a SelectionMoveResizer should be maintained by QPointer and checked for validity before use.
QWidget targets are automatically removed when they are deleted (possibly also deleting the SelectionMoveResizer), using the QObject::destroyed() signal. With QwtPlotMarker, this is not possible since it's not a QObject. Thus, care has to be taken to remove them before or shortly after deletion, lest the wrath of Segmentation Fault shall come upon you.
See the documentation of ImageMarker for ideas about replacing QwtPlotMarker with a new QwtPlotItem subclass. For SelectionMoveResizer this would mean supporting new enrichments without modifications and being able to automatically remove them upon deletion (if the new class inherits QObject). Not to mention that the implementation would be a lot cleaner if we would only have to handle two target classes instead of four.
Think about turning SelectionMoveResizer into an input method for general affine transformations. Particularly, this would add rotation, flipping and shearing. Markers could implement this using QPainter's coordinate transformations. Definitely not a priority, though.
|
protected |
SelectionMoveResizer::SelectionMoveResizer | ( | Legend * | target | ) |
SelectionMoveResizer::SelectionMoveResizer | ( | ArrowMarker * | target | ) |
SelectionMoveResizer::SelectionMoveResizer | ( | ImageMarker * | target | ) |
SelectionMoveResizer::SelectionMoveResizer | ( | QWidget * | target | ) |
SelectionMoveResizer::~SelectionMoveResizer | ( | ) |
Clean up after myself.
|
slot |
Add target to the list of items to be moved/resized together.
References boundingRectOf(), d_bounding_rect, and d_legend_markers.
Referenced by SelectionMoveResizer().
|
slot |
Add target to the list of items to be moved/resized together.
References boundingRectOf(), d_bounding_rect, and d_line_markers.
|
slot |
Add target to the list of items to be moved/resized together.
References boundingRectOf(), d_bounding_rect, and d_image_markers.
|
slot |
Add target to the list of items to be moved/resized together.
References d_bounding_rect, d_widgets, and removeWidget().
|
private |
Get the bounding rectangle of a marker in paint coordinates.
Referenced by add(), and recalcBoundingRect().
|
inline |
Returns true if w is one of targets, false else.
References d_widgets.
Referenced by mouseMoveEvent(), and mousePressEvent().
|
inline |
Returns true if m is one of targets, false else.
References d_legend_markers.
|
inline |
Returns true if m is one of targets, false else.
References d_line_markers.
|
inline |
Returns true if m is one of targets, false else.
References d_image_markers.
|
virtual |
React on geometry changes of parent and targets.
References recalcBoundingRect().
|
staticprivate |
Return one of the rectangles to be filled for starting resize operations.
References handler_size, Resize_E, Resize_N, Resize_NE, Resize_NW, Resize_S, Resize_SE, Resize_SW, and Resize_W.
Referenced by mouseMoveEvent(), mousePressEvent(), and paintEvent().
|
private |
The initialization part common to all constructors.
References d_bounding_rect, d_op, d_op_dp, d_op_start, and None.
Referenced by SelectionMoveResizer().
|
protectedvirtual |
Allow keyboard-based moving of the selection.
Unused keys are passed on to the parent.
References d_op, d_op_dp, d_op_start, Move, None, and operateOnTargets().
|
protectedvirtual |
Ignore double-clicks so that they can be used by my parent.
|
protectedvirtual |
Mouse movements need to be monitored for updating the frame during operation.
When no operation is in progress, the mouse cursor is updated based on its position before the event is passed on to the parent.
References contains(), d_bounding_rect, d_op, d_op_dp, d_op_start, handlerRect(), Move, None, Resize_E, Resize_N, Resize_NE, Resize_NW, Resize_S, Resize_SE, Resize_SW, and Resize_W.
|
protectedvirtual |
Mouse button presses start move/resize operations.
Clicks outside of d_bounding_rect or with anything else than the left button are propagated to the parent as usual.
References contains(), d_bounding_rect, d_op, d_op_start, handlerRect(), and Move.
|
protectedvirtual |
Mouse releases end the current operation and apply it to the targets.
When there is no operation in progress, the event is passed on to the parent.
References d_op, d_op_dp, d_op_start, None, and operateOnTargets().
|
private |
|
private |
Apply operation specified by d_op and d_op_dp to all targets.
References d_image_markers, d_legend_markers, d_line_markers, d_op_dp, d_op_start, d_widgets, ArrowMarker::endPoint(), Legend::font(), operateOn(), Graph::plotWidget(), recalcBoundingRect(), Legend::rect(), ImageMarker::rect(), ArrowMarker::rect(), ArrowMarker::setEndPoint(), Legend::setFont(), Legend::setOrigin(), ImageMarker::setOrigin(), ImageMarker::setSize(), ArrowMarker::setStartPoint(), ArrowMarker::startPoint(), targetsChanged(), and Legend::text().
Referenced by keyPressEvent(), and mouseReleaseEvent().
|
protectedvirtual |
Draw frame and resize handlers.
Besides managing resize operations, this also provides a visual feedback on the selection state.
References d_bounding_rect, handlerRect(), and operateOn().
|
slot |
Calculate d_bounding_rect based on the bounding rectangles of all targets.
References boundingRectOf(), d_bounding_rect, d_image_markers, d_legend_markers, d_line_markers, and d_widgets.
Referenced by eventFilter(), operateOnTargets(), and removeAll().
|
slot |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed.
References d_image_markers, d_legend_markers, d_line_markers, d_widgets, and recalcBoundingRect().
Referenced by removeWidget().
|
slot |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed.
References d_image_markers, d_legend_markers, d_line_markers, d_widgets, and recalcBoundingRect().
|
slot |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed.
References d_image_markers, d_legend_markers, d_line_markers, d_widgets, and recalcBoundingRect().
|
slot |
Remove target from the list of items to be moved/resized together and returns the number of occurences removed.
References d_image_markers, d_legend_markers, d_line_markers, d_widgets, and recalcBoundingRect().
|
inlineprivateslot |
A non-typesafe version of remvoveAll(QWidget*) needed for QObject::destroyed().
References removeAll().
Referenced by add().
|
signal |
Emitted when the targets are modified (moved or resized).
Referenced by operateOnTargets().
|
private |
Bounding rectangle of all targets taken together, in drawing coordinates.
Referenced by add(), init(), mouseMoveEvent(), mousePressEvent(), operateOn(), paintEvent(), and recalcBoundingRect().
|
private |
Target markers I'm handling.
Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().
|
private |
Target markers I'm handling.
Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().
|
private |
Target markers I'm handling.
Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().
|
private |
The type of operation currently in progress.
Referenced by init(), keyPressEvent(), mouseMoveEvent(), mousePressEvent(), mouseReleaseEvent(), and operateOn().
|
private |
Difference between current and start position during operation.
Referenced by init(), keyPressEvent(), mouseMoveEvent(), mouseReleaseEvent(), operateOn(), and operateOnTargets().
|
private |
Mouse position where an operation started; (-1,-1) means started by keyboard.
Referenced by init(), keyPressEvent(), mouseMoveEvent(), mousePressEvent(), mouseReleaseEvent(), and operateOnTargets().
|
private |
Target widgets I'm handling.
Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().
|
staticprivate |
Size of resize handle in pixels.
Referenced by handlerRect().