#include "CrudTab.h" #include "ui_CrudTab.h" #include "CrudModel.h" #include "DatabaseWindow.h" #include "ResultTableModelUtil.h" #include "PgLabItemDelegate.h" #include "IntegerRange.h" #include #include #include #include #include CrudTab::CrudTab(IPluginContentWidgetContext *context, DatabaseWindow *parent) : PluginContentWidget(context, parent) , ui(new Ui::CrudTab) , m_window(parent) { ui->setupUi(this); 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(std::shared_ptr db, const PgClass &table) { m_db = db; m_table = table; m_crudModel->setConfig(db, table); } void CrudTab::refresh() { m_crudModel->loadData(); } void CrudTab::on_actionRemove_rows_triggered() { std::set> row_ranges; auto selection = ui->tableView->selectionModel()->selection(); for (auto range : selection) { row_ranges.emplace(range.top(), range.height()); } std::set> 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); } } } std::vector CrudTab::getToolbarActions() { if (actions.empty()) { 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); actions.push_back(action); actions.push_back(ui->actionRemove_rows); } return actions; } 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)); }