From 8e2753a41b87d19c269772d3a0abf8bc9b9cccc9 Mon Sep 17 00:00:00 2001 From: Skycoder42 Date: Sat, 23 Jun 2018 23:47:20 +0200 Subject: [PATCH] added range value type with slider and delegate --- examples/mvvmcore/SampleCore/settings.xml | 8 ++++ src/mvvmquick/RangeDelegate.qml | 50 +++++++++++++++++++++++ src/mvvmquick/Slider.qml | 27 ++++++++++++ src/mvvmquick/inputviewfactory.cpp | 17 +++++--- src/mvvmquick/mvvmquick.pro | 2 +- src/mvvmquick/qtmvvmquick_module.qrc | 2 + src/mvvmwidgets/inputwidgetfactory.cpp | 7 +++- src/mvvmwidgets/mvvmwidgets.pro | 6 ++- src/mvvmwidgets/tooltipslider.cpp | 22 ++++++++++ src/mvvmwidgets/tooltipslider_p.h | 23 +++++++++++ 10 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 src/mvvmquick/RangeDelegate.qml create mode 100644 src/mvvmquick/Slider.qml create mode 100644 src/mvvmwidgets/tooltipslider.cpp create mode 100644 src/mvvmwidgets/tooltipslider_p.h diff --git a/examples/mvvmcore/SampleCore/settings.xml b/examples/mvvmcore/SampleCore/settings.xml index 8a034c5..bb5ea60 100644 --- a/examples/mvvmcore/SampleCore/settings.xml +++ b/examples/mvvmcore/SampleCore/settings.xml @@ -100,6 +100,14 @@ default="42"> Is set to %n unit(s) + + 0 + 100 + %1 % + inputAliases.contains(type)) url = getInputUrl(d->inputAliases.value(type), viewProperties); else if(d->simpleInputs.contains(type)) @@ -112,6 +113,8 @@ InputViewFactoryPrivate::InputViewFactoryPrivate() : {"string", QStringLiteral("qrc:/qtmvvm/inputs/TextField.qml")}, {QMetaType::typeName(QMetaType::Int), QStringLiteral("qrc:/qtmvvm/inputs/SpinBox.qml")}, {QMetaType::typeName(QMetaType::Double), QStringLiteral("qrc:/qtmvvm/inputs/DoubleSpinBox.qml")}, + {"number", QStringLiteral("qrc:/qtmvvm/inputs/DoubleSpinBox.qml")}, + {"range", QStringLiteral("qrc:/qtmvvm/inputs/Slider.qml")}, // {QMetaType::typeName(QMetaType::QDate), QStringLiteral("qrc:/qtmvvm/inputs/.qml")}, // {QMetaType::typeName(QMetaType::QTime), QStringLiteral("qrc:/qtmvvm/inputs/.qml")}, // {QMetaType::typeName(QMetaType::QDateTime), QStringLiteral("qrc:/qtmvvm/inputs/.qml")}, @@ -124,13 +127,17 @@ InputViewFactoryPrivate::InputViewFactoryPrivate() : }, simpleDelegates{ {QMetaType::typeName(QMetaType::Bool), QStringLiteral("qrc:/qtmvvm/delegates/BoolDelegate.qml")}, - {"switch", QStringLiteral("qrc:/qtmvvm/inputs/SwitchDelegate.qml")} + {"switch", QStringLiteral("qrc:/qtmvvm/delegates/SwitchDelegate.qml")}, + {"range", QStringLiteral("qrc:/qtmvvm/delegates/RangeDelegate.qml")} }, formatters{ - {QMetaType::typeName(QMetaType::Int), QSharedPointer::create()}, - {QMetaType::typeName(QMetaType::Double), QSharedPointer>::create()}, + {QMetaType::typeName(QMetaType::Int), QSharedPointer::create()} } { + auto dblFormatter = QSharedPointer>::create(); + formatters.insert(QMetaType::typeName(QMetaType::Double), dblFormatter); + formatters.insert("number", dblFormatter); + auto listFormatter = QSharedPointer::create(); formatters.insert("selection", listFormatter); formatters.insert("list", listFormatter); diff --git a/src/mvvmquick/mvvmquick.pro b/src/mvvmquick/mvvmquick.pro index 29d5c06..1837aad 100644 --- a/src/mvvmquick/mvvmquick.pro +++ b/src/mvvmquick/mvvmquick.pro @@ -8,7 +8,7 @@ HEADERS += \ quickpresenter_p.h \ inputviewfactory.h \ inputviewfactory_p.h \ - formatters_p.h + formatters_p.h SOURCES += \ quickpresenter.cpp \ diff --git a/src/mvvmquick/qtmvvmquick_module.qrc b/src/mvvmquick/qtmvvmquick_module.qrc index bb7821f..deda855 100644 --- a/src/mvvmquick/qtmvvmquick_module.qrc +++ b/src/mvvmquick/qtmvvmquick_module.qrc @@ -9,12 +9,14 @@ UrlField.qml Switch.qml RadioListEdit.qml + Slider.qml BoolDelegate.qml MsgDelegate.qml SwitchDelegate.qml ListDelegate.qml + RangeDelegate.qml SettingsView.qml diff --git a/src/mvvmwidgets/inputwidgetfactory.cpp b/src/mvvmwidgets/inputwidgetfactory.cpp index 33da596..b511ee3 100644 --- a/src/mvvmwidgets/inputwidgetfactory.cpp +++ b/src/mvvmwidgets/inputwidgetfactory.cpp @@ -8,9 +8,11 @@ #include #include #include +#include #include "fontcombobox_p.h" #include "selectcombobox_p.h" +#include "tooltipslider_p.h" #include @@ -27,12 +29,13 @@ InputWidgetFactory::~InputWidgetFactory() = default; QWidget *InputWidgetFactory::createInput(const QByteArray &type, QWidget *parent, const QVariantMap &viewProperties) { + //TODO document all types QWidget *widget = nullptr; if(d->aliases.contains(type)) return createInput(d->aliases.value(type), parent, viewProperties); if(d->simpleWidgets.contains(type)) widget = d->simpleWidgets.value(type)(parent); - else if(type == QMetaType::typeName(QMetaType::Bool)) + else if(type == QMetaType::typeName(QMetaType::Bool) || type == "switch") //TODO add extra widget widget = new QCheckBox(parent); else if(type == QMetaType::typeName(QMetaType::QString) || type == "string") { auto edit = new QLineEdit(parent); @@ -49,6 +52,8 @@ QWidget *InputWidgetFactory::createInput(const QByteArray &type, QWidget *parent widget = new QSpinBox(parent); else if(type == QMetaType::typeName(QMetaType::Double) || type == "number") widget = new QDoubleSpinBox(parent); + else if(type == "range") + widget = new ToolTipSlider(parent); else if(type == QMetaType::typeName(QMetaType::QDate)) widget = new QDateEdit(parent); else if(type == QMetaType::typeName(QMetaType::QTime)) diff --git a/src/mvvmwidgets/mvvmwidgets.pro b/src/mvvmwidgets/mvvmwidgets.pro index f7bedb1..371db97 100644 --- a/src/mvvmwidgets/mvvmwidgets.pro +++ b/src/mvvmwidgets/mvvmwidgets.pro @@ -12,14 +12,16 @@ HEADERS += \ inputwidgetfactory.h \ inputwidgetfactory_p.h \ settingsdialog_p.h \ - settingsdialog.h + settingsdialog.h \ + tooltipslider_p.h SOURCES += \ widgetspresenter.cpp \ fontcombobox.cpp \ selectcombobox.cpp \ inputwidgetfactory.cpp \ - settingsdialog.cpp + settingsdialog.cpp \ + tooltipslider.cpp FORMS += \ settingsdialog.ui diff --git a/src/mvvmwidgets/tooltipslider.cpp b/src/mvvmwidgets/tooltipslider.cpp new file mode 100644 index 0000000..3d95886 --- /dev/null +++ b/src/mvvmwidgets/tooltipslider.cpp @@ -0,0 +1,22 @@ +#include "tooltipslider_p.h" +#include +#include +using namespace QtMvvm; + +ToolTipSlider::ToolTipSlider(QWidget *parent) : + QSlider{Qt::Horizontal, parent} +{ + setTracking(false); + connect(this, &ToolTipSlider::sliderMoved, + this, &ToolTipSlider::onMoved); +} + +void ToolTipSlider::onMoved(int position) +{ + auto format = property("valueFormat").toString(); + if(format.isEmpty()) + format = QStringLiteral("%L1"); + auto mPos = mapToGlobal({0,0}); + mPos.setX(QCursor::pos().x()); + QToolTip::showText(mPos, format.arg(position), this); +} diff --git a/src/mvvmwidgets/tooltipslider_p.h b/src/mvvmwidgets/tooltipslider_p.h new file mode 100644 index 0000000..5bf39ef --- /dev/null +++ b/src/mvvmwidgets/tooltipslider_p.h @@ -0,0 +1,23 @@ +#ifndef QTMVVM_TOOLTIPSLIDER_P_H +#define QTMVVM_TOOLTIPSLIDER_P_H + +#include + +#include "qtmvvmwidgets_global.h" + +namespace QtMvvm { + +class ToolTipSlider : public QSlider +{ + Q_OBJECT + +public: + explicit ToolTipSlider(QWidget *parent = nullptr); + +private Q_SLOTS: + void onMoved(int position); +}; + +} + +#endif // QTMVVM_TOOLTIPSLIDER_P_H