Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/data/GNEMeanDataFrame.cpp
169685 views
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
/****************************************************************************/
14
/// @file GNEMeanDataFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Nov 2022
17
///
18
// The Widget for edit meanData elements
19
/****************************************************************************/
20
21
#include <netedit/changes/GNEChange_MeanData.h>
22
#include <netedit/elements/data/GNEMeanData.h>
23
#include <netedit/frames/GNEAttributesEditor.h>
24
#include <netedit/GNEApplicationWindow.h>
25
#include <netedit/GNENet.h>
26
#include <netedit/GNETagPropertiesDatabase.h>
27
#include <netedit/GNEUndoList.h>
28
#include <netedit/GNEViewNet.h>
29
#include <netedit/GNEViewParent.h>
30
#include <utils/gui/div/GUIDesigns.h>
31
#include <utils/gui/windows/GUIAppEnum.h>
32
33
#include "GNEMeanDataFrame.h"
34
35
#define TEMPORAL_FILENAME std::string()
36
37
// ===========================================================================
38
// FOX callback mapping
39
// ===========================================================================
40
41
FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[] = {
42
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem)
43
};
44
45
FXDEFMAP(GNEMeanDataFrame::MeanDataEditor) meanDataEditorMap[] = {
46
FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData),
47
FXMAPFUNC(SEL_COMMAND, MID_GNE_DELETE, GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData),
48
FXMAPFUNC(SEL_COMMAND, MID_GNE_COPY, GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData)
49
};
50
51
FXDEFMAP(GNEMeanDataFrame::MeanDataSelector) meanDataTypeSelectorMap[] = {
52
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem)
53
};
54
55
// Object implementation
56
FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, MFXGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))
57
FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, MFXGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))
58
FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, MFXGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))
59
60
61
// ===========================================================================
62
// method definitions
63
// ===========================================================================
64
65
// ---------------------------------------------------------------------------
66
// GNEMeanDataFrame::MeanDataTypeSelector - methods
67
// ---------------------------------------------------------------------------
68
69
GNEMeanDataFrame::MeanDataTypeSelector::MeanDataTypeSelector(GNEMeanDataFrame* meanDataFrameParent) :
70
MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),
71
myMeanDataFrameParent(meanDataFrameParent) {
72
// Create MFXComboBoxIcon
73
myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), meanDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
74
false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);
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
87
GNEMeanDataFrame::MeanDataTypeSelector::~MeanDataTypeSelector() {}
88
89
90
const GNETagProperties*
91
GNEMeanDataFrame::MeanDataTypeSelector::getCurrentMeanData() const {
92
return myCurrentMeanData;
93
}
94
95
96
void
97
GNEMeanDataFrame::MeanDataTypeSelector::refreshMeanDataTypeSelector() {
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
123
long
124
GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {
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
157
GNEMeanDataFrame::MeanDataEditor::MeanDataEditor(GNEMeanDataFrame* meanDataFrameParent) :
158
MFXGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),
159
myMeanDataFrameParent(meanDataFrameParent) {
160
// Create new meanData
161
myCreateMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create MeanData"), "", "",
162
GUIIconSubSys::getIcon(GUIIcon::MODEMEANDATA), this, MID_GNE_CREATE, GUIDesignButton);
163
// Create delete/reset meanData
164
myDeleteMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Delete MeanData"), "", "",
165
GUIIconSubSys::getIcon(GUIIcon::MODEDELETE), this, MID_GNE_DELETE, GUIDesignButton);
166
// Create copy meanData
167
myCopyMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Copy MeanData"), "", "",
168
GUIIconSubSys::getIcon(GUIIcon::COPY), this, MID_GNE_COPY, GUIDesignButton);
169
}
170
171
172
GNEMeanDataFrame::MeanDataEditor::~MeanDataEditor() {}
173
174
175
void
176
GNEMeanDataFrame::MeanDataEditor::showMeanDataEditorModule() {
177
refreshMeanDataEditorModule();
178
show();
179
}
180
181
182
void
183
GNEMeanDataFrame::MeanDataEditor::hideMeanDataEditorModule() {
184
hide();
185
}
186
187
188
void
189
GNEMeanDataFrame::MeanDataEditor::refreshMeanDataEditorModule() {
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
205
long
206
GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData(FXObject*, FXSelector, void*) {
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
224
long
225
GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData(FXObject*, FXSelector, void*) {
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
239
long
240
GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData(FXObject*, FXSelector, void*) {
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
272
GNEMeanDataFrame::MeanDataSelector::MeanDataSelector(GNEMeanDataFrame* typeFrameParent) :
273
MFXGroupBoxModule(typeFrameParent, TL("Current MeanData")),
274
myMeanDataFrameParent(typeFrameParent),
275
myCurrentMeanData(nullptr) {
276
// get current meanData type
277
SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
278
// Create MFXComboBoxIcon
279
myMeanDataComboBox = new MFXComboBoxIcon(getCollapsableFrame(), typeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
280
false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);
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) {
286
myCurrentMeanData = myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).begin()->second;
287
} else {
288
myCurrentMeanData = nullptr;
289
}
290
// MeanDataSelector is always shown
291
show();
292
}
293
294
295
GNEMeanDataFrame::MeanDataSelector::~MeanDataSelector() {}
296
297
298
void
299
GNEMeanDataFrame::MeanDataSelector::showMeanDataSelector() {
300
// refresh mean data selector
301
refreshMeanDataSelector(false);
302
// show
303
show();
304
}
305
306
307
void
308
GNEMeanDataFrame::MeanDataSelector::hideMeanDataSelector() {
309
// hide attributes editor
310
myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
311
// hide
312
hide();
313
}
314
315
316
GNEMeanData*
317
GNEMeanDataFrame::MeanDataSelector::getCurrentMeanData() const {
318
return myCurrentMeanData;
319
}
320
321
322
void
323
GNEMeanDataFrame::MeanDataSelector::setCurrentMeanData(GNEMeanData* vMeanData) {
324
myCurrentMeanData = vMeanData;
325
refreshMeanDataSelector(false);
326
}
327
328
329
void
330
GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelector(bool afterChangingID) {
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
382
void
383
GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelectorIDs() {
384
if (myCurrentMeanData) {
385
myMeanDataComboBox->updateIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());
386
}
387
}
388
389
390
long
391
GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {
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
426
GNEMeanDataFrame::GNEMeanDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
427
GNEFrame(viewParent, viewNet, TL("MeanData")) {
428
// build meanData type selector
429
myMeanDataTypeSelector = new MeanDataTypeSelector(this);
430
// build meanData editor
431
myMeanDataEditor = new MeanDataEditor(this);
432
// build meanData selector
433
myMeanDataSelector = new MeanDataSelector(this);
434
// build meanData attributes editor
435
myMeanDataAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::EDITOR);
436
}
437
438
439
GNEMeanDataFrame::~GNEMeanDataFrame() {
440
}
441
442
443
void
444
GNEMeanDataFrame::show() {
445
// refresh meanData type selector
446
myMeanDataTypeSelector->refreshMeanDataTypeSelector();
447
// show frame
448
GNEFrame::show();
449
}
450
451
452
void
453
GNEMeanDataFrame::hide() {
454
// hide frame
455
GNEFrame::hide();
456
}
457
458
459
void
460
GNEMeanDataFrame::attributeUpdated(SumoXMLAttr attribute) {
461
if (attribute == SUMO_ATTR_ID) {
462
myMeanDataSelector->refreshMeanDataSelector(true);
463
}
464
}
465
466
467
void
468
GNEMeanDataFrame::updateFrameAfterUndoRedo() {
469
}
470
471
/****************************************************************************/
472
473