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-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 // 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 
57  // create Horizontal frame for row elements
58  FXHorizontalFrame* myAddStepFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);
59  // create Button and Label for adding new Wors
60  myAddStepButton = new FXButton(myAddStepFrame, "", GUIIconSubSys::getIcon(GUIIcon::ADD), this, MID_GNE_VARIABLESPEEDSIGN_ADDROW, GUIDesignButtonIcon);
61  new FXLabel(myAddStepFrame, ("Add new " + toString(SUMO_TAG_STEP)).c_str(), nullptr, GUIDesignLabelThick);
62  // create Button and Label for sort intervals
63  mySortStepButton = new FXButton(myAddStepFrame, "", GUIIconSubSys::getIcon(GUIIcon::RELOAD), this, MID_GNE_VARIABLESPEEDSIGN_SORT, GUIDesignButtonIcon);
64  new FXLabel(myAddStepFrame, ("Sort " + toString(SUMO_TAG_STEP) + "s").c_str(), nullptr, GUIDesignLabelThick);
65 
66  // create List with the data
67  myStepsTable = new FXTable(myContentFrame, this, MID_GNE_VARIABLESPEEDSIGN_TABLE, GUIDesignTableAdditionals);
68  myStepsTable->setSelBackColor(FXRGBA(255, 255, 255, 255));
69  myStepsTable->setSelTextColor(FXRGBA(0, 0, 0, 255));
70 
71  // update table
72  updateTableSteps();
73 
74  // start a undo list for editing local to this additional
75  initChanges();
76 
77  // Open dialog as modal
78  openAsModalDialog();
79 }
80 
81 
83 
84 
85 long
86 GNEVariableSpeedSignDialog::onCmdAddStep(FXObject*, FXSelector, void*) {
87  // create step
89  // add it using GNEChange_additional
90  myEditedAdditional->getNet()->getViewNet()->getUndoList()->add(new GNEChange_Additional(step, true), true);
91  // Update table
93  return 1;
94 }
95 
96 
97 long
98 GNEVariableSpeedSignDialog::onCmdEditStep(FXObject*, FXSelector, void*) {
99  // get VSS children
100  std::vector<GNEAdditional*> VSSChildren;
101  for (const auto& VSSChild : myEditedAdditional->getChildAdditionals()) {
102  if (!VSSChild->getTagProperty().isSymbol()) {
103  VSSChildren.push_back(VSSChild);
104  }
105  }
106  myStepsValids = true;
107  // iterate over table and check that all parameters are correct
108  for (int i = 0; i < myStepsTable->getNumRows(); i++) {
109  GNEAdditional* step = VSSChildren.at(i);
110  if (step->isValid(SUMO_ATTR_TIME, myStepsTable->getItem(i, 0)->getText().text()) == false) {
111  myStepsValids = false;
112  myStepsTable->getItem(i, 2)->setIcon(GUIIconSubSys::getIcon(GUIIcon::INCORRECT));
113  } else if (step->isValid(SUMO_ATTR_SPEED, myStepsTable->getItem(i, 1)->getText().text()) == false) {
114  myStepsValids = false;
115  myStepsTable->getItem(i, 2)->setIcon(GUIIconSubSys::getIcon(GUIIcon::INCORRECT));
116  } else {
117  // we need filter attribute (to avoid problemes as 1 != 1.00)
118  double time = GNEAttributeCarrier::parse<double>(myStepsTable->getItem(i, 0)->getText().text());
119  double speed = GNEAttributeCarrier::parse<double>(myStepsTable->getItem(i, 1)->getText().text());
120  // set new values in Closing reroute
123  // set Correct label
124  myStepsTable->getItem(i, 2)->setIcon(GUIIconSubSys::getIcon(GUIIcon::CORRECT));
125  }
126  }
127  // update list
128  myStepsTable->update();
129  return 1;
130 }
131 
132 
133 long
134 GNEVariableSpeedSignDialog::onCmdClickedStep(FXObject*, FXSelector, void*) {
135  // get VSS children
136  std::vector<GNEAdditional*> VSSChildren;
137  for (const auto& VSSChild : myEditedAdditional->getChildAdditionals()) {
138  if (!VSSChild->getTagProperty().isSymbol()) {
139  VSSChildren.push_back(VSSChild);
140  }
141  }
142  // check if some delete button was pressed
143  for (int i = 0; i < (int)VSSChildren.size(); i++) {
144  if (myStepsTable->getItem(i, 3)->hasFocus()) {
145  myStepsTable->removeRows(i);
146  myEditedAdditional->getNet()->getViewNet()->getUndoList()->add(new GNEChange_Additional(VSSChildren.at(i), false), true);
147  // Update table
149  return 1;
150  }
151  }
152  return 0;
153 }
154 
155 
156 long
157 GNEVariableSpeedSignDialog::onCmdSortSteps(FXObject*, FXSelector, void*) {
158  // update table
160  return 1;
161 }
162 
163 
164 long
165 GNEVariableSpeedSignDialog::onCmdAccept(FXObject*, FXSelector, void*) {
166  if (myStepsValids == false) {
167  // write warning if netedit is running in testing mode
168  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
169  // open warning Box
170  FXMessageBox::warning(getApp(), MBOX_OK, ("Error updating " + toString(SUMO_TAG_VSS) + " " + toString(SUMO_TAG_STEP)).c_str(), "%s",
171  (toString(SUMO_TAG_VSS) + " " + toString(SUMO_TAG_STEP) + "cannot be updated because there are invalid values").c_str());
172  // write warning if netedit is running in testing mode
173  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
174  return 0;
175  } else {
176  // accept changes before closing dialog
177  acceptChanges();
178  // stop dialgo sucesfully
179  getApp()->stopModal(this, TRUE);
180  return 1;
181  }
182 }
183 
184 
185 long
186 GNEVariableSpeedSignDialog::onCmdCancel(FXObject*, FXSelector, void*) {
187  // cancel changes
188  cancelChanges();
189  // Stop Modal
190  getApp()->stopModal(this, FALSE);
191  return 1;
192 }
193 
194 
195 long
196 GNEVariableSpeedSignDialog::onCmdReset(FXObject*, FXSelector, void*) {
197  // reset changes
198  resetChanges();
199  // update steps tables
201  return 1;
202 }
203 
204 
205 void
207  // get VSS children
208  std::vector<GNEAdditional*> VSSChildren;
209  for (const auto& VSSChild : myEditedAdditional->getChildAdditionals()) {
210  if (!VSSChild->getTagProperty().isSymbol()) {
211  VSSChildren.push_back(VSSChild);
212  }
213  }
214  // clear table
215  myStepsTable->clearItems();
216  // set number of rows
217  myStepsTable->setTableSize(int(VSSChildren.size()), 4);
218  // Configure list
219  myStepsTable->setVisibleColumns(4);
220  myStepsTable->setColumnWidth(0, 115);
221  myStepsTable->setColumnWidth(1, 114);
222  myStepsTable->setColumnWidth(2, GUIDesignHeight);
223  myStepsTable->setColumnWidth(3, GUIDesignHeight);
224  myStepsTable->setColumnText(0, "timeStep");
225  myStepsTable->setColumnText(1, "speed (m/s)");
226  myStepsTable->setColumnText(2, "");
227  myStepsTable->setColumnText(3, "");
228  myStepsTable->getRowHeader()->setWidth(0);
229  // Declare index for rows and pointer to FXTableItem
230  FXTableItem* item = nullptr;
231  // iterate over values
232  for (int i = 0; i < (int)VSSChildren.size(); i++) {
233  // Set time
234  item = new FXTableItem(VSSChildren.at(i)->getAttribute(SUMO_ATTR_TIME).c_str());
235  myStepsTable->setItem(i, 0, item);
236  // Set speed
237  item = new FXTableItem(VSSChildren.at(i)->getAttribute(SUMO_ATTR_SPEED).c_str());
238  myStepsTable->setItem(i, 1, item);
239  // set valid icon
240  item = new FXTableItem("");
242  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
243  item->setEnabled(false);
244  myStepsTable->setItem(i, 2, item);
245  // set remove Icon
246  item = new FXTableItem("", GUIIconSubSys::getIcon(GUIIcon::REMOVE));
247  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
248  item->setEnabled(false);
249  myStepsTable->setItem(i, 3, item);
250  }
251 }
252 
253 
254 /****************************************************************************/
FXDEFMAP(GNEVariableSpeedSignDialog) GNERerouterDialogMap[]
@ MID_GNE_VARIABLESPEEDSIGN_TABLE
Click over Table.
Definition: GUIAppEnum.h:1114
@ MID_GNE_VARIABLESPEEDSIGN_ADDROW
add row
Definition: GUIAppEnum.h:1112
@ MID_GNE_VARIABLESPEEDSIGN_SORT
sort table values
Definition: GUIAppEnum.h:1116
#define GUIDesignButtonIcon
button only with icon
Definition: GUIDesigns.h:71
#define GUIDesignTableAdditionals
design for tables used in additional dialogs
Definition: GUIDesigns.h:526
#define GUIDesignHeight
define a standard height for all elements (Change it carefully)
Definition: GUIDesigns.h:31
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:313
#define GUIDesignLabelThick
label extended over frame with thick and with text justify to left
Definition: GUIDesigns.h:184
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:286
@ 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:44
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:47
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:2245
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