You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
371 lines
0 B
371 lines
0 B
15 years ago
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||
|
* Qwt Widget Library
|
||
|
* Copyright (C) 1997 Josef Wilgen
|
||
|
* Copyright (C) 2002 Uwe Rathmann
|
||
14 years ago
|
*
|
||
15 years ago
|
* 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 <qobject.h>
|
||
|
#include <qpen.h>
|
||
|
#include <qfont.h>
|
||
|
#include <qrect.h>
|
||
|
#include "qwt_global.h"
|
||
|
#include "qwt_text.h"
|
||
|
#include "qwt_polygon.h"
|
||
|
#include "qwt_event_pattern.h"
|
||
|
|
||
|
class QWidget;
|
||
|
class QMouseEvent;
|
||
|
class QWheelEvent;
|
||
|
class QKeyEvent;
|
||
|
class QwtPickerMachine;
|
||
|
|
||
|
/*!
|
||
|
\brief QwtPicker provides selections on a widget
|
||
|
|
||
|
QwtPicker filters all mouse and keyboard events of a widget
|
||
|
and translates them into an array of selected points. Depending
|
||
|
on the QwtPicker::SelectionType the selection might be a single point,
|
||
14 years ago
|
a rectangle or a polygon. The selection process is supported by
|
||
|
optional rubberbands (rubberband selection) and position trackers.
|
||
15 years ago
|
|
||
|
QwtPicker is useful for widgets where the event handlers
|
||
|
can't be overloaded, like for components of composite widgets.
|
||
|
It offers alternative handlers for mouse and key events.
|
||
|
|
||
14 years ago
|
\par Example
|
||
15 years ago
|
\verbatim #include <qwt_picker.h>
|
||
|
|
||
|
QwtPicker *picker = new QwtPicker(widget);
|
||
|
picker->setTrackerMode(QwtPicker::ActiveOnly);
|
||
|
connect(picker, SIGNAL(selected(const QwtPolygon &)), ...);
|
||
|
|
||
|
// emit the position of clicks on widget
|
||
|
picker->setSelectionFlags(QwtPicker::PointSelection | QwtPicker::ClickSelection);
|
||
|
|
||
|
...
|
||
14 years ago
|
|
||
15 years ago
|
// now select rectangles
|
||
|
picker->setSelectionFlags(QwtPicker::RectSelection | QwtPicker::DragSelection);
|
||
|
picker->setRubberBand(QwtPicker::RectRubberBand); \endverbatim\n
|
||
|
|
||
|
The selection process uses the commands begin(), append(), move() and end().
|
||
14 years ago
|
append() adds a new point to the selection, move() changes the position of
|
||
|
the latest point.
|
||
15 years ago
|
|
||
14 years ago
|
The commands are initiated from a small state machine (QwtPickerMachine)
|
||
|
that translates mouse and key events. There are a couple of predefined
|
||
15 years ago
|
state machines for point, rect and polygon selections. The selectionFlags()
|
||
14 years ago
|
control which one should be used. It is possible to use other machines
|
||
15 years ago
|
by overloading stateMachine().
|
||
|
|
||
|
The picker is active (isActive()), between begin() and end().
|
||
|
In active state the rubberband 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 for ClickSelection while the picker is active,
|
||
|
or if trackerMode() is AlwayOn.
|
||
|
*/
|
||
|
|
||
|
class QWT_EXPORT QwtPicker: public QObject, public QwtEventPattern
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
Q_ENUMS(RubberBand)
|
||
|
Q_ENUMS(DisplayMode)
|
||
|
Q_ENUMS(ResizeMode)
|
||
|
|
||
|
Q_PROPERTY(int selectionFlags READ selectionFlags WRITE setSelectionFlags)
|
||
|
Q_PROPERTY(DisplayMode trackerMode READ trackerMode WRITE setTrackerMode)
|
||
|
Q_PROPERTY(QFont trackerFont READ trackerFont WRITE setTrackerFont)
|
||
|
Q_PROPERTY(RubberBand rubberBand READ rubberBand WRITE setRubberBand)
|
||
|
Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode)
|
||
|
Q_PROPERTY(bool isEnabled READ isEnabled WRITE setEnabled)
|
||
|
|
||
|
Q_PROPERTY(QPen trackerPen READ trackerPen WRITE setTrackerPen)
|
||
|
Q_PROPERTY(QPen rubberBandPen READ rubberBandPen WRITE setRubberBandPen)
|
||
|
|
||
|
public:
|
||
14 years ago
|
/*!
|
||
15 years ago
|
This enum type describes the type of a selection. It can be or'd
|
||
|
with QwtPicker::RectSelectionType and QwtPicker::SelectionMode
|
||
|
and passed to QwtPicker::setSelectionFlags()
|
||
|
- NoSelection\n
|
||
|
Selection is disabled. Note this is different to the disabled
|
||
|
state, as you might have a tracker.
|
||
|
- PointSelection\n
|
||
|
Select a single point.
|
||
|
- RectSelection\n
|
||
|
Select a rectangle.
|
||
|
- PolygonSelection\n
|
||
|
Select a polygon.
|
||
|
|
||
|
The default value is NoSelection.
|
||
|
\sa QwtPicker::setSelectionFlags(), QwtPicker::selectionFlags()
|
||
|
*/
|
||
|
|
||
14 years ago
|
enum SelectionType {
|
||
15 years ago
|
NoSelection = 0,
|
||
|
PointSelection = 1,
|
||
|
RectSelection = 2,
|
||
|
PolygonSelection = 4
|
||
|
};
|
||
|
|
||
14 years ago
|
/*!
|
||
15 years ago
|
\brief Selection subtype for RectSelection
|
||
14 years ago
|
This enum type describes the type of rectangle selections.
|
||
|
It can be or'd with QwtPicker::RectSelectionType and
|
||
15 years ago
|
QwtPicker::SelectionMode and passed to QwtPicker::setSelectionFlags().
|
||
|
- CornerToCorner\n
|
||
|
The first and the second selected point are the corners
|
||
|
of the rectangle.
|
||
|
- CenterToCorner\n
|
||
|
The first point is the center, the second a corner of the
|
||
|
rectangle.
|
||
|
- CenterToRadius\n
|
||
14 years ago
|
The first point is the center of a quadrat, calculated by the maximum
|
||
15 years ago
|
of the x- and y-distance.
|
||
|
|
||
|
The default value is CornerToCorner.
|
||
|
\sa QwtPicker::setSelectionFlags(), QwtPicker::selectionFlags()
|
||
|
*/
|
||
14 years ago
|
enum RectSelectionType {
|
||
15 years ago
|
CornerToCorner = 64,
|
||
|
CenterToCorner = 128,
|
||
|
CenterToRadius = 256
|
||
|
};
|
||
|
|
||
14 years ago
|
/*!
|
||
15 years ago
|
Values of this enum type or'd together with a SelectionType value
|
||
|
identifies which state machine should be used for the selection.
|
||
|
|
||
|
The default value is ClickSelection.
|
||
|
\sa stateMachine()
|
||
|
*/
|
||
14 years ago
|
enum SelectionMode {
|
||
15 years ago
|
ClickSelection = 1024,
|
||
|
DragSelection = 2048
|
||
|
};
|
||
|
|
||
14 years ago
|
/*!
|
||
15 years ago
|
Rubberband style
|
||
|
- NoRubberBand\n
|
||
|
No rubberband.
|
||
|
- HLineRubberBand & PointSelection\n
|
||
|
A horizontal line.
|
||
|
- VLineRubberBand & PointSelection\n
|
||
|
A vertical line.
|
||
|
- CrossRubberBand & PointSelection\n
|
||
|
A horizontal and a vertical line.
|
||
|
- RectRubberBand & RectSelection\n
|
||
|
A rectangle.
|
||
|
- EllipseRubberBand & RectSelection\n
|
||
|
An ellipse.
|
||
|
- PolygonRubberBand &PolygonSelection\n
|
||
|
A polygon.
|
||
|
- UserRubberBand\n
|
||
|
Values >= UserRubberBand can be used to define additional
|
||
|
rubber bands.
|
||
|
|
||
|
The default value is NoRubberBand.
|
||
|
\sa QwtPicker::setRubberBand(), QwtPicker::rubberBand()
|
||
|
*/
|
||
|
|
||
14 years ago
|
enum RubberBand {
|
||
15 years ago
|
NoRubberBand = 0,
|
||
|
|
||
|
// Point
|
||
|
HLineRubberBand,
|
||
|
VLineRubberBand,
|
||
|
CrossRubberBand,
|
||
|
|
||
|
// Rect
|
||
|
RectRubberBand,
|
||
|
EllipseRubberBand,
|
||
|
|
||
|
// Polygon
|
||
|
PolygonRubberBand,
|
||
|
|
||
|
UserRubberBand = 100
|
||
|
};
|
||
|
|
||
14 years ago
|
/*!
|
||
15 years ago
|
- AlwaysOff\n
|
||
|
Display never.
|
||
|
- AlwaysOn\n
|
||
|
Display always.
|
||
|
- ActiveOnly\n
|
||
|
Display only when the selection is active.
|
||
|
|
||
14 years ago
|
\sa QwtPicker::setTrackerMode(), QwtPicker::trackerMode(),
|
||
15 years ago
|
QwtPicker::isActive()
|
||
|
*/
|
||
14 years ago
|
enum DisplayMode {
|
||
15 years ago
|
AlwaysOff,
|
||
|
AlwaysOn,
|
||
|
ActiveOnly
|
||
|
};
|
||
|
|
||
14 years ago
|
/*!
|
||
15 years ago
|
Controls what to do with the selected points of an active
|
||
|
selection when the observed widget is resized.
|
||
|
- Stretch\n
|
||
14 years ago
|
All points are scaled according to the new size,
|
||
15 years ago
|
- KeepSize\n
|
||
|
All points remain unchanged.
|
||
|
|
||
|
The default value is Stretch.
|
||
|
\sa QwtPicker::setResizeMode(), QwtPicker::resize()
|
||
|
*/
|
||
|
|
||
14 years ago
|
enum ResizeMode {
|
||
15 years ago
|
Stretch,
|
||
|
KeepSize
|
||
|
};
|
||
|
|
||
|
explicit QwtPicker(QWidget *parent);
|
||
|
explicit QwtPicker(int selectionFlags, RubberBand rubberBand,
|
||
14 years ago
|
DisplayMode trackerMode, QWidget *);
|
||
15 years ago
|
|
||
|
virtual ~QwtPicker();
|
||
|
|
||
|
virtual void setSelectionFlags(int);
|
||
|
int selectionFlags() const;
|
||
|
|
||
|
virtual void setRubberBand(RubberBand);
|
||
|
RubberBand rubberBand() const;
|
||
|
|
||
|
virtual void setTrackerMode(DisplayMode);
|
||
|
DisplayMode trackerMode() const;
|
||
|
|
||
|
virtual void setResizeMode(ResizeMode);
|
||
|
ResizeMode resizeMode() const;
|
||
|
|
||
|
virtual void setRubberBandPen(const QPen &);
|
||
|
QPen rubberBandPen() const;
|
||
|
|
||
|
virtual void setTrackerPen(const QPen &);
|
||
|
QPen trackerPen() const;
|
||
|
|
||
|
virtual void setTrackerFont(const QFont &);
|
||
|
QFont trackerFont() const;
|
||
|
|
||
|
bool isEnabled() const;
|
||
|
virtual void setEnabled(bool);
|
||
|
|
||
|
bool isActive() const;
|
||
|
|
||
|
virtual bool eventFilter(QObject *, QEvent *);
|
||
|
|
||
|
QWidget *parentWidget();
|
||
|
const QWidget *parentWidget() const;
|
||
|
|
||
|
virtual QRect pickRect() const;
|
||
14 years ago
|
const QwtPolygon &selection() const;
|
||
15 years ago
|
|
||
|
virtual void drawRubberBand(QPainter *) const;
|
||
|
virtual void drawTracker(QPainter *) const;
|
||
|
|
||
|
virtual QwtText trackerText(const QPoint &pos) const;
|
||
|
QPoint trackerPosition() const;
|
||
|
QRect trackerRect(const QFont &) const;
|
||
|
|
||
|
|
||
|
signals:
|
||
|
/*!
|
||
14 years ago
|
A signal emitting the selected points,
|
||
15 years ago
|
at the end of a selection.
|
||
|
|
||
|
\param pa Selected points
|
||
|
*/
|
||
|
void selected(const QwtPolygon &pa);
|
||
|
|
||
|
/*!
|
||
|
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);
|
||
|
|
||
|
/*!
|
||
14 years ago
|
A signal emitted whenever the last appended point of the
|
||
15 years ago
|
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 when the active selection has been changed.
|
||
|
This might happen when the observed widget is resized.
|
||
|
|
||
|
\param pa Changed selection
|
||
|
\sa stretchSelection()
|
||
|
*/
|
||
|
void changed(const QwtPolygon &pa);
|
||
|
|
||
|
protected:
|
||
|
/*!
|
||
|
\brief Validate and fixup the selection
|
||
|
|
||
|
Accepts all selections unmodified
|
||
14 years ago
|
|
||
15 years ago
|
\param selection Selection to validate and fixup
|
||
|
\return true, when accepted, false otherwise
|
||
|
*/
|
||
|
virtual bool accept(QwtPolygon &selection) const;
|
||
|
|
||
|
virtual void transition(const QEvent *);
|
||
|
|
||
|
virtual void begin();
|
||
|
virtual void append(const QPoint &);
|
||
|
virtual void move(const QPoint &);
|
||
|
virtual bool end(bool ok = true);
|
||
|
|
||
|
virtual void reset();
|
||
|
|
||
|
virtual void widgetMousePressEvent(QMouseEvent *);
|
||
|
virtual void widgetMouseReleaseEvent(QMouseEvent *);
|
||
14 years ago
|
virtual void widgetMouseDoubleClickEvent(QMouseEvent *);
|
||
|
virtual void widgetMouseMoveEvent(QMouseEvent *);
|
||
15 years ago
|
virtual void widgetWheelEvent(QWheelEvent *);
|
||
14 years ago
|
virtual void widgetKeyPressEvent(QKeyEvent *);
|
||
|
virtual void widgetKeyReleaseEvent(QKeyEvent *);
|
||
|
virtual void widgetLeaveEvent(QEvent *);
|
||
15 years ago
|
|
||
14 years ago
|
virtual void stretchSelection(const QSize &oldSize,
|
||
|
const QSize &newSize);
|
||
15 years ago
|
|
||
|
virtual QwtPickerMachine *stateMachine(int) const;
|
||
|
|
||
|
virtual void updateDisplay();
|
||
|
|
||
|
const QWidget *rubberBandWidget() const;
|
||
|
const QWidget *trackerWidget() const;
|
||
|
|
||
|
private:
|
||
|
void init(QWidget *, int selectionFlags, RubberBand rubberBand,
|
||
14 years ago
|
DisplayMode trackerMode);
|
||
15 years ago
|
|
||
|
void setStateMachine(QwtPickerMachine *);
|
||
|
void setMouseTracking(bool);
|
||
|
|
||
|
class PickerWidget;
|
||
|
class PrivateData;
|
||
|
PrivateData *d_data;
|
||
|
};
|
||
14 years ago
|
|
||
15 years ago
|
#endif
|