The custom tableview in pgLab installs a custom delegate that tends to do what we need automatically and is more efficient. However it doesn't support custom colouring so we need to use the standard QStyledDelegate for the type column to get that working.
77 lines
2.6 KiB
C++
77 lines
2.6 KiB
C++
#include "ColumnPage.h"
|
|
|
|
#include "ColumnTableModel.h"
|
|
#include "CustomFilterSortModel.h"
|
|
#include "CustomDataRole.h"
|
|
#include "PgLabTableView.h"
|
|
#include "ResultTableModelUtil.h"
|
|
#include "SqlCodePreview.h"
|
|
//#include "PgLabItemDelegate.h"
|
|
#include "SqlFormattingUtils.h"
|
|
#include "UserConfiguration.h"
|
|
#include "catalog/PgClass.h"
|
|
#include <QSortFilterProxyModel>
|
|
#include <QStyledItemDelegate>
|
|
#include <QStringBuilder>
|
|
#include <unordered_set>
|
|
|
|
ColumnPage::ColumnPage(QWidget *parent)
|
|
: QSplitter(Qt::Vertical, parent)
|
|
{
|
|
m_tableView = new PgLabTableView(this);
|
|
m_definitionView = new SqlCodePreview(this);
|
|
addWidget(m_tableView);
|
|
addWidget(m_definitionView);
|
|
|
|
m_columnModel = new ColumnTableModel(this);
|
|
m_sortFilterProxy = new QSortFilterProxyModel(this);
|
|
m_sortFilterProxy->setSourceModel(m_columnModel);
|
|
m_tableView->setItemDelegateForColumn(ColumnTableModel::TypeCol, new QStyledItemDelegate(this));
|
|
m_tableView->setModel(m_sortFilterProxy);
|
|
m_tableView->setSortingEnabled(true);
|
|
m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
m_sortFilterProxy->sort(ColumnTableModel::AttnumCol, Qt::AscendingOrder);
|
|
|
|
connect(m_tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
|
|
this, &ColumnPage::tableView_selectionChanged);
|
|
}
|
|
|
|
void ColumnPage::setData(std::shared_ptr<const PgDatabaseCatalog> cat, const std::optional<PgClass> &cls)
|
|
{
|
|
m_catalog = cat;
|
|
m_definitionView->setCatalog(cat);
|
|
m_columnModel->setData(cat, cls);
|
|
m_Class = cls;
|
|
m_tableView->resizeColumnsToContents();
|
|
m_definitionView->setPlainText("");
|
|
}
|
|
|
|
void ColumnPage::tableView_selectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/)
|
|
{
|
|
auto&& indexes = m_tableView->selectionModel()->selectedIndexes();
|
|
std::unordered_set<int> rijen;
|
|
for (const auto &e : indexes)
|
|
rijen.insert(m_sortFilterProxy->mapToSource(e).row());
|
|
|
|
|
|
QString drops;
|
|
QString addsql;
|
|
auto iter = rijen.begin();
|
|
if (iter != rijen.end()) {
|
|
auto && col = m_columnModel->column(*iter);
|
|
drops = "ALTER TABLE " % m_Class->fullyQualifiedQuotedObjectName() % "\n DROP COLUMN " % quoteIdent(col.name);
|
|
addsql = "ALTER TABLE " % m_Class->fullyQualifiedQuotedObjectName() % "\n ADD COLUMN " % col.columnDefinition(*m_catalog);
|
|
for (++iter; iter != rijen.end(); ++iter) {
|
|
auto && col = m_columnModel->column(*iter);
|
|
drops += ",\n DROP COLUMN " % quoteIdent(col.name);
|
|
addsql += ",\n ADD COLUMN " % col.columnDefinition(*m_catalog);
|
|
}
|
|
drops += ";";
|
|
addsql += ";";
|
|
m_definitionView->setPlainText(drops % "\n\n" % addsql);
|
|
}
|
|
else {
|
|
m_definitionView->setPlainText("");
|
|
}
|
|
|
|
}
|