base viewmodel and interactions

This commit is contained in:
Andrew nuark G 2020-12-21 23:39:04 +07:00
parent 50aa95e659
commit d69b18f083
14 changed files with 228 additions and 77 deletions

View file

@ -4,28 +4,35 @@
AdminPanel::AdminPanel(QWidget *parent) : QMainWindow(parent), ui(new Ui::AdminPanel) { AdminPanel::AdminPanel(QWidget *parent) : QMainWindow(parent), ui(new Ui::AdminPanel) {
ui->setupUi(this); ui->setupUi(this);
connect(ui->pb_logout, &QPushButton::clicked, this, &AdminPanel::on_logout_requested); uvm = new UsersViewModel(this);
connect(ui->pb_vessels_add, &QPushButton::clicked, this, &AdminPanel::on_vessel_add); // connect(ui->pb_logout, &QPushButton::clicked, this, &AdminPanel::on_logout_requested);
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_vessels_add, &QPushButton::clicked, this, &AdminPanel::on_vessel_add);
connect(ui->pb_users_remove, &QPushButton::clicked, this, &AdminPanel::on_user_remove); // connect(ui->pb_vessels_remove, &QPushButton::clicked, this, &AdminPanel::on_vessel_remove);
connect(ui->pb_users_add, &QPushButton::clicked, this, &AdminPanel::on_storage_add); // connect(ui->pb_users_add, &QPushButton::clicked, this, &AdminPanel::on_user_add);
connect(ui->pb_users_remove, &QPushButton::clicked, this, &AdminPanel::on_storage_remove); // connect(ui->pb_users_remove, &QPushButton::clicked, this, &AdminPanel::on_user_remove);
connect(ui->pb_dp_add, &QPushButton::clicked, this, &AdminPanel::on_delivery_point_add); // connect(ui->pb_users_add, &QPushButton::clicked, this, &AdminPanel::on_storage_add);
connect(ui->pb_dp_remove, &QPushButton::clicked, this, &AdminPanel::on_delivery_point_remove); // connect(ui->pb_users_remove, &QPushButton::clicked, this, &AdminPanel::on_storage_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(); // ui->tv_vessels->setModel();
// ui->tv_users->setModel(); ui->tv_users->setModel(uvm);
// ui->tv_dp->setModel(); // ui->tv_dp->setModel();
// ui->tv_storages->setModel(); // ui->tv_storages->setModel();
uvm->update();
} }
AdminPanel::~AdminPanel() { AdminPanel::~AdminPanel() {
delete ui; delete ui;
delete uvm;
} }
AdminPanel& AdminPanel::set_user(const user_entity &user) { AdminPanel& AdminPanel::set_user(const user_entity &user) {
@ -33,3 +40,39 @@ AdminPanel& AdminPanel::set_user(const user_entity &user) {
ui->lab_user->setText(tr("Hello user %1").arg(user.login())); ui->lab_user->setText(tr("Hello user %1").arg(user.login()));
return *this; return *this;
} }
void AdminPanel::on_logout_requested() {
}
void AdminPanel::on_vessel_add() {
}
void AdminPanel::on_vessel_remove() {
}
void AdminPanel::on_user_add() {
}
void AdminPanel::on_user_remove() {
}
void AdminPanel::on_storage_add() {
}
void AdminPanel::on_storage_remove() {
}
void AdminPanel::on_delivery_point_add() {
}
void AdminPanel::on_delivery_point_remove() {
}

View file

@ -3,6 +3,8 @@
#include <QMainWindow> #include <QMainWindow>
#include "viewmodels/usersviewmodel.h"
#include "entities/user_entity.h" #include "entities/user_entity.h"
namespace Ui { namespace Ui {
@ -15,6 +17,8 @@ class AdminPanel : public QMainWindow
user_entity user; user_entity user;
UsersViewModel *uvm;
public: public:
explicit AdminPanel(QWidget *parent = nullptr); explicit AdminPanel(QWidget *parent = nullptr);
~AdminPanel(); ~AdminPanel();
@ -22,6 +26,10 @@ public:
AdminPanel& set_user(const user_entity &user); AdminPanel& set_user(const user_entity &user);
private slots: private slots:
private:
Ui::AdminPanel *ui;
void on_logout_requested(); void on_logout_requested();
void on_vessel_add(); void on_vessel_add();
@ -35,9 +43,6 @@ private slots:
void on_delivery_point_add(); void on_delivery_point_add();
void on_delivery_point_remove(); void on_delivery_point_remove();
private:
Ui::AdminPanel *ui;
}; };
#endif // ADMINPANEL_H #endif // ADMINPANEL_H

View file

@ -2,9 +2,8 @@
#include "ui_authwindow.h" #include "ui_authwindow.h"
AuthWindow::AuthWindow(QWidget *parent, bool fr) : QMainWindow(parent), ui(new Ui::AuthWindow) { AuthWindow::AuthWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::AuthWindow) {
ui->setupUi(this); ui->setupUi(this);
this->firstRun = fr;
connect(ui->btn_login, &QPushButton::clicked, this, &AuthWindow::on_auth_requested); connect(ui->btn_login, &QPushButton::clicked, this, &AuthWindow::on_auth_requested);
} }
@ -24,37 +23,38 @@ void AuthWindow::on_auth_requested() {
bool success = false; bool success = false;
auto a = apparatus::instance()->get_auth_subsystem(); auto a = apparatus::instance()->get_auth_subsystem();
if (this->firstRun) { if (apparatus::isFirstRun()) {
success = a.register_user(login, passw, UserRole::ADMINISTRATOR); success = a.register_user(login, passw, UserRole::ADMINISTRATOR);
if (!success) { if (!success) {
QMessageBox::critical(this, "Error", "Cannot register you. Check filesystem permission"); QMessageBox::critical(this, "Error", "Cannot register you. Check filesystem permission");
return; return;
} }
else { else {
apparatus::instance()->serialize_data(); QMessageBox::information(this, "Info", "You are the first user of system. "
"Your account type is administrator");
} }
} }
auto user = *a.get_user(login, success); auto user = a.get_user(login, success);
if (!success) { if (!success) {
QMessageBox::critical(this, "Error", "User not found"); QMessageBox::critical(this, "Error", "User not found");
return; return;
} }
success = user.verify_password(passw); success = user->verify_password(passw);
if (!success) { if (!success) {
QMessageBox::critical(this, "Error", "Wrong password"); QMessageBox::critical(this, "Error", "Wrong password");
return; return;
} }
if (user.role() == UserRole::ADMINISTRATOR) { if (user->role() == UserRole::ADMINISTRATOR) {
AdminPanel(nullptr).set_user(user).show(); AdminPanel(nullptr).set_user(*user).showNormal();
} }
else if (user.role() == UserRole::DISPATCHER) { else if (user->role() == UserRole::DISPATCHER) {
// DispatcherPanel(nullptr, user).set_user(user).show(); // DispatcherPanel(nullptr, user).set_user(user).show();
} }
else if (user.role() == UserRole::SKIPPER) { else if (user->role() == UserRole::SKIPPER) {
// SkipperPanel(nullptr, user).set_user(user).show(); // SkipperPanel(nullptr, user).set_user(user).show();
} }
else { else {
@ -62,5 +62,4 @@ void AuthWindow::on_auth_requested() {
"It may mean corruption of data."); "It may mean corruption of data.");
return; return;
} }
close();
} }

View file

@ -1,7 +1,7 @@
#ifndef AUTHWINDOW_H #ifndef AUTHWINDOW_H
#define AUTHWINDOW_H #define AUTHWINDOW_H
#include <system/apparatus.h> #include "system/apparatus.h"
#include "adminpanel.h" #include "adminpanel.h"
@ -12,21 +12,17 @@ namespace Ui {
class AuthWindow; class AuthWindow;
} }
class AuthWindow : public QMainWindow class AuthWindow : public QMainWindow {
{
Q_OBJECT Q_OBJECT
bool firstRun;
public: public:
explicit AuthWindow(QWidget *parent = nullptr, bool fr = false); explicit AuthWindow(QWidget *parent = nullptr);
~AuthWindow(); ~AuthWindow();
private slots:
void on_auth_requested();
private: private:
Ui::AuthWindow *ui; Ui::AuthWindow *ui;
void on_auth_requested();
}; };
#endif // AUTHWINDOW_H #endif // AUTHWINDOW_H

View file

@ -7,13 +7,16 @@
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
QApplication a(argc, argv); QApplication a(argc, argv);
bool fr = apparatus::isFirstRun();
apparatus::init(); apparatus::init();
AuthWindow w(nullptr, fr);
w.show();
int ecode = a.exec();
apparatus::shutdown();
return ecode; AuthWindow w(nullptr);
w.show();
QObject::connect(&a, &QApplication::aboutToQuit, []() {
apparatus::shutdown();
if (apparatus::isFirstRun()) {
apparatus::generate_lock_file();
}
});
return a.exec();
} }

View file

@ -24,7 +24,8 @@ SOURCES += \
system/auth_system.cpp \ system/auth_system.cpp \
system/object_system.cpp \ system/object_system.cpp \
usereditdialog.cpp \ usereditdialog.cpp \
vesseleditdialog.cpp vesseleditdialog.cpp \
viewmodels/usersviewmodel.cpp
HEADERS += \ HEADERS += \
adminpanel.h \ adminpanel.h \
@ -43,7 +44,8 @@ HEADERS += \
system/auth_system.h \ system/auth_system.h \
system/object_system.h \ system/object_system.h \
usereditdialog.h \ usereditdialog.h \
vesseleditdialog.h vesseleditdialog.h \
viewmodels/usersviewmodel.h
FORMS += \ FORMS += \
adminpanel.ui \ adminpanel.ui \

View file

@ -24,7 +24,14 @@ apparatus::apparatus() {
} }
apparatus::~apparatus() { apparatus::~apparatus() {
this->shutdown();
}
void apparatus::generate_lock_file() {
QFile init("lock");
init.open(QIODevice::ReadWrite);
init.write("lock");
init.close();
} }
apparatus* apparatus::instance() { apparatus* apparatus::instance() {
@ -36,38 +43,30 @@ apparatus* apparatus::instance() {
} }
bool apparatus::isFirstRun() { bool apparatus::isFirstRun() {
return QFile().exists("init"); return !QFile().exists("lock");
} }
void apparatus::generate_empty_data() { auth_system& apparatus::get_auth_subsystem() {
this->open_stream();
this->writeGIDS();
this->serialize_data();
this->close_stream();
}
const auth_system& apparatus::get_auth_subsystem() {
return this->_auth_system; return this->_auth_system;
} }
const object_system& apparatus::get_object_subsystem() { object_system& apparatus::get_object_subsystem() {
return this->_object_system; return this->_object_system;
} }
void apparatus::init() { void apparatus::init() {
apparatus::_instance = new apparatus(); apparatus::_instance = new apparatus();
apparatus::instance()->open_stream(); apparatus::_instance->open_stream();
apparatus::instance()->loadGIDS(); apparatus::_instance->loadGIDS();
apparatus::instance()->deserialize_data(); apparatus::_instance->deserialize_data();
apparatus::instance()->close_stream();
} }
void apparatus::shutdown() { void apparatus::shutdown() {
apparatus::instance()->open_stream(); apparatus::_instance->writeGIDS();
apparatus::instance()->writeGIDS(); apparatus::_instance->serialize_data();
apparatus::instance()->serialize_data(); apparatus::_instance->close_stream();
apparatus::instance()->close_stream(); delete apparatus::_instance;
} }
void apparatus::writeGIDS() { void apparatus::writeGIDS() {
@ -84,12 +83,11 @@ void apparatus::loadGIDS() {
} }
void apparatus::serialize_data() { void apparatus::serialize_data() {
this->_auth_system.init(this->stream); this->_auth_system.serialize_data(this->stream);
this->_object_system.init(this->stream); this->_object_system.serialize_data(this->stream);
} }
void apparatus::deserialize_data() { void apparatus::deserialize_data() {
QFile("init").open(QIODevice::ReadWrite); this->_auth_system.deserialize_data(this->stream);
this->_auth_system.shutdown(this->stream); this->_object_system.deserialize_data(this->stream);
this->_object_system.shutdown(this->stream);
} }

View file

@ -35,14 +35,15 @@ public:
~apparatus(); ~apparatus();
void generate_empty_data(); void generate_empty_data();
const auth_system& get_auth_subsystem(); auth_system& get_auth_subsystem();
const object_system& get_object_subsystem(); object_system& get_object_subsystem();
void serialize_data(); void serialize_data();
void deserialize_data(); void deserialize_data();
static bool isFirstRun(); static bool isFirstRun();
static void generate_lock_file();
static apparatus* instance(); static apparatus* instance();
static void init(); static void init();
static void shutdown(); static void shutdown();

View file

@ -39,7 +39,11 @@ bool auth_system::register_user(const QString &login, const QString &password, U
return false; return false;
} }
void auth_system::init(QDataStream &stream) { const QVector<user_entity> auth_system::users() const {
return this->_users;
}
void auth_system::deserialize_data(QDataStream &stream) {
int icnt; int icnt;
stream >> icnt; stream >> icnt;
this->_users.resize(icnt); this->_users.resize(icnt);
@ -48,7 +52,7 @@ void auth_system::init(QDataStream &stream) {
} }
} }
void auth_system::shutdown(QDataStream &stream) { void auth_system::serialize_data(QDataStream &stream) {
stream << this->_users.size(); stream << this->_users.size();
for (auto &item : this->_users) { for (auto &item : this->_users) {
item.serialize(stream); item.serialize(stream);

View file

@ -1,7 +1,7 @@
#ifndef AUTH_SYSTEM_H #ifndef AUTH_SYSTEM_H
#define AUTH_SYSTEM_H #define AUTH_SYSTEM_H
#include<QVector> #include <QVector>
#include "../entities/user_entity.h" #include "../entities/user_entity.h"
@ -17,8 +17,10 @@ public:
bool remove_user(const QString &login); bool remove_user(const QString &login);
bool register_user(const QString &login, const QString &password, UserRole role); bool register_user(const QString &login, const QString &password, UserRole role);
void init(QDataStream &stream); const QVector<user_entity> users() const;
void shutdown(QDataStream &stream);
void deserialize_data(QDataStream &stream);
void serialize_data(QDataStream &stream);
}; };
#endif // AUTH_SYSTEM_H #endif // AUTH_SYSTEM_H

View file

@ -77,7 +77,15 @@ bool object_system::add_vessel(vessel_entity dpoint) {
return false; return false;
} }
void object_system::init(QDataStream &stream) { const QVector<dpoint_entity> object_system::dpoints() const {
return this->_dpoints;
}
const QVector<vessel_entity> object_system::vessels() const {
return this->_vessels;
}
void object_system::deserialize_data(QDataStream &stream) {
int dicnt; int dicnt;
stream >> dicnt; stream >> dicnt;
this->_dpoints.resize(dicnt); this->_dpoints.resize(dicnt);
@ -93,7 +101,7 @@ void object_system::init(QDataStream &stream) {
} }
} }
void object_system::shutdown(QDataStream &stream) { void object_system::serialize_data(QDataStream &stream) {
stream << this->_dpoints.size(); stream << this->_dpoints.size();
for (auto &item : this->_dpoints) { for (auto &item : this->_dpoints) {
item.serialize(stream); item.serialize(stream);

View file

@ -25,8 +25,11 @@ public:
bool add_vessel(vessel_entity dpoint); bool add_vessel(vessel_entity dpoint);
void init(QDataStream &stream); const QVector<dpoint_entity> dpoints() const;
void shutdown(QDataStream &stream); const QVector<vessel_entity> vessels() const;
void deserialize_data(QDataStream &stream);
void serialize_data(QDataStream &stream);
}; };
#endif // OBJECT_SYSTEM_H #endif // OBJECT_SYSTEM_H

View file

@ -0,0 +1,65 @@
#include "usersviewmodel.h"
UsersViewModel::UsersViewModel(QObject *parent) : QAbstractTableModel(parent) {
}
int UsersViewModel::rowCount(const QModelIndex & /*parent*/) const {
return apparatus::instance()->get_object_subsystem().vessels().size();
}
int UsersViewModel::columnCount(const QModelIndex & /*parent*/) const {
return 3;
}
QVariant UsersViewModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
switch (section) {
case 0:
return QString("UID");
case 1:
return QString("Login");
case 2:
return QString("Role");
}
}
return QVariant();
}
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();
switch (col) {
case 0:
return QString::number(item.id());
case 1:
return item.login();
case 2:
QString role = "unknown";
switch(item.role()) {
case UserRole::ADMINISTRATOR:
role = "Administrator";
break;
case UserRole::DISPATCHER:
role = "Dispatcher";
break;
case UserRole::SKIPPER:
role = "Skipper";
break;
}
return role;
}
return "UNKNOWN FIELD";
}
return QVariant();
}
void UsersViewModel::update() {
this->resetInternalData();
}

View file

@ -0,0 +1,22 @@
#ifndef USERSVIEWMODEL_H
#define USERSVIEWMODEL_H
#include "system/apparatus.h"
#include <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;
public slots:
void update();
};
#endif // USERSVIEWMODEL_H