27 #include "gnc-option-ui.hpp" 29 static const char* log_module{
"gnc.app-utils.gnc-option"};
36 template <
typename ValueType,
37 typename std::enable_if_t<!is_OptionClassifier_v<ValueType>,
39 GncOption::GncOption(
const char* section,
const char* name,
40 const char* key,
const char* doc_string,
42 m_option{std::make_unique<GncOptionVariant>(
43 std::in_place_type<GncOptionValue<ValueType>>,
44 section, name, key, doc_string, value, ui_type)}
48 template <
typename ValueType> ValueType
49 GncOption::get_value()
const 52 [](
const auto option)->ValueType {
53 if constexpr (is_same_decayed_v<decltype(option.get_value()),
55 return option.get_value();
56 if constexpr (is_same_decayed_v<decltype(option),
59 if constexpr (is_same_decayed_v<ValueType,
61 return option.get_period();
62 if constexpr (
std::is_same_v<ValueType,
size_t>)
63 return option.get_period_index();
66 if constexpr (is_same_decayed_v<decltype(option),
69 if constexpr (std::is_same_v<ValueType, size_t>)
70 return option.get_index();
71 if constexpr (is_same_decayed_v<ValueType,
72 GncMultichoiceOptionIndexVec>)
73 return option.get_multiple();
79 template <
typename ValueType> ValueType
80 GncOption::get_default_value()
const 83 [](
const auto option)->ValueType {
84 if constexpr (is_same_decayed_v<decltype(option.get_value()),
86 return option.get_default_value();
87 if constexpr (is_same_decayed_v<decltype(option),
90 if constexpr (is_same_decayed_v<ValueType,
92 return option.get_default_period();
93 if constexpr (
std::is_same_v<ValueType,
size_t>)
94 return option.get_default_period_index();
98 (is_same_decayed_v<decltype(option),
100 is_same_decayed_v<ValueType,
101 GncMultichoiceOptionIndexVec>)
102 return option.get_default_multiple();
108 template <
typename ValueType>
void 109 GncOption::set_value(ValueType value)
112 [value](
auto& option) {
114 (is_same_decayed_v<decltype(option.get_value()), ValueType> ||
115 (is_same_decayed_v<decltype(option),
117 (is_same_decayed_v<ValueType, RelativeDatePeriod> ||
118 std::is_same_v<ValueType, size_t>)))
119 option.set_value(value);
120 if constexpr (is_same_decayed_v<decltype(option),
123 if constexpr (is_same_decayed_v<ValueType,
124 GncMultichoiceOptionIndexVec>)
125 option.set_multiple(value);
127 (
std::is_same_v<ValueType,
size_t> ||
128 is_same_decayed_v<ValueType,
std::
string> ||
129 std::is_same_v<
std::remove_cv<ValueType>,
char*>)
130 option.set_value(value);
135 template <typename ValueType>
void 136 GncOption::set_default_value(ValueType value)
139 [value](
auto& option) {
141 (is_same_decayed_v<decltype(option.get_value()), ValueType>||
143 (is_same_decayed_v<ValueType, RelativeDatePeriod> ||
144 std::is_same_v<ValueType, size_t>)))
145 option.set_default_value(value);
146 if constexpr (is_same_decayed_v<decltype(option),
149 if constexpr (is_same_decayed_v<ValueType,
150 GncMultichoiceOptionIndexVec>)
151 option.set_default_multiple(value);
153 (
std::is_same_v<ValueType,
size_t> ||
154 is_same_decayed_v<ValueType,
std::
string> ||
155 std::is_same_v<
std::remove_cv<ValueType>,
char*>)
156 option.set_default_value(value);
163 std::visit([](
auto& option) { option.reset_default_value(); }, *m_option);
166 template <
typename ValueType>
void 169 std::visit([&max, &min, &step](
const auto& option) {
171 (is_same_decayed_v<decltype(option),
173 option.get_limits(max, min, step);
178 GncOption::get_section()
const 180 return std::visit([](
const auto& option)->
const std::string& {
181 return option.m_section;
186 GncOption::get_name()
const 188 return std::visit([](
const auto& option)->
const std::string& {
189 return option.m_name;
194 GncOption::get_key()
const 196 return std::visit([](
const auto& option)->
const std::string& {
197 return option.m_sort_tag;
202 GncOption::get_docstring()
const 204 return std::visit([](
const auto& option)->
const std::string& {
205 return option.m_doc_string;
210 GncOption::set_ui_item(GncOptionUIItemPtr&& ui_item)
213 auto opt_ui_type = std::visit([](
const auto& option)->
GncOptionUIType {
214 return option.get_ui_type();
217 if (ui_item->get_ui_type() != opt_ui_type)
219 PERR(
"Setting option %s:%s UI element failed, mismatched UI types.",
220 get_section().c_str(), get_name().c_str());
224 m_ui_item = std::move(ui_item);
228 GncOption::set_ui_item_selectable(
bool selectable)
const noexcept
231 m_ui_item->set_selectable(selectable);
235 GncOption::get_ui_type()
const 238 return option.get_ui_type();
243 GncOption::get_ui_item()
const 245 return m_ui_item.get();
249 GncOption::set_ui_item_from_option()
253 m_ui_item->set_ui_item_from_option(*
this);
257 GncOption::set_option_from_ui_item()
261 m_ui_item->set_option_from_ui_item(*
this);
265 GncOption::make_internal()
269 PERR(
"Option %s:%s has a UI Element, can't be INTERNAL.",
270 get_section().c_str(), get_name().c_str());
273 std::visit([](
auto& option) {
274 option.make_internal();
279 GncOption::is_changed() const noexcept
281 return std::visit([](
const auto& option)->
bool {
282 return option.is_changed();
290 [](
const auto& option)->
bool {
291 if constexpr (is_same_decayed_v<decltype(option),
293 return option.is_multiselect();
299 template<
typename ValueType>
bool 303 [value] (
const auto& option) ->
bool {
304 if constexpr ((is_same_decayed_v<decltype(option),
306 is_same_decayed_v<ValueType, std::string>) ||
307 (is_same_decayed_v<decltype(option),
309 is_same_decayed_v<ValueType,
310 GncMultichoiceOptionIndexVec>) ||
311 (is_same_decayed_v<decltype(option),
313 is_same_decayed_v<ValueType, gnc_commodity*>))
314 return option.validate(value);
324 [] (
const auto& option) ->
size_t {
325 if constexpr (is_same_decayed_v<decltype(option),
327 is_same_decayed_v<decltype(option),
329 return option.num_permissible_values();
339 [&value] (
const auto& option) ->
size_t {
340 if constexpr (is_same_decayed_v<decltype(option),
342 is_same_decayed_v<decltype(option),
344 return option.permissible_value_index(value);
353 return std::visit([index] (
const auto& option) ->
const char* {
354 if constexpr (std::is_same_v<std::decay_t<decltype(option)>,
356 std::is_same_v<std::decay_t<decltype(option)>,
358 return option.permissible_value(index);
367 return std::visit([index] (
const auto& option) ->
const char* {
368 if constexpr (std::is_same_v<std::decay_t<decltype(option)>,
370 std::is_same_v<std::decay_t<decltype(option)>,
372 return option.permissible_value_name(index);
381 return std::visit([] (
const auto& option) -> GList* {
382 if constexpr (std::is_same_v<std::decay_t<decltype(option)>,
384 return option.account_type_list();
391 GncOption::is_alternate() const noexcept
393 return std::visit([](
auto& option) ->
bool {
394 if constexpr(is_RangeValue_v<decltype(option)>)
395 return option.is_alternate();
401 GncOption::set_alternate(
bool alt) noexcept
403 std::visit([alt](
auto& option) {
404 if constexpr(is_RangeValue_v<decltype(option)>)
405 option.set_alternate(alt);
412 if (m_option->valueless_by_exception())
413 return "Valueless Option";
414 return std::visit([&](
auto& option) -> std::string {
415 return option.serialize();
422 return std::visit([&str](
auto& option) ->
bool {
423 return option.deserialize(str);
430 return std::visit([&iss](
auto& option) -> std::istream& {
441 template GncOption::GncOption(
const char*,
const char*,
const char*,
445 template GncOption::GncOption(
const char*,
const char*,
const char*,
451 template GncOption::GncOption(
const char*,
const char*,
const char*,
453 template GncOption::GncOption(
const char*,
const char*,
const char*,
455 template GncOption::GncOption(
const char*,
const char*,
const char*,
458 template bool GncOption::get_value<bool>()
const;
459 template int GncOption::get_value<int>()
const;
460 template int64_t GncOption::get_value<int64_t>()
const;
461 template double GncOption::get_value<double>()
const;
462 template size_t GncOption::get_value<size_t>()
const;
463 template const char* GncOption::get_value<const char*>()
const;
464 template std::string GncOption::get_value<std::string>()
const;
465 template const QofInstance* GncOption::get_value<const QofInstance*>()
const;
466 template gnc_commodity* GncOption::get_value<gnc_commodity*>()
const;
467 template const Account* GncOption::get_value<const Account*>()
const;
469 template GncOptionAccountList GncOption::get_value<GncOptionAccountList>()
const;
470 template GncMultichoiceOptionIndexVec GncOption::get_value<GncMultichoiceOptionIndexVec>()
const;
471 template GncOptionReportPlacementVec GncOption::get_value<GncOptionReportPlacementVec>()
const;
473 template bool GncOption::get_default_value<bool>()
const;
474 template int GncOption::get_default_value<int>()
const;
475 template int64_t GncOption::get_default_value<int64_t>()
const;
476 template double GncOption::get_default_value<double>()
const;
477 template const char* GncOption::get_default_value<const char*>()
const;
478 template std::string GncOption::get_default_value<std::string>()
const;
479 template const QofInstance* GncOption::get_default_value<const QofInstance*>()
const;
480 template gnc_commodity* GncOption::get_default_value<gnc_commodity*>()
const;
481 template const Account* GncOption::get_default_value<const Account*>()
const;
483 template GncOptionAccountList GncOption::get_default_value<GncOptionAccountList>()
const;
484 template GncMultichoiceOptionIndexVec GncOption::get_default_value<GncMultichoiceOptionIndexVec>()
const;
485 template GncOptionReportPlacementVec GncOption::get_default_value<GncOptionReportPlacementVec>()
const;
487 template void GncOption::set_value(
bool);
488 template void GncOption::set_value(
int);
489 template void GncOption::set_value(int64_t);
490 template void GncOption::set_value(
double);
491 template void GncOption::set_value(
char*);
492 template void GncOption::set_value(
const char*);
493 template void GncOption::set_value(std::string);
494 template void GncOption::set_value(
const QofInstance*);
495 template void GncOption::set_value(gnc_commodity*);
496 template void GncOption::set_value(
const Account*);
498 template void GncOption::set_value(
size_t);
499 template void GncOption::set_value(GncOptionAccountList);
500 template void GncOption::set_value(GncMultichoiceOptionIndexVec);
501 template void GncOption::set_value(GncOptionReportPlacementVec);
503 template void GncOption::set_default_value(
bool);
504 template void GncOption::set_default_value(
int);
505 template void GncOption::set_default_value(int64_t);
506 template void GncOption::set_default_value(
double);
507 template void GncOption::set_default_value(
char*);
508 template void GncOption::set_default_value(
const char*);
509 template void GncOption::set_default_value(std::string);
510 template void GncOption::set_default_value(
const QofInstance*);
511 template void GncOption::set_default_value(
const Account*);
513 template void GncOption::set_default_value(
size_t);
514 template void GncOption::set_default_value(GncOptionAccountList);
515 template void GncOption::set_default_value(GncMultichoiceOptionIndexVec);
516 template void GncOption::set_default_value(GncOptionReportPlacementVec);
534 template GncOption* gnc_make_option<const std::string&>(
const char*,
540 template GncOption* gnc_make_option<bool>(
const char*,
const char*,
const char*,
542 template GncOption* gnc_make_option<int64_t>(
const char*,
const char*,
543 const char*,
const char*, int64_t,
bool is_multiselect() const noexcept
std::size_t num_permissible_values() const
Implemented only for GncOptionMultiselectValue.
bool deserialize(const std::string &str)
Set the option's value from a character sequence.
A legal date value is a pair of either a RelativeDatePeriod, the absolute flag and a time64...
const char * permissible_value(std::size_t index) const
Implemented only for GncOptionMultiselectValue.
std::size_t permissible_value_index(const char *value) const
Implemented only for GncOptionMultiselectValue.
const char * permissible_value_name(std::size_t index) const
Implemented only for GncOptionMultiselectValue.
#define PERR(format, args...)
Log a serious error.
Represents the public interface for an option.
Set one or more accounts on which to report, optionally restricted to certain account types...
C++ Public interface for individual options.
bool validate(ValueType value) const
Not implemented for GncOptionValue.
Multichoice options have a vector of valid options (GncMultichoiceOptionChoices) and validate the sel...
std::string serialize() const
Get a string suitable for storage representing the option's value.
RelativeDatePeriod
Reporting periods relative to the current date.
Implementation templates and specializtions for GncOption values.
class GncOptionCommodityValue Commodities are stored with their namespace and mnemonic instead of the...
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...
void get_limits(ValueType &, ValueType &, ValueType &) const noexcept
Implemented only for GncOptionNumericRange.
GncOptionUIType
Used by GncOptionClassifier to indicate to dialog-options what control should be displayed for the op...
std::istream & in_stream(std::istream &iss)
Set the option's value from an input stream.
GList * account_type_list() const noexcept
Implemented only for GncOptionAccountListValue.