diff --git a/libraven.h b/libraven.h index 543c6fa..8ba91a8 100644 --- a/libraven.h +++ b/libraven.h @@ -639,13 +639,20 @@ int dispatcher_handle(UINode *node, enum UIEvent ev, size_t d, void *p); // #include "node.h" // -- commented because of single-header bundle +enum UIBoxLayoutJustify { + UI_BOX_LAYOUT_JUSTIFY_START, + UI_BOX_LAYOUT_JUSTIFY_CENTER +}; + typedef struct UIBoxLayoutNode { UINode node; enum UIDirection direction; + enum UIBoxLayoutJustify justify_secondary_dimension; double margin_top, margin_left, margin_bottom, margin_right, gap; } UIBoxLayoutNode; UIBoxLayoutNode *box_layout_new(UINode *parent, enum UIDirection direction); +void box_layout_set_margins(UIBoxLayoutNode *layout, double margin); int box_layout_handle(UINode *component, enum UIEvent ev, size_t d, void *p); #endif // _UI__BOX_LAYOUT_NODE_H @@ -667,7 +674,7 @@ typedef struct UITextNode { UINode node; PangoFontDescription *desc; PangoLayout *layout; - char *pending_text; + char *_pending_text; UIRGBA color; ssize_t caret_index; UINode *caret_node; @@ -675,6 +682,7 @@ typedef struct UITextNode { } UITextNode; int text_node_handle(UINode *node, enum UIEvent ev, size_t d, void *p); +void text_node_set_text(UITextNode *text_node, char *text); UITextNode *text_node_new(UINode *parent, PangoFontDescription *desc, UIRGBA color, char *text); #endif // _UI__TEXT_NODE_H @@ -2276,7 +2284,11 @@ int box_layout_handle(UINode *component, enum UIEvent ev, size_t d, void *p) x += gap; } current->rect.x = x; - current->rect.y = y; + if (box_layout_node->justify_secondary_dimension == UI_BOX_LAYOUT_JUSTIFY_CENTER) { + current->rect.y = margin_top + (maximum_secondary_position - current->rect.h) / 2; + } else { + current->rect.y = y; + } x += current->rect.w; } else { if (current->height_policy == UI_SIZE_POLICY_GROW) { @@ -2288,7 +2300,11 @@ int box_layout_handle(UINode *component, enum UIEvent ev, size_t d, void *p) if (current_index) { y += gap; } - current->rect.x = x; + if (box_layout_node->justify_secondary_dimension == UI_BOX_LAYOUT_JUSTIFY_CENTER) { + current->rect.x = margin_left + (maximum_secondary_position - current->rect.w) / 2; + } else { + current->rect.x = x; + } current->rect.y = y; y += current->rect.h; } @@ -2301,6 +2317,14 @@ int box_layout_handle(UINode *component, enum UIEvent ev, size_t d, void *p) return 0; } +void box_layout_set_margins(UIBoxLayoutNode *layout, double margin) +{ + layout->margin_top = margin; + layout->margin_left = margin; + layout->margin_bottom = margin; + layout->margin_right = margin; +} + UIBoxLayoutNode *box_layout_new(UINode *parent, enum UIDirection direction) { UIBoxLayoutNode *n = malloc(sizeof(UIBoxLayoutNode)); @@ -2336,7 +2360,7 @@ UITextNode *text_node_new(UINode *parent, PangoFontDescription *desc, UIRGBA col UITextNode *n = malloc(sizeof(UITextNode)); node_init(&n->node); n->node.flags = UI_NODE_COMPONENT; - n->pending_text = text; + n->_pending_text = text; n->desc = desc; n->layout = NULL; n->color = color; @@ -2349,6 +2373,12 @@ UITextNode *text_node_new(UINode *parent, PangoFontDescription *desc, UIRGBA col return n; } +void text_node_set_text(UITextNode *text_node, char *text) +{ + text_node->_pending_text = text; + text_node->node.cached_computed_extents = false; +} + int text_node_handle(UINode *node, enum UIEvent ev, size_t d, void *p) { (void)d; @@ -2360,11 +2390,11 @@ int text_node_handle(UINode *node, enum UIEvent ev, size_t d, void *p) UITextNode *n = (UITextNode*)node; - if (n->pending_text) { + if (n->_pending_text) { if (n->layout) { - pango_layout_set_text(n->layout, n->pending_text, -1); + pango_layout_set_text(n->layout, n->_pending_text, -1); pango_cairo_update_layout(node->drw, n->layout); - n->pending_text = NULL; + n->_pending_text = NULL; } else { PangoLayout *layout = pango_cairo_create_layout(n->node.drw); pango_layout_set_font_description(layout, n->desc); @@ -2373,11 +2403,10 @@ int text_node_handle(UINode *node, enum UIEvent ev, size_t d, void *p) } else { pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); } - pango_layout_set_text(layout, n->pending_text, -1); + pango_layout_set_text(layout, n->_pending_text, -1); n->layout = layout; - n->pending_text = NULL; + n->_pending_text = NULL; } - node->parent->cached_computed_extents = false; } switch (ev) { @@ -2442,7 +2471,7 @@ int text_node_handle(UINode *node, enum UIEvent ev, size_t d, void *p) g_object_unref(n->layout); } n->layout = NULL; - n->pending_text = NULL; + n->_pending_text = NULL; break; } default: { @@ -2484,10 +2513,6 @@ int text_input_handle(UINode *node, enum UIEvent ev, size_t d, void *p) UITextInputNode *n = (UITextInputNode *)node; switch (ev) { - case UI_EVENT_ATTACHED: { - node_notify_subscribe(node->parent, node, (enum UIEvent[]){ UI_EVENT_KEY_DOWN, UI_EVENT_PRESSED, UI_EVENT_UNPRESSED, 0 }); - break; - } case UI_EVENT_KEY_DOWN: { xkb_keycode_t keycode = d; struct xkb_state *xkb_state = (struct xkb_state*)p; @@ -2545,7 +2570,7 @@ int text_input_handle(UINode *node, enum UIEvent ev, size_t d, void *p) } if (n->text_node) { - n->text_node->pending_text = n->text.data; + text_node_set_text(n->text_node, n->text.data); n->text_node->caret_index = n->text_cursor_index; n->text_node->wrap = true; node_request_relayout(&n->text_node->node);