summaryrefslogtreecommitdiffstats
path: root/src/tk
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2021-08-04 21:01:30 (EDT)
committer P. J. McDermott <pj@pehjota.net>2021-08-04 21:07:07 (EDT)
commit4290eee6d45aab8e9f1c47d5d7d35e9ceccd78b2 (patch)
treec2e7871158c55a389055ba1d0a8e03244600fa79 /src/tk
parentddf513909ce1742021b9c57ea7279a61aeda4899 (diff)
downloadmazefight-4290eee6d45aab8e9f1c47d5d7d35e9ceccd78b2.zip
mazefight-4290eee6d45aab8e9f1c47d5d7d35e9ceccd78b2.tar.gz
mazefight-4290eee6d45aab8e9f1c47d5d7d35e9ceccd78b2.tar.bz2
tk: Add box widget
Diffstat (limited to 'src/tk')
-rw-r--r--src/tk/box.c119
-rw-r--r--src/tk/local.mk1
2 files changed, 120 insertions, 0 deletions
diff --git a/src/tk/box.c b/src/tk/box.c
new file mode 100644
index 0000000..1a45589
--- /dev/null
+++ b/src/tk/box.c
@@ -0,0 +1,119 @@
+/*
+ * 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_box {
+ struct mftk_widget parent;
+ int container_w;
+ int container_h;
+ int padding;
+ SDL_Color *bg_color;
+ struct mftk_widget *child;
+ int child_x;
+ int child_y;
+};
+
+static void
+_mftk_box_layout(struct mftk_widget *w)
+{
+ struct mftk_box *b = (struct mftk_box *) w;
+
+ mftk_widget_layout(b->child);
+ if (w->w == 0) {
+ w->w = b->child->w + b->padding * 2;
+ }
+ if (w->h == 0) {
+ w->h = b->child->h + b->padding * 2;
+ }
+ b->child_x = (b->container_w - w->w) / 2 + b->padding;
+ b->child_y = (b->container_h - w->h) / 2 + b->padding;
+}
+
+static int
+_mftk_box_event(struct mftk_widget *w, SDL_Event *e, int x, int y)
+{
+ struct mftk_box *b = (struct mftk_box *) w;
+ SDL_Point p;
+ SDL_Rect rect;
+
+ switch (e->type) {
+ case SDL_MOUSEBUTTONUP:
+ p.x = e->button.x;
+ p.y = e->button.y;
+ rect.x = x + b->child_x;
+ rect.y = y + b->child_y;
+ rect.w = b->child->w;
+ rect.h = b->child->h;
+ if (SDL_PointInRect(&p, &rect) == SDL_TRUE) {
+ return mftk_widget_event(b->child, e, x, y);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int
+_mftk_box_render(struct mftk_widget *w, SDL_Renderer *renderer, int x, int y)
+{
+ struct mftk_box *b = (struct mftk_box *) w;
+
+ if (mftk_widget_render(b->child, renderer,
+ x + b->child_x, y + b->child_y) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static void
+_mftk_box_destroy(struct mftk_widget *w)
+{
+ struct mftk_box *b = (struct mftk_box *) w;
+
+ mftk_widget_destroy(&b->child);
+}
+
+struct mftk_widget *
+mftk_box_new(int container_w, int container_h, int own_w, int own_h,
+ int padding, SDL_Color *bg_color, struct mftk_widget *child)
+{
+ struct mftk_widget *w;
+ struct mftk_box *b;
+
+ mftk_widget_init(w, b, box);
+
+ b->container_w = container_w;
+ b->container_h = container_h;
+ w->w = own_w;
+ w->h = own_h;
+ b->padding = padding;
+ b->bg_color = bg_color;
+ b->child = child;
+
+ return w;
+}
diff --git a/src/tk/local.mk b/src/tk/local.mk
index a15bd33..12c07d7 100644
--- a/src/tk/local.mk
+++ b/src/tk/local.mk
@@ -1,4 +1,5 @@
mazefight_SOURCES += \
+ %reldir%/box.c \
%reldir%/button.c \
%reldir%/grid.c \
%reldir%/label.c \