summaryrefslogtreecommitdiffstats
path: root/src/tk
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-05 14:18:09 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-05 14:18:09 (EDT)
commitfa7a4af184162fabb03e90998b0388672fc354d9 (patch)
treea0ffc753c796f9dc38e5fdb5326573e6b89716a8 /src/tk
parent9976dd05a2c5342d62313da1dc3950c521aa2d22 (diff)
downloadmazefight-fa7a4af184162fabb03e90998b0388672fc354d9.zip
mazefight-fa7a4af184162fabb03e90998b0388672fc354d9.tar.gz
mazefight-fa7a4af184162fabb03e90998b0388672fc354d9.tar.bz2
tk: Add radio widget
Also fix an #include directive in the grid widget.
Diffstat (limited to 'src/tk')
-rw-r--r--src/tk/grid.c2
-rw-r--r--src/tk/local.mk1
-rw-r--r--src/tk/radio.c125
3 files changed, 127 insertions, 1 deletions
diff --git a/src/tk/grid.c b/src/tk/grid.c
index 8b6b99a..dc25f75 100644
--- a/src/tk/grid.c
+++ b/src/tk/grid.c
@@ -18,7 +18,7 @@
*/
#include <SDL.h>
-#include "errno.h"
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include "../tk.h"
diff --git a/src/tk/local.mk b/src/tk/local.mk
index 679e2a4..9cea068 100644
--- a/src/tk/local.mk
+++ b/src/tk/local.mk
@@ -4,5 +4,6 @@ mazefight_SOURCES += \
%reldir%/check.c \
%reldir%/grid.c \
%reldir%/label.c \
+ %reldir%/radio.c \
%reldir%/widget.c \
%reldir%/widget.h
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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <SDL.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#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;
+}