SUMO - Simulation of Urban MObility
GNEDialog_AllowDisallow.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-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
15 // Dialog for edit rerouters
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <iostream>
27 #include <utils/common/ToString.h>
30 #include <netedit/GNEViewNet.h>
31 
33 
34 
35 
36 // ===========================================================================
37 // FOX callback mapping
38 // ===========================================================================
39 
40 FXDEFMAP(GNEDialog_AllowDisallow) GNEDialog_AllowDisallowMap[] = {
48 };
49 
50 // Object implementation
51 FXIMPLEMENT(GNEDialog_AllowDisallow, FXDialogBox, GNEDialog_AllowDisallowMap, ARRAYNUMBER(GNEDialog_AllowDisallowMap))
52 
53 // ===========================================================================
54 // member method definitions
55 // ===========================================================================
56 
58  FXDialogBox(viewNet->getApp(), ("Edit " + toString(SUMO_ATTR_ALLOW) + " " + toString(SUMO_ATTR_VCLASS) + "es").c_str(), GUIDesignDialogBox),
59  myViewNet(viewNet),
60  myAC(AC) {
61  assert(AC->getTagProperty().hasAttribute(SUMO_ATTR_ALLOW));
62  // set vehicle icon for this dialog
64  // create main frame
65  FXVerticalFrame* mainFrame = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
66  // create groupbox for options
67  FXGroupBox* myGroupBoxOptions = new FXGroupBox(mainFrame, "Selection options", GUIDesignGroupBoxFrame);
68  FXHorizontalFrame* myOptionsFrame = new FXHorizontalFrame(myGroupBoxOptions, GUIDesignAuxiliarHorizontalFrame);
69  mySelectAllVClassButton = new FXButton(myOptionsFrame, "", GUIIconSubSys::getIcon(ICON_OK), this, MID_GNE_ALLOWDISALLOW_SELECTALL, GUIDesignButtonIcon);
70  new FXLabel(myOptionsFrame, "Allow all vehicles", nullptr, GUIDesignLabelLeftThick);
71  mySelectOnlyNonRoadVClassButton = new FXButton(myOptionsFrame, "", GUIIconSubSys::getIcon(ICON_OK), this, MID_GNE_ALLOWDISALLOW_SELECTONLYNONROAD, GUIDesignButtonIcon);
72  new FXLabel(myOptionsFrame, "Allow only non-road vehicles", nullptr, GUIDesignLabelLeftThick);
73  myUnselectAllVClassButton = new FXButton(myOptionsFrame, "", GUIIconSubSys::getIcon(ICON_OK), this, MID_GNE_ALLOWDISALLOW_UNSELECTALL, GUIDesignButtonIcon);
74  new FXLabel(myOptionsFrame, "Disallow all vehicles", nullptr, GUIDesignLabelLeftThick);
75  // create groupbox for vehicles
76  FXGroupBox* myGroupBoxVehiclesFrame = new FXGroupBox(mainFrame, ("Select " + toString(SUMO_ATTR_VCLASS) + "es").c_str(), GUIDesignGroupBoxFrame);
77  // Create frame for vehicles's columns
78  FXHorizontalFrame* myVehiclesFrame = new FXHorizontalFrame(myGroupBoxVehiclesFrame, GUIDesignContentsFrame);
79  // create left frame and fill it
80  FXVerticalFrame* myContentLeftFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
81  buildVClass(myContentLeftFrame, SVC_PASSENGER, ICON_VCLASS_PASSENGER, "Default vehicle class");
82  buildVClass(myContentLeftFrame, SVC_PRIVATE, ICON_VCLASS_PRIVATE, "A passenger car assigned for private use");
83  buildVClass(myContentLeftFrame, SVC_TAXI, ICON_VCLASS_TAXI, "Vehicle for hire with a driver");
84  buildVClass(myContentLeftFrame, SVC_BUS, ICON_VCLASS_BUS, "Urban line traffic");
85  buildVClass(myContentLeftFrame, SVC_COACH, ICON_VCLASS_COACH, "Overland transport");
86  buildVClass(myContentLeftFrame, SVC_DELIVERY, ICON_VCLASS_DELIVERY, "Vehicles specialized to deliver goods");
87  buildVClass(myContentLeftFrame, SVC_TRUCK, ICON_VCLASS_TRUCK, "Vehicle designed to transport cargo");
88  buildVClass(myContentLeftFrame, SVC_TRAILER, ICON_VCLASS_TRAILER, "Truck with trailer");
89  buildVClass(myContentLeftFrame, SVC_EMERGENCY, ICON_VCLASS_EMERGENCY, "Vehicle designated to respond to an emergency");
90  // create center frame and fill it
91  FXVerticalFrame* myContentCenterFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
92  buildVClass(myContentCenterFrame, SVC_MOTORCYCLE, ICON_VCLASS_MOTORCYCLE, "Two- or three-wheeled motor vehicle");
93  buildVClass(myContentCenterFrame, SVC_MOPED, ICON_VCLASS_MOPED, "Motorcycle not allowed in motorways");
94  buildVClass(myContentCenterFrame, SVC_BICYCLE, ICON_VCLASS_BICYCLE, "Human-powered, pedal-driven vehicle");
95  buildVClass(myContentCenterFrame, SVC_PEDESTRIAN, ICON_VCLASS_PEDESTRIAN, "Person traveling on foot");
96  buildVClass(myContentCenterFrame, SVC_TRAM, ICON_VCLASS_TRAM, "Rail vehicle which runs on tracks");
97  buildVClass(myContentCenterFrame, SVC_RAIL_ELECTRIC, ICON_VCLASS_RAIL_ELECTRIC, "Rail electric vehicle");
98  buildVClass(myContentCenterFrame, SVC_RAIL_URBAN, ICON_VCLASS_RAIL_URBAN, "Heavier than tram");
99  buildVClass(myContentCenterFrame, SVC_RAIL, ICON_VCLASS_RAIL, "Heavy rail vehicle (ICE)");
100  buildVClass(myContentCenterFrame, SVC_E_VEHICLE, ICON_VCLASS_EVEHICLE, "Future electric mobility vehicles");
101  // create right frame and fill it (8 vehicles)
102  FXVerticalFrame* myContentRightFrame = new FXVerticalFrame(myVehiclesFrame, GUIDesignAuxiliarFrame);
103  buildVClass(myContentRightFrame, SVC_ARMY, ICON_VCLASS_ARMY, "Vehicle designed for military forces");
104  buildVClass(myContentRightFrame, SVC_SHIP, ICON_VCLASS_SHIP, "Basic class for navigating waterway");
105  buildVClass(myContentRightFrame, SVC_AUTHORITY, ICON_VCLASS_AUTHORITY, "Vehicle of a governmental security agency");
106  buildVClass(myContentRightFrame, SVC_VIP, ICON_VCLASS_VIP, "A civilian security armored car used by VIPs");
107  buildVClass(myContentRightFrame, SVC_HOV, ICON_VCLASS_HOV, "High-Occupancy Vehicle (two or more passengers)");
108  buildVClass(myContentRightFrame, SVC_CUSTOM1, ICON_VCLASS_CUSTOM1, "Reserved for user-defined semantics");
109  buildVClass(myContentRightFrame, SVC_CUSTOM2, ICON_VCLASS_CUSTOM2, "Reserved for user-defined semantics");
110  // create dialog buttons bot centered
111  FXHorizontalFrame* buttonsFrame = new FXHorizontalFrame(mainFrame, GUIDesignHorizontalFrame);
112  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
113  myAcceptButton = new FXButton(buttonsFrame, "accept\t\tclose", GUIIconSubSys::getIcon(ICON_ACCEPT), this, MID_GNE_ADDITIONALDIALOG_BUTTONACCEPT, GUIDesignButtonAccept);
114  myCancelButton = new FXButton(buttonsFrame, "cancel\t\tclose", GUIIconSubSys::getIcon(ICON_CANCEL), this, MID_GNE_ADDITIONALDIALOG_BUTTONCANCEL, GUIDesignButtonCancel);
115  myResetButton = new FXButton(buttonsFrame, "reset\t\tclose", GUIIconSubSys::getIcon(ICON_RESET), this, MID_GNE_ADDITIONALDIALOG_BUTTONRESET, GUIDesignButtonReset);
116  new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
117  // reset dialog
118  onCmdReset(nullptr, 0, nullptr);
119 }
120 
121 
123 }
124 
125 
126 long
127 GNEDialog_AllowDisallow::onCmdValueChanged(FXObject* obj, FXSelector, void*) {
128  FXButton* buttonPressed = dynamic_cast<FXButton*>(obj);
129  // change icon of button
130  for (auto i = myVClassMap.begin(); i != myVClassMap.end(); i++) {
131  if (i->second.first == buttonPressed) {
132  if (buttonPressed->getIcon() == GUIIconSubSys::getIcon(ICON_ACCEPT)) {
133  buttonPressed->setIcon(GUIIconSubSys::getIcon(ICON_CANCEL));
134  } else {
135  buttonPressed->setIcon(GUIIconSubSys::getIcon(ICON_ACCEPT));
136  }
137  return 1;
138  }
139  }
140  return 1;
141 }
142 
143 
144 long
145 GNEDialog_AllowDisallow::onCmdSelectAll(FXObject*, FXSelector, void*) {
146  // change all icons to accept
147  for (auto i : myVClassMap) {
148  i.second.first->setIcon(GUIIconSubSys::getIcon(ICON_ACCEPT));
149  }
150  return 1;
151 }
152 
153 
154 long
155 GNEDialog_AllowDisallow::onCmdUnselectAll(FXObject*, FXSelector, void*) {
156  // change all icons to cancel
157  for (auto i : myVClassMap) {
158  i.second.first->setIcon(GUIIconSubSys::getIcon(ICON_CANCEL));
159  }
160  return 1;
161 }
162 
163 
164 long
165 GNEDialog_AllowDisallow::onCmdSelectOnlyNonRoad(FXObject*, FXSelector, void*) {
166  // change all non-road icons to disallow, and allow for the rest
167  for (auto i : myVClassMap) {
168  if ((i.first == SVC_TRAM) || (i.first == SVC_RAIL) || (i.first == SVC_RAIL_URBAN) || (i.first == SVC_RAIL_ELECTRIC) || (i.first == SVC_SHIP)) {
169  i.second.first->setIcon(GUIIconSubSys::getIcon(ICON_ACCEPT));
170  } else {
171  i.second.first->setIcon(GUIIconSubSys::getIcon(ICON_CANCEL));
172  }
173  }
174  return 1;
175 }
176 
177 
178 long
179 GNEDialog_AllowDisallow::onCmdAccept(FXObject*, FXSelector, void*) {
180  // clear allow and disallow VClasses
181  std::vector<std::string> allowedVehicles;
182  for (auto i : myVClassMap) {
183  // check if vehicle is alloweddepending of the Icon
184  if (i.second.first->getIcon() == GUIIconSubSys::getIcon(ICON_ACCEPT)) {
185  allowedVehicles.push_back(getVehicleClassNames(i.first));
186  }
187  }
188  // chek if all vehicles are enabled and set new allowed vehicles
189  myAC->setAttribute(SUMO_ATTR_ALLOW, joinToString(allowedVehicles, " "), myViewNet->getUndoList());
190  // Stop Modal
191  getApp()->stopModal(this, TRUE);
192  return 1;
193 }
194 
195 
196 long
197 GNEDialog_AllowDisallow::onCmdCancel(FXObject*, FXSelector, void*) {
198  // Stop Modal
199  getApp()->stopModal(this, FALSE);
200  return 1;
201 }
202 
203 
204 long
205 GNEDialog_AllowDisallow::onCmdReset(FXObject*, FXSelector, void*) {
206  if (myAC->getAttribute(SUMO_ATTR_ALLOW) == "all") {
207  // iterate over myVClassMap and set all icons as true
208  for (auto i : myVClassMap) {
209  i.second.first->setIcon(GUIIconSubSys::getIcon(ICON_ACCEPT));
210  i.second.second->setText((getVehicleClassNames(i.first) + " allowed").c_str());
211  }
212  } else {
213  // declare string vector for saving all vclasses
214  std::vector<std::string> allowStringVector;
216  // iterate over myVClassMap and set icons
217  for (auto i : myVClassMap) {
218  if (std::find(allowStringVector.begin(), allowStringVector.end(), getVehicleClassNames(i.first)) != allowStringVector.end()) {
219  i.second.first->setIcon(GUIIconSubSys::getIcon(ICON_ACCEPT));
220  i.second.second->setText((getVehicleClassNames(i.first) + " allowed").c_str());
221  } else {
222  i.second.first->setIcon(GUIIconSubSys::getIcon(ICON_CANCEL));
223  i.second.second->setText((getVehicleClassNames(i.first) + " disallowed").c_str());
224  }
225  }
226  }
227  return 1;
228 }
229 
230 
231 void
232 GNEDialog_AllowDisallow::buildVClass(FXVerticalFrame* contentsFrame, SUMOVehicleClass vclass, GUIIcon vclassIcon, const std::string& description) {
233  // add frame for vehicle icons
234  FXHorizontalFrame* vehicleFrame = new FXHorizontalFrame(contentsFrame, GUIDesignAuxiliarHorizontalFrame);
235  FXLabel* labelVehicleIcon = new FXLabel(vehicleFrame, "", GUIIconSubSys::getIcon(vclassIcon), GUIDesignLabelIcon64x32Thicked);
236  labelVehicleIcon->setBackColor(FXRGBA(255, 255, 255, 255));
237  // create frame for information and button
238  FXVerticalFrame* buttonAndInformationFrame = new FXVerticalFrame(vehicleFrame, GUIDesignAuxiliarHorizontalFrame);
239  FXHorizontalFrame* buttonAndStatusFrame = new FXHorizontalFrame(buttonAndInformationFrame, GUIDesignAuxiliarHorizontalFrame);
240  // create status and text button
241  myVClassMap[vclass].first = new FXButton(buttonAndStatusFrame, "", GUIIconSubSys::getIcon(ICON_EMPTY), this, MID_GNE_ALLOWDISALLOW_CHANGE, GUIDesignButtonIcon);
242  myVClassMap[vclass].second = new FXLabel(buttonAndStatusFrame, "status", nullptr, GUIDesignLabelLeftThick);
243  // create label for description of vehicle
244  new FXLabel(buttonAndInformationFrame, description.c_str(), nullptr, GUIDesignLabelLeftThick);
245 }
246 
247 /****************************************************************************/
long onCmdSelectOnlyNonRoad(FXObject *, FXSelector, void *)
event when user press select only non road button
std::string getVehicleClassNames(SVCPermissions permissions, bool expand)
Returns the ids of the given classes, divided using a &#39; &#39;.
vehicle is a motorcycle
vehicle is a coach
GNEViewNet * myViewNet
to viewNet
#define GUIDesignHorizontalFrame
Definition: GUIDesigns.h:212
is a pedestrian
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types...
GUIIcon
An enumeration of icons used by the gui applications.
Definition: GUIIcons.h:36
long onCmdAccept(FXObject *, FXSelector, void *)
event after press accept button
vehicle is a not electrified rail
vehicle is a bicycle
vehicle is a small delivery vehicle
unselect all vehicles
Definition: GUIAppEnum.h:895
#define GUIDesignContentsFrame
design for the main content frame of every frame/dialog
Definition: GUIDesigns.h:270
vehicle is a light rail
#define GUIDesignButtonCancel
Cancel Button.
Definition: GUIDesigns.h:102
long onCmdSelectAll(FXObject *, FXSelector, void *)
event when user press select all VClasses button
vehicle is a HOV
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
virtual std::string getAttribute(SumoXMLAttr key) const =0
vehicle is a (possibly fast moving) electric rail
authorities vehicles
vehicle is a city rail
vehicle is a large transport vehicle
is a user-defined type
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
GNEUndoList * getUndoList() const
get the undoList object
static void parseStringVector(const std::string &def, std::vector< std::string > &into)
Splits the given string.
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frames used to pack another frames extended in all directions ...
Definition: GUIDesigns.h:258
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:49
select all vehicles
Definition: GUIAppEnum.h:893
#define GUIDesignLabelIcon64x32Thicked
label ticked filled used for VClasses. It uses icons of 64x32 pixels
Definition: GUIDesigns.h:175
army vehicles
private vehicles
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames ...
Definition: GUIDesigns.h:261
#define GUIDesignButtonReset
Reset Button.
Definition: GUIDesigns.h:105
select/unselect single vehicle
Definition: GUIAppEnum.h:891
long onCmdUnselectAll(FXObject *, FXSelector, void *)
event when user press unselect all VClasses button
GNEAttributeCarrier * myAC
edited AC
Dialog for edit rerouters.
vehicle is a passenger car (a "normal" car)
#define GUIDesignButtonAccept
Accept Button.
Definition: GUIDesigns.h:99
#define GUIDesignButtonIcon
button only with icon (23x23)
Definition: GUIDesigns.h:63
is an arbitrary ship
vehicle is a moped
vehicle is a taxi
vehicle is a bus
#define GUIDesignDialogBox
Definition: GUIDesigns.h:410
#define GUIDesignGroupBoxFrame
Group box design extended over frame.
Definition: GUIDesigns.h:227
long onCmdReset(FXObject *, FXSelector, void *)
event after press reset button
vip vehicles
vehicle is a large transport vehicle
FXDEFMAP(GNEDialog_AllowDisallow) GNEDialog_AllowDisallowMap[]
select only non road vehicles
Definition: GUIAppEnum.h:897
public emergency vehicles
std::map< SUMOVehicleClass, std::pair< FXButton *, FXLabel * > > myVClassMap
map with the buttons for every VClass
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
void buildVClass(FXVerticalFrame *contentsFrame, SUMOVehicleClass vclass, GUIIcon vclassIcon, const std::string &description)
build VClass
#define GUIDesignLabelLeftThick
label extended over frame with thick and with text justify to left and height of 23 ...
Definition: GUIDesigns.h:157
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition: ToString.h:237
long onCmdValueChanged(FXObject *, FXSelector, void *)
is a user-defined type
is an electric vehicle