LCOV - code coverage report
Current view: top level - src/utils/gui/div - GUIParameterTableItem.h (source / functions) Hit Total Coverage
Test: lcov.info Lines: 0 40 0.0 %
Date: 2024-05-02 15:31:40 Functions: 0 43 0.0 %

          Line data    Source code
       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             : /****************************************************************************/
      14             : /// @file    GUIParameterTableItem.h
      15             : /// @author  Daniel Krajzewicz
      16             : /// @author  Michael Behrisch
      17             : /// @date
      18             : ///
      19             : // A single line in a parameter window
      20             : /****************************************************************************/
      21             : #pragma once
      22             : #include <config.h>
      23             : 
      24             : #include <string>
      25             : #include <utils/foxtools/fxheader.h>
      26             : #include <utils/common/ValueSource.h>
      27             : #include <utils/common/ToString.h>
      28             : #include <utils/gui/div/GUIParam_PopupMenu.h>
      29             : #include <utils/gui/images/GUIIconSubSys.h>
      30             : #include <utils/gui/windows/GUIAppEnum.h>
      31             : 
      32             : 
      33             : // ===========================================================================
      34             : // class definitions
      35             : // ===========================================================================
      36             : // ---------------------------------------------------------------------------
      37             : // GUIParameterTableItemInterface
      38             : // ---------------------------------------------------------------------------
      39             : /**
      40             :  * @class GUIParameterTableItemInterface
      41             :  * @brief Interface to a single line in a parameter window
      42             :  *
      43             :  * Because a single line in a parameter window may display different kinds of
      44             :  *  information (different value types, dynamic or static information), an
      45             :  *  interface is needed in order to allow a common access to the functions of
      46             :  *  a line - basically the possibility to open a tracker (GUIParameterTracker)
      47             :  *  for the stored, dynamic value.
      48             :  *
      49             :  * The implementation is done by GUIParameterTableItem.
      50             :  *
      51             :  * @see GUIParameterTracker
      52             :  * @see GUIParameterTableItem
      53             :  */
      54             : class GUIParameterTableItemInterface {
      55             : public:
      56             :     /// @brief Destructor
      57             :     virtual ~GUIParameterTableItemInterface()  {}
      58             : 
      59             : 
      60             :     /// @name Methods to be implemented by derived classes
      61             :     /// @{
      62             : 
      63             :     /// @brief Returns the information whether the value changes over simulation time
      64             :     virtual bool dynamic() const = 0;
      65             : 
      66             :     /// @brief Forces an update of the value
      67             :     virtual void update() = 0;
      68             : 
      69             :     /// @brief Returns a double-typed copy of the value-source
      70             :     virtual ValueSource<double>* getdoubleSourceCopy() const = 0;
      71             : 
      72             :     /// @brief Returns the name of the value
      73             :     virtual const std::string& getName() const = 0;
      74             :     /// @}
      75             : };
      76             : 
      77             : 
      78             : // ---------------------------------------------------------------------------
      79             : // GUIParameterTableItem
      80             : // ---------------------------------------------------------------------------
      81             : /**
      82             :  * @class GUIParameterTableItem
      83             :  * @brief Instance of a single line in a parameter window
      84             :  *
      85             :  * This class represents a single item of a parameter table and is an
      86             :  *  implementation of the GUIParameterTableItemInterface that allows different
      87             :  *  value-types.
      88             :  *
      89             :  * As some values may change over the simulation, this class holds the
      90             :  * information whether they change and how to ask for new values if they do.
      91             :  *
      92             :  * @see GUIParameterTracker
      93             :  * @see GUIParameterTableItemInterface
      94             :  */
      95             : template<class T>
      96             : class GUIParameterTableItem : public GUIParameterTableItemInterface {
      97             : public:
      98             :     /** @brief Constructor for changing (dynamic) values
      99             :      *
     100             :      * @param[in] table The table this item belongs to
     101             :      * @param[in] pos The row of the table this item fills
     102             :      * @param[in] name The name of the represented value
     103             :      * @param[in] dynamic Information whether this value changes over time
     104             :      * @param[in] src The value source
     105             :      * @todo Consider using a reference to the table
     106             :      * @todo Check whether the name should be stored in GUIParameterTableItemInterface
     107             :      */
     108           0 :     GUIParameterTableItem(FXTable* table, unsigned pos, const std::string& name,
     109             :                           bool dynamic, ValueSource<T>* src) :
     110           0 :         myAmDynamic(dynamic), myName(name), myTablePosition((FXint) pos), mySource(src),
     111           0 :         myValue(src->getValue()), myTable(table) {
     112           0 :         init(dynamic, toString<T>(src->getValue()));
     113           0 :     }
     114             : 
     115             :     /** @brief Constructor for non-changing (static) values
     116             :      *
     117             :      * @param[in] table The table this item belongs to
     118             :      * @param[in] pos The row of the table this item fills
     119             :      * @param[in] name The name of the represented value
     120             :      * @param[in] dynamic Information whether this value changes over time
     121             :      * @param[in] value The value
     122             :      * @todo Consider using a reference to the table
     123             :      * @todo Check whether the name should be stored in GUIParameterTableItemInterface
     124             :      * @todo Should never be dynamic!?
     125             :      */
     126           0 :     GUIParameterTableItem(FXTable* table, unsigned pos, const std::string& name,
     127             :                           bool dynamic, T value) :
     128           0 :         myAmDynamic(dynamic), myName(name), myTablePosition((FXint) pos), mySource(0),
     129           0 :         myValue(value), myTable(table) {
     130           0 :         init(dynamic, toString<T>(value));
     131           0 :     }
     132             : 
     133             :     /// @brief Destructor
     134           0 :     ~GUIParameterTableItem() {
     135           0 :         delete mySource;
     136           0 :     }
     137             : 
     138             :     /** @brief Initialises the line
     139             :      *
     140             :      * Fills the line using the name, the current value, and the information
     141             :      *  whether the value changes over time.
     142             :      *
     143             :      * @param[in] dynamic Information whether this value changes over time
     144             :      * @param[in] value The current (initial) value
     145             :      */
     146           0 :     void init(bool dynamic, std::string value) {
     147           0 :         myTable->setItemText(myTablePosition, 0, myName.c_str());
     148           0 :         myTable->setItemText(myTablePosition, 1, value.c_str());
     149           0 :         if (dynamic) {
     150           0 :             if (getdoubleSourceCopy() == nullptr) {
     151           0 :                 myTable->setItemIcon(myTablePosition, 2, GUIIconSubSys::getIcon(GUIIcon::YES));
     152             :             } else {
     153           0 :                 myTable->setItemIcon(myTablePosition, 2, GUIIconSubSys::getIcon(GUIIcon::TRACKER));
     154             :             }
     155             :         } else {
     156           0 :             myTable->setItemIcon(myTablePosition, 2, GUIIconSubSys::getIcon(GUIIcon::NO));
     157             :         }
     158           0 :         const int lineBreaks = (int)std::count(value.begin(), value.end(), '\n');
     159           0 :         if (lineBreaks > 0) {
     160           0 :             myTable->setRowHeight(myTablePosition, myTable->getRowHeight(myTablePosition) * (lineBreaks + 1));
     161             :         }
     162           0 :         myTable->setItemJustify(myTablePosition, 2, FXTableItem::CENTER_X | FXTableItem::CENTER_Y);
     163           0 :     }
     164             : 
     165             :     /// @brief Returns the information whether this item may change over time
     166           0 :     bool dynamic() const {
     167           0 :         return myAmDynamic;
     168             :     }
     169             : 
     170             :     /// @brief Returns the name of this value
     171           0 :     const std::string& getName() const {
     172           0 :         return myName;
     173             :     }
     174             : 
     175             :     /** @brief Resets the value if it's dynamic
     176             :      *
     177             :      * If the value is dynamic, the current value is retrieved from the value
     178             :      *  source. If it is different from the previous one (stored in myValue),
     179             :      *  it is stored in myValue and set as the current value text within the
     180             :      *  according table cell.
     181             :      */
     182           0 :     void update() {
     183           0 :         if (!dynamic() || mySource == 0) {
     184           0 :             return;
     185             :         }
     186           0 :         T value = mySource->getValue();
     187           0 :         if (value != myValue) {
     188           0 :             myValue = value;
     189           0 :             myTable->setItemText(myTablePosition, 1, toString<T>(myValue).c_str());
     190             :         }
     191             :     }
     192             : 
     193             :     /// @brief Returns a copy of the source if the value is dynamic
     194             :     ValueSource<T>* getSourceCopy() const {
     195             :         if (mySource == 0) {
     196             :             return 0;
     197             :         }
     198             :         return mySource->copy();
     199             :     }
     200             : 
     201             :     /// @brief Returns a double-typed copy of the source if the value is dynamic
     202           0 :     ValueSource<double>* getdoubleSourceCopy() const {
     203           0 :         if (mySource == 0) {
     204             :             return 0;
     205             :         }
     206           0 :         return mySource->makedoubleReturningCopy();
     207             :     }
     208             : 
     209             : private:
     210             :     /// @brief Information whether the value may change
     211             :     bool myAmDynamic;
     212             : 
     213             :     /// @brief The name of this value
     214             :     std::string myName;
     215             : 
     216             :     /// @brief The position within the table
     217             :     FXint myTablePosition;
     218             : 
     219             :     /// @brief The source to gain new values from; this source is==0 if the values are not dynamic
     220             :     ValueSource<T>* mySource;
     221             : 
     222             :     /// @brief A backup of the value to avoid the redrawing when nothing has changed
     223             :     T myValue;
     224             : 
     225             :     /// @brief The table this entry belongs to
     226             :     FXTable* myTable;
     227             : };

Generated by: LCOV version 1.14