mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Provide GncOption::is_alternate() for GncOptionRangeValue<>.
Needed for GncOptionUIType::PLOT_SIZE to indicate whether the option value represents pixels or percent.
This commit is contained in:
parent
5fd53c94de
commit
0106176436
@ -107,6 +107,7 @@ struct OptionClassifier
|
||||
std::string m_doc_string;
|
||||
};
|
||||
|
||||
|
||||
#ifndef SWIG
|
||||
auto constexpr size_t_max = std::numeric_limits<std::size_t>::max();
|
||||
#endif
|
||||
@ -207,14 +208,18 @@ std::string qof_instance_to_string(const QofInstance* inst);
|
||||
* to parse the templates to figure out the symbols.
|
||||
*/
|
||||
#ifndef SWIG
|
||||
template<class OptionValueClass,
|
||||
template<class OptType,
|
||||
typename std::enable_if_t<std::is_base_of_v<OptionClassifier,
|
||||
std::decay_t<OptionValueClass>> &&
|
||||
!(std::is_same_v<std::decay_t<OptionValueClass>,
|
||||
std::decay_t<OptType>> &&
|
||||
! (std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValue<const QofInstance*>> ||
|
||||
std::is_same_v<std::decay_t<OptionValueClass>,
|
||||
GncOptionValidatedValue<const QofInstance*>>), int> = 0>
|
||||
std::ostream& operator<<(std::ostream& oss, const OptionValueClass& opt)
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValidatedValue<const QofInstance*>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<double>>), int> = 0>
|
||||
std::ostream& operator<<(std::ostream& oss, const OptType& opt)
|
||||
{
|
||||
oss << opt.get_value();
|
||||
return oss;
|
||||
@ -228,7 +233,11 @@ operator<< <GncOptionValue<bool>>(std::ostream& oss,
|
||||
return oss;
|
||||
}
|
||||
|
||||
template<class OptType, typename std::enable_if_t<std::is_same_v<std::decay_t<OptType>, GncOptionValidatedValue<const QofInstance*>> || std::is_same_v<std::decay_t<OptType>, GncOptionValue<const QofInstance*> >, int> = 0>
|
||||
template<class OptType,
|
||||
typename std::enable_if_t<std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValidatedValue<const QofInstance*>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValue<const QofInstance*> >, int> = 0>
|
||||
inline std::ostream&
|
||||
operator<< (std::ostream& oss, const OptType& opt)
|
||||
{
|
||||
@ -249,13 +258,18 @@ operator<< (std::ostream& oss, const OptType& opt)
|
||||
return oss;
|
||||
}
|
||||
|
||||
template<class OptionValueClass,
|
||||
typename std::enable_if_t<std::is_base_of_v<OptionClassifier, std::decay_t<OptionValueClass>> &&
|
||||
!(std::is_same_v<std::decay_t<OptionValueClass>,
|
||||
template<class OptType,
|
||||
typename std::enable_if_t<std::is_base_of_v<OptionClassifier,
|
||||
std::decay_t<OptType>> &&
|
||||
!(std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValue<const QofInstance*>> ||
|
||||
std::is_same_v<std::decay_t<OptionValueClass>,
|
||||
GncOptionValidatedValue<const QofInstance*>>), int> = 0>
|
||||
std::istream& operator>>(std::istream& iss, OptionValueClass& opt)
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValidatedValue<const QofInstance*>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<double>>), int> = 0>
|
||||
std::istream& operator>>(std::istream& iss, OptType& opt)
|
||||
{
|
||||
std::decay_t<decltype(opt.get_value())> value;
|
||||
iss >> value;
|
||||
@ -263,7 +277,12 @@ std::istream& operator>>(std::istream& iss, OptionValueClass& opt)
|
||||
return iss;
|
||||
}
|
||||
|
||||
template<class OptType, typename std::enable_if_t<std::is_same_v<std::decay_t<OptType>, GncOptionValidatedValue<const QofInstance*>> || std::is_same_v<std::decay_t<OptType>, GncOptionValue<const QofInstance*> >, int> = 0>
|
||||
template<class OptType,
|
||||
typename std::enable_if_t<std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValidatedValue<const QofInstance*>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionValue<const QofInstance*> >,
|
||||
int> = 0>
|
||||
std::istream&
|
||||
operator>> (std::istream& iss, OptType& opt)
|
||||
{
|
||||
@ -409,6 +428,11 @@ public:
|
||||
bool is_changed() const noexcept { return m_value != m_default_value; }
|
||||
GncOptionUIType get_ui_type() const noexcept { return m_ui_type; }
|
||||
void make_internal() { m_ui_type = GncOptionUIType::INTERNAL; }
|
||||
bool is_alternate() const noexcept { return m_alternate; }
|
||||
void set_alternate(bool value) noexcept {
|
||||
if (m_ui_type == GncOptionUIType::PLOT_SIZE)
|
||||
m_alternate = value;
|
||||
}
|
||||
private:
|
||||
GncOptionUIType m_ui_type = GncOptionUIType::NUMBER_RANGE;
|
||||
ValueType m_value;
|
||||
@ -416,8 +440,56 @@ private:
|
||||
ValueType m_min;
|
||||
ValueType m_max;
|
||||
ValueType m_step;
|
||||
bool m_alternate = false;
|
||||
};
|
||||
|
||||
template<class OptType,
|
||||
typename std::enable_if_t<std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<double>>,
|
||||
int> = 0>
|
||||
inline std::ostream&
|
||||
operator<< (std::ostream& oss, const OptType& opt)
|
||||
{
|
||||
if (opt.get_ui_type() == GncOptionUIType::PLOT_SIZE)
|
||||
oss << (opt.is_alternate() ? "pixels" : "percent") << " ";
|
||||
oss << opt.get_value();
|
||||
return oss;
|
||||
}
|
||||
|
||||
template<class OptType,
|
||||
typename std::enable_if_t<std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<double>>,
|
||||
int> = 0>
|
||||
inline std::istream&
|
||||
operator>> (std::istream& iss, OptType& opt)
|
||||
{
|
||||
if (opt.get_ui_type() == GncOptionUIType::PLOT_SIZE)
|
||||
{
|
||||
std::string alt;
|
||||
iss >> alt;
|
||||
opt.set_alternate(strncmp(alt.c_str(), "percent",
|
||||
strlen("percent")) == 0);
|
||||
}
|
||||
if constexpr (std::is_same_v<std::decay_t<OptType>,
|
||||
GncOptionRangeValue<double>>)
|
||||
{
|
||||
double d;
|
||||
iss >> d;
|
||||
opt.set_value(d);
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
iss >> i;
|
||||
opt.set_value(i);
|
||||
}
|
||||
return iss;
|
||||
}
|
||||
|
||||
using GncMultichoiceOptionEntry = std::tuple<const std::string,
|
||||
const std::string,
|
||||
const std::string>;
|
||||
|
@ -350,6 +350,31 @@ GncOption::account_type_list() const noexcept
|
||||
}, *m_option);
|
||||
}
|
||||
|
||||
bool
|
||||
GncOption::is_alternate() const noexcept
|
||||
{
|
||||
return std::visit([](auto& option) -> bool {
|
||||
if constexpr(std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<double>>)
|
||||
return option.is_alternate();
|
||||
return false;
|
||||
}, *m_option);
|
||||
}
|
||||
|
||||
void
|
||||
GncOption::set_alternate(bool alt) noexcept
|
||||
{
|
||||
std::visit([alt](auto& option) {
|
||||
if constexpr(std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<double>>)
|
||||
option.set_alternate(alt);
|
||||
}, *m_option);
|
||||
}
|
||||
|
||||
std::ostream&
|
||||
GncOption::out_stream(std::ostream& oss) const
|
||||
{
|
||||
@ -390,6 +415,19 @@ GncOption::to_scheme(std::ostream& oss) const
|
||||
(std::is_same_v<std::decay_t<decltype(option.get_value())>,
|
||||
std::string>)
|
||||
oss << '"' << option << '"';
|
||||
else if constexpr
|
||||
(std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<double>>)
|
||||
{
|
||||
if (option.get_ui_type() == GncOptionUIType::PLOT_SIZE)
|
||||
oss << "'(" << (option.is_alternate() ?
|
||||
"\"percent\" . " : "\"pixels\" . ");
|
||||
oss << option.get_value();
|
||||
if (option.get_ui_type() == GncOptionUIType::PLOT_SIZE)
|
||||
oss << ")";
|
||||
}
|
||||
else
|
||||
oss << option;
|
||||
return oss;
|
||||
@ -427,6 +465,36 @@ GncOption::from_scheme(std::istream& iss)
|
||||
std::getline(iss, input, '"');
|
||||
option.set_value(input);
|
||||
}
|
||||
else if constexpr
|
||||
(std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<int>> ||
|
||||
std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<double>>)
|
||||
{
|
||||
if (option.get_ui_type() == GncOptionUIType::PLOT_SIZE)
|
||||
{
|
||||
iss.ignore(3, '"');
|
||||
std::string alt;
|
||||
iss >> alt;
|
||||
option.set_alternate(
|
||||
strncmp(alt.c_str(), "pixels",
|
||||
strlen("pixels")) == 0);
|
||||
iss.ignore(4, ' ');
|
||||
}
|
||||
if constexpr(std::is_same_v<std::decay_t<decltype(option)>,
|
||||
GncOptionRangeValue<int>>)
|
||||
{
|
||||
int val;
|
||||
iss >> val;
|
||||
option.set_value(val);
|
||||
}
|
||||
else
|
||||
{
|
||||
double val;
|
||||
iss >> val;
|
||||
option.set_value(val);
|
||||
}
|
||||
}
|
||||
else
|
||||
iss >> option;
|
||||
return iss;
|
||||
|
@ -96,6 +96,8 @@ public:
|
||||
const char* permissible_value_name(std::size_t index) const;
|
||||
const char* permissible_value_description(std::size_t index) const;
|
||||
GList* account_type_list() const noexcept;
|
||||
bool is_alternate() const noexcept;
|
||||
void set_alternate(bool) noexcept;
|
||||
std::ostream& out_stream(std::ostream& oss) const;
|
||||
std::istream& in_stream(std::istream& iss);
|
||||
std::ostream& to_scheme(std::ostream& oss) const;
|
||||
|
Loading…
Reference in New Issue
Block a user