Eclipse SUMO - Simulation of Urban MObility
GUICursorDialog.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-2022 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 <netedit/GNEUndoList.h>
28
29#include "GUICursorDialog.h"
30
31
32#define NUM_VISIBLE_ITEMS 10
33
34// ===========================================================================
35// FOX callback mapping
36// ===========================================================================
37
38FXDEFMAP(GUICursorDialog) GUICursorDialogMap[] = {
46 FXMAPFUNC(SEL_COMMAND, FXWindow::ID_UNPOST, GUICursorDialog::onCmdUnpost),
47};
48
49// Object implementation
50FXIMPLEMENT(GUICursorDialog, GUIGLObjectPopupMenu, GUICursorDialogMap, ARRAYNUMBER(GUICursorDialogMap))
51
52// ===========================================================================
53// member method definitions
54// ===========================================================================
55
57 GUIGLObjectPopupMenu(view->getMainWindow(), view, type),
58 myType(type),
59 myView(view) {
60 // continue depending of properties
62 buildDialogElements(view, "Overlapped objects", GUIIcon::MODEINSPECT, MID_CURSORDIALOG_PROPERTIES, objects);
64 buildDialogElements(view, "Delete element", GUIIcon::MODEDELETE, MID_CURSORDIALOG_DELETEELEMENT, objects);
66 buildDialogElements(view, "Select element", GUIIcon::MODESELECT, MID_CURSORDIALOG_SELECTELEMENT, objects);
68 buildDialogElements(view, "Mark front element", GUIIcon::FRONTELEMENT, MID_CURSORDIALOG_SETFRONTELEMENT, objects);
69 }
70}
71
72
74 // delete all menu commands
75 for (const auto& GLObject : myMenuCommandGLObjects) {
76 delete GLObject.first;
77 }
78}
79
80
81long
82GUICursorDialog::onCmdSetFrontElement(FXObject* obj, FXSelector, void*) {
83 // search element in myGLObjects
84 for (const auto& GLObject : myMenuCommandGLObjects) {
85 if (GLObject.first == obj) {
86 GLObject.second->markAsFrontElement();
87 }
88 }
89 // destroy popup
91 return 1;
92}
93
94
95long
96GUICursorDialog::onCmdDeleteElement(FXObject* obj, FXSelector, void*) {
97 // search element in myGLObjects
98 for (const auto& GLObject : myMenuCommandGLObjects) {
99 if (GLObject.first == obj) {
100 GLObject.second->deleteGLObject();
101 }
102 }
103 // destroy popup
105 return 1;
106}
107
108
109long
110GUICursorDialog::onCmdSelectElement(FXObject* obj, FXSelector, void*) {
111 // search element in myGLObjects
112 for (const auto& GLObject : myMenuCommandGLObjects) {
113 if (GLObject.first == obj) {
114 GLObject.second->selectGLObject();
115 }
116 }
117 // destroy popup
119 return 1;
120}
121
122
123long
124GUICursorDialog::onCmdOpenPropertiesPopUp(FXObject* obj, FXSelector, void*) {
125 // search element in myGLObjects
126 for (const auto& GLObject : myMenuCommandGLObjects) {
127 if (GLObject.first == obj) {
128 myView->replacePopup(GLObject.second->getPopUpMenu(*myView->getMainWindow(), *myView));
129 return 1;
130 }
131 }
132 return 0;
133}
134
135
136long
137GUICursorDialog::onCmdMoveListUp(FXObject*, FXSelector, void*) {
139 updateList();
140 show();
141 return 0;
142}
143
144
145long
146GUICursorDialog::onCmdMoveListDown(FXObject*, FXSelector, void*) {
148 updateList();
149 show();
150 return 0;
151}
152
153
154long
155GUICursorDialog::onCmdProcessFront(FXObject*, FXSelector, void*) {
156 // continue depending of properties
158 myMenuCommandGLObjects.front().second->deleteGLObject();
160 myMenuCommandGLObjects.front().second->selectGLObject();
162 myMenuCommandGLObjects.front().second->markAsFrontElement();
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:425
@ MID_CURSORDIALOG_MOVEDOWN
move list down
Definition: GUIAppEnum.h:435
@ MID_CURSORDIALOG_PROPERTIES
open properties popup
Definition: GUIAppEnum.h:431
@ MID_CURSORDIALOG_FRONT
remove/select/mark front element
Definition: GUIAppEnum.h:437
@ MID_CURSORDIALOG_MOVEUP
move list up
Definition: GUIAppEnum.h:433
@ MID_CURSORDIALOG_DELETEELEMENT
delete element
Definition: GUIAppEnum.h:427
@ MID_CURSORDIALOG_SELECTELEMENT
select element
Definition: GUIAppEnum.h:429
FXDEFMAP(GUICursorDialog) GUICursorDialogMap[]
#define NUM_VISIBLE_ITEMS
GUIIcon
An enumeration of icons used by the gui applications.
Definition: GUIIcons.h:33
@ FRONTELEMENT
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)
build menu command
Definition: GUIDesigns.cpp:42
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