Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUICursorDialog.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/****************************************************************************/
18// Dialog for edit element under cursor
19/****************************************************************************/
20#include <config.h>
21
27
28#include "GUICursorDialog.h"
29
30
31#define NUM_VISIBLE_ITEMS 10
32
33// ===========================================================================
34// FOX callback mapping
35// ===========================================================================
36
47
48// Object implementation
49FXIMPLEMENT(GUICursorDialog, GUIGLObjectPopupMenu, GUICursorDialogMap, ARRAYNUMBER(GUICursorDialogMap))
50
51// ===========================================================================
52// member method definitions
53// ===========================================================================
54
56 GUIGLObjectPopupMenu(view->getMainWindow(), view, type),
57 myType(type),
58 myView(view) {
59 // continue depending of properties
61 buildDialogElements(view, TL("Overlapped objects"), GUIIcon::MODEINSPECT, MID_CURSORDIALOG_PROPERTIES, objects);
63 buildDialogElements(view, TL("Delete element"), GUIIcon::MODEDELETE, MID_CURSORDIALOG_DELETEELEMENT, objects);
65 buildDialogElements(view, TL("Select element"), GUIIcon::MODESELECT, MID_CURSORDIALOG_SELECTELEMENT, objects);
67 buildDialogElements(view, TL("Mark front element"), GUIIcon::FRONTELEMENT, MID_CURSORDIALOG_SETFRONTELEMENT, objects);
68 }
69}
70
71
73 // delete all menu commands
74 for (const auto& GLObject : myMenuCommandGLObjects) {
75 delete GLObject.first;
76 }
77}
78
79
80long
81GUICursorDialog::onCmdSetFrontElement(FXObject* obj, FXSelector, void*) {
82 // search element in myGLObjects
83 for (const auto& GLObject : myMenuCommandGLObjects) {
84 if (GLObject.first == obj) {
85 GLObject.second->markAsFrontElement();
86 }
87 }
88 // destroy popup
90 return 1;
91}
92
93
94long
95GUICursorDialog::onCmdDeleteElement(FXObject* obj, FXSelector, void*) {
96 // search element in myGLObjects
97 for (const auto& GLObject : myMenuCommandGLObjects) {
98 if (GLObject.first == obj) {
99 GLObject.second->deleteGLObject();
100 }
101 }
102 // destroy popup
104 return 1;
105}
106
107
108long
109GUICursorDialog::onCmdSelectElement(FXObject* obj, FXSelector, void*) {
110 // search element in myGLObjects
111 for (const auto& GLObject : myMenuCommandGLObjects) {
112 if (GLObject.first == obj) {
113 GLObject.second->selectGLObject();
114 }
115 }
116 // destroy popup
118 return 1;
119}
120
121
122long
123GUICursorDialog::onCmdOpenPropertiesPopUp(FXObject* obj, FXSelector, void*) {
124 // search element in myGLObjects
125 for (const auto& GLObject : myMenuCommandGLObjects) {
126 if (GLObject.first == obj) {
127 myView->replacePopup(GLObject.second->getPopUpMenu(*myView->getMainWindow(), *myView));
128 return 1;
129 }
130 }
131 return 0;
132}
133
134
135long
136GUICursorDialog::onCmdMoveListUp(FXObject*, FXSelector, void*) {
138 updateList();
139 show();
140 return 0;
141}
142
143
144long
145GUICursorDialog::onCmdMoveListDown(FXObject*, FXSelector, void*) {
147 updateList();
148 show();
149 return 0;
150}
151
152
153long
154GUICursorDialog::onCmdProcessFront(FXObject*, FXSelector, void*) {
155 if (myMenuCommandGLObjects.size() > 0) {
156 // continue depending of properties
158 myMenuCommandGLObjects.front().second->deleteGLObject();
160 myMenuCommandGLObjects.front().second->selectGLObject();
162 myMenuCommandGLObjects.front().second->markAsFrontElement();
163 }
164 }
165 return 0;
166}
167
168
169long
170GUICursorDialog::onCmdUnpost(FXObject* obj, FXSelector, void* ptr) {
171 // ignore move up, down and header
172 if ((obj == myMoveUpMenuCommand) || (obj == myMoveDownMenuCommand) || (obj == myMenuHeader)) {
173 return 1;
174 }
175 if (grabowner) {
176 grabowner->handle(this, FXSEL(SEL_COMMAND, ID_UNPOST), ptr);
177 } else {
178 popdown();
179 if (grabbed()) {
180 ungrab();
181 }
182 }
183 return 1;
184}
185
186
187void
189 // first hide all menu commands
190 for (const auto& GLObject : myMenuCommandGLObjects) {
191 GLObject.first->hide();
192 }
193 // check if disable menu command up
194 if (myListIndex == 0) {
195 myMoveUpMenuCommand->disable();
196 } else {
197 myMoveUpMenuCommand->enable();
198 }
199 // show menu commands depending of myListIndex
201 for (int i = (int)myMenuCommandGLObjects.size() - NUM_VISIBLE_ITEMS; i < (int)myMenuCommandGLObjects.size(); i++) {
202 myMenuCommandGLObjects.at(i).first->show();
203 }
204 myMoveDownMenuCommand->disable();
205 } else {
206 for (int i = myListIndex; i < (myListIndex + NUM_VISIBLE_ITEMS); i++) {
207 myMenuCommandGLObjects.at(i).first->show();
208 }
209 myMoveDownMenuCommand->enable();
210 }
211 // recalc popup
212 recalc();
213}
214
215
216void
217GUICursorDialog::buildDialogElements(GUISUMOAbstractView* view, const FXString text, GUIIcon icon, FXSelector sel, const std::vector<GUIGlObject*>& objects) {
218 // create header
219 myMenuHeader = new MFXMenuHeader(this, view->getMainWindow()->getBoldFont(), text, GUIIconSubSys::getIcon(icon), nullptr, 0);
220 new FXMenuSeparator(this);
221 // check if create move up menu command
222 if (objects.size() > NUM_VISIBLE_ITEMS) {
224 new FXMenuSeparator(this);
225 }
226 // create a menu command for every object
227 for (const auto& glo : objects) {
228 const std::string selStatus = gSelected.isSelected(glo) ? " (selected)" : "";
229 myMenuCommandGLObjects.push_back(std::make_pair(GUIDesigns::buildFXMenuCommand(this, glo->getMicrosimID() + selStatus, glo->getGLIcon(), this, sel), glo));
230 }
231 // check if create move down menu command
232 if (objects.size() > NUM_VISIBLE_ITEMS) {
233 new FXMenuSeparator(this);
235 updateList();
236 }
237}
238
239/****************************************************************************/
@ MID_CURSORDIALOG_SETFRONTELEMENT
Definition GUIAppEnum.h:432
@ MID_CURSORDIALOG_MOVEDOWN
move list down
Definition GUIAppEnum.h:442
@ MID_CURSORDIALOG_PROPERTIES
open properties popup
Definition GUIAppEnum.h:438
@ MID_CURSORDIALOG_FRONT
remove/select/mark front element
Definition GUIAppEnum.h:444
@ MID_CURSORDIALOG_MOVEUP
move list up
Definition GUIAppEnum.h:440
@ MID_CURSORDIALOG_DELETEELEMENT
delete element
Definition GUIAppEnum.h:434
@ MID_CURSORDIALOG_SELECTELEMENT
select element
Definition GUIAppEnum.h:436
FXDEFMAP(GUICursorDialog) GUICursorDialogMap[]
#define NUM_VISIBLE_ITEMS
GUISelectedStorage gSelected
A global holder of selected objects.
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
@ FRONTELEMENT
#define TL(string)
Definition MsgHandler.h:304
Dialog for edit rerouter intervals.
void updateList()
update list
long onCmdMoveListDown(FXObject *, FXSelector, void *)
move list down
FXMenuCommand * myMoveUpMenuCommand
menu command for move up list
~GUICursorDialog()
destructor
long onCmdMoveListUp(FXObject *, FXSelector, void *)
move list up
long onCmdSelectElement(FXObject *, FXSelector, void *)
select element
long onCmdProcessFront(FXObject *, FXSelector, void *)
move list down
long onCmdUnpost(FXObject *, FXSelector, void *ptr)
unpost
std::vector< std::pair< FXMenuCommand *, GUIGlObject * > > myMenuCommandGLObjects
container for menu commands and GLObjects
int myListIndex
list index
long onCmdDeleteElement(FXObject *, FXSelector, void *)
delete element
GUIGLObjectPopupMenu::PopupType myType
FOX need this.
GUISUMOAbstractView * myView
pointer to view
void buildDialogElements(GUISUMOAbstractView *view, const FXString text, GUIIcon icon, FXSelector sel, const std::vector< GUIGlObject * > &objects)
build dialog elements
FXMenuCommand * myMoveDownMenuCommand
menu command for move down list
MFXMenuHeader * myMenuHeader
header
long onCmdOpenPropertiesPopUp(FXObject *, FXSelector, void *)
open properties popUp
long onCmdSetFrontElement(FXObject *, FXSelector, void *)
set front element
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
The popup menu of a globject.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
FXFont * getBoldFont()
get bold front
void replacePopup(GUIGLObjectPopupMenu *popUp)
replace PopUp
GUIMainWindow * getMainWindow() const
get main window
void destroyPopup()
destroys the popup
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
Definition json.hpp:4471