diff --git a/sea_transport/adminpanel.cpp b/sea_transport/adminpanel.cpp index 1bda76f..74a4e4a 100644 --- a/sea_transport/adminpanel.cpp +++ b/sea_transport/adminpanel.cpp @@ -78,7 +78,7 @@ void AdminPanel::on_logout_requested() { this->close(); } -void AdminPanel::on_vessel_add_edit(bool edit) { +void AdminPanel::on_vessel_add_edit(bool /*edit*/) { } @@ -129,7 +129,7 @@ void AdminPanel::on_user_add_edit(bool edit) { return; } - auto data = ued.user(); + auto data = ued.user_data(); if (edit) { bool success; auto user = apparatus::instance()->get_auth_subsystem()->get_user(usr.login(), success); @@ -188,7 +188,41 @@ void AdminPanel::on_user_remove() { } void AdminPanel::on_delivery_point_add_edit(bool edit) { + auto selected = ui->tv_dp->selectionModel()->selectedRows(); + if (edit && selected.length() != 1) { + return; + } + dpoint_entity dpoint; + if (edit) { + int idx = selected[0].row(); + dpoint = apparatus::instance()->get_object_subsystem()->dpoints()[idx]; + } + + DeliveryPointEditDialog dped(this); + dped.setWindowTitle(edit? "Edit delivery point" : "New delivery point"); + dped.set_dpoint(&dpoint, edit); + if (dped.exec() != UserEditDialog::Accepted) { + return; + } + + auto data = dped.dpoint(); + if (edit) { + bool success; + auto dp = apparatus::instance()->get_object_subsystem()->get_dpoint(dpoint.id(), success); + if (!success) { + QMessageBox::critical(this, "Error", "Error editing delivery point"); + return; + } + + dp->set_title(data->title()); + dp->set_storages(data->storages()); + } + else { + apparatus::instance()->get_object_subsystem()->add_dpoint(*data); + } + + dpvm->update(); } void AdminPanel::on_delivery_point_remove() { @@ -208,8 +242,8 @@ void AdminPanel::on_delivery_point_remove() { } foreach (auto mIdx, selected) { - int idx = mIdx.row(); - qDebug() << idx << ' ' << mIdx.data() << '\n'; + entity_id oid = mIdx.data().toULongLong(); + apparatus::instance()->get_object_subsystem()->remove_dpoint(oid); } dpvm->update(); diff --git a/sea_transport/adminpanel.h b/sea_transport/adminpanel.h index 3489f39..827c4b1 100644 --- a/sea_transport/adminpanel.h +++ b/sea_transport/adminpanel.h @@ -14,6 +14,7 @@ #include "viewmodels/deliverypointsviewmodel.h" #include "entities/user_entity.h" +#include "entities/dpoint_entity.h" namespace Ui { class AdminPanel; diff --git a/sea_transport/cargoeditdialog.cpp b/sea_transport/cargoeditdialog.cpp index 67c9a1e..a55ba79 100644 --- a/sea_transport/cargoeditdialog.cpp +++ b/sea_transport/cargoeditdialog.cpp @@ -3,6 +3,9 @@ CargoEditDialog::CargoEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::CargoEditDialog) { ui->setupUi(this); + + connect(ui->pb_save, &QPushButton::clicked, this, &CargoEditDialog::accept); + connect(ui->pb_discard, &QPushButton::clicked, this, &CargoEditDialog::reject); } CargoEditDialog::~CargoEditDialog() { diff --git a/sea_transport/deliverypointeditdialog.cpp b/sea_transport/deliverypointeditdialog.cpp index a010715..922a549 100644 --- a/sea_transport/deliverypointeditdialog.cpp +++ b/sea_transport/deliverypointeditdialog.cpp @@ -1,14 +1,116 @@ #include "deliverypointeditdialog.h" #include "ui_deliverypointeditdialog.h" -DeliveryPointEditDialog::DeliveryPointEditDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::DeliveryPointEditDialog) -{ + +DeliveryPointEditDialog::DeliveryPointEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::DeliveryPointEditDialog) { ui->setupUi(this); + + this->svm = new QStringListModel(this); + ui->lv_storages->setModel(this->svm); + + connect(ui->lv_storages->selectionModel(), &QItemSelectionModel::selectionChanged, [this](const QItemSelection &selected) { + ui->pb_storage_remove->setEnabled(selected.length() > 0); + ui->pb_storage_edit->setEnabled(selected.length() == 1); + }); + + connect(ui->pb_storage_remove, &QPushButton::clicked, [this]() { + auto sel = ui->lv_storages->selectionModel()->selectedRows(); + if (sel.length() == 0) { + return; + } + + foreach (auto mIdx, sel) { + auto cuid = mIdx.data().toString().toULongLong(); + auto st = this->_dp->storages(); + + for (int i = 0; i < st.length(); i++) { + if (st[i].id() == cuid) { + st.removeAt(i); + break; + } + } + + this->_dp->set_storages(st); + } + this->update_list(); + }); + + connect(ui->pb_storage_edit, &QPushButton::clicked, [this]() { + this->on_storage_edit_add(true); + }); + + connect(ui->pb_storage_add, &QPushButton::clicked, [this]() { + this->on_storage_edit_add(false); + }); + + connect(ui->pb_save, &QPushButton::clicked, this, &DeliveryPointEditDialog::accept); + connect(ui->pb_discard, &QPushButton::clicked, this, &DeliveryPointEditDialog::reject); } -DeliveryPointEditDialog::~DeliveryPointEditDialog() -{ +DeliveryPointEditDialog::~DeliveryPointEditDialog() { delete ui; } + +void DeliveryPointEditDialog::update_list() { + QStringList slist; + foreach (auto storage, this->_dp->storages()) { + slist << QString::number(storage.id()); + } + this->svm->setStringList(slist); +} + +dpoint_entity* DeliveryPointEditDialog::dpoint() const { + return this->_dp; +} + +void DeliveryPointEditDialog::on_storage_edit_add(bool edit) { + auto selected = ui->lv_storages->selectionModel()->selectedRows(); + if (edit && selected.length() != 1) { + return; + } + + storage_entity stor; + if (edit) { + int idx = selected[0].row(); + stor = this->_dp->storages()[idx]; + this->_dp->remove_storage(stor.id()); + } + + StorageEditDialog sed(this); + sed.setWindowTitle(edit? "Edit storage" : "New storage"); + sed.set_storage(&stor, edit); + if (sed.exec() != StorageEditDialog::Accepted) { + return; + } + + auto n_storage = sed.storage(); + if (edit) { + this->_dp->remove_storage(stor.id()); + } + this->_dp->add_storage(*n_storage); + + this->update_list(); +} + +void DeliveryPointEditDialog::set_dpoint(dpoint_entity* dpoint, bool edit) { + this->_dp = new dpoint_entity(*dpoint); + + if (edit) { + ui->et_title->setText(dpoint->title()); + this->update_list(); + } +} + +void DeliveryPointEditDialog::accept() { + bool emptyTitle = ui->et_title->text().trimmed().isEmpty(); + if (emptyTitle) {; + QString message = "Some errors happend, while saving your note:" + "
- Title cannot be empty (all spaces - empty too)"; + QMessageBox::critical(this, "Error", message); + return; + } + + this->_dp->set_title(ui->et_title->text().trimmed()); + + QDialog::accept(); +} diff --git a/sea_transport/deliverypointeditdialog.h b/sea_transport/deliverypointeditdialog.h index 6b044e2..3eeb00b 100644 --- a/sea_transport/deliverypointeditdialog.h +++ b/sea_transport/deliverypointeditdialog.h @@ -1,22 +1,42 @@ #ifndef DELIVERYPOINTEDITDIALOG_H #define DELIVERYPOINTEDITDIALOG_H +#include #include +#include +#include +#include +#include + +#include "entities/dpoint_entity.h" +#include "system/apparatus.h" +#include "storageeditdialog.h" + namespace Ui { class DeliveryPointEditDialog; } -class DeliveryPointEditDialog : public QDialog -{ +class DeliveryPointEditDialog : public QDialog { Q_OBJECT + Ui::DeliveryPointEditDialog *ui; + + QStringListModel *svm; + dpoint_entity *_dp; + + void update_list(); public: explicit DeliveryPointEditDialog(QWidget *parent = nullptr); ~DeliveryPointEditDialog(); -private: - Ui::DeliveryPointEditDialog *ui; + dpoint_entity* dpoint() const; + void set_dpoint(dpoint_entity* dpoint, bool edit); + +public slots: + void on_storage_edit_add(bool edit); + + void accept() Q_DECL_OVERRIDE; }; #endif // DELIVERYPOINTEDITDIALOG_H diff --git a/sea_transport/deliverypointeditdialog.ui b/sea_transport/deliverypointeditdialog.ui index 4a0ab3d..4797b21 100644 --- a/sea_transport/deliverypointeditdialog.ui +++ b/sea_transport/deliverypointeditdialog.ui @@ -44,19 +44,33 @@ - + + + QAbstractItemView::NoEditTriggers + + - + Add storage - + + + false + + + Edit storage + + + + + false @@ -83,14 +97,14 @@ - + Discard - + Save diff --git a/sea_transport/entities/dpoint_entity.cpp b/sea_transport/entities/dpoint_entity.cpp index ed5b926..01b164b 100644 --- a/sea_transport/entities/dpoint_entity.cpp +++ b/sea_transport/entities/dpoint_entity.cpp @@ -20,10 +20,28 @@ QString dpoint_entity::title() const { return this->_title; } +void dpoint_entity::set_title(const QString &new_title) { + this->_title = new_title; +} + const QVector dpoint_entity::storages() { return this->_storages; } +void dpoint_entity::set_storages(QVector storages) { + this->_storages = storages; +} + +void dpoint_entity::remove_storage(entity_id sid) { + std::remove_if(this->_storages.begin(), this->_storages.end(), [sid](storage_entity ent) { + return ent.id() == sid; + }); +} + +void dpoint_entity::add_storage(storage_entity ent) { + this->_storages.push_back(ent); +} + void dpoint_entity::serialize(QDataStream &output) { output << this->_id << this->_title << this->_storages.size(); for (auto &item : this->_storages) { diff --git a/sea_transport/entities/dpoint_entity.h b/sea_transport/entities/dpoint_entity.h index 90fb4a4..8c17537 100644 --- a/sea_transport/entities/dpoint_entity.h +++ b/sea_transport/entities/dpoint_entity.h @@ -23,7 +23,11 @@ public: entity_id id() const; entity_id dispatcher() const; QString title() const; + void set_title(const QString &new_title); const QVector storages(); + void set_storages(QVector storages); + void remove_storage(entity_id sid); + void add_storage(storage_entity ent); void serialize(QDataStream &output); void deserialize(QDataStream &input); diff --git a/sea_transport/entities/storage_entity.cpp b/sea_transport/entities/storage_entity.cpp index 5e55f4c..49a381d 100644 --- a/sea_transport/entities/storage_entity.cpp +++ b/sea_transport/entities/storage_entity.cpp @@ -16,6 +16,10 @@ unsigned int storage_entity::capacity() const { return this->_capacity; } +void storage_entity::set_capacity(unsigned int new_capacity) { + this->_capacity = new_capacity; +} + const QVector storage_entity::cargo() { return this->_cargo; } diff --git a/sea_transport/entities/storage_entity.h b/sea_transport/entities/storage_entity.h index 3b8abf5..68030a2 100644 --- a/sea_transport/entities/storage_entity.h +++ b/sea_transport/entities/storage_entity.h @@ -22,6 +22,7 @@ public: entity_id id() const; unsigned int capacity() const; + void set_capacity(unsigned int new_capacity); const QVector cargo(); void add_cargo(cargo_entity object, bool &success); diff --git a/sea_transport/sea_transport.pro b/sea_transport/sea_transport.pro index bf9d0a6..99e2c50 100644 --- a/sea_transport/sea_transport.pro +++ b/sea_transport/sea_transport.pro @@ -25,6 +25,7 @@ SOURCES += \ system/object_system.cpp \ usereditdialog.cpp \ vesseleditdialog.cpp \ + viewmodels/cargoviewmodel.cpp \ viewmodels/deliverypointsviewmodel.cpp \ viewmodels/usersviewmodel.cpp \ viewmodels/vesselsviewmodel.cpp @@ -47,6 +48,7 @@ HEADERS += \ system/object_system.h \ usereditdialog.h \ vesseleditdialog.h \ + viewmodels/cargoviewmodel.h \ viewmodels/deliverypointsviewmodel.h \ viewmodels/usersviewmodel.h \ viewmodels/vesselsviewmodel.h diff --git a/sea_transport/storageeditdialog.cpp b/sea_transport/storageeditdialog.cpp index bfb4dc4..8395ae9 100644 --- a/sea_transport/storageeditdialog.cpp +++ b/sea_transport/storageeditdialog.cpp @@ -1,14 +1,80 @@ #include "storageeditdialog.h" #include "ui_storageeditdialog.h" -StorageEditDialog::StorageEditDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::StorageEditDialog) -{ +StorageEditDialog::StorageEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::StorageEditDialog) { ui->setupUi(this); + + this->cvm = new CargoViewModel(this); + ui->lv_cargo->setModel(this->cvm); + + connect(ui->lv_cargo->selectionModel(), &QItemSelectionModel::selectionChanged, [this](const QItemSelection &selected) { + ui->pb_cargo_remove->setEnabled(selected.length() > 0); + }); + + connect(ui->pb_cargo_remove, &QPushButton::clicked, [this]() { + auto sel = ui->lv_cargo->selectionModel()->selectedRows(); + if (sel.length() == 0) { + return; + } + + foreach (auto mIdx, sel) { + auto cdata = mIdx.data().toInt(); + qDebug() << cdata << '\n'; + } + }); + + connect(ui->pb_cargo_add, &QPushButton::clicked, this, &StorageEditDialog::on_cargo_add); + + connect(ui->pb_save, &QPushButton::clicked, this, &StorageEditDialog::accept); + connect(ui->pb_discard, &QPushButton::clicked, this, &StorageEditDialog::reject); } -StorageEditDialog::~StorageEditDialog() -{ +StorageEditDialog::~StorageEditDialog() { delete ui; } + +storage_entity* StorageEditDialog::storage() { + return this->_storage; +} + +void StorageEditDialog::set_storage(storage_entity *ent, bool edit) { + this->_storage = new storage_entity(*ent); + + if (edit) { + ui->sb_capacity->setValue(ent->capacity()); + this->cvm->set_data(this->_storage->cargo()); + } +} + +void StorageEditDialog::on_cargo_add() { + CargoEditDialog ced(this); + ced.setWindowTitle("New cargo"); + if (ced.exec() != CargoEditDialog::Accepted) { + return; + } + + bool success; + this->_storage->add_cargo(*ced.cargo(), success); + if (success) { + this->cvm->set_data(this->_storage->cargo()); + QMessageBox::information(this, "Success", "Cargo successfully put into storage"); + } + else { + QMessageBox::critical(this, "Error", "Not enough space to put cargo"); + } +} + +void StorageEditDialog::accept() { + int cvs = 0; + foreach (auto c, this->_storage->cargo()) { + cvs += c.volume(); + } + if (cvs > ui->sb_capacity->value()) { + QMessageBox::critical(this, "Error", "Cargo volume bigger than capacity"); + return; + } + + this->_storage->set_capacity(ui->sb_capacity->value()); + + QDialog::accept(); +} diff --git a/sea_transport/storageeditdialog.h b/sea_transport/storageeditdialog.h index bf70a54..372833a 100644 --- a/sea_transport/storageeditdialog.h +++ b/sea_transport/storageeditdialog.h @@ -1,22 +1,36 @@ #ifndef STORAGEEDITDIALOG_H #define STORAGEEDITDIALOG_H +#include #include +#include + +#include "entities/storage_entity.h" +#include "viewmodels/cargoviewmodel.h" +#include "cargoeditdialog.h" + namespace Ui { class StorageEditDialog; } -class StorageEditDialog : public QDialog -{ +class StorageEditDialog : public QDialog { Q_OBJECT + Ui::StorageEditDialog *ui; + + CargoViewModel *cvm; + storage_entity *_storage; public: explicit StorageEditDialog(QWidget *parent = nullptr); ~StorageEditDialog(); -private: - Ui::StorageEditDialog *ui; + storage_entity* storage(); + void set_storage(storage_entity *ent, bool edit); + +public slots: + void on_cargo_add(); + void accept() Q_DECL_OVERRIDE; }; #endif // STORAGEEDITDIALOG_H diff --git a/sea_transport/storageeditdialog.ui b/sea_transport/storageeditdialog.ui index 95b17c4..ac1e467 100644 --- a/sea_transport/storageeditdialog.ui +++ b/sea_transport/storageeditdialog.ui @@ -7,7 +7,7 @@ 0 0 400 - 190 + 336 @@ -17,24 +17,45 @@ - - - Storage num.: - - - - - - - Capacity: - - + + + + 1 + + + 500 + + + + + + + + + + + + + + Add cargo + + + + + + + false + + + Remove cargo + + @@ -54,14 +75,14 @@ - + Discard - + Save diff --git a/sea_transport/system/object_system.cpp b/sea_transport/system/object_system.cpp index 6b6456c..5915b78 100644 --- a/sea_transport/system/object_system.cpp +++ b/sea_transport/system/object_system.cpp @@ -1,7 +1,7 @@ #include "object_system.h" -const dpoint_entity* object_system::get_dpoint(entity_id oid, bool &success) { +dpoint_entity* object_system::get_dpoint(entity_id oid, bool &success) { dpoint_entity *out = nullptr; success = false; @@ -39,7 +39,7 @@ bool object_system::add_dpoint(dpoint_entity dpoint) { return false; } -const vessel_entity* object_system::get_vessel(entity_id oid, bool &success) { +vessel_entity* object_system::get_vessel(entity_id oid, bool &success) { vessel_entity *out = nullptr; success = false; diff --git a/sea_transport/system/object_system.h b/sea_transport/system/object_system.h index 2239a42..7551201 100644 --- a/sea_transport/system/object_system.h +++ b/sea_transport/system/object_system.h @@ -16,11 +16,11 @@ private: public: object_system() = default; - const dpoint_entity* get_dpoint(entity_id oid, bool &success); + dpoint_entity* get_dpoint(entity_id oid, bool &success); bool remove_dpoint(entity_id oid); bool add_dpoint(dpoint_entity dpoint); - const vessel_entity* get_vessel(entity_id oid, bool &success); + vessel_entity* get_vessel(entity_id oid, bool &success); bool remove_vessel(entity_id oid); bool add_vessel(vessel_entity dpoint); diff --git a/sea_transport/usereditdialog.cpp b/sea_transport/usereditdialog.cpp index c0c2650..a84ba1b 100644 --- a/sea_transport/usereditdialog.cpp +++ b/sea_transport/usereditdialog.cpp @@ -1,6 +1,7 @@ #include "usereditdialog.h" #include "ui_usereditdialog.h" + UserEditDialog::UserEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::UserEditDialog) { ui->setupUi(this); @@ -12,24 +13,22 @@ UserEditDialog::~UserEditDialog() { delete ui; } -UserEditDialog::user_data* UserEditDialog::user() const { - return this->_user; +user_data_struct* UserEditDialog::user_data() const { + return this->_user_data; } void UserEditDialog::set_user(user_entity* user, bool edit) { if (edit) { - this->_user = new UserEditDialog::user_data { - user->login(), "", user->role(), true - }; + this->_user_data = new user_data_struct(); ui->et_login->setText(user->login()); ui->et_password->setText("##########UNEDITED##########"); ui->cb_role->setCurrentIndex((int)user->role()); } else { - this->_user = new UserEditDialog::user_data{}; + this->_user_data = new user_data_struct{}; } - this->_user->edit = edit; + this->_user_data->edit = edit; } void UserEditDialog::accept() { @@ -47,7 +46,7 @@ void UserEditDialog::accept() { } bool emptyTitle = ui->et_login->text().trimmed().isEmpty(); bool emptyPassword = ui->et_password->text().trimmed().isEmpty(); - bool lowerank = this->_user->edit && this->_user->role < role; + bool lowerank = this->_user_data->edit && this->_user_data->role < role; if (emptyTitle || emptyPassword || lowerank) { QMessageBox errDlg(this); errDlg.setTextFormat(Qt::RichText); @@ -67,11 +66,10 @@ void UserEditDialog::accept() { errDlg.exec(); return; } - ; - this->_user->login = ui->et_login->text().trimmed(); - this->_user->password = ui->et_password->text().trimmed(); - this->_user->role = role; + this->_user_data->login = ui->et_login->text().trimmed(); + this->_user_data->password = ui->et_password->text().trimmed(); + this->_user_data->role = role; QDialog::accept(); } diff --git a/sea_transport/usereditdialog.h b/sea_transport/usereditdialog.h index 7fb13ca..ada392e 100644 --- a/sea_transport/usereditdialog.h +++ b/sea_transport/usereditdialog.h @@ -11,25 +11,26 @@ namespace Ui { class UserEditDialog; } +struct user_data_struct { + QString login; + QString password; + UserRole role; + bool edit; +}; + class UserEditDialog : public QDialog { Q_OBJECT Ui::UserEditDialog *ui; - struct user_data { - QString login; - QString password; - UserRole role; - bool edit; - } *_user; + user_data_struct *_user_data; public: explicit UserEditDialog(QWidget *parent = nullptr); ~UserEditDialog(); - UserEditDialog::user_data* user() const; + user_data_struct* user_data() const; void set_user(user_entity* user, bool edit); - public slots: void accept() Q_DECL_OVERRIDE; }; diff --git a/sea_transport/viewmodels/deliverypointsviewmodel.cpp b/sea_transport/viewmodels/deliverypointsviewmodel.cpp index 5823d9c..487e768 100644 --- a/sea_transport/viewmodels/deliverypointsviewmodel.cpp +++ b/sea_transport/viewmodels/deliverypointsviewmodel.cpp @@ -55,5 +55,6 @@ QVariant DeliveryPointsViewModel::data(const QModelIndex &index, int role) const } void DeliveryPointsViewModel::update() { - dataChanged(QModelIndex(), QModelIndex()); + this->beginResetModel(); + this->endResetModel(); } diff --git a/sea_transport/viewmodels/vesselsviewmodel.cpp b/sea_transport/viewmodels/vesselsviewmodel.cpp index accfe2b..7d4f2ba 100644 --- a/sea_transport/viewmodels/vesselsviewmodel.cpp +++ b/sea_transport/viewmodels/vesselsviewmodel.cpp @@ -61,5 +61,6 @@ QVariant VesselsViewModel::data(const QModelIndex &index, int role) const { } void VesselsViewModel::update() { - dataChanged(QModelIndex(), QModelIndex()); + this->beginResetModel(); + this->endResetModel(); } diff --git a/sea_transport_project.pro.user b/sea_transport_project.pro.user index be69ce2..c77d533 100644 --- a/sea_transport_project.pro.user +++ b/sea_transport_project.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -169,7 +169,7 @@ true QtProjectManager.QMakeBuildStep - false + true @@ -221,7 +221,7 @@ true QtProjectManager.QMakeBuildStep - false + true diff --git a/st_test/tst_st_test.cpp b/st_test/tst_st_test.cpp index 3c8ca78..fca6bde 100644 --- a/st_test/tst_st_test.cpp +++ b/st_test/tst_st_test.cpp @@ -133,7 +133,7 @@ void st_test::dpoint_entity_serialization_test() { f.open(QIODevice::WriteOnly); stream.setDevice(&f); - ent1 = dpoint_entity("some_test_point"); + ent1 = dpoint_entity(0, "some_test_point"); ent1.serialize(stream); stream.setDevice(nullptr);