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-2025 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
26
27#include "GUICursorDialog.h"
28
29
30#define NUM_VISIBLE_ITEMS 10
31
32// ===========================================================================
33// FOX callback mapping
34// ===========================================================================
35
46
47// Object implementation
48FXIMPLEMENT(GUICursorDialog, GUIGLObjectPopupMenu, GUICursorDialogMap, ARRAYNUMBER(GUICursorDialogMap))
49
50// ===========================================================================
51// member method definitions
52// ===========================================================================
53
55 GUIGLObjectPopupMenu(view->getMainWindow(), view, type),
56 myType(type),
57 myView(view) {
58 // continue depending of properties
60 buildDialogElements(view, TL("Overlapped objects"), GUIIcon::MODEINSPECT, MID_CURSORDIALOG_PROPERTIES, objects);
62 buildDialogElements(view, TL("Delete element"), GUIIcon::MODEDELETE, MID_CURSORDIALOG_DELETEELEMENT, objects);
64 buildDialogElements(view, TL("Select element"), GUIIcon::MODESELECT, MID_CURSORDIALOG_SELECTELEMENT, objects);
66 buildDialogElements(view, TL("Mark front element"), GUIIcon::FRONTELEMENT, MID_CURSORDIALOG_SETFRONTELEMENT, objects);
67 }
68}
69
70
72 // delete all menu commands
73 for (const auto& GLObject : myMenuCommandGLObjects) {
74 delete GLObject.first;
75 }
76}
77
78
79long
80GUICursorDialog::onCmdSetFrontElement(FXObject* obj, FXSelector, void*) {
81 // search element in myGLObjects
82 for (const auto& GLObject : myMenuCommandGLObjects) {
83 if (GLObject.first == obj) {
84 GLObject.second->markAsFrontElement();
85 }
86 }
87 // destroy popup
89 return 1;
90}
91
92
93long
94GUICursorDialog::onCmdDeleteElement(FXObject* obj, FXSelector, void*) {
95 // search element in myGLObjects
96 for (const auto& GLObject : myMenuCommandGLObjects) {
97 if (GLObject.first == obj) {
98 GLObject.second->deleteGLObject();
99 }
100 }
101 // destroy popup
103 return 1;
104}
105
106
107long
108GUICursorDialog::onCmdSelectElement(FXObject* obj, FXSelector, void*) {
109 // search element in myGLObjects
110 for (const auto& GLObject : myMenuCommandGLObjects) {
111 if (GLObject.first == obj) {
112 GLObject.second->selectGLObject();
113 }
114 }
115 // destroy popup
117 return 1;
118}
119
120
121long
122GUICursorDialog::onCmdOpenPropertiesPopUp(FXObject* obj, FXSelector, void*) {
123 // search element in myGLObjects
124 for (const auto& GLObject : myMenuCommandGLObjects) {
125 if (GLObject.first == obj) {
126 myView->replacePopup(GLObject.second->getPopUpMenu(*myView->getMainWindow(), *myView));
127 return 1;
128 }
129 }
130 return 0;
131}
132
133
134long
135GUICursorDialog::onCmdMoveListUp(FXObject*, FXSelector, void*) {
137 updateList();
138 show();
139 return 0;
140}
141
142
143long
144GUICursorDialog::onCmdMoveListDown(FXObject*, FXSelector, void*) {
146 updateList();
147 show();
148 return 0;
149}
150
151
152long
153GUICursorDialog::onCmdProcessFront(FXObject*, FXSelector, void*) {
154 if (myMenuCommandGLObjects.size() > 0) {
155 // continue depending of properties
157 myMenuCommandGLObjects.front().second->deleteGLObject();
159 myMenuCommandGLObjects.front().second->selectGLObject();
161 myMenuCommandGLObjects.front().second->markAsFrontElement();
162 }
163 }
164 return 0;
165}
166
167
168long
169GUICursorDialog::onCmdUnpost(FXObject* obj, FXSelector, void* ptr) {
170 // ignore move up, down and header
171 if ((obj == myMoveUpMenuCommand) || (obj == myMoveDownMenuCommand) || (obj == myMenuHeader)) {
172 return 1;
173 }
174 if (grabowner) {
175 grabowner->handle(this, FXSEL(SEL_COMMAND, ID_UNPOST), ptr);
176 } else {
177 popdown();
178 if (grabbed()) {
179 ungrab();
180 }
181 }
182 return 1;
183}
184
185
186void
188 // first hide all menu commands
189 for (const auto& GLObject : myMenuCommandGLObjects) {
190 GLObject.first->hide();
191 }
192 // check if disable menu command up
193 if (myListIndex == 0) {
194 myMoveUpMenuCommand->disable();
195 } else {
196 myMoveUpMenuCommand->enable();
197 }
198 // show menu commands depending of myListIndex
200 for (int i = (int)myMenuCommandGLObjects.size() - NUM_VISIBLE_ITEMS; i < (int)myMenuCommandGLObjects.size(); i++) {
201 myMenuCommandGLObjects.at(i).first->show();
202 }
203 myMoveDownMenuCommand->disable();
204 } else {
205 for (int i = myListIndex; i < (myListIndex + NUM_VISIBLE_ITEMS); i++) {
206 myMenuCommandGLObjects.at(i).first->show();
207 }
208 myMoveDownMenuCommand->enable();
209 }
210 // recalc popup
211 recalc();
212}
213
214
215void
216GUICursorDialog::buildDialogElements(GUISUMOAbstractView* view, const FXString text, GUIIcon icon, FXSelector sel, const std::vector<GUIGlObject*>& objects) {
217 // create header
218 myMenuHeader = new MFXMenuHeader(this, view->getMainWindow()->getBoldFont(), text, GUIIconSubSys::getIcon(icon), nullptr, 0);
219 new FXMenuSeparator(this);
220 // check if create move up menu command
221 if (objects.size() > NUM_VISIBLE_ITEMS) {
223 new FXMenuSeparator(this);
224 }
225 // create a menu command for every object
226 for (const auto& GLObject : objects) {
227 myMenuCommandGLObjects.push_back(std::make_pair(GUIDesigns::buildFXMenuCommand(this, GLObject->getMicrosimID(), GLObject->getGLIcon(), this, sel), GLObject));
228 }
229 // check if create move down menu command
230 if (objects.size() > NUM_VISIBLE_ITEMS) {
231 new FXMenuSeparator(this);
233 updateList();
234 }
235}
236
237/****************************************************************************/
@ 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
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
Definition json.hpp:4471