QtiPlot  0.9.8.2
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 | List of all members
SelectionMoveResizer Class Reference

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

#include <SelectionMoveResizer.h>

Inheritance diagram for SelectionMoveResizer:

Public Slots

void add (ArrowMarker *target)
 Add target to the list of items to be moved/resized together. More...
 
void add (QWidget *target)
 Add target to the list of items to be moved/resized together. More...
 
void recalcBoundingRect ()
 Calculate d_bounding_rect based on the bounding rectangles of all targets. More...
 
int removeAll (ArrowMarker *target)
 Remove target from the list of items to be moved/resized together and returns the number of occurences removed. More...
 
int removeAll (QWidget *target)
 Remove target from the list of items to be moved/resized together and returns the number of occurences removed. More...
 

Signals

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

Public Member Functions

void alignTargetsBottom ()
 
void alignTargetsLeft ()
 
void alignTargetsRight ()
 
void alignTargetsTop ()
 
bool contains (QWidget *w) const
 Returns true if w is one of targets, false else. More...
 
bool contains (ArrowMarker *m) const
 Returns true if m is one of targets, false else. More...
 
virtual bool eventFilter (QObject *o, QEvent *e)
 React on geometry changes of parent and targets. More...
 
void raiseTargets (bool on=true)
 
 SelectionMoveResizer (ArrowMarker *target)
 Construct a new MoveResizer with the given marker as the only target. More...
 
 SelectionMoveResizer (QWidget *target)
 Construct a new MoveResizer with the given widget as the only target. More...
 
QList< QWidget * > widgetsList () const
 
 ~SelectionMoveResizer ()
 Clean up after myself. More...
 

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. More...
 
virtual void mouseDoubleClickEvent (QMouseEvent *e)
 Ignore double-clicks so that they can be used by my parent. More...
 
virtual void mouseMoveEvent (QMouseEvent *e)
 Mouse movements need to be monitored for updating the frame during operation. More...
 
virtual void mousePressEvent (QMouseEvent *e)
 Mouse button presses start move/resize operations. More...
 
virtual void mouseReleaseEvent (QMouseEvent *e)
 Mouse releases end the current operation and apply it to the targets. More...
 
virtual void paintEvent (QPaintEvent *e)
 Draw frame and resize handlers. More...
 

Private Slots

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

Private Member Functions

QRect boundingRectOf (QwtPlotMarker *target) const
 Get the bounding rectangle of a marker in paint coordinates. More...
 
QRect boundingRectOf (QwtPlotCanvas *canvas) const
 Get the bounding rectangle of a plot canvas area in paint coordinates. More...
 
void init ()
 The initialization part common to all constructors. More...
 
QRect operateOn (const QRect in)
 Apply operation specified by d_op and d_op_dp to in. More...
 
void operateOnTargets ()
 Apply operation specified by d_op and d_op_dp to all targets. More...
 

Static Private Member Functions

static const QRect handlerRect (QRect rect, Operation op)
 Return one of the rectangles to be filled for starting resize operations. More...
 

Private Attributes

QRect d_bounding_rect
 Bounding rectangle of all targets taken together, in drawing coordinates. More...
 
QList< ArrowMarker * > d_line_markers
 Target markers I'm handling. More...
 
Operation d_op
 The type of operation currently in progress. More...
 
QPoint d_op_dp
 Difference between current and start position during operation. More...
 
QPoint d_op_start
 Mouse position where an operation started; (-1,-1) means started by keyboard. More...
 
QList< QWidget * > d_widgets
 Target widgets I'm handling. More...
 

Static Private Attributes

static const int handler_size = 10
 Size of resize handle in pixels. More...
 

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 ( ArrowMarker 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.

References d_widgets.

Member Function Documentation

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.

Referenced by contains(), and SelectionMoveResizer().

void SelectionMoveResizer::add ( QWidget *  target)
slot

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

References boundingRectOf(), d_bounding_rect, d_widgets, and removeWidget().

void SelectionMoveResizer::alignTargetsBottom ( )
void SelectionMoveResizer::alignTargetsLeft ( )
void SelectionMoveResizer::alignTargetsRight ( )
void SelectionMoveResizer::alignTargetsTop ( )
QRect SelectionMoveResizer::boundingRectOf ( QwtPlotMarker *  target) const
private

Get the bounding rectangle of a marker in paint coordinates.

Referenced by add(), and recalcBoundingRect().

QRect SelectionMoveResizer::boundingRectOf ( QwtPlotCanvas *  canvas) const
private

Get the bounding rectangle of a plot canvas area in paint coordinates.

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 ( ArrowMarker m) const
inline
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, d_widgets, FrameWidget::isOnTop(), Move, None, operateOnTargets(), and FrameWidget::showPropertiesDialog().

void SelectionMoveResizer::mouseDoubleClickEvent ( QMouseEvent *  e)
protectedvirtual

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

References d_widgets, FrameWidget::showPropertiesDialog(), and LegendWidget::showTextEditor().

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, d_widgets, handlerRect(), Graph::increasingAreaEnrichmentsList(), Move, FrameWidget::plot(), Graph::select(), and FrameWidget::showContextMenu().

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::raiseTargets ( bool  on = true)

References d_widgets, and FrameWidget::setOnTop().

Referenced by contains().

void SelectionMoveResizer::recalcBoundingRect ( )
slot

Calculate d_bounding_rect based on the bounding rectangles of all targets.

References boundingRectOf(), d_bounding_rect, d_line_markers, and d_widgets.

Referenced by contains(), eventFilter(), operateOnTargets(), and removeAll().

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_line_markers, d_widgets, and recalcBoundingRect().

Referenced by contains(), and removeWidget().

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_line_markers, d_widgets, FrameWidget::isOnTop(), 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 contains(), and operateOnTargets().

QList<QWidget *> SelectionMoveResizer::widgetsList ( ) const
inline

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(), operateOnTargets(), paintEvent(), and recalcBoundingRect().

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