/* * 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 "errno.h" #include #include #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 void _mftk_box_index(struct mftk_widget *w, struct mftk_window *win) { struct mftk_box *b = (struct mftk_box *) w; mftk_widget_index(b->child, win); } static int _mftk_box_mouse_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_mouse_event(b->child, e, rect.x, rect.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; SDL_Rect rect; rect.x = x + b->child_x - b->padding; rect.y = y + b->child_y - b->padding; rect.w = w->w; rect.h = w->h; if (SDL_SetRenderDrawColor(renderer, b->bg_color->r, b->bg_color->g, b->bg_color->b, b->bg_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->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_container(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; child->container = w; return w; }