From 6379b1939f9edd41e9ff4b8f3de176cb3e91c0ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 12 Jan 2019 22:56:00 +0100 Subject: [PATCH] particle/list: expose info through the new struct particle_info struct --- config-verify.c | 19 ++++++------------- config-verify.h | 1 + config.c | 38 +++----------------------------------- particles/list.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ particles/list.h | 2 ++ 5 files changed, 56 insertions(+), 48 deletions(-) diff --git a/config-verify.c b/config-verify.c index 69735b5..b8659fa 100644 --- a/config-verify.c +++ b/config-verify.c @@ -10,6 +10,7 @@ #include "tllist.h" #include "particles/empty.h" +#include "particles/list.h" const char * conf_err_prefix(const keychain_t *chain, const struct yml_node *node) @@ -245,8 +246,8 @@ verify_decoration(keychain_t *chain, const struct yml_node *node) return false; } -static bool -verify_list_items(keychain_t *chain, const struct yml_node *node) +bool +conf_verify_particle_list_items(keychain_t *chain, const struct yml_node *node) { assert(yml_is_list(node)); @@ -317,14 +318,6 @@ conf_verify_particle_dictionary(keychain_t *chain, const struct yml_node *node) {"right-margin", false, &conf_verify_int}, \ {"on-click", false, &conf_verify_string}, - static const struct attr_info list[] = { - {"items", true, &verify_list_items}, - {"spacing", false, &conf_verify_int}, - {"left-spacing", false, &conf_verify_int}, - {"right-spacing", false, &conf_verify_int}, - COMMON_ATTRS - }; - static const struct attr_info map[] = { {"tag", true, &conf_verify_string}, {"values", true, &verify_map_values}, @@ -346,7 +339,7 @@ conf_verify_particle_dictionary(keychain_t *chain, const struct yml_node *node) static const struct attr_info ramp[] = { {"tag", true, &conf_verify_string}, - {"items", true, &verify_list_items}, + {"items", true, &conf_verify_particle_list_items}, COMMON_ATTRS }; @@ -366,6 +359,7 @@ conf_verify_particle_dictionary(keychain_t *chain, const struct yml_node *node) const struct particle_info *info; } particles_v2[] = { {"empty", &particle_empty}, + {"list", &particle_list}, }; static const struct { @@ -373,7 +367,6 @@ conf_verify_particle_dictionary(keychain_t *chain, const struct yml_node *node) const struct attr_info *attrs; size_t count; } particles[] = { - {"list", list, sizeof(list) / sizeof(list[0])}, {"map", map, sizeof(map) / sizeof(map[0])}, {"progress-bar", progress_bar, sizeof(progress_bar) / sizeof(progress_bar[0])}, {"ramp", ramp, sizeof(ramp) / sizeof(ramp[0])}, @@ -420,7 +413,7 @@ conf_verify_particle(keychain_t *chain, const struct yml_node *node) if (yml_is_dict(node)) return conf_verify_particle_dictionary(chain, node); else if (yml_is_list(node)) - return verify_list_items(chain, node); + return conf_verify_particle_list_items(chain, node); else { LOG_ERR("%s: particle must be either a dictionary or a list", conf_err_prefix(chain, node)); diff --git a/config-verify.h b/config-verify.h index a6f4660..18c7900 100644 --- a/config-verify.h +++ b/config-verify.h @@ -42,3 +42,4 @@ bool conf_verify_color(keychain_t *chain, const struct yml_node *node); bool conf_verify_font(keychain_t *chain, const struct yml_node *node); bool conf_verify_particle(keychain_t *chain, const struct yml_node *node); +bool conf_verify_particle_list_items(keychain_t *chain, const struct yml_node *node); diff --git a/config.c b/config.c index 74f970a..3ddfca3 100644 --- a/config.c +++ b/config.c @@ -160,38 +160,6 @@ particle_string_from_config(const struct yml_node *node, fg_color, left_margin, right_margin, on_click_template); } -static struct particle * -particle_list_from_config(const struct yml_node *node, - const struct font *parent_font, - int left_margin, int right_margin, - const char *on_click_template) -{ - const struct yml_node *items = yml_get_value(node, "items"); - - const struct yml_node *spacing = yml_get_value(node, "spacing"); - const struct yml_node *_left_spacing = yml_get_value(node, "left-spacing"); - const struct yml_node *_right_spacing = yml_get_value(node, "right-spacing"); - - int left_spacing = spacing != NULL ? yml_value_as_int(spacing) : - _left_spacing != NULL ? yml_value_as_int(_left_spacing) : 0; - int right_spacing = spacing != NULL ? yml_value_as_int(spacing) : - _right_spacing != NULL ? yml_value_as_int(_right_spacing) : 2; - - size_t count = yml_list_length(items); - struct particle *parts[count]; - - size_t idx = 0; - for (struct yml_list_iter it = yml_list_iter(items); - it.node != NULL; - yml_list_next(&it), idx++) - { - parts[idx] = conf_to_particle(it.node, parent_font); - } - - return particle_list_new( - parts, count, left_spacing, right_spacing, left_margin, right_margin, - on_click_template); -} static struct particle * particle_map_from_config(const struct yml_node *node, @@ -317,13 +285,13 @@ conf_to_particle(const struct yml_node *node, const struct font *parent_font) if (strcmp(type, "empty") == 0) ret = particle_empty.from_conf( pair.value, parent_font, left, right, on_click_template); + else if (strcmp(type, "list") == 0) + ret = particle_list.from_conf( + pair.value, parent_font, left, right, on_click_template); else if (strcmp(type, "string") == 0) ret = particle_string_from_config( pair.value, parent_font, left, right, on_click_template); - else if (strcmp(type, "list") == 0) - ret = particle_list_from_config( - pair.value, parent_font, left, right, on_click_template); else if (strcmp(type, "map") == 0) ret = particle_map_from_config( pair.value, parent_font, left, right, on_click_template); diff --git a/particles/list.c b/particles/list.c index 9a9a5e3..e427c0c 100644 --- a/particles/list.c +++ b/particles/list.c @@ -4,6 +4,7 @@ #define LOG_MODULE "list" #define LOG_ENABLE_DBG 1 #include "../log.h" +#include "../config.h" struct private { struct particle **particles; @@ -165,3 +166,46 @@ particle_list_new( return particle; } + +static struct particle * +from_conf(const struct yml_node *node, const struct font *parent_font, + int left_margin, int right_margin, const char *on_click_template) +{ + const struct yml_node *items = yml_get_value(node, "items"); + + const struct yml_node *spacing = yml_get_value(node, "spacing"); + const struct yml_node *_left_spacing = yml_get_value(node, "left-spacing"); + const struct yml_node *_right_spacing = yml_get_value(node, "right-spacing"); + + int left_spacing = spacing != NULL ? yml_value_as_int(spacing) : + _left_spacing != NULL ? yml_value_as_int(_left_spacing) : 0; + int right_spacing = spacing != NULL ? yml_value_as_int(spacing) : + _right_spacing != NULL ? yml_value_as_int(_right_spacing) : 2; + + size_t count = yml_list_length(items); + struct particle *parts[count]; + + size_t idx = 0; + for (struct yml_list_iter it = yml_list_iter(items); + it.node != NULL; + yml_list_next(&it), idx++) + { + parts[idx] = conf_to_particle(it.node, parent_font); + } + + return particle_list_new( + parts, count, left_spacing, right_spacing, left_margin, right_margin, + on_click_template); +} + +const struct particle_info particle_list = { + .from_conf = &from_conf, + .attr_count = PARTICLE_COMMON_ATTRS_COUNT + 4, + .attrs = { + {"items", true, &conf_verify_particle_list_items}, + {"spacing", false, &conf_verify_int}, + {"left-spacing", false, &conf_verify_int}, + {"right-spacing", false, &conf_verify_int}, + PARTICLE_COMMON_ATTRS, + }, +}; diff --git a/particles/list.h b/particles/list.h index f6d1d42..01dabb4 100644 --- a/particles/list.h +++ b/particles/list.h @@ -5,3 +5,5 @@ struct particle *particle_list_new( struct particle *particles[], size_t count, int left_spacing, int right_spacing, int left_margin, int right_margin, const char *on_click_template); + +extern const struct particle_info particle_list;