From e24b6c4e5f526a1f931e047bfc2714bdf2102b8b Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Wed, 25 Jul 2018 16:04:45 +0200 Subject: [PATCH] Initial implementation of salemodel --- src/core/article.cpp | 1 + src/core/article.h | 1 + src/core/marketplace.cpp | 2 + src/core/marketplace.h | 1 + src/core/sale.cpp | 7 ++ src/core/sale.h | 1 + src/gui/CMakeLists.txt | 1 + src/gui/mainwindow.cpp | 6 ++ src/gui/mainwindow.ui | 2 +- src/gui/salemodel.cpp | 164 +++++++++++++++++++++++++++++++++++++++ src/gui/salemodel.h | 27 +++++++ 11 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 src/gui/salemodel.cpp create mode 100644 src/gui/salemodel.h diff --git a/src/core/article.cpp b/src/core/article.cpp index 50dfa55..34dc249 100644 --- a/src/core/article.cpp +++ b/src/core/article.cpp @@ -24,6 +24,7 @@ bool Article::isSold() { return salePtr_ ? true : false; } std::string Article::getDescription() { return description_; } Seller* Article::getSeller() { return sellerPtr_; } +Sale* Article::getSale() { return salePtr_; } int Article::getPrice() const { return price_; } diff --git a/src/core/article.h b/src/core/article.h index 27e858c..2282fdf 100644 --- a/src/core/article.h +++ b/src/core/article.h @@ -28,6 +28,7 @@ class Article : public Entity int getArticleNo(); std::string getDescription(); Seller* getSeller(); + Sale* getSale(); int getPrice() const; std::string getPriceAsString() const; diff --git a/src/core/marketplace.cpp b/src/core/marketplace.cpp index 8bc45ec..6c158c7 100644 --- a/src/core/marketplace.cpp +++ b/src/core/marketplace.cpp @@ -29,6 +29,8 @@ void Marketplace::loadFromDb() SellersVec& Marketplace::getSellers() { return sellers_; } +SalesVec& Marketplace::getSales() { return sales_; } + int Marketplace::getNextSellerNo() { auto iter = std::max_element( diff --git a/src/core/marketplace.h b/src/core/marketplace.h index e515686..fdb1059 100644 --- a/src/core/marketplace.h +++ b/src/core/marketplace.h @@ -26,6 +26,7 @@ class Marketplace void loadFromDb(); SellersVec& getSellers(); + SalesVec& getSales(); int getNextSellerNo(); int getNextArticleNo(); int getNumSellersDelete(); diff --git a/src/core/sale.cpp b/src/core/sale.cpp index 528da0b..31fe06e 100644 --- a/src/core/sale.cpp +++ b/src/core/sale.cpp @@ -31,6 +31,13 @@ int Sale::sumInCents() return sum; } +std::string Sale::sumAsString() +{ + std::stringstream sumStream; + sumStream << std::right << std::setw(12) << std::showbase << std::put_money(sumInCents(), false); + return sumStream.str(); +} + std::string Sale::getTimestamp() { return timestamp_; } void Sale::setTimestamp(const std::string& timestamp) { timestamp_ = timestamp; } \ No newline at end of file diff --git a/src/core/sale.h b/src/core/sale.h index f039a69..15b963f 100644 --- a/src/core/sale.h +++ b/src/core/sale.h @@ -20,6 +20,7 @@ class Sale : public Entity ArticlesVec& getArticles(); std::string getTimestamp(); int sumInCents(); + std::string sumAsString(); void removeArticle(const Article* articlePtr); diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index fb28766..9770d58 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -18,6 +18,7 @@ set(GUI_SOURCES pricedialog.cpp pricedialog.ui basketmodel.cpp + salemodel.cpp ) add_executable(kima2 ${GUI_SOURCES}) diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 08f8e4d..fb3f5c7 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -3,6 +3,7 @@ #include "basketmodel.h" #include "pricedialog.h" #include "sellerdialog.h" +#include "salemodel.h" #include @@ -22,6 +23,11 @@ MainWindow::MainWindow() ui_.basketView->setModel(model); ui_.basketView->setColumnHidden(0, true); // hide the uuid + SaleModel* saleModel = new SaleModel(getMarketplace(), ui_.salesView); + ui_.salesView->setModel(saleModel); + ui_.salesView->setColumnHidden(2, true); + ui_.salesView->resizeColumnToContents(0); + connect(ui_.actionQuit, &QAction::triggered, qApp, QApplication::quit); connect(ui_.actionEditSeller, &QAction::triggered, this, &MainWindow::on_actionEditSeller_triggered); diff --git a/src/gui/mainwindow.ui b/src/gui/mainwindow.ui index 5d32ee6..b687f4f 100644 --- a/src/gui/mainwindow.ui +++ b/src/gui/mainwindow.ui @@ -229,7 +229,7 @@ - + diff --git a/src/gui/salemodel.cpp b/src/gui/salemodel.cpp new file mode 100644 index 0000000..396a833 --- /dev/null +++ b/src/gui/salemodel.cpp @@ -0,0 +1,164 @@ +#include "salemodel.h" + +#include + +#include + +#include + +SaleModel::SaleModel(Marketplace* market, QObject* parent) : QAbstractItemModel(parent) +{ + marketplace_ = market; +} + +QModelIndex SaleModel::index(int row, int column, const QModelIndex& parent) const +{ + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + if (!parent.isValid()) { + Sale* sale = marketplace_->getSales().at(row).get(); + return createIndex(row, column, sale); + } else if (!parent.parent().isValid()) { + Sale* sale = static_cast(parent.internalPointer()); + Article* article = sale->getArticles().at(row); + return createIndex(row, column, article); + } else if (!parent.parent().parent().isValid()) { + Sale* sale = static_cast(parent.internalPointer()); + Article* childItem = sale->getArticles().at(row); + if (childItem) { + return createIndex(row, column, childItem); + } else { + return QModelIndex(); + } + } + return QModelIndex(); +} + +QModelIndex SaleModel::parent(const QModelIndex& index) const +{ + if (!index.isValid()) + return QModelIndex(); + + Sale* sale{}; + Article* article{}; + + Entity* ent = static_cast(index.internalPointer()); + + sale = dynamic_cast(ent); + + if (sale) { + if (sale == rootItem.get()) + return QModelIndex(); + else { + /* auto iter = + std::find_if(marketplace_->getSales().begin(), marketplace_->getSales().end(), + [&sale](const auto& s) { return s.get() == sale; }); + auto pos = std::distance(marketplace_->getSales().begin(), iter); */ + return createIndex(-1, 0, rootItem.get()); + } + } else { + // article = static_cast(index.internalPointer()); + article = dynamic_cast(ent); + + if (!article) { + return QModelIndex(); + } + + if (article) { + sale = article->getSale(); + auto iter = std::find(sale->getArticles().begin(), sale->getArticles().end(), article); + auto pos = std::distance(sale->getArticles().begin(), iter); + return createIndex(static_cast(pos), 0, sale); + } + } + + return QModelIndex(); +} + +QVariant SaleModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role == Qt::FontRole) { + QFont myFont; + + switch (index.column()) { + case 0: + return myFont; + case 1: + myFont.setFamily("monospace"); + return myFont; + return myFont; + default: + return myFont; + } + } + if (role != Qt::DisplayRole) + return QVariant(); + + if (!index.parent().isValid()) { + Sale* sale = static_cast(index.internalPointer()); + switch (index.column()) { + case 0: + return sale->getTimestamp().c_str(); + case 1: + return sale->sumAsString().c_str(); + case 2: + return sale->getUuidAsString().c_str(); + } + } + + if (!index.parent().parent().isValid()) { + Article* article = static_cast(index.internalPointer()); + switch (index.column()) { + case 0: + return article->getArticleNo(); + case 1: + return article->getPriceAsString().c_str(); + case 2: + return article->getUuidAsString().c_str(); + } + } + + return QVariant(); +} + +int SaleModel::rowCount(const QModelIndex& parent) const +{ + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) { + return marketplace_->getSales().size(); + } else if (!parent.parent().isValid()) { + Sale* sale = static_cast(parent.internalPointer()); + return sale->getArticles().size(); + } else { + return 0; + } + + return 0; +} + +int SaleModel::columnCount([[maybe_unused]] const QModelIndex& parent) const { return 3; } + +QVariant SaleModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + + if (orientation == Qt::Horizontal) { + switch (section) { + case 0: + return "Zeit / Art.Nr."; + case 1: + return "Preis"; + default: + return "???"; + } + return QStringLiteral("%1").arg(section); + } else + return ""; +} \ No newline at end of file diff --git a/src/gui/salemodel.h b/src/gui/salemodel.h new file mode 100644 index 0000000..cb7e9e2 --- /dev/null +++ b/src/gui/salemodel.h @@ -0,0 +1,27 @@ +#ifndef SALEMODEL_H +#define SALEMODEL_H + +#include + +#include + +class SaleModel : public QAbstractItemModel +{ + Q_OBJECT + + public: + explicit SaleModel(Marketplace* market, QObject* parent = nullptr); + QModelIndex index(int row, int column, + const QModelIndex& parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex& index) const override; + QVariant data(const QModelIndex &index, int role) const override; + int rowCount(const QModelIndex& parent) const override; + int columnCount(const QModelIndex& parent) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + + private: + Marketplace* marketplace_; + std::unique_ptr rootItem{new Sale()}; +}; + +#endif \ No newline at end of file