diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index f4c4d9d..e2137ae 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -50,6 +50,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre connect(taskTreePreparation, &TaskAMMFIMTreePreparation::signal_listAMMItemsReady, this, &AMMtasksWidget::slot_AMMlistItemsReady); connect(this, &AMMtasksWidget::signal_stopParserPreparation, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_stopParserPreparation); + connect(this->connectorToServer, &ConnectorToServer::signal_UpdateSubProcForDMCode, this, &AMMtasksWidget::slot_UpdateSubProcForDMCode); + waitAnimationWidget = new WaitAnimationWidget; QMovie *movie = new QMovie(":/resources/icons/762.gif"); waitAnimationWidget->setParent(this); @@ -68,12 +70,6 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre 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->btnCheck->setVisible(false); } @@ -85,12 +81,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTre ui->label_DocsActualed->setVisible(false); ui->label_Actual->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() @@ -306,6 +297,58 @@ void AMMtasksWidget::slot_AMMlistItemsReady(QList listItems) ui->btnOnlyActive->setEnabled(true); } +void AMMtasksWidget::slot_UpdateSubProcForDMCode(QString dmCode) +{ + if(lastSelectedTask.ammProcedure.dmCode == dmCode) + {//Его ждем + QList 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() { treeWidget->setColumnCount(clmnAMM_count); @@ -409,46 +452,24 @@ void AMMtasksWidget::assignTaskAMMtoTrainee() if(taskNew.getID()) { - //QList 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* listSubProc) { - bool result = false; + lastSelectedTask = taskNew; - dlgListSubProc = new DialogListSubProc(connectorToServer, this); - dlgListSubProc->setTask(&taskNew); + waitAnimationWidget->showWithPlay(); - switch( dlgListSubProc->exec() ) + if(! connectorToServer->sendQueryListSubProc(lastSelectedTask.ammProcedure.dmCode)) { - case QDialog::Accepted: - { - //Здесь нужно забрать список отмеченных подпроцедур - result = dlgListSubProc->getListCheckedSubProc(listSubProc); - break; - } - case QDialog::Rejected: - break; - default: - break; + waitAnimationWidget->hideWithStop(); + return false; } - if(dlgListSubProc) - { - delete dlgListSubProc; - dlgListSubProc = nullptr; - } - - return result; + return true; } void AMMtasksWidget::setCurrentTask(int id) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index be4bb2f..fec33b6 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -79,6 +79,8 @@ Q_SIGNALS: public Q_SLOTS: void slot_AMMlistItemsReady(QList listItems); +public slots: + void slot_UpdateSubProcForDMCode(QString dmCode); private: Ui::AMMtasksWidget *ui; @@ -100,6 +102,12 @@ private: bool flOnlyActive; //AMM int lastCurrentID; + + TaskAmmFim lastSelectedTask; + + CustomDelegate* delegate; + + QStyle* style; }; #endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/customdelegate.cpp b/InstructorsAndTrainees/tasks/customdelegate.cpp new file mode 100644 index 0000000..0d48db3 --- /dev/null +++ b/InstructorsAndTrainees/tasks/customdelegate.cpp @@ -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); +} diff --git a/InstructorsAndTrainees/tasks/customdelegate.h b/InstructorsAndTrainees/tasks/customdelegate.h new file mode 100644 index 0000000..7c63e13 --- /dev/null +++ b/InstructorsAndTrainees/tasks/customdelegate.h @@ -0,0 +1,31 @@ +#ifndef CUSTOMDELEGATE_H +#define CUSTOMDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include + +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 diff --git a/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp b/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp index 4c9ec42..d9ee0ec 100644 --- a/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp +++ b/InstructorsAndTrainees/tasks/dialoglistsubproc.cpp @@ -1,7 +1,7 @@ #include #include "dialoglistsubproc.h" -DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) : +DialogListSubProc::DialogListSubProc(QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowMaximizeButtonHint @@ -9,7 +9,7 @@ DialogListSubProc::DialogListSubProc(ConnectorToServer* connectorToServer, QWidg | Qt::WindowCloseButtonHint), listSubProcCtrl(nullptr) { - listSubProcCtrl = new ListSubProc(connectorToServer, this); + listSubProcCtrl = new ListSubProc(this); connect(listSubProcCtrl, &ListSubProc::signal_Accepted, this, &DialogListSubProc::slot_Accepted); QHBoxLayout *layout = new QHBoxLayout(this); diff --git a/InstructorsAndTrainees/tasks/dialoglistsubproc.h b/InstructorsAndTrainees/tasks/dialoglistsubproc.h index 4951108..57e0941 100644 --- a/InstructorsAndTrainees/tasks/dialoglistsubproc.h +++ b/InstructorsAndTrainees/tasks/dialoglistsubproc.h @@ -11,7 +11,7 @@ class DialogListSubProc : public QDialog { Q_OBJECT public: - DialogListSubProc(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + DialogListSubProc(QWidget *parent = nullptr); ~DialogListSubProc(); void closeEvent(QCloseEvent *event) override; diff --git a/InstructorsAndTrainees/tasks/listsubproc.cpp b/InstructorsAndTrainees/tasks/listsubproc.cpp index e26be0d..e627391 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.cpp +++ b/InstructorsAndTrainees/tasks/listsubproc.cpp @@ -2,11 +2,9 @@ #include "listsubproc.h" #include "ui_listsubproc.h" -ListSubProc::ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) : +ListSubProc::ListSubProc(QWidget *parent) : QWidget(parent), ui(new Ui::ListSubProc), - connectorToServer(connectorToServer), - waitAnimationWidget(nullptr), treeWidget(nullptr) { ui->setupUi(this); @@ -17,19 +15,10 @@ ListSubProc::ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent) ui->horizontalLayout_Tree->addWidget(treeWidget); 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() { - waitAnimationWidget->hideWithStop(); - delete waitAnimationWidget; delete treeWidget; delete ui; } @@ -42,9 +31,6 @@ void ListSubProc::closeEvent(QCloseEvent *event) void ListSubProc::resizeEvent(QResizeEvent *event) { setWidthColumnsTree(); - - QSize size = event->size(); - waitAnimationWidget->resize(size); } void ListSubProc::changeEvent(QEvent *event) @@ -65,10 +51,39 @@ void ListSubProc::setTask(TaskAmmFim *task) ui->lbl_Title->setText(task->ammProcedure.title); ui->lbl_DMCode->setText(task->ammProcedure.dmCode); - waitAnimationWidget->showWithPlay(); + QList list = task->listSubProc; - if(! connectorToServer->sendQueryListSubProc(this->task.ammProcedure.dmCode)) - waitAnimationWidget->hideWithStop(); + 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 + } + } } bool ListSubProc::getListCheckedSubProc(QList* listSubProc) @@ -146,51 +161,6 @@ int ListSubProc::calculateWidth_0Column() return width0Column; } -void ListSubProc::slot_UpdateSubProcForDMCode(QString dmCode) -{ - if(this->task.ammProcedure.dmCode == dmCode) - { - QList 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() { emit signal_Accepted(); diff --git a/InstructorsAndTrainees/tasks/listsubproc.h b/InstructorsAndTrainees/tasks/listsubproc.h index e78b684..0b43e5e 100644 --- a/InstructorsAndTrainees/tasks/listsubproc.h +++ b/InstructorsAndTrainees/tasks/listsubproc.h @@ -22,7 +22,7 @@ class ListSubProc : public QWidget Q_OBJECT public: - explicit ListSubProc(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + explicit ListSubProc(QWidget *parent = nullptr); ~ListSubProc(); void closeEvent(QCloseEvent *event) override; @@ -38,9 +38,6 @@ private: void setWidthColumnsTree(); int calculateWidth_0Column(); -public slots: - void slot_UpdateSubProcForDMCode(QString dmCode); - private slots: void on_btnAssign_clicked(); @@ -50,12 +47,8 @@ signals: private: Ui::ListSubProc *ui; - ConnectorToServer* connectorToServer; - TaskAmmFim task; - WaitAnimationWidget *waitAnimationWidget; - QTreeWidget* treeWidget; QList listWidthColumn; }; diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.cpp b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp index 9e191b1..4569bc2 100644 --- a/InstructorsAndTrainees/tasks/subprocitemwidget.cpp +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.cpp @@ -19,7 +19,7 @@ void SubProcItemWidget::setListSubProc(const QList &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 невыделяемым QListWidgetItem* item = ui->listWidget->item(ui->listWidget->count() - 1); diff --git a/InstructorsAndTrainees/tasks/subprocitemwidget.ui b/InstructorsAndTrainees/tasks/subprocitemwidget.ui index 6dd1583..827d0fb 100644 --- a/InstructorsAndTrainees/tasks/subprocitemwidget.ui +++ b/InstructorsAndTrainees/tasks/subprocitemwidget.ui @@ -6,7 +6,7 @@ 0 0 - 400 + 700 300 diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index b6943bd..cc6040b 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -497,10 +497,14 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListsetData(0, UserRole_MergeCell, false); treeWidget->addTopLevelItem(item); + //treeWidget->setFirstItemColumnSpanned(item, true); + item->setIcon(0, QIcon(":/resources/icons/procedure.png")); item->setText(ColumnsTreeAMM::clmnAMM_PMorDM, text); @@ -543,9 +547,13 @@ void TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee(QListsetListSubProc(task.listSubProc); //itemWidget->setAutoFillBackground(true); + //itemSubProc->setData(0, UserRole_MergeCell, true); + item->addChild(itemSubProc); treeWidget->setItemWidget(itemSubProc, 0, itemWidget); - } + + itemSubProc->setFirstColumnSpanned(true); + } } listItemsAll.append(item);