#include #include #include #include #include #include #include #include "ammtaskswidget.h" #include "ui_ammtaskswidget.h" #include "checkertask.h" #include "specialmessagebox.h" AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTreeAMMFIM type, QWidget *parent) : QWidget(parent), ui(new Ui::AMMtasksWidget), connectorToServer(connectorToServer), treeWidget(nullptr), type(type), idTraineeSelected(0), threadPreparation(nullptr), taskTreePreparation(nullptr), waitAnimationWidget(nullptr), dlgCheckerTask(nullptr), flOnlyActive(false) { ui->setupUi(this); qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); treeWidget = new QTreeWidget(); ui->horizontalLayout_Tree->addWidget(treeWidget); connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidgetCurrentItemChanged); preparationTreeWidget(); threadPreparation = new QThread(); taskTreePreparation = new TaskAMMFIMTreePreparation(type); taskTreePreparation->moveToThread(threadPreparation); threadPreparation->start(); threadPreparation->setPriority(QThread::HighestPriority); connect(this, &AMMtasksWidget::signal_prepareAMMListItems, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItems); connect(this, &AMMtasksWidget::signal_prepareAMMListItemsForTrainee, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee); connect(taskTreePreparation, &TaskAMMFIMTreePreparation::signal_listAMMItemsReady, this, &AMMtasksWidget::slot_AMMlistItemsReady); connect(this, &AMMtasksWidget::signal_stopParserPreparation, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_stopParserPreparation); waitAnimationWidget = new WaitAnimationWidget; QMovie *movie = new QMovie(":/resources/icons/762.gif"); waitAnimationWidget->setParent(this); waitAnimationWidget->initialize(movie,this); ui->btnDelete->setObjectName("btnDelete"); ui->btnDelete->setEnabled(false); ui->btnCheck->setObjectName("btnCheck"); ui->btnCheck->setEnabled(false); ui->btnOnlyActive->setObjectName("btnOnlyActive"); ui->btnOnlyActive->setEnabled(false); ui->btnAssignTask->setObjectName("btnAssignTask"); ui->btnAssignTask->setEnabled(false); 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); } else { ui->btnOnlyActive->setVisible(false); ui->btnAssignTask->setVisible(false); //ui->verticalLayout->setAlignment(Qt::AlignmentFlag::AlignBottom); //ui->horizontalLayout_3->setAlignment(Qt::AlignmentFlag::AlignLeft); } //ui->btnCheck->setVisible(false); } AMMtasksWidget::~AMMtasksWidget() { waitAnimationWidget->hideWithStop(); emit signal_stopParserPreparation(); threadPreparation->quit(); threadPreparation->wait(); delete threadPreparation; delete taskTreePreparation; delete waitAnimationWidget; delete treeWidget; delete ui; } void AMMtasksWidget::deactivate() { ui->btnAssignTask->setEnabled(false); ui->btnOnlyActive->setEnabled(false); treeWidget->clear(); idTraineeSelected = 0; } void AMMtasksWidget::waitAnimationWidgetShowWithPlay() { waitAnimationWidget->showWithPlay(); } void AMMtasksWidget::resizeEvent(QResizeEvent *event) { setWidthColumnsTree(); QSize size = event->size(); waitAnimationWidget->resize(size); } void AMMtasksWidget::closeDlgCheckTask() { if(dlgCheckerTask) dlgCheckerTask->close(); } void AMMtasksWidget::changeEvent(QEvent *event) { // В случае получения события изменения языка приложения if (event->type() == QEvent::LanguageChange) {// переведём окно заново ui->retranslateUi(this); reSetHeadTreeWidget(); if(type == TypeListTreeAMMFIM::listCommon) { //slot_NeedUpdateUI(); } else if(type == TypeListTreeAMMFIM::listForTrainee) if(idTraineeSelected) slot_UpdateTasksAMMforTrainee(idTraineeSelected); } } void AMMtasksWidget::on_treeWidgetCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) { ui->btnDelete->setEnabled(false); ui->btnCheck->setEnabled(false); return; } else { ui->btnCheck->setEnabled(true); ui->btnDelete->setEnabled(true); } int id = current->text(ColumnsTreeAMM::clmnAMM_ID).toInt(); if(taskTreePreparation->getTypeModuleAMMbyID(id) == ModuleType::TYPE_PM) ui->btnAssignTask->setEnabled(false); else ui->btnAssignTask->setEnabled(true); } void AMMtasksWidget::slot_NeedUpdateUI() { qDebug() << "AMMtasksWidget::slot_NeedUpdateUI thread ID " << QThread::currentThreadId(); loadTasksAMM(); } void AMMtasksWidget::slot_traineeSelected(int id_trainee) { qDebug() << "AMMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId(); idTraineeSelected = id_trainee; if(type == TypeListTreeAMMFIM::listForTrainee) { waitAnimationWidget->showWithPlay(); connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, idTraineeSelected); } } void AMMtasksWidget::slot_UpdateTasksAMMforTrainee(int trainee_id) { qDebug() << "slot_UpdateTasksAMMforTrainee" << QThread::currentThreadId(); if(type == TypeListTreeAMMFIM::listForTrainee) { if(idTraineeSelected == trainee_id) { QList listTask = connectorToServer->getListTasksAMMforTrainee(trainee_id); signal_prepareAMMListItemsForTrainee(listTask); emit signal_countTasksAMMforTraineeChanged(trainee_id, listTask.count()); } } } void AMMtasksWidget::loadTasksAMM(bool flRequestFirst) { //Обновление дерева treeWidget->clear(); waitAnimationWidget->showWithPlay(); QByteArray arrayAMM; //if(flRequestFirst) arrayAMM = connectorToServer->getListTaskAmmArray(); emit signal_prepareAMMListItems(arrayAMM, flOnlyActive, flRequestFirst); } void AMMtasksWidget::slot_AMMlistItemsReady(QList listItems) { //Обновление дерева treeWidget->clear(); for(QTreeWidgetItem * item : listItems) treeWidget->addTopLevelItem(item); QTreeWidgetItem * item = treeWidget->topLevelItem(0); if(item != nullptr) treeWidget->setCurrentItem(item); waitAnimationWidget->hideWithStop(); ui->btnOnlyActive->setEnabled(true); } void AMMtasksWidget::preparationTreeWidget() { treeWidget->setColumnCount(clmnAMM_count); reSetHeadTreeWidget(); if(type == TypeListTreeAMMFIM::listCommon) { treeWidget->setColumnHidden(ColumnsTreeAMM::clmnAMM_ID, true); treeWidget->setColumnHidden(ColumnsTreeAMM::clmnAMM_status, true); } else { #ifdef PROJECT_TYPE_DEBUG treeWidget->setColumnHidden(ColumnsTreeAMM::clmnAMM_ID, false); #else treeWidget->setColumnHidden(ColumnsTreeAMM::clmnAMM_ID, true); #endif } } void AMMtasksWidget::reSetHeadTreeWidget() { QStringList listHeaders; if(type == TypeListTreeAMMFIM::listForTrainee) listHeaders = QStringList{tr("Task AMM"), tr("DM code"), tr("Status"), tr("ID")}; else listHeaders = QStringList{tr("Task AMM"), tr("DM code"), tr("Status"), tr("ID")}; treeWidget->setHeaderLabels(listHeaders); } void AMMtasksWidget::setWidthColumnsTree() { listWidthColumn.clear(); treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_PMorDM, 100); listWidthColumn.append(100); treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_code, 250); listWidthColumn.append(250); treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_status, 130); listWidthColumn.append(130); treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_ID, 50); listWidthColumn.append(50); treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_PMorDM, calculateWidth_0Column()); } int AMMtasksWidget::calculateWidth_0Column() { int widthHeader = treeWidget->width() - 20; int width0Column = 0; int widthSB = 0; if(treeWidget->verticalScrollBar()->isVisible()) widthSB = treeWidget->verticalScrollBar()->size().width(); int cntColumns = treeWidget->columnCount(); int widthRightColumns = 0; for (int i = 1; i < cntColumns; i++) { if(! treeWidget->isColumnHidden(i)) {//Колонка не скрыта int w = listWidthColumn.at(i); widthRightColumns += w; } } width0Column = widthHeader - widthRightColumns - widthSB; return width0Column; } void AMMtasksWidget::assignTaskAMMtoTrainee() { QTreeWidgetItem *current = treeWidget->currentItem(); if(current == nullptr) return; int id = current->text(ColumnsTreeAMM::clmnAMM_ID).toInt(); TaskAmmFim taskNew = taskTreePreparation->getTaskAMMbyID(id); if(taskNew.getID()) { emit signal_AssignedTask(); connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, idTraineeSelected, &taskNew); } } void AMMtasksWidget::on_btnDelete_clicked() { QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem(); if(treeItemCurrent != nullptr) { QTreeWidgetItem *treeItemParent = treeItemCurrent->parent(); if(treeItemParent == nullptr) {//Выбрана задача int id = treeItemCurrent->text(ColumnsTreeAMM::clmnAMM_ID).toInt(); if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("The deletion will be irrevocable.\nDelete it anyway?")).exec() == QDialog::Accepted) { waitAnimationWidget->showWithPlay(); connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_TASK_AMM_TO_TRAINEE, id); } } } } void AMMtasksWidget::on_btnCheck_clicked() { QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem(); if(treeItemCurrent != nullptr) {//Выбрана задача int id = treeItemCurrent->text(ColumnsTreeAMM::clmnAMM_ID).toInt(); TaskAmmFim task = taskTreePreparation->getTaskAMMbyID(id); if(!task.getID()) return; dlgCheckerTask = new DialogChekerTask(connectorToServer, "amm", this); dlgCheckerTask->setTask(&task); dlgCheckerTask->exec(); if(dlgCheckerTask->getFlChanged()) waitAnimationWidget->showWithPlay(); if(dlgCheckerTask) { delete dlgCheckerTask; dlgCheckerTask = nullptr; } } } void AMMtasksWidget::on_btnAssignTask_clicked() { if(SpecialMessageBox(this, SpecialMessageBox::TypeSpecMsgBox::warningYesNo, tr("Assign this task?")).exec() == QDialog::Accepted) assignTaskAMMtoTrainee(); } void AMMtasksWidget::on_btnOnlyActive_clicked() { if(ui->btnOnlyActive->isChecked()) { flOnlyActive = true; } else { flOnlyActive = false; } loadTasksAMM(false); }