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 [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
