Browse Source

added range value type with slider and delegate

pull/2/head
Skycoder42 7 years ago
parent
commit
8e2753a41b
No known key found for this signature in database GPG Key ID: 8E01AD9EF0578D2B
  1. 8
      examples/mvvmcore/SampleCore/settings.xml
  2. 50
      src/mvvmquick/RangeDelegate.qml
  3. 27
      src/mvvmquick/Slider.qml
  4. 17
      src/mvvmquick/inputviewfactory.cpp
  5. 2
      src/mvvmquick/mvvmquick.pro
  6. 2
      src/mvvmquick/qtmvvmquick_module.qrc
  7. 7
      src/mvvmwidgets/inputwidgetfactory.cpp
  8. 6
      src/mvvmwidgets/mvvmwidgets.pro
  9. 22
      src/mvvmwidgets/tooltipslider.cpp
  10. 23
      src/mvvmwidgets/tooltipslider_p.h

8
examples/mvvmcore/SampleCore/settings.xml

@ -100,6 +100,14 @@
default="42"> default="42">
<Property key="qtmvvm_preview" type="string" ztr="true">Is set to %n unit(s)</Property> <Property key="qtmvvm_preview" type="string" ztr="true">Is set to %n unit(s)</Property>
</Entry> </Entry>
<Entry key="prop12"
type="range"
title="&amp;Volume"
default="50">
<Property key="minimum" type="int">0</Property>
<Property key="maximum" type="int">100</Property>
<Property key="valueFormat" type="string">%1 %</Property>
</Entry>
<Entry key="prop8" <Entry key="prop8"
type="selection" type="selection"
title="Select a &amp;mode" title="Select a &amp;mode"

50
src/mvvmquick/RangeDelegate.qml

@ -0,0 +1,50 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import de.skycoder42.QtMvvm.Quick 1.1
ItemDelegate {
id: _sliderDelegate
property alias minimum: _slider.from
property alias maximum: _slider.to
property string valueFormat: "%L1"
text: title
ToolTip.visible: pressed && tooltip != ""
ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
ToolTip.text: tooltip
onPressAndHold: QuickPresenter.hapticLongPress()
contentItem: ColumnLayout {
Label {
id: _titleLabel
text: _sliderDelegate.text
font.bold: true
elide: Label.ElideRight
Layout.fillWidth: true
}
Slider {
id: _slider
Layout.fillWidth: true
stepSize: 1
snapMode: Slider.SnapAlways
live: false
value: inputValue
onValueChanged: {
var nValue = Math.round(_slider.value)
if(nValue != inputValue)
inputValue = nValue
}
ToolTip {
parent: _slider.handle
visible: _slider.pressed
text: valueFormat.arg(Math.round(_slider.from + _slider.visualPosition * (_slider.to - _slider.from)))
}
}
}
}

27
src/mvvmquick/Slider.qml

@ -0,0 +1,27 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
Slider {
id: _edit
property int inputValue
property alias minimum: _edit.from
property alias maximum: _edit.to
property string valueFormat: "%L1"
stepSize: 1
snapMode: Slider.SnapAlways
live: false
value: inputValue
onValueChanged: {
var nValue = Math.round(_edit.value)
if(nValue != inputValue)
inputValue = nValue
}
ToolTip {
parent: _slider.handle
visible: _slider.pressed
text: valueFormat.arg(Math.round(_slider.from + _slider.visualPosition * (_slider.to - _slider.from)))
}
}

17
src/mvvmquick/inputviewfactory.cpp

@ -21,9 +21,10 @@ InputViewFactory::~InputViewFactory() = default;
QUrl InputViewFactory::getInputUrl(const QByteArray &type, const QVariantMap &viewProperties) QUrl InputViewFactory::getInputUrl(const QByteArray &type, const QVariantMap &viewProperties)
{ {
QUrl url;
Q_UNUSED(viewProperties) Q_UNUSED(viewProperties)
//TODO document all types
QUrl url;
if(d->inputAliases.contains(type)) if(d->inputAliases.contains(type))
url = getInputUrl(d->inputAliases.value(type), viewProperties); url = getInputUrl(d->inputAliases.value(type), viewProperties);
else if(d->simpleInputs.contains(type)) else if(d->simpleInputs.contains(type))
@ -112,6 +113,8 @@ InputViewFactoryPrivate::InputViewFactoryPrivate() :
{"string", QStringLiteral("qrc:/qtmvvm/inputs/TextField.qml")}, {"string", QStringLiteral("qrc:/qtmvvm/inputs/TextField.qml")},
{QMetaType::typeName(QMetaType::Int), QStringLiteral("qrc:/qtmvvm/inputs/SpinBox.qml")}, {QMetaType::typeName(QMetaType::Int), QStringLiteral("qrc:/qtmvvm/inputs/SpinBox.qml")},
{QMetaType::typeName(QMetaType::Double), QStringLiteral("qrc:/qtmvvm/inputs/DoubleSpinBox.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::QDate), QStringLiteral("qrc:/qtmvvm/inputs/.qml")},
// {QMetaType::typeName(QMetaType::QTime), QStringLiteral("qrc:/qtmvvm/inputs/.qml")}, // {QMetaType::typeName(QMetaType::QTime), QStringLiteral("qrc:/qtmvvm/inputs/.qml")},
// {QMetaType::typeName(QMetaType::QDateTime), QStringLiteral("qrc:/qtmvvm/inputs/.qml")}, // {QMetaType::typeName(QMetaType::QDateTime), QStringLiteral("qrc:/qtmvvm/inputs/.qml")},
@ -124,13 +127,17 @@ InputViewFactoryPrivate::InputViewFactoryPrivate() :
}, },
simpleDelegates{ simpleDelegates{
{QMetaType::typeName(QMetaType::Bool), QStringLiteral("qrc:/qtmvvm/delegates/BoolDelegate.qml")}, {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{ formatters{
{QMetaType::typeName(QMetaType::Int), QSharedPointer<IntFormatter>::create()}, {QMetaType::typeName(QMetaType::Int), QSharedPointer<IntFormatter>::create()}
{QMetaType::typeName(QMetaType::Double), QSharedPointer<SimpleFormatter<double>>::create()},
} }
{ {
auto dblFormatter = QSharedPointer<SimpleFormatter<double>>::create();
formatters.insert(QMetaType::typeName(QMetaType::Double), dblFormatter);
formatters.insert("number", dblFormatter);
auto listFormatter = QSharedPointer<ListFormatter>::create(); auto listFormatter = QSharedPointer<ListFormatter>::create();
formatters.insert("selection", listFormatter); formatters.insert("selection", listFormatter);
formatters.insert("list", listFormatter); formatters.insert("list", listFormatter);

2
src/mvvmquick/mvvmquick.pro

@ -8,7 +8,7 @@ HEADERS += \
quickpresenter_p.h \ quickpresenter_p.h \
inputviewfactory.h \ inputviewfactory.h \
inputviewfactory_p.h \ inputviewfactory_p.h \
formatters_p.h formatters_p.h
SOURCES += \ SOURCES += \
quickpresenter.cpp \ quickpresenter.cpp \

2
src/mvvmquick/qtmvvmquick_module.qrc

@ -9,12 +9,14 @@
<file>UrlField.qml</file> <file>UrlField.qml</file>
<file>Switch.qml</file> <file>Switch.qml</file>
<file>RadioListEdit.qml</file> <file>RadioListEdit.qml</file>
<file>Slider.qml</file>
</qresource> </qresource>
<qresource prefix="/qtmvvm/delegates"> <qresource prefix="/qtmvvm/delegates">
<file>BoolDelegate.qml</file> <file>BoolDelegate.qml</file>
<file>MsgDelegate.qml</file> <file>MsgDelegate.qml</file>
<file>SwitchDelegate.qml</file> <file>SwitchDelegate.qml</file>
<file>ListDelegate.qml</file> <file>ListDelegate.qml</file>
<file>RangeDelegate.qml</file>
</qresource> </qresource>
<qresource prefix="/qtmvvm/views"> <qresource prefix="/qtmvvm/views">
<file>SettingsView.qml</file> <file>SettingsView.qml</file>

7
src/mvvmwidgets/inputwidgetfactory.cpp

@ -8,9 +8,11 @@
#include <QtWidgets/QSpinBox> #include <QtWidgets/QSpinBox>
#include <QtWidgets/QDateTimeEdit> #include <QtWidgets/QDateTimeEdit>
#include <QtWidgets/QKeySequenceEdit> #include <QtWidgets/QKeySequenceEdit>
#include <QtWidgets/QSlider>
#include "fontcombobox_p.h" #include "fontcombobox_p.h"
#include "selectcombobox_p.h" #include "selectcombobox_p.h"
#include "tooltipslider_p.h"
#include <qurlvalidator.h> #include <qurlvalidator.h>
@ -27,12 +29,13 @@ InputWidgetFactory::~InputWidgetFactory() = default;
QWidget *InputWidgetFactory::createInput(const QByteArray &type, QWidget *parent, const QVariantMap &viewProperties) QWidget *InputWidgetFactory::createInput(const QByteArray &type, QWidget *parent, const QVariantMap &viewProperties)
{ {
//TODO document all types
QWidget *widget = nullptr; QWidget *widget = nullptr;
if(d->aliases.contains(type)) if(d->aliases.contains(type))
return createInput(d->aliases.value(type), parent, viewProperties); return createInput(d->aliases.value(type), parent, viewProperties);
if(d->simpleWidgets.contains(type)) if(d->simpleWidgets.contains(type))
widget = d->simpleWidgets.value(type)(parent); 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); widget = new QCheckBox(parent);
else if(type == QMetaType::typeName(QMetaType::QString) || type == "string") { else if(type == QMetaType::typeName(QMetaType::QString) || type == "string") {
auto edit = new QLineEdit(parent); auto edit = new QLineEdit(parent);
@ -49,6 +52,8 @@ QWidget *InputWidgetFactory::createInput(const QByteArray &type, QWidget *parent
widget = new QSpinBox(parent); widget = new QSpinBox(parent);
else if(type == QMetaType::typeName(QMetaType::Double) || type == "number") else if(type == QMetaType::typeName(QMetaType::Double) || type == "number")
widget = new QDoubleSpinBox(parent); widget = new QDoubleSpinBox(parent);
else if(type == "range")
widget = new ToolTipSlider(parent);
else if(type == QMetaType::typeName(QMetaType::QDate)) else if(type == QMetaType::typeName(QMetaType::QDate))
widget = new QDateEdit(parent); widget = new QDateEdit(parent);
else if(type == QMetaType::typeName(QMetaType::QTime)) else if(type == QMetaType::typeName(QMetaType::QTime))

6
src/mvvmwidgets/mvvmwidgets.pro

@ -12,14 +12,16 @@ HEADERS += \
inputwidgetfactory.h \ inputwidgetfactory.h \
inputwidgetfactory_p.h \ inputwidgetfactory_p.h \
settingsdialog_p.h \ settingsdialog_p.h \
settingsdialog.h settingsdialog.h \
tooltipslider_p.h
SOURCES += \ SOURCES += \
widgetspresenter.cpp \ widgetspresenter.cpp \
fontcombobox.cpp \ fontcombobox.cpp \
selectcombobox.cpp \ selectcombobox.cpp \
inputwidgetfactory.cpp \ inputwidgetfactory.cpp \
settingsdialog.cpp settingsdialog.cpp \
tooltipslider.cpp
FORMS += \ FORMS += \
settingsdialog.ui settingsdialog.ui

22
src/mvvmwidgets/tooltipslider.cpp

@ -0,0 +1,22 @@
#include "tooltipslider_p.h"
#include <QtCore/QVariant>
#include <QtWidgets/QToolTip>
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);
}

23
src/mvvmwidgets/tooltipslider_p.h

@ -0,0 +1,23 @@
#ifndef QTMVVM_TOOLTIPSLIDER_P_H
#define QTMVVM_TOOLTIPSLIDER_P_H
#include <QtWidgets/QSlider>
#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
Loading…
Cancel
Save