Eclipse SUMO - Simulation of Urban MObility
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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
21#include <netedit/GNENet.h>
23#include <netedit/GNEUndoList.h>
29
30#include "GNEMeanDataFrame.h"
31
32#define TEMPORAL_FILENAME std::string()
33
34// ===========================================================================
35// FOX callback mapping
36// ===========================================================================
37
41
47
51
52// Object implementation
53FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, MFXGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))
54FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, MFXGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))
55FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, MFXGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))
56
57
58// ===========================================================================
59// method definitions
60// ===========================================================================
61
62// ---------------------------------------------------------------------------
63// GNEMeanDataFrame::MeanDataTypeSelector - methods
64// ---------------------------------------------------------------------------
65
67 MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),
68 myMeanDataFrameParent(meanDataFrameParent) {
69 // Create MFXComboBoxIcon
70 myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), GUIDesignComboBoxNCol, false, GUIDesignComboBoxVisibleItems,
72 // add mean data types
73 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
74 for (const auto& meanDataType : tagPropertiesMeanDatas) {
75 myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
76 }
77 // set DEFAULT_VEHTYPE as default VType
78 myCurrentMeanData = tagPropertiesMeanDatas.front();
79 // MeanDataTypeSelector is always shown
80 show();
81}
82
83
85
86
89 return myCurrentMeanData;
90}
91
92
93void
95 // clear items
96 myTypeComboBox->clearItems();
97 // add mean data types
98 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
99 for (const auto& meanDataType : tagPropertiesMeanDatas) {
100 myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
101 }
102 // make sure that tag is in myTypeMatchBox
103 if (myCurrentMeanData != nullptr) {
104 for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
105 if (myTypeComboBox->getItemText(i) == myCurrentMeanData->getTagStr()) {
106 myTypeComboBox->setCurrentItem(i);
107 }
108 }
109 } else {
110 myCurrentMeanData = tagPropertiesMeanDatas.front();
111 }
112 // refresh meanData editor module
113 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
114 // show modules
115 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
116 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
117}
118
119
120long
122 // add mean data types
123 const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
124 // Check if value of myTypeMatchBox correspond of an allowed additional tags
125 for (const auto& meanDataType : tagPropertiesMeanDatas) {
126 if (meanDataType->getTagStr() == myTypeComboBox->getText().text()) {
127 // set pointer
128 myCurrentMeanData = meanDataType;
129 // set color of myTypeMatchBox to black (valid)
130 myTypeComboBox->setTextColor(FXRGB(0, 0, 0));
131 // refresh meanData editor module
132 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
133 // show modules if selected item is valid
134 myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
135 myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
136 return 1;
137 }
138 }
139 myCurrentMeanData = nullptr;
140 // refresh meanData editor module
141 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
142 // hide all modules if selected item isn't valid
143 myMeanDataFrameParent->myMeanDataEditor->hideMeanDataEditorModule();
144 myMeanDataFrameParent->myMeanDataSelector->hideMeanDataSelector();
145 // set color of myTypeMatchBox to red (invalid)
146 myTypeComboBox->setTextColor(FXRGB(255, 0, 0));
147 return 1;
148}
149
150// ---------------------------------------------------------------------------
151// GNEMeanDataFrame::MeanDataEditor - methods
152// ---------------------------------------------------------------------------
153
155 MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),
156 myMeanDataFrameParent(meanDataFrameParent) {
157 // Create new meanData
160 // Create delete/reset meanData
163 // Create copy meanData
166}
167
168
170
171
172void
174 refreshMeanDataEditorModule();
175 show();
176}
177
178
179void
183
184
185void
187 // first check if selected VMeanData is valid
188 if (myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData() == nullptr) {
189 // disable buttons
190 myDeleteMeanDataButton->disable();
191 myCopyMeanDataButton->disable();
192 } else {
193 // enable buttons
194 myDeleteMeanDataButton->enable();
195 myCopyMeanDataButton->enable();
196 }
197 // update module
198 recalc();
199}
200
201
202long
204 // get current meanData type
205 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
206 // obtain a new valid MeanData ID
207 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
208 // create new meanData
209 GNEMeanData* meanData = new GNEMeanData(myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag(), typeID,
210 myMeanDataFrameParent->myViewNet->getNet(), TEMPORAL_FILENAME);
211 // add it using undoList (to allow undo-redo)
212 myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanData, "create meanData");
213 myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanData, true), true);
214 myMeanDataFrameParent->myViewNet->getUndoList()->end();
215 // set created meanData in selector
216 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanData);
217 return 1;
218}
219
220
221long
223 // begin undo list operation
224 myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::MODEDELETE, "delete meanData");
225 // remove meanData (and all of their children)
226 myMeanDataFrameParent->myViewNet->getNet()->deleteMeanData(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData(),
227 myMeanDataFrameParent->myViewNet->getUndoList());
228 // end undo list operation
229 myMeanDataFrameParent->myViewNet->getUndoList()->end();
230 // set created meanData in selector
231 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
232 return 1;
233}
234
235
236long
238 // get current meanData type
239 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
240 // obtain a new valid MeanData ID
241 const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
242 // obtain meanData in which new MeanData will be based
243 GNEMeanData* meanData = dynamic_cast<GNEMeanData*>(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData());
244 // check that meanData exist
245 if (meanData) {
246 // create a new MeanData based on the current selected meanData
247 GNEMeanData* meanDataCopy = new GNEMeanData(meanData->getTagProperty()->getTag(), typeID, myMeanDataFrameParent->myViewNet->getNet(),
248 meanData->getFilename());
249 // begin undo list operation
250 myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanDataCopy, "copy meanData");
251 // add it using undoList (to allow undo-redo)
252 myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanDataCopy, true), true);
253 // end undo list operation
254 myMeanDataFrameParent->myViewNet->getUndoList()->end();
255 // refresh MeanData Selector (to show the new VMeanData)
256 myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
257 // set created meanData in selector
258 myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanDataCopy);
259 // refresh MeanData Editor Module
260 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
261 }
262 return 1;
263}
264
265// ---------------------------------------------------------------------------
266// GNEMeanDataFrame::MeanDataSelector - methods
267// ---------------------------------------------------------------------------
268
270 MFXGroupBoxModule(typeFrameParent, TL("Current MeanData")),
271 myMeanDataFrameParent(typeFrameParent),
272 myCurrentMeanData(nullptr) {
273 // get current meanData type
275 // Create MFXComboBoxIcon
278 // add meanDatas
279 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
280 myMeanDataComboBox->appendIconItem(meanData.second->getID().c_str(), meanData.second->getACIcon());
281 }
282 if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).size() > 0) {
284 } else {
285 myCurrentMeanData = nullptr;
286 }
287 // MeanDataSelector is always shown
288 show();
289}
290
291
293
294
295void
297 // refresh mean data selector
298 refreshMeanDataSelector(false);
299 // show
300 show();
301}
302
303
304void
306 // hide attributes editor
307 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
308 // hide
309 hide();
310}
311
312
315 return myCurrentMeanData;
316}
317
318
319void
321 myCurrentMeanData = vMeanData;
322 refreshMeanDataSelector(false);
323}
324
325
326void
328 // get current meanData type
329 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
330 // get mean datas sorted by ID
331 std::map<std::string, GNEMeanData*> sortedMeanDatas;
332 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
333 sortedMeanDatas[meanData.second->getID()] = meanData.second;
334 }
335 // clear items
336 myMeanDataComboBox->clearItems();
337 // fill myMeanDataMatchBox with meanDatas
338 for (const auto& sortedMeanData : sortedMeanDatas) {
339 myMeanDataComboBox->appendIconItem(sortedMeanData.first.c_str(), sortedMeanData.second->getACIcon());
340 }
341 // make sure that mean data exists
342 if (myCurrentMeanData && myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveMeanData(myCurrentMeanData->getTagProperty()->getTag(), myCurrentMeanData->getID(), false)) {
343 bool validMeanData = false;
344 for (int i = 0; i < (int)myMeanDataComboBox->getNumItems(); i++) {
345 if (myMeanDataComboBox->getItemText(i) == myCurrentMeanData->getID()) {
346 myMeanDataComboBox->setCurrentItem(i);
347 validMeanData = true;
348 }
349 }
350 if (!validMeanData) {
351 myCurrentMeanData = nullptr;
352 }
353 } else {
354 myCurrentMeanData = nullptr;
355 }
356 // check if enable or disable comboBox
357 if (sortedMeanDatas.size() > 0) {
358 myMeanDataComboBox->enable();
359 // check ifupdate myCurrentMeanData
360 if (myCurrentMeanData == nullptr) {
361 myCurrentMeanData = sortedMeanDatas.begin()->second;
362 }
363 } else {
364 myMeanDataComboBox->disable();
365 }
366 // refresh meanData editor module
367 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
368 // check if show attribute editor
369 if (!afterChangingID) {
370 if (myCurrentMeanData) {
371 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
372 } else {
373 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
374 }
375 }
376}
377
378
379void
381 if (myCurrentMeanData) {
382 myMeanDataComboBox->updateIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());
383 }
384}
385
386
387long
389 // get current meanData type
390 SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
391 // Check if value of myMeanDataMatchBox correspond of an allowed additional tags
392 for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
393 if (meanData.second->getID() == myMeanDataComboBox->getText().text()) {
394 // set pointer
395 myCurrentMeanData = meanData.second;
396 // set color of myMeanDataMatchBox to black (valid)
397 myMeanDataComboBox->setTextColor(FXRGB(0, 0, 0));
398 // refresh meanData editor module
399 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
400 // show modules if selected item is valid
401 myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
402 // update viewNet
403 myMeanDataFrameParent->getViewNet()->updateViewNet();
404 return 1;
405 }
406 }
407 myCurrentMeanData = nullptr;
408 // refresh meanData editor module
409 myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
410 // hide all modules if selected item isn't valid
411 myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
412 // set color of myMeanDataMatchBox to red (invalid)
413 myMeanDataComboBox->setTextColor(FXRGB(255, 0, 0));
414 // update viewNet
415 myMeanDataFrameParent->getViewNet()->updateViewNet();
416 return 1;
417}
418
419// ---------------------------------------------------------------------------
420// GNEMeanDataFrame - methods
421// ---------------------------------------------------------------------------
422
424 GNEFrame(viewParent, viewNet, TL("MeanData")) {
425 // build meanData type selector
427 // build meanData editor
429 // build meanData selector
431 // build meanData attributes editor
433}
434
435
438
439
440void
442 // refresh meanData type selector
444 // show frame
446}
447
448
449void
451 // hide frame
453}
454
455
456void
462
463
464void
467
468/****************************************************************************/
FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[]
#define TEMPORAL_FILENAME
@ MID_GNE_DELETE
delete element
Definition GUIAppEnum.h:943
@ MID_GNE_COPY
copy element
Definition GUIAppEnum.h:953
@ MID_GNE_CREATE
create element
Definition GUIAppEnum.h:941
@ MID_GNE_SET_TYPE
used to select a type of element in a combo box
Definition GUIAppEnum.h:959
#define GUIDesignButton
Definition GUIDesigns.h:82
#define GUIDesignComboBox
Definition GUIDesigns.h:293
#define GUIDesignComboBoxNCol
number of column of every combo box
Definition GUIDesigns.h:311
#define GUIDesignComboBoxVisibleItems
Definition GUIDesigns.h:49
@ MODEMEANDATA
#define TL(string)
Definition MsgHandler.h:301
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:154
virtual void show()
show Frame
Definition GNEFrame.cpp:119
virtual void hide()
hide Frame
Definition GNEFrame.cpp:128
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:146
SumoXMLTag getTag() const
get Tag vinculated with this attribute Property
GNENet * getNet() const
get the net object
A single child window which contains a view of the simulation area.
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
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.