Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2002-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 : /****************************************************************************/ 14 : /// @file GUIParameterTableWindow.h 15 : /// @author Daniel Krajzewicz 16 : /// @author Michael Behrisch 17 : /// @author Jakob Erdmann 18 : /// @date Sept 2002 19 : /// 20 : // The window that holds the table of an object's parameter 21 : /****************************************************************************/ 22 : #pragma once 23 : #include <config.h> 24 : 25 : #include <vector> 26 : #include <string> 27 : #include <algorithm> 28 : #include <functional> 29 : #include <utils/foxtools/fxheader.h> 30 : #include <utils/common/ValueSource.h> 31 : #include <utils/common/SUMOTime.h> 32 : #include <utils/gui/div/GUIPersistentWindowPos.h> 33 : #include "GUIParameterTableItem.h" 34 : 35 : 36 : // =========================================================================== 37 : // class declarations 38 : // =========================================================================== 39 : class GUIGlObject; 40 : class GUIMainWindow; 41 : class GUIParameterTableItemInterface; 42 : class Parameterised; 43 : 44 : 45 : // =========================================================================== 46 : // class definitions 47 : // =========================================================================== 48 : /** 49 : * @class GUIParameterTableWindow 50 : * @brief A window containing a gl-object's parameter 51 : * 52 : * This class realises a view on some parameter of a gl-object. The gl-object 53 : * itself is responsible for filling this table. 54 : * 55 : * After allocating such a table, the object should fill the rows by calling 56 : * one of the mkItem-methods for each. The building is closed using closeBuilding 57 : * what forces the table to be displayed. 58 : * 59 : * Each row is represented using an instance of GUIParameterTableItemInterface. 60 : */ 61 : class GUIParameterTableWindow : public FXMainWindow, public GUIPersistentWindowPos { 62 0 : FXDECLARE(GUIParameterTableWindow) 63 : public: 64 : /** @brief Constructor 65 : * 66 : * @param[in] app The application this window belongs to 67 : * @param[in] o The gl-object this table describes 68 : */ 69 : GUIParameterTableWindow(GUIMainWindow& app, GUIGlObject& o, const std::string& title = ""); 70 : 71 : 72 : /// @brief Destructor 73 : ~GUIParameterTableWindow(); 74 : 75 : 76 : /** @brief Closes the building of the table 77 : * 78 : * Adds the table to the list of child windows of the applications also 79 : * telling the application that the window should be updated in each 80 : * simulation step. Shows the table. 81 : * 82 : * @see GUIMainWindow::addChild 83 : */ 84 : void closeBuilding(const Parameterised* p = 0); 85 : 86 : 87 : /// @brief ensure that the font covers the given text 88 : void checkFont(const std::string& text); 89 : 90 : /** @brief Lets this window know the object shown is being deleted 91 : * @param[in] o The deleted (shown) object 92 : */ 93 : void removeObject(GUIGlObject* const o); 94 : 95 : 96 : 97 : /// @name Row adding functions 98 : /// @{ 99 : 100 : /** @brief Adds a row which obtains its value from a ValueSource 101 : * 102 : * @param[in] name The name of the row entry 103 : * @param[in] dynamic Information whether the entry is dynamic 104 : * @param[in] src The value source to use 105 : */ 106 : template<class T> 107 0 : void mkItem(const char* name, bool dynamic, ValueSource<T>* src) { 108 0 : myTable->insertRows((int)myItems.size() + 1); 109 0 : GUIParameterTableItemInterface* i = new GUIParameterTableItem<T>(myTable, myCurrentPos++, name, dynamic, src); 110 0 : myItems.push_back(i); 111 0 : } 112 : 113 : /** @brief Adds a row which shows a string-value 114 : * 115 : * @param[in] name The name of the row entry 116 : * @param[in] dynamic Information whether the entry is dynamic 117 : * @param[in] value The value to show 118 : * @todo the dynamic-parameter is obsolete(?) 119 : */ 120 : void mkItem(const char* name, bool dynamic, std::string value); 121 : 122 : 123 : /** @brief Adds a row which shows a unsigned-value 124 : * 125 : * @param[in] name The name of the row entry 126 : * @param[in] dynamic Information whether the entry is dynamic 127 : * @param[in] value The value to show 128 : * @todo the dynamic-parameter is obsolete 129 : */ 130 : void mkItem(const char* name, bool dynamic, unsigned value); 131 : 132 : 133 : /** @brief Adds a row which shows a integer-value 134 : * 135 : * @param[in] name The name of the row entry 136 : * @param[in] dynamic Information whether the entry is dynamic 137 : * @param[in] value The value to show 138 : * @todo the dynamic-parameter is obsolete 139 : */ 140 : void mkItem(const char* name, bool dynamic, int value); 141 : 142 : 143 : /** @brief Adds a row which shows a 64 bit integer-value 144 : * 145 : * @param[in] name The name of the row entry 146 : * @param[in] dynamic Information whether the entry is dynamic 147 : * @param[in] value The value to show 148 : * @todo the dynamic-parameter is obsolete 149 : */ 150 : void mkItem(const char* name, bool dynamic, long long int value); 151 : 152 : 153 : /** @brief Adds a row which shows a double-value 154 : * 155 : * @param[in] name The name of the row entry 156 : * @param[in] dynamic Information whether the entry is dynamic 157 : * @param[in] value The value to show 158 : * @todo the dynamic-parameter is obsolete 159 : */ 160 : void mkItem(const char* name, bool dynamic, double value); 161 : 162 : 163 : /// @} 164 : 165 : 166 : 167 : /// @name FOX-callbacks 168 : /// @{ 169 : 170 : /** @brief Updates the table due to a simulation step */ 171 : long onSimStep(FXObject*, FXSelector, void*); 172 : 173 : /** @brief Does nothing 174 : * @todo Recheck whether this is needed (to override FXTable-behaviour?) 175 : */ 176 : long onTableSelected(FXObject*, FXSelector, void*); 177 : 178 : /** @brief Does nothing 179 : * @todo Recheck whether this is needed (to override FXTable-behaviour?) 180 : */ 181 : long onTableDeselected(FXObject*, FXSelector, void*); 182 : 183 : 184 : /** @brief Shows a popup 185 : * 186 : * Callback for right-mouse-button pressing event. Obtains the selected row 187 : * and determines whether it is dynamic. If so, a popup-menu which allows 188 : * to open a tracker for this value is built and shown. 189 : * 190 : * @see GUIParameterTableItemInterface 191 : * @see GUIParam_PopupMenuInterface 192 : */ 193 : long onRightButtonPress(FXObject*, FXSelector, void*); 194 : 195 : /// @brief directly opens tracker when clicking on last column 196 : long onLeftBtnPress(FXObject*, FXSelector, void*); 197 : /// @} 198 : 199 : /** @brief Updates all instances 200 : */ 201 : static void updateAll() { 202 : FXMutexLock locker(myGlobalContainerLock); 203 : for (GUIParameterTableWindow* const window : myContainer) { 204 : window->updateTable(); 205 : } 206 : } 207 : 208 : protected: 209 : /** @brief Updates the table 210 : * 211 : * Goes through all entries and updates them using GUIParameterTableItemInterface::update. 212 : * 213 : * @see GUIParameterTableItemInterface::update 214 : */ 215 : void updateTable(); 216 : 217 : /// @brief The mutex used to avoid concurrent updates of the instance container 218 : static FXMutex myGlobalContainerLock; 219 : 220 : /// @brief The container of items that shall be updated 221 : static std::vector<GUIParameterTableWindow*> myContainer; 222 : 223 : private: 224 : /// @brief The object to get the information from 225 : GUIGlObject* myObject; 226 : 227 : /// @brief The table to display the information in 228 : FXTable* myTable; 229 : 230 : /// @brief The main application window 231 : GUIMainWindow* myApplication; 232 : 233 : /// @brief The list of table rows 234 : std::vector<GUIParameterTableItemInterface*> myItems; 235 : 236 : /// @brief y-position for opening new tracker window 237 : int myTrackerY; 238 : 239 : /// @brief The index of the next row to add - used while building 240 : unsigned myCurrentPos; 241 : 242 : /// @brief A lock assuring save updates in case of object deletion 243 : mutable FXMutex myLock; 244 : 245 : /// @brief returns the number of parameters if obj is Parameterised and 0 otherwise 246 : static int numParams(const GUIGlObject* obj); 247 : 248 : protected: 249 0 : FOX_CONSTRUCTOR(GUIParameterTableWindow) 250 : 251 : };