Eclipse SUMO - Simulation of Urban MObility
GUIDialog_GLObjChooser.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-2019 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 /****************************************************************************/
16 // Class for the window that allows to choose a street, junction or vehicle
17 /****************************************************************************/
18 
19 
20 // ===========================================================================
21 // included modules
22 // ===========================================================================
23 #include <config.h>
24 
25 #include <string>
26 #include <vector>
27 #include <fxkeys.h>
37 #include "GUIDialog_GLObjChooser.h"
38 
39 
40 // ===========================================================================
41 // FOX callback mapping
42 // ===========================================================================
43 FXDEFMAP(GUIDialog_GLObjChooser) GUIDialog_GLObjChooserMap[] = {
46  FXMAPFUNC(SEL_COMMAND, MID_CANCEL, GUIDialog_GLObjChooser::onCmdClose),
47  FXMAPFUNC(SEL_CHANGED, MID_CHOOSER_TEXT, GUIDialog_GLObjChooser::onChgText),
48  FXMAPFUNC(SEL_COMMAND, MID_CHOOSER_TEXT, GUIDialog_GLObjChooser::onCmdText),
54 };
55 
56 FXIMPLEMENT(GUIDialog_GLObjChooser, FXMainWindow, GUIDialog_GLObjChooserMap, ARRAYNUMBER(GUIDialog_GLObjChooserMap))
57 
58 
59 // ===========================================================================
60 // method definitions
61 // ===========================================================================
62 GUIDialog_GLObjChooser::GUIDialog_GLObjChooser(GUIGlChildWindow* parent, FXIcon* icon, const FXString& title, const std::vector<GUIGlID>& ids, GUIGlObjectStorage& /*glStorage*/) :
63  FXMainWindow(parent->getApp(), title, icon, nullptr, GUIDesignChooserDialog),
64  myParent(parent),
65  myLocateByName(false) {
66  FXHorizontalFrame* hbox = new FXHorizontalFrame(this, GUIDesignAuxiliarFrame);
67  // build the list
68  FXVerticalFrame* layoutLeft = new FXVerticalFrame(hbox, GUIDesignChooserLayoutLeft);
69  myTextEntry = new FXTextField(layoutLeft, 0, this, MID_CHOOSER_TEXT, GUIDesignChooserTextField);
70  FXVerticalFrame* layoutList = new FXVerticalFrame(layoutLeft, GUIDesignChooserLayoutList);
71  myList = new FXList(layoutList, this, MID_CHOOSER_LIST, GUIDesignChooserListSingle);
72  refreshList(ids);
73  // build the buttons
74  FXVerticalFrame* layoutRight = new FXVerticalFrame(hbox, GUIDesignChooserLayoutRight);
75  myCenterButton = new FXButton(layoutRight, "Center\t\t", GUIIconSubSys::getIcon(ICON_RECENTERVIEW), this, MID_CHOOSER_CENTER, GUIDesignChooserButtons);
76  myTrackButton = new FXButton(layoutRight, "Track\t\t", GUIIconSubSys::getIcon(ICON_RECENTERVIEW), this, MID_CHOOSER_TRACK, GUIDesignChooserButtons);
77  // only enable Track Button if we're locating vehicles
78  if (title.text() != std::string("Vehicle Chooser")) {
79  myTrackButton->disable();
80  myTrackButton->hide();
81  }
82  new FXHorizontalSeparator(layoutRight, GUIDesignHorizontalSeparator);
83  new FXButton(layoutRight, "&Hide Unselected\t\t", GUIIconSubSys::getIcon(ICON_FLAG), this, MID_CHOOSER_FILTER, GUIDesignChooserButtons);
84  new FXButton(layoutRight, "&Filter substring\t\t", nullptr, this, MID_CHOOSER_FILTER_SUBSTR, GUIDesignChooserButtons);
85  new FXButton(layoutRight, "&Select/deselect\tSelect/deselect current object\t", GUIIconSubSys::getIcon(ICON_FLAG), this, MID_CHOOSEN_INVERT, GUIDesignChooserButtons);
86  new FXButton(layoutRight, "By &Name\tLocate item by name\t", nullptr, this, MID_CHOOSEN_NAME, GUIDesignChooserButtons);
87  new FXHorizontalSeparator(layoutRight, GUIDesignHorizontalSeparator);
88  new FXButton(layoutRight, "&Close\t\t", GUIIconSubSys::getIcon(ICON_NO), this, MID_CANCEL, GUIDesignChooserButtons);
89 
90  myParent->getParent()->addChild(this);
91  // create and show dialog
92  create();
93  show();
94 }
95 
96 
98  myParent->getParent()->removeChild(this);
99 }
100 
101 
102 void
104  FXMainWindow::show();
105  myTextEntry->setFocus();
106 }
107 
108 
109 long
110 GUIDialog_GLObjChooser::onCmdCenter(FXObject*, FXSelector, void*) {
111  int selected = myList->getCurrentItem();
112  if (selected >= 0) {
113  myParent->getView()->stopTrack();
114  myParent->setView(*static_cast<GUIGlID*>(myList->getItemData(selected)));
115  }
116  return 1;
117 }
118 
119 
120 long
121 GUIDialog_GLObjChooser::onCmdTrack(FXObject*, FXSelector, void*) {
122  int selected = myList->getCurrentItem();
123  if (selected >= 0) {
124  myParent->setView(*static_cast<GUIGlID*>(myList->getItemData(selected)));
125  GUIGlID id = *static_cast<GUIGlID*>(myList->getItemData(selected));
127  if (o->getType() == GLO_VEHICLE) {
129  }
131  }
132  return 1;
133 }
134 
135 
136 long
137 GUIDialog_GLObjChooser::onCmdClose(FXObject*, FXSelector, void*) {
138  close(true);
139  return 1;
140 }
141 
142 
143 long
144 GUIDialog_GLObjChooser::onChgText(FXObject*, FXSelector, void*) {
145  int id = -1;
146  if (myLocateByName) {
147  // findItem does not support substring search
148  const int numItems = myList->getNumItems();
149  FXString t = myTextEntry->getText().lower();
150  for (int i = 0; i < numItems; i++) {
151  if (myList->getItemText(i).lower().find(t) >= 0) {
152  id = i;
153  break;
154  }
155  }
156  } else {
157  id = myList->findItem(myTextEntry->getText(), -1, SEARCH_PREFIX);
158  }
159  if (id < 0) {
160  if (myList->getNumItems() > 0) {
161  myList->deselectItem(myList->getCurrentItem());
162  }
163  myCenterButton->disable();
164  myTrackButton->disable();
165  return 1;
166  }
167  myList->deselectItem(myList->getCurrentItem());
168  myList->makeItemVisible(id);
169  myList->selectItem(id);
170  myList->setCurrentItem(id, true);
171  myCenterButton->enable();
172  myTrackButton->enable();
173  return 1;
174 }
175 
176 
177 long
178 GUIDialog_GLObjChooser::onCmdText(FXObject*, FXSelector, void*) {
179  int current = myList->getCurrentItem();
180  if (current >= 0 && myList->isItemSelected(current)) {
181  myParent->setView(*static_cast<GUIGlID*>(myList->getItemData(current)));
182  }
183  return 1;
184 }
185 
186 
187 
188 long
189 GUIDialog_GLObjChooser::onListKeyPress(FXObject*, FXSelector, void* ptr) {
190  FXEvent* event = (FXEvent*)ptr;
191  switch (event->code) {
192  case KEY_Return:
193  onCmdText(nullptr, 0, nullptr);
194  break;
195  default:
196  break;
197  }
198  return 1;
199 }
200 
201 
202 long
203 GUIDialog_GLObjChooser::onCmdFilter(FXObject*, FXSelector, void*) {
205  std::vector<GUIGlID> selectedGlIDs;
206  const int numItems = myList->getNumItems();
207  for (int i = 0; i < numItems; i++) {
208  const GUIGlID glID = *static_cast<GUIGlID*>(myList->getItemData(i));
209  if (myList->getItemIcon(i) == flag) {
210  selectedGlIDs.push_back(glID);
211  }
212  }
213  refreshList(selectedGlIDs);
214  return 1;
215 }
216 
217 
218 long
219 GUIDialog_GLObjChooser::onCmdFilterSubstr(FXObject*, FXSelector, void*) {
220  std::vector<GUIGlID> selectedGlIDs;
221  const int numItems = myList->getNumItems();
222  FXString t = myTextEntry->getText().lower();
223  for (int i = 0; i < numItems; i++) {
224  if (myList->getItemText(i).lower().find(t) >= 0) {
225  const GUIGlID glID = *static_cast<GUIGlID*>(myList->getItemData(i));
226  selectedGlIDs.push_back(glID);
227  }
228  }
229  refreshList(selectedGlIDs);
230  return 1;
231 }
232 
233 
234 std::string
236  if (myLocateByName) {
237  return o->getOptionalName();
238  } else {
239  return o->getMicrosimID();
240  }
241 }
242 
243 void
244 GUIDialog_GLObjChooser::refreshList(const std::vector<GUIGlID>& ids) {
245  myList->clearItems();
246  for (auto i : ids) {
248  if (o == nullptr) {
249  continue;
250  }
251  const std::string& name = getObjectName(o);
252  bool selected = myParent->isSelected(o);
253  FXIcon* icon = selected ? GUIIconSubSys::getIcon(ICON_FLAG) : nullptr;
254  myIDs.insert(o->getGlID());
255  myList->appendItem(name.c_str(), icon, (void*) & (*myIDs.find(o->getGlID())));
257  }
258  myList->update();
259 }
260 
261 
262 long
263 GUIDialog_GLObjChooser::onCmdToggleSelection(FXObject*, FXSelector, void*) {
265  int i = myList->getCurrentItem();
266  if (i >= 0) {
267  toggleSelection(i);
268  if (myList->getItemIcon(i) == flag) {
269  myList->setItemIcon(i, nullptr);
270  } else {
271  myList->setItemIcon(i, flag);
272  }
273  }
274  myList->update();
275  myParent->getView()->update();
276  return 1;
277 }
278 
279 
280 long
281 GUIDialog_GLObjChooser::onCmdLocateByName(FXObject*, FXSelector, void*) {
282  std::vector<std::pair<std::string, GUIGlID> > namesAndIDs;
283  myLocateByName = true;
284  const int numItems = myList->getNumItems();
285  for (int i = 0; i < numItems; i++) {
286  GUIGlID glID = *static_cast<GUIGlID*>(myList->getItemData(i));
288  const std::string& name = getObjectName(o);
289  if (name != "") {
290  namesAndIDs.push_back(std::make_pair(name, glID));
291  }
293  }
294  std::sort(namesAndIDs.begin(), namesAndIDs.end());
295  std::vector<GUIGlID> selectedGlIDs;
296  for (const auto& item : namesAndIDs) {
297  selectedGlIDs.push_back(item.second);
298  }
299  refreshList(selectedGlIDs);
300  myTextEntry->setFocus();
301  return 1;
302 }
303 
304 
305 void
307  GUIGlID* glID = static_cast<GUIGlID*>(myList->getItemData(listIndex));
308  gSelected.toggleSelection(*glID);
309 }
310 
311 
312 
313 
314 /****************************************************************************/
315 
GUIGlObject::getType
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Definition: GUIGlObject.cpp:180
GUIGlObject.h
flag
const unsigned char flag[]
Definition: flag.cpp:20
GUIDialog_GLObjChooser::myLocateByName
bool myLocateByName
whether to locate by object name instead of id
Definition: GUIDialog_GLObjChooser.h:152
GUIDialog_GLObjChooser::myList
FXList * myList
The list that holds the ids.
Definition: GUIDialog_GLObjChooser.h:130
MID_CHOOSEN_INVERT
@ MID_CHOOSEN_INVERT
Deselect selected items.
Definition: GUIAppEnum.h:524
GUISUMOAbstractView::stopTrack
virtual void stopTrack()
stop track
Definition: GUISUMOAbstractView.cpp:1430
GUIGlObjectStorage
A storage for of displayed objects via their numerical id.
Definition: GUIGlObjectStorage.h:51
MID_CHOOSEN_NAME
@ MID_CHOOSEN_NAME
Deselect selected items.
Definition: GUIAppEnum.h:526
GUIDesignChooserLayoutLeft
#define GUIDesignChooserLayoutLeft
design for Chooser Layout left
Definition: GUIDesigns.h:495
MID_CHOOSER_TRACK
@ MID_CHOOSER_TRACK
Track object.
Definition: GUIAppEnum.h:494
GUIDialog_GLObjChooser::~GUIDialog_GLObjChooser
virtual ~GUIDialog_GLObjChooser()
Destructor.
Definition: GUIDialog_GLObjChooser.cpp:97
GUIDialog_GLObjChooser::onCmdClose
long onCmdClose(FXObject *, FXSelector, void *)
Callback: The dialog shall be closed.
Definition: GUIDialog_GLObjChooser.cpp:137
GUIGlobalSelection.h
GUIDialog_GLObjChooser::onCmdToggleSelection
long onCmdToggleSelection(FXObject *, FXSelector, void *)
Callback: Toggle selection status of current object.
Definition: GUIDialog_GLObjChooser.cpp:263
MID_CHOOSER_FILTER_SUBSTR
@ MID_CHOOSER_FILTER_SUBSTR
Filter list by substring.
Definition: GUIAppEnum.h:502
GUIDialog_GLObjChooser::onListKeyPress
long onListKeyPress(FXObject *, FXSelector, void *)
Callback: Selects to current item if enter is pressed.
Definition: GUIDialog_GLObjChooser.cpp:189
ICON_NO
@ ICON_NO
Definition: GUIIcons.h:120
GLO_VEHICLE
@ GLO_VEHICLE
Definition: GUIGlObjectTypes.h:141
GUIDesigns.h
MID_CANCEL
@ MID_CANCEL
Cancel-button pressed.
Definition: GUIAppEnum.h:230
GUIGlObject::getOptionalName
virtual const std::string getOptionalName() const
Returns the name of the object (default "")
Definition: GUIGlObject.cpp:168
GUIIconSubSys::getIcon
static FXIcon * getIcon(GUIIcon which)
returns a icon previously defined in the enum GUIIcon
Definition: GUIIconSubSys.cpp:609
GUIDialog_GLObjChooser::onCmdFilterSubstr
long onCmdFilterSubstr(FXObject *, FXSelector, void *)
Callback: Hides unmatched items if pressed.
Definition: GUIDialog_GLObjChooser.cpp:219
GUIDialog_GLObjChooser::onCmdCenter
long onCmdCenter(FXObject *, FXSelector, void *)
Callback: The selected item shall be centered within the calling view.
Definition: GUIDialog_GLObjChooser.cpp:110
GUIDialog_GLObjChooser::onChgText
long onChgText(FXObject *, FXSelector, void *)
Callback: Something has been typed into the the field.
Definition: GUIDialog_GLObjChooser.cpp:144
FXDEFMAP
FXDEFMAP(GUIDialog_GLObjChooser) GUIDialog_GLObjChooserMap[]
GUIGlObjectStorage.h
GUIMainWindow.h
GUIDialog_GLObjChooser::getObjectName
virtual std::string getObjectName(GUIGlObject *o) const
@bbrief retrieve name for the given object
Definition: GUIDialog_GLObjChooser.cpp:235
GUIAppEnum.h
GUIDialog_GLObjChooser::onCmdFilter
long onCmdFilter(FXObject *, FXSelector, void *)
Callback: Hides unselected items if pressed.
Definition: GUIDialog_GLObjChooser.cpp:203
MID_CHOOSER_TEXT
@ MID_CHOOSER_TEXT
Text entry.
Definition: GUIAppEnum.h:496
GUIDesignHorizontalSeparator
#define GUIDesignHorizontalSeparator
Definition: GUIDesigns.h:321
GUIGlObject::getGlID
GUIGlID getGlID() const
Returns the numerical id of the object.
Definition: GUIGlObject.cpp:149
GUIMainWindow::removeChild
void removeChild(FXMainWindow *child)
Definition: GUIMainWindow.cpp:115
GUIGlChildWindow::getParent
GUIMainWindow * getParent()
Returns the main window.
Definition: GUIGlChildWindow.cpp:105
GUIDialog_GLObjChooser::onCmdLocateByName
long onCmdLocateByName(FXObject *, FXSelector, void *)
Callback: Toggle locator by name.
Definition: GUIDialog_GLObjChooser.cpp:281
GUIDialog_GLObjChooser::myParent
GUIGlChildWindow * myParent
The parent window.
Definition: GUIDialog_GLObjChooser.h:139
GUIDialog_GLObjChooser::myTextEntry
FXTextField * myTextEntry
The text field.
Definition: GUIDialog_GLObjChooser.h:145
GUIDesignChooserTextField
#define GUIDesignChooserTextField
design for Chooser TextField
Definition: GUIDesigns.h:480
GUIGlObject_AbstractAdd.h
GUIGlObjectStorage::getObjectBlocking
GUIGlObject * getObjectBlocking(GUIGlID id)
Returns the object from the container locking it.
Definition: GUIGlObjectStorage.cpp:62
GUIDesignChooserButtons
#define GUIDesignChooserButtons
design for Chooser buttons
Definition: GUIDesigns.h:477
GUIDialog_GLObjChooser::myTrackButton
FXButton * myTrackButton
The button that triggers tracking on the select vehicle.
Definition: GUIDialog_GLObjChooser.h:136
GUIGlObject
Definition: GUIGlObject.h:65
GUIDialog_GLObjChooser::toggleSelection
virtual void toggleSelection(int listIndex)
toggle selection (handled differently in NETEDIT)
Definition: GUIDialog_GLObjChooser.cpp:306
GUISUMOAbstractView::startTrack
virtual void startTrack(int)
star track
Definition: GUISUMOAbstractView.cpp:1425
GUIDesignChooserListSingle
#define GUIDesignChooserListSingle
design for Chooser List
Definition: GUIDesigns.h:483
GUIIconSubSys.h
GUIGlObjectStorage::unblockObject
void unblockObject(GUIGlID id)
Marks an object as unblocked.
Definition: GUIGlObjectStorage.cpp:119
GUIDialog_GLObjChooser::myCenterButton
FXButton * myCenterButton
The button that triggers centering on the select object.
Definition: GUIDialog_GLObjChooser.h:133
GUIDialog_GLObjChooser::onCmdText
long onCmdText(FXObject *, FXSelector, void *)
Callback: Selects to current item if enter is pressed.
Definition: GUIDialog_GLObjChooser.cpp:178
GUIGlChildWindow::isSelected
virtual bool isSelected(GUIGlObject *o) const
true if the object is selected (may include extra logic besides calling gSelected)
Definition: GUIGlChildWindow.cpp:254
GUIGlChildWindow::setView
void setView(GUIGlID id)
Centers the view onto the given artifact.
Definition: GUIGlChildWindow.cpp:246
GUIGlID
unsigned int GUIGlID
Definition: GUIGlObject.h:42
GUIGlChildWindow.h
GUIDialog_GLObjChooser::onCmdTrack
long onCmdTrack(FXObject *, FXSelector, void *)
Callback: The selected vehicle shall be tracked within the calling view.
Definition: GUIDialog_GLObjChooser.cpp:121
GUIGlObjectStorage::gIDStorage
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
Definition: GUIGlObjectStorage.h:140
ICON_RECENTERVIEW
@ ICON_RECENTERVIEW
Definition: GUIIcons.h:68
GUIDialog_GLObjChooser::myIDs
std::set< GUIGlID > myIDs
myList contains (void) pointers to elements of myIDs instead of the more
Definition: GUIDialog_GLObjChooser.h:149
ICON_FLAG
@ ICON_FLAG
Definition: GUIIcons.h:125
gSelected
GUISelectedStorage gSelected
A global holder of selected objects.
Definition: GUIGlobalSelection.cpp:33
GUIDesignChooserLayoutList
#define GUIDesignChooserLayoutList
design for Chooser Layout list
Definition: GUIDesigns.h:501
GUIDesignAuxiliarFrame
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frames used to pack another frames extended in all directions
Definition: GUIDesigns.h:270
GUIDialog_GLObjChooser.h
config.h
GUIDesignChooserDialog
#define GUIDesignChooserDialog
Definition: GUIDesigns.h:474
GUIDialog_GLObjChooser::show
void show()
sets the focus after the window is created to work-around bug in libfox
Definition: GUIDialog_GLObjChooser.cpp:103
MID_CHOOSER_LIST
@ MID_CHOOSER_LIST
Object list.
Definition: GUIAppEnum.h:498
GUIDialog_GLObjChooser::refreshList
void refreshList(const std::vector< GUIGlID > &ids)
update the list with the given ids
Definition: GUIDialog_GLObjChooser.cpp:244
GUIGlChildWindow
Definition: GUIGlChildWindow.h:40
GUISelectedStorage::toggleSelection
void toggleSelection(GUIGlID id)
Toggles selection of an object.
Definition: GUISelectedStorage.cpp:147
GUIGlObject::getMicrosimID
virtual const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
Definition: GUIGlObject.cpp:163
GUIDesignChooserLayoutRight
#define GUIDesignChooserLayoutRight
design for Chooser Layout right
Definition: GUIDesigns.h:498
GUIGlChildWindow::getView
GUISUMOAbstractView * getView() const
return GUISUMOAbstractView
Definition: GUIGlChildWindow.cpp:99
MID_CHOOSER_FILTER
@ MID_CHOOSER_FILTER
Filter selected.
Definition: GUIAppEnum.h:500
GUIDialog_GLObjChooser
Definition: GUIDialog_GLObjChooser.h:51
MID_CHOOSER_CENTER
@ MID_CHOOSER_CENTER
Center object.
Definition: GUIAppEnum.h:492