X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fprop%2Fbinding%2Fdecoderoptions.cpp;h=d9b4b88d540ebb285b1ea28e352e21003f978705;hp=5ad7e3562e6150e057c9299964069af1e931feba;hb=c1035a1452fa2aec5414975e83e531c10504b80c;hpb=4e5a4405482a296ebb6014e627298ad156c78d55 diff --git a/pv/prop/binding/decoderoptions.cpp b/pv/prop/binding/decoderoptions.cpp index 5ad7e356..d9b4b88d 100644 --- a/pv/prop/binding/decoderoptions.cpp +++ b/pv/prop/binding/decoderoptions.cpp @@ -20,28 +20,38 @@ #include -#include "decoderoptions.h" +#include "decoderoptions.hpp" -#include #include -#include -#include -#include - -using namespace boost; -using namespace std; +#include +#include +#include +#include +#include +#include + +using boost::none; +using std::make_pair; +using std::map; +using std::pair; +using std::shared_ptr; +using std::string; +using std::vector; namespace pv { namespace prop { namespace binding { -DecoderOptions::DecoderOptions(shared_ptr decoder) : - _decoder(decoder) +DecoderOptions::DecoderOptions( + shared_ptr decoder_stack, + shared_ptr decoder) : + decoder_stack_(decoder_stack), + decoder_(decoder) { - assert(_decoder); + assert(decoder_); - const srd_decoder *const dec = _decoder->decoder(); + const srd_decoder *const dec = decoder_->decoder(); assert(dec); for (GSList *l = dec->options; l; l = l->next) @@ -49,42 +59,64 @@ DecoderOptions::DecoderOptions(shared_ptr decoder) : const srd_decoder_option *const opt = (srd_decoder_option*)l->data; - const QString name(opt->desc); + const QString name = QString::fromUtf8(opt->desc); - const Property::Getter getter = bind( - &DecoderOptions::getter, this, opt->id); - const Property::Setter setter = bind( - &DecoderOptions::setter, this, opt->id, _1); + const Property::Getter get = [&, opt]() { + return getter(opt->id); }; + const Property::Setter set = [&, opt](Glib::VariantBase value) { + setter(opt->id, value); }; shared_ptr prop; - if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) + if (opt->values) + prop = bind_enum(name, opt, get, set); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("d"))) + prop = shared_ptr(new Double(name, 2, "", + none, none, get, set)); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) prop = shared_ptr( - new Int(name, "", none, getter, setter)); + new Int(name, "", none, get, set)); else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) prop = shared_ptr( - new String(name, getter, setter)); + new String(name, get, set)); else continue; - _properties.push_back(prop); + properties_.push_back(prop); } } -GVariant* DecoderOptions::getter(const char *id) +shared_ptr DecoderOptions::bind_enum( + const QString &name, const srd_decoder_option *option, + Property::Getter getter, Property::Setter setter) { - assert(_decoder); + vector< pair > values; + for (GSList *l = option->values; l; l = l->next) { + Glib::VariantBase var = Glib::VariantBase((GVariant*)l->data, true); + values.push_back(make_pair(var, print_gvariant(var))); + } + + return shared_ptr(new Enum(name, values, getter, setter)); +} + +Glib::VariantBase DecoderOptions::getter(const char *id) +{ + GVariant *val = NULL; + + assert(decoder_); // Get the value from the hash table if it is already present - GVariant *val = (GVariant*)g_hash_table_lookup( - (GHashTable*)_decoder->options(), id); + const map& options = decoder_->options(); + const auto iter = options.find(id); - if (!val) + if (iter != options.end()) + val = (*iter).second; + else { - assert(_decoder->decoder()); + assert(decoder_->decoder()); // Get the default value if not - for (GSList *l = _decoder->decoder()->options; l; l = l->next) + for (GSList *l = decoder_->decoder()->options; l; l = l->next) { const srd_decoder_option *const opt = (srd_decoder_option*)l->data; @@ -96,15 +128,18 @@ GVariant* DecoderOptions::getter(const char *id) } if (val) - g_variant_ref(val); - - return val; + return Glib::VariantBase(val, true); + else + return Glib::VariantBase(); } -void DecoderOptions::setter(const char *id, GVariant *value) +void DecoderOptions::setter(const char *id, Glib::VariantBase value) { - assert(_decoder); - _decoder->set_option(id, value); + assert(decoder_); + decoder_->set_option(id, value.gobj()); + + assert(decoder_stack_); + decoder_stack_->begin_decode(); } } // binding