#include "CrudTab.h" #include "ui_CrudTab.h" #include "CrudModel.h" #include "CustomDataRole.h" #include "ResultTableModelUtil.h" #include "util/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) , ui(new Ui::CrudTab) , m_context(context) { ui->setupUi(this); m_db = context->openDatabase(); SetTableViewDefault(ui->tableView); auto delegate = new PgLabItemDelegate(ui->tableView); ui->tableView->setItemDelegate(delegate); m_crudModel = new CrudModel(nullptr); m_SortFilterProxy = new QSortFilterProxyModel(this); m_SortFilterProxy->setSourceModel(m_crudModel); m_SortFilterProxy->setSortRole(CustomSortRole); ui->tableView->setModel(m_SortFilterProxy); ui->tableView->setSortingEnabled(true); 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 m_crudModel; 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 = m_SortFilterProxy->mapSelectionToSource(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)); }