diff --git a/gui/gui.c b/gui/gui.c index 55fc719..d7a92ee 100644 --- a/gui/gui.c +++ b/gui/gui.c @@ -188,6 +188,9 @@ struct GUI_Subtree { GUI_Subtree *next; GUI_Subtree *structural_parent; + // TODO(Zelaven): + // GUI_Rectangle cliprect; + GUI_Node_Reference relative_to; int flat_offset_x; int flat_offset_y; @@ -195,20 +198,30 @@ struct GUI_Subtree { int offset_relative_node_percentage_y; int offset_own_size_percentage_x; int offset_own_size_percentage_y; +}; + + +typedef struct { + GUI_Subtree *first_subtree; + //GUI_Subtree *last_subtree; + //GUI_Subtree *current_subtree; GUI_Draw_Command *first_draw_command; int num_draw_commands; - Pixel_Buffer *pixel_buffer; -}; + Pixel_Buffer pixel_buffer; +} GUI_Layer; typedef struct { //RDIC_Context rdic; - GUI_Subtree *first_subtree; - GUI_Subtree *last_subtree; + //GUI_Subtree *first_subtree; + //GUI_Subtree *last_subtree; GUI_Subtree *current_subtree; + GUI_Layer background_layer; + GUI_Layer top_layer; + GUI_Node_Reference focused_node; GUI_Node_Reference hovered_node; GUI_Node_Reference top_node_under_cursor; @@ -316,8 +329,25 @@ void gui_apply_input( int mouse_x, int mouse_y) { + // --- Mouse Input --- + // NOTE(Zelaven): First hit test against layers. + GUI_Layer *hit_layer = &context->background_layer; + { + GUI_Layer *top_layer = &context->top_layer; + if(top_layer->first_subtree != NULL) + { + GUI_Node *top_layer_root = + (GUI_Node*)top_layer->first_subtree->rdic.root; + if(point_in_rect(mouse_x, mouse_y, top_layer_root->rect)) + { + hit_layer = &context->top_layer; + } + } + } + //GUI_Node *top_node_under_cursor = (GUI_Node*)context->rdic.root; - GUI_Node *top_node_under_cursor = (GUI_Node*)context->first_subtree->rdic.root; + //GUI_Node *top_node_under_cursor = (GUI_Node*)context->first_subtree->rdic.root; + GUI_Node *top_node_under_cursor = (GUI_Node*)hit_layer->first_subtree->rdic.root; GUI_Node *current_node = (GUI_Node*)top_node_under_cursor->rdic_node.first_child; int mouse_over_node = 0; while(current_node != NULL) @@ -410,8 +440,8 @@ GUI_Node_Reference gui_context_start_frame( static GUI_Subtree background_subtree = {0}; background_subtree.rdic.node_freelist = context->node_freelist; - context->first_subtree = &background_subtree; - context->last_subtree = &background_subtree; + context->background_layer.first_subtree = &background_subtree; + //context->background_layer.last_subtree = &background_subtree; context->current_subtree = &background_subtree; GUI_Node_Reference new_root_reference = { @@ -445,8 +475,9 @@ GUI_Node_Reference gui_context_start_frame( void gui_context_finish_frame( GUI_Context *context) { - rdic_context_finish_frame(&context->first_subtree->rdic); - context->node_freelist = context->first_subtree->rdic.node_freelist; + rdic_context_finish_frame(&context->background_layer.first_subtree->rdic); + context->node_freelist = + context->background_layer.first_subtree->rdic.node_freelist; } GUI_Node_Reference gui_push_subtree( @@ -461,9 +492,10 @@ GUI_Node_Reference gui_push_subtree( context->node_freelist = context->current_subtree->rdic.node_freelist; subtree->rdic.node_freelist = context->node_freelist; - context->last_subtree->next = subtree; - subtree->prev = context->last_subtree; - context->last_subtree = subtree; + // NOTE(Zelaven): Well, not being able to do this is a problem... + //context->last_subtree->next = subtree; + //subtree->prev = context->last_subtree; + //context->last_subtree = subtree; subtree->structural_parent = context->current_subtree; context->current_subtree = subtree; @@ -3158,7 +3190,7 @@ int main(void) //gui_layout_nodes(&context); #if 1 for( - GUI_Subtree *current = context.first_subtree; + GUI_Subtree *current = context.background_layer.first_subtree; current != NULL; current = current->next) {