Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/demand/GNEDistributionFrame.cpp
193780 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 GNEDistributionFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jun 2023
17
///
18
// The Widget for edit distribution elements
19
/****************************************************************************/
20
21
#include <netedit/changes/GNEChange_DemandElement.h>
22
#include <netedit/dialogs/elements/GNEDistributionRefDialog.h>
23
#include <netedit/elements/demand/GNERouteDistribution.h>
24
#include <netedit/elements/demand/GNEVTypeDistribution.h>
25
#include <netedit/frames/GNEAttributesEditor.h>
26
#include <netedit/GNEApplicationWindow.h>
27
#include <netedit/GNENet.h>
28
#include <netedit/GNETagProperties.h>
29
#include <netedit/GNEUndoList.h>
30
#include <netedit/GNEViewParent.h>
31
#include <utils/foxtools/MFXTextFieldIcon.h>
32
#include <utils/gui/div/GUIDesigns.h>
33
34
#include "GNEDistributionFrame.h"
35
36
#define TEMPORAL_FILENAME std::string()
37
38
// ===========================================================================
39
// FOX callback mapping
40
// ===========================================================================
41
42
FXDEFMAP(GNEDistributionFrame::DistributionEditor) DistributionEditorMap[] = {
43
FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEDistributionFrame::DistributionEditor::onCmdCreateDistribution),
44
FXMAPFUNC(SEL_COMMAND, MID_GNE_DELETE, GNEDistributionFrame::DistributionEditor::onCmdDeleteDistribution),
45
FXMAPFUNC(SEL_UPDATE, MID_GNE_DELETE, GNEDistributionFrame::DistributionEditor::onUpdDeleteDistribution),
46
};
47
48
FXDEFMAP(GNEDistributionFrame::DistributionSelector) DistributionSelectorMap[] = {
49
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_TYPE, GNEDistributionFrame::DistributionSelector::onCmdSelectDistribution),
50
FXMAPFUNC(SEL_UPDATE, MID_GNE_SET_TYPE, GNEDistributionFrame::DistributionSelector::onCmdUpdateDistribution)
51
};
52
53
54
FXDEFMAP(GNEDistributionFrame::DistributionRow) DistributionRowMap[] = {
55
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNEDistributionFrame::DistributionRow::onCmdSetProbability)
56
};
57
58
FXDEFMAP(GNEDistributionFrame::DistributionValuesEditor) DistributionValuesEditorMap[] = {
59
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ADD, GNEDistributionFrame::DistributionValuesEditor::onCmdAddRow),
60
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_REMOVE, GNEDistributionFrame::DistributionValuesEditor::onCmdRemoveRow)
61
};
62
63
// Object implementation
64
FXIMPLEMENT(GNEDistributionFrame::DistributionEditor, GNEGroupBoxModule, DistributionEditorMap, ARRAYNUMBER(DistributionEditorMap))
65
FXIMPLEMENT(GNEDistributionFrame::DistributionSelector, GNEGroupBoxModule, DistributionSelectorMap, ARRAYNUMBER(DistributionSelectorMap))
66
FXIMPLEMENT(GNEDistributionFrame::DistributionRow, FXHorizontalFrame, DistributionRowMap, ARRAYNUMBER(DistributionRowMap))
67
FXIMPLEMENT(GNEDistributionFrame::DistributionValuesEditor, GNEGroupBoxModule, DistributionValuesEditorMap, ARRAYNUMBER(DistributionValuesEditorMap))
68
69
70
// ===========================================================================
71
// method definitions
72
// ===========================================================================
73
74
// ---------------------------------------------------------------------------
75
// GNEDistributionFrame::DistributionEditor - methods
76
// ---------------------------------------------------------------------------
77
78
GNEDistributionFrame::DistributionEditor::DistributionEditor(GNEFrame* frameParent, SumoXMLTag distributionTag, GUIIcon icon) :
79
GNEGroupBoxModule(frameParent, TL("Distribution Editor")),
80
myFrameParent(frameParent),
81
myDistributionTag(distributionTag) {
82
// get staticTooltip menu
83
auto staticTooltipMenu = myFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu();
84
// Create new distribution
85
myCreateDistributionButton = new MFXButtonTooltip(getCollapsableFrame(), staticTooltipMenu, TL("New"),
86
GUIIconSubSys::getIcon(icon), this, MID_GNE_CREATE, GUIDesignButton);
87
myCreateDistributionButton->setTipText(TLF("Create new %", toString(myDistributionTag)).c_str()),
88
// Delete distribution
89
myDeleteDistributionButton = new MFXButtonTooltip(getCollapsableFrame(), staticTooltipMenu, TL("Delete"),
90
GUIIconSubSys::getIcon(GUIIcon::MODEDELETE), this, MID_GNE_DELETE, GUIDesignButton);
91
myDeleteDistributionButton->setTipText(TLF("Delete current edited %", toString(myDistributionTag)).c_str()),
92
// show editor
93
show();
94
}
95
96
97
GNEDistributionFrame::DistributionEditor::~DistributionEditor() {}
98
99
100
SumoXMLTag
101
GNEDistributionFrame::DistributionEditor::getDistributionTag() const {
102
return myDistributionTag;
103
}
104
105
106
long
107
GNEDistributionFrame::DistributionEditor::onCmdCreateDistribution(FXObject*, FXSelector, void*) {
108
auto undoList = myFrameParent->getViewNet()->getUndoList();
109
// obtain a new valid ID
110
const auto distributionID = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->generateDemandElementID(myDistributionTag);
111
// get bucket
112
auto bucket = myFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(myDistributionTag)->getFileBucket();
113
// create new distribution
114
GNEDemandElement* distribution = nullptr;
115
if (myDistributionTag == SUMO_TAG_VTYPE_DISTRIBUTION) {
116
distribution = new GNEVTypeDistribution(distributionID, myFrameParent->getViewNet()->getNet(), bucket, -1);
117
} else if (myDistributionTag == SUMO_TAG_ROUTE_DISTRIBUTION) {
118
distribution = new GNERouteDistribution(distributionID, myFrameParent->getViewNet()->getNet(), bucket);
119
} else {
120
throw ProcessError("Invalid distribution");
121
}
122
// add it using undoList (to allow undo-redo)
123
undoList->begin(distribution->getTagProperty()->getGUIIcon(), "create distribution");
124
undoList->add(new GNEChange_DemandElement(distribution, true), true);
125
undoList->end();
126
// refresh selector using created distribution
127
myDistributionSelector->setDistribution(distribution);
128
return 1;
129
}
130
131
132
long
133
GNEDistributionFrame::DistributionEditor::onCmdDeleteDistribution(FXObject*, FXSelector, void*) {
134
auto undoList = myFrameParent->getViewNet()->getUndoList();
135
auto currentDistribution = myDistributionSelector->getCurrentDistribution();
136
if (currentDistribution) {
137
// begin undo list operation
138
undoList->begin(currentDistribution->getTagProperty()->getGUIIcon(), "delete " + currentDistribution->getTagProperty()->getTagStr() + " distribution");
139
// remove distribution
140
myFrameParent->getViewNet()->getNet()->deleteDemandElement(myDistributionSelector->getCurrentDistribution(), undoList);
141
// end undo list operation
142
undoList->end();
143
// refresh selector
144
myDistributionSelector->refreshDistributionSelector();
145
}
146
return 1;
147
}
148
149
150
long
151
GNEDistributionFrame::DistributionEditor::onUpdDeleteDistribution(FXObject* sender, FXSelector, void*) {
152
// check if we have a selected distribution
153
if (myDistributionSelector->getCurrentDistribution()) {
154
return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
155
} else {
156
return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
157
}
158
}
159
160
// ---------------------------------------------------------------------------
161
// GNETypeFrame::DistributionSelector - methods
162
// ---------------------------------------------------------------------------
163
164
GNEDistributionFrame::DistributionSelector::DistributionSelector(GNEFrame* frameParent) :
165
GNEGroupBoxModule(frameParent, TL("Distribution selector")),
166
myFrameParent(frameParent) {
167
// Create MFXComboBoxIcon
168
myDistributionsComboBox = new MFXComboBoxIcon(getCollapsableFrame(), frameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),
169
true, GUIDesignComboBoxVisibleItems, this, MID_GNE_SET_TYPE, GUIDesignComboBox);
170
// DistributionSelector is always shown
171
show();
172
}
173
174
175
GNEDistributionFrame::DistributionSelector::~DistributionSelector() {}
176
177
178
void
179
GNEDistributionFrame::DistributionSelector::setDistribution(GNEDemandElement* distribution) {
180
myCurrentDistribution = distribution;
181
refreshDistributionSelector();
182
}
183
184
185
GNEDemandElement*
186
GNEDistributionFrame::DistributionSelector::getCurrentDistribution() const {
187
return myCurrentDistribution;
188
189
}
190
191
192
void
193
GNEDistributionFrame::DistributionSelector::refreshDistributionIDs() {
194
// fill distributions
195
fillDistributionComboBox();
196
// set current item
197
for (int i = 0; i < (int)myDistributionsComboBox->getNumItems(); i++) {
198
if (myDistributionsComboBox->getItemText(i) == myCurrentDistribution->getID()) {
199
myDistributionsComboBox->setCurrentItem(i);
200
}
201
}
202
}
203
204
205
void
206
GNEDistributionFrame::DistributionSelector::refreshDistributionSelector() {
207
// fill distributions
208
const auto distributions = fillDistributionComboBox();
209
// update current distribution (used if myCurrentDistribution was deleted during undo-redo)
210
myCurrentDistribution = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDemandElement(myCurrentDistribution, false);
211
// update comboBox
212
if (myCurrentDistribution) {
213
for (int i = 0; i < (int)myDistributionsComboBox->getNumItems(); i++) {
214
if (myDistributionsComboBox->getItemText(i) == myCurrentDistribution->getID()) {
215
myDistributionsComboBox->setCurrentItem(i);
216
}
217
}
218
} else if (distributions.size() > 0) {
219
// set first distribution
220
myCurrentDistribution = distributions.begin()->second;
221
}
222
// continue depending of myCurrentDistribution
223
if (myCurrentDistribution) {
224
// show modules
225
myAttributesEditor->showAttributesEditor(myCurrentDistribution, true);
226
myDistributionValuesEditor->showDistributionValuesEditor();
227
} else {
228
// hide modules
229
myAttributesEditor->hideAttributesEditor();
230
myDistributionValuesEditor->hideDistributionValuesEditor();
231
}
232
}
233
234
235
long
236
GNEDistributionFrame::DistributionSelector::onCmdSelectDistribution(FXObject*, FXSelector, void*) {
237
const auto viewNet = myFrameParent->getViewNet();
238
const auto& distributions = viewNet->getNet()->getAttributeCarriers()->getDemandElements().at(myDistributionEditor->getDistributionTag());
239
// Check if value of myTypeMatchBox correspond of an allowed additional tags
240
for (const auto& distribution : distributions) {
241
if (distribution.second->getID() == myDistributionsComboBox->getText().text()) {
242
// set pointer
243
myCurrentDistribution = distribution.second;
244
// set color of myTypeMatchBox to black (valid)
245
myDistributionsComboBox->setTextColor(GUIDesignTextColorBlack);
246
// show modules
247
myAttributesEditor->showAttributesEditor(distribution.second, true);
248
myDistributionValuesEditor->showDistributionValuesEditor();
249
// update viewNet
250
viewNet->updateViewNet();
251
return 1;
252
}
253
}
254
// not found, then reset myCurrentDistribution
255
myCurrentDistribution = nullptr;
256
// hide modules
257
myAttributesEditor->hideAttributesEditor();
258
myDistributionValuesEditor->hideDistributionValuesEditor();
259
// set color of myTypeMatchBox to red (invalid)
260
myDistributionsComboBox->setTextColor(GUIDesignTextColorRed);
261
// update viewNet
262
viewNet->updateViewNet();
263
return 1;
264
}
265
266
267
long
268
GNEDistributionFrame::DistributionSelector::onCmdUpdateDistribution(FXObject* sender, FXSelector, void*) {
269
const auto& demandElements = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements();
270
if (demandElements.at(myDistributionEditor->getDistributionTag()).size() > 0) {
271
return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
272
} else {
273
return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
274
}
275
}
276
277
278
std::map<std::string, GNEDemandElement*>
279
GNEDistributionFrame::DistributionSelector::fillDistributionComboBox() {
280
// get ACs
281
const auto& ACs = myFrameParent->getViewNet()->getNet()->getAttributeCarriers();
282
// clear items
283
myDistributionsComboBox->clearItems();
284
// fill with distributions sorted by ID
285
std::map<std::string, GNEDemandElement*> distributions;
286
for (const auto& distribution : ACs->getDemandElements().at(myDistributionEditor->getDistributionTag())) {
287
distributions[distribution.second->getID()] = distribution.second;
288
}
289
for (const auto& distribution : distributions) {
290
myDistributionsComboBox->appendIconItem(distribution.first.c_str(), distribution.second->getACIcon());
291
}
292
// return distributions sorted by ID
293
return distributions;
294
}
295
296
// ---------------------------------------------------------------------------
297
// GNEDistributionFrame::DistributionRow - methods
298
// ---------------------------------------------------------------------------
299
300
GNEDistributionFrame::DistributionRow::DistributionRow(DistributionValuesEditor* attributeEditorParent, GNEDemandElement* distributionReference) :
301
FXHorizontalFrame(attributeEditorParent->getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame),
302
myDistributionValuesEditorParent(attributeEditorParent),
303
myDistributionReference(distributionReference) {
304
// get staticTooltip menu
305
auto staticTooltipMenu = attributeEditorParent->getFrameParent()->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu();
306
// create label
307
myIconLabel = new FXLabel(this, "", myDistributionReference->getACIcon(), GUIDesignLabelIconThick);
308
// Create and disable MFXTextFieldIcon for string attributes
309
myIDTextField = new MFXTextFieldIcon(this, staticTooltipMenu, GUIIcon::EMPTY, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFieldFixed(100 - GUIDesignHeight));
310
myIDTextField->disable();
311
// Create MFXTextFieldIcon for string attributes
312
myProbabilityTextField = new MFXTextFieldIcon(this, staticTooltipMenu, GUIIcon::EMPTY, this, MID_GNE_SET_ATTRIBUTE,
313
GUIDesignTextFieldRestricted(TEXTFIELD_REAL));
314
// create delete buton
315
myDeleteRowButton = new MFXButtonTooltip(this, staticTooltipMenu, "", GUIIconSubSys::getIcon(GUIIcon::REMOVE),
316
myDistributionValuesEditorParent, MID_GNE_BUTTON_REMOVE, GUIDesignButtonIcon);
317
myDeleteRowButton->setTipText(TL("Delete distribution value"));
318
// only create if parent was created
319
if (getParent()->id() && attributeEditorParent->myDistributionSelector->getCurrentDistribution()) {
320
// create DistributionRow
321
FXHorizontalFrame::create();
322
// set values
323
myIDTextField->setText(myDistributionReference->getAttribute(SUMO_ATTR_REFID).c_str());
324
myProbabilityTextField->setText(myDistributionReference->getAttribute(SUMO_ATTR_PROB).c_str());
325
// set color depending if attribute is computed
326
if (myDistributionReference->isAttributeComputed(SUMO_ATTR_PROB)) {
327
myProbabilityTextField->setTextColor(MFXUtils::getFXColor(RGBColor::BLUE));
328
} else {
329
myProbabilityTextField->setTextColor(MFXUtils::getFXColor(RGBColor::BLACK));
330
}
331
// Show DistributionRow
332
show();
333
}
334
}
335
336
337
void
338
GNEDistributionFrame::DistributionRow::destroy() {
339
// only destroy if parent was created
340
if (getParent()->id()) {
341
FXHorizontalFrame::destroy();
342
}
343
}
344
345
346
GNEDemandElement*
347
GNEDistributionFrame::DistributionRow::getDistributionReference() const {
348
return myDistributionReference;
349
}
350
351
352
MFXButtonTooltip*
353
GNEDistributionFrame::DistributionRow::getDeleteRowButton() const {
354
return myDeleteRowButton;
355
}
356
357
358
long
359
GNEDistributionFrame::DistributionRow::onCmdSetProbability(FXObject*, FXSelector, void*) {
360
// set default value if value is empty
361
if (myProbabilityTextField->getText().empty()) {
362
myProbabilityTextField->setText(myDistributionReference->getTagProperty()->getAttributeProperties(SUMO_ATTR_PROB)->getDefaultStringValue().c_str());
363
}
364
// if is valid, update value in AC
365
if (myDistributionReference->isValid(SUMO_ATTR_PROB, myProbabilityTextField->getText().text())) {
366
myDistributionReference->setAttribute(SUMO_ATTR_PROB, myProbabilityTextField->getText().text(), myDistributionReference->getNet()->getUndoList());
367
myDistributionValuesEditorParent->updateSumLabel();
368
// update probablity text field (needed for show the default value)
369
myProbabilityTextField->setText(myDistributionReference->getAttribute(SUMO_ATTR_PROB).c_str(), FALSE);
370
// set color depending if attribute is computed
371
if (myDistributionReference->isAttributeComputed(SUMO_ATTR_PROB)) {
372
myProbabilityTextField->setTextColor(MFXUtils::getFXColor(RGBColor::BLUE));
373
} else {
374
myProbabilityTextField->setTextColor(MFXUtils::getFXColor(RGBColor::BLACK));
375
}
376
myProbabilityTextField->killFocus();
377
} else {
378
myProbabilityTextField->setTextColor(MFXUtils::getFXColor(RGBColor::RED));
379
}
380
return 1;
381
}
382
383
// ---------------------------------------------------------------------------
384
// GNEDistributionFrame::DistributionValuesEditor - methods
385
// ---------------------------------------------------------------------------
386
387
GNEDistributionFrame::DistributionValuesEditor::DistributionValuesEditor(GNEFrame* frameParent, DistributionEditor* distributionEditor,
388
DistributionSelector* distributionSelector, GNEAttributesEditor* attributesEditor) :
389
GNEGroupBoxModule(frameParent, TL("Distribution values")),
390
myFrameParent(frameParent),
391
myDistributionEditor(distributionEditor),
392
myDistributionSelector(distributionSelector),
393
myAttributesEditor(attributesEditor) {
394
// set relations
395
myDistributionEditor->myDistributionSelector = myDistributionSelector;
396
myDistributionSelector->myDistributionEditor = myDistributionEditor;
397
myDistributionSelector->myAttributesEditor = myAttributesEditor;
398
myDistributionSelector->myDistributionValuesEditor = this;
399
// get staticTooltip menu
400
auto staticTooltipMenu = frameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu();
401
// Create bot frame elements
402
myBotFrame = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
403
myAddButton = new MFXButtonTooltip(myBotFrame, staticTooltipMenu, "", GUIIconSubSys::getIcon(GUIIcon::ADD), this, MID_GNE_BUTTON_ADD, GUIDesignButtonIcon);
404
myAddButton->setTipText(TL("Add new distribution value"));
405
new FXHorizontalFrame(myBotFrame, GUIDesignAuxiliarHorizontalFrame);
406
new FXLabel(myBotFrame, "", GUIIconSubSys::getIcon(GUIIcon::SUM), GUIDesignLabelIconThick);
407
mySumLabel = new FXLabel(myBotFrame, "", nullptr, GUIDesignLabelThickedFixed(50));
408
new FXLabel(myBotFrame, "", GUIIconSubSys::getIcon(GUIIcon::EMPTY), GUIDesignLabelFixed(GUIDesignHeight));
409
}
410
411
412
void
413
GNEDistributionFrame::DistributionValuesEditor::showDistributionValuesEditor() {
414
// remake rows
415
refreshRows();
416
// show DistributionValuesEditor
417
show();
418
}
419
420
421
void
422
GNEDistributionFrame::DistributionValuesEditor::hideDistributionValuesEditor() {
423
// hide also DistributionValuesEditor
424
hide();
425
}
426
427
428
void
429
GNEDistributionFrame::DistributionValuesEditor::refreshRows() {
430
// first remove all rows
431
for (auto& row : myDistributionRows) {
432
// destroy and delete all rows
433
if (row != nullptr) {
434
row->destroy();
435
delete row;
436
row = nullptr;
437
}
438
}
439
myDistributionRows.clear();
440
// continue if we have a distribution to edit
441
if (myDistributionSelector->getCurrentDistribution()) {
442
// Iterate over distribution key-values
443
for (const auto& distributionRef : myDistributionSelector->getCurrentDistribution()->getChildDemandElements()) {
444
if (distributionRef->getTagProperty()->isDistributionReference()) {
445
if (distributionRef->getTagProperty()->isDistributionReference() && (distributionRef->getParentDemandElements().front() == myDistributionSelector->getCurrentDistribution())) {
446
// create distribution row
447
auto distributionRow = new DistributionRow(this, distributionRef);
448
// add into distribution rows
449
myDistributionRows.push_back(distributionRow);
450
}
451
} else {
452
// update geometry of vehicle
453
distributionRef->updateGeometry();
454
}
455
}
456
}
457
// check if enable or disable add button
458
if (myDistributionRows.size() > 0) {
459
myAddButton->enable();
460
} else {
461
myAddButton->disable();
462
}
463
// update sum label
464
updateSumLabel();
465
// reparent bot frame button (to place it at bottom)
466
myBotFrame->reparent(getCollapsableFrame());
467
}
468
469
470
GNEFrame*
471
GNEDistributionFrame::DistributionValuesEditor::getFrameParent() const {
472
return myFrameParent;
473
}
474
475
476
long
477
GNEDistributionFrame::DistributionValuesEditor::onCmdAddRow(FXObject*, FXSelector, void*) {
478
// open distribution dialog
479
GNEDistributionRefDialog distributionDialog(myDistributionSelector->getCurrentDistribution());
480
// only refresh if we added a new row
481
if (distributionDialog.getResult() == GNEDialog::Result::ACCEPT) {
482
refreshRows();
483
}
484
return 1;
485
}
486
487
488
long
489
GNEDistributionFrame::DistributionValuesEditor::onCmdRemoveRow(FXObject* obj, FXSelector, void*) {
490
for (const auto& row : myDistributionRows) {
491
if (row->getDeleteRowButton() == obj) {
492
myFrameParent->getViewNet()->getNet()->deleteDemandElement(row->getDistributionReference(), myFrameParent->getViewNet()->getUndoList());
493
return 1;
494
}
495
}
496
return 1;
497
}
498
499
500
void
501
GNEDistributionFrame::DistributionValuesEditor::updateSumLabel() {
502
// update probability
503
double sumProbability = 0;
504
if (myDistributionSelector->getCurrentDistribution()) {
505
for (const auto& distributionRef : myDistributionSelector->getCurrentDistribution()->getChildDemandElements()) {
506
if (distributionRef->getTagProperty()->isDistributionReference()) {
507
sumProbability += distributionRef->getAttributeDouble(SUMO_ATTR_PROB);
508
}
509
}
510
// vType distributions
511
if (myDistributionSelector->getCurrentDistribution()->getTagProperty()->getTag() == SUMO_TAG_VTYPE_DISTRIBUTION) {
512
const auto& vTypes = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_VTYPE);
513
if (vTypes.size() == myDistributionRows.size()) {
514
myAddButton->disable();
515
} else {
516
myAddButton->enable();
517
}
518
}
519
// route distribution
520
if (myDistributionSelector->getCurrentDistribution()->getTagProperty()->getTag() == SUMO_TAG_ROUTE_DISTRIBUTION) {
521
const auto& routes = myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_ROUTE);
522
if (routes.size() == myDistributionRows.size()) {
523
myAddButton->disable();
524
} else {
525
myAddButton->enable();
526
}
527
}
528
} else {
529
myAddButton->disable();
530
}
531
mySumLabel->setText(toString(sumProbability).c_str());
532
}
533
534
/****************************************************************************/
535
536