Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/dialogs/GNEVClassesDialog.cpp
169678 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 GNEVClassesDialog.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date April 2016
17
///
18
// Dialog for edit allow VClass attribute
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <utils/common/MsgHandler.h>
23
#include <utils/common/StringTokenizer.h>
24
#include <utils/gui/div/GUIDesigns.h>
25
26
#include "GNEVClassesDialog.h"
27
28
// ===========================================================================
29
// FOX callback mapping
30
// ===========================================================================
31
32
FXDEFMAP(GNEVClassesDialog::VClassRow) VClassRowMap[] = {
33
FXMAPFUNC(SEL_COMMAND, MID_GNE_ALLOWVCLASSES_TOGGLE, GNEVClassesDialog::VClassRow::onCmdToggleVClass),
34
};
35
36
FXDEFMAP(GNEVClassesDialog) GNEVClassesDialogMap[] = {
37
FXMAPFUNC(SEL_COMMAND, MID_GNE_ALLOWVCLASSES_SELECTALL, GNEVClassesDialog::onCmdSelectAll),
38
FXMAPFUNC(SEL_COMMAND, MID_GNE_ALLOWVCLASSES_UNSELECTALL, GNEVClassesDialog::onCmdUnselectAll),
39
FXMAPFUNC(SEL_COMMAND, MID_GNE_ALLOWVCLASSES_ONLY_ROAD, GNEVClassesDialog::onCmdSelectOnlyRoad),
40
FXMAPFUNC(SEL_COMMAND, MID_GNE_ALLOWVCLASSES_ONLY_RAIL, GNEVClassesDialog::onCmdSelectOnlyRail),
41
};
42
43
// Object implementation
44
FXIMPLEMENT(GNEVClassesDialog::VClassRow, FXHorizontalFrame, VClassRowMap, ARRAYNUMBER(VClassRowMap))
45
FXIMPLEMENT(GNEVClassesDialog, GNEDialog, GNEVClassesDialogMap, ARRAYNUMBER(GNEVClassesDialogMap))
46
47
// ===========================================================================
48
// member method definitions
49
// ===========================================================================
50
51
// ---------------------------------------------------------------------------
52
// GNEVClassesDialog::VClassRow - methods
53
// ---------------------------------------------------------------------------
54
55
GNEVClassesDialog::VClassRow::VClassRow(FXVerticalFrame* contentsFrame, SUMOVehicleClass vClass,
56
GUIIcon vClassIcon, const std::string& description) :
57
FXHorizontalFrame(contentsFrame, GUIDesignAuxiliarHorizontalFrame),
58
myVClassString(getVehicleClassNames(vClass)) {
59
// add frame for vehicle icons
60
FXLabel* labelVehicleIcon = new FXLabel(this, "", GUIIconSubSys::getIcon(vClassIcon), GUIDesignLabelIcon64x32Thicked);
61
labelVehicleIcon->setBackColor(FXRGBA(255, 255, 255, 255));
62
// create frame for information and button
63
FXVerticalFrame* buttonAndInformationFrame = new FXVerticalFrame(this, GUIDesignAuxiliarHorizontalFrame);
64
FXHorizontalFrame* buttonAndStatusFrame = new FXHorizontalFrame(buttonAndInformationFrame, GUIDesignAuxiliarHorizontalFrame);
65
// create button for enable/disable vehicle class
66
myVClassButton = GUIDesigns::buildFXButton(buttonAndStatusFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::EMPTY),
67
this, MID_GNE_ALLOWVCLASSES_TOGGLE, GUIDesignButtonIcon);
68
// create label for vehicle class name
69
new FXLabel(buttonAndStatusFrame, myVClassString.c_str(), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
70
// create label for description of vehicle
71
new FXLabel(buttonAndInformationFrame, description.c_str(), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
72
}
73
74
75
GNEVClassesDialog::VClassRow::~VClassRow() {
76
77
}
78
79
80
const std::string&
81
GNEVClassesDialog::VClassRow::getVClassString() const {
82
return myVClassString;
83
}
84
85
86
void
87
GNEVClassesDialog::VClassRow::setVClassButtonStatus(const bool enabled) {
88
if (enabled) {
89
myVClassButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
90
} else {
91
myVClassButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::CANCEL));
92
}
93
}
94
95
96
bool
97
GNEVClassesDialog::VClassRow::isVClassButtonEnabled() const {
98
return (myVClassButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
99
}
100
101
102
long
103
GNEVClassesDialog::VClassRow::onCmdToggleVClass(FXObject*, FXSelector, void*) {
104
if (myVClassButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::ACCEPT)) {
105
setVClassButtonStatus(false);
106
} else {
107
setVClassButtonStatus(true);
108
}
109
return 1;
110
}
111
112
// ---------------------------------------------------------------------------
113
// GNEVClassesDialog - methods
114
// ---------------------------------------------------------------------------
115
116
GNEVClassesDialog::GNEVClassesDialog(GNEApplicationWindow* mainWindow, SumoXMLAttr attr,
117
const std::string originalVClasses) :
118
GNEDialog(mainWindow, TLF("Edit vClasses of attribute '%'", toString(attr)), GUIIcon::GREENVEHICLE,
119
DialogType::VCLASS, GNEDialog::Buttons::ACCEPT_CANCEL_RESET, OpenType::MODAL, ResizeMode::STATIC),
120
myOriginalVClasses(originalVClasses),
121
myEditedVClasses(originalVClasses) {
122
// label for selection options
123
new FXLabel(getContentFrame(), TL("Selection options"), nullptr, GUIDesignLabel(JUSTIFY_NORMAL));
124
// horizontal frame uniform for options
125
FXHorizontalFrame* optionsFrame = new FXHorizontalFrame(getContentFrame(), GUIDesignAuxiliarHorizontalFrameUniform);
126
// allow all
127
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::OK), this, MID_GNE_ALLOWVCLASSES_SELECTALL, GUIDesignButtonIcon);
128
new FXLabel(optionsFrame, TL("Allow all vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
129
// only road
130
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::OK), this, MID_GNE_ALLOWVCLASSES_ONLY_ROAD, GUIDesignButtonIcon);
131
new FXLabel(optionsFrame, TL("Allow only road vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
132
// only rail
133
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::OK), this, MID_GNE_ALLOWVCLASSES_ONLY_RAIL, GUIDesignButtonIcon);
134
new FXLabel(optionsFrame, TL("Allow only rail vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
135
// disallow all
136
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::CANCEL), this, MID_GNE_ALLOWVCLASSES_UNSELECTALL, GUIDesignButtonIcon);
137
new FXLabel(optionsFrame, TL("Disallow all vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
138
// label for select vClasses
139
new FXLabel(getContentFrame(), TL("Select vClasses"), nullptr, GUIDesignLabel(JUSTIFY_NORMAL));
140
// Create frame for vehicles's columns
141
FXHorizontalFrame* myVehiclesFrame = new FXHorizontalFrame(getContentFrame(), GUIDesignContentsFrame);
142
// create left frame and fill it
143
FXVerticalFrame* vehiclesLeftFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
144
myVClassMap[SVC_PASSENGER] = new VClassRow(vehiclesLeftFrame, SVC_PASSENGER, GUIIcon::VCLASS_PASSENGER, TL("Default vehicle class"));
145
myVClassMap[SVC_PRIVATE] = new VClassRow(vehiclesLeftFrame, SVC_PRIVATE, GUIIcon::VCLASS_PRIVATE, TL("A passenger car assigned for private use"));
146
myVClassMap[SVC_TAXI] = new VClassRow(vehiclesLeftFrame, SVC_TAXI, GUIIcon::VCLASS_TAXI, TL("Vehicle for hire with a driver"));
147
myVClassMap[SVC_BUS] = new VClassRow(vehiclesLeftFrame, SVC_BUS, GUIIcon::VCLASS_BUS, TL("Urban line traffic"));
148
myVClassMap[SVC_COACH] = new VClassRow(vehiclesLeftFrame, SVC_COACH, GUIIcon::VCLASS_COACH, TL("Overland transport"));
149
myVClassMap[SVC_DELIVERY] = new VClassRow(vehiclesLeftFrame, SVC_DELIVERY, GUIIcon::VCLASS_DELIVERY, TL("Vehicles specialized in delivering goods"));
150
myVClassMap[SVC_TRUCK] = new VClassRow(vehiclesLeftFrame, SVC_TRUCK, GUIIcon::VCLASS_TRUCK, TL("Vehicle designed to transport cargo"));
151
myVClassMap[SVC_TRAILER] = new VClassRow(vehiclesLeftFrame, SVC_TRAILER, GUIIcon::VCLASS_TRAILER, TL("Truck with trailer"));
152
myVClassMap[SVC_EMERGENCY] = new VClassRow(vehiclesLeftFrame, SVC_EMERGENCY, GUIIcon::VCLASS_EMERGENCY, TL("Vehicle designated to respond to an emergency"));
153
myVClassMap[SVC_MOTORCYCLE] = new VClassRow(vehiclesLeftFrame, SVC_MOTORCYCLE, GUIIcon::VCLASS_MOTORCYCLE, TL("Two- or three-wheeled motor vehicle"));
154
myVClassMap[SVC_MOPED] = new VClassRow(vehiclesLeftFrame, SVC_MOPED, GUIIcon::VCLASS_MOPED, TL("Motorcycle not allowed in motorways"));
155
// create center frame and fill it
156
FXVerticalFrame* vehiclesCenterFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
157
myVClassMap[SVC_BICYCLE] = new VClassRow(vehiclesCenterFrame, SVC_BICYCLE, GUIIcon::VCLASS_BICYCLE, TL("Human-powered, pedal-driven vehicle"));
158
myVClassMap[SVC_SCOOTER] = new VClassRow(vehiclesCenterFrame, SVC_SCOOTER, GUIIcon::VCLASS_SCOOTER, TL("An electric scooter or a kick scooter"));
159
myVClassMap[SVC_PEDESTRIAN] = new VClassRow(vehiclesCenterFrame, SVC_PEDESTRIAN, GUIIcon::VCLASS_PEDESTRIAN, TL("Person traveling on foot"));
160
myVClassMap[SVC_WHEELCHAIR] = new VClassRow(vehiclesCenterFrame, SVC_WHEELCHAIR, GUIIcon::VCLASS_WHEELCHAIR, TL("A mobility impaired person"));
161
myVClassMap[SVC_TRAM] = new VClassRow(vehiclesCenterFrame, SVC_TRAM, GUIIcon::VCLASS_TRAM, TL("Rail vehicle which runs on tracks"));
162
myVClassMap[SVC_RAIL_ELECTRIC] = new VClassRow(vehiclesCenterFrame, SVC_RAIL_ELECTRIC, GUIIcon::VCLASS_RAIL_ELECTRIC, TL("Rail electric vehicle"));
163
myVClassMap[SVC_RAIL_FAST] = new VClassRow(vehiclesCenterFrame, SVC_RAIL_FAST, GUIIcon::VCLASS_RAIL_FAST, TL("High-speed rail vehicle"));
164
myVClassMap[SVC_RAIL_URBAN] = new VClassRow(vehiclesCenterFrame, SVC_RAIL_URBAN, GUIIcon::VCLASS_RAIL_URBAN, TL("Heavier than tram"));
165
myVClassMap[SVC_RAIL] = new VClassRow(vehiclesCenterFrame, SVC_RAIL, GUIIcon::VCLASS_RAIL, TL("Heavy rail vehicle"));
166
myVClassMap[SVC_CABLE_CAR] = new VClassRow(vehiclesCenterFrame, SVC_CABLE_CAR, GUIIcon::VCLASS_CABLE_CAR, TL("A conveyance suspended on a cable"));
167
myVClassMap[SVC_SUBWAY] = new VClassRow(vehiclesCenterFrame, SVC_SUBWAY, GUIIcon::VCLASS_SUBWAY, TL("A railway that mostly runs underground"));
168
// create right frame and fill it (8 vehicles)
169
FXVerticalFrame* vehiclesRightFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
170
myVClassMap[SVC_E_VEHICLE] = new VClassRow(vehiclesRightFrame, SVC_E_VEHICLE, GUIIcon::VCLASS_EVEHICLE, TL("Future electric mobility vehicles"));
171
myVClassMap[SVC_ARMY] = new VClassRow(vehiclesRightFrame, SVC_ARMY, GUIIcon::VCLASS_ARMY, TL("Vehicle designed for military forces"));
172
myVClassMap[SVC_SHIP] = new VClassRow(vehiclesRightFrame, SVC_SHIP, GUIIcon::VCLASS_SHIP, TL("Basic class for navigating waterway"));
173
myVClassMap[SVC_AUTHORITY] = new VClassRow(vehiclesRightFrame, SVC_AUTHORITY, GUIIcon::VCLASS_AUTHORITY, TL("Vehicle of a governmental security agency"));
174
myVClassMap[SVC_VIP] = new VClassRow(vehiclesRightFrame, SVC_VIP, GUIIcon::VCLASS_VIP, TL("A civilian security armored car used by VIPs"));
175
myVClassMap[SVC_HOV] = new VClassRow(vehiclesRightFrame, SVC_HOV, GUIIcon::VCLASS_HOV, TL("High-Occupancy Vehicle (two or more passengers)"));
176
myVClassMap[SVC_CONTAINER] = new VClassRow(vehiclesRightFrame, SVC_CONTAINER, GUIIcon::VCLASS_CONTAINER, TL("A transport container"));
177
myVClassMap[SVC_AIRCRAFT] = new VClassRow(vehiclesRightFrame, SVC_AIRCRAFT, GUIIcon::VCLASS_AIRCRAFT, TL("An airplane"));
178
myVClassMap[SVC_DRONE] = new VClassRow(vehiclesRightFrame, SVC_DRONE, GUIIcon::VCLASS_DRONE, TL("A small unmanned robot"));
179
myVClassMap[SVC_CUSTOM1] = new VClassRow(vehiclesRightFrame, SVC_CUSTOM1, GUIIcon::VCLASS_CUSTOM1, TL("Reserved for user-defined semantics"));
180
myVClassMap[SVC_CUSTOM2] = new VClassRow(vehiclesRightFrame, SVC_CUSTOM2, GUIIcon::VCLASS_CUSTOM2, TL("Reserved for user-defined semantics"));
181
// reset dialog
182
onCmdReset(nullptr, 0, nullptr);
183
// open modal dialog
184
openDialog();
185
}
186
187
188
GNEVClassesDialog::~GNEVClassesDialog() {
189
}
190
191
192
void
193
GNEVClassesDialog::runInternalTest(const InternalTestStep::DialogArgument* dialogArgument) {
194
if (dialogArgument->getCustomAction() == "allVehicles") {
195
onCmdSelectAll(nullptr, 0, nullptr);
196
} else if (dialogArgument->getCustomAction() == "disallowAll") {
197
onCmdUnselectAll(nullptr, 0, nullptr);
198
} else if (dialogArgument->getCustomAction() == "onlyRoadVehicles") {
199
onCmdSelectOnlyRoad(nullptr, 0, nullptr);
200
} else if (dialogArgument->getCustomAction() == "onlyRailVehicles") {
201
onCmdSelectOnlyRail(nullptr, 0, nullptr);
202
} else if (SumoVehicleClassStrings.hasString(dialogArgument->getCustomAction())) {
203
myVClassMap[getVehicleClassID(dialogArgument->getCustomAction())]->onCmdToggleVClass(nullptr, 0, nullptr);
204
} else {
205
WRITE_ERROR("Invalid dialog argument " + dialogArgument->getCustomAction() + " used in GNEVClassesDialog::runInternalTest");
206
}
207
}
208
209
210
std::string
211
GNEVClassesDialog::getModifiedVClasses() const {
212
return myEditedVClasses;
213
}
214
215
216
long
217
GNEVClassesDialog::onCmdSelectAll(FXObject*, FXSelector, void*) {
218
// change all icons to accept
219
for (const auto& vClass : myVClassMap) {
220
vClass.second->setVClassButtonStatus(true);
221
}
222
return 1;
223
}
224
225
226
long
227
GNEVClassesDialog::onCmdUnselectAll(FXObject*, FXSelector, void*) {
228
// change all icons to cancel
229
for (const auto& vClass : myVClassMap) {
230
vClass.second->setVClassButtonStatus(false);
231
}
232
return 1;
233
}
234
235
236
long
237
GNEVClassesDialog::onCmdSelectOnlyRoad(FXObject*, FXSelector, void*) {
238
// change all non-road icons to disallow, and allow for the rest
239
for (const auto& vClass : myVClassMap) {
240
if ((vClass.first & (SVC_PEDESTRIAN | SVC_NON_ROAD)) == 0) {
241
vClass.second->setVClassButtonStatus(true);
242
} else {
243
vClass.second->setVClassButtonStatus(false);
244
}
245
}
246
return 1;
247
}
248
249
250
long
251
GNEVClassesDialog::onCmdSelectOnlyRail(FXObject*, FXSelector, void*) {
252
// change all non-road icons to disallow, and allow for the rest
253
for (const auto& vClass : myVClassMap) {
254
if ((vClass.first & SVC_RAIL_CLASSES) != 0) {
255
vClass.second->setVClassButtonStatus(true);
256
} else {
257
vClass.second->setVClassButtonStatus(false);
258
}
259
}
260
return 1;
261
}
262
263
264
long
265
GNEVClassesDialog::onCmdAccept(FXObject*, FXSelector, void*) {
266
bool allSelected = true;
267
// clear allow and disallow VClasses
268
std::vector<std::string> allowedVehicles;
269
for (const auto& vClass : myVClassMap) {
270
// check if vehicle is allowed depending on the Icon
271
if (vClass.second->isVClassButtonEnabled()) {
272
allowedVehicles.push_back(vClass.second->getVClassString());
273
} else {
274
allSelected = false;
275
}
276
}
277
if (allSelected) {
278
myEditedVClasses = "all";
279
} else {
280
myEditedVClasses = joinToString(allowedVehicles, " ");
281
}
282
// Stop Modal if we have a different classes from original
283
if (myEditedVClasses != myOriginalVClasses) {
284
return closeDialogAccepting();
285
} else {
286
return closeDialogCanceling();
287
}
288
}
289
290
291
long
292
GNEVClassesDialog::onCmdCancel(FXObject*, FXSelector, void*) {
293
// reset vClasses
294
myEditedVClasses = myOriginalVClasses;
295
// cancel
296
return closeDialogCanceling();
297
}
298
299
300
long
301
GNEVClassesDialog::onCmdReset(FXObject*, FXSelector, void*) {
302
// reset vClasses
303
myEditedVClasses = myOriginalVClasses;
304
// continue depending of allow
305
if (myEditedVClasses == "all") {
306
// iterate over myVClassMap and set all icons as true
307
for (const auto& vClass : myVClassMap) {
308
vClass.second->setVClassButtonStatus(true);
309
}
310
} else {
311
// declare string vector for saving all vclasses
312
const std::vector<std::string>& allowStringVector = StringTokenizer(myEditedVClasses).getVector();
313
const std::set<std::string> allowSet(allowStringVector.begin(), allowStringVector.end());
314
// iterate over myVClassMap and set icons
315
for (const auto& vClass : myVClassMap) {
316
if (allowSet.count(getVehicleClassNames(vClass.first)) > 0) {
317
vClass.second->setVClassButtonStatus(true);
318
} else {
319
vClass.second->setVClassButtonStatus(false);
320
}
321
}
322
}
323
return 1;
324
}
325
326
/****************************************************************************/
327
328