66FXIMPLEMENT(
GUIDialog_ChooserAbstract, FXMainWindow, GUIDialog_ChooserAbstractMap, ARRAYNUMBER(GUIDialog_ChooserAbstractMap))
74#pragma warning(disable: 4355)
77 FXIcon* icon,
const FXString& title,
const std::vector<GUIGlID>& ids,
GUIGlObjectStorage& ) :
80 myWindowsParent(windowsParent),
81 myMessageId(messageId),
83 myCenterButton(nullptr),
84 myTrackButton(nullptr),
85 mySelectAllButton(nullptr),
86 myDeselectAllButton(nullptr),
89 myNumSelectedItems(0),
90 myHideUnselected(nullptr),
91 myLocateByName(nullptr),
92 myFilterSubstring(nullptr),
93 myCountLabel(nullptr),
94 myCaseSensitive(nullptr),
95 myInstantCenter(nullptr) {
107 if (title.text() != std::string(
TL(
"Vehicle Chooser"))) {
129 myCaseSensitive->setCheck(getApp()->reg().readIntEntry(
"LOCATOR",
"caseSensitive", 0) == 1);
131 myInstantCenter->setCheck(getApp()->reg().readIntEntry(
"LOCATOR",
"autoCenter", 0) == 1);
132 myCountLabel =
new FXLabel(layoutRight,
"placeholder",
nullptr, LAYOUT_BOTTOM | LAYOUT_FILL_X | JUSTIFY_LEFT);
149 getApp()->reg().writeIntEntry(
"LOCATOR",
"autoCenter",
myInstantCenter->getCheck());
150 getApp()->reg().writeIntEntry(
"LOCATOR",
"caseSensitive",
myCaseSensitive->getCheck());
162 FXMainWindow::show();
169 int selected =
myList->getCurrentItem();
180 int selected =
myList->getCurrentItem();
205 int current =
myList->getCurrentItem();
206 if (current >= 0 && current < myList->getNumItems()) {
207 myList->selectItem(current);
224 int current =
myList->getCurrentItem();
225 if (current >= 0 && current < myList->getNumItems()) {
226 myList->selectItem(current);
241 const int numItems =
myList->getNumItems();
243 if (!caseSensitive) {
246 for (
int i = 0; i < numItems; i++) {
247 FXString t2 =
myList->getItemText(i);
248 if (!caseSensitive) {
251 if (t2.find(t) >= 0) {
257 const int caseOpt = caseSensitive ? 0 : SEARCH_IGNORECASE;
261 if (
myList->getNumItems() > 0) {
269 myList->makeItemVisible(
id);
271 myList->setCurrentItem(
id,
true);
282 int current =
myList->getCurrentItem();
283 if (current >= 0 && current < myList->getNumItems() &&
myList->isItemSelected(current) &&
myList->getItemData(current) !=
nullptr) {
293 FXEvent*
event = (FXEvent*)ptr;
294 if (event->code == KEY_Return) {
296 if ((event->state & CONTROLMASK) != 0) {
300 }
else if (event->code == KEY_Left || (event->code == KEY_Up &&
myList->getCurrentItem() == 0)) {
303 }
else if (event->code == KEY_Escape) {
307 return FXMainWindow::onKeyPress(o, sel, ptr);
367 const int numItems =
myList ?
myList->getNumItems() : 0;
369 sender->handle(
this, enable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
377 sender->handle(
this, enable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
402 for (
auto id : ids) {
417 if (!caseSensitive) {
418 searchPattern = searchPattern.lower();
420 const bool haveSearchPattern = filterSubstring && (searchPattern.length() > 0);
422 std::vector<std::pair<std::string, GUIGlID>> filteredItems;
423 filteredItems.reserve(
myAllIDs.size());
431 if (hideUnselected && !selected) {
436 if (byName && name.empty()) {
440 if (haveSearchPattern) {
441 FXString itemText(name.c_str());
442 if (!caseSensitive) {
443 itemText = itemText.lower();
445 if (itemText.find(searchPattern) < 0) {
450 filteredItems.push_back(std::make_pair(name, glID));
455 std::sort(filteredItems.begin(), filteredItems.end());
459 std::vector<GUIGlID> displayedGlIDs;
460 displayedGlIDs.reserve(filteredItems.size());
462 for (
const auto& item : filteredItems) {
463 const std::string& name = item.first;
464 const GUIGlID glID = item.second;
472 myList->appendItem(name.c_str(), ico, (
void*)&(*
myIDs.find(glID)));
473 displayedGlIDs.push_back(glID);
484 if (filterSubstring) {
485 if (
myList->getNumItems() > 0) {
486 myList->makeItemVisible(0);
488 myList->setCurrentItem(0,
true);
503 }
else if (
myList->getNumItems() > 0) {
504 myList->makeItemVisible(0);
506 myList->setCurrentItem(0,
true);
522 const int numItems =
myList ?
myList->getNumItems() : 0;
525 for (
int i = 0; i < numItems; i++) {
526 if (
myList->getItemIcon(i) !=
nullptr) {
532 const bool enableSelectAll = (numItems > 0 && numSelected < numItems);
533 const bool enableDeselectAll = (numSelected > 0);
535 if (enableSelectAll) {
542 if (enableDeselectAll) {
554 int i =
myList->getCurrentItem();
555 if (i >= 0 && i < myList->getNumItems()) {
557 if (
myList->getItemIcon(i) == flag) {
558 myList->setItemIcon(i,
nullptr);
564 myList->setItemIcon(i, flag);
577 const int numItems =
myList->getNumItems();
578 for (
int i = 0; i < numItems; i++) {
580 myList->setItemIcon(i, flag);
591 const int numItems =
myList->getNumItems();
592 for (
int i = 0; i < numItems; i++) {
594 myList->setItemIcon(i,
nullptr);
@ MID_CHOOSER_TRACK
Track object.
@ MID_CANCEL
Cancel-button pressed.
@ MID_CHOOSER_TEXT
Text entry.
@ MID_UPDATE
Update-button pressed.
@ MID_CHOOSEN_INVERT
Deselect selected items.
@ MID_CHOOSEN_SELECT
select all items
@ MID_CHOOSER_LIST
Object list.
@ MID_CHOOSEN_NAME
Deselect selected items.
@ MID_CHOOSER_AUTOCENTER
Auto center.
@ MID_CHOOSER_FILTER_SUBSTR
Filter list by substring.
@ MID_CHOOSEN_CLEAR
Clear set.
@ MID_CHOOSER_FILTER
Filter selected.
@ MID_CHOOSER_CASESENSITIVE
Case sensitive search.
@ MID_CHOOSER_CENTER
Center object.
#define GUIDesignChooserTextField
design for Chooser TextField
#define GUIDesignChooserListSingle
design for Chooser List
#define GUIDesignChooserButtons
design for Chooser buttons
#define GUIDesignChooserLayoutLeft
design for Chooser Layout left
#define GUIDesignChooserLayoutRight
design for Chooser Layout right
#define GUIDesignHorizontalSeparator
#define GUIDesignChooserLayoutList
design for Chooser Layout list
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
#define GUIDesignChooserDialog
FXDEFMAP(GUIDialog_ChooserAbstract) GUIDialog_ChooserAbstractMap[]
GUISelectedStorage gSelected
A global holder of selected objects.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
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.