QueryTool now uses the same DataGrid as the CRUD tool.
This commit is contained in:
parent
bbe52c9db8
commit
5e7fb68c55
15 changed files with 135 additions and 203 deletions
|
|
@ -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 {};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
34
pglab/crud/DataGridWidget.cpp
Normal file
34
pglab/crud/DataGridWidget.cpp
Normal 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);
|
||||
}
|
||||
28
pglab/crud/DataGridWidget.h
Normal file
28
pglab/crud/DataGridWidget.h
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue