From 4146251cc79272df458cbfc509eb2ab5bdc89bc6 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sun, 29 Sep 2019 10:28:04 -0700 Subject: [PATCH] Add GncOptionUIItem manipulation to GncOptionDB. --- libgnucash/app-utils/gnc-optiondb.cpp | 58 +++++++++++++++--- libgnucash/app-utils/gnc-optiondb.hpp | 12 +++- .../app-utils/test/gtest-gnc-optiondb.cpp | 59 +++++++++++++++++++ 3 files changed, 120 insertions(+), 9 deletions(-) diff --git a/libgnucash/app-utils/gnc-optiondb.cpp b/libgnucash/app-utils/gnc-optiondb.cpp index d4559374db..b7cb5ae74a 100644 --- a/libgnucash/app-utils/gnc-optiondb.cpp +++ b/libgnucash/app-utils/gnc-optiondb.cpp @@ -78,6 +78,50 @@ GncOptionDB::get_default_section() const noexcept return &(m_default_section.get()); return nullptr; } + +void +GncOptionDB::set_ui_item(const char* section, const char* name, void* ui_item) +{ + auto option = find_option(section, name); + if (!option) return; + option->set_ui_item(ui_item); +} + +void* const +GncOptionDB::get_ui_item(const char* section, const char* name) +{ + auto option = find_option(section, name); + if (!option) return nullptr; + return option->get_ui_item(); +} + +GncOptionUIType +GncOptionDB::get_ui_type(const char* section, const char* name) +{ + auto option = find_option(section, name); + if (!option) return GncOptionUIType::INTERNAL; + return option->get_ui_type(); +} + +void +GncOptionDB::set_ui_from_option(const char* section, const char* name, + std::function func) +{ + auto option = find_option(section, name); + if (!option) return; + func(option.get()); +} + +void +GncOptionDB::set_option_from_ui(const char* section, const char* name, + std::function func) +{ + auto option = find_option(section, name); + if (!option) return; + func(option.get()); +} + + boost::optional GncOptionDB::find_section(const char* section) { @@ -145,14 +189,14 @@ GncOptionDB::commit() { } -GncOptionDB* +GncOptionDBPtr gnc_option_db_new(void) { - return new GncOptionDB; + return GncOptionDBPtr{new GncOptionDB}; } void -gnc_register_string_option(GncOptionDB* db, const char* section, +gnc_register_string_option(const GncOptionDBPtr& db, const char* section, const char* name, const char* key, const char* doc_string, std::string value) { @@ -162,7 +206,7 @@ gnc_register_string_option(GncOptionDB* db, const char* section, } void -gnc_register_text_option(GncOptionDB* db, const char* section, const char* name, +gnc_register_text_option(const GncOptionDBPtr& db, const char* section, const char* name, const char* key, const char* doc_string, std::string value) { @@ -173,7 +217,7 @@ gnc_register_text_option(GncOptionDB* db, const char* section, const char* name, } void -gnc_register_budget_option(GncOptionDB* db, const char* section, +gnc_register_budget_option(const GncOptionDBPtr& db, const char* section, const char* name, const char* key, const char* doc_string, GncBudget *value) { @@ -183,7 +227,7 @@ gnc_register_budget_option(GncOptionDB* db, const char* section, } void -gnc_register_commodity_option(GncOptionDB* db, const char* section, +gnc_register_commodity_option(const GncOptionDBPtr& db, const char* section, const char* name, const char* key, const char* doc_string, gnc_commodity *value) { @@ -194,7 +238,7 @@ gnc_register_commodity_option(GncOptionDB* db, const char* section, void -gnc_register_currency_option(GncOptionDB* db, const char* section, +gnc_register_currency_option(const GncOptionDBPtr& db, const char* section, const char* name, const char* key, const char* doc_string, gnc_commodity *value) { diff --git a/libgnucash/app-utils/gnc-optiondb.hpp b/libgnucash/app-utils/gnc-optiondb.hpp index 293dc0f638..c81fd1cb1b 100644 --- a/libgnucash/app-utils/gnc-optiondb.hpp +++ b/libgnucash/app-utils/gnc-optiondb.hpp @@ -46,6 +46,14 @@ public: void unregister_option(const char* section, const char* name); void set_default_section(const char* section); const GncOptionSection* const get_default_section() const noexcept; + void set_ui_item(const char* section, const char* name, void* ui_item); + void* const get_ui_item(const char* section, const char* name); + GncOptionUIType get_ui_type(const char* section, const char* name); + void set_ui_from_option(const char* section, const char* name, + std::function func); + void set_option_from_ui(const char* section, const char* name, + std::function func); + SCM lookup_option(const char* section, const char* name); std::string lookup_string_option(const char* section, const char* name); bool set_option(const char* section, const char* name, SCM value); @@ -78,8 +86,8 @@ void gnc_register_string_option(const GncOptionDBPtr& db, const char* section, const char* doc_string, std::string value); void gnc_register_text_option(const GncOptionDBPtr& db, const char* section, - const char* name, const char* key, - const char* doc_string, std::string value); + const char* name, const char* key, + const char* doc_string, std::string value); void gnc_register_budget_option(const GncOptionDBPtr& db, const char* section, const char* name, const char* key, diff --git a/libgnucash/app-utils/test/gtest-gnc-optiondb.cpp b/libgnucash/app-utils/test/gtest-gnc-optiondb.cpp index e65629ee2b..86a8390e61 100644 --- a/libgnucash/app-utils/test/gtest-gnc-optiondb.cpp +++ b/libgnucash/app-utils/test/gtest-gnc-optiondb.cpp @@ -68,3 +68,62 @@ TEST_F(GncOptionDBTest, test_register_string_option) std::string{"waldo"}); EXPECT_STREQ("waldo", m_db->lookup_string_option("foo", "bar").c_str()); } + +class GncUIType +{ +public: + void set_value(const std::string& value) { m_value = value; } + const std::string& get_value() const { return m_value; } +private: + std::string m_value; +}; + +class GncOptionDBUITest : public ::testing::Test +{ +protected: + GncOptionDBUITest() : m_db{gnc_option_db_new()} + { + gnc_register_string_option(m_db, "foo", "bar", "baz", "Phony Option", + std::string{"waldo"}); + gnc_register_text_option(m_db, "foo", "sausage", "links", + "Phony Option", std::string{"waldo"}); + gnc_register_string_option(m_db, "qux", "grault", "baz", "Phony Option", + std::string{""}); + gnc_register_text_option(m_db, "qux", "garply", "fred", + "Phony Option", std::string{"waldo"}); + } + + GncOptionDBPtr m_db; +}; + +TEST_F(GncOptionDBUITest, test_set_ui_item) +{ + GncUIType entry; + m_db->set_ui_item("foo", "bar", &entry); + EXPECT_EQ(&entry, static_cast(m_db->get_ui_item("foo", "bar"))); +} + +TEST_F(GncOptionDBUITest, test_ui_value_from_option) +{ + GncUIType entry; + const char* value{"waldo"}; + m_db->set_ui_item("foo", "bar", &entry); + m_db->set_ui_from_option("foo", "bar", [](GncOption& option){ + auto ui_item = static_cast(option.get_ui_item()); + ui_item->set_value(option.get_value()); + }); + EXPECT_STREQ(value, entry.get_value().c_str()); +} + +TEST_F(GncOptionDBUITest, test_option_value_from_ui) +{ + GncUIType entry; + const char* value{"pepper"}; + m_db->set_ui_item("foo", "bar", &entry); + entry.set_value(value); + m_db->set_option_from_ui("foo", "bar", [](GncOption& option){ + auto ui_item = static_cast(option.get_ui_item()); + option.set_value(ui_item->get_value()); + }); + EXPECT_STREQ(value, m_db->lookup_string_option("foo", "bar").c_str()); +}