From 2e3d634c77391ae7ab2e441667378c04840030bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=A1=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Thu, 11 May 2023 17:06:00 +0300 Subject: [PATCH] add gui --- client/internal/entities/include/Task.h | 22 +--- client/internal/entities/src/Task.cpp | 21 ---- client/internal/gui/CMakeLists.txt | 6 + client/internal/gui/include/AuthDialog.h | 18 +-- client/internal/gui/include/EntryWindow.h | 20 ++-- client/internal/gui/include/SignUpDialog.h | 30 ++--- client/internal/gui/include/SolutionsWindow.h | 43 +++++++ client/internal/gui/include/StatsDialog.h | 25 ---- client/internal/gui/include/TasksWindow.h | 45 ++++++++ client/internal/gui/include/UIManager.h | 17 +-- client/internal/gui/include/UserWindow.h | 46 -------- client/internal/gui/main.cpp | 13 +++ client/internal/gui/src/AuthDialog.cpp | 81 ++++++++++++- client/internal/gui/src/EntryWindow.cpp | 86 ++++++++++++-- client/internal/gui/src/SignUpDialog.cpp | 102 ++++++++++++++++- client/internal/gui/src/SolutionsWindow.cpp | 80 +++++++++++++ client/internal/gui/src/TasksWindow.cpp | 107 ++++++++++++++++++ client/internal/gui/src/UIManager.cpp | 16 ++- client/internal/gui/src/UserWindow.cpp | 9 -- client/internal/gui/tests/main.cpp | 6 +- 20 files changed, 601 insertions(+), 192 deletions(-) delete mode 100644 client/internal/entities/src/Task.cpp create mode 100644 client/internal/gui/include/SolutionsWindow.h delete mode 100644 client/internal/gui/include/StatsDialog.h create mode 100644 client/internal/gui/include/TasksWindow.h delete mode 100644 client/internal/gui/include/UserWindow.h create mode 100644 client/internal/gui/main.cpp create mode 100644 client/internal/gui/src/SolutionsWindow.cpp create mode 100644 client/internal/gui/src/TasksWindow.cpp delete mode 100644 client/internal/gui/src/UserWindow.cpp diff --git a/client/internal/entities/include/Task.h b/client/internal/entities/include/Task.h index d51c17f..9d87ca6 100644 --- a/client/internal/entities/include/Task.h +++ b/client/internal/entities/include/Task.h @@ -1,23 +1,11 @@ #ifndef SOURCEDOUT_TASK_HPP #define SOURCEDOUT_TASK_HPP -#include -#include -class Task{ -private: - size_t id; - std::string description; - -public: - Task()=default; - ~Task() = default; - Task(size_t id, std::string description); - - explicit Task(std::string description); - [[nodiscard]] size_t getId() const; - - [[nodiscard]] const std::string &getDescription() const; +#include - void setDescription(const std::string &description); +struct Task{ + std::size_t id; + std::string description; }; + #endif //SOURCEDOUT_TASK_HPP \ No newline at end of file diff --git a/client/internal/entities/src/Task.cpp b/client/internal/entities/src/Task.cpp deleted file mode 100644 index 7dd9bfe..0000000 --- a/client/internal/entities/src/Task.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "Task.h" -#include -#include - -unsigned long Task::getId() const { - return id; -} - -Task::Task(size_t id, std::string description) : id(id), description(std::move(description)) {} - -Task::Task(std::string description) : id(0), description(std::move(description)) {} - -const std::string &Task::getDescription() const { - return description; -} - -void Task::setDescription(const std::string &description_) { - Task::description = description_; -} \ No newline at end of file diff --git a/client/internal/gui/CMakeLists.txt b/client/internal/gui/CMakeLists.txt index 60da13c..1f206bf 100644 --- a/client/internal/gui/CMakeLists.txt +++ b/client/internal/gui/CMakeLists.txt @@ -1,6 +1,9 @@ project("GuiLib") set(CMAKE_CXX_STANDARD 20) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) file(GLOB INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include) @@ -20,5 +23,8 @@ set(GUI_lib_LIB ${GUI_lib_LIB} PARENT_SCOPE) set(GUI_lib_INCLUDE_DIRS ${INCLUDE_DIRS}) set(GUI_lib_INCLUDE_DIRS ${GUI_lib_INCLUDE_DIRS} PARENT_SCOPE) +add_executable(gui_run main.cpp) +target_link_libraries(gui_run ${GUI_lib_LIB}) + enable_testing() add_subdirectory(tests) \ No newline at end of file diff --git a/client/internal/gui/include/AuthDialog.h b/client/internal/gui/include/AuthDialog.h index 76b3f9b..b8917b8 100644 --- a/client/internal/gui/include/AuthDialog.h +++ b/client/internal/gui/include/AuthDialog.h @@ -6,38 +6,32 @@ #include #include #include +#include +#include class AuthDialog : public QDialog { Q_OBJECT public: explicit AuthDialog(QWidget *parent = nullptr); - ~AuthDialog() override; -signals: - void showMainWindow(); - void showUserWindow(); - -private slots: +public slots: void on_loginButton_clicked(); void on_backButton_clicked(); private: - QGroupBox *groupBox = nullptr; - QWidget *layoutWidget = nullptr; QVBoxLayout *verticalLayout = nullptr; - QHBoxLayout *horizontalLayout = nullptr; + QWidget *fields = nullptr; + QFormLayout* fieldsLayout = nullptr; QLabel *loginLabel = nullptr; QLineEdit *login = nullptr; - QHBoxLayout *horizontalLayout_2 = nullptr; QLabel *passwordLabel = nullptr; QLineEdit *password = nullptr; QPushButton *loginButton = nullptr; QPushButton *backButton = nullptr; void setupUi(QDialog *AuthDialog); - - void setTexts(QDialog *AuthDialog); + void retranslateUi(QDialog *AuthDialog); }; #endif // AUTH_DIALOG_H diff --git a/client/internal/gui/include/EntryWindow.h b/client/internal/gui/include/EntryWindow.h index b7acbd0..4bc4f11 100644 --- a/client/internal/gui/include/EntryWindow.h +++ b/client/internal/gui/include/EntryWindow.h @@ -14,19 +14,17 @@ Q_OBJECT public: EntryWindow(QWidget *parent = nullptr); - ~EntryWindow() override; - std::shared_ptr getSignUpDialog(); - std::shared_ptr getAuthDialog(); +signals: + void showTasksWindow(); -private slots: - static void onExitButtonClicked(); - void onLoginButtonClicked(); - void onSignUpButtonClicked(); +public slots: + void on_exitButton_clicked(); + void on_loginButton_clicked(); + void on_signUpButton_clicked(); private: - std::shared_ptr authDialog = nullptr; - std::shared_ptr signUpDialog = nullptr; + QWidget *centralwidget = nullptr; QVBoxLayout *verticalLayout = nullptr; QLabel *introLabel = nullptr; @@ -38,8 +36,8 @@ private: QMenuBar *menubar = nullptr; QStatusBar *statusbar = nullptr; - void setupUi(QMainWindow *MainWindow); - void retranslateUi(QMainWindow *MainWindow); + void setupUi(QMainWindow *EntryWindow); + void retranslateUi(QMainWindow *EntryWindow); }; #endif // MAINWINDOW_H diff --git a/client/internal/gui/include/SignUpDialog.h b/client/internal/gui/include/SignUpDialog.h index 2882b24..f9da4f5 100644 --- a/client/internal/gui/include/SignUpDialog.h +++ b/client/internal/gui/include/SignUpDialog.h @@ -6,36 +6,30 @@ #include #include #include +#include class SignUpDialog : public QDialog { Q_OBJECT public: explicit SignUpDialog(QWidget *parent = nullptr); - ~SignUpDialog() override; - -signals: - void showEntryWindow(); - void showUserWindow(); private slots: - void on_signUpButton_clicked() {}; - void on_backButton_clicked() {}; + void on_signUpButton_clicked(); + void on_backButton_clicked(); private: - QGroupBox *groupBox = nullptr; - QWidget *layoutWidget = nullptr; - QVBoxLayout *verticalLayout_2 = nullptr; QVBoxLayout *verticalLayout = nullptr; - QGridLayout *gridLayout = nullptr; - QLabel *enterLoginLabel = nullptr; + QWidget *fields = nullptr; + QFormLayout* fieldsLayout = nullptr; + QLabel *loginLabel = nullptr; QLineEdit *login = nullptr; - QGridLayout *gridLayout_2 = nullptr; - QLineEdit *pass = nullptr; - QLabel *enterPasswordLabel = nullptr; - QHBoxLayout *horizontalLayout_3 = nullptr; - QLabel *repeatPasswordLabel = nullptr; - QLineEdit *passRepeat = nullptr; + QLabel* usernameLabel = nullptr; + QLineEdit *username = nullptr; + QLabel *passwordLabel = nullptr; + QLineEdit *password = nullptr; + QLabel *passwordRepeatLabel = nullptr; + QLineEdit *passwordRepeat = nullptr; QPushButton *signUpButton = nullptr; QPushButton *backButton = nullptr; diff --git a/client/internal/gui/include/SolutionsWindow.h b/client/internal/gui/include/SolutionsWindow.h new file mode 100644 index 0000000..103c2fb --- /dev/null +++ b/client/internal/gui/include/SolutionsWindow.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Task.h" +#include "TasksWindow.h" + +class SolutionsWindow : public QMainWindow { +Q_OBJECT + +public: + explicit SolutionsWindow(Task task, QWidget *parent = nullptr); + +private slots: + void on_backButton_clicked(); + void on_chooseFileButton_clicked(); + void on_sendButton_clicked(); + +private: + + Task task; + std::string source; + + QWidget *centralwidget = nullptr; + QGroupBox* taskBox = nullptr; + QVBoxLayout* taskLayout = nullptr; + QVBoxLayout* verticalLayout = nullptr; + QLabel* taskDescription = nullptr; + QPushButton* chooseFileButton = nullptr; + QLabel* filename = nullptr; + QPushButton* sendButton = nullptr; + QLabel* result = nullptr; + QPushButton* backButton = nullptr; + + void setupUi(QMainWindow *UserWindow); +}; diff --git a/client/internal/gui/include/StatsDialog.h b/client/internal/gui/include/StatsDialog.h deleted file mode 100644 index 8a10038..0000000 --- a/client/internal/gui/include/StatsDialog.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// Created by Николай Степанов on 04.05.2023. -// - -#ifndef SOURCEDOUT_STATSDIALOG_H -#define SOURCEDOUT_STATSDIALOG_H - -#include -#include -#include "Metric.h" - -class StatsDialog : public QDialog { - Q_OBJECT - -public: - explicit StatsDialog(QWidget *parent = nullptr) {}; - ~StatsDialog() override {}; - -private: - QTableView* tableView = nullptr; - QTableWidget* tableWidget = nullptr; - QVector metrics; -}; - -#endif //SOURCEDOUT_STATSDIALOG_H diff --git a/client/internal/gui/include/TasksWindow.h b/client/internal/gui/include/TasksWindow.h new file mode 100644 index 0000000..c8f96bd --- /dev/null +++ b/client/internal/gui/include/TasksWindow.h @@ -0,0 +1,45 @@ +#ifndef USERWINDOW_H +#define USERWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Task.h" + +class TasksWindow : public QMainWindow { +Q_OBJECT + +public: + explicit TasksWindow(QWidget *parent = nullptr); + +public slots: + void on_backButton_clicked(); + void on_goToTaskButton_clicked(); + void indexChanged(); + +private: + + QWidget *centralwidget = nullptr; + QVBoxLayout* verticalLayout = nullptr; + QGroupBox *taskChooseGroupBox = nullptr; + QVBoxLayout* taskVerticalLayout = nullptr; + QLabel* label = nullptr; + QComboBox* tasks = nullptr; + QLabel* taskDescription = nullptr; + QPushButton* goToTaskButton = nullptr; + QPushButton* backButton = nullptr; + QWidget* buttonsWidget = nullptr; + QHBoxLayout* buttonsLayout = nullptr; + + std::vector tasks_vector; + + void setupUi(QMainWindow *UserWindow); +}; + +#endif // USERWINDOW_H diff --git a/client/internal/gui/include/UIManager.h b/client/internal/gui/include/UIManager.h index 3d030f2..bc6e071 100644 --- a/client/internal/gui/include/UIManager.h +++ b/client/internal/gui/include/UIManager.h @@ -1,21 +1,22 @@ #ifndef INCLUDE_UIMANAGER_H_ #define INCLUDE_UIMANAGER_H_ +#include #include "EntryWindow.h" -#include "UserWindow.h" +#include "TasksWindow.h" -class UIManager { +class UIManager : public QWidget { +Q_OBJECT public: - UIManager(); - - ~UIManager() = default; + UIManager(QWidget *parent = nullptr); +public slots: void showEntryWindow(); - void showUserWindow(); + void showTasksWindow(); private: - EntryWindow entryWindow; - UserWindow userWindow; + EntryWindow* entryWindow = nullptr; + TasksWindow* userWindow = nullptr; }; #endif // INCLUDE_UIMANAGER_H_ diff --git a/client/internal/gui/include/UserWindow.h b/client/internal/gui/include/UserWindow.h deleted file mode 100644 index 859d69e..0000000 --- a/client/internal/gui/include/UserWindow.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef USERWINDOW_H -#define USERWINDOW_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "StatsDialog.h" - -class UserWindow : public QMainWindow { -Q_OBJECT - -public: - explicit UserWindow(QWidget *parent = nullptr); - ~UserWindow() override = default; - -signals: - void logout(); - -private slots: - void onBackButtonClicked(); - void onListElementClicked(); - void onSendButtonClicked(); - -private: - - QTabWidget* tabs = nullptr; - StatsDialog* statsDialog = nullptr; - QPushButton *backButton = nullptr; - QPushButton *sendButton = nullptr; - QComboBox* comboBox = nullptr; - QVBoxLayout* verticalLayout = nullptr; - QLabel* label = nullptr; - QLabel* description = nullptr; - QFileDialog* fileDialog = nullptr; - QStringList* list = nullptr; - - QWidget *centralwidget = nullptr; -}; - -#endif // USERWINDOW_H diff --git a/client/internal/gui/main.cpp b/client/internal/gui/main.cpp new file mode 100644 index 0000000..b348568 --- /dev/null +++ b/client/internal/gui/main.cpp @@ -0,0 +1,13 @@ +#include "EntryWindow.h" +#include "TasksWindow.h" + +#include + +#include "UIManager.h" + +int main(int argc, char *argv[]) { + QApplication a(argc, argv); + UIManager uiManager; + uiManager.showEntryWindow(); + return a.exec(); +} diff --git a/client/internal/gui/src/AuthDialog.cpp b/client/internal/gui/src/AuthDialog.cpp index 0e57d4d..5227149 100644 --- a/client/internal/gui/src/AuthDialog.cpp +++ b/client/internal/gui/src/AuthDialog.cpp @@ -1,15 +1,86 @@ #include "AuthDialog.h" +#include +#include + AuthDialog::AuthDialog(QWidget *parent) : QDialog(parent) { setupUi(this); } -AuthDialog::~AuthDialog() {} +void AuthDialog::setupUi(QDialog *AuthDialog) { + QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(AuthDialog->sizePolicy().hasHeightForWidth()); + AuthDialog->setSizePolicy(sizePolicy); + + verticalLayout = new QVBoxLayout(AuthDialog); + + fields = new QWidget(AuthDialog); + fields->setEnabled(true); + + fieldsLayout = new QFormLayout(fields); + + loginLabel = new QLabel(this); + login = new QLineEdit(this); + + fieldsLayout->addRow(loginLabel, login); + + passwordLabel = new QLabel(this); + password = new QLineEdit(this); + password->setEchoMode(QLineEdit::Password); + + fieldsLayout->addRow(passwordLabel, password); + + verticalLayout->addWidget(fields); -void AuthDialog::on_loginButton_clicked() {} + loginButton = new QPushButton(AuthDialog); + loginButton->setDefault(true); -void AuthDialog::setupUi(QDialog *AuthDialog) {} + verticalLayout->addWidget(loginButton); -void AuthDialog::setTexts(QDialog *AuthDialog) {} + backButton = new QPushButton(AuthDialog); -void AuthDialog::on_backButton_clicked() {} + verticalLayout->addWidget(backButton); + + retranslateUi(AuthDialog); + + connect(loginButton, &QPushButton::clicked, this, &AuthDialog::on_loginButton_clicked); + connect(backButton, &QPushButton::clicked, this, &AuthDialog::on_backButton_clicked); +} + +void AuthDialog::retranslateUi(QDialog *AuthDialog) { + AuthDialog->setWindowTitle("Вход"); + loginLabel->setText("Логин"); + passwordLabel->setText("Пароль"); + loginButton->setText("Войти"); + backButton->setText("Назад"); +} + +void AuthDialog::on_loginButton_clicked() { + std::string log = login->text().toUtf8().constData(); + std::string pass = password->text().toUtf8().constData(); + if (log.empty() || pass.empty()) { + QMessageBox::warning(this, "Ошибка авторизации", "Логин и пароль не могут быть пустыми"); + return; + } +// unsigned result = Core::login(log, pass); + unsigned result = 200; + switch (result) { + case 200: + QMessageBox::warning(this, "Успешная авторизации", "Работает"); + accept(); + close(); + break; + case 403: + QMessageBox::warning(this, "Ошибка авторизации","Неправильный логин или пароль"); + break; + default: + QMessageBox::critical(this, "Авторизация невозможна", "Нет соединения с сервером"); + } +} + +void AuthDialog::on_backButton_clicked() { + reject(); + close(); +} diff --git a/client/internal/gui/src/EntryWindow.cpp b/client/internal/gui/src/EntryWindow.cpp index 8bf9bc3..1c5d246 100644 --- a/client/internal/gui/src/EntryWindow.cpp +++ b/client/internal/gui/src/EntryWindow.cpp @@ -6,22 +6,90 @@ #include #include "AuthDialog.h" #include "SignUpDialog.h" +#include "UIManager.h" -EntryWindow::EntryWindow(QWidget *parent) : QMainWindow(parent) {} +EntryWindow::EntryWindow(QWidget *parent) : QMainWindow(parent) { + setupUi(this); +} -EntryWindow::~EntryWindow() {} +void EntryWindow::setupUi(QMainWindow *EntryWindow) { + EntryWindow->resize(600, 600); + QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(EntryWindow->sizePolicy().hasHeightForWidth()); + EntryWindow->setSizePolicy(sizePolicy); -void EntryWindow::setupUi(QMainWindow *MainWindow) {} -void EntryWindow::retranslateUi(QMainWindow *MainWindow) {} + centralwidget = new QWidget(EntryWindow); + verticalLayout = new QVBoxLayout(centralwidget); -void EntryWindow::onExitButtonClicked() {} + introLabel = new QLabel(centralwidget); + introLabel->setText("Добро пожаловать в Noiseground!"); + introLabel->setGeometry(QRect(140, 200, 331, 31)); -void EntryWindow::onLoginButtonClicked() {} + verticalLayout->addWidget(introLabel, 0, Qt::AlignHCenter); + loginButton = new QPushButton(centralwidget); + QSizePolicy sizePolicy1(QSizePolicy::Minimum, QSizePolicy::Preferred); + sizePolicy1.setHorizontalStretch(0); + sizePolicy1.setVerticalStretch(0); + sizePolicy1.setHeightForWidth(loginButton->sizePolicy().hasHeightForWidth()); + loginButton->setSizePolicy(sizePolicy1); + verticalLayout->addWidget(loginButton); -void EntryWindow::onSignUpButtonClicked() {} + horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); -std::shared_ptr EntryWindow::getSignUpDialog() {} + verticalLayout->addItem(horizontalSpacer); -std::shared_ptr EntryWindow::getAuthDialog() {} + signUpButton = new QPushButton(centralwidget); + sizePolicy1.setHeightForWidth(signUpButton->sizePolicy().hasHeightForWidth()); + signUpButton->setSizePolicy(sizePolicy1); + + verticalLayout->addWidget(signUpButton); + + horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + verticalLayout->addItem(horizontalSpacer_2); + + exitButton = new QPushButton(centralwidget); + sizePolicy1.setHeightForWidth(exitButton->sizePolicy().hasHeightForWidth()); + exitButton->setSizePolicy(sizePolicy1); + + verticalLayout->addWidget(exitButton); + + EntryWindow->setCentralWidget(centralwidget); + + connect(signUpButton, &QPushButton::clicked, this, &EntryWindow::on_signUpButton_clicked); + connect(loginButton, &QPushButton::clicked, this, &EntryWindow::on_loginButton_clicked); + connect(exitButton, &QPushButton::clicked, this, &EntryWindow::on_exitButton_clicked); + + retranslateUi(EntryWindow); +} + +void EntryWindow::retranslateUi(QMainWindow *EntryWindow) { + EntryWindow->setWindowTitle(QCoreApplication::translate("EntryWindow", "Главное окно", nullptr)); + loginButton->setText(QCoreApplication::translate("EntryWindow", "Войти", nullptr)); + signUpButton->setText(QCoreApplication::translate("EntryWindow", "Зарегистрироваться", nullptr)); + exitButton->setText(QCoreApplication::translate("EntryWindow", "Выйти", nullptr)); +} + +void EntryWindow::on_exitButton_clicked() { + QApplication::quit(); +} + +void EntryWindow::on_loginButton_clicked() { + AuthDialog authDialog(this); + if (authDialog.exec() == QDialog::Accepted) { + hide(); + qobject_cast(parent())->showTasksWindow(); + } +} + +void EntryWindow::on_signUpButton_clicked() { + SignUpDialog signupDialog( this ); + if (signupDialog.exec() == QDialog::Accepted) { + hide(); + qobject_cast(parent())->showTasksWindow(); + } +} diff --git a/client/internal/gui/src/SignUpDialog.cpp b/client/internal/gui/src/SignUpDialog.cpp index 8750c80..015f65f 100644 --- a/client/internal/gui/src/SignUpDialog.cpp +++ b/client/internal/gui/src/SignUpDialog.cpp @@ -6,12 +6,106 @@ //#include "Core.h" -SignUpDialog::SignUpDialog(QWidget *parent) : QDialog(parent) {} +SignUpDialog::SignUpDialog(QWidget *parent) : QDialog(parent) { + setupUi(this); +} -SignUpDialog::~SignUpDialog() {} +void SignUpDialog::setupUi(QDialog *SignUpDialog) { + QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(SignUpDialog->sizePolicy().hasHeightForWidth()); + SignUpDialog->setSizePolicy(sizePolicy); -void SignUpDialog::retranslateUi(QDialog *SignUpDialog) {} + verticalLayout = new QVBoxLayout(SignUpDialog); -void SignUpDialog::setupUi(QDialog *SignUpDialog) {} + fields = new QWidget(SignUpDialog); + fields->setEnabled(true); + + fieldsLayout = new QFormLayout(fields); + + loginLabel = new QLabel(this); + login = new QLineEdit(this); + + fieldsLayout->addRow(loginLabel, login); + + usernameLabel = new QLabel(this); + username = new QLineEdit(this); + + fieldsLayout->addRow(usernameLabel, username); + + passwordLabel = new QLabel(this); + password = new QLineEdit(this); + password->setEchoMode(QLineEdit::Password); + + fieldsLayout->addRow(passwordLabel, password); + + passwordRepeatLabel = new QLabel(this); + passwordRepeat = new QLineEdit(this); + passwordRepeat->setEchoMode(QLineEdit::Password); + + fieldsLayout->addRow(passwordRepeatLabel, passwordRepeat); + + verticalLayout->addWidget(fields); + + signUpButton = new QPushButton(SignUpDialog); + signUpButton->setDefault(true); + + verticalLayout->addWidget(signUpButton); + + backButton = new QPushButton(SignUpDialog); + + verticalLayout->addWidget(backButton); + + retranslateUi(SignUpDialog); + + connect(signUpButton, &QPushButton::clicked, this, &SignUpDialog::on_signUpButton_clicked); + connect(backButton, &QPushButton::clicked, this, &SignUpDialog::on_backButton_clicked); +} + +void SignUpDialog::retranslateUi(QDialog *SignUpDialog) { + SignUpDialog->setWindowTitle("Регистрация"); + loginLabel->setText("Введите логин"); + usernameLabel->setText("Введите имя"); + passwordLabel->setText("Введите пароль"); + passwordRepeatLabel->setText("Повторите пароль"); + signUpButton->setText("Зарегистрироваться"); + backButton->setText("Назад"); +} + +void SignUpDialog::on_signUpButton_clicked() { + std::string login = this->login->text().toUtf8().constData(); + std::string username = this->username->text().toUtf8().constData(); + std::string password = this->password->text().toUtf8().constData(); + std::string passwordRepeat = this->passwordRepeat->text().toUtf8().constData(); + if (password == passwordRepeat && !login.empty() && !username.empty()) { +// unsigned response = Core::signUp(log.toStdString(), pass.toStdString()); + unsigned response = 200; + switch (response) { + case 200: + QMessageBox::information(this, "Успех!", "Вы успешно зарегистрированы!"); + accept(); + close(); + break; + case 403: + QMessageBox::warning(this, "Регистрация невозможна", "Логин уже занят!"); + break; + default: + QMessageBox::critical(this, "Регистрация невозможна!", "Нет соединения с сервером!"); + } + + } else if (login.empty()) { + QMessageBox::warning(this, "Ошибка!", "Логин не может быть пустым!"); + } else if (username.empty()) { + QMessageBox::warning(this, "Ошибка!", "Имя не может быть пустым!"); + } else { + QMessageBox::warning(this, "Ошибка!", "Пароли не совпадают!"); + } +} + +void SignUpDialog::on_backButton_clicked() { + reject(); + close(); +} // setupUi diff --git a/client/internal/gui/src/SolutionsWindow.cpp b/client/internal/gui/src/SolutionsWindow.cpp new file mode 100644 index 0000000..33743ee --- /dev/null +++ b/client/internal/gui/src/SolutionsWindow.cpp @@ -0,0 +1,80 @@ +#include "SolutionsWindow.h" + +#include +#include +#include +#include + +SolutionsWindow::SolutionsWindow(Task task, QWidget *parent) : QMainWindow(parent), task(std::move(task)) { + setupUi(this); + connect(backButton, &QPushButton::clicked, this, &SolutionsWindow::on_backButton_clicked); + connect(chooseFileButton, &QPushButton::clicked, this, &SolutionsWindow::on_chooseFileButton_clicked); + connect(sendButton, &QPushButton::clicked, this, &SolutionsWindow::on_sendButton_clicked); +} + +void SolutionsWindow::setupUi(QMainWindow *SolutionsWindow) { + QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(SolutionsWindow->sizePolicy().hasHeightForWidth()); + SolutionsWindow->setSizePolicy(sizePolicy); + + centralwidget = new QWidget(SolutionsWindow); + verticalLayout = new QVBoxLayout(centralwidget); + + taskBox = new QGroupBox(centralwidget); + taskLayout = new QVBoxLayout(taskBox); + + taskDescription = new QLabel(taskBox); + std::string description = task.description; + taskDescription->setText(QString(description.c_str())); + + taskLayout->addWidget(taskDescription); + + filename = new QLabel(this); + + chooseFileButton = new QPushButton(this); + chooseFileButton->setText(QString::fromUtf8("Выбирите файл")); + + sendButton = new QPushButton(this); + sendButton->setText(QString::fromUtf8("Отправить")); + + result = new QLabel(this); + result->setText(QString::fromUtf8("Отправьте для принятия решения")); + + backButton = new QPushButton(this); + backButton->setText(QString::fromUtf8("Назад")); + + verticalLayout->addWidget(taskBox); + verticalLayout->addWidget(filename); + verticalLayout->addWidget(chooseFileButton); + verticalLayout->addWidget(sendButton); + verticalLayout->addWidget(result); + verticalLayout->addWidget(backButton); + + SolutionsWindow->setCentralWidget(centralwidget); +} + +void SolutionsWindow::on_backButton_clicked() { + close(); + qobject_cast(parent())->show(); +} + +void SolutionsWindow::on_chooseFileButton_clicked() { + QString fileName = QFileDialog::getOpenFileName(this, tr("Choose a file to send"), QDir::homePath()); + filename->setText(QFileInfo(fileName).fileName()); + std::ifstream file(fileName.toUtf8().constData()); + std::ostringstream sstr; + sstr << file.rdbuf(); + source = sstr.str(); +} + +void SolutionsWindow::on_sendButton_clicked() { + if (source.empty()) { + QMessageBox::warning(this, "Ошибка отправки", "Нельзя отправить пустое решение"); + return; + } + std::cout << source; +} + + diff --git a/client/internal/gui/src/TasksWindow.cpp b/client/internal/gui/src/TasksWindow.cpp new file mode 100644 index 0000000..f5c4884 --- /dev/null +++ b/client/internal/gui/src/TasksWindow.cpp @@ -0,0 +1,107 @@ +#include "TasksWindow.h" + +#include +#include +#include + +#include "SolutionsWindow.h" +#include "UIManager.h" + +TasksWindow::TasksWindow(QWidget *parent) : QMainWindow(parent) { + tasks_vector.push_back({1, "1 description 1\n" + "1\n" + "2\n" + "3\n" + "4\n" + "5\n" + "6\n" + "7\n" + "8\n" + "9\n" + "10\n" + "11\n" + "12\n" + "13\n" + "14\n"}); + tasks_vector.push_back({2, "2 description"}); + tasks_vector.push_back({3, "3 description"}); + + setupUi(this); + connect(tasks, &QComboBox::currentIndexChanged, this, &TasksWindow::indexChanged); + connect(goToTaskButton, &QPushButton::clicked, this, &TasksWindow::on_goToTaskButton_clicked); + connect(backButton, &QPushButton::clicked, this, &TasksWindow::on_backButton_clicked); +} + + + +void TasksWindow::setupUi(QMainWindow *UserWindow) { + QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(UserWindow->sizePolicy().hasHeightForWidth()); + UserWindow->setSizePolicy(sizePolicy); + + centralwidget = new QWidget(UserWindow); + verticalLayout = new QVBoxLayout(centralwidget); + + taskChooseGroupBox = new QGroupBox(centralwidget); + sizePolicy.setHeightForWidth(taskChooseGroupBox->sizePolicy().hasHeightForWidth()); + taskChooseGroupBox->setFixedHeight(85); + taskChooseGroupBox->setSizePolicy(sizePolicy); + + taskVerticalLayout = new QVBoxLayout(taskChooseGroupBox); + + label = new QLabel(this); + label->setText(QString::fromUtf8("Выберите номер задания:")); + + tasks = new QComboBox(this); + for (int i = 0; i < tasks_vector.size(); i++) { + tasks->insertItem(i, QString::number(tasks_vector[i].id)); + } + tasks->setCurrentIndex(0); + + taskVerticalLayout->addWidget(label); + taskVerticalLayout->addWidget(tasks); + + taskDescription = new QLabel(this); + std::string description = tasks_vector[0].description; + taskDescription->setText(QString(description.c_str())); + + buttonsWidget = new QWidget(centralwidget); + sizePolicy.setHeightForWidth(buttonsWidget->sizePolicy().hasHeightForWidth()); + buttonsWidget->setFixedHeight(45); + + buttonsLayout = new QHBoxLayout(buttonsWidget); + + goToTaskButton = new QPushButton(this); + goToTaskButton->setText(QString::fromUtf8("Перейти к сдаче")); + + backButton = new QPushButton(this); + backButton->setText(QString::fromUtf8("Выйти")); + + buttonsLayout->addWidget(goToTaskButton); + buttonsLayout->addWidget(backButton); + + verticalLayout->addWidget(taskChooseGroupBox); + verticalLayout->addWidget(taskDescription); + verticalLayout->addWidget(buttonsWidget); + + UserWindow->setCentralWidget(centralwidget); +} + +void TasksWindow::indexChanged() { + std::string description = tasks_vector[tasks->currentIndex()].description; + taskDescription->setText(QString(description.c_str())); +} + +void TasksWindow::on_backButton_clicked() { + // Core::logout(); + close(); + qobject_cast(parent())->showEntryWindow(); +} + +void TasksWindow::on_goToTaskButton_clicked() { + hide(); + auto* solutionsWindow = new SolutionsWindow(tasks_vector[tasks->currentIndex()], this); + solutionsWindow->show(); +} diff --git a/client/internal/gui/src/UIManager.cpp b/client/internal/gui/src/UIManager.cpp index fc23301..101e034 100644 --- a/client/internal/gui/src/UIManager.cpp +++ b/client/internal/gui/src/UIManager.cpp @@ -1,11 +1,19 @@ #include "UIManager.h" #include "EntryWindow.h" -#include "UserWindow.h" +#include "TasksWindow.h" #include "SignUpDialog.h" +#include "AuthDialog.h" -void UIManager::showEntryWindow() {} +void UIManager::showEntryWindow() { + entryWindow->show(); +} -void UIManager::showUserWindow() {} +void UIManager::showTasksWindow() { + userWindow->show(); +} -UIManager::UIManager() = default; +UIManager::UIManager(QWidget *parent) : QWidget(parent) { + userWindow = new TasksWindow(this); + entryWindow = new EntryWindow(this); +} diff --git a/client/internal/gui/src/UserWindow.cpp b/client/internal/gui/src/UserWindow.cpp deleted file mode 100644 index 8e6169b..0000000 --- a/client/internal/gui/src/UserWindow.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "UserWindow.h" - -#include -#include -#include - -UserWindow::UserWindow(QWidget *parent) : QMainWindow(parent) {} - -void UserWindow::onBackButtonClicked() {} diff --git a/client/internal/gui/tests/main.cpp b/client/internal/gui/tests/main.cpp index d9f4b73..2348fac 100644 --- a/client/internal/gui/tests/main.cpp +++ b/client/internal/gui/tests/main.cpp @@ -3,7 +3,7 @@ #include "UIManager.h" #include "EntryWindow.h" -#include "UserWindow.h" +#include "TasksWindow.h" #include @@ -18,7 +18,7 @@ TEST(ConstructorTest, EntryWindow) { TEST(ConstructorTest, UserWindow) { int fake = 0; QApplication a(fake, nullptr); - UserWindow uw; + TasksWindow uw; EXPECT_NO_FATAL_FAILURE(uw.show()); a.exec(); } @@ -35,7 +35,7 @@ TEST(ConstructorTest, UIManagerUW) { int fake_argc = 0; QApplication a(fake_argc, nullptr); UIManager um; - EXPECT_NO_FATAL_FAILURE(um.showUserWindow()); + EXPECT_NO_FATAL_FAILURE(um.showTasksWindow()); a.exec(); } -- GitLab