#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 #include #include #include #include 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 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> 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); } } } 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)); } void CrudTab::initActions() { { auto ac = new QAction(QIcon(":/icons/script_go.png"), tr("Refresh"), this); ac->setShortcut(QKeySequence(Qt::Key_F5)); connect(ac, &QAction::triggered, this, &CrudTab::refresh); m_refreshAction = ac; } } // TODO refresh action