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();