From 2812f582a1a28370e73457a6618702ac93088902 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Mon, 16 Jul 2018 18:04:25 +0200 Subject: [PATCH] more on sellers --- src/core/marketplace.cpp | 18 +++++++++++++- src/core/marketplace.h | 1 + src/gui/mainwindow.cpp | 7 +++++- src/gui/sellerdialog.cpp | 27 +++++++++++++++++++-- src/gui/sellerdialog.h | 2 ++ src/gui/sellermodel.cpp | 51 ++++++++++++++++++++++++++++++++++------ src/gui/sellermodel.h | 5 ++-- 7 files changed, 98 insertions(+), 13 deletions(-) diff --git a/src/core/marketplace.cpp b/src/core/marketplace.cpp index 24e9af1..2534905 100644 --- a/src/core/marketplace.cpp +++ b/src/core/marketplace.cpp @@ -1,9 +1,12 @@ #include "marketplace.h" #include "database.h" +#include + Marketplace::Marketplace() { auto seller = std::make_unique("Max", "Mustermann"); + seller->createUuid(); sellers_.push_back(std::move(seller)); } @@ -12,7 +15,20 @@ void Marketplace::storeToDb() const std::string DB_PATH{"/tmp/kima2.db"}; Database db(DB_PATH); + db.init(); db.storeSellers(sellers_); } -std::vector>& Marketplace::getSellers() { return sellers_; } \ No newline at end of file +void Marketplace::loadFromDb() {} + +std::vector>& Marketplace::getSellers() { return sellers_; } + +int Marketplace::getNextSellerNo() +{ + auto iter = std::max_element( + sellers_.begin(), sellers_.end(), + [](const std::unique_ptr& a, const std::unique_ptr& b) -> bool { + return a->getSellerNo() < b->getSellerNo(); + }); + return (*iter)->getSellerNo() + 1; +} \ No newline at end of file diff --git a/src/core/marketplace.h b/src/core/marketplace.h index 27738b9..4bf73bd 100644 --- a/src/core/marketplace.h +++ b/src/core/marketplace.h @@ -14,6 +14,7 @@ class Marketplace void storeToDb(); void loadFromDb(); std::vector>& getSellers(); + int getNextSellerNo(); private: std::vector> sellers_; diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 5bf8018..3cf4428 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -15,5 +15,10 @@ MainWindow::MainWindow() void MainWindow::on_actionEditSeller_triggered() { auto dialog = std::make_unique(this); - dialog->exec(); + int retCode = dialog->exec(); + if (retCode == QDialog::Accepted) { + marketplace_->storeToDb(); + } else { + marketplace_->loadFromDb(); + } } \ No newline at end of file diff --git a/src/gui/sellerdialog.cpp b/src/gui/sellerdialog.cpp index 256e740..3088028 100644 --- a/src/gui/sellerdialog.cpp +++ b/src/gui/sellerdialog.cpp @@ -2,11 +2,34 @@ #include "mainwindow.h" +#include + SellerDialog::SellerDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) { ui_.setupUi(this); - SellerModel* model = new SellerModel( - dynamic_cast(parent)->getMarketplace()->getSellers(), ui_.tableView); + SellerModel* model = + new SellerModel(dynamic_cast(parent)->getMarketplace(), ui_.tableView); ui_.tableView->setModel(model); ui_.tableView->setColumnHidden(0, true); // hide the uuid + connect(ui_.newButton, &QPushButton::clicked, this, &SellerDialog::on_newButton_clicked); } + +void SellerDialog::on_newButton_clicked() +{ + ui_.tableView->model()->insertRows(ui_.tableView->model()->rowCount(), 1); + ui_.tableView->scrollToBottom(); +} + +void SellerDialog::accept() +{ + Marketplace* market = dynamic_cast(parentWidget())->getMarketplace(); + for (const auto& seller : market->getSellers()) { + if (seller->getFirstName().empty() || seller->getLastName().empty()) { + QMessageBox(QMessageBox::Icon::Critical, "Fehler", + "Bitte geben Sie bei jedem Verkäufer Vorname und Nachname an.", + QMessageBox::StandardButton::Ok, this).exec(); + return; + } + } + QDialog::accept(); +} \ No newline at end of file diff --git a/src/gui/sellerdialog.h b/src/gui/sellerdialog.h index 7194e6f..8d0dc0a 100644 --- a/src/gui/sellerdialog.h +++ b/src/gui/sellerdialog.h @@ -16,6 +16,8 @@ class SellerDialog : public QDialog Qt::WindowFlags f = Qt::WindowTitleHint | Qt::WindowSystemMenuHint); private: + void on_newButton_clicked(); + virtual void accept() override; Ui::SellerDialog ui_; }; diff --git a/src/gui/sellermodel.cpp b/src/gui/sellermodel.cpp index 38a17df..4f9815b 100644 --- a/src/gui/sellermodel.cpp +++ b/src/gui/sellermodel.cpp @@ -1,11 +1,18 @@ #include "sellermodel.h" -SellerModel::SellerModel(std::vector>& sellers, QObject* parent) - : QAbstractTableModel(parent), sellers_(&sellers) +#include + +#include + +SellerModel::SellerModel(Marketplace* market, QObject* parent) + : QAbstractTableModel(parent), marketplace_(market) { } -int SellerModel::rowCount(const QModelIndex& parent) const { return sellers_->size(); } +int SellerModel::rowCount(const QModelIndex& parent) const +{ + return marketplace_->getSellers().size(); +} int SellerModel::columnCount(const QModelIndex& parent) const { return 5; } @@ -14,7 +21,7 @@ QVariant SellerModel::data(const QModelIndex& index, int role) const if (role != Qt::DisplayRole) return QVariant(); - Seller* seller = sellers_->at(index.row()).get(); + Seller* seller = marketplace_->getSellers().at(index.row()).get(); switch (index.column()) { case 0: return seller->getUuidAsString().c_str(); @@ -62,18 +69,34 @@ Qt::ItemFlags SellerModel::flags(const QModelIndex& index) const return QAbstractTableModel::flags(index) | Qt::ItemFlag::ItemIsEditable; } -bool SellerModel::setData(const QModelIndex& index, const QVariant& value, int role) { +bool SellerModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ if (role != Qt::EditRole) return false; - Seller* seller = sellers_->at(index.row()).get(); + Seller* seller = marketplace_->getSellers().at(index.row()).get(); + switch (index.column()) { case 0: seller->setUuidFromString(value.toString().toStdString()); break; - case 1: + case 1: { + if (value.toInt() < 0) + return false; + auto iter = + std::find_if(marketplace_->getSellers().begin(), marketplace_->getSellers().end(), + [&value](const std::unique_ptr& seller) { + return value.toInt() == seller->getSellerNo(); + }); + if (iter != marketplace_->getSellers().end()) { + /* QMessageBox(QMessageBox::Icon::Warning, "Fehler", + "Die Verkäufernummer muss eindeutig sein.", QMessageBox::StandardButton::Ok) + .exec(); */ + return false; + } seller->setSellerNo(value.toInt()); break; + } case 2: seller->setFirstName(value.toString().toStdString()); break; @@ -86,6 +109,20 @@ bool SellerModel::setData(const QModelIndex& index, const QVariant& value, int r default: return false; } + if (seller->getState() == Seller::State::OK) + seller->setState(Seller::State::UPDATE); dataChanged(index, index); + return true; +} + +bool SellerModel::insertRows(int row, int count, const QModelIndex& parent) +{ + beginInsertRows(parent, row, row + count - 1); + auto seller = std::make_unique(); + seller->createUuid(); + seller->setSellerNo(marketplace_->getNextSellerNo()); + marketplace_->getSellers().push_back(std::move(seller)); + endInsertRows(); + return true; } \ No newline at end of file diff --git a/src/gui/sellermodel.h b/src/gui/sellermodel.h index e07c800..7ec2244 100644 --- a/src/gui/sellermodel.h +++ b/src/gui/sellermodel.h @@ -8,16 +8,17 @@ class SellerModel : public QAbstractTableModel { public: - explicit SellerModel(std::vector>& sellers, QObject* parent = nullptr); + explicit SellerModel(Marketplace* market, QObject* parent = nullptr); virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override; virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const override; virtual Qt::ItemFlags flags(const QModelIndex& index) const override; virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); + virtual bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()) override; private: - std::vector>* sellers_; + Marketplace* marketplace_; }; #endif \ No newline at end of file