Eclipse SUMO - Simulation of Urban MObility
GNEVariableSpeedSignDialog.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 // A class for edit phases of Variable Speed Signals
19 /****************************************************************************/
20 #include <config.h>
21 
26 #include <netedit/GNENet.h>
27 #include <netedit/GNEViewNet.h>
28 #include <netedit/GNEUndoList.h>
29 
31 
32 
33 // ===========================================================================
34 // FOX callback mapping
35 // ===========================================================================
36 
37 FXDEFMAP(GNEVariableSpeedSignDialog) GNERerouterDialogMap[] = {
44 };
45 
46 // Object implementation
47 FXIMPLEMENT(GNEVariableSpeedSignDialog, GNEAdditionalDialog, GNERerouterDialogMap, ARRAYNUMBER(GNERerouterDialogMap))
48 
49 // ===========================================================================
50 // member method definitions
51 // ===========================================================================
52 
54  GNEAdditionalDialog(editedVariableSpeedSign, false, 300, 400),
55  myStepsValids(false) {
56  // create Horizontal frame for row elements
57  FXHorizontalFrame* myAddStepFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);
58  // create Button and Label for adding new Wors
59  myAddStepButton = new FXButton(myAddStepFrame, "", GUIIconSubSys::getIcon(GUIIcon::ADD), this, MID_GNE_VARIABLESPEEDSIGN_ADDROW, GUIDesignButtonIcon);
60  new FXLabel(myAddStepFrame, ("Add new " + toString(SUMO_TAG_STEP)).c_str(), nullptr, GUIDesignLabelThick);
61  // create Button and Label for sort intervals
62  mySortStepButton = new FXButton(myAddStepFrame, "", GUIIconSubSys::getIcon(GUIIcon::RELOAD), this, MID_GNE_VARIABLESPEEDSIGN_SORT, GUIDesignButtonIcon);
63  new FXLabel(myAddStepFrame, ("Sort " + toString(SUMO_TAG_STEP) + "s").c_str(), nullptr, GUIDesignLabelThick);
64  // create List with the data
65  myStepsTable = new FXTable(myContentFrame, this, MID_GNE_VARIABLESPEEDSIGN_TABLE, GUIDesignTableAdditionals);
66  myStepsTable->setSelBackColor(FXRGBA(255, 255, 255, 255));
67  myStepsTable->setSelTextColor(FXRGBA(0, 0, 0, 255));
68  // update table
69  updateTableSteps();
70  // start a undo list for editing local to this additional
71  initChanges();
72  // Open dialog as modal
73  openAsModalDialog();
74 }
75 
76 
78 
79 
80 long
81 GNEVariableSpeedSignDialog::onCmdAddStep(FXObject*, FXSelector, void*) {
82  // create step
84  // add it using GNEChange_additional
86  // Update table
88  return 1;
89 }
90 
91 
92 long
93 GNEVariableSpeedSignDialog::onCmdEditStep(FXObject*, FXSelector, void*) {
94  // get VSS children
95  std::vector<GNEAdditional*> VSSChildren;
96  for (const auto& VSSChild : myEditedAdditional->getChildAdditionals()) {
97  if (!VSSChild->getTagProperty().isSymbol()) {
98  VSSChildren.push_back(VSSChild);
99  }
100  }
101  myStepsValids = true;
102  // iterate over table and check that all parameters are correct
103  for (int i = 0; i < myStepsTable->getNumRows(); i++) {
104  GNEAdditional* step = VSSChildren.at(i);
105  if (step->isValid(SUMO_ATTR_TIME, myStepsTable->getItem(i, 0)->getText().text()) == false) {
106  myStepsValids = false;
107  myStepsTable->getItem(i, 2)->setIcon(GUIIconSubSys::getIcon(GUIIcon::INCORRECT));
108  } else if (step->isValid(SUMO_ATTR_SPEED, myStepsTable->getItem(i, 1)->getText().text()) == false) {
109  myStepsValids = false;
110  myStepsTable->getItem(i, 2)->setIcon(GUIIconSubSys::getIcon(GUIIcon::INCORRECT));
111  } else {
112  // we need filter attribute (to avoid problemes as 1 != 1.00)
113  const double time = GNEAttributeCarrier::parse<double>(myStepsTable->getItem(i, 0)->getText().text());
114  const std::string speed = myStepsTable->getItem(i, 1)->getText().text();
115  // set new values in Closing reroute
118  // set Correct label
119  myStepsTable->getItem(i, 2)->setIcon(GUIIconSubSys::getIcon(GUIIcon::CORRECT));
120  }
121  }
122  // update list
123  myStepsTable->update();
124  return 1;
125 }
126 
127 
128 long
129 GNEVariableSpeedSignDialog::onCmdClickedStep(FXObject*, FXSelector, void*) {
130  // get VSS children
131  std::vector<GNEAdditional*> VSSChildren;
132  for (const auto& VSSChild : myEditedAdditional->getChildAdditionals()) {
133  if (!VSSChild->getTagProperty().isSymbol()) {
134  VSSChildren.push_back(VSSChild);
135  }
136  }
137  // check if some delete button was pressed
138  for (int i = 0; i < (int)VSSChildren.size(); i++) {
139  if (myStepsTable->getItem(i, 3)->hasFocus()) {
140  myStepsTable->removeRows(i);
141  myEditedAdditional->getNet()->getViewNet()->getUndoList()->add(new GNEChange_Additional(VSSChildren.at(i), false), true);
142  // Update table
144  return 1;
145  }
146  }
147  return 0;
148 }
149 
150 
151 long
152 GNEVariableSpeedSignDialog::onCmdSortSteps(FXObject*, FXSelector, void*) {
153  // update table
155  return 1;
156 }
157 
158 
159 long
160 GNEVariableSpeedSignDialog::onCmdAccept(FXObject*, FXSelector, void*) {
161  if (myStepsValids == false) {
162  // write warning if netedit is running in testing mode
163  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
164  // open warning Box
165  FXMessageBox::warning(getApp(), MBOX_OK, ("Error updating " + toString(SUMO_TAG_VSS) + " " + toString(SUMO_TAG_STEP)).c_str(), "%s",
166  (toString(SUMO_TAG_VSS) + " " + toString(SUMO_TAG_STEP) + "cannot be updated because there are invalid values").c_str());
167  // write warning if netedit is running in testing mode
168  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
169  return 0;
170  } else {
171  // accept changes before closing dialog
172  acceptChanges();
173  // stop dialgo sucesfully
174  getApp()->stopModal(this, TRUE);
175  return 1;
176  }
177 }
178 
179 
180 long
181 GNEVariableSpeedSignDialog::onCmdCancel(FXObject*, FXSelector, void*) {
182  // cancel changes
183  cancelChanges();
184  // Stop Modal
185  getApp()->stopModal(this, FALSE);
186  return 1;
187 }
188 
189 
190 long
191 GNEVariableSpeedSignDialog::onCmdReset(FXObject*, FXSelector, void*) {
192  // reset changes
193  resetChanges();
194  // update steps tables
196  return 1;
197 }
198 
199 
200 void
202  // get VSS children
203  std::vector<GNEAdditional*> VSSChildren;
204  for (const auto& VSSChild : myEditedAdditional->getChildAdditionals()) {
205  if (!VSSChild->getTagProperty().isSymbol()) {
206  VSSChildren.push_back(VSSChild);
207  }
208  }
209  // clear table
210  myStepsTable->clearItems();
211  // set number of rows
212  myStepsTable->setTableSize(int(VSSChildren.size()), 4);
213  // Configure list
214  myStepsTable->setVisibleColumns(4);
215  myStepsTable->setColumnWidth(0, 115);
216  myStepsTable->setColumnWidth(1, 114);
217  myStepsTable->setColumnWidth(2, GUIDesignHeight);
218  myStepsTable->setColumnWidth(3, GUIDesignHeight);
219  myStepsTable->setColumnText(0, "timeStep");
220  myStepsTable->setColumnText(1, "speed (m/s)");
221  myStepsTable->setColumnText(2, "");
222  myStepsTable->setColumnText(3, "");
223  myStepsTable->getRowHeader()->setWidth(0);
224  // Declare index for rows and pointer to FXTableItem
225  FXTableItem* item = nullptr;
226  // iterate over values
227  for (int i = 0; i < (int)VSSChildren.size(); i++) {
228  // Set time
229  item = new FXTableItem(VSSChildren.at(i)->getAttribute(SUMO_ATTR_TIME).c_str());
230  myStepsTable->setItem(i, 0, item);
231  // Set speed
232  item = new FXTableItem(VSSChildren.at(i)->getAttribute(SUMO_ATTR_SPEED).c_str());
233  myStepsTable->setItem(i, 1, item);
234  // set valid icon
235  item = new FXTableItem("");
237  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
238  item->setEnabled(false);
239  myStepsTable->setItem(i, 2, item);
240  // set remove Icon
241  item = new FXTableItem("", GUIIconSubSys::getIcon(GUIIcon::REMOVE));
242  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
243  item->setEnabled(false);
244  myStepsTable->setItem(i, 3, item);
245  }
246 }
247 
248 
249 /****************************************************************************/
FXDEFMAP(GNEVariableSpeedSignDialog) GNERerouterDialogMap[]
@ MID_GNE_VARIABLESPEEDSIGN_TABLE
Click over Table.
Definition: GUIAppEnum.h:1213
@ MID_GNE_VARIABLESPEEDSIGN_ADDROW
add row
Definition: GUIAppEnum.h:1211
@ MID_GNE_VARIABLESPEEDSIGN_SORT
sort table values
Definition: GUIAppEnum.h:1215
#define GUIDesignButtonIcon
button only with icon
Definition: GUIDesigns.h:77
#define GUIDesignTableAdditionals
design for tables used in additional dialogs
Definition: GUIDesigns.h:559
#define GUIDesignHeight
define a standard height for all elements (Change it carefully)
Definition: GUIDesigns.h:37
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:343
#define GUIDesignLabelThick
label extended over frame with thick and with text justify to left
Definition: GUIDesigns.h:202
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:290
@ SUMO_TAG_STEP
trigger: a step description
@ SUMO_TAG_VSS
A variable speed sign.
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_TIME
trigger: the time of the step
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
Dialog to edit sequences, parameters, etc.. of Additionals.
void acceptChanges()
Accept changes did in this dialog.
void cancelChanges()
Cancel changes did in this dialog.
GNEAdditional * myEditedAdditional
pointer to edited aditional
void resetChanges()
reset changes did in this dialog.
An Element which don't belongs to GNENet but has influency in the simulation.
Definition: GNEAdditional.h:48
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
method for setting the attribute and letting the object perform additional changes
virtual bool isValid(SumoXMLAttr key, const std::string &value)=0
method for checking if the key and their conrrespond attribute are valids
GNENet * getNet() const
get pointer to net
const std::vector< GNEAdditional * > & getChildAdditionals() const
return child additionals
GNEViewNet * getViewNet() const
get view net
Definition: GNENet.cpp:1964
void add(GNEChange *command, bool doit=false, bool merge=true)
Add new command, executing it if desired. The new command will be merged with the previous command if...
FXTable * myStepsTable
Table with the data.
long onCmdClickedStep(FXObject *, FXSelector, void *)
event called after clicked a row
long onCmdCancel(FXObject *, FXSelector, void *)
event called after press cancel button
long onCmdAccept(FXObject *, FXSelector, void *)
event called after press accept button
long onCmdEditStep(FXObject *, FXSelector, void *)
event called after edit row
long onCmdSortSteps(FXObject *, FXSelector, void *)
event called after clicked over sort step button
long onCmdAddStep(FXObject *, FXSelector, void *)
long onCmdReset(FXObject *, FXSelector, void *)
event called after press cancel button
void updateTableSteps()
update data table
GNEUndoList * getUndoList() const
get the undoList object
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon