diff --git a/pglab/DatabaseWindow.cpp b/pglab/DatabaseWindow.cpp index ee9562d..e53eda8 100644 --- a/pglab/DatabaseWindow.cpp +++ b/pglab/DatabaseWindow.cpp @@ -109,6 +109,16 @@ void DatabaseWindow::catalogLoaded() tt->setCatalog(m_database->catalog()); ui->tabWidget->addTab(tt, "Tables"); + auto pg_cat_tables = new TablesPage(this); + pg_cat_tables->setNamespaceFilter(TablesTableModel::PgCatalog); + pg_cat_tables->setCatalog(m_database->catalog()); + ui->tabWidget->addTab(pg_cat_tables, "pg_catalog"); + + auto info_schema_tables = new TablesPage(this); + info_schema_tables->setNamespaceFilter(TablesTableModel::InformationSchema); + info_schema_tables->setCatalog(m_database->catalog()); + ui->tabWidget->addTab(info_schema_tables, "information_schema"); + auto functions_page = new FunctionsPage(this); functions_page->setCatalog(m_database->catalog()); ui->tabWidget->addTab(functions_page, "Functions"); diff --git a/pglab/TablesPage.cpp b/pglab/TablesPage.cpp index bba3f5b..1151396 100644 --- a/pglab/TablesPage.cpp +++ b/pglab/TablesPage.cpp @@ -16,7 +16,6 @@ #include "ResultTableModelUtil.h" #include "SqlFormattingUtils.h" #include "SqlSyntaxHighlighter.h" -#include "TablesTableModel.h" #include "TriggerPage.h" #include "UserConfiguration.h" #include "SqlCodePreview.h" @@ -57,6 +56,8 @@ TablesPage::TablesPage(DatabaseWindow *parent) ui->indexSqlEdit->setFont(code_font); + + // Connect signals // --------------- // Table selection @@ -142,6 +143,11 @@ void TablesPage::setCatalog(std::shared_ptr cat) highlighter->setTypes(*cat->types()); } +void TablesPage::setNamespaceFilter(TablesTableModel::NamespaceFilter filter) +{ + m_tablesModel->setNamespaceFilter(filter); +} + void TablesPage::tableListTable_currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous) { diff --git a/pglab/TablesPage.h b/pglab/TablesPage.h index f9dc9a5..ecffd24 100644 --- a/pglab/TablesPage.h +++ b/pglab/TablesPage.h @@ -5,6 +5,7 @@ #include #include #include +#include "TablesTableModel.h" namespace Ui { class TablesPage; @@ -32,6 +33,7 @@ public: ~TablesPage(); void setCatalog(std::shared_ptr cat); + void setNamespaceFilter(TablesTableModel::NamespaceFilter filter); private: Ui::TablesPage *ui; DatabaseWindow *m_window; diff --git a/pglab/TablesTableModel.cpp b/pglab/TablesTableModel.cpp index 9dd22f3..ab21483 100644 --- a/pglab/TablesTableModel.cpp +++ b/pglab/TablesTableModel.cpp @@ -12,25 +12,49 @@ TablesTableModel::TablesTableModel(QObject *parent) : QAbstractTableModel(parent) {} +void TablesTableModel::setNamespaceFilter(NamespaceFilter nsf) +{ + m_namespaceFilter = nsf; + reloadData(); +} + void TablesTableModel::setCatalog(std::shared_ptr cat) { - beginResetModel(); m_catalog = cat; + reloadData(); + +} + +void TablesTableModel::reloadData() +{ + if (!m_catalog) + return; + + beginResetModel(); // Later afscheiden naar filter functie - auto classes = cat->classes(); + auto classes = m_catalog->classes(); // How many? - int n = 0; - for (const auto &e : *classes) - if (e.kind == RelKind::Table && !e.ns().isSystemCatalog()) ++n; m_tables.clear(); - m_tables.reserve(n); // reserve space for (const auto &e : *classes) { - if (e.kind == RelKind::Table && !e.ns().isSystemCatalog()) { - m_tables.push_back(e); + bool add = false; + if (e.kind == RelKind::Table) { + switch (m_namespaceFilter) { + case TablesTableModel::User: + add = !e.ns().isSystemCatalog(); + break; + case TablesTableModel::PgCatalog: + add = e.ns().objectName() == "pg_catalog"; + break; + case TablesTableModel::InformationSchema: + add = e.ns().objectName() == "information_schema"; + break; + } } + if (add) + m_tables.push_back(e); } doSort(1); diff --git a/pglab/TablesTableModel.h b/pglab/TablesTableModel.h index 264c575..351fb21 100644 --- a/pglab/TablesTableModel.h +++ b/pglab/TablesTableModel.h @@ -9,6 +9,8 @@ class PgClass; class PgDatabaseCatalog; + + class TablesTableModel: public QAbstractTableModel { public: enum e_Columns : int { @@ -22,6 +24,10 @@ public: TablesTableModel(QObject *parent); + enum NamespaceFilter { + User, PgCatalog, InformationSchema + }; + void setNamespaceFilter(NamespaceFilter nsf); void setCatalog(std::shared_ptr cat); virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; @@ -42,8 +48,11 @@ private: using t_Tables = std::vector; std::shared_ptr m_catalog; + NamespaceFilter m_namespaceFilter = User; t_Tables m_tables; + void reloadData(); + Oid getType(int column) const; QVariant getData(const QModelIndex &index) const; // QString formatTableName(const PgClass &cls) const;