Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/data/GNEMeanDataFrame.cpp
193833 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2026 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
// ===========================================================================
36
// FOX callback mapping
37
// ===========================================================================
38
39
FXDEFMAP(GNEMeanDataFrame::MeanDataTypeSelector) meanDataSelectorMap[] = {
40
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem)
41
};
42
43
FXDEFMAP(GNEMeanDataFrame::MeanDataEditor) meanDataEditorMap[] = {
44
FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData),
45
FXMAPFUNC(SEL_COMMAND, MID_GNE_DELETE, GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData),
46
FXMAPFUNC(SEL_COMMAND, MID_GNE_COPY, GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData)
47
};
48
49
FXDEFMAP(GNEMeanDataFrame::MeanDataSelector) meanDataTypeSelectorMap[] = {
50
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem)
51
};
52
53
// Object implementation
54
FXIMPLEMENT(GNEMeanDataFrame::MeanDataTypeSelector, GNEGroupBoxModule, meanDataSelectorMap, ARRAYNUMBER(meanDataSelectorMap))
55
FXIMPLEMENT(GNEMeanDataFrame::MeanDataEditor, GNEGroupBoxModule, meanDataEditorMap, ARRAYNUMBER(meanDataEditorMap))
56
FXIMPLEMENT(GNEMeanDataFrame::MeanDataSelector, GNEGroupBoxModule, meanDataTypeSelectorMap, ARRAYNUMBER(meanDataTypeSelectorMap))
57
58
59
// ===========================================================================
60
// method definitions
61
// ===========================================================================
62
63
// ---------------------------------------------------------------------------
64
// GNEMeanDataFrame::MeanDataTypeSelector - methods
65
// ---------------------------------------------------------------------------
66
67
GNEMeanDataFrame::MeanDataTypeSelector::MeanDataTypeSelector(GNEMeanDataFrame* meanDataFrameParent) :
68
GNEGroupBoxModule(meanDataFrameParent, TL("MeanData Type")),
69
myMeanDataFrameParent(meanDataFrameParent) {
70
// Create MFXComboBoxIcon
71
myTypeComboBox = new MFXComboBoxIcon(getCollapsableFrame(), meanDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
72
false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);
73
// add mean data types
74
const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
75
for (const auto& meanDataType : tagPropertiesMeanDatas) {
76
myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
77
}
78
// set DEFAULT_VEHTYPE as default VType
79
myCurrentMeanData = tagPropertiesMeanDatas.front();
80
// MeanDataTypeSelector is always shown
81
show();
82
}
83
84
85
GNEMeanDataFrame::MeanDataTypeSelector::~MeanDataTypeSelector() {}
86
87
88
const GNETagProperties*
89
GNEMeanDataFrame::MeanDataTypeSelector::getCurrentMeanData() const {
90
return myCurrentMeanData;
91
}
92
93
94
void
95
GNEMeanDataFrame::MeanDataTypeSelector::refreshMeanDataTypeSelector() {
96
// clear items
97
myTypeComboBox->clearItems();
98
// add mean data types
99
const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
100
for (const auto& meanDataType : tagPropertiesMeanDatas) {
101
myTypeComboBox->appendIconItem(meanDataType->getTagStr().c_str(), GUIIconSubSys::getIcon(meanDataType->getGUIIcon()));
102
}
103
// make sure that tag is in myTypeMatchBox
104
if (myCurrentMeanData != nullptr) {
105
for (int i = 0; i < (int)myTypeComboBox->getNumItems(); i++) {
106
if (myTypeComboBox->getItemText(i) == myCurrentMeanData->getTagStr()) {
107
myTypeComboBox->setCurrentItem(i);
108
}
109
}
110
} else {
111
myCurrentMeanData = tagPropertiesMeanDatas.front();
112
}
113
// refresh meanData editor module
114
myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
115
// show modules
116
myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
117
myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
118
}
119
120
121
long
122
GNEMeanDataFrame::MeanDataTypeSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {
123
// add mean data types
124
const auto tagPropertiesMeanDatas = myMeanDataFrameParent->getViewNet()->getNet()->getTagPropertiesDatabase()->getTagPropertiesByType(GNETagProperties::Type::MEANDATA);
125
// Check if value of myTypeMatchBox correspond of an allowed additional tags
126
for (const auto& meanDataType : tagPropertiesMeanDatas) {
127
if (meanDataType->getTagStr() == myTypeComboBox->getText().text()) {
128
// set pointer
129
myCurrentMeanData = meanDataType;
130
// set color of myTypeMatchBox to black (valid)
131
myTypeComboBox->setTextColor(GUIDesignTextColorBlack);
132
// refresh meanData editor module
133
myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
134
// show modules if selected item is valid
135
myMeanDataFrameParent->myMeanDataEditor->showMeanDataEditorModule();
136
myMeanDataFrameParent->myMeanDataSelector->showMeanDataSelector();
137
return 1;
138
}
139
}
140
myCurrentMeanData = nullptr;
141
// refresh meanData editor module
142
myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
143
// hide all modules if selected item isn't valid
144
myMeanDataFrameParent->myMeanDataEditor->hideMeanDataEditorModule();
145
myMeanDataFrameParent->myMeanDataSelector->hideMeanDataSelector();
146
// set color of myTypeMatchBox to red (invalid)
147
myTypeComboBox->setTextColor(GUIDesignTextColorRed);
148
return 1;
149
}
150
151
// ---------------------------------------------------------------------------
152
// GNEMeanDataFrame::MeanDataEditor - methods
153
// ---------------------------------------------------------------------------
154
155
GNEMeanDataFrame::MeanDataEditor::MeanDataEditor(GNEMeanDataFrame* meanDataFrameParent) :
156
GNEGroupBoxModule(meanDataFrameParent, TL("MeanData Editor")),
157
myMeanDataFrameParent(meanDataFrameParent) {
158
// Create new meanData
159
myCreateMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create MeanData"), "", "",
160
GUIIconSubSys::getIcon(GUIIcon::MODEMEANDATA), this, MID_GNE_CREATE, GUIDesignButton);
161
// Create delete/reset meanData
162
myDeleteMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Delete MeanData"), "", "",
163
GUIIconSubSys::getIcon(GUIIcon::MODEDELETE), this, MID_GNE_DELETE, GUIDesignButton);
164
// Create copy meanData
165
myCopyMeanDataButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Copy MeanData"), "", "",
166
GUIIconSubSys::getIcon(GUIIcon::COPY), this, MID_GNE_COPY, GUIDesignButton);
167
}
168
169
170
GNEMeanDataFrame::MeanDataEditor::~MeanDataEditor() {}
171
172
173
void
174
GNEMeanDataFrame::MeanDataEditor::showMeanDataEditorModule() {
175
refreshMeanDataEditorModule();
176
show();
177
}
178
179
180
void
181
GNEMeanDataFrame::MeanDataEditor::hideMeanDataEditorModule() {
182
hide();
183
}
184
185
186
void
187
GNEMeanDataFrame::MeanDataEditor::refreshMeanDataEditorModule() {
188
// first check if selected VMeanData is valid
189
if (myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData() == nullptr) {
190
// disable buttons
191
myDeleteMeanDataButton->disable();
192
myCopyMeanDataButton->disable();
193
} else {
194
// enable buttons
195
myDeleteMeanDataButton->enable();
196
myCopyMeanDataButton->enable();
197
}
198
// update module
199
recalc();
200
}
201
202
203
long
204
GNEMeanDataFrame::MeanDataEditor::onCmdCreateMeanData(FXObject*, FXSelector, void*) {
205
auto net = myMeanDataFrameParent->myViewNet->getNet();
206
// get current meanData type
207
SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
208
// obtain a new valid MeanData ID
209
const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
210
// create new meanData
211
GNEMeanData* meanData = new GNEMeanData(myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag(), typeID,
212
net, net->getGNEApplicationWindow()->getFileBucketHandler()->getDefaultBucket(FileBucket::Type::MEANDATA));
213
// add it using undoList (to allow undo-redo)
214
net->getUndoList()->begin(meanData, "create meanData");
215
net->getUndoList()->add(new GNEChange_MeanData(meanData, true), true);
216
net->getUndoList()->end();
217
// set created meanData in selector
218
myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanData);
219
return 1;
220
}
221
222
223
long
224
GNEMeanDataFrame::MeanDataEditor::onCmdDeletetMeanData(FXObject*, FXSelector, void*) {
225
// begin undo list operation
226
myMeanDataFrameParent->myViewNet->getUndoList()->begin(GUIIcon::MODEDELETE, "delete meanData");
227
// remove meanData (and all of their children)
228
myMeanDataFrameParent->myViewNet->getNet()->deleteMeanData(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData(),
229
myMeanDataFrameParent->myViewNet->getUndoList());
230
// end undo list operation
231
myMeanDataFrameParent->myViewNet->getUndoList()->end();
232
// set created meanData in selector
233
myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
234
return 1;
235
}
236
237
238
long
239
GNEMeanDataFrame::MeanDataEditor::onCmdCopyMeanData(FXObject*, FXSelector, void*) {
240
// get current meanData type
241
SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
242
// obtain a new valid MeanData ID
243
const std::string typeID = myMeanDataFrameParent->myViewNet->getNet()->getAttributeCarriers()->generateMeanDataID(meanDataTag);
244
// obtain meanData in which new MeanData will be based
245
GNEMeanData* meanData = dynamic_cast<GNEMeanData*>(myMeanDataFrameParent->myMeanDataSelector->getCurrentMeanData());
246
// check that meanData exist
247
if (meanData) {
248
// create a new MeanData based on the current selected meanData
249
GNEMeanData* meanDataCopy = new GNEMeanData(meanData->getTagProperty()->getTag(), typeID, myMeanDataFrameParent->myViewNet->getNet(),
250
meanData->getFileBucket());
251
// begin undo list operation
252
myMeanDataFrameParent->myViewNet->getUndoList()->begin(meanDataCopy, "copy meanData");
253
// add it using undoList (to allow undo-redo)
254
myMeanDataFrameParent->myViewNet->getUndoList()->add(new GNEChange_MeanData(meanDataCopy, true), true);
255
// end undo list operation
256
myMeanDataFrameParent->myViewNet->getUndoList()->end();
257
// refresh MeanData Selector (to show the new VMeanData)
258
myMeanDataFrameParent->myMeanDataSelector->refreshMeanDataSelector(false);
259
// set created meanData in selector
260
myMeanDataFrameParent->myMeanDataSelector->setCurrentMeanData(meanDataCopy);
261
// refresh MeanData Editor Module
262
myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
263
}
264
return 1;
265
}
266
267
// ---------------------------------------------------------------------------
268
// GNEMeanDataFrame::MeanDataSelector - methods
269
// ---------------------------------------------------------------------------
270
271
GNEMeanDataFrame::MeanDataSelector::MeanDataSelector(GNEMeanDataFrame* typeFrameParent) :
272
GNEGroupBoxModule(typeFrameParent, TL("Current MeanData")),
273
myMeanDataFrameParent(typeFrameParent),
274
myCurrentMeanData(nullptr) {
275
// get current meanData type
276
SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
277
// Create MFXComboBoxIcon
278
myMeanDataComboBox = new MFXComboBoxIcon(getCollapsableFrame(), typeFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
279
false, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);
280
// add meanDatas
281
for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
282
myMeanDataComboBox->appendIconItem(meanData.second->getID().c_str(), meanData.second->getACIcon());
283
}
284
if (myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).size() > 0) {
285
myCurrentMeanData = myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag).begin()->second;
286
} else {
287
myCurrentMeanData = nullptr;
288
}
289
// MeanDataSelector is always shown
290
show();
291
}
292
293
294
GNEMeanDataFrame::MeanDataSelector::~MeanDataSelector() {}
295
296
297
void
298
GNEMeanDataFrame::MeanDataSelector::showMeanDataSelector() {
299
// refresh mean data selector
300
refreshMeanDataSelector(false);
301
// show
302
show();
303
}
304
305
306
void
307
GNEMeanDataFrame::MeanDataSelector::hideMeanDataSelector() {
308
// hide attributes editor
309
myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
310
// hide
311
hide();
312
}
313
314
315
GNEMeanData*
316
GNEMeanDataFrame::MeanDataSelector::getCurrentMeanData() const {
317
return myCurrentMeanData;
318
}
319
320
321
void
322
GNEMeanDataFrame::MeanDataSelector::setCurrentMeanData(GNEMeanData* vMeanData) {
323
myCurrentMeanData = vMeanData;
324
refreshMeanDataSelector(false);
325
}
326
327
328
void
329
GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelector(bool afterChangingID) {
330
// get current meanData type
331
SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
332
// get mean datas sorted by ID
333
std::map<std::string, GNEMeanData*> sortedMeanDatas;
334
for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
335
sortedMeanDatas[meanData.second->getID()] = meanData.second;
336
}
337
// clear items
338
myMeanDataComboBox->clearItems();
339
// fill myMeanDataMatchBox with meanDatas
340
for (const auto& sortedMeanData : sortedMeanDatas) {
341
myMeanDataComboBox->appendIconItem(sortedMeanData.first.c_str(), sortedMeanData.second->getACIcon());
342
}
343
// make sure that mean data exists
344
if (myCurrentMeanData && myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveMeanData(myCurrentMeanData->getTagProperty()->getTag(), myCurrentMeanData->getID(), false)) {
345
bool validMeanData = false;
346
for (int i = 0; i < (int)myMeanDataComboBox->getNumItems(); i++) {
347
if (myMeanDataComboBox->getItemText(i) == myCurrentMeanData->getID()) {
348
myMeanDataComboBox->setCurrentItem(i);
349
validMeanData = true;
350
}
351
}
352
if (!validMeanData) {
353
myCurrentMeanData = nullptr;
354
}
355
} else {
356
myCurrentMeanData = nullptr;
357
}
358
// check if enable or disable comboBox
359
if (sortedMeanDatas.size() > 0) {
360
myMeanDataComboBox->enable();
361
// check ifupdate myCurrentMeanData
362
if (myCurrentMeanData == nullptr) {
363
myCurrentMeanData = sortedMeanDatas.begin()->second;
364
}
365
} else {
366
myMeanDataComboBox->disable();
367
}
368
// refresh meanData editor module
369
myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
370
// check if show attribute editor
371
if (!afterChangingID) {
372
if (myCurrentMeanData) {
373
myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
374
} else {
375
myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
376
}
377
}
378
}
379
380
381
void
382
GNEMeanDataFrame::MeanDataSelector::refreshMeanDataSelectorIDs() {
383
if (myCurrentMeanData) {
384
myMeanDataComboBox->updateIconItem(myMeanDataComboBox->getCurrentItem(), myCurrentMeanData->getID().c_str(), myCurrentMeanData->getACIcon());
385
}
386
}
387
388
389
long
390
GNEMeanDataFrame::MeanDataSelector::onCmdSelectItem(FXObject*, FXSelector, void*) {
391
// get current meanData type
392
SumoXMLTag meanDataTag = myMeanDataFrameParent->myMeanDataTypeSelector->getCurrentMeanData()->getTag();
393
// Check if value of myMeanDataMatchBox correspond of an allowed additional tags
394
for (const auto& meanData : myMeanDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getMeanDatas().at(meanDataTag)) {
395
if (meanData.second->getID() == myMeanDataComboBox->getText().text()) {
396
// set pointer
397
myCurrentMeanData = meanData.second;
398
// set color of myMeanDataMatchBox to black (valid)
399
myMeanDataComboBox->setTextColor(GUIDesignTextColorBlack);
400
// refresh meanData editor module
401
myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
402
// show modules if selected item is valid
403
myMeanDataFrameParent->myMeanDataAttributesEditor->showAttributesEditor(myCurrentMeanData, true);
404
// update viewNet
405
myMeanDataFrameParent->getViewNet()->updateViewNet();
406
return 1;
407
}
408
}
409
myCurrentMeanData = nullptr;
410
// refresh meanData editor module
411
myMeanDataFrameParent->myMeanDataEditor->refreshMeanDataEditorModule();
412
// hide all modules if selected item isn't valid
413
myMeanDataFrameParent->myMeanDataAttributesEditor->hideAttributesEditor();
414
// set color of myMeanDataMatchBox to red (invalid)
415
myMeanDataComboBox->setTextColor(GUIDesignTextColorRed);
416
// update viewNet
417
myMeanDataFrameParent->getViewNet()->updateViewNet();
418
return 1;
419
}
420
421
// ---------------------------------------------------------------------------
422
// GNEMeanDataFrame - methods
423
// ---------------------------------------------------------------------------
424
425
GNEMeanDataFrame::GNEMeanDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
426
GNEFrame(viewParent, viewNet, TL("MeanData")) {
427
// build meanData type selector
428
myMeanDataTypeSelector = new MeanDataTypeSelector(this);
429
// build meanData editor
430
myMeanDataEditor = new MeanDataEditor(this);
431
// build meanData selector
432
myMeanDataSelector = new MeanDataSelector(this);
433
// build meanData attributes editor
434
myMeanDataAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::EDITOR);
435
}
436
437
438
GNEMeanDataFrame::~GNEMeanDataFrame() {
439
}
440
441
442
void
443
GNEMeanDataFrame::show() {
444
// refresh meanData type selector
445
myMeanDataTypeSelector->refreshMeanDataTypeSelector();
446
// show frame
447
GNEFrame::show();
448
}
449
450
451
void
452
GNEMeanDataFrame::hide() {
453
// hide frame
454
GNEFrame::hide();
455
}
456
457
458
void
459
GNEMeanDataFrame::attributeUpdated(SumoXMLAttr attribute) {
460
if (attribute == SUMO_ATTR_ID) {
461
myMeanDataSelector->refreshMeanDataSelector(true);
462
}
463
}
464
465
466
void
467
GNEMeanDataFrame::updateFrameAfterUndoRedo() {
468
}
469
470
/****************************************************************************/
471
472