diff --git a/gui/gui.c b/gui/gui.c index eba6461..cbfd33e 100644 --- a/gui/gui.c +++ b/gui/gui.c @@ -172,6 +172,10 @@ struct GUI_Subtree { RDIC_Node_Reference relative_to; int flat_offset_x; int flat_offset_y; + int offset_relative_node_percentage_x; + int offset_relative_node_percentage_y; + int offset_own_size_percentage_x; + int offset_own_size_percentage_y; GUI_Draw_Command *first_draw_command; int num_draw_commands; @@ -641,12 +645,23 @@ void gui_generate_draw_commands( x_offset = relative_rectangle->x0; y_offset = relative_rectangle->y0; //printf("%.*s: %d, %d\n", relative_node->debug_string.length, relative_node->debug_string.cstring, x_offset, y_offset); + int relative_width = relative_rectangle->x1 - relative_rectangle->x0; + int relative_height = relative_rectangle->y1 - relative_rectangle->y0; + x_offset += + (relative_width * subtree->offset_relative_node_percentage_x) / 100; + y_offset += + (relative_height * subtree->offset_relative_node_percentage_y) / 100; } x_offset += subtree->flat_offset_x; y_offset += subtree->flat_offset_y; GUI_Node *root = (GUI_Node*)subtree->rdic.root; assert(root != NULL); + x_offset += + (root->computed_size[GUI_AXIS2_X] * subtree->offset_own_size_percentage_x) / 100; + y_offset += + (root->computed_size[GUI_AXIS2_Y] * subtree->offset_own_size_percentage_y) / 100; + assert(draw_command_arena != NULL); assert(out_num_draw_commands != NULL); *out_num_draw_commands = 0; @@ -1442,6 +1457,7 @@ void test_gui__subtree( inner_top = gui_dumb_block(context, inner_top, &outer_style, element_size); ((GUI_Node*)inner_top.node)->image = &test_image; } gui_pop_subtree(context); +#if 0 int middle_height = ((GUI_Node*)middle.node)->computed_size[GUI_AXIS2_Y]; int subtree_height = @@ -1458,6 +1474,11 @@ void test_gui__subtree( { middle_subtree.flat_offset_y = 0; } +#else + printf("slider value: %f\n", slider_value); + middle_subtree.offset_relative_node_percentage_y = slider_value*100; + middle_subtree.offset_own_size_percentage_y = slider_value*-100; +#endif ((GUI_Node*)middle_subtree_root.node)->dirty = ((GUI_Node*)slider.node)->dirty; bottom = gui_dumb_block(context, bottom, &outer_style, top_bottom_size);