Krita Source Code Documentation
Loading...
Searching...
No Matches
KisDoubleParseUnitSpinBox Class Reference

The KisDoubleParseUnitSpinBox class is an evolution of the. More...

#include <kis_double_parse_unit_spin_box.h>

+ Inheritance diagram for KisDoubleParseUnitSpinBox:

Signals

void valueChangedPt (qreal)
 emitted like valueChanged in the parent, but this one emits the point value, or converted to another reference unit.
 
- Signals inherited from KisDoubleParseSpinBox
void errorWhileParsing (const QString &expr) const
 signal emitted when the last parsed expression is not valid.
 
void noMoreParsingError () const
 signal emitted when the last parsed expression is valid and the expression before was not valid.
 

Public Member Functions

virtual void changeValue (double newValue)
 
void changeValuePt (double newValue)
 
 KisDoubleParseUnitSpinBox (QWidget *parent=0)
 
void preventDecimalsChangeFromUnitManager (bool prevent)
 
 Private (double low, double up, double step, KisSpinBoxUnitManager *unitManager)
 
QString returnUnit () const
 returnUnit returns the unit in which values are returned
 
void setDecimals (int prec)
 
virtual void setDimensionType (int dim)
 setDimensionType set the dimension (for example length or angle) of the units the spinbox manage
 
void setDisplayUnit (bool toggle)
 display the unit symbol in the spinbox or not. For example if the unit is displayed in a combobox connected to the unit manager.
 
void setLineStep (double step)
 Set step size in the current unit.
 
void setLineStepPt (double step)
 Set step size in points.
 
void setMaximum (double max)
 Set maximum value in current unit.
 
void setMaximumPt (double max)
 Set maximum value in points.
 
void setMinimum (double min)
 Set minimum value in current unit.
 
void setMinimumPt (double min)
 Set minimum value in points.
 
void setMinMaxStep (double min, double max, double step)
 Set minimum, maximum value and the step size (in current unit)
 
void setMinMaxStepPt (double min, double max, double step)
 Set minimum, maximum value and the step size (all in points)
 
void setReturnUnit (const QString &symbol)
 setReturnUnit set a unit, such that the spinbox now return values in this unit instead of the reference unit for the current dimension.
 
void setSingleStep (double val)
 
virtual void setUnit (const KoUnit &unit)
 
virtual void setUnit (const QString &symbol)
 
void setUnitChangeFromOutsideBehavior (bool toggle)
 
void setUnitManager (KisSpinBoxUnitManager *unitManager)
 
QString textFromValue (double value) const override
 
double value () const
 
double valueFromText (const QString &str) const override
 
double valuePt () const
 
QString veryCleanText () const override
 get the text in the spinbox without prefix or suffix, and remove unit symbol if present.
 
 ~KisDoubleParseUnitSpinBox () override
 
- Public Member Functions inherited from KisDoubleParseSpinBox
bool isLastValid () const
 Get if the last expression entered is a valid one.
 
 KisDoubleParseSpinBox (QWidget *parent=0)
 
void setValue (double value, bool overwriteExpression=false)
 Set the value of the spinbox.
 
void stepBy (int steps) override
 This is a reimplementation of QDoubleSpinBox::stepBy that uses setValue.
 
 ~KisDoubleParseSpinBox () override
 

Public Attributes

bool allowResetDecimals {true}
 
KisSpinBoxUnitManagerdefaultUnitManager {0}
 
bool displayUnit {true}
 
bool isDeleting {false}
 
bool letUnitBeChangedFromOutsideMoreThanOnce {true}
 
double lowerInPoints {0.0}
 minimum precision for given decimals
 
double minStepForPrec {0}
 
bool mustUsePreviousText {false}
 
QString outPutSymbol
 
QString previousSymbol
 
double previousValueInPoint {0.0}
 allow to store the previous value in point, useful in some cases, even if, usually, we prefer to refer to the actual value (in selected unit) and convert it, since this is not always updated.
 
double stepInPoints {0.0}
 step in points
 
KoUnit unit
 
bool unitHasBeenChangedFromOutSideOnce {false}
 
KisSpinBoxUnitManagerunitManager {0}
 
double upperInPoints {0.0}
 highest value in points
 

Private Slots

void detectUnitChanges ()
 
void disconnectExternalUnitManager ()
 
void privateValueChanged ()
 

Private Member Functions

void contextMenuEvent (QContextMenuEvent *event) override
 
QString detectUnit ()
 
void internalUnitChange (QString const &symbol)
 change the unit, reset the spin box every time. From the outside it's always set unit that should be called.
 
QString makeTextClean (QString const &txt) const
 
void prepareUnitChange ()
 
- Private Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Private Attributes

Private *const d
 
- Private Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Additional Inherited Members

- Protected Member Functions inherited from KisDoubleParseSpinBox
QString textFromValue (double value) const override
 
QValidator::State validate (QString &input, int &pos) const override
 
double valueFromText (const QString &text) const override
 

Detailed Description

The KisDoubleParseUnitSpinBox class is an evolution of the.

See also
KoUnitDoubleSpinBox, but inherit from
KisDoubleParseSpinBox to be able to parse math expressions.

This class store the

Definition at line 20 of file kis_double_parse_unit_spin_box.cpp.

Constructor & Destructor Documentation

◆ KisDoubleParseUnitSpinBox()

KisDoubleParseUnitSpinBox::KisDoubleParseUnitSpinBox ( QWidget * parent = 0)

Definition at line 59 of file kis_double_parse_unit_spin_box.cpp.

59 :
62{
64 setAlignment( Qt::AlignRight );
65
66 connect(this, SIGNAL(valueChanged(double)), this, SLOT(privateValueChanged()));
67 connect(lineEdit(), SIGNAL(textChanged(QString)),
68 this, SLOT(detectUnitChanges()) );
69
71 connect(d->unitManager, (void (KisSpinBoxUnitManager::*)( QString )) &KisSpinBoxUnitManager::unitChanged, this, (void (KisDoubleParseUnitSpinBox::*)( QString const& )) &KisDoubleParseUnitSpinBox::internalUnitChange);
72
73 setDecimals(d->unitManager->getApparentUnitRecommendedDecimals());
74}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisDoubleParseSpinBox(QWidget *parent=0)
The KisDoubleParseUnitSpinBox class is an evolution of the.
void internalUnitChange(QString const &symbol)
change the unit, reset the spin box every time. From the outside it's always set unit that should be ...
virtual void setUnit(const KoUnit &unit)
static KisSpinBoxUnitManager * buildDefaultUnitManager(QObject *parent)
The KisSpinBoxUnitManager class is an abstract interface for the unitspinboxes classes to manage diff...
@ Point
Postscript point, 1/72th of an Inco.
Definition KoUnit.h:76
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)

References connect(), d, detectUnitChanges(), internalUnitChange(), KoUnit::Point, prepareUnitChange(), privateValueChanged(), setDecimals(), setUnit(), KisSpinBoxUnitManager::unitAboutToChange(), KisSpinBoxUnitManager::unitChanged(), and void().

◆ ~KisDoubleParseUnitSpinBox()

KisDoubleParseUnitSpinBox::~KisDoubleParseUnitSpinBox ( )
override

Definition at line 76 of file kis_double_parse_unit_spin_box.cpp.

77{
78 d->isDeleting = true;
79 delete d->defaultUnitManager;
80 delete d;
81}

References d.

Member Function Documentation

◆ changeValue()

void KisDoubleParseUnitSpinBox::changeValue ( double newValue)
virtual

Set the new value in points (or other reference unit) which will then be converted to the current unit for display

Parameters
newValuethe new value
See also
value()

Definition at line 155 of file kis_double_parse_unit_spin_box.cpp.

156{
157 double apparentValue;
158 double fact = 0.0;
159 double cons = 0.0;
160
161 if (d->outPutSymbol.isEmpty()) {
162 apparentValue = d->unitManager->getApparentValue(newValue);
163 } else {
164
165 fact = d->unitManager->getConversionFactor(d->unitManager->getUnitDimensionType(), d->outPutSymbol);
166 cons = d->unitManager->getConversionConstant(d->unitManager->getUnitDimensionType(), d->outPutSymbol);
167
168 apparentValue = fact*newValue + cons;
169 }
170
171 if (apparentValue == KisDoubleParseSpinBox::value()) {
172 return;
173 }
174
175 if (d->outPutSymbol.isEmpty()) {
176 KisDoubleParseSpinBox::setValue( apparentValue );
177 } else {
178 KisDoubleParseSpinBox::setValue( d->unitManager->getApparentValue((newValue - cons)/fact) );
179 }
180}
void setValue(double value, bool overwriteExpression=false)
Set the value of the spinbox.

References d, and KisDoubleParseSpinBox::setValue().

◆ changeValuePt()

void KisDoubleParseUnitSpinBox::changeValuePt ( double newValue)

Set the new value in points whatever is the reference unit for display

Parameters
newValuethe new value
See also
valuePt()

Definition at line 182 of file kis_double_parse_unit_spin_box.cpp.

183{
184 double apparentValue = d->unitManager->getApparentValue(newValue);
185
186 if (apparentValue == KisDoubleParseSpinBox::value()) {
187 return;
188 }
189 KisDoubleParseSpinBox::setValue( apparentValue );
190}

References d, and KisDoubleParseSpinBox::setValue().

◆ contextMenuEvent()

void KisDoubleParseUnitSpinBox::contextMenuEvent ( QContextMenuEvent * event)
overrideprivate

Definition at line 476 of file kis_double_parse_unit_spin_box.cpp.

477{
478 // default standard menu for line edit, not possible to get the default menu from a QSpinBox
479 QMenu* menu = lineEdit()->createStandardContextMenu();
480 if (!menu)
481 return;
482
483 // then need to recreate "Step Up" and "Step Down" actions
484 menu->addSeparator();
485 const uint se = stepEnabled();
486 QAction *up = menu->addAction(tr("&Step up"));
487 up->setEnabled(se & StepUpEnabled);
488 QAction *down = menu->addAction(tr("Step &down"));
489 down->setEnabled(se & StepDownEnabled);
490 menu->addSeparator();
491
492 // and add expected new entries: menu/submenu with Units
493 QMenu* menuUnit = menu->addMenu(i18n("Unit"));
494 QActionGroup* unitActions = new QActionGroup(this);
495 Q_FOREACH(QString unitSymbol, d->unitManager->getsUnitSymbolList(false)) {
496 QString unitLabel = KoUnit::unitDescription(KoUnit::fromSymbol(unitSymbol).type());
497
498 // need to check symbol not managed by KoUnit (return "Points (pt)" in this case...)
499 switch (d->unitManager->getUnitDimensionType()) {
502 if (unitSymbol == "%") {
503 unitLabel = i18n("Percent (%)");
504 } else if (unitSymbol == "vw") {
505 unitLabel = i18n("percent of view width (vw)");
506 } else if (unitSymbol == "vh") {
507 unitLabel = i18n("percent of view height (vh)");
508 }
509 break;
510
512 if (unitSymbol == "°") {
513 unitLabel = i18n("degrees (°)");
514 } else if (unitSymbol == "rad") {
515 unitLabel = i18n("radians (rad)");
516 } else if (unitSymbol == "gon") {
517 unitLabel = i18n("gons (gon)");
518 } else if (unitSymbol == "%") {
519 unitLabel = i18n("percent of circle (%)");
520 }
521 break;
522
524 if (unitSymbol == "f") {
525 unitLabel = i18n("frames (f)");
526 } else if (unitSymbol == "s") {
527 unitLabel = i18n("seconds (s)");
528 } else if (unitSymbol == "%") {
529 unitLabel = i18n("percent of animation (%)");
530 }
531 break;
532 }
533
534 QAction *unitAction = menuUnit->addAction(unitLabel);
535 unitAction->setProperty("symbol", unitSymbol);
536 unitAction->setCheckable(true);
537 unitAction->setActionGroup(unitActions);
538 unitAction->setChecked(unitSymbol == d->unitManager->getApparentUnitSymbol());
539 }
540
541 const QPoint pos = (event->reason() == QContextMenuEvent::Mouse)
542 ? event->globalPos() : mapToGlobal(QPoint(event->pos().x(), 0)) + QPoint(width() / 2, height() / 2);
543 const QAction *action = menu->exec(pos);
544
545 if (action) {
546 if (action == up) {
547 stepBy(1);
548 } else if (action == down) {
549 stepBy(-1);
550 } else {
551 QVariant symbol = action->property("symbol");
552 if (symbol.isValid()) {
553 d->unitManager->setApparentUnitFromSymbol(symbol.toString());
554 }
555 }
556 }
557
558 delete static_cast<QMenu *>(menuUnit);
559 delete static_cast<QMenu *>(menu);
560 event->accept();
561}
unsigned int uint
void stepBy(int steps) override
This is a reimplementation of QDoubleSpinBox::stepBy that uses setValue.
static QString unitDescription(KoUnit::Type type)
Get the description string of the given unit.
Definition KoUnit.cpp:32
static KoUnit fromSymbol(const QString &symbol, bool *ok=0)
Definition KoUnit.cpp:271
QAction * up(const QObject *recvr, const char *slot, QObject *parent)

References KisSpinBoxUnitManager::ANGLE, d, KoUnit::fromSymbol(), KisSpinBoxUnitManager::IMLENGTH, KisSpinBoxUnitManager::LENGTH, KisDoubleParseSpinBox::stepBy(), KisSpinBoxUnitManager::TIME, and KoUnit::unitDescription().

◆ detectUnit()

QString KisDoubleParseUnitSpinBox::detectUnit ( )
private

Definition at line 383 of file kis_double_parse_unit_spin_box.cpp.

384{
385 QString str = veryCleanText().trimmed(); //text with the new unit but not the old one.
386
387 QRegularExpression regexp ("([ ]*[a-zA-Z]+[ ]*)$"); // Letters or spaces at end
388 int res = str.indexOf( regexp );
389
390 if (res > -1) {
391 QString expr ( str.right( str.size() - res ) );
392 expr = expr.trimmed();
393 return expr;
394 }
395
396 return "";
397}
QString veryCleanText() const override
get the text in the spinbox without prefix or suffix, and remove unit symbol if present.

References veryCleanText().

◆ detectUnitChanges

void KisDoubleParseUnitSpinBox::detectUnitChanges ( )
privateslot

Definition at line 399 of file kis_double_parse_unit_spin_box.cpp.

400{
401 QString unitSymb = detectUnit();
402
403 if (unitSymb.isEmpty()) {
404 return;
405 }
406
407 QString oldUnitSymb = d->unitManager->getApparentUnitSymbol();
408
409 setUnit(unitSymb);
410 // Quick hack
411 // This function is called when the user changed the text and the call to
412 // setValue will provoke a call to textFromValue which will return a new
413 // text different from the current one. Since the following setValue is
414 // called because of a user change, we use a flag to prevent the text from
415 // changing
416 d->mustUsePreviousText = true;
417 // Change value keep the old value, but converted to new unit... which is
418 // different from the value the user entered in the new unit. So we need
419 // to set the new value.
420 setValue(valueFromText(cleanText()));
421 d->mustUsePreviousText = false;
422
423 if (oldUnitSymb != d->unitManager->getApparentUnitSymbol()) {
424 // the user has changed the unit, so we block changes from outside.
426 }
427}
double valueFromText(const QString &str) const override

References d, detectUnit(), setUnit(), setUnitChangeFromOutsideBehavior(), KisDoubleParseSpinBox::setValue(), and valueFromText().

◆ disconnectExternalUnitManager

void KisDoubleParseUnitSpinBox::disconnectExternalUnitManager ( )
privateslot

Definition at line 447 of file kis_double_parse_unit_spin_box.cpp.

448{
449 // Internal disconnectExternalUnitManager() method is called when the current unit manager d->unitManager
450 // has been destroyed
451 // --> ensure the d->unitManager does not point to anything anymore
452 d->unitManager = 0;
453
454 if (!d->isDeleting)
455 {
456 setUnitManager(d->defaultUnitManager); //go back to default unit manager.
457 }
458}
void setUnitManager(KisSpinBoxUnitManager *unitManager)

References d, and setUnitManager().

◆ internalUnitChange()

void KisDoubleParseUnitSpinBox::internalUnitChange ( QString const & symbol)
private

change the unit, reset the spin box every time. From the outside it's always set unit that should be called.

Definition at line 228 of file kis_double_parse_unit_spin_box.cpp.

228 {
229 //d->unitManager->setApparentUnitFromSymbol(symbol);
230
231 if (d->unitManager->getApparentUnitSymbol() == d->previousSymbol) { //the setApparentUnitFromSymbol is a bit clever, for example in regard of Casesensitivity. So better check like this.
232 return;
233 }
234
235 // decimals must be updated before value/step/min/max otherwise they'll rounded with previous unit decimal value
236 if (d->allowResetDecimals) {
237 setDecimals(d->unitManager->getApparentUnitRecommendedDecimals());
238 }
239
240 KisDoubleParseSpinBox::setMinimum( d->unitManager->getApparentValue( d->lowerInPoints ) );
241 KisDoubleParseSpinBox::setMaximum( d->unitManager->getApparentValue( d->upperInPoints ) );
242
243 qreal step = d->unitManager->getApparentValue( d->stepInPoints );
244
245 if (symbol == KoUnit(KoUnit::Pixel).symbol()) {
246 // limit the pixel step by 1.0
247 step = 1.0;
248 }
249
250 setSingleStep( step );
251 KisDoubleParseSpinBox::setValue( d->unitManager->getApparentValue( d->previousValueInPoint ) );
252
253 d->unitHasBeenChangedFromOutSideOnce = true;
254}
@ Pixel
Definition KoUnit.h:82

References d, KoUnit::Pixel, setDecimals(), setSingleStep(), and KisDoubleParseSpinBox::setValue().

◆ makeTextClean()

QString KisDoubleParseUnitSpinBox::makeTextClean ( QString const & txt) const
private

Definition at line 429 of file kis_double_parse_unit_spin_box.cpp.

430{
431 QString expr = txt;
432 QString symbol = d->unitManager->getApparentUnitSymbol();
433
434 if ( expr.endsWith(suffix()) ) {
435 expr.remove(expr.size()-suffix().size(), suffix().size());
436 }
437
438 expr = expr.trimmed();
439
440 if ( expr.endsWith(symbol) ) {
441 expr.remove(expr.size()-symbol.size(), symbol.size());
442 }
443
444 return expr.trimmed();
445}
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References d.

◆ prepareUnitChange()

void KisDoubleParseUnitSpinBox::prepareUnitChange ( )
private

Definition at line 222 of file kis_double_parse_unit_spin_box.cpp.

222 {
223
224 d->previousValueInPoint = d->unitManager->getReferenceValue(KisDoubleParseSpinBox::value());
225 d->previousSymbol = d->unitManager->getApparentUnitSymbol();
226}

References d.

◆ preventDecimalsChangeFromUnitManager()

void KisDoubleParseUnitSpinBox::preventDecimalsChangeFromUnitManager ( bool prevent)

Definition at line 373 of file kis_double_parse_unit_spin_box.cpp.

374{
375 d->allowResetDecimals = !prevent;
376}

References d.

◆ Private()

KisDoubleParseUnitSpinBox::Private ( double low,
double up,
double step,
KisSpinBoxUnitManager * unitManager )
inline

◆ privateValueChanged

void KisDoubleParseUnitSpinBox::privateValueChanged ( )
privateslot

Definition at line 378 of file kis_double_parse_unit_spin_box.cpp.

379{
380 Q_EMIT valueChangedPt( value() );
381}
void valueChangedPt(qreal)
emitted like valueChanged in the parent, but this one emits the point value, or converted to another ...

References value(), and valueChangedPt().

◆ returnUnit()

QString KisDoubleParseUnitSpinBox::returnUnit ( ) const

returnUnit returns the unit in which values are returned

See also
returnUnit()

Definition at line 217 of file kis_double_parse_unit_spin_box.cpp.

218{
219 return d->outPutSymbol;
220}

References d.

◆ setDecimals()

void KisDoubleParseUnitSpinBox::setDecimals ( int prec)

Definition at line 460 of file kis_double_parse_unit_spin_box.cpp.

461{
462 KisDoubleParseSpinBox::setDecimals(prec);
463 d->minStepForPrec = 1/qPow(10, prec);
464
465 // fix current single step value is needed
466 setSingleStep(singleStep());
467}

References d, and setSingleStep().

◆ setDimensionType()

void KisDoubleParseUnitSpinBox::setDimensionType ( int dim)
virtual

setDimensionType set the dimension (for example length or angle) of the units the spinbox manage

Parameters
dimthe dimension id. (if not an id in KisSpinBoxUnitManager::UnitDimension, then the function does nothing).

Definition at line 256 of file kis_double_parse_unit_spin_box.cpp.

257{
259 return;
260 }
261
262 d->unitManager->setUnitDimension((KisSpinBoxUnitManager::UnitDimension) dim);
263}
static bool isUnitId(int code)

References d, and KisSpinBoxUnitManager::isUnitId().

◆ setDisplayUnit()

void KisDoubleParseUnitSpinBox::setDisplayUnit ( bool toggle)

display the unit symbol in the spinbox or not. For example if the unit is displayed in a combobox connected to the unit manager.

Definition at line 368 of file kis_double_parse_unit_spin_box.cpp.

369{
370 d->displayUnit = toggle;
371}

References d.

◆ setLineStep()

void KisDoubleParseUnitSpinBox::setLineStep ( double step)

Set step size in the current unit.

Definition at line 308 of file kis_double_parse_unit_spin_box.cpp.

309{
310 d->stepInPoints = d->unitManager->getReferenceValue(step);
311 KisDoubleParseSpinBox::setSingleStep( step );
312}

References d.

◆ setLineStepPt()

void KisDoubleParseUnitSpinBox::setLineStepPt ( double step)

Set step size in points.

Definition at line 314 of file kis_double_parse_unit_spin_box.cpp.

315{
316 d->stepInPoints = step;
317 KisDoubleParseSpinBox::setSingleStep( d->unitManager->getApparentValue( step ) );
318}

References d.

◆ setMaximum()

void KisDoubleParseUnitSpinBox::setMaximum ( double max)

Set maximum value in current unit.

Definition at line 296 of file kis_double_parse_unit_spin_box.cpp.

297{
298 d->upperInPoints = d->unitManager->getReferenceValue(max);
299 KisDoubleParseSpinBox::setMaximum( max );
300}

References d.

◆ setMaximumPt()

void KisDoubleParseUnitSpinBox::setMaximumPt ( double max)

Set maximum value in points.

Definition at line 302 of file kis_double_parse_unit_spin_box.cpp.

303{
304 d->upperInPoints = max;
305 KisDoubleParseSpinBox::setMaximum( d->unitManager->getApparentValue( max ) );
306}
constexpr std::enable_if< sizeof...(values)==0, size_t >::type max()

References d.

◆ setMinimum()

void KisDoubleParseUnitSpinBox::setMinimum ( double min)

Set minimum value in current unit.

Definition at line 283 of file kis_double_parse_unit_spin_box.cpp.

284{
285 d->lowerInPoints = d->unitManager->getReferenceValue(min);
286 KisDoubleParseSpinBox::setMinimum( min );
287}

References d.

◆ setMinimumPt()

void KisDoubleParseUnitSpinBox::setMinimumPt ( double min)

Set minimum value in points.

Definition at line 289 of file kis_double_parse_unit_spin_box.cpp.

290{
291 d->lowerInPoints = min;
292 KisDoubleParseSpinBox::setMinimum( d->unitManager->getApparentValue( min ) );
293}
T min(T a, T b, T c)

References d.

◆ setMinMaxStep()

void KisDoubleParseUnitSpinBox::setMinMaxStep ( double min,
double max,
double step )

Set minimum, maximum value and the step size (in current unit)

Definition at line 320 of file kis_double_parse_unit_spin_box.cpp.

321{
322 setMinimum( min );
323 setMaximum( max );
324 setLineStep( step );
325}
void setLineStep(double step)
Set step size in the current unit.
void setMaximum(double max)
Set maximum value in current unit.
void setMinimum(double min)
Set minimum value in current unit.

References setLineStep(), setMaximum(), and setMinimum().

◆ setMinMaxStepPt()

void KisDoubleParseUnitSpinBox::setMinMaxStepPt ( double min,
double max,
double step )

Set minimum, maximum value and the step size (all in points)

Definition at line 327 of file kis_double_parse_unit_spin_box.cpp.

328{
329 setMinimumPt( min );
330 setMaximumPt( max );
331 setLineStepPt( step );
332}
void setMinimumPt(double min)
Set minimum value in points.
void setLineStepPt(double step)
Set step size in points.
void setMaximumPt(double max)
Set maximum value in points.

References setLineStepPt(), setMaximumPt(), and setMinimumPt().

◆ setReturnUnit()

void KisDoubleParseUnitSpinBox::setReturnUnit ( const QString & symbol)

setReturnUnit set a unit, such that the spinbox now return values in this unit instead of the reference unit for the current dimension.

Parameters
symbolthe symbol of the new unit.
See also
returnUnit()

Definition at line 212 of file kis_double_parse_unit_spin_box.cpp.

213{
214 d->outPutSymbol = symbol;
215}

References d.

◆ setSingleStep()

void KisDoubleParseUnitSpinBox::setSingleStep ( double val)

Definition at line 469 of file kis_double_parse_unit_spin_box.cpp.

470{
471 // ensure step value is never below minimal value for precision
472 KisDoubleParseSpinBox::setSingleStep(qMax(d->minStepForPrec, val));
473}

References d.

◆ setUnit() [1/2]

void KisDoubleParseUnitSpinBox::setUnit ( const KoUnit & unit)
virtual

This spinbox shows the internal value after a conversion to the unit set here.

Definition at line 193 of file kis_double_parse_unit_spin_box.cpp.

194{
195 if (d->unitHasBeenChangedFromOutSideOnce && !d->letUnitBeChangedFromOutsideMoreThanOnce) {
196 return;
197 }
198
199 if (d->unitManager->getUnitDimensionType() != KisSpinBoxUnitManager::LENGTH) {
200 d->unitManager->setUnitDimension(KisSpinBoxUnitManager::LENGTH); //setting the unit using a KoUnit mean you want to use a length.
201 }
202
204 d->unit = unit;
205}
QString symbol() const
Get the symbol string of the unit.
Definition KoUnit.cpp:347

References d, KisSpinBoxUnitManager::LENGTH, setUnit(), KoUnit::symbol(), and unit.

◆ setUnit() [2/2]

void KisDoubleParseUnitSpinBox::setUnit ( const QString & symbol)
virtual

Definition at line 207 of file kis_double_parse_unit_spin_box.cpp.

208{
209 d->unitManager->setApparentUnitFromSymbol(symbol); //via signals and slots, the correct functions should be called.
210}

References d.

◆ setUnitChangeFromOutsideBehavior()

void KisDoubleParseUnitSpinBox::setUnitChangeFromOutsideBehavior ( bool toggle)

Definition at line 363 of file kis_double_parse_unit_spin_box.cpp.

364{
365 d->letUnitBeChangedFromOutsideMoreThanOnce = toggle;
366}

References d.

◆ setUnitManager()

void KisDoubleParseUnitSpinBox::setUnitManager ( KisSpinBoxUnitManager * unitManager)

Definition at line 83 of file kis_double_parse_unit_spin_box.cpp.

84{
85 if (unitManager == d->unitManager) {
86 // just in case we're trying to set manager with the current one...
87 return;
88 }
89
90 KisSpinBoxUnitManager* oldUnitManager = 0;
91
92 if (d->unitManager) {
93 // current unit manager is still here (then setUnitManager not call because it has been destroyed)
94 //
95 oldUnitManager = d->unitManager;
96
97 disconnect(oldUnitManager, &QObject::destroyed,
98 this, &KisDoubleParseUnitSpinBox::disconnectExternalUnitManager); //there's no dependence anymore.
99 disconnect(oldUnitManager, (void (KisSpinBoxUnitManager::*)()) &KisSpinBoxUnitManager::unitAboutToChange,
101 disconnect(oldUnitManager, (void (KisSpinBoxUnitManager::*)( QString )) &KisSpinBoxUnitManager::unitChanged,
103 }
104
105 d->unitManager = unitManager;
106
107
108 // decimals must be set before value, otherwise value/step/min/max values will be rounded to previous unit decimals value
109 if (d->allowResetDecimals) { //if the user has not fixed the number of decimals.
110 setDecimals(d->unitManager->getApparentUnitRecommendedDecimals());
111 }
112
113 qreal newVal = 0.0;
114
115 double newMin;
116 double newMax;
117 double newStep;
118
119 if (oldUnitManager == 0 ||
120 (oldUnitManager &&
121 (d->unitManager->getApparentUnitSymbol() != oldUnitManager->getApparentUnitSymbol() ||
122 d->unitManager->getUnitDimensionType() == oldUnitManager->getUnitDimensionType()))) {
123
124 if (oldUnitManager && d->unitManager->getUnitDimensionType() == oldUnitManager->getUnitDimensionType()) {
125 //dimension is the same, calculate the new value
126 newVal = d->unitManager->getApparentValue(oldUnitManager->getReferenceValue(KisDoubleParseSpinBox::value()));
127 } else {
128 newVal = d->unitManager->getApparentValue(d->lowerInPoints);
129 }
130
131 newMin = d->unitManager->getApparentValue(d->lowerInPoints);
132 newMax = d->unitManager->getApparentValue(d->upperInPoints);
133 newStep = d->unitManager->getApparentValue(d->stepInPoints);
134
135 if (d->unitManager->getApparentUnitSymbol() == KoUnit(KoUnit::Pixel).symbol()) {
136 // limit the pixel step by 1.0
137 newStep = 1.0;
138 }
139
140 KisDoubleParseSpinBox::setMinimum(newMin);
141 KisDoubleParseSpinBox::setMaximum(newMax);
142 KisDoubleParseSpinBox::setSingleStep(newStep);
143 }
144
145 connect(d->unitManager, &QObject::destroyed,
147 connect(d->unitManager, (void (KisSpinBoxUnitManager::*)()) &KisSpinBoxUnitManager::unitAboutToChange,
149 connect(d->unitManager, (void (KisSpinBoxUnitManager::*)( QString )) &KisSpinBoxUnitManager::unitChanged,
151
153}
qreal getReferenceValue(double apparentValue) const

References connect(), d, disconnectExternalUnitManager(), KisSpinBoxUnitManager::getApparentUnitSymbol(), KisSpinBoxUnitManager::getReferenceValue(), KisSpinBoxUnitManager::getUnitDimensionType(), internalUnitChange(), KoUnit::Pixel, prepareUnitChange(), setDecimals(), KisDoubleParseSpinBox::setValue(), KisSpinBoxUnitManager::unitAboutToChange(), KisSpinBoxUnitManager::unitChanged(), unitManager, and void().

◆ textFromValue()

QString KisDoubleParseUnitSpinBox::textFromValue ( double value) const
override

Transform the double in a nice text, using locale symbols

Parameters
valuethe number as double
Returns
the resulting string

Definition at line 335 of file kis_double_parse_unit_spin_box.cpp.

336{
337 // Just return the current value (for example when the user is editing)
338 if (d->mustUsePreviousText) {
339 return cleanText();
340 }
341 // Construct a new value
343 if (d->displayUnit) {
344 if (!txt.endsWith(d->unitManager->getApparentUnitSymbol())) {
345 txt += " " + d->unitManager->getApparentUnitSymbol();
346 }
347 }
348 return txt;
349}
QString textFromValue(double value) const override

References d, KisDoubleParseSpinBox::textFromValue(), and value().

◆ value()

double KisDoubleParseUnitSpinBox::value ( ) const
Returns
the current value, converted in "return unit"

Definition at line 265 of file kis_double_parse_unit_spin_box.cpp.

266{
267 if (d->outPutSymbol.isEmpty()) {
268 return d->unitManager->getReferenceValue( KisDoubleParseSpinBox::value() );
269 }
270
271 double ref = d->unitManager->getReferenceValue( KisDoubleParseSpinBox::value() );
272 double fact = d->unitManager->getConversionFactor(d->unitManager->getUnitDimensionType(), d->outPutSymbol);
273 double cons = d->unitManager->getConversionConstant(d->unitManager->getUnitDimensionType(), d->outPutSymbol);
274
275 return fact*ref + cons;
276}

References d.

◆ valueChangedPt

void KisDoubleParseUnitSpinBox::valueChangedPt ( qreal )
signal

emitted like valueChanged in the parent, but this one emits the point value, or converted to another reference unit.

◆ valueFromText()

double KisDoubleParseUnitSpinBox::valueFromText ( const QString & str) const
override

Transform a string into a double, while taking care of locale specific symbols.

Parameters
strthe string to transform into a number
Returns
the value as double

Definition at line 356 of file kis_double_parse_unit_spin_box.cpp.

357{
358 QString txt = makeTextClean(str);
359 //this function will take care of prefix (and don't mind if suffix has been removed.
361}
double valueFromText(const QString &text) const override
QString makeTextClean(QString const &txt) const

References makeTextClean(), and KisDoubleParseSpinBox::valueFromText().

◆ valuePt()

double KisDoubleParseUnitSpinBox::valuePt ( ) const
Returns
the current value as Point, whatever is "return unit"

Definition at line 278 of file kis_double_parse_unit_spin_box.cpp.

279{
280 return d->unitManager->getReferenceValue( KisDoubleParseSpinBox::value() );
281}

References d.

◆ veryCleanText()

QString KisDoubleParseUnitSpinBox::veryCleanText ( ) const
overridevirtual

get the text in the spinbox without prefix or suffix, and remove unit symbol if present.

Reimplemented from KisDoubleParseSpinBox.

Definition at line 351 of file kis_double_parse_unit_spin_box.cpp.

352{
353 return makeTextClean(cleanText());
354}

References makeTextClean().

Member Data Documentation

◆ allowResetDecimals

bool KisDoubleParseUnitSpinBox::allowResetDecimals {true}

Definition at line 54 of file kis_double_parse_unit_spin_box.cpp.

54{true};

◆ d

Private* const KisDoubleParseUnitSpinBox::d
private

Definition at line 138 of file kis_double_parse_unit_spin_box.h.

◆ defaultUnitManager

KisSpinBoxUnitManager* KisDoubleParseUnitSpinBox::defaultUnitManager {0}

Definition at line 45 of file kis_double_parse_unit_spin_box.cpp.

45{0}; //the default unit manager is the one the spinbox rely on and go back to if a connected unit manager is destroyed before the spinbox.

◆ displayUnit

bool KisDoubleParseUnitSpinBox::displayUnit {true}

Definition at line 52 of file kis_double_parse_unit_spin_box.cpp.

52{true};

◆ isDeleting

bool KisDoubleParseUnitSpinBox::isDeleting {false}

Definition at line 47 of file kis_double_parse_unit_spin_box.cpp.

47{false};

◆ letUnitBeChangedFromOutsideMoreThanOnce

bool KisDoubleParseUnitSpinBox::letUnitBeChangedFromOutsideMoreThanOnce {true}

Definition at line 50 of file kis_double_parse_unit_spin_box.cpp.

50{true};

◆ lowerInPoints

double KisDoubleParseUnitSpinBox::lowerInPoints {0.0}

minimum precision for given decimals

lowest value in points

Definition at line 35 of file kis_double_parse_unit_spin_box.cpp.

35{0.0};

◆ minStepForPrec

double KisDoubleParseUnitSpinBox::minStepForPrec {0}

Definition at line 34 of file kis_double_parse_unit_spin_box.cpp.

34{0};

◆ mustUsePreviousText

bool KisDoubleParseUnitSpinBox::mustUsePreviousText {false}

Definition at line 56 of file kis_double_parse_unit_spin_box.cpp.

56{false};

◆ outPutSymbol

QString KisDoubleParseUnitSpinBox::outPutSymbol

Definition at line 42 of file kis_double_parse_unit_spin_box.cpp.

◆ previousSymbol

QString KisDoubleParseUnitSpinBox::previousSymbol

Definition at line 41 of file kis_double_parse_unit_spin_box.cpp.

◆ previousValueInPoint

double KisDoubleParseUnitSpinBox::previousValueInPoint {0.0}

allow to store the previous value in point, useful in some cases, even if, usually, we prefer to refer to the actual value (in selected unit) and convert it, since this is not always updated.

Definition at line 40 of file kis_double_parse_unit_spin_box.cpp.

40{0.0};

◆ stepInPoints

double KisDoubleParseUnitSpinBox::stepInPoints {0.0}

step in points

Definition at line 37 of file kis_double_parse_unit_spin_box.cpp.

37{0.0};

◆ unit

KoUnit KisDoubleParseUnitSpinBox::unit

Definition at line 38 of file kis_double_parse_unit_spin_box.cpp.

◆ unitHasBeenChangedFromOutSideOnce

bool KisDoubleParseUnitSpinBox::unitHasBeenChangedFromOutSideOnce {false}

Definition at line 49 of file kis_double_parse_unit_spin_box.cpp.

49{false}; //in some part of the code the unit is reset. We want to prevent this overriding the unit defined by the user. We use this switch to do so.

◆ unitManager

KisSpinBoxUnitManager* KisDoubleParseUnitSpinBox::unitManager {0}

Definition at line 44 of file kis_double_parse_unit_spin_box.cpp.

44{0}; //manage more units than permitted by KoUnit.

◆ upperInPoints

double KisDoubleParseUnitSpinBox::upperInPoints {0.0}

highest value in points

Definition at line 36 of file kis_double_parse_unit_spin_box.cpp.

36{0.0};

The documentation for this class was generated from the following files: