Caused by the fact the the tab was not freed. Now the widgets on the tabs are freed when they are closed which in turns frees (and closes) the connection objects.
113 lines
3.2 KiB
C++
113 lines
3.2 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(nullptr);
|
|
|
|
m_SortFilterProxy = new QSortFilterProxyModel(this);
|
|
m_SortFilterProxy->setSourceModel(m_crudModel);
|
|
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<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 = m_SortFilterProxy->mapSelectionToSource(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));
|
|
}
|