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:
John Ralls 2020-03-16 10:27:59 -07:00
parent 5fd53c94de
commit 0106176436
3 changed files with 157 additions and 15 deletions

View File

@ -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>,
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::decay_t<OptType>> &&
! (std::is_same_v<std::decay_t<OptType>,
GncOptionValue<const QofInstance*>> ||
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>;

View File

@ -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;

View File

@ -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;