123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
- * Qwt Widget Library
- * Copyright (C) 1997 Josef Wilgen
- * Copyright (C) 2002 Uwe Rathmann
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the Qwt License, Version 1.0
- *****************************************************************************/
- #ifndef QWT_PICKER
- #define QWT_PICKER 1
- #include "qwt_global.h"
- #include "qwt_text.h"
- #include "qwt_event_pattern.h"
- #include <qobject.h>
- #include <qpen.h>
- #include <qfont.h>
- #include <qrect.h>
- #include <qpainterpath.h>
- class QWidget;
- class QMouseEvent;
- class QWheelEvent;
- class QKeyEvent;
- class QwtPickerMachine;
- class QwtWidgetOverlay;
- /*!
- \brief QwtPicker provides selections on a widget
- QwtPicker filters all enter, leave, mouse and keyboard events of a widget
- and translates them into an array of selected points.
- The way how the points are collected depends on type of state machine
- that is connected to the picker. Qwt offers a couple of predefined
- state machines for selecting:
- - Nothing\n
- QwtPickerTrackerMachine
- - Single points\n
- QwtPickerClickPointMachine, QwtPickerDragPointMachine
- - Rectangles\n
- QwtPickerClickRectMachine, QwtPickerDragRectMachine
- - Polygons\n
- QwtPickerPolygonMachine
- While these state machines cover the most common ways to collect points
- it is also possible to implement individual machines as well.
- QwtPicker translates the picked points into a selection using the
- adjustedPoints() method. adjustedPoints() is intended to be reimplemented
- to fix up the selection according to application specific requirements.
- (F.e. when an application accepts rectangles of a fixed aspect ratio only.)
- Optionally QwtPicker support the process of collecting points by a
- rubber band and tracker displaying a text for the current mouse
- position.
- \par Example
- \code
- #include <qwt_picker.h>
- #include <qwt_picker_machine.h>
- QwtPicker *picker = new QwtPicker(widget);
- picker->setStateMachine(new QwtPickerDragRectMachine);
- picker->setTrackerMode(QwtPicker::ActiveOnly);
- picker->setRubberBand(QwtPicker::RectRubberBand);
- \endcode
- \endpar
- The state machine triggers the following commands:
- - begin()\n
- Activate/Initialize the selection.
- - append()\n
- Add a new point
- - move() \n
- Change the position of the last point.
- - remove()\n
- Remove the last point.
- - end()\n
- Terminate the selection and call accept to validate the picked points.
- The picker is active (isActive()), between begin() and end().
- In active state the rubber band is displayed, and the tracker is visible
- in case of trackerMode is ActiveOnly or AlwaysOn.
- The cursor can be moved using the arrow keys. All selections can be aborted
- using the abort key. (QwtEventPattern::KeyPatternCode)
- \warning In case of QWidget::NoFocus the focus policy of the observed
- widget is set to QWidget::WheelFocus and mouse tracking
- will be manipulated while the picker is active,
- or if trackerMode() is AlwayOn.
- */
- class QWT_EXPORT QwtPicker: public QObject, public QwtEventPattern
- {
- Q_OBJECT
- Q_ENUMS( RubberBand DisplayMode ResizeMode )
- Q_PROPERTY( bool isEnabled READ isEnabled WRITE setEnabled )
- Q_PROPERTY( ResizeMode resizeMode READ resizeMode WRITE setResizeMode )
- Q_PROPERTY( DisplayMode trackerMode READ trackerMode WRITE setTrackerMode )
- Q_PROPERTY( QPen trackerPen READ trackerPen WRITE setTrackerPen )
- Q_PROPERTY( QFont trackerFont READ trackerFont WRITE setTrackerFont )
- Q_PROPERTY( RubberBand rubberBand READ rubberBand WRITE setRubberBand )
- Q_PROPERTY( QPen rubberBandPen READ rubberBandPen WRITE setRubberBandPen )
- public:
- /*!
- Rubber band style
- The default value is QwtPicker::NoRubberBand.
- \sa setRubberBand(), rubberBand()
- */
- enum RubberBand
- {
- //! No rubberband.
- NoRubberBand = 0,
- //! A horizontal line ( only for QwtPickerMachine::PointSelection )
- HLineRubberBand,
- //! A vertical line ( only for QwtPickerMachine::PointSelection )
- VLineRubberBand,
- //! A crosshair ( only for QwtPickerMachine::PointSelection )
- CrossRubberBand,
- //! A rectangle ( only for QwtPickerMachine::RectSelection )
- RectRubberBand,
- //! An ellipse ( only for QwtPickerMachine::RectSelection )
- EllipseRubberBand,
- //! A polygon ( only for QwtPickerMachine::PolygonSelection )
- PolygonRubberBand,
- /*!
- Values >= UserRubberBand can be used to define additional
- rubber bands.
- */
- UserRubberBand = 100
- };
- /*!
- \brief Display mode
- \sa setTrackerMode(), trackerMode(), isActive()
- */
- enum DisplayMode
- {
- //! Display never
- AlwaysOff,
- //! Display always
- AlwaysOn,
- //! Display only when the selection is active
- ActiveOnly
- };
- /*!
- Controls what to do with the selected points of an active
- selection when the observed widget is resized.
- The default value is QwtPicker::Stretch.
- \sa setResizeMode()
- */
- enum ResizeMode
- {
- //! All points are scaled according to the new size,
- Stretch,
- //! All points remain unchanged.
- KeepSize
- };
- explicit QwtPicker( QWidget *parent );
- explicit QwtPicker( RubberBand rubberBand,
- DisplayMode trackerMode, QWidget * );
- virtual ~QwtPicker();
- void setStateMachine( QwtPickerMachine * );
- const QwtPickerMachine *stateMachine() const;
- QwtPickerMachine *stateMachine();
- void setRubberBand( RubberBand );
- RubberBand rubberBand() const;
- void setTrackerMode( DisplayMode );
- DisplayMode trackerMode() const;
- void setResizeMode( ResizeMode );
- ResizeMode resizeMode() const;
- void setRubberBandPen( const QPen & );
- QPen rubberBandPen() const;
- void setTrackerPen( const QPen & );
- QPen trackerPen() const;
- void setTrackerFont( const QFont & );
- QFont trackerFont() const;
- bool isEnabled() const;
- bool isActive() const;
- virtual bool eventFilter( QObject *, QEvent * );
- QWidget *parentWidget();
- const QWidget *parentWidget() const;
- virtual QPainterPath pickArea() const;
- virtual void drawRubberBand( QPainter * ) const;
- virtual void drawTracker( QPainter * ) const;
- virtual QRegion rubberBandMask() const;
- virtual QwtText trackerText( const QPoint &pos ) const;
- QPoint trackerPosition() const;
- virtual QRect trackerRect( const QFont & ) const;
- QPolygon selection() const;
- public Q_SLOTS:
- void setEnabled( bool );
- Q_SIGNALS:
- /*!
- A signal indicating, when the picker has been activated.
- Together with setEnabled() it can be used to implement
- selections with more than one picker.
- \param on True, when the picker has been activated
- */
- void activated( bool on );
- /*!
- A signal emitting the selected points,
- at the end of a selection.
- \param polygon Selected points
- */
- void selected( const QPolygon &polygon );
- /*!
- A signal emitted when a point has been appended to the selection
- \param pos Position of the appended point.
- \sa append(). moved()
- */
- void appended( const QPoint &pos );
- /*!
- A signal emitted whenever the last appended point of the
- selection has been moved.
- \param pos Position of the moved last point of the selection.
- \sa move(), appended()
- */
- void moved( const QPoint &pos );
- /*!
- A signal emitted whenever the last appended point of the
- selection has been removed.
- \param pos Position of the point, that has been removed
- \sa remove(), appended()
- */
- void removed( const QPoint &pos );
- /*!
- A signal emitted when the active selection has been changed.
- This might happen when the observed widget is resized.
- \param selection Changed selection
- \sa stretchSelection()
- */
- void changed( const QPolygon &selection );
- protected:
- virtual QPolygon adjustedPoints( const QPolygon & ) const;
- virtual void transition( const QEvent * );
- virtual void begin();
- virtual void append( const QPoint & );
- virtual void move( const QPoint & );
- virtual void remove();
- virtual bool end( bool ok = true );
- virtual bool accept( QPolygon & ) const;
- virtual void reset();
- virtual void widgetMousePressEvent( QMouseEvent * );
- virtual void widgetMouseReleaseEvent( QMouseEvent * );
- virtual void widgetMouseDoubleClickEvent( QMouseEvent * );
- virtual void widgetMouseMoveEvent( QMouseEvent * );
- virtual void widgetWheelEvent( QWheelEvent * );
- virtual void widgetKeyPressEvent( QKeyEvent * );
- virtual void widgetKeyReleaseEvent( QKeyEvent * );
- virtual void widgetEnterEvent( QEvent * );
- virtual void widgetLeaveEvent( QEvent * );
- virtual void stretchSelection(
- const QSize &oldSize, const QSize &newSize );
- virtual void updateDisplay();
- const QwtWidgetOverlay *rubberBandOverlay() const;
- const QwtWidgetOverlay *trackerOverlay() const;
- const QPolygon &pickedPoints() const;
- private:
- void init( QWidget *, RubberBand rubberBand, DisplayMode trackerMode );
- void setMouseTracking( bool );
- class PrivateData;
- PrivateData *d_data;
- };
- #endif
|