KSeExpr  4.0.4.0
ExprControl.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2011-2019 Disney Enterprises, Inc.
2 // SPDX-License-Identifier: LicenseRef-Apache-2.0
3 // SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
4 // SPDX-License-Identifier: GPL-3.0-or-later
5 
6 #pragma once
7 
8 #include <array>
9 #include <atomic>
10 #include <cstddef>
11 #include <memory>
12 
13 #include <QCheckBox>
14 #include <QHBoxLayout>
15 #include <QLabel>
16 
17 #include "Editable.h"
18 #include "ExprColorCurve.h"
19 #include "ExprColorSwatch.h"
20 #include "ExprCurve.h"
21 
22 
24 class ExprControl : public QWidget
25 {
26  Q_OBJECT
27 
28 protected:
29  int _id;
30  std::atomic<bool> _updating {}; // whether to send events (i.e. masked when self editing)
31  QHBoxLayout *hbox {nullptr};
32  QCheckBox *_colorLinkCB {nullptr};
33  QLabel *_label {nullptr};
34 
35  Editable *_editable {nullptr};
36 
37 public:
38  ExprControl(int id, Editable *editable, bool showColorLink);
39  ~ExprControl() override = default;
40 
42  virtual QColor getColor()
43  {
44  return {};
45  }
47  virtual void setColor(QColor) {};
48 
49 Q_SIGNALS:
50  // sends that the control has been changed to the control collection
51  void controlChanged(int id);
52  // sends the new color to the control collection
53  void linkColorEdited(int id, QColor color);
54  // sends that a color link is desired to the control collection
55  void linkColorLink(int id);
56 public Q_SLOTS:
57  // receives that the link should be changed to the given state (0=off,1=on)
58  void linkStateChange(int state);
59 
60 public:
61  // notifies this that the link should be disconnected
62  void linkDisconnect(int newId);
63 
64 protected:
65  // Allows to adapt the widget contents - amyspark
66  void resizeEvent(QResizeEvent *event) override;
67 };
68 
70 template<class T, class T2, class T3> T clamp(const T val, const T2 minval, const T3 maxval)
71 {
72  assert(!(maxval < minval));
73  if (val < minval)
74  return minval;
75  else if (val > maxval)
76  return maxval;
77  return val;
78 }
79 
81 // TODO: can this now be removed?
82 class ExprLineEdit : public QLineEdit
83 {
84  Q_OBJECT
85 public:
86  ExprLineEdit(int id, QWidget *parent);
87  virtual void setText(const QString &t)
88  {
89  if (_signaling)
90  return;
91  QLineEdit::setText(t);
92  }
93 
94 Q_SIGNALS:
95  void textChanged(int id, const QString &text);
96 
97 private Q_SLOTS:
98  void textChangedCB(const QString &text);
99 
100 private:
101  int _id;
102  std::atomic<bool> _signaling{false};
103 };
104 
106 class ExprSlider : public QSlider
107 {
108  Q_OBJECT
109 public:
110  ExprSlider(QWidget *parent = nullptr)
111  : QSlider(parent)
112  {
113  }
114  ExprSlider(Qt::Orientation orientation, QWidget *parent = nullptr)
115  : QSlider(orientation, parent)
116  {
117  }
118  void mousePressEvent(QMouseEvent *e) override;
119  void mouseMoveEvent(QMouseEvent *e) override;
120  void paintEvent(QPaintEvent *e) override;
121  void leaveEvent(QEvent *) override
122  {
123  update();
124  }
125  void enterEvent(QEvent *) override
126  {
127  update();
128  }
129  void wheelEvent(QWheelEvent *e) override
130  {
131  e->ignore();
132  }
133 };
134 
136 class ExprChannelSlider : public QWidget
137 {
138  Q_OBJECT
139 public:
140  ExprChannelSlider(int id, QWidget *parent);
141  void paintEvent(QPaintEvent *e) override;
142  void mousePressEvent(QMouseEvent *e) override;
143  void mouseMoveEvent(QMouseEvent *e) override;
144  void wheelEvent(QWheelEvent *e) override
145  {
146  e->ignore();
147  }
148  double value() const
149  {
150  return _value;
151  }
152  void setDisplayColor(QColor c)
153  {
154  _col = c;
155  }
156 
157 public Q_SLOTS:
158  void setValue(double value);
159 
160 Q_SIGNALS:
161  void valueChanged(int id, double value);
162 
163 private:
164  int _id;
165  double _value;
166  QColor _col;
167 };
168 
171 {
172  Q_OBJECT
173 
177  ExprSlider *_slider {nullptr};
179  ExprLineEdit *_edit {nullptr};
180 
181 public:
182  NumberControl(int id, NumberEditable *editable);
183 
184 private:
186  void setValue(double value);
188  void updateControl();
189 private Q_SLOTS:
190  void sliderChanged(int val);
191  void editChanged(int id, const QString &text);
192 };
193 
196 {
197  Q_OBJECT
198 
202  std::array<ExprLineEdit *, 3> _edits{};
204 
206  std::array<ExprChannelSlider *, 3> _sliders{};
207 
208 public:
209  VectorControl(int id, VectorEditable *editable);
210 
211  QColor getColor() override;
212  void setColor(QColor color) override;
213 
214 private:
216  void setValue(int n, double value);
218  void updateControl();
219 private Q_SLOTS:
220  void sliderChanged(int id, double val);
221  void editChanged(int id, const QString &text);
222  void swatchChanged(QColor color);
223 };
224 
227 {
228  Q_OBJECT
229 
233  QLineEdit *_edit {nullptr};
234 
235 public:
236  StringControl(int id, StringEditable *stringEditable);
237 
238 private:
239  void updateControl();
240 private Q_SLOTS:
241  void textChanged(const QString &newText);
242  void fileBrowse();
243  void directoryBrowse();
244 };
245 
247 class CurveControl : public ExprControl
248 {
249  Q_OBJECT
250 
254  ExprCurve *_curve {nullptr};
255 
256 public:
257  CurveControl(int id, CurveEditable *stringEditable);
258 private Q_SLOTS:
259  void curveChanged();
260 };
261 
264 {
265  Q_OBJECT
266 
270  ExprColorCurve *_curve {nullptr};
271 
272 public:
273  CCurveControl(int id, ColorCurveEditable *stringEditable);
274  QColor getColor() override;
275  void setColor(QColor color) override;
276 private Q_SLOTS:
277  void curveChanged();
278 };
279 
282 {
283  Q_OBJECT
284 
289 
290 public:
291  ColorSwatchControl(int id, ColorSwatchEditable *swatchEditable);
292 private Q_SLOTS:
293  void buildSwatchWidget();
294  void colorChanged(int index, KSeExpr::Vec3d value);
295  void colorAdded(int index, KSeExpr::Vec3d value);
296  void colorRemoved(int index);
297 
298 private:
300 };
T clamp(const T val, const T2 minval, const T3 maxval)
clamp val to the specified range [minval,maxval]
Definition: ExprControl.h:70
Control for editing a color ramp curve.
Definition: ExprControl.h:264
CCurveControl(int id, ColorCurveEditable *stringEditable)
QColor getColor() override
Interface for getting the color (used for linked color picking)
void setColor(QColor color) override
Interface for setting the color (used for linked color picking)
void curveChanged()
ColorCurveEditable * _curveEditable
color curve model
Definition: ExprControl.h:268
ExprColorCurve * _curve
color curve widget
Definition: ExprControl.h:270
A control for editing color swatches.
Definition: ExprControl.h:282
void colorChanged(int index, KSeExpr::Vec3d value)
void colorAdded(int index, KSeExpr::Vec3d value)
void colorRemoved(int index)
ColorSwatchEditable * _swatchEditable
model for the color swatches control
Definition: ExprControl.h:286
ExprColorSwatchWidget * _swatch
Edit box for the color swatches.
Definition: ExprControl.h:288
ColorSwatchControl(int id, ColorSwatchEditable *swatchEditable)
Control for editing a normal curve ramp.
Definition: ExprControl.h:248
void curveChanged()
CurveControl(int id, CurveEditable *stringEditable)
ExprCurve * _curve
curve edit widget
Definition: ExprControl.h:254
CurveEditable * _curveEditable
curve model
Definition: ExprControl.h:252
Channel Slider (i.e. for colors)
Definition: ExprControl.h:137
void mouseMoveEvent(QMouseEvent *e) override
void setValue(double value)
void wheelEvent(QWheelEvent *e) override
Definition: ExprControl.h:144
double value() const
Definition: ExprControl.h:148
void valueChanged(int id, double value)
ExprChannelSlider(int id, QWidget *parent)
void paintEvent(QPaintEvent *e) override
void setDisplayColor(QColor c)
Definition: ExprControl.h:152
void mousePressEvent(QMouseEvent *e) override
Base class for all controls for Expressions.
Definition: ExprControl.h:25
QCheckBox * _colorLinkCB
Definition: ExprControl.h:32
std::atomic< bool > _updating
Definition: ExprControl.h:30
Editable * _editable
Definition: ExprControl.h:35
QHBoxLayout * hbox
Definition: ExprControl.h:31
virtual QColor getColor()
Interface for getting the color (used for linked color picking)
Definition: ExprControl.h:42
void resizeEvent(QResizeEvent *event) override
void linkStateChange(int state)
void linkDisconnect(int newId)
QLabel * _label
Definition: ExprControl.h:33
void controlChanged(int id)
void linkColorLink(int id)
void linkColorEdited(int id, QColor color)
ExprControl(int id, Editable *editable, bool showColorLink)
~ExprControl() override=default
virtual void setColor(QColor)
Interface for setting the color (used for linked color picking)
Definition: ExprControl.h:47
Line Editor Widget(used for numbers)
Definition: ExprControl.h:83
virtual void setText(const QString &t)
Definition: ExprControl.h:87
std::atomic< bool > _signaling
Definition: ExprControl.h:102
void textChanged(int id, const QString &text)
void textChangedCB(const QString &text)
Definition: ExprEditor.cpp:36
ExprLineEdit(int id, QWidget *parent)
Definition: ExprEditor.cpp:29
Generic Slider (used for int and float sliders)
Definition: ExprControl.h:107
ExprSlider(QWidget *parent=nullptr)
Definition: ExprControl.h:110
ExprSlider(Qt::Orientation orientation, QWidget *parent=nullptr)
Definition: ExprControl.h:114
void wheelEvent(QWheelEvent *e) override
Definition: ExprControl.h:129
void paintEvent(QPaintEvent *e) override
Definition: ExprControl.cpp:86
void enterEvent(QEvent *) override
Definition: ExprControl.h:125
void mouseMoveEvent(QMouseEvent *e) override
Definition: ExprControl.cpp:78
void leaveEvent(QEvent *) override
Definition: ExprControl.h:121
void mousePressEvent(QMouseEvent *e) override
Definition: ExprControl.cpp:73
Number slider for either float or int data.
Definition: ExprControl.h:171
NumberEditable * _numberEditable
Pointer to the number control model.
Definition: ExprControl.h:175
void editChanged(int id, const QString &text)
void updateControl()
Update values in slider and textbox given what the model contains.
ExprLineEdit * _edit
Text box for the number.
Definition: ExprControl.h:179
void sliderChanged(int val)
ExprSlider * _slider
Slider for the number.
Definition: ExprControl.h:177
NumberControl(int id, NumberEditable *editable)
void setValue(double value)
Update the model with the value and notify the collection.
A control for editing strings, filenames, and directories.
Definition: ExprControl.h:227
void updateControl()
void directoryBrowse()
StringEditable * _stringEditable
model for the string control
Definition: ExprControl.h:231
void textChanged(const QString &newText)
StringControl(int id, StringEditable *stringEditable)
QLineEdit * _edit
Edit box for the string.
Definition: ExprControl.h:233
A vector or color control (named vector because it edits a KSeExpr::Vec3d literal)
Definition: ExprControl.h:196
void setValue(int n, double value)
set the value in the model (in response to editing from controls)
VectorControl(int id, VectorEditable *editable)
void updateControl()
update the individual slider and eidt box controls
std::array< ExprLineEdit *, 3 > _edits
All three line edit widgets (for each component)
Definition: ExprControl.h:202
void editChanged(int id, const QString &text)
std::array< ExprChannelSlider *, 3 > _sliders
All three channel sliders (for each component)
Definition: ExprControl.h:206
void swatchChanged(QColor color)
VectorEditable * _numberEditable
Number model.
Definition: ExprControl.h:200
void sliderChanged(int id, double val)
QColor getColor() override
Interface for getting the color (used for linked color picking)
void setColor(QColor color) override
Interface for setting the color (used for linked color picking)
ExprCSwatchFrame * _swatch
Definition: ExprControl.h:203