Eclipse SUMO - Simulation of Urban MObility
GNENetworkSelector.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-2024 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 // NetworkElement selector module
19 /****************************************************************************/
20 #include <config.h>
21 
22 #include <netedit/GNENet.h>
23 #include <netedit/GNEViewNet.h>
26 
27 #include "GNENetworkSelector.h"
28 #include "GNEFrame.h"
29 
30 
31 // ===========================================================================
32 // FOX callback mapping
33 // ===========================================================================
34 
35 FXDEFMAP(GNENetworkSelector) SelectorParentNetworkElementsMap[] = {
38 };
39 
40 // Object implementation
41 FXIMPLEMENT(GNENetworkSelector, MFXGroupBoxModule, SelectorParentNetworkElementsMap, ARRAYNUMBER(SelectorParentNetworkElementsMap))
42 
43 
44 // ---------------------------------------------------------------------------
45 // GNENetworkSelector - methods
46 // ---------------------------------------------------------------------------
47 
48 GNENetworkSelector::GNENetworkSelector(GNEFrame* frameParent, const Type networkElementType) :
49  MFXGroupBoxModule(frameParent, TL("NetworkElements")),
50  myFrameParent(frameParent),
51  myNetworkElementType(networkElementType) {
52  // Create horizontal frame
53  FXHorizontalFrame* buttonsFrame = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);
54  // Create buttons
55  myClearSelection = GUIDesigns::buildFXButton(buttonsFrame, TL("Clear"), "", "", nullptr, this, MID_GNE_CLEARSELECTION, GUIDesignButtonFixed(100));
56  myUseSelected = GUIDesigns::buildFXButton(buttonsFrame, TL("Use selected"), "", "", nullptr, this, MID_GNE_USESELECTED, GUIDesignButtonFixed(100));
57  // Create list
58  myList = new FXList(getCollapsableFrame(), this, MID_GNE_SELECT, GUIDesignListFixedHeight, 0, 0, 0, 100);
59  // create information label and update modul name
60  switch (myNetworkElementType) {
61  case Type::EDGE:
62  new FXLabel(this,
63  (TL("-Click over an edge to select") + std::string("\n") + std::string("-ESC to clear selection")).c_str(),
65  setText(TL("Edges"));
66  break;
67  case Type::LANE:
68  new FXLabel(this,
69  (TL("-Click over an lane to select") + std::string("\n") + std::string("-ESC to clear selection")).c_str(),
71  setText(TL("Lanes"));
72  break;
73  default:
74  throw ProcessError(TL("Invalid NetworkElementType"));
75  }
76  // Hide List
77  hide();
78 }
79 
80 
82 
83 
84 std::vector<std::string>
86  // declare solution
87  std::vector<std::string> solution;
88  // reserve
89  solution.reserve(myList->getNumItems());
90  // fill IDs
91  for (int i = 0; i < myList->getNumItems(); i++) {
92  solution.push_back(myList->getItem(i)->getText().text());
93  }
94  return solution;
95 }
96 
97 
98 bool
100  if (myFrameParent->shown() && shown()) {
101  // check if id is selected
102  for (int i = 0; i < myList->getNumItems(); i++) {
103  if (myList->getItem(i)->getText().text() == networkElement->getID()) {
104  return true;
105  }
106  }
107  }
108  return false;
109 }
110 
111 
112 void
114  // clear list of egdge ids
115  myList->clearItems();
116  // Show dialog
117  show();
118 }
119 
120 
121 void
123  hide();
124 }
125 
126 
127 bool
129  return shown();
130 }
131 
132 
133 bool
135  // Obtain Id's of list
136  for (int i = 0; i < myList->getNumItems(); i++) {
137  if (myList->getItem(i)->getText().text() == networkElement->getID()) {
138  // unselect element
139  myList->removeItem(i);
140  // update viewNet
141  myFrameParent->getViewNet()->update();
142  return true;
143  }
144  }
145  // select element
146  myList->appendItem(networkElement->getID().c_str(), networkElement->getACIcon());
147  // update viewNet
148  myFrameParent->getViewNet()->update();
149  return true;
150 }
151 
152 
153 void
155  // clear list of egdge ids
156  myList->clearItems();
157  // update viewNet
158  myFrameParent->getViewNet()->update();
159 }
160 
161 
162 long
163 GNENetworkSelector::onCmdUseSelectedElements(FXObject*, FXSelector, void*) {
164  // clear list of egdge ids
165  myList->clearItems();
166  // set modul name
167  switch (myNetworkElementType) {
168  case Type::EDGE:
169  for (const auto& edge : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getEdges()) {
170  if (edge.second.second->isAttributeCarrierSelected()) {
171  myList->appendItem(edge.first.c_str(), edge.second.second->getACIcon());
172  }
173  }
174  break;
175  case Type::LANE:
176  for (const auto& lane : myFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getLanes()) {
177  if (lane.second->isAttributeCarrierSelected()) {
178  myList->appendItem(lane.second->getID().c_str(), lane.second->getACIcon());
179  }
180  }
181  break;
182  default:
183  throw ProcessError(TL("Invalid NetworkElementType"));
184  }
185  // Update Frame
186  update();
187  return 1;
188 }
189 
190 
191 long
192 GNENetworkSelector::onCmdClearSelection(FXObject*, FXSelector, void*) {
193  clearSelection();
194  return 1;
195 }
196 
197 
199  myFrameParent(nullptr),
200  myNetworkElementType(Type::EDGE) {
201 }
202 
203 /****************************************************************************/
FXDEFMAP(GNENetworkSelector) SelectorParentNetworkElementsMap[]
@ MID_GNE_CLEARSELECTION
clear selection of elements
Definition: GUIAppEnum.h:1182
@ MID_GNE_USESELECTED
use selected elements
Definition: GUIAppEnum.h:1180
@ MID_GNE_SELECT
select element
Definition: GUIAppEnum.h:953
#define GUIDesignListFixedHeight
design for FXLists with height fixed
Definition: GUIDesigns.h:692
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:405
#define GUIDesignButtonFixed(width)
button rectangular with thick and raise frame with the given width
Definition: GUIDesigns.h:103
#define GUIDesignLabelFrameInformation
label extended over frame without thick and with text justify to left, used to show information in fr...
Definition: GUIDesigns.h:285
#define TL(string)
Definition: MsgHandler.h:315
const std::string getID() const
get ID (all Attribute Carriers have one)
FXIcon * getACIcon() const
get FXIcon associated to this AC
GNEViewNet * getViewNet() const
get view net
Definition: GNEFrame.cpp:150
const std::map< std::string, std::pair< const GUIGlObject *, GNEEdge * > > & getEdges() const
map with the ID and pointer to edges of net
const std::map< const GUIGlObject *, GNELane * > & getLanes() const
get lanes
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition: GNENet.cpp:123
void hideNetworkElementsSelector()
hide GNENetworkSelector Module
bool toggleSelectedElement(const GNENetworkElement *networkElement)
toggle selected networkElement
bool isNetworkElementSelected(const GNENetworkElement *networkElement) const
check if the given networkElement is being selected
bool isShown() const
return true if module is shown
long onCmdUseSelectedElements(FXObject *, FXSelector, void *)
Type
FOX-declaration.
void clearSelection()
clear selection
long onCmdClearSelection(FXObject *, FXSelector, void *)
called when clear selection button is pressed
void showNetworkElementsSelector()
show GNENetworkSelector Module
std::vector< std::string > getSelectedIDs() const
get selected IDs
~GNENetworkSelector()
destructor
FXList * myList
List of GNENetworkSelector.
GNEFrame * myFrameParent
pointer to frame parent
GNENetworkSelector()
FOX need this.
const Type myNetworkElementType
@brrief network element type
GNENet * getNet() const
get the net object
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
Definition: GUIDesigns.cpp:128
MFXGroupBoxModule (based on FXGroupBox)