Path: blob/main/src/utils/gui/globjects/GUICursorDialog.cpp
193678 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2026 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 GUICursorDialog.cpp14/// @author Pablo Alvarez Lopez15/// @date Sep 202216///17// Dialog for edit element under cursor18/****************************************************************************/19#include <config.h>2021#include <utils/gui/div/GUIDesigns.h>22#include <utils/gui/windows/GUIAppEnum.h>23#include <utils/gui/windows/GUIMainWindow.h>24#include <utils/gui/windows/GUISUMOAbstractView.h>2526#include "GUICursorDialog.h"272829#define NUM_VISIBLE_ITEMS 103031// ===========================================================================32// FOX callback mapping33// ===========================================================================3435FXDEFMAP(GUICursorDialog) GUICursorDialogMap[] = {36FXMAPFUNC(SEL_COMMAND, MID_CURSORDIALOG_SETFRONTELEMENT, GUICursorDialog::onCmdSetFrontElement),37FXMAPFUNC(SEL_COMMAND, MID_CURSORDIALOG_DELETEELEMENT, GUICursorDialog::onCmdDeleteElement),38FXMAPFUNC(SEL_COMMAND, MID_CURSORDIALOG_SELECTELEMENT, GUICursorDialog::onCmdSelectElement),39FXMAPFUNC(SEL_COMMAND, MID_CURSORDIALOG_PROPERTIES, GUICursorDialog::onCmdOpenPropertiesPopUp),40FXMAPFUNC(SEL_COMMAND, MID_CURSORDIALOG_MOVEUP, GUICursorDialog::onCmdMoveListUp),41FXMAPFUNC(SEL_COMMAND, MID_CURSORDIALOG_MOVEDOWN, GUICursorDialog::onCmdMoveListDown),42FXMAPFUNC(SEL_COMMAND, MID_CURSORDIALOG_FRONT, GUICursorDialog::onCmdProcessFront),43FXMAPFUNC(SEL_COMMAND, FXWindow::ID_UNPOST, GUICursorDialog::onCmdUnpost),44};4546// Object implementation47FXIMPLEMENT(GUICursorDialog, GUIGLObjectPopupMenu, GUICursorDialogMap, ARRAYNUMBER(GUICursorDialogMap))4849// ===========================================================================50// member method definitions51// ===========================================================================5253GUICursorDialog::GUICursorDialog(GUIGLObjectPopupMenu::PopupType type, GUISUMOAbstractView* view, const std::vector<GUIGlObject*>& objects) :54GUIGLObjectPopupMenu(view->getMainWindow(), view, type),55myType(type),56myView(view) {57// continue depending of properties58if (type == GUIGLObjectPopupMenu::PopupType::PROPERTIES) {59buildDialogElements(view, TL("Overlapped objects"), GUIIcon::MODEINSPECT, MID_CURSORDIALOG_PROPERTIES, objects);60} else if (type == GUIGLObjectPopupMenu::PopupType::DELETE_ELEMENT) {61buildDialogElements(view, TL("Delete element"), GUIIcon::MODEDELETE, MID_CURSORDIALOG_DELETEELEMENT, objects);62} else if (type == GUIGLObjectPopupMenu::PopupType::SELECT_ELEMENT) {63buildDialogElements(view, TL("Select element"), GUIIcon::MODESELECT, MID_CURSORDIALOG_SELECTELEMENT, objects);64} else if (type == GUIGLObjectPopupMenu::PopupType::FRONT_ELEMENT) {65buildDialogElements(view, TL("Mark front element"), GUIIcon::FRONTELEMENT, MID_CURSORDIALOG_SETFRONTELEMENT, objects);66}67}686970GUICursorDialog::~GUICursorDialog() {71// delete all menu commands72for (const auto& GLObject : myMenuCommandGLObjects) {73delete GLObject.first;74}75}767778long79GUICursorDialog::onCmdSetFrontElement(FXObject* obj, FXSelector, void*) {80// search element in myGLObjects81for (const auto& GLObject : myMenuCommandGLObjects) {82if (GLObject.first == obj) {83GLObject.second->markAsFrontElement();84}85}86// destroy popup87myView->destroyPopup();88return 1;89}909192long93GUICursorDialog::onCmdDeleteElement(FXObject* obj, FXSelector, void*) {94// search element in myGLObjects95for (const auto& GLObject : myMenuCommandGLObjects) {96if (GLObject.first == obj) {97GLObject.second->deleteGLObject();98}99}100// destroy popup101myView->destroyPopup();102return 1;103}104105106long107GUICursorDialog::onCmdSelectElement(FXObject* obj, FXSelector, void*) {108// search element in myGLObjects109for (const auto& GLObject : myMenuCommandGLObjects) {110if (GLObject.first == obj) {111GLObject.second->selectGLObject();112}113}114// destroy popup115myView->destroyPopup();116return 1;117}118119120long121GUICursorDialog::onCmdOpenPropertiesPopUp(FXObject* obj, FXSelector, void*) {122// search element in myGLObjects123for (const auto& GLObject : myMenuCommandGLObjects) {124if (GLObject.first == obj) {125myView->replacePopup(GLObject.second->getPopUpMenu(*myView->getMainWindow(), *myView));126return 1;127}128}129return 0;130}131132133long134GUICursorDialog::onCmdMoveListUp(FXObject*, FXSelector, void*) {135myListIndex -= NUM_VISIBLE_ITEMS;136updateList();137show();138return 0;139}140141142long143GUICursorDialog::onCmdMoveListDown(FXObject*, FXSelector, void*) {144myListIndex += NUM_VISIBLE_ITEMS;145updateList();146show();147return 0;148}149150151long152GUICursorDialog::onCmdProcessFront(FXObject*, FXSelector, void*) {153if (myMenuCommandGLObjects.size() > 0) {154// continue depending of properties155if (myType == GUIGLObjectPopupMenu::PopupType::DELETE_ELEMENT) {156myMenuCommandGLObjects.front().second->deleteGLObject();157} else if (myType == GUIGLObjectPopupMenu::PopupType::SELECT_ELEMENT) {158myMenuCommandGLObjects.front().second->selectGLObject();159} else if (myType == GUIGLObjectPopupMenu::PopupType::FRONT_ELEMENT) {160myMenuCommandGLObjects.front().second->markAsFrontElement();161}162}163return 0;164}165166167long168GUICursorDialog::onCmdUnpost(FXObject* obj, FXSelector, void* ptr) {169// ignore move up, down and header170if ((obj == myMoveUpMenuCommand) || (obj == myMoveDownMenuCommand) || (obj == myMenuHeader)) {171return 1;172}173if (grabowner) {174grabowner->handle(this, FXSEL(SEL_COMMAND, ID_UNPOST), ptr);175} else {176popdown();177if (grabbed()) {178ungrab();179}180}181return 1;182}183184185void186GUICursorDialog::updateList() {187// first hide all menu commands188for (const auto& GLObject : myMenuCommandGLObjects) {189GLObject.first->hide();190}191// check if disable menu command up192if (myListIndex == 0) {193myMoveUpMenuCommand->disable();194} else {195myMoveUpMenuCommand->enable();196}197// show menu commands depending of myListIndex198if ((myListIndex + NUM_VISIBLE_ITEMS) > (int)myMenuCommandGLObjects.size()) {199for (int i = (int)myMenuCommandGLObjects.size() - NUM_VISIBLE_ITEMS; i < (int)myMenuCommandGLObjects.size(); i++) {200myMenuCommandGLObjects.at(i).first->show();201}202myMoveDownMenuCommand->disable();203} else {204for (int i = myListIndex; i < (myListIndex + NUM_VISIBLE_ITEMS); i++) {205myMenuCommandGLObjects.at(i).first->show();206}207myMoveDownMenuCommand->enable();208}209// recalc popup210recalc();211}212213214void215GUICursorDialog::buildDialogElements(GUISUMOAbstractView* view, const FXString text, GUIIcon icon, FXSelector sel, const std::vector<GUIGlObject*>& objects) {216// create header217myMenuHeader = new MFXMenuHeader(this, view->getMainWindow()->getBoldFont(), text, GUIIconSubSys::getIcon(icon), nullptr, 0);218new FXMenuSeparator(this);219// check if create move up menu command220if (objects.size() > NUM_VISIBLE_ITEMS) {221myMoveUpMenuCommand = GUIDesigns::buildFXMenuCommand(this, "Previous", GUIIconSubSys::getIcon(GUIIcon::ARROW_UP), this, MID_CURSORDIALOG_MOVEUP);222new FXMenuSeparator(this);223}224// create a menu command for every object225for (const auto& GLObject : objects) {226myMenuCommandGLObjects.push_back(std::make_pair(GUIDesigns::buildFXMenuCommand(this, GLObject->getMicrosimID(), GLObject->getGLIcon(), this, sel), GLObject));227}228// check if create move down menu command229if (objects.size() > NUM_VISIBLE_ITEMS) {230new FXMenuSeparator(this);231myMoveDownMenuCommand = GUIDesigns::buildFXMenuCommand(this, "Next", GUIIconSubSys::getIcon(GUIIcon::ARROW_DOWN), this, MID_CURSORDIALOG_MOVEDOWN);232updateList();233}234}235236/****************************************************************************/237238239