From 92caa6344f71f3681ed255b56ecfa9294f497ab9 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Thu, 27 Jan 2022 18:46:46 -0500 Subject: tk: Add border with focus indication to button --- diff --git a/src/defs.h b/src/defs.h index 81b844a..8fb9698 100644 --- a/src/defs.h +++ b/src/defs.h @@ -40,6 +40,7 @@ #define MF_CHK_ITM_P 8 /* Radio button and check box label pad */ #define MF_BTN_M 8 /* Margin between buttons */ #define MF_BTN_P 8 /* Button padding */ +#define MF_BTN_B 1 /* Button border */ #define MF_TITLE_FONT_S 48 /* Title font size */ #define MF_TEXT_FONT_S 16 /* Regular text font size */ diff --git a/src/game.c b/src/game.c index 6f9ea30..1768a1a 100644 --- a/src/game.c +++ b/src/game.c @@ -57,7 +57,7 @@ _mf_game_form(SDL_Renderer *renderer, TTF_Font *text_font, return mftk_grid_new(2, 1, MF_ROW_M, MF_COL_M, game->timer, MFTK_GRID_HALIGN_R|MFTK_GRID_VALIGN_T, - mftk_button_new(text_font, "Exit", MF_BTN_P, + mftk_button_new(text_font, "Exit", MF_BTN_P, MF_BTN_B, &_mf_game_exit, NULL, renderer), MFTK_GRID_HALIGN_R|MFTK_GRID_VALIGN_B ); diff --git a/src/menu.c b/src/menu.c index b171d2b..3c037a8 100644 --- a/src/menu.c +++ b/src/menu.c @@ -203,10 +203,12 @@ _mf_menu_form(SDL_Renderer *renderer, TTF_Font *text_font, mftk_blank_new(), MFTK_GRID_HALIGN_R|MFTK_GRID_VALIGN_T, mftk_grid_new(1, 2, 0, MF_BTN_M, - mftk_button_new(text_font, "Quit", MF_BTN_P, + mftk_button_new(text_font, "Quit", + MF_BTN_P, MF_BTN_B, &_mf_menu_quit, NULL, renderer), MFTK_GRID_HALIGN_L|MFTK_GRID_VALIGN_T, - mftk_button_new(text_font, "Play", MF_BTN_P, + mftk_button_new(text_font, "Play", + MF_BTN_P, MF_BTN_B, &_mf_menu_play, menu, renderer), MFTK_GRID_HALIGN_L|MFTK_GRID_VALIGN_T ), diff --git a/src/tk.h b/src/tk.h index 60018f6..d152f31 100644 --- a/src/tk.h +++ b/src/tk.h @@ -42,7 +42,7 @@ struct mftk_widget * mftk_label_new(TTF_Font *font, const char *text, SDL_Renderer *renderer); struct mftk_widget * -mftk_button_new(TTF_Font *font, const char *text, int padding, +mftk_button_new(TTF_Font *font, const char *text, int padding, int border, int (*action)(void *), void *user_data, SDL_Renderer *renderer); #define MFTK_GRID_HALIGN_L 1 diff --git a/src/tk/button.c b/src/tk/button.c index c0a0c61..fa0cb65 100644 --- a/src/tk/button.c +++ b/src/tk/button.c @@ -26,6 +26,7 @@ struct mftk_button { struct mftk_widget parent; struct mftk_widget *label; int padding; + int border; int (*action)(void *); void *user_data; }; @@ -37,8 +38,8 @@ _mftk_button_layout(struct mftk_widget *w) mftk_widget_layout(b->label); - w->w = b->label->w + b->padding * 2; - w->h = b->label->h + b->padding * 2; + w->w = b->label->w + b->padding * 2 + b->border * 2; + w->h = b->label->h + b->padding * 2 + b->border * 2; } static void @@ -107,11 +108,32 @@ _mftk_button_render(struct mftk_widget *w, SDL_Renderer *renderer, int x, int y) { struct mftk_button *b = (struct mftk_button *) w; SDL_Rect rect; + SDL_Color border; rect.x = x; rect.y = y; rect.w = w->w; rect.h = w->h; + if (w->focused == SDL_TRUE) { + border.r = MFTK_COLOR_BDRF_R, border.g = MFTK_COLOR_BDRF_G; + border.b = MFTK_COLOR_BDRF_B, border.a = MFTK_COLOR_BDRF_A; + } else { + border.r = MFTK_COLOR_BDRN_R, border.g = MFTK_COLOR_BDRN_G; + border.b = MFTK_COLOR_BDRN_B, border.a = MFTK_COLOR_BDRN_A; + } + if (SDL_SetRenderDrawColor(renderer, + border.r, border.g, border.b, border.a) < 0 || + SDL_RenderFillRect(renderer, &rect) < 0) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Couldn't render widget: %s", + SDL_GetError()); + return -1; + } + + rect.x += b->border; + rect.y += b->border; + rect.w -= b->border * 2; + rect.h -= b->border * 2; if (SDL_SetRenderDrawColor(renderer, MFTK_COLOR_BACK_R, MFTK_COLOR_BACK_G, MFTK_COLOR_BACK_B, MFTK_COLOR_BACK_A) < 0 || @@ -139,7 +161,7 @@ _mftk_button_destroy(struct mftk_widget *w) } struct mftk_widget * -mftk_button_new(TTF_Font *font, const char *text, int padding, +mftk_button_new(TTF_Font *font, const char *text, int padding, int border, int (*action)(void *), void *user_data, SDL_Renderer *renderer) { struct mftk_widget *w; @@ -154,6 +176,7 @@ mftk_button_new(TTF_Font *font, const char *text, int padding, } b->padding = padding; + b->border = border; b->action = action; b->user_data = user_data; diff --git a/src/tk/style.h b/src/tk/style.h index 14a1ea4..a8ff76f 100644 --- a/src/tk/style.h +++ b/src/tk/style.h @@ -32,6 +32,14 @@ #define MFTK_COLOR_BACK_G 0xAF #define MFTK_COLOR_BACK_B 0xAF #define MFTK_COLOR_BACK_A 0xFF +#define MFTK_COLOR_BDRN_R 0x00 /* Widget normal border color */ +#define MFTK_COLOR_BDRN_G 0x00 +#define MFTK_COLOR_BDRN_B 0x00 +#define MFTK_COLOR_BDRN_A 0xFF +#define MFTK_COLOR_BDRF_R 0x00 /* Widget focus border color */ +#define MFTK_COLOR_BDRF_G 0x00 +#define MFTK_COLOR_BDRF_B 0xAF +#define MFTK_COLOR_BDRF_A 0xFF #define MFTK_COLOR_FORE_R 0x00 /* Text color */ #define MFTK_COLOR_FORE_G 0x00 #define MFTK_COLOR_FORE_B 0x00 -- cgit v0.9.1