From e75b0f1a71087a346a2919f082c7c6f6e347f6cc Mon Sep 17 00:00:00 2001 From: eelke Date: Sun, 16 Dec 2018 11:35:39 +0100 Subject: [PATCH] Added CollationModel + factory for editing and added to EditTableWidget --- pglab/EditTableWidget.cpp | 7 ++++ pglablib/SelectionEditorFactory.cpp | 1 - pglablib/model/CollationModel.cpp | 45 ++++++++++++++++++++++-- pglablib/model/CollationModel.h | 31 +++++++++++++--- pglablib/model/CollationModelFactory.cpp | 16 +++++++-- pglablib/model/CollationModelFactory.h | 18 +++++++--- pglablib/pglablib.pro | 8 +++-- 7 files changed, 107 insertions(+), 19 deletions(-) diff --git a/pglab/EditTableWidget.cpp b/pglab/EditTableWidget.cpp index 0170559..d0db138 100644 --- a/pglab/EditTableWidget.cpp +++ b/pglab/EditTableWidget.cpp @@ -6,6 +6,7 @@ #include "OpenDatabase.h" #include "catalog/PgDatabaseCatalog.h" #include "SelectionEditorFactory.h" +#include "model/CollationModelFactory.h" #include "model/TypeModelFactory.h" EditTableWidget::EditTableWidget(std::shared_ptr database, QWidget *parent) @@ -33,6 +34,12 @@ EditTableWidget::EditTableWidget(std::shared_ptr database, QWidget ); table->setItemDelegateForColumn(EditColumnTableModel::TypeCol, type_delegate); + auto collations = database->catalog()->collations(); + auto collate_delegate = new PgLabItemDelegate(this); + collate_delegate->setEditorFactory( + new SelectionEditorFactory(this, new CollationModelFactory(this, collations), 0, 1) + ); + table->setItemDelegateForColumn(EditColumnTableModel::CollateCol, collate_delegate); // if (opendb) { // m_typeDelegate.setTypeSelectionModel(opendb->typeSelectionModel()); diff --git a/pglablib/SelectionEditorFactory.cpp b/pglablib/SelectionEditorFactory.cpp index a3a5bf2..d27fb33 100644 --- a/pglablib/SelectionEditorFactory.cpp +++ b/pglablib/SelectionEditorFactory.cpp @@ -1,5 +1,4 @@ #include "SelectionEditorFactory.h" -#include "model/TypeSelectionItemModel.h" #include "AbstractModelFactory.h" #include diff --git a/pglablib/model/CollationModel.cpp b/pglablib/model/CollationModel.cpp index b6e9d3b..b31cf81 100644 --- a/pglablib/model/CollationModel.cpp +++ b/pglablib/model/CollationModel.cpp @@ -1,6 +1,45 @@ -#include "CollationModel.h" +#include "CollationModel.h" -CollationModel::CollationModel() +#include "catalog/PgCollationContainer.h" +#include + +CollationModel::CollationModel(QObject *parent) + : QAbstractListModel(parent) { - +} + +int CollationModel::rowCount(const QModelIndex &/*parent*/) const +{ + if (m_collations) + return static_cast(m_collations->count()); + + return 0; +} + +int CollationModel::columnCount(const QModelIndex &/*parent*/) const +{ + return colCount; +} + +QVariant CollationModel::data(const QModelIndex &index, int role) const +{ + if (index.isValid()) { + int row = index.row(); + int column = index.column(); + if (role == Qt::DisplayRole) { + auto elem = m_collations->getByIdx(row); + switch (column) { + case OidCol: return elem.oid(); + case NameCol: return elem.objectName(); + } + } + } + return QVariant(); +} + +void CollationModel::setCollationList(std::shared_ptr collations) +{ + beginResetModel(); + m_collations = collations; + endResetModel(); } diff --git a/pglablib/model/CollationModel.h b/pglablib/model/CollationModel.h index 157edf2..4fea4c7 100644 --- a/pglablib/model/CollationModel.h +++ b/pglablib/model/CollationModel.h @@ -1,11 +1,32 @@ -#ifndef COLLATIONMODEL_H +#ifndef COLLATIONMODEL_H #define COLLATIONMODEL_H +#include +#include +#include -class CollationModel -{ +class PgCollationContainer; + +class CollationModel : public QAbstractListModel { + Q_OBJECT public: - CollationModel(); + enum e_Columns : int { + OidCol, + NameCol, // + colCount + }; + + explicit CollationModel(QObject *parent = nullptr); + + void setCollationList(std::shared_ptr collations); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + +private: + std::shared_ptr m_collations; }; -#endif // COLLATIONMODEL_H \ No newline at end of file + +#endif // COLLATIONMODEL_H diff --git a/pglablib/model/CollationModelFactory.cpp b/pglablib/model/CollationModelFactory.cpp index 324568e..08d0c74 100644 --- a/pglablib/model/CollationModelFactory.cpp +++ b/pglablib/model/CollationModelFactory.cpp @@ -1,6 +1,16 @@ -#include "CollationModelFactory.h" +#include "CollationModelFactory.h" +#include "CollationModel.h" -CollationModelFactory::CollationModelFactory() +CollationModelFactory::CollationModelFactory(QObject *parent, std::shared_ptr collations) + : AbstractModelFactory(parent) + , m_collations(collations) +{} + + +QAbstractItemModel* CollationModelFactory::createModel(QObject *parent) const { - + auto model = new CollationModel(parent); + model->setCollationList(m_collations); + return model; } + diff --git a/pglablib/model/CollationModelFactory.h b/pglablib/model/CollationModelFactory.h index fa41525..9243815 100644 --- a/pglablib/model/CollationModelFactory.h +++ b/pglablib/model/CollationModelFactory.h @@ -1,11 +1,19 @@ -#ifndef COLLATIONMODELFACTORY_H +#ifndef COLLATIONMODELFACTORY_H #define COLLATIONMODELFACTORY_H +#include "AbstractModelFactory.h" -class CollationModelFactory -{ +class PgCollationContainer; + +class CollationModelFactory: public AbstractModelFactory { + Q_OBJECT public: - CollationModelFactory(); + CollationModelFactory(QObject *parent, std::shared_ptr collations); + + virtual QAbstractItemModel* createModel(QObject *parent = nullptr) const override; + +private: + std::shared_ptr m_collations; }; -#endif // COLLATIONMODELFACTORY_H \ No newline at end of file +#endif // COLLATIONMODELFACTORY_H diff --git a/pglablib/pglablib.pro b/pglablib/pglablib.pro index 9cfbeef..37a15af 100644 --- a/pglablib/pglablib.pro +++ b/pglablib/pglablib.pro @@ -78,7 +78,9 @@ SOURCES += \ catalog/PgAm.cpp \ model/TypeModelFactory.cpp \ model/TypeSelectionItemModel.cpp \ - catalog/PgAmContainer.cpp + catalog/PgAmContainer.cpp \ + model/CollationModel.cpp \ + model/CollationModelFactory.cpp HEADERS += \ Pglablib.h \ @@ -141,7 +143,9 @@ HEADERS += \ model/TypeSelectionItemModel.h \ model/TypeModelFactory.h \ catalog/PgAm.h \ - catalog/PgAmContainer.h + catalog/PgAmContainer.h \ + model/CollationModel.h \ + model/CollationModelFactory.h unix { target.path = /usr/lib