Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUIDialog_ChooserAbstract.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2026 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/****************************************************************************/
20// Class for the window that allows to choose a street, junction or vehicle
21/****************************************************************************/
22#include <config.h>
23
24#include <string>
25#include <vector>
26#include <fxkeys.h>
37
39
40
41// ===========================================================================
42// FOX callback mapping
43// ===========================================================================
44FXDEFMAP(GUIDialog_ChooserAbstract) GUIDialog_ChooserAbstractMap[] = {
50 FXMAPFUNC(SEL_KEYPRESS, 0, GUIDialog_ChooserAbstract::onKeyPress),
64};
65
66FXIMPLEMENT(GUIDialog_ChooserAbstract, FXMainWindow, GUIDialog_ChooserAbstractMap, ARRAYNUMBER(GUIDialog_ChooserAbstractMap))
67
68
69// ===========================================================================
70// method definitions
71// ===========================================================================
72#ifdef _MSC_VER
73#pragma warning(push)
74#pragma warning(disable: 4355) // mask warning about "this" in initializers
75#endif
77 FXIcon* icon, const FXString& title, const std::vector<GUIGlID>& ids, GUIGlObjectStorage& /*glStorage*/) :
78 FXMainWindow(windowsParent->getApp(), title, icon, nullptr, GUIDesignChooserDialog),
79 GUIPersistentWindowPos(this, "LOCATOR", true, 20, 40, 300, 350),
80 myWindowsParent(windowsParent),
81 myMessageId(messageId),
82 myList(nullptr),
83 myCenterButton(nullptr),
84 myTrackButton(nullptr),
85 mySelectAllButton(nullptr),
86 myDeselectAllButton(nullptr),
87 mySelected(nullptr),
88 myTextEntry(nullptr),
89 myNumSelectedItems(0),
90 myHideUnselected(nullptr),
91 myLocateByName(nullptr),
92 myFilterSubstring(nullptr),
93 myCountLabel(nullptr),
94 myCaseSensitive(nullptr),
95 myInstantCenter(nullptr) {
96 FXHorizontalFrame* hbox = new FXHorizontalFrame(this, GUIDesignAuxiliarFrame);
97 // build the list
98 FXVerticalFrame* layoutLeft = new FXVerticalFrame(hbox, GUIDesignChooserLayoutLeft);
99 myTextEntry = new FXTextField(layoutLeft, 0, this, MID_CHOOSER_TEXT, TEXTFIELD_ENTER_ONLY | GUIDesignChooserTextField);
100 FXVerticalFrame* layoutList = new FXVerticalFrame(layoutLeft, GUIDesignChooserLayoutList);
101 myList = new FXList(layoutList, this, MID_CHOOSER_LIST, GUIDesignChooserListSingle);
102 // build the buttons
103 FXVerticalFrame* layoutRight = new FXVerticalFrame(hbox, GUIDesignChooserLayoutRight);
106 // only enable Track Button if we're locating vehicles
107 if (title.text() != std::string(TL("Vehicle Chooser"))) {
108 myTrackButton->disable();
109 myTrackButton->hide();
110 }
111 new FXHorizontalSeparator(layoutRight, GUIDesignHorizontalSeparator);
112 GUIDesigns::buildFXButton(layoutRight, TL("&Select/deselect"), "", TL("Select/deselect current object"), GUIIconSubSys::getIcon(GUIIcon::FLAG), this, MID_CHOOSEN_INVERT, GUIDesignChooserButtons);
113 mySelectAllButton = GUIDesigns::buildFXButton(layoutRight, TL("Select &all"), "", TL("Select all items in list"), GUIIconSubSys::getIcon(GUIIcon::FLAG), this, MID_CHOOSEN_SELECT, GUIDesignChooserButtons);
114 myDeselectAllButton = GUIDesigns::buildFXButton(layoutRight, TL("&Deselect all"), "", TL("Deselect all items in list"), GUIIconSubSys::getIcon(GUIIcon::FLAG), this, MID_CHOOSEN_CLEAR, GUIDesignChooserButtons);
115 GUIDesigns::buildFXButton(layoutRight, TL("&Update"), "", TL("Reload all ids"), GUIIconSubSys::getIcon(GUIIcon::RELOAD), this, MID_UPDATE, GUIDesignChooserButtons);
116 new FXHorizontalSeparator(layoutRight, GUIDesignHorizontalSeparator);
118 new FXHorizontalSeparator(layoutRight, GUIDesignHorizontalSeparator);
119 myHideUnselected = new FXCheckButton(layoutRight, TL("&Hide Unselected"), this, MID_CHOOSER_FILTER);
120 myHideUnselected->setTipText(TL("Hide unselected items"));
121 myHideUnselected->setHelpText(TL("Hide unselected items"));
122 myLocateByName = new FXCheckButton(layoutRight, TL("By &Name"), this, MID_CHOOSEN_NAME);
123 myLocateByName->setTipText(TL("Locate item by name"));
124 myLocateByName->setHelpText(TL("Locate item by name"));
125 myFilterSubstring = new FXCheckButton(layoutRight, TL("&Filter substring"), this, MID_CHOOSER_FILTER_SUBSTR);
126 myFilterSubstring->setTipText(TL("Filter list by substring"));
127 myFilterSubstring->setHelpText(TL("Filter list by substring"));
128 myCaseSensitive = new FXCheckButton(layoutRight, TL("case-sensitive search"), this, MID_CHOOSER_CASESENSITIVE);
129 myCaseSensitive->setCheck(getApp()->reg().readIntEntry("LOCATOR", "caseSensitive", 0) == 1);
130 myInstantCenter = new FXCheckButton(layoutRight, TL("auto-center"), this, MID_CHOOSER_AUTOCENTER);
131 myInstantCenter->setCheck(getApp()->reg().readIntEntry("LOCATOR", "autoCenter", 0) == 1);
132 myCountLabel = new FXLabel(layoutRight, "placeholder", nullptr, LAYOUT_BOTTOM | LAYOUT_FILL_X | JUSTIFY_LEFT);
133 refreshList(ids);
134 // add child in windowsParent
137 // create and show dialog
138 create();
139 show();
140}
141#ifdef _MSC_VER
142#pragma warning(pop)
143#endif
144
145
147 // remove child from windowsParent
149 getApp()->reg().writeIntEntry("LOCATOR", "autoCenter", myInstantCenter->getCheck());
150 getApp()->reg().writeIntEntry("LOCATOR", "caseSensitive", myCaseSensitive->getCheck());
151}
152
153
156 return static_cast<GUIGlObject*>(mySelected);
157}
158
159
160void
162 FXMainWindow::show();
163 myTextEntry->setFocus();
164}
165
166
167long
168GUIDialog_ChooserAbstract::onCmdCenter(FXObject*, FXSelector, void*) {
169 int selected = myList->getCurrentItem();
170 if (selected >= 0) {
172 myWindowsParent->setView(*static_cast<GUIGlID*>(myList->getItemData(selected)));
173 }
174 return 1;
175}
176
177
178long
179GUIDialog_ChooserAbstract::onCmdTrack(FXObject*, FXSelector, void*) {
180 int selected = myList->getCurrentItem();
181 if (selected >= 0) {
182 myWindowsParent->setView(*static_cast<GUIGlID*>(myList->getItemData(selected)));
183 GUIGlID id = *static_cast<GUIGlID*>(myList->getItemData(selected));
185 if (o != nullptr && o->getType() == GLO_VEHICLE) {
187 }
189 }
190 return 1;
191}
192
193
194long
195GUIDialog_ChooserAbstract::onCmdClose(FXObject*, FXSelector, void*) {
196 close(true);
197 return 1;
198}
199
200long
201GUIDialog_ChooserAbstract::onChgList(FXObject*, FXSelector, void*) {
202 // mouse-click toggles item selection but changing current item with
203 // keyboard does not affect select
204 // Enabling the line below toggles the behavior (which must be fixed via onChgListSel)
205 int current = myList->getCurrentItem();
206 if (current >= 0 && current < myList->getNumItems()) {
207 myList->selectItem(current);
208 myCenterButton->enable();
209 if (myTrackButton->shown()) {
210 myTrackButton->enable();
211 }
212 if (myInstantCenter != nullptr && myInstantCenter->getCheck() == TRUE) {
213 onCmdCenter(nullptr, 0, nullptr);
214 }
215 } else {
216 myCenterButton->disable();
217 myTrackButton->disable();
218 }
219 return 1;
220}
221
222long
223GUIDialog_ChooserAbstract::onChgListSel(FXObject*, FXSelector, void*) {
224 int current = myList->getCurrentItem();
225 if (current >= 0 && current < myList->getNumItems()) {
226 myList->selectItem(current);
227 }
228 return 1;
229}
230
231long
232GUIDialog_ChooserAbstract::onChgText(FXObject*, FXSelector, void*) {
233 if (myFilterSubstring != nullptr && myFilterSubstring->getCheck() == TRUE) {
234 applyFilters();
235 return 1;
236 }
237 const bool caseSensitive = (myCaseSensitive != nullptr && myCaseSensitive->getCheck() == TRUE);
238 int id = -1;
239 if (locateByName()) {
240 // findItem does not support substring search
241 const int numItems = myList->getNumItems();
242 FXString t = myTextEntry->getText();
243 if (!caseSensitive) {
244 t = t.lower();
245 }
246 for (int i = 0; i < numItems; i++) {
247 FXString t2 = myList->getItemText(i);
248 if (!caseSensitive) {
249 t2 = t2.lower();
250 }
251 if (t2.find(t) >= 0) {
252 id = i;
253 break;
254 }
255 }
256 } else {
257 const int caseOpt = caseSensitive ? 0 : SEARCH_IGNORECASE;
258 id = myList->findItem(myTextEntry->getText(), -1, SEARCH_PREFIX | caseOpt);
259 }
260 if (id < 0) {
261 if (myList->getNumItems() > 0) {
262 myList->deselectItem(myList->getCurrentItem());
263 }
264 myCenterButton->disable();
265 myTrackButton->disable();
266 return 1;
267 }
268 myList->deselectItem(myList->getCurrentItem());
269 myList->makeItemVisible(id);
270 myList->selectItem(id);
271 myList->setCurrentItem(id, true);
272 myCenterButton->enable();
273 if (myTrackButton->shown()) {
274 myTrackButton->enable();
275 }
276 return 1;
277}
278
279
280long
281GUIDialog_ChooserAbstract::onCmdText(FXObject*, FXSelector, void*) {
282 int current = myList->getCurrentItem();
283 if (current >= 0 && current < myList->getNumItems() && myList->isItemSelected(current) && myList->getItemData(current) != nullptr) {
284 myWindowsParent->setView(*static_cast<GUIGlID*>(myList->getItemData(current)));
285 }
286 return 1;
287}
288
289
290
291long
292GUIDialog_ChooserAbstract::onKeyPress(FXObject* o, FXSelector sel, void* ptr) {
293 FXEvent* event = (FXEvent*)ptr;
294 if (event->code == KEY_Return) {
295 onCmdText(nullptr, 0, nullptr);
296 if ((event->state & CONTROLMASK) != 0) {
297 close(true);
298 }
299 return 1;
300 } else if (event->code == KEY_Left || (event->code == KEY_Up && myList->getCurrentItem() == 0)) {
301 myTextEntry->setFocus();
302 return 1;
303 } else if (event->code == KEY_Escape) {
304 close(true);
305 return 1;
306 }
307 return FXMainWindow::onKeyPress(o, sel, ptr);
308}
309
310
311long
312GUIDialog_ChooserAbstract::onCmdFilter(FXObject*, FXSelector, void*) {
313 applyFilters();
314 return 1;
315}
316
317
318long
319GUIDialog_ChooserAbstract::onCmdFilterSubstr(FXObject*, FXSelector, void*) {
320 applyFilters();
321 return 1;
322}
323
324
325long
326GUIDialog_ChooserAbstract::onCmdLocateByName(FXObject*, FXSelector, void*) {
327 applyFilters();
328 myTextEntry->setFocus();
329 return 1;
330}
331
332
333long
334GUIDialog_ChooserAbstract::onCmdUpdate(FXObject*, FXSelector, void*) {
335 const std::vector<GUIGlID> ids = myWindowsParent->getObjectIDs(myMessageId);
336 if (!ids.empty()) {
337 refreshList(ids);
338 } else {
339 applyFilters();
340 }
341 return 1;
342}
343
344
345long
347 if (myFilterSubstring != nullptr && myFilterSubstring->getCheck() == TRUE) {
348 applyFilters();
349 } else {
350 onChgText(nullptr, 0, nullptr);
351 }
352 return 1;
353}
354
355
356long
357GUIDialog_ChooserAbstract::onCmdAutoCenter(FXObject*, FXSelector, void*) {
358 if (myInstantCenter != nullptr && myInstantCenter->getCheck() == TRUE) {
359 onCmdCenter(nullptr, 0, nullptr);
360 }
361 return 1;
362}
363
364
365long
366GUIDialog_ChooserAbstract::onUpdAddListSelection(FXObject* sender, FXSelector, void* ptr) {
367 const int numItems = myList ? myList->getNumItems() : 0;
368 const bool enable = (numItems > 0 && myNumSelectedItems < numItems);
369 sender->handle(this, enable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
370 return 1;
371}
372
373
374long
375GUIDialog_ChooserAbstract::onUpdClearListSelection(FXObject* sender, FXSelector, void* ptr) {
376 const bool enable = (myNumSelectedItems > 0);
377 sender->handle(this, enable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
378 return 1;
379}
380
381
382bool
384 return myLocateByName != nullptr && myLocateByName->getCheck() == TRUE;
385}
386
387
388std::string
390 if (locateByName()) {
391 return o->getOptionalName();
392 } else {
393 return o->getMicrosimID();
394 }
395}
396
397
398void
399GUIDialog_ChooserAbstract::refreshList(const std::vector<GUIGlID>& ids) {
400 myAllIDs = ids;
401 myIDs.clear();
402 for (auto id : ids) {
403 myIDs.insert(id);
404 }
405 applyFilters();
406}
407
408
409void
411 const bool hideUnselected = (myHideUnselected != nullptr && myHideUnselected->getCheck() == TRUE);
412 const bool byName = locateByName();
413 const bool filterSubstring = (myFilterSubstring != nullptr && myFilterSubstring->getCheck() == TRUE);
414 const bool caseSensitive = (myCaseSensitive != nullptr && myCaseSensitive->getCheck() == TRUE);
415
416 FXString searchPattern = myTextEntry ? myTextEntry->getText() : "";
417 if (!caseSensitive) {
418 searchPattern = searchPattern.lower();
419 }
420 const bool haveSearchPattern = filterSubstring && (searchPattern.length() > 0);
421
422 std::vector<std::pair<std::string, GUIGlID>> filteredItems;
423 filteredItems.reserve(myAllIDs.size());
424
425 for (const auto glID : myAllIDs) {
427 if (o == nullptr) {
428 continue;
429 }
430 const bool selected = myWindowsParent->isSelected(o);
431 if (hideUnselected && !selected) {
433 continue;
434 }
435 const std::string name = getObjectName(o);
436 if (byName && name.empty()) {
438 continue;
439 }
440 if (haveSearchPattern) {
441 FXString itemText(name.c_str());
442 if (!caseSensitive) {
443 itemText = itemText.lower();
444 }
445 if (itemText.find(searchPattern) < 0) {
447 continue;
448 }
449 }
450 filteredItems.push_back(std::make_pair(name, glID));
452 }
453
454 if (byName) {
455 std::sort(filteredItems.begin(), filteredItems.end());
456 }
457
458 myList->clearItems();
459 std::vector<GUIGlID> displayedGlIDs;
460 displayedGlIDs.reserve(filteredItems.size());
461
462 for (const auto& item : filteredItems) {
463 const std::string& name = item.first;
464 const GUIGlID glID = item.second;
466 const bool selected = (o != nullptr) && myWindowsParent->isSelected(o);
467 if (o != nullptr) {
469 }
470 FXIcon* const ico = selected ? GUIIconSubSys::getIcon(GUIIcon::FLAG) : nullptr;
471 myIDs.insert(glID);
472 myList->appendItem(name.c_str(), ico, (void*)&(*myIDs.find(glID)));
473 displayedGlIDs.push_back(glID);
474 }
475 myList->update();
476 if (myCountLabel) {
477 myCountLabel->setText(TLF("% objects", toString(displayedGlIDs.size())).c_str());
478 }
479
480 // notify Netedit to update filtered ACs
481 filterACs(displayedGlIDs);
482
483 // Update item selection
484 if (filterSubstring) {
485 if (myList->getNumItems() > 0) {
486 myList->makeItemVisible(0);
487 myList->selectItem(0);
488 myList->setCurrentItem(0, true);
489 myCenterButton->enable();
490 if (myTrackButton->shown()) {
491 myTrackButton->enable();
492 }
493 if (myInstantCenter != nullptr && myInstantCenter->getCheck() == TRUE) {
494 onCmdCenter(nullptr, 0, nullptr);
495 }
496 } else {
497 myCenterButton->disable();
498 myTrackButton->disable();
499 }
500 } else {
501 if (myTextEntry && myTextEntry->getText().length() > 0) {
502 onChgText(nullptr, 0, nullptr);
503 } else if (myList->getNumItems() > 0) {
504 myList->makeItemVisible(0);
505 myList->selectItem(0);
506 myList->setCurrentItem(0, true);
507 myCenterButton->enable();
508 if (myTrackButton->shown()) {
509 myTrackButton->enable();
510 }
511 } else {
512 myCenterButton->disable();
513 myTrackButton->disable();
514 }
515 }
517}
518
519
520void
522 const int numItems = myList ? myList->getNumItems() : 0;
523 int numSelected = 0;
524 if (myList != nullptr) {
525 for (int i = 0; i < numItems; i++) {
526 if (myList->getItemIcon(i) != nullptr) {
527 numSelected++;
528 }
529 }
530 }
531 myNumSelectedItems = numSelected;
532 const bool enableSelectAll = (numItems > 0 && numSelected < numItems);
533 const bool enableDeselectAll = (numSelected > 0);
534 if (mySelectAllButton != nullptr) {
535 if (enableSelectAll) {
536 mySelectAllButton->enable();
537 } else {
538 mySelectAllButton->disable();
539 }
540 }
541 if (myDeselectAllButton != nullptr) {
542 if (enableDeselectAll) {
543 myDeselectAllButton->enable();
544 } else {
545 myDeselectAllButton->disable();
546 }
547 }
548}
549
550
551long
554 int i = myList->getCurrentItem();
555 if (i >= 0 && i < myList->getNumItems()) {
557 if (myList->getItemIcon(i) == flag) {
558 myList->setItemIcon(i, nullptr);
559 if (myHideUnselected != nullptr && myHideUnselected->getCheck() == TRUE) {
560 applyFilters();
561 return 1;
562 }
563 } else {
564 myList->setItemIcon(i, flag);
565 }
566 }
567 myList->update();
568 myWindowsParent->getView()->update();
570 return 1;
571}
572
573
574long
577 const int numItems = myList->getNumItems();
578 for (int i = 0; i < numItems; i++) {
579 select(i);
580 myList->setItemIcon(i, flag);
581 }
582 myList->update();
583 myWindowsParent->getView()->update();
585 return 1;
586}
587
588
589long
591 const int numItems = myList->getNumItems();
592 for (int i = 0; i < numItems; i++) {
593 deselect(i);
594 myList->setItemIcon(i, nullptr);
595 }
596 if (myHideUnselected != nullptr && myHideUnselected->getCheck() == TRUE) {
597 applyFilters();
598 } else {
599 myList->update();
600 myWindowsParent->getView()->update();
602 }
603 return 1;
604}
605
606
607void
609 GUIGlID* glID = static_cast<GUIGlID*>(myList->getItemData(listIndex));
611}
612
613void
615 GUIGlID* glID = static_cast<GUIGlID*>(myList->getItemData(listIndex));
616 gSelected.select(*glID);
617}
618
619void
621 GUIGlID* glID = static_cast<GUIGlID*>(myList->getItemData(listIndex));
622 gSelected.deselect(*glID);
623}
624
625
626void
627GUIDialog_ChooserAbstract::filterACs(const std::vector<GUIGlID>& /*GLIDs*/) {
628 // overrided in GNEACChooserDialog
629}
630
631/****************************************************************************/
@ MID_CHOOSER_TRACK
Track object.
Definition GUIAppEnum.h:591
@ MID_CANCEL
Cancel-button pressed.
Definition GUIAppEnum.h:310
@ MID_CHOOSER_TEXT
Text entry.
Definition GUIAppEnum.h:593
@ MID_UPDATE
Update-button pressed.
Definition GUIAppEnum.h:312
@ MID_CHOOSEN_INVERT
Deselect selected items.
Definition GUIAppEnum.h:629
@ MID_CHOOSEN_SELECT
select all items
Definition GUIAppEnum.h:625
@ MID_CHOOSER_LIST
Object list.
Definition GUIAppEnum.h:595
@ MID_CHOOSEN_NAME
Deselect selected items.
Definition GUIAppEnum.h:631
@ MID_CHOOSER_AUTOCENTER
Auto center.
Definition GUIAppEnum.h:603
@ MID_CHOOSER_FILTER_SUBSTR
Filter list by substring.
Definition GUIAppEnum.h:599
@ MID_CHOOSEN_CLEAR
Clear set.
Definition GUIAppEnum.h:619
@ MID_CHOOSER_FILTER
Filter selected.
Definition GUIAppEnum.h:597
@ MID_CHOOSER_CASESENSITIVE
Case sensitive search.
Definition GUIAppEnum.h:601
@ MID_CHOOSER_CENTER
Center object.
Definition GUIAppEnum.h:589
#define GUIDesignChooserTextField
design for Chooser TextField
Definition GUIDesigns.h:667
#define GUIDesignChooserListSingle
design for Chooser List
Definition GUIDesigns.h:670
#define GUIDesignChooserButtons
design for Chooser buttons
Definition GUIDesigns.h:664
#define GUIDesignChooserLayoutLeft
design for Chooser Layout left
Definition GUIDesigns.h:679
#define GUIDesignChooserLayoutRight
design for Chooser Layout right
Definition GUIDesigns.h:682
#define GUIDesignHorizontalSeparator
Definition GUIDesigns.h:494
#define GUIDesignChooserLayoutList
design for Chooser Layout list
Definition GUIDesigns.h:685
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
Definition GUIDesigns.h:409
#define GUIDesignChooserDialog
Definition GUIDesigns.h:661
FXDEFMAP(GUIDialog_ChooserAbstract) GUIDialog_ChooserAbstractMap[]
unsigned int GUIGlID
Definition GUIGlObject.h:44
@ GLO_VEHICLE
a vehicle
GUISelectedStorage gSelected
A global holder of selected objects.
@ RECENTERVIEW
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
bool locateByName() const
whether locate by name is active
FXButton * myCenterButton
The button that triggers centering on the select object.
long onCmdText(FXObject *, FXSelector, void *)
Callback: Selects to current item if enter is pressed.
long onCmdClose(FXObject *, FXSelector, void *)
Callback: The dialog shall be closed.
FXButton * myDeselectAllButton
The button to deselect all items in list.
void refreshList(const std::vector< GUIGlID > &ids)
update the list with the given ids
long onCmdCenter(FXObject *, FXSelector, void *)
Callback: The selected item shall be centered within the calling view.
int myNumSelectedItems
number of selected items currently displayed in myList
FXCheckButton * myCaseSensitive
Whether search is case sensitive.
int myMessageId
the object type being chosen
FXCheckButton * myHideUnselected
whether to hide unselected items
long onUpdAddListSelection(FXObject *, FXSelector, void *)
Callback: Update "Select all" button.
virtual ~GUIDialog_ChooserAbstract()
Destructor.
long onCmdFilter(FXObject *, FXSelector, void *)
Callback: Hides/shows unselected items.
long onCmdFilterSubstr(FXObject *, FXSelector, void *)
Callback: Filters list by substring.
long onKeyPress(FXObject *o, FXSelector sel, void *data)
keyboard functions
virtual void deselect(int listIndex)
unset selection (handled differently in netedit)
virtual void select(int listIndex)
set selection (handled differently in netedit)
void show()
sets the focus after the window is created to work-around bug in libfox
long onCmdTrack(FXObject *, FXSelector, void *)
Callback: The selected vehicle shall be tracked within the calling view.
long onCmdLocateByName(FXObject *, FXSelector, void *)
Callback: Toggle locator by name.
FXLabel * myCountLabel
label for declaring list size
long onChgText(FXObject *, FXSelector, void *)
Callback: Something has been typed into the field.
long onCmdAutoCenter(FXObject *, FXSelector, void *)
Callback: Toggle auto center.
GUIGlChildWindow * myWindowsParent
window parent
long onCmdUpdate(FXObject *, FXSelector, void *)
Callback: Update list.
FXCheckButton * myLocateByName
whether to locate by object name instead of id
std::set< GUIGlID > myIDs
myList contains (void) pointers to elements of myIDs instead of the more volatile pointers to GUIGlOb...
long onChgListSel(FXObject *, FXSelector, void *)
Callback: Current list item selection has changed.
GUIGlObject * mySelected
The chosen id.
FXButton * mySelectAllButton
The button to select all items in list.
long onCmdClearListSelection(FXObject *, FXSelector, void *)
long onCmdAddListSelection(FXObject *, FXSelector, void *)
virtual void toggleSelection(int listIndex)
fox need this
long onCmdCaseSensitive(FXObject *, FXSelector, void *)
Callback: Toggle case sensitive search.
FXButton * myTrackButton
The button that triggers tracking on the select vehicle.
virtual std::string getObjectName(GUIGlObject *o) const
retrieve name for the given object
void applyFilters()
apply current filters and update list
GUIDialog_ChooserAbstract(GUIGlChildWindow *windowsParent, int messageId, FXIcon *icon, const FXString &title, const std::vector< GUIGlID > &ids, GUIGlObjectStorage &glStorage)
Constructor.
virtual void filterACs(const std::vector< GUIGlID > &GLIDs)
filter ACs (needed in netedit)
void updateSelectionButtons()
update "Select all" and "Deselect all" buttons status
FXTextField * myTextEntry
The text field.
long onUpdClearListSelection(FXObject *, FXSelector, void *)
Callback: Update "Deselect all" button.
long onCmdToggleSelection(FXObject *, FXSelector, void *)
Callback: Toggle selection status of current object / list.
FXCheckButton * myFilterSubstring
whether to filter by substring
FXCheckButton * myInstantCenter
Whether each change in the list should re-center the view.
long onChgList(FXObject *, FXSelector, void *)
Callback: Current list item has changed.
GUIGlObject * getObject() const
Returns the chosen (selected) object.
FXList * myList
The list that holds the ids.
std::vector< GUIGlID > myAllIDs
all object IDs available for choosing
void setView(GUIGlID id)
Centers the view onto the given artifact.
virtual bool isSelected(GUIGlObject *o) const
true if the object is selected (may include extra logic besides calling gSelected)
GUISUMOAbstractView * getView() const
return GUISUMOAbstractView
GUIMainWindow * getGUIMainWindowParent()
Returns the GUIMainWindow parent.
virtual std::vector< GUIGlID > getObjectIDs(int messageId) const
const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
virtual const std::string getOptionalName() const
Returns the name of the object (default "")
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
GUIGlID getGlID() const
Returns the numerical id of the object.
A storage for of displayed objects via their numerical id.
void unblockObject(GUIGlID id)
Marks an object as unblocked.
GUIGlObject * getObjectBlocking(GUIGlID id) const
Returns the object from the container locking it.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
void removeChild(FXMainWindow *child)
removes the given child window from the list (FXMainWindow)
void addChild(FXMainWindow *child)
Adds a further child window to the list (FXMainWindow)
Persists window position in the registry.
virtual void stopTrack()
stop track
virtual void startTrack(int)
star track
void toggleSelection(GUIGlID id)
Toggles selection of an object.
void select(GUIGlID id, bool update=true)
Adds the object with the given id.
void deselect(GUIGlID id)
Deselects the object with the given id.