Enlightenment CVS committal Author : moom16 Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: etk_editable_text_object.c etk_entry.c etk_scrolled_view.c etk_tree.c etk_tree.h etk_widget.c etk_widget.h Log Message: * Make the tree scrollable (vertically only for now). Still need to fix some problems with the drag button size * Fix some theme issues =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_editable_text_object.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_editable_text_object.c 1 Nov 2005 12:22:46 -0000 1.4 +++ etk_editable_text_object.c 2 Nov 2005 13:53:39 -0000 1.5 @@ -88,9 +88,8 @@ return; evas_object_textblock_text_markup_set(editable_text_sd->text_object, text); - editable_text_sd->cursor_at_the_end = TRUE; _etk_editable_text_size_update(object); - _etk_editable_text_cursor_position_update(object, NULL); + etk_editable_text_object_cursor_move_at_end(object); } /** =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_entry.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_entry.c 1 Nov 2005 12:04:10 -0000 1.6 +++ etk_entry.c 2 Nov 2005 13:53:39 -0000 1.7 @@ -199,7 +199,7 @@ if (!(entry = ETK_ENTRY(object)) || !entry->editable_object) return; - etk_editable_text_object_cursor_show(entry->editable_object); + etk_editable_text_object_cursor_show(entry->editable_object); } /* Called when the entry is unfocused */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_scrolled_view.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_scrolled_view.c 31 Oct 2005 23:45:32 -0000 1.2 +++ etk_scrolled_view.c 2 Nov 2005 13:53:39 -0000 1.3 @@ -91,7 +91,7 @@ /** * @brief A convenience function that creates a viewport, adds the child to it and attach the viewport to the scrolled view. @n - * It's useful for widgets that has no scrolling ability + * It's useful for widgets that have no scrolling ability * @param scrolled_view a scrolled view * @param the child to add to the viewport */ @@ -270,7 +270,8 @@ static void _etk_scrolled_view_size_allocate(Etk_Widget *widget, Etk_Geometry geometry) { Etk_Scrolled_View *scrolled_view; - Etk_Size hscrollbar_requisition, vscrollbar_requisition, scroll_size; + Etk_Size hscrollbar_requisition, vscrollbar_requisition; + Etk_Size scroll_size; Etk_Geometry child_geometry; Etk_Widget *child; Etk_Bool show_vscrollbar = FALSE, show_hscrollbar = FALSE; @@ -279,10 +280,12 @@ if (!(scrolled_view = ETK_SCROLLED_VIEW(widget))) return; - if (!(child = ETK_BIN(scrolled_view)->child)) + if (!(child = ETK_BIN(scrolled_view)->child) || !child->scroll_size_get || !child->scroll) { etk_widget_hide(scrolled_view->hscrollbar); etk_widget_hide(scrolled_view->vscrollbar); + if (child) + etk_widget_size_allocate(child, geometry); return; } @@ -291,20 +294,28 @@ if (scrolled_view->vpolicy == ETK_POLICY_AUTO || scrolled_view->vpolicy == ETK_POLICY_SHOW) etk_widget_size_request_full(scrolled_view->vscrollbar, &vscrollbar_requisition, FALSE); child->scroll_size_get(child, &scroll_size); - - if ((scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > geometry.w) || scrolled_view->hpolicy == ETK_POLICY_SHOW) + + visible_width = geometry.w; + visible_height = geometry.h; + if (child->scroll_margins_get) + { + Etk_Size margins_size; + + child->scroll_margins_get(child, &margins_size); + visible_width -= margins_size.w; + visible_height -= margins_size.h; + } + + if ((scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > visible_width) || scrolled_view->hpolicy == ETK_POLICY_SHOW) show_hscrollbar = TRUE; - if ((scrolled_view->vpolicy == ETK_POLICY_AUTO && scroll_size.h > (geometry.h - (show_hscrollbar ? hscrollbar_requisition.h : 0))) || + if ((scrolled_view->vpolicy == ETK_POLICY_AUTO && scroll_size.h > (visible_height - (show_hscrollbar ? hscrollbar_requisition.h : 0))) || scrolled_view->vpolicy == ETK_POLICY_SHOW) { show_vscrollbar = TRUE; - if (scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > (geometry.w - vscrollbar_requisition.w)) + if (scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > (visible_width - vscrollbar_requisition.w)) show_hscrollbar = TRUE; } - visible_width = geometry.w; - visible_height = geometry.h; - if (show_hscrollbar) { visible_height -= hscrollbar_requisition.h; @@ -340,8 +351,8 @@ child_geometry.x = geometry.x; child_geometry.y = geometry.y; - child_geometry.w = visible_width; - child_geometry.h = visible_height; + child_geometry.w = geometry.w - (show_vscrollbar ? vscrollbar_requisition.w : 0); + child_geometry.h = geometry.h - (show_hscrollbar ? hscrollbar_requisition.h : 0); etk_widget_size_allocate(child, child_geometry); } @@ -359,7 +370,6 @@ if (!(scrolled_view = ETK_SCROLLED_VIEW(data)) || !(child = ETK_BIN(scrolled_view)->child) || !child->scroll) return; - child->scroll(child, value, ETK_RANGE(scrolled_view->vscrollbar)->value); } @@ -371,7 +381,6 @@ if (!(scrolled_view = ETK_SCROLLED_VIEW(data)) || !(child = ETK_BIN(scrolled_view)->child) || !child->scroll) return; - child->scroll(child, ETK_RANGE(scrolled_view->hscrollbar)->value, value); } =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- etk_tree.c 30 Oct 2005 10:56:30 -0000 1.12 +++ etk_tree.c 2 Nov 2005 13:53:39 -0000 1.13 @@ -5,6 +5,7 @@ #include <string.h> #include <math.h> #include <Edje.h> +#include "etk_scrolled_view.h" #include "etk_button.h" #include "etk_toplevel_widget.h" #include "etk_signal.h" @@ -77,8 +78,10 @@ static Etk_Type *_etk_grid_type_get(); static void _etk_grid_constructor(Etk_grid *grid); static void _etk_grid_move_resize(Etk_Widget *widget, int x, int y, int w, int h); +static void _etk_grid_scroll(Etk_Widget *widget, int x, int y); +static void _etk_grid_scroll_size_get(Etk_Widget *widget, Etk_Size *scroll_size); +static void _etk_grid_scroll_margins_get(Etk_Widget *widget, Etk_Size *margins_size); static void _etk_grid_realize_cb(Etk_Object *object, void *data); -static void _etk_grid_mouse_wheel_cb(Etk_Object *object, void *event_info, void *data); static void _etk_tree_constructor(Etk_Tree *tree); static void _etk_tree_destructor(Etk_Tree *tree); @@ -1036,17 +1039,13 @@ void etk_tree_row_expand(Etk_Tree_Row *row) { Etk_Tree_Node *n; - float offset; if (!row || row->node.expanded || !row->tree || (row->tree->mode != ETK_TREE_MODE_TREE)) return; - offset = row->tree->xscroll_percent * row->tree->item_height * row->tree->root.num_visible_children; 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->tree->xscroll_percent = offset / (row->tree->item_height * row->tree->root.num_visible_children); - row->tree->xscroll_percent = ETK_CLAMP(row->tree->xscroll_percent, 0.0, 1.0); etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_EXPANDED_SIGNAL], ETK_OBJECT(row->tree), NULL, row); if (!row->tree->frozen) @@ -1060,17 +1059,13 @@ void etk_tree_row_collapse(Etk_Tree_Row *row) { Etk_Tree_Node *n; - float offset; if (!row || !row->node.expanded || !row->tree || (row->tree->mode != ETK_TREE_MODE_TREE)) return; - offset = row->tree->xscroll_percent * row->tree->item_height * row->tree->root.num_visible_children; 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->tree->xscroll_percent = offset / (row->tree->item_height * row->tree->root.num_visible_children); - row->tree->xscroll_percent = ETK_CLAMP(row->tree->xscroll_percent, 0.0, 1.0); etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_COLLAPSED_SIGNAL], ETK_OBJECT(row->tree), NULL, row); if (!row->tree->frozen) @@ -1105,8 +1100,10 @@ return; ETK_WIDGET(grid)->move_resize = _etk_grid_move_resize; + ETK_WIDGET(grid)->scroll = _etk_grid_scroll; + ETK_WIDGET(grid)->scroll_size_get = _etk_grid_scroll_size_get; + ETK_WIDGET(grid)->scroll_margins_get = _etk_grid_scroll_margins_get; etk_signal_connect_after("realize", ETK_OBJECT(grid), ETK_CALLBACK(_etk_grid_realize_cb), NULL); - etk_signal_connect("mouse_wheel", ETK_OBJECT(grid), ETK_CALLBACK(_etk_grid_mouse_wheel_cb), NULL); } /* Moves and resizes the tree grid */ @@ -1153,6 +1150,48 @@ _etk_tree_update(tree); } +/* Scrolls the tree grid */ +static void _etk_grid_scroll(Etk_Widget *widget, int x, int y) +{ + Etk_Tree *tree; + + if (!widget || !(tree = ETK_TREE_GRID(widget)->tree)) + return; + + tree->xoffset = x; + tree->yoffset = y; + etk_widget_redraw_queue(widget); +} + +/* Gets the scrolling size of the tree grid */ +static void _etk_grid_scroll_size_get(Etk_Widget *widget, Etk_Size *scroll_size) +{ + Etk_Tree *tree; + int i; + int width = 0; + + if (!widget || !(tree = ETK_TREE_GRID(widget)->tree) || !scroll_size) + return; + + for (i = 0; i < tree->num_cols; i++) + { + if (tree->columns[i]->visible) + width += tree->columns[i]->width; + } + scroll_size->w = width; + scroll_size->h = tree->root.num_visible_children * tree->item_height; +} + +/* Gets the scrolling margins size of the tree grid */ +static void _etk_grid_scroll_margins_get(Etk_Widget *widget, Etk_Size *margins_size) +{ + if (!widget || !margins_size) + return; + + margins_size->w = widget->left_inset + widget->left_padding + widget->right_inset + widget->right_padding; + margins_size->h = widget->top_inset + widget->top_padding + widget->bottom_inset + widget->bottom_padding; +} + /************************** * Tree **************************/ @@ -1162,11 +1201,14 @@ { if (!tree) return; - + + tree->scrolled_view = etk_scrolled_view_new(); + etk_widget_parent_set(tree->scrolled_view, ETK_CONTAINER(tree)); + etk_widget_show(tree->scrolled_view); + tree->grid = etk_widget_new(ETK_TREE_GRID_TYPE, "theme_group", "tree", NULL); - ETK_TREE_GRID(tree->grid)->tree = tree; - etk_widget_parent_set(tree->grid, ETK_CONTAINER(tree)); + etk_container_add(ETK_CONTAINER(tree->scrolled_view), tree->grid); etk_widget_show(tree->grid); tree->num_cols = 0; @@ -1191,8 +1233,8 @@ tree->frozen = FALSE; tree->mode = ETK_TREE_MODE_LIST; tree->multiple_select = FALSE; - tree->xscroll_percent = 0.0; - tree->yscroll_percent = 0.0; + tree->xoffset = 0; + tree->yoffset = 0.0; ETK_WIDGET(tree)->size_allocate = _etk_tree_size_allocate; } @@ -1377,7 +1419,7 @@ /* Allocate size for the tree grid */ geometry.y += max_header_height; geometry.h -= max_header_height; - etk_widget_size_allocate(tree->grid, geometry); + etk_widget_size_allocate(tree->scrolled_view, geometry); } /************************** @@ -1583,20 +1625,6 @@ _etk_tree_col_realize(tree, i); } -/* Called when the mouse wheel is used over the tree grid. TODO: scrollbars */ -static void _etk_grid_mouse_wheel_cb(Etk_Object *object, void *event_info, void *data) -{ - Etk_Tree *tree; - Etk_Event_Mouse_Wheel *event; - - if (!object || !(tree = ETK_TREE_GRID(object)->tree) || !(event = event_info)) - return; - - tree->xscroll_percent += event->z * ((float)3 / tree->root.num_visible_children); - tree->xscroll_percent = ETK_CLAMP(tree->xscroll_percent, 0.0, 1.0); - _etk_tree_update(tree); -} - /************************** * Tree **************************/ @@ -1744,7 +1772,7 @@ { Evas_List *l; Etk_Tree_Item_Objects *item_objects; - int invisible_height, offset, first_visible_nth, delta; + int first_visible_nth, delta; int x, y, w, h; int i; @@ -1786,12 +1814,8 @@ } } - invisible_height = (tree->root.num_visible_children * tree->item_height) - h; - if (invisible_height < 0) - invisible_height = 0; - offset = invisible_height * tree->xscroll_percent; - first_visible_nth = offset / tree->item_height; - delta = offset - (first_visible_nth * tree->item_height); + first_visible_nth = tree->yoffset / tree->item_height; + delta = tree->yoffset - (first_visible_nth * tree->item_height); l = tree->items_objects; _etk_tree_rows_draw(tree, &tree->root, &l, x, w, h, 0, y - delta, first_visible_nth, (first_visible_nth % 2)); =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_tree.h 30 Oct 2005 00:07:45 -0000 1.7 +++ etk_tree.h 2 Nov 2005 13:53:39 -0000 1.8 @@ -74,6 +74,7 @@ /* Inherit form Etk_Widget */ Etk_Container container; + Etk_Widget *scrolled_view; Etk_Widget *grid; int num_cols; @@ -92,8 +93,8 @@ Etk_Bool multiple_select; Etk_Bool frozen; Etk_Bool built; - float xscroll_percent; - float yscroll_percent; + int xoffset; + int yoffset; int item_height; int image_height; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_widget.c 1 Nov 2005 10:38:31 -0000 1.9 +++ etk_widget.c 2 Nov 2005 13:53:39 -0000 1.10 @@ -1288,6 +1288,7 @@ widget->last_size_requisition.h = 0; widget->scroll_size_get = NULL; + widget->scroll_margins_get = NULL; widget->scroll = NULL; widget->realized = FALSE; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_widget.h 1 Nov 2005 00:18:41 -0000 1.7 +++ etk_widget.h 2 Nov 2005 13:53:39 -0000 1.8 @@ -166,6 +166,7 @@ void (*move_resize)(Etk_Widget *widget, int x, int y, int w, int h); void (*scroll_size_get)(Etk_Widget *widget, Etk_Size *scroll_size); + void (*scroll_margins_get)(Etk_Widget *widget, Etk_Size *margin_size); void (*scroll)(Etk_Widget *widget, int x, int y); void (*show)(Etk_Widget *widget); ------------------------------------------------------- SF.Net email is sponsored by: Tame your development challenges with Apache's Geronimo App Server. Download it for free - -and be entered to win a 42" plasma tv or your very own Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs