/* * 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; }