From 385dc7ca76c083871b2b5354a658d8b334aa0cfe Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Sun, 1 Mar 2026 11:42:30 +0100 Subject: [PATCH] Added a ComboBoxDelegate for the new "type" role. --- CMakeLists.txt | 1 + mainwindow.cpp | 21 +++++++--- mainwindow.h | 1 + widgets/controls/comboboxdelegate.cpp | 57 +++++++++++++++++++++++++++ widgets/controls/comboboxdelegate.h | 31 +++++++++++++++ 5 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 widgets/controls/comboboxdelegate.cpp create mode 100644 widgets/controls/comboboxdelegate.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bf679b2..46d5c15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) dialogs/edititemdialog.h dialogs/edititemdialog.cpp dialogs/settingsdialog.h dialogs/settingsdialog.cpp views/itemdetailmapper.h views/itemdetailmapper.cpp + widgets/controls/comboboxdelegate.h widgets/controls/comboboxdelegate.cpp ) # Define target properties for Android with Qt 6 as: # set_property(TARGET ${TARGET_APP} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR diff --git a/mainwindow.cpp b/mainwindow.cpp index 2135b6f..0ed050c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -15,7 +15,9 @@ #include "dialogs/settingsdialog.h" #include "genericcore.h" #include "model/generalsortfiltermodel.h" +#include "model/metadata.h" #include "model/tablemodel.h" +#include "widgets/controls/comboboxdelegate.h" static QStandardPaths::StandardLocation standardLocation = QStandardPaths::HomeLocation; static QString updateTextClean = "Do you want to update the application now?"; @@ -46,11 +48,7 @@ MainWindow::MainWindow(QWidget* parent) restoreGeometry(settings.value("geometry").toByteArray()); restoreState(settings.value("windowState").toByteArray()); - // m_tableModel = m_core->getModel(); - // ui->tableView->setModel(m_tableModel.get()); - m_proxyModel = m_core->getSortFilterModel(); - ui->tableView->setModel((QAbstractItemModel*)m_proxyModel.get()); - ui->tableView->setSortingEnabled(true); + setupModelViews(); createActions(); createHelpMenu(); @@ -340,6 +338,19 @@ void MainWindow::execSettingsDialog() { delete settingsDialog; } +void MainWindow::setupModelViews() { + // m_tableModel = m_core->getModel(); + // ui->tableView->setModel(m_tableModel.get()); + m_proxyModel = m_core->getSortFilterModel(); + + const int typeColumn = GET_COLUMN_FOR_ROLE(TypeRole); + ComboboxDelegate* shareTypeDelegate = new ComboboxDelegate(TYPES, this); + ui->tableView->setItemDelegateForColumn(typeColumn, shareTypeDelegate); + + ui->tableView->setModel((QAbstractItemModel*)m_proxyModel.get()); + ui->tableView->setSortingEnabled(true); +} + void MainWindow::createActions() { // TODO add generic menu actions (file/new, edit/cut, ...) createFileActions(); diff --git a/mainwindow.h b/mainwindow.h index 512a393..4aefd02 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -110,6 +110,7 @@ class MainWindow : public QMainWindow { unique_ptr m_editItemDialog; /// Setup functions + void setupModelViews(); void createActions(); void createFileActions(); void createUndoActions(); diff --git a/widgets/controls/comboboxdelegate.cpp b/widgets/controls/comboboxdelegate.cpp new file mode 100644 index 0000000..90f3d52 --- /dev/null +++ b/widgets/controls/comboboxdelegate.cpp @@ -0,0 +1,57 @@ +#include "comboboxdelegate.h" + +#include +#include +#include "model/metadata.h" + +ComboboxDelegate::ComboboxDelegate(const QStringList items, QObject* parent) + : QStyledItemDelegate(parent) + , m_types(new QStringListModel(items)) {} + +void ComboboxDelegate::paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const { + QStyledItemDelegate::paint(painter, option, index); +} + +QSize ComboboxDelegate::sizeHint(const QStyleOptionViewItem& option, + const QModelIndex& index) const { + return QStyledItemDelegate::sizeHint(option, index); +} + +QWidget* ComboboxDelegate::createEditor(QWidget* parent, + const QStyleOptionViewItem& /*option*/, + const QModelIndex& /*index*/) const { + QComboBox* editor = new QComboBox(parent); + editor->setModel(m_types); + return editor; + // return QStyledItemDelegate::createEditor(parent, option, index); +} + +void ComboboxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { + /// Get the value via index of the Model + const QAbstractItemModel* localModel = index.model(); + const QString headerText = localModel->headerData(index.column(), Qt::Horizontal).toString(); + + const UserRoles role = GET_ROLE_FOR_COLUMN(index.column()); + const bool isType = TYPE_ROLES.contains(role); + /// Put the value into the SpinBox + if (isType) { + const QString valueString = index.model()->data(index, TypeRole).toString(); + int value = TYPES.indexOf(valueString); + + QComboBox* combobox = static_cast(editor); + combobox->setCurrentIndex(value); + // QStyledItemDelegate::setEditorData(editor, index); + } else { + qCritical() << "Could not find the correct type role for index:" << index << "!!!"; + QComboBox* combobox = static_cast(editor); + combobox->setCurrentIndex(-1); + } +} + +void ComboboxDelegate::setModelData(QWidget* editor, + QAbstractItemModel* model, + const QModelIndex& index) const { + QStyledItemDelegate::setModelData(editor, model, index); +} diff --git a/widgets/controls/comboboxdelegate.h b/widgets/controls/comboboxdelegate.h new file mode 100644 index 0000000..a79b5d8 --- /dev/null +++ b/widgets/controls/comboboxdelegate.h @@ -0,0 +1,31 @@ +#ifndef COMBOBOXDELEGATE_H +#define COMBOBOXDELEGATE_H + +#include +class QStringListModel; + +class ComboboxDelegate : public QStyledItemDelegate { + // TODO move source code files into subfolder "widgets/delegate" + Q_OBJECT + public: + explicit ComboboxDelegate(const QStringList items, QObject* parent = nullptr); + + /// QAbstractItemDelegate interface + public: + void paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const override; + QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; + QWidget* createEditor(QWidget* parent, + const QStyleOptionViewItem& option, + const QModelIndex&) const override; + void setEditorData(QWidget* editor, const QModelIndex& index) const override; + void setModelData(QWidget* editor, + QAbstractItemModel* model, + const QModelIndex& index) const override; + + private: + QStringListModel* m_types = nullptr; +}; + +#endif // COMBOBOXDELEGATE_H