add widget type to numeric PIVariantEdit

This commit is contained in:
2022-12-20 16:11:19 +03:00
parent cce1b6a0c4
commit fe2a8077a4
3 changed files with 248 additions and 90 deletions

View File

@@ -1,8 +1,11 @@
#include "pivariant_edit_widgets.h"
#include "evalspinbox.h"
#include "pivaluetree.h"
#include "pivariant_edit_enum.h"
#include "pivarianttypes.h"
#include "scroll_spin_box.h"
#include "spinslider.h"
#include <QEvent>
#include <QFileDialog>
@@ -29,88 +32,231 @@ REGISTER_PIVARIANTEDITOR(PIVariantTypes::Dir, PIVariantEditors::Dir);
using Attribute = PIValueTree::Attribute;
// PIVariantEditors::Int
PIVariantMap PIVariantEditors::Int::attributes() const {
return {
{Attribute::minimum, widget->minimum() },
{Attribute::maximum, widget->maximum() },
{Attribute::singleStep, widget->singleStep()},
{Attribute::prefix, prefix },
{Attribute::suffix, suffix },
};
// PIVariantEditors::NumberBase
PIVariantEditors::NumberBase::NumberBase() {}
void PIVariantEditors::NumberBase::setValueNumeric(double v) {
switch (type) {
case tSpinBox: {
auto * w = qobject_cast<QDoubleSpinBox *>(widget);
if (w) w->setValue(v);
} break;
case tSlider: {
auto * w = qobject_cast<QSlider *>(widget);
if (w) w->setValue(v);
} break;
case tSpinSlider: {
auto * w = qobject_cast<SpinSlider *>(widget);
if (w) w->setValue(v);
} break;
case tEvalSpinBox: {
auto * w = qobject_cast<EvalSpinBox *>(widget);
if (w) {
PIString vs = PIString::fromNumber(v), es = PIString::fromNumber(w->value());
if (vs != es) w->setValue(v);
}
} break;
case tScrollSpinBox: {
auto * w = qobject_cast<ScrollSpinBox *>(widget);
if (w) w->setValue(v);
} break;
default: break;
}
}
PIVariantMap PIVariantEditors::Int::defaultAttributes() {
double PIVariantEditors::NumberBase::valueNumeric() const {
switch (type) {
case tSpinBox: {
auto * w = qobject_cast<QDoubleSpinBox *>(widget);
if (w) return w->value();
} break;
case tSlider: {
auto * w = qobject_cast<QSlider *>(widget);
if (w) return w->value();
} break;
case tSpinSlider: {
auto * w = qobject_cast<SpinSlider *>(widget);
if (w) return w->value();
} break;
case tEvalSpinBox: {
auto * w = qobject_cast<EvalSpinBox *>(widget);
if (w) return w->value();
} break;
case tScrollSpinBox: {
auto * w = qobject_cast<ScrollSpinBox *>(widget);
if (w) return w->value();
} break;
default: break;
}
return 0.;
}
PIVariantMap PIVariantEditors::NumberBase::attributes() const {
auto etype = createTypes();
etype.selectValue(type);
PIVariantMap ret = {
{Attribute::widgetType, etype },
{Attribute::prefix, prefix},
{Attribute::suffix, suffix},
};
switch (type) {
case tSpinBox: {
auto * w = qobject_cast<QDoubleSpinBox *>(widget);
if (w) {
ret[Attribute::minimum] = w->minimum();
ret[Attribute::maximum] = w->maximum();
ret[Attribute::singleStep] = w->singleStep();
if (!is_int) ret[Attribute::decimals] = w->decimals();
}
} break;
case tSlider: {
auto * w = qobject_cast<QSlider *>(widget);
if (w) {
ret[Attribute::minimum] = w->minimum();
ret[Attribute::maximum] = w->maximum();
ret[Attribute::singleStep] = w->singleStep();
}
} break;
case tSpinSlider: {
auto * w = qobject_cast<SpinSlider *>(widget);
if (w) {
ret[Attribute::minimum] = w->minimum();
ret[Attribute::maximum] = w->maximum();
ret[Attribute::singleStep] = w->singleStep();
if (!is_int) ret[Attribute::decimals] = w->decimals();
}
} break;
case tEvalSpinBox: {
auto * w = qobject_cast<EvalSpinBox *>(widget);
if (w) {
ret[Attribute::expression] = Q2PIString(w->expression());
}
} break;
default: break;
}
return ret;
}
PIVariantMap PIVariantEditors::NumberBase::defaultAttributes() {
return {
{Attribute::widgetType, createTypes() },
{Attribute::minimum, -std::numeric_limits<int>::max()},
{Attribute::maximum, std::numeric_limits<int>::max() },
{Attribute::singleStep, 1. },
{Attribute::decimals, 3 },
{Attribute::prefix, "" },
{Attribute::suffix, "" },
};
}
void PIVariantEditors::Int::retranslate() {
widget->setPrefix(PIVariantEditorBase::vtTr(prefix));
widget->setSuffix(PIVariantEditorBase::vtTr(suffix));
PIVariantTypes::Enum PIVariantEditors::NumberBase::createTypes() {
PIVariantTypes::Enum ret;
ret << PIVariantTypes::Enumerator(tSpinBox, "spin box") << PIVariantTypes::Enumerator(tSlider, "slider")
<< PIVariantTypes::Enumerator(tSpinSlider, "spin-slider") << PIVariantTypes::Enumerator(tEvalSpinBox, "eval spin box")
<< PIVariantTypes::Enumerator(tScrollSpinBox, "scroll spin box");
ret.selectValue(tSpinBox);
return ret;
}
void PIVariantEditors::Int::applyAttributes(const PIVariantMap & a) {
prefix = a.value(Attribute::prefix).toString();
suffix = a.value(Attribute::suffix).toString();
widget->setRange(a.value(Attribute::minimum, widget->minimum()).toInt(), a.value(Attribute::maximum, widget->maximum()).toInt());
widget->setSingleStep(a.value(Attribute::singleStep, widget->singleStep()).toInt());
widget->setReadOnly(a.value(Attribute::readOnly, widget->isReadOnly()).toBool());
retranslate();
void PIVariantEditors::NumberBase::retranslate() {
switch (type) {
case tSpinBox: {
auto * w = qobject_cast<QDoubleSpinBox *>(widget);
if (!w) return;
w->setPrefix(PIVariantEditorBase::vtTr(prefix));
w->setSuffix(PIVariantEditorBase::vtTr(suffix));
} break;
case tSpinSlider: {
auto * w = qobject_cast<SpinSlider *>(widget);
if (!w) return;
w->setPrefix(PIVariantEditorBase::vtTr(prefix));
w->setSuffix(PIVariantEditorBase::vtTr(suffix));
} break;
default: break;
}
}
void PIVariantEditors::NumberBase::applyAttributes(const PIVariantMap & a) {
Type new_type = static_cast<Type>(a.value(Attribute::widgetType).toEnum().selectedValue());
if (type != new_type) {
type = new_type;
if (widget) delete widget;
widget = nullptr;
// clang-format off
switch (type) {
case tSpinBox : widget = new QDoubleSpinBox(); break;
case tSlider : widget = new QSlider (Qt::Horizontal); break;
case tSpinSlider : widget = new SpinSlider (); break;
case tEvalSpinBox : widget = new EvalSpinBox (); break;
case tScrollSpinBox: widget = new ScrollSpinBox (); break;
default: break;
}
// clang-format on
if (!widget) return;
widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
layout()->addWidget(widget);
}
prefix = a.value(Attribute::prefix).toString();
suffix = a.value(Attribute::suffix).toString();
double min = a.value(Attribute::minimum).toDouble();
double max = a.value(Attribute::maximum).toDouble();
double step = a.value(Attribute::singleStep).toDouble();
int dec = is_int ? 0 : a.value(Attribute::decimals).toInt();
switch (type) {
case tSpinBox: {
auto * w = qobject_cast<QDoubleSpinBox *>(widget);
if (!w) return;
w->setPrefix(PIVariantEditorBase::vtTr(prefix));
w->setSuffix(PIVariantEditorBase::vtTr(suffix));
w->setRange(min, max);
w->setSingleStep(step);
w->setDecimals(dec);
} break;
case tSlider: {
auto * w = qobject_cast<QSlider *>(widget);
if (!w) return;
w->setTickInterval(piRoundd(piMaxd(1., (max - min) / 100.)));
w->setRange(min, max);
w->setSingleStep(step);
} break;
case tSpinSlider: {
auto * w = qobject_cast<SpinSlider *>(widget);
if (!w) return;
w->setPrefix(PIVariantEditorBase::vtTr(prefix));
w->setSuffix(PIVariantEditorBase::vtTr(suffix));
w->setMinimum(min);
w->setMaximum(max);
w->setSingleStep(step);
w->setDecimals(dec);
} break;
case tEvalSpinBox: {
auto * w = qobject_cast<EvalSpinBox *>(widget);
if (!w) return;
w->setExpression(PI2QString(a.value(Attribute::expression).toString()));
} break;
case tScrollSpinBox: {
auto * w = qobject_cast<ScrollSpinBox *>(widget);
if (!w) return;
} break;
default: break;
}
}
// PIVariantEditors::Int
// PIVariantEditors::Double
PIVariantMap PIVariantEditors::Double::attributes() const {
return {
{Attribute::minimum, widget->minimum() },
{Attribute::maximum, widget->maximum() },
{Attribute::singleStep, widget->singleStep()},
{Attribute::decimals, widget->decimals() },
{Attribute::prefix, prefix },
{Attribute::suffix, suffix },
};
}
PIVariantMap PIVariantEditors::Double::defaultAttributes() {
return {
{Attribute::minimum, -std::numeric_limits<double>::max()},
{Attribute::maximum, std::numeric_limits<double>::max() },
{Attribute::singleStep, 1. },
{Attribute::decimals, 3 },
{Attribute::prefix, "" },
{Attribute::suffix, "" },
};
}
void PIVariantEditors::Double::retranslate() {
widget->setPrefix(PIVariantEditorBase::vtTr(prefix));
widget->setSuffix(PIVariantEditorBase::vtTr(suffix));
}
void PIVariantEditors::Double::applyAttributes(const PIVariantMap & a) {
prefix = a.value(Attribute::prefix).toString();
suffix = a.value(Attribute::suffix).toString();
widget->setRange(a.value(Attribute::minimum, widget->minimum()).toDouble(), a.value(Attribute::maximum, widget->maximum()).toDouble());
widget->setSingleStep(a.value(Attribute::singleStep, widget->singleStep()).toDouble());
widget->setDecimals(a.value(Attribute::decimals, widget->decimals()).toInt());
widget->setReadOnly(a.value(Attribute::readOnly, widget->isReadOnly()).toBool());
retranslate();
}
// PIVariantEditors::String