Files
RRJServer/ProgramServerMTD/mainwindow.cpp
2026-02-09 11:45:16 +03:00

236 lines
7.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <QTimer>
#include <QThread>
#include <QMenu>
#include "specialmessagebox.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
serverLMSWidget(nullptr),
trayIcon(nullptr),
trayMenu(nullptr),
action_ShowWindow(nullptr),
action_HideWindow(nullptr),
action_Exit(nullptr),
flInitServerLMSWidget(false)
{
ui->setupUi(this);
setWindowFlags(windowFlags() & ~Qt::WindowMinimizeButtonHint);
serverLMSWidget = new ServerLMSWidget(this);
connect(serverLMSWidget, &ServerLMSWidget::signal_StartInitFinished, this, &MainWindow::slot_InitializeFinished);
connect(serverLMSWidget, &ServerLMSWidget::signal_StartInitHasError, this, &MainWindow::slot_hasError);
connect(serverLMSWidget, &ServerLMSWidget::signal_LanguageChanged, this, &MainWindow::slot_LanguageChanged);
connect(serverLMSWidget, &ServerLMSWidget::signal_Tray_UpdateStateServer, this, &MainWindow::slot_updateStateServer);
connect(serverLMSWidget, &ServerLMSWidget::signal_Tray_ShowMessage, this, &MainWindow::slot_Tray_ShowMessage);
connect(serverLMSWidget, &ServerLMSWidget::signal_Menu_ShowWindow, this, &MainWindow::slot_TrayMenu_ShowWindow);
connect(serverLMSWidget, &ServerLMSWidget::signal_Menu_HideWindow, this, &MainWindow::slot_TrayMenu_HideWindow);
qtLanguageTranslator.load(QString("translations/RRJServer_") + serverLMSWidget->getLanguage(), ".");
qApp->installTranslator(&qtLanguageTranslator);
/* Инициализируем иконку трея, устанавливаем иконку*/
trayIcon = new QSystemTrayIcon(this);
trayIcon->setIcon(QPixmap(":/resources/PngServerRRJ_stop.png"));
/* Подключаем сигнал нажатия на иконку*/
connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::slot_TrayIconActivated);
/* Подключаем сигнал нажатия на всплывающее сообщение*/
connect(trayIcon, &QSystemTrayIcon::messageClicked, this, &MainWindow::slot_TrayMessageClicked);
/* Создаем контекстное меню для иконки трея*/
trayMenu = new QMenu(this);
action_ShowWindow = new QAction(this);
action_HideWindow = new QAction(this);
action_Exit = new QAction(this);
/* Подключаем сигналы нажатий на пункты меню к соответсвующим слотам.*/
connect(action_ShowWindow, &QAction::triggered, this, &MainWindow::slot_TrayMenu_ShowWindow);
connect(action_HideWindow, &QAction::triggered, this, &MainWindow::slot_TrayMenu_HideWindow);
connect(action_Exit, &QAction::triggered, this, &MainWindow::slot_TrayMenu_Exit);
trayMenu->addAction(action_ShowWindow);
trayMenu->addAction(action_HideWindow);
trayMenu->addAction(action_Exit);
updateTrayTitles();
/* Устанавливаем контекстное меню на иконку
* и показываем иконку приложения в трее
* */
trayIcon->setContextMenu(trayMenu);
trayIcon->show();
//slot_Tray_ShowMessage(tr("Starting the server..."));
ui->verticalLayout_Main->addWidget(serverLMSWidget);
//Отложенная инициализация (для serverLMSWidget)
QTimer::singleShot(1000, this, &MainWindow::slot_LazyInitialization);
}
MainWindow::~MainWindow()
{
delete serverLMSWidget;
delete trayIcon;
delete trayMenu;
delete action_ShowWindow;
delete action_HideWindow;
delete action_Exit;
delete ui;
}
void MainWindow::closeEvent(QCloseEvent * event)
{
/* Если окно видимо, то завершение приложения
* игнорируется, а окно просто скрывается
*/
if(this->isVisible())
{
event->ignore();
if(flInitServerLMSWidget)
{//Не даем свернуть окно, пока не прошла инициализация serverLMSWidget
slot_TrayMenu_HideWindow();
}
}
}
void MainWindow::changeEvent(QEvent *event)
{
// В случае получения события изменения языка приложения
if (event->type() == QEvent::LanguageChange)
{// переведём окно заново
ui->retranslateUi(this);
//и все, что связано с треем
updateTrayTitles();
}
}
void MainWindow::slot_TrayIconActivated(QSystemTrayIcon::ActivationReason reason)
{
if(flInitServerLMSWidget)
{
switch (reason){
case QSystemTrayIcon::Trigger:
/* если окно видимо, то оно скрывается,
* и наоборот, если скрыто, то разворачивается на экран
* */
if(!this->isVisible())
{
slot_TrayMenu_ShowWindow();
}
else
{
slot_TrayMenu_HideWindow();
}
break;
default:
break;
}
}
}
void MainWindow::slot_TrayMessageClicked()
{
if(flInitServerLMSWidget)
{
if(!this->isVisible())
{
slot_TrayMenu_ShowWindow();
}
}
}
void MainWindow::slot_TrayMenu_ShowWindow()
{
if(flInitServerLMSWidget)
{
this->show();
action_ShowWindow->setEnabled(false);
action_HideWindow->setEnabled(true);
}
}
void MainWindow::slot_TrayMenu_HideWindow()
{
if(flInitServerLMSWidget)
{
this->hide();
action_ShowWindow->setEnabled(true);
action_HideWindow->setEnabled(false);
}
}
void MainWindow::slot_TrayMenu_Exit()
{
this->hide();
this->close();
}
void MainWindow::slot_Tray_ShowMessage(QString textMsg, QSystemTrayIcon::MessageIcon iconMsg)
{
QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon(iconMsg);
trayIcon->showMessage(tr("Server MTD"), textMsg, icon, 100);
}
void MainWindow::slot_updateStateServer(EStateServer stateServer, EStateBlockAutorization stateBlockAutorization)
{
if(stateServer == EStateServer::started)
{
if(stateBlockAutorization == EStateBlockAutorization::unblocked)
{
trayIcon->setIcon(QPixmap(":/resources/PngServerRRJ_start.png"));
}
else
{
trayIcon->setIcon(QPixmap(":/resources/PngServerRRJ_lock.png"));
}
}
else
{
trayIcon->setIcon(QPixmap(":/resources/PngServerRRJ_stop.png"));
}
}
void MainWindow::slot_LazyInitialization()
{
serverLMSWidget->startInitialization();
}
void MainWindow::slot_hasError(int code)
{
if(code == 100)
{
slot_TrayMenu_ShowWindow();
//выключение с задержкой
QTimer::singleShot(1000, this, &MainWindow::slot_TrayMenu_Exit);
}
}
void MainWindow::slot_InitializeFinished()
{
flInitServerLMSWidget = true;
}
void MainWindow::slot_LanguageChanged(QString language)
{
qtLanguageTranslator.load(QString(QStringLiteral("translations/RRJServer_")) + language, QStringLiteral("."));
qApp->installTranslator(&qtLanguageTranslator);
}
void MainWindow::updateTrayTitles()
{
trayIcon->setToolTip(tr("Server MTD"));
action_ShowWindow->setText(tr("Expand window"));
action_HideWindow->setText(tr("Minimize window"));
action_Exit->setText(tr("Exit"));
}