Added page with the types (no details yet)

This commit is contained in:
eelke 2021-04-01 14:58:42 +02:00
parent bdef76ed8a
commit 4c175d8c2c
16 changed files with 418 additions and 11 deletions

View file

@ -22,7 +22,7 @@ QVariant BaseTableModel::data(const QModelIndex &index, int role) const
return v;
}
QVariant BaseTableModel::getDataMeaning(const QModelIndex &index) const
QVariant BaseTableModel::getDataMeaning(const QModelIndex &) const
{
return static_cast<int>(DataMeaningNormal);
}

View file

@ -5,6 +5,7 @@
#include "widgets/CatalogNamespacePage.h"
#include "widgets/CatalogSequencesPage.h"
#include "widgets/CatalogTablesPage.h"
#include "widgets/CatalogTypesPage.h"
#include <QApplication>
#include <QTabWidget>
@ -20,6 +21,7 @@ CatalogInspector::CatalogInspector(std::shared_ptr<OpenDatabase> open_database,
m_tablesPage = new CatalogTablesPage(this);
m_functionsPage = new CatalogFunctionsPage(this);
m_sequencesPage = new CatalogSequencesPage(this);
m_typesPage = new CatalogTypesPage(this);
auto layout = new QVBoxLayout(this);
setLayout(layout);
@ -28,6 +30,7 @@ CatalogInspector::CatalogInspector(std::shared_ptr<OpenDatabase> open_database,
m_tabWidget->addTab(m_tablesPage, "");
m_tabWidget->addTab(m_functionsPage, "");
m_tabWidget->addTab(m_sequencesPage, "");
m_tabWidget->addTab(m_typesPage, "");
setCatalog(open_database->catalog());
retranslateUi(false);
@ -45,6 +48,8 @@ void CatalogInspector::retranslateUi(bool all)
QApplication::translate("CatalogInspector", "Functions", nullptr));
m_tabWidget->setTabText(m_tabWidget->indexOf(m_sequencesPage),
QApplication::translate("CatalogInspector", "Sequences", nullptr));
m_tabWidget->setTabText(m_tabWidget->indexOf(m_typesPage),
QApplication::translate("CatalogInspector", "Types", nullptr));
}
CatalogInspector::~CatalogInspector()
@ -58,6 +63,7 @@ void CatalogInspector::setCatalog(std::shared_ptr<PgDatabaseCatalog> cat)
m_tablesPage->setCatalog(cat);
m_functionsPage->setCatalog(cat);
m_sequencesPage->setCatalog(cat);
m_typesPage->setCatalog(cat);
}
void CatalogInspector::setNamespaceFilter(NamespaceFilter filter)

View file

@ -9,6 +9,7 @@ class CatalogFunctionsPage;
class CatalogSequencesPage;
class CatalogTablesPage;
class CatalogNamespacePage;
class CatalogTypesPage;
class OpenDatabase;
class PgDatabaseCatalog;
class QTabWidget;
@ -29,6 +30,7 @@ private:
CatalogTablesPage *m_tablesPage = nullptr;
CatalogFunctionsPage *m_functionsPage = nullptr;
CatalogSequencesPage *m_sequencesPage = nullptr;
CatalogTypesPage *m_typesPage = nullptr;
std::shared_ptr<PgDatabaseCatalog> m_catalog;
void retranslateUi(bool all = true);

View file

@ -29,7 +29,7 @@ ColumnPage::ColumnPage(QWidget *parent)
m_tableView->setItemDelegateForColumn(ColumnTableModel::TypeCol, new QStyledItemDelegate(this));
m_tableView->setModel(m_sortFilterProxy);
m_tableView->setSortingEnabled(true);
m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
// m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
m_sortFilterProxy->sort(ColumnTableModel::AttnumCol, Qt::AscendingOrder);
connect(m_tableView->selectionModel(), &QItemSelectionModel::selectionChanged,

View file

@ -104,7 +104,7 @@ void PropertyProxyModel::setActiveRow(const QModelIndex &row)
QVector<int>() << Qt::DisplayRole);
}
Qt::ItemFlags PropertyProxyModel::flags(const QModelIndex &index) const
Qt::ItemFlags PropertyProxyModel::flags(const QModelIndex &) const
{
return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
}

View file

@ -141,7 +141,6 @@ QVariant RolesTableModel::getData(const QModelIndex &index) const
v = authid.bypassRls;
break;
case ConnlimitCol:
// todo lookup tablespace name
v = authid.connLimit;
break;
case ValidUntilCol:

101
pglab/TypeModel.cpp Normal file
View file

@ -0,0 +1,101 @@
#include "TypeModel.h"
#include "catalog/PgDatabaseCatalog.h"
#include "catalog/PgNamespace.h"
#include "catalog/PgTypeContainer.h"
TypeModel::TypeModel(QObject * parent)
: QAbstractTableModel(parent)
{
}
QVariant TypeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation == Qt::Horizontal) {
if (role == Qt::DisplayRole) {
switch (section) {
case NameCol: return tr("Name");
case SchemaCol: return tr("Schema");
case OwnerCol: return tr("Owner");
}
}
}
return {};
}
void TypeModel::setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat)
{
if (cat != m_catalog) {
m_catalog = cat;
refreshConnection = connect(m_catalog.get(), &PgDatabaseCatalog::refreshed,
this, &TypeModel::refresh);
}
refresh();
}
//void TypeModel::setNamespaceFilter(NamespaceFilter filter)
//{
// m_namespaceFilter = filter;
// refresh();
//}
void TypeModel::refresh()
{
if (!m_catalog)
return;
beginResetModel();
auto && typs = m_catalog->types();
m_types.clear();
for (auto&& s : *typs) {
// bool add = false;
// switch (m_namespaceFilter) {
// case NamespaceFilter::User:
// add = !s.ns().isSystemCatalog();
// break;
// case NamespaceFilter::PgCatalog:
// add = s.ns().objectName() == "pg_catalog";
// break;
// case NamespaceFilter::InformationSchema:
// add = s.ns().objectName() == "information_schema";
// break;
// }
// if (add)
m_types.push_back(s);
}
endResetModel();
}
PgType TypeModel::typ(int row) const
{
return m_types.at(static_cast<size_t>(row));
}
int TypeModel::rowCount(const QModelIndex &) const
{
return static_cast<int>(m_types.size());
}
int TypeModel::columnCount(const QModelIndex &) const
{
return colCount;
}
QVariant TypeModel::data(const QModelIndex &index, int role) const
{
if (m_types.empty())
return {};
int row = index.row();
auto && seq = m_types.at(static_cast<size_t>(row));
if (role == Qt::DisplayRole) {
switch (index.column()) {
case NameCol: return seq.objectName();
case SchemaCol: return seq.nsName();
case OwnerCol: return seq.ownerName();
}
}
return {};
}

40
pglab/TypeModel.h Normal file
View file

@ -0,0 +1,40 @@
#ifndef TYPEMODEL_H
#define TYPEMODEL_H
#include <QAbstractTableModel>
#include "catalog/PgType.h"
class TypeModel : public QAbstractTableModel
{
Q_OBJECT
public:
enum e_Columns : int {
NameCol,
SchemaCol,
OwnerCol,
colCount
};
TypeModel(QObject * parent = nullptr);
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
void setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat);
//void setNamespaceFilter(NamespaceFilter filter);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
PgType typ(int row) const;
private:
std::shared_ptr<const PgDatabaseCatalog> m_catalog;
std::vector<PgType> m_types;
//NamespaceFilter m_namespaceFilter = NamespaceFilter::User;
QMetaObject::Connection refreshConnection;
void refresh();
};
#endif

View file

@ -87,7 +87,8 @@ PropertyProxyModel.cpp \
widgets/CatalogConstraintPage.cpp \
widgets/CatalogTablesPage.cpp \
widgets/CatalogFunctionsPage.cpp \
widgets/CatalogSequencesPage.cpp
widgets/CatalogSequencesPage.cpp \
widgets/CatalogTypesPage.cpp
HEADERS += \
ConnectionConfigurationWidget.h \
@ -160,7 +161,8 @@ CustomDataRole.h \
widgets/CatalogTablesPage.h \
widgets/CatalogFunctionsPage.h \
widgets/CatalogSequencesPage.h \
NamespaceFilter.h
NamespaceFilter.h \
widgets/CatalogTypesPage.h
FORMS += \
ConnectionManagerWindow.ui \

View file

@ -0,0 +1,78 @@
#include "CatalogTypesPage.h"
#include "ResultTableModelUtil.h"
#include "CustomFilterSortModel.h"
#include "CustomDataRole.h"
#include "PgLabItemDelegate.h"
#include "catalog/PgType.h"
#include "model/TypeSelectionItemModel.h"
#include "SqlCodePreview.h"
#include "PgLabTableView.h"
#include <optional>
CatalogTypesPage::CatalogTypesPage(QWidget *parent)
: QSplitter(Qt::Horizontal, parent)
{
m_typeTable = new PgLabTableView(this);
m_definitionView = new SqlCodePreview(this);
// build widget tree
// add top level widgets to splitter
addWidget(m_typeTable);
addWidget(m_definitionView);
m_model = new TypeModel(this);
m_sortFilterProxy = new CustomFilterSortModel(this);
m_sortFilterProxy->setSourceModel(m_model);
m_typeTable->setModel(m_sortFilterProxy);
m_typeTable->setSortingEnabled(true);
m_typeTable->setSelectionBehavior(QAbstractItemView::SelectRows);
m_typeTable->setSelectionMode(QAbstractItemView::SingleSelection);
connect(m_typeTable->selectionModel(), &QItemSelectionModel::currentRowChanged, this,
&CatalogTypesPage::typeTable_currentRowChanged);
connect(m_model, &TypeModel::modelReset,
[this] () { selectedTypeChanged({}); });
retranslateUi();
}
void CatalogTypesPage::retranslateUi()
{
}
void CatalogTypesPage::setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat)
{
m_catalog = cat;
m_model->setTypeList(cat->types());
m_typeTable->resizeColumnsToContents();
}
void CatalogTypesPage::typeTable_currentRowChanged(const QModelIndex &current, const QModelIndex &previous)
{
if (current.row() != previous.row()) {
if (current.isValid()) {
auto source_index = m_sortFilterProxy->mapToSource(current);
auto proc = m_model->typ(source_index.row());
selectedTypeChanged(proc);
}
else
selectedTypeChanged({});
}
}
void CatalogTypesPage::selectedTypeChanged(const std::optional<PgType> &typ)
{
updateSqlTab(typ);
}
void CatalogTypesPage::updateSqlTab(const std::optional<PgType> &typ)
{
if (!typ.has_value()) {
m_definitionView->clear();
return;
}
QString create_sql = typ->createSql();
m_definitionView->setPlainText(create_sql);
}

View file

@ -0,0 +1,34 @@
#pragma once
#include <QSplitter>
class PgLabTableView;
class PgDatabaseCatalog;
class TypeModel;
class CustomFilterSortModel;
class SqlCodePreview;
class PgType;
class CatalogTypesPage : public QSplitter
{
Q_OBJECT
public:
CatalogTypesPage(QWidget *parent = nullptr);
void setCatalog(std::shared_ptr<const PgDatabaseCatalog> cat);
public slots:
void typeTable_currentRowChanged(const QModelIndex &current, const QModelIndex &previous);
private:
PgLabTableView *m_typeTable = nullptr;
//QTabWidget *m_detailTabs = nullptr;
SqlCodePreview *m_definitionView = nullptr;
TypeModel *m_model = nullptr;
CustomFilterSortModel *m_sortFilterProxy = nullptr;
std::shared_ptr<const PgDatabaseCatalog> m_catalog;
void retranslateUi();
void selectedTypeChanged(const std::optional<PgType> &seq);
void updateSqlTab(const std::optional<PgType> &seq);
};