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);
    }
 }

Attachment: 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

Reply via email to