From ce65daea2e182ace2f92c3080d0d7d89e2a87da8 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 27 Oct 2025 16:20:34 +0300 Subject: [PATCH] =?UTF-8?q?TrayServerLMS=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/interfacedatabaselms.cpp | 2 +- InstructorsAndTrainees/dialogsettings.cpp | 1 + .../dialogauthorizationinstructor.ui | 6 +- ServerLMS/dialogsettingstray.cpp | 4 + ServerLMS/dialogsettingstray.h | 2 +- ServerLMS/multithreadserver.cpp | 9 +- ServerLMS/providerdblms.cpp | 20 +- ServerLMS/providerdblms.h | 3 +- ServerLMS/serverlmswidget.cpp | 244 ++++++++++-------- ServerLMS/serverlmswidget.h | 45 ++-- ServerLMS/translations/ServerLMS_ru_RU.qm | Bin 701 -> 2063 bytes ServerLMS/translations/ServerLMS_ru_RU.ts | 104 +++++++- TrayServerLMS/mainwindow.cpp | 1 + TrayServerLMS/resources/IcoServerRRJ.ico | Bin 67646 -> 9103 bytes TrayServerLMS/resources/IcoServerRRJ_2.ico | Bin 0 -> 2891 bytes TrayServerLMS/resources/IcoServerRRJ_old.ico | Bin 0 -> 67646 bytes 16 files changed, 295 insertions(+), 146 deletions(-) create mode 100644 TrayServerLMS/resources/IcoServerRRJ_2.ico create mode 100644 TrayServerLMS/resources/IcoServerRRJ_old.ico diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index ddd4a0b..8ad5e21 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -16,7 +16,7 @@ bool InterfaceDataBaseLMS::connectionToDB() { if(!createConnection()) { - QMessageBox::critical(ownerWidget, dbSettings.dbName, tr("Connection error") /*+ db->lastError().text()*/); + //QMessageBox::critical(ownerWidget, dbSettings.dbName, tr("Connection error") /*+ db->lastError().text()*/); return false; } else diff --git a/InstructorsAndTrainees/dialogsettings.cpp b/InstructorsAndTrainees/dialogsettings.cpp index 20aa0e5..9b9ec4a 100644 --- a/InstructorsAndTrainees/dialogsettings.cpp +++ b/InstructorsAndTrainees/dialogsettings.cpp @@ -70,6 +70,7 @@ DialogSettings::DialogSettings(ConnectorToServer* connectorToServer, bool instru ui->checkAutoStart->setVisible(false); ui->btnSave->setEnabled(false); + flSettingsServerChanged = false; } DialogSettings::~DialogSettings() diff --git a/InstructorsAndTrainees/instructors/dialogauthorizationinstructor.ui b/InstructorsAndTrainees/instructors/dialogauthorizationinstructor.ui index 6f9f43f..76264a9 100644 --- a/InstructorsAndTrainees/instructors/dialogauthorizationinstructor.ui +++ b/InstructorsAndTrainees/instructors/dialogauthorizationinstructor.ui @@ -20,7 +20,7 @@ Instructor authorization - + :/resources/icons/lms.png:/resources/icons/lms.png @@ -90,7 +90,7 @@ ... - + :/resources/icons/eye.png:/resources/icons/eye.png @@ -136,7 +136,7 @@ - + diff --git a/ServerLMS/dialogsettingstray.cpp b/ServerLMS/dialogsettingstray.cpp index fe40b77..cc70e91 100644 --- a/ServerLMS/dialogsettingstray.cpp +++ b/ServerLMS/dialogsettingstray.cpp @@ -34,6 +34,9 @@ DialogSettingsTray::DialogSettingsTray(QWidget *parent) : //Задаём два пункта с текстом локалей в комбобоксе ui->cmbLanguage->addItems(QStringList() << "English" << "Русский"); + //Скрываем пароль + ui->editPassword->setEchoMode(QLineEdit::EchoMode::Password); + if(loadSettings(settings)) { if(settings->Language == "ENG") @@ -49,6 +52,7 @@ DialogSettingsTray::DialogSettingsTray(QWidget *parent) : } ui->btnSave->setEnabled(false); + flSettingsServerChanged = false; } DialogSettingsTray::~DialogSettingsTray() diff --git a/ServerLMS/dialogsettingstray.h b/ServerLMS/dialogsettingstray.h index b5c4371..956c17b 100644 --- a/ServerLMS/dialogsettingstray.h +++ b/ServerLMS/dialogsettingstray.h @@ -30,7 +30,7 @@ public: ServerDBSettings getSettings(); - bool settingsServerIsChanged(){ return flSettingsServerChanged;} + bool settingsDBisChanged(){ return flSettingsServerChanged;} static bool loadSettings(ServerDBSettings *settings); diff --git a/ServerLMS/multithreadserver.cpp b/ServerLMS/multithreadserver.cpp index f813515..e37b639 100644 --- a/ServerLMS/multithreadserver.cpp +++ b/ServerLMS/multithreadserver.cpp @@ -60,6 +60,7 @@ bool MultiThreadServer::stopServer() //Закрываем сервер close(); stateServer = stoped; + Logger::instance().log("SERVER: stop OK"); return true; } else @@ -73,7 +74,7 @@ QMap *MultiThreadServer::getClientsMap() const void MultiThreadServer::updateClientList() { - serverLmsWidget->slotUpdateListClients(); + serverLmsWidget->slot_UpdateListClients(); } void MultiThreadServer::disableClients() @@ -130,19 +131,19 @@ void MultiThreadServer::slotDisconnectClient(QString peerAddress, QString peerPo emit signalStopSendFile(); Logger::instance().log("SERVER: Client " + login + " disconnected"); - serverLmsWidget->slotUpdateListClients(); + serverLmsWidget->slot_UpdateListClients(); serverLmsWidget->getProcessingSystem()->processingClientDeAutorization(login); } void MultiThreadServer::removeClient(int idSocket) { clientsMap->remove(idSocket); - serverLmsWidget->slotUpdateListClients(); + serverLmsWidget->slot_UpdateListClients(); } void MultiThreadServer::addClient(qintptr descriptor, ClientHandler *client) { (*clientsMap)[descriptor] = client; - serverLmsWidget->slotUpdateListClients(); + serverLmsWidget->slot_UpdateListClients(); } diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index 9ec5ca2..f2d504e 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -16,7 +16,7 @@ ProviderDBLMS::~ProviderDBLMS() DisConnectionFromDB(); } -void ProviderDBLMS::ConnectionToDB() +bool ProviderDBLMS::ConnectionToDB() { mtxAccess.lock(); if(! dbLMS->DBisConnected()) @@ -24,9 +24,18 @@ void ProviderDBLMS::ConnectionToDB() if(dbLMS->connectionToDB()) { Q_EMIT signal_BlockAutorization(false); + + mtxAccess.unlock(); + return true; + } + else + { + mtxAccess.unlock(); + return false; } } mtxAccess.unlock(); + return true; } void ProviderDBLMS::DisConnectionFromDB() @@ -41,6 +50,15 @@ void ProviderDBLMS::DisConnectionFromDB() mtxAccess.unlock(); } +bool ProviderDBLMS::DBisConnected() +{ + bool res = false; + mtxAccess.lock(); + res = dbLMS->DBisConnected(); + mtxAccess.unlock(); + return res; +} + DataBaseSettings ProviderDBLMS::getDBSettings() { return dbLMS->getDataBaseSettings(); diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index ee58aaf..15ad89d 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -75,8 +75,9 @@ Q_SIGNALS: void signal_BlockAutorization(bool block); public: - void ConnectionToDB(); + bool ConnectionToDB(); void DisConnectionFromDB(); + bool DBisConnected(); DataBaseSettings getDBSettings(); private: diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index c6d85d1..1782844 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -29,7 +29,8 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : providerDBLMS(nullptr), first (true), language(languageENG), - errorCode(0) + errorCode(0), + flStartInitialization(false) { ui->setupUi(this); @@ -41,96 +42,68 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : setLanguageInterfase(); - mutex = new QMutex; + startInitialization(); - ui->btnStopServer->setEnabled(false); - ui->btnStartServer->setEnabled(true); - - updateThread = new QThread; - loggerThread = new QThread; - - providerDBLMS = new ProviderDBLMS(this); - providerDBLMS->ConnectionToDB(); - providerDBLMS->deAuthorizationAll(); - - //Настройки БД - DataBaseSettings dbSettings = providerDBLMS->getDBSettings(); - QString strDBsettings = QString("%1 (%2) %3 : %4").arg(dbSettings.dbName, - dbSettings.dbType, - dbSettings.dbHostName, - QString::number(dbSettings.dbPort)); - ui->lblDBsettings->setText(strDBsettings); - - chatSystem = new ChatSystem(); - - connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization); - - assetsManager = new AssetsManager; - assetsManager->moveToThread(updateThread); - - updateController = new UpdateController; - updateController->moveToThread(updateThread); - - processingSystem = new ProcessingSystem(providerDBLMS, updateController); - //processingSystem->moveToThread(updateThread); - - dataParser = new DataParser(assetsManager,processingSystem); - - commonClientHandler = new CommonClientHandler; - server = new MultiThreadServer(this,updateController,processingSystem,dataParser,6000); - - loggerThread->start(); - updateThread->start(); - - commonClientHandler->initialize(server->getClientsMap(),processingSystem,dataParser); - processingSystem->initialize(server,dataParser,commonClientHandler,updateController,chatSystem); - chatSystem->initialize(commonClientHandler,dataParser,server->getClientsMap()); - - Logger::instance().moveToThread(loggerThread); - Logger::instance().setLoggingType(LoggingType::WIDGET); - Logger::instance().setLogToFile(true); - - connect(this,&ServerLMSWidget::sigUpdateController,updateController,&UpdateController::initialize,Qt::DirectConnection); - connect(this,&ServerLMSWidget::sigCalculateFullHash,updateController,&UpdateController::calculateFullHash,Qt::AutoConnection); - connect(updateController,&UpdateController::sigErrorRequired,this,&ServerLMSWidget::setError); - connect(&Logger::instance(),&Logger::sigLogToWidget,this, &ServerLMSWidget::addToLog,Qt::QueuedConnection); - - emit sigUpdateController(commonClientHandler,dataParser,assetsManager); - on_btnStartServer_clicked(); + tryConnectionToDB(); } ServerLMSWidget::~ServerLMSWidget() { - server->stopServer(); - updateThread->exit(); - loggerThread->exit(); + if(flStartInitialization) + { + server->stopServer(); + + //updateThread->exit(); + updateThread->quit(); + updateThread->wait(); + delete updateThread; + + delete server; + delete commonClientHandler; + delete dataParser; + delete processingSystem; + delete updateController; + delete assetsManager; + delete chatSystem; + + delete mutex; + + //loggerThread->exit(); + loggerThread->quit(); + loggerThread->wait(); + delete loggerThread; + } - delete server; - delete commonClientHandler; - delete dataParser; - delete processingSystem; - delete updateController; - delete assetsManager; - delete chatSystem; delete providerDBLMS; - delete loggerThread; - delete updateThread; - delete mutex; delete ui; } -void ServerLMSWidget::setError(int code) +void ServerLMSWidget::changeEvent(QEvent *event) { - errorCode = code; + // В случае получения события изменения языка приложения + if (event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); // переведём окно заново + + if(providerDBLMS->DBisConnected()) + { + //Настройки БД + DataBaseSettings dbSettings = providerDBLMS->getDBSettings(); + QString strDBsettings = QString("%1 (%2) %3 : %4").arg(dbSettings.dbName, + dbSettings.dbType, + dbSettings.dbHostName, + QString::number(dbSettings.dbPort)); + ui->lblDBsettings->setText(strDBsettings); + } + else + { + ui->lblDBsettings->setText(""); + } + } } -QString ServerLMSWidget::getLanguage() -{ - return language; -} - -void ServerLMSWidget::slotUpdateListClients() +void ServerLMSWidget::slot_UpdateListClients() { //Очищаем список ui->listWidget_Clients->clear(); @@ -148,7 +121,7 @@ void ServerLMSWidget::slotUpdateListClients() Logger::instance().log("SERVER: countClients = " + QString::number(countClients)); } -void ServerLMSWidget::addToLog(QString message) +void ServerLMSWidget::slot_AddMessageToLog(QString message) { ui->loggerTextField->appendPlainText(message); } @@ -185,6 +158,7 @@ void ServerLMSWidget::on_btnStartServer_clicked() ui->btnStartServer->setEnabled(false); ui->btnStopServer->setEnabled(true); ui->lblOnOff->setPixmap(QPixmap(QStringLiteral(":/resources/icons/switchOn.png"))); + slot_BlockAutorization(false); } } @@ -195,29 +169,7 @@ void ServerLMSWidget::on_btnStopServer_clicked() ui->btnStopServer->setEnabled(false); ui->btnStartServer->setEnabled(true); ui->lblOnOff->setPixmap(QPixmap(QStringLiteral(":/resources/icons/switchOff.png"))); - slot_BlockAutorization(false); - } -} - -QMutex *ServerLMSWidget::getMutex() const -{ - return mutex; -} - -void ServerLMSWidget::changeEvent(QEvent *event) -{ - // В случае получения события изменения языка приложения - if (event->type() == QEvent::LanguageChange) - { - ui->retranslateUi(this); // переведём окно заново - - //Настройки БД - DataBaseSettings dbSettings = providerDBLMS->getDBSettings(); - QString strDBsettings = QString("%1 (%2) %3 : %4").arg(dbSettings.dbName, - dbSettings.dbType, - dbSettings.dbHostName, - QString::number(dbSettings.dbPort)); - ui->lblDBsettings->setText(strDBsettings); + slot_BlockAutorization(true); } } @@ -236,20 +188,19 @@ void ServerLMSWidget::on_btnSettings_clicked() { language = dlg.getSettings().Language; - if(dlg.settingsServerIsChanged()) - {//TODO Здесь нужно переподключать БД - - //SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningClose, tr("Server settings have been changed. Please reconnect to the server.")).exec(); + if(dlg.settingsDBisChanged()) + { + on_btnStopServer_clicked(); providerDBLMS->deAuthorizationAll(); - on_btnStopServer_clicked(); - providerDBLMS->DisConnectionFromDB(); - providerDBLMS->ConnectionToDB(); + ui->lblDBsettings->setText(""); - //on_btnStartServer_clicked(); + QMessageBox::warning(this, tr("Warning!"), tr("Database settings have been changed.\nThe server will be restarted.")); + + tryConnectionToDB(); } break; @@ -308,3 +259,78 @@ QString ServerLMSWidget::loadStyleSheet() return style; } } + +void ServerLMSWidget::startInitialization() +{ + providerDBLMS = new ProviderDBLMS(this); + connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization); + + mutex = new QMutex; + + updateThread = new QThread; + loggerThread = new QThread; + + chatSystem = new ChatSystem(); + + assetsManager = new AssetsManager; + assetsManager->moveToThread(updateThread); + + updateController = new UpdateController; + updateController->moveToThread(updateThread); + + processingSystem = new ProcessingSystem(providerDBLMS, updateController); + //processingSystem->moveToThread(updateThread); + + dataParser = new DataParser(assetsManager,processingSystem); + + commonClientHandler = new CommonClientHandler; + server = new MultiThreadServer(this,updateController,processingSystem,dataParser,6000); + + loggerThread->start(); + updateThread->start(); + + commonClientHandler->initialize(server->getClientsMap(),processingSystem,dataParser); + processingSystem->initialize(server,dataParser,commonClientHandler,updateController,chatSystem); + chatSystem->initialize(commonClientHandler,dataParser,server->getClientsMap()); + + Logger::instance().moveToThread(loggerThread); + Logger::instance().setLoggingType(LoggingType::WIDGET); + Logger::instance().setLogToFile(true); + + connect(this,&ServerLMSWidget::sigUpdateController,updateController,&UpdateController::initialize,Qt::DirectConnection); + connect(this,&ServerLMSWidget::sigCalculateFullHash,updateController,&UpdateController::calculateFullHash,Qt::AutoConnection); + connect(updateController,&UpdateController::sigErrorRequired,this,&ServerLMSWidget::setError); + connect(&Logger::instance(),&Logger::sigLogToWidget,this, &ServerLMSWidget::slot_AddMessageToLog,Qt::QueuedConnection); + + emit sigUpdateController(commonClientHandler,dataParser,assetsManager); + + ui->btnStopServer->setEnabled(false); + ui->btnStartServer->setEnabled(true); + + flStartInitialization = true; +} + +void ServerLMSWidget::tryConnectionToDB() +{ + if(! providerDBLMS->ConnectionToDB()) + { + ui->lblDBsettings->setText(""); + ui->btnStopServer->setEnabled(false); + ui->btnStartServer->setEnabled(false); + QMessageBox::critical(this, tr("Error!"), tr("Database connection error")); + } + else + { + providerDBLMS->deAuthorizationAll(); + + //Настройки БД + DataBaseSettings dbSettings = providerDBLMS->getDBSettings(); + QString strDBsettings = QString("%1 (%2) %3 : %4").arg(dbSettings.dbName, + dbSettings.dbType, + dbSettings.dbHostName, + QString::number(dbSettings.dbPort)); + ui->lblDBsettings->setText(strDBsettings); + + on_btnStartServer_clicked(); + } +} diff --git a/ServerLMS/serverlmswidget.h b/ServerLMS/serverlmswidget.h index 0f63ab5..e7ea9af 100644 --- a/ServerLMS/serverlmswidget.h +++ b/ServerLMS/serverlmswidget.h @@ -53,34 +53,36 @@ public: static const QString languageENG; static const QString languageRUS; -public: - QString getLanguage(); - - void setError(int code); - protected: // Метод получения событий // В нём будет производиться проверка события смены перевода приложения void changeEvent(QEvent * event) override; signals: - void sigRecognize(); - void sigCalculateFullHash(); - void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager); - - QTcpSocket* sigGetSocket(); - //сигнал смены языка void signal_LanguageChanged(QString language); + void sigRecognize(); + void sigCalculateFullHash(); + void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager); + QTcpSocket* sigGetSocket(); + public slots: void slot_LanguageChanged(QString language); - void slotUpdateListClients(); + void slot_UpdateListClients(); void slot_BlockAutorization(bool block); - void addToLog(QString message); + void slot_AddMessageToLog(QString message); public: - void removeClient(int socketId); + QString getLanguage() + { + return language; + } + + void setError(int code) + { + errorCode = code; + } int hasError() const { @@ -92,7 +94,12 @@ public: return processingSystem; } - QMutex *getMutex() const; + QMutex *getMutex() const + { + return mutex; + } + + void removeClient(int socketId); private slots: void on_btnStartServer_clicked(); @@ -101,11 +108,13 @@ private slots: private: void setLanguageInterfase(); - -private: void updateMyStyleSheet(); QString loadStyleSheet(); + void startInitialization(); + + void tryConnectionToDB(); + private: Ui::ServerLMSWidget *ui; @@ -129,6 +138,8 @@ private: QTranslator qtLanguageTranslator; QString language; int errorCode; + + bool flStartInitialization; }; #endif // SERVERLMSWIDGET_H diff --git a/ServerLMS/translations/ServerLMS_ru_RU.qm b/ServerLMS/translations/ServerLMS_ru_RU.qm index 939a831d043dc6c1e7ab06a05c95f8b63760e669..93ec93356238275d7f16f14479bcb550eb75bf68 100644 GIT binary patch literal 2063 zcma)7O>7%g5FR(P_Qr8T>zWe!$BP6Kpw>;&EKM9cjqRifveQ;_tD+vNZsUi&!riTQ zH>p5y?*&d2^}vM#QU$ld0STc>flB;{3kPoLrQA5s3c;wp^SeYwjf~@e5ha$%SbHD#Ycg)$ zh5eI^PcIQA57UKPxNkh;EQ?lG*5b=Y@|pKcu@;_>8q_5snr8>yFnxDETcxwy0n zo{Q$G+ke2%Uh_r*xa5ZU$^BojzCO5q;XUyGnjV=JxZh46z56?G6Y0tIr-8efZVjG; zy*Kn)^CB!|77u)k_ruJWi2(N4rZqluh*J9p@WP9HNF5}2AJ1}$%Ut0xSe)qy=Xi>b zV?E6!Q@KmxpR3oaqUyOpXuF|(WL^eN%T3|I&TFYtpzOS3cf3|ZhN0uOg0sH;rbg}sVoY%Zo6|cgag7%uAA|FDXp4#+^z~x$ z3y2Ca^>9mG5dJ5-$w$Fm<3fZp>$clkMPU6ly$h)k zlyiX2a6N*VXY3%j=K0NjtR|qdfcApqGoByzgJgLWkOhELt*21!9w#^KwZ2hi`5<6Q zC~CXYT;QqRhW{yKKXwtR;>2dW$hAt@7+hM2|8(ST@LVAM{?&SnU-bS!KA%_2Pc@{! zCjI(yQ#TJEKcHjhEMUL-WS5c zeK_t?S}|SptfEtFV#RY^xuOCW()T?-mi+C1S3jbuZKc6#99@89;YtmXqTZZJT#fRS zh6pXxVnUtuyH$i?aRt{W^b<=B09;r3Rjf;tkMdNBHja^_Cx>W5w&Jpsu2^ZKS7kGw zKHHW80)i66HK)_TQ{hX@EkDH5*a(NWq<1vpOfIOzjK<>9{Jhpyk;ftopY;4Iv4{-s z2jUnGWFW#M>s|{3G#2&0`)^zMX8D{-?w6&;LP4m3%yZGd6U(f66d$v3A=%t~@xgGrIaC*<*T6mPX delta 187 zcmeAd*vmRW#Lt6)!H|!Efgz58*@ps1}0vHs1;Ly{7X#VRnGzCTUkx- z9s=^`upJWm0HhVU^pAc9iof8FNQnc|44FVpo)aI%PhQTf<)yООО Константа-Дизайн + + DialogSettingsTray + + + Settings + Настройки + + + + Main + Основные + + + + Language + Язык + + + + Data Base + База Данных + + + + DB name + Имя БД + + + + Host name + Хост + + + + Port + Порт + + + + User name + Имя пользователя + + + + Password + Пароль + + + + Save + Сохранить + + ServerLMSWidget @@ -17,30 +70,35 @@ Форма - - Block Authorization - Блокировка авторизации - - - + Logger Логгер - + Clients Клиенты - + + Settings + Настройки + + + Data base: База данных: - + ... + + + Authorization + Авторизация + Start @@ -51,5 +109,33 @@ Stop Остановить + + + + Warning! + Внимание! + + + + Database settings have been changed. +The server will be restarted. + Настройки Базы Данных были изменены. +Сервер будет перезапущен. + + + + The file could not be opened + Файл не может быть открыт + + + + Error! + Ошибка! + + + + Database connection error + Ошибка подключения к Базе Данных + diff --git a/TrayServerLMS/mainwindow.cpp b/TrayServerLMS/mainwindow.cpp index f47afc5..f0e4757 100644 --- a/TrayServerLMS/mainwindow.cpp +++ b/TrayServerLMS/mainwindow.cpp @@ -131,6 +131,7 @@ void MainWindow::changeEvent(QEvent *event) {// переведём окно заново ui->retranslateUi(this); + trayIcon->setToolTip(tr("Server LMS")); action_ShowWindow->setText(tr("Expand window")); action_HideWindow->setText(tr("Minimize window")); action_Exit->setText(tr("Exit")); diff --git a/TrayServerLMS/resources/IcoServerRRJ.ico b/TrayServerLMS/resources/IcoServerRRJ.ico index 82dd2e8948f0d059944804b0f4b5cd3497cb6879..f6934b2e4f9349bad806b58e8945d1f9d0d2679f 100644 GIT binary patch literal 9103 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 D7@41b diff --git a/TrayServerLMS/resources/IcoServerRRJ_2.ico b/TrayServerLMS/resources/IcoServerRRJ_2.ico new file mode 100644 index 0000000000000000000000000000000000000000..9b1892f5f83462fddc678f3fb1df6cd0beef2704 GIT binary patch literal 2891 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 literal 0 HcmV?d00001 diff --git a/TrayServerLMS/resources/IcoServerRRJ_old.ico b/TrayServerLMS/resources/IcoServerRRJ_old.ico new file mode 100644 index 0000000000000000000000000000000000000000..82dd2e8948f0d059944804b0f4b5cd3497cb6879 GIT binary patch literal 67646 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 D7@41b literal 0 HcmV?d00001