Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/data/GNEGenericDataFrame.cpp
193674 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 GNEGenericDataFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jan 2020
17
///
18
// The Widget for add genericData elements
19
/****************************************************************************/
20
21
#include <netedit/elements/data/GNEDataHandler.h>
22
#include <netedit/elements/data/GNEDataInterval.h>
23
#include <netedit/elements/data/GNEEdgeData.h>
24
#include <netedit/elements/data/GNEEdgeRelData.h>
25
#include <netedit/elements/data/GNETAZRelData.h>
26
#include <netedit/frames/GNEAttributesEditor.h>
27
#include <netedit/frames/GNEPathCreator.h>
28
#include <netedit/GNEApplicationWindow.h>
29
#include <netedit/GNENet.h>
30
#include <netedit/GNETagPropertiesDatabase.h>
31
#include <netedit/GNEViewParent.h>
32
#include <utils/gui/div/GUIDesigns.h>
33
34
#include "GNEGenericDataFrame.h"
35
36
// ===========================================================================
37
// FOX callback mapping
38
// ===========================================================================
39
40
FXDEFMAP(GNEGenericDataFrame::DataSetSelector) DataSetSelectorMap[] = {
41
FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEGenericDataFrame::DataSetSelector::onCmdCreateDataSet),
42
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATASET_NEW, GNEGenericDataFrame::DataSetSelector::onCmdSetNewDataSetID),
43
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATASET_SELECTED, GNEGenericDataFrame::DataSetSelector::onCmdSelectDataSet),
44
FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::DataSetSelector::onCmdSelectCheckButton)
45
};
46
47
FXDEFMAP(GNEGenericDataFrame::IntervalSelector) IntervalSelectorMap[] = {
48
FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEGenericDataFrame::IntervalSelector::onCmdCreateInterval),
49
FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAINTERVAL_SELECTED, GNEGenericDataFrame::IntervalSelector::onCmdSelectInterval),
50
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNEGenericDataFrame::IntervalSelector::onCmdSetIntervalAttribute),
51
FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::IntervalSelector::onCmdSelectCheckButton)
52
};
53
54
FXDEFMAP(GNEGenericDataFrame::AttributeSelector) AttributeSelectorMap[] = {
55
FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::AttributeSelector::onCmdSelectAttribute)
56
};
57
58
// Object implementation
59
FXIMPLEMENT(GNEGenericDataFrame::DataSetSelector, GNEGroupBoxModule, DataSetSelectorMap, ARRAYNUMBER(DataSetSelectorMap))
60
FXIMPLEMENT(GNEGenericDataFrame::IntervalSelector, GNEGroupBoxModule, IntervalSelectorMap, ARRAYNUMBER(IntervalSelectorMap))
61
FXIMPLEMENT(GNEGenericDataFrame::AttributeSelector, GNEGroupBoxModule, AttributeSelectorMap, ARRAYNUMBER(AttributeSelectorMap))
62
63
// ===========================================================================
64
// method definitions
65
// ===========================================================================
66
67
// ---------------------------------------------------------------------------
68
// GNEGenericDataFrame::DataSetSelector - methods
69
// ---------------------------------------------------------------------------
70
71
GNEGenericDataFrame::DataSetSelector::DataSetSelector(GNEGenericDataFrame* genericDataFrameParent) :
72
GNEGroupBoxModule(genericDataFrameParent, TL("DataSet")),
73
myGenericDataFrameParent(genericDataFrameParent) {
74
// create check button for new data set
75
myNewDataSetCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Create new dataSet"), this, MID_GNE_SELECT, GUIDesignCheckButton);
76
// Create MFXComboBoxIcon
77
myDataSetsComboBox = new MFXComboBoxIcon(getCollapsableFrame(), genericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
78
true, GUIDesignComboBoxVisibleItems, this, MID_GNE_DATASET_SELECTED, GUIDesignComboBox);
79
// create new id label
80
myHorizontalFrameNewID = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
81
new FXLabel(myHorizontalFrameNewID, "new dataSet ID", nullptr, GUIDesignLabelThickedFixed(100));
82
// create new id textField
83
myNewDataSetIDTextField = new FXTextField(myHorizontalFrameNewID, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
84
// hide horizontal frame
85
myHorizontalFrameNewID->hide();
86
// create dataSet button
87
myCreateDataSetButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create dataSet"), "", "", GUIIconSubSys::getIcon(GUIIcon::DATASET), this, MID_GNE_CREATE, GUIDesignButton);
88
myCreateDataSetButton->hide();
89
// refresh interval selector
90
refreshDataSetSelector(nullptr);
91
// DataSetSelector is always shown
92
show();
93
}
94
95
96
GNEGenericDataFrame::DataSetSelector::~DataSetSelector() {}
97
98
99
void
100
GNEGenericDataFrame::DataSetSelector::refreshDataSetSelector(const GNEDataSet* currentDataSet) {
101
// clear items
102
myDataSetsComboBox->clearItems();
103
// declare item index
104
int currentItemIndex = -1;
105
// fill myDataSetsComboBox with all DataSets
106
for (const auto& dataSet : myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDataSets()) {
107
// check if we have to set currentItemIndex
108
if ((currentItemIndex == -1) && (dataSet.second == currentDataSet)) {
109
currentItemIndex = myDataSetsComboBox->getNumItems();
110
}
111
myDataSetsComboBox->appendIconItem(dataSet.second->getID().c_str(), dataSet.second->getACIcon());
112
}
113
// check if we have to set current element
114
if (currentItemIndex != -1) {
115
myDataSetsComboBox->setCurrentItem(currentItemIndex, FALSE);
116
if (myGenericDataFrameParent->getIntervalSelector()) {
117
myGenericDataFrameParent->getIntervalSelector()->enableContents();
118
}
119
} else if (myGenericDataFrameParent->getIntervalSelector()) {
120
myGenericDataFrameParent->getIntervalSelector()->disableContents();
121
}
122
// recalc frame
123
recalc();
124
// refresh interval selector
125
if (myGenericDataFrameParent->myIntervalSelector) {
126
myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();
127
}
128
}
129
130
131
GNEDataSet*
132
GNEGenericDataFrame::DataSetSelector::getDataSet() const {
133
if ((myNewDataSetCheckButton->getCheck() == TRUE) || (myDataSetsComboBox->getNumItems() == 0)) {
134
return nullptr;
135
} else {
136
return myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(myDataSetsComboBox->getItemText(myDataSetsComboBox->getCurrentItem()), false);
137
}
138
}
139
140
141
long
142
GNEGenericDataFrame::DataSetSelector::onCmdCreateDataSet(FXObject*, FXSelector, void*) {
143
auto net = myGenericDataFrameParent->getViewNet()->getNet();
144
// first disable interval selector
145
myGenericDataFrameParent->getIntervalSelector()->disableContents();
146
// get string
147
const std::string dataSetID = myNewDataSetIDTextField->getText().text();
148
// check conditions
149
if (myNewDataSetIDTextField->getTextColor() == GUIDesignTextColorRed) {
150
WRITE_WARNING(TL("Invalid dataSet ID"));
151
} else if (dataSetID.empty()) {
152
WRITE_WARNING(TL("Invalid empty dataSet ID"));
153
} else if (net->getAttributeCarriers()->retrieveDataSet(dataSetID, false) != nullptr) {
154
WRITE_WARNING(TL("Invalid duplicated dataSet ID"));
155
} else {
156
// build data set
157
GNEDataHandler dataHandler(net, net->getACTemplates()->getTemplateAC(SUMO_TAG_DATASET)->getFileBucket(),
158
net->getGNEApplicationWindow()->isUndoRedoAllowed());
159
dataHandler.buildDataSet(dataSetID);
160
// refresh tag selector
161
refreshDataSetSelector(myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(dataSetID));
162
// change check button
163
myNewDataSetCheckButton->setCheck(FALSE, TRUE);
164
}
165
return 1;
166
}
167
168
169
long
170
GNEGenericDataFrame::DataSetSelector::onCmdSetNewDataSetID(FXObject*, FXSelector, void*) {
171
//
172
return 1;
173
}
174
175
176
long
177
GNEGenericDataFrame::DataSetSelector::onCmdSelectDataSet(FXObject*, FXSelector, void*) {
178
// update interval modul
179
myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();
180
return 1;
181
}
182
183
184
long
185
GNEGenericDataFrame::DataSetSelector::onCmdSelectCheckButton(FXObject*, FXSelector, void*) {
186
if (myNewDataSetCheckButton->getCheck() == TRUE) {
187
// enable textfield and label
188
myHorizontalFrameNewID->show();
189
myCreateDataSetButton->show();
190
// disable comboBox
191
myDataSetsComboBox->hide();
192
} else {
193
// disable textfield and label
194
myHorizontalFrameNewID->hide();
195
myCreateDataSetButton->hide();
196
// enable comboBox
197
myDataSetsComboBox->show();
198
}
199
// update interval modul
200
myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();
201
// set focus in text field ID
202
myNewDataSetIDTextField->setFocus();
203
return 1;
204
}
205
206
// ---------------------------------------------------------------------------
207
// GNEGenericDataFrame::IntervalSelector - methods
208
// ---------------------------------------------------------------------------
209
210
GNEGenericDataFrame::IntervalSelector::IntervalSelector(GNEGenericDataFrame* genericDataFrameParent) :
211
GNEGroupBoxModule(genericDataFrameParent, TL("Interval")),
212
myGenericDataFrameParent(genericDataFrameParent) {
213
// create check button for new interval
214
myNewIntervalCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Create new interval"), this, MID_GNE_SELECT, GUIDesignCheckButton);
215
// create begin label
216
myHorizontalFrameBegin = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
217
new FXLabel(myHorizontalFrameBegin, toString(SUMO_ATTR_BEGIN).c_str(), nullptr, GUIDesignLabelThickedFixed(100));
218
// create begin TextField
219
myBeginTextField = new FXTextField(myHorizontalFrameBegin, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
220
myBeginTextField->setText("0");
221
// hide horizontal frame begin
222
myHorizontalFrameBegin->hide();
223
// create end label
224
myHorizontalFrameEnd = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
225
new FXLabel(myHorizontalFrameEnd, toString(SUMO_ATTR_END).c_str(), nullptr, GUIDesignLabelThickedFixed(100));
226
// create end textfield
227
myEndTextField = new FXTextField(myHorizontalFrameEnd, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
228
myEndTextField->setText("3600");
229
// hide horizontal frame end
230
myHorizontalFrameEnd->hide();
231
// create interval button
232
myCreateIntervalButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("create interval"), "", "", GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL), this, MID_GNE_CREATE, GUIDesignButton);
233
myCreateIntervalButton->hide();
234
// Create tree list with fixed height
235
myIntervalsTreelist = new FXTreeList(getCollapsableFrame(), this, MID_GNE_DATAINTERVAL_SELECTED, GUIDesignTreeListFixedHeight);
236
myIntervalsTreelist->setHeight(200);
237
// refresh interval selector
238
refreshIntervalSelector();
239
// IntervalSelector is always shown
240
show();
241
}
242
243
244
GNEGenericDataFrame::IntervalSelector::~IntervalSelector() {}
245
246
247
void
248
GNEGenericDataFrame::IntervalSelector::enableContents() const {
249
myNewIntervalCheckButton->enable();
250
myHorizontalFrameBegin->enable();
251
myBeginTextField->enable();
252
myHorizontalFrameEnd->enable();
253
myEndTextField->enable();
254
myCreateIntervalButton->enable();
255
myIntervalsTreelist->enable();
256
}
257
258
259
void
260
GNEGenericDataFrame::IntervalSelector::disableContents() const {
261
myNewIntervalCheckButton->disable();
262
myHorizontalFrameBegin->disable();
263
myBeginTextField->disable();
264
myHorizontalFrameEnd->disable();
265
myEndTextField->disable();
266
myCreateIntervalButton->disable();
267
myIntervalsTreelist->disable();
268
}
269
270
271
void
272
GNEGenericDataFrame::IntervalSelector::refreshIntervalSelector() {
273
// first clear items from tree and intervalMap
274
myIntervalsTreelist->clearItems();
275
myTreeItemIntervalMap.clear();
276
// obtain data set
277
const GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();
278
// add intervals
279
if (dataSet) {
280
// insert dataSetItem in Tree list
281
FXTreeItem* dataSetItem = myIntervalsTreelist->insertItem(
282
nullptr, nullptr,
283
dataSet->getHierarchyName().c_str(),
284
GUIIconSubSys::getIcon(GUIIcon::DATASET),
285
GUIIconSubSys::getIcon(GUIIcon::DATASET));
286
// by default item is expanded
287
dataSetItem->setExpanded(true);
288
// iterate over intevals
289
for (const auto& interval : dataSet->getDataIntervalChildren()) {
290
addIntervalItem(interval.second, dataSetItem);
291
}
292
}
293
// refresh attribute selector
294
if (myGenericDataFrameParent->myAttributeSelector) {
295
myGenericDataFrameParent->myAttributeSelector->refreshAttributeSelector();
296
}
297
// recalc frame
298
recalc();
299
}
300
301
302
GNEDataInterval*
303
GNEGenericDataFrame::IntervalSelector::getDataInterval() const {
304
// first check if there is elements in interval tree
305
if (myIntervalsTreelist->getNumItems() > 0) {
306
for (const auto& treeItem : myTreeItemIntervalMap) {
307
if (treeItem.first->isSelected()) {
308
return treeItem.second;
309
}
310
}
311
}
312
// no GNEDataInterval found, then return nullptr
313
return nullptr;
314
}
315
316
317
long
318
GNEGenericDataFrame::IntervalSelector::onCmdCreateInterval(FXObject*, FXSelector, void*) {
319
// first check that begin and end are valid
320
if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text()) &&
321
GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {
322
// obtain begin and end
323
const double begin = GNEAttributeCarrier::parse<double>(myBeginTextField->getText().text());
324
const double end = GNEAttributeCarrier::parse<double>(myEndTextField->getText().text());
325
// get data set parent
326
GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();
327
if (dataSet && dataSet->checkNewInterval(begin, end)) {
328
// declare dataHandler
329
GNEDataHandler dataHandler(myGenericDataFrameParent->getViewNet()->getNet(), dataSet->getFileBucket(),
330
myGenericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());
331
// build data interval
332
dataHandler.buildDataInterval(nullptr, dataSet->getID(), begin, end);
333
}
334
// disable select interval check button
335
myNewIntervalCheckButton->setCheck(FALSE, TRUE);
336
}
337
return 1;
338
}
339
340
341
long
342
GNEGenericDataFrame::IntervalSelector::onCmdSelectInterval(FXObject*, FXSelector, void*) {
343
// refresh attribute selector
344
myGenericDataFrameParent->myAttributeSelector->refreshAttributeSelector();
345
return 1;
346
}
347
348
349
long
350
GNEGenericDataFrame::IntervalSelector::onCmdSetIntervalAttribute(FXObject* obj, FXSelector, void*) {
351
if (obj == myBeginTextField) {
352
// check if begin value can be parsed to double
353
if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text())) {
354
myBeginTextField->setTextColor(GUIDesignTextColorBlack);
355
myBeginTextField->killFocus();
356
} else {
357
myBeginTextField->setTextColor(GUIDesignTextColorRed);
358
}
359
} else if (obj == myEndTextField) {
360
// check if end value can be parsed to double
361
if (GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {
362
myEndTextField->setTextColor(GUIDesignTextColorBlack);
363
myEndTextField->killFocus();
364
} else {
365
myEndTextField->setTextColor(GUIDesignTextColorRed);
366
}
367
}
368
return 1;
369
}
370
371
372
long
373
GNEGenericDataFrame::IntervalSelector::onCmdSelectCheckButton(FXObject*, FXSelector, void*) {
374
if (myNewIntervalCheckButton->getCheck() == TRUE) {
375
// enable begin and end elements
376
myHorizontalFrameBegin->show();
377
myHorizontalFrameEnd->show();
378
myCreateIntervalButton->show();
379
// refresh begin and end text fields
380
const GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();
381
if (dataSet) {
382
if (dataSet->getDataIntervalChildren().empty()) {
383
// set default interval (1 hour)
384
myBeginTextField->setText("0");
385
myEndTextField->setText("3600");
386
} else {
387
// obtain last data interval
388
const GNEDataInterval* lastDataInterval = dataSet->getDataIntervalChildren().rbegin()->second;
389
const double intervalDuration = lastDataInterval->getAttributeDouble(SUMO_ATTR_END) - lastDataInterval->getAttributeDouble(SUMO_ATTR_BEGIN);
390
// set new begin end
391
myBeginTextField->setText(toString(lastDataInterval->getAttributeDouble(SUMO_ATTR_END)).c_str());
392
myEndTextField->setText(toString(lastDataInterval->getAttributeDouble(SUMO_ATTR_END) + intervalDuration).c_str());
393
}
394
}
395
} else {
396
// disable begin and end elements
397
myHorizontalFrameBegin->hide();
398
myHorizontalFrameEnd->hide();
399
myCreateIntervalButton->hide();
400
}
401
// refresh interval seletor
402
refreshIntervalSelector();
403
return 1;
404
}
405
406
407
FXTreeItem*
408
GNEGenericDataFrame::IntervalSelector::addIntervalItem(GNEDataInterval* dataInterval, FXTreeItem* itemParent) {
409
// insert item in Tree list
410
FXTreeItem* item = myIntervalsTreelist->insertItem(nullptr, itemParent,
411
dataInterval->getHierarchyName().c_str(),
412
GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL),
413
GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL));
414
// insert item in map
415
myTreeItemIntervalMap[item] = dataInterval;
416
// by default item is expanded
417
item->setExpanded(true);
418
// select first item
419
if (myTreeItemIntervalMap.size() == 1) {
420
item->setSelected(TRUE);
421
}
422
// return created FXTreeItem
423
return item;
424
}
425
426
// ---------------------------------------------------------------------------
427
// GNEGenericDataFrame::AttributeSelector - methods
428
// ---------------------------------------------------------------------------
429
430
GNEGenericDataFrame::AttributeSelector::AttributeSelector(GNEGenericDataFrame* genericDataFrameParent, SumoXMLTag tag) :
431
GNEGroupBoxModule(genericDataFrameParent, TL("Data attributes")),
432
myGenericDataFrameParent(genericDataFrameParent),
433
myMinMaxLabel(nullptr),
434
myGenericDataTag(tag) {
435
// Create MFXComboBoxIcon
436
myAttributesComboBox = new MFXComboBoxIcon(getCollapsableFrame(), genericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
437
true, GUIDesignComboBoxVisibleItems, this, MID_GNE_SELECT, GUIDesignComboBox);
438
// build rainbow
439
myMinMaxLabel = buildRainbow(this);
440
// refresh interval selector
441
refreshAttributeSelector();
442
// AttributeSelector is always shown
443
show();
444
}
445
446
447
GNEGenericDataFrame::AttributeSelector::~AttributeSelector() {}
448
449
450
void
451
GNEGenericDataFrame::AttributeSelector::refreshAttributeSelector() {
452
// save current attribute
453
const auto currentAttribute = myAttributesComboBox->getText();
454
// clear items
455
myAttributesComboBox->clearItems();
456
// restore myMinMaxLabel
457
myMinMaxLabel->setText(TL("Scale: Min -> Max"));
458
// fill myAttributesComboBox depending of data sets
459
if (myGenericDataFrameParent->myDataSetSelector->getDataSet() == nullptr) {
460
myAttributesComboBox->appendIconItem("<no dataSet selected>");
461
myAttributesComboBox->disable();
462
} else {
463
// add all item
464
myAttributesComboBox->appendIconItem("<all>");
465
// add attributes depending of interval
466
if (myGenericDataFrameParent->myIntervalSelector->getDataInterval() == nullptr) {
467
const auto parameters = myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveGenericDataParameters(
468
myGenericDataFrameParent->myDataSetSelector->getDataSet()->getID(), toString(myGenericDataTag), "", "");
469
// add all parameters
470
for (const auto& attribute : parameters) {
471
myAttributesComboBox->appendIconItem(attribute.c_str());
472
}
473
} else {
474
// retrieve all parameters within begin and end
475
const auto parameters = myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveGenericDataParameters(
476
myGenericDataFrameParent->myDataSetSelector->getDataSet()->getID(), toString(myGenericDataTag),
477
myGenericDataFrameParent->myIntervalSelector->getDataInterval()->getAttribute(SUMO_ATTR_BEGIN),
478
myGenericDataFrameParent->myIntervalSelector->getDataInterval()->getAttribute(SUMO_ATTR_END));
479
// add all parameters
480
for (const auto& attribute : parameters) {
481
myAttributesComboBox->appendIconItem(attribute.c_str());
482
}
483
}
484
// enable combo Box
485
myAttributesComboBox->enable();
486
// set current item
487
for (int i = 0; i < myAttributesComboBox->getNumItems(); i++) {
488
if (myAttributesComboBox->getItemText(i) == currentAttribute.text()) {
489
myAttributesComboBox->setCurrentItem(i, TRUE);
490
}
491
}
492
}
493
// show parameters
494
if (myGenericDataFrameParent->myGenericDataAttributesEditor) {
495
myGenericDataFrameParent->myGenericDataAttributesEditor->showAttributesEditor(myGenericDataFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(myGenericDataTag), true);
496
}
497
// update view net
498
myGenericDataFrameParent->getViewNet()->updateViewNet();
499
}
500
501
502
std::string
503
GNEGenericDataFrame::AttributeSelector::getFilteredAttribute() const {
504
if (myAttributesComboBox->getNumItems() == 0) {
505
return "";
506
} else if (myAttributesComboBox->getText() == TL("<all>")) {
507
return "";
508
} else {
509
return myAttributesComboBox->getText().text();
510
}
511
}
512
513
514
const RGBColor&
515
GNEGenericDataFrame::AttributeSelector::getScaledColor(const double min, const double max, const double value) const {
516
// update myMinMaxLabel
517
myMinMaxLabel->setText(("Min: " + toString(min) + " -> Max: " + toString(max)).c_str());
518
// return scaled color
519
return GNEViewNetHelper::getRainbowScaledColor(min, max, value);
520
}
521
522
523
SumoXMLTag
524
GNEGenericDataFrame::AttributeSelector::getGenericDataTag() const {
525
return myGenericDataTag;
526
}
527
528
529
long
530
GNEGenericDataFrame::AttributeSelector::onCmdSelectAttribute(FXObject*, FXSelector, void*) {
531
// empty attribute means <all>
532
if (myAttributesComboBox->getText().empty()) {
533
myAttributesComboBox->setCurrentItem(0);
534
}
535
if (myAttributesComboBox->getText() == TL("<all>")) {
536
myMinMaxLabel->setText(TL("Scale: Min -> Max"));
537
}
538
// update view
539
myGenericDataFrameParent->getViewNet()->updateViewNet();
540
return 1;
541
}
542
543
// ---------------------------------------------------------------------------
544
// GNEGenericDataFrame - methods
545
// ---------------------------------------------------------------------------
546
547
const GNEGenericDataFrame::DataSetSelector*
548
GNEGenericDataFrame::getDataSetSelector() const {
549
return myDataSetSelector;
550
}
551
552
553
const GNEGenericDataFrame::IntervalSelector*
554
GNEGenericDataFrame::getIntervalSelector() const {
555
return myIntervalSelector;
556
}
557
558
559
const GNEGenericDataFrame::AttributeSelector*
560
GNEGenericDataFrame::getAttributeSelector() const {
561
return myAttributeSelector;
562
}
563
564
565
GNEPathCreator*
566
GNEGenericDataFrame::getPathCreator() const {
567
return myPathCreator;
568
}
569
570
571
void
572
GNEGenericDataFrame::show() {
573
// first refresh data set selector
574
myDataSetSelector->refreshDataSetSelector(nullptr);
575
// check if there is an edge path creator
576
if (myPathCreator) {
577
myPathCreator->showPathCreatorModule(myViewNet->getNet()->getTagPropertiesDatabase()->getTagProperty(myAttributeSelector->getGenericDataTag(), true), false);
578
}
579
// show frame
580
GNEFrame::show();
581
}
582
583
584
void
585
GNEGenericDataFrame::hide() {
586
if (myPathCreator) {
587
// reset candidate edges
588
for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
589
edge.second->resetCandidateFlags();
590
}
591
}
592
// hide frame
593
GNEFrame::hide();
594
}
595
596
597
void
598
GNEGenericDataFrame::updateFrameAfterUndoRedo() {
599
// refresh data set selector
600
myDataSetSelector->refreshDataSetSelector(nullptr);
601
// check if there is an edge path creator
602
if (myPathCreator) {
603
myPathCreator->showPathCreatorModule(myViewNet->getNet()->getTagPropertiesDatabase()->getTagProperty(myAttributeSelector->getGenericDataTag(), true), false);
604
}
605
}
606
607
608
GNEGenericDataFrame::GNEGenericDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet, SumoXMLTag tag, const bool pathCreator) :
609
GNEFrame(viewParent, viewNet, toString(tag)) {
610
// create DataSetSelector
611
myDataSetSelector = new DataSetSelector(this);
612
// create IntervalSelector module
613
myIntervalSelector = new IntervalSelector(this);
614
// create AttributeSelector module
615
myAttributeSelector = new AttributeSelector(this, tag);
616
// create parameter editor module
617
myGenericDataAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);
618
// create GNEPathCreator module
619
if (pathCreator) {
620
myPathCreator = new GNEPathCreator(this, viewNet->getNet()->getDataPathManager());
621
}
622
}
623
624
625
GNEGenericDataFrame::~GNEGenericDataFrame() {
626
}
627
628
629
void
630
GNEGenericDataFrame::intervalSelected() {
631
//
632
}
633
634
635
bool
636
GNEGenericDataFrame::createPath(const bool /*useLastRoute*/) {
637
// this function has to be reimplemented in all child frames that uses a GNEPathCreator
638
return false;
639
}
640
641
/****************************************************************************/
642
643