diff --git a/UIs/BeetRoundWidgets/widgets/summarywidget.cpp b/UIs/BeetRoundWidgets/widgets/summarywidget.cpp index 129b5be..30b7ed9 100644 --- a/UIs/BeetRoundWidgets/widgets/summarywidget.cpp +++ b/UIs/BeetRoundWidgets/widgets/summarywidget.cpp @@ -16,14 +16,23 @@ SummaryWidget::SummaryWidget(std::shared_ptr modelSummary, QWidget QVBoxLayout* mainLayout = new QVBoxLayout(this); /// monthly need - QHBoxLayout* footerLayout = new QHBoxLayout(); + QHBoxLayout* footerLayout = new QHBoxLayout(); + + QLabel* nTotalSharesLabel = new QLabel("Erwartete Ernteanteile:"); + const qreal expectedShares = m_modelSummary->nTotalExpectedShares(); + m_nTotalExpectedShares = new QLabel(QString::number(expectedShares)); + QLabel* financialNeedLabel = new QLabel("monatlicher Finanzbedarf:"); m_financialNeedBox = new QSpinBox(); m_financialNeedBox->setMaximum(50000); m_financialNeedBox->setValue(m_financialNeed); + connect(m_financialNeedBox, &QSpinBox::valueChanged, this, &SummaryWidget::onFinancialNeedChanged); + footerLayout->addWidget(nTotalSharesLabel); + footerLayout->addWidget(m_nTotalExpectedShares); + footerLayout->addStretch(1); footerLayout->addWidget(financialNeedLabel); footerLayout->addWidget(m_financialNeedBox); footerLayout->addStretch(1); @@ -50,6 +59,11 @@ void SummaryWidget::onNExpectedBiddingChanged(int newNExpected) { m_biddingStatus3->onExpectedBiddingsChanged(newNExpected); } +void SummaryWidget::onNTotalExpectedSharesChanged(qreal newNExpected) { + const QString expectedSharesString = QString::number(newNExpected); + m_nTotalExpectedShares->setText(expectedSharesString); +} + void SummaryWidget::onNPlacedBiddingsChanged(const int roundNumber) { switch (roundNumber) { case 1: @@ -140,6 +154,9 @@ void SummaryWidget::setupConnections() { // "bindProperty(&bindable, &signal, &getter, widget)" QObject::connect(m_modelSummary.get(), &ModelSummary::nExpectedBiddingsChanged, [&]() { onNExpectedBiddingChanged(m_modelSummary->nExpectedBiddings()); }); + QObject::connect(m_modelSummary.get(), &ModelSummary::nTotalExpectedSharesChanged, this, [&]() { + onNTotalExpectedSharesChanged(m_modelSummary->nTotalExpectedShares()); + }); QObject::connect(m_modelSummary.get(), &ModelSummary::nPlacedBiddingsChanged, this, &SummaryWidget::onNPlacedBiddingsChanged); QObject::connect(m_modelSummary.get(), &ModelSummary::biddingSumChanged, this, diff --git a/UIs/BeetRoundWidgets/widgets/summarywidget.h b/UIs/BeetRoundWidgets/widgets/summarywidget.h index 10f7252..fcc70a5 100644 --- a/UIs/BeetRoundWidgets/widgets/summarywidget.h +++ b/UIs/BeetRoundWidgets/widgets/summarywidget.h @@ -18,6 +18,7 @@ class SummaryWidget : public QWidget { private slots: void onFinancialNeedChanged(int newFinancialNeed); void onNExpectedBiddingChanged(int newNExpected); + void onNTotalExpectedSharesChanged(qreal newNExpected); void onNPlacedBiddingsChanged(const int roundNumber); void onBiddingSumChanged(const int roundNumber); @@ -31,8 +32,9 @@ class SummaryWidget : public QWidget { std::unique_ptr m_biddingStatus3; // TODO read from settings (maybe via model/core; maybe set in constructor) - const int m_financialNeed = 13942; - QSpinBox* m_financialNeedBox = nullptr; + const int m_financialNeed = 13942; + QSpinBox* m_financialNeedBox = nullptr; + QLabel* m_nTotalExpectedShares = nullptr; QLabel* m_rowCountValueLabel; QLabel* m_nExpectedBiddingsValueLabel; diff --git a/libs/BeetRoundCore/model/modelsummary.cpp b/libs/BeetRoundCore/model/modelsummary.cpp index 17b471e..faf6823 100644 --- a/libs/BeetRoundCore/model/modelsummary.cpp +++ b/libs/BeetRoundCore/model/modelsummary.cpp @@ -10,6 +10,8 @@ ModelSummary::ModelSummary(std::shared_ptr model, QObject* parent) // TODO ? use existing model signals (dataChanged(role),...) instead of special signals connect(m_model.get(), &TableModel::nExpectedBiddingsChanged, this, &ModelSummary::nExpectedBiddingsChanged); + connect(m_model.get(), &TableModel::nTotalExpectedSharesChanged, this, + &ModelSummary::nTotalExpectedSharesChanged); connect(m_model.get(), &TableModel::nPlacedBiddingsChanged, this, &ModelSummary::nPlacedBiddingsChanged); connect(m_model.get(), &TableModel::biddingSumChanged, this, &ModelSummary::biddingSumChanged); @@ -29,6 +31,8 @@ QBindable ModelSummary::bindableRowCount() { return &m_rowCount; } +qreal ModelSummary::nTotalExpectedShares() const { return m_model->nTotalExpectedShares(); } + int ModelSummary::nExpectedBiddings() const { return m_model->nExpectedBiddings(); } int ModelSummary::nPlacedBiddings1() const { return m_model->nPlacedBiddings1(); } diff --git a/libs/BeetRoundCore/model/modelsummary.h b/libs/BeetRoundCore/model/modelsummary.h index cc98771..ad48ffd 100644 --- a/libs/BeetRoundCore/model/modelsummary.h +++ b/libs/BeetRoundCore/model/modelsummary.h @@ -19,6 +19,8 @@ class ModelSummary : public QObject { int rowCount() const; QBindable bindableRowCount(); + + qreal nTotalExpectedShares() const; int nExpectedBiddings() const; int nPlacedBiddings1() const; int nPlacedBiddings2() const; @@ -36,6 +38,7 @@ class ModelSummary : public QObject { void rowCountChanged(); void nExpectedBiddingsChanged(); + void nTotalExpectedSharesChanged(); void nPlacedBiddingsChanged(const int roundNumber); void biddingSumChanged(const int roundNumber); void biddingAverageChanged(const int roundNumber); diff --git a/libs/BeetRoundCore/model/tablemodel.cpp b/libs/BeetRoundCore/model/tablemodel.cpp index 8d0dc5a..fbfa3d7 100644 --- a/libs/BeetRoundCore/model/tablemodel.cpp +++ b/libs/BeetRoundCore/model/tablemodel.cpp @@ -340,6 +340,30 @@ void TableModel::insertItems(int startPosition, m_undoStack->push(insertCommand); } +qreal TableModel::nTotalExpectedShares() const { + qreal result = 0; + for (auto i = m_items.begin(), end = m_items.end(); i != end; ++i) { + /// if BiddingTypeRole is not empty + const QString biddingType = (*i)->data(BiddingTypeRole).toString(); + const qreal shareAmount = (*i)->data(ShareAmountRole).toReal(); + if (biddingType.isEmpty() || shareAmount == 0.0) { + continue; + } + /// add amount + const QString shareType = (*i)->data(ShareTypeRole).toString(); + if (shareType == "bezahlt") { + result += shareAmount; + } else if (shareType == "teils/teils") { + result += shareAmount / 2; + } else { + qInfo() << "Share type not 'bezahlt' nor 'teils/teils'. Will be ignored.."; + qDebug() << "Share type:" << shareType; + } + } + qInfo() << "Biddings expected for " << result << "shares!"; + return result; +} + int TableModel::nExpectedBiddings() const { int result = 0; for (auto i = m_items.begin(), end = m_items.end(); i != end; ++i) { @@ -397,6 +421,7 @@ void TableModel::onRowCountChanged(const QModelIndex& parent, int first, int las } emit rowCountChanged(); emit nExpectedBiddingsChanged(); + emit nTotalExpectedSharesChanged(); emit nPlacedBiddingsChanged(1); emit nPlacedBiddingsChanged(2); @@ -449,6 +474,7 @@ void TableModel::execEditItemData(const int row, const QMap& chan if (roles.contains(BiddingTypeRole) || roles.contains(ShareAmountRole) || roles.contains(ShareTypeRole)) { emit nExpectedBiddingsChanged(); + emit nTotalExpectedSharesChanged(); } if (roles.contains(ShareAmountRole) || roles.contains(ShareTypeRole)) { emit nPlacedBiddingsChanged(1); diff --git a/libs/BeetRoundCore/model/tablemodel.h b/libs/BeetRoundCore/model/tablemodel.h index 5bd0011..2f824a4 100644 --- a/libs/BeetRoundCore/model/tablemodel.h +++ b/libs/BeetRoundCore/model/tablemodel.h @@ -63,6 +63,7 @@ class TableModel : public QAbstractTableModel { const QModelIndex& parentIndex = QModelIndex()); /// property functions + qreal nTotalExpectedShares() const; int nExpectedBiddings() const; int nPlacedBiddings1() const; int nPlacedBiddings2() const; @@ -80,6 +81,7 @@ class TableModel : public QAbstractTableModel { void rowCountChanged(); void nExpectedBiddingsChanged(); + void nTotalExpectedSharesChanged(); void nPlacedBiddingsChanged(const int roundNumber); void biddingSumChanged(const int roundNumber); void biddingAverageChanged(const int roundNumber); diff --git a/tests/GenericCoreTests/model_test.cpp b/tests/GenericCoreTests/model_test.cpp index 1153562..97e7ea6 100644 --- a/tests/GenericCoreTests/model_test.cpp +++ b/tests/GenericCoreTests/model_test.cpp @@ -86,6 +86,13 @@ TEST_F(ModelTest, ExpectedPlacedBiddings) { ASSERT_EQ(expected, expectedPlacedBiddings); } +TEST_F(ModelTest, ExpectedTotalShareAmount) { + const int expected = 0; + const auto nTotalExpectedShares = model->nTotalExpectedShares(); + + ASSERT_EQ(expected, nTotalExpectedShares); +} + /// model with data TEST_F(ModelTestWithData, TestRowCount) { @@ -115,3 +122,10 @@ TEST_F(ModelTestWithData, PlacedBiddings1) { ASSERT_EQ(expected, actual); } + +TEST_F(ModelTestWithData, NTotalExpectedShares) { + const qreal expected = 3; + const auto actual = model->nTotalExpectedShares(); + + ASSERT_EQ(expected, actual); +}