From fa7a4af184162fabb03e90998b0388672fc354d9 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Thu, 05 Aug 2021 14:18:09 -0400 Subject: tk: Add radio widget Also fix an #include directive in the grid widget. --- (limited to 'src/tk/radio.c') diff --git a/src/tk/radio.c b/src/tk/radio.c new file mode 100644 index 0000000..fcf63b3 --- /dev/null +++ b/src/tk/radio.c @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2021 P. J. McDermott + * + * This file is part of Maze Fight + * + * Maze Fight is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Maze Fight is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Maze Fight. If not, see . + */ + +#include +#include +#include +#include +#include "../tk.h" +#include "widget.h" + +struct mftk_radio { + struct mftk_widget parent; + struct mftk_widget *grid; + int state; + int (*action)(void *, int); + void *user_data; +}; + +static void +_mftk_radio_layout(struct mftk_widget *w) +{ + struct mftk_radio *r = (struct mftk_radio *) w; + + mftk_widget_layout(r->grid); + w->w = r->grid->w; + w->h = r->grid->h; +} + +static int +_mftk_radio_event(struct mftk_widget *w, SDL_Event *e, int x, int y) +{ + struct mftk_radio *r = (struct mftk_radio *) w; + + return mftk_widget_event(r->grid, e, x, y); +} + +static int +_mftk_radio_render(struct mftk_widget *w, SDL_Renderer *renderer, int x, int y) +{ + struct mftk_radio *r = (struct mftk_radio *) w; + + return mftk_widget_render(r->grid, renderer, x, y); +} + +static void +_mftk_radio_destroy(struct mftk_widget *w) +{ + struct mftk_radio *r = (struct mftk_radio *) w; + + mftk_widget_destroy(&r->grid); +} + +struct mftk_widget * +mftk_radio_new(int butn_width, int butn_padding, SDL_Color *butn_color, + SDL_Color *mark_color, int label_padding, int item_padding, + TTF_Font *font, SDL_Color *text_color, + int (*action)(void *, int), void *user_data, + SDL_Renderer *renderer, int state, int options, ...) +{ + struct mftk_widget **children; + va_list ap; + int i; + struct mftk_widget *w; + struct mftk_radio *r; + + children = calloc(options, sizeof(*children)); + if (children == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Couldn't create widget: %s", + strerror(errno)); + return NULL; + } + + va_start(ap, options); + for (i = 0; i < options; ++i) { + children[i] = mftk_check_new(butn_width, butn_padding, + butn_color, mark_color, (i == state), + label_padding, font, va_arg(ap, const char *), + text_color, NULL/*TODO*/, NULL/*TODO*/, + renderer); + if (children[i] == NULL) { + for (; i >= 0; --i) { + mftk_widget_destroy(&children[i]); + } + free(children); + va_end(ap); + return NULL; + } + mftk_check_set_shape(children[i], MFTK_CHECK_SHAPE_CIR); + } + va_end(ap); + + mftk_widget_init(w, r, radio); + + r->grid = mftk_grid_new_a(options, 1, item_padding, 0, children); + if (r->grid == NULL) { + for (i = 0; i < options; ++i) { + mftk_widget_destroy(&children[i]); + } + free(children); + free(r); + } + + r->state = state; + r->action = action; + r->user_data = user_data; + + return w; +} -- cgit v0.9.1