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-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 // A class for edit phases of Variable Speed Signals
16 /****************************************************************************/
17 
18 // ===========================================================================
19 // included modules
20 // ===========================================================================
21 #include <config.h>
22 
23 #include <iostream>
29 #include <netedit/GNEViewNet.h>
30 #include <netedit/GNENet.h>
31 #include <netedit/GNEUndoList.h>
32 
34 
35 
36 // ===========================================================================
37 // FOX callback mapping
38 // ===========================================================================
39 
40 FXDEFMAP(GNEVariableSpeedSignDialog) GNERerouterDialogMap[] = {
47 };
48 
49 // Object implementation
50 FXIMPLEMENT(GNEVariableSpeedSignDialog, GNEAdditionalDialog, GNERerouterDialogMap, ARRAYNUMBER(GNERerouterDialogMap))
51 
52 // ===========================================================================
53 // member method definitions
54 // ===========================================================================
55 
57  GNEAdditionalDialog(editedVariableSpeedSign, false, 300, 400),
58  myStepsValids(false) {
59 
60  // create Horizontal frame for row elements
61  FXHorizontalFrame* myAddStepFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);
62  // create Button and Label for adding new Wors
63  myAddStepButton = new FXButton(myAddStepFrame, "", GUIIconSubSys::getIcon(ICON_ADD), this, MID_GNE_VARIABLESPEEDSIGN_ADDROW, GUIDesignButtonIcon);
64  new FXLabel(myAddStepFrame, ("Add new " + toString(SUMO_TAG_STEP)).c_str(), nullptr, GUIDesignLabelThick);
65  // create Button and Label for sort intervals
66  mySortStepButton = new FXButton(myAddStepFrame, "", GUIIconSubSys::getIcon(ICON_RELOAD), this, MID_GNE_VARIABLESPEEDSIGN_SORT, GUIDesignButtonIcon);
67  new FXLabel(myAddStepFrame, ("Sort " + toString(SUMO_TAG_STEP) + "s").c_str(), nullptr, GUIDesignLabelThick);
68 
69  // create List with the data
70  myStepsTable = new FXTable(myContentFrame, this, MID_GNE_VARIABLESPEEDSIGN_TABLE, GUIDesignTableAdditionals);
71  myStepsTable->setSelBackColor(FXRGBA(255, 255, 255, 255));
72  myStepsTable->setSelTextColor(FXRGBA(0, 0, 0, 255));
73 
74  // update table
75  updateTableSteps();
76 
77  // start a undo list for editing local to this additional
78  initChanges();
79 
80  // Open dialog as modal
81  openAsModalDialog();
82 }
83 
84 
86 
87 
88 long
89 GNEVariableSpeedSignDialog::onCmdAddStep(FXObject*, FXSelector, void*) {
90  // Declare variables for time and speed
92  myEditedAdditional->getViewNet()->getUndoList()->add(new GNEChange_Additional(step, true), true);
93  // Update table
95  return 1;
96 }
97 
98 
99 long
100 GNEVariableSpeedSignDialog::onCmdEditStep(FXObject*, FXSelector, void*) {
101  myStepsValids = true;
102  // iterate over table and check that all parameters are correct
103  for (int i = 0; i < myStepsTable->getNumRows(); 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(ICON_ERROR));
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(ICON_ERROR));
111  } else {
112  // we need filter attribute (to avoid problemes as 1 != 1.00)
113  double time = GNEAttributeCarrier::parse<double>(myStepsTable->getItem(i, 0)->getText().text());
114  double speed = GNEAttributeCarrier::parse<double>(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(ICON_CORRECT));
120  }
121  }
122  // update list
123  myStepsTable->update();
124  return 1;
125 }
126 
127 
128 long
129 GNEVariableSpeedSignDialog::onCmdClickedStep(FXObject*, FXSelector, void*) {
130  // check if some delete button was pressed
131  for (int i = 0; i < (int)myEditedAdditional->getAdditionalChilds().size(); i++) {
132  if (myStepsTable->getItem(i, 3)->hasFocus()) {
133  myStepsTable->removeRows(i);
135  // Update table
137  return 1;
138  }
139  }
140  return 0;
141 }
142 
143 
144 long
145 GNEVariableSpeedSignDialog::onCmdSortSteps(FXObject*, FXSelector, void*) {
146  // Sort variable speed sign steps
148  // update table
150  return 1;
151 }
152 
153 
154 long
155 GNEVariableSpeedSignDialog::onCmdAccept(FXObject*, FXSelector, void*) {
156  if (myStepsValids == false) {
157  // write warning if netedit is running in testing mode
158  WRITE_DEBUG("Opening FXMessageBox of type 'warning'");
159  // open warning Box
160  FXMessageBox::warning(getApp(), MBOX_OK, ("Error updating " + toString(SUMO_TAG_VSS) + " " + toString(SUMO_TAG_STEP)).c_str(), "%s",
161  (toString(SUMO_TAG_VSS) + " " + toString(SUMO_TAG_STEP) + "cannot be updated because there are invalid values").c_str());
162  // write warning if netedit is running in testing mode
163  WRITE_DEBUG("Closed FXMessageBox of type 'warning' with 'OK'");
164  return 0;
165  } else {
166  // accept changes before closing dialog
167  acceptChanges();
168  // sort steps after finish
170  // stop dialgo sucesfully
171  getApp()->stopModal(this, TRUE);
172  return 1;
173  }
174 }
175 
176 
177 long
178 GNEVariableSpeedSignDialog::onCmdCancel(FXObject*, FXSelector, void*) {
179  // cancel changes
180  cancelChanges();
181  // Stop Modal
182  getApp()->stopModal(this, FALSE);
183  return 1;
184 }
185 
186 
187 long
188 GNEVariableSpeedSignDialog::onCmdReset(FXObject*, FXSelector, void*) {
189  // reset changes
190  resetChanges();
191  // update steps tables
193  return 1;
194 }
195 
196 
197 void
199  // clear table
200  myStepsTable->clearItems();
201  // set number of rows
202  myStepsTable->setTableSize(int(myEditedAdditional->getAdditionalChilds().size()), 4);
203  // Configure list
204  myStepsTable->setVisibleColumns(4);
205  myStepsTable->setColumnWidth(0, 115);
206  myStepsTable->setColumnWidth(1, 114);
207  myStepsTable->setColumnWidth(2, GUIDesignTableIconCellWidth);
208  myStepsTable->setColumnWidth(3, GUIDesignTableIconCellWidth);
209  myStepsTable->setColumnText(0, "timeStep");
210  myStepsTable->setColumnText(1, "speed (km/h)");
211  myStepsTable->setColumnText(2, "");
212  myStepsTable->setColumnText(3, "");
213  myStepsTable->getRowHeader()->setWidth(0);
214  // Declare index for rows and pointer to FXTableItem
215  FXTableItem* item = nullptr;
216  // iterate over values
217  for (int i = 0; i < (int)myEditedAdditional->getAdditionalChilds().size(); i++) {
218  // Set time
219  item = new FXTableItem(myEditedAdditional->getAdditionalChilds().at(i)->getAttribute(SUMO_ATTR_TIME).c_str());
220  myStepsTable->setItem(i, 0, item);
221  // Set speed
222  item = new FXTableItem(myEditedAdditional->getAdditionalChilds().at(i)->getAttribute(SUMO_ATTR_SPEED).c_str());
223  myStepsTable->setItem(i, 1, item);
224  // set valid icon
225  item = new FXTableItem("");
226  item->setIcon(GUIIconSubSys::getIcon(ICON_CORRECT));
227  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
228  item->setEnabled(false);
229  myStepsTable->setItem(i, 2, item);
230  // set remove Icon
231  item = new FXTableItem("", GUIIconSubSys::getIcon(ICON_REMOVE));
232  item->setJustify(FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
233  item->setEnabled(false);
234  myStepsTable->setItem(i, 3, item);
235  }
236 }
237 
238 /****************************************************************************/
virtual bool isValid(SumoXMLAttr key, const std::string &value)=0
method for checking if the key and their conrrespond attribute are valids
#define GUIDesignTableIconCellWidth
width of cells that only contains an Icon
Definition: GUIDesigns.h:450
void resetChanges()
reset changes did in this dialog.
void updateTableSteps()
update data table
Dialog to edit sequences, parameters, etc.. of Additionals.
FXTable * myStepsTable
Table with the data.
virtual void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)=0
method for setting the attribute and letting the object perform additional changes ...
long onCmdSortSteps(FXObject *, FXSelector, void *)
event called after clicked over sort step button
GNEUndoList * getUndoList() const
get the undoList object
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:49
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames ...
Definition: GUIDesigns.h:261
long onCmdClickedStep(FXObject *, FXSelector, void *)
event called after clicked a row
void sortAdditionalChilds()
sort childs (used by Rerouters and VSS)
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:248
#define GUIDesignTableAdditionals
design for tables used in additional dialogs
Definition: GUIDesigns.h:447
long onCmdAccept(FXObject *, FXSelector, void *)
event called after press accept button
#define GUIDesignButtonIcon
button only with icon (23x23)
Definition: GUIDesigns.h:63
GNEAdditional * myEditedAdditional
pointer to edited aditional
trigger: the time of the step
void acceptChanges()
Accept changes did in this dialog.
GNEViewNet * getViewNet() const
Returns a pointer to GNEViewNet in which additional element is located.
An Element which don&#39;t belongs to GNENet but has influency in the simulation.
Definition: GNEAdditional.h:48
void cancelChanges()
Cancel changes did in this dialog.
#define GUIDesignLabelThick
label extended over frame with thick and with text justify to left and height of 23 ...
Definition: GUIDesigns.h:154
long onCmdCancel(FXObject *, FXSelector, void *)
event called after press cancel button
long onCmdAddStep(FXObject *, FXSelector, void *)
A variable speed sign.
long onCmdReset(FXObject *, FXSelector, void *)
event called after press cancel button
long onCmdEditStep(FXObject *, FXSelector, void *)
event called after edit row
FXDEFMAP(GNEVariableSpeedSignDialog) GNERerouterDialogMap[]
const std::vector< GNEAdditional * > & getAdditionalChilds() const
return vector of additionals that have as Parent this edge (For example, Calibrators) ...
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
trigger: a step description