Enlightenment CVS committal Author : moom16 Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: etk_tree.c etk_tree.h Log Message: * Add a function to sort the tree. I need to fix some bugs with the scrolled view now =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- etk_tree.c 21 Dec 2005 00:03:16 -0000 1.19 +++ etk_tree.c 21 Dec 2005 13:52:41 -0000 1.20 @@ -4,6 +4,7 @@ #include <stdio.h> #include <string.h> #include <math.h> +#include <Ecore_Data.h> #include "etk_tree_model.h" #include "etk_scrolled_view.h" #include "etk_button.h" @@ -333,7 +334,7 @@ col->requested_width = ETK_MAX(width, ETK_TREE_MIN_HEADER_WIDTH); etk_object_notify(ETK_OBJECT(col), "width"); if (col->tree) - etk_widget_redraw_queue(ETK_WIDGET(col->tree)); + etk_widget_redraw_queue(ETK_WIDGET(col->tree->grid)); } /** @@ -360,7 +361,7 @@ col->min_width = min_width; etk_object_notify(ETK_OBJECT(col), "min_width"); if (col->tree) - etk_widget_redraw_queue(ETK_WIDGET(col->tree)); + etk_widget_redraw_queue(ETK_WIDGET(col->tree->grid)); } /** @@ -387,7 +388,7 @@ col->resizable = resizable; etk_object_notify(ETK_OBJECT(col), "resizable"); if (col->tree) - etk_widget_redraw_queue(ETK_WIDGET(col->tree)); + etk_widget_redraw_queue(ETK_WIDGET(col->tree->grid)); } /** @@ -414,7 +415,7 @@ col->expand = expand; etk_object_notify(ETK_OBJECT(col), "expand"); if (col->tree) - etk_widget_redraw_queue(ETK_WIDGET(col->tree)); + etk_widget_redraw_queue(ETK_WIDGET(col->tree->grid)); } /** @@ -441,7 +442,7 @@ col->visible = visible; etk_object_notify(ETK_OBJECT(col), "visible"); if (col->tree) - etk_widget_redraw_queue(ETK_WIDGET(col->tree)); + etk_widget_redraw_queue(ETK_WIDGET(col->tree->grid)); } /** @@ -493,7 +494,7 @@ } col->place = new_place; etk_object_notify(ETK_OBJECT(col), "place"); - etk_widget_redraw_queue(ETK_WIDGET(col->tree)); + etk_widget_redraw_queue(ETK_WIDGET(col->tree->grid)); } /** @@ -566,7 +567,7 @@ return; etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(tree->grid), NULL); - etk_widget_redraw_queue(ETK_WIDGET(tree)); + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); tree->frozen = FALSE; } @@ -595,7 +596,7 @@ etk_object_notify(ETK_OBJECT(tree), "row_height"); etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(tree->grid), NULL); - etk_widget_redraw_queue(ETK_WIDGET(tree)); + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); etk_range_increments_set(ETK_RANGE(etk_scrolled_view_vscrollbar_get(ETK_SCROLLED_VIEW(tree->scrolled_view))), tree->row_height, 5 * tree->row_height); } @@ -650,7 +651,7 @@ _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)); + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); } /** @@ -672,7 +673,7 @@ _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)); + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); } /** @@ -742,7 +743,7 @@ { /* 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)); + etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); } } @@ -763,11 +764,103 @@ { /* TODO: scroll size ?? */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(tree->grid), NULL); - etk_widget_redraw_queue(ETK_WIDGET(tree)); + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); + } +} + +/* TODO */ +static void _etk_tree_heapify(Etk_Tree *tree, Etk_Tree_Row **heap, int root, int size, int (*compare_cb)(Etk_Tree *tree, Etk_Tree_Row *row1, Etk_Tree_Row *row2, Etk_Tree_Col *col, void *data), int asc, Etk_Tree_Col *col, void *data) +{ + Etk_Tree_Row *tmp; + int left, right, max; + + if (!heap) + return; + + left = (root * 2) + 1; + right = (root * 2) + 2; + + max = root; + if (left < size && (compare_cb(tree, heap[left], heap[max], col, data) * asc) > 0) + max = left; + if (right < size && (compare_cb(tree, heap[right], heap[max], col, data) * asc) > 0) + max = right; + + if (max != root) + { + tmp = heap[max]; + heap[max] = heap[root]; + heap[root] = tmp; + _etk_tree_heapify(tree, heap, max, size, compare_cb, asc, col, data); } } /** + * @brief Sorts the tree + * @param tree a tree + * @param compare_cb the function to call to compare two rows. Must return a negative value if row1 is less than row2, @n + * 0 is row1 is equal to row2, and a positive value is row1 is greater than row2. + * @param ascendant TRUE if you want to sort the tree TODO + * @param col the column to pass to compare_cb when it's called + * @param data the data to pass to compare_cb when it's called + */ +void etk_tree_sort(Etk_Tree *tree, int (*compare_cb)(Etk_Tree *tree, Etk_Tree_Row *row1, Etk_Tree_Row *row2, Etk_Tree_Col *col, void *data), Etk_Bool ascendant, Etk_Tree_Col *col, void *data) +{ + int num_rows, i, pos, parent; + Etk_Tree_Row *r, *first_row; + Etk_Tree_Row **heap; + int asc; + + if (!tree || !compare_cb) + return; + + for (num_rows = 0, r = tree->root.first_child; r; r = r->next, num_rows++); + if (num_rows <= 1) + return; + heap = malloc(num_rows * sizeof(Etk_Tree_Row *)); + asc = ascendant ? -1 : 1; + + /* We insert all the rows in the heap */ + heap[0] = tree->root.first_child; + for (i = 1, r = tree->root.first_child->next; r; r = r->next, i++) + { + pos = i; + parent = (pos - 1) / 2; + + while (parent >= 0 && (compare_cb(tree, heap[parent], r, col, data) * asc) < 0) + { + heap[pos] = heap[parent]; + pos = parent; + parent = parent ? (pos - 1) / 2 : -1; + } + heap[pos] = r; + } + + /* Then we extract them */ + first_row = heap[0]; + first_row->prev = NULL; + first_row->next = NULL; + r = first_row; + heap[0] = heap[num_rows - 1]; + _etk_tree_heapify(tree, heap, 0, num_rows - 1, compare_cb, asc, col, data); + for (i = num_rows - 2; i >= 0; i--) + { + r->next = heap[0]; + heap[0]->prev = r; + r = heap[0]; + heap[0] = heap[i]; + _etk_tree_heapify(tree, heap, 0, i, compare_cb, asc, col, data); + } + r->next = NULL; + + tree->root.first_child = first_row; + tree->root.last_child = r; + free(heap); + + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); +} + +/** * @brief Gets the first row of the tree * @param tree a tree * @return Returns the first row of the tree @@ -932,7 +1025,7 @@ va_end(args2); if (!row->tree->frozen) - etk_widget_redraw_queue(ETK_WIDGET(row->tree)); + etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); } /** @@ -1059,7 +1152,7 @@ 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)); + etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); } /** @@ -1119,7 +1212,7 @@ { /* TODO */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(row->tree->grid), NULL); - etk_widget_redraw_queue(ETK_WIDGET(row->tree)); + etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); } } @@ -1143,7 +1236,7 @@ { /* TODO */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(row->tree->grid), NULL); - etk_widget_redraw_queue(ETK_WIDGET(row->tree)); + etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); } } @@ -1347,7 +1440,7 @@ tree->xoffset = x; tree->yoffset = y; - etk_widget_redraw_queue(ETK_WIDGET(tree)); + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); } /* Gets the scrolling size of the tree grid */ @@ -1897,7 +1990,7 @@ { col->tree->column_to_resize->requested_width = new_size; etk_object_notify(ETK_OBJECT(col->tree->column_to_resize), "width"); - etk_widget_redraw_queue(ETK_WIDGET(col->tree)); + etk_widget_redraw_queue(ETK_WIDGET(col->tree->grid)); } } else @@ -2218,7 +2311,7 @@ { /* TODO */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(tree->grid), NULL); - etk_widget_redraw_queue(ETK_WIDGET(tree)); + etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); } return new_row; } =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- etk_tree.h 21 Dec 2005 00:03:16 -0000 1.13 +++ etk_tree.h 21 Dec 2005 13:52:41 -0000 1.14 @@ -177,6 +177,8 @@ void etk_tree_row_del(Etk_Tree_Row *row); void etk_tree_clear(Etk_Tree *tree); +void etk_tree_sort(Etk_Tree *tree, int (*compare_cb)(Etk_Tree *tree, Etk_Tree_Row *row1, Etk_Tree_Row *row2, Etk_Tree_Col *col, void *data), Etk_Bool ascendant, Etk_Tree_Col *col, void *data); + Etk_Tree_Row *etk_tree_first_row_get(Etk_Tree *tree); Etk_Tree_Row *etk_tree_last_row_get(Etk_Tree *tree, Etk_Bool walking_through_hierarchy, Etk_Bool include_collapsed_children); Etk_Tree_Row *etk_tree_row_first_child_get(Etk_Tree_Row *row); ------------------------------------------------------- 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