pgLab/pglab/CrudTab.cpp
eelke 1a208a6a2d Crud page has now reload action.
F5 key is bound to the execute query, reload catalog and reload crud
actions. By using addAction to add these actions to the relevant pages
the ambiguity of the shortcut is resolved.
2019-10-13 07:31:48 +02:00

108 lines
2.9 KiB
C++

#include "CrudTab.h"
#include "ui_CrudTab.h"
#include "CrudModel.h"
#include "ResultTableModelUtil.h"
#include "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>
CrudTab::CrudTab(IDatabaseWindow *context, QWidget *parent)
: QWidget(parent)
, m_context(context)
, ui(new Ui::CrudTab)
{
ui->setupUi(this);
m_db = context->openDatabase();
SetTableViewDefault(ui->tableView);
auto delegate = new PgLabItemDelegate(ui->tableView);
ui->tableView->setItemDelegate(delegate);
m_crudModel = new CrudModel(parent);
ui->tableView->setModel(m_crudModel);
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);
}
CrudTab::~CrudTab()
{
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;
auto selection = ui->tableView->selectionModel()->selection();
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)
{
auto menu = new QMenu(this);
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));
}