Ticket #1982: etk_scrolled_view_adding_scrolled_view_margins.patch

File etk_scrolled_view_adding_scrolled_view_margins.patch, 10.0 KB (added by tick, 11 years ago)

updated patch

  • src/bin/etk_scrolled_view_test.c

    diff --git a/src/bin/etk_scrolled_view_test.c b/etk/src/bin/etk_scrolled_view_test.c
    index bc3650f..7bef0bf 100644
    a b void etk_test_scrolled_view_window_create(void *data) 
    4646 
    4747   scrolled_view = etk_scrolled_view_new(); 
    4848   etk_scrolled_view_dragable_set(ETK_SCROLLED_VIEW(scrolled_view), 1); 
     49   etk_scrolled_view_extra_vmargin_set(ETK_SCROLLED_VIEW(scrolled_view), 10); 
     50   etk_scrolled_view_extra_hmargin_set(ETK_SCROLLED_VIEW(scrolled_view), 20); 
    4951   etk_container_add(ETK_CONTAINER(win), scrolled_view); 
    5052 
    5153   canvas = etk_canvas_new(); 
  • src/lib/etk_scrolled_view.c

    diff --git a/src/lib/etk_scrolled_view.c b/etk/src/lib/etk_scrolled_view.c
    index 9084fde..991c44c 100644
    a b unsigned int etk_scrolled_view_drag_damping_get(Etk_Scrolled_View *scrolled_view 
    330330   return scrolled_view->drag.damping_magic; 
    331331} 
    332332 
     333/** 
     334 * @brief Set the vertical extra margin to the scrolled view 
     335 * @param  scrolled_view a scrolled view 
     336 * @param margin the extra margin in pixels 
     337 */  
     338void etk_scrolled_view_extra_vmargin_set(Etk_Scrolled_View *scrolled_view, int margin) 
     339{ 
     340   if (!scrolled_view) 
     341      return; 
     342   margin = margin > 0 ? margin : 0; 
     343   scrolled_view->extra_vmargin = margin; 
     344} 
     345 
     346/** 
     347 * @brief Get the vertical extra margin to the scrolled view 
     348 * @param  scrolled_view a scrolled view 
     349 * @return Returns the vertical extra margin in pixels 
     350 */  
     351int etk_scrolled_view_extra_vmargin_get(Etk_Scrolled_View *scrolled_view) 
     352{ 
     353   if (!scrolled_view) 
     354      return -1; 
     355   return scrolled_view->extra_vmargin; 
     356} 
     357 
     358/** 
     359 * @brief Set the horizontal extra margin to the scrolled view 
     360 * @param  scrolled_view a scrolled view 
     361 * @param margin the extra margin in pixels 
     362 */  
     363void etk_scrolled_view_extra_hmargin_set(Etk_Scrolled_View *scrolled_view, int margin)  
     364{ 
     365   if (!scrolled_view) 
     366      return; 
     367   margin = margin > 0 ? margin : 0; 
     368   scrolled_view->extra_hmargin = margin; 
     369} 
     370 
     371/** 
     372 * @brief Get the horizontal extra margin to the scrolled view 
     373 * @param  scrolled_view a scrolled view 
     374 * @return Returns the horizontal extra margin in pixels 
     375 */  
     376 
     377int etk_scrolled_view_extra_hmargin_get(Etk_Scrolled_View *scrolled_view)  
     378{ 
     379   if (!scrolled_view) 
     380      return -1; 
     381   return scrolled_view->extra_hmargin; 
     382} 
     383 
    333384/************************** 
    334385 * 
    335386 * Etk specific functions 
    static void _etk_scrolled_view_constructor(Etk_Scrolled_View *scrolled_view) 
    352403   scrolled_view->drag.dragable    = ETK_FALSE; 
    353404   scrolled_view->drag.bouncy      = ETK_TRUE; 
    354405   scrolled_view->drag.damping_magic = ETK_SCROLLED_VIEW_DRAG_DAMPING_MAGIC; 
     406   scrolled_view->extra_hmargin    = 0; 
     407   scrolled_view->extra_vmargin    = 0; 
    355408 
    356409   // FIXME This can be put in etk_config (Make whole system be configured) 
    357410   etk_scrolled_view_drag_sample_interval_set(scrolled_view, ETK_SCROLLED_VIEW_DRAG_SAMPLE_INTERVAL_MAGIC); 
    static void _etk_scrolled_view_size_allocate(Etk_Widget *widget, Etk_Geometry ge 
    528581      scrollview_size.h -= margins_size.h; 
    529582   } 
    530583 
    531    scrollbar_size.w = vscrollbar_size.w; 
    532    scrollbar_size.h = hscrollbar_size.h; 
    533584   child->scroll_size_get(child, scrollview_size, scrollbar_size, &scroll_size); 
    534585 
    535    if ((scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > scrollview_size.w) 
    536       || scrolled_view->hpolicy == ETK_POLICY_SHOW) 
     586   if ((scrolled_view->hpolicy == ETK_POLICY_AUTO  
     587            && (scroll_size.w + 2 * scrolled_view->extra_hmargin) > scrollview_size.w) 
     588         || scrolled_view->hpolicy == ETK_POLICY_SHOW) 
    537589   { 
    538590      show_hscrollbar = ETK_TRUE; 
    539591   } 
    540592   if ((scrolled_view->vpolicy == ETK_POLICY_AUTO 
    541          && scroll_size.h > (scrollview_size.h - (show_hscrollbar ? hscrollbar_size.h : 0))) 
     593         && (scroll_size.h + 2 * scrolled_view->extra_vmargin) > (scrollview_size.h - (show_hscrollbar ? hscrollbar_size.h : 0) )) 
    542594      || scrolled_view->vpolicy == ETK_POLICY_SHOW) 
    543595   { 
    544596      show_vscrollbar = ETK_TRUE; 
    545       if (scrolled_view->hpolicy == ETK_POLICY_AUTO && scroll_size.w > (scrollview_size.w - vscrollbar_size.w)) 
     597      if (scrolled_view->hpolicy == ETK_POLICY_AUTO &&  
     598            (scroll_size.w + 2 * scrolled_view->extra_hmargin) > (scrollview_size.w - vscrollbar_size.w)) 
    546599         show_hscrollbar = ETK_TRUE; 
    547600   } 
    548601 
    static void _etk_scrolled_view_size_allocate(Etk_Widget *widget, Etk_Geometry ge 
    576629   else 
    577630      etk_widget_hide(scrolled_view->vscrollbar); 
    578631 
    579    etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar), 0, scroll_size.w); 
    580    etk_range_page_size_set(ETK_RANGE(scrolled_view->hscrollbar), scrollview_size.w); 
    581    etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar), 0, scroll_size.h); 
    582    etk_range_page_size_set(ETK_RANGE(scrolled_view->vscrollbar), scrollview_size.h); 
     632   etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar),  
     633         0 - scrolled_view->extra_hmargin,  
     634         scroll_size.w + scrolled_view->extra_hmargin); 
     635   if (scroll_size.w < scrollview_size.w) 
     636      etk_range_page_size_set(ETK_RANGE(scrolled_view->hscrollbar), scroll_size.w ); 
     637   else  
     638      etk_range_page_size_set(ETK_RANGE(scrolled_view->hscrollbar), scrollview_size.w ); 
     639   etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar),  
     640         0 - scrolled_view->extra_vmargin,  
     641         scroll_size.h + scrolled_view->extra_vmargin); 
     642   if (scroll_size.h < scrollview_size.h) 
     643      etk_range_page_size_set(ETK_RANGE(scrolled_view->vscrollbar), scroll_size.h); 
     644   else 
     645      etk_range_page_size_set(ETK_RANGE(scrolled_view->vscrollbar), scrollview_size.h); 
    583646 
    584647   /* Moves and resizes the child */ 
    585648   child_geometry.x = geometry.x; 
    static Etk_Bool _etk_scrolled_view_key_down_cb(Etk_Object *object, Etk_Event_Key 
    706769   else if (strcmp(event->keyname, "Up") == 0) 
    707770      etk_range_value_set(vscrollbar_range, vscrollbar_range->value - vscrollbar_range->step_increment); 
    708771   else if (strcmp(event->keyname, "Home") == 0) 
    709       etk_range_value_set(vscrollbar_range, vscrollbar_range->lower); 
     772      etk_range_value_set(vscrollbar_range, vscrollbar_range->lower + scrolled_view->extra_vmargin); 
    710773   else if (strcmp(event->keyname, "End") == 0) 
    711774      etk_range_value_set(vscrollbar_range, vscrollbar_range->upper); 
    712775   else if (strcmp(event->keyname, "Next") == 0) 
    static Etk_Bool _etk_scrolled_view_mouse_move(Etk_Object *object, Etk_Event_Mous 
    801864      } 
    802865      if (drag->bar_pressed == ETK_FALSE)  
    803866      { 
    804          etk_range_value_set(vscrollbar_range, vscrollbar_range->value - (event->cur.widget.y - drag->position.y)); 
    805          etk_range_value_set(hscrollbar_range, hscrollbar_range->value - (event->cur.widget.x - drag->position.x)); 
     867         double _value = vscrollbar_range->value - (event->cur.widget.y - drag->position.y); 
     868         if (_value > vscrollbar_range->lower && _value < vscrollbar_range->upper) { 
     869            etk_range_value_set(vscrollbar_range, _value); 
     870         } 
     871         _value = hscrollbar_range->value - (event->cur.widget.x - drag->position.x); 
     872         if (_value > hscrollbar_range->lower && _value < hscrollbar_range->upper) { 
     873            etk_range_value_set(hscrollbar_range, _value); 
     874         } 
    806875      } 
    807876      t = ecore_time_get(); 
    808877      /* record the last 5 mouse moves and timestamps */ 
    static Etk_Bool _etk_scrolled_view_child_scroll_size_changed_cb(Etk_Object *obje 
    10301099   scrollbar_size.h = hscrollbar_requisition.h; 
    10311100   child->scroll_size_get(child, scrollview_size, scrollbar_size, &scroll_size); 
    10321101 
    1033    etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar), 0, scroll_size.w); 
    1034    etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar), 0, scroll_size.h); 
     1102   etk_range_range_set(ETK_RANGE(scrolled_view->hscrollbar),  
     1103         0 - scrolled_view->extra_hmargin,  
     1104         scroll_size.w + scrolled_view->extra_hmargin); 
     1105   etk_range_range_set(ETK_RANGE(scrolled_view->vscrollbar),  
     1106         0 - scrolled_view->extra_vmargin,  
     1107         scroll_size.h + scrolled_view->extra_vmargin); 
    10351108   etk_widget_redraw_queue(ETK_WIDGET(scrolled_view)); 
    10361109 
    10371110   return ETK_TRUE; 
  • src/lib/etk_scrolled_view.h

    diff --git a/src/lib/etk_scrolled_view.h b/etk/src/lib/etk_scrolled_view.h
    index ebe0a3f..7a1b0e9 100644
    a b struct Etk_Scrolled_View 
    9191   Etk_Scrolled_View_Policy hpolicy; 
    9292   Etk_Scrolled_View_Policy vpolicy; 
    9393 
     94   int extra_hmargin; 
     95   int extra_vmargin; 
    9496   struct Etk_Scrolled_View_Mouse_Drag drag; 
    9597}; 
    9698 
    double etk_scrolled_view_drag_sample_interval_set(Etk_Scrolled_View *scroll 
    112114double      etk_scrolled_view_drag_sample_interval_get(Etk_Scrolled_View *scrolled_view); 
    113115unsigned int etk_scrolled_view_drag_damping_set(Etk_Scrolled_View *scrolled_view, unsigned int damping); 
    114116unsigned int etk_scrolled_view_drag_damping_get(Etk_Scrolled_View *scrolled_view); 
     117void        etk_scrolled_view_extra_vmargin_set(Etk_Scrolled_View *scrolled_view, int margin); 
     118int        etk_scrolled_view_extra_vmargin_get(Etk_Scrolled_View *scrolled_view); 
     119void        etk_scrolled_view_extra_hmargin_set(Etk_Scrolled_View *scrolled_view, int margin); 
     120int        etk_scrolled_view_extra_hmargin_get(Etk_Scrolled_View *scrolled_view); 
     121 
    115122 
    116123/** @} */ 
    117124 
  • src/lib/etk_viewport.c

    diff --git a/src/lib/etk_viewport.c b/etk/src/lib/etk_viewport.c
    index 8de08f3..06fd146 100644
    a b static void _etk_viewport_size_allocate(Etk_Widget *widget, Etk_Geometry geometr 
    158158      Etk_Size child_requisition; 
    159159 
    160160      etk_widget_size_request(child, &child_requisition); 
    161       if (child_requisition.w > geometry.w) 
    162       { 
    163          geometry.w = child_requisition.w; 
    164          geometry.x -= viewport->xscroll; 
    165       } 
    166       if (child_requisition.h > geometry.h) 
    167       { 
    168          geometry.h = child_requisition.h; 
    169          geometry.y -= viewport->yscroll; 
    170       } 
     161 
     162      geometry.w = child_requisition.w; 
     163      geometry.x -= viewport->xscroll; 
     164 
     165      geometry.h = child_requisition.h; 
     166      geometry.y -= viewport->yscroll; 
     167 
    171168      etk_widget_size_allocate(child, geometry); 
    172169   } 
    173170}