diff --git a/bindings/guile/gnc-optiondb.i b/bindings/guile/gnc-optiondb.i index 12aaa02872..a0c80ee54c 100644 --- a/bindings/guile/gnc-optiondb.i +++ b/bindings/guile/gnc-optiondb.i @@ -749,6 +749,7 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB); %ignore gnc_register_font_option(GncOptionDB*, const char*, const char*, const char*, const char*, std::string); %ignore gnc_register_budget_option(GncOptionDB*, const char*, const char*, const char*, const char*, GncBudget*); %ignore gnc_register_commodity_option(GncOptionDB*, const char*, const char*, const char*, const char*, gnc_commodity*); +%ignore gnc_register_commodity_option(GncOptionDB*, const char*, const char*, const char*, const char*, const char*); %ignore gnc_register_simple_boolean_option(GncOptionDB*, const char* section, const char* name, const char* key, const char* doc_string, bool value); %ignore gnc_register_complex_boolean_option(GncOptionDB*, const char* section, const char* name, const char* key, const char* doc_string, bool value); %ignore gnc_register_pixmap_option(GncOptionDB*, const char*, const char*, const char*, const char*, std::string); @@ -761,6 +762,7 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB); %ignore gnc_register_query_option(GncOptionDB*, const char*, const char*, const char*, const char*, QofQuery*); %ignore gnc_register_color_option(GncOptionDB*, const char*, const char*, const char*, const char*, std::string); %ignore gnc_register_currency_option(GncOptionDB*, const char*, const char*, const char*, const char*, gnc_commodity*); +%ignore gnc_register_currency_option(GncOptionDB*, const char*, const char*, const char*, const char*, const char*); %ignore gnc_register_invoice_option(GncOptionDB*, const char*, const char*, const char*, const char*, GncInvoice*); %ignore gnc_register_taxtable_option(GncOptionDB*, const char*, const char*, const char*, const char*, GncTaxTable*); %ignore gnc_register_counter_option(GncOptionDB*, const char*, const char*, const char*, const char*, double); diff --git a/libgnucash/app-utils/gnc-optiondb.cpp b/libgnucash/app-utils/gnc-optiondb.cpp index 199f5f1757..82d78cce52 100644 --- a/libgnucash/app-utils/gnc-optiondb.cpp +++ b/libgnucash/app-utils/gnc-optiondb.cpp @@ -33,6 +33,10 @@ #include "gnc-optiondb-impl.hpp" #include "gnc-option-ui.hpp" +extern "C" +{ +#include +} constexpr const char* log_module{G_LOG_DOMAIN}; constexpr auto stream_max = std::numeric_limits::max(); @@ -632,6 +636,30 @@ gnc_register_commodity_option(GncOptionDB* db, const char* section, db->register_option(section, std::move(option)); } +void +gnc_register_commodity_option(GncOptionDB* db, const char* section, + const char* name, const char* key, + const char* doc_string, const char* value) +{ + gnc_commodity* commodity{}; + const auto book{qof_session_get_book(gnc_get_current_session())}; + const auto commodity_table{gnc_commodity_table_get_table(book)}; + const auto namespaces{gnc_commodity_table_get_namespaces(commodity_table)}; + for (auto node = namespaces; node && commodity == nullptr; + node = g_list_next(node)) + { + commodity = gnc_commodity_table_lookup(commodity_table, + (const char*)(node->data), + value); + if (commodity) + break; + } + GncOption option{GncOptionCommodityValue{section, name, key, doc_string, + commodity, + GncOptionUIType::COMMODITY}}; + db->register_option(section, std::move(option)); +} + void gnc_register_simple_boolean_option(GncOptionDB* db, const char* section, const char* name, @@ -901,7 +929,23 @@ gnc_register_currency_option(GncOptionDB* db, const char* section, const char* doc_string, gnc_commodity *value) { GncOption option{GncOptionCommodityValue{ - section, name, key, doc_string, value,GncOptionUIType::CURRENCY + section, name, key, doc_string, value, GncOptionUIType::CURRENCY + }}; + db->register_option(section, std::move(option)); +} + +void +gnc_register_currency_option(GncOptionDB* db, const char* section, + const char* name, const char* key, + const char* doc_string, const char* value) +{ + const auto book{qof_session_get_book(gnc_get_current_session())}; + const auto commodity_table{gnc_commodity_table_get_table(book)}; + const auto commodity = gnc_commodity_table_lookup(commodity_table, + "CURRENCY", + value); + GncOption option{GncOptionCommodityValue{ + section, name, key, doc_string, commodity, GncOptionUIType::CURRENCY }}; db->register_option(section, std::move(option)); } diff --git a/libgnucash/app-utils/gnc-optiondb.hpp b/libgnucash/app-utils/gnc-optiondb.hpp index 11b00e1762..32f7981c12 100644 --- a/libgnucash/app-utils/gnc-optiondb.hpp +++ b/libgnucash/app-utils/gnc-optiondb.hpp @@ -203,6 +203,28 @@ inline void gnc_register_commodity_option(const GncOptionDBPtr& db, gnc_register_commodity_option(db.get(), section, name, key, doc_string, value); } +/** + * As above but with a const char* value, which should be the symbol + * for the commodity. All security editor namespaces will be searched + * to retrieve it. + */ +void gnc_register_commodity_option(GncOptionDB* db, + const char* section, const char* name, + const char* key, const char* doc_string, + const char* value); + +/** + * As above but takes a const GncOptionDBPtr& (const std::unique_ptr&) for calling from C++. + */ +inline void gnc_register_commodity_option(const GncOptionDBPtr& db, + const char* section, + const char* name, const char* key, + const char* doc_string, + const char* value) +{ + gnc_register_commodity_option(db.get(), section, name, key, + doc_string, value); +} /** * Create a new simple boolean option and register it in the options database. @@ -603,6 +625,26 @@ inline void gnc_register_currency_option(const GncOptionDBPtr& db, doc_string, value); } +/** + * As above but with a const char* value, which must be the ISO4217 three-letter + * symbol for the currency. + */ +void gnc_register_currency_option(GncOptionDB* db, + const char* section, + const char* name, const char* key, + const char* doc_string, + const char* value); + +inline void gnc_register_currency_option(const GncOptionDBPtr& db, + const char* section, + const char* name, const char* key, + const char* doc_string, + const char* value) +{ + gnc_register_currency_option(db.get(), section, name, key, + doc_string, value); +} + /** * Create a new invoice option and register it in the options database. *