Path: blob/main/src/utils/gui/windows/GUIGlChildWindow.cpp
169685 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GUIGlChildWindow.cpp14/// @author Daniel Krajzewicz15/// @author Jakob Erdmann16/// @author Michael Behrisch17/// @date Tue, 29.05.200518///19//20/****************************************************************************/21#include <config.h>2223#include <utils/common/MsgHandler.h>24#include <utils/foxtools/MFXButtonTooltip.h>25#include <utils/foxtools/MFXCheckableButton.h>26#include <utils/foxtools/MFXMenuButtonTooltip.h>27#include <utils/foxtools/MFXStaticToolTip.h>28#include <utils/gui/div/GUIDesigns.h>29#include <utils/gui/div/GUIGlobalSelection.h>30#include <utils/gui/images/GUIIconSubSys.h>31#include <utils/gui/windows/GUIAppEnum.h>32#include <utils/gui/windows/GUIMainWindow.h>3334#include "GUIGlChildWindow.h"353637// ===========================================================================38// FOX callback mapping39// ===========================================================================4041FXDEFMAP(GUIGlChildWindow) GUIGlChildWindowMap[] = {42FXMAPFUNC(SEL_COMMAND, MID_RECENTERVIEW, GUIGlChildWindow::onCmdRecenterView),43FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_I_EDITVIEWPORT, GUIGlChildWindow::onCmdEditViewport),44FXMAPFUNC(SEL_COMMAND, MID_SHOWTOOLTIPS_VIEW, GUIGlChildWindow::onCmdShowToolTipsView),45FXMAPFUNC(SEL_COMMAND, MID_SHOWTOOLTIPS_MENU, GUIGlChildWindow::onCmdShowToolTipsMenu),46FXMAPFUNC(SEL_COMMAND, MID_ZOOM_STYLE, GUIGlChildWindow::onCmdZoomStyle),47FXMAPFUNC(SEL_COMMAND, MID_COLORSCHEMECHANGE, GUIGlChildWindow::onCmdChangeColorScheme),48FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_F9_EDIT_VIEWSCHEME, GUIGlChildWindow::onCmdEditViewScheme),49};5051FXIMPLEMENT(GUIGlChildWindow, FXMDIChild, GUIGlChildWindowMap, ARRAYNUMBER(GUIGlChildWindowMap))5253// ===========================================================================54// member method definitions55// ===========================================================================5657GUIGlChildWindow::GUIGlChildWindow(FXMDIClient* p, GUIMainWindow* GUIMainWindowParent, FXMDIMenu* mdimenu,58const FXString& name, FXMenuBar* gripNavigationToolbar, FXIcon* ic, FXuint opts, FXint x, FXint y, FXint w, FXint h) :59FXMDIChild(p, name, ic, mdimenu, opts, x, y, w, h),60myGUIMainWindowParent(GUIMainWindowParent),61myGripNavigationToolbar(gripNavigationToolbar),62myStaticNavigationToolBar(nullptr),63myView(nullptr) {64// Make MDI Window Menu65setTracking();66// create a vertical frame to add elements67myChildWindowContentFrame = new FXVerticalFrame(this, GUIDesignChildWindowContentFrame);68// if menuBarGripElements isn't NULL, use it to create a grip navigation elements. In other cas, create a static FXToolbar69if (myGripNavigationToolbar == nullptr) {70myStaticNavigationToolBar = new FXToolBar(myChildWindowContentFrame, GUIDesignToolbarMenuBar);71}72// build the tool bars73buildNavigationToolBar(); // always there (recenter)74buildColoringToolBar(); // always there (coloring)75buildScreenshotToolBar(); // always there (screenshot)76}777879GUIGlChildWindow::~GUIGlChildWindow() {80delete myLocatorPopup;81// only delete static navigation bar if it was created82if (myStaticNavigationToolBar) {83delete myStaticNavigationToolBar;84}85}868788void89GUIGlChildWindow::create() {90FXMDIChild::create();91// only create static navigation bar if it was created92if (myStaticNavigationToolBar) {93myStaticNavigationToolBar->create();94} else {95myGripNavigationToolbar->create();96}97myLocatorPopup->create();98myView->create();99}100101102GUISUMOAbstractView*103GUIGlChildWindow::getView() const {104return myView;105}106107108GUIMainWindow*109GUIGlChildWindow::getGUIMainWindowParent() {110return myGUIMainWindowParent;111}112113114void115GUIGlChildWindow::buildNavigationToolBar() {116// build the view settings117// recenter view118new MFXButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,119myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Recenter View") + std::string("\t") + TL("Recenter view to the simulated area.")).c_str(),120GUIIconSubSys::getIcon(GUIIcon::RECENTERVIEW), this, MID_RECENTERVIEW, GUIDesignButtonToolbar);121// add viewport button122new MFXButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,123myGUIMainWindowParent->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(),124GUIIconSubSys::getIcon(GUIIcon::EDITVIEWPORT), this, MID_HOTKEY_CTRL_I_EDITVIEWPORT, GUIDesignButtonToolbar);125// toggle button for zooming style126myZoomStyle = new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,127myGUIMainWindowParent->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(),128GUIIconSubSys::getIcon(GUIIcon::ZOOMSTYLE), this, MID_ZOOM_STYLE, GUIDesignMFXCheckableButtonSquare);129myZoomStyle->setChecked(getApp()->reg().readIntEntry("gui", "zoomAtCenter", 0) != 1);130// build the locator popup131myLocatorPopup = new FXPopup(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, POPUP_VERTICAL);132// build locator button133myLocatorButton = new MFXMenuButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,134myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Locate Structures") + std::string("\t") + TL("Locate structures within the network.")).c_str(),135GUIIconSubSys::getIcon(GUIIcon::LOCATE), myLocatorPopup, nullptr, GUIDesignButtonToolbarLocator);136// add toggle button for tooltips in view on/off (by default unchecked)137myShowToolTipsView = new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,138myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Toggle View Tooltips") + std::string("\t") + TL("Toggles whether tooltips in the view shall be shown.")).c_str(),139GUIIconSubSys::getIcon(GUIIcon::SHOWTOOLTIPS_VIEW), this, MID_SHOWTOOLTIPS_VIEW, GUIDesignMFXCheckableButtonSquare);140myGUIMainWindowParent->getStaticTooltipView()->enableStaticToolTip(false);141myGUIMainWindowParent->getStaticTooltipView()->enableStaticToolTip(false);142// add toggle button for tooltips in menu on/off (by default checked)143myShowToolTipsMenu = new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,144myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Toggle Menu Tooltips") + std::string("\t") + TL("Toggles whether tooltips in the menu shall be shown.")).c_str(),145GUIIconSubSys::getIcon(GUIIcon::SHOWTOOLTIPS_MENU), this, MID_SHOWTOOLTIPS_MENU, GUIDesignMFXCheckableButtonSquare);146myShowToolTipsMenu->setChecked(getApp()->reg().readIntEntry("gui", "menuToolTips", 0) != 1);147myGUIMainWindowParent->getStaticTooltipMenu()->enableStaticToolTip(myShowToolTipsMenu->amChecked());148}149150151void152GUIGlChildWindow::buildColoringToolBar() {153// Create Vertical separator154new FXVerticalSeparator(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, GUIDesignVerticalSeparator);155// build coloring tools156myColoringSchemes = new MFXComboBoxIcon(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, nullptr,157false, GUIDesignComboBoxVisibleItems, this, MID_COLORSCHEMECHANGE, GUIDesignComboBoxStatic);158// editor159new MFXButtonTooltip(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,160myGUIMainWindowParent->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(),161GUIIconSubSys::getIcon(GUIIcon::COLORWHEEL), this, MID_HOTKEY_F9_EDIT_VIEWSCHEME, GUIDesignButtonToolbar);162}163164165void166GUIGlChildWindow::buildScreenshotToolBar() {167// Create Vertical separator168new FXVerticalSeparator(myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar, GUIDesignVerticalSeparator);169// snapshot170new MFXCheckableButton(false, myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar,171myGUIMainWindowParent->getStaticTooltipMenu(), (std::string("\t") + TL("Make Snapshot") + std::string("\t") + TL("Makes a snapshot of the view.")).c_str(),172GUIIconSubSys::getIcon(GUIIcon::CAMERA), this, MID_MAKESNAPSHOT, GUIDesignButtonToolbar);173}174175176FXGLCanvas*177GUIGlChildWindow::getBuildGLCanvas() const {178return myView;179}180181182FXToolBar*183GUIGlChildWindow::getNavigationToolBar(GUISUMOAbstractView&) {184return myGripNavigationToolbar ? myGripNavigationToolbar : myStaticNavigationToolBar;185}186187188FXPopup*189GUIGlChildWindow::getLocatorPopup() {190return myLocatorPopup;191}192193194MFXComboBoxIcon*195GUIGlChildWindow::getColoringSchemesCombo() {196return myColoringSchemes;197}198199200MFXCheckableButton*201GUIGlChildWindow::getShowToolTipsMenu() const {202return myShowToolTipsMenu;203}204205206long207GUIGlChildWindow::onCmdRecenterView(FXObject*, FXSelector, void*) {208myView->recenterView();209myView->update();210return 1;211}212213214long215GUIGlChildWindow::onCmdEditViewport(FXObject*, FXSelector, void*) {216myView->showViewportEditor();217return 1;218}219220221long222GUIGlChildWindow::onCmdEditViewScheme(FXObject*, FXSelector, void*) {223myView->showViewschemeEditor();224return 1;225}226227228long229GUIGlChildWindow::onCmdShowToolTipsView(FXObject*, FXSelector, void*) {230// toggle check231myShowToolTipsView->setChecked(!myShowToolTipsView->amChecked());232// enable/disable static tooltip233myGUIMainWindowParent->getStaticTooltipView()->enableStaticToolTip(myShowToolTipsView->amChecked());234update();235return 1;236}237238239long240GUIGlChildWindow::onCmdShowToolTipsMenu(FXObject*, FXSelector, void*) {241// toggle check242myShowToolTipsMenu->setChecked(!myShowToolTipsMenu->amChecked());243// enable/disable static tooltip244myGUIMainWindowParent->getStaticTooltipMenu()->enableStaticToolTip(myShowToolTipsMenu->amChecked());245// save in registry246getApp()->reg().writeIntEntry("gui", "menuToolTips", myShowToolTipsMenu->amChecked() ? 0 : 1);247update();248return 1;249}250251252long253GUIGlChildWindow::onCmdZoomStyle(FXObject*, FXSelector, void*) {254myZoomStyle->setChecked(!myZoomStyle->amChecked());255getApp()->reg().writeIntEntry("gui", "zoomAtCenter", myZoomStyle->amChecked() ? 0 : 1);256update();257myView->update();258return 1;259}260261262long263GUIGlChildWindow::onCmdChangeColorScheme(FXObject*, FXSelector, void* ptr) {264myView->setColorScheme((char*) ptr);265return 1;266}267268269void270GUIGlChildWindow::setView(GUIGlID id) {271// this is used by the locator widget. zooming to bounding box272myView->centerTo(id, true, -1);273myView->update();274}275276277bool278GUIGlChildWindow::isSelected(GUIGlObject* o) const {279return gSelected.isSelected(o->getType(), o->getGlID());280}281282/****************************************************************************/283284285