• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

KritaWidgets

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • widgets
KisVisualColorSelector.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Wolthera van Hovell tot Westerflier <[email protected]>, (C) 2016
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  */
6 #include "KisVisualColorSelector.h"
7 
8 #include <QRect>
9 #include <QVector>
10 #include <QVector3D>
11 #include <QVector4D>
12 #include <QVBoxLayout>
13 #include <QList>
14 #include <QtMath>
15 
16 #include <KSharedConfig>
17 #include <KConfigGroup>
18 
19 #include "KoColorConversions.h"
20 #include "KoColorDisplayRendererInterface.h"
21 #include "KoColorProfile.h"
22 #include "KoChannelInfo.h"
23 #include <KoColorModelStandardIds.h>
24 #include <QPointer>
25 #include "kis_signal_compressor.h"
26 #include "kis_debug.h"
27 
28 #include "KisVisualColorSelectorShape.h"
29 #include "KisVisualRectangleSelectorShape.h"
30 #include "KisVisualTriangleSelectorShape.h"
31 #include "KisVisualEllipticalSelectorShape.h"
32 
33 struct KisVisualColorSelector::Private
34 {
35  KoColor currentcolor;
36  const KoColorSpace *currentCS {0};
37  QList<KisVisualColorSelectorShape*> widgetlist;
38  bool acceptTabletEvents {false};
39  bool circular {false};
40  bool exposureSupported {false};
41  bool isRGBA {false};
42  bool isLinear {false};
43  bool applyGamma {false};
44  int displayPosition[4]; // map channel index to storage index for display
45  int colorChannelCount {0};
46  qreal gamma {2.2};
47  qreal lumaRGB[3] {0.2126, 0.7152, 0.0722};
48  QVector4D channelValues;
49  QVector4D channelMaxValues;
50  ColorModel model {ColorModel::None};
51  const KoColorDisplayRendererInterface *displayRenderer {0};
52  KisColorSelectorConfiguration acs_config;
53  KisSignalCompressor *updateTimer {0};
54 };
55 
56 KisVisualColorSelector::KisVisualColorSelector(QWidget *parent)
57  : KisColorSelectorInterface(parent)
58  , m_d(new Private)
59 {
60  this->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
61 
62  KConfigGroup cfg = KSharedConfig::openConfig()->group("advancedColorSelector");
63  m_d->acs_config = KisColorSelectorConfiguration::fromString(cfg.readEntry("colorSelectorConfiguration", KisColorSelectorConfiguration().toString()));
64  m_d->updateTimer = new KisSignalCompressor(100 /* ms */, KisSignalCompressor::POSTPONE);
65  connect(m_d->updateTimer, SIGNAL(timeout()), SLOT(slotRebuildSelectors()), Qt::UniqueConnection);
66 }
67 
68 KisVisualColorSelector::~KisVisualColorSelector()
69 {
70  delete m_d->updateTimer;
71 }
72 
73 void KisVisualColorSelector::slotSetColor(const KoColor &c)
74 {
75  if (!m_d->currentCS) {
76  m_d->currentcolor = c;
77  slotSetColorSpace(c.colorSpace());
78  }
79  else {
80  m_d->currentcolor = c.convertedTo(m_d->currentCS);
81  m_d->channelValues = convertKoColorToShapeCoordinates(m_d->currentcolor);
82  Q_FOREACH (KisVisualColorSelectorShape *shape, m_d->widgetlist) {
83  shape->setChannelValues(m_d->channelValues, true);
84  }
85  }
86  if (isHSXModel()) {
87  emit sigHSXChanged(QVector3D(m_d->channelValues));
88  }
89 }
90 
91 void KisVisualColorSelector::slotSetColorSpace(const KoColorSpace *cs)
92 {
93  if (!m_d->currentCS || *m_d->currentCS != *cs) {
94  const KoColorSpace *csNew = cs;
95 
96  // PQ color space is not very suitable for selecting colors, substitute with linear one
97  if (cs->colorModelId() == RGBAColorModelID &&
98  cs->profile()->uniqueId() == KoColorSpaceRegistry::instance()->p2020PQProfile()->uniqueId()) {
99 
100  csNew = KoColorSpaceRegistry::instance()->
101  colorSpace(RGBAColorModelID.id(), Float32BitsColorDepthID.id(),
102  KoColorSpaceRegistry::instance()->p2020G10Profile());
103  }
104  m_d->currentCS = csNew;
105  m_d->currentcolor = KoColor(csNew);
106  slotRebuildSelectors();
107  }
108 }
109 
110 void KisVisualColorSelector::slotSetHSX(const QVector3D &hsx)
111 {
112  if (isHSXModel()) {
113  m_d->channelValues = QVector4D(hsx, 0.f);
114  Q_FOREACH (KisVisualColorSelectorShape *shape, m_d->widgetlist) {
115  shape->setChannelValues(m_d->channelValues, true);
116  }
117  KoColor newColor = convertShapeCoordsToKoColor(QVector4D(hsx));
118  if (newColor != m_d->currentcolor) {
119  m_d->currentcolor = newColor;
120  emit sigNewColor(m_d->currentcolor);
121  }
122  }
123 }
124 
125 void KisVisualColorSelector::setConfig(bool forceCircular, bool forceSelfUpdate)
126 {
127  Q_UNUSED(forceSelfUpdate);
128  m_d->circular = forceCircular;
129 }
130 
131 void KisVisualColorSelector::setAcceptTabletEvents(bool on)
132 {
133  m_d->acceptTabletEvents = on;
134  Q_FOREACH (KisVisualColorSelectorShape *shape, m_d->widgetlist) {
135  shape->setAcceptTabletEvents(on);
136  }
137 }
138 
139 KoColor KisVisualColorSelector::getCurrentColor() const
140 {
141  return m_d->currentcolor;
142 }
143 
144 QVector4D KisVisualColorSelector::getChannelValues() const
145 {
146  return m_d->channelValues;
147 }
148 
149 KisVisualColorSelector::ColorModel KisVisualColorSelector::getColorModel() const
150 {
151  return m_d->model;
152 }
153 
154 bool KisVisualColorSelector::isHSXModel() const
155 {
156  return (m_d->model >= ColorModel::HSV && m_d->model <= ColorModel::HSY);
157 }
158 
159 KoColor KisVisualColorSelector::convertShapeCoordsToKoColor(const QVector4D &coordinates) const
160 {
161  KoColor c(m_d->currentCS);
162  QVector4D baseValues(coordinates);
163  QVector <float> channelValues(c.colorSpace()->channelCount());
164  channelValues.fill(1.0);
165 
166  if (m_d->model != ColorModel::Channel && m_d->isRGBA == true) {
167 
168  if (m_d->model == ColorModel::HSV) {
169  HSVToRGB(coordinates.x()*360, coordinates.y(), coordinates.z(), &baseValues[0], &baseValues[1], &baseValues[2]);
170  }
171  else if (m_d->model == ColorModel::HSL) {
172  HSLToRGB(coordinates.x()*360, coordinates.y(), coordinates.z(), &baseValues[0], &baseValues[1], &baseValues[2]);
173  }
174  else if (m_d->model == ColorModel::HSI) {
175  // why suddenly qreal?
176  qreal temp[3];
177  HSIToRGB(coordinates.x(), coordinates.y(), coordinates.z(), &temp[0], &temp[1], &temp[2]);
178  baseValues.setX(temp[0]);
179  baseValues.setY(temp[1]);
180  baseValues.setZ(temp[2]);
181  }
182  else /*if (m_d->model == ColorModel::HSY)*/ {
183  qreal temp[3];
184  qreal Y = pow(coordinates.z(), m_d->gamma);
185  HSYToRGB(coordinates.x(), coordinates.y(), Y, &temp[0], &temp[1], &temp[2],
186  m_d->lumaRGB[0], m_d->lumaRGB[1], m_d->lumaRGB[2]);
187  baseValues.setX(temp[0]);
188  baseValues.setY(temp[1]);
189  baseValues.setZ(temp[2]);
190  if (!m_d->isLinear) {
191  // Note: not all profiles define a TRC necessary for (de-)linearization,
192  // substituting with a linear profiles would be better
193  QVector<qreal> temp({baseValues[0], baseValues[1], baseValues[2]});
194  if (m_d->exposureSupported) {
195  m_d->currentCS->profile()->delinearizeFloatValue(temp);
196  }
197  else {
198  m_d->currentCS->profile()->delinearizeFloatValueFast(temp);
199  }
200  baseValues = QVector4D(temp[0], temp[1], temp[2], 0);
201  }
202  }
203  if (m_d->applyGamma) {
204  for (int i=0; i<3; i++) {
205  baseValues[i] = pow(baseValues[i], 2.2);
206  }
207  }
208  }
209 
210  if (m_d->exposureSupported) {
211  baseValues *= m_d->channelMaxValues;
212  }
213 
214  for (int i=0; i<m_d->colorChannelCount; i++) {
215  channelValues[m_d->displayPosition[i]] = baseValues[i];
216  }
217 
218  c.colorSpace()->fromNormalisedChannelsValue(c.data(), channelValues);
219 
220  return c;
221 
222 }
223 
224 QVector4D KisVisualColorSelector::convertKoColorToShapeCoordinates(KoColor c) const
225 {
226  if (c.colorSpace() != m_d->currentCS) {
227  c.convertTo(m_d->currentCS);
228  }
229  QVector <float> channelValues (c.colorSpace()->channelCount());
230  channelValues.fill(1.0);
231  m_d->currentCS->normalisedChannelsValue(c.data(), channelValues);
232  QVector4D channelValuesDisplay(0, 0, 0, 0), coordinates(0, 0, 0, 0);
233 
234  for (int i =0; i<m_d->colorChannelCount; i++) {
235  channelValuesDisplay[i] = channelValues[m_d->displayPosition[i]];
236  }
237 
238  if (m_d->exposureSupported) {
239  channelValuesDisplay /= m_d->channelMaxValues;
240  }
241  if (m_d->model != ColorModel::Channel && m_d->isRGBA == true) {
242  if (m_d->isRGBA == true) {
243  if (m_d->applyGamma) {
244  for (int i=0; i<3; i++) {
245  channelValuesDisplay[i] = pow(channelValuesDisplay[i], 1/2.2);
246  }
247  }
248  if (m_d->model == ColorModel::HSV) {
249  QVector3D hsv;
250  RGBToHSV(channelValuesDisplay[0], channelValuesDisplay[1], channelValuesDisplay[2], &hsv[0], &hsv[1], &hsv[2]);
251  hsv[0] /= 360;
252  coordinates = QVector4D(hsv, 0.f);
253  } else if (m_d->model == ColorModel::HSL) {
254  QVector3D hsl;
255  RGBToHSL(channelValuesDisplay[0], channelValuesDisplay[1], channelValuesDisplay[2], &hsl[0], &hsl[1], &hsl[2]);
256  hsl[0] /= 360;
257  coordinates = QVector4D(hsl, 0.f);
258  } else if (m_d->model == ColorModel::HSI) {
259  qreal hsi[3];
260  RGBToHSI(channelValuesDisplay[0], channelValuesDisplay[1], channelValuesDisplay[2], &hsi[0], &hsi[1], &hsi[2]);
261  coordinates = QVector4D(hsi[0], hsi[1], hsi[2], 0.f);
262  } else if (m_d->model == ColorModel::HSY) {
263  if (!m_d->isLinear) {
264  // Note: not all profiles define a TRC necessary for (de-)linearization,
265  // substituting with a linear profiles would be better
266  QVector<qreal> temp({channelValuesDisplay[0], channelValuesDisplay[1], channelValuesDisplay[2]});
267  m_d->currentCS->profile()->linearizeFloatValue(temp);
268  channelValuesDisplay = QVector4D(temp[0], temp[1], temp[2], 0);
269  }
270  qreal hsy[3];
271  RGBToHSY(channelValuesDisplay[0], channelValuesDisplay[1], channelValuesDisplay[2], &hsy[0], &hsy[1], &hsy[2],
272  m_d->lumaRGB[0], m_d->lumaRGB[1], m_d->lumaRGB[2]);
273  hsy[2] = pow(hsy[2], 1/m_d->gamma);
274  coordinates = QVector4D(hsy[0], hsy[1], hsy[2], 0.f);
275  }
276  // if we couldn't determine a hue, keep last value
277  if (coordinates[0] < 0) {
278  coordinates[0] = m_d->channelValues[0];
279  }
280  for (int i=0; i<3; i++) {
281  coordinates[i] = qBound(0.f, coordinates[i], 1.f);
282  }
283  }
284  } else {
285  for (int i=0; i<4; i++) {
286  coordinates[i] = qBound(0.f, channelValuesDisplay[i], 1.f);
287  }
288  }
289  return coordinates;
290 }
291 
292 void KisVisualColorSelector::configurationChanged()
293 {
294  if (m_d->updateTimer) {
295  m_d->updateTimer->start();
296  }
297 }
298 
299 void KisVisualColorSelector::slotDisplayConfigurationChanged()
300 {
301  Q_ASSERT(m_d->displayRenderer);
302 
303  if (m_d->currentCS)
304  {
305  m_d->channelMaxValues = QVector4D(1, 1, 1, 1);
306  QList<KoChannelInfo *> channels = m_d->currentCS->channels();
307  for (int i=0; i<m_d->colorChannelCount; ++i)
308  {
309  m_d->channelMaxValues[i] = m_d->displayRenderer->maxVisibleFloatValue(channels[m_d->displayPosition[i]]);
310  }
311  // need to re-scale our normalized channel values on exposure changes:
312  m_d->channelValues = convertKoColorToShapeCoordinates(m_d->currentcolor);
313  Q_FOREACH (KisVisualColorSelectorShape *shape, m_d->widgetlist) {
314  shape->setChannelValues(m_d->channelValues, true);
315  }
316  if (isHSXModel()) {
317  emit sigHSXChanged(QVector3D(m_d->channelValues));
318  }
319  }
320 }
321 
322 void KisVisualColorSelector::slotRebuildSelectors()
323 {
324  KConfigGroup cfg = KSharedConfig::openConfig()->group("advancedColorSelector");
325  m_d->acs_config = KisColorSelectorConfiguration::fromString(cfg.readEntry("colorSelectorConfiguration", KisColorSelectorConfiguration().toString()));
326 
327  ColorModel oldModel = m_d->model;
328  QList<KoChannelInfo *> channelList = m_d->currentCS->channels();
329  int cCount = 0;
330  Q_FOREACH(const KoChannelInfo *channel, channelList)
331  {
332  if (channel->channelType() != KoChannelInfo::ALPHA)
333  {
334  m_d->displayPosition[cCount] = channel->displayPosition();
335  ++cCount;
336  }
337  }
338  Q_ASSERT_X(cCount < 5, "", "unsupported channel count!");
339  m_d->colorChannelCount = cCount;
340 
341  // TODO: The following is done because the IDs are actually strings. Ideally, in the future, we
342  // refactor everything so that the IDs are actually proper enums or something faster.
343  if (m_d->displayRenderer
344  && (m_d->currentCS->colorDepthId() == Float16BitsColorDepthID
345  || m_d->currentCS->colorDepthId() == Float32BitsColorDepthID
346  || m_d->currentCS->colorDepthId() == Float64BitsColorDepthID)
347  && m_d->currentCS->colorModelId() != LABAColorModelID
348  && m_d->currentCS->colorModelId() != CMYKAColorModelID) {
349  m_d->exposureSupported = true;
350  } else {
351  m_d->exposureSupported = false;
352  }
353  m_d->isRGBA = (m_d->currentCS->colorModelId() == RGBAColorModelID);
354  const KoColorProfile *profile = m_d->currentCS->profile();
355  m_d->isLinear = (profile && profile->isLinear());
356 
357  qDeleteAll(children());
358  m_d->widgetlist.clear();
359  // TODO: Layout only used for monochrome selector currently, but always present
360  QLayout *layout = new QHBoxLayout(this);
361  //recreate all the widgets.
362  m_d->model = KisVisualColorSelector::Channel;
363 
364  if (m_d->currentCS->colorChannelCount() == 1) {
365 
366  KisVisualColorSelectorShape *bar;
367 
368  if (m_d->circular==false) {
369  bar = new KisVisualRectangleSelectorShape(this, KisVisualColorSelectorShape::onedimensional, m_d->currentCS, 0, 0,m_d->displayRenderer, 20);
370  bar->setMaximumWidth(width()*0.1);
371  bar->setMaximumHeight(height());
372  }
373  else {
374  bar = new KisVisualEllipticalSelectorShape(this, KisVisualColorSelectorShape::onedimensional, m_d->currentCS, 0, 0,m_d->displayRenderer, 20, KisVisualEllipticalSelectorShape::borderMirrored);
375  layout->setMargin(0);
376  }
377 
378  connect(bar, SIGNAL(sigCursorMoved(QPointF)), SLOT(slotCursorMoved(QPointF)));
379  layout->addWidget(bar);
380  m_d->widgetlist.append(bar);
381  }
382  else if (m_d->currentCS->colorChannelCount() == 3) {
383  KisVisualColorSelector::ColorModel modelS = KisVisualColorSelector::HSV;
384  int channel1 = 0;
385  int channel2 = 1;
386  int channel3 = 2;
387 
388  switch(m_d->acs_config.subTypeParameter)
389  {
390  case KisColorSelectorConfiguration::H:
391  case KisColorSelectorConfiguration::Hluma:
392  channel1 = 0;
393  break;
394  case KisColorSelectorConfiguration::hsyS:
395  case KisColorSelectorConfiguration::hsiS:
396  case KisColorSelectorConfiguration::hslS:
397  case KisColorSelectorConfiguration::hsvS:
398  channel1 = 1;
399  break;
400  case KisColorSelectorConfiguration::V:
401  case KisColorSelectorConfiguration::L:
402  case KisColorSelectorConfiguration::I:
403  case KisColorSelectorConfiguration::Y:
404  channel1 = 2;
405  break;
406  default:
407  Q_ASSERT_X(false, "", "Invalid acs_config.subTypeParameter");
408  }
409 
410  switch(m_d->acs_config.mainTypeParameter)
411  {
412  case KisColorSelectorConfiguration::hsySH:
413  modelS = KisVisualColorSelector::HSY;
414  channel2 = 0;
415  channel3 = 1;
416  break;
417  case KisColorSelectorConfiguration::hsiSH:
418  modelS = KisVisualColorSelector::HSI;
419  channel2 = 0;
420  channel3 = 1;
421  break;
422  case KisColorSelectorConfiguration::hslSH:
423  modelS = KisVisualColorSelector::HSL;
424  channel2 = 0;
425  channel3 = 1;
426  break;
427  case KisColorSelectorConfiguration::hsvSH:
428  modelS = KisVisualColorSelector::HSV;
429  channel2 = 0;
430  channel3 = 1;
431  break;
432  case KisColorSelectorConfiguration::YH:
433  modelS = KisVisualColorSelector::HSY;
434  channel2 = 0;
435  channel3 = 2;
436  break;
437  case KisColorSelectorConfiguration::LH:
438  modelS = KisVisualColorSelector::HSL;
439  channel2 = 0;
440  channel3 = 2;
441  break;
442  case KisColorSelectorConfiguration::IH:
443  modelS = KisVisualColorSelector::HSL;
444  channel2 = 0;
445  channel3 = 2;
446  break;
447  case KisColorSelectorConfiguration::VH:
448  modelS = KisVisualColorSelector::HSV;
449  channel2 = 0;
450  channel3 = 2;
451  break;
452  case KisColorSelectorConfiguration::SY:
453  modelS = KisVisualColorSelector::HSY;
454  channel2 = 1;
455  channel3 = 2;
456  break;
457  case KisColorSelectorConfiguration::SI:
458  modelS = KisVisualColorSelector::HSI;
459  channel2 = 1;
460  channel3 = 2;
461  break;
462  case KisColorSelectorConfiguration::SL:
463  modelS = KisVisualColorSelector::HSL;
464  channel2 = 1;
465  channel3 = 2;
466  break;
467  case KisColorSelectorConfiguration::SV:
468  case KisColorSelectorConfiguration::SV2:
469  modelS = KisVisualColorSelector::HSV;
470  channel2 = 1;
471  channel3 = 2;
472  break;
473  default:
474  Q_ASSERT_X(false, "", "Invalid acs_config.mainTypeParameter");
475  }
476  if (m_d->acs_config.mainType == KisColorSelectorConfiguration::Triangle) {
477  modelS = KisVisualColorSelector::HSV;
478  //Triangle only really works in HSV mode.
479  }
480 
481  // L*a*b* mimics the HSX selector types, but model is still Channel (until someone implements LCH)
482  if (m_d->isRGBA) {
483  m_d->model = modelS;
484  m_d->gamma = cfg.readEntry("gamma", 2.2);
485  m_d->applyGamma = (m_d->isLinear && modelS != ColorModel::HSY);
486  // Note: only profiles that define colorants will give precise luma coefficients.
487  // Maybe using the explicitly set values of the Advanced Color Selector is better?
488  QVector <qreal> luma = m_d->currentCS->lumaCoefficients();
489  memcpy(m_d->lumaRGB, luma.constData(), 3*sizeof(qreal));
490  }
491 
492  KisVisualColorSelectorShape *bar;
493  if (m_d->acs_config.subType == KisColorSelectorConfiguration::Ring) {
494  bar = new KisVisualEllipticalSelectorShape(this,
495  KisVisualColorSelectorShape::onedimensional,
496  m_d->currentCS, channel1, channel1,
497  m_d->displayRenderer, 20,KisVisualEllipticalSelectorShape::border);
498  }
499  else if (m_d->acs_config.subType == KisColorSelectorConfiguration::Slider && m_d->circular == false) {
500  bar = new KisVisualRectangleSelectorShape(this,
501  KisVisualColorSelectorShape::onedimensional,
502  m_d->currentCS, channel1, channel1,
503  m_d->displayRenderer, 20);
504  }
505  else if (m_d->acs_config.subType == KisColorSelectorConfiguration::Slider && m_d->circular == true) {
506  bar = new KisVisualEllipticalSelectorShape(this,
507  KisVisualColorSelectorShape::onedimensional,
508  m_d->currentCS, channel1, channel1,
509  m_d->displayRenderer, 20, KisVisualEllipticalSelectorShape::borderMirrored);
510  } else {
511  // Accessing bar below would crash since it's not initialized.
512  // Hopefully this can never happen.
513  warnUI << "Invalid subType, cannot initialize KisVisualColorSelectorShape";
514  Q_ASSERT_X(false, "", "Invalid subType, cannot initialize KisVisualColorSelectorShape");
515  return;
516  }
517 
518  m_d->widgetlist.append(bar);
519 
520  KisVisualColorSelectorShape *block;
521  if (m_d->acs_config.mainType == KisColorSelectorConfiguration::Triangle) {
522  block = new KisVisualTriangleSelectorShape(this, KisVisualColorSelectorShape::twodimensional,
523  m_d->currentCS, channel2, channel3,
524  m_d->displayRenderer);
525  }
526  else if (m_d->acs_config.mainType == KisColorSelectorConfiguration::Square) {
527  block = new KisVisualRectangleSelectorShape(this, KisVisualColorSelectorShape::twodimensional,
528  m_d->currentCS, channel2, channel3,
529  m_d->displayRenderer);
530  }
531  else {
532  block = new KisVisualEllipticalSelectorShape(this, KisVisualColorSelectorShape::twodimensional,
533  m_d->currentCS, channel2, channel3,
534  m_d->displayRenderer);
535  }
536 
537  connect(bar, SIGNAL(sigCursorMoved(QPointF)), SLOT(slotCursorMoved(QPointF)));
538  connect(block, SIGNAL(sigCursorMoved(QPointF)), SLOT(slotCursorMoved(QPointF)));
539  m_d->widgetlist.append(block);
540  }
541  else if (m_d->currentCS->colorChannelCount() == 4) {
542  KisVisualRectangleSelectorShape *block = new KisVisualRectangleSelectorShape(this, KisVisualRectangleSelectorShape::twodimensional, m_d->currentCS, 0, 1);
543  KisVisualRectangleSelectorShape *block2 = new KisVisualRectangleSelectorShape(this, KisVisualRectangleSelectorShape::twodimensional, m_d->currentCS, 2, 3);
544  connect(block, SIGNAL(sigCursorMoved(QPointF)), SLOT(slotCursorMoved(QPointF)));
545  connect(block2, SIGNAL(sigCursorMoved(QPointF)), SLOT(slotCursorMoved(QPointF)));
546  m_d->widgetlist.append(block);
547  m_d->widgetlist.append(block2);
548  }
549 
550  // make sure we call "our" resize function
551  KisVisualColorSelector::resizeEvent(0);
552 
553  // finally recalculate channel values and update widgets
554  if (m_d->displayRenderer) {
555  slotDisplayConfigurationChanged();
556  }
557  m_d->channelValues = convertKoColorToShapeCoordinates(m_d->currentcolor);
558  Q_FOREACH (KisVisualColorSelectorShape *shape, m_d->widgetlist) {
559  shape->setChannelValues(m_d->channelValues, true);
560  shape->setAcceptTabletEvents(m_d->acceptTabletEvents);
561  // if this widget is currently visible, new children are hidden by default
562  shape->show();
563  }
564  if (m_d->model != oldModel) {
565  emit sigColorModelChanged();
566  }
567 }
568 
569 void KisVisualColorSelector::setDisplayRenderer (const KoColorDisplayRendererInterface *displayRenderer)
570 {
571  if (m_d->displayRenderer) {
572  m_d->displayRenderer->disconnect(this);
573  }
574  m_d->displayRenderer = displayRenderer;
575  if (m_d->widgetlist.size()>0) {
576  Q_FOREACH (KisVisualColorSelectorShape *shape, m_d->widgetlist) {
577  shape->setDisplayRenderer(displayRenderer);
578  }
579  }
580  connect(m_d->displayRenderer, SIGNAL(displayConfigurationChanged()),
581  SLOT(slotDisplayConfigurationChanged()), Qt::UniqueConnection);
582  slotDisplayConfigurationChanged();
583 }
584 
585 void KisVisualColorSelector::slotCursorMoved(QPointF pos)
586 {
587  const KisVisualColorSelectorShape *shape = qobject_cast<KisVisualColorSelectorShape *>(sender());
588  Q_ASSERT(shape);
589  QVector<int> channels = shape->getChannels();
590  m_d->channelValues[channels.at(0)] = pos.x();
591  if (shape->getDimensions() == KisVisualColorSelectorShape::twodimensional) {
592  m_d->channelValues[channels.at(1)] = pos.y();
593  }
594  KoColor newColor = convertShapeCoordsToKoColor(m_d->channelValues);
595  if (newColor != m_d->currentcolor) {
596  m_d->currentcolor = newColor;
597  emit sigNewColor(m_d->currentcolor);
598  }
599  if (isHSXModel()) {
600  emit sigHSXChanged(QVector3D(m_d->channelValues));
601  }
602  Q_FOREACH (KisVisualColorSelectorShape *widget, m_d->widgetlist) {
603  if (widget != shape){
604  widget->setChannelValues(m_d->channelValues, false);
605  }
606  }
607 }
608 
609 void KisVisualColorSelector::resizeEvent(QResizeEvent *) {
610  int sizeValue = qMin(width(), height());
611  int borderWidth = qMax(sizeValue*0.1, 20.0);
612  QRect newrect(0,0, this->geometry().width(), this->geometry().height());
613  if (!m_d->currentCS) {
614  slotSetColorSpace(m_d->currentcolor.colorSpace());
615  }
616  if (m_d->currentCS->colorChannelCount()==3) {
617  // set border width first, else the resized painting may have happened already, and we'd have to re-render
618  m_d->widgetlist.at(0)->setBorderWidth(borderWidth);
619  if (m_d->acs_config.subType == KisColorSelectorConfiguration::Ring) {
620  m_d->widgetlist.at(0)->resize(sizeValue,sizeValue);
621  }
622  else if (m_d->acs_config.subType == KisColorSelectorConfiguration::Slider && m_d->circular==false) {
623  m_d->widgetlist.at(0)->resize(borderWidth, sizeValue);
624  }
625  else if (m_d->acs_config.subType == KisColorSelectorConfiguration::Slider && m_d->circular==true) {
626  m_d->widgetlist.at(0)->resize(sizeValue,sizeValue);
627  }
628 
629  if (m_d->acs_config.mainType == KisColorSelectorConfiguration::Triangle) {
630  m_d->widgetlist.at(1)->setGeometry(m_d->widgetlist.at(0)->getSpaceForTriangle(newrect));
631  }
632  else if (m_d->acs_config.mainType == KisColorSelectorConfiguration::Square) {
633  m_d->widgetlist.at(1)->setGeometry(m_d->widgetlist.at(0)->getSpaceForSquare(newrect));
634  }
635  else if (m_d->acs_config.mainType == KisColorSelectorConfiguration::Wheel) {
636  m_d->widgetlist.at(1)->setGeometry(m_d->widgetlist.at(0)->getSpaceForCircle(newrect));
637  }
638  }
639  else if (m_d->currentCS->colorChannelCount() == 4) {
640  int sizeBlock = qMin(width()/2 - 8, height());
641  m_d->widgetlist.at(0)->setGeometry(0, 0, sizeBlock, sizeBlock);
642  m_d->widgetlist.at(1)->setGeometry(sizeBlock + 8, 0, sizeBlock, sizeBlock);
643  }
644 }
KisColorSelectorConfiguration::L
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelectorShape::getDimensions
Dimensions getDimensions() const
getDimensions
Definition: KisVisualColorSelectorShape.cpp:345
KisColorSelectorConfiguration::Square
Definition: KisColorSelectorConfiguration.h:18
KisColorSelectorConfiguration::Wheel
Definition: KisColorSelectorConfiguration.h:18
KisColorSelectorConfiguration::Y
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelector::HSI
Definition: KisVisualColorSelector.h:33
KisVisualColorSelector::ColorModel
ColorModel
Definition: KisVisualColorSelector.h:33
KisVisualColorSelector::configurationChanged
void configurationChanged()
Definition: KisVisualColorSelector.cpp:292
QVector4D::setX
void setX(qreal x)
QVector4D::setY
void setY(qreal y)
QVector4D::setZ
void setZ(qreal z)
KisVisualColorSelector::setAcceptTabletEvents
void setAcceptTabletEvents(bool on)
Definition: KisVisualColorSelector.cpp:131
KisVisualColorSelector::setConfig
void setConfig(bool forceCircular, bool forceSelfUpdate) override
setConfig
Definition: KisVisualColorSelector.cpp:125
QVector::fill
QVector< T > & fill(const T &value, int size)
KisVisualColorSelector::convertKoColorToShapeCoordinates
QVector4D convertKoColorToShapeCoordinates(KoColor c) const
Definition: KisVisualColorSelector.cpp:224
QWidget::pos
QPoint pos() const
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QRect
KisColorSelectorConfiguration::Hluma
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::hsyS
Definition: KisColorSelectorConfiguration.h:19
QWidget::layout
QLayout * layout() const
KisVisualColorSelectorShape::onedimensional
Definition: KisVisualColorSelectorShape.h:45
KisVisualColorSelector::slotSetColor
void slotSetColor(const KoColor &c) override
Definition: KisVisualColorSelector.cpp:73
QLayout::setMargin
void setMargin(int margin)
QWidget
KisVisualColorSelector::KisVisualColorSelector
KisVisualColorSelector(QWidget *parent=0)
Definition: KisVisualColorSelector.cpp:56
KisVisualColorSelector::HSY
Definition: KisVisualColorSelector.h:33
QObject::sender
QObject * sender() const
KisVisualColorSelector::HSL
Definition: KisVisualColorSelector.h:33
KisColorSelectorConfiguration::hsiS
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::hsySH
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelector::~KisVisualColorSelector
~KisVisualColorSelector() override
Definition: KisVisualColorSelector.cpp:68
KisVisualColorSelector::isHSXModel
bool isHSXModel() const
Definition: KisVisualColorSelector.cpp:154
QPoint::x
int x() const
QPoint::y
int y() const
KisColorSelectorConfiguration::SL
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::YH
Definition: KisColorSelectorConfiguration.h:19
QList< KisVisualColorSelectorShape * >
QPointF
QVector3D
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KisVisualRectangleSelectorShape.h
KisVisualColorSelector::slotSetColorSpace
void slotSetColorSpace(const KoColorSpace *cs) override
Definition: KisVisualColorSelector.cpp:91
QVector::constData
const T * constData() const
KisColorSelectorConfiguration::IH
Definition: KisColorSelectorConfiguration.h:19
QLayout
KisVisualColorSelector::HSV
Definition: KisVisualColorSelector.h:33
QWidget::setMaximumWidth
void setMaximumWidth(int maxw)
KisVisualTriangleSelectorShape.h
KisColorSelectorConfiguration::hsiSH
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::SY
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelector::sigHSXChanged
void sigHSXChanged(const QVector3D &hsx)
KisColorSelectorConfiguration::hsvSH
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::Ring
Definition: KisColorSelectorConfiguration.h:18
QTest::toString
char * toString(const T &value)
QVector::at
const T & at(int i) const
KisColorSelectorConfiguration::hslSH
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelectorShape.h
KisColorSelectorConfiguration::Slider
Definition: KisColorSelectorConfiguration.h:18
KisVisualEllipticalSelectorShape::borderMirrored
Definition: KisVisualEllipticalSelectorShape.h:15
KisVisualColorSelector::getColorModel
ColorModel getColorModel() const
Definition: KisVisualColorSelector.cpp:149
KisVisualColorSelector::getChannelValues
QVector4D getChannelValues() const
Definition: KisVisualColorSelector.cpp:144
KisVisualTriangleSelectorShape
Definition: KisVisualTriangleSelectorShape.h:11
KisVisualColorSelector.h
KisColorSelectorConfiguration::H
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelector::getCurrentColor
KoColor getCurrentColor() const override
Definition: KisVisualColorSelector.cpp:139
QWidget::setMaximumHeight
void setMaximumHeight(int maxh)
KisColorSelectorConfiguration::SV2
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelectorShape::getChannels
QVector< int > getChannels() const
getChannels get used channels
Definition: KisVisualColorSelectorShape.cpp:364
KisVisualColorSelectorShape::setAcceptTabletEvents
void setAcceptTabletEvents(bool on)
Definition: KisVisualColorSelectorShape.cpp:108
KisVisualEllipticalSelectorShape
Definition: KisVisualEllipticalSelectorShape.h:11
KisVisualColorSelectorShape
The KisVisualColorSelectorShape class A 2d widget can represent at maximum 2 coordinates.
Definition: KisVisualColorSelectorShape.h:37
QWidget::show
void show()
KisVisualEllipticalSelectorShape::border
Definition: KisVisualEllipticalSelectorShape.h:15
KisColorSelectorInterface::sigNewColor
void sigNewColor(const KoColor &c)
KisColorSelectorConfiguration
Definition: KisColorSelectorConfiguration.h:14
QWidget::height
int height() const
KisVisualColorSelector::slotSetHSX
void slotSetHSX(const QVector3D &hsx)
Definition: KisVisualColorSelector.cpp:110
KisVisualColorSelectorShape::setChannelValues
void setChannelValues(QVector4D channelValues, bool setCursor)
setChannelValues Set the current channel values; Note that channel values controlled by the shape its...
Definition: KisVisualColorSelectorShape.cpp:89
KisColorSelectorConfiguration::I
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::V
Definition: KisColorSelectorConfiguration.h:19
QResizeEvent
QLayout::addWidget
void addWidget(QWidget *w)
QHBoxLayout
KisColorSelectorConfiguration::VH
Definition: KisColorSelectorConfiguration.h:19
KisVisualRectangleSelectorShape
Definition: KisVisualRectangleSelectorShape.h:11
KisColorSelectorConfiguration::hsvS
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::Triangle
Definition: KisColorSelectorConfiguration.h:18
KisVisualColorSelector::sigColorModelChanged
void sigColorModelChanged()
sigColorModelChanged is emitted whenever the selector's color model changes.
QWidget::geometry
const QRect & geometry() const
KisColorSelectorConfiguration::LH
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelectorShape::twodimensional
Definition: KisVisualColorSelectorShape.h:45
KisColorSelectorConfiguration::hslS
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorInterface
Definition: KisColorSelectorInterface.h:18
QVector4D
QVector
KisVisualColorSelector::setDisplayRenderer
void setDisplayRenderer(const KoColorDisplayRendererInterface *displayRenderer) override
Definition: KisVisualColorSelector.cpp:569
KisVisualColorSelectorShape::setDisplayRenderer
void setDisplayRenderer(const KoColorDisplayRendererInterface *displayRenderer)
setDisplayRenderer disconnect the old display renderer if needed and connect the new one.
Definition: KisVisualColorSelectorShape.cpp:113
KisVisualColorSelector::resizeEvent
void resizeEvent(QResizeEvent *) override
Definition: KisVisualColorSelector.cpp:609
QWidget::width
int width() const
QVector4D::x
qreal x() const
QVector4D::y
qreal y() const
QVector4D::z
qreal z() const
KisVisualEllipticalSelectorShape.h
KisVisualColorSelector::convertShapeCoordsToKoColor
KoColor convertShapeCoordsToKoColor(const QVector4D &coordinates) const
Definition: KisVisualColorSelector.cpp:159
KisColorSelectorConfiguration::SI
Definition: KisColorSelectorConfiguration.h:19
KisVisualColorSelector::Channel
Definition: KisVisualColorSelector.h:33
KisColorSelectorConfiguration::SV
Definition: KisColorSelectorConfiguration.h:19
KisColorSelectorConfiguration::fromString
static KisColorSelectorConfiguration fromString(QString string)
Definition: KisColorSelectorConfiguration.h:63
QObject::children
const QObjectList & children() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sat Jan 23 2021 11:48:22 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KritaWidgets

Skip menu "KritaWidgets"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal