QueryTool now uses the same DataGrid as the CRUD tool.

This commit is contained in:
eelke 2026-10-18 10:29:24 +02:00
parent bbe52c9db8
commit 5e7fb68c55
15 changed files with 135 additions and 203 deletions

View file

@ -10,6 +10,7 @@
#include "CustomDataRole.h"
#include <QtConcurrent>
#include <QFuture>
#include <QBrush>
#include <QMessageBox>
#include "Pgsql_oids.h"
#include "Pgsql_PgException.h"
@ -217,6 +218,8 @@ QVariant CrudModel::data(const QModelIndex &index, int role) const
if (value)
return StringToVariant(value->c_str(), typ);
}
else if (role == Qt::ForegroundRole && !m_wholeTable && columnIsReadOnly(index.column()))
return QBrush(Qt::gray);
return {};
}

View file

@ -3,16 +3,19 @@
#include "CrudModel.h"
#include "CustomDataRole.h"
#include "ResultTableModelUtil.h"
#include "util/PgLabItemDelegate.h"
#include "DataGridWidget.h"
#include "IntegerRange.h"
#include "OpenDatabase.h"
#include "catalog/PgClassContainer.h"
#include "catalog/PgDatabaseCatalog.h"
#include <QDebug>
#include <QHeaderView>
#include <QMenu>
#include <QSortFilterProxyModel>
#include <QMessageBox>
#include <iterator>
#include <set>
#include <QTableView>
CrudTab::CrudTab(IDatabaseWindow *context, QWidget *parent)
@ -24,25 +27,18 @@ CrudTab::CrudTab(IDatabaseWindow *context, QWidget *parent)
m_db = context->openDatabase();
SetTableViewDefault(ui->tableView);
auto delegate = new PgLabItemDelegate(ui->tableView);
ui->tableView->setItemDelegate(delegate);
m_crudModel = new CrudModel(nullptr);
m_SortFilterProxy = new QSortFilterProxyModel(this);
m_SortFilterProxy->setSourceModel(m_crudModel);
m_SortFilterProxy->setSortRole(CustomSortRole);
ui->tableView->setModel(m_SortFilterProxy);
ui->tableView->setSortingEnabled(true);
m_SortFilterProxy->sort(0, Qt::AscendingOrder);
m_grid = new DataGridWidget(this);
ui->verticalLayout->addWidget(m_grid);
m_grid->setSourceModel(m_crudModel);
m_grid->view()->verticalHeader()->setVisible(false);
ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->addAction(ui->actionRemove_rows);
m_grid->view()->setSelectionMode(QAbstractItemView::ExtendedSelection);
m_grid->view()->setSelectionBehavior(QAbstractItemView::SelectRows);
m_grid->view()->addAction(ui->actionRemove_rows);
auto horizontal_header = ui->tableView->horizontalHeader();
auto horizontal_header = m_grid->view()->horizontalHeader();
horizontal_header->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
connect(horizontal_header, &QHeaderView::customContextMenuRequested,
this, &CrudTab::headerCustomContextMenu);
@ -70,7 +66,7 @@ void CrudTab::refresh()
void CrudTab::on_actionRemove_rows_triggered()
{
std::set<IntegerRange<int>> row_ranges;
auto selection = m_SortFilterProxy->mapSelectionToSource(ui->tableView->selectionModel()->selection());
auto selection = m_grid->proxy()->mapSelectionToSource(m_grid->view()->selectionModel()->selection());
for (auto& range : selection) {
row_ranges.emplace(range.top(), range.height());
}
@ -110,7 +106,7 @@ void CrudTab::headerCustomContextMenu(const QPoint &pos)
if (headerContextMenu)
{
auto horizontal_header = ui->tableView->horizontalHeader();
auto horizontal_header = m_grid->view()->horizontalHeader();
headerContextMenu->popup(horizontal_header->mapToGlobal(pos));
}
}
@ -122,9 +118,9 @@ void CrudTab::gotoColumn(QString column)
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);
auto index = m_grid->view()->currentIndex();
index = m_grid->view()->model()->index(index.row(), i);
m_grid->view()->setCurrentIndex(index);
break;
}
}

View file

@ -1,7 +1,6 @@
#ifndef CRUDTAB_H
#define CRUDTAB_H
#include <QSortFilterProxyModel>
#include "catalog/PgClass.h"
#include "IDatabaseWindow.h"
#include <QWidget>
@ -14,6 +13,7 @@ namespace Ui {
class OpenDatabase;
class CrudModel;
class DataGridWidget;
class QMenu;
class CrudTab : public QWidget {
@ -33,7 +33,7 @@ private:
std::optional<PgClass> m_table;
CrudModel *m_crudModel = nullptr;
QSortFilterProxyModel *m_SortFilterProxy = nullptr;
DataGridWidget *m_grid = nullptr;
QMenu *headerContextMenu = nullptr;

View file

@ -13,15 +13,7 @@
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTableView" name="tableView">
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
<layout class="QVBoxLayout" name="verticalLayout"/>
<action name="actionRemove_rows">
<property name="text">
<string>Remove rows</string>

View file

@ -0,0 +1,34 @@
#include "DataGridWidget.h"
#include "CustomDataRole.h"
#include "ResultTableModelUtil.h"
#include "util/PgLabItemDelegate.h"
#include <QSortFilterProxyModel>
#include <QTableView>
#include <QVBoxLayout>
DataGridWidget::DataGridWidget(QWidget *parent)
: QWidget(parent)
{
auto layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
m_view = new QTableView(this);
layout->addWidget(m_view);
SetTableViewDefault(m_view);
auto delegate = new PgLabItemDelegate(m_view);
m_view->setItemDelegate(delegate);
}
void DataGridWidget::setSourceModel(QAbstractItemModel *model)
{
if (!m_proxy) {
m_proxy = new QSortFilterProxyModel(this);
m_proxy->setSortRole(CustomSortRole);
}
m_proxy->setSourceModel(model);
m_view->setModel(m_proxy);
m_view->setSortingEnabled(true);
m_proxy->sort(0, Qt::AscendingOrder);
}

View file

@ -0,0 +1,28 @@
#ifndef DATAGRIDWIDGET_H
#define DATAGRIDWIDGET_H
#include <QWidget>
class QAbstractItemModel;
class QSortFilterProxyModel;
class QTableView;
/** Sortable and editable grid shared by the CRUD tab and the query result tab.
*/
class DataGridWidget : public QWidget {
Q_OBJECT
public:
explicit DataGridWidget(QWidget *parent = nullptr);
/// Sets the model to show, sorting is done by a proxy that uses CustomSortRole
void setSourceModel(QAbstractItemModel *model);
QTableView *view() const { return m_view; }
QSortFilterProxyModel *proxy() const { return m_proxy; }
private:
QTableView *m_view = nullptr;
QSortFilterProxyModel *m_proxy = nullptr;
};
#endif // DATAGRIDWIDGET_H