From e0efbacd097b2dd3dd216d6af6b0240f17e15f31 Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Sun, 27 Dec 2020 19:47:23 +0700 Subject: [PATCH 1/4] Add skeleton for panel --- sea_transport/sea_transport.pro | 3 +++ sea_transport/skipperpanel.cpp | 14 ++++++++++++++ sea_transport/skipperpanel.h | 22 ++++++++++++++++++++++ sea_transport/skipperpanel.ui | 24 ++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 sea_transport/skipperpanel.cpp create mode 100644 sea_transport/skipperpanel.h create mode 100644 sea_transport/skipperpanel.ui diff --git a/sea_transport/sea_transport.pro b/sea_transport/sea_transport.pro index 99e2c50..93ae602 100644 --- a/sea_transport/sea_transport.pro +++ b/sea_transport/sea_transport.pro @@ -19,6 +19,7 @@ SOURCES += \ entities/user_entity.cpp \ entities/vessel_entity.cpp \ main.cpp \ + skipperpanel.cpp \ storageeditdialog.cpp \ system/apparatus.cpp \ system/auth_system.cpp \ @@ -42,6 +43,7 @@ HEADERS += \ entities/storage_entity.h \ entities/user_entity.h \ entities/vessel_entity.h \ + skipperpanel.h \ storageeditdialog.h \ system/apparatus.h \ system/auth_system.h \ @@ -58,6 +60,7 @@ FORMS += \ authwindow.ui \ cargoeditdialog.ui \ deliverypointeditdialog.ui \ + skipperpanel.ui \ storageeditdialog.ui \ usereditdialog.ui \ vesseleditdialog.ui diff --git a/sea_transport/skipperpanel.cpp b/sea_transport/skipperpanel.cpp new file mode 100644 index 0000000..dcb5d5e --- /dev/null +++ b/sea_transport/skipperpanel.cpp @@ -0,0 +1,14 @@ +#include "skipperpanel.h" +#include "ui_skipperpanel.h" + +SkipperPanel::SkipperPanel(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::SkipperPanel) +{ + ui->setupUi(this); +} + +SkipperPanel::~SkipperPanel() +{ + delete ui; +} diff --git a/sea_transport/skipperpanel.h b/sea_transport/skipperpanel.h new file mode 100644 index 0000000..65a7b51 --- /dev/null +++ b/sea_transport/skipperpanel.h @@ -0,0 +1,22 @@ +#ifndef SKIPPERPANEL_H +#define SKIPPERPANEL_H + +#include + +namespace Ui { + class SkipperPanel; +} + +class SkipperPanel : public QMainWindow +{ + Q_OBJECT + +public: + explicit SkipperPanel(QWidget *parent = nullptr); + ~SkipperPanel(); + +private: + Ui::SkipperPanel *ui; +}; + +#endif // SKIPPERPANEL_H diff --git a/sea_transport/skipperpanel.ui b/sea_transport/skipperpanel.ui new file mode 100644 index 0000000..20e9ec7 --- /dev/null +++ b/sea_transport/skipperpanel.ui @@ -0,0 +1,24 @@ + + + + + SkipperPanel + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + + From a8e4b10d077762a2a741d2bbcf3bdb27e59024bc Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Sun, 27 Dec 2020 19:56:56 +0700 Subject: [PATCH 2/4] Created UI for skipper panel --- sea_transport/skipperpanel.ui | 145 +++++++++++++++++++++++++++++++--- 1 file changed, 136 insertions(+), 9 deletions(-) diff --git a/sea_transport/skipperpanel.ui b/sea_transport/skipperpanel.ui index 20e9ec7..315e473 100644 --- a/sea_transport/skipperpanel.ui +++ b/sea_transport/skipperpanel.ui @@ -1,24 +1,151 @@ + - - - SkipperPanel 0 0 - 800 - 600 + 560 + 337 MainWindow - - - + + + + + + + 0 + 0 + + + + Logout + + + + + + + Hello, %1 + + + Qt::MarkdownText + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Vessel info + + + + + + VID: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + #### + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + + + + Capacity (left/max): + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + #### + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + + + + Harbor: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + #### + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Vessel cargo + + + + + + QAbstractItemView::NoSelection + + + QAbstractItemView::SelectRows + + + + + + + + - + From 05ac14f748fbd008946da66cc14b32c4e96a550d Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Sun, 27 Dec 2020 20:22:58 +0700 Subject: [PATCH 3/4] Add skipper view render code --- sea_transport/skipperpanel.cpp | 74 +++++++++++++++++++++++++++++++--- sea_transport/skipperpanel.h | 24 ++++++++++- sea_transport/skipperpanel.ui | 8 ++-- 3 files changed, 94 insertions(+), 12 deletions(-) diff --git a/sea_transport/skipperpanel.cpp b/sea_transport/skipperpanel.cpp index dcb5d5e..dccf3c9 100644 --- a/sea_transport/skipperpanel.cpp +++ b/sea_transport/skipperpanel.cpp @@ -1,14 +1,76 @@ #include "skipperpanel.h" #include "ui_skipperpanel.h" -SkipperPanel::SkipperPanel(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::SkipperPanel) -{ + +SkipperPanel::SkipperPanel(QWidget *parent) : QMainWindow(parent), ui(new Ui::SkipperPanel) { ui->setupUi(this); + + + connect(ui->pb_logout, &QPushButton::clicked, this, &SkipperPanel::on_logout_requested); + + cvm = new CargoViewModel(this); + ui->tv_cargo->setModel(this->cvm); } -SkipperPanel::~SkipperPanel() -{ +SkipperPanel::~SkipperPanel() { delete ui; + + delete cvm; +} + +SkipperPanel& SkipperPanel::set_user(const user_entity &user) { + this->user = user; + ui->lab_user->setText(tr("Hello, **%1**").arg(user.login())); + + emit user_set(); + + return *this; +} + +void SkipperPanel::on_user_set() { + UserRole urole = this->user.role(); + switch (urole) { + case UserRole::ADMINISTRATOR: + case UserRole::DISPATCHER: + QMessageBox::critical(this, "Error", "You shouldn't be here!"); + close(); + return; + case UserRole::SKIPPER: + break; + } + + bool success = false; + vessel_entity vessel; + foreach(auto _vessel, apparatus::instance()->get_object_subsystem()->vessels()) { + if (_vessel.skipper() == this->user.login()) { + success = true; + vessel = _vessel; + break; + } + } + + if (!success) { + QMessageBox::critical(this, "Error", "You are not assigned to vessel. \n" + "Ask you local dispatcher/administrator to do it. \n" + "System will now close."); + this->close(); + } + + ui->lab_vid->setText(QString::number(vessel.id())); + + bool h_success; + auto harbor = apparatus::instance()->get_object_subsystem()->get_dpoint(vessel.harbor(), h_success); + ui->lab_harbor->setText(h_success? harbor->title() : "#UNKNOWN#"); + + int cap_used = 0; + foreach (auto c, vessel.cargo()) { + cap_used += c.volume(); + } + ui->lab_capacity->setText(tr("%1/%2/%3").arg(cap_used, vessel.capacity(), vessel.capacity() + cap_used)); + + this->cvm->set_data(vessel.cargo()); +} + +void SkipperPanel::on_logout_requested() { + this->close(); } diff --git a/sea_transport/skipperpanel.h b/sea_transport/skipperpanel.h index 65a7b51..d82aa18 100644 --- a/sea_transport/skipperpanel.h +++ b/sea_transport/skipperpanel.h @@ -2,21 +2,41 @@ #define SKIPPERPANEL_H #include +#include +#include + +#include "system/apparatus.h" +#include "viewmodels/cargoviewmodel.h" +#include "entities/user_entity.h" +#include "entities/vessel_entity.h" namespace Ui { class SkipperPanel; } -class SkipperPanel : public QMainWindow -{ +class SkipperPanel : public QMainWindow { Q_OBJECT + user_entity user; + + CargoViewModel *cvm; + public: explicit SkipperPanel(QWidget *parent = nullptr); ~SkipperPanel(); + SkipperPanel& set_user(const user_entity &user); + +signals: + void user_set(); + +private slots: + void on_user_set(); + private: Ui::SkipperPanel *ui; + + void on_logout_requested(); }; #endif // SKIPPERPANEL_H diff --git a/sea_transport/skipperpanel.ui b/sea_transport/skipperpanel.ui index 315e473..30aad65 100644 --- a/sea_transport/skipperpanel.ui +++ b/sea_transport/skipperpanel.ui @@ -60,7 +60,7 @@ - #### + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -77,7 +77,7 @@ - Capacity (left/max): + Capacity (used/left/max): Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter @@ -87,7 +87,7 @@ - #### + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -114,7 +114,7 @@ - #### + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter From 4aeb0d572200178bd622206553eefe6996d2281c Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Sun, 27 Dec 2020 20:31:05 +0700 Subject: [PATCH 4/4] Some fixes --- sea_transport/authwindow.cpp | 7 +++++-- sea_transport/authwindow.h | 1 + sea_transport/skipperpanel.cpp | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/sea_transport/authwindow.cpp b/sea_transport/authwindow.cpp index 1002bdb..ecfe549 100644 --- a/sea_transport/authwindow.cpp +++ b/sea_transport/authwindow.cpp @@ -61,8 +61,11 @@ void AuthWindow::on_auth_requested() { ((AdminPanel*) w)->set_user(*user); } else if (user->role() == UserRole::SKIPPER) { - // SkipperPanel(nullptr, user).set_user(user).show(); - return; + QMessageBox::information(this, "Info", "Please note: if you have more than one vessel assigned to you " + "only first will be shown (it is intended by design, you cannot physically control two ships). \n" + "Please, ask your local dispatcher/administrator to unassign you from other vessels."); + w = new SkipperPanel(nullptr); + ((SkipperPanel*) w)->set_user(*user); } else { QMessageBox::critical(this, "Error", "Deserialized user have wrong type. " diff --git a/sea_transport/authwindow.h b/sea_transport/authwindow.h index e0f174e..f438c65 100644 --- a/sea_transport/authwindow.h +++ b/sea_transport/authwindow.h @@ -4,6 +4,7 @@ #include "system/apparatus.h" #include "adminpanel.h" +#include "skipperpanel.h" #include #include diff --git a/sea_transport/skipperpanel.cpp b/sea_transport/skipperpanel.cpp index dccf3c9..8618d7f 100644 --- a/sea_transport/skipperpanel.cpp +++ b/sea_transport/skipperpanel.cpp @@ -10,6 +10,8 @@ SkipperPanel::SkipperPanel(QWidget *parent) : QMainWindow(parent), ui(new Ui::Sk cvm = new CargoViewModel(this); ui->tv_cargo->setModel(this->cvm); + + connect(this, &SkipperPanel::user_set, this, &SkipperPanel::on_user_set); } SkipperPanel::~SkipperPanel() { @@ -66,7 +68,7 @@ void SkipperPanel::on_user_set() { foreach (auto c, vessel.cargo()) { cap_used += c.volume(); } - ui->lab_capacity->setText(tr("%1/%2/%3").arg(cap_used, vessel.capacity(), vessel.capacity() + cap_used)); + ui->lab_capacity->setText(tr("%1/%2/%3").arg(cap_used).arg(vessel.capacity() - cap_used).arg(vessel.capacity())); this->cvm->set_data(vessel.cargo()); }