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.
108 lines
2.9 KiB
C++
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));
|
|
}
|