|
@@ -120,39 +120,97 @@ struct zori_handler * zori_handlers_search(struct zori_handlers * me, zori_even
|
|
|
|
|
|
int zori_handlers_handle(struct zori_handlers * me, union zori_event * event) {
|
|
|
struct zori_handler * handler = zori_handlers_search(me, event->type);
|
|
|
- if (!handler) return 0;
|
|
|
+ if (!handler) return ZORI_HANDLE_IGNORE;
|
|
|
event->any.data = handler->data;
|
|
|
return handler->handler(event);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ * For example, a hidden widget won't draw, and a disabled widget won't
|
|
|
+ * accept any system events, and a NULL event doesn't accept events at all.. */
|
|
|
+int zori_widget_accepts_event(struct zori_widget * widget, union zori_event * event) {
|
|
|
+ if (!widget) return 0;
|
|
|
+ switch(event->any.type) {
|
|
|
+ case ZORI_EVENT_DRAW:
|
|
|
+ return zori_widget_visible(widget);
|
|
|
+ default:
|
|
|
+ return zori_widget_active(widget);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+int zori_widget_self_raise_event(struct zori_widget * widget,
|
|
|
+union zori_event * event) {
|
|
|
+ enum zori_handle_result result;
|
|
|
+ if (zori_widget_accepts_event(widget, event)) {
|
|
|
+ event->any.widget = widget;
|
|
|
+ return zori_handlers_handle(&widget->handlers, event);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ZORI_HANDLE_PASS;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * children automatically and recursively. */
|
|
|
+int
|
|
|
+zori_widget_raise_event(struct zori_widget * widget, union zori_event * event) {
|
|
|
+ enum zori_handle_result result =
|
|
|
+ zori_widget_self_raise_event(widget, event);
|
|
|
+
|
|
|
+ if (zori_propagate_event_p(result)) {
|
|
|
+ enum zori_handle_result sub;
|
|
|
+ size_t index;
|
|
|
+ for (index = 0; index < miao_size(&widget->children); index++) {
|
|
|
+ struct zori_widget * child = miao_unsafe_get(&widget->children, index);
|
|
|
+ event->any.widget = child;
|
|
|
+ sub = zori_widget_raise_event(child, event);
|
|
|
+ if (sub == ZORI_HANDLE_DONE) {
|
|
|
+ result = ZORI_HANDLE_DONE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
int zori_widget_raise_system_event
|
|
|
(struct zori_widget * widget, zori_system_event * sysev) {
|
|
|
union zori_event event;
|
|
|
event.sys.any.type = sysev->type;
|
|
|
event.sys.any.widget = widget;
|
|
|
event.sys.ev = sysev;
|
|
|
- return zori_handlers_handle(&widget->handlers, &event);
|
|
|
+ return zori_widget_raise_event(widget, &event);
|
|
|
}
|
|
|
|
|
|
int zori_widget_raise_draw_event(struct zori_widget * widget) {
|
|
|
union zori_event event;
|
|
|
event.draw.any.type = ZORI_EVENT_DRAW;
|
|
|
event.draw.any.widget = widget;
|
|
|
- return zori_handlers_handle(&widget->handlers, &event);
|
|
|
+ return zori_widget_raise_event(widget, &event);
|
|
|
}
|
|
|
|
|
|
+int zori_widget_raise_overdraw_event(struct zori_widget * widget) {
|
|
|
+ union zori_event event;
|
|
|
+ event.draw.any.type = ZORI_EVENT_OVERDRAW;
|
|
|
+ event.draw.any.widget = widget;
|
|
|
+ return zori_widget_raise_event(widget, &event);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
int zori_widget_raise_done_event(struct zori_widget * widget) {
|
|
|
union zori_event event;
|
|
|
event.done.any.type = ZORI_EVENT_DONE;
|
|
|
event.done.any.widget = widget;
|
|
|
- return zori_handlers_handle(&widget->handlers, &event);
|
|
|
+ return zori_widget_raise_event(widget, &event);
|
|
|
}
|
|
|
|
|
|
int zori_widget_raise_free_event(struct zori_widget * widget) {
|
|
|
union zori_event event;
|
|
|
event.free.any.type = ZORI_EVENT_FREE;
|
|
|
event.free.any.widget = widget;
|
|
|
- return zori_handlers_handle(&widget->handlers, &event);
|
|
|
+ return zori_widget_raise_event(widget, &event);
|
|
|
}
|
|
|
|
|
|
int zori_widget_raise_update_event
|
|
@@ -161,7 +219,7 @@ int zori_widget_raise_update_event
|
|
|
event.update.any.type = ZORI_EVENT_DONE;
|
|
|
event.update.any.widget = widget;
|
|
|
event.update.dt = dt;
|
|
|
- return zori_handlers_handle(&widget->handlers, &event);
|
|
|
+ return zori_widget_raise_event(widget, &event);
|
|
|
}
|
|
|
|
|
|
int zori_widget_raise_action_event
|
|
@@ -169,7 +227,7 @@ int zori_widget_raise_action_event
|
|
|
union zori_event event;
|
|
|
event.action.any.type = ZORI_EVENT_ACTION;
|
|
|
event.action.any.widget = widget;
|
|
|
- return zori_handlers_handle(&widget->handlers, &event);
|
|
|
+ return zori_widget_raise_event(widget, &event);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -241,6 +299,8 @@ zori_id zori_start(struct zori_style * default_style) {
|
|
|
the_default_style->text.color = al_color_name("white");
|
|
|
the_default_style->border.color = al_color_name("white");
|
|
|
the_default_style->back.color = al_color_name("green");
|
|
|
+ the_default_style->fore.color = al_color_name("white");
|
|
|
+
|
|
|
|
|
|
if (default_style) {
|
|
|
the_zori_root->widget.style = *default_style;
|
|
@@ -393,23 +453,23 @@ zori_id zori_new_button_widget(zori_id parent, zori_rebox box, char * text);
|
|
|
|
|
|
zori_id zori_new_conversation_widget(zori_id parent, zori_rebox box, char * text);
|
|
|
|
|
|
-
|
|
|
-void zori_draw_widget(struct zori_widget * widget) {
|
|
|
- size_t index;
|
|
|
- if (widget && zori_widget_visible(widget)) {
|
|
|
- zori_widget_raise_draw_event(widget);
|
|
|
- for (index = 0; index < miao_size(&widget->children); index++) {
|
|
|
- struct zori_widget * child = miao_unsafe_get(&widget->children, index);
|
|
|
- zori_draw_widget(child);
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
+
|
|
|
+ * recursively depending on the need to do that. */
|
|
|
+void zori_widget_handle_event(struct zori_widget * widget, union zori_event * event) {
|
|
|
+ zori_widget_raise_event(widget, event);
|
|
|
}
|
|
|
|
|
|
|
|
|
void zori_draw_all(void) {
|
|
|
- zori_draw_widget(&the_zori_root->widget);
|
|
|
+ zori_widget_raise_draw_event(&the_zori_root->widget);
|
|
|
+ zori_widget_raise_overdraw_event(&the_zori_root->widget);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
int zori_widget_visible(struct zori_widget * widget) {
|
|
|
return widget && ((widget->flags & ZORI_FLAG_HIDDEN) != ZORI_FLAG_HIDDEN);
|
|
|
}
|
|
@@ -437,7 +497,6 @@ int zori_widget_visible_(struct zori_widget * widget, int set) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
void zori_update(double dt)
|
|
|
{
|
|
@@ -448,7 +507,6 @@ void zori_update(double dt)
|
|
|
zori_id zori_register(zori_id id, zori_event_type type, zori_handler_func handler, void * extra);
|
|
|
|
|
|
|
|
|
-
|
|
|
zori_font * zori_widget_font(struct zori_widget * widget) {
|
|
|
return widget->style.text.font;
|
|
|
}
|
|
@@ -753,8 +811,8 @@ int zori_console_draw(union zori_event * zevent) {
|
|
|
y = zori_widget_y(widget) - 5;
|
|
|
linehigh = zori_font_lineheight(font);
|
|
|
|
|
|
- now = ustrlist_head(&self->text);
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
now = ustrlist_skipnode(&self->text, self->start);
|
|
|
|
|
|
for (index = high-(linehigh*2); index > 0; index -= linehigh) {
|
|
@@ -767,14 +825,16 @@ int zori_console_draw(union zori_event * zevent) {
|
|
|
now = ustrlistnode_next(now);
|
|
|
}
|
|
|
|
|
|
- zori_font_drawstr(font, color, x, y + high - linehigh, 0, self->input);
|
|
|
+ if (self->input) {
|
|
|
+ zori_font_drawstr(font, color, x, y + high - linehigh, 0, self->input);
|
|
|
+ }
|
|
|
|
|
|
linew = al_get_ustr_width(font, self->input);
|
|
|
al_draw_line(x + linew, y + high - linehigh, x + linew, y + high, color, 1);
|
|
|
|
|
|
al_draw_textf(font, color, x, y, 0, "start: %d, size: %d", self->start,
|
|
|
ustrlist_size(&self->text));
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_PASS;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -797,7 +857,7 @@ int zori_console_scroll(struct zori_console * self, int direction) {
|
|
|
if(direction > 0) self->start++;
|
|
|
|
|
|
self->start = bad_clampi(self->start, 0, ustrlist_size(&self->text));
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -812,13 +872,13 @@ int zori_console_handle_keychar(union zori_event * zevent) {
|
|
|
|
|
|
case ALLEGRO_KEY_F1:
|
|
|
case ALLEGRO_KEY_F3:
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
case ALLEGRO_KEY_PGUP: return zori_console_scroll(self, 1);
|
|
|
case ALLEGRO_KEY_PGDN: return zori_console_scroll(self, -1);
|
|
|
case ALLEGRO_KEY_BACKSPACE:
|
|
|
|
|
|
ustr_remove_chr(self->input, ustr_offset(self->input, -1));
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
break;
|
|
|
case ALLEGRO_KEY_ENTER: {
|
|
|
const char * command = ustr_c(self->input);
|
|
@@ -829,14 +889,14 @@ int zori_console_handle_keychar(union zori_event * zevent) {
|
|
|
}
|
|
|
ustr_truncate(self->input, 0);
|
|
|
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
}
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
ustr_appendch(self->input, ch);
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -853,7 +913,7 @@ int zori_console_handle_keydown(union zori_event * zevent) {
|
|
|
|
|
|
* Note: this shouldnever happen if react is set up well.
|
|
|
*/
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -869,7 +929,7 @@ int zori_console_handle_mouseaxes(union zori_event * zevent) {
|
|
|
if(z == 0) return ZORI_HANDLE_IGNORE;
|
|
|
if(z < 0) return zori_console_scroll(self, -1);
|
|
|
if(z > 0) return zori_console_scroll(self, +1);
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
}
|
|
|
|
|
|
int zori_console_handle_ignore(union zori_event * zevent) {
|
|
@@ -909,7 +969,7 @@ int zori_console_done(struct zori_widget * widget) {
|
|
|
ustr_free(self->input);
|
|
|
self->input = NULL;
|
|
|
ustrlist_done(&self->text);
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -918,7 +978,7 @@ int zori_console_free(struct zori_widget * widget) {
|
|
|
struct zori_console * self = zori_widget_console(widget);
|
|
|
zori_console_done(&self->widget);
|
|
|
free(self);
|
|
|
- return ZORI_HANDLE_OK;
|
|
|
+ return ZORI_HANDLE_DONE;
|
|
|
}
|
|
|
|
|
|
|