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