Eclipse SUMO - Simulation of Urban MObility
GNEAllowVClassesDialog.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2022 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 /****************************************************************************/
18 // Dialog for edit allow VClass attribute
19 /****************************************************************************/
20 
21 #include <netedit/GNEViewNet.h>
26 
27 #include "GNEAllowVClassesDialog.h"
28 
29 
30 
31 // ===========================================================================
32 // FOX callback mapping
33 // ===========================================================================
34 
35 FXDEFMAP(GNEAllowVClassesDialog) GNEAllowVClassesDialogMap[] = {
44 };
45 
46 // Object implementation
47 FXIMPLEMENT(GNEAllowVClassesDialog, FXDialogBox, GNEAllowVClassesDialogMap, ARRAYNUMBER(GNEAllowVClassesDialogMap))
48 
49 // ===========================================================================
50 // member method definitions
51 // ===========================================================================
52 
54  FXDialogBox(viewNet->getApp(), ("Edit " + toString(attr) + " " + toString(SUMO_ATTR_VCLASS) + "es").c_str(), GUIDesignDialogBox),
55  myViewNet(viewNet),
56  myAC(AC),
57  myEditedAttr(attr),
58  myAcceptChanges(acceptChanges),
59  myAllow(nullptr) {
60  // call constructor
61  constructor();
62 }
63 
64 
65 GNEAllowVClassesDialog::GNEAllowVClassesDialog(GNEViewNet* viewNet, std::string* allow, bool* acceptChanges) :
66  FXDialogBox(viewNet->getApp(), ("Edit " + toString(SUMO_ATTR_ALLOW) + " " + toString(SUMO_ATTR_VCLASS) + "es").c_str(), GUIDesignDialogBox),
67  myViewNet(viewNet),
68  myAC(nullptr),
69  myEditedAttr(SUMO_ATTR_ALLOW),
70  myAcceptChanges(acceptChanges),
71  myAllow(allow) {
72  // call constructor
73  constructor();
74 }
75 
76 
78 }
79 
80 
81 long
82 GNEAllowVClassesDialog::onCmdValueChanged(FXObject* obj, FXSelector, void*) {
83  FXButton* buttonPressed = dynamic_cast<FXButton*>(obj);
84  // change icon of button
85  for (const auto& vClass : myVClassMap) {
86  if (vClass.second.first == buttonPressed) {
87  if (buttonPressed->getIcon() == GUIIconSubSys::getIcon(GUIIcon::ACCEPT)) {
88  buttonPressed->setIcon(GUIIconSubSys::getIcon(GUIIcon::CANCEL));
89  } else {
90  buttonPressed->setIcon(GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
91  }
92  return 1;
93  }
94  }
95  return 1;
96 }
97 
98 
99 long
100 GNEAllowVClassesDialog::onCmdSelectAll(FXObject*, FXSelector, void*) {
101  // change all icons to accept
102  for (const auto& vClass : myVClassMap) {
103  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
104  }
105  return 1;
106 }
107 
108 
109 long
110 GNEAllowVClassesDialog::onCmdUnselectAll(FXObject*, FXSelector, void*) {
111  // change all icons to cancel
112  for (const auto& vClass : myVClassMap) {
113  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::CANCEL));
114  }
115  return 1;
116 }
117 
118 
119 long
120 GNEAllowVClassesDialog::onCmdSelectOnlyRoad(FXObject*, FXSelector, void*) {
121  // change all non-road icons to disallow, and allow for the rest
122  for (const auto& vClass : myVClassMap) {
123  if ((vClass.first & (SVC_PEDESTRIAN | SVC_NON_ROAD)) == 0) {
124  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
125  } else {
126  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::CANCEL));
127  }
128  }
129  return 1;
130 }
131 
132 
133 long
134 GNEAllowVClassesDialog::onCmdSelectOnlyRail(FXObject*, FXSelector, void*) {
135  // change all non-road icons to disallow, and allow for the rest
136  for (const auto& vClass : myVClassMap) {
137  if ((vClass.first & (SVC_TRAM | SVC_RAIL_URBAN | SVC_RAIL | SVC_RAIL_ELECTRIC | SVC_RAIL_FAST)) != 0) {
138  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
139  } else {
140  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::CANCEL));
141  }
142  }
143  return 1;
144 }
145 
146 
147 long
148 GNEAllowVClassesDialog::onCmdAccept(FXObject*, FXSelector, void*) {
149  // clear allow and disallow VClasses
150  std::vector<std::string> allowedVehicles, disallowedVehicles;
151  for (const auto& vClass : myVClassMap) {
152  // check if vehicle is alloweddepending of the Icon
153  if (vClass.second.first->getIcon() == GUIIconSubSys::getIcon(GUIIcon::ACCEPT)) {
154  allowedVehicles.push_back(getVehicleClassNames(vClass.first));
155  } else {
156  disallowedVehicles.push_back(getVehicleClassNames(vClass.first));
157  }
158  }
159  // check if all vehicles are enabled and set new allowed vehicles
160  if (myAC) {
161  myAC->setAttribute(myEditedAttr, joinToString(allowedVehicles, " "), myViewNet->getUndoList());
162  } else {
163  // update strings
164  *myAllow = joinToString(allowedVehicles, " ");
165  }
166  // enable accept flag
167  *myAcceptChanges = true;
168  // Stop Modal
169  getApp()->stopModal(this, TRUE);
170  return 1;
171 }
172 
173 
174 long
175 GNEAllowVClassesDialog::onCmdCancel(FXObject*, FXSelector, void*) {
176  // disable accept flag
177  *myAcceptChanges = false;
178  // Stop Modal
179  getApp()->stopModal(this, FALSE);
180  return 1;
181 }
182 
183 
184 long
185 GNEAllowVClassesDialog::onCmdReset(FXObject*, FXSelector, void*) {
186  std::string allow;
187  // set allow depending of myAC
188  if (myAC) {
189  allow = myAC->getAttribute(myEditedAttr);
190  } else {
191  allow = *myAllow;
192  }
193  // continue depending of allow
194  if (allow == "all") {
195  // iterate over myVClassMap and set all icons as true
196  for (const auto& vClass : myVClassMap) {
197  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
198  }
199  } else {
200  // declare string vector for saving all vclasses
201  const std::vector<std::string>& allowStringVector = StringTokenizer(allow).getVector();
202  const std::set<std::string> allowSet(allowStringVector.begin(), allowStringVector.end());
203  // iterate over myVClassMap and set icons
204  for (const auto& vClass : myVClassMap) {
205  if (allowSet.count(getVehicleClassNames(vClass.first)) > 0) {
206  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::ACCEPT));
207  } else {
208  vClass.second.first->setIcon(GUIIconSubSys::getIcon(GUIIcon::CANCEL));
209  }
210  }
211  }
212  return 1;
213 }
214 
215 
216 void
218  // set vehicle icon for this dialog
220  // create main frame
221  FXVerticalFrame* mainFrame = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
222  // create groupbox for options
223  FXGroupBox* myGroupBoxOptions = new FXGroupBox(mainFrame, "Selection options", GUIDesignGroupBoxFrame);
224  FXHorizontalFrame* myOptionsFrame = new FXHorizontalFrame(myGroupBoxOptions, GUIDesignAuxiliarHorizontalFrame);
225  // allow all
227  new FXLabel(myOptionsFrame, "Allow all vehicles", nullptr, GUIDesignLabelLeftThick);
228  // only road
230  new FXLabel(myOptionsFrame, "Allow only road vehicles", nullptr, GUIDesignLabelLeftThick);
231  // only rail
233  new FXLabel(myOptionsFrame, "Allow only rail vehicles", nullptr, GUIDesignLabelLeftThick);
234  // disallow all
236  new FXLabel(myOptionsFrame, "Disallow all vehicles", nullptr, GUIDesignLabelLeftThick);
237  // create groupbox for vehicles
238  FXGroupBox* myGroupBoxVehiclesFrame = new FXGroupBox(mainFrame, ("Select " + toString(SUMO_ATTR_VCLASS) + "es").c_str(), GUIDesignGroupBoxFrame);
239  // Create frame for vehicles's columns
240  FXHorizontalFrame* myVehiclesFrame = new FXHorizontalFrame(myGroupBoxVehiclesFrame, GUIDesignContentsFrame);
241  // create left frame and fill it
242  FXVerticalFrame* myContentLeftFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
243  buildVClass(myContentLeftFrame, SVC_PASSENGER, GUIIcon::VCLASS_PASSENGER, "Default vehicle class");
244  buildVClass(myContentLeftFrame, SVC_PRIVATE, GUIIcon::VCLASS_PRIVATE, "A passenger car assigned for private use");
245  buildVClass(myContentLeftFrame, SVC_TAXI, GUIIcon::VCLASS_TAXI, "Vehicle for hire with a driver");
246  buildVClass(myContentLeftFrame, SVC_BUS, GUIIcon::VCLASS_BUS, "Urban line traffic");
247  buildVClass(myContentLeftFrame, SVC_COACH, GUIIcon::VCLASS_COACH, "Overland transport");
248  buildVClass(myContentLeftFrame, SVC_DELIVERY, GUIIcon::VCLASS_DELIVERY, "Vehicles specialized to deliver goods");
249  buildVClass(myContentLeftFrame, SVC_TRUCK, GUIIcon::VCLASS_TRUCK, "Vehicle designed to transport cargo");
250  buildVClass(myContentLeftFrame, SVC_TRAILER, GUIIcon::VCLASS_TRAILER, "Truck with trailer");
251  buildVClass(myContentLeftFrame, SVC_EMERGENCY, GUIIcon::VCLASS_EMERGENCY, "Vehicle designated to respond to an emergency");
252  // create center frame and fill it
253  FXVerticalFrame* myContentCenterFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
254  buildVClass(myContentCenterFrame, SVC_MOTORCYCLE, GUIIcon::VCLASS_MOTORCYCLE, "Two- or three-wheeled motor vehicle");
255  buildVClass(myContentCenterFrame, SVC_MOPED, GUIIcon::VCLASS_MOPED, "Motorcycle not allowed in motorways");
256  buildVClass(myContentCenterFrame, SVC_BICYCLE, GUIIcon::VCLASS_BICYCLE, "Human-powered, pedal-driven vehicle");
257  buildVClass(myContentCenterFrame, SVC_PEDESTRIAN, GUIIcon::VCLASS_PEDESTRIAN, "Person traveling on foot");
258  buildVClass(myContentCenterFrame, SVC_TRAM, GUIIcon::VCLASS_TRAM, "Rail vehicle which runs on tracks");
259  buildVClass(myContentCenterFrame, SVC_RAIL_ELECTRIC, GUIIcon::VCLASS_RAIL_ELECTRIC, "Rail electric vehicle");
260  buildVClass(myContentCenterFrame, SVC_RAIL_FAST, GUIIcon::VCLASS_RAIL_FAST, "High-speed rail vehicle");
261  buildVClass(myContentCenterFrame, SVC_RAIL_URBAN, GUIIcon::VCLASS_RAIL_URBAN, "Heavier than tram");
262  buildVClass(myContentCenterFrame, SVC_RAIL, GUIIcon::VCLASS_RAIL, "Heavy rail vehicle");
263  // create right frame and fill it (8 vehicles)
264  FXVerticalFrame* myContentRightFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
265  buildVClass(myContentRightFrame, SVC_E_VEHICLE, GUIIcon::VCLASS_EVEHICLE, "Future electric mobility vehicles");
266  buildVClass(myContentRightFrame, SVC_ARMY, GUIIcon::VCLASS_ARMY, "Vehicle designed for military forces");
267  buildVClass(myContentRightFrame, SVC_SHIP, GUIIcon::VCLASS_SHIP, "Basic class for navigating waterway");
268  buildVClass(myContentRightFrame, SVC_AUTHORITY, GUIIcon::VCLASS_AUTHORITY, "Vehicle of a governmental security agency");
269  buildVClass(myContentRightFrame, SVC_VIP, GUIIcon::VCLASS_VIP, "A civilian security armored car used by VIPs");
270  buildVClass(myContentRightFrame, SVC_HOV, GUIIcon::VCLASS_HOV, "High-Occupancy Vehicle (two or more passengers)");
271  buildVClass(myContentRightFrame, SVC_CUSTOM1, GUIIcon::VCLASS_CUSTOM1, "Reserved for user-defined semantics");
272  buildVClass(myContentRightFrame, SVC_CUSTOM2, GUIIcon::VCLASS_CUSTOM2, "Reserved for user-defined semantics");
273  // create dialog buttons bot centered
274  FXHorizontalFrame* buttonsFrame = new FXHorizontalFrame(mainFrame, GUIDesignHorizontalFrame);
275  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
276  myAcceptButton = new FXButton(buttonsFrame, TL("accept\t\tclose"), GUIIconSubSys::getIcon(GUIIcon::ACCEPT), this, MID_GNE_BUTTON_ACCEPT, GUIDesignButtonAccept);
277  myCancelButton = new FXButton(buttonsFrame, TL("cancel\t\tclose"), GUIIconSubSys::getIcon(GUIIcon::CANCEL), this, MID_GNE_BUTTON_CANCEL, GUIDesignButtonCancel);
278  myResetButton = new FXButton(buttonsFrame, "reset\t\tclose", GUIIconSubSys::getIcon(GUIIcon::RESET), this, MID_GNE_BUTTON_RESET, GUIDesignButtonReset);
279  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
280  // reset dialog
281  onCmdReset(nullptr, 0, nullptr);
282 }
283 
284 
285 void
286 GNEAllowVClassesDialog::buildVClass(FXVerticalFrame* contentsFrame, SUMOVehicleClass vclass, GUIIcon vclassIcon, const std::string& description) {
287  // add frame for vehicle icons
288  FXHorizontalFrame* vehicleFrame = new FXHorizontalFrame(contentsFrame, GUIDesignAuxiliarHorizontalFrame);
289  FXLabel* labelVehicleIcon = new FXLabel(vehicleFrame, "", GUIIconSubSys::getIcon(vclassIcon), GUIDesignLabelIcon64x32Thicked);
290  labelVehicleIcon->setBackColor(FXRGBA(255, 255, 255, 255));
291  // create frame for information and button
292  FXVerticalFrame* buttonAndInformationFrame = new FXVerticalFrame(vehicleFrame, GUIDesignAuxiliarHorizontalFrame);
293  FXHorizontalFrame* buttonAndStatusFrame = new FXHorizontalFrame(buttonAndInformationFrame, GUIDesignAuxiliarHorizontalFrame);
294  // create status and text button
295  myVClassMap[vclass].first = new FXButton(buttonAndStatusFrame, "", GUIIconSubSys::getIcon(GUIIcon::EMPTY), this, MID_GNE_ALLOWDISALLOW_CHANGE, GUIDesignButtonIcon);
296  myVClassMap[vclass].second = new FXLabel(buttonAndStatusFrame, toString(vclass).c_str(), nullptr, GUIDesignLabelLeftThick);
297  // create label for description of vehicle
298  new FXLabel(buttonAndInformationFrame, description.c_str(), nullptr, GUIDesignLabelLeftThick);
299 }
300 
301 
302 /****************************************************************************/
FXDEFMAP(GNEAllowVClassesDialog) GNEAllowVClassesDialogMap[]
@ MID_GNE_ALLOWDISALLOW_CHANGE
select/unselect single vehicle
Definition: GUIAppEnum.h:1381
@ MID_GNE_BUTTON_CANCEL
cancel button
Definition: GUIAppEnum.h:1296
@ MID_GNE_BUTTON_RESET
reset button
Definition: GUIAppEnum.h:1298
@ MID_GNE_ALLOWDISALLOW_ONLY_ROAD
select only non road vehicles
Definition: GUIAppEnum.h:1387
@ MID_GNE_ALLOWDISALLOW_ONLY_RAIL
select only rail vehicles
Definition: GUIAppEnum.h:1389
@ MID_GNE_ALLOWDISALLOW_UNSELECTALL
unselect all vehicles
Definition: GUIAppEnum.h:1385
@ MID_GNE_ALLOWDISALLOW_SELECTALL
select all vehicles
Definition: GUIAppEnum.h:1383
@ MID_GNE_BUTTON_ACCEPT
accept button
Definition: GUIAppEnum.h:1294
#define GUIDesignButtonIcon
button only with icon
Definition: GUIDesigns.h:86
#define GUIDesignLabelIcon64x32Thicked
label ticked filled used for VClasses. It uses icons of 64x32 pixels
Definition: GUIDesigns.h:259
#define GUIDesignButtonAccept
Accept Button.
Definition: GUIDesigns.h:145
#define GUIDesignButtonCancel
Cancel Button.
Definition: GUIDesigns.h:148
#define GUIDesignContentsFrame
design for the main content frame of every frame/dialog
Definition: GUIDesigns.h:388
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:397
#define GUIDesignDialogBox
Definition: GUIDesigns.h:584
#define GUIDesignLabelLeftThick
label extended over frame with thick and with text justify to left
Definition: GUIDesigns.h:229
#define GUIDesignGroupBoxFrame
Group box design extended over frame.
Definition: GUIDesigns.h:350
#define GUIDesignButtonReset
Reset Button.
Definition: GUIDesigns.h:151
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frames used to pack another frames extended in all directions
Definition: GUIDesigns.h:394
#define GUIDesignHorizontalFrame
Horizontal frame extended over frame parent.
Definition: GUIDesigns.h:335
GUIIcon
An enumeration of icons used by the gui applications.
Definition: GUIIcons.h:33
@ VCLASS_TRAILER
@ VCLASS_PASSENGER
@ VCLASS_BICYCLE
@ VCLASS_RAIL_FAST
@ VCLASS_CUSTOM2
@ GREENVEHICLE
@ VCLASS_MOTORCYCLE
@ VCLASS_COACH
@ VCLASS_AUTHORITY
@ VCLASS_TRUCK
@ VCLASS_MOPED
@ VCLASS_PEDESTRIAN
@ VCLASS_PRIVATE
@ VCLASS_CUSTOM1
@ VCLASS_DELIVERY
@ VCLASS_RAIL_ELECTRIC
@ VCLASS_EMERGENCY
@ VCLASS_RAIL_URBAN
@ VCLASS_EVEHICLE
#define TL(string)
Definition: MsgHandler.h:282
const std::string & getVehicleClassNames(SVCPermissions permissions, bool expand)
Returns the ids of the given classes, divided using a ' '.
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_SHIP
is an arbitrary ship
@ SVC_PRIVATE
private vehicles
@ SVC_VIP
vip vehicles
@ SVC_HOV
vehicle is a HOV
@ SVC_TRUCK
vehicle is a large transport vehicle
@ SVC_CUSTOM2
is a user-defined type
@ SVC_RAIL
vehicle is a not electrified rail
@ SVC_COACH
vehicle is a coach
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_RAIL_FAST
vehicle that is allowed to drive on high-speed rail tracks
@ SVC_TRAILER
vehicle is a large transport vehicle
@ SVC_CUSTOM1
is a user-defined type
@ SVC_ARMY
army vehicles
@ SVC_RAIL_ELECTRIC
rail vehicle that requires electrified tracks
@ SVC_NON_ROAD
classes which (normally) do not drive on normal roads
@ SVC_DELIVERY
vehicle is a small delivery vehicle
@ SVC_RAIL_URBAN
vehicle is a city rail
@ SVC_MOTORCYCLE
vehicle is a motorcycle
@ SVC_EMERGENCY
public emergency vehicles
@ SVC_MOPED
vehicle is a moped
@ SVC_AUTHORITY
authorities vehicles
@ SVC_TRAM
vehicle is a light rail
@ SVC_TAXI
vehicle is a taxi
@ SVC_BUS
vehicle is a bus
@ SVC_E_VEHICLE
is an electric vehicle
@ SVC_PEDESTRIAN
pedestrian
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_VCLASS
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition: ToString.h:282
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
Dialog for edit rerouters.
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
GNEViewNet * myViewNet
FOX need this.
FXButton * myAcceptButton
accept button
FXButton * myResetButton
cancel button
long onCmdReset(FXObject *, FXSelector, void *)
event after press reset button
GNEAttributeCarrier * myAC
edited AC
long onCmdSelectOnlyRail(FXObject *, FXSelector, void *)
event when user press select only rail button
void buildVClass(FXVerticalFrame *contentsFrame, SUMOVehicleClass vclass, GUIIcon vclassIcon, const std::string &description)
build VClass
long onCmdAccept(FXObject *, FXSelector, void *)
event after press accept button
FXButton * myCancelButton
cancel button
GNEAllowVClassesDialog(GNEViewNet *viewNet, GNEAttributeCarrier *AC, SumoXMLAttr attr, bool *acceptChanges)
FOX-declaration.
bool * myAcceptChanges
accept changes
std::map< SUMOVehicleClass, std::pair< FXButton *, FXLabel * > > myVClassMap
map with the buttons for every VClass
std::string * myAllow
allow vehicles
SumoXMLAttr myEditedAttr
the attribute being edited
long onCmdUnselectAll(FXObject *, FXSelector, void *)
event when user press unselect all VClasses button
long onCmdSelectOnlyRoad(FXObject *, FXSelector, void *)
event when user press select only road button
long onCmdValueChanged(FXObject *, FXSelector, void *)
long onCmdSelectAll(FXObject *, FXSelector, void *)
event when user press select all VClasses button
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
virtual std::string getAttribute(SumoXMLAttr key) const =0
GNEUndoList * getUndoList() const
get the undoList object
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
std::vector< std::string > getVector()
return vector of strings