• 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
KoSliderCombo.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2  SPDX-FileCopyrightText: 2007 C. Boemann <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 #include "KoSliderCombo.h"
7 #include "KoSliderCombo_p.h"
8 
9 #include <QTimer>
10 #include <QApplication>
11 #include <QSize>
12 #include <QSlider>
13 #include <QStyle>
14 #include <QStylePainter>
15 #include <QStyleOptionSlider>
16 #include <QLineEdit>
17 #include <QValidator>
18 #include <QHBoxLayout>
19 #include <QFrame>
20 #include <QMenu>
21 #include <QMouseEvent>
22 #include <QDoubleSpinBox>
23 #include <QDesktopWidget>
24 
25 
26 #include <klocalizedstring.h>
27 #include <WidgetsDebug.h>
28 
29 KoSliderCombo::KoSliderCombo(QWidget *parent)
30  : QComboBox(parent)
31  ,d(new KoSliderComboPrivate())
32 {
33  d->thePublic = this;
34  d->minimum = 0.0;
35  d->maximum = 100.0;
36  d->decimals = 2;
37  d->container = new KoSliderComboContainer(this);
38  d->container->setAttribute(Qt::WA_WindowPropagation);
39  QStyleOptionComboBox opt;
40  opt.initFrom(this);
41 // d->container->setFrameStyle(style()->styleHint(QStyle::SH_ComboBox_PopupFrameStyle, &opt, this));
42 
43  d->slider = new QSlider(Qt::Horizontal);
44  d->slider->setMinimum(0);
45  d->slider->setMaximum(256);
46  d->slider->setPageStep(10);
47  d->slider->setValue(0);
48  // When set to true, causes flicker on Qt 4.6. Any reason to keep it?
49  d->firstShowOfSlider = false; //true;
50 
51  QHBoxLayout *layout = new QHBoxLayout(d->container);
52  layout->setMargin(2);
53  layout->setSpacing(2);
54  layout->addWidget(d->slider);
55  d->container->resize(200, 30);
56 
57  setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
58 
59  setEditable(true);
60  setEditText(QLocale().toString(0.0, d->decimals));
61 
62  connect(d->slider, SIGNAL(valueChanged(int)), SLOT(sliderValueChanged(int)));
63  connect(d->slider, SIGNAL(sliderReleased()), SLOT(sliderReleased()));
64  connect(lineEdit(), SIGNAL(editingFinished()), SLOT(lineEditFinished()));
65 }
66 
67 KoSliderCombo::~KoSliderCombo()
68 {
69  delete d;
70 }
71 
72 QSize KoSliderCombo::sizeHint() const
73 {
74  return minimumSizeHint();
75 }
76 
77 QSize KoSliderCombo::minimumSizeHint() const
78 {
79  QSize sh;
80 
81  const QFontMetrics &fm = fontMetrics();
82 #if QT_VERSION >= QT_VERSION_CHECK(5,11,0)
83  sh.setWidth(5 * fm.horizontalAdvance(QLatin1Char('8')));
84 #else
85  sh.setWidth(5 * fm.width(QLatin1Char('8')));
86 #endif
87  sh.setHeight(qMax(fm.lineSpacing(), 14) + 2);
88 
89  // add style and strut values
90  QStyleOptionComboBox opt;
91  opt.initFrom(this);
92  opt.subControls = QStyle::SC_All;
93  opt.editable = true;
94  sh = style()->sizeFromContents(QStyle::CT_ComboBox, &opt, sh, this);
95 
96  return sh;
97 }
98 
99 void KoSliderCombo::KoSliderComboPrivate::showPopup()
100 {
101  if(firstShowOfSlider) {
102  container->show(); //show container a bit early so the slider can be layout'ed
103  firstShowOfSlider = false;
104  }
105 
106  QStyleOptionSlider opt;
107  opt.initFrom(slider);
108  opt.maximum=256;
109  opt.sliderPosition = opt.sliderValue = slider->value();
110  int hdlPos = thePublic->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle).center().x();
111 
112  QStyleOptionComboBox optThis;
113  optThis.initFrom(thePublic);
114  optThis.subControls = QStyle::SC_All;
115  optThis.editable = true;
116  int arrowPos = thePublic->style()->subControlRect(QStyle::CC_ComboBox, &optThis, QStyle::SC_ComboBoxArrow).center().x();
117 
118  QSize popSize = container->size();
119  QRect popupRect(thePublic->mapToGlobal(QPoint(arrowPos - hdlPos - slider->x(), thePublic->size().height())), popSize);
120 
121  // Make sure the popup is not drawn outside the screen area
122  QRect screenRect = QApplication::desktop()->availableGeometry(thePublic);
123  if (popupRect.right() > screenRect.right())
124  popupRect.translate(screenRect.right() - popupRect.right(), 0);
125  if (popupRect.left() < screenRect.left())
126  popupRect.translate(screenRect.left() - popupRect.left(), 0);
127  if (popupRect.bottom() > screenRect.bottom())
128  popupRect.translate(0, -(thePublic->height() + container->height()));
129 
130  container->setGeometry(popupRect);
131  container->raise();
132  container->show();
133  slider->setFocus();
134 }
135 
136 void KoSliderCombo::KoSliderComboPrivate::hidePopup()
137 {
138  container->hide();
139 }
140 
141 void KoSliderCombo::hideEvent(QHideEvent *)
142 {
143  d->hidePopup();
144 }
145 
146 void KoSliderCombo::changeEvent(QEvent *e)
147 {
148  switch (e->type())
149  {
150  case QEvent::EnabledChange:
151  if (!isEnabled())
152  d->hidePopup();
153  break;
154  case QEvent::PaletteChange:
155  d->container->setPalette(palette());
156  break;
157  default:
158  break;
159  }
160  QComboBox::changeEvent(e);
161 }
162 
163 void KoSliderCombo::paintEvent(QPaintEvent *)
164 {
165  QStylePainter gc(this);
166 
167  gc.setPen(palette().color(QPalette::Text));
168 
169  QStyleOptionComboBox opt;
170  opt.initFrom(this);
171  opt.subControls = QStyle::SC_All;
172  opt.editable = true;
173  gc.drawComplexControl(QStyle::CC_ComboBox, opt);
174  gc.drawControl(QStyle::CE_ComboBoxLabel, opt);
175 }
176 
177 void KoSliderCombo::mousePressEvent(QMouseEvent *e)
178 {
179  QStyleOptionComboBox opt;
180  opt.initFrom(this);
181  opt.subControls = QStyle::SC_All;
182  opt.editable = true;
183  QStyle::SubControl sc = style()->hitTestComplexControl(QStyle::CC_ComboBox, &opt, e->pos(),
184  this);
185  if (sc == QStyle::SC_ComboBoxArrow && !d->container->isVisible())
186  {
187  d->showPopup();
188  }
189  else
190  QComboBox::mousePressEvent(e);
191 }
192 
193 void KoSliderCombo::keyPressEvent(QKeyEvent *e)
194 {
195  if (e->key() == Qt::Key_Up) setValue(value() + d->slider->singleStep() * (maximum() - minimum()) / 256 + 0.5);
196  else if (e->key() == Qt::Key_Down) setValue(value() - d->slider->singleStep() * (maximum() - minimum()) / 256 - 0.5);
197  else QComboBox::keyPressEvent(e);
198 }
199 
200 void KoSliderCombo::wheelEvent(QWheelEvent *e)
201 {
202  if (e->delta() > 0) setValue(value() + d->slider->singleStep() * (maximum() - minimum()) / 256 + 0.5);
203  else setValue(value() - d->slider->singleStep() * (maximum() - minimum()) / 256 - 0.5);
204 }
205 
206 void KoSliderCombo::KoSliderComboPrivate::lineEditFinished()
207 {
208  qreal value = QLocale().toDouble(thePublic->currentText());
209  slider->blockSignals(true);
210  slider->setValue(int((value - minimum) * 256 / (maximum - minimum) + 0.5));
211  slider->blockSignals(false);
212  emit thePublic->valueChanged(value, true);
213 }
214 
215 void KoSliderCombo::KoSliderComboPrivate::sliderValueChanged(int slidervalue)
216 {
217  thePublic->setEditText(QLocale().toString(minimum + (maximum - minimum)*slidervalue/256, decimals));
218 
219  qreal value = QLocale().toDouble(thePublic->currentText());
220  emit thePublic->valueChanged(value, false);
221 }
222 
223 void KoSliderCombo::KoSliderComboPrivate::sliderReleased()
224 {
225  qreal value = QLocale().toDouble(thePublic->currentText());
226  emit thePublic->valueChanged(value, true);
227 }
228 
229 qreal KoSliderCombo::maximum() const
230 {
231  return d->maximum;
232 }
233 
234 qreal KoSliderCombo::minimum() const
235 {
236  return d->minimum;
237 }
238 
239 qreal KoSliderCombo::decimals() const
240 {
241  return d->decimals;
242 }
243 
244 qreal KoSliderCombo::value() const
245 {
246  return QLocale().toDouble(currentText());
247 }
248 
249 void KoSliderCombo::setDecimals(int dec)
250 {
251  d->decimals = dec;
252  if (dec == 0) lineEdit()->setValidator(new QIntValidator(this));
253  else lineEdit()->setValidator(new QDoubleValidator(this));
254 }
255 
256 void KoSliderCombo::setMinimum(qreal min)
257 {
258  d->minimum = min;
259 }
260 
261 void KoSliderCombo::setMaximum(qreal max)
262 {
263  d->maximum = max;
264 }
265 
266 void KoSliderCombo::setValue(qreal value)
267 {
268  if(value < d->minimum)
269  value = d->minimum;
270  if(value > d->maximum)
271  value = d->maximum;
272  setEditText(QLocale().toString(value, d->decimals));
273  d->slider->blockSignals(true);
274  d->slider->setValue(int((value - d->minimum) * 256 / (d->maximum - d->minimum) + 0.5));
275  d->slider->blockSignals(false);
276  emit valueChanged(value, true);
277 }
278 
279 //have to include this because of Q_PRIVATE_SLOT
280 #include <moc_KoSliderCombo.cpp>
QWheelEvent
QComboBox::lineEdit
QLineEdit * lineEdit() const
KoSliderCombo::minimumSizeHint
QSize minimumSizeHint() const override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:77
QIntValidator
QMouseEvent::pos
const QPoint & pos() const
QComboBox::currentText
QString currentText() const
KoSliderComboPrivate
KoSliderCombo::sliderValueChanged
void sliderValueChanged(int value)
QPainter::setPen
void setPen(const QColor &color)
QLineEdit::setValidator
void setValidator(const QValidator *v)
QApplication::desktop
QDesktopWidget * desktop()
QWidget::fontMetrics
QFontMetrics fontMetrics() const
KoSliderCombo_p.h
QComboBox::keyPressEvent
virtual void keyPressEvent(QKeyEvent *e)
KoSliderCombo::sliderReleased
void sliderReleased()
QWidget::palette
const QPalette & palette() const
QDoubleValidator
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QRect
QLocale::toDouble
double toDouble(const QString &s, bool *ok) const
QWidget::layout
QLayout * layout() const
QLayout::setMargin
void setMargin(int margin)
QWidget
KoSliderCombo::valueChanged
void valueChanged(qreal value, bool final)
Emitted every time the value changes (by calling setValue() or by user interaction).
KoSliderCombo::~KoSliderCombo
~KoSliderCombo() override
Destructor.
Definition: KoSliderCombo.cpp:67
QSize
KoSliderCombo::minimum
qreal minimum() const
The minimum value that can be entered.
QStyleOption::initFrom
void initFrom(const QWidget *widget)
QStylePainter::drawControl
void drawControl(QStyle::ControlElement ce, const QStyleOption &option)
KoSliderComboContainer
Definition: KoSliderCombo_p.h:30
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QMouseEvent
QLocale
QSize::setWidth
void setWidth(int width)
KoSliderCombo::wheelEvent
void wheelEvent(QWheelEvent *e) override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:200
QComboBox::changeEvent
virtual void changeEvent(QEvent *e)
QComboBox::setEditText
void setEditText(const QString &text)
QStyleOptionSlider
KoSliderCombo::setDecimals
void setDecimals(int number)
Sets the precision of the entered values.
Definition: KoSliderCombo.cpp:249
QComboBox
QFontMetrics::lineSpacing
int lineSpacing() const
QWidget::style
QStyle * style() const
KoSliderCombo::setValue
void setValue(qreal value)
Sets the value.
Definition: KoSliderCombo.cpp:266
KoSliderCombo::value
qreal value() const
The value shown.
Definition: KoSliderCombo.cpp:244
KoSliderCombo::maximum
qreal maximum() const
The maximum value that can be entered.
QTest::toString
char * toString(const T &value)
QComboBox::mousePressEvent
virtual void mousePressEvent(QMouseEvent *e)
QSlider
QFontMetrics
QStyle::hitTestComplexControl
virtual SubControl hitTestComplexControl(ComplexControl control, const QStyleOptionComplex *option, const QPoint &position, const QWidget *widget) const=0
KoSliderCombo::sizeHint
QSize sizeHint() const override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:72
QStylePainter
KoSliderCombo::setMinimum
void setMinimum(qreal min)
Sets the minimum value that can be entered.
Definition: KoSliderCombo.cpp:256
KoSliderCombo.h
QHideEvent
KoSliderCombo::lineEditFinished
void lineEditFinished()
KoSliderCombo::hideEvent
void hideEvent(QHideEvent *) override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:141
KoSliderCombo::paintEvent
void paintEvent(QPaintEvent *) override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:163
KoSliderCombo::decimals
qreal decimals() const
The precision of values given as the number of digits after the period.
QWidget::isEnabled
bool isEnabled() const
KoSliderCombo::KoSliderCombo
KoSliderCombo(QWidget *parent=0)
Constructor for the widget, where value is set to 0.
Definition: KoSliderCombo.cpp:29
QStyle::sizeFromContents
virtual QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const=0
QDesktopWidget::availableGeometry
const QRect availableGeometry(int screen) const
KoSliderCombo::mousePressEvent
void mousePressEvent(QMouseEvent *e) override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:177
QComboBox::setEditable
void setEditable(bool editable)
KoSliderCombo::changeEvent
void changeEvent(QEvent *e) override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:146
QKeyEvent::key
int key() const
QLatin1Char
QEvent::type
Type type() const
QEvent
QLayout::addWidget
void addWidget(QWidget *w)
QHBoxLayout
QPaintEvent
WidgetsDebug.h
QWheelEvent::delta
int delta() const
QStylePainter::drawComplexControl
void drawComplexControl(QStyle::ComplexControl cc, const QStyleOptionComplex &option)
QLayout::setSpacing
void setSpacing(int)
QRect::translate
void translate(int dx, int dy)
KoSliderCombo::setMaximum
void setMaximum(qreal max)
Sets the maximum value that can be entered.
Definition: KoSliderCombo.cpp:261
QKeyEvent
KoSliderCombo::keyPressEvent
void keyPressEvent(QKeyEvent *e) override
reimplemented from QComboBox
Definition: KoSliderCombo.cpp:193
QFontMetrics::width
int width(const QString &text, int len) const
QSize::setHeight
void setHeight(int height)
QPoint
QStyleOptionComboBox
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sat Jan 23 2021 11:48:23 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