From e44f73166f84d92a8f25e8ca1128eca19ec82553 Mon Sep 17 00:00:00 2001 From: eelke Date: Sat, 15 Dec 2018 15:18:19 +0100 Subject: [PATCH] SelectionEditorFactory for creating combobox selections for use in QTableView. TypeSelectionItemModelFactory to use the TypeSelectionItemModel with above factory. --- pglablib/AbstractModelFactory.h | 19 ++++++ pglablib/SelectionEditorFactory.cpp | 60 +++++++++++++++++++ pglablib/SelectionEditorFactory.h | 24 ++++++++ .../TypeSelectionItemModel.cpp | 0 {pglab => pglablib}/TypeSelectionItemModel.h | 0 pglablib/TypeSelectionItemModelFactory.cpp | 15 +++++ pglablib/TypeSelectionItemModelFactory.h | 20 +++++++ 7 files changed, 138 insertions(+) create mode 100644 pglablib/AbstractModelFactory.h create mode 100644 pglablib/SelectionEditorFactory.cpp create mode 100644 pglablib/SelectionEditorFactory.h rename {pglab => pglablib}/TypeSelectionItemModel.cpp (100%) rename {pglab => pglablib}/TypeSelectionItemModel.h (100%) create mode 100644 pglablib/TypeSelectionItemModelFactory.cpp create mode 100644 pglablib/TypeSelectionItemModelFactory.h diff --git a/pglablib/AbstractModelFactory.h b/pglablib/AbstractModelFactory.h new file mode 100644 index 0000000..c473d0f --- /dev/null +++ b/pglablib/AbstractModelFactory.h @@ -0,0 +1,19 @@ +#ifndef ABSTRACTMODELFACTORY_H +#define ABSTRACTMODELFACTORY_H + +#include + +class QAbstractItemModel; + +class AbstractModelFactory: public QObject { + Q_OBJECT +public: + using QObject::QObject; + + /// Create instance of a model + /// + /// \param parent Will be passed to the constructor of the model. + virtual QAbstractItemModel* createModel(QObject *parent = nullptr) const = 0; +}; + +#endif // ABSTRACTMODELFACTORY_H diff --git a/pglablib/SelectionEditorFactory.cpp b/pglablib/SelectionEditorFactory.cpp new file mode 100644 index 0000000..1b59448 --- /dev/null +++ b/pglablib/SelectionEditorFactory.cpp @@ -0,0 +1,60 @@ +#include "SelectionEditorFactory.h" +#include "TypeSelectionItemModel.h" +#include "AbstractModelFactory.h" +#include + +SelectionEditorFactory::SelectionEditorFactory(QObject *parent, AbstractModelFactory *model_factory, int key_column, int value_column) + : AbstractEditorFactory(parent) + , m_modelFactory(model_factory) + , m_keyColumn(key_column) + , m_valueColumn(value_column) +{} + +QWidget *SelectionEditorFactory::createEditor (QWidget *parent, const QStyleOptionViewItem &, + const QModelIndex &) const +{ + QWidget *w = nullptr; + + QComboBox *cmbbx = new QComboBox(parent); + cmbbx->setMaxVisibleItems(32); + auto model = m_modelFactory->createModel(cmbbx); + cmbbx->setModel(model); + cmbbx->setModelColumn(m_valueColumn); + w = cmbbx; + + return w; +} + +void SelectionEditorFactory::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + QComboBox *cmbbx = dynamic_cast(editor); + if (cmbbx) { + auto data = index.data(); + if (data.canConvert()) { + auto selection_model = cmbbx->model(); + QModelIndexList indexes = selection_model->match( + selection_model->index(0, m_keyColumn), Qt::DisplayRole, data, 1, Qt::MatchFlags( Qt::MatchExactly )); + if (!indexes.empty()) { + cmbbx->setCurrentIndex(indexes.at(0).row()); + } + else { + cmbbx->setCurrentIndex(-1); + } + } + } +} + +void SelectionEditorFactory::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +{ + QComboBox *cmbbx = dynamic_cast(editor); + if (cmbbx) { + auto data = index.data(); + if (data.canConvert()) { + auto selection_model = cmbbx->model(); + QVariant d = selection_model->data( + selection_model->index(cmbbx->currentIndex(), m_keyColumn)); + model->setData(index, d); + } + } +} + diff --git a/pglablib/SelectionEditorFactory.h b/pglablib/SelectionEditorFactory.h new file mode 100644 index 0000000..bc2c175 --- /dev/null +++ b/pglablib/SelectionEditorFactory.h @@ -0,0 +1,24 @@ +#ifndef SELECTIONEDITORFACTORY_H +#define SELECTIONEDITORFACTORY_H + +#include "AbstractEditorFactory.h" + +class AbstractModelFactory; + +class SelectionEditorFactory: public AbstractEditorFactory { + Q_OBJECT +public: + SelectionEditorFactory(QObject *parent, AbstractModelFactory *model_factory, int key_column, int value_column); + + virtual QWidget *createEditor (QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override; + virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; + +private: + AbstractModelFactory *m_modelFactory = nullptr; + int m_keyColumn = 0; + int m_valueColumn = 0; +}; + +#endif // SELECTIONEDITORFACTORY_H diff --git a/pglab/TypeSelectionItemModel.cpp b/pglablib/TypeSelectionItemModel.cpp similarity index 100% rename from pglab/TypeSelectionItemModel.cpp rename to pglablib/TypeSelectionItemModel.cpp diff --git a/pglab/TypeSelectionItemModel.h b/pglablib/TypeSelectionItemModel.h similarity index 100% rename from pglab/TypeSelectionItemModel.h rename to pglablib/TypeSelectionItemModel.h diff --git a/pglablib/TypeSelectionItemModelFactory.cpp b/pglablib/TypeSelectionItemModelFactory.cpp new file mode 100644 index 0000000..330f41e --- /dev/null +++ b/pglablib/TypeSelectionItemModelFactory.cpp @@ -0,0 +1,15 @@ +#include "TypeSelectionItemModelFactory.h" +#include "TypeSelectionItemModel.h" + +TypeSelectionItemModelFactory::TypeSelectionItemModelFactory(QObject *parent, std::shared_ptr types) + : AbstractModelFactory(parent) + , m_types(types) +{} + + +QAbstractItemModel* TypeSelectionItemModelFactory::createModel(QObject *parent) const +{ + auto model = new TypeSelectionItemModel(parent); + model->setTypeList(m_types); + return model; +} diff --git a/pglablib/TypeSelectionItemModelFactory.h b/pglablib/TypeSelectionItemModelFactory.h new file mode 100644 index 0000000..7e8d3a8 --- /dev/null +++ b/pglablib/TypeSelectionItemModelFactory.h @@ -0,0 +1,20 @@ +#ifndef TYPESELECTIONITEMMODELFACTORY_H +#define TYPESELECTIONITEMMODELFACTORY_H + +#include "AbstractModelFactory.h" + +class PgTypeContainer; +void setTypeList(); + +class TypeSelectionItemModelFactory: public AbstractModelFactory { + Q_OBJECT +public: + TypeSelectionItemModelFactory(QObject *parent, std::shared_ptr types); + + virtual QAbstractItemModel* createModel(QObject *parent = nullptr) const override; + +private: + std::shared_ptr m_types; +}; + +#endif // TYPESELECTIONITEMMODELFACTORY_H