Hi E-devel List, I just created a patch that adding extra vertical and horizontal margins for etk scrolled view.
Sometime we may want to have some extra margin for a list (like ipod touch does), and this patch provide this possiblility. After thinking for a while I think this part is much more scrolled_view specific, I do not implement the scroll_margins_get and implement that in etk_scrolled_view. Besides IMHO scroll_margins_get provide half margins, it does not full fill my need. We may be able remove scroll_margins_get from etk_widget, since no one use it and it were little bit unfinished. There added four extra functions: void etk_scrolled_view_extra_vmargin_set(Etk_Scrolled_View *scrolled_view, int margin); int etk_scrolled_view_extra_vmargin_get(Etk_Scrolled_View *scrolled_view); void etk_scrolled_view_extra_hmargin_set(Etk_Scrolled_View *scrolled_view, int margin); int etk_scrolled_view_extra_hmargin_get(Etk_Scrolled_View *scrolled_view); The default extra margin is 0. It wont effect anything if you do not touch that function. You can setup the margin to vertical and horizontal with different values. I also add some code to etk_scrolled_view_test.c. It's very easy to use. Cheers, Tick
diff --git a/src/bin/etk_scrolled_view_test.c b/etk/src/bin/etk_scrolled_view_test.c index bc3650f..7bef0bf 100644 --- a/src/bin/etk_scrolled_view_test.c +++ b/src/bin/etk_scrolled_view_test.c @@ -46,6 +46,8 @@ void etk_test_scrolled_view_window_create(void *data) scrolled_view = etk_scrolled_view_new(); etk_scrolled_view_dragable_set(ETK_SCROLLED_VIEW(scrolled_view), 1); + etk_scrolled_view_extra_vmargin_set(ETK_SCROLLED_VIEW(scrolled_view), 10); + etk_scrolled_view_extra_hmargin_set(ETK_SCROLLED_VIEW(scrolled_view), 20); etk_container_add(ETK_CONTAINER(win), scrolled_view); canvas = etk_canvas_new(); diff --git a/src/lib/etk_scrolled_view.c b/etk/src/lib/etk_scrolled_view.c index 9084fde..991c44c 100644 --- a/src/lib/etk_scrolled_view.c +++ b/src/lib/etk_scrolled_view.c @@ -330,6 +330,57 @@ unsigned int etk_scrolled_view_drag_damping_get(Etk_Scrolled_View *scrolled_view return scrolled_view->drag.damping_magic; } +/** + * @brief Set the vertical extra margin to the scrolled view + * @param scrolled_view a scrolled view + * @param margin the extra margin in pixels + */ +void etk_scrolled_view_extra_vmargin_set(Etk_Scrolled_View *scrolled_view, int margin) +{ + if (!scrolled_view) + return; + margin = margin > 0 ? margin : 0; + scrolled_view->extra_vmargin = margin; +} + +/** + * @brief Get the vertical extra margin to the scrolled view + * @param scrolled_view a scrolled view + * @return Returns the vertical extra margin in pixels + */ +int etk_scrolled_view_extra_vmargin_get(Etk_Scrolled_View *scrolled_view) +{ + if (!scrolled_view) + return -1; + return scrolled_view->extra_vmargin; +} + +/** + * @brief Set the horizontal extra margin to the scrolled view + * @param scrolled_view a scrolled view + * @param margin the extra margin in pixels + */ +void etk_scrolled_view_extra_hmargin_set(Etk_Scrolled_View *scrolled_view, int margin) +{ + if (!scrolled_view) + return; + margin = margin > 0 ? margin : 0; + scrolled_view->extra_hmargin = margin; +} + +/** + * @brief Get the horizontal extra margin to the scrolled view + * @param scrolled_view a scrolled view + * @return Returns the horizontal extra margin in pixels + */ + +int etk_scrolled_view_extra_hmargin_get(Etk_Scrolled_View *scrolled_view) +{ + if (!scrolled_view) + return -1; + return scrolled_view->extra_hmargin; +} + /************************** * * Etk specific functions @@ -352,6 +403,8 @@ static void _etk_scrolled_view_constructor(Etk_Scrolled_View *scrolled_view) scrolled_view->drag.dragable = ETK_FALSE; scrolled_view->drag.bouncy = ETK_TRUE; scrolled_view->drag.damping_magic = ETK_SCROLLED_VIEW_DRAG_DAMPING_MAGIC; + scrolled_view->extra_hmargin = 0; + scrolled_view->extra_vmargin = 0; // FIXME This can be put in etk_config (Make whole system be configured) etk_scrolled_view_drag_sample_interval_set(scrolled_view, ETK_SCROLLED_VIEW_DRAG_SAMPLE_INTERVAL_MAGIC); @@ -528,21 +581,21 @@ static void _etk_scrolled_view_size_allocate(Etk_Widget *widget, Etk_Geometry ge scrollview_size.h -= margins_size.h; } - scrollbar_size.w = vscrollbar_size.w; - scrollbar_size.h = hscrollbar_size.h; child->scroll_size_get(child, scrollview_size, scrollbar_size, &scroll_size); - if ((scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > scrollview_size.w) - || scrolled_view->hpolicy == ETK_POLICY_SHOW) + if ((scrolled_view->hpolicy == ETK_POLICY_AUTO + && (scroll_size.w + 2 * scrolled_view->extra_hmargin) > scrollview_size.w) + || scrolled_view->hpolicy == ETK_POLICY_SHOW) { show_hscrollbar = ETK_TRUE; } if ((scrolled_view->vpolicy == ETK_POLICY_AUTO - && scroll_size.h > (scrollview_size.h - (show_hscrollbar ? hscrollbar_size.h : 0))) + && (scroll_size.h + 2 * scrolled_view->extra_vmargin) > (scrollview_size.h - (show_hscrollbar ? hscrollbar_size.h : 0) )) || scrolled_view->vpolicy == ETK_POLICY_SHOW) { show_vscrollbar = ETK_TRUE; - if (scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > (scrollview_size.w - vscrollbar_size.w)) + if (scrolled_view->hpolicy == ETK_POLICY_AUTO && + (scroll_size.w + 2 * scrolled_view->extra_hmargin) > (scrollview_size.w - vscrollbar_size.w)) show_hscrollbar = ETK_TRUE; } @@ -576,10 +629,20 @@ static void _etk_scrolled_view_size_allocate(Etk_Widget *widget, Etk_Geometry ge else etk_widget_hide(scrolled_view->vscrollbar); - etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar), 0, scroll_size.w); - etk_range_page_size_set(ETK_RANGE(scrolled_view->hscrollbar), scrollview_size.w); - etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar), 0, scroll_size.h); - etk_range_page_size_set(ETK_RANGE(scrolled_view->vscrollbar), scrollview_size.h); + etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar), + 0 - scrolled_view->extra_hmargin, + scroll_size.w + scrolled_view->extra_hmargin); + if (scroll_size.w < scrollview_size.w) + etk_range_page_size_set(ETK_RANGE(scrolled_view->hscrollbar), scroll_size.w ); + else + etk_range_page_size_set(ETK_RANGE(scrolled_view->hscrollbar), scrollview_size.w ); + etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar), + 0 - scrolled_view->extra_vmargin, + scroll_size.h + scrolled_view->extra_vmargin); + if (scroll_size.h < scrollview_size.h) + etk_range_page_size_set(ETK_RANGE(scrolled_view->vscrollbar), scroll_size.h); + else + etk_range_page_size_set(ETK_RANGE(scrolled_view->vscrollbar), scrollview_size.h); /* Moves and resizes the child */ child_geometry.x = geometry.x; @@ -706,7 +769,7 @@ static Etk_Bool _etk_scrolled_view_key_down_cb(Etk_Object *object, Etk_Event_Key else if (strcmp(event->keyname, "Up") == 0) etk_range_value_set(vscrollbar_range, vscrollbar_range->value - vscrollbar_range->step_increment); else if (strcmp(event->keyname, "Home") == 0) - etk_range_value_set(vscrollbar_range, vscrollbar_range->lower); + etk_range_value_set(vscrollbar_range, vscrollbar_range->lower + scrolled_view->extra_vmargin); else if (strcmp(event->keyname, "End") == 0) etk_range_value_set(vscrollbar_range, vscrollbar_range->upper); else if (strcmp(event->keyname, "Next") == 0) @@ -801,8 +864,14 @@ static Etk_Bool _etk_scrolled_view_mouse_move(Etk_Object *object, Etk_Event_Mous } if (drag->bar_pressed == ETK_FALSE) { - etk_range_value_set(vscrollbar_range, vscrollbar_range->value - (event->cur.widget.y - drag->position.y)); - etk_range_value_set(hscrollbar_range, hscrollbar_range->value - (event->cur.widget.x - drag->position.x)); + double _value = vscrollbar_range->value - (event->cur.widget.y - drag->position.y); + if (_value > vscrollbar_range->lower && _value < vscrollbar_range->upper) { + etk_range_value_set(vscrollbar_range, _value); + } + _value = hscrollbar_range->value - (event->cur.widget.x - drag->position.x); + if (_value > hscrollbar_range->lower && _value < hscrollbar_range->upper) { + etk_range_value_set(hscrollbar_range, _value); + } } t = ecore_time_get(); /* record the last 5 mouse moves and timestamps */ @@ -1030,8 +1099,12 @@ static Etk_Bool _etk_scrolled_view_child_scroll_size_changed_cb(Etk_Object *obje scrollbar_size.h = hscrollbar_requisition.h; child->scroll_size_get(child, scrollview_size, scrollbar_size, &scroll_size); - etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar), 0, scroll_size.w); - etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar), 0, scroll_size.h); + etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar), + 0 - scrolled_view->extra_hmargin, + scroll_size.w + scrolled_view->extra_hmargin); + etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar), + 0 - scrolled_view->extra_vmargin, + scroll_size.h + scrolled_view->extra_vmargin); etk_widget_redraw_queue(ETK_WIDGET(scrolled_view)); return ETK_TRUE; diff --git a/src/lib/etk_scrolled_view.h b/etk/src/lib/etk_scrolled_view.h index ebe0a3f..7a1b0e9 100644 --- a/src/lib/etk_scrolled_view.h +++ b/src/lib/etk_scrolled_view.h @@ -91,6 +91,8 @@ struct Etk_Scrolled_View Etk_Scrolled_View_Policy hpolicy; Etk_Scrolled_View_Policy vpolicy; + int extra_hmargin; + int extra_vmargin; struct Etk_Scrolled_View_Mouse_Drag drag; }; @@ -112,6 +114,11 @@ double etk_scrolled_view_drag_sample_interval_set(Etk_Scrolled_View *scroll double etk_scrolled_view_drag_sample_interval_get(Etk_Scrolled_View *scrolled_view); unsigned int etk_scrolled_view_drag_damping_set(Etk_Scrolled_View *scrolled_view, unsigned int damping); unsigned int etk_scrolled_view_drag_damping_get(Etk_Scrolled_View *scrolled_view); +void etk_scrolled_view_extra_vmargin_set(Etk_Scrolled_View *scrolled_view, int margin); +int etk_scrolled_view_extra_vmargin_get(Etk_Scrolled_View *scrolled_view); +void etk_scrolled_view_extra_hmargin_set(Etk_Scrolled_View *scrolled_view, int margin); +int etk_scrolled_view_extra_hmargin_get(Etk_Scrolled_View *scrolled_view); + /** @} */ diff --git a/src/lib/etk_viewport.c b/etk/src/lib/etk_viewport.c index 8de08f3..06fd146 100644 --- a/src/lib/etk_viewport.c +++ b/src/lib/etk_viewport.c @@ -158,16 +158,13 @@ static void _etk_viewport_size_allocate(Etk_Widget *widget, Etk_Geometry geometr Etk_Size child_requisition; etk_widget_size_request(child, &child_requisition); - if (child_requisition.w > geometry.w) - { - geometry.w = child_requisition.w; - geometry.x -= viewport->xscroll; - } - if (child_requisition.h > geometry.h) - { - geometry.h = child_requisition.h; - geometry.y -= viewport->yscroll; - } + + geometry.w = child_requisition.w; + geometry.x -= viewport->xscroll; + + geometry.h = child_requisition.h; + geometry.y -= viewport->yscroll; + etk_widget_size_allocate(child, geometry); } }
signature.asc
Description: Digital signature
------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel