Path: blob/main/src/netedit/frames/data/GNEMeanDataFrame.cpp
193863 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GNEMeanDataFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date Nov 202216///17// The Widget for edit meanData elements18/****************************************************************************/1920#include <netedit/changes/GNEChange_MeanData.h>21#include <netedit/elements/data/GNEMeanData.h>22#include <netedit/frames/GNEAttributesEditor.h>23#include <netedit/GNEApplicationWindow.h>24#include <netedit/GNENet.h>25#include <netedit/GNETagPropertiesDatabase.h>26#include <netedit/GNEUndoList.h>27#include <netedit/GNEViewNet.h>28#include <netedit/GNEViewParent.h>29#include <utils/gui/div/GUIDesigns.h>30#include <utils/gui/windows/GUIAppEnum.h>3132#include "GNEMeanDataFrame.h"3334// ===========================================================================35// FOX callback mapping36// ===========================================================================3738FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[] = {39FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem)40};4142FXDEFMAP(GNEMeanDataFrame::MeanDataEditor) meanDataEditorMap[] = {43FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData),44FXMAPFUNC(SEL_COMMAND, MID_GNE_DELETE, GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData),45FXMAPFUNC(SEL_COMMAND, MID_GNE_COPY, GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData)46};4748FXDEFMAP(GNEMeanDataFrame::MeanDataSelector) meanDataTypeSelectorMap[] = {49FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem)50};5152// Object implementation53FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, GNEGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))54FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, GNEGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))55FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, GNEGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))565758// ===========================================================================59// method definitions60// ===========================================================================6162// ---------------------------------------------------------------------------63// GNEMeanDataFrame::MeanDataTypeSelector - methods64// ---------------------------------------------------------------------------6566GNEMeanDataFrame::MeanDataTypeSelector::MeanDataTypeSelector(GNEMeanDataFrame* meanDataFrameParent) :67GNEGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),68myMeanDataFrameParent(meanDataFrameParent) {69// Create MFXComboBoxIcon70myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), meanDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),71false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);72// add mean data types73const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);74for (const auto& meanDataType : tagPropertiesMeanDatas) {75myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));76}77// set DEFAULT_VEHTYPE as default VType78myCurrentMeanData = tagPropertiesMeanDatas.front();79// MeanDataTypeSelector is always shown80show();81}828384GNEMeanDataFrame::MeanDataTypeSelector::~MeanDataTypeSelector() {}858687const GNETagProperties*88GNEMeanDataFrame::MeanDataTypeSelector::getCurrentMeanData() const {89return myCurrentMeanData;90}919293void94GNEMeanDataFrame::MeanDataTypeSelector::refreshMeanDataTypeSelector() {95// clear items96myTypeComboBox->clearItems();97// add mean data types98const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);99for (const auto& meanDataType : tagPropertiesMeanDatas) {100myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));101}102// make sure that tag is in myTypeMatchBox103if (myCurrentMeanData != nullptr) {104for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {105if (myTypeComboBox->getItemText(i) == myCurrentMeanData->getTagStr()) {106myTypeComboBox->setCurrentItem(i);107}108}109} else {110myCurrentMeanData = tagPropertiesMeanDatas.front();111}112// refresh meanData editor module113myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();114// show modules115myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();116myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();117}118119120long121GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {122// add mean data types123const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);124// Check if value of myTypeMatchBox correspond of an allowed additional tags125for (const auto& meanDataType : tagPropertiesMeanDatas) {126if (meanDataType->getTagStr() == myTypeComboBox->getText().text()) {127// set pointer128myCurrentMeanData = meanDataType;129// set color of myTypeMatchBox to black (valid)130myTypeComboBox->setTextColor(GUIDesignTextColorBlack);131// refresh meanData editor module132myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();133// show modules if selected item is valid134myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();135myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();136return 1;137}138}139myCurrentMeanData = nullptr;140// refresh meanData editor module141myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();142// hide all modules if selected item isn't valid143myMeanDataFrameParent->myMeanDataEditor->hideMeanDataEditorModule();144myMeanDataFrameParent->myMeanDataSelector->hideMeanDataSelector();145// set color of myTypeMatchBox to red (invalid)146myTypeComboBox->setTextColor(GUIDesignTextColorRed);147return 1;148}149150// ---------------------------------------------------------------------------151// GNEMeanDataFrame::MeanDataEditor - methods152// ---------------------------------------------------------------------------153154GNEMeanDataFrame::MeanDataEditor::MeanDataEditor(GNEMeanDataFrame* meanDataFrameParent) :155GNEGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),156myMeanDataFrameParent(meanDataFrameParent) {157// Create new meanData158myCreateMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create MeanData"), "", "",159GUIIconSubSys::getIcon(GUIIcon::MODEMEANDATA), this, MID_GNE_CREATE, GUIDesignButton);160// Create delete/reset meanData161myDeleteMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Delete MeanData"), "", "",162GUIIconSubSys::getIcon(GUIIcon::MODEDELETE), this, MID_GNE_DELETE, GUIDesignButton);163// Create copy meanData164myCopyMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Copy MeanData"), "", "",165GUIIconSubSys::getIcon(GUIIcon::COPY), this, MID_GNE_COPY, GUIDesignButton);166}167168169GNEMeanDataFrame::MeanDataEditor::~MeanDataEditor() {}170171172void173GNEMeanDataFrame::MeanDataEditor::showMeanDataEditorModule() {174refreshMeanDataEditorModule();175show();176}177178179void180GNEMeanDataFrame::MeanDataEditor::hideMeanDataEditorModule() {181hide();182}183184185void186GNEMeanDataFrame::MeanDataEditor::refreshMeanDataEditorModule() {187// first check if selected VMeanData is valid188if (myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData() == nullptr) {189// disable buttons190myDeleteMeanDataButton->disable();191myCopyMeanDataButton->disable();192} else {193// enable buttons194myDeleteMeanDataButton->enable();195myCopyMeanDataButton->enable();196}197// update module198recalc();199}200201202long203GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData(FXObject*, FXSelector, void*) {204auto net = myMeanDataFrameParent->myViewNet->getNet();205// get current meanData type206SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();207// obtain a new valid MeanData ID208const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);209// create new meanData210GNEMeanData* meanData = new GNEMeanData(myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag(), typeID,211net, net->getGNEApplicationWindow()->getFileBucketHandler()->getDefaultBucket(FileBucket::Type::MEANDATA));212// add it using undoList (to allow undo-redo)213net->getUndoList()->begin(meanData, "create meanData");214net->getUndoList()->add(new GNEChange_MeanData(meanData, true), true);215net->getUndoList()->end();216// set created meanData in selector217myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanData);218return 1;219}220221222long223GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData(FXObject*, FXSelector, void*) {224// begin undo list operation225myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::MODEDELETE, "delete meanData");226// remove meanData (and all of their children)227myMeanDataFrameParent->myViewNet->getNet()->deleteMeanData(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData(),228myMeanDataFrameParent->myViewNet->getUndoList());229// end undo list operation230myMeanDataFrameParent->myViewNet->getUndoList()->end();231// set created meanData in selector232myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);233return 1;234}235236237long238GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData(FXObject*, FXSelector, void*) {239// get current meanData type240SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();241// obtain a new valid MeanData ID242const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);243// obtain meanData in which new MeanData will be based244GNEMeanData* meanData = dynamic_cast<GNEMeanData*>(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData());245// check that meanData exist246if (meanData) {247// create a new MeanData based on the current selected meanData248GNEMeanData* meanDataCopy = new GNEMeanData(meanData->getTagProperty()->getTag(), typeID, myMeanDataFrameParent->myViewNet->getNet(),249meanData->getFileBucket());250// begin undo list operation251myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanDataCopy, "copy meanData");252// add it using undoList (to allow undo-redo)253myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanDataCopy, true), true);254// end undo list operation255myMeanDataFrameParent->myViewNet->getUndoList()->end();256// refresh MeanData Selector (to show the new VMeanData)257myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);258// set created meanData in selector259myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanDataCopy);260// refresh MeanData Editor Module261myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();262}263return 1;264}265266// ---------------------------------------------------------------------------267// GNEMeanDataFrame::MeanDataSelector - methods268// ---------------------------------------------------------------------------269270GNEMeanDataFrame::MeanDataSelector::MeanDataSelector(GNEMeanDataFrame* typeFrameParent) :271GNEGroupBoxModule(typeFrameParent, TL("Current MeanData")),272myMeanDataFrameParent(typeFrameParent),273myCurrentMeanData(nullptr) {274// get current meanData type275SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();276// Create MFXComboBoxIcon277myMeanDataComboBox = new MFXComboBoxIcon(getCollapsableFrame(), typeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),278false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);279// add meanDatas280for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {281myMeanDataComboBox->appendIconItem(meanData.second->getID().c_str(), meanData.second->getACIcon());282}283if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).size() > 0) {284myCurrentMeanData = myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).begin()->second;285} else {286myCurrentMeanData = nullptr;287}288// MeanDataSelector is always shown289show();290}291292293GNEMeanDataFrame::MeanDataSelector::~MeanDataSelector() {}294295296void297GNEMeanDataFrame::MeanDataSelector::showMeanDataSelector() {298// refresh mean data selector299refreshMeanDataSelector(false);300// show301show();302}303304305void306GNEMeanDataFrame::MeanDataSelector::hideMeanDataSelector() {307// hide attributes editor308myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();309// hide310hide();311}312313314GNEMeanData*315GNEMeanDataFrame::MeanDataSelector::getCurrentMeanData() const {316return myCurrentMeanData;317}318319320void321GNEMeanDataFrame::MeanDataSelector::setCurrentMeanData(GNEMeanData* vMeanData) {322myCurrentMeanData = vMeanData;323refreshMeanDataSelector(false);324}325326327void328GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelector(bool afterChangingID) {329// get current meanData type330SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();331// get mean datas sorted by ID332std::map<std::string, GNEMeanData*> sortedMeanDatas;333for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {334sortedMeanDatas[meanData.second->getID()] = meanData.second;335}336// clear items337myMeanDataComboBox->clearItems();338// fill myMeanDataMatchBox with meanDatas339for (const auto& sortedMeanData : sortedMeanDatas) {340myMeanDataComboBox->appendIconItem(sortedMeanData.first.c_str(), sortedMeanData.second->getACIcon());341}342// make sure that mean data exists343if (myCurrentMeanData && myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveMeanData(myCurrentMeanData->getTagProperty()->getTag(), myCurrentMeanData->getID(), false)) {344bool validMeanData = false;345for (int i = 0; i < (int)myMeanDataComboBox->getNumItems(); i++) {346if (myMeanDataComboBox->getItemText(i) == myCurrentMeanData->getID()) {347myMeanDataComboBox->setCurrentItem(i);348validMeanData = true;349}350}351if (!validMeanData) {352myCurrentMeanData = nullptr;353}354} else {355myCurrentMeanData = nullptr;356}357// check if enable or disable comboBox358if (sortedMeanDatas.size() > 0) {359myMeanDataComboBox->enable();360// check ifupdate myCurrentMeanData361if (myCurrentMeanData == nullptr) {362myCurrentMeanData = sortedMeanDatas.begin()->second;363}364} else {365myMeanDataComboBox->disable();366}367// refresh meanData editor module368myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();369// check if show attribute editor370if (!afterChangingID) {371if (myCurrentMeanData) {372myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);373} else {374myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();375}376}377}378379380void381GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelectorIDs() {382if (myCurrentMeanData) {383myMeanDataComboBox->updateIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());384}385}386387388long389GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {390// get current meanData type391SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();392// Check if value of myMeanDataMatchBox correspond of an allowed additional tags393for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {394if (meanData.second->getID() == myMeanDataComboBox->getText().text()) {395// set pointer396myCurrentMeanData = meanData.second;397// set color of myMeanDataMatchBox to black (valid)398myMeanDataComboBox->setTextColor(GUIDesignTextColorBlack);399// refresh meanData editor module400myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();401// show modules if selected item is valid402myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);403// update viewNet404myMeanDataFrameParent->getViewNet()->updateViewNet();405return 1;406}407}408myCurrentMeanData = nullptr;409// refresh meanData editor module410myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();411// hide all modules if selected item isn't valid412myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();413// set color of myMeanDataMatchBox to red (invalid)414myMeanDataComboBox->setTextColor(GUIDesignTextColorRed);415// update viewNet416myMeanDataFrameParent->getViewNet()->updateViewNet();417return 1;418}419420// ---------------------------------------------------------------------------421// GNEMeanDataFrame - methods422// ---------------------------------------------------------------------------423424GNEMeanDataFrame::GNEMeanDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :425GNEFrame(viewParent, viewNet, TL("MeanData")) {426// build meanData type selector427myMeanDataTypeSelector = new MeanDataTypeSelector(this);428// build meanData editor429myMeanDataEditor = new MeanDataEditor(this);430// build meanData selector431myMeanDataSelector = new MeanDataSelector(this);432// build meanData attributes editor433myMeanDataAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::EDITOR);434}435436437GNEMeanDataFrame::~GNEMeanDataFrame() {438}439440441void442GNEMeanDataFrame::show() {443// refresh meanData type selector444myMeanDataTypeSelector->refreshMeanDataTypeSelector();445// show frame446GNEFrame::show();447}448449450void451GNEMeanDataFrame::hide() {452// hide frame453GNEFrame::hide();454}455456457void458GNEMeanDataFrame::attributeUpdated(SumoXMLAttr attribute) {459if (attribute == SUMO_ATTR_ID) {460myMeanDataSelector->refreshMeanDataSelector(true);461}462}463464465void466GNEMeanDataFrame::updateFrameAfterUndoRedo() {467}468469/****************************************************************************/470471472