2019-07-09 11:40:29 -05:00
|
|
|
/********************************************************************\
|
|
|
|
* gnc-option.hpp -- Application options system *
|
2020-01-27 15:40:39 -06:00
|
|
|
* Copyright (C) 2020 John Ralls <jralls@ceridwen.us> *
|
2019-07-09 11:40:29 -05:00
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or *
|
|
|
|
* modify it under the terms of the GNU General Public License as *
|
|
|
|
* published by the Free Software Foundation; either version 2 of *
|
|
|
|
* the License, or (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
* This program is distributed in the hope that it will be useful, *
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
* GNU General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU General Public License*
|
|
|
|
* along with this program; if not, contact: *
|
|
|
|
* *
|
|
|
|
* Free Software Foundation Voice: +1-617-542-5942 *
|
|
|
|
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
|
|
|
|
* Boston, MA 02110-1301, USA gnu@gnu.org *
|
|
|
|
* *
|
|
|
|
\********************************************************************/
|
|
|
|
|
|
|
|
#ifndef GNC_OPTION_HPP_
|
|
|
|
#define GNC_OPTION_HPP_
|
|
|
|
|
2020-02-18 16:27:41 -06:00
|
|
|
extern "C"
|
|
|
|
{
|
|
|
|
#include <glib.h>
|
|
|
|
}
|
|
|
|
|
2019-07-09 11:40:29 -05:00
|
|
|
#include <string>
|
2019-11-22 17:45:42 -06:00
|
|
|
#include <iostream>
|
2020-01-27 15:40:39 -06:00
|
|
|
#include <variant>
|
|
|
|
#include <memory>
|
|
|
|
#include "gnc-option-uitype.hpp"
|
2020-03-05 20:06:46 -06:00
|
|
|
#include "gnc-option-date.hpp"
|
2019-07-09 11:40:29 -05:00
|
|
|
|
2019-10-03 15:30:49 -05:00
|
|
|
class GncOptionUIItem;
|
2020-02-11 15:35:27 -06:00
|
|
|
using GncOptionUIItemPtr = std::unique_ptr<GncOptionUIItem>;
|
2020-01-27 15:40:39 -06:00
|
|
|
struct QofInstance_s;
|
|
|
|
using QofInstance = QofInstance_s;
|
|
|
|
template <typename ValueType> class GncOptionValue;
|
|
|
|
class GncOptionAccountValue;
|
|
|
|
class GncOptionMultichoiceValue;
|
|
|
|
template <typename ValueType> class GncOptionRangeValue;
|
|
|
|
template <typename ValueType> class GncOptionValidatedValue;
|
|
|
|
class GncOptionDateValue;
|
2019-10-03 15:30:49 -05:00
|
|
|
|
2020-01-27 15:40:39 -06:00
|
|
|
using GncOptionVariant = std::variant<GncOptionValue<std::string>,
|
|
|
|
GncOptionValue<bool>,
|
|
|
|
GncOptionValue<int64_t>,
|
|
|
|
GncOptionValue<const QofInstance*>,
|
|
|
|
GncOptionAccountValue,
|
|
|
|
GncOptionMultichoiceValue,
|
|
|
|
GncOptionRangeValue<int>,
|
|
|
|
GncOptionRangeValue<double>,
|
|
|
|
GncOptionValidatedValue<const QofInstance*>,
|
|
|
|
GncOptionDateValue>;
|
2019-12-05 19:47:30 -06:00
|
|
|
|
2020-01-27 15:40:39 -06:00
|
|
|
using GncOptionVariantPtr = std::unique_ptr<GncOptionVariant>;
|
2019-07-09 11:40:29 -05:00
|
|
|
|
2020-01-27 15:40:39 -06:00
|
|
|
class GncOption
|
2019-07-09 11:40:29 -05:00
|
|
|
{
|
|
|
|
public:
|
2020-01-27 15:40:39 -06:00
|
|
|
template <typename OptionType>
|
|
|
|
GncOption(OptionType option) :
|
|
|
|
m_option{std::make_unique<GncOptionVariant>(option)} {}
|
|
|
|
template <typename ValueType>
|
|
|
|
GncOption(const char* section, const char* name,
|
|
|
|
const char* key, const char* doc_string,
|
|
|
|
ValueType value,
|
|
|
|
GncOptionUIType ui_type = GncOptionUIType::INTERNAL);
|
|
|
|
template <typename ValueType> void set_value(ValueType value);
|
|
|
|
template <typename ValueType> ValueType get_default_value() const;
|
|
|
|
template <typename ValueType> ValueType get_value() const;
|
2020-04-05 11:07:34 -05:00
|
|
|
void reset_default_value();
|
2020-01-27 15:40:39 -06:00
|
|
|
|
|
|
|
const std::string& get_section() const;
|
|
|
|
const std::string& get_name() const;
|
|
|
|
const std::string& get_key() const;
|
|
|
|
const std::string& get_docstring() const;
|
2020-02-11 15:35:27 -06:00
|
|
|
void set_ui_item(GncOptionUIItemPtr&& ui_elem);
|
2020-01-27 15:40:39 -06:00
|
|
|
const GncOptionUIType get_ui_type() const;
|
2020-03-24 13:06:57 -05:00
|
|
|
GncOptionUIItem* const get_ui_item() const;
|
2020-02-11 15:35:27 -06:00
|
|
|
void set_ui_item_from_option();
|
|
|
|
void set_option_from_ui_item();
|
2020-01-27 15:40:39 -06:00
|
|
|
void make_internal();
|
|
|
|
bool is_changed() const noexcept;
|
2020-03-10 16:48:06 -05:00
|
|
|
bool is_multiselect() const noexcept;
|
2020-03-15 15:39:34 -05:00
|
|
|
template <typename ValueType> void get_limits(ValueType&, ValueType&,
|
|
|
|
ValueType&) const noexcept;
|
2020-01-27 15:40:39 -06:00
|
|
|
template <typename ValueType> bool validate(ValueType value) const;
|
|
|
|
std::size_t num_permissible_values() const;
|
2020-03-05 19:55:15 -06:00
|
|
|
std::size_t permissible_value_index(const char* value) const;
|
|
|
|
const char* permissible_value(std::size_t index) const;
|
|
|
|
const char* permissible_value_name(std::size_t index) const;
|
|
|
|
const char* permissible_value_description(std::size_t index) const;
|
2020-02-18 16:27:41 -06:00
|
|
|
GList* account_type_list() const noexcept;
|
2020-03-16 12:27:59 -05:00
|
|
|
bool is_alternate() const noexcept;
|
|
|
|
void set_alternate(bool) noexcept;
|
2020-01-27 15:40:39 -06:00
|
|
|
std::ostream& out_stream(std::ostream& oss) const;
|
|
|
|
std::istream& in_stream(std::istream& iss);
|
|
|
|
std::ostream& to_scheme(std::ostream& oss) const;
|
|
|
|
std::istream& from_scheme(std::istream& iss);
|
2020-02-20 14:09:21 -06:00
|
|
|
|
|
|
|
|
|
|
|
friend GncOptionVariant& swig_get_option(GncOption*);
|
|
|
|
|
2019-07-09 11:40:29 -05:00
|
|
|
private:
|
2020-01-27 15:40:39 -06:00
|
|
|
inline static const std::string c_empty_string{""};
|
|
|
|
GncOptionVariantPtr m_option;
|
2020-02-11 15:35:27 -06:00
|
|
|
GncOptionUIItemPtr m_ui_item{nullptr};
|
2019-07-09 11:40:29 -05:00
|
|
|
};
|
|
|
|
|
2019-12-03 13:14:06 -06:00
|
|
|
inline std::ostream&
|
2020-01-27 15:40:39 -06:00
|
|
|
operator<<(std::ostream& oss, const GncOption& opt)
|
2019-12-03 13:14:06 -06:00
|
|
|
{
|
2020-01-27 15:40:39 -06:00
|
|
|
return opt.out_stream(oss);
|
2019-12-03 13:14:06 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
inline std::istream&
|
2020-01-27 15:40:39 -06:00
|
|
|
operator>>(std::istream& iss, GncOption& opt)
|
2019-12-03 13:14:06 -06:00
|
|
|
{
|
2020-01-27 15:40:39 -06:00
|
|
|
return opt.in_stream(iss);
|
2019-11-22 17:45:42 -06:00
|
|
|
}
|
2019-10-29 18:34:44 -05:00
|
|
|
|
2019-11-22 17:45:42 -06:00
|
|
|
|
2019-07-09 11:40:29 -05:00
|
|
|
#endif //GNC_OPTION_HPP_
|