mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Change GncOptionUIItem to be a pure virtual class instead of a templated one.
Simplifies the design because derived classes can have whatever save UI class they need and implement the void(void) set_ui_item_from option and set_option_from_ui_item with whatever functions are appropriate for the UI class. No need for callbacks or std::function members.
This commit is contained in:
parent
00aa0f603d
commit
fce33799af
@ -25,17 +25,10 @@
|
||||
#define GNC_OPTION_UI_HPP_
|
||||
|
||||
#include "gnc-option-uitype.hpp"
|
||||
template <typename UIType>
|
||||
class GncUIItem
|
||||
{
|
||||
public:
|
||||
GncUIItem(UIType* widget) : m_widget{widget} {}
|
||||
UIType* m_widget;
|
||||
};
|
||||
|
||||
class GncUIType;
|
||||
using OptionUIItem = GncUIItem<GncUIType>;
|
||||
using OptionSyncFunc = std::function<void(OptionUIItem&, GncOption&)>;
|
||||
class GncOptionUIItem;
|
||||
using GncOptionUIItemPtr = std::unique_ptr<GncOptionUIItem>;
|
||||
|
||||
/**
|
||||
* Holds a pointer to the UI item which will control the option and an enum
|
||||
* representing the type of the option for dispatch purposes; all of that
|
||||
@ -47,47 +40,18 @@ using OptionSyncFunc = std::function<void(OptionUIItem&, GncOption&)>;
|
||||
* clear_ui_item function can be used as a weak_ptr's destruction callback to
|
||||
* ensure that the ptr will be nulled if the ui_item is destroyed elsewhere.
|
||||
*/
|
||||
|
||||
class GncOptionUIItem
|
||||
{
|
||||
public:
|
||||
GncOptionUIItem(OptionUIItem&& ui_item, GncOptionUIType type,
|
||||
OptionSyncFunc to_ui, OptionSyncFunc from_ui) :
|
||||
m_ui_item{std::move(ui_item)}, m_ui_type{type},
|
||||
m_set_ui_item_from_option{to_ui}, m_set_option_from_ui_item{from_ui} {}
|
||||
GncOptionUIItem(GncOptionUIType ui_type) :
|
||||
m_ui_item{nullptr}, m_ui_type{ui_type} {}
|
||||
GncOptionUIItem(const GncOptionUIItem&) = default;
|
||||
GncOptionUIItem(GncOptionUIItem&&) = default;
|
||||
~GncOptionUIItem() = default;
|
||||
GncOptionUIItem& operator=(const GncOptionUIItem&) = default;
|
||||
GncOptionUIItem& operator=(GncOptionUIItem&&) = default;
|
||||
GncOptionUIType get_ui_type() const { return m_ui_type; }
|
||||
const OptionUIItem& get_ui_item() const {return m_ui_item; }
|
||||
void clear_ui_item() { m_ui_item = nullptr; }
|
||||
void set_ui_item(OptionUIItem&& ui_item)
|
||||
{
|
||||
if (m_ui_type == GncOptionUIType::INTERNAL)
|
||||
{
|
||||
std::string error{"INTERNAL option, setting the UI item forbidden."};
|
||||
throw std::logic_error(std::move(error));
|
||||
}
|
||||
m_ui_item = std::move(ui_item);
|
||||
}
|
||||
void set_ui_item_from_option(GncOption& option)
|
||||
{
|
||||
m_set_ui_item_from_option(m_ui_item, option);
|
||||
}
|
||||
void set_option_from_ui_item(GncOption& option)
|
||||
{
|
||||
m_set_option_from_ui_item(m_ui_item, option);
|
||||
}
|
||||
private:
|
||||
OptionUIItem m_ui_item;
|
||||
GncOptionUIType m_ui_type;
|
||||
OptionSyncFunc m_set_ui_item_from_option;
|
||||
OptionSyncFunc m_set_option_from_ui_item;
|
||||
GncOptionUIItem() = default;
|
||||
virtual ~GncOptionUIItem() = default;
|
||||
virtual GncOptionUIType get_ui_type() const noexcept = 0;
|
||||
virtual void set_dirty(bool status) noexcept = 0;
|
||||
virtual bool get_dirty() const noexcept = 0;
|
||||
virtual void clear_ui_item() = 0;
|
||||
virtual void set_ui_item_from_option(GncOption& option) noexcept = 0;
|
||||
virtual void set_option_from_ui_item(GncOption& option) noexcept = 0;
|
||||
};
|
||||
|
||||
using GncOptionUIItemPtr = std::unique_ptr<GncOptionUIItem>;
|
||||
|
||||
#endif //GNC_OPTION_UI_HPP__
|
||||
|
Loading…
Reference in New Issue
Block a user