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)
 
void setValuePt (double value, bool overWriteExpression=false)
 Sets the value in points.
 
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
70 connect(d->unitManager, (void (KisSpinBoxUnitManager::*)()) &KisSpinBoxUnitManager::unitAboutToChange, this, (void (KisDoubleParseUnitSpinBox::*)()) &KisDoubleParseUnitSpinBox::prepareUnitChange);
71 connect(d->unitManager, (void (KisSpinBoxUnitManager::*)( QString )) &KisSpinBoxUnitManager::unitChanged, this, (void (KisDoubleParseUnitSpinBox::*)( QString const& )) &KisDoubleParseUnitSpinBox::internalUnitChange);
72
73 setDecimals(d->unitManager->getApparentUnitRecommendedDecimals());
74}
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 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 481 of file kis_double_parse_unit_spin_box.cpp.

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

389{
390 QString str = veryCleanText().trimmed(); //text with the new unit but not the old one.
391
392 QRegularExpression regexp ("([ ]*[a-zA-Z]+[ ]*)$"); // Letters or spaces at end
393 int res = str.indexOf( regexp );
394
395 if (res > -1) {
396 QString expr ( str.right( str.size() - res ) );
397 expr = expr.trimmed();
398 return expr;
399 }
400
401 return "";
402}
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 404 of file kis_double_parse_unit_spin_box.cpp.

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

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

◆ disconnectExternalUnitManager

void KisDoubleParseUnitSpinBox::disconnectExternalUnitManager ( )
privateslot

Definition at line 452 of file kis_double_parse_unit_spin_box.cpp.

453{
454 // Internal disconnectExternalUnitManager() method is called when the current unit manager d->unitManager
455 // has been destroyed
456 // --> ensure the d->unitManager does not point to anything anymore
457 d->unitManager = 0;
458
459 if (!d->isDeleting)
460 {
461 setUnitManager(d->defaultUnitManager); //go back to default unit manager.
462 }
463}
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 434 of file kis_double_parse_unit_spin_box.cpp.

435{
436 QString expr = txt;
437 QString symbol = d->unitManager->getApparentUnitSymbol();
438
439 if ( expr.endsWith(suffix()) ) {
440 expr.remove(expr.size()-suffix().size(), suffix().size());
441 }
442
443 expr = expr.trimmed();
444
445 if ( expr.endsWith(symbol) ) {
446 expr.remove(expr.size()-symbol.size(), symbol.size());
447 }
448
449 return expr.trimmed();
450}
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 378 of file kis_double_parse_unit_spin_box.cpp.

379{
380 d->allowResetDecimals = !prevent;
381}

References d.

◆ Private()

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

◆ privateValueChanged

void KisDoubleParseUnitSpinBox::privateValueChanged ( )
privateslot

Definition at line 383 of file kis_double_parse_unit_spin_box.cpp.

384{
385 Q_EMIT valueChangedPt( value() );
386}
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 465 of file kis_double_parse_unit_spin_box.cpp.

466{
467 KisDoubleParseSpinBox::setDecimals(prec);
468 d->minStepForPrec = 1/qPow(10, prec);
469
470 // fix current single step value is needed
471 setSingleStep(singleStep());
472}

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 373 of file kis_double_parse_unit_spin_box.cpp.

374{
375 d->displayUnit = toggle;
376}

References d.

◆ setLineStep()

void KisDoubleParseUnitSpinBox::setLineStep ( double step)

Set step size in the current unit.

Definition at line 313 of file kis_double_parse_unit_spin_box.cpp.

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

References d.

◆ setLineStepPt()

void KisDoubleParseUnitSpinBox::setLineStepPt ( double step)

Set step size in points.

Definition at line 319 of file kis_double_parse_unit_spin_box.cpp.

320{
321 d->stepInPoints = step;
322 KisDoubleParseSpinBox::setSingleStep( d->unitManager->getApparentValue( step ) );
323}

References d.

◆ setMaximum()

void KisDoubleParseUnitSpinBox::setMaximum ( double max)

Set maximum value in current unit.

Definition at line 301 of file kis_double_parse_unit_spin_box.cpp.

302{
303 d->upperInPoints = d->unitManager->getReferenceValue(max);
304 KisDoubleParseSpinBox::setMaximum( max );
305}

References d.

◆ setMaximumPt()

void KisDoubleParseUnitSpinBox::setMaximumPt ( double max)

Set maximum value in points.

Definition at line 307 of file kis_double_parse_unit_spin_box.cpp.

308{
309 d->upperInPoints = max;
310 KisDoubleParseSpinBox::setMaximum( d->unitManager->getApparentValue( max ) );
311}
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 288 of file kis_double_parse_unit_spin_box.cpp.

289{
290 d->lowerInPoints = d->unitManager->getReferenceValue(min);
291 KisDoubleParseSpinBox::setMinimum( min );
292}

References d.

◆ setMinimumPt()

void KisDoubleParseUnitSpinBox::setMinimumPt ( double min)

Set minimum value in points.

Definition at line 294 of file kis_double_parse_unit_spin_box.cpp.

295{
296 d->lowerInPoints = min;
297 KisDoubleParseSpinBox::setMinimum( d->unitManager->getApparentValue( min ) );
298}
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 325 of file kis_double_parse_unit_spin_box.cpp.

326{
327 setMinimum( min );
328 setMaximum( max );
329 setLineStep( step );
330}
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 332 of file kis_double_parse_unit_spin_box.cpp.

333{
334 setMinimumPt( min );
335 setMaximumPt( max );
336 setLineStepPt( step );
337}
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 474 of file kis_double_parse_unit_spin_box.cpp.

475{
476 // ensure step value is never below minimal value for precision
477 KisDoubleParseSpinBox::setSingleStep(qMax(d->minStepForPrec, val));
478}

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 368 of file kis_double_parse_unit_spin_box.cpp.

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

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 d, disconnectExternalUnitManager(), KisSpinBoxUnitManager::getApparentUnitSymbol(), KisSpinBoxUnitManager::getReferenceValue(), KisSpinBoxUnitManager::getUnitDimensionType(), internalUnitChange(), KoUnit::Pixel, prepareUnitChange(), setDecimals(), KisDoubleParseSpinBox::setValue(), KisSpinBoxUnitManager::unitAboutToChange(), KisSpinBoxUnitManager::unitChanged(), unitManager, and void().

◆ setValuePt()

void KisDoubleParseUnitSpinBox::setValuePt ( double value,
bool overWriteExpression = false )

Sets the value in points.

Definition at line 283 of file kis_double_parse_unit_spin_box.cpp.

284{
285 KisDoubleParseSpinBox::setValue(d->unitManager->getApparentValue(value), overwriteExpression);
286}

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

◆ 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 340 of file kis_double_parse_unit_spin_box.cpp.

341{
342 // Just return the current value (for example when the user is editing)
343 if (d->mustUsePreviousText) {
344 return cleanText();
345 }
346 // Construct a new value
348 if (d->displayUnit) {
349 if (!txt.endsWith(d->unitManager->getApparentUnitSymbol())) {
350 txt += " " + d->unitManager->getApparentUnitSymbol();
351 }
352 }
353 return txt;
354}
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 361 of file kis_double_parse_unit_spin_box.cpp.

362{
363 QString txt = makeTextClean(str);
364 //this function will take care of prefix (and don't mind if suffix has been removed.
366}
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 356 of file kis_double_parse_unit_spin_box.cpp.

357{
358 return makeTextClean(cleanText());
359}

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 141 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: