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