#pragma once #include #include #include #include "util/PgLabTableView.h" #include class PgDatabaseCatalog; template void ResizeColumnsToContent(ViewType *vt) { vt->resizeColumnsToContents(); } template <> inline void ResizeColumnsToContent(QTreeView *) { } template class PgLabTableViewHelper { public: PgLabTableViewHelper(QWidget * parent, TableModel *tableModel) { m_tableView = new ViewType(parent); m_dataModel = tableModel; m_sortFilter = new QSortFilterProxyModel(parent); m_sortFilter->setSourceModel(m_dataModel); m_tableView->setModel(m_sortFilter); m_tableView->setSortingEnabled(true); m_sortFilter->sort(0, Qt::AscendingOrder); } PgLabTableViewHelper(QWidget * parent) : PgLabTableViewHelper(parent, new TableModel(parent)) {} ViewType *tableView() const { return m_tableView; } TableModel *dataModel() const { return m_dataModel; } QSortFilterProxyModel *sortFilter() const { return m_sortFilter; } void setCatalog(std::shared_ptr cat) { m_dataModel->setCatalog(cat); ResizeColumnsToContent(m_tableView); } QModelIndex currentSourceIndex() const { QModelIndex index = m_tableView->selectionModel()->currentIndex(); if (!index.isValid()) return index; return m_sortFilter->mapToSource(index); } typename TableModel::RowItem rowItemForSourceRow(QModelIndex index) const { return m_dataModel->rowItem(index); } typename TableModel::RowItem rowItemForProxyIndex(QModelIndex index) { QModelIndex sourceIndex = m_sortFilter->mapToSource(index); return m_dataModel->rowItem(sourceIndex); } typename TableModel::RowItem rowItemForProxyRow(int row) const { return rowItemForProxyIndex(m_sortFilter->index(row, 0, QModelIndex())); } std::optional currentRowItem() const { auto index = currentSourceIndex(); if (!index.isValid()) return {}; return rowItemForSourceRow(index); } private: ViewType *m_tableView = nullptr; TableModel *m_dataModel = nullptr; QSortFilterProxyModel *m_sortFilter = nullptr; };