From e27e5346ee9d8df2173de12428a4f50803f975be Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Tue, 17 Sep 2013 09:21:50 +0100 Subject: [PATCH] api: updated idnode objects to support new rend() method in prop_t This allows enumerated (ish) types to now be fully sorted and filtered in the way you'd expect from the UI. --- src/channels.c | 38 ++++++++++++++++++-- src/input/mpegts/linuxdvb/linuxdvb_satconf.c | 38 ++++++++++++++------ src/service.c | 19 +++++++++- 3 files changed, 82 insertions(+), 13 deletions(-) diff --git a/src/channels.c b/src/channels.c index 950d314b..936576f8 100644 --- a/src/channels.c +++ b/src/channels.c @@ -91,6 +91,22 @@ channel_class_services_get ( void *obj ) return l; } +static char * +channel_class_services_rend ( void *obj ) +{ + char *str; + htsmsg_t *l = htsmsg_create_list(); + channel_t *ch = obj; + channel_service_mapping_t *csm; + + LIST_FOREACH(csm, &ch->ch_services, csm_svc_link) + htsmsg_add_str(l, NULL, idnode_get_title(&csm->csm_svc->s_id) ?: ""); + + str = htsmsg_list_2_csv(l); + htsmsg_destroy(l); + return str; +} + static int channel_class_services_set ( void *obj, const void *p ) { @@ -124,6 +140,22 @@ channel_class_tags_get ( void *obj ) return m; } +static char * +channel_class_tags_rend ( void *obj ) +{ + char *str; + htsmsg_t *l = htsmsg_create_list(); + channel_t *ch = obj; + channel_tag_mapping_t *ctm; + + LIST_FOREACH(ctm, &ch->ch_ctms, ctm_channel_link) + htsmsg_add_str(l, NULL, ctm->ctm_tag->ct_name); + + str = htsmsg_list_2_csv(l); + htsmsg_destroy(l); + return str; +} + static int channel_class_tags_set ( void *obj, const void *p ) { @@ -141,8 +173,8 @@ channel_class_tags_enum ( void *obj ) htsmsg_add_bool(e, "enum", 1); htsmsg_add_msg(m, "params", e); return m; - } - +} + static void channel_class_icon_notify ( void *obj ) { @@ -212,6 +244,7 @@ const idclass_t channel_class = { .get = channel_class_services_get, .set = channel_class_services_set, .list = channel_class_services_enum, + .rend = channel_class_services_rend, }, { .type = PT_INT, @@ -221,6 +254,7 @@ const idclass_t channel_class = { .get = channel_class_tags_get, .set = channel_class_tags_set, .list = channel_class_tags_enum, + .rend = channel_class_tags_rend }, {} } diff --git a/src/input/mpegts/linuxdvb/linuxdvb_satconf.c b/src/input/mpegts/linuxdvb/linuxdvb_satconf.c index c5ade907..117dfb5d 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_satconf.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_satconf.c @@ -40,13 +40,21 @@ linuxdvb_satconf_class_network_get(void *o) { static const char *s; linuxdvb_satconf_t *ls = o; - if (ls->mi_network) - s = idnode_uuid_as_str(&ls->mi_network->mn_id); - else - s = NULL; + s = ls->mi_network ? idnode_uuid_as_str(&ls->mi_network->mn_id) : NULL; return &s; } +static char * +linuxdvb_satconf_class_network_rend ( void *o ) +{ + const char *buf; + linuxdvb_satconf_t *ls = o; + if (ls->mi_network) + if ((buf = idnode_get_title(&ls->mi_network->mn_id))) + return strdup(buf); + return NULL; +} + static int linuxdvb_satconf_class_network_set(void *o, const void *v) { @@ -90,13 +98,21 @@ linuxdvb_satconf_class_frontend_get ( void *o ) { static const char *s; linuxdvb_satconf_t *ls = o; - if (ls->ls_frontend) - s = idnode_uuid_as_str(&ls->ls_frontend->ti_id); - else - s = NULL; + s = ls->ls_frontend ? idnode_uuid_as_str(&ls->ls_frontend->ti_id) : NULL; return &s; } +static char * +linuxdvb_satconf_class_frontend_rend ( void *o ) +{ + const char *buf; + linuxdvb_satconf_t *ls = o; + if (ls->ls_frontend) + if ((buf = idnode_get_title(&ls->ls_frontend->ti_id))) + return strdup(buf); + return NULL; +} + static int linuxdvb_satconf_class_frontend_set ( void *o, const void *v ) { @@ -264,7 +280,8 @@ const idclass_t linuxdvb_satconf_class = .name = "Frontend", .get = linuxdvb_satconf_class_frontend_get, .set = linuxdvb_satconf_class_frontend_set, - .list = linuxdvb_satconf_class_frontend_enum + .list = linuxdvb_satconf_class_frontend_enum, + .rend = linuxdvb_satconf_class_frontend_rend, }, { .type = PT_STR, @@ -272,7 +289,8 @@ const idclass_t linuxdvb_satconf_class = .name = "Network", .get = linuxdvb_satconf_class_network_get, .set = linuxdvb_satconf_class_network_set, - .list = linuxdvb_satconf_class_network_enum + .list = linuxdvb_satconf_class_network_enum, + .rend = linuxdvb_satconf_class_network_rend, }, { .type = PT_INT, diff --git a/src/service.c b/src/service.c index 95af1f2b..593f88aa 100644 --- a/src/service.c +++ b/src/service.c @@ -56,12 +56,28 @@ service_class_channel_get ( void *obj ) channel_service_mapping_t *csm; htsmsg_t *l = htsmsg_create_list(); - LIST_FOREACH(csm, &svc->s_channels, csm_chn_link) + LIST_FOREACH(csm, &svc->s_channels, csm_svc_link) htsmsg_add_str(l, NULL, idnode_uuid_as_str(&csm->csm_chn->ch_id)); return l; } +static char * +service_class_channel_rend ( void *obj ) +{ + char *str; + service_t *svc = obj; + channel_service_mapping_t *csm; + + htsmsg_t *l = htsmsg_create_list(); + LIST_FOREACH(csm, &svc->s_channels, csm_svc_link) + htsmsg_add_str(l, NULL, idnode_get_title(&csm->csm_chn->ch_id)); + + str = htsmsg_list_2_csv(l); + htsmsg_destroy(l); + return str; +} + static int service_class_channel_set ( void *obj, const void *p ) @@ -154,6 +170,7 @@ const idclass_t service_class = { .get = service_class_channel_get, .set = service_class_channel_set, .list = service_class_channel_enum, + .rend = service_class_channel_rend, .opts = PO_NOSAVE }, {}