Enlightenment CVS committal

Author  : moom
Project : e17
Module  : proto

Dir     : e17/proto/etk/src/lib


Modified Files:
        etk_tree2.c etk_tree2.h 


Log Message:
* [Tree2] More work on column resizing


===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_tree2.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- etk_tree2.c 2 Jan 2007 11:24:03 -0000       1.5
+++ etk_tree2.c 3 Jan 2007 00:09:31 -0000       1.6
@@ -107,14 +107,15 @@
 static void _etk_tree2_focus_cb(Etk_Object *object, void *event, void *data);
 static void _etk_tree2_unfocus_cb(Etk_Object *object, void *event, void *data);
 static void _etk_tree2_key_down_cb(Etk_Object *object, Etk_Event_Key_Down 
*event, void *data);
+static void _etk_tree2_scroll_content_realize_cb(Etk_Object *object, void 
*data);
 static void _etk_tree2_grid_realize_cb(Etk_Object *object, void *data);
 static void _etk_tree2_grid_unrealize_cb(Etk_Object *object, void *data);
 
-static void _etk_tree2_header_mouse_down_cb(Etk_Object *object, void 
*event_info, void *data);
-static void _etk_tree2_header_mouse_up_cb(Etk_Object *object, void 
*event_info, void *data);
-static void _etk_tree2_header_mouse_move_cb(Etk_Object *object, void 
*event_info, void *data);
-static void _etk_tree2_header_mouse_in_cb(Etk_Object *object, void 
*event_info, void *data);
-static void _etk_tree2_header_mouse_out_cb(Etk_Object *object, void 
*event_info, void *data);
+static void _etk_tree2_headers_mouse_down_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
+static void _etk_tree2_headers_mouse_up_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
+static void _etk_tree2_headers_mouse_move_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
+static void _etk_tree2_headers_mouse_in_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
+static void _etk_tree2_headers_mouse_out_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 
 static void _etk_tree2_row_mouse_down_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 static void _etk_tree2_row_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
@@ -127,7 +128,8 @@
 /* TODO: static void _etk_tree2_sort(Etk_Tree2 *tree); */
 
 static void _etk_tree2_col_realize(Etk_Tree2 *tree, int col_nth);
-static Etk_Tree2_Col *etk_tree2_col_to_resize_get(Etk_Tree2_Col *col, int x);
+static Etk_Tree2_Col *etk_tree2_col_to_resize_get(Etk_Tree2 *tree, int x);
+static void _etk_tree2_headers_rect_create(Etk_Tree2 *tree, Etk_Widget 
*parent);
 
 static Etk_Tree2_Row *_etk_tree2_row_next_to_render_get(Etk_Tree2_Row *row, 
int *depth);
 static void _etk_tree2_row_fields_set_valist_full(Etk_Tree2_Row *row, va_list 
args, Etk_Bool emit_signal);
@@ -141,6 +143,7 @@
 static Etk_Signal *_etk_tree2_col_signals[ETK_TREE2_COL_NUM_SIGNALS];
 
 /* TODO: better doc of row_next_get()... (with a note about deleted rows...) */
+/* TODO: a fucntion to get the first/last visible rows.. we do it all the 
time.. */
 
 
 /**************************
@@ -468,11 +471,8 @@
       etk_widget_parent_set(new_header, tree->scroll_content);
    new_col->header = new_header;
    
-   etk_signal_connect("mouse_down", ETK_OBJECT(new_header), 
ETK_CALLBACK(_etk_tree2_header_mouse_down_cb), new_col);
-   etk_signal_connect("mouse_up", ETK_OBJECT(new_header), 
ETK_CALLBACK(_etk_tree2_header_mouse_up_cb), new_col);
-   etk_signal_connect("mouse_move", ETK_OBJECT(new_header), 
ETK_CALLBACK(_etk_tree2_header_mouse_move_cb), new_col);
-   etk_signal_connect("mouse_in", ETK_OBJECT(new_header), 
ETK_CALLBACK(_etk_tree2_header_mouse_in_cb), new_col);
-   etk_signal_connect("mouse_out", ETK_OBJECT(new_header), 
ETK_CALLBACK(_etk_tree2_header_mouse_out_cb), new_col);
+   /*etk_signal_connect("mouse_down", ETK_OBJECT(new_header), 
ETK_CALLBACK(_etk_tree2_header_mouse_down_cb), new_col);
+   etk_signal_connect("mouse_up", ETK_OBJECT(new_header), 
ETK_CALLBACK(_etk_tree2_header_mouse_up_cb), new_col);*/
 
    tree->num_cols++;
    _etk_tree2_col_realize(tree, tree->num_cols - 1);
@@ -1395,6 +1395,8 @@
    tree->scroll_content->size_allocate = 
_etk_tree2_scroll_content_size_allocate;
    tree->scroll_content->scroll = _etk_tree2_scroll_content_scroll;
    tree->scroll_content->scroll_size_get = 
_etk_tree2_scroll_content_scroll_size_get;
+   etk_signal_connect("realize", ETK_OBJECT(tree->scroll_content),
+      ETK_CALLBACK(_etk_tree2_scroll_content_realize_cb), NULL);
    
    tree->grid = etk_widget_new(ETK_WIDGET_TYPE, "theme_group", "grid", 
"theme_parent", tree,
        "repeat_mouse_events", ETK_TRUE, "internal", ETK_TRUE, "visible", 
ETK_TRUE, NULL);
@@ -1408,6 +1410,8 @@
    
    tree->num_cols = 0;
    tree->columns = NULL;
+   tree->headers_rect = NULL;
+   tree->over_col = NULL;
    tree->col_to_resize = NULL;
    tree->headers_visible = ETK_TRUE;
    tree->grid_clip = NULL;
@@ -1768,11 +1772,21 @@
          else
             etk_widget_hide(tree->columns[i]->header);
       }
+      
+      if (tree->headers_rect)
+      {
+         evas_object_show(tree->headers_rect);
+         evas_object_raise(tree->headers_rect);
+         evas_object_move(tree->headers_rect, geometry.x, geometry.y);
+         evas_object_resize(tree->headers_rect, geometry.w, geometry.h);
+      }
    }
    else
    {
       for (i = 0; i < tree->num_cols; i++)
          etk_widget_hide(tree->columns[i]->header);
+      if (tree->headers_rect)
+         evas_object_hide(tree->headers_rect);
    }
 }
 
@@ -2217,6 +2231,10 @@
       }
       tree->tree_contains_headers = (tree_contains_headers != 0);
    }
+   
+   /* Create an invisible rectangle used to catch the events on the tree 
headers */
+   if (tree->tree_contains_headers)
+      _etk_tree2_headers_rect_create(tree, ETK_WIDGET(tree));
 }
 
 /* Called when the tree is focused */
@@ -2266,6 +2284,24 @@
 }
 
 /**************************
+ * Tree Scroll-Content
+ **************************/
+
+/* Called when the scroll-content is realized */
+static void _etk_tree2_scroll_content_realize_cb(Etk_Object *object, void 
*data)
+{
+   Etk_Widget *scroll_content;
+   Etk_Tree2 *tree;
+   
+   if (!(scroll_content = ETK_WIDGET(object)) || !(tree = ETK_TREE2(data)))
+      return;
+   
+   /* Create an invisible rectangle used to catch the events on the tree 
headers */
+   if (!tree->tree_contains_headers)
+      _etk_tree2_headers_rect_create(tree, scroll_content);
+}
+
+/**************************
  * Tree Grid
  **************************/
 
@@ -2314,104 +2350,108 @@
  * Tree Headers
  **************************/
 
-/* Called when the mouse presses the column header */
-static void _etk_tree2_header_mouse_down_cb(Etk_Object *object, void 
*event_info, void *data)
+/* Called when the mouse presses the rectangle that is over the column headers 
*/
+static void _etk_tree2_headers_mouse_down_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info)
 {
-   Etk_Event_Mouse_Down *event = event_info;
-   Etk_Tree2_Col *col;
+   Etk_Tree2 *tree;
+   Evas_Event_Mouse_Down *event = event_info;
    
-   if (!(col = ETK_TREE2_COL(data)) || event->button != 1)
+   if (!(tree = ETK_TREE2(data)) || event->button != 1)
       return;
    
    /* Checks if we should resize a column */
-   if ((col->tree->col_to_resize = etk_tree2_col_to_resize_get(col, 
event->widget.x)))
+   if ((tree->col_to_resize = etk_tree2_col_to_resize_get(tree, 
event->canvas.x)))
    {
-      col->tree->col_resize_orig_width = col->tree->col_to_resize->width;
-      col->tree->col_resize_orig_mouse_x = event->canvas.x;
-      etk_signal_stop();
+      tree->col_resize_orig_width = tree->col_to_resize->width;
+      tree->col_resize_orig_mouse_x = event->canvas.x;
    }
+   /* TODO: the mouse events should not always be propagated... */
 }
 
-/* Called when the mouse releases the column header */
-static void _etk_tree2_header_mouse_up_cb(Etk_Object *object, void 
*event_info, void *data)
+/* Called when the mouse releases the rectangle that is over the column 
headers */
+static void _etk_tree2_headers_mouse_up_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info)
 {
-   Etk_Event_Mouse_Up *event = event_info;
-   Etk_Tree2_Col *col;
+   Etk_Tree2 *tree;
+   Evas_Event_Mouse_Down *event = event_info;
    
-   if (!(col = ETK_TREE2_COL(data)) || event->button != 1)
+   if (!(tree = ETK_TREE2(data)) || event->button != 1)
       return;
    
-   if (col->tree->col_to_resize)
-      col->tree->col_to_resize = NULL;
-   /* TODO: else: sort the column if we are still above the header */
+   if (tree->col_to_resize)
+      tree->col_to_resize = NULL;
 }
 
-/* Called when the mouse moves over the column header */
-static void _etk_tree2_header_mouse_move_cb(Etk_Object *object, void 
*event_info, void *data)
+/* Called when the mouse moves over the column headers */
+static void _etk_tree2_headers_mouse_move_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info)
 {
-   Etk_Event_Mouse_Move *event = event_info;
-   Etk_Tree2_Col *col, *col_to_resize;
+   Etk_Tree2 *tree;
    Etk_Toplevel *toplevel;
+   Evas_Event_Mouse_Move *event = event_info;
    
-   if (!(col = ETK_TREE2_COL(data)) || !(toplevel = 
etk_widget_toplevel_parent_get(ETK_WIDGET(object))))
+   if (!(tree = ETK_TREE2(data)) || !(toplevel = 
etk_widget_toplevel_parent_get(ETK_WIDGET(tree))))
       return;
    
-   if (col->tree->col_to_resize)
+   if (tree->col_to_resize)
    {
+      int delta;
+      
       /* Resize the column to resize */
-      etk_tree2_col_width_set(col->tree->col_to_resize,
-         col->tree->col_resize_orig_width + event->cur.canvas.x - 
col->tree->col_resize_orig_mouse_x);
+      delta = event->cur.canvas.x - tree->col_resize_orig_mouse_x;
+      etk_tree2_col_width_set(tree->col_to_resize, tree->col_resize_orig_width 
+ delta);
    }
    else
    {
+      Etk_Tree2_Col *col_to_resize;
+      
       /* Set/Unset the resize mouse pointer if the pointer is/was between two 
column headers */
-      col_to_resize = etk_tree2_col_to_resize_get(col, event->cur.widget.x);
-      if (col_to_resize && !col->tree->col_resize_pointer_set)
+      col_to_resize = etk_tree2_col_to_resize_get(tree, event->cur.canvas.x);
+      if (col_to_resize && !tree->col_resize_pointer_set)
       {
          etk_toplevel_pointer_push(toplevel, ETK_POINTER_H_DOUBLE_ARROW);
-         col->tree->col_resize_pointer_set = ETK_TRUE;
+         tree->col_resize_pointer_set = ETK_TRUE;
       }
-      else if (!col_to_resize && col->tree->col_resize_pointer_set)
+      else if (!col_to_resize && tree->col_resize_pointer_set)
       {
          etk_toplevel_pointer_pop(toplevel, ETK_POINTER_H_DOUBLE_ARROW);
-         col->tree->col_resize_pointer_set = ETK_FALSE;
+         tree->col_resize_pointer_set = ETK_FALSE;
       }
    }
 }
 
-/* Called when the mouse enters the column header */
-static void _etk_tree2_header_mouse_in_cb(Etk_Object *object, void 
*event_info, void *data)
+/* Called when the mouse enters the rectangle that is over the column headers 
*/
+static void _etk_tree2_headers_mouse_in_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info)
 {
-   Etk_Event_Mouse_In *event = event_info;
-   Etk_Tree2_Col *col, *col_to_resize;
+   Etk_Tree2 *tree;
    Etk_Toplevel *toplevel;
+   Etk_Tree2_Col *col_to_resize;
+   Evas_Event_Mouse_In *event = event_info;
    
-   if (!(col = ETK_TREE2_COL(data)) || !(toplevel = 
etk_widget_toplevel_parent_get(ETK_WIDGET(object))))
+   if (!(tree = ETK_TREE2(data)) || !(toplevel = 
etk_widget_toplevel_parent_get(ETK_WIDGET(tree))))
       return;
    
    /* Set the resize mouse pointer if the pointer is between two column 
headers */
-   col_to_resize = etk_tree2_col_to_resize_get(col, event->widget.x);
-   if (col_to_resize && !col->tree->col_resize_pointer_set)
+   col_to_resize = etk_tree2_col_to_resize_get(tree, event->canvas.x);
+   if (col_to_resize && !tree->col_resize_pointer_set)
    {
       etk_toplevel_pointer_push(toplevel, ETK_POINTER_H_DOUBLE_ARROW);
-      col->tree->col_resize_pointer_set = ETK_TRUE;
+      tree->col_resize_pointer_set = ETK_TRUE;
    }
 }
 
-/* Called when the mouse leaves the column header */
-static void _etk_tree2_header_mouse_out_cb(Etk_Object *object, void 
*event_info, void *data)
+/* Called when the mouse leaves the rectangle that is over the column headers 
*/
+static void _etk_tree2_headers_mouse_out_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info)
 {
-   Etk_Tree2_Col *col;
+   Etk_Tree2 *tree;
    Etk_Toplevel *toplevel;
    
-   if (!(col = ETK_TREE2_COL(data)) || !(toplevel = 
etk_widget_toplevel_parent_get(ETK_WIDGET(object))))
+   if (!(tree = ETK_TREE2(data)) || !(toplevel = 
etk_widget_toplevel_parent_get(ETK_WIDGET(tree))))
       return;
    
    /* Unset the resize mouse pointer if it was set */
-   if (col->tree->col_resize_pointer_set)
+   if (tree->col_resize_pointer_set)
    {
       etk_toplevel_pointer_pop(toplevel, ETK_POINTER_H_DOUBLE_ARROW);
-      col->tree->col_resize_pointer_set = ETK_FALSE;
+      tree->col_resize_pointer_set = ETK_FALSE;
    }
 }
 
@@ -2641,13 +2681,38 @@
    etk_widget_member_object_add(tree->grid, col->separator);
 }
 
-/* Returns the column to resize according to the position of the mouse in the 
column "col" */
-static Etk_Tree2_Col *etk_tree2_col_to_resize_get(Etk_Tree2_Col *col, int x)
+/* Returns the column to resize according to the position of the mouse pointer 
*/
+static Etk_Tree2_Col *etk_tree2_col_to_resize_get(Etk_Tree2 *tree, int x)
 {
+   Etk_Tree2_Col *col;
+   int header_x = 0, header_w = 0;
+   int i;
+   
+   if (!tree || !tree->headers_visible)
+      return NULL;
+   
+   /* First we find the column over which the mouse pointer is */
+   col = NULL;
+   for (i = 0; i < tree->num_cols; i++)
+   {
+      if (!tree->columns[i]->visible)
+         continue;
+      
+      etk_widget_geometry_get(tree->columns[i]->header, &header_x, NULL, 
&header_w, NULL);
+      if (header_x <= x && x < (header_x + header_w))
+      {
+         col = tree->columns[i];
+         x -= header_x;
+         break;
+      }
+   }
+   
    if (!col)
       return NULL;
    
-   if ((x + col->header->inset.left <= COL_RESIZE_THRESHOLD))
+   /* Once the column is found, we look if the mouse pointer is over
+    * one of the two edges of the header (x is now relative to the column's 
header) */
+   if (x <= COL_RESIZE_THRESHOLD)
    {
       Etk_Tree2_Col *prev_visible_col, *col2;
       int i;
@@ -2656,16 +2721,44 @@
       for (i = 0; i < col->tree->num_cols; i++)
       {
          col2 = col->tree->columns[i];
+         if (!col2->visible)
+            continue;
+         
          if ((col2->position < col->position) && (!prev_visible_col || 
(prev_visible_col->position < col2->position)))
             prev_visible_col = col2;
       }
       
       return (prev_visible_col && prev_visible_col->resizable) ? 
prev_visible_col : NULL;
    }
-   else if ((col->header->geometry.w - (x + col->header->inset.left) <= 
COL_RESIZE_THRESHOLD))
+   else if (header_w - x <= COL_RESIZE_THRESHOLD)
       return (col && col->resizable) ? col : NULL;
 
    return NULL;
+}
+
+/* Creates the invisible rectangle which is ovet the column headers. It is 
used to catch mouse events */
+static void _etk_tree2_headers_rect_create(Etk_Tree2 *tree, Etk_Widget *parent)
+{
+   Evas *evas;
+   
+   if (!tree || !parent || !(evas = etk_widget_toplevel_evas_get(parent)))
+      return;
+   
+   tree->headers_rect = evas_object_rectangle_add(evas);
+   evas_object_color_set(tree->headers_rect, 0, 0, 0, 0);
+   evas_object_repeat_events_set(tree->headers_rect, 1);
+   etk_widget_member_object_add(parent, tree->headers_rect);
+   
+   evas_object_event_callback_add(tree->headers_rect, EVAS_CALLBACK_MOUSE_DOWN,
+      _etk_tree2_headers_mouse_down_cb, tree);
+   evas_object_event_callback_add(tree->headers_rect, EVAS_CALLBACK_MOUSE_UP,
+      _etk_tree2_headers_mouse_up_cb, tree);
+   evas_object_event_callback_add(tree->headers_rect, EVAS_CALLBACK_MOUSE_MOVE,
+      _etk_tree2_headers_mouse_move_cb, tree);
+   evas_object_event_callback_add(tree->headers_rect, EVAS_CALLBACK_MOUSE_IN,
+      _etk_tree2_headers_mouse_in_cb, tree);
+   evas_object_event_callback_add(tree->headers_rect, EVAS_CALLBACK_MOUSE_OUT,
+      _etk_tree2_headers_mouse_out_cb, tree);
 }
 
 /* Gets the next row to render */
===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_tree2.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- etk_tree2.h 26 Dec 2006 14:51:23 -0000      1.4
+++ etk_tree2.h 3 Jan 2007 00:09:31 -0000       1.5
@@ -110,15 +110,18 @@
    Etk_Widget *scrolled_view;
    Etk_Widget *scroll_content;
    Etk_Widget *grid;
+   Evas_Object *grid_clip;
 
    int num_cols;
    Etk_Tree2_Col **columns;
+   Etk_Bool headers_visible;
+   
+   Evas_Object *headers_rect;
+   Etk_Tree2_Col *over_col;
    Etk_Tree2_Col *col_to_resize;
    Etk_Bool col_resize_pointer_set;
    int col_resize_orig_width;
    int col_resize_orig_mouse_x;
-   Etk_Bool headers_visible;
-   Evas_Object *grid_clip;
    
    int total_rows;
    Etk_Tree2_Row root;



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to