Vessel edit dialog
This commit is contained in:
parent
9686b96d8a
commit
eb097588ba
21 changed files with 589 additions and 97 deletions
|
|
@ -1,14 +1,269 @@
|
|||
#include "vesseleditdialog.h"
|
||||
#include "ui_vesseleditdialog.h"
|
||||
|
||||
VesselEditDialog::VesselEditDialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::VesselEditDialog)
|
||||
{
|
||||
VesselEditDialog::VesselEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::VesselEditDialog) {
|
||||
ui->setupUi(this);
|
||||
|
||||
this->cvm = new CargoViewModel(this);
|
||||
ui->tv_cargo->setModel(this->cvm);
|
||||
|
||||
connect(ui->tv_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->tv_cargo->selectionModel()->selectedRows();
|
||||
if (sel.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (auto mIdx, sel) {
|
||||
auto oid = mIdx.data().toULongLong();
|
||||
bool success;
|
||||
this->_vessel->withdraw_cargo(oid, success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot remove some of this cargo!");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
foreach (auto port, apparatus::instance()->get_object_subsystem()->dpoints()) {
|
||||
ui->cb_port->addItem(tr("%1 :%2").arg(port.title()).arg(port.id()));
|
||||
}
|
||||
|
||||
foreach (auto user, apparatus::instance()->get_auth_subsystem()->users()) {
|
||||
if (user.role() != UserRole::SKIPPER) {
|
||||
continue;
|
||||
}
|
||||
ui->cb_skippers->addItem(tr("%1 :%2").arg(user.login()).arg(user.id()));
|
||||
}
|
||||
|
||||
connect(ui->pb_cargo_add, &QPushButton::clicked, this, &VesselEditDialog::on_cargo_add);
|
||||
|
||||
connect(ui->pb_withdraw_from_harbor, &QPushButton::clicked, this, &VesselEditDialog::on_withdraw_from_harbor);
|
||||
connect(ui->pb_withdraw_from_vessel, &QPushButton::clicked, this, &VesselEditDialog::on_withdraw_from_vessel);
|
||||
|
||||
connect(ui->pb_save, &QPushButton::clicked, this, &VesselEditDialog::accept);
|
||||
connect(ui->pb_discard, &QPushButton::clicked, this, &VesselEditDialog::reject);
|
||||
}
|
||||
|
||||
VesselEditDialog::~VesselEditDialog()
|
||||
{
|
||||
VesselEditDialog::~VesselEditDialog() {
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void VesselEditDialog::select_proper_skipper() {
|
||||
int i = 0;
|
||||
foreach (auto user, apparatus::instance()->get_auth_subsystem()->users()) {
|
||||
if (user.role() != UserRole::SKIPPER || user.login() != this->_vessel->skipper()) {
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
ui->cb_port->setCurrentIndex(i);
|
||||
return;
|
||||
}
|
||||
|
||||
QMessageBox::critical(this, "Error", "Cannot find this vessel's skipper.");
|
||||
}
|
||||
|
||||
void VesselEditDialog::select_proper_port() {
|
||||
int i = 0;
|
||||
foreach (auto port, apparatus::instance()->get_object_subsystem()->dpoints()) {
|
||||
if (port.id() != this->_vessel->harbor()) {
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
ui->cb_port->setCurrentIndex(i);
|
||||
return;
|
||||
}
|
||||
|
||||
QMessageBox::critical(this, "Error", "Cannot find this vessel's harbor.");
|
||||
}
|
||||
|
||||
vessel_entity* VesselEditDialog::vessel() {
|
||||
return this->_vessel;
|
||||
}
|
||||
|
||||
void VesselEditDialog::set_vessel(vessel_entity *ves, bool edit) {
|
||||
this->_vessel = new vessel_entity(*ves);
|
||||
|
||||
if (edit) {
|
||||
this->select_proper_skipper();
|
||||
this->select_proper_port();
|
||||
ui->sb_capacity->setValue(this->_vessel->capacity());
|
||||
this->cvm->set_data(this->_vessel->cargo());
|
||||
ui->pb_withdraw_from_harbor->setEnabled(true);
|
||||
ui->pb_withdraw_from_vessel->setEnabled(true);
|
||||
}
|
||||
ui->lab_capacity_current->setText(QString::number(this->_vessel->capacity()));
|
||||
}
|
||||
|
||||
void VesselEditDialog::on_cargo_add() {
|
||||
CargoEditDialog ced(this);
|
||||
ced.setWindowTitle("New cargo");
|
||||
if (ced.exec() != CargoEditDialog::Accepted) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool success;
|
||||
this->_vessel->add_cargo(*ced.cargo(), success);
|
||||
if (success) {
|
||||
this->cvm->set_data(this->_vessel->cargo());
|
||||
QMessageBox::information(this, "Success", "Cargo successfully put into storage");
|
||||
}
|
||||
else {
|
||||
QMessageBox::critical(this, "Error", "Not enough space to put cargo");
|
||||
}
|
||||
}
|
||||
|
||||
void VesselEditDialog::on_withdraw_from_harbor() {
|
||||
QMessageBox::information(this, "Note", "Please note, old storage will be used.\n"
|
||||
"Also, movement cannot be undone by discarding vessel edit dialog");
|
||||
|
||||
bool success;
|
||||
auto dpoint = apparatus::instance()->get_object_subsystem()->get_dpoint(this->_vessel->harbor(), success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot find associated harbor in DB");
|
||||
return;
|
||||
}
|
||||
if (dpoint->storages().isEmpty()) {
|
||||
QMessageBox::information(this, "Note", "Vessel has no storages");
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList harbor_storage;
|
||||
foreach (auto storage, dpoint->storages()) {
|
||||
harbor_storage << QString::number(storage.id());
|
||||
}
|
||||
bool ok;
|
||||
QString storage_id_str = QInputDialog::getItem(this, "Select storage", "Storages in harbor:", harbor_storage, 0, false, &ok);
|
||||
if (!ok || storage_id_str.isEmpty()) {
|
||||
QMessageBox::information(this, "Aborted", "Operation aborted by user.");
|
||||
return;
|
||||
}
|
||||
|
||||
entity_id sid = storage_id_str.toULongLong();
|
||||
auto storage = dpoint->get_storage(sid, success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot find associated storage in harbor");
|
||||
return;
|
||||
}
|
||||
if (storage->cargo().isEmpty()) {
|
||||
QMessageBox::information(this, "Note", "Storage has no cargo");
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList storage_cargo;
|
||||
foreach (auto storage, storage->cargo()) {
|
||||
storage_cargo << tr("%1 :%2").arg(storage.title()).arg(storage.id());
|
||||
}
|
||||
QString cargo_id_str = QInputDialog::getItem(this, "Select cargo", "Cargo in storage:", storage_cargo, 0, false, &ok);
|
||||
if (!ok || cargo_id_str.isEmpty()) {
|
||||
QMessageBox::information(this, "Aborted", "Operation aborted by user.");
|
||||
return;
|
||||
}
|
||||
|
||||
entity_id cid = cargo_id_str.split(":")[1].toULongLong();
|
||||
auto cargo = storage->get_cargo(cid, success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot find cargo in storage");
|
||||
return;
|
||||
}
|
||||
|
||||
this->_vessel->add_cargo(cargo, success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot add cargo to vessel");
|
||||
return;
|
||||
}
|
||||
storage->withdraw_cargo(cid, success);
|
||||
if (!success) {
|
||||
throw std::runtime_error("Cannot withdraw from storage");
|
||||
}
|
||||
|
||||
QMessageBox::information(this, "Info", "Successfully withdrawed cargo from harbor");
|
||||
cvm->set_data(this->_vessel->cargo());
|
||||
}
|
||||
|
||||
void VesselEditDialog::on_withdraw_from_vessel() {
|
||||
if (this->_vessel->cargo().isEmpty()) {
|
||||
QMessageBox::information(this, "Note", "Vessel has no cargo");
|
||||
return;
|
||||
}
|
||||
|
||||
QMessageBox::information(this, "Note", "Please note, old storage will be used.\n"
|
||||
"Also, movement cannot be undone by discarding vessel edit dialog");
|
||||
|
||||
bool success;
|
||||
auto dpoint = apparatus::instance()->get_object_subsystem()->get_dpoint(this->_vessel->harbor(), success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot find associated harbor in DB");
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList vessel_cargo;
|
||||
foreach (auto storage, this->_vessel->cargo()) {
|
||||
vessel_cargo << tr("%1 :%2").arg(storage.title()).arg(storage.id());
|
||||
}
|
||||
bool ok;
|
||||
QString cargo_id_str = QInputDialog::getItem(this, "Select cargo", "Cargo in storage:", vessel_cargo, 0, false, &ok);
|
||||
if (!ok || cargo_id_str.isEmpty()) {
|
||||
QMessageBox::information(this, "Aborted", "Operation aborted by user.");
|
||||
return;
|
||||
}
|
||||
|
||||
entity_id cid = cargo_id_str.split(":")[1].toULongLong();
|
||||
auto cargo = this->_vessel->get_cargo(cid, success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot find cargo in vessel");
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList harbor_storage;
|
||||
foreach (auto storage, dpoint->storages()) {
|
||||
harbor_storage << QString::number(storage.id());
|
||||
}
|
||||
QString storage_id_str = QInputDialog::getItem(this, "Select storage", "Storages in harbor:", harbor_storage, 0, false, &ok);
|
||||
if (!ok || storage_id_str.isEmpty()) {
|
||||
QMessageBox::information(this, "Aborted", "Operation aborted by user.");
|
||||
return;
|
||||
}
|
||||
entity_id sid = storage_id_str.toULongLong();
|
||||
auto storage = dpoint->get_storage(sid, success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot find associated storage in harbor");
|
||||
return;
|
||||
}
|
||||
|
||||
storage->add_cargo(cargo, success);
|
||||
if (!success) {
|
||||
QMessageBox::critical(this, "Error", "Cannot add cargo to storage");
|
||||
return;
|
||||
}
|
||||
this->_vessel->withdraw_cargo(cid, success);
|
||||
if (!success) {
|
||||
throw std::runtime_error("Cannot withdraw from vessel");
|
||||
}
|
||||
|
||||
QMessageBox::information(this, "Info", "Successfully withdrawed cargo from vessel");
|
||||
cvm->set_data(this->_vessel->cargo());
|
||||
}
|
||||
|
||||
void VesselEditDialog::accept() {
|
||||
int cvs = 0;
|
||||
foreach (auto c, this->_vessel->cargo()) {
|
||||
cvs += c.volume();
|
||||
}
|
||||
if (cvs > ui->sb_capacity->value()) {
|
||||
QMessageBox::critical(this, "Error", "Cargo volume bigger than capacity");
|
||||
return;
|
||||
}
|
||||
|
||||
auto slog = ui->cb_skippers->currentText().split(":")[0].trimmed();
|
||||
auto hid = ui->cb_port->currentText().split(":")[1].trimmed().toULongLong();
|
||||
auto cap = ui->sb_capacity->value();
|
||||
|
||||
this->_vessel->set_skipper(slog);
|
||||
this->_vessel->set_harbor(hid);
|
||||
this->_vessel->set_capacity(cap);
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue