GnuCash c935c2f+
Loading...
Searching...
No Matches
gnc-option.hpp
Go to the documentation of this file.
1/********************************************************************\
2 * gnc-option.hpp -- Application options system *
3 * Copyright (C) 2020 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\********************************************************************/
33#ifndef GNC_OPTION_HPP_
34#define GNC_OPTION_HPP_
35
36#include <glib.h>
37#include <any>
38#include <string>
39#include <iostream>
40#include <iomanip>
41#include <type_traits>
42#include <variant>
43#include <memory>
44#include <tuple>
45#include <cstdint>
46#include "gnc-option-ui.hpp"
47#include "gnc-option-date.hpp"
48#include "guid.hpp"
49
50struct OptionClassifier;
51class GncOptionUIItem;
52using GncOptionUIItemPtr = std::unique_ptr<GncOptionUIItem>;
53#ifndef SWIG //SWIG pulls in GncOwner from swig-engine.
54struct _gncOwner;
55using GncOwner = _gncOwner;
56struct _QofQuery;
57using QofQuery = _QofQuery;
58#endif
59struct QofInstance_s;
61template <typename ValueType> class GncOptionValue;
67template <typename ValueType> class GncOptionRangeValue;
70using GncOptionDateFormat = std::tuple<QofDateFormat, GNCDateMonthFormat, bool, std::string>;
71using GncOptionReportPlacement = std::tuple<uint32_t, uint32_t, uint32_t>;
72using GncOptionReportPlacementVec = std::vector<GncOptionReportPlacement>;
73template <typename T>
75{
76 static constexpr bool value =
77 std::is_base_of_v<OptionClassifier, std::decay_t<T>>;
78};
79
80template <typename T> inline constexpr bool
81is_OptionClassifier_v = is_OptionClassifier<T>::value;
82
83template <typename T, typename U>
85{
86 static constexpr bool value = std::is_same_v<std::decay_t<T>,
87 std::decay_t<U>>;
88};
89
90template <typename T, typename U> inline constexpr bool
91is_same_decayed_v = is_same_decayed<T, U>::value;
92
93template <typename T>
95{
96 static constexpr bool value =
97 (is_same_decayed_v<T, GncOptionRangeValue<int>> ||
98 is_same_decayed_v<T, GncOptionRangeValue<double>>);
99};
100
101template <typename T> inline constexpr bool
102is_RangeValue_v = is_RangeValue<T>::value;
103
104
105using GncOptionVariant = std::variant<GncOptionValue<std::string>,
120
121using GncOptionVariantPtr = std::unique_ptr<GncOptionVariant>;
122
123enum class GncOptionMultichoiceKeyType
124{
125 SYMBOL,
126 STRING,
127 NUMBER,
128};
129
137{
138public:
139 template <typename OptionType,
140 typename std::enable_if_t<is_OptionClassifier_v<OptionType>,
141 int> = 0>
142
143 GncOption(OptionType option) :
144 m_option{std::make_unique<GncOptionVariant>(option)} {}
145 template <typename ValueType,
146 typename std::enable_if_t<!is_OptionClassifier_v<ValueType>,
147 int> = 0>
148 GncOption(const char* section, const char* name,
149 const char* key, const char* doc_string,
150 ValueType value,
151 GncOptionUIType ui_type = GncOptionUIType::INTERNAL);
152 template <typename ValueType> void set_value(ValueType value);
153 template <typename ValueType> void set_default_value(ValueType value);
154 template <typename ValueType> ValueType get_default_value() const;
155 template <typename ValueType> ValueType get_value() const;
156 void reset_default_value();
157
158 const std::string& get_section() const;
159 const std::string& get_name() const;
160 const std::string& get_key() const;
161 const std::string& get_docstring() const;
162 void set_ui_item(GncOptionUIItemPtr&& ui_elem);
163 const GncOptionUIType get_ui_type() const;
164 void set_ui_item_selectable(bool) const noexcept;
165 GncOptionUIItem* const get_ui_item() const;
166 void set_ui_item_from_option();
167 void set_option_from_ui_item();
168 void make_internal();
169 bool is_internal();
171 void mark_saved() noexcept;
173 bool is_dirty() const noexcept;
175 bool is_changed() const noexcept;
179 bool is_multiselect() const noexcept;
181 template <typename ValueType> void get_limits(ValueType&, ValueType&,
182 ValueType&) const noexcept;
184 template <typename ValueType> bool validate(ValueType value) const;
186 uint16_t num_permissible_values() const;
188 uint16_t permissible_value_index(const char* value) const;
190 const char* permissible_value(uint16_t index) const;
192 const char* permissible_value_name(uint16_t index) const;
194 GList* account_type_list() const noexcept;
195 bool is_alternate() const noexcept;
196 void set_alternate(bool) noexcept;
200 std::string serialize() const;
205 bool deserialize(const std::string& str);
210 std::istream& in_stream(std::istream& iss);
211 friend GncOptionVariant& swig_get_option(GncOption*);
212 void set_widget_changed (std::any cb) { m_widget_changed = cb; }
213 std::any& get_widget_changed () { return m_widget_changed; }
214private:
215 inline static const std::string c_empty_string{""};
216 GncOptionVariantPtr m_option;
217 GncOptionUIItemPtr m_ui_item{nullptr};
218 std::any m_widget_changed{};
219};
220
221inline bool
222operator<(const GncOption& right, const GncOption& left)
223{
224 return right.get_key() < left.get_key();
225}
226
227inline std::ostream&
228operator<<(std::ostream& oss, const GncOption& opt)
229{
230 oss << opt.serialize();
231 return oss;
232}
233
234inline std::istream&
235operator>>(std::istream& iss, GncOption& opt)
236{
237 return opt.in_stream(iss);
238}
239
240inline std::ostream&
241output_color_value(std::ostream& oss, const std::string& value)
242{
243 oss << "'(";
244 oss << std::fixed << std::showpoint << std::setprecision(1);
245 auto len{value.length() > 8 ? 8 : value.length()};
246 for (size_t i{}; i < len; i += 2)
247 {
248 oss << static_cast<float>(stoi(value.substr(i, 2), nullptr, 16));
249 if (i < 6)
250 oss << " ";
251 }
252 if (len < 8)
253 oss << 256.0;
254 oss << ")";
255 return oss;
256}
257
263template<typename ValueType> GncOption*
264gnc_make_option(const char* section, const char* name,
265 const char* key, const char* doc_string,
266 ValueType value, GncOptionUIType ui_type)
267{
268 return new GncOption(section, name, key, doc_string, value, ui_type);
269}
270
271#endif //GNC_OPTION_HPP_
272
Set one or more accounts on which to report, optionally restricted to certain account types.
class GncOptionCommodityValue Commodities are stored with their namespace and mnemonic instead of the...
A legal date value is a pair of either a RelativeDatePeriod, the absolute flag and a time64,...
Multichoice options have a vector of valid options (GncMultichoiceOptionChoices) and validate the sel...
Used for numeric ranges and plot sizes.
Holds a pointer to the UI item which will control the option and an enum representing the type of the...
The generic option-value class.
Represents the public interface for an option.
Relative date enumeration and manipulation functions.
bool validate(ValueType value) const
Not implemented for GncOptionValue.
void get_limits(ValueType &, ValueType &, ValueType &) const noexcept
Implemented only for GncOptionNumericRange.
GList * account_type_list() const noexcept
Implemented only for GncOptionAccountListValue.
void mark_saved() noexcept
Mark the option as needing to be saved.
bool is_dirty() const noexcept
const char * permissible_value(uint16_t index) const
Implemented only for GncOptionMultiselectValue.
const char * permissible_value_name(uint16_t index) const
Implemented only for GncOptionMultiselectValue.
std::istream & in_stream(std::istream &iss)
Set the option's value from an input stream.
bool deserialize(const std::string &str)
Set the option's value from a character sequence.
bool is_multiselect() const noexcept
uint16_t permissible_value_index(const char *value) const
Implemented only for GncOptionMultiselectValue.
bool is_changed() const noexcept
uint16_t num_permissible_values() const
Implemented only for GncOptionMultiselectValue.
std::string serialize() const
Get a string suitable for storage representing the option's value.
GncOptionUIType
Used by GncOptionClassifier to indicate to dialog-options what control should be displayed for the op...
GncOption * gnc_make_option(const char *section, const char *name, const char *key, const char *doc_string, ValueType value, GncOptionUIType ui_type)
Free function wrapping GncOption's constructor.
This class is the parent of all option implementations.
A Query.
Definition qofquery.cpp:75