Added CollationModel + factory for editing and added to EditTableWidget

This commit is contained in:
eelke 2018-12-16 11:35:39 +01:00
parent f0c1035378
commit e75b0f1a71
7 changed files with 107 additions and 19 deletions

View file

@ -6,6 +6,7 @@
#include "OpenDatabase.h" #include "OpenDatabase.h"
#include "catalog/PgDatabaseCatalog.h" #include "catalog/PgDatabaseCatalog.h"
#include "SelectionEditorFactory.h" #include "SelectionEditorFactory.h"
#include "model/CollationModelFactory.h"
#include "model/TypeModelFactory.h" #include "model/TypeModelFactory.h"
EditTableWidget::EditTableWidget(std::shared_ptr<OpenDatabase> database, QWidget *parent) EditTableWidget::EditTableWidget(std::shared_ptr<OpenDatabase> database, QWidget *parent)
@ -33,6 +34,12 @@ EditTableWidget::EditTableWidget(std::shared_ptr<OpenDatabase> database, QWidget
); );
table->setItemDelegateForColumn(EditColumnTableModel::TypeCol, type_delegate); 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) { // if (opendb) {
// m_typeDelegate.setTypeSelectionModel(opendb->typeSelectionModel()); // m_typeDelegate.setTypeSelectionModel(opendb->typeSelectionModel());

View file

@ -1,5 +1,4 @@
#include "SelectionEditorFactory.h" #include "SelectionEditorFactory.h"
#include "model/TypeSelectionItemModel.h"
#include "AbstractModelFactory.h" #include "AbstractModelFactory.h"
#include <QComboBox> #include <QComboBox>

View file

@ -1,6 +1,45 @@
#include "CollationModel.h" #include "CollationModel.h"
CollationModel::CollationModel() #include "catalog/PgCollationContainer.h"
#include <algorithm>
CollationModel::CollationModel(QObject *parent)
: QAbstractListModel(parent)
{ {
}
int CollationModel::rowCount(const QModelIndex &/*parent*/) const
{
if (m_collations)
return static_cast<int>(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<const PgCollationContainer> collations)
{
beginResetModel();
m_collations = collations;
endResetModel();
} }

View file

@ -1,11 +1,32 @@
#ifndef COLLATIONMODEL_H #ifndef COLLATIONMODEL_H
#define COLLATIONMODEL_H #define COLLATIONMODEL_H
#include <QAbstractListModel>
#include <memory>
#include <vector>
class CollationModel class PgCollationContainer;
{
class CollationModel : public QAbstractListModel {
Q_OBJECT
public: public:
CollationModel(); enum e_Columns : int {
OidCol,
NameCol, //
colCount
};
explicit CollationModel(QObject *parent = nullptr);
void setCollationList(std::shared_ptr<const PgCollationContainer> 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<const PgCollationContainer> m_collations;
}; };
#endif // COLLATIONMODEL_H #endif // COLLATIONMODEL_H

View file

@ -1,6 +1,16 @@
#include "CollationModelFactory.h" #include "CollationModelFactory.h"
#include "CollationModel.h"
CollationModelFactory::CollationModelFactory() CollationModelFactory::CollationModelFactory(QObject *parent, std::shared_ptr<const PgCollationContainer> collations)
: AbstractModelFactory(parent)
, m_collations(collations)
{}
QAbstractItemModel* CollationModelFactory::createModel(QObject *parent) const
{ {
auto model = new CollationModel(parent);
model->setCollationList(m_collations);
return model;
} }

View file

@ -1,11 +1,19 @@
#ifndef COLLATIONMODELFACTORY_H #ifndef COLLATIONMODELFACTORY_H
#define COLLATIONMODELFACTORY_H #define COLLATIONMODELFACTORY_H
#include "AbstractModelFactory.h"
class CollationModelFactory class PgCollationContainer;
{
class CollationModelFactory: public AbstractModelFactory {
Q_OBJECT
public: public:
CollationModelFactory(); CollationModelFactory(QObject *parent, std::shared_ptr<const PgCollationContainer> collations);
virtual QAbstractItemModel* createModel(QObject *parent = nullptr) const override;
private:
std::shared_ptr<const PgCollationContainer> m_collations;
}; };
#endif // COLLATIONMODELFACTORY_H #endif // COLLATIONMODELFACTORY_H

View file

@ -78,7 +78,9 @@ SOURCES += \
catalog/PgAm.cpp \ catalog/PgAm.cpp \
model/TypeModelFactory.cpp \ model/TypeModelFactory.cpp \
model/TypeSelectionItemModel.cpp \ model/TypeSelectionItemModel.cpp \
catalog/PgAmContainer.cpp catalog/PgAmContainer.cpp \
model/CollationModel.cpp \
model/CollationModelFactory.cpp
HEADERS += \ HEADERS += \
Pglablib.h \ Pglablib.h \
@ -141,7 +143,9 @@ HEADERS += \
model/TypeSelectionItemModel.h \ model/TypeSelectionItemModel.h \
model/TypeModelFactory.h \ model/TypeModelFactory.h \
catalog/PgAm.h \ catalog/PgAm.h \
catalog/PgAmContainer.h catalog/PgAmContainer.h \
model/CollationModel.h \
model/CollationModelFactory.h
unix { unix {
target.path = /usr/lib target.path = /usr/lib