Added a ModelSummary class to make the overview over the model content accessible via QProperty system & a SummaryWidget to show this information. Only property rowCount as a proof of concept. Other properties will follow.

This commit is contained in:
2026-02-15 16:36:13 +01:00
parent b28a35280c
commit dac9ac46f2
12 changed files with 157 additions and 10 deletions

View File

@ -37,6 +37,7 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
widgets/comboboxdelegate.h widgets/comboboxdelegate.cpp widgets/comboboxdelegate.h widgets/comboboxdelegate.cpp
widgets/spinboxdelegate.h widgets/spinboxdelegate.cpp widgets/spinboxdelegate.h widgets/spinboxdelegate.cpp
widgets/biddingroundcontrol.h widgets/biddingroundcontrol.cpp widgets/biddingroundcontrol.h widgets/biddingroundcontrol.cpp
widgets/summarywidget.h widgets/summarywidget.cpp
) )
# Define target properties for Android with Qt 6 as: # Define target properties for Android with Qt 6 as:
# set_property(TARGET ${TARGET_APP} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR # set_property(TARGET ${TARGET_APP} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR

View File

@ -16,10 +16,12 @@
#include "genericcore.h" #include "genericcore.h"
#include "model/generalsortfiltermodel.h" #include "model/generalsortfiltermodel.h"
#include "model/metadata.h" #include "model/metadata.h"
#include "model/modelsummary.h"
#include "model/tablemodel.h" #include "model/tablemodel.h"
#include "widgets/biddingroundcontrol.h" #include "widgets/biddingroundcontrol.h"
#include "widgets/comboboxdelegate.h" #include "widgets/comboboxdelegate.h"
#include "widgets/spinboxdelegate.h" #include "widgets/spinboxdelegate.h"
#include "widgets/summarywidget.h"
static int intColumnWidth = 30; static int intColumnWidth = 30;
@ -349,6 +351,8 @@ void MainWindow::setupModelViews() {
ui->tableView->setModel((QAbstractItemModel*)m_proxyModel.get()); ui->tableView->setModel((QAbstractItemModel*)m_proxyModel.get());
ui->tableView->setSortingEnabled(true); ui->tableView->setSortingEnabled(true);
ui->tableView->setColumnWidth(0, intColumnWidth); ui->tableView->setColumnWidth(0, intColumnWidth);
m_modelSummary = m_core->getModelSummary();
} }
void MainWindow::createActions() { void MainWindow::createActions() {
@ -554,5 +558,8 @@ void MainWindow::setupEventTab() {
connect(m_core.get(), &GenericCore::currentBiddingRoundChanged, m_biddingRoundControl.get(), connect(m_core.get(), &GenericCore::currentBiddingRoundChanged, m_biddingRoundControl.get(),
&BiddingRoundControl::onCurrentBiddingRoundChanged); &BiddingRoundControl::onCurrentBiddingRoundChanged);
SummaryWidget* summaryWidget = new SummaryWidget(m_modelSummary, this);
containerLayout->addWidget(summaryWidget);
ui->tabWidget->insertTab(0, containerWidget, "Event (&1)"); ui->tabWidget->insertTab(0, containerWidget, "Event (&1)");
} }

View File

@ -17,6 +17,7 @@ QT_END_NAMESPACE
class GenericCore; class GenericCore;
class TableModel; class TableModel;
class GeneralSortFilterModel; class GeneralSortFilterModel;
class ModelSummary;
class NewItemDialog; class NewItemDialog;
class EditItemDialog; class EditItemDialog;
class BiddingRoundControl; class BiddingRoundControl;
@ -73,9 +74,12 @@ class MainWindow : public QMainWindow {
unique_ptr<GenericCore> m_core; unique_ptr<GenericCore> m_core;
shared_ptr<GeneralSortFilterModel> m_proxyModel; shared_ptr<GeneralSortFilterModel> m_proxyModel;
shared_ptr<ModelSummary> m_modelSummary;
QUndoStack* m_modelUndoStack; QUndoStack* m_modelUndoStack;
unique_ptr<QUndoView> m_modelUndoView; unique_ptr<QUndoView> m_modelUndoView;
unique_ptr<BiddingRoundControl> m_biddingRoundControl; unique_ptr<BiddingRoundControl> m_biddingRoundControl;
/// File actions /// File actions
unique_ptr<QAction> m_newFileAct; unique_ptr<QAction> m_newFileAct;
unique_ptr<QAction> m_openAct; unique_ptr<QAction> m_openAct;

View File

@ -0,0 +1,30 @@
#include "summarywidget.h"
#include <QLabel>
#include <QProperty>
#include <QVBoxLayout>
#include <model/modelsummary.h>
SummaryWidget::SummaryWidget(std::shared_ptr<ModelSummary> modelSummary, QWidget* parent)
: QWidget{parent}
, m_modelSummary(modelSummary) {
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QProperty<int> nRows(-1);
QHBoxLayout* footerLayout = new QHBoxLayout();
QLabel* rowCountLabel = new QLabel("Row count:");
m_rowCoundValueLabel = new QLabel(QString::number(nRows));
QObject::connect(m_modelSummary.get(), &ModelSummary::rowCountChanged, [&]() {
m_rowCoundValueLabel->setText(QString::number(m_modelSummary->rowCount()));
});
m_modelSummary->bindableRowCount().setBinding([&]() { return nRows.value(); });
footerLayout->addWidget(rowCountLabel);
footerLayout->addWidget(m_rowCoundValueLabel);
mainLayout->addLayout(footerLayout);
setLayout(mainLayout);
}

View File

@ -0,0 +1,21 @@
#ifndef SUMMARYWIDGET_H
#define SUMMARYWIDGET_H
#include <QWidget>
class ModelSummary;
class QLabel;
class SummaryWidget : public QWidget {
Q_OBJECT
public:
explicit SummaryWidget(std::shared_ptr<ModelSummary> modelSummary, QWidget* parent = nullptr);
private:
std::shared_ptr<ModelSummary> m_modelSummary;
QLabel* m_rowCoundValueLabel;
};
#endif // SUMMARYWIDGET_H

View File

@ -32,6 +32,7 @@ add_library(${TARGET_APP} STATIC
model/tablemodel.h model/tablemodel.cpp model/tablemodel.h model/tablemodel.cpp
model/modelitem.h model/modelitem.cpp model/modelitem.h model/modelitem.cpp
model/generalsortfiltermodel.h model/generalsortfiltermodel.cpp model/generalsortfiltermodel.h model/generalsortfiltermodel.cpp
model/modelsummary.h model/modelsummary.cpp
model/commands/insertrowscommand.h model/commands/insertrowscommand.cpp model/commands/insertrowscommand.h model/commands/insertrowscommand.cpp
model/commands/removerowscommand.h model/commands/removerowscommand.cpp model/commands/removerowscommand.h model/commands/removerowscommand.cpp
model/commands/edititemcommand.h model/commands/edititemcommand.cpp model/commands/edititemcommand.h model/commands/edititemcommand.cpp

View File

@ -17,11 +17,10 @@
#include "data/settingshandler.h" #include "data/settingshandler.h"
#include "model/generalsortfiltermodel.h" #include "model/generalsortfiltermodel.h"
#include "model/metadata.h" #include "model/metadata.h"
#include "model/modelsummary.h"
#include "model/tablemodel.h" #include "model/tablemodel.h"
#include "network/servercommunicator.h" #include "network/servercommunicator.h"
using namespace std;
GenericCore::GenericCore() { GenericCore::GenericCore() {
qDebug() << "Creating core..."; qDebug() << "Creating core...";
@ -97,6 +96,8 @@ std::shared_ptr<GeneralSortFilterModel> GenericCore::getSortFilterModel() const
return m_sortFilterModel; return m_sortFilterModel;
} }
shared_ptr<ModelSummary> GenericCore::getModelSummary() const { return m_modelSummary; }
/** /**
* Save items to default file (in standard location). * Save items to default file (in standard location).
* @brief GenericCore::saveItems Saves item fo file. * @brief GenericCore::saveItems Saves item fo file.
@ -163,6 +164,8 @@ void GenericCore::setupModels() {
m_mainModel = make_shared<TableModel>(m_modelUndoStack, this); m_mainModel = make_shared<TableModel>(m_modelUndoStack, this);
m_sortFilterModel = make_shared<GeneralSortFilterModel>(m_mainModel); m_sortFilterModel = make_shared<GeneralSortFilterModel>(m_mainModel);
m_modelSummary = make_shared<ModelSummary>(m_mainModel, this);
/// QAbstractItemModelTester /// QAbstractItemModelTester
#ifdef QT_DEBUG #ifdef QT_DEBUG
m_mainModelTester = make_unique<QAbstractItemModelTester>( m_mainModelTester = make_unique<QAbstractItemModelTester>(

View File

@ -14,8 +14,11 @@ class QString;
class TableModel; class TableModel;
class GeneralSortFilterModel; class GeneralSortFilterModel;
class ModelSummary;
class ServerCommunicator; class ServerCommunicator;
using namespace std;
class GenericCore : public QObject { class GenericCore : public QObject {
Q_OBJECT Q_OBJECT
@ -30,8 +33,10 @@ class GenericCore : public QObject {
void triggerApplicationUpdate(const bool saveChanges); void triggerApplicationUpdate(const bool saveChanges);
QUndoStack* getModelUndoStack() const; QUndoStack* getModelUndoStack() const;
std::shared_ptr<TableModel> getModel() const;
std::shared_ptr<GeneralSortFilterModel> getSortFilterModel() const; shared_ptr<TableModel> getModel() const;
shared_ptr<GeneralSortFilterModel> getSortFilterModel() const;
shared_ptr<ModelSummary> getModelSummary() const;
void saveItems(); void saveItems();
void importCSVFile(const QString& filePath); void importCSVFile(const QString& filePath);
@ -60,10 +65,11 @@ class GenericCore : public QObject {
private: private:
QUndoStack* m_modelUndoStack; QUndoStack* m_modelUndoStack;
std::shared_ptr<TableModel> m_mainModel; shared_ptr<TableModel> m_mainModel;
std::shared_ptr<GeneralSortFilterModel> m_sortFilterModel; shared_ptr<GeneralSortFilterModel> m_sortFilterModel;
std::unique_ptr<QAbstractItemModelTester> m_mainModelTester; shared_ptr<ModelSummary> m_modelSummary;
std::unique_ptr<QAbstractItemModelTester> m_proxyModelTester; unique_ptr<QAbstractItemModelTester> m_mainModelTester;
unique_ptr<QAbstractItemModelTester> m_proxyModelTester;
void setupModels(); void setupModels();
void initModelData(); void initModelData();
@ -71,7 +77,7 @@ class GenericCore : public QObject {
QString getMaintenanceToolFilePath() const; QString getMaintenanceToolFilePath() const;
/// Network communication /// Network communication
std::unique_ptr<ServerCommunicator> m_serverCommunicator; unique_ptr<ServerCommunicator> m_serverCommunicator;
void setupServerConfiguration(); void setupServerConfiguration();
void applyServerConfiguration(); void applyServerConfiguration();
}; };

View File

@ -0,0 +1,22 @@
#include "modelsummary.h"
#include "tablemodel.h"
ModelSummary::ModelSummary(std::shared_ptr<TableModel> model, QObject* parent)
: QObject(parent)
, m_model(model) {
Q_ASSERT(model);
connect(m_model.get(), &TableModel::rowCountChanged, this, &ModelSummary::rowCountChanged);
}
ModelSummary::~ModelSummary() {}
int ModelSummary::rowCount() const {
const int nRows = m_model->rowCount();
return nRows;
}
QBindable<int> ModelSummary::bindableRowCount() {
m_rowCount = m_model->rowCount();
return &m_rowCount;
}

View File

@ -0,0 +1,32 @@
#ifndef MODELSUMMARY_H
#define MODELSUMMARY_H
#include <QObject>
#include <QProperty>
class TableModel;
using namespace std;
class ModelSummary : public QObject {
Q_OBJECT
Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged BINDABLE bindableRowCount)
public:
ModelSummary(shared_ptr<TableModel> model, QObject* parent = nullptr);
~ModelSummary();
int rowCount() const;
QBindable<int> bindableRowCount();
signals:
void rowCountChanged();
private:
shared_ptr<TableModel> m_model;
Q_OBJECT_BINDABLE_PROPERTY(ModelSummary, int, m_rowCount, &ModelSummary::rowCountChanged);
};
#endif // MODELSUMMARY_H

View File

@ -46,7 +46,10 @@ QByteArray TableModel::generateExampleItems() {
TableModel::TableModel(QUndoStack* undoStack, QObject* parent) TableModel::TableModel(QUndoStack* undoStack, QObject* parent)
: QAbstractTableModel{parent} : QAbstractTableModel{parent}
, m_undoStack(undoStack) {} , m_undoStack(undoStack) {
connect(this, &TableModel::rowsInserted, this, &TableModel::onRowCountChanged);
connect(this, &TableModel::rowsRemoved, this, &TableModel::onRowCountChanged);
}
Qt::ItemFlags TableModel::flags(const QModelIndex& index) const { Qt::ItemFlags TableModel::flags(const QModelIndex& index) const {
if (!index.isValid()) { if (!index.isValid()) {
@ -279,6 +282,16 @@ void TableModel::insertItems(int startPosition,
m_undoStack->push(insertCommand); m_undoStack->push(insertCommand);
} }
void TableModel::onRowCountChanged(const QModelIndex& parent, int first, int last) {
Q_UNUSED(first);
Q_UNUSED(last);
if (parent != QModelIndex()) {
return;
}
emit rowCountChanged();
}
void TableModel::execInsertItems(const int firstRow, const QList<ModelItemValues> valueList) { void TableModel::execInsertItems(const int firstRow, const QList<ModelItemValues> valueList) {
const int nRows = valueList.size(); const int nRows = valueList.size();
qDebug() << "Inserting" << nRows << "items..."; qDebug() << "Inserting" << nRows << "items...";

View File

@ -2,6 +2,7 @@
#define TABLEMODEL_H #define TABLEMODEL_H
#include <QAbstractTableModel> #include <QAbstractTableModel>
#include "metadata.h"
class QUndoStack; class QUndoStack;
class ModelItem; class ModelItem;
@ -55,6 +56,12 @@ class TableModel : public QAbstractTableModel {
const QList<ModelItemValues>& itemValuesList, const QList<ModelItemValues>& itemValuesList,
const QModelIndex& parentIndex = QModelIndex()); const QModelIndex& parentIndex = QModelIndex());
signals:
void rowCountChanged();
private slots:
void onRowCountChanged(const QModelIndex& parent, int first, int last);
private: private:
/// *** members *** /// *** members ***
// TODO shared_ptr -> unique_ptr // TODO shared_ptr -> unique_ptr