Оповещения о непрочитанных сообщениях

This commit is contained in:
2025-12-01 14:29:26 +03:00
parent 834e192479
commit c97c86ac55
10 changed files with 116 additions and 0 deletions

View File

@@ -4,6 +4,7 @@
#include <QTreeWidget> #include <QTreeWidget>
#include <QTranslator> #include <QTranslator>
#include <QMutex> #include <QMutex>
#include <QMap>
#include "instructorsAndTrainees_global.h" #include "instructorsAndTrainees_global.h"
#include "connectortoserver.h" #include "connectortoserver.h"
#include "waitanimationwidget.h" #include "waitanimationwidget.h"
@@ -63,6 +64,7 @@ public:
treeWidget->clear(); treeWidget->clear();
treeWidget->setEnabled(false); treeWidget->setEnabled(false);
lastCurrentID = 0; lastCurrentID = 0;
mapNewMsg.clear();
} }
void clearSelection() void clearSelection()
{ {
@@ -108,6 +110,9 @@ protected:
int lastCurrentID; int lastCurrentID;
TypeObject typeObject; TypeObject typeObject;
QMutex mtxmapNewMsg;
QMap<int, bool> mapNewMsg;
WaitAnimationWidget *waitAnimationWidget; WaitAnimationWidget *waitAnimationWidget;
}; };

View File

@@ -89,6 +89,24 @@ void InstructorsView::loadInstructorsFromDB()
if(! instructor.getLoggedIn()) if(! instructor.getLoggedIn())
if(! notLoggedInVisible) if(! notLoggedInVisible)
ItemInstructor->setHidden(true); 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(); treeWidget->expandAll();

View File

@@ -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() void ViewerInstructors::on_btnEditorInstructors_clicked()
{ {
connectorToServer->sendQueryBlockAuth(true); connectorToServer->sendQueryBlockAuth(true);
@@ -100,6 +111,20 @@ void ViewerInstructors::on_treeWidgetItemClicked(QTreeWidgetItem *item, int colu
lastCurrentID = newCurrentID; 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); Q_EMIT signal_instructorSelected(newCurrentID);
} }
} }

View File

@@ -26,6 +26,9 @@ public:
protected: protected:
void changeEvent(QEvent * event) override; void changeEvent(QEvent * event) override;
public slots:
void slot_receiveMessage(ClientMessage clientMessage);
public Q_SLOTS: public Q_SLOTS:
void on_btnEditorInstructors_clicked(); void on_btnEditorInstructors_clicked();

View File

@@ -67,6 +67,9 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, this, &InstructorsAndTraineesWidget::slot_traineeSelected); connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, this, &InstructorsAndTraineesWidget::slot_traineeSelected);
connect(viewerInstructors, &ViewerInstructors::signal_instructorSelected, this, &InstructorsAndTraineesWidget::slot_instructorSelected); 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(); viewerTrainees->clearSelection();
viewerInstructors->clearSelection(); viewerInstructors->clearSelection();

View File

@@ -91,6 +91,18 @@ void MessangerController::slot_sendMessage(ClientMessage clientMessage)
void MessangerController::slot_receiveMessage(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); showMessageInAllWidgets(clientMessage);
} }

View File

@@ -33,6 +33,10 @@ public slots:
void slot_reinitMessangers(QList<User> listUsers); void slot_reinitMessangers(QList<User> listUsers);
signals:
void signal_receiveMessage_fromInstructor(ClientMessage clientMessage);
void signal_receiveMessage_fromTrainee(ClientMessage clientMessage);
private: private:
void showMessageInAllWidgets(ClientMessage clientMessage); void showMessageInAllWidgets(ClientMessage clientMessage);

View File

@@ -100,6 +100,24 @@ void TraineesView::loadTraineesFromDB()
if(! trainee.getLoggedIn()) if(! trainee.getLoggedIn())
if(! notLoggedInVisible) if(! notLoggedInVisible)
ItemTrainee->setHidden(true); 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) //if(! archiveVisible && cntChildsNotArchived == 0)

View File

@@ -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() void ViewerTrainees::on_btnEditorTrainees_clicked()
{ {
connectorToServer->sendQueryBlockAuth(true); connectorToServer->sendQueryBlockAuth(true);
@@ -181,6 +192,20 @@ void ViewerTrainees::on_treeWidgetItemClicked(QTreeWidgetItem *item, int column)
lastCurrentID = newCurrentID; 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); Q_EMIT signal_traineeSelected(newCurrentID);
} }
} }

View File

@@ -33,6 +33,9 @@ public:
protected: protected:
void changeEvent(QEvent * event) override; void changeEvent(QEvent * event) override;
public slots:
void slot_receiveMessage(ClientMessage clientMessage);
public Q_SLOTS: public Q_SLOTS:
void on_btnEditorTrainees_clicked(); void on_btnEditorTrainees_clicked();
void on_btnPersonalCard_clicked(); void on_btnPersonalCard_clicked();