Enlightenment CVS committal Author : pfritz Project : e17 Module : libs/ewl
Dir : e17/libs/ewl/src/lib Modified Files: ewl_expansion.c ewl_mvc.c ewl_tree2.c ewl_tree2.h Log Message: make the the tree2 cable to handle selections in branches =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_expansion.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- ewl_expansion.c 12 Nov 2007 22:42:22 -0000 1.6 +++ ewl_expansion.c 9 Dec 2007 00:27:17 -0000 1.7 @@ -53,6 +53,7 @@ ewl_widget_inherit(w, EWL_EXPANSION_TYPE); ewl_object_fill_policy_set(EWL_OBJECT(w), EWL_FLAG_FILL_NONE); + ewl_object_alignment_set(EWL_OBJECT(w), EWL_FLAG_ALIGN_TOP); ewl_object_preferred_inner_size_set(EWL_OBJECT(w), 20, 20); ewl_callback_append(w, EWL_CALLBACK_MOUSE_OUT, =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_mvc.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -3 -r1.37 -r1.38 --- ewl_mvc.c 1 Dec 2007 13:18:54 -0000 1.37 +++ ewl_mvc.c 9 Dec 2007 00:27:17 -0000 1.38 @@ -1235,6 +1235,8 @@ k <= idx->end.column; k++) { w = widget(mvc, sel->data, i, k); + if (!w) continue; + ewl_mvc_highlight_do(mvc, c, sel, w); } } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -3 -r1.88 -r1.89 --- ewl_tree2.c 1 Dec 2007 12:44:15 -0000 1.88 +++ ewl_tree2.c 9 Dec 2007 00:27:17 -0000 1.89 @@ -7,16 +7,24 @@ #include "ewl_expansion.h" #include "ewl_label.h" #include "ewl_paned.h" -#include "ewl_row.h" #include "ewl_tree2_view_scrolled.h" #include "ewl_private.h" #include "ewl_macros.h" #include "ewl_debug.h" +#define EWL_TREE2_EXPANSIONS_LIST(el) ((Ewl_Tree2_Expansions_List *)(el)) + +typedef struct +{ + Ewl_Container *c; + unsigned int *expanded; + unsigned int size; +} Ewl_Tree2_Expansions_List; + static void ewl_tree2_build_tree(Ewl_Tree2 *tree); static void ewl_tree2_build_tree_rows(Ewl_Tree2 *tree, Ewl_Model *model, Ewl_View *view, void *data, - int colour, Ewl_Widget *parent, + int colour, Ewl_Container *parent, int hidden); static void ewl_tree2_cb_header_changed(Ewl_Widget *w, void *ev, void *data); @@ -31,6 +39,9 @@ static void ewl_tree2_expansions_hash_create(Ewl_Tree2 *tree); +static Ewl_Tree2_Expansions_List *ewl_tree2_expansions_list_new(void); +static void ewl_tree2_expansions_list_destroy(Ewl_Tree2_Expansions_List *el); + /** * @return Returns NULL on failure, a new tree widget on success. * @brief Allocate and initialize a new tree widget @@ -371,8 +382,8 @@ void ewl_tree2_row_expand(Ewl_Tree2 *tree, void *data, unsigned int row) { - Ecore_List *exp; - int i, created = 0; + Ewl_Tree2_Expansions_List *exp; + Ewl_Widget *node; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(tree); @@ -383,27 +394,22 @@ if (ewl_tree2_row_expanded_is(tree, data, row)) DRETURN(DLEVEL_STABLE); if (!tree->expansions) - { ewl_tree2_expansions_hash_create(tree); - exp = ecore_list_new(); - created = 1; - } - else - { - exp = ecore_hash_get(tree->expansions, data); - if (!exp) exp = ecore_list_new(); - } - ecore_list_first_goto(exp); - while ((i = (int)ecore_list_next(exp))) + exp = ecore_hash_get(tree->expansions, data); + if (!exp) { - if (i > (int)row) break; + DWARNING("We did not find a expansion list. This should not" + " happen, ever."); + DRETURN(DLEVEL_STABLE); } - ecore_list_insert(exp, (void *)row); + exp->expanded = realloc(exp->expanded, + (++exp->size) * sizeof(unsigned int)); + exp->expanded[exp->size - 1] = row; - if (created) - ecore_hash_set(tree->expansions, data, exp); + node = ewl_container_child_get(exp->c, row); + ewl_tree2_node_expand(EWL_TREE2_NODE(node)); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -419,13 +425,16 @@ void ewl_tree2_row_collapse(Ewl_Tree2 *tree, void *data, unsigned int row) { - Ecore_List *exp; + Ewl_Tree2_Expansions_List *exp; + Ewl_Widget *node; + unsigned int i; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(tree); DCHECK_PARAM_PTR(data); DCHECK_TYPE(tree, EWL_TREE2_TYPE); + /* if this tree has no expansions we're done */ if (!tree->expansions) DRETURN(DLEVEL_STABLE); @@ -437,15 +446,18 @@ /* nothing to do if the row isn't expanded */ if (!ewl_tree2_row_expanded_is(tree, data, row)) DRETURN(DLEVEL_STABLE); - /* we found the item so we can remove it */ - ecore_list_remove(exp); + /* we found the item so we can remove it */ + for (i = 0; exp->expanded[i] != row; i++) + ; + + memmove(exp->expanded + i, exp->expanded + i + 1, + sizeof(unsigned int) * (exp->size - i - 1)); + exp->size--; + exp->expanded = realloc(exp->expanded, + sizeof(unsigned int) * exp->size); - /* no expansions left we can remove this data from the hash */ - if (ecore_list_empty_is(exp)) - { - ecore_hash_remove(tree->expansions, data); - IF_FREE_LIST(exp); - } + node = ewl_container_child_get(exp->c, row); + ewl_tree2_node_collapse(EWL_TREE2_NODE(node)); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -460,8 +472,8 @@ unsigned int ewl_tree2_row_expanded_is(Ewl_Tree2 *tree, void *data, unsigned int row) { - Ecore_List *exp; - int i, expanded = FALSE; + Ewl_Tree2_Expansions_List *exp; + unsigned int i; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR_RET(tree, FALSE); @@ -477,18 +489,10 @@ if (!exp) DRETURN_INT(FALSE, DLEVEL_STABLE); /* search for this row in the expansions */ - ecore_list_first_goto(exp); - while ((i = (int)ecore_list_current(exp))) - { - if (i == (int)row) - { - expanded = TRUE; - break; - } - ecore_list_next(exp); - } + for (i = 0; i < exp->size && exp->expanded[i] != row; i++) + ; - DRETURN_INT(expanded, DLEVEL_STABLE); + DRETURN_INT(exp->expanded && exp->expanded[i] == row, DLEVEL_STABLE); } /** @@ -717,14 +721,14 @@ ewl_container_reset(EWL_CONTAINER(tree->rows)); ewl_tree2_build_tree_rows(tree, model, ewl_mvc_view_get(EWL_MVC(tree)), mvc_data, - 0, tree->rows, FALSE); + 0, EWL_CONTAINER(tree->rows), FALSE); DLEAVE_FUNCTION(DLEVEL_STABLE); } static void ewl_tree2_build_tree_rows(Ewl_Tree2 *tree, Ewl_Model *model, Ewl_View *view, - void *data, int colour, Ewl_Widget *parent, + void *data, int colour, Ewl_Container *parent, int hidden) { unsigned int i = 0, row_count = 0; @@ -733,9 +737,10 @@ DCHECK_PARAM_PTR(tree); DCHECK_TYPE(tree, EWL_TREE2_TYPE); DCHECK_PARAM_PTR(parent); + DCHECK_TYPE(parent, EWL_CONTAINER_TYPE); row_count = model->count(data); - if (!row_count) DRETURN(DLEVEL_STABLE); + if (row_count == 0) DRETURN(DLEVEL_STABLE); while (TRUE) { @@ -748,14 +753,16 @@ ewl_mvc_data_set(EWL_MVC(node), data); ewl_mvc_view_set(EWL_MVC(node), view); - ewl_container_child_append(EWL_CONTAINER(parent), node); + ewl_container_child_append(parent, node); if (!hidden) ewl_widget_show(node); row = ewl_row_new(); ewl_row_header_set(EWL_ROW(row), EWL_CONTAINER(tree->header)); + ewl_tree2_node_row_set(EWL_TREE2_NODE(node), EWL_ROW(row)); ewl_container_child_append(EWL_CONTAINER(node), row); ewl_callback_append(row, EWL_CALLBACK_CLICKED, ewl_tree2_cb_row_clicked, node); + ewl_widget_show(row); if (!model->highlight || model->highlight(data, i)) { @@ -765,9 +772,6 @@ ewl_tree2_cb_row_unhighlight, NULL); } - EWL_TREE2_NODE(node)->row = row; - ewl_widget_show(row); - if (tree->row_color_alternate) { if (colour) @@ -781,7 +785,7 @@ colour = (colour + 1) % 2; /* do the current branch */ - for (column = 0; column < tree->columns; column ++) + for (column = 0; column < tree->columns; column++) ewl_tree2_column_build(EWL_ROW(row), model, view, data, i, column, node); @@ -798,7 +802,7 @@ DRETURN(DLEVEL_STABLE); } - ewl_tree2_node_expandable_set(EWL_TREE2_NODE(node), data); + ewl_tree2_node_expandable_set(EWL_TREE2_NODE(node), TRUE); if (model->expansion.data && ewl_tree2_row_expanded_is(tree, data, i)) @@ -808,7 +812,7 @@ } } else - ewl_tree2_node_expandable_set(EWL_TREE2_NODE(node), NULL); + ewl_tree2_node_expandable_set(EWL_TREE2_NODE(node), FALSE); i++; @@ -934,28 +938,41 @@ unsigned int column) { Ewl_Widget *r, *w; - Ewl_Tree2 *tree; Ewl_Container *c; + Ewl_Tree2 *tree; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR_RET(mvc, NULL); + DCHECK_PARAM_PTR_RET(data, NULL); DCHECK_TYPE_RET(mvc, EWL_TREE2_TYPE, NULL); tree = EWL_TREE2(mvc); - - if (data != ewl_mvc_data_get(mvc)) + + /* get the container that holds the wished row */ + if (ewl_mvc_data_get(mvc) == data) + c = EWL_CONTAINER(tree->rows); + else { - DWARNING("This function doesn't handle tree branches yet"); - DRETURN_PTR(NULL, DLEVEL_STABLE); + Ewl_Tree2_Expansions_List *exp; + + exp = ecore_hash_get(tree->expansions, data); + if (!exp) + DRETURN_PTR(NULL, DLEVEL_STABLE); + + c = exp->c; } - else - c = EWL_CONTAINER(tree->rows); + /* find the row in the container */ r = ewl_container_child_get(c, row); if (tree->type == EWL_TREE_SELECTION_TYPE_ROW) - w = EWL_WIDGET(c); - else + w = EWL_WIDGET(r); + else + { + /* infact our row is a node so we have to get the row + * to search for the right container */ + r = EWL_WIDGET(EWL_TREE2_NODE(r)->row); w = ewl_container_child_get(EWL_CONTAINER(r), column); + } DRETURN_PTR(w, DLEVEL_STABLE); } @@ -963,6 +980,8 @@ static void ewl_tree2_expansions_hash_create(Ewl_Tree2 *tree) { + Ewl_Tree2_Expansions_List *exp; + DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(tree); DCHECK_TYPE(tree, EWL_TREE2_TYPE); @@ -972,7 +991,37 @@ tree->expansions = ecore_hash_new(NULL, NULL); ecore_hash_free_value_cb_set(tree->expansions, - ECORE_FREE_CB(ecore_list_destroy)); + ECORE_FREE_CB(ewl_tree2_expansions_list_destroy)); + + exp = ewl_tree2_expansions_list_new(); + exp->c = EWL_CONTAINER(tree->rows); + ecore_hash_set(tree->expansions, ewl_mvc_data_get(EWL_MVC(tree)), exp); + + DLEAVE_FUNCTION(DLEVEL_STABLE); +} + +static Ewl_Tree2_Expansions_List * +ewl_tree2_expansions_list_new(void) +{ + Ewl_Tree2_Expansions_List *el; + + DENTER_FUNCTION(DLEVEL_STABLE); + + el = NEW(Ewl_Tree2_Expansions_List, 1); + if (!el) + DRETURN_PTR(NULL, DLEVEL_STABLE); + + DRETURN_PTR(el, DLEVEL_STABLE); +} + +static void +ewl_tree2_expansions_list_destroy(Ewl_Tree2_Expansions_List *el) +{ + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR(el); + + IF_FREE(el->expanded); + FREE(el); DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -1031,6 +1080,8 @@ ewl_object_fill_policy_set(EWL_OBJECT(node), EWL_FLAG_FILL_HFILL | EWL_FLAG_FILL_HSHRINK); + ewl_callback_del(EWL_WIDGET(node), EWL_CALLBACK_CONFIGURE, + ewl_box_cb_configure); ewl_callback_append(EWL_WIDGET(node), EWL_CALLBACK_CONFIGURE, ewl_tree2_cb_node_configure, NULL); @@ -1041,7 +1092,7 @@ } void -ewl_tree2_node_expandable_set(Ewl_Tree2_Node *node, void *data) +ewl_tree2_node_expandable_set(Ewl_Tree2_Node *node, unsigned int expandable) { Ewl_Model *model; @@ -1054,34 +1105,31 @@ if (!node->handle && model->expansion.is) { node->handle = ewl_expansion_new(); - ewl_object_fill_policy_set(EWL_OBJECT(node->handle), - EWL_FLAG_FILL_NONE); - ewl_object_alignment_set(EWL_OBJECT(node->handle), - EWL_FLAG_ALIGN_TOP); ewl_container_child_prepend(EWL_CONTAINER(node), node->handle); + ewl_widget_internal_set(EWL_WIDGET(node->handle), TRUE); ewl_widget_show(node->handle); } - if (node->handle) + if (!node->handle) + DRETURN(DLEVEL_STABLE); + + if (expandable) { - if (data) - { - ewl_callback_append(node->handle, EWL_CALLBACK_VALUE_CHANGED, - ewl_tree2_cb_node_toggle, node); - ewl_callback_append(EWL_WIDGET(node), EWL_CALLBACK_DESTROY, - ewl_tree2_cb_node_data_unref, NULL); - ewl_widget_enable(node->handle); - ewl_expansion_expandable_set(EWL_EXPANSION(node->handle), TRUE); - } - else - { - ewl_callback_del(node->handle, EWL_CALLBACK_VALUE_CHANGED, - ewl_tree2_cb_node_toggle); - ewl_callback_del(EWL_WIDGET(node), EWL_CALLBACK_DESTROY, - ewl_tree2_cb_node_data_unref); - ewl_widget_disable(node->handle); - ewl_expansion_expandable_set(EWL_EXPANSION(node->handle), FALSE); - } + ewl_callback_append(node->handle, EWL_CALLBACK_VALUE_CHANGED, + ewl_tree2_cb_node_toggle, node); + ewl_callback_append(EWL_WIDGET(node), EWL_CALLBACK_DESTROY, + ewl_tree2_cb_node_data_unref, NULL); + ewl_widget_enable(node->handle); + ewl_expansion_expandable_set(EWL_EXPANSION(node->handle), TRUE); + } + else + { + ewl_callback_del(node->handle, EWL_CALLBACK_VALUE_CHANGED, + ewl_tree2_cb_node_toggle); + ewl_callback_del(EWL_WIDGET(node), EWL_CALLBACK_DESTROY, + ewl_tree2_cb_node_data_unref); + ewl_widget_disable(node->handle); + ewl_expansion_expandable_set(EWL_EXPANSION(node->handle), FALSE); } DLEAVE_FUNCTION(DLEVEL_STABLE); @@ -1092,8 +1140,10 @@ { DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR_RET(node, FALSE); + DCHECK_TYPE_RET(node, EWL_TREE2_NODE_TYPE, FALSE); - DRETURN_INT((ewl_mvc_data_get(EWL_MVC(node)) ? TRUE : FALSE), DLEVEL_STABLE); + DRETURN_INT((node->handle) && + ewl_expansion_is_expandable(EWL_EXPANSION(node->handle)), DLEVEL_STABLE); } void @@ -1123,7 +1173,7 @@ ecore_dlist_first_goto(EWL_CONTAINER(node)->children); while ((child = ecore_dlist_next(EWL_CONTAINER(node)->children))) { - if ((child != node->handle) && (child != node->row)) + if ((child != node->handle) && (child != EWL_WIDGET(node->row))) ecore_list_append(tmp, child); } @@ -1140,9 +1190,19 @@ Ewl_Model *tmp_model; if (!node->expansion.data) + { + Ewl_Tree2_Expansions_List *exp; + node->expansion.data = model->expansion.data(data, node->row_num); + /* Put the node into the expansions hash */ + exp = ewl_tree2_expansions_list_new(); + exp->c = EWL_CONTAINER(node); + ecore_hash_set(EWL_TREE2(node->tree)->expansions, + node->expansion.data, exp); + } + if (!node->expansion.model && model->expansion.model) node->expansion.model = model->expansion.model(data, node->row_num); @@ -1160,13 +1220,10 @@ ewl_tree2_build_tree_rows(EWL_TREE2(node->tree), tmp_model, tmp_view, node->expansion.data, - 0, EWL_WIDGET(node), FALSE); - + 0, EWL_CONTAINER(node), FALSE); node->built_children = TRUE; } - ewl_tree2_row_expand(EWL_TREE2(node->tree), data, node->row_num); - node->expanded = EWL_TREE_NODE_EXPANDED; ewl_check_checked_set(EWL_CHECK(node->handle), TRUE); @@ -1198,7 +1255,7 @@ ecore_dlist_first_goto(EWL_CONTAINER(node)->children); while ((child = ecore_dlist_next(EWL_CONTAINER(node)->children))) { - if ((child != node->handle) && (child != node->row)) + if ((child != node->handle) && (child != EWL_WIDGET(node->row))) ecore_list_append(tmp, child); } @@ -1207,9 +1264,6 @@ IF_FREE_LIST(tmp); - ewl_tree2_row_collapse(EWL_TREE2(node->tree), - ewl_mvc_data_get(EWL_MVC(node)), node->row_num); - node->expanded = EWL_TREE_NODE_COLLAPSED; ewl_check_checked_set(EWL_CHECK(node->handle), FALSE); @@ -1222,8 +1276,22 @@ DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR_RET(node, FALSE); - DRETURN_INT(((node->expanded == EWL_TREE_NODE_EXPANDED) ? TRUE : FALSE), - DLEVEL_STABLE); + DRETURN_INT((node->expanded == EWL_TREE_NODE_EXPANDED), DLEVEL_STABLE); +} + +void +ewl_tree2_node_row_set(Ewl_Tree2_Node *node, Ewl_Row *row) +{ + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR(node); + DCHECK_PARAM_PTR(row); + DCHECK_TYPE(node, EWL_TREE2_NODE_TYPE); + DCHECK_TYPE(row, EWL_ROW_TYPE); + + node->row = row; + ewl_widget_internal_set(EWL_WIDGET(row), TRUE); + + DLEAVE_FUNCTION(DLEVEL_STABLE); } void @@ -1307,17 +1375,25 @@ ewl_tree2_cb_node_toggle(Ewl_Widget *w __UNUSED__, void *ev_data __UNUSED__, void *data) { + Ewl_Tree2_Node *node; + void *parent_data; + DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR(data); DCHECK_TYPE(data, EWL_TREE2_NODE_TYPE); - if (ewl_tree2_node_expandable_get(EWL_TREE2_NODE(data))) - { - if (ewl_tree2_node_expanded_is(EWL_TREE2_NODE(data))) - ewl_tree2_node_collapse(EWL_TREE2_NODE(data)); - else - ewl_tree2_node_expand(EWL_TREE2_NODE(data)); - } + node = EWL_TREE2_NODE(data); + parent_data = ewl_mvc_data_get(EWL_MVC(node)); + + if (!ewl_tree2_node_expandable_get(node)) + DRETURN(DLEVEL_STABLE); + + if (ewl_tree2_node_expanded_is(node)) + ewl_tree2_row_collapse(EWL_TREE2(node->tree), parent_data, + node->row_num); + else + ewl_tree2_row_expand(EWL_TREE2(node->tree), parent_data, + node->row_num); DLEAVE_FUNCTION(DLEVEL_STABLE); } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.h,v retrieving revision 1.49 retrieving revision 1.50 diff -u -3 -r1.49 -r1.50 --- ewl_tree2.h 11 Nov 2007 06:07:46 -0000 1.49 +++ ewl_tree2.h 9 Dec 2007 00:27:18 -0000 1.50 @@ -3,6 +3,7 @@ #define EWL_TREE2_H #include "ewl_mvc.h" +#include "ewl_row.h" /** * @addtogroup Ewl_Tree2 Ewl_Tree2: A Widget for List or Tree Layout @@ -192,8 +193,8 @@ Ewl_MVC mvc; Ewl_Widget *tree; /**< The parent tree */ - Ewl_Widget *row; /**< The row this node is for */ Ewl_Widget *handle; /**< the expansion handle */ + Ewl_Row *row; /**< The row this node is for */ struct { @@ -210,14 +211,19 @@ Ewl_Widget *ewl_tree2_node_new(void); int ewl_tree2_node_init(Ewl_Tree2_Node *node); -void ewl_tree2_node_expandable_set(Ewl_Tree2_Node *node, void *data); +void ewl_tree2_node_expandable_set(Ewl_Tree2_Node *node, + unsigned int expandable); unsigned int ewl_tree2_node_expandable_get(Ewl_Tree2_Node *node); void ewl_tree2_node_expand(Ewl_Tree2_Node *node); void ewl_tree2_node_collapse(Ewl_Tree2_Node *node); unsigned int ewl_tree2_node_expanded_is(Ewl_Tree2_Node *node); +void ewl_tree2_node_row_set(Ewl_Tree2_Node *node, Ewl_Row *row); +/* + * Internally used callbacks, override at your own risk. + */ void ewl_tree2_cb_node_configure(Ewl_Widget *w, void *ev_data, void *user_data); void ewl_tree2_cb_node_data_unref(Ewl_Widget *w, void *ev_data, void *user_data); void ewl_tree2_cb_node_realize(Ewl_Widget *w, void *ev, void *data); ------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs