diff --git a/libs/ui/KisApplication.cpp b/libs/ui/KisApplication.cpp --- a/libs/ui/KisApplication.cpp +++ b/libs/ui/KisApplication.cpp @@ -85,6 +85,8 @@ #include #include "kis_image_barrier_locker.h" #include "opengl/kis_opengl.h" +#include "kis_spin_box_unit_manager.h" +#include "kis_document_aware_spin_box_unit_manager.h" #include namespace { @@ -399,6 +401,11 @@ setSplashScreenLoadingText(""); // done loading, so clear out label + //configure the unit manager + KisSpinBoxUnitManagerFactory::setDefaultUnitManagerBuilder(new KisDocumentAwareSpinBoxUnitManagerBuilder()); + connect(this, &KisApplication::aboutToQuit, &KisSpinBoxUnitManagerFactory::clearUnitManagerBuilder); //ensure the builder is destroyed when the application leave. + //the new syntax slot syntax allow to connect to a non q_object static method. + // Get the command line arguments which we have to parse int argsCount = args.filenames().count(); if (argsCount > 0) { diff --git a/libs/ui/utils/kis_document_aware_spin_box_unit_manager.h b/libs/ui/utils/kis_document_aware_spin_box_unit_manager.h --- a/libs/ui/utils/kis_document_aware_spin_box_unit_manager.h +++ b/libs/ui/utils/kis_document_aware_spin_box_unit_manager.h @@ -23,7 +23,10 @@ #include "kis_double_parse_unit_spin_box.h" #include "kritaui_export.h" - +class KisDocumentAwareSpinBoxUnitManagerBuilder : public KisSpinBoxUnitManagerBuilder +{ + KisSpinBoxUnitManager* buildUnitManager(QObject* parent); +}; class KRITAUI_EXPORT KisDocumentAwareSpinBoxUnitManager : public KisSpinBoxUnitManager { diff --git a/libs/ui/utils/kis_document_aware_spin_box_unit_manager.cpp b/libs/ui/utils/kis_document_aware_spin_box_unit_manager.cpp --- a/libs/ui/utils/kis_document_aware_spin_box_unit_manager.cpp +++ b/libs/ui/utils/kis_document_aware_spin_box_unit_manager.cpp @@ -28,6 +28,11 @@ #include "kis_time_range.h" +KisSpinBoxUnitManager* KisDocumentAwareSpinBoxUnitManagerBuilder::buildUnitManager(QObject* parent) +{ + return new KisDocumentAwareSpinBoxUnitManager(parent); +} + void KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(KisDoubleParseUnitSpinBox* spinBox, bool setUnitFromOutsideToggle) { KisDocumentAwareSpinBoxUnitManager* manager = new KisDocumentAwareSpinBoxUnitManager(spinBox); diff --git a/libs/widgets/kis_double_parse_unit_spin_box.cpp b/libs/widgets/kis_double_parse_unit_spin_box.cpp --- a/libs/widgets/kis_double_parse_unit_spin_box.cpp +++ b/libs/widgets/kis_double_parse_unit_spin_box.cpp @@ -24,12 +24,12 @@ class Q_DECL_HIDDEN KisDoubleParseUnitSpinBox::Private { public: - Private(double low, double up, double step) + Private(double low, double up, double step, KisSpinBoxUnitManager* unitManager) : lowerInPoints(low), upperInPoints(up), stepInPoints(step), unit(KoUnit(KoUnit::Point)), - unitManager(new KisSpinBoxUnitManager()), + unitManager(unitManager), defaultUnitManager(unitManager), isDeleting(false), unitHasBeenChangedFromOutSideOnce(false), @@ -54,7 +54,7 @@ KisDoubleParseUnitSpinBox::KisDoubleParseUnitSpinBox(QWidget *parent) : KisDoubleParseSpinBox(parent), - d(new Private(-9999, 9999, 1)) + d(new Private(-9999, 9999, 1, KisSpinBoxUnitManagerFactory::buildDefaultUnitManager(this))) { setUnit( KoUnit(KoUnit::Point) ); setAlignment( Qt::AlignRight ); @@ -64,6 +64,8 @@ this, SLOT(detectUnitChanges()) ); + + } KisDoubleParseUnitSpinBox::~KisDoubleParseUnitSpinBox() @@ -317,8 +319,15 @@ return; } + QString oldUnitSymb = d->unitManager->getApparentUnitSymbol(); + setUnit(unitSymb); setValue(valueFromText(cleanText())); //change value keep the old value, but converted to new unit... which is different from the value the user entered in the new unit. So we need to set the new value. + + if (oldUnitSymb != d->unitManager->getApparentUnitSymbol()) { + // the user has changed the unit, so we block changes from outside. + setUnitChangeFromOutsideBehavior(false); + } } QString KisDoubleParseUnitSpinBox::makeTextClean(QString const& txt) const diff --git a/libs/widgetutils/kis_spin_box_unit_manager.h b/libs/widgetutils/kis_spin_box_unit_manager.h --- a/libs/widgetutils/kis_spin_box_unit_manager.h +++ b/libs/widgetutils/kis_spin_box_unit_manager.h @@ -24,6 +24,32 @@ #include "kritawidgetutils_export.h" +class KisSpinBoxUnitManager; +class KisSpinBoxUnitManagerBuilder; +class KisSpinBoxUnitManagerFactory; + +class KRITAWIDGETUTILS_EXPORT KisSpinBoxUnitManagerFactory +{ +public: + + static KisSpinBoxUnitManager* buildDefaultUnitManager(QObject* parent); + //! \brief set a builder the factory can use. The factory should take on the lifecycle of the builder, so to delete it call clearUnitManagerBuilder(); + static void setDefaultUnitManagerBuilder(KisSpinBoxUnitManagerBuilder* pBuilder); + static void clearUnitManagerBuilder(); + +private: + + static KisSpinBoxUnitManagerBuilder* builder; + +}; + +class KRITAWIDGETUTILS_EXPORT KisSpinBoxUnitManagerBuilder +{ + +public: + + virtual KisSpinBoxUnitManager* buildUnitManager(QObject* parent) = 0; //this pure virtual function is used to build a unitmanager, it will be used by the unitManagerFactory. +}; /** * @brief The KisSpinBoxUnitManager class is an abstract interface for the unitspinboxes classes to manage different type of units. diff --git a/libs/widgetutils/kis_spin_box_unit_manager.cpp b/libs/widgetutils/kis_spin_box_unit_manager.cpp --- a/libs/widgetutils/kis_spin_box_unit_manager.cpp +++ b/libs/widgetutils/kis_spin_box_unit_manager.cpp @@ -23,6 +23,36 @@ #include + +KisSpinBoxUnitManagerBuilder* KisSpinBoxUnitManagerFactory::builder = nullptr; + +KisSpinBoxUnitManager* KisSpinBoxUnitManagerFactory::buildDefaultUnitManager(QObject* parent) +{ + if (builder == nullptr) { + return new KisSpinBoxUnitManager(parent); + } + + return builder->buildUnitManager(parent); +} + +void KisSpinBoxUnitManagerFactory::setDefaultUnitManagerBuilder(KisSpinBoxUnitManagerBuilder* pBuilder) +{ + if (builder != nullptr) { + delete builder; //The factory took over the lifecycle of the builder, so it delete it when replaced. + } + + builder = pBuilder; +} + +void KisSpinBoxUnitManagerFactory::clearUnitManagerBuilder() +{ + if (builder != nullptr) { + delete builder; //The factory took over the lifecycle of the builder, so it delete it when replaced. + } + + builder = nullptr; +} + const QStringList KisSpinBoxUnitManager::referenceUnitSymbols = {"pt", "°", "frame"}; const QStringList KisSpinBoxUnitManager::documentRelativeLengthUnitSymbols = {"px", "vw", "vh"}; //px are relative to the resolution, vw and vh to the width and height. diff --git a/plugins/flake/pathshapes/rectangle/RectangleShapeConfigWidget.cpp b/plugins/flake/pathshapes/rectangle/RectangleShapeConfigWidget.cpp --- a/plugins/flake/pathshapes/rectangle/RectangleShapeConfigWidget.cpp +++ b/plugins/flake/pathshapes/rectangle/RectangleShapeConfigWidget.cpp @@ -27,9 +27,6 @@ { widget.setupUi(this); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(widget.cornerRadiusX); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(widget.cornerRadiusY); - connect(widget.cornerRadiusX, SIGNAL(editingFinished()), this, SIGNAL(propertyChanged())); connect(widget.cornerRadiusY, SIGNAL(editingFinished()), this, SIGNAL(propertyChanged())); } diff --git a/plugins/flake/pathshapes/star/StarShapeConfigWidget.cpp b/plugins/flake/pathshapes/star/StarShapeConfigWidget.cpp --- a/plugins/flake/pathshapes/star/StarShapeConfigWidget.cpp +++ b/plugins/flake/pathshapes/star/StarShapeConfigWidget.cpp @@ -27,9 +27,6 @@ { widget.setupUi(this); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(widget.innerRadius); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(widget.outerRadius); - connect(widget.corners, SIGNAL(valueChanged(int)), this, SIGNAL(propertyChanged())); connect(widget.innerRadius, SIGNAL(editingFinished()), this, SIGNAL(propertyChanged())); connect(widget.outerRadius, SIGNAL(editingFinished()), this, SIGNAL(propertyChanged())); diff --git a/plugins/tools/defaulttool/defaulttool/DefaultToolTransformWidget.cpp b/plugins/tools/defaulttool/defaulttool/DefaultToolTransformWidget.cpp --- a/plugins/tools/defaulttool/defaulttool/DefaultToolTransformWidget.cpp +++ b/plugins/tools/defaulttool/defaulttool/DefaultToolTransformWidget.cpp @@ -52,9 +52,6 @@ setUnit(m_tool->canvas()->unit()); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(shearXSpinBox); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(shearYSpinBox); - connect(m_tool->canvas()->resourceManager(), SIGNAL(canvasResourceChanged(int,QVariant)), this, SLOT(resourceChanged(int,QVariant))); diff --git a/plugins/tools/defaulttool/defaulttool/DefaultToolWidget.cpp b/plugins/tools/defaulttool/defaulttool/DefaultToolWidget.cpp --- a/plugins/tools/defaulttool/defaulttool/DefaultToolWidget.cpp +++ b/plugins/tools/defaulttool/defaulttool/DefaultToolWidget.cpp @@ -60,11 +60,6 @@ updatePosition(); updateSize(); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(positionXSpinBox); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(positionYSpinBox); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(widthSpinBox); - KisDocumentAwareSpinBoxUnitManager::setDocumentAwarnessToExistingUnitSpinBox(heightSpinBox); - connect(positionSelector, SIGNAL(positionSelected(KoFlake::Position)), this, SLOT(positionSelected(KoFlake::Position)));