pgLab/pglab/crud/DataGridWidget.cpp

101 lines
2.8 KiB
C++

#include "DataGridWidget.h"
#include "CrudModel.h"
#include "CustomDataRole.h"
#include "ResultTableModelUtil.h"
#include "util/PgLabItemDelegate.h"
#include <QAction>
#include <QSortFilterProxyModel>
#include <QStyle>
#include <QTableView>
#include <QToolBar>
#include <QVBoxLayout>
DataGridWidget::DataGridWidget(QWidget *parent)
: QWidget(parent)
{
auto layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
m_toolbar = new QToolBar(this);
m_toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
layout->addWidget(m_toolbar);
m_actSave = new QAction(style()->standardIcon(QStyle::SP_DialogSaveButton), tr("Save"), this);
m_actSave->setShortcut(QKeySequence::Save);
m_actSave->setShortcutContext(Qt::WidgetWithChildrenShortcut);
m_actSave->setToolTip(tr("Save all pending changes to the database (Ctrl+S)"));
m_actSave->setEnabled(false);
addAction(m_actSave);
m_toolbar->addAction(m_actSave);
connect(m_actSave, &QAction::triggered, this, &DataGridWidget::onSave);
m_actRevert = new QAction(style()->standardIcon(QStyle::SP_DialogResetButton), tr("Revert"), this);
m_actRevert->setToolTip(tr("Discard all pending changes"));
m_actRevert->setEnabled(false);
m_toolbar->addAction(m_actRevert);
connect(m_actRevert, &QAction::triggered, this, &DataGridWidget::onRevert);
m_view = new QTableView(this);
layout->addWidget(m_view);
SetTableViewDefault(m_view);
auto delegate = new PgLabItemDelegate(m_view);
m_view->setItemDelegate(delegate);
}
void DataGridWidget::setSourceModel(QAbstractItemModel *model)
{
if (!m_proxy) {
m_proxy = new QSortFilterProxyModel(this);
m_proxy->setSortRole(CustomSortRole);
}
disconnect(m_pendingChangesConnection);
m_proxy->setSourceModel(model);
m_view->setModel(m_proxy);
m_view->setSortingEnabled(true);
m_proxy->sort(0, Qt::AscendingOrder);
auto crud = qobject_cast<CrudModel *>(model);
m_toolbar->setVisible(crud != nullptr);
if (crud) {
m_pendingChangesConnection = connect(crud, &CrudModel::pendingChangesChanged, this, &DataGridWidget::onPendingChangesChanged);
onPendingChangesChanged(crud->hasPendingChanges());
}
else {
onPendingChangesChanged(false);
}
}
void DataGridWidget::onPendingChangesChanged(bool hasChanges)
{
m_actSave->setEnabled(hasChanges);
m_actRevert->setEnabled(hasChanges);
}
void DataGridWidget::onSave()
{
auto crud = qobject_cast<CrudModel *>(m_proxy->sourceModel());
if (!crud)
return;
commitOpenEditor();
crud->saveChanges();
}
void DataGridWidget::onRevert()
{
auto crud = qobject_cast<CrudModel *>(m_proxy->sourceModel());
if (!crud)
return;
commitOpenEditor();
crud->revertChanges();
}
void DataGridWidget::commitOpenEditor()
{
// Moving focus away from the editor makes the delegate commit its value, a toolbar click does not take focus
if (m_view->indexWidget(m_view->currentIndex()))
m_view->setFocus();
}