Объединенные ячейки списка

This commit is contained in:
2025-11-22 22:08:03 +03:00
parent 5bb9816593
commit 394eee5a16
11 changed files with 190 additions and 118 deletions

View File

@@ -50,6 +50,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre
connect(taskTreePreparation, &TaskAMMFIMTreePreparation::signal_listAMMItemsReady, this, &AMMtasksWidget::slot_AMMlistItemsReady); connect(taskTreePreparation, &TaskAMMFIMTreePreparation::signal_listAMMItemsReady, this, &AMMtasksWidget::slot_AMMlistItemsReady);
connect(this, &AMMtasksWidget::signal_stopParserPreparation, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_stopParserPreparation); connect(this, &AMMtasksWidget::signal_stopParserPreparation, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_stopParserPreparation);
connect(this->connectorToServer, &ConnectorToServer::signal_UpdateSubProcForDMCode, this, &AMMtasksWidget::slot_UpdateSubProcForDMCode);
waitAnimationWidget = new WaitAnimationWidget; waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif"); QMovie *movie = new QMovie(":/resources/icons/762.gif");
waitAnimationWidget->setParent(this); waitAnimationWidget->setParent(this);
@@ -68,12 +70,6 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre
if(type == TypeListTreeAMMFIM::listCommon) if(type == TypeListTreeAMMFIM::listCommon)
{ {
//ui->horizontalLayout_3->addWidget(ui->btnAssignTask);
//ui->horizontalLayout_3->addWidget(ui->btnOnlyActive);
//ui->horizontalLayout_3->addWidget(ui->btnCheck);
//ui->horizontalLayout_3->addWidget(ui->btnDelete);
//ui->horizontalLayout_3->setAlignment(Qt::AlignmentFlag::AlignLeft);
ui->btnDelete->setVisible(false); ui->btnDelete->setVisible(false);
ui->btnCheck->setVisible(false); ui->btnCheck->setVisible(false);
} }
@@ -85,12 +81,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre
ui->label_DocsActualed->setVisible(false); ui->label_DocsActualed->setVisible(false);
ui->label_Actual->setVisible(false); ui->label_Actual->setVisible(false);
ui->btnDocsUpdating->setVisible(false); ui->btnDocsUpdating->setVisible(false);
//ui->verticalLayout->setAlignment(Qt::AlignmentFlag::AlignBottom);
//ui->horizontalLayout_3->setAlignment(Qt::AlignmentFlag::AlignLeft);
} }
//ui->btnCheck->setVisible(false);
} }
AMMtasksWidget::~AMMtasksWidget() AMMtasksWidget::~AMMtasksWidget()
@@ -306,6 +297,58 @@ void AMMtasksWidget::slot_AMMlistItemsReady(QList<QTreeWidgetItem *> listItems)
ui->btnOnlyActive->setEnabled(true); ui->btnOnlyActive->setEnabled(true);
} }
void AMMtasksWidget::slot_UpdateSubProcForDMCode(QString dmCode)
{
if(lastSelectedTask.ammProcedure.dmCode == dmCode)
{//Его ждем
QList<SubProc> list = connectorToServer->getListSubProcForDMCode(dmCode);
lastSelectedTask.listSubProc = list;
waitAnimationWidget->hideWithStop();
if(lastSelectedTask.listSubProc.count())
{
dlgListSubProc = new DialogListSubProc(this);
dlgListSubProc->setTask(&lastSelectedTask);
switch( dlgListSubProc->exec() )
{
case QDialog::Accepted:
{
//Здесь нужно забрать список отмеченных подпроцедур
lastSelectedTask.listSubProc.clear();
dlgListSubProc->getListCheckedSubProc(&lastSelectedTask.listSubProc);
if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted)
{
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &lastSelectedTask);
}
break;
}
case QDialog::Rejected:
break;
default:
break;
}
if(dlgListSubProc)
{
delete dlgListSubProc;
dlgListSubProc = nullptr;
}
}
else
{
lastSelectedTask.listSubProc.clear();
if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted)
{
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &lastSelectedTask);
}
}
}
}
void AMMtasksWidget::preparationTreeWidget() void AMMtasksWidget::preparationTreeWidget()
{ {
treeWidget->setColumnCount(clmnAMM_count); treeWidget->setColumnCount(clmnAMM_count);
@@ -409,46 +452,24 @@ void AMMtasksWidget::assignTaskAMMtoTrainee()
if(taskNew.getID()) if(taskNew.getID())
{ {
//QList<SubProc> listSubProc;
if(selectSubProcForAssignTaskAMM(taskNew, &taskNew.listSubProc)) if(selectSubProcForAssignTaskAMM(taskNew, &taskNew.listSubProc))
{ {}
if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted)
{
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &taskNew);
}
}
} }
} }
bool AMMtasksWidget::selectSubProcForAssignTaskAMM(TaskAmmFim taskNew, QList<SubProc>* listSubProc) bool AMMtasksWidget::selectSubProcForAssignTaskAMM(TaskAmmFim taskNew, QList<SubProc>* listSubProc)
{ {
bool result = false; lastSelectedTask = taskNew;
dlgListSubProc = new DialogListSubProc(connectorToServer, this); waitAnimationWidget->showWithPlay();
dlgListSubProc->setTask(&taskNew);
switch( dlgListSubProc->exec() ) if(! connectorToServer->sendQueryListSubProc(lastSelectedTask.ammProcedure.dmCode))
{ {
case QDialog::Accepted: waitAnimationWidget->hideWithStop();
{ return false;
//Здесь нужно забрать список отмеченных подпроцедур
result = dlgListSubProc->getListCheckedSubProc(listSubProc);
break;
}
case QDialog::Rejected:
break;
default:
break;
} }
if(dlgListSubProc) return true;
{
delete dlgListSubProc;
dlgListSubProc = nullptr;
}
return result;
} }
void AMMtasksWidget::setCurrentTask(int id) void AMMtasksWidget::setCurrentTask(int id)

View File

@@ -79,6 +79,8 @@ Q_SIGNALS:
public Q_SLOTS: public Q_SLOTS:
void slot_AMMlistItemsReady(QList<QTreeWidgetItem*> listItems); void slot_AMMlistItemsReady(QList<QTreeWidgetItem*> listItems);
public slots:
void slot_UpdateSubProcForDMCode(QString dmCode);
private: private:
Ui::AMMtasksWidget *ui; Ui::AMMtasksWidget *ui;
@@ -100,6 +102,12 @@ private:
bool flOnlyActive; //AMM bool flOnlyActive; //AMM
int lastCurrentID; int lastCurrentID;
TaskAmmFim lastSelectedTask;
CustomDelegate* delegate;
QStyle* style;
}; };
#endif // AMMTASKSWIDGET_H #endif // AMMTASKSWIDGET_H

View File

@@ -0,0 +1,41 @@
#include "customdelegate.h"
CustomDelegate::CustomDelegate(QObject *parent):
QItemDelegate(parent)
{
}
void CustomDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
bool mergeCell = index.data(UserRole_MergeCell).toBool();
if (mergeCell && index.column() == 0)
{
QModelIndex nextColumnIndex = index.siblingAtColumn(index.column() + 1);
if (!nextColumnIndex.isValid())
{
QItemDelegate::paint(painter, option, index);
return;
}
QRect mergedRect(option.rect.x(),
option.rect.y(),
option.rect.width() * 2,
option.rect.height());
painter->save();
painter->setClipRect(mergedRect);
drawBackground(painter, option, index);
drawDisplay(painter, option, mergedRect, index.data(Qt::DisplayRole).toString());
painter->restore();
} else {
QItemDelegate::paint(painter, option, index);
}
}
QSize CustomDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
return QItemDelegate::sizeHint(option, index);
}

View File

@@ -0,0 +1,31 @@
#ifndef CUSTOMDELEGATE_H
#define CUSTOMDELEGATE_H
#include <QApplication>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QStyle>
#include <QItemDelegate>
enum UserRoles {
UserRole_MergeCell = Qt::UserRole + 1 // Пользовательская роль для хранения признака объединения
};
class CustomDelegate : public QItemDelegate
{
public:
//using QStyledItemDelegate::QStyledItemDelegate;
CustomDelegate(QObject *parent = nullptr);
void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
QSize sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
};
#endif // CUSTOMDELEGATE_H

View File

@@ -1,7 +1,7 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include "dialoglistsubproc.h" #include "dialoglistsubproc.h"
DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) : DialogListSubProc::DialogListSubProc(QWidget *parent) :
QDialog(parent, QDialog(parent,
Qt::WindowSystemMenuHint Qt::WindowSystemMenuHint
| Qt::WindowMaximizeButtonHint | Qt::WindowMaximizeButtonHint
@@ -9,7 +9,7 @@ DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidg
| Qt::WindowCloseButtonHint), | Qt::WindowCloseButtonHint),
listSubProcCtrl(nullptr) listSubProcCtrl(nullptr)
{ {
listSubProcCtrl = new ListSubProc(connectorToServer, this); listSubProcCtrl = new ListSubProc(this);
connect(listSubProcCtrl, &ListSubProc::signal_Accepted, this, &DialogListSubProc::slot_Accepted); connect(listSubProcCtrl, &ListSubProc::signal_Accepted, this, &DialogListSubProc::slot_Accepted);
QHBoxLayout *layout = new QHBoxLayout(this); QHBoxLayout *layout = new QHBoxLayout(this);

View File

@@ -11,7 +11,7 @@ class DialogListSubProc : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
DialogListSubProc(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); DialogListSubProc(QWidget *parent = nullptr);
~DialogListSubProc(); ~DialogListSubProc();
void closeEvent(QCloseEvent *event) override; void closeEvent(QCloseEvent *event) override;

View File

@@ -2,11 +2,9 @@
#include "listsubproc.h" #include "listsubproc.h"
#include "ui_listsubproc.h" #include "ui_listsubproc.h"
ListSubProc::ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) : ListSubProc::ListSubProc(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::ListSubProc), ui(new Ui::ListSubProc),
connectorToServer(connectorToServer),
waitAnimationWidget(nullptr),
treeWidget(nullptr) treeWidget(nullptr)
{ {
ui->setupUi(this); ui->setupUi(this);
@@ -17,19 +15,10 @@ ListSubProc::ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent)
ui->horizontalLayout_Tree->addWidget(treeWidget); ui->horizontalLayout_Tree->addWidget(treeWidget);
preparationTreeWidget(); preparationTreeWidget();
waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif");
waitAnimationWidget->setParent(this);
waitAnimationWidget->initialize(movie,this);
connect(this->connectorToServer, &ConnectorToServer::signal_UpdateSubProcForDMCode, this, &ListSubProc::slot_UpdateSubProcForDMCode);
} }
ListSubProc::~ListSubProc() ListSubProc::~ListSubProc()
{ {
waitAnimationWidget->hideWithStop();
delete waitAnimationWidget;
delete treeWidget; delete treeWidget;
delete ui; delete ui;
} }
@@ -42,9 +31,6 @@ void ListSubProc::closeEvent(QCloseEvent *event)
void ListSubProc::resizeEvent(QResizeEvent *event) void ListSubProc::resizeEvent(QResizeEvent *event)
{ {
setWidthColumnsTree(); setWidthColumnsTree();
QSize size = event->size();
waitAnimationWidget->resize(size);
} }
void ListSubProc::changeEvent(QEvent *event) void ListSubProc::changeEvent(QEvent *event)
@@ -65,10 +51,39 @@ void ListSubProc::setTask(TaskAmmFim *task)
ui->lbl_Title->setText(task->ammProcedure.title); ui->lbl_Title->setText(task->ammProcedure.title);
ui->lbl_DMCode->setText(task->ammProcedure.dmCode); ui->lbl_DMCode->setText(task->ammProcedure.dmCode);
waitAnimationWidget->showWithPlay(); QList<SubProc> list = task->listSubProc;
if(! connectorToServer->sendQueryListSubProc(this->task.ammProcedure.dmCode)) for(SubProc subProc : list)
waitAnimationWidget->hideWithStop(); {
QTreeWidgetItem* item = new QTreeWidgetItem(treeWidget);
//item->setIcon(0, QIcon(":/resources/icons/link.png"));
item->setText(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle());
item->setText(ColumnsTreeSubProc::clmnSP_code, subProc.getDmCode());
item->setText(ColumnsTreeSubProc::clmnSP_canplay, subProc.getModeListStr());
item->setToolTip(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle());
ModeList modeList = subProc.getModeList();
if(modeList.autoM && (modeList.demo || modeList.train || modeList.exam))
{
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Checked);
treeWidget->addTopLevelItem(item);
}
else
{
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Unchecked);
//item->setFlags(item->flags() ^ Qt::ItemIsEnabled);
#ifdef PROJECT_TYPE_DEBUG
treeWidget->addTopLevelItem(item);
#else
item->setFlags(item->flags() ^ Qt::ItemIsEnabled);
#endif
}
}
} }
bool ListSubProc::getListCheckedSubProc(QList<SubProc>* listSubProc) bool ListSubProc::getListCheckedSubProc(QList<SubProc>* listSubProc)
@@ -146,51 +161,6 @@ int ListSubProc::calculateWidth_0Column()
return width0Column; return width0Column;
} }
void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode)
{
if(this->task.ammProcedure.dmCode == dmCode)
{
QList<SubProc> list = connectorToServer->getListSubProcForDMCode(dmCode);
/*if(!list.count())
on_btnAssign_clicked();*/
for(SubProc subProc : list)
{
QTreeWidgetItem* item = new QTreeWidgetItem(treeWidget);
//item->setIcon(0, QIcon(":/resources/icons/link.png"));
item->setText(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle());
item->setText(ColumnsTreeSubProc::clmnSP_code, subProc.getDmCode());
item->setText(ColumnsTreeSubProc::clmnSP_canplay, subProc.getModeListStr());
item->setToolTip(ColumnsTreeSubProc::clmnSP_title, subProc.getTitle());
ModeList modeList = subProc.getModeList();
if(modeList.autoM && (modeList.demo || modeList.train || modeList.exam))
{
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Checked);
treeWidget->addTopLevelItem(item);
}
else
{
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(ColumnsTreeSubProc::clmnSP_title, Qt::Unchecked);
//item->setFlags(item->flags() ^ Qt::ItemIsEnabled);
#ifdef PROJECT_TYPE_DEBUG
treeWidget->addTopLevelItem(item);
#else
item->setFlags(item->flags() ^ Qt::ItemIsEnabled);
#endif
}
}
waitAnimationWidget->hideWithStop();
}
}
void ListSubProc::on_btnAssign_clicked() void ListSubProc::on_btnAssign_clicked()
{ {
emit signal_Accepted(); emit signal_Accepted();

View File

@@ -22,7 +22,7 @@ class ListSubProc : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); explicit ListSubProc(QWidget *parent = nullptr);
~ListSubProc(); ~ListSubProc();
void closeEvent(QCloseEvent *event) override; void closeEvent(QCloseEvent *event) override;
@@ -38,9 +38,6 @@ private:
void setWidthColumnsTree(); void setWidthColumnsTree();
int calculateWidth_0Column(); int calculateWidth_0Column();
public slots:
void slot_UpdateSubProcForDMCode(QString dmCode);
private slots: private slots:
void on_btnAssign_clicked(); void on_btnAssign_clicked();
@@ -50,12 +47,8 @@ signals:
private: private:
Ui::ListSubProc *ui; Ui::ListSubProc *ui;
ConnectorToServer* connectorToServer;
TaskAmmFim task; TaskAmmFim task;
WaitAnimationWidget *waitAnimationWidget;
QTreeWidget* treeWidget; QTreeWidget* treeWidget;
QList<int> listWidthColumn; QList<int> listWidthColumn;
}; };

View File

@@ -19,7 +19,7 @@ void SubProcItemWidget::setListSubProc(const QList<SubProc> &list)
for (SubProc subProc : list) for (SubProc subProc : list)
{/*Подпроцедуры*/ {/*Подпроцедуры*/
ui->listWidget->addItem(QString("* %1\n [%2]").arg(subProc.getTitle(), subProc.getDmCode())); ui->listWidget->addItem(QString("- %1 [%2]").arg(subProc.getTitle(), subProc.getDmCode()));
//Делаем item невыделяемым //Делаем item невыделяемым
QListWidgetItem* item = ui->listWidget->item(ui->listWidget->count() - 1); QListWidgetItem* item = ui->listWidget->item(ui->listWidget->count() - 1);

View File

@@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>700</width>
<height>300</height> <height>300</height>
</rect> </rect>
</property> </property>

View File

@@ -497,10 +497,14 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QList<TaskAmm
QString code = task.ammProcedure.dmCode; QString code = task.ammProcedure.dmCode;
QString status = task.status; QString status = task.status;
item = new QTreeWidgetItem(); item = new QTreeWidgetItem(treeWidget);
//item->setData(0, UserRole_MergeCell, false);
treeWidget->addTopLevelItem(item); treeWidget->addTopLevelItem(item);
//treeWidget->setFirstItemColumnSpanned(item, true);
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);
@@ -543,9 +547,13 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QList<TaskAmm
itemWidget->setListSubProc(task.listSubProc); itemWidget->setListSubProc(task.listSubProc);
//itemWidget->setAutoFillBackground(true); //itemWidget->setAutoFillBackground(true);
//itemSubProc->setData(0, UserRole_MergeCell, true);
item->addChild(itemSubProc); item->addChild(itemSubProc);
treeWidget->setItemWidget(itemSubProc, 0, itemWidget); treeWidget->setItemWidget(itemSubProc, 0, itemWidget);
}
itemSubProc->setFirstColumnSpanned(true);
}
} }
listItemsAll.append(item); listItemsAll.append(item);