Line data Source code
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 : /****************************************************************************/
14 : /// @file GUIGlChildWindow.cpp
15 : /// @author Daniel Krajzewicz
16 : /// @author Jakob Erdmann
17 : /// @author Michael Behrisch
18 : /// @date Tue, 29.05.2005
19 : ///
20 : //
21 : /****************************************************************************/
22 : #include <config.h>
23 :
24 : #include <utils/common/MsgHandler.h>
25 : #include <utils/foxtools/MFXButtonTooltip.h>
26 : #include <utils/foxtools/MFXCheckableButton.h>
27 : #include <utils/foxtools/MFXMenuButtonTooltip.h>
28 : #include <utils/foxtools/MFXStaticToolTip.h>
29 : #include <utils/gui/div/GUIDesigns.h>
30 : #include <utils/gui/div/GUIGlobalSelection.h>
31 : #include <utils/gui/images/GUIIconSubSys.h>
32 : #include <utils/gui/windows/GUIAppEnum.h>
33 : #include <utils/gui/windows/GUIMainWindow.h>
34 :
35 : #include "GUIGlChildWindow.h"
36 :
37 :
38 : // ===========================================================================
39 : // FOX callback mapping
40 : // ===========================================================================
41 :
42 : FXDEFMAP(GUIGlChildWindow) GUIGlChildWindowMap[] = {
43 : FXMAPFUNC(SEL_COMMAND, MID_RECENTERVIEW, GUIGlChildWindow::onCmdRecenterView),
44 : FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_I_EDITVIEWPORT, GUIGlChildWindow::onCmdEditViewport),
45 : FXMAPFUNC(SEL_COMMAND, MID_SHOWTOOLTIPS_VIEW, GUIGlChildWindow::onCmdShowToolTipsView),
46 : FXMAPFUNC(SEL_COMMAND, MID_SHOWTOOLTIPS_MENU, GUIGlChildWindow::onCmdShowToolTipsMenu),
47 : FXMAPFUNC(SEL_COMMAND, MID_ZOOM_STYLE, GUIGlChildWindow::onCmdZoomStyle),
48 : FXMAPFUNC(SEL_COMMAND, MID_COLORSCHEMECHANGE, GUIGlChildWindow::onCmdChangeColorScheme),
49 : FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_F9_EDIT_VIEWSCHEME, GUIGlChildWindow::onCmdEditViewScheme),
50 : };
51 :
52 9873005 : FXIMPLEMENT(GUIGlChildWindow, FXMDIChild, GUIGlChildWindowMap, ARRAYNUMBER(GUIGlChildWindowMap))
53 :
54 : // ===========================================================================
55 : // member method definitions
56 : // ===========================================================================
57 :
58 7547 : GUIGlChildWindow::GUIGlChildWindow(FXMDIClient* p, GUIMainWindow* GUIMainWindowParent, FXMDIMenu* mdimenu,
59 7547 : const FXString& name, FXMenuBar* gripNavigationToolbar, FXIcon* ic, FXuint opts, FXint x, FXint y, FXint w, FXint h) :
60 : FXMDIChild(p, name, ic, mdimenu, opts, x, y, w, h),
61 7547 : myGUIMainWindowParent(GUIMainWindowParent),
62 7547 : myGripNavigationToolbar(gripNavigationToolbar),
63 7547 : myStaticNavigationToolBar(nullptr),
64 7547 : myView(nullptr) {
65 : // Make MDI Window Menu
66 7547 : setTracking();
67 : // create a vertical frame to add elements
68 7547 : myChildWindowContentFrame = new FXVerticalFrame(this, GUIDesignChildWindowContentFrame);
69 : // if menuBarGripElements isn't NULL, use it to create a grip navigation elements. In other cas, create a static FXToolbar
70 7547 : if (myGripNavigationToolbar == nullptr) {
71 7547 : myStaticNavigationToolBar = new FXToolBar(myChildWindowContentFrame, GUIDesignToolbarMenuBar);
72 : }
73 : // build the tool bars
74 7547 : buildNavigationToolBar(); // always there (recenter)
75 7547 : buildColoringToolBar(); // always there (coloring)
76 7547 : buildScreenshotToolBar(); // always there (screenshot)
77 7547 : }
78 :
79 :
80 7531 : GUIGlChildWindow::~GUIGlChildWindow() {
81 7531 : delete myLocatorPopup;
82 : // only delete static navigation bar if it was created
83 7531 : if (myStaticNavigationToolBar) {
84 7531 : delete myStaticNavigationToolBar;
85 : }
86 7531 : }
87 :
88 :
89 : void
90 7547 : GUIGlChildWindow::create() {
91 7547 : FXMDIChild::create();
92 : // only create static navigation bar if it was created
93 7546 : if (myStaticNavigationToolBar) {
94 7546 : myStaticNavigationToolBar->create();
95 : } else {
96 0 : myGripNavigationToolbar->create();
97 : }
98 7546 : myLocatorPopup->create();
99 7546 : myView->create();
100 7546 : }
101 :
102 :
103 : GUISUMOAbstractView*
104 6475027 : GUIGlChildWindow::getView() const {
105 6475027 : return myView;
106 : }
107 :
108 :
109 : GUIMainWindow*
110 1293540 : GUIGlChildWindow::getGUIMainWindowParent() {
111 1293540 : return myGUIMainWindowParent;
112 : }
113 :
114 :
115 : void
116 7547 : GUIGlChildWindow::buildNavigationToolBar() {
117 : // build the view settings
118 : // recenter view
119 7547 : new MFXButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
120 22641 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Recenter View") + std::string("\t") + TL("Recenter view to the simulated area.")).c_str(),
121 15094 : GUIIconSubSys::getIcon(GUIIcon::RECENTERVIEW), this, MID_RECENTERVIEW, GUIDesignButtonToolbar);
122 : // add viewport button
123 7547 : new MFXButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
124 30188 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TLC("Labels", "Edit Viewport") + std::string("\t") + TL("Opens a menu which lets you edit the viewport. (Ctrl+I)")).c_str(),
125 15094 : GUIIconSubSys::getIcon(GUIIcon::EDITVIEWPORT), this, MID_HOTKEY_CTRL_I_EDITVIEWPORT, GUIDesignButtonToolbar);
126 : // toggle button for zooming style
127 7547 : myZoomStyle = new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
128 22641 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Toggle Zooming Style") + std::string("\t") + TL("Toggles whether zooming is based at cursor position or at the center of the view.")).c_str(),
129 15094 : GUIIconSubSys::getIcon(GUIIcon::ZOOMSTYLE), this, MID_ZOOM_STYLE, GUIDesignMFXCheckableButtonSquare);
130 7547 : myZoomStyle->setChecked(getApp()->reg().readIntEntry("gui", "zoomAtCenter", 0) != 1);
131 : // build the locator popup
132 7547 : myLocatorPopup = new FXPopup(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, POPUP_VERTICAL);
133 : // build locator button
134 7547 : myLocatorButton = new MFXMenuButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
135 22641 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Locate Structures") + std::string("\t") + TL("Locate structures within the network.")).c_str(),
136 15094 : GUIIconSubSys::getIcon(GUIIcon::LOCATE), myLocatorPopup, nullptr, GUIDesignButtonToolbarLocator);
137 : // add toggle button for tooltips in view on/off (by default unchecked)
138 7547 : myShowToolTipsView = new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
139 22641 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Toggle View Tooltips") + std::string("\t") + TL("Toggles whether tooltips in the view shall be shown.")).c_str(),
140 15094 : GUIIconSubSys::getIcon(GUIIcon::SHOWTOOLTIPS_VIEW), this, MID_SHOWTOOLTIPS_VIEW, GUIDesignMFXCheckableButtonSquare);
141 7547 : myGUIMainWindowParent->getStaticTooltipView()->enableStaticToolTip(false);
142 7547 : myGUIMainWindowParent->getStaticTooltipView()->enableStaticToolTip(false);
143 : // add toggle button for tooltips in menu on/off (by default checked)
144 7547 : myShowToolTipsMenu = new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
145 22641 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Toggle Menu Tooltips") + std::string("\t") + TL("Toggles whether tooltips in the menu shall be shown.")).c_str(),
146 15094 : GUIIconSubSys::getIcon(GUIIcon::SHOWTOOLTIPS_MENU), this, MID_SHOWTOOLTIPS_MENU, GUIDesignMFXCheckableButtonSquare);
147 7547 : myShowToolTipsMenu->setChecked(getApp()->reg().readIntEntry("gui", "menuToolTips", 0) != 1);
148 7547 : myGUIMainWindowParent->getStaticTooltipMenu()->enableStaticToolTip(myShowToolTipsMenu->amChecked());
149 7547 : }
150 :
151 :
152 : void
153 7547 : GUIGlChildWindow::buildColoringToolBar() {
154 : // Create Vertical separator
155 7547 : new FXVerticalSeparator(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, GUIDesignVerticalSeparator);
156 : // build coloring tools
157 15094 : myColoringSchemes = new MFXComboBoxIcon(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, nullptr,
158 7547 : false, GUIDesignComboBoxVisibleItems, this, MID_COLORSCHEMECHANGE, GUIDesignComboBoxStatic);
159 : // editor
160 7547 : new MFXButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
161 22641 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Edit Coloring Schemes") + std::string("\t") + TL("Opens a menu which lets you edit the coloring schemes. (F9)")).c_str(),
162 15094 : GUIIconSubSys::getIcon(GUIIcon::COLORWHEEL), this, MID_HOTKEY_F9_EDIT_VIEWSCHEME, GUIDesignButtonToolbar);
163 7547 : }
164 :
165 :
166 : void
167 7547 : GUIGlChildWindow::buildScreenshotToolBar() {
168 : // Create Vertical separator
169 7547 : new FXVerticalSeparator(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, GUIDesignVerticalSeparator);
170 : // snapshot
171 7547 : new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,
172 22641 : myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Make Snapshot") + std::string("\t") + TL("Makes a snapshot of the view.")).c_str(),
173 15094 : GUIIconSubSys::getIcon(GUIIcon::CAMERA), this, MID_MAKESNAPSHOT, GUIDesignButtonToolbar);
174 7547 : }
175 :
176 :
177 : FXGLCanvas*
178 7547 : GUIGlChildWindow::getBuildGLCanvas() const {
179 7547 : return myView;
180 : }
181 :
182 :
183 : FXToolBar*
184 0 : GUIGlChildWindow::getNavigationToolBar(GUISUMOAbstractView&) {
185 0 : return myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar;
186 : }
187 :
188 :
189 : FXPopup*
190 67923 : GUIGlChildWindow::getLocatorPopup() {
191 67923 : return myLocatorPopup;
192 : }
193 :
194 :
195 : MFXComboBoxIcon*
196 52903 : GUIGlChildWindow::getColoringSchemesCombo() {
197 52903 : return myColoringSchemes;
198 : }
199 :
200 :
201 : MFXCheckableButton*
202 0 : GUIGlChildWindow::getShowToolTipsMenu() const {
203 0 : return myShowToolTipsMenu;
204 : }
205 :
206 :
207 : long
208 0 : GUIGlChildWindow::onCmdRecenterView(FXObject*, FXSelector, void*) {
209 0 : myView->recenterView();
210 0 : myView->update();
211 0 : return 1;
212 : }
213 :
214 :
215 : long
216 0 : GUIGlChildWindow::onCmdEditViewport(FXObject*, FXSelector, void*) {
217 0 : myView->showViewportEditor();
218 0 : return 1;
219 : }
220 :
221 :
222 : long
223 0 : GUIGlChildWindow::onCmdEditViewScheme(FXObject*, FXSelector, void*) {
224 0 : myView->showViewschemeEditor();
225 0 : return 1;
226 : }
227 :
228 :
229 : long
230 0 : GUIGlChildWindow::onCmdShowToolTipsView(FXObject*, FXSelector, void*) {
231 : // toggle check
232 0 : myShowToolTipsView->setChecked(!myShowToolTipsView->amChecked());
233 : // enable/disable static tooltip
234 0 : myGUIMainWindowParent->getStaticTooltipView()->enableStaticToolTip(myShowToolTipsView->amChecked());
235 0 : update();
236 0 : return 1;
237 : }
238 :
239 :
240 : long
241 0 : GUIGlChildWindow::onCmdShowToolTipsMenu(FXObject*, FXSelector, void*) {
242 : // toggle check
243 0 : myShowToolTipsMenu->setChecked(!myShowToolTipsMenu->amChecked());
244 : // enable/disable static tooltip
245 0 : myGUIMainWindowParent->getStaticTooltipMenu()->enableStaticToolTip(myShowToolTipsMenu->amChecked());
246 : // save in registry
247 0 : getApp()->reg().writeIntEntry("gui", "menuToolTips", myShowToolTipsMenu->amChecked() ? 0 : 1);
248 0 : update();
249 0 : return 1;
250 : }
251 :
252 :
253 : long
254 0 : GUIGlChildWindow::onCmdZoomStyle(FXObject*, FXSelector, void*) {
255 0 : myZoomStyle->setChecked(!myZoomStyle->amChecked());
256 0 : getApp()->reg().writeIntEntry("gui", "zoomAtCenter", myZoomStyle->amChecked() ? 0 : 1);
257 0 : update();
258 0 : myView->update();
259 0 : return 1;
260 : }
261 :
262 :
263 : long
264 0 : GUIGlChildWindow::onCmdChangeColorScheme(FXObject*, FXSelector, void* ptr) {
265 0 : myView->setColorScheme((char*) ptr);
266 0 : return 1;
267 : }
268 :
269 :
270 : void
271 0 : GUIGlChildWindow::setView(GUIGlID id) {
272 : // this is used by the locator widget. zooming to bounding box
273 0 : myView->centerTo(id, true, -1);
274 0 : myView->update();
275 0 : }
276 :
277 :
278 : bool
279 0 : GUIGlChildWindow::isSelected(GUIGlObject* o) const {
280 0 : return gSelected.isSelected(o->getType(), o->getGlID());
281 : }
282 :
283 : /****************************************************************************/
|