From c20427e10dbcffd078b7e26b2a8632403cb0974a Mon Sep 17 00:00:00 2001 From: eelke Date: Mon, 11 Apr 2022 19:15:00 +0200 Subject: [PATCH] Menu to for going to specific column Columns are sorted alphabetically. --- pglab/crud/CrudTab.cpp | 54 ++++++++++++++++++++++++++++++++++++------ pglab/crud/CrudTab.h | 5 ++++ 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/pglab/crud/CrudTab.cpp b/pglab/crud/CrudTab.cpp index 3c7585b..a776879 100644 --- a/pglab/crud/CrudTab.cpp +++ b/pglab/crud/CrudTab.cpp @@ -36,6 +36,7 @@ CrudTab::CrudTab(IDatabaseWindow *context, QWidget *parent) m_SortFilterProxy->setSortRole(CustomSortRole); ui->tableView->setModel(m_SortFilterProxy); ui->tableView->setSortingEnabled(true); + m_SortFilterProxy->sort(0, Qt::AscendingOrder); ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); @@ -103,13 +104,52 @@ void CrudTab::on_actionRemove_rows_triggered() void CrudTab::headerCustomContextMenu(const QPoint &pos) { - auto menu = new QMenu(this); + if (!headerContextMenu) + buildHeaderContextMenu(); - QAction *action = new QAction(QIcon(":/icons/script_go.png"), tr("Refresh"), this); - action->setShortcut(QKeySequence(Qt::Key_F5)); - connect(action, &QAction::triggered, this, &CrudTab::refresh); - menu->addAction(action); - auto horizontal_header = ui->tableView->horizontalHeader(); - menu->popup(horizontal_header->mapToGlobal(pos)); + if (headerContextMenu) + { + auto horizontal_header = ui->tableView->horizontalHeader(); + headerContextMenu->popup(horizontal_header->mapToGlobal(pos)); + } +} + +void CrudTab::gotoColumn(QString column) +{ + for (int i = 1; i < m_crudModel->columnCount(); ++i) + { + auto name = m_crudModel->headerData(i, Qt::Horizontal).toString(); + if (name == column) + { + auto index = ui->tableView->currentIndex(); + index = ui->tableView->model()->index(index.row(), i); + ui->tableView->setCurrentIndex(index); + break; + } + } +} + +void CrudTab::buildHeaderContextMenu() +{ + delete headerContextMenu; + headerContextMenu = new QMenu(this); + auto columnMenu = headerContextMenu->addMenu("Go to column"); + + std::vector columnNames; + for (int i = 1; i < m_crudModel->columnCount(); ++i) + columnNames.push_back(m_crudModel->headerData(i, Qt::Horizontal).toString()); + + std::sort(columnNames.begin(), columnNames.end()); + for (auto& columnName : columnNames) + { + auto action = new QAction(columnName, this); + columnMenu->addAction(action); + connect(action, &QAction::triggered, this, + [this, columnName] () + { + gotoColumn(columnName); + } + ); + } } diff --git a/pglab/crud/CrudTab.h b/pglab/crud/CrudTab.h index 12bbc1f..ef91325 100644 --- a/pglab/crud/CrudTab.h +++ b/pglab/crud/CrudTab.h @@ -14,6 +14,7 @@ namespace Ui { class OpenDatabase; class CrudModel; +class QMenu; class CrudTab : public QWidget { Q_OBJECT @@ -34,11 +35,15 @@ private: CrudModel *m_crudModel = nullptr; QSortFilterProxyModel *m_SortFilterProxy = nullptr; + QMenu *headerContextMenu = nullptr; + void initActions(); + void buildHeaderContextMenu(); private slots: void on_actionRemove_rows_triggered(); void headerCustomContextMenu(const QPoint &pos); + void gotoColumn(QString column); };