]> git.sesse.net Git - kdenlive/blob - src/dragvalue.h
Bezier spline widget: use DragValue instead of SpinBoxes, range 0-1 with 3 decimals...
[kdenlive] / src / dragvalue.h
1 /***************************************************************************
2  *   Copyright (C) 2011 by Till Theato (root@ttill.de)                     *
3  *   This file is part of Kdenlive (www.kdenlive.org).                     *
4  *                                                                         *
5  *   Kdenlive is free software: you can redistribute it and/or modify      *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation, either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   Kdenlive is distributed in the hope that it will be useful,           *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with Kdenlive.  If not, see <http://www.gnu.org/licenses/>.     *
17  ***************************************************************************/
18
19 #ifndef DRAGVALUE_H_
20 #define DRAGVALUE_H_
21
22 #include <QWidget>
23 #include <kselectaction.h>
24 #include <QSpinBox>
25 #include <QDoubleSpinBox>
26 #include <QLabel>
27 #include <QProgressBar>
28
29 class QValidator;
30 class QToolButton;
31 class QLineEdit;
32 class QAction;
33 class QMenu;
34 class KSelectAction;
35
36
37 class CustomLabel : public QProgressBar
38 {
39     Q_OBJECT
40 public:
41     CustomLabel(const QString &label, bool showSlider = true, int precision = 0, QWidget *parent = 0);
42     void setProgressValue(double value);
43     void setStep(double step);
44     
45 protected:
46     //virtual void mouseDoubleClickEvent(QMouseEvent * event);
47     virtual void mousePressEvent(QMouseEvent * event);
48     virtual void mouseReleaseEvent(QMouseEvent *event);
49     virtual void mouseMoveEvent(QMouseEvent *event);
50     //virtual void paintEvent(QPaintEvent *event);
51     virtual void wheelEvent(QWheelEvent * event);
52
53 private:
54     QPoint m_dragStartPosition;
55     QPoint m_dragLastPosition;
56     bool m_dragMode;
57     double m_step;
58     bool m_showSlider;
59     double m_precision;
60     double m_value;
61     void slotValueInc(double factor = 1);
62     void slotValueDec(double factor = 1);
63     void setNewValue(double, bool);
64     
65 signals:
66     void valueChanged(double, bool);
67     void setInTimeline();
68     void resetValue();
69 };
70
71 /**
72  * @brief A widget for modifing numbers by dragging, using the mouse wheel or entering them with the keyboard.
73  */
74
75 class DragValue : public QWidget
76 {
77     Q_OBJECT
78
79 public:
80     DragValue(const QString &label, double defaultValue, int decimals, int id, const QString suffix, bool showSlider = true, QWidget* parent = 0);
81     virtual ~DragValue();
82
83     /** @brief Returns the precision = number of decimals */
84     int precision() const;
85     /** @brief Returns the maximum value */
86     qreal minimum() const;
87     /** @brief Returns the minimum value */
88     qreal maximum() const;
89
90     /** @brief Sets the precision (number of decimals) to @param precision. */
91     void setPrecision(int precision);
92     /** @brief Sets the minimum value. */
93     void setMinimum(qreal min);
94     /** @brief Sets the maximum value. */
95     void setMaximum(qreal max);
96     /** @brief Sets minimum and maximum value. */
97     void setRange(qreal min, qreal max);
98     /** @brief Sets the size of a step (when dragging or using the mouse wheel). */
99     void setStep(qreal step);
100
101     /** @brief Returns the current value */
102     qreal value() const;
103     /** @brief Change the "inTimeline" property to paint the intimeline widget differently. */
104     void setInTimelineProperty(bool intimeline);
105     /** @brief Returns minimum size for QSpinBox, used to set all spinboxes to the same width. */
106     int spinSize();
107     /** @brief Sets the minimum size for QSpinBox, used to set all spinboxes to the same width. */
108     void setSpinSize(int width);
109     
110 public slots:
111     /** @brief Sets the value (forced to be in the valid range) and emits valueChanged. */
112     void setValue(double value, bool final = true);
113     /** @brief Resets to default value */
114     void slotReset();
115
116 signals:
117     void valueChanged(int value, bool final = true);
118     void valueChanged(double value, bool final = true);
119     void inTimeline(int);
120
121
122
123     /*
124      * Private
125      */
126
127 protected:
128     /*virtual void mousePressEvent(QMouseEvent *e);
129     virtual void mouseMoveEvent(QMouseEvent *e);
130     virtual void mouseReleaseEvent(QMouseEvent *e);*/
131     /** @brief Forwards tab focus to lineedit since it is disabled. */
132     virtual void focusInEvent(QFocusEvent *e);
133     //virtual void keyPressEvent(QKeyEvent *e);
134     //virtual void wheelEvent(QWheelEvent *e);
135     //virtual void paintEvent( QPaintEvent * event );
136
137 private slots:
138
139     void slotEditingFinished();
140
141     void slotSetScaleMode(int mode);
142     void slotSetDirectUpdate(bool directUpdate);
143     void slotShowContextMenu(const QPoint &pos);
144     void slotSetValue(int value);
145     void slotSetValue(double value);
146     void slotSetInTimeline();
147
148 private:
149     double m_maximum;
150     double m_minimum;
151     int m_decimals;
152     double m_default;
153     int m_id;
154     QSpinBox *m_intEdit;
155     QDoubleSpinBox *m_doubleEdit;
156
157     QMenu *m_menu;
158     KSelectAction *m_scale;
159     QAction *m_directUpdate;
160     CustomLabel *m_label;
161 };
162
163 #endif