summaryrefslogtreecommitdiffstats
path: root/src/tk/button.c
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-04 18:30:08 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-04 18:49:41 (EDT)
commit614d914e31f36d751d96309a64953c1f405a33d3 (patch)
treedd94627a8de46c632095bdf6076fa6af70137c28 /src/tk/button.c
parentc0da7148db465b15f666bb6e63147be126712b3b (diff)
downloadmazefight-614d914e31f36d751d96309a64953c1f405a33d3.zip
mazefight-614d914e31f36d751d96309a64953c1f405a33d3.tar.gz
mazefight-614d914e31f36d751d96309a64953c1f405a33d3.tar.bz2
tk: Add button widget
Diffstat (limited to 'src/tk/button.c')
-rw-r--r--src/tk/button.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/tk/button.c b/src/tk/button.c
new file mode 100644
index 0000000..c7d0c5f
--- /dev/null
+++ b/src/tk/button.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 "../tk.h"
+#include "widget.h"
+
+struct mftk_button {
+ struct mftk_widget parent;
+ struct mftk_widget *label;
+ SDL_Color *fill_color;
+ int padding;
+ int (*action)(void *);
+ void *user_data;
+};
+
+static void
+_mftk_button_layout(struct mftk_widget *w)
+{
+ struct mftk_button *b = (struct mftk_button *) w;
+
+ mftk_widget_layout(b->label);
+
+ w->w = b->label->w + b->padding * 2;
+ w->h = b->label->h + b->padding * 2;
+}
+
+static int
+_mftk_button_event(struct mftk_widget *w, SDL_Event *e)
+{
+ struct mftk_button *b = (struct mftk_button *) w;
+
+ switch (e->type) {
+ case SDL_MOUSEBUTTONUP:
+ if (e->button.button == SDL_BUTTON_LEFT) {
+ return b->action(b->user_data);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int
+_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;
+
+ rect.x = x;
+ rect.y = y;
+ rect.w = w->w;
+ rect.h = w->h;
+ if (SDL_SetRenderDrawColor(renderer,
+ b->fill_color->r, b->fill_color->g,
+ b->fill_color->b, b->fill_color->a) < 0 ||
+ SDL_RenderFillRect(renderer, &rect) < 0) {
+ SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
+ "Couldn't render widget: %s",
+ SDL_GetError());
+ return -1;
+ }
+
+ if (mftk_widget_render(b->label, renderer,
+ x + b->padding, y + b->padding) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static void
+_mftk_button_destroy(struct mftk_widget *w)
+{
+ struct mftk_button *b = (struct mftk_button *) w;
+
+ mftk_widget_destroy(&b->label);
+}
+
+struct mftk_widget *
+mftk_button_new(TTF_Font *font, const char *text, SDL_Color *text_color,
+ SDL_Color *fill_color, int padding,
+ int (*action)(void *), void *user_data, SDL_Renderer *renderer)
+{
+ struct mftk_widget *w;
+ struct mftk_button *b;
+
+ if ((w = mftk_widget_new(sizeof(*b))) == NULL) return NULL;
+ b = (struct mftk_button *) w;
+ w->layout = &_mftk_button_layout;
+ w->event = &_mftk_button_event;
+ w->render = &_mftk_button_render;
+ w->destroy = &_mftk_button_destroy;
+
+ b->label = mftk_label_new(font, text, text_color, renderer);
+ if (b->label == NULL) {
+ free(b);
+ return NULL;
+ }
+
+ b->fill_color = fill_color;
+ b->padding = padding;
+ b->action = action;
+ b->user_data = user_data;
+
+ return w;
+}