Path: blob/main/src/netedit/frames/data/GNEMeanDataFrame.cpp
169685 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 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#define TEMPORAL_FILENAME std::string()3536// ===========================================================================37// FOX callback mapping38// ===========================================================================3940FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[] = {41FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem)42};4344FXDEFMAP(GNEMeanDataFrame::MeanDataEditor) meanDataEditorMap[] = {45FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData),46FXMAPFUNC(SEL_COMMAND, MID_GNE_DELETE, GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData),47FXMAPFUNC(SEL_COMMAND, MID_GNE_COPY, GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData)48};4950FXDEFMAP(GNEMeanDataFrame::MeanDataSelector) meanDataTypeSelectorMap[] = {51FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem)52};5354// Object implementation55FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, MFXGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))56FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, MFXGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))57FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, MFXGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))585960// ===========================================================================61// method definitions62// ===========================================================================6364// ---------------------------------------------------------------------------65// GNEMeanDataFrame::MeanDataTypeSelector - methods66// ---------------------------------------------------------------------------6768GNEMeanDataFrame::MeanDataTypeSelector::MeanDataTypeSelector(GNEMeanDataFrame* meanDataFrameParent) :69MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),70myMeanDataFrameParent(meanDataFrameParent) {71// Create MFXComboBoxIcon72myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), meanDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),73false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);74// add mean data types75const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);76for (const auto& meanDataType : tagPropertiesMeanDatas) {77myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));78}79// set DEFAULT_VEHTYPE as default VType80myCurrentMeanData = tagPropertiesMeanDatas.front();81// MeanDataTypeSelector is always shown82show();83}848586GNEMeanDataFrame::MeanDataTypeSelector::~MeanDataTypeSelector() {}878889const GNETagProperties*90GNEMeanDataFrame::MeanDataTypeSelector::getCurrentMeanData() const {91return myCurrentMeanData;92}939495void96GNEMeanDataFrame::MeanDataTypeSelector::refreshMeanDataTypeSelector() {97// clear items98myTypeComboBox->clearItems();99// add mean data types100const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);101for (const auto& meanDataType : tagPropertiesMeanDatas) {102myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));103}104// make sure that tag is in myTypeMatchBox105if (myCurrentMeanData != nullptr) {106for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {107if (myTypeComboBox->getItemText(i) == myCurrentMeanData->getTagStr()) {108myTypeComboBox->setCurrentItem(i);109}110}111} else {112myCurrentMeanData = tagPropertiesMeanDatas.front();113}114// refresh meanData editor module115myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();116// show modules117myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();118myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();119}120121122long123GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {124// add mean data types125const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);126// Check if value of myTypeMatchBox correspond of an allowed additional tags127for (const auto& meanDataType : tagPropertiesMeanDatas) {128if (meanDataType->getTagStr() == myTypeComboBox->getText().text()) {129// set pointer130myCurrentMeanData = meanDataType;131// set color of myTypeMatchBox to black (valid)132myTypeComboBox->setTextColor(GUIDesignTextColorBlack);133// refresh meanData editor module134myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();135// show modules if selected item is valid136myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();137myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();138return 1;139}140}141myCurrentMeanData = nullptr;142// refresh meanData editor module143myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();144// hide all modules if selected item isn't valid145myMeanDataFrameParent->myMeanDataEditor->hideMeanDataEditorModule();146myMeanDataFrameParent->myMeanDataSelector->hideMeanDataSelector();147// set color of myTypeMatchBox to red (invalid)148myTypeComboBox->setTextColor(GUIDesignTextColorRed);149return 1;150}151152// ---------------------------------------------------------------------------153// GNEMeanDataFrame::MeanDataEditor - methods154// ---------------------------------------------------------------------------155156GNEMeanDataFrame::MeanDataEditor::MeanDataEditor(GNEMeanDataFrame* meanDataFrameParent) :157MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),158myMeanDataFrameParent(meanDataFrameParent) {159// Create new meanData160myCreateMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create MeanData"), "", "",161GUIIconSubSys::getIcon(GUIIcon::MODEMEANDATA), this, MID_GNE_CREATE, GUIDesignButton);162// Create delete/reset meanData163myDeleteMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Delete MeanData"), "", "",164GUIIconSubSys::getIcon(GUIIcon::MODEDELETE), this, MID_GNE_DELETE, GUIDesignButton);165// Create copy meanData166myCopyMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Copy MeanData"), "", "",167GUIIconSubSys::getIcon(GUIIcon::COPY), this, MID_GNE_COPY, GUIDesignButton);168}169170171GNEMeanDataFrame::MeanDataEditor::~MeanDataEditor() {}172173174void175GNEMeanDataFrame::MeanDataEditor::showMeanDataEditorModule() {176refreshMeanDataEditorModule();177show();178}179180181void182GNEMeanDataFrame::MeanDataEditor::hideMeanDataEditorModule() {183hide();184}185186187void188GNEMeanDataFrame::MeanDataEditor::refreshMeanDataEditorModule() {189// first check if selected VMeanData is valid190if (myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData() == nullptr) {191// disable buttons192myDeleteMeanDataButton->disable();193myCopyMeanDataButton->disable();194} else {195// enable buttons196myDeleteMeanDataButton->enable();197myCopyMeanDataButton->enable();198}199// update module200recalc();201}202203204long205GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData(FXObject*, FXSelector, void*) {206// get current meanData type207SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();208// obtain a new valid MeanData ID209const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);210// create new meanData211GNEMeanData* meanData = new GNEMeanData(myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag(), typeID,212myMeanDataFrameParent->myViewNet->getNet(), TEMPORAL_FILENAME);213// add it using undoList (to allow undo-redo)214myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanData, "create meanData");215myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanData, true), true);216myMeanDataFrameParent->myViewNet->getUndoList()->end();217// set created meanData in selector218myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanData);219return 1;220}221222223long224GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData(FXObject*, FXSelector, void*) {225// begin undo list operation226myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::MODEDELETE, "delete meanData");227// remove meanData (and all of their children)228myMeanDataFrameParent->myViewNet->getNet()->deleteMeanData(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData(),229myMeanDataFrameParent->myViewNet->getUndoList());230// end undo list operation231myMeanDataFrameParent->myViewNet->getUndoList()->end();232// set created meanData in selector233myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);234return 1;235}236237238long239GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData(FXObject*, FXSelector, void*) {240// get current meanData type241SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();242// obtain a new valid MeanData ID243const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);244// obtain meanData in which new MeanData will be based245GNEMeanData* meanData = dynamic_cast<GNEMeanData*>(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData());246// check that meanData exist247if (meanData) {248// create a new MeanData based on the current selected meanData249GNEMeanData* meanDataCopy = new GNEMeanData(meanData->getTagProperty()->getTag(), typeID, myMeanDataFrameParent->myViewNet->getNet(),250meanData->getFilename());251// begin undo list operation252myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanDataCopy, "copy meanData");253// add it using undoList (to allow undo-redo)254myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanDataCopy, true), true);255// end undo list operation256myMeanDataFrameParent->myViewNet->getUndoList()->end();257// refresh MeanData Selector (to show the new VMeanData)258myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);259// set created meanData in selector260myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanDataCopy);261// refresh MeanData Editor Module262myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();263}264return 1;265}266267// ---------------------------------------------------------------------------268// GNEMeanDataFrame::MeanDataSelector - methods269// ---------------------------------------------------------------------------270271GNEMeanDataFrame::MeanDataSelector::MeanDataSelector(GNEMeanDataFrame* typeFrameParent) :272MFXGroupBoxModule(typeFrameParent, TL("Current MeanData")),273myMeanDataFrameParent(typeFrameParent),274myCurrentMeanData(nullptr) {275// get current meanData type276SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();277// Create MFXComboBoxIcon278myMeanDataComboBox = new MFXComboBoxIcon(getCollapsableFrame(), typeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),279false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);280// add meanDatas281for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {282myMeanDataComboBox->appendIconItem(meanData.second->getID().c_str(), meanData.second->getACIcon());283}284if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).size() > 0) {285myCurrentMeanData = myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).begin()->second;286} else {287myCurrentMeanData = nullptr;288}289// MeanDataSelector is always shown290show();291}292293294GNEMeanDataFrame::MeanDataSelector::~MeanDataSelector() {}295296297void298GNEMeanDataFrame::MeanDataSelector::showMeanDataSelector() {299// refresh mean data selector300refreshMeanDataSelector(false);301// show302show();303}304305306void307GNEMeanDataFrame::MeanDataSelector::hideMeanDataSelector() {308// hide attributes editor309myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();310// hide311hide();312}313314315GNEMeanData*316GNEMeanDataFrame::MeanDataSelector::getCurrentMeanData() const {317return myCurrentMeanData;318}319320321void322GNEMeanDataFrame::MeanDataSelector::setCurrentMeanData(GNEMeanData* vMeanData) {323myCurrentMeanData = vMeanData;324refreshMeanDataSelector(false);325}326327328void329GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelector(bool afterChangingID) {330// get current meanData type331SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();332// get mean datas sorted by ID333std::map<std::string, GNEMeanData*> sortedMeanDatas;334for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {335sortedMeanDatas[meanData.second->getID()] = meanData.second;336}337// clear items338myMeanDataComboBox->clearItems();339// fill myMeanDataMatchBox with meanDatas340for (const auto& sortedMeanData : sortedMeanDatas) {341myMeanDataComboBox->appendIconItem(sortedMeanData.first.c_str(), sortedMeanData.second->getACIcon());342}343// make sure that mean data exists344if (myCurrentMeanData && myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveMeanData(myCurrentMeanData->getTagProperty()->getTag(), myCurrentMeanData->getID(), false)) {345bool validMeanData = false;346for (int i = 0; i < (int)myMeanDataComboBox->getNumItems(); i++) {347if (myMeanDataComboBox->getItemText(i) == myCurrentMeanData->getID()) {348myMeanDataComboBox->setCurrentItem(i);349validMeanData = true;350}351}352if (!validMeanData) {353myCurrentMeanData = nullptr;354}355} else {356myCurrentMeanData = nullptr;357}358// check if enable or disable comboBox359if (sortedMeanDatas.size() > 0) {360myMeanDataComboBox->enable();361// check ifupdate myCurrentMeanData362if (myCurrentMeanData == nullptr) {363myCurrentMeanData = sortedMeanDatas.begin()->second;364}365} else {366myMeanDataComboBox->disable();367}368// refresh meanData editor module369myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();370// check if show attribute editor371if (!afterChangingID) {372if (myCurrentMeanData) {373myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);374} else {375myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();376}377}378}379380381void382GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelectorIDs() {383if (myCurrentMeanData) {384myMeanDataComboBox->updateIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());385}386}387388389long390GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {391// get current meanData type392SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();393// Check if value of myMeanDataMatchBox correspond of an allowed additional tags394for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {395if (meanData.second->getID() == myMeanDataComboBox->getText().text()) {396// set pointer397myCurrentMeanData = meanData.second;398// set color of myMeanDataMatchBox to black (valid)399myMeanDataComboBox->setTextColor(GUIDesignTextColorBlack);400// refresh meanData editor module401myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();402// show modules if selected item is valid403myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);404// update viewNet405myMeanDataFrameParent->getViewNet()->updateViewNet();406return 1;407}408}409myCurrentMeanData = nullptr;410// refresh meanData editor module411myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();412// hide all modules if selected item isn't valid413myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();414// set color of myMeanDataMatchBox to red (invalid)415myMeanDataComboBox->setTextColor(GUIDesignTextColorRed);416// update viewNet417myMeanDataFrameParent->getViewNet()->updateViewNet();418return 1;419}420421// ---------------------------------------------------------------------------422// GNEMeanDataFrame - methods423// ---------------------------------------------------------------------------424425GNEMeanDataFrame::GNEMeanDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :426GNEFrame(viewParent, viewNet, TL("MeanData")) {427// build meanData type selector428myMeanDataTypeSelector = new MeanDataTypeSelector(this);429// build meanData editor430myMeanDataEditor = new MeanDataEditor(this);431// build meanData selector432myMeanDataSelector = new MeanDataSelector(this);433// build meanData attributes editor434myMeanDataAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::EDITOR);435}436437438GNEMeanDataFrame::~GNEMeanDataFrame() {439}440441442void443GNEMeanDataFrame::show() {444// refresh meanData type selector445myMeanDataTypeSelector->refreshMeanDataTypeSelector();446// show frame447GNEFrame::show();448}449450451void452GNEMeanDataFrame::hide() {453// hide frame454GNEFrame::hide();455}456457458void459GNEMeanDataFrame::attributeUpdated(SumoXMLAttr attribute) {460if (attribute == SUMO_ATTR_ID) {461myMeanDataSelector->refreshMeanDataSelector(true);462}463}464465466void467GNEMeanDataFrame::updateFrameAfterUndoRedo() {468}469470/****************************************************************************/471472473