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:
@ -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
|
||||||
|
|||||||
@ -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)");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
30
UIs/BeetRoundWidgets/widgets/summarywidget.cpp
Normal file
30
UIs/BeetRoundWidgets/widgets/summarywidget.cpp
Normal 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);
|
||||||
|
}
|
||||||
21
UIs/BeetRoundWidgets/widgets/summarywidget.h
Normal file
21
UIs/BeetRoundWidgets/widgets/summarywidget.h
Normal 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
|
||||||
@ -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
|
||||||
|
|||||||
@ -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>(
|
||||||
|
|||||||
@ -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();
|
||||||
};
|
};
|
||||||
|
|||||||
22
libs/BeetRoundCore/model/modelsummary.cpp
Normal file
22
libs/BeetRoundCore/model/modelsummary.cpp
Normal 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;
|
||||||
|
}
|
||||||
32
libs/BeetRoundCore/model/modelsummary.h
Normal file
32
libs/BeetRoundCore/model/modelsummary.h
Normal 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
|
||||||
@ -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...";
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user