/** * @RDE_HEADER@ * ExerciseManangement - Operator Edit Dialog * $Id: exm_edit_dialog.h 41137 2018-04-20 08:50:55Z schroeder_m $ * $HeadURL: svn://slssvn/TDS/branches/product/devel/trunk/Lts/Plugins/ExerciseManagement/Gui/ExerciseEdit/exm_edit_dialog.h $ * $Author: schroeder_m $ * Created by Malte Schröder, SLSE, 2018-04-25 */ #include "exm_operator_edit.h" #include "ui_exm_operator_edit.h" #include #include namespace ExerciseManagement { ExerciseManagementOperatorEdit::ExerciseManagementOperatorEdit(const QString &menuGroup, QWidget *parent) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel) , m_ui(new Ui::ExerciseManagementOperatorEdit) , m_opmDtc(nullptr) , m_session(nullptr) , m_operatorModel(nullptr) , m_menuGroup(menuGroup) , m_exercise() , m_requestHelper(new LtsUtils::RequestHelper(this)) , m_logger(getLogger("ExerciseManagementOperatorEdit")) { m_ui->setupUi(this); #ifdef LTS_DEBUG m_ui->dvOperators->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_ui->dvOperators, &LtsDataView::LtsDataView::customContextMenuRequested, this, &ExerciseManagementOperatorEdit::onContextMenuRequested); #endif setOnlineHelpFilename(QStringLiteral("Situation-Operators")); } ExerciseManagementOperatorEdit::~ExerciseManagementOperatorEdit() { delete m_ui; } bool ExerciseManagementOperatorEdit::init(LtsSession::LtsSessionDataDds *session) { m_session = session; if (!m_session->getDtc(m_opmDtc)) return false; std::shared_ptr dtc; if (!m_session->getDtc(dtc)) return false; m_exercise = dtc->exercise(m_session->exerciseId()); m_operatorModel = new ExerciseOperatorModel(m_session, m_exercise.id(), this); m_ui->dvOperators->setModel(m_operatorModel); m_ui->dvOperators->seamless(); connect(m_operatorModel, &ExerciseOperatorModel::dataChanged, this, &ExerciseManagementOperatorEdit::slotChangesMade); return true; } void ExerciseManagementOperatorEdit::onContextMenuRequested(const QPoint &position) { QMenu menu(m_ui->dvOperators); menu.addAction(tr("Select All"), this, &ExerciseManagementOperatorEdit::onSelectAllUsers); menu.addAction(tr("Unselect All"), this, &ExerciseManagementOperatorEdit::onUnselectAllUsers); menu.exec(m_ui->dvOperators->mapToGlobal(position)); } void ExerciseManagementOperatorEdit::onSelectAllUsers() { m_operatorModel->selectAll(); m_operatorModel->update(); } void ExerciseManagementOperatorEdit::onUnselectAllUsers() { m_operatorModel->unselectAll(); m_operatorModel->update(); } void ExerciseManagementOperatorEdit::retranslate() { translate(m_ui, m_exercise, tr("Exercise Operators")); } bool ExerciseManagementOperatorEdit::apply() { if (m_exercise.id() > 0) { sendModifiedOperators(m_exercise.id()); return true; } return false; } template bool ExerciseManagementOperatorEdit::removeElement(std::vector &vec, T elem) { for (auto it = vec.begin(); it != vec.end(); ++it) { if (*it == elem) { vec.erase(it); return true; } } return false; } void ExerciseManagementOperatorEdit::sendModifiedOperators(int thisExerciseId) { std::shared_ptr opmFtc; if (!m_session->getFtc(opmFtc)) { ERROR_LOG(m_logger) << "Cannot change add/remove Operators to/from Exercise as the OPM-FTC could not be fetched." ; return; } for (int row = 0; row < m_operatorModel->rowCount(); ++row) { const auto rowData = m_operatorModel->getRowData(row); bool found = false; OperatorManagement::User user = m_opmDtc->user(rowData.second.id()); for (auto ex : user.exerciseIds()) if (ex == thisExerciseId) found = true; if (found == rowData.first) // Nothing changed continue; if (rowData.first) user.exerciseIds().resize(user.exerciseIds().size() + 1, thisExerciseId); else removeElement(user.exerciseIds(), thisExerciseId); OperatorManagement::OperatorCreateModifyRequest req; req.id(user.id()); req.visibleExercises() = user.exerciseIds(); req.visiblePartiesByExercise() = user.visiblePartiesByExercise(); m_requestHelper->startSingleRequest([this, req, opmFtc]() { return opmFtc->operatorCreateModifyRequest(req, this); }); } } }