LCOV - code coverage report
Current view: top level - libgnucash/engine - gnc-optiondb-impl.hpp (source / functions) Coverage Total Hit
Test: gnucash.info Lines: 41.9 % 31 13
Test Date: 2025-02-07 16:25:45 Functions: 63.6 % 11 7
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /********************************************************************\
       2                 :             :  * gnc-optiondb.hpp -- Collection of GncOption objects              *
       3                 :             :  * Copyright (C) 2019 John Ralls <jralls@ceridwen.us>               *
       4                 :             :  *                                                                  *
       5                 :             :  * This program is free software; you can redistribute it and/or    *
       6                 :             :  * modify it under the terms of the GNU General Public License as   *
       7                 :             :  * published by the Free Software Foundation; either version 2 of   *
       8                 :             :  * the License, or (at your option) any later version.              *
       9                 :             :  *                                                                  *
      10                 :             :  * This program is distributed in the hope that it will be useful,  *
      11                 :             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
      12                 :             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
      13                 :             :  * GNU General Public License for more details.                     *
      14                 :             :  *                                                                  *
      15                 :             :  * You should have received a copy of the GNU General Public License*
      16                 :             :  * along with this program; if not, contact:                        *
      17                 :             :  *                                                                  *
      18                 :             :  * Free Software Foundation           Voice:  +1-617-542-5942       *
      19                 :             :  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
      20                 :             :  * Boston, MA  02110-1301,  USA       gnu@gnu.org                   *
      21                 :             :  *                                                                  *
      22                 :             : \********************************************************************/
      23                 :             : /** @addtogroup Engine
      24                 :             :     @{ */
      25                 :             : /** @addtogroup Options
      26                 :             :     @{ */
      27                 :             : /** @file gnc-optiondb-impl.hpp
      28                 :             :     @brief Implementation details for GncOptionDB.
      29                 :             :     @author Copyright 2019-2021 John Ralls <jralls@ceridwen.us>
      30                 :             : */
      31                 :             : 
      32                 :             : #ifndef GNC_OPTIONDB_P_HPP_
      33                 :             : #define GNC_OPTIONDB_P_HPP_
      34                 :             : 
      35                 :             : #include "gnc-option.hpp"
      36                 :             : #include "gnc-option-impl.hpp"
      37                 :             : 
      38                 :             : #include <functional>
      39                 :             : #include <exception>
      40                 :             : #include <optional>
      41                 :             : #include <iostream>
      42                 :             : 
      43                 :             : #include <config.h>
      44                 :             : #include "qof.h"
      45                 :             : #include "gncInvoice.h"
      46                 :             : #include "gncCustomer.h"
      47                 :             : #include "gncEmployee.h"
      48                 :             : #include "gncJob.h"
      49                 :             : #include "gncVendor.h"
      50                 :             : #include "gncTaxTable.h"
      51                 :             : 
      52                 :             : using GncOptionVec = std::vector<GncOption>;
      53                 :             : 
      54                 :             : /** class GncOptionSection
      55                 :             :  *  The upper-level classification implementation. Contains the options for a
      56                 :             :  *  section; sections are displayed as separate tabs on the option dialog.
      57                 :             :  */
      58                 :             : class GncOptionSection
      59                 :             : {
      60                 :             :     std::string m_name;
      61                 :             :     GncOptionVec m_options;
      62                 :             : public:
      63                 :       31221 :     GncOptionSection(const char* name) : m_name{name}, m_options{} {}
      64                 :          24 :     ~GncOptionSection() = default;
      65                 :             : 
      66                 :             :     void foreach_option(std::function<void(GncOption&)> func);
      67                 :             :     void foreach_option(std::function<void(const GncOption&)> func) const;
      68                 :      763158 :     const std::string& get_name() const noexcept { return m_name; }
      69                 :             :     size_t get_num_options() const noexcept { return m_options.size(); }
      70                 :             :     void add_option(GncOption&& option);
      71                 :             :     void remove_option(const char* name);
      72                 :             :     const GncOption* find_option(const char* name) const;
      73                 :             : };
      74                 :             : 
      75                 :             : using GncOptionSectionPtr = std::shared_ptr<GncOptionSection>;
      76                 :             : 
      77                 :             : inline bool
      78                 :       52106 : operator<(const GncOptionSectionPtr& right, const GncOptionSectionPtr& left)
      79                 :             : {
      80                 :       52106 :     return right->get_name() < left->get_name();
      81                 :             : }
      82                 :             : 
      83                 :             : using GncOptionDBChangeCallback = void (*)(void* user_data);
      84                 :             : 
      85                 :             : struct GncOptionDBCallback
      86                 :             : {
      87                 :           0 :     GncOptionDBCallback(size_t id, GncOptionDBChangeCallback func,
      88                 :           0 :                               void* data) :
      89                 :           0 :         m_id{id}, m_func{func}, m_data{data} {}
      90                 :             :     ~GncOptionDBCallback() = default;
      91                 :             :     GncOptionDBCallback(const GncOptionDBCallback&) = delete;
      92                 :             :     GncOptionDBCallback(GncOptionDBCallback&&) = default;
      93                 :             :     GncOptionDBCallback& operator=(const GncOptionDBCallback&) = default;
      94                 :             :     GncOptionDBCallback& operator=(GncOptionDBCallback&&) = default;
      95                 :             : 
      96                 :             :     size_t m_id;
      97                 :             :     GncOptionDBChangeCallback m_func;
      98                 :             :     void* m_data;
      99                 :             : };
     100                 :             : 
     101                 :             : using GncCallbackVec = std::vector<GncOptionDBCallback>;
     102                 :             : 
     103                 :             : /** @class GncOptionDB
     104                 :             :  *  Holds all of the options for a book, report, or stylesheet, organized by
     105                 :             :  *  GncOptionSections.
     106                 :             :  */
     107                 :             : class GncOptionDB
     108                 :             : {
     109                 :             : public:
     110                 :             :     GncOptionDB();
     111                 :             :     GncOptionDB(QofBook* book);
     112                 :             :     ~GncOptionDB() = default;
     113                 :             : 
     114                 :             : /* The non-const version can't be redirected to the const one because the
     115                 :             :  * function parameters are incompatible.
     116                 :             :  */
     117                 :        2327 :     void foreach_section(std::function<void(GncOptionSectionPtr&)> func)
     118                 :             :     {
     119                 :       10638 :         for (auto& section : m_sections)
     120                 :        8311 :             func(section);
     121                 :        2327 :     }
     122                 :           0 :     void foreach_section(std::function<void(const GncOptionSectionPtr&)> func) const
     123                 :             :     {
     124                 :           0 :         for (auto& section : m_sections)
     125                 :           0 :             func(section);
     126                 :           0 :     }
     127                 :             :     size_t num_sections() const noexcept { return m_sections.size(); }
     128                 :             :     bool get_changed() const noexcept { return m_dirty; }
     129                 :             :     void register_option(const char* section, GncOption&& option);
     130                 :             :     void register_option(const char* section, GncOption* option);
     131                 :             :     void unregister_option(const char* section, const char* name);
     132                 :             :     void set_default_section(const char* section);
     133                 :             :     const GncOptionSection* const get_default_section() const noexcept;
     134                 :             :     std::string lookup_string_option(const char* section, const char* name);
     135                 :           0 :     bool set_string_option(const char* section, const char* name, const std::string& value)
     136                 :             :     {
     137                 :           0 :         return set_option<std::string>(section, name, value);
     138                 :             :     }
     139                 :             :     template <typename ValueType>
     140                 :           0 :     bool set_option(const char* section, const char* name, ValueType value)
     141                 :             :     {
     142                 :             :         try
     143                 :             :         {
     144                 :           0 :             auto option{find_option(section, name)};
     145                 :           0 :             if (!option)
     146                 :           0 :                 return false;
     147                 :           0 :             option->set_value(value);
     148                 :           0 :             return true;
     149                 :             :         }
     150                 :           0 :         catch(const std::invalid_argument& err)
     151                 :             :         {
     152                 :           0 :             printf("Set Failed: %s\n", err.what());
     153                 :           0 :             return false;
     154                 :             :         }
     155                 :             :     }
     156                 :             : //    void set_selectable(const char* section, const char* name);
     157                 :             :     void make_internal(const char* section, const char* name);
     158                 :             :     void commit() {};
     159                 :      226029 :     GncOptionSection* find_section(const std::string& sectname)
     160                 :             :     {
     161                 :      226029 :         return const_cast<GncOptionSection*>(static_cast<const GncOptionDB&>(*this).find_section(sectname));
     162                 :             :     }
     163                 :             :     const GncOptionSection* find_section(const std::string& sectname) const;
     164                 :      138114 :     GncOption* find_option(const std::string& section, const char* name)
     165                 :             :     {
     166                 :      138114 :         return const_cast<GncOption*>(static_cast<const GncOptionDB&>(*this).find_option(section, name));
     167                 :             :     }
     168                 :             :     const GncOption* find_option(const std::string& section, const char* name) const;
     169                 :             :     std::ostream& save_to_key_value(std::ostream& oss) const noexcept;
     170                 :             :     std::istream& load_from_key_value(std::istream& iss);
     171                 :             :     void save_to_kvp(QofBook* book, bool clear_book) const noexcept;
     172                 :             :     void load_from_kvp(QofBook* book) noexcept;
     173                 :             :     std::ostream& save_option_key_value(std::ostream& oss,
     174                 :             :                                         const std::string& section,
     175                 :             :                                         const std::string& name) const noexcept;
     176                 :             :     std::istream& load_option_key_value(std::istream& iss);
     177                 :             :     size_t register_callback(GncOptionDBChangeCallback, void*);
     178                 :             :     void unregister_callback(size_t);
     179                 :             :     void run_callbacks();
     180                 :             : private:
     181                 :             :     GncOptionSection* m_default_section;
     182                 :             :     std::vector<GncOptionSectionPtr> m_sections;
     183                 :             :     bool m_dirty = false;
     184                 :             :     GncCallbackVec m_callbacks{};
     185                 :             : 
     186                 :             :     std::function<GncOptionUIItem*()> m_get_ui_value;
     187                 :             :     std::function<void(GncOptionUIItem*)> m_set_ui_value;
     188                 :             : };
     189                 :             : 
     190                 :             : 
     191                 :             : #endif // GNC_OPTIONDB_P_HPP_
     192                 :             : /** @}
     193                 :             :     @} */
        

Generated by: LCOV version 2.0-1