pgLab/pglab/util/PgLabTableViewHelper.h

118 lines
2.7 KiB
C
Raw Normal View History

#pragma once
#include <QTableWidget>
2023-01-24 17:47:52 +00:00
#include <QTreeView>
#include <QSortFilterProxyModel>
2023-01-24 17:47:52 +00:00
#include "util/PgLabItemDelegate.h"
2022-04-09 07:10:29 +02:00
#include "util/PgLabTableView.h"
#include <optional>
class PgDatabaseCatalog;
2023-01-24 17:47:52 +00:00
template <typename ViewType>
void ResizeColumnsToContent(ViewType *vt)
{
vt->resizeColumnsToContents();
}
template <>
inline void ResizeColumnsToContent<QTreeView>(QTreeView *)
{
}
template <typename ViewType>
void InitView(ViewType *vt)
{}
template <>
inline void InitView<QTreeView>(QTreeView *tv)
{
tv->setAlternatingRowColors(true);
tv->setItemDelegate(new PgLabItemDelegate(tv));
tv->setWordWrap(false);
}
template <typename TableModel, typename ViewType = PgLabTableView>
class PgLabTableViewHelper {
public:
PgLabTableViewHelper(QWidget * parent, TableModel *tableModel)
{
2023-01-24 17:47:52 +00:00
m_itemView = new ViewType(parent);
InitView(m_itemView);
m_dataModel = tableModel;
m_sortFilter = new QSortFilterProxyModel(parent);
m_sortFilter->setSourceModel(m_dataModel);
2023-01-24 17:47:52 +00:00
m_itemView->setModel(m_sortFilter);
m_itemView->setSortingEnabled(true);
2022-04-02 13:54:37 +02:00
m_sortFilter->sort(0, Qt::AscendingOrder);
}
PgLabTableViewHelper(QWidget * parent)
: PgLabTableViewHelper(parent, new TableModel(parent))
{}
2023-01-24 17:47:52 +00:00
ViewType *itemView() const
{
2023-01-24 17:47:52 +00:00
return m_itemView;
}
TableModel *dataModel() const
{
return m_dataModel;
}
QSortFilterProxyModel *sortFilter() const
{
return m_sortFilter;
}
void setCatalog(std::shared_ptr<PgDatabaseCatalog> cat)
{
m_dataModel->setCatalog(cat);
2023-01-24 17:47:52 +00:00
ResizeColumnsToContent(m_itemView);
}
QModelIndex currentSourceIndex() const
{
2023-01-24 17:47:52 +00:00
QModelIndex index = m_itemView->selectionModel()->currentIndex();
if (!index.isValid())
return index;
return m_sortFilter->mapToSource(index);
}
2023-01-24 17:47:52 +00:00
typename TableModel::RowItem rowItemForSourceRow(QModelIndex index) const
{
2023-01-24 17:47:52 +00:00
return m_dataModel->rowItem(index);
}
typename TableModel::RowItem rowItemForProxyIndex(QModelIndex index)
{
QModelIndex sourceIndex = m_sortFilter->mapToSource(index);
2023-01-24 17:47:52 +00:00
return m_dataModel->rowItem(sourceIndex);
}
typename TableModel::RowItem rowItemForProxyRow(int row) const
{
return rowItemForProxyIndex(m_sortFilter->index(row, 0, QModelIndex()));
}
std::optional<typename TableModel::RowItem> currentRowItem() const
{
auto index = currentSourceIndex();
if (!index.isValid())
return {};
2023-01-24 17:47:52 +00:00
return rowItemForSourceRow(index);
}
private:
2023-01-24 17:47:52 +00:00
ViewType *m_itemView = nullptr;
TableModel *m_dataModel = nullptr;
QSortFilterProxyModel *m_sortFilter = nullptr;
};