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