Enlightenment CVS committal Author : moom16 Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: etk_scrolled_view.c etk_tree.c Log Message: * Update correctly the scrolled view when the scroll size changes =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_scrolled_view.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_scrolled_view.c 19 Dec 2005 13:30:32 -0000 1.8 +++ etk_scrolled_view.c 21 Dec 2005 16:47:38 -0000 1.9 @@ -28,6 +28,9 @@ static void _etk_scrolled_view_mouse_wheel(Etk_Object *object, void *event, void *data); static void _etk_scrolled_view_hscrollbar_value_changed_cb(Etk_Object *object, double value, void *data); static void _etk_scrolled_view_vscrollbar_value_changed_cb(Etk_Object *object, double value, void *data); +static void _etk_scrolled_view_child_added_cb(Etk_Object *object, void *child, void *data); +static void _etk_scrolled_view_child_removed_cb(Etk_Object *object, void *child, void *data); +static void _etk_scrolled_view_child_scroll_size_changed_cb(void *data); /************************** * @@ -188,6 +191,8 @@ etk_signal_connect("key_down", ETK_OBJECT(scrolled_view), ETK_CALLBACK(_etk_scrolled_view_key_down_cb), NULL); etk_signal_connect("mouse_wheel", ETK_OBJECT(scrolled_view), ETK_CALLBACK(_etk_scrolled_view_mouse_wheel), NULL); + etk_signal_connect("child_added", ETK_OBJECT(scrolled_view), ETK_CALLBACK(_etk_scrolled_view_child_added_cb), NULL); + etk_signal_connect("child_removed", ETK_OBJECT(scrolled_view), ETK_CALLBACK(_etk_scrolled_view_child_removed_cb), NULL); etk_signal_connect("value_changed", ETK_OBJECT(scrolled_view->hscrollbar), ETK_CALLBACK(_etk_scrolled_view_hscrollbar_value_changed_cb), scrolled_view); etk_signal_connect("value_changed", ETK_OBJECT(scrolled_view->vscrollbar), ETK_CALLBACK(_etk_scrolled_view_vscrollbar_value_changed_cb), scrolled_view); } @@ -441,4 +446,30 @@ child->scroll(child, ETK_RANGE(scrolled_view->hscrollbar)->value, value); } +/* Called when a new child is added */ +static void _etk_scrolled_view_child_added_cb(Etk_Object *object, void *child, void *data) +{ + if (!object || !child) + return; + etk_signal_connect_swapped("scroll_size_changed", ETK_OBJECT(child), ETK_CALLBACK(_etk_scrolled_view_child_scroll_size_changed_cb), object); +} + +/* Called when a child is removed */ +static void _etk_scrolled_view_child_removed_cb(Etk_Object *object, void *child, void *data) +{ + if (!object || !child) + return; + etk_signal_disconnect("scroll_size_changed", ETK_OBJECT(child), ETK_CALLBACK(_etk_scrolled_view_child_scroll_size_changed_cb)); +} + +/* Called when the scroll size of the child of the scrolled view has changed */ +static void _etk_scrolled_view_child_scroll_size_changed_cb(void *data) +{ + Etk_Widget *scrolled_widget; + + if (!(scrolled_widget = ETK_WIDGET(data))) + return; + etk_widget_redraw_queue(scrolled_widget); +} + /** @} */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- etk_tree.c 21 Dec 2005 13:52:41 -0000 1.20 +++ etk_tree.c 21 Dec 2005 16:47:38 -0000 1.21 @@ -123,6 +123,7 @@ 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 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); static Etk_Signal *_etk_tree_signals[ETK_TREE_NUM_SIGNALS]; @@ -741,7 +742,6 @@ 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->grid)); } @@ -762,45 +762,17 @@ 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->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 ascendant TRUE if the lowest rows have to be the first ones in the sorted tree * @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 */ @@ -1210,7 +1182,6 @@ 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->grid)); } @@ -1234,7 +1205,6 @@ 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->grid)); } @@ -2309,7 +2279,6 @@ if (!tree->frozen) { - /* TODO */ etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(tree->grid), NULL); etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); } @@ -2598,3 +2567,30 @@ etk_widget_redraw_queue(ETK_WIDGET(tree->grid)); } + +/* Restore the heap properties of the heap. Used to sort the tree */ +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); + } +} ------------------------------------------------------- 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