aboutsummaryrefslogtreecommitdiff
path: root/src/mgui/widget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mgui/widget.c')
-rw-r--r--src/mgui/widget.c91
1 files changed, 70 insertions, 21 deletions
diff --git a/src/mgui/widget.c b/src/mgui/widget.c
index b9865ca..ed50154 100644
--- a/src/mgui/widget.c
+++ b/src/mgui/widget.c
@@ -6,12 +6,34 @@
#include "../../include/mgui/richtext.h"
#include "../../include/mgui/image.h"
#include "../../include/alloc.h"
+#include <stdio.h>
+#include <stdlib.h>
/* TODO: Use margin */
+/* TODO: Use alignment */
+/* TODO: Use visible flag */
+
+static void mgui_widget_set_flag(mgui_widget *self, uint8_t flag) {
+ self->flags |= flag;
+}
+
+static void mgui_widget_unset_flag(mgui_widget *self, uint8_t flag) {
+ self->flags &= ~flag;
+}
+
+static void mgui_widget_set_flag_state(mgui_widget *self, uint8_t flag, bool set) {
+ if(set)
+ mgui_widget_set_flag(self, flag);
+ else
+ mgui_widget_unset_flag(self, flag);
+}
void mgui_widget_init(mgui_widget *self, mgui_widget_type type) {
self->type = type;
- mgui_widget_set_margin(self, 0, 0, 0, 0);
+ self->flags = MGUI_WIDGET_VISIBLE;
+ self->alignment = MGUI_WIDGET_ALIGN_TOP_LEFT;
+ mgui_widget_set_margin(self, (mgui_margin){ 0, 0, 0, 0 });
+ self->size = (mgl_vec2i){ 0, 0 };
}
void mgui_widget_destroy(mgui_widget *widget) {
@@ -37,11 +59,25 @@ void mgui_widget_destroy(mgui_widget *widget) {
}
}
-void mgui_widget_set_margin(mgui_widget *self, int left, int top, int right, int bottom) {
- self->margin.left = left;
- self->margin.top = top;
- self->margin.right = right;
- self->margin.bottom = bottom;
+void mgui_widget_set_visible(mgui_widget *self, bool visible) {
+ mgui_widget_set_flag_state(self, MGUI_WIDGET_VISIBLE, visible);
+}
+
+void mgui_widget_set_expand(mgui_widget *self, bool horizontal, bool vertical) {
+ mgui_widget_set_flag_state(self, MGUI_WIDGET_EXPAND_HORIZONTAL, horizontal);
+ mgui_widget_set_flag_state(self, MGUI_WIDGET_EXPAND_VERTICAL, vertical);
+}
+
+void mgui_widget_set_alignment(mgui_widget *self, mgui_alignment alignment) {
+ self->alignment = alignment;
+}
+
+void mgui_widget_set_margin(mgui_widget *self, mgui_margin margin) {
+ self->margin = margin;
+}
+
+void mgui_widget_set_size(mgui_widget *self, mgl_vec2i size) {
+ self->size = size;
}
void mgui_widget_set_position(mgui_widget *self, mgl_vec2i position) {
@@ -67,29 +103,37 @@ void mgui_widget_set_position(mgui_widget *self, mgl_vec2i position) {
}
}
-void mgui_widget_set_width(mgui_widget *self, int width) {
+void mgui_widget_calculate_size(mgui_widget *self, mgl_vec2i max_size) {
switch(self->type) {
case MGUI_WIDGET_LIST:
- mgui_list_set_width(mgui_widget_to_list(self), width);
+ mgui_list_calculate_size(mgui_widget_to_list(self), max_size);
break;
case MGUI_WIDGET_SCROLLVIEW:
- mgui_scrollview_set_width(mgui_widget_to_scrollview(self), width);
+ mgui_scrollview_calculate_size(mgui_widget_to_scrollview(self), max_size);
break;
case MGUI_WIDGET_BUTTON:
- mgui_button_set_width(mgui_widget_to_button(self), width);
+ mgui_button_calculate_size(mgui_widget_to_button(self), max_size);
break;
case MGUI_WIDGET_LABEL:
- mgui_label_set_width(mgui_widget_to_label(self), width);
+ mgui_label_calculate_size(mgui_widget_to_label(self), max_size);
break;
case MGUI_WIDGET_RICHTEXT:
- mgui_richtext_set_width(mgui_widget_to_richtext(self), width);
+ mgui_richtext_calculate_size(mgui_widget_to_richtext(self), max_size);
break;
case MGUI_WIDGET_IMAGE:
- mgui_image_set_width(mgui_widget_to_image(self), width);
+ mgui_image_calculate_size(mgui_widget_to_image(self), max_size);
break;
}
}
+void mgui_widget_set_has_parent(mgui_widget *self) {
+ if(self->flags & MGUI_WIDGET_DEBUG_HAS_PARENT) {
+ fprintf(stderr, "mglgui error: widget %p was added to a list/scrollview twice. One widget can only belong to one list/scrollview.\n", (void*)self);
+ abort();
+ }
+ self->flags |= MGUI_WIDGET_DEBUG_HAS_PARENT;
+}
+
void mgui_widget_on_event(mgui_widget *self, mgl_window *window, mgl_event *event) {
switch(self->type) {
case MGUI_WIDGET_LIST:
@@ -113,20 +157,25 @@ void mgui_widget_on_event(mgui_widget *self, mgl_window *window, mgl_event *even
}
}
-mgl_vec2i mgui_widget_draw(mgui_widget *self, mgl_window *window) {
+void mgui_widget_draw(mgui_widget *self, mgl_window *window) {
switch(self->type) {
case MGUI_WIDGET_LIST:
- return mgui_list_draw(mgui_widget_to_list(self), window);
+ mgui_list_draw(mgui_widget_to_list(self), window);
+ break;
case MGUI_WIDGET_SCROLLVIEW:
- return mgui_scrollview_draw(mgui_widget_to_scrollview(self), window);
+ mgui_scrollview_draw(mgui_widget_to_scrollview(self), window);
+ break;
case MGUI_WIDGET_BUTTON:
- return mgui_button_draw(mgui_widget_to_button(self), window);
+ mgui_button_draw(mgui_widget_to_button(self), window);
+ break;
case MGUI_WIDGET_LABEL:
- return mgui_label_draw(mgui_widget_to_label(self), window);
+ mgui_label_draw(mgui_widget_to_label(self), window);
+ break;
case MGUI_WIDGET_RICHTEXT:
- return mgui_richtext_draw(mgui_widget_to_richtext(self), window);
+ mgui_richtext_draw(mgui_widget_to_richtext(self), window);
+ break;
case MGUI_WIDGET_IMAGE:
- return mgui_image_draw(mgui_widget_to_image(self), window);
+ mgui_image_draw(mgui_widget_to_image(self), window);
+ break;
}
- return (mgl_vec2i){ 0, 0 };
}