1 #pragma once
2 
3 #ifndef INTFIELD_H
4 #define INTFIELD_H
5 
6 #include "tcommon.h"
7 #include "toonzqt/lineedit.h"
8 
9 #include <QToolBar>
10 
11 #undef DVAPI
12 #undef DVVAR
13 #ifdef TOONZQT_EXPORTS
14 #define DVAPI DV_EXPORT_API
15 #define DVVAR DV_EXPORT_VAR
16 #else
17 #define DVAPI DV_IMPORT_API
18 #define DVVAR DV_IMPORT_VAR
19 #endif
20 
21 // forward declaration
22 class QSlider;
23 class QIntValidator;
24 
25 //=============================================================================
26 
27 namespace DVGui {
28 
29 //=============================================================================
30 /*! \brief The RollerField class provides an object to change an integer value.
31 
32                 Inherits \b QWidget.
33 */
34 class DVAPI RollerField final : public QWidget {
35   Q_OBJECT
36 
37   double m_value;
38   double m_minValue;
39   double m_maxValue;
40 
41   double m_step;
42 
43   int m_xPos;
44 
45 public:
46   RollerField(QWidget *parent = 0);
47 
~RollerField()48   ~RollerField() {}
49 
50   void setValue(double value);
51   double getValue() const;
52 
53   void setRange(double minValue, double maxValue);
54   void getRange(double &minValue, double &maxValue);
55 
setStep(double _step)56   void setStep(double _step) { m_step = _step; }
57 
58 protected:
59   void paintEvent(QPaintEvent *e) override;
60   void mousePressEvent(QMouseEvent *) override;
61   void mouseMoveEvent(QMouseEvent *) override;
62   void mouseReleaseEvent(QMouseEvent *) override;
63 
64   void addValue(bool isDragging);
65   void removeValue(bool isDragging);
66 
67 signals:
68   void valueChanged(bool isDragging);
69 };
70 
71 //=============================================================================
72 /*! \brief The IntLineEdit class provides an object to manage an integer line
73    edit.
74 
75                 Inherits \b LineEdit, set an integer validator \b QIntValidator.
76 
77                 You can pass to constructor current value, minimum and max value
78    field
79                 or set this value using setValue(), setRange() .
80 */
81 class DVAPI IntLineEdit : public LineEdit {
82   Q_OBJECT
83 
84   QIntValidator *m_validator;
85   //! The number of digits showed int the line edit.
86   //! If digits is less than 1 the line edit show the natural number without
87   //! prepend zeros.
88   int m_showedDigits;
89   int m_xMouse;
90   bool m_mouseDragEditing = false;
91   bool m_isTyping         = false;
92 
93 public:
94   IntLineEdit(QWidget *parent = 0, int value = 1,
95               int minValue     = (-(std::numeric_limits<int>::max)()),
96               int maxValue     = ((std::numeric_limits<int>::max)()),
97               int showedDigits = 0);
~IntLineEdit()98   ~IntLineEdit() {}
99 
100   /*! Set text in field to \b value. */
101   void setValue(int value);
102   /*! Return an integer with text field value. */
103   int getValue();
104 
105   /*! Set the range of field from \b minValue to \b maxValue;
106                   set validator value. */
107   void setRange(int minValue, int maxValue);
108   /*! Set to \b minValue minimum range value.
109                   \sa setRange() */
110   void setBottomRange(int minValue);
111   /*! Set to \b maxValue maximum range value.
112                   \sa getRange() */
113   void setTopRange(int maxValue);
114 
115   /*! Set \b minValue an \b maxValue to current range; to current
116                   validator minimum and maximum value. */
117   void getRange(int &minValue, int &maxValue);
118 
119   void setLineEditBackgroundColor(QColor color);
120 
121 protected:
122   /*! If focus is lost and current text value is out of range emit signal
123                   \b editingFinished.*/
124   void focusOutEvent(QFocusEvent *) override;
125 
126   // for dragging the mouse to set the value
127   void mousePressEvent(QMouseEvent *) override;
128   void mouseMoveEvent(QMouseEvent *) override;
129   void mouseReleaseEvent(QMouseEvent *) override;
130 };
131 
132 //=============================================================================
133 /*! \brief The IntField class provides to view an object to manage an integer
134                 parameter.
135 
136                 Inherits \b QWidget.
137 
138                 The class is composed of an horizontal layout which contains two
139 object,
140                 \li a vertical layout with a text field \b IntLineEdit and a
141 roller
142                 \li an horizontal slider QSlider.
143                 This objects are connected, so if you change one the other
144 automatically change.
145                 You can set current value getValue(), minimum and max value
146 using setValue(),
147                 setRange() or setValues(); by default is value = 0, minimum
148 value = 0
149                 and maximum value = 100.
150 \n	Maximum height object is fixed to \b DVGui::WidgetHeight, width depend
151                 on parent width.
152 
153                 To know when integer parameter value change class provides a
154 signal, valueChanged();
155                 class emit signal when slider value change or when editing text
156 field is
157                 finished and current value is changed. Editing text field
158 finished may occur
159                 if focus is lost or enter key is pressed. See SLOT:
160 onSliderChanged(int value),
161                 onEditingFinished().
162 */
163 class DVAPI IntField : public QWidget {
164   Q_OBJECT
165 
166   RollerField *m_roller;
167   IntLineEdit *m_lineEdit;
168   QSlider *m_slider;
169   bool m_isMaxRangeLimited;
170   bool m_isLinearSlider;
171 
172 public:
173   IntField(QWidget *parent = 0, bool isMaxRangeLimited = true,
174            bool isRollerHide = true);
~IntField()175   ~IntField() {}
176 
177   /*! Set to \b minValue and \b maxValue slider and text field range.
178                   \sa getRange() */
179   void setRange(int minValue, int maxValue);
180 
181   /*! Set \b minValue and \b maxValue to IntField range.
182                   \sa setRange() */
183   void getRange(int &minValue, int &maxValue);
184 
185   /*! Set to \b value current value IntField.
186                   \sa getValue() */
187   void setValue(int value);
188   /*! Return current value.
189                   \sa setValue() */
190   int getValue();
191 
192   /*! This is provided for convenience.
193                   Set to \b value current value IntField; set to \b minValue and
194      \b maxValue
195                   slider and text field range.
196                   \sa getValue() */
197   void setValues(int value, int minValue, int maxValue);
198 
199   /*! If \b enable is false set slider disable and hide it. */
200   void enableSlider(bool enable);
201   bool sliderIsEnabled();
202 
203   /*! If \b enable is false set roller disable and hide it. */
204   void enableRoller(bool enable);
205   bool rollerIsEnabled();
206 
207   void setLineEditBackgroundColor(QColor color);
208 
209 protected:
setLinearSlider(bool linear)210   void setLinearSlider(bool linear) { m_isLinearSlider = linear; }
211 
212 private:
213   int pos2value(int x) const;
214   int value2pos(int v) const;
215 
216 protected slots:
217   /*! Set to value the text field. If text field value is different from \b
218      value
219                   emit signal valueChanged(). */
220   void onSliderChanged(int value);
onSliderReleased()221   void onSliderReleased() { emit valueChanged(false); }
222 
223   /*! Set slider and roller value to current value in text field.
224   \n	This protected slot is called when text editing is finished.
225   \n	If slider value is different from text field value emit signal
226   valueChanged(). */
227   void onEditingFinished();
228   /*! Set text field and slider to roller current value.
229   \n	If slider and text field value are different from roller value
230                   emit signal valueChanged(). */
231   void onRollerValueChanged(bool isDragging);
232 
233 signals:
234   /*! This is a signal emitted when IntField, slider or text field, value
235      change;
236                   if slider position change or text field editing is finished.
237                   \sa onEditingFinished() and onSliderChanged(int value). */
238   void valueChanged(bool isDragging);
239 
240   /*! This signal is emitted only when the user edit the value by hand */
241   void valueEditedByHand();
242 };
243 
244 //-----------------------------------------------------------------------------
245 }  // namespace DVGui
246 //-----------------------------------------------------------------------------
247 
248 #endif  // INTFIELD_H
249