pgLab/pglab/crud/CrudTab.cpp

156 lines
4.3 KiB
C++
Raw Normal View History

#include "CrudTab.h"
2018-01-08 20:45:52 +01:00
#include "ui_CrudTab.h"
#include "CrudModel.h"
2022-04-02 08:33:48 +02:00
#include "CustomDataRole.h"
#include "ResultTableModelUtil.h"
2022-04-09 07:10:29 +02:00
#include "util/PgLabItemDelegate.h"
#include "IntegerRange.h"
#include "OpenDatabase.h"
#include "catalog/PgClassContainer.h"
#include "catalog/PgDatabaseCatalog.h"
#include <QDebug>
#include <QMenu>
#include <QMessageBox>
#include <iterator>
#include <set>
2018-01-08 20:45:52 +01:00
CrudTab::CrudTab(IDatabaseWindow *context, QWidget *parent)
2019-08-15 18:00:19 +02:00
: QWidget(parent)
, ui(new Ui::CrudTab)
, m_context(context)
2018-01-08 20:45:52 +01:00
{
ui->setupUi(this);
m_db = context->openDatabase();
2019-08-15 18:00:19 +02:00
SetTableViewDefault(ui->tableView);
auto delegate = new PgLabItemDelegate(ui->tableView);
ui->tableView->setItemDelegate(delegate);
m_crudModel = new CrudModel(nullptr);
2021-07-02 20:04:34 +02:00
m_SortFilterProxy = new QSortFilterProxyModel(this);
m_SortFilterProxy->setSourceModel(m_crudModel);
2022-04-02 08:33:48 +02:00
m_SortFilterProxy->setSortRole(CustomSortRole);
2021-07-02 20:04:34 +02:00
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);
ui->tableView->addAction(ui->actionRemove_rows);
auto horizontal_header = ui->tableView->horizontalHeader();
horizontal_header->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
connect(horizontal_header, &QHeaderView::customContextMenuRequested,
this, &CrudTab::headerCustomContextMenu);
2018-01-08 20:45:52 +01:00
}
CrudTab::~CrudTab()
{
delete m_crudModel;
2018-01-08 20:45:52 +01:00
delete ui;
}
void CrudTab::setConfig(Oid oid) //std::shared_ptr<OpenDatabase> db, const PgClass &table)
{
m_table = *m_db->catalog()->classes()->getByKey(oid);
m_crudModel->setConfig(m_db, *m_table);
m_context->setTitleForWidget(this, m_table->objectName(), "");
}
void CrudTab::refresh()
{
m_crudModel->loadData();
}
void CrudTab::on_actionRemove_rows_triggered()
{
std::set<IntegerRange<int>> row_ranges;
2021-07-02 20:04:34 +02:00
auto selection = m_SortFilterProxy->mapSelectionToSource(ui->tableView->selectionModel()->selection());
2022-04-10 10:29:40 +02:00
for (auto& range : selection) {
row_ranges.emplace(range.top(), range.height());
}
std::set<IntegerRange<int>> merged_ranges;
merge_ranges(row_ranges.begin(), row_ranges.end(), std::inserter(merged_ranges, merged_ranges.begin()));
QString msg = tr("Are you certain you want to remove the following row(s)?");
msg += "\n";
bool first = true;
for (auto range : merged_ranges) {
if (first) first = false;
else msg += ", ";
auto s = range.start() + 1, e = range.end();
if (s == e)
msg += QString("%1").arg(s);
else
msg += QString("%1 through %2").arg(s).arg(e);
msg += " ";
}
auto res = QMessageBox::question(this, "pgLab", msg, QMessageBox::Yes, QMessageBox::No);
if (res == QMessageBox::Yes) {
auto [res, msg] = m_crudModel->removeRows(merged_ranges);
if (!res) {
QMessageBox::critical(this, "pgLab", msg, QMessageBox::Close);
}
}
}
void CrudTab::headerCustomContextMenu(const QPoint &pos)
{
if (!headerContextMenu)
buildHeaderContextMenu();
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<QString> 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);
}
);
}
}