From c97c86ac5590b9271e1ce7cd251fca4df342ad4d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 1 Dec 2025 14:29:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=BE=D0=B2=D0=B5=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BE=20=D0=BD=D0=B5=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/commonview.h | 5 ++++ .../instructors/instructorsview.cpp | 18 +++++++++++++ .../instructors/viewerinstructors.cpp | 25 +++++++++++++++++++ .../instructors/viewerinstructors.h | 3 +++ .../instructorsandtraineeswidget.cpp | 3 +++ .../messanger/messangercontroller.cpp | 12 +++++++++ .../messanger/messangercontroller.h | 4 +++ .../trainees/traineesview.cpp | 18 +++++++++++++ .../trainees/viewertrainees.cpp | 25 +++++++++++++++++++ .../trainees/viewertrainees.h | 3 +++ 10 files changed, 116 insertions(+) diff --git a/InstructorsAndTrainees/commonview.h b/InstructorsAndTrainees/commonview.h index 5c2a269..a6a4dfa 100644 --- a/InstructorsAndTrainees/commonview.h +++ b/InstructorsAndTrainees/commonview.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "instructorsAndTrainees_global.h" #include "connectortoserver.h" #include "waitanimationwidget.h" @@ -63,6 +64,7 @@ public: treeWidget->clear(); treeWidget->setEnabled(false); lastCurrentID = 0; + mapNewMsg.clear(); } void clearSelection() { @@ -108,6 +110,9 @@ protected: int lastCurrentID; TypeObject typeObject; + QMutex mtxmapNewMsg; + QMap mapNewMsg; + WaitAnimationWidget *waitAnimationWidget; }; diff --git a/InstructorsAndTrainees/instructors/instructorsview.cpp b/InstructorsAndTrainees/instructors/instructorsview.cpp index 1dc884c..cd3d0ae 100644 --- a/InstructorsAndTrainees/instructors/instructorsview.cpp +++ b/InstructorsAndTrainees/instructors/instructorsview.cpp @@ -89,6 +89,24 @@ void InstructorsView::loadInstructorsFromDB() if(! instructor.getLoggedIn()) if(! notLoggedInVisible) ItemInstructor->setHidden(true); + + mtxmapNewMsg.lock(); + if(mapNewMsg.contains(instructor.getID())) + {//Есть непрочитанные сообщения от него + if(mapNewMsg.value(instructor.getID())) + { + if(lastCurrentID == instructor.getID()) + mapNewMsg.take(lastCurrentID); + else + { + for (int i = 0; i < ColumnsTreeUsers::clmn_count; i++) + { + ItemInstructor->setBackground(i, QBrush(QColor(250, 210, 1))); + } + } + } + } + mtxmapNewMsg.unlock(); } treeWidget->expandAll(); diff --git a/InstructorsAndTrainees/instructors/viewerinstructors.cpp b/InstructorsAndTrainees/instructors/viewerinstructors.cpp index e22505e..6a0d68c 100644 --- a/InstructorsAndTrainees/instructors/viewerinstructors.cpp +++ b/InstructorsAndTrainees/instructors/viewerinstructors.cpp @@ -64,6 +64,17 @@ void ViewerInstructors::changeEvent(QEvent *event) } } +void ViewerInstructors::slot_receiveMessage(ClientMessage clientMessage) +{ + int id_instructor = clientMessage.fromId.toInt(); + + mtxmapNewMsg.lock(); + mapNewMsg.insert(id_instructor, true); + mtxmapNewMsg.unlock(); + + slot_NeedUpdateUI(true, false); +} + void ViewerInstructors::on_btnEditorInstructors_clicked() { connectorToServer->sendQueryBlockAuth(true); @@ -100,6 +111,20 @@ void ViewerInstructors::on_treeWidgetItemClicked(QTreeWidgetItem *item, int colu lastCurrentID = newCurrentID; + mtxmapNewMsg.lock(); + if(mapNewMsg.contains(newCurrentID)) + {//Есть непрочитанные сообщения от него + if(mapNewMsg.value(newCurrentID)) + { + for (int i = 0; i < ColumnsTreeUsers::clmn_count; i++) + { + item->setBackground(i, QBrush(Qt::GlobalColor::white)); + } + mapNewMsg.take(newCurrentID); + } + } + mtxmapNewMsg.unlock(); + Q_EMIT signal_instructorSelected(newCurrentID); } } diff --git a/InstructorsAndTrainees/instructors/viewerinstructors.h b/InstructorsAndTrainees/instructors/viewerinstructors.h index 6944a5d..bfe947f 100644 --- a/InstructorsAndTrainees/instructors/viewerinstructors.h +++ b/InstructorsAndTrainees/instructors/viewerinstructors.h @@ -26,6 +26,9 @@ public: protected: void changeEvent(QEvent * event) override; +public slots: + void slot_receiveMessage(ClientMessage clientMessage); + public Q_SLOTS: void on_btnEditorInstructors_clicked(); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 8b80c1f..18abca8 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -67,6 +67,9 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, this, &InstructorsAndTraineesWidget::slot_traineeSelected); connect(viewerInstructors, &ViewerInstructors::signal_instructorSelected, this, &InstructorsAndTraineesWidget::slot_instructorSelected); + connect(messangerController, &MessangerController::signal_receiveMessage_fromInstructor, viewerInstructors, &ViewerInstructors::slot_receiveMessage); + connect(messangerController, &MessangerController::signal_receiveMessage_fromTrainee, viewerTrainees, &ViewerTrainees::slot_receiveMessage); + viewerTrainees->clearSelection(); viewerInstructors->clearSelection(); diff --git a/InstructorsAndTrainees/messanger/messangercontroller.cpp b/InstructorsAndTrainees/messanger/messangercontroller.cpp index be33a7a..70dc8d6 100644 --- a/InstructorsAndTrainees/messanger/messangercontroller.cpp +++ b/InstructorsAndTrainees/messanger/messangercontroller.cpp @@ -91,6 +91,18 @@ void MessangerController::slot_sendMessage(ClientMessage clientMessage) void MessangerController::slot_receiveMessage(ClientMessage clientMessage) { + int id_user = clientMessage.fromId.toInt(); + + Instructor instructor = connectorToServer->getInstructor(id_user); + if(instructor.getID()) + emit signal_receiveMessage_fromInstructor(clientMessage); + else + { + Trainee trainee = connectorToServer->getTrainee(id_user); + if(trainee.getID()) + emit signal_receiveMessage_fromTrainee(clientMessage); + } + showMessageInAllWidgets(clientMessage); } diff --git a/InstructorsAndTrainees/messanger/messangercontroller.h b/InstructorsAndTrainees/messanger/messangercontroller.h index 6e9cdfd..820ad99 100644 --- a/InstructorsAndTrainees/messanger/messangercontroller.h +++ b/InstructorsAndTrainees/messanger/messangercontroller.h @@ -33,6 +33,10 @@ public slots: void slot_reinitMessangers(QList listUsers); +signals: + void signal_receiveMessage_fromInstructor(ClientMessage clientMessage); + void signal_receiveMessage_fromTrainee(ClientMessage clientMessage); + private: void showMessageInAllWidgets(ClientMessage clientMessage); diff --git a/InstructorsAndTrainees/trainees/traineesview.cpp b/InstructorsAndTrainees/trainees/traineesview.cpp index 9cecf5f..4f8d412 100644 --- a/InstructorsAndTrainees/trainees/traineesview.cpp +++ b/InstructorsAndTrainees/trainees/traineesview.cpp @@ -100,6 +100,24 @@ void TraineesView::loadTraineesFromDB() if(! trainee.getLoggedIn()) if(! notLoggedInVisible) ItemTrainee->setHidden(true); + + mtxmapNewMsg.lock(); + if(mapNewMsg.contains(trainee.getID())) + {//Есть непрочитанные сообщения от него + if(mapNewMsg.value(trainee.getID())) + { + if(lastCurrentID == trainee.getID()) + mapNewMsg.take(lastCurrentID); + else + { + for (int i = 0; i < ColumnsTreeUsers::clmn_count; i++) + { + ItemTrainee->setBackground(i, QBrush(QColor(250, 210, 1))); + } + } + } + } + mtxmapNewMsg.unlock(); } //if(! archiveVisible && cntChildsNotArchived == 0) diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index 865ac71..9c32e5b 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -98,6 +98,17 @@ void ViewerTrainees::changeEvent(QEvent *event) } } +void ViewerTrainees::slot_receiveMessage(ClientMessage clientMessage) +{ + int id_trainee = clientMessage.fromId.toInt(); + + mtxmapNewMsg.lock(); + mapNewMsg.insert(id_trainee, true); + mtxmapNewMsg.unlock(); + + slot_NeedUpdateUI(false, true); +} + void ViewerTrainees::on_btnEditorTrainees_clicked() { connectorToServer->sendQueryBlockAuth(true); @@ -181,6 +192,20 @@ void ViewerTrainees::on_treeWidgetItemClicked(QTreeWidgetItem *item, int column) lastCurrentID = newCurrentID; + mtxmapNewMsg.lock(); + if(mapNewMsg.contains(newCurrentID)) + {//Есть непрочитанные сообщения от него + if(mapNewMsg.value(newCurrentID)) + { + for (int i = 0; i < ColumnsTreeUsers::clmn_count; i++) + { + item->setBackground(i, QBrush(Qt::GlobalColor::white)); + } + mapNewMsg.take(newCurrentID); + } + } + mtxmapNewMsg.unlock(); + Q_EMIT signal_traineeSelected(newCurrentID); } } diff --git a/InstructorsAndTrainees/trainees/viewertrainees.h b/InstructorsAndTrainees/trainees/viewertrainees.h index b5ee2ef..cc010a3 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.h +++ b/InstructorsAndTrainees/trainees/viewertrainees.h @@ -33,6 +33,9 @@ public: protected: void changeEvent(QEvent * event) override; +public slots: + void slot_receiveMessage(ClientMessage clientMessage); + public Q_SLOTS: void on_btnEditorTrainees_clicked(); void on_btnPersonalCard_clicked();