X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fprop%2Fbinding%2Fdecoderoptions.cpp;h=930e1f0aee14c77a860ca8242b729218fdc614be;hb=d9aecf1fcd9af471db3b59de7efc65b9632a6d79;hp=435d5f6d8bac998e03cac28deb26818cf5a4c3b0;hpb=67fe5e9c02e4e9cfe94d465a0a5e5b598129e4e3;p=pulseview.git diff --git a/pv/prop/binding/decoderoptions.cpp b/pv/prop/binding/decoderoptions.cpp index 435d5f6..930e1f0 100644 --- a/pv/prop/binding/decoderoptions.cpp +++ b/pv/prop/binding/decoderoptions.cpp @@ -18,35 +18,50 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include "decoderoptions.h" -#include +#include #include +#include +#include +#include +#include #include #include -using namespace boost; -using namespace std; +using boost::bind; +using boost::none; +using boost::shared_ptr; +using std::make_pair; +using std::map; +using std::pair; +using std::string; +using std::vector; namespace pv { namespace prop { namespace binding { -DecoderOptions::DecoderOptions(const srd_decoder *decoder, - GHashTable *options) : - _decoder(decoder), - _options(options) +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(); + assert(dec); - for (GSList *l = decoder->options; l; l = l->next) + for (GSList *l = dec->options; l; l = l->next) { 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); @@ -55,7 +70,12 @@ DecoderOptions::DecoderOptions(const srd_decoder *decoder, shared_ptr prop; - if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) + if (opt->values) + prop = bind_enum(name, opt, getter, setter); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("d"))) + prop = shared_ptr(new Double(name, 2, "", + none, none, getter, setter)); + else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) prop = shared_ptr( new Int(name, "", none, getter, setter)); else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) @@ -68,20 +88,45 @@ DecoderOptions::DecoderOptions(const srd_decoder *decoder, } } +shared_ptr DecoderOptions::bind_enum( + const QString &name, const srd_decoder_option *option, + Property::Getter getter, Property::Setter setter) +{ + vector< pair > values; + for (GSList *l = option->values; l; l = l->next) { + GVariant *const var = (GVariant*)l->data; + assert(var); + values.push_back(make_pair(var, print_gvariant(var))); + } + + return shared_ptr(new Enum(name, values, getter, setter)); +} + GVariant* 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(_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()); + // Get the default value if not - for (GSList *l = _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; - if (strcmp(opt->id, id) == 0) + if (strcmp(opt->id, id) == 0) { val = opt->def; + break; + } } } @@ -93,8 +138,11 @@ GVariant* DecoderOptions::getter(const char *id) void DecoderOptions::setter(const char *id, GVariant *value) { - g_variant_ref(value); - g_hash_table_insert(_options, (void*)id, value); + assert(_decoder); + _decoder->set_option(id, value); + + assert(_decoder_stack); + _decoder_stack->begin_decode(); } } // binding