pgLab/pglab/ColumnPage.cpp

84 lines
2.7 KiB
C++
Raw Normal View History

#include "ColumnPage.h"
#include "ResultTableModelUtil.h"
#include "UserConfiguration.h"
#include <QTableView>
#include "catalog/PgClass.h"
#include "SqlCodePreview.h"
#include "ColumnTableModel.h"
#include "CustomFilterSortModel.h"
#include "CustomDataRole.h"
#include "PgLabItemDelegate.h"
#include <QStringBuilder>
#include <boost/container/flat_set.hpp>
#include "SqlFormattingUtils.h"
ColumnPage::ColumnPage(QWidget *parent)
: QSplitter(Qt::Vertical, parent)
{
m_tableView = new QTableView(this);
m_definitionView = new SqlCodePreview(this);
addWidget(m_tableView);
addWidget(m_definitionView);
SetTableViewDefault(m_tableView);
m_columnModel = new ColumnTableModel(this);
m_sortFilterProxy = new CustomFilterSortModel(this);
m_sortFilterProxy->setSourceModel(m_columnModel);
m_tableView->setModel(m_sortFilterProxy);
m_tableView->setSortingEnabled(true);
m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
// With this delegate the coloring of the datatype column doesn't work....
// auto item_delegate = new PgLabItemDelegate(this);
// m_tableView->setItemDelegate(item_delegate);
//auto icon_delegate = new IconColumnDelegate(this);
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;
}
//void ColumnPage::setFilter(const std::optional<PgClass> &cls)
//{
// m_sortFilterProxy->setOidFilterTable(cls ? cls->oid() : InvalidOid, FirstHiddenValue);
//}
void ColumnPage::tableView_selectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/)
{
auto&& indexes = m_tableView->selectionModel()->selectedIndexes();
boost::container::flat_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("");
}
}