Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/dialogs/GNEVClassesDialog.cpp
193735 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 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* applicationWindow, SumoXMLAttr attr,
117
const std::string originalVClasses) :
118
GNEDialog(applicationWindow, 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
// build dialog
123
builder();
124
}
125
126
127
GNEVClassesDialog::GNEVClassesDialog(GNEApplicationWindow* applicationWindow, GNEDialog* parentDialog,
128
SumoXMLAttr attr, const std::string originalVClasses) :
129
GNEDialog(applicationWindow, parentDialog, TLF("Edit vClasses of attribute '%'", toString(attr)), GUIIcon::GREENVEHICLE,
130
DialogType::VCLASS, GNEDialog::Buttons::ACCEPT_CANCEL_RESET, OpenType::MODAL, ResizeMode::STATIC),
131
myOriginalVClasses(originalVClasses),
132
myEditedVClasses(originalVClasses) {
133
// build dialog
134
builder();
135
}
136
137
138
GNEVClassesDialog::~GNEVClassesDialog() {
139
}
140
141
142
void
143
GNEVClassesDialog::runInternalTest(const InternalTestStep::DialogArgument* dialogArgument) {
144
if (dialogArgument->getCustomAction() == "allVehicles") {
145
onCmdSelectAll(nullptr, 0, nullptr);
146
} else if (dialogArgument->getCustomAction() == "disallowAll") {
147
onCmdUnselectAll(nullptr, 0, nullptr);
148
} else if (dialogArgument->getCustomAction() == "onlyRoadVehicles") {
149
onCmdSelectOnlyRoad(nullptr, 0, nullptr);
150
} else if (dialogArgument->getCustomAction() == "onlyRailVehicles") {
151
onCmdSelectOnlyRail(nullptr, 0, nullptr);
152
} else if (SumoVehicleClassStrings.hasString(dialogArgument->getCustomAction())) {
153
myVClassMap[getVehicleClassID(dialogArgument->getCustomAction())]->onCmdToggleVClass(nullptr, 0, nullptr);
154
} else {
155
WRITE_ERROR("Invalid dialog argument " + dialogArgument->getCustomAction() + " used in GNEVClassesDialog::runInternalTest");
156
}
157
}
158
159
160
std::string
161
GNEVClassesDialog::getModifiedVClasses() const {
162
return myEditedVClasses;
163
}
164
165
166
long
167
GNEVClassesDialog::onCmdSelectAll(FXObject*, FXSelector, void*) {
168
// change all icons to accept
169
for (const auto& vClass : myVClassMap) {
170
vClass.second->setVClassButtonStatus(true);
171
}
172
return 1;
173
}
174
175
176
long
177
GNEVClassesDialog::onCmdUnselectAll(FXObject*, FXSelector, void*) {
178
// change all icons to cancel
179
for (const auto& vClass : myVClassMap) {
180
vClass.second->setVClassButtonStatus(false);
181
}
182
return 1;
183
}
184
185
186
long
187
GNEVClassesDialog::onCmdSelectOnlyRoad(FXObject*, FXSelector, void*) {
188
// change all non-road icons to disallow, and allow for the rest
189
for (const auto& vClass : myVClassMap) {
190
if ((vClass.first & (SVC_PEDESTRIAN | SVC_NON_ROAD)) == 0) {
191
vClass.second->setVClassButtonStatus(true);
192
} else {
193
vClass.second->setVClassButtonStatus(false);
194
}
195
}
196
return 1;
197
}
198
199
200
long
201
GNEVClassesDialog::onCmdSelectOnlyRail(FXObject*, FXSelector, void*) {
202
// change all non-road icons to disallow, and allow for the rest
203
for (const auto& vClass : myVClassMap) {
204
if ((vClass.first & SVC_RAIL_CLASSES) != 0) {
205
vClass.second->setVClassButtonStatus(true);
206
} else {
207
vClass.second->setVClassButtonStatus(false);
208
}
209
}
210
return 1;
211
}
212
213
214
long
215
GNEVClassesDialog::onCmdAccept(FXObject*, FXSelector, void*) {
216
bool allSelected = true;
217
// clear allow and disallow VClasses
218
std::vector<std::string> allowedVehicles;
219
for (const auto& vClass : myVClassMap) {
220
// check if vehicle is allowed depending on the Icon
221
if (vClass.second->isVClassButtonEnabled()) {
222
allowedVehicles.push_back(vClass.second->getVClassString());
223
} else {
224
allSelected = false;
225
}
226
}
227
if (allSelected) {
228
myEditedVClasses = "all";
229
} else {
230
myEditedVClasses = joinToString(allowedVehicles, " ");
231
}
232
// Stop Modal if we have a different classes from original
233
if (myEditedVClasses != myOriginalVClasses) {
234
return closeDialogAccepting();
235
} else {
236
return closeDialogCanceling();
237
}
238
}
239
240
241
long
242
GNEVClassesDialog::onCmdCancel(FXObject*, FXSelector, void*) {
243
// reset vClasses
244
myEditedVClasses = myOriginalVClasses;
245
// cancel
246
return closeDialogCanceling();
247
}
248
249
250
long
251
GNEVClassesDialog::onCmdReset(FXObject*, FXSelector, void*) {
252
// reset vClasses
253
myEditedVClasses = myOriginalVClasses;
254
// continue depending of allow
255
if (myEditedVClasses == "all") {
256
// iterate over myVClassMap and set all icons as true
257
for (const auto& vClass : myVClassMap) {
258
vClass.second->setVClassButtonStatus(true);
259
}
260
} else {
261
// declare string vector for saving all vclasses
262
const std::vector<std::string>& allowStringVector = StringTokenizer(myEditedVClasses).getVector();
263
const std::set<std::string> allowSet(allowStringVector.begin(), allowStringVector.end());
264
// iterate over myVClassMap and set icons
265
for (const auto& vClass : myVClassMap) {
266
if (allowSet.count(getVehicleClassNames(vClass.first)) > 0) {
267
vClass.second->setVClassButtonStatus(true);
268
} else {
269
vClass.second->setVClassButtonStatus(false);
270
}
271
}
272
}
273
return 1;
274
}
275
276
277
void
278
GNEVClassesDialog::builder() {
279
// label for selection options
280
new FXLabel(getContentFrame(), TL("Selection options"), nullptr, GUIDesignLabel(JUSTIFY_NORMAL));
281
// horizontal frame uniform for options
282
FXHorizontalFrame* optionsFrame = new FXHorizontalFrame(getContentFrame(), GUIDesignAuxiliarHorizontalFrameUniform);
283
// allow all
284
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::OK), this, MID_GNE_ALLOWVCLASSES_SELECTALL, GUIDesignButtonIcon);
285
new FXLabel(optionsFrame, TL("Allow all vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
286
// only road
287
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::OK), this, MID_GNE_ALLOWVCLASSES_ONLY_ROAD, GUIDesignButtonIcon);
288
new FXLabel(optionsFrame, TL("Allow only road vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
289
// only rail
290
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::OK), this, MID_GNE_ALLOWVCLASSES_ONLY_RAIL, GUIDesignButtonIcon);
291
new FXLabel(optionsFrame, TL("Allow only rail vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
292
// disallow all
293
GUIDesigns::buildFXButton(optionsFrame, "", "", "", GUIIconSubSys::getIcon(GUIIcon::CANCEL), this, MID_GNE_ALLOWVCLASSES_UNSELECTALL, GUIDesignButtonIcon);
294
new FXLabel(optionsFrame, TL("Disallow all vehicles"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
295
// label for select vClasses
296
new FXLabel(getContentFrame(), TL("Select vClasses"), nullptr, GUIDesignLabel(JUSTIFY_NORMAL));
297
// Create frame for vehicles's columns
298
FXHorizontalFrame* myVehiclesFrame = new FXHorizontalFrame(getContentFrame(), GUIDesignContentsFrame);
299
// create left frame and fill it
300
FXVerticalFrame* vehiclesLeftFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
301
myVClassMap[SVC_PASSENGER] = new VClassRow(vehiclesLeftFrame, SVC_PASSENGER, GUIIcon::VCLASS_PASSENGER, TL("Default vehicle class"));
302
myVClassMap[SVC_PRIVATE] = new VClassRow(vehiclesLeftFrame, SVC_PRIVATE, GUIIcon::VCLASS_PRIVATE, TL("A passenger car assigned for private use"));
303
myVClassMap[SVC_TAXI] = new VClassRow(vehiclesLeftFrame, SVC_TAXI, GUIIcon::VCLASS_TAXI, TL("Vehicle for hire with a driver"));
304
myVClassMap[SVC_BUS] = new VClassRow(vehiclesLeftFrame, SVC_BUS, GUIIcon::VCLASS_BUS, TL("Urban line traffic"));
305
myVClassMap[SVC_COACH] = new VClassRow(vehiclesLeftFrame, SVC_COACH, GUIIcon::VCLASS_COACH, TL("Overland transport"));
306
myVClassMap[SVC_DELIVERY] = new VClassRow(vehiclesLeftFrame, SVC_DELIVERY, GUIIcon::VCLASS_DELIVERY, TL("Vehicles specialized in delivering goods"));
307
myVClassMap[SVC_TRUCK] = new VClassRow(vehiclesLeftFrame, SVC_TRUCK, GUIIcon::VCLASS_TRUCK, TL("Vehicle designed to transport cargo"));
308
myVClassMap[SVC_TRAILER] = new VClassRow(vehiclesLeftFrame, SVC_TRAILER, GUIIcon::VCLASS_TRAILER, TL("Truck with trailer"));
309
myVClassMap[SVC_EMERGENCY] = new VClassRow(vehiclesLeftFrame, SVC_EMERGENCY, GUIIcon::VCLASS_EMERGENCY, TL("Vehicle designated to respond to an emergency"));
310
myVClassMap[SVC_MOTORCYCLE] = new VClassRow(vehiclesLeftFrame, SVC_MOTORCYCLE, GUIIcon::VCLASS_MOTORCYCLE, TL("Two- or three-wheeled motor vehicle"));
311
myVClassMap[SVC_MOPED] = new VClassRow(vehiclesLeftFrame, SVC_MOPED, GUIIcon::VCLASS_MOPED, TL("Motorcycle not allowed in motorways"));
312
// create center frame and fill it
313
FXVerticalFrame* vehiclesCenterFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
314
myVClassMap[SVC_BICYCLE] = new VClassRow(vehiclesCenterFrame, SVC_BICYCLE, GUIIcon::VCLASS_BICYCLE, TL("Human-powered, pedal-driven vehicle"));
315
myVClassMap[SVC_SCOOTER] = new VClassRow(vehiclesCenterFrame, SVC_SCOOTER, GUIIcon::VCLASS_SCOOTER, TL("An electric scooter or a kick scooter"));
316
myVClassMap[SVC_PEDESTRIAN] = new VClassRow(vehiclesCenterFrame, SVC_PEDESTRIAN, GUIIcon::VCLASS_PEDESTRIAN, TL("Person traveling on foot"));
317
myVClassMap[SVC_WHEELCHAIR] = new VClassRow(vehiclesCenterFrame, SVC_WHEELCHAIR, GUIIcon::VCLASS_WHEELCHAIR, TL("A mobility impaired person"));
318
myVClassMap[SVC_TRAM] = new VClassRow(vehiclesCenterFrame, SVC_TRAM, GUIIcon::VCLASS_TRAM, TL("Rail vehicle which runs on tracks"));
319
myVClassMap[SVC_RAIL_ELECTRIC] = new VClassRow(vehiclesCenterFrame, SVC_RAIL_ELECTRIC, GUIIcon::VCLASS_RAIL_ELECTRIC, TL("Rail electric vehicle"));
320
myVClassMap[SVC_RAIL_FAST] = new VClassRow(vehiclesCenterFrame, SVC_RAIL_FAST, GUIIcon::VCLASS_RAIL_FAST, TL("High-speed rail vehicle"));
321
myVClassMap[SVC_RAIL_URBAN] = new VClassRow(vehiclesCenterFrame, SVC_RAIL_URBAN, GUIIcon::VCLASS_RAIL_URBAN, TL("Heavier than tram"));
322
myVClassMap[SVC_RAIL] = new VClassRow(vehiclesCenterFrame, SVC_RAIL, GUIIcon::VCLASS_RAIL, TL("Heavy rail vehicle"));
323
myVClassMap[SVC_CABLE_CAR] = new VClassRow(vehiclesCenterFrame, SVC_CABLE_CAR, GUIIcon::VCLASS_CABLE_CAR, TL("A conveyance suspended on a cable"));
324
myVClassMap[SVC_SUBWAY] = new VClassRow(vehiclesCenterFrame, SVC_SUBWAY, GUIIcon::VCLASS_SUBWAY, TL("A railway that mostly runs underground"));
325
// create right frame and fill it (8 vehicles)
326
FXVerticalFrame* vehiclesRightFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
327
myVClassMap[SVC_E_VEHICLE] = new VClassRow(vehiclesRightFrame, SVC_E_VEHICLE, GUIIcon::VCLASS_EVEHICLE, TL("Future electric mobility vehicles"));
328
myVClassMap[SVC_ARMY] = new VClassRow(vehiclesRightFrame, SVC_ARMY, GUIIcon::VCLASS_ARMY, TL("Vehicle designed for military forces"));
329
myVClassMap[SVC_SHIP] = new VClassRow(vehiclesRightFrame, SVC_SHIP, GUIIcon::VCLASS_SHIP, TL("Basic class for navigating waterway"));
330
myVClassMap[SVC_AUTHORITY] = new VClassRow(vehiclesRightFrame, SVC_AUTHORITY, GUIIcon::VCLASS_AUTHORITY, TL("Vehicle of a governmental security agency"));
331
myVClassMap[SVC_VIP] = new VClassRow(vehiclesRightFrame, SVC_VIP, GUIIcon::VCLASS_VIP, TL("A civilian security armored car used by VIPs"));
332
myVClassMap[SVC_HOV] = new VClassRow(vehiclesRightFrame, SVC_HOV, GUIIcon::VCLASS_HOV, TL("High-Occupancy Vehicle (two or more passengers)"));
333
myVClassMap[SVC_CONTAINER] = new VClassRow(vehiclesRightFrame, SVC_CONTAINER, GUIIcon::VCLASS_CONTAINER, TL("A transport container"));
334
myVClassMap[SVC_AIRCRAFT] = new VClassRow(vehiclesRightFrame, SVC_AIRCRAFT, GUIIcon::VCLASS_AIRCRAFT, TL("An airplane"));
335
myVClassMap[SVC_DRONE] = new VClassRow(vehiclesRightFrame, SVC_DRONE, GUIIcon::VCLASS_DRONE, TL("A small unmanned robot"));
336
myVClassMap[SVC_CUSTOM1] = new VClassRow(vehiclesRightFrame, SVC_CUSTOM1, GUIIcon::VCLASS_CUSTOM1, TL("Reserved for user-defined semantics"));
337
myVClassMap[SVC_CUSTOM2] = new VClassRow(vehiclesRightFrame, SVC_CUSTOM2, GUIIcon::VCLASS_CUSTOM2, TL("Reserved for user-defined semantics"));
338
// reset dialog
339
onCmdReset(nullptr, 0, nullptr);
340
// open modal dialog
341
openDialog();
342
}
343
344
/****************************************************************************/
345
346