Enlightenment CVS committal Author : moom16 Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: etk_tree.c etk_tree.h etk_types.h Log Message: * Fix some minor bugs of the default theme * Add basic keyboard navigation in the tree, and fix multiple selection with in the TREE mode. Also add functions to the API to get the previous and the next row of a row =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- etk_tree.c 19 Dec 2005 13:30:32 -0000 1.17 +++ etk_tree.c 20 Dec 2005 18:25:28 -0000 1.18 @@ -101,6 +101,7 @@ static void _etk_tree_row_pressed_cb(Etk_Object *object, void *event_info, void *data); static void _etk_tree_focus_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_unfocus_cb(Etk_Object *object, void *event, void *data); +static void _etk_tree_key_down_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_header_mouse_down_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_header_mouse_up_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_header_mouse_move_cb(Etk_Object *object, void *event, void *data); @@ -108,19 +109,19 @@ static void _etk_tree_header_mouse_out_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_update(Etk_Tree *tree); -static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Node *node, Evas_List **items_objects, +static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Row *first_row, Evas_List **items_objects, int x, int w, int h, int xoffset, int yoffset, int first_row_id, int first_row_color); -static Etk_Tree_Row *_etk_tree_row_new_valist(Etk_Tree *tree, Etk_Tree_Node *node, va_list args); +static Etk_Tree_Row *_etk_tree_row_new_valist(Etk_Tree *tree, Etk_Tree_Row *row, va_list args); static Etk_Tree_Row_Objects *_etk_tree_row_objects_new(Etk_Tree *tree); static void _etk_tree_row_objects_free(Etk_Tree_Row_Objects *row_objects, Etk_Tree *tree); static void _etk_tree_row_free(Etk_Tree_Row *row); static void _etk_tree_col_realize(Etk_Tree *tree, int col_nth); static Etk_Tree_Col *etk_tree_col_to_resize_get(Etk_Tree_Col *col, int x); -static void _etk_tree_node_selected_rows_get(Etk_Tree_Node *node, Evas_List **selected_rows); -static void _etk_tree_node_select_all(Etk_Tree_Node *node); -static void _etk_tree_node_unselect_all(Etk_Tree_Node *node); -static void _etk_tree_node_select(Etk_Tree *tree, Etk_Tree_Node *node, Evas_Modifier *modifiers); +static void _etk_tree_row_selected_rows_get(Etk_Tree_Row *row, Evas_List **selected_rows); +static void _etk_tree_row_select_all(Etk_Tree_Row *row); +static void _etk_tree_row_unselect_all(Etk_Tree_Row *row); +static void _etk_tree_row_select(Etk_Tree *tree, Etk_Tree_Row *row, Evas_Modifier *modifiers); static Etk_Signal *_etk_tree_signals[ETK_TREE_NUM_SIGNALS]; @@ -639,7 +640,7 @@ } /** - * @brief Selects all the node of the tree. Multiple selection has to be enabled with etk_tree_multiple_select_set() + * @brief Selects all the rows of the tree. Multiple selection has to be enabled with etk_tree_multiple_select_set() * @param tree a tree */ void etk_tree_select_all(Etk_Tree *tree) @@ -647,13 +648,13 @@ if (!tree || !tree->multiple_select) return; - _etk_tree_node_select_all(&tree->root); + _etk_tree_row_select_all(&tree->root); etk_signal_emit(_etk_tree_signals[ETK_TREE_SELECT_ALL_SIGNAL], ETK_OBJECT(tree), NULL); etk_widget_redraw_queue(ETK_WIDGET(tree)); } /** - * @brief Unselects all the node of the tree + * @brief Unselects all the rows of the tree * @param tree a tree */ void etk_tree_unselect_all(Etk_Tree *tree) @@ -664,11 +665,11 @@ if (tree->last_selected && tree->last_selected->selected) { tree->last_selected->selected = FALSE; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_UNSELECTED_SIGNAL], ETK_OBJECT(tree), NULL, tree->last_selected->row); + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_UNSELECTED_SIGNAL], ETK_OBJECT(tree), NULL, tree->last_selected); } if (tree->multiple_select) { - _etk_tree_node_unselect_all(&tree->root); + _etk_tree_row_unselect_all(&tree->root); etk_signal_emit(_etk_tree_signals[ETK_TREE_UNSELECT_ALL_SIGNAL], ETK_OBJECT(tree), NULL); } etk_widget_redraw_queue(ETK_WIDGET(tree)); @@ -710,7 +711,7 @@ return NULL; va_start(args, row); - new_row = _etk_tree_row_new_valist(row->tree, &row->node, args); + new_row = _etk_tree_row_new_valist(row->tree, row, args); va_end(args); return new_row; @@ -722,26 +723,24 @@ */ void etk_tree_row_del(Etk_Tree_Row *row) { - Evas_List *l; - Etk_Tree_Node *n; + Etk_Tree_Row *r; - if (!row || !(l = evas_list_find_list(row->node.parent->child_rows, row))) + if (!row) return; - for (n = row->tree->last_selected; n; n = n->parent) + for (r = row->tree->last_selected; r; r = r->parent) { - if (&row->node == n) + if (row == r) { row->tree->last_selected = NULL; break; } } - - _etk_tree_row_free(l->data); - row->node.parent->child_rows = evas_list_remove_list(row->node.parent->child_rows, l); + _etk_tree_row_free(row); if (!row->tree->frozen) { + /* TODO: scroll size ?? */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(row->tree->grid), NULL); etk_widget_redraw_queue(ETK_WIDGET(row->tree)); } @@ -756,15 +755,13 @@ if (!tree) return; - while (tree->root.child_rows) - { - _etk_tree_row_free(tree->root.child_rows->data); - tree->root.child_rows = evas_list_remove_list(tree->root.child_rows, tree->root.child_rows); - } + while (tree->root.first_child) + _etk_tree_row_free(tree->root.first_child); tree->last_selected = NULL; if (!tree->frozen) { + /* TODO: scroll size ?? */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(tree->grid), NULL); etk_widget_redraw_queue(ETK_WIDGET(tree)); } @@ -846,6 +843,71 @@ } /** + * @brief Gets the previous row of the tree + * @param row the current row + * @param walking_through_hierarchy if TRUE, the previous row can be a row located on a different level in the hierarchy. @n + * This setting has no effect if the tree is in the list mode + * @param include_collapsed_children if TRUE, the previous row can be a child of a collapsed row + * This setting has no effect if the tree is in the list mode, or if @a walking_through_hierarchy is FALSE + * @return Returns the previous row of the tree + */ +Etk_Tree_Row *etk_tree_prev_row_get(Etk_Tree_Row *row, Etk_Bool walking_through_hierarchy, Etk_Bool include_collapsed_children) +{ + if (!row) + return NULL; + + if (row->tree->mode == ETK_TREE_MODE_LIST || !walking_through_hierarchy) + return row->prev; + else + { + if (!row->prev) + return (row->parent != &row->tree->root) ? row->parent : NULL; + else + { + Etk_Tree_Row *prev; + + for (prev = row->prev; prev && (include_collapsed_children || prev->expanded) && prev->last_child; prev = prev->last_child); + return prev; + } + } +} + +/** + * @brief Gets the next row of the tree + * @param row the current row + * @param walking_through_hierarchy if TRUE, the next row can be a row located on a different level in the hierarchy. @n + * This setting has no effect if the tree is in the list mode + * @param include_collapsed_children if TRUE, the next row can be a child of a collapsed row + * This setting has no effect if the tree is in the list mode, or if @a walking_through_hierarchy is FALSE + * @return Returns the next row of the tree + */ +Etk_Tree_Row *etk_tree_next_row_get(Etk_Tree_Row *row, Etk_Bool walking_through_hierarchy, Etk_Bool include_collapsed_children) +{ + if (!row) + return NULL; + + if (row->tree->mode == ETK_TREE_MODE_LIST || !walking_through_hierarchy) + return row->next; + else + { + if ((include_collapsed_children || row->expanded) && row->first_child) + return row->first_child; + else + { + if (row->next) + return row->next; + else + { + Etk_Tree_Row *next; + + for (next = row->parent; next && !next->next; next = next->parent); + return next ? next->next : NULL; + } + } + } +} + +/** * @brief Sets a value to the data member of a row. The date could be retrieved with @a etk_tree_row_data_get() * @param row a row * @param data the data to set @@ -877,7 +939,7 @@ { if (!row) return; - _etk_tree_node_select(row->tree, &row->node, NULL); + _etk_tree_row_select(row->tree, row, NULL); } /** @@ -886,10 +948,10 @@ */ void etk_tree_row_unselect(Etk_Tree_Row *row) { - if (!row || !row->node.selected) + if (!row || !row->selected) return; - row->node.selected = FALSE; + row->selected = FALSE; etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_UNSELECTED_SIGNAL], ETK_OBJECT(row->tree), NULL, row); if (!row->tree->frozen) etk_widget_redraw_queue(ETK_WIDGET(row->tree)); @@ -904,7 +966,7 @@ { if (!tree || !tree->last_selected || !tree->last_selected->selected) return NULL; - return tree->last_selected->row; + return tree->last_selected; } /** @@ -927,7 +989,7 @@ selected_rows = evas_list_append(selected_rows, tree->last_selected); } else - _etk_tree_node_selected_rows_get(&tree->root, &selected_rows); + _etk_tree_row_selected_rows_get(&tree->root, &selected_rows); return selected_rows; } @@ -938,18 +1000,19 @@ */ void etk_tree_row_expand(Etk_Tree_Row *row) { - Etk_Tree_Node *n; + Etk_Tree_Row *r; - if (!row || row->node.expanded || !row->tree || (row->tree->mode != ETK_TREE_MODE_TREE)) + if (!row || row->expanded || !row->tree || (row->tree->mode != ETK_TREE_MODE_TREE)) return; - row->node.expanded = TRUE; - for (n = row->node.parent; n && n->expanded; n = n->parent) - n->num_visible_children += row->node.num_visible_children; + row->expanded = TRUE; + for (r = row->parent; r && r->expanded; r = r->parent) + r->num_visible_children += row->num_visible_children; etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_EXPANDED_SIGNAL], ETK_OBJECT(row->tree), NULL, row); if (!row->tree->frozen) { + /* TODO */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(row->tree->grid), NULL); etk_widget_redraw_queue(ETK_WIDGET(row->tree)); } @@ -961,18 +1024,19 @@ */ void etk_tree_row_collapse(Etk_Tree_Row *row) { - Etk_Tree_Node *n; + Etk_Tree_Row *r; - if (!row || !row->node.expanded || !row->tree || (row->tree->mode != ETK_TREE_MODE_TREE)) + if (!row || !row->expanded || !row->tree || (row->tree->mode != ETK_TREE_MODE_TREE)) return; - row->node.expanded = FALSE; - for (n = row->node.parent; n && n->expanded; n = n->parent) - n->num_visible_children -= row->node.num_visible_children; + row->expanded = FALSE; + for (r = row->parent; r && r->expanded; r = r->parent) + r->num_visible_children -= row->num_visible_children; etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_COLLAPSED_SIGNAL], ETK_OBJECT(row->tree), NULL, row); if (!row->tree->frozen) { + /* TODO */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(row->tree->grid), NULL); etk_widget_redraw_queue(ETK_WIDGET(row->tree)); } @@ -1238,11 +1302,17 @@ tree->resize_pointer_shown = FALSE; tree->headers_visible = TRUE; + tree->root.tree = tree; tree->root.parent = NULL; - tree->root.child_rows = NULL; + tree->root.prev = NULL; + tree->root.next = NULL; + tree->root.first_child = NULL; + tree->root.last_child = NULL; tree->root.num_visible_children = 0; tree->root.num_parent_children = 0; tree->root.expanded = TRUE; + tree->root.cells_data = NULL; + tree->root.data = NULL; tree->row_height = 0; tree->use_default_row_height = TRUE; @@ -1266,6 +1336,7 @@ etk_signal_connect("realize", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_realize_cb), NULL); etk_signal_connect("focus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_focus_cb), NULL); etk_signal_connect("unfocus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_unfocus_cb), NULL); + etk_signal_connect("key_down", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_key_down_cb), NULL); } /* Destroys the tree */ @@ -1577,7 +1648,7 @@ if (!(row = etk_object_data_get(object, "_Etk_Tree::row"))) return; - if (row->node.expanded) + if (row->expanded) etk_tree_row_collapse(row); else etk_tree_row_expand(row); @@ -1593,7 +1664,7 @@ return; event = event_info; - _etk_tree_node_select(row->tree, &row->node, event->modifiers); + _etk_tree_row_select(row->tree, row, event->modifiers); } /* Called when the tree is focused */ @@ -1616,6 +1687,54 @@ etk_widget_theme_object_signal_emit(tree->grid, "unfocus"); } +/* Called when the user presses a key */ +static void _etk_tree_key_down_cb(Etk_Object *object, void *event, void *data) +{ + Etk_Event_Key_Up_Down *key_event = event; + Etk_Tree *tree; + + if (!(tree = ETK_TREE(object))) + return; + + /* Select the previous visible row */ + if (strcmp(key_event->key, "Up") == 0) + { + if (!tree->last_selected) + { + Etk_Tree_Row *last_row; + + for (last_row = tree->root.last_child; last_row && last_row->expanded && last_row->last_child; last_row = last_row->last_child); + _etk_tree_row_select(tree, last_row, key_event->modifiers); + } + else + _etk_tree_row_select(tree, etk_tree_prev_row_get(tree->last_selected, TRUE, FALSE), key_event->modifiers); + + etk_widget_event_propagation_stop(); + } + /* Select the next visible row */ + else if (strcmp(key_event->key, "Down") == 0) + { + if (!tree->last_selected) + _etk_tree_row_select(tree, tree->root.first_child, key_event->modifiers); + else + _etk_tree_row_select(tree, etk_tree_next_row_get(tree->last_selected, TRUE, FALSE), key_event->modifiers); + + etk_widget_event_propagation_stop(); + } + /* Expand the row */ + else if (strcmp(key_event->key, "Right") == 0 && tree->last_selected && tree->last_selected->selected) + { + etk_tree_row_expand(tree->last_selected); + etk_widget_event_propagation_stop(); + } + /* Collapse the row */ + else if (strcmp(key_event->key, "Left") == 0 && tree->last_selected && tree->last_selected->selected) + { + etk_tree_row_collapse(tree->last_selected); + etk_widget_event_propagation_stop(); + } +} + /* Called when the user presses a column header */ static void _etk_tree_header_mouse_down_cb(Etk_Object *object, void *event, void *data) { @@ -1839,7 +1958,7 @@ } /* Draws recursively a list of rows and their children */ -static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Node *node, Evas_List **items_objects, +static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Row *parent_row, Evas_List **items_objects, int x, int w, int h, int xoffset, int yoffset, int first_row_id, int first_row_color) { Etk_Tree_Row *row; @@ -1847,29 +1966,27 @@ Etk_Tree_Col *first_visible_col; int i, j; int first_col_offset; - Evas_List *l; Etk_Geometry geometry; - if (!tree || !node || !items_objects) + if (!tree || !parent_row || !items_objects) return 0; first_visible_col = NULL; for (i = 0; i < tree->num_cols; i++) { if (tree->columns[i]->visible && (!first_visible_col || first_visible_col->place > tree->columns[i]->place)) - first_visible_col = tree->columns[i]; + first_visible_col = tree->columns[i]; } if (!first_visible_col) return 0; first_col_offset = xoffset; - if (&tree->root != node || node->num_parent_children > 0) + if (&tree->root != parent_row || parent_row->num_parent_children > 0) first_col_offset += tree->expander_size; i = 0; - for (l = node->child_rows; l; l = l->next) + for (row = parent_row->first_child; row; row = row->next) { - row = l->data; if (first_row_id <= 0) { int item_y; @@ -1892,12 +2009,12 @@ else etk_widget_theme_object_signal_emit(row_objects->background, "even"); - if (row->node.selected) + if (row->selected) etk_widget_theme_object_signal_emit(row_objects->background, "selected"); else etk_widget_theme_object_signal_emit(row_objects->background, "unselected"); - if (evas_list_count(row->node.child_rows) > 0) + if (row->first_child) { geometry.x = x + xoffset; geometry.y = item_y + (tree->row_height - tree->expander_size + 1) / 2; @@ -1910,7 +2027,7 @@ etk_widget_clip_set(row_objects->expander, first_visible_col->clip); } etk_widget_size_allocate(row_objects->expander, geometry); - etk_widget_theme_object_signal_emit(row_objects->expander, row->node.expanded ? "expand" : "collapse"); + etk_widget_theme_object_signal_emit(row_objects->expander, row->expanded ? "expand" : "collapse"); etk_object_data_set(ETK_OBJECT(row_objects->expander), "_Etk_Tree::row", row); etk_widget_show(row_objects->expander); } @@ -1932,35 +2049,35 @@ } first_row_id--; - if (row->node.child_rows && row->node.expanded) + if (row->first_child && row->expanded) { - i += _etk_tree_rows_draw(tree, &row->node, items_objects, x, w, h, first_col_offset, yoffset + i * tree->row_height, first_row_id, (first_row_color + i) % 2); - first_row_id -= row->node.num_visible_children; + i += _etk_tree_rows_draw(tree, row, items_objects, x, w, h, first_col_offset, yoffset + i * tree->row_height, first_row_id, (first_row_color + i) % 2); + first_row_id -= row->num_visible_children; } } return i; } -/* Creates a new row and add it to the node */ -static Etk_Tree_Row *_etk_tree_row_new_valist(Etk_Tree *tree, Etk_Tree_Node *node, va_list args) +/* Creates a new row and append to the list of the children of the row */ +static Etk_Tree_Row *_etk_tree_row_new_valist(Etk_Tree *tree, Etk_Tree_Row *row, va_list args) { Etk_Tree_Row *new_row; - Etk_Tree_Node *n; + Etk_Tree_Row *r; int i; - if (!tree || !tree->built || !node) + if (!tree || !tree->built || !row) return NULL; new_row = malloc(sizeof(Etk_Tree_Row)); new_row->tree = tree; - new_row->node.row = new_row; - new_row->node.parent = node; - new_row->node.child_rows = NULL; - new_row->node.num_visible_children = 0; - new_row->node.num_parent_children = 0; - new_row->node.expanded = FALSE; - new_row->node.selected = FALSE; + new_row->parent = row; + new_row->first_child = NULL; + new_row->last_child = NULL; + new_row->num_visible_children = 0; + new_row->num_parent_children = 0; + new_row->expanded = FALSE; + new_row->selected = FALSE; new_row->data = NULL; new_row->cells_data = malloc(sizeof(void *) * tree->num_cols); @@ -1972,19 +2089,26 @@ } etk_tree_row_fields_set_valist(new_row, args); - for (n = new_row->node.parent; n; n = n->parent) + for (r = new_row->parent; r; r = r->parent) { - n->num_visible_children++; - if (!n->expanded) + r->num_visible_children++; + if (!r->expanded) break; } - if ((n = new_row->node.parent) && (n = n->parent)) - n->num_parent_children++; + if ((r = new_row->parent) && (r = r->parent)) + r->num_parent_children++; - node->child_rows = evas_list_append(node->child_rows, new_row); + new_row->prev = row->last_child; + new_row->next = FALSE; + if (!row->first_child) + row->first_child = new_row; + if (row->last_child) + row->last_child->next = new_row; + row->last_child = new_row; if (!tree->frozen) { + /* TODO */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(tree->grid), NULL); etk_widget_redraw_queue(ETK_WIDGET(tree)); } @@ -2065,7 +2189,7 @@ /* Frees a row */ static void _etk_tree_row_free(Etk_Tree_Row *row) { - Etk_Tree_Node *n; + Etk_Tree_Row *r; if (!row) return; @@ -2082,21 +2206,30 @@ } free(row->cells_data); } - - while (row->node.child_rows) + + if (row->parent) { - _etk_tree_row_free(row->node.child_rows->data); - row->node.child_rows = evas_list_remove_list(row->node.child_rows, row->node.child_rows); + if (row->parent->first_child == row) + row->parent->first_child = row->next; + if (row->parent->last_child == row) + row->parent->last_child = row->prev; + if (row->prev) + row->prev->next = row->next; + if (row->next) + row->next->prev = row->prev; } - for (n = row->node.parent; n; n = n->parent) + while (row->first_child) + _etk_tree_row_free(row->first_child); + + for (r = row->parent; r; r = r->parent) { - n->num_visible_children--; - if (!n->expanded) + r->num_visible_children--; + if (!r->expanded) break; } - if ((n = row->node.parent) && (n = n->parent)) - n->num_parent_children--; + if ((r = row->parent) && (r = r->parent)) + r->num_parent_children--; free(row); } @@ -2145,72 +2278,65 @@ return NULL; } -/* Gets the selected rows of the node */ -static void _etk_tree_node_selected_rows_get(Etk_Tree_Node *node, Evas_List **selected_rows) +/* Gets the selected child rows of the row */ +static void _etk_tree_row_selected_rows_get(Etk_Tree_Row *row, Evas_List **selected_rows) { - Evas_List *l; - Etk_Tree_Row *row; + Etk_Tree_Row *r; - if (!node || !selected_rows) + if (!row || !selected_rows) return; - for (l = node->child_rows; l; l = l->next) + for (r = row->first_child; r; r = r->next) { - row = l->data; - if (row->node.selected) - *selected_rows = evas_list_append(*selected_rows, row); - _etk_tree_node_selected_rows_get(&row->node, selected_rows); + if (r->selected) + *selected_rows = evas_list_append(*selected_rows, r); + _etk_tree_row_selected_rows_get(r, selected_rows); } } -/* Selects all the child rows of the node */ -static void _etk_tree_node_select_all(Etk_Tree_Node *node) +/* Selects all the child rows of the row */ +static void _etk_tree_row_select_all(Etk_Tree_Row *row) { - Evas_List *l; - Etk_Tree_Row *row; + Etk_Tree_Row *r; - if (!node) + if (!row) return; - for (l = node->child_rows; l; l = l->next) + for (r = row->first_child; r; r = r->next) { - row = l->data; - row->node.selected = TRUE; - if (row->node.expanded) - _etk_tree_node_select_all(&row->node); + r->selected = TRUE; + if (r->expanded) + _etk_tree_row_select_all(r); } } -/* Unselects all the child rows of the node */ -static void _etk_tree_node_unselect_all(Etk_Tree_Node *node) +/* Unselects all the child rows of the row */ +static void _etk_tree_row_unselect_all(Etk_Tree_Row *row) { - Evas_List *l; - Etk_Tree_Row *row; + Etk_Tree_Row *r; - if (!node) + if (!row) return; - for (l = node->child_rows; l; l = l->next) + for (r = row->first_child; r; r = r->next) { - row = l->data; - row->node.selected = FALSE; - _etk_tree_node_unselect_all(&row->node); + r->selected = FALSE; + _etk_tree_row_unselect_all(r); } } -/* Selects rows in the tree according to the keyboard modifiers and the clicked node */ -static void _etk_tree_node_select(Etk_Tree *tree, Etk_Tree_Node *node, Evas_Modifier *modifiers) +/* Selects rows in the tree according to the keyboard modifiers and the clicked row */ +static void _etk_tree_row_select(Etk_Tree *tree, Etk_Tree_Row *row, Evas_Modifier *modifiers) { - if (!tree || !node) + if (!tree || !row) return; - /* TODO */ - if (/*tree->mode == ETK_TREE_MODE_TREE || */!tree->multiple_select || !modifiers) + if (!tree->multiple_select || !modifiers) { etk_tree_unselect_all(tree); - node->selected = TRUE; - tree->last_selected = node; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, node->row); + row->selected = TRUE; + tree->last_selected = row; + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } else { @@ -2220,54 +2346,52 @@ etk_tree_unselect_all(tree); if (!tree->last_selected) - node->selected = TRUE; + row->selected = TRUE; else { Etk_Bool selected = FALSE; - Evas_List *l; - Etk_Tree_Row *row; + Etk_Tree_Row *r; - for (l = tree->root.child_rows; l; l = l->next) + for (r = tree->root.first_child; r; r = etk_tree_next_row_get(r, TRUE, FALSE)) { - row = l->data; - if (&row->node == tree->last_selected || &row->node == node) + if (r == tree->last_selected || r == row) { - row->node.selected = TRUE; + r->selected = TRUE; selected = !selected; } else - row->node.selected |= selected; + r->selected |= selected; } if (selected) { etk_tree_unselect_all(tree); - node->selected = TRUE; + row->selected = TRUE; } } - tree->last_selected = node; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, node->row); + tree->last_selected = row; + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } else if (evas_key_modifier_is_set(modifiers, "Control")) { - if (node->selected) + if (row->selected) { - node->selected = FALSE; - tree->last_selected = node; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_UNSELECTED_SIGNAL], ETK_OBJECT(tree), NULL, node->row); + row->selected = FALSE; + tree->last_selected = row; + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_UNSELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } else { - node->selected = TRUE; - tree->last_selected = node; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, node->row); + row->selected = TRUE; + tree->last_selected = row; + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } } else { etk_tree_unselect_all(tree); - node->selected = TRUE; - tree->last_selected = node; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, node->row); + row->selected = TRUE; + tree->last_selected = row; + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } } =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- etk_tree.h 19 Dec 2005 13:30:32 -0000 1.11 +++ etk_tree.h 20 Dec 2005 18:25:28 -0000 1.12 @@ -37,14 +37,22 @@ }; /** - * @struct Etk_Tree_Node - * @brief A node of a tree contains several rows + * @struct Etk_Tree_Row + * @brief A row of a tree */ -struct _Etk_Tree_Node +struct _Etk_Tree_Row { - Etk_Tree_Row *row; - Etk_Tree_Node *parent; - Evas_List *child_rows; + Etk_Tree *tree; + + Etk_Tree_Row *prev; + Etk_Tree_Row *next; + Etk_Tree_Row *parent; + Etk_Tree_Row *first_child; + Etk_Tree_Row *last_child; + + void **cells_data; + void *data; + int num_visible_children; int num_parent_children; Etk_Bool expanded; @@ -73,8 +81,8 @@ int col_to_resize_initial_x; Etk_Bool resize_pointer_shown; - Etk_Tree_Node root; - Etk_Tree_Node *last_selected; + Etk_Tree_Row root; + Etk_Tree_Row *last_selected; Evas_Object *headers_clip; Evas_List *rows_widgets; @@ -124,20 +132,6 @@ Etk_Widget *header; }; -/** - * @struct Etk_Tree_Row - * @brief A row of a tree - */ -struct _Etk_Tree_Row -{ - /* private: */ - Etk_Tree *tree; - Etk_Tree_Node node; - - void **cells_data; - void *data; -}; - Etk_Type *etk_tree_type_get(); Etk_Widget *etk_tree_new(); @@ -187,6 +181,8 @@ void etk_tree_row_del(Etk_Tree_Row *row); void etk_tree_clear(Etk_Tree *tree); +Etk_Tree_Row *etk_tree_prev_row_get(Etk_Tree_Row *row, Etk_Bool walking_through_hierarchy, Etk_Bool include_collapsed_children); +Etk_Tree_Row *etk_tree_next_row_get(Etk_Tree_Row *row, Etk_Bool walking_through_hierarchy, Etk_Bool include_collapsed_children); void etk_tree_row_data_set(Etk_Tree_Row *row, void *data); void *etk_tree_row_data_get(Etk_Tree_Row *row); =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_types.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- etk_types.h 4 Dec 2005 14:54:56 -0000 1.17 +++ etk_types.h 20 Dec 2005 18:25:28 -0000 1.18 @@ -85,7 +85,6 @@ typedef enum _Etk_Tree_Mode Etk_Tree_Mode; typedef struct _Etk_Tree_Col Etk_Tree_Col; typedef struct _Etk_Tree_Row Etk_Tree_Row; -typedef struct _Etk_Tree_Node Etk_Tree_Node; typedef struct _Etk_Tree_Model Etk_Tree_Model; typedef enum _Etk_Tree_Model_Image_Type Etk_Tree_Model_Image_Type; typedef struct _Etk_Range Etk_Range; ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs