ПП отображаются в виде выпадающего списка (назн-е)

This commit is contained in:
2025-11-21 14:05:02 +03:00
parent 72438e8257
commit 5bb9816593
14 changed files with 214 additions and 62 deletions

View File

@@ -161,15 +161,16 @@ QTreeWidget::item {
/*Бранчи*/ /*Бранчи*/
QTreeWidget::branch:has-siblings:!adjoins-item { QTreeWidget::branch:has-siblings:!adjoins-item {
border-image: url(:/resources/icons/vline.png) 0; border-image: url(:/resources/icons/vline.png) 0;
} }
QTreeWidget::branch:has-siblings:adjoins-item { QTreeWidget::branch:has-siblings:adjoins-item {
border-image: url(:/resources/icons/branch-more.png) 0; border-image: url(:/resources/icons/branch-more.png) 0;
} }
QTreeWidget::branch:!has-children:!has-siblings:adjoins-item { QTreeWidget::branch:!has-children:!has-siblings:adjoins-item {
border-image: url(:/resources/icons/branch-end.png) 0; border-image: url(:/resources/icons/branch-end.png) 0;
} }
QTreeWidget#treeWidget_AMMforTrainee::branch:!has-children:!has-siblings:adjoins-item {
border-image: none;
}
QTreeWidget::branch:closed:has-children:!has-siblings, QTreeWidget::branch:closed:has-children:!has-siblings,
QTreeWidget::branch:closed:has-children:has-siblings { QTreeWidget::branch:closed:has-children:has-siblings {
border-image: none; border-image: none;
@@ -294,7 +295,7 @@ QTabBar QToolButton { /* the scroll buttons are tool buttons */
QListWidget::item { QListWidget::item {
/*padding: -5px;*/ /*padding: -5px;*/
} }
QListWidget { QListWidget#oneDialogMessenger {
/*background: #ddeeff;*/ /*background: #ddeeff;*/
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,

View File

@@ -128,6 +128,10 @@ add_library(InstructorsAndTrainees SHARED
tasks/listsubproc.h tasks/listsubproc.h
tasks/listsubproc.ui tasks/listsubproc.ui
tasks/subprocitemwidget.cpp
tasks/subprocitemwidget.h
tasks/subprocitemwidget.ui
widgets/newversionwidget.cpp widgets/newversionwidget.cpp
widgets/newversionwidget.h widgets/newversionwidget.h
widgets/newversionwidget.ui widgets/newversionwidget.ui

View File

@@ -85,7 +85,7 @@
<string/> <string/>
</property> </property>
<property name="pixmap"> <property name="pixmap">
<pixmap resource="../resources.qrc">:/resources/icons/circleGray.png</pixmap> <pixmap resource="../../ServerLMS/ServerLMS.qrc">:/resources/icons/circleGray.png</pixmap>
</property> </property>
</widget> </widget>
</item> </item>
@@ -128,7 +128,7 @@
<string>Send</string> <string>Send</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset resource="../resources.qrc"> <iconset>
<normaloff>:/resources/icons/sendMsg.png</normaloff>:/resources/icons/sendMsg.png</iconset> <normaloff>:/resources/icons/sendMsg.png</normaloff>:/resources/icons/sendMsg.png</iconset>
</property> </property>
<property name="iconSize"> <property name="iconSize">
@@ -149,7 +149,7 @@
</layout> </layout>
</widget> </widget>
<resources> <resources>
<include location="../resources.qrc"/> <include location="../../ServerLMS/ServerLMS.qrc"/>
</resources> </resources>
<connections/> <connections/>
</ui> </ui>

View File

@@ -8,6 +8,8 @@
OneDialogMessenger::OneDialogMessenger(User userLocalGUI, User userRemote, QWidget *parent): OneDialogMessenger::OneDialogMessenger(User userLocalGUI, User userRemote, QWidget *parent):
QListWidget(parent) QListWidget(parent)
{ {
this->setObjectName("oneDialogMessenger");
this->userLocalGUI = userLocalGUI; this->userLocalGUI = userLocalGUI;
this->userRemote = userRemote; this->userRemote = userRemote;

View File

@@ -30,6 +30,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre
qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId();
treeWidget = new QTreeWidget(); treeWidget = new QTreeWidget();
if(type == TypeListTreeAMMFIM::listForTrainee)
treeWidget->setObjectName("treeWidget_AMMforTrainee");
ui->horizontalLayout_Tree->addWidget(treeWidget); ui->horizontalLayout_Tree->addWidget(treeWidget);
//connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidgetItemClicked); //connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidgetItemClicked);
@@ -39,8 +41,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre
preparationTreeWidget(); preparationTreeWidget();
threadPreparation = new QThread(); threadPreparation = new QThread();
taskTreePreparation = new TaskAMMFIMTreePreparation(type); taskTreePreparation = new TaskAMMFIMTreePreparation(type, treeWidget);
taskTreePreparation->moveToThread(threadPreparation); //taskTreePreparation->moveToThread(threadPreparation);
threadPreparation->start(); threadPreparation->start();
threadPreparation->setPriority(QThread::HighestPriority); threadPreparation->setPriority(QThread::HighestPriority);
connect(this, &AMMtasksWidget::signal_prepareAMMListItems, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItems); connect(this, &AMMtasksWidget::signal_prepareAMMListItems, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItems);
@@ -281,11 +283,14 @@ void AMMtasksWidget::loadTasksAMM(bool flRequestFirst)
void AMMtasksWidget::slot_AMMlistItemsReady(QList<QTreeWidgetItem *> listItems) void AMMtasksWidget::slot_AMMlistItemsReady(QList<QTreeWidgetItem *> listItems)
{ {
if(type != TypeListTreeAMMFIM::listForTrainee)
{
//Обновление дерева //Обновление дерева
treeWidget->clear(); treeWidget->clear();
for(QTreeWidgetItem * item : listItems) for(QTreeWidgetItem * item : listItems)
treeWidget->addTopLevelItem(item); treeWidget->addTopLevelItem(item);
}
/* /*
QTreeWidgetItem * item = treeWidget->topLevelItem(0); QTreeWidgetItem * item = treeWidget->topLevelItem(0);

View File

@@ -38,7 +38,7 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre
preparationTreeWidget(); preparationTreeWidget();
threadPreparation = new QThread(); threadPreparation = new QThread();
taskTreePreparation = new TaskAMMFIMTreePreparation(type); taskTreePreparation = new TaskAMMFIMTreePreparation(type, treeWidget);
taskTreePreparation->moveToThread(threadPreparation); taskTreePreparation->moveToThread(threadPreparation);
threadPreparation->start(); threadPreparation->start();
threadPreparation->setPriority(QThread::HighestPriority); threadPreparation->setPriority(QThread::HighestPriority);

View File

@@ -152,8 +152,8 @@ void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode)
{ {
QList<SubProc> list = connectorToServer->getListSubProcForDMCode(dmCode); QList<SubProc> list = connectorToServer->getListSubProcForDMCode(dmCode);
if(!list.count()) /*if(!list.count())
on_btnAssign_clicked(); on_btnAssign_clicked();*/
for(SubProc subProc : list) for(SubProc subProc : list)
{ {
@@ -177,12 +177,12 @@ void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode)
item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Unchecked); item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Unchecked);
item->setFlags(item->flags() ^ Qt::ItemIsEnabled); //item->setFlags(item->flags() ^ Qt::ItemIsEnabled);
#ifdef PROJECT_TYPE_DEBUG #ifdef PROJECT_TYPE_DEBUG
treeWidget->addTopLevelItem(item); treeWidget->addTopLevelItem(item);
#else #else
item->setFlags(item->flags() ^ Qt::ItemIsEnabled);
#endif #endif
} }
} }

View File

@@ -0,0 +1,40 @@
#include "subprocitemwidget.h"
#include "ui_subprocitemwidget.h"
SubProcItemWidget::SubProcItemWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SubProcItemWidget)
{
ui->setupUi(this);
}
SubProcItemWidget::~SubProcItemWidget()
{
delete ui;
}
void SubProcItemWidget::setListSubProc(const QList<SubProc> &list)
{
int totalHeight = 0;
for (SubProc subProc : list)
{/*Подпроцедуры*/
ui->listWidget->addItem(QString("* %1\n [%2]").arg(subProc.getTitle(), subProc.getDmCode()));
//Делаем item невыделяемым
QListWidgetItem* item = ui->listWidget->item(ui->listWidget->count() - 1);
item->setFlags(item->flags() ^ Qt::ItemIsSelectable);
}
//Определяем минимальную высоту списка
for(int row = 0; row < ui->listWidget->count(); ++row)
{
totalHeight += ui->listWidget->sizeHintForRow(row); // Высота каждой строки
totalHeight += 10;
}
// Добавляем отступы фрейма (рамки)
totalHeight += ui->listWidget->frameWidth() * 2;
ui->listWidget->setMaximumHeight(totalHeight);
}

View File

@@ -0,0 +1,25 @@
#ifndef SUBPROCITEMWIDGET_H
#define SUBPROCITEMWIDGET_H
#include <QWidget>
#include "module.h"
namespace Ui {
class SubProcItemWidget;
}
class SubProcItemWidget : public QWidget
{
Q_OBJECT
public:
explicit SubProcItemWidget(QWidget *parent = nullptr);
~SubProcItemWidget();
void setListSubProc(const QList<SubProc>& list);
private:
Ui::SubProcItemWidget *ui;
};
#endif // SUBPROCITEMWIDGET_H

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SubProcItemWidget</class>
<widget class="QWidget" name="SubProcItemWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_Main">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Subprocedures allowed to be run by the trainee in automatic mode:</string>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="listWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -1,12 +1,16 @@
#include <QThread> #include <QThread>
#include <QDebug> #include <QDebug>
#include "tasktreepreparation.h" #include "tasktreepreparation.h"
#include "subprocitemwidget.h"
#include <QLineEdit>
TaskAMMFIMTreePreparation::TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QObject *parent) : TaskAMMFIMTreePreparation::TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QTreeWidget* treeWidget, QObject *parent) :
QObject(parent), QObject(parent),
flagStop(false), flagStop(false),
type(type) type(type),
treeWidget(treeWidget)
{ {
qDebug() << "TaskAMMFIMTreePreparation init thread ID " << QThread::currentThreadId(); qDebug() << "TaskAMMFIMTreePreparation init thread ID " << QThread::currentThreadId();
} }
@@ -477,6 +481,9 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QList<TaskAmm
listItemsAll.clear(); listItemsAll.clear();
//Обновление дерева
treeWidget->clear();
mtxAccess.lock(); mtxAccess.lock();
this->listTasksAMM = listTasks; this->listTasksAMM = listTasks;
@@ -491,6 +498,9 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QList<TaskAmm
QString status = task.status; QString status = task.status;
item = new QTreeWidgetItem(); item = new QTreeWidgetItem();
treeWidget->addTopLevelItem(item);
item->setIcon(0, QIcon(":/resources/icons/procedure.png")); item->setIcon(0, QIcon(":/resources/icons/procedure.png"));
item->setText(ColumnsTreeAMM::clmnAMM_PMorDM, text); item->setText(ColumnsTreeAMM::clmnAMM_PMorDM, text);
@@ -520,26 +530,22 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QList<TaskAmm
item->setToolTip(0, text); item->setToolTip(0, text);
if(type == TypeListTreeAMMFIM::listForTrainee) if(type == TypeListTreeAMMFIM::listForTrainee)
{ {
for (int j = 0; j < task.listSubProc.count(); j++) //Подпроцедуры
{/*Подпроцедуры*/ if(task.listSubProc.count())
SubProc subProc = task.listSubProc.at(j); {
QTreeWidgetItem* itemSubProc = new QTreeWidgetItem(); QTreeWidgetItem* itemSubProc = new QTreeWidgetItem();
itemSubProc->setFlags(itemSubProc->flags() ^ Qt::ItemIsSelectable);
itemSubProc->setText(ColumnsTreeAMM::clmnAMM_PMorDM, subProc.getTitle()); SubProcItemWidget* itemWidget = new SubProcItemWidget();
itemWidget->setListSubProc(task.listSubProc);
itemSubProc->setIcon(ColumnsTreeAMM::clmnAMM_PMorDM, QIcon(":/resources/icons/link.png")); //itemWidget->setAutoFillBackground(true);
itemSubProc->setToolTip(ColumnsTreeAMM::clmnAMM_PMorDM, subProc.getTitle());
itemSubProc->setText(ColumnsTreeAMM::clmnAMM_code, subProc.getDmCode());
itemSubProc->setText(ColumnsTreeAMM::clmnAMM_canplay, subProc.getModeListStr());
item->addChild(itemSubProc); item->addChild(itemSubProc);
treeWidget->setItemWidget(itemSubProc, 0, itemWidget);
} }
} }
listItemsAll.append(item); listItemsAll.append(item);

View File

@@ -36,7 +36,7 @@ class TaskAMMFIMTreePreparation : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QObject *parent = nullptr); explicit TaskAMMFIMTreePreparation(TypeListTreeAMMFIM type, QTreeWidget* treeWidget, QObject *parent = nullptr);
~TaskAMMFIMTreePreparation(); ~TaskAMMFIMTreePreparation();
public: public:
@@ -83,6 +83,8 @@ private:
QMutex mtxAccess; QMutex mtxAccess;
int countItems = 0; int countItems = 0;
QTreeWidget* treeWidget;
}; };
#endif // TASKTREEPREPARATION_H #endif // TASKTREEPREPARATION_H

View File

@@ -34,55 +34,55 @@
<translation>Удалить</translation> <translation>Удалить</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="129"/> <location filename="../tasks/ammtaskswidget.cpp" line="131"/>
<source>actual</source> <source>actual</source>
<translation>актуально</translation> <translation>актуально</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="135"/> <location filename="../tasks/ammtaskswidget.cpp" line="137"/>
<source>update required</source> <source>update required</source>
<translation>требуется обновление</translation> <translation>требуется обновление</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="346"/> <location filename="../tasks/ammtaskswidget.cpp" line="351"/>
<location filename="../tasks/ammtaskswidget.cpp" line="348"/> <location filename="../tasks/ammtaskswidget.cpp" line="353"/>
<source>DM code</source> <source>DM code</source>
<translation>DM код</translation> <translation>DM код</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="346"/> <location filename="../tasks/ammtaskswidget.cpp" line="351"/>
<location filename="../tasks/ammtaskswidget.cpp" line="348"/> <location filename="../tasks/ammtaskswidget.cpp" line="353"/>
<source>ID</source> <source>ID</source>
<translation>ID</translation> <translation>ID</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="346"/> <location filename="../tasks/ammtaskswidget.cpp" line="351"/>
<location filename="../tasks/ammtaskswidget.cpp" line="348"/> <location filename="../tasks/ammtaskswidget.cpp" line="353"/>
<source>Procedure AMM</source> <source>Procedure AMM</source>
<translation>Процедура AMM</translation> <translation>Процедура AMM</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="346"/> <location filename="../tasks/ammtaskswidget.cpp" line="351"/>
<location filename="../tasks/ammtaskswidget.cpp" line="348"/> <location filename="../tasks/ammtaskswidget.cpp" line="353"/>
<source>Canplay</source> <source>Canplay</source>
<translation>Режимы</translation> <translation>Режимы</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.ui" line="144"/> <location filename="../tasks/ammtaskswidget.ui" line="144"/>
<location filename="../tasks/ammtaskswidget.cpp" line="346"/> <location filename="../tasks/ammtaskswidget.cpp" line="351"/>
<location filename="../tasks/ammtaskswidget.cpp" line="348"/> <location filename="../tasks/ammtaskswidget.cpp" line="353"/>
<source>Status</source> <source>Status</source>
<translation>Статус</translation> <translation>Статус</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="475"/> <location filename="../tasks/ammtaskswidget.cpp" line="480"/>
<source>The deletion will be irrevocable. <source>The deletion will be irrevocable.
Delete it anyway?</source> Delete it anyway?</source>
<translation>Удаление будет безвозвратным. <translation>Удаление будет безвозвратным.
Всё равно удалить?</translation> Всё равно удалить?</translation>
</message> </message>
<message> <message>
<location filename="../tasks/ammtaskswidget.cpp" line="411"/> <location filename="../tasks/ammtaskswidget.cpp" line="416"/>
<source>Assign this task?</source> <source>Assign this task?</source>
<translation>Назначить эту задачу?</translation> <translation>Назначить эту задачу?</translation>
</message> </message>
@@ -1199,33 +1199,46 @@ Delete it anyway?</source>
<translation>Хорошо</translation> <translation>Хорошо</translation>
</message> </message>
</context> </context>
<context>
<name>SubProcItemWidget</name>
<message>
<location filename="../tasks/subprocitemwidget.ui" line="20"/>
<source>Form</source>
<translation>Форма</translation>
</message>
<message>
<location filename="../tasks/subprocitemwidget.ui" line="28"/>
<source>Subprocedures allowed to be run by the trainee in automatic mode:</source>
<translation>Подпроцедуры, которые разрешено выполнять обучаемому в автоматическом режиме:</translation>
</message>
</context>
<context> <context>
<name>TaskAMMFIMTreePreparation</name> <name>TaskAMMFIMTreePreparation</name>
<message> <message>
<location filename="../tasks/tasktreepreparation.cpp" line="502"/> <location filename="../tasks/tasktreepreparation.cpp" line="512"/>
<location filename="../tasks/tasktreepreparation.cpp" line="576"/> <location filename="../tasks/tasktreepreparation.cpp" line="582"/>
<location filename="../tasks/tasktreepreparation.cpp" line="667"/> <location filename="../tasks/tasktreepreparation.cpp" line="673"/>
<source>completed</source> <source>completed</source>
<translation>выполнена</translation> <translation>выполнена</translation>
</message> </message>
<message> <message>
<location filename="../tasks/tasktreepreparation.cpp" line="507"/> <location filename="../tasks/tasktreepreparation.cpp" line="517"/>
<location filename="../tasks/tasktreepreparation.cpp" line="581"/> <location filename="../tasks/tasktreepreparation.cpp" line="587"/>
<location filename="../tasks/tasktreepreparation.cpp" line="672"/> <location filename="../tasks/tasktreepreparation.cpp" line="678"/>
<source>failed</source> <source>failed</source>
<translation>неверно</translation> <translation>неверно</translation>
</message> </message>
<message> <message>
<location filename="../tasks/tasktreepreparation.cpp" line="512"/> <location filename="../tasks/tasktreepreparation.cpp" line="522"/>
<location filename="../tasks/tasktreepreparation.cpp" line="586"/> <location filename="../tasks/tasktreepreparation.cpp" line="592"/>
<location filename="../tasks/tasktreepreparation.cpp" line="677"/> <location filename="../tasks/tasktreepreparation.cpp" line="683"/>
<source>checkup</source> <source>checkup</source>
<translation>на проверке</translation> <translation>на проверке</translation>
</message> </message>
<message> <message>
<location filename="../tasks/tasktreepreparation.cpp" line="517"/> <location filename="../tasks/tasktreepreparation.cpp" line="527"/>
<location filename="../tasks/tasktreepreparation.cpp" line="591"/> <location filename="../tasks/tasktreepreparation.cpp" line="597"/>
<location filename="../tasks/tasktreepreparation.cpp" line="682"/> <location filename="../tasks/tasktreepreparation.cpp" line="688"/>
<source>new</source> <source>new</source>
<translation>новая</translation> <translation>новая</translation>
</message> </message>