Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GNEMeanDataFrame.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
18// The Widget for edit meanData elements
19/****************************************************************************/
20
25#include <netedit/GNENet.h>
27#include <netedit/GNEUndoList.h>
28#include <netedit/GNEViewNet.h>
32
33#include "GNEMeanDataFrame.h"
34
35#define TEMPORAL_FILENAME std::string()
36
37// ===========================================================================
38// FOX callback mapping
39// ===========================================================================
40
44
50
54
55// Object implementation
56FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, MFXGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))
57FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, MFXGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))
58FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, MFXGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))
59
60
61// ===========================================================================
62// method definitions
63// ===========================================================================
64
65// ---------------------------------------------------------------------------
66// GNEMeanDataFrame::MeanDataTypeSelector - methods
67// ---------------------------------------------------------------------------
68
70 MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),
71 myMeanDataFrameParent(meanDataFrameParent) {
72 // Create MFXComboBoxIcon
73 myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), meanDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
75 // add mean data types
76 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
77 for (const auto& meanDataType : tagPropertiesMeanDatas) {
78 myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
79 }
80 // set DEFAULT_VEHTYPE as default VType
81 myCurrentMeanData = tagPropertiesMeanDatas.front();
82 // MeanDataTypeSelector is always shown
83 show();
84}
85
86
88
89
92 return myCurrentMeanData;
93}
94
95
96void
98 // clear items
99 myTypeComboBox->clearItems();
100 // add mean data types
101 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
102 for (const auto& meanDataType : tagPropertiesMeanDatas) {
103 myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
104 }
105 // make sure that tag is in myTypeMatchBox
106 if (myCurrentMeanData != nullptr) {
107 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
108 if (myTypeComboBox->getItemText(i) == myCurrentMeanData->getTagStr()) {
109 myTypeComboBox->setCurrentItem(i);
110 }
111 }
112 } else {
113 myCurrentMeanData = tagPropertiesMeanDatas.front();
114 }
115 // refresh meanData editor module
116 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
117 // show modules
118 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
119 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
120}
121
122
123long
125 // add mean data types
126 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
127 // Check if value of myTypeMatchBox correspond of an allowed additional tags
128 for (const auto& meanDataType : tagPropertiesMeanDatas) {
129 if (meanDataType->getTagStr() == myTypeComboBox->getText().text()) {
130 // set pointer
131 myCurrentMeanData = meanDataType;
132 // set color of myTypeMatchBox to black (valid)
133 myTypeComboBox->setTextColor(GUIDesignTextColorBlack);
134 // refresh meanData editor module
135 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
136 // show modules if selected item is valid
137 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
138 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
139 return 1;
140 }
141 }
142 myCurrentMeanData = nullptr;
143 // refresh meanData editor module
144 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
145 // hide all modules if selected item isn't valid
146 myMeanDataFrameParent->myMeanDataEditor->hideMeanDataEditorModule();
147 myMeanDataFrameParent->myMeanDataSelector->hideMeanDataSelector();
148 // set color of myTypeMatchBox to red (invalid)
149 myTypeComboBox->setTextColor(GUIDesignTextColorRed);
150 return 1;
151}
152
153// ---------------------------------------------------------------------------
154// GNEMeanDataFrame::MeanDataEditor - methods
155// ---------------------------------------------------------------------------
156
158 MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),
159 myMeanDataFrameParent(meanDataFrameParent) {
160 // Create new meanData
163 // Create delete/reset meanData
166 // Create copy meanData
169}
170
171
173
174
175void
177 refreshMeanDataEditorModule();
178 show();
179}
180
181
182void
186
187
188void
190 // first check if selected VMeanData is valid
191 if (myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData() == nullptr) {
192 // disable buttons
193 myDeleteMeanDataButton->disable();
194 myCopyMeanDataButton->disable();
195 } else {
196 // enable buttons
197 myDeleteMeanDataButton->enable();
198 myCopyMeanDataButton->enable();
199 }
200 // update module
201 recalc();
202}
203
204
205long
207 // get current meanData type
208 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
209 // obtain a new valid MeanData ID
210 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
211 // create new meanData
212 GNEMeanData* meanData = new GNEMeanData(myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag(), typeID,
213 myMeanDataFrameParent->myViewNet->getNet(), TEMPORAL_FILENAME);
214 // add it using undoList (to allow undo-redo)
215 myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanData, "create meanData");
216 myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanData, true), true);
217 myMeanDataFrameParent->myViewNet->getUndoList()->end();
218 // set created meanData in selector
219 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanData);
220 return 1;
221}
222
223
224long
226 // begin undo list operation
227 myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::MODEDELETE, "delete meanData");
228 // remove meanData (and all of their children)
229 myMeanDataFrameParent->myViewNet->getNet()->deleteMeanData(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData(),
230 myMeanDataFrameParent->myViewNet->getUndoList());
231 // end undo list operation
232 myMeanDataFrameParent->myViewNet->getUndoList()->end();
233 // set created meanData in selector
234 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
235 return 1;
236}
237
238
239long
241 // get current meanData type
242 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
243 // obtain a new valid MeanData ID
244 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
245 // obtain meanData in which new MeanData will be based
246 GNEMeanData* meanData = dynamic_cast<GNEMeanData*>(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData());
247 // check that meanData exist
248 if (meanData) {
249 // create a new MeanData based on the current selected meanData
250 GNEMeanData* meanDataCopy = new GNEMeanData(meanData->getTagProperty()->getTag(), typeID, myMeanDataFrameParent->myViewNet->getNet(),
251 meanData->getFilename());
252 // begin undo list operation
253 myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanDataCopy, "copy meanData");
254 // add it using undoList (to allow undo-redo)
255 myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanDataCopy, true), true);
256 // end undo list operation
257 myMeanDataFrameParent->myViewNet->getUndoList()->end();
258 // refresh MeanData Selector (to show the new VMeanData)
259 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
260 // set created meanData in selector
261 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanDataCopy);
262 // refresh MeanData Editor Module
263 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
264 }
265 return 1;
266}
267
268// ---------------------------------------------------------------------------
269// GNEMeanDataFrame::MeanDataSelector - methods
270// ---------------------------------------------------------------------------
271
273 MFXGroupBoxModule(typeFrameParent, TL("Current MeanData")),
274 myMeanDataFrameParent(typeFrameParent),
275 myCurrentMeanData(nullptr) {
276 // get current meanData type
278 // Create MFXComboBoxIcon
281 // add meanDatas
282 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
283 myMeanDataComboBox->appendIconItem(meanData.second->getID().c_str(), meanData.second->getACIcon());
284 }
285 if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).size() > 0) {
287 } else {
288 myCurrentMeanData = nullptr;
289 }
290 // MeanDataSelector is always shown
291 show();
292}
293
294
296
297
298void
300 // refresh mean data selector
301 refreshMeanDataSelector(false);
302 // show
303 show();
304}
305
306
307void
309 // hide attributes editor
310 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
311 // hide
312 hide();
313}
314
315
318 return myCurrentMeanData;
319}
320
321
322void
324 myCurrentMeanData = vMeanData;
325 refreshMeanDataSelector(false);
326}
327
328
329void
331 // get current meanData type
332 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
333 // get mean datas sorted by ID
334 std::map<std::string, GNEMeanData*> sortedMeanDatas;
335 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
336 sortedMeanDatas[meanData.second->getID()] = meanData.second;
337 }
338 // clear items
339 myMeanDataComboBox->clearItems();
340 // fill myMeanDataMatchBox with meanDatas
341 for (const auto& sortedMeanData : sortedMeanDatas) {
342 myMeanDataComboBox->appendIconItem(sortedMeanData.first.c_str(), sortedMeanData.second->getACIcon());
343 }
344 // make sure that mean data exists
345 if (myCurrentMeanData && myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveMeanData(myCurrentMeanData->getTagProperty()->getTag(), myCurrentMeanData->getID(), false)) {
346 bool validMeanData = false;
347 for (int i = 0; i < (int)myMeanDataComboBox->getNumItems(); i++) {
348 if (myMeanDataComboBox->getItemText(i) == myCurrentMeanData->getID()) {
349 myMeanDataComboBox->setCurrentItem(i);
350 validMeanData = true;
351 }
352 }
353 if (!validMeanData) {
354 myCurrentMeanData = nullptr;
355 }
356 } else {
357 myCurrentMeanData = nullptr;
358 }
359 // check if enable or disable comboBox
360 if (sortedMeanDatas.size() > 0) {
361 myMeanDataComboBox->enable();
362 // check ifupdate myCurrentMeanData
363 if (myCurrentMeanData == nullptr) {
364 myCurrentMeanData = sortedMeanDatas.begin()->second;
365 }
366 } else {
367 myMeanDataComboBox->disable();
368 }
369 // refresh meanData editor module
370 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
371 // check if show attribute editor
372 if (!afterChangingID) {
373 if (myCurrentMeanData) {
374 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
375 } else {
376 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
377 }
378 }
379}
380
381
382void
384 if (myCurrentMeanData) {
385 myMeanDataComboBox->updateIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());
386 }
387}
388
389
390long
392 // get current meanData type
393 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
394 // Check if value of myMeanDataMatchBox correspond of an allowed additional tags
395 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
396 if (meanData.second->getID() == myMeanDataComboBox->getText().text()) {
397 // set pointer
398 myCurrentMeanData = meanData.second;
399 // set color of myMeanDataMatchBox to black (valid)
400 myMeanDataComboBox->setTextColor(GUIDesignTextColorBlack);
401 // refresh meanData editor module
402 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
403 // show modules if selected item is valid
404 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
405 // update viewNet
406 myMeanDataFrameParent->getViewNet()->updateViewNet();
407 return 1;
408 }
409 }
410 myCurrentMeanData = nullptr;
411 // refresh meanData editor module
412 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
413 // hide all modules if selected item isn't valid
414 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
415 // set color of myMeanDataMatchBox to red (invalid)
416 myMeanDataComboBox->setTextColor(GUIDesignTextColorRed);
417 // update viewNet
418 myMeanDataFrameParent->getViewNet()->updateViewNet();
419 return 1;
420}
421
422// ---------------------------------------------------------------------------
423// GNEMeanDataFrame - methods
424// ---------------------------------------------------------------------------
425
427 GNEFrame(viewParent, viewNet, TL("MeanData")) {
428 // build meanData type selector
430 // build meanData editor
432 // build meanData selector
434 // build meanData attributes editor
436}
437
438
441
442
443void
445 // refresh meanData type selector
447 // show frame
449}
450
451
452void
454 // hide frame
456}
457
458
459void
465
466
467void
470
471/****************************************************************************/
FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[]
#define TEMPORAL_FILENAME
@ MID_GNE_DELETE
delete element
Definition GUIAppEnum.h:995
@ MID_GNE_COPY
copy element
@ MID_GNE_CREATE
create element
Definition GUIAppEnum.h:993
@ MID_GNE_SET_TYPE
used to select a type of element in a combo box
#define GUIDesignTextColorRed
red color (for invalid text)
Definition GUIDesigns.h:44
#define GUIDesignButton
Definition GUIDesigns.h:100
#define GUIDesignComboBox
Definition GUIDesigns.h:295
#define GUIDesignComboBoxVisibleItems
Definition GUIDesigns.h:64
#define GUIDesignTextColorBlack
black color (for correct text)
Definition GUIDesigns.h:38
@ MODEMEANDATA
#define TL(string)
Definition MsgHandler.h:305
SumoXMLTag
Numbers representing SUMO-XML - element names.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_ID
const std::string & getFilename() const
get filename in which save this AC
const GNETagProperties * getTagProperty() const
get tagProperty associated with this Attribute Carrier
GNEViewNet * getViewNet() const
get view net
Definition GNEFrame.cpp:152
virtual void show()
show Frame
Definition GNEFrame.cpp:117
virtual void hide()
hide Frame
Definition GNEFrame.cpp:126
void hideMeanDataEditorModule()
hide MeanDataEditor box
void refreshMeanDataEditorModule()
update MeanDataEditor modul
FXButton * myCopyMeanDataButton
"copy meanData"
FXButton * myCreateMeanDataButton
"create meanData" button
long onCmdCopyMeanData(FXObject *, FXSelector, void *)
Called when "Copy Vehicle MeanData" button is clicked.
long onCmdCreateMeanData(FXObject *, FXSelector, void *)
MeanDataEditor(GNEMeanDataFrame *meanDataFrameParent)
FOX-declaration.
void showMeanDataEditorModule()
show MeanDataEditor modul
long onCmdDeletetMeanData(FXObject *, FXSelector, void *)
Called when "Delete Vehicle MeanData" button is clicked.
FXButton * myDeleteMeanDataButton
"delete meanData" button
void showMeanDataSelector()
show MeanDataSelector
void hideMeanDataSelector()
hide MeanDataSelector
GNEMeanData * myCurrentMeanData
pointer to current meanData
MeanDataSelector(GNEMeanDataFrame *typeFrameParent)
FOX-declaration.
GNEMeanData * getCurrentMeanData() const
get current Vehicle MeanData
void refreshMeanDataSelectorIDs()
refresh meanData selector (only IDs, without refreshing attributes)
MFXComboBoxIcon * myMeanDataComboBox
comboBox with the list of meanDatas
void refreshMeanDataSelector(bool afterChangingID)
refresh meanData selector
void setCurrentMeanData(GNEMeanData *vMeanData)
set current Vehicle MeanData
GNEMeanDataFrame * myMeanDataFrameParent
pointer to Frame Parent
long onCmdSelectItem(FXObject *, FXSelector, void *)
void refreshMeanDataTypeSelector()
refresh meanData selector
const GNETagProperties * getCurrentMeanData() const
get current MeanData
long onCmdSelectItem(FXObject *, FXSelector, void *)
void hide()
hide Frame
void attributeUpdated(SumoXMLAttr attribute)
function called after set a valid attribute in AttributeCreator/AttributeEditor/ParametersEditor/....
MeanDataSelector * myMeanDataSelector
meanData selector
void show()
show Frame
~GNEMeanDataFrame()
Destructor.
GNEAttributesEditor * myMeanDataAttributesEditor
meanData attributes editor
GNEMeanDataFrame(GNEViewParent *viewParent, GNEViewNet *viewNet)
Constructor (protected due GNEMeanDataFrame is abtract)
MeanDataTypeSelector * myMeanDataTypeSelector
meanData type selector
void updateFrameAfterUndoRedo()
function called after undo/redo in the current frame
MeanDataEditor * myMeanDataEditor
meanData editor
const std::unordered_map< SumoXMLTag, std::map< const std::string, GNEMeanData * >, std::hash< int > > & getMeanDatas() const
get meanDatas
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition GNENet.cpp:144
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
GNENet * getNet() const
get the net object
GNEViewParent * getViewParent() const
get the net object
A single child window which contains a view of the simulation area.
GNEApplicationWindow * getGNEAppWindows() const
get GNE Application Windows
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
MFXStaticToolTip * getStaticTooltipMenu() const
get static toolTip for menus
FXint appendIconItem(const FXString &text, FXIcon *icon=nullptr, FXColor bgColor=FXRGB(255, 255, 255), void *ptr=nullptr)
append icon item in the last position
MFXGroupBoxModule (based on FXGroupBox)
FXVerticalFrame * getCollapsableFrame()
get collapsable frame (used by all elements that will be collapsed if button is toggled)
C++ TraCI client API implementation.