diff --git a/examples/mvvmcore/SampleCore/settings.xml b/examples/mvvmcore/SampleCore/settings.xml index c1dc4ee..02dbc86 100644 --- a/examples/mvvmcore/SampleCore/settings.xml +++ b/examples/mvvmcore/SampleCore/settings.xml @@ -89,5 +89,15 @@ type="int" title="Enter a &number" default="42" /> + + true + + Text 1 + Text 2 + + diff --git a/src/imports/mvvmquick/OverviewListView.qml b/src/imports/mvvmquick/OverviewListView.qml index f43fec6..c880015 100644 --- a/src/imports/mvvmquick/OverviewListView.qml +++ b/src/imports/mvvmquick/OverviewListView.qml @@ -24,7 +24,7 @@ ListView { contentItem: GridLayout { id: grid rows: 2 - columns: 2 + columns: 3 columnSpacing: 14 TintIcon { @@ -59,6 +59,18 @@ ListView { wrapMode: Text.WordWrap Layout.fillWidth: true } + + TintIcon { + id: openIcon + source: "image://svg/de/skycoder42/qtmvvm/quick/icons/ic_chevron_right" + Layout.row: 0 + Layout.column: 2 + Layout.rowSpan: 2 + Layout.fillHeight: true + Layout.preferredWidth: iconSize.width + Layout.preferredHeight: iconSize.height + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + } } } } diff --git a/src/imports/mvvmquick/icons/ic_chevron_right_white_24px.svg b/src/imports/mvvmquick/icons/ic_chevron_right_white_24px.svg new file mode 100644 index 0000000..bbb978a --- /dev/null +++ b/src/imports/mvvmquick/icons/ic_chevron_right_white_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/imports/mvvmquick/qtmvvmquick_plugin.qrc b/src/imports/mvvmquick/qtmvvmquick_plugin.qrc index 8ee5735..06f4725 100644 --- a/src/imports/mvvmquick/qtmvvmquick_plugin.qrc +++ b/src/imports/mvvmquick/qtmvvmquick_plugin.qrc @@ -7,6 +7,7 @@ icons/ic_close_white_24px.svg icons/ic_search_white_24px.svg icons/ic_settings_backup_restore_white_24px.svg + icons/ic_chevron_right_white_24px.svg FileDialog.qml diff --git a/src/imports/mvvmquick/settingsentrymodel.cpp b/src/imports/mvvmquick/settingsentrymodel.cpp index c66e7ac..d7a2008 100644 --- a/src/imports/mvvmquick/settingsentrymodel.cpp +++ b/src/imports/mvvmquick/settingsentrymodel.cpp @@ -92,7 +92,7 @@ QHash SettingsEntryModel::roleNames() const {TitleRole, "title"}, {ToolTipRole, "tooltip"}, {DelegateUrlRole, "delegateUrl"}, - {SettingsValueRole, "settingsValue"}, + {SettingsValueRole, "inputValue"}, {PropertiesRole, "properties"} }; } diff --git a/src/mvvmquick/BoolDelegate.qml b/src/mvvmquick/BoolDelegate.qml index aaff24a..9e64824 100644 --- a/src/mvvmquick/BoolDelegate.qml +++ b/src/mvvmquick/BoolDelegate.qml @@ -7,8 +7,18 @@ CheckDelegate { text: title - Component.onCompleted: checked = settingsValue; //TODO buggy, use binding? - onCheckedChanged: settingsValue = checked; + function asBool(value) { + if(typeof value == "string") + return value === "true"; + else + return Boolean(value); + } + + Component.onCompleted: checked = asBool(inputValue) + onCheckedChanged: { + if(asBool(inputValue) !== checked) + inputValue = checked; + } contentItem: GridLayout { columns: 2 diff --git a/src/mvvmquick/ListDelegate.qml b/src/mvvmquick/ListDelegate.qml new file mode 100644 index 0000000..a548db6 --- /dev/null +++ b/src/mvvmquick/ListDelegate.qml @@ -0,0 +1,31 @@ +import QtQuick 2.10 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 + +ItemDelegate { + id: _listDelegate + + text: title + + signal showInput(string key, string title, string type, var defaultValue, var properties); + + contentItem: ColumnLayout { + Label { + id: _titleLabel + text: _listDelegate.text + font.bold: true + elide: Label.ElideRight + Layout.fillWidth: true + } + + Label { + id: _textLabel + visible: tooltip + text: tooltip + wrapMode: Text.WordWrap + Layout.fillWidth: true + } + } + + onClicked: showInput(key, title, "radiolist", inputValue, properties) +} diff --git a/src/mvvmquick/MsgDelegate.qml b/src/mvvmquick/MsgDelegate.qml index 87a5d36..43d354b 100644 --- a/src/mvvmquick/MsgDelegate.qml +++ b/src/mvvmquick/MsgDelegate.qml @@ -27,5 +27,5 @@ ItemDelegate { } } - onClicked: showInput(key, title, type, settingsValue, properties) + onClicked: showInput(key, title, type, inputValue, properties) } diff --git a/src/mvvmquick/RadioListEdit.qml b/src/mvvmquick/RadioListEdit.qml new file mode 100644 index 0000000..84d89ae --- /dev/null +++ b/src/mvvmquick/RadioListEdit.qml @@ -0,0 +1,27 @@ +import QtQuick 2.10 +import QtQuick.Controls 2.3 + +ListView { + id: _edit + property var inputValue + property alias listElements: _edit.model + readonly property bool isExtended: Boolean(model[0] && model[0].name) + + implicitHeight: dummyDelegate.height * model.length + + ScrollBar.vertical: ScrollBar {} + + delegate: RadioDelegate { + width: parent.width + text: isExtended ? _edit.model[index].name : modelData + + checked: (isExtended ? _edit.model[index].value : modelData) == inputValue + onClicked: inputValue = (isExtended ? _edit.model[index].value : modelData) + } + + RadioDelegate { + id:dummyDelegate + visible: false + text: "dummy" + } +} diff --git a/src/mvvmquick/SwitchDelegate.qml b/src/mvvmquick/SwitchDelegate.qml index 396a553..c5251b0 100644 --- a/src/mvvmquick/SwitchDelegate.qml +++ b/src/mvvmquick/SwitchDelegate.qml @@ -7,8 +7,18 @@ Controls.SwitchDelegate { text: title - Component.onCompleted: checked = settingsValue; - onCheckedChanged: settingsValue = checked; + function asBool(value) { + if(typeof value == "string") + return value === "true"; + else + return Boolean(value); + } + + Component.onCompleted: checked = asBool(inputValue) + onCheckedChanged: { + if(asBool(inputValue) !== checked) + inputValue = checked; + } contentItem: GridLayout { columns: 2 diff --git a/src/mvvmquick/inputviewfactory.cpp b/src/mvvmquick/inputviewfactory.cpp index 9da13ff..7312fe9 100644 --- a/src/mvvmquick/inputviewfactory.cpp +++ b/src/mvvmquick/inputviewfactory.cpp @@ -67,6 +67,8 @@ QUrl InputViewFactory::getInputUrl(const QByteArray &type, const QVariantMap &vi return QStringLiteral("qrc:/qtmvvm/inputs/UrlField.qml"); else if(type == "selection" || type == "list") return QStringLiteral("qrc:/qtmvvm/inputs/ListEdit.qml"); + else if(type == "radiolist") + return QStringLiteral("qrc:/qtmvvm/inputs/RadioListEdit.qml"); else { logCritical() << "Failed to find any input view for input type:" << type; return QUrl(); @@ -83,10 +85,10 @@ QUrl InputViewFactory::getDelegate(const QByteArray &type, const QVariantMap &vi else if(type == QMetaType::typeName(QMetaType::Bool)) return QStringLiteral("qrc:/qtmvvm/delegates/BoolDelegate.qml"); else if(type == "switch") - return QStringLiteral("qrc:/qtmvvm/inputs/SwitchDelegate.qml"); - //TODO add -// else if(type == "selection" || type == "list") -// return QStringLiteral("qrc:/qtmvvm/inputs/ListDelegate.qml"); + return QStringLiteral("qrc:/qtmvvm/delegates/SwitchDelegate.qml"); + else if((type == "selection" || type == "list") && + !viewProperties.value(QStringLiteral("editable"), false).toBool()) + return QStringLiteral("qrc:/qtmvvm/delegates/ListDelegate.qml"); else return QStringLiteral("qrc:/qtmvvm/delegates/MsgDelegate.qml"); } diff --git a/src/mvvmquick/qtmvvmquick_module.qrc b/src/mvvmquick/qtmvvmquick_module.qrc index 1efe95e..bb7821f 100644 --- a/src/mvvmquick/qtmvvmquick_module.qrc +++ b/src/mvvmquick/qtmvvmquick_module.qrc @@ -8,11 +8,13 @@ FontEdit.qml UrlField.qml Switch.qml + RadioListEdit.qml BoolDelegate.qml MsgDelegate.qml SwitchDelegate.qml + ListDelegate.qml SettingsView.qml