Merge pull request #2 from NuarkNoir/admin_panel

Admin panel
This commit is contained in:
Andrew 2020-12-23 19:24:27 +07:00 committed by GitHub
commit 8c9cb25c6f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
45 changed files with 1902 additions and 415 deletions

View file

@ -6,78 +6,298 @@ AdminPanel::AdminPanel(QWidget *parent) : QMainWindow(parent), ui(new Ui::AdminP
ui->setupUi(this);
// connect(ui->pb_logout, &QPushButton::clicked, this, &AdminPanel::on_logout_requested);
connect(ui->pb_logout, &QPushButton::clicked, this, &AdminPanel::on_logout_requested);
// connect(ui->pb_vessels_add, &QPushButton::clicked, this, &AdminPanel::on_vessel_add);
// connect(ui->pb_vessels_remove, &QPushButton::clicked, this, &AdminPanel::on_vessel_remove);
connect(ui->pb_vessels_add, &QPushButton::clicked, this, [this](){
this->on_vessel_add_edit(false);
});
connect(ui->pb_vessels_edit, &QPushButton::clicked, this, [this](){
this->on_vessel_add_edit(true);
});
connect(ui->pb_vessels_remove, &QPushButton::clicked, this, &AdminPanel::on_vessel_remove);
// connect(ui->pb_users_add, &QPushButton::clicked, this, &AdminPanel::on_user_add);
// connect(ui->pb_users_remove, &QPushButton::clicked, this, &AdminPanel::on_user_remove);
connect(ui->pb_users_add, &QPushButton::clicked, this, [this](){
this->on_user_add_edit(false);
});
connect(ui->pb_users_edit, &QPushButton::clicked, this, [this](){
this->on_user_add_edit(true);
});
connect(ui->pb_users_remove, &QPushButton::clicked, this, &AdminPanel::on_user_remove);
// connect(ui->pb_users_add, &QPushButton::clicked, this, &AdminPanel::on_storage_add);
// connect(ui->pb_users_remove, &QPushButton::clicked, this, &AdminPanel::on_storage_remove);
connect(ui->pb_dp_add, &QPushButton::clicked, this, [this](){
this->on_delivery_point_add_edit(false);
});
connect(ui->pb_dp_edit, &QPushButton::clicked, this, [this](){
this->on_delivery_point_add_edit(true);
});
connect(ui->pb_dp_remove, &QPushButton::clicked, this, &AdminPanel::on_delivery_point_remove);
// connect(ui->pb_dp_add, &QPushButton::clicked, this, &AdminPanel::on_delivery_point_add);
// connect(ui->pb_dp_remove, &QPushButton::clicked, this, &AdminPanel::on_delivery_point_remove);
// ui->tv_vessels->setModel();
uvm = new UsersViewModel(this);
ui->tv_users->setModel(uvm);
ui->tv_users->setModel(this->uvm);
// ui->tv_dp->setModel();
vvm = new VesselsViewModel(this);
ui->tv_vessels->setModel(vvm);
// ui->tv_storages->setModel();
dpvm = new DeliveryPointsViewModel(this);
ui->tv_dp->setModel(dpvm);
connect(ui->tv_users->selectionModel(), &QItemSelectionModel::selectionChanged, [this](const QItemSelection &selected) {
ui->pb_users_remove->setEnabled(selected.length() > 0);
ui->pb_users_edit->setEnabled(selected.length() == 1);
});
uvm->update();
connect(ui->tv_vessels->selectionModel(), &QItemSelectionModel::selectionChanged, [this](const QItemSelection &selected) {
ui->pb_vessels_remove->setEnabled(selected.length() > 0);
ui->pb_vessels_edit->setEnabled(selected.length() == 1);
});
connect(ui->tv_dp->selectionModel(), &QItemSelectionModel::selectionChanged, [this](const QItemSelection &selected) {
ui->pb_dp_remove->setEnabled(selected.length() > 0);
ui->pb_dp_edit->setEnabled(selected.length() == 1);
});
ui->tw_tabs->setCurrentIndex(0);
}
AdminPanel::~AdminPanel() {
delete ui;
delete uvm;
delete vvm;
delete dpvm;
}
AdminPanel& AdminPanel::set_user(const user_entity &user) {
this->user = user;
ui->lab_user->setText(tr("Hello user %1").arg(user.login()));
ui->lab_user->setText(tr("Hello, **%1**").arg(user.login()));
return *this;
}
void AdminPanel::on_logout_requested() {
this->close();
}
void AdminPanel::on_vessel_add() {
void AdminPanel::on_vessel_add_edit(bool edit) {
auto selected = ui->tv_vessels->selectionModel()->selectedRows();
if (edit && selected.length() != 1) {
return;
}
if (apparatus::instance()->get_object_subsystem()->dpoints().isEmpty()) {
QMessageBox::critical(this, "Error", "No harbors to assign. At least one required.");
return;
}
int skippers = 0;
foreach (auto user, apparatus::instance()->get_auth_subsystem()->users()) {
skippers += user.role() == UserRole::SKIPPER;
}
if (skippers == 0) {
QMessageBox::critical(this, "Error", "No skippers to assign. At least one required.");
return;
}
vessel_entity ves;
if (edit) {
int idx = selected[0].row();
ves = apparatus::instance()->get_object_subsystem()->vessels()[idx];
}
VesselEditDialog ved(this);
ved.setWindowTitle(edit? "Edit vessel" : "New vessel");
ved.set_vessel(&ves, edit);
if (ved.exec() != UserEditDialog::Accepted) {
return;
}
auto data = ved.vessel();
if (edit) {
apparatus::instance()->get_object_subsystem()->remove_vessel(ves.id());
QMessageBox::information(this, "Info", "Vessel edited successfully");
}
else {
QMessageBox::information(this, "Info", "Vessel created successfully");
}
apparatus::instance()->get_object_subsystem()->add_vessel(*data);
vvm->update();
dpvm->update();
}
void AdminPanel::on_vessel_remove() {
auto selected = ui->tv_vessels->selectionModel()->selectedRows();
if (selected.length() == 0) {
return;
}
QMessageBox delConf(this);
delConf.setIcon(QMessageBox::Question);
delConf.setWindowTitle(tr("Deletion confirmation"));
delConf.setText(tr("Are you sure you want to delete these vessels?"));
delConf.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
delConf.setDefaultButton(QMessageBox::No);
if (delConf.exec() == QMessageBox::No) {
return;
}
foreach (auto mIdx, selected) {
entity_id oid = mIdx.data().toULongLong();
apparatus::instance()->get_object_subsystem()->remove_vessel(oid);
}
vvm->update();
}
void AdminPanel::on_user_add() {
void AdminPanel::on_user_add_edit(bool edit) {
auto selected = ui->tv_users->selectionModel()->selectedRows();
if (edit && selected.length() != 1) {
return;
}
user_entity usr;
if (edit) {
int idx = selected[0].row();
usr = apparatus::instance()->get_auth_subsystem()->users()[idx];
if (usr.id() == this->user.id()) {
QMessageBox::critical(this, "Error", "You cannot edit yourself");
return;
}
}
UserEditDialog ued(this);
ued.setWindowTitle(edit? "Edit user" : "New user");
ued.set_user(&usr, edit);
if (ued.exec() != UserEditDialog::Accepted) {
return;
}
auto data = ued.user_data();
if (edit) {
bool success;
auto user = apparatus::instance()->get_auth_subsystem()->get_user(usr.login(), success);
if (success) {
user->set_password(data->password);
user->set_role(data->role);
QMessageBox::information(this, "Info", "User edited successfully (note: you cannot change login)");
}
else {
QMessageBox::critical(this, "Error", "Error while editing user");
return;
}
}
else {
bool success = apparatus::instance()->get_auth_subsystem()->register_user(data->login, data->password, data->role);
if (success) {
QMessageBox::information(this, "Info", "User created successfully");
}
else {
QMessageBox::critical(this, "Error", "Error while creating user");
return;
}
}
uvm->update();
}
void AdminPanel::on_user_remove() {
auto selected = ui->tv_users->selectionModel()->selectedRows();
if (selected.length() == 0) {
return;
}
QMessageBox delConf(this);
delConf.setIcon(QMessageBox::Question);
delConf.setWindowTitle(tr("Deletion confirmation"));
delConf.setText(tr("Are you sure you want to delete these users?"));
delConf.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
delConf.setDefaultButton(QMessageBox::No);
if (delConf.exec() == QMessageBox::No) {
return;
}
auto _u = apparatus::instance()->get_auth_subsystem()->users();
foreach (auto mIdx, selected) {
int idx = mIdx.row();
auto ent = _u[idx];
if (ent.id() == user.id()) {
QMessageBox::critical(this, "Error", "You cannot delete yourself!");
break;
}
apparatus::instance()->get_auth_subsystem()->remove_user(ent.login());
}
uvm->update();
}
void AdminPanel::on_storage_add() {
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];
}
void AdminPanel::on_storage_remove() {
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::information(this, "Info", "Successfully edited delivery point");
}
else {
QMessageBox::critical(this, "Error", "Error editing delivery point");
return;
}
void AdminPanel::on_delivery_point_add() {
dp->set_title(data->title());
dp->set_storages(data->storages());
}
else {
bool success = apparatus::instance()->get_object_subsystem()->add_dpoint(*data);
if (success) {
QMessageBox::information(this, "Info", "Successfully created delivery point");
}
else {
QMessageBox::critical(this, "Error", "Error creating delivery point");
return;
}
}
dpvm->update();
}
void AdminPanel::on_delivery_point_remove() {
auto selected = ui->tv_dp->selectionModel()->selectedRows();
if (selected.length() == 0) {
return;
}
QMessageBox delConf(this);
delConf.setIcon(QMessageBox::Question);
delConf.setWindowTitle(tr("Deletion confirmation"));
delConf.setText(tr("Are you sure you want to delete these delivery points?"));
delConf.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
delConf.setDefaultButton(QMessageBox::No);
if (delConf.exec() == QMessageBox::No) {
return;
}
foreach (auto mIdx, selected) {
entity_id oid = mIdx.data().toULongLong();
apparatus::instance()->get_object_subsystem()->remove_dpoint(oid);
}
dpvm->update();
}

View file

@ -2,10 +2,19 @@
#define ADMINPANEL_H
#include <QMainWindow>
#include <QMessageBox>
#include <QDebug>
#include "usereditdialog.h"
#include "vesseleditdialog.h"
#include "deliverypointeditdialog.h"
#include "viewmodels/usersviewmodel.h"
#include "viewmodels/vesselsviewmodel.h"
#include "viewmodels/deliverypointsviewmodel.h"
#include "entities/user_entity.h"
#include "entities/dpoint_entity.h"
namespace Ui {
class AdminPanel;
@ -18,6 +27,8 @@ class AdminPanel : public QMainWindow
user_entity user;
UsersViewModel *uvm;
VesselsViewModel *vvm;
DeliveryPointsViewModel *dpvm;
public:
explicit AdminPanel(QWidget *parent = nullptr);
@ -32,16 +43,13 @@ private:
void on_logout_requested();
void on_vessel_add();
void on_vessel_add_edit(bool edit);
void on_vessel_remove();
void on_user_add();
void on_user_add_edit(bool edit);
void on_user_remove();
void on_storage_add();
void on_storage_remove();
void on_delivery_point_add();
void on_delivery_point_add_edit(bool edit);
void on_delivery_point_remove();
};

View file

@ -6,153 +6,21 @@
<rect>
<x>0</x>
<y>0</y>
<width>1200</width>
<height>600</height>
<width>1162</width>
<height>532</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Vessels</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tv_vessels"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="pb_vessels_add">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_vessels_remove">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="2" column="1">
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Users</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tv_users"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="pb_users_add">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_users_remove">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Delivery points</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tv_dp"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pb_dp_add">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_dp_remove">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Storages</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tv_storages"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="pb_storage_add">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_storage_remove">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="0" column="1">
<widget class="QLabel" name="lab_user">
<property name="text">
<string>Hello, user %1</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QPushButton" name="pb_logout">
<property name="sizePolicy">
@ -166,19 +34,229 @@
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1200</width>
<height>21</height>
</rect>
<item row="0" column="1">
<widget class="QLabel" name="lab_user">
<property name="text">
<string>Hello, %1</string>
</property>
<property name="textFormat">
<enum>Qt::MarkdownText</enum>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTabWidget" name="tw_tabs">
<property name="tabShape">
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>2</number>
</property>
<property name="documentMode">
<bool>false</bool>
</property>
<property name="tabBarAutoHide">
<bool>false</bool>
</property>
<widget class="QWidget" name="tab_users">
<attribute name="title">
<string>Users</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QTableView" name="tv_users">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>953</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="pb_users_add">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_users_edit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_users_remove">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_vessels">
<attribute name="title">
<string>Vessels</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="pb_vessels_add">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_vessels_edit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_vessels_remove">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>953</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1" colspan="2">
<widget class="QTableView" name="tv_vessels">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_dps">
<attribute name="title">
<string>Delivery points</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="1">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>953</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pb_dp_add">
<property name="text">
<string>Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_dp_edit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_dp_remove">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1" colspan="2">
<widget class="QTableView" name="tv_dp">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>

View file

@ -34,6 +34,8 @@ void AuthWindow::on_auth_requested() {
QMessageBox::information(this, "Info", "You are the first user of system. "
"Your account type is administrator");
}
apparatus::instance()->save();
}
auto user = a->get_user(login, success);

View file

@ -1,14 +1,29 @@
#include "cargoeditdialog.h"
#include "ui_cargoeditdialog.h"
CargoEditDialog::CargoEditDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::CargoEditDialog)
{
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()
{
CargoEditDialog::~CargoEditDialog() {
delete ui;
}
cargo_entity* CargoEditDialog::cargo() {
return this->_cargo;
}
void CargoEditDialog::accept() {
bool emptyTitle = ui->et_title->text().trimmed().isEmpty();
if (emptyTitle) {
QMessageBox::critical(this, "Error", "Title cannot be empty");
return;
}
this->_cargo = new cargo_entity(ui->et_title->text().trimmed(), ui->sb_volume->value());
QDialog::accept();
}

View file

@ -2,21 +2,28 @@
#define CARGOEDITDIALOG_H
#include <QDialog>
#include <QMessageBox>
#include "entities/cargo_entity.h"
namespace Ui {
class CargoEditDialog;
}
class CargoEditDialog : public QDialog
{
class CargoEditDialog : public QDialog {
Q_OBJECT
Ui::CargoEditDialog *ui;
cargo_entity *_cargo;
public:
explicit CargoEditDialog(QWidget *parent = nullptr);
~CargoEditDialog();
private:
Ui::CargoEditDialog *ui;
cargo_entity* cargo();
public slots:
void accept() Q_DECL_OVERRIDE;
};
#endif // CARGOEDITDIALOG_H

View file

@ -7,9 +7,21 @@
<x>0</x>
<y>0</y>
<width>318</width>
<height>279</height>
<height>127</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>318</width>
<height>127</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>318</width>
<height>127</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
@ -19,12 +31,12 @@
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Cargo ID:</string>
<string>Title</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="et_cargo_id">
<widget class="QLineEdit" name="et_title">
<property name="text">
<string/>
</property>
@ -33,28 +45,17 @@
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Quantity:</string>
<string>Volume:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="et_quantity">
<property name="text">
<string/>
<widget class="QSpinBox" name="sb_volume">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Destination:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="btn_choose_destination">
<property name="text">
<string>Choose...</string>
<property name="maximum">
<number>500000</number>
</property>
</widget>
</item>
@ -76,14 +77,14 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="btn_discard">
<widget class="QPushButton" name="pb_discard">
<property name="text">
<string>Discard</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_save">
<widget class="QPushButton" name="pb_save">
<property name="text">
<string>Save</string>
</property>

View file

@ -1,14 +1,106 @@
#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();
this->_dp->remove_storage(cuid);
}
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];
}
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:"
"<br>- 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();
}

View file

@ -1,22 +1,42 @@
#ifndef DELIVERYPOINTEDITDIALOG_H
#define DELIVERYPOINTEDITDIALOG_H
#include <QDebug>
#include <QDialog>
#include <QMessageBox>
#include <QString>
#include <QStringList>
#include <QStringListModel>
#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

View file

@ -10,10 +10,22 @@
<height>386</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>394</width>
<height>386</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>394</width>
<height>386</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QFormLayout" name="formLayout">
<property name="horizontalSpacing">
@ -44,19 +56,39 @@
</layout>
</item>
<item>
<widget class="QListView" name="lv_storages"/>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Storages IDs</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QListView" name="lv_storages">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="btn_storage_add">
<widget class="QPushButton" name="pb_storage_add">
<property name="text">
<string>Add storage</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_storage_remove">
<widget class="QPushButton" name="pb_storage_edit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit storage</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_storage_remove">
<property name="enabled">
<bool>false</bool>
</property>
@ -67,6 +99,9 @@
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
@ -83,14 +118,14 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="btn_discard">
<widget class="QPushButton" name="pb_discard">
<property name="text">
<string>Discard</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_save">
<widget class="QPushButton" name="pb_save">
<property name="text">
<string>Save</string>
</property>

View file

@ -1,11 +1,19 @@
#include "cargo_entity.h"
entity_id cargo_entity::__global_id = 0;
cargo_entity::cargo_entity() {
this->_id = ++cargo_entity::__global_id + QRandomGenerator().generate64();
}
cargo_entity::cargo_entity(const QString &title, unsigned int volume) : _title(title), _volume(volume) {
this->_id = volume;
auto hash = QCryptographicHash::hash(title.toLocal8Bit(), QCryptographicHash::Md5);
for (auto bit : hash) {
this->_id += bit;
}
this->_id += QRandomGenerator().generate64();
}
entity_id cargo_entity::id() const {
@ -27,3 +35,11 @@ void cargo_entity::serialize(QDataStream &output) {
void cargo_entity::deserialize(QDataStream &input) {
input >> this->_id >> this->_title >> this->_volume;
}
void cargo_entity::preloadGlobalId(entity_id gid) {
cargo_entity::__global_id = gid;
}
entity_id cargo_entity::GID() {
return cargo_entity::__global_id;
}

View file

@ -4,17 +4,20 @@
#include "IEntity.h"
#include <QString>
#include <QRandomGenerator>
#include <QCryptographicHash>
class cargo_entity : public IEntity {
private:
entity_id _id;
static entity_id __global_id;
entity_id _id = 0;
QString _title;
unsigned int _volume;
unsigned int _volume = 50000;
public:
cargo_entity() = default;
cargo_entity();
cargo_entity(const QString &title, unsigned int volume);
entity_id id() const;
@ -23,6 +26,8 @@ public:
void serialize(QDataStream &output);
void deserialize(QDataStream &input);
static void preloadGlobalId(entity_id gid);
static entity_id GID();
};
#endif // CARGO_ENTITY_H

View file

@ -1,25 +1,75 @@
#include "dpoint_entity.h"
dpoint_entity::dpoint_entity(const QString &title) : _title(title) {
this->_id = 0;
entity_id dpoint_entity::__global_id = 0;
dpoint_entity::dpoint_entity() {
this->_id = ++dpoint_entity::__global_id + QRandomGenerator().generate64();
}
dpoint_entity::dpoint_entity(entity_id dispatcher_id, const QString &title) : _dispatcher_id(dispatcher_id), _title(title) {
this->_id = dispatcher_id;
auto hash = QCryptographicHash::hash(title.toLocal8Bit(), QCryptographicHash::Md5);
for (auto bit : hash) {
this->_id += bit;
}
this->_id += QRandomGenerator().generate64();
}
entity_id dpoint_entity::id() const {
return this->_id;
}
entity_id dpoint_entity::dispatcher() const {
return this->_dispatcher_id;
}
QString dpoint_entity::title() const {
return this->_title;
}
void dpoint_entity::set_title(const QString &new_title) {
this->_title = new_title;
}
const QVector<storage_entity> dpoint_entity::storages() {
return this->_storages;
}
storage_entity* dpoint_entity::get_storage(entity_id sid, bool &success) {
success = false;
for (int i = 0; i < this->_storages.length(); i++) {
if (this->_storages[i].id() != sid) {
continue;
}
success = true;
return &this->_storages[i];
}
return nullptr;
}
void dpoint_entity::set_storages(QVector<storage_entity> storages) {
this->_storages = storages;
}
void dpoint_entity::remove_storage(entity_id sid) {
QVector<storage_entity> st(this->_storages);
for (int i = 0; i < st.length(); i++) {
if (st[i].id() == sid) {
st.removeAt(i);
break;
}
}
this->set_storages(st);
}
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) {
@ -35,3 +85,11 @@ void dpoint_entity::deserialize(QDataStream &input) {
this->_storages[i].deserialize(input);
}
}
void dpoint_entity::preloadGlobalId(entity_id gid) {
dpoint_entity::__global_id = gid;
}
entity_id dpoint_entity::GID() {
return dpoint_entity::__global_id;
}

View file

@ -6,25 +6,37 @@
#include <QString>
#include <QVector>
#include <QRandomGenerator>
#include <QCryptographicHash>
class dpoint_entity : public IEntity {
private:
entity_id _id;
static entity_id __global_id;
entity_id _id = 0;
entity_id _dispatcher_id;
QString _title;
QVector<storage_entity> _storages;
public:
dpoint_entity() = default;
dpoint_entity(const QString &title);
dpoint_entity();
dpoint_entity(entity_id dispatcher_id, const QString &title);
entity_id id() const;
entity_id dispatcher() const;
QString title() const;
void set_title(const QString &new_title);
const QVector<storage_entity> storages();
storage_entity* get_storage(entity_id sid, bool &success);
void set_storages(QVector<storage_entity> storages);
void remove_storage(entity_id sid);
void add_storage(storage_entity ent);
void serialize(QDataStream &output);
void deserialize(QDataStream &input);
static void preloadGlobalId(entity_id gid);
static entity_id GID();
};
#endif // DPOINT_ENTITY_H

View file

@ -3,10 +3,13 @@
entity_id storage_entity::__global_id = 0;
storage_entity::storage_entity(unsigned int capacity) : _capacity(capacity) {
this->_id = ++storage_entity::__global_id;
storage_entity::storage_entity() {
this->_id = ++storage_entity::__global_id + QRandomGenerator().generate64();
}
storage_entity::storage_entity(unsigned int capacity) : _capacity(capacity) {
this->_id = ++storage_entity::__global_id + QRandomGenerator().generate64();
}
entity_id storage_entity::id() const {
return this->_id;
@ -16,12 +19,16 @@ unsigned int storage_entity::capacity() const {
return this->_capacity;
}
void storage_entity::set_capacity(unsigned int new_capacity) {
this->_capacity = new_capacity;
}
const QVector<cargo_entity> storage_entity::cargo() {
return this->_cargo;
}
void storage_entity::add_cargo(cargo_entity object, bool &success) {
success = ((int)this->_capacity - (int)object.volume()) > 0;
success = ((int)this->_capacity - (int)object.volume()) >= 0;
if (success) {
this->_cargo.push_back(object);
this->_capacity -= object.volume();

View file

@ -5,23 +5,24 @@
#include "cargo_entity.h"
#include <QVector>
#include <QCryptographicHash>
#include <QRandomGenerator>
class storage_entity : public IEntity {
private:
static entity_id __global_id;
entity_id _id;
unsigned int _capacity;
entity_id _id = 0;
unsigned int _capacity = 500000;
QVector<cargo_entity> _cargo;
public:
storage_entity() = default;
storage_entity();
storage_entity(unsigned int capacity);
entity_id id() const;
unsigned int capacity() const;
void set_capacity(unsigned int new_capacity);
const QVector<cargo_entity> cargo();
void add_cargo(cargo_entity object, bool &success);

View file

@ -1,7 +1,21 @@
#include "user_entity.h"
entity_id user_entity::__global_id = 0;
user_entity::user_entity() {
this->_id = ++user_entity::__global_id + QRandomGenerator().generate64();
}
user_entity::user_entity(const QString &login, const QString &password, UserRole role) : _login(login), _role(role) {
this->_pwd_hash = QCryptographicHash::hash(password.toLocal8Bit(), QCryptographicHash::Sha3_256);
foreach (auto bit, this->_pwd_hash) {
this->_id += bit;
}
foreach (auto bit, QCryptographicHash::hash(login.toLocal8Bit(), QCryptographicHash::Sha3_256)) {
this->_id += bit;
}
this->_id += QRandomGenerator().generate64();
}
entity_id user_entity::id() const {
@ -20,6 +34,14 @@ bool user_entity::verify_password(const QString &password) const {
return (this->_pwd_hash == QCryptographicHash::hash(password.toLocal8Bit(), QCryptographicHash::Sha3_256));
}
void user_entity::set_password(const QString &new_password) {
this->_pwd_hash = QCryptographicHash::hash(new_password.toLocal8Bit(), QCryptographicHash::Sha3_256);
}
void user_entity::set_role(UserRole new_role) {
this->_role = new_role;
}
void user_entity::serialize(QDataStream &output) {
output << this->_id << this->_login << this->_role << this->_pwd_hash;
}
@ -27,3 +49,11 @@ void user_entity::serialize(QDataStream &output) {
void user_entity::deserialize(QDataStream &input) {
input >> this->_id >> this->_login >> this->_role >> this->_pwd_hash;
}
void user_entity::preloadGlobalId(entity_id gid) {
user_entity::__global_id = gid;
}
entity_id user_entity::GID() {
return user_entity::__global_id;
}

View file

@ -4,6 +4,7 @@
#include "IEntity.h"
#include <QString>
#include <QRandomGenerator>
#include <QCryptographicHash>
@ -14,22 +15,28 @@ enum class UserRole {
class user_entity : public IEntity {
private:
entity_id _id;
static entity_id __global_id;
entity_id _id = 0;
QString _login;
UserRole _role;
QByteArray _pwd_hash;
public:
user_entity() = default;
user_entity();
user_entity(const QString &login, const QString &password, UserRole role);
entity_id id() const;
const QString login() const;
UserRole role() const;
bool verify_password(const QString &password) const;
void set_password(const QString &new_password);
void set_role(UserRole new_role);
void serialize(QDataStream &output);
void deserialize(QDataStream &input);
static void preloadGlobalId(entity_id gid);
static entity_id GID();
};
#endif // USER_ENTITY_H

View file

@ -3,29 +3,84 @@
entity_id vessel_entity::__global_id = 0;
vessel_entity::vessel_entity(const dpoint_entity &harbor, unsigned int capacity) : _harbor(harbor), _capacity(capacity) {
this->_id = ++vessel_entity::__global_id;
vessel_entity::vessel_entity() {
this->_id = ++vessel_entity::__global_id + QRandomGenerator().generate64();
}
vessel_entity::vessel_entity(QString skipper, entity_id harbor_id, unsigned int capacity) : _skipper(skipper), _harbor_id(harbor_id), _capacity(capacity) {
this->_id = ++vessel_entity::__global_id + harbor_id + capacity + QRandomGenerator().generate64();
}
entity_id vessel_entity::id() const {
return this->_id;
}
const dpoint_entity vessel_entity::harbor() const {
return this->_harbor;
QString vessel_entity::skipper() const {
return this->_skipper;
}
void vessel_entity::set_skipper(const QString &new_skipper) {
this->_skipper = new_skipper;
}
entity_id vessel_entity::harbor() const {
return this->_harbor_id;
}
void vessel_entity::set_harbor(entity_id new_harbor) {
this->_harbor_id = new_harbor;
}
unsigned int vessel_entity::capacity() const {
return this->_capacity;
}
void vessel_entity::set_capacity(unsigned int new_capacity) {
this->_capacity = new_capacity;
}
const QVector<cargo_entity> vessel_entity::cargo() {
return this->_cargo;
}
void vessel_entity::add_cargo(cargo_entity object, bool &success) {
success = ((int)this->_capacity - (int)object.volume()) >= 0;
if (success) {
this->_cargo.push_back(object);
this->_capacity -= object.volume();
}
}
cargo_entity vessel_entity::get_cargo(entity_id oid, bool &found) {
cargo_entity ent;
found = false;
auto vit = this->_cargo.begin();
for (; vit != this->_cargo.end(); vit++) {
if ((*vit).id() == oid) {
ent = *vit;
found = true;
break;
}
}
return ent;
}
void vessel_entity::withdraw_cargo(entity_id oid, bool &success) {
success = false;
auto vit = this->_cargo.begin();
for (; vit != this->_cargo.end(); vit++) {
if ((*vit).id() == oid) {
this->_capacity += (*vit).volume();
this->_cargo.erase(vit);
success = true;
break;
}
}
}
void vessel_entity::serialize(QDataStream &output) {
output << this->_id;
this->_harbor.serialize(output);
output << this->_id << this->_skipper << this->_harbor_id;
output << this->_capacity << this->_cargo.size();
for (auto item : this->_cargo) {
item.serialize(output);
@ -33,8 +88,7 @@ void vessel_entity::serialize(QDataStream &output) {
}
void vessel_entity::deserialize(QDataStream &input) {
input >> this->_id;
this->_harbor.deserialize(input);
input >> this->_id >> this->_skipper >> this->_harbor_id;
int icnt;
input >> this->_capacity >> icnt;
this->_cargo.resize(icnt);

View file

@ -5,25 +5,36 @@
#include "cargo_entity.h"
#include "dpoint_entity.h"
#include <QRandomGenerator>
class vessel_entity : public IEntity {
private:
static entity_id __global_id;
entity_id _id;
dpoint_entity _harbor;
unsigned int _capacity;
entity_id _id = 0;
QString _skipper;
entity_id _harbor_id;
unsigned int _capacity = 50000;
QVector<cargo_entity> _cargo;
public:
vessel_entity() = default;
vessel_entity(const dpoint_entity &harbor, unsigned int capacity);
vessel_entity();
vessel_entity(QString skipper, entity_id harbor_id, unsigned int capacity);
entity_id id() const;
const dpoint_entity harbor() const;
QString skipper() const;
void set_skipper(const QString &new_skipper);
entity_id harbor() const;
void set_harbor(entity_id new_harbor);
unsigned int capacity() const;
void set_capacity(unsigned int new_capacity);
const QVector<cargo_entity> cargo();
void add_cargo(cargo_entity object, bool &success);
cargo_entity get_cargo(entity_id oid, bool &found);
void withdraw_cargo(entity_id oid, bool &success);
void serialize(QDataStream &output);
void deserialize(QDataStream &input);
static void preloadGlobalId(entity_id gid);

View file

@ -25,7 +25,10 @@ SOURCES += \
system/object_system.cpp \
usereditdialog.cpp \
vesseleditdialog.cpp \
viewmodels/usersviewmodel.cpp
viewmodels/cargoviewmodel.cpp \
viewmodels/deliverypointsviewmodel.cpp \
viewmodels/usersviewmodel.cpp \
viewmodels/vesselsviewmodel.cpp
HEADERS += \
adminpanel.h \
@ -45,7 +48,10 @@ HEADERS += \
system/object_system.h \
usereditdialog.h \
vesseleditdialog.h \
viewmodels/usersviewmodel.h
viewmodels/cargoviewmodel.h \
viewmodels/deliverypointsviewmodel.h \
viewmodels/usersviewmodel.h \
viewmodels/vesselsviewmodel.h
FORMS += \
adminpanel.ui \

View file

@ -1,14 +1,86 @@
#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->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->_storage->withdraw_cargo(oid, success);
if (!success) {
QMessageBox::critical(this, "Error", "Cannot remove some of this cargo!");
}
}
});
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());
}
ui->lab_capacity_current->setText(QString::number(this->_storage->capacity()));
}
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();
}

View file

@ -1,22 +1,36 @@
#ifndef STORAGEEDITDIALOG_H
#define STORAGEEDITDIALOG_H
#include <QDebug>
#include <QDialog>
#include <QMessageBox>
#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

View file

@ -7,37 +7,93 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>190</height>
<height>336</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>336</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>400</width>
<height>336</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Storage num.:</string>
<string>Capacity (new):</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="et_storage_num"/>
<widget class="QSpinBox" name="sb_capacity">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>500000</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Capacity:</string>
<string>Capacity (current):</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="et_capacity"/>
<widget class="QLabel" name="lab_capacity_current">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Storage cargo</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTableView" name="tv_cargo"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pb_cargo_add">
<property name="text">
<string>Add cargo</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pb_cargo_remove">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Remove cargo</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
@ -54,14 +110,14 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="btn_discard">
<widget class="QPushButton" name="pb_discard">
<property name="text">
<string>Discard</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_save">
<widget class="QPushButton" name="pb_save">
<property name="text">
<string>Save</string>
</property>

View file

@ -39,9 +39,12 @@ void apparatus::save() {
QDataStream stream(&f);
// saving GIDs
entity_id vgid = vessel_entity::GID();
entity_id cgid = cargo_entity::GID();
entity_id dgid = dpoint_entity::GID();
entity_id sgid = storage_entity::GID();
stream << vgid << sgid;
entity_id ugid = user_entity::GID();
entity_id vgid = vessel_entity::GID();
stream << cgid << dgid << sgid << ugid << vgid;
// serializing data
this->_auth_system->serialize_data(&stream);
@ -52,17 +55,20 @@ void apparatus::save() {
void apparatus::load() {
if (_instance == nullptr) {
throw std::runtime_error("HOW DU FUCK INSTANCE IS NULL????");
throw std::runtime_error("NO WAY INSTANCE IS NULL!");
}
QFile f(apparatus::filename);
f.open(QIODevice::ReadOnly);
QDataStream stream(&f);
// loading GIDs
entity_id vgid, sgid;
stream >> vgid >> sgid;
vessel_entity::preloadGlobalId(vgid);
entity_id cgid, dgid, sgid, ugid, vgid = ugid = sgid = dgid = cgid = 0;
stream >> cgid >> dgid >> sgid >> ugid >> vgid;
cargo_entity::preloadGlobalId(cgid);
dpoint_entity::preloadGlobalId(dgid);
storage_entity::preloadGlobalId(sgid);
user_entity::preloadGlobalId(ugid);
vessel_entity::preloadGlobalId(vgid);
// deserializing data
this->_auth_system->deserialize_data(&stream);

View file

@ -1,9 +1,8 @@
#include "apparatus.h"
#include "auth_system.h"
#include <iostream>
const user_entity* auth_system::get_user(const QString &login, bool &success) {
user_entity* auth_system::get_user(const QString &login, bool &success) {
user_entity *out = nullptr;
success = false;
@ -34,11 +33,7 @@ bool auth_system::register_user(const QString &login, const QString &password, U
bool exists = false;
this->get_user(login, exists);
if (!exists) {
std::cout << apparatus::instance()->get_auth_subsystem()->users().length() << std::endl;
this->_users.push_back(user_entity(login, password, role));
std::cout << apparatus::instance()->get_auth_subsystem()->users().length() << std::endl;
apparatus::instance()->save();
std::cout << apparatus::instance()->get_auth_subsystem()->users().length() << std::endl;
return true;
}

View file

@ -13,7 +13,7 @@ private:
public:
auth_system() = default;
const user_entity* get_user(const QString &login, bool &success);
user_entity* get_user(const QString &login, bool &success);
bool remove_user(const QString &login);
bool register_user(const QString &login, const QString &password, UserRole role);

View file

@ -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;
@ -66,11 +66,11 @@ bool object_system::remove_vessel(entity_id oid) {
return false;
}
bool object_system::add_vessel(vessel_entity dpoint) {
bool object_system::add_vessel(vessel_entity vessel) {
bool exists = false;
this->get_dpoint(dpoint.id(), exists);
this->get_vessel(vessel.id(), exists);
if (!exists) {
this->_vessels.push_back(dpoint);
this->_vessels.push_back(vessel);
return true;
}

View file

@ -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);

View file

@ -1,14 +1,72 @@
#include "usereditdialog.h"
#include "ui_usereditdialog.h"
UserEditDialog::UserEditDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::UserEditDialog)
{
UserEditDialog::UserEditDialog(QWidget *parent) : QDialog(parent), ui(new Ui::UserEditDialog) {
ui->setupUi(this);
connect(ui->btn_save, &QPushButton::clicked, this, &UserEditDialog::accept);
connect(ui->btn_discard, &QPushButton::clicked, this, &UserEditDialog::reject);
}
UserEditDialog::~UserEditDialog()
{
UserEditDialog::~UserEditDialog() {
delete ui;
}
user_data_struct* UserEditDialog::user_data() const {
return this->_user_data;
}
void UserEditDialog::set_user(user_entity* user, bool edit) {
if (edit) {
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());
ui->cb_role->setEnabled(false);
}
else {
this->_user_data = new user_data_struct{};
}
this->_user_data->edit = edit;
}
void UserEditDialog::accept() {
UserRole role;
switch (ui->cb_role->currentIndex()) {
case 0:
role = UserRole::ADMINISTRATOR;
break;
case 1:
role = UserRole::DISPATCHER;
break;
case 2:
role = UserRole::SKIPPER;
break;
}
bool emptyTitle = ui->et_login->text().trimmed().isEmpty();
bool emptyPassword = ui->et_password->text().trimmed().isEmpty();
if (emptyTitle || emptyPassword) {
QMessageBox errDlg(this);
errDlg.setTextFormat(Qt::RichText);
errDlg.setWindowTitle(tr("Error"));
errDlg.setIcon(QMessageBox::Critical);
QString message = tr("Some errors happend, while saving:");
if (emptyTitle) {
message.append("<br>- Title cannot be empty (all spaces - empty too)");
}
if (emptyPassword) {
message.append("<br>- Password cannot be empty (all spaces - empty too)");
}
errDlg.setText(message);
errDlg.exec();
return;
}
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();
}

View file

@ -2,21 +2,37 @@
#define USEREDITDIALOG_H
#include <QDialog>
#include <QMessageBox>
#include "entities/user_entity.h"
namespace Ui {
class UserEditDialog;
}
class UserEditDialog : public QDialog
{
struct user_data_struct {
QString login;
QString password;
UserRole role;
bool edit;
};
class UserEditDialog : public QDialog {
Q_OBJECT
Ui::UserEditDialog *ui;
user_data_struct *_user_data;
public:
explicit UserEditDialog(QWidget *parent = nullptr);
~UserEditDialog();
private:
Ui::UserEditDialog *ui;
user_data_struct* user_data() const;
void set_user(user_entity* user, bool edit);
public slots:
void accept() Q_DECL_OVERRIDE;
};
#endif // USEREDITDIALOG_H

View file

@ -10,6 +10,18 @@
<height>270</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>304</width>
<height>270</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>304</width>
<height>270</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
@ -68,7 +80,7 @@
</item>
<item>
<property name="text">
<string>Captain</string>
<string>Skipper</string>
</property>
</item>
</widget>

View file

@ -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();
}

View file

@ -2,21 +2,40 @@
#define VESSELEDITDIALOG_H
#include <QDialog>
#include <QInputDialog>
#include <QMessageBox>
#include "entities/vessel_entity.h"
#include "system/apparatus.h"
#include "viewmodels/cargoviewmodel.h"
#include "cargoeditdialog.h"
namespace Ui {
class VesselEditDialog;
}
class VesselEditDialog : public QDialog
{
class VesselEditDialog : public QDialog {
Q_OBJECT
Ui::VesselEditDialog *ui;
CargoViewModel *cvm;
vessel_entity *_vessel;
void select_proper_skipper();
void select_proper_port();
public:
explicit VesselEditDialog(QWidget *parent = nullptr);
~VesselEditDialog();
private:
Ui::VesselEditDialog *ui;
vessel_entity* vessel();
void set_vessel(vessel_entity *ves, bool edit);
public slots:
void on_cargo_add();
void on_withdraw_from_harbor();
void on_withdraw_from_vessel();
void accept() Q_DECL_OVERRIDE;
};
#endif // VESSELEDITDIALOG_H

View file

@ -10,100 +10,146 @@
<height>425</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>361</width>
<height>425</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>361</width>
<height>425</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<property name="horizontalSpacing">
<number>24</number>
</property>
<property name="verticalSpacing">
<number>8</number>
</property>
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Vessel num.:</string>
<string>Skipper:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="et_vessel_num"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Home port:</string>
<string>Harbor:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="btn_choose_home_port">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Choose...</string>
</property>
</widget>
<widget class="QComboBox" name="cb_port"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Max. capacity:</string>
<string>Capacity (new):</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="cb_skippers"/>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="et_max_capacity"/>
<widget class="QSpinBox" name="sb_capacity">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>50000</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Capacity (current):</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="lab_capacity_current">
<property name="text">
<string>50000</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QListView" name="listView"/>
<widget class="QTableView" name="tv_cargo">
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_add_cargo">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QPushButton" name="pb_cargo_remove">
<property name="text">
<string>Remove cargo</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="pb_cargo_add">
<property name="text">
<string>Add cargo</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="pb_withdraw_from_harbor">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Get from harbor</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pb_withdraw_from_vessel">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Move to harbor</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>64</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="btn_discard">
<widget class="QPushButton" name="pb_discard">
<property name="text">
<string>Discard</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_save">
<widget class="QPushButton" name="pb_save">
<property name="text">
<string>Save</string>
</property>

View file

@ -0,0 +1,54 @@
#include "cargoviewmodel.h"
CargoViewModel::CargoViewModel(QObject *parent) : QAbstractTableModel(parent) {
}
int CargoViewModel::rowCount(const QModelIndex &/*parent*/) const {
return this->_data.length();
}
int CargoViewModel::columnCount(const QModelIndex &/*parent*/) const {
return 3;
}
QVariant CargoViewModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("SID");
case 1:
return QString("Title");
case 2:
return QString("Volume");
}
}
return QVariant();
}
QVariant CargoViewModel::data(const QModelIndex &index, int role) const {
if (role == Qt::DisplayRole) {
auto item = this->_data[index.row()];
int col = index.column();
switch (col) {
case 0:
return QString::number(item.id());
case 1:
return item.title();
case 2:
return item.volume();
}
return "UNKNOWN FIELD";
}
return QVariant();
}
void CargoViewModel::set_data(const QVector<cargo_entity> &new_data) {
this->beginResetModel();
this->_data.clear();
this->_data += new_data;
this->endResetModel();
}

View file

@ -0,0 +1,24 @@
#ifndef CARGOVIEWMODEL_H
#define CARGOVIEWMODEL_H
#include <QVector>
#include <QAbstractTableModel>
#include "entities/cargo_entity.h"
class CargoViewModel : public QAbstractTableModel {
Q_OBJECT
QVector<cargo_entity> _data;
public:
CargoViewModel(QObject *parent);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
void set_data(const QVector<cargo_entity> &new_data);
};
#endif // CARGOVIEWMODEL_H

View file

@ -0,0 +1,60 @@
#include "deliverypointsviewmodel.h"
DeliveryPointsViewModel::DeliveryPointsViewModel(QObject *parent) : QAbstractTableModel(parent) {
}
int DeliveryPointsViewModel::rowCount(const QModelIndex &/*parent*/) const {
return apparatus::instance()->get_object_subsystem()->dpoints().length();
}
int DeliveryPointsViewModel::columnCount(const QModelIndex &/*parent*/) const {
return 4;
}
QVariant DeliveryPointsViewModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("DPID");
case 1:
return QString("Title");
case 2:
return QString("Storages count");
case 3:
return QString("Storages total volume");
}
}
return QVariant();
}
QVariant DeliveryPointsViewModel::data(const QModelIndex &index, int role) const {
if (role == Qt::DisplayRole) {
auto item = apparatus::instance()->get_object_subsystem()->dpoints()[index.row()];
int col = index.column();
switch (col) {
case 0:
return QString::number(item.id());
case 1:
return item.title();
case 2:
return item.storages().length();
case 3:
int tvol = 0;
foreach (auto storage, item.storages()) {
tvol += storage.capacity();
}
return tvol;
}
return "UNKNOWN FIELD";
}
return QVariant();
}
void DeliveryPointsViewModel::update() {
this->beginResetModel();
this->endResetModel();
}

View file

@ -0,0 +1,22 @@
#ifndef DELIVERYPOINTSVIEWMODEL_H
#define DELIVERYPOINTSVIEWMODEL_H
#include "system/apparatus.h"
#include <QAbstractTableModel>
class DeliveryPointsViewModel : public QAbstractTableModel {
Q_OBJECT
public:
DeliveryPointsViewModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
public slots:
void update();
};
#endif // DELIVERYPOINTSVIEWMODEL_H

View file

@ -4,11 +4,11 @@ UsersViewModel::UsersViewModel(QObject *parent) : QAbstractTableModel(parent) {
}
int UsersViewModel::rowCount(const QModelIndex & /*parent*/) const {
return apparatus::instance()->get_object_subsystem()->vessels().size();
int UsersViewModel::rowCount(const QModelIndex &/*parent*/) const {
return apparatus::instance()->get_auth_subsystem()->users().length();
}
int UsersViewModel::columnCount(const QModelIndex & /*parent*/) const {
int UsersViewModel::columnCount(const QModelIndex &/*parent*/) const {
return 3;
}
@ -29,29 +29,29 @@ QVariant UsersViewModel::headerData(int section, Qt::Orientation orientation, in
QVariant UsersViewModel::data(const QModelIndex &index, int role) const {
if (role == Qt::DisplayRole) {
auto item = apparatus::instance()->get_auth_subsystem()->users()[index.row()];
int col = index.column();
int col = index.column();
switch (col) {
case 0:
return QString::number(item.id());
case 1:
return item.login();
case 2:
QString role = "unknown";
QString _role = "unknown";
switch(item.role()) {
case UserRole::ADMINISTRATOR:
role = "Administrator";
_role = "Administrator";
break;
case UserRole::DISPATCHER:
role = "Dispatcher";
_role = "Dispatcher";
break;
case UserRole::SKIPPER:
role = "Skipper";
_role = "Skipper";
break;
}
return role;
return _role;
}
return "UNKNOWN FIELD";
@ -61,5 +61,6 @@ QVariant UsersViewModel::data(const QModelIndex &index, int role) const {
}
void UsersViewModel::update() {
this->resetInternalData();
this->beginResetModel();
this->endResetModel();
}

View file

@ -5,15 +5,15 @@
#include <QAbstractTableModel>
class UsersViewModel : public QAbstractTableModel
{
class UsersViewModel : public QAbstractTableModel {
Q_OBJECT
public:
UsersViewModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
public slots:
void update();

View file

@ -0,0 +1,70 @@
#include "vesselsviewmodel.h"
VesselsViewModel::VesselsViewModel(QObject *parent) : QAbstractTableModel(parent) {
}
int VesselsViewModel::rowCount(const QModelIndex &/*parent*/) const {
return apparatus::instance()->get_object_subsystem()->vessels().length();
}
int VesselsViewModel::columnCount(const QModelIndex &/*parent*/) const {
return 6;
}
QVariant VesselsViewModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("VID");
case 1:
return QString("Skipper");
case 2:
return QString("Harbor");
case 3:
return QString("Capacity");
case 4:
return QString("Cargo count");
case 5:
return QString("Cargo volume");
}
}
return QVariant();
}
QVariant VesselsViewModel::data(const QModelIndex &index, int role) const {
if (role == Qt::DisplayRole) {
auto item = apparatus::instance()->get_object_subsystem()->vessels()[index.row()];
bool hs = false;
auto harbor = apparatus::instance()->get_object_subsystem()->get_dpoint(item.harbor(), hs);
int col = index.column();
switch (col) {
case 0:
return QString::number(item.id());
case 1:
return item.skipper();
case 2:
return (hs? harbor->title() : tr("##ERROR[%1]##").arg(item.harbor()));
case 3:
return item.capacity();
case 4:
return item.cargo().length();
case 5:
int cvol = 0;
foreach (auto cargo, item.cargo()) {
cvol += cargo.volume();
}
return cvol;
}
return "UNKNOWN FIELD";
}
return QVariant();
}
void VesselsViewModel::update() {
this->beginResetModel();
this->endResetModel();
}

View file

@ -0,0 +1,22 @@
#ifndef VESSELSVIEWMODEL_H
#define VESSELSVIEWMODEL_H
#include "system/apparatus.h"
#include <QAbstractTableModel>
class VesselsViewModel : public QAbstractTableModel {
Q_OBJECT
public:
VesselsViewModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
public slots:
void update();
};
#endif // VESSELSVIEWMODEL_H

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.13.3, 2020-12-22T14:58:07. -->
<!-- Written by QtCreator 4.13.3, 2020-12-23T04:25:48. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@ -169,7 +169,7 @@
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">true</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
@ -221,7 +221,7 @@
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">true</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">

View file

@ -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);
@ -164,8 +164,8 @@ void st_test::vessel_entity_serialization_test() {
f.open(QIODevice::WriteOnly);
stream.setDevice(&f);
dpoint_entity test_harbor("test_harbor_for_vessel");
ent1 = vessel_entity(test_harbor, 256);
dpoint_entity test_harbor(0, "test_harbor_for_vessel");
ent1 = vessel_entity(0, test_harbor.id(), 256);
ent1.serialize(stream);
stream.setDevice(nullptr);
@ -181,7 +181,7 @@ void st_test::vessel_entity_serialization_test() {
}
QVERIFY2(
ent1.id() == ent2.id() && ent1.harbor().id() == ent2.harbor().id() && ent1.capacity() == ent2.capacity(),
ent1.id() == ent2.id() && ent1.harbor() == ent2.harbor() && ent1.capacity() == ent2.capacity(),
"Delivery Point entity not serialized properly"
);
}
@ -265,7 +265,7 @@ void st_test::apparatus_check_auth_subsystem() {
void st_test::apparatus_check_object_subsystem() {
apparatus::init();
auto os = apparatus::instance()->get_object_subsystem();
dpoint_entity p("test");
dpoint_entity p(0, "test");
{
bool test = os->add_dpoint(p);
QVERIFY(test);