SciDAVis  1.D4
Public Slots | Signals | Public Member Functions | Protected Types | Protected Member Functions | Private Slots | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes
SelectionMoveResizer Class Reference

Handler for modifying one or more QWidget and/or QwtPlotMarker with mouse or keyboard. More...

#include <SelectionMoveResizer.h>

List of all members.

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.

Detailed Description

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.

Design Ideas

Future Plans

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.


Member Enumeration Documentation

Available modes of operation.

Enumerator:
None 
Move 
Resize_N 
Resize_NE 
Resize_E 
Resize_SE 
Resize_S 
Resize_SW 
Resize_W 
Resize_NW 

Constructor & Destructor Documentation

SelectionMoveResizer::SelectionMoveResizer ( Legend target)

Construct a new MoveResizer with the given marker as the only target.

References add(), and init().

SelectionMoveResizer::SelectionMoveResizer ( ArrowMarker target)

Construct a new MoveResizer with the given marker as the only target.

References add(), and init().

SelectionMoveResizer::SelectionMoveResizer ( ImageMarker target)

Construct a new MoveResizer with the given marker as the only target.

References add(), and init().

SelectionMoveResizer::SelectionMoveResizer ( QWidget *  target)

Construct a new MoveResizer with the given widget as the only target.

References add(), and init().

SelectionMoveResizer::~SelectionMoveResizer ( )

Clean up after myself.


Member Function Documentation

void SelectionMoveResizer::add ( Legend target)
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().

void SelectionMoveResizer::add ( ArrowMarker target)
slot

Add target to the list of items to be moved/resized together.

References boundingRectOf(), d_bounding_rect, and d_line_markers.

void SelectionMoveResizer::add ( ImageMarker target)
slot

Add target to the list of items to be moved/resized together.

References boundingRectOf(), d_bounding_rect, and d_image_markers.

void SelectionMoveResizer::add ( QWidget *  target)
slot

Add target to the list of items to be moved/resized together.

References d_bounding_rect, d_widgets, and removeWidget().

QRect SelectionMoveResizer::boundingRectOf ( QwtPlotMarker *  target) const
private

Get the bounding rectangle of a marker in paint coordinates.

Referenced by add(), and recalcBoundingRect().

bool SelectionMoveResizer::contains ( QWidget *  w) const
inline

Returns true if w is one of targets, false else.

References d_widgets.

Referenced by mouseMoveEvent(), and mousePressEvent().

bool SelectionMoveResizer::contains ( Legend m) const
inline

Returns true if m is one of targets, false else.

References d_legend_markers.

bool SelectionMoveResizer::contains ( ArrowMarker m) const
inline

Returns true if m is one of targets, false else.

References d_line_markers.

bool SelectionMoveResizer::contains ( ImageMarker m) const
inline

Returns true if m is one of targets, false else.

References d_image_markers.

bool SelectionMoveResizer::eventFilter ( QObject *  o,
QEvent *  e 
)
virtual

React on geometry changes of parent and targets.

References recalcBoundingRect().

const QRect SelectionMoveResizer::handlerRect ( QRect  rect,
Operation  op 
)
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().

void SelectionMoveResizer::init ( )
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().

void SelectionMoveResizer::keyPressEvent ( QKeyEvent *  e)
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().

void SelectionMoveResizer::mouseDoubleClickEvent ( QMouseEvent *  e)
protectedvirtual

Ignore double-clicks so that they can be used by my parent.

void SelectionMoveResizer::mouseMoveEvent ( QMouseEvent *  e)
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.

void SelectionMoveResizer::mousePressEvent ( QMouseEvent *  e)
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.

void SelectionMoveResizer::mouseReleaseEvent ( QMouseEvent *  e)
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().

QRect SelectionMoveResizer::operateOn ( const QRect  in)
private

Apply operation specified by d_op and d_op_dp to in.

References d_bounding_rect, d_op, d_op_dp, Move, Resize_E, Resize_N, Resize_NE, Resize_NW, Resize_S, Resize_SE, Resize_SW, and Resize_W.

Referenced by operateOnTargets(), and paintEvent().

void SelectionMoveResizer::operateOnTargets ( )
private
void SelectionMoveResizer::paintEvent ( QPaintEvent *  e)
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().

void SelectionMoveResizer::recalcBoundingRect ( )
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().

int SelectionMoveResizer::removeAll ( Legend target)
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().

int SelectionMoveResizer::removeAll ( ArrowMarker target)
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().

int SelectionMoveResizer::removeAll ( ImageMarker target)
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().

int SelectionMoveResizer::removeAll ( QWidget *  target)
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().

void SelectionMoveResizer::removeWidget ( QObject *  w)
inlineprivateslot

A non-typesafe version of remvoveAll(QWidget*) needed for QObject::destroyed().

References removeAll().

Referenced by add().

void SelectionMoveResizer::targetsChanged ( )
signal

Emitted when the targets are modified (moved or resized).

Referenced by operateOnTargets().


Member Data Documentation

QRect SelectionMoveResizer::d_bounding_rect
private

Bounding rectangle of all targets taken together, in drawing coordinates.

Referenced by add(), init(), mouseMoveEvent(), mousePressEvent(), operateOn(), paintEvent(), and recalcBoundingRect().

QList<ImageMarker *> SelectionMoveResizer::d_image_markers
private

Target markers I'm handling.

Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().

QList<Legend *> SelectionMoveResizer::d_legend_markers
private

Target markers I'm handling.

Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().

QList<ArrowMarker *> SelectionMoveResizer::d_line_markers
private

Target markers I'm handling.

Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().

Operation SelectionMoveResizer::d_op
private

The type of operation currently in progress.

Referenced by init(), keyPressEvent(), mouseMoveEvent(), mousePressEvent(), mouseReleaseEvent(), and operateOn().

QPoint SelectionMoveResizer::d_op_dp
private

Difference between current and start position during operation.

Referenced by init(), keyPressEvent(), mouseMoveEvent(), mouseReleaseEvent(), operateOn(), and operateOnTargets().

QPoint SelectionMoveResizer::d_op_start
private

Mouse position where an operation started; (-1,-1) means started by keyboard.

Referenced by init(), keyPressEvent(), mouseMoveEvent(), mousePressEvent(), mouseReleaseEvent(), and operateOnTargets().

QList<QWidget *> SelectionMoveResizer::d_widgets
private

Target widgets I'm handling.

Referenced by add(), contains(), operateOnTargets(), recalcBoundingRect(), and removeAll().

const int SelectionMoveResizer::handler_size = 10
staticprivate

Size of resize handle in pixels.

Referenced by handlerRect().


The documentation for this class was generated from the following files: