]> git.sesse.net Git - kdenlive/blob - src/dragvalue.h
Fix dragging of parameter widget with large range (for example size in geometry widget)
[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 range = 1000, 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     bool m_showSlider;
58     double m_step;
59     void slotValueInc(double factor = 1);
60     void slotValueDec(double factor = 1);
61     void setNewValue(double, bool);
62     
63 signals:
64     void valueChanged(double, bool);
65     void setInTimeline();
66     void resetValue();
67 };
68
69 /**
70  * @brief A widget for modifing numbers by dragging, using the mouse wheel or entering them with the keyboard.
71  */
72
73 class DragValue : public QWidget
74 {
75     Q_OBJECT
76
77 public:
78     /**
79     * @brief Default constructor.
80     * @param label The label that will be displayed in the progress bar
81     * @param defaultValue The default value
82     * @param decimals The number of decimals for the parameter. 0 means it is an integer
83     * @param min The minimum value
84     * @param max The maximum value
85     * @param id Used to identify this widget. If this parameter is set, "Show in Timeline" will be available in context menu.
86     * @param suffix The suffix that will be displayed in the spinbox (for example '%')
87     * @param showSlider If disabled, user can still drag on the label but no progress bar is shown
88     */    
89     DragValue(const QString &label, double defaultValue, int decimals, double min = 0, double max = 100, int id = -1, const QString suffix = QString(), bool showSlider = true, QWidget* parent = 0);
90     virtual ~DragValue();
91
92     /** @brief Returns the precision = number of decimals */
93     int precision() const;
94     /** @brief Returns the maximum value */
95     qreal minimum() const;
96     /** @brief Returns the minimum value */
97     qreal maximum() const;
98
99     /** @brief Sets the precision (number of decimals) to @param precision. */
100     void setPrecision(int precision);
101     /** @brief Sets the minimum value. */
102     void setMinimum(qreal min);
103     /** @brief Sets the maximum value. */
104     void setMaximum(qreal max);
105     /** @brief Sets minimum and maximum value. */
106     void setRange(qreal min, qreal max);
107     /** @brief Sets the size of a step (when dragging or using the mouse wheel). */
108     void setStep(qreal step);
109
110     /** @brief Returns the current value */
111     qreal value() const;
112     /** @brief Change the "inTimeline" property to paint the intimeline widget differently. */
113     void setInTimelineProperty(bool intimeline);
114     /** @brief Returns minimum size for QSpinBox, used to set all spinboxes to the same width. */
115     int spinSize();
116     /** @brief Sets the minimum size for QSpinBox, used to set all spinboxes to the same width. */
117     void setSpinSize(int width);
118     
119 public slots:
120     /** @brief Sets the value (forced to be in the valid range) and emits valueChanged. */
121     void setValue(double value, bool final = true);
122     void setValueFromProgress(double value, bool final);
123     /** @brief Resets to default value */
124     void slotReset();
125
126 signals:
127     void valueChanged(double value, bool final = true);
128     void inTimeline(int);
129
130
131
132     /*
133      * Private
134      */
135
136 protected:
137     /*virtual void mousePressEvent(QMouseEvent *e);
138     virtual void mouseMoveEvent(QMouseEvent *e);
139     virtual void mouseReleaseEvent(QMouseEvent *e);*/
140     /** @brief Forwards tab focus to lineedit since it is disabled. */
141     virtual void focusInEvent(QFocusEvent *e);
142     //virtual void keyPressEvent(QKeyEvent *e);
143     //virtual void wheelEvent(QWheelEvent *e);
144     //virtual void paintEvent( QPaintEvent * event );
145
146 private slots:
147
148     void slotEditingFinished();
149
150     void slotSetScaleMode(int mode);
151     void slotSetDirectUpdate(bool directUpdate);
152     void slotShowContextMenu(const QPoint &pos);
153     void slotSetValue(int value);
154     void slotSetValue(double value);
155     void slotSetInTimeline();
156
157 private:
158     double m_maximum;
159     double m_minimum;
160     int m_decimals;
161     double m_default;
162     int m_id;
163     QSpinBox *m_intEdit;
164     QDoubleSpinBox *m_doubleEdit;
165
166     QMenu *m_menu;
167     KSelectAction *m_scale;
168     QAction *m_directUpdate;
169     CustomLabel *m_label;
170 };
171
172 #endif