1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2  * Qwt Widget Library
3  * Copyright (C) 1997   Josef Wilgen
4  * Copyright (C) 2002   Uwe Rathmann
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the Qwt License, Version 1.0
8  *****************************************************************************/
9 
10 // vim: expandtab
11 
12 #ifndef QWT_COUNTER_H
13 #define QWT_COUNTER_H
14 
15 #include <qwidget.h>
16 #include "qwt_global.h"
17 #include "qwt_double_range.h"
18 
19 /*!
20   \brief The Counter Widget
21 
22   A Counter consists of a label displaying a number and
23   one ore more (up to three) push buttons on each side
24   of the label which can be used to increment or decrement
25   the counter's value.
26 
27   A Counter has a range from a minimum value to a maximum value
28   and a step size. The range can be specified using
29   QwtDblRange::setRange().
30   The counter's value is an integer multiple of the step size.
31   The number of steps by which a button increments or decrements
32   the value can be specified using QwtCounter::setIncSteps().
33   The number of buttons can be changed with
34   QwtCounter::setNumButtons().
35 
36   Holding the space bar down with focus on a button is the
37   fastest method to step through the counter values.
38   When the counter underflows/overflows, the focus is set
39   to the smallest up/down button and counting is disabled.
40   Counting is re-enabled on a button release event (mouse or
41   space bar).
42 
43   Example:
44 \code
45 #include "../include/qwt_counter.h>
46 
47 QwtCounter *cnt;
48 
49 cnt = new QwtCounter(parent, name);
50 
51 cnt->setRange(0.0, 100.0, 1.0);             // From 0.0 to 100, step 1.0
52 cnt->setNumButtons(2);                      // Two buttons each side
53 cnt->setIncSteps(QwtCounter::Button1, 1);   // Button 1 increments 1 step
54 cnt->setIncSteps(QwtCounter::Button2, 20);  // Button 2 increments 20 steps
55 
56 connect(cnt, SIGNAL(valueChanged(double)), my_class, SLOT(newValue(double)));
57 \endcode
58  */
59 
60 class QWT_EXPORT QwtCounter : public QWidget, public QwtDoubleRange
61 {
62     Q_OBJECT
63 
64     Q_PROPERTY( int numButtons READ numButtons WRITE setNumButtons )
65     Q_PROPERTY( double basicstep READ step WRITE setStep )
66     Q_PROPERTY( double minValue READ minVal WRITE setMinValue )
67     Q_PROPERTY( double maxValue READ maxVal WRITE setMaxValue )
68     Q_PROPERTY( int stepButton1 READ stepButton1 WRITE setStepButton1 )
69     Q_PROPERTY( int stepButton2 READ stepButton2 WRITE setStepButton2 )
70     Q_PROPERTY( int stepButton3 READ stepButton3 WRITE setStepButton3 )
71     Q_PROPERTY( double value READ value WRITE setValue )
72     Q_PROPERTY( bool editable READ editable WRITE setEditable )
73 
74 public:
75     /*!
76         Button index
77     */
78 
79     enum Button
80     {
81         Button1,
82         Button2,
83         Button3,
84         ButtonCnt
85     };
86 
87     explicit QwtCounter(QWidget *parent = NULL);
88 #if QT_VERSION < 0x040000
89     explicit QwtCounter(QWidget *parent, const char *name);
90 #endif
91     virtual ~QwtCounter();
92 
93     bool editable() const;
94     void setEditable(bool);
95 
96     void setNumButtons(int n);
97     int numButtons() const;
98 
99     void setIncSteps(QwtCounter::Button btn, int nSteps);
100     int incSteps(QwtCounter::Button btn) const;
101 
102     virtual void setValue(double);
103     virtual QSize sizeHint() const;
104 
105     virtual void polish();
106 
107     // a set of dummies to help the designer
108 
109     double step() const;
110     void setStep(double s);
111     double minVal() const;
112     void setMinValue(double m);
113     double maxVal() const;
114     void setMaxValue(double m);
115     void setStepButton1(int nSteps);
116     int stepButton1() const;
117     void setStepButton2(int nSteps);
118     int stepButton2() const;
119     void setStepButton3(int nSteps);
120     int stepButton3() const;
121     virtual double value() const;
122 
123 signals:
124     /*!
125         This signal is emitted when a button has been released
126         \param value The new value
127     */
128     void buttonReleased (double value);
129 
130     /*!
131         This signal is emitted when the counter's value has changed
132         \param value The new value
133     */
134     void valueChanged (double value);
135 
136 protected:
137     virtual bool event(QEvent *);
138     virtual void wheelEvent(QWheelEvent *);
139     virtual void keyPressEvent(QKeyEvent *);
140     virtual void rangeChange();
141 
142 private slots:
143     void btnReleased();
144     void btnClicked();
145     void textChanged();
146 
147 private:
148     void initCounter();
149     void updateButtons();
150     void showNum(double);
151     virtual void valueChange();
152 
153     class PrivateData;
154     PrivateData *d_data;
155 };
156 
157 #endif
158