diff options
Diffstat (limited to 'textscreen/txt_window_action.c')
-rw-r--r-- | textscreen/txt_window_action.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/textscreen/txt_window_action.c b/textscreen/txt_window_action.c new file mode 100644 index 00000000..072a87c5 --- /dev/null +++ b/textscreen/txt_window_action.c @@ -0,0 +1,81 @@ + +#include <string.h> + +#include "doomkeys.h" + +#include "txt_window_action.h" +#include "txt_io.h" +#include "txt_main.h" +#include "txt_window.h" + +static void TXT_WindowActionSizeCalc(TXT_UNCAST_ARG(action), + int *w, int *h) +{ + TXT_CAST_ARG(txt_window_action_t, action); + char buf[10]; + + TXT_GetKeyDescription(action->key, buf); + + // Minimum width is the string length + two spaces for padding + + *w = strlen(action->label) + strlen(buf) + 1; + *h = 1; +} + +static void TXT_WindowActionDrawer(TXT_UNCAST_ARG(action), int w, int selected) +{ + TXT_CAST_ARG(txt_window_action_t, action); + int i; + char buf[10]; + + TXT_GetKeyDescription(action->key, buf); + + TXT_FGColor(TXT_COLOR_BRIGHT_GREEN); + TXT_DrawString(buf); + TXT_FGColor(TXT_COLOR_BRIGHT_CYAN); + TXT_DrawString("="); + TXT_FGColor(TXT_COLOR_BRIGHT_WHITE); + TXT_DrawString(action->label); +} + +static void TXT_WindowActionDestructor(TXT_UNCAST_ARG(action)) +{ + TXT_CAST_ARG(txt_window_action_t, action); + + free(action->label); +} + +static int TXT_WindowActionKeyPress(TXT_UNCAST_ARG(action), int key) +{ + TXT_CAST_ARG(txt_window_action_t, action); + + if (key == action->key) + { + TXT_EmitSignal(action, "pressed"); + return 1; + } + + return 0; +} + +txt_widget_class_t txt_window_action_class = +{ + TXT_WindowActionSizeCalc, + TXT_WindowActionDrawer, + TXT_WindowActionKeyPress, + TXT_WindowActionDestructor, +}; + +txt_window_action_t *TXT_NewWindowAction(int key, char *label) +{ + txt_window_action_t *action; + + action = malloc(sizeof(txt_window_action_t)); + + TXT_InitWidget(action, &txt_window_action_class); + action->key = key; + action->label = strdup(label); + + return action; +} + |