From d3db039136ad66d2c83c1c0fbf0964bfbb5afb16 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Sat, 25 Oct 2014 20:02:34 +0300 Subject: Single line mode, color customization, etc.. --- lib/menu.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 107 insertions(+), 4 deletions(-) (limited to 'lib/menu.c') diff --git a/lib/menu.c b/lib/menu.c index 594344c..43de830 100644 --- a/lib/menu.c +++ b/lib/menu.c @@ -1,9 +1,32 @@ #include "internal.h" +#include #include #include #include #include +/** + * Default font. + */ +static const char *default_font = "Terminus"; + +/** + * Default hexadecimal colors. + */ +static const char *default_colors[BM_COLOR_LAST] = { + "#121212", // BM_COLOR_BG + "#121212", // BM_COLOR_TITLE_BG + "#D81860", // BM_COLOR_TITLE_FG + "#121212", // BM_COLOR_FILTER_BG + "#CACACA", // BM_COLOR_FILTER_FG + "#121212", // BM_COLOR_ITEM_BG + "#CACACA", // BM_COLOR_ITEM_FG + "#121212", // BM_COLOR_HIGHLIGHTED_BG + "#D81860", // BM_COLOR_HIGHLIGHTED_FG + "#121212", // BM_COLOR_SELECTED_BG + "#D81860" // BM_COLOR_SELECTED_FG +}; + /** * Filter function map. */ @@ -51,12 +74,21 @@ bm_menu_new(const char *renderer, enum bm_prioritory prioritory) break; } - if (!menu->renderer) { - bm_menu_free(menu); - return NULL; - } + if (!menu->renderer) + goto fail; + if (!bm_menu_set_font(menu, NULL, 0)) + goto fail; + + for (uint32_t i = 0; i < BM_COLOR_LAST; ++i) { + if (!bm_menu_set_color(menu, i, NULL)) + goto fail; + } return menu; + +fail: + bm_menu_free(menu); + return NULL; } void @@ -71,6 +103,11 @@ bm_menu_free(struct bm_menu *menu) free(menu->filter); free(menu->old_filter); + free(menu->font.name); + + for (uint32_t i = 0; i < BM_COLOR_LAST; ++i) + free(menu->colors[i].hex); + bm_menu_free_items(menu); free(menu); } @@ -129,6 +166,20 @@ bm_menu_get_filter_mode(const struct bm_menu *menu) return menu->filter_mode; } +void +bm_menu_set_lines(struct bm_menu *menu, uint32_t lines) +{ + assert(menu); + menu->lines = lines; +} + +uint32_t +bm_menu_get_lines(struct bm_menu *menu) +{ + assert(menu); + return menu->lines; +} + void bm_menu_set_wrap(struct bm_menu *menu, bool wrap) { @@ -164,6 +215,58 @@ bm_menu_get_title(const struct bm_menu *menu) return menu->title; } +bool +bm_menu_set_font(struct bm_menu *menu, const char *font, uint32_t size) +{ + assert(menu); + + const char *nfont = (font ? font : default_font); + + char *copy = NULL; + if (!(copy = bm_strdup(nfont))) + return false; + + free(menu->font.name); + menu->font.name = copy; + menu->font.size = (size > 0 ? size : 12); + return true; +} + +const char* bm_menu_get_font(const struct bm_menu *menu, uint32_t *out_size) +{ + assert(menu); + if (out_size) *out_size = menu->font.size; + return menu->font.name; +} + +bool bm_menu_set_color(struct bm_menu *menu, enum bm_color color, const char *hex) +{ + assert(menu); + + const char *nhex = (hex ? hex : default_colors[color]); + + int32_t r, g, b; + if (sscanf(nhex,"#%2x%2x%2x", &r, &b, &g) != 3) + return false; + + char *copy = NULL; + if (!(copy = bm_strdup(nhex))) + return false; + + free(menu->colors[color].hex); + menu->colors[color].hex = copy; + menu->colors[color].r = r; + menu->colors[color].g = g; + menu->colors[color].b = b; + return true; +} + +const char* bm_menu_get_color(const struct bm_menu *menu, enum bm_color color) +{ + assert(menu); + return menu->colors[color].hex; +} + bool bm_menu_add_items_at(struct bm_menu *menu, struct bm_item *item, uint32_t index) { -- cgit v1.2.3-70-g09d2