/* * 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 . */ #ifndef MFTK_WIDGET_H_ #define MFTK_WIDGET_H_ #include #include void mftk_window_index(struct mftk_window *win, struct mftk_widget *wid); void mftk_window_focus(struct mftk_window *win, struct mftk_widget *wid); enum mftk_widget_role { MFTK_WIDGET_ROLE_NONE, MFTK_WIDGET_ROLE_FOCUSABLE, MFTK_WIDGET_ROLE_CONTAINER }; struct mftk_widget { int w; int h; struct mftk_widget *container; int vis; void (*layout)(struct mftk_widget *); void (*index)(struct mftk_widget *, struct mftk_window *); int (*key_event)(struct mftk_widget *, SDL_Event *); int (*mouse_event)(struct mftk_widget *, SDL_Event *, int, int); int (*render)(struct mftk_widget *, SDL_Renderer *, int, int); void (*destroy)(struct mftk_widget *); enum mftk_widget_role role; struct mftk_widget *prev; struct mftk_widget *next; struct mftk_window *window; int focused; }; struct mftk_widget * mftk_widget_new(size_t size); #define mftk_widget_init(w, t_w, name) \ do { \ w = mftk_widget_new(sizeof(struct mftk_##name)); \ if (w == NULL) { \ return NULL; \ }; \ w->layout = &_mftk_##name##_layout; \ w->mouse_event = &_mftk_##name##_mouse_event; \ w->render = &_mftk_##name##_render; \ w->destroy = &_mftk_##name##_destroy; \ w->role = MFTK_WIDGET_ROLE_NONE; \ t_w = (struct mftk_##name *) w; \ } while (0) #define mftk_widget_init_focusable(w, t_w, name) \ do { \ w = mftk_widget_new(sizeof(struct mftk_##name)); \ if (w == NULL) { \ return NULL; \ }; \ w->layout = &_mftk_##name##_layout; \ w->key_event = &_mftk_##name##_key_event; \ w->mouse_event = &_mftk_##name##_mouse_event; \ w->render = &_mftk_##name##_render; \ w->destroy = &_mftk_##name##_destroy; \ w->role = MFTK_WIDGET_ROLE_FOCUSABLE; \ t_w = (struct mftk_##name *) w; \ } while (0) #define mftk_widget_init_container(w, t_w, name) \ do { \ w = mftk_widget_new(sizeof(struct mftk_##name)); \ if (w == NULL) { \ return NULL; \ }; \ w->layout = &_mftk_##name##_layout; \ w->index = &_mftk_##name##_index; \ w->mouse_event = &_mftk_##name##_mouse_event; \ w->render = &_mftk_##name##_render; \ w->destroy = &_mftk_##name##_destroy; \ w->role = MFTK_WIDGET_ROLE_CONTAINER; \ t_w = (struct mftk_##name *) w; \ } while (0) void mftk_widget_set_visible(struct mftk_widget *w, int v); int mftk_widget_get_visible(struct mftk_widget *w) __attribute__((__pure__)); void mftk_widget_layout(struct mftk_widget *w); void mftk_widget_index(struct mftk_widget *w, struct mftk_window *win); int mftk_widget_mouse_event(struct mftk_widget *w, SDL_Event *e, int x, int y); int mftk_widget_key_event(struct mftk_widget *w, SDL_Event *e); int mftk_widget_render(struct mftk_widget *w, SDL_Renderer *renderer, int x, int y); void mftk_widget_destroy(struct mftk_widget **w); struct mftk_widget * mftk_grid_new_a(int rows, int cols, int row_spacing, int col_spacing, struct mftk_widget **children, int *alignments); enum mftk_check_shape { MFTK_CHECK_SHAPE_BOX, MFTK_CHECK_SHAPE_CIR }; void mftk_check_set_shape(struct mftk_widget *w, enum mftk_check_shape shape); void mftk_check_set_state(struct mftk_widget *w, int state); void mftk_check_set_steals_focus(struct mftk_widget *w, int steals_focus); #endif /* MFTK_WIDGET_H_ */