diff --git a/pglab/TablesPage.cpp b/pglab/TablesPage.cpp index e4a97b5..c8f83c1 100644 --- a/pglab/TablesPage.cpp +++ b/pglab/TablesPage.cpp @@ -27,6 +27,8 @@ TablesPage::TablesPage(MainWindow *parent) SetTableViewDefault(ui->tableListTable); m_tablesModel = new TablesTableModel(this); ui->tableListTable->setModel(m_tablesModel); + ui->tableListTable->setSortingEnabled(true); + ui->tableListTable->sortByColumn(0, Qt::AscendingOrder); SetTableViewDefault(ui->columnsTable); m_columnsModel = new ColumnTableModel(this); diff --git a/pglab/TablesTableModel.cpp b/pglab/TablesTableModel.cpp index f4001bb..41e42ec 100644 --- a/pglab/TablesTableModel.cpp +++ b/pglab/TablesTableModel.cpp @@ -45,15 +45,49 @@ void TablesTableModel::setSortOrder(int so) endResetModel(); } -void TablesTableModel::doSort(int so) +namespace { + + inline bool compareByName(PgClass l, PgClass r) + { + return l.name < r.name + || (l.name == r.name && l.relnamespace_name < r.relnamespace_name); + } + + inline bool compareBySchema(PgClass l, PgClass r) + { + return l.relnamespace_name < r.relnamespace_name + || (l.relnamespace_name == r.relnamespace_name && l.name < r.name); + } + +} + +void TablesTableModel::sort(int column, Qt::SortOrder order) { - if (so == 1) - std::sort(m_tables.begin(), m_tables.end(), - [] (auto l, auto r) -> bool { return l.relnamespace_name < r.relnamespace_name - || (l.relnamespace_name == r.relnamespace_name && l.name < r.name); }); - else - std::sort(m_tables.begin(), m_tables.end(), - [] (auto l, auto r) -> bool { return l.name < r.name; }); + if (column == NameCol) { + if (order == Qt::AscendingOrder) + std::sort(m_tables.begin(), m_tables.end(), compareByName); + else + std::sort(m_tables.begin(), m_tables.end(), [] (auto l, auto r) { return !compareByName(l, r); }); + } + else if (column == NamespaceCol) { + if (order == Qt::AscendingOrder) + std::sort(m_tables.begin(), m_tables.end(), compareBySchema); + else + std::sort(m_tables.begin(), m_tables.end(), [] (auto l, auto r) { return !compareBySchema(l, r); }); + } + + emit layoutChanged(); +} + +void TablesTableModel::doSort(int ) +{ +// if (so == 1) +// std::sort(m_tables.begin(), m_tables.end(), +// [] (auto l, auto r) -> bool { return l.relnamespace_name < r.relnamespace_name +// || (l.relnamespace_name == r.relnamespace_name && l.name < r.name); }); +// else +// std::sort(m_tables.begin(), m_tables.end(), +// [] (auto l, auto r) -> bool { return l.name < r.name; }); } diff --git a/pglab/TablesTableModel.h b/pglab/TablesTableModel.h index 5b83013..2c9b16e 100644 --- a/pglab/TablesTableModel.h +++ b/pglab/TablesTableModel.h @@ -25,6 +25,7 @@ public: void setCatalog(std::shared_ptr cat); + virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; void setSortOrder(int so); // Header: