From 96cdc3863b5ce6b51dff86b82632a70753dcc992 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sun, 26 Feb 2023 22:06:39 +0100 Subject: [PATCH] Add existing sources --- CMakeLists.txt | 43 +++++++++++++++++ IconChooserDelegateLayout.qml | 29 ++++++++++++ IconComboBox.qml | 69 ++++++++++++++++++++++++++++ Main.qml | 84 ++++++++++++++++++++++++++++++++++ cppdefinedmodel.cpp | 1 + cppdefinedmodel.h | 39 ++++++++++++++++ icons/movinghead.png | Bin 0 -> 6593 bytes icons/nebelmaschine.png | Bin 0 -> 3848 bytes icons/rgbstrahler.png | Bin 0 -> 7544 bytes main.cpp | 17 +++++++ 10 files changed, 282 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 IconChooserDelegateLayout.qml create mode 100644 IconComboBox.qml create mode 100644 Main.qml create mode 100644 cppdefinedmodel.cpp create mode 100644 cppdefinedmodel.h create mode 100644 icons/movinghead.png create mode 100644 icons/nebelmaschine.png create mode 100644 icons/rgbstrahler.png create mode 100644 main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6c001c8 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,43 @@ +cmake_minimum_required(VERSION 3.16) + +project(comboboxtests VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Qt6 6.4 REQUIRED COMPONENTS Quick) + +qt_standard_project_setup() + +qt_add_executable(appcomboboxtests + main.cpp + cppdefinedmodel.h cppdefinedmodel.cpp +) + +qt_add_qml_module(appcomboboxtests + URI comboboxtests + VERSION 1.0 + RESOURCES + icons/movinghead.png + icons/nebelmaschine.png + icons/rgbstrahler.png + QML_FILES + Main.qml + IconComboBox.qml + IconChooserDelegateLayout.qml +) + +set_target_properties(appcomboboxtests PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +target_link_libraries(appcomboboxtests + PRIVATE Qt6::Quick +) + +install(TARGETS appcomboboxtests + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/IconChooserDelegateLayout.qml b/IconChooserDelegateLayout.qml new file mode 100644 index 0000000..30b3464 --- /dev/null +++ b/IconChooserDelegateLayout.qml @@ -0,0 +1,29 @@ +import QtQuick +import QtQuick.Controls.Material +import QtQuick.Layouts + +RowLayout { + property string text + property string iconSource + property bool isInsideMaterialComboBox: false + + id: layout + + Image { + Layout.topMargin: isInsideMaterialComboBox ? 15 : 9 + Layout.bottomMargin: isInsideMaterialComboBox ? 15 : 9 + Layout.fillHeight: true + source: layout.iconSource + fillMode: Image.PreserveAspectFit + } + Label { + Layout.preferredHeight: layout.height + text: layout.text + verticalAlignment: Label.AlignVCenter + fontSizeMode: Text.VerticalFit + font.pixelSize: 20 + } + Item { + Layout.fillWidth: true + } +} diff --git a/IconComboBox.qml b/IconComboBox.qml new file mode 100644 index 0000000..a3fa56e --- /dev/null +++ b/IconComboBox.qml @@ -0,0 +1,69 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.Material +import Qt.labs.folderlistmodel 2.4 +import comboboxtests 1.0 + +ComboBox { + id: comboBox + + property string iconSourceRole + + delegate: ItemDelegate { + height: 64 + anchors.left: parent.left + anchors.right: parent.right + contentItem: IconChooserDelegateLayout { + anchors.top: parent.top + anchors.bottom: parent.bottom + text: model[comboBox.textRole] + iconSource: model[comboBox.iconSourceRole] + } + } + contentItem: IconChooserDelegateLayout { + text: comboBox.displayText + isInsideMaterialComboBox: true + iconSource: { +// console.log("QAbstractListModel", model instanceof QAbstractListModel); +// console.log("QAbstractItemModel", model instanceof QAbstractItemModel); +// console.log("FolderListModel", model instanceof FolderListModel); +// console.log("DeviceTypesModel", model instanceof CppDefinedModel); +// console.log("QtObject", model instanceof QtObject); + + if (comboBox.currentIndex < 0) + return ''; + if (!comboBox.model) + return ''; + if (!comboBox.iconSourceRole) + return ''; + + // FolderListModel has a different API + if (model instanceof FolderListModel) + return model.get(comboBox.currentIndex, iconSourceRole); + // ListModel has another different API + else if ('get' in model) + { + const data = model.get(comboBox.currentIndex); + console.log(data); + return data[iconSourceRole]; + } + // and I dont know how to access C++ models from QML at all + else if ('roleNames' in model || 'data' in model) + { + if (!('roleNames' in model && 'data' in model)) + throw 'roleNames or data not defined!'; + + const roleNames = model.roleNames(); + console.log('roleNames', roleNames); + + const index = model.index(comboBox.currentIndex, 0); + const data = model.data(index, 99); + console.log('data', data); + + throw 'getting data from model using roleNames and data is not yet implemented.'; + } + else + throw 'unknown model type: ' + typeof model; + } + } +} diff --git a/Main.qml b/Main.qml new file mode 100644 index 0000000..49ced30 --- /dev/null +++ b/Main.qml @@ -0,0 +1,84 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Controls.Material +import QtQuick.Layouts +import QtQuick.Window +import Qt.labs.folderlistmodel 2.4 +import comboboxtests 1.0 + +Window { + width: 640 + height: 480 + visible: true + title: qsTr("Hello World") + + GridLayout { + anchors.fill: parent + + columns: 2 + + // IconComboBox shall support qml ListModels + IconComboBox { + Layout.preferredHeight: 64 + id: listModelComboBox + textRole: 'theText' + valueRole: 'theValue' + iconSourceRole: 'theIconUrl' + model: ListModel { + ListElement { theText: 'text0'; theValue: 'value0'; theIconUrl: 'qrc:/comboboxtests/icons/movinghead.png' } + ListElement { theText: 'text1'; theValue: 'value1'; theIconUrl: 'qrc:/comboboxtests/icons/movinghead.png' } + ListElement { theText: 'text2'; theValue: 'value2'; theIconUrl: 'qrc:/comboboxtests/icons/nebelmaschine.png' } + ListElement { theText: 'text3'; theValue: 'value3'; theIconUrl: 'qrc:/comboboxtests/icons/nebelmaschine.png' } + ListElement { theText: 'text4'; theValue: 'value4'; theIconUrl: 'qrc:/comboboxtests/icons/rgbstrahler.png' } + ListElement { theText: 'text5'; theValue: 'value5'; theIconUrl: 'qrc:/comboboxtests/icons/rgbstrahler.png' } + } + } + Label { + text: qsTr('currentValue: ') + listModelComboBox.currentValue + } + + // IconComboBox shall support qml FolderListModels (to let the user select which icon to use) + IconComboBox { + Layout.preferredHeight: 64 + id: folderListModelComboBox + textRole: "fileBaseName" + valueRole: "fileBaseName" + iconSourceRole: "fileUrl" + model: FolderListModel { + folder: "qrc:/comboboxtests/icons/" + showDirs: false + + function getUrlForIcon(name) { + let myFolder = folder; + if (myFolder.length < 1 || myFolder.charAt(myFolder.length - 1) !== '/') { + myFolder = myFolder + '/'; + } + + return myFolder + name + ".png" + } + } + } + Label { + text: qsTr('currentValue: ') + folderListModelComboBox.currentValue + } + + // IconComboBox shall support C++ QAbstractListModels (access to our internal database) + IconComboBox { + Layout.preferredHeight: 64 + id: cppModelComboBox + textRole: 'theText' + valueRole: 'theValue' + iconSourceRole: 'theIconUrl' + model: CppDefinedModel { + + } + } + Label { + text: qsTr('currentValue: ') + cppModelComboBox.currentValue + } + + Item { + Layout.fillHeight: true + } + } +} diff --git a/cppdefinedmodel.cpp b/cppdefinedmodel.cpp new file mode 100644 index 0000000..6b243f9 --- /dev/null +++ b/cppdefinedmodel.cpp @@ -0,0 +1 @@ +#include "cppdefinedmodel.h" diff --git a/cppdefinedmodel.h b/cppdefinedmodel.h new file mode 100644 index 0000000..798ca71 --- /dev/null +++ b/cppdefinedmodel.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +class CppDefinedModel : public QAbstractListModel +{ + Q_OBJECT + QML_ELEMENT + + enum { + TextRole = Qt::UserRole, + ValueRole, + IconUrlRole + }; + +public: + using QAbstractListModel::QAbstractListModel; + + int rowCount(const QModelIndex &parent) const override + { + return 6; + } + QVariant data(const QModelIndex &index, int role) const override + { + switch (role) + { + case TextRole: return QString("name%0").arg(index.row()); + case ValueRole: return QString("value%0").arg(index.row()); + case IconUrlRole: return QString("qrc:/comboboxtests/icons/%0.png") + .arg(std::array{{"movinghead", "nebelmaschine", "rgbstrahler"}}[index.row() / 2 % 3]); + } + return {}; + } + QHash roleNames() const override + { + return {{TextRole, "theText"}, {ValueRole, "theValue"}, {IconUrlRole, "theIconUrl"}}; + } +}; diff --git a/icons/movinghead.png b/icons/movinghead.png new file mode 100644 index 0000000000000000000000000000000000000000..712d6d61eabe4e6616af96246920f67bc2ddcceb GIT binary patch literal 6593 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 UZLUATz`(%Z>FVdQ&MBb@01PH%00000 literal 0 HcmV?d00001 diff --git a/icons/nebelmaschine.png b/icons/nebelmaschine.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7cf931c89219f6d9181e16fd073acbec1ec775 GIT binary patch literal 3848 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 literal 0 HcmV?d00001 diff --git a/icons/rgbstrahler.png b/icons/rgbstrahler.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca0bf86c3dde93f5ed6ee570e3da80316fe8cf4 GIT binary patch literal 7544 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 +#include + + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + const QUrl url(u"qrc:/comboboxtests/Main.qml"_qs); + QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, + &app, []() { qFatal("object creation failed!"); QCoreApplication::exit(-1); }, + Qt::QueuedConnection); + engine.load(url); + + return app.exec(); +}