Enlightenment CVS committal

Author  : moom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_tree.c etk_tree.h 


Log Message:
* [Etk_Tree] Patch from kenne
    - add etk_tree_column_separators_visible_set/get()
    - split up _etk_tree_grid_size_allocate() into several functions


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_tree.c,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -3 -r1.102 -r1.103
--- etk_tree.c  15 Aug 2007 22:54:11 -0000      1.102
+++ etk_tree.c  21 Aug 2007 13:46:24 -0000      1.103
@@ -63,6 +63,7 @@
    ETK_TREE_MODE_PROPERTY,
    ETK_TREE_MULTIPLE_SELECT_PROPERTY,
    ETK_TREE_HEADERS_VISIBLE_PROPERTY,
+   ETK_TREE_COLUMN_SEPARTORS_VISIBLE_PROPERTY,
    ETK_TREE_ROWS_HEIGHT_PROPERTY
 };
 
@@ -103,8 +104,12 @@
 static void _etk_tree_scroll_content_scroll(Etk_Widget *widget, int x, int y);
 static void _etk_tree_scroll_content_scroll_size_get(Etk_Widget *widget, 
Etk_Size scrollview_size, Etk_Size scrollbar_size, Etk_Size *scroll_size);
 static void _etk_tree_grid_size_allocate(Etk_Widget *widget, Etk_Geometry 
geometry);
+static void _etk_tree_columns_geometry_calc(Etk_Tree *tree, int grid_width, 
Etk_Tree_Col **first_visible_col, Etk_Tree_Col **last_visible_col);
+static void _etk_tree_columns_render(Etk_Tree *tree, Etk_Geometry 
grid_geometry, Etk_Tree_Col *last_visible_col);
+static void _etk_tree_row_objects_cache(Etk_Tree *tree);
+static void _etk_tree_row_objects_create_destroy(Etk_Tree *tree, Etk_Geometry 
grid_geometry);
+static void _etk_tree_row_objects_update(Etk_Tree *tree, Etk_Geometry 
grid_geometry, Etk_Tree_Col *first_visible_col, Evas_List **prev_visible_rows, 
Evas_List **new_visible_rows);
 
-static void _etk_tree_realized_cb(Etk_Object *object, void *data);
 static void _etk_tree_focused_cb(Etk_Object *object, void *event, void *data);
 static void _etk_tree_unfocused_cb(Etk_Object *object, void *event, void 
*data);
 static void _etk_tree_key_down_cb(Etk_Object *object, Etk_Event_Key_Down 
*event, void *data);
@@ -199,6 +204,8 @@
             ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, 
etk_property_value_bool(ETK_TRUE));
       etk_type_property_add(tree_type, "headers-visible", 
ETK_TREE_HEADERS_VISIBLE_PROPERTY,
             ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, 
etk_property_value_bool(ETK_TRUE));
+      etk_type_property_add(tree_type, "column-separators-visible", 
ETK_TREE_COLUMN_SEPARTORS_VISIBLE_PROPERTY,
+            ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, 
etk_property_value_bool(ETK_TRUE));
       etk_type_property_add(tree_type, "rows-height", 
ETK_TREE_ROWS_HEIGHT_PROPERTY,
             ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, 
etk_property_value_int(DEFAULT_ROW_HEIGHT));
       
@@ -347,6 +354,33 @@
 }
 
 /**
+ * @brief Sets whether the columns should be separated by a visible vertical 
separator
+ * @param tree a tree
+ * @param col_separators_visible ETK_TRUE to show the vertical separators, 
ETK_FALSE to hide them
+ */
+void etk_tree_column_separators_visible_set(Etk_Tree *tree, Etk_Bool 
col_separators_visible)
+{
+   if (!tree || (tree->col_separators_visible == col_separators_visible))
+      return;
+
+   tree->col_separators_visible = col_separators_visible;
+   etk_object_notify(ETK_OBJECT(tree), "column-separators-visible");
+   etk_widget_redraw_queue(ETK_WIDGET(tree));
+}
+
+/**
+ * @brief Gets whether or not the columns are separated by a visible vertical 
separator
+ * @param tree a tree
+ * @return Returns ETK_TRUE if the vertical separators are shown, ETK_FALSE 
otherwise
+ */
+Etk_Bool etk_tree_column_separators_visible_get(Etk_Tree *tree)
+{
+   if (!tree)
+      return ETK_FALSE;
+   return tree->col_separators_visible;
+}
+
+/**
  * @brief Sets the height of the rows of the tree
  * @param tree a tree
  * @param rows_height the rows height to set. The minimum value is 12
@@ -1887,12 +1921,15 @@
    
    tree->purge_job = NULL;
    tree->mode = ETK_TREE_MODE_LIST;
+   tree->col_separators_visible = ETK_TRUE;
    tree->multiple_select = ETK_FALSE;
    tree->tree_contains_headers = ETK_TRUE;
    tree->col_resize_pointer_set = ETK_FALSE;
+
    tree->frozen = ETK_FALSE;
    tree->built = ETK_FALSE;
    
+
    ETK_WIDGET(tree)->size_request = _etk_tree_size_request;
    ETK_WIDGET(tree)->size_allocate = _etk_tree_size_allocate;
    
@@ -1937,6 +1974,9 @@
       case ETK_TREE_HEADERS_VISIBLE_PROPERTY:
          etk_tree_headers_visible_set(tree, 
etk_property_value_bool_get(value));
          break;
+      case ETK_TREE_COLUMN_SEPARTORS_VISIBLE_PROPERTY:
+         etk_tree_column_separators_visible_set(tree, 
etk_property_value_bool_get(value));
+         break;
       default:
          break;
    }
@@ -1955,6 +1995,9 @@
       case ETK_TREE_MODE_PROPERTY:
          etk_property_value_int_set(value, tree->mode);
          break;
+      case ETK_TREE_COLUMN_SEPARTORS_VISIBLE_PROPERTY:
+         etk_property_value_bool_set(value, tree->col_separators_visible);
+         break;
       case ETK_TREE_MULTIPLE_SELECT_PROPERTY:
          etk_property_value_bool_set(value, tree->multiple_select);
          break;
@@ -2003,20 +2046,17 @@
    max_header_height = 0;
    
    /* Allocate size for the scrolled view */
-   if (tree->tree_contains_headers)
+   if (tree->tree_contains_headers && tree->headers_visible)
    {
-      if (tree->headers_visible)
+      for (i = 0; i < tree->num_cols; i++)
       {
-         for (i = 0; i < tree->num_cols; i++)
-         {
-            etk_widget_size_request_full(tree->columns[i]->header, 
&header_size, ETK_FALSE);
-            if (header_size.h > max_header_height)
-               max_header_height = header_size.h;
-         }
-         
-         view_geometry.y += max_header_height;
-         view_geometry.h -= max_header_height;
+         etk_widget_size_request_full(tree->columns[i]->header, &header_size, 
ETK_FALSE);
+         if (header_size.h > max_header_height)
+            max_header_height = header_size.h;
       }
+      
+      view_geometry.y += max_header_height;
+      view_geometry.h -= max_header_height;
    }
    etk_widget_size_allocate(tree->scrolled_view, view_geometry);
    
@@ -2155,7 +2195,7 @@
 /* Allocates size for the headers of the tree */
 static void _etk_tree_headers_size_allocate(Etk_Tree *tree, Etk_Geometry 
geometry)
 {
-   int i;
+   int col_iter;
    
    if (!tree)
       return;
@@ -2176,9 +2216,9 @@
       
       first_visible_col = NULL;
       last_visible_col = NULL;
-      for (i = 0; i < tree->num_cols; i++)
+      for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
       {
-         col = tree->columns[i];
+         col = tree->columns[col_iter];
          if (col->visible
                && header_bar_geometry.x + col->xoffset <= geometry.x + 
geometry.w
                && header_bar_geometry.x + col->xoffset + col->visible_width >= 
geometry.x)
@@ -2193,9 +2233,9 @@
       header_geometry.y = header_bar_geometry.y;
       header_geometry.h = header_bar_geometry.h;
       
-      for (i = 0; i < tree->num_cols; i++)
+      for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
       {
-         col = tree->columns[i];
+         col = tree->columns[col_iter];
          if (col->visible
                && first_visible_col->position <= col->position
                && last_visible_col->position >= col->position)
@@ -2238,10 +2278,10 @@
    }
    else
    {
-      for (i = 0; i < tree->num_cols; i++)
+      for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
       {
-         etk_widget_hide(tree->columns[i]->header);
-         evas_object_hide(tree->columns[i]->header_over);
+         etk_widget_hide(tree->columns[col_iter]->header);
+         evas_object_hide(tree->columns[col_iter]->header_over);
       }
    }
 }
@@ -2334,95 +2374,175 @@
    Etk_Tree *tree;
    Etk_Tree_Col *first_visible_col;
    Etk_Tree_Col *last_visible_col;
-   Etk_Tree_Col *col;
    Evas_List *prev_visible_rows;
    Evas_List *new_visible_rows;
    Evas_List *l;
    Evas *evas;
-   int i, j, k;
    
    if (!(tree = TREE_GET(widget)) || !(evas = 
etk_widget_toplevel_evas_get(ETK_WIDGET(tree))))
       return;
    
    /* First, we calculate the size of the visible cols */
+   _etk_tree_columns_geometry_calc(tree, geometry.w, &first_visible_col, 
&last_visible_col);
+   
+   /* Move/Resize the clipper of the grid */
+   if (tree->root.num_children > 0)
    {
-      int num_visible_cols;
-      int num_expand_cols;
-      int columns_width;
-      int freespace;
-      int xoffset;
-      
-      first_visible_col = NULL;
-      last_visible_col = NULL;
-      columns_width = 0;
-      num_visible_cols = 0;
-      num_expand_cols = 0;
-      for (i = 0; i < tree->num_cols; i++)
+      evas_object_move(tree->grid_clip, geometry.x, geometry.y);
+      evas_object_resize(tree->grid_clip, geometry.w, geometry.h);
+      evas_object_show(tree->grid_clip);
+   }
+   else
+      evas_object_hide(tree->grid_clip);
+   
+   if (!tree->built)
+      return;
+   
+   /* Remove the rows marked as "deleted" */
+   if (tree->purge_job)
+   {
+      _etk_tree_purge(tree);
+      tree->purge_job = NULL;
+   }
+   
+   /* Save the rows currently rendered so we could emit the "row-shown/hidden" 
signals later */
+   prev_visible_rows = NULL;
+   new_visible_rows = NULL;
+   for (l = tree->row_objects; l; l = l->next)
+   {
+      Etk_Tree_Row_Object *row_object;
+
+      row_object = l->data;
+      if (row_object->row)
+         prev_visible_rows = evas_list_append(prev_visible_rows, 
row_object->row);
+   }
+   
+   /* Move, resize, and show/hide the column separators and clips */
+   _etk_tree_columns_render(tree, geometry, last_visible_col);
+   
+   /* Cache the row-objects */
+   _etk_tree_row_objects_cache(tree);
+   
+   /* Create or destroy row objects if the height of the grid has changed */
+   _etk_tree_row_objects_create_destroy(tree, geometry);
+   
+   /* Update the position and the content of the row objects */
+   _etk_tree_row_objects_update(tree, geometry, first_visible_col, 
&prev_visible_rows, &new_visible_rows);
+
+   
+   /* Emit the "row-shown/hidden" signals */
+   while (prev_visible_rows)
+   {
+      etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_HIDDEN_SIGNAL], 
ETK_OBJECT(tree), NULL, prev_visible_rows->data);
+      prev_visible_rows = evas_list_remove_list(prev_visible_rows, 
prev_visible_rows);
+   }
+   while (new_visible_rows)
+   {
+      etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SHOWN_SIGNAL], 
ETK_OBJECT(tree), NULL, new_visible_rows->data);
+      new_visible_rows = evas_list_remove_list(new_visible_rows, 
new_visible_rows);
+   }
+}
+
+/* Recalculates the width and the position of each columns of the tree. Used 
by etk_tree_grid_size_allocate() only */
+static void _etk_tree_columns_geometry_calc(Etk_Tree *tree, int grid_width, 
Etk_Tree_Col **first_visible_col, Etk_Tree_Col **last_visible_col)
+{
+   Etk_Tree_Col *col;
+   Etk_Tree_Col *first_visible;
+   Etk_Tree_Col *last_visible;
+   int num_expand_cols;
+   int columns_width;
+   int freespace;
+   int xoffset;
+   int col_iter;
+   int i;
+   
+   if (!tree)
+      return;
+   
+   first_visible = NULL;
+   last_visible = NULL;
+   columns_width = 0;
+   num_expand_cols = 0;
+   
+   /* Gets the first and the last visible columns */
+   for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
+   {
+      col = tree->columns[col_iter];
+      if (col->visible)
       {
-         col = tree->columns[i];
-         if (col->visible)
-         {
-            if (!first_visible_col || first_visible_col->position > 
col->position)
-               first_visible_col = col;
-            if (!last_visible_col || last_visible_col->position < 
col->position)
-               last_visible_col = col;
-            
-            col->visible_width = col->width;
-            columns_width += col->width;
-            num_visible_cols++;
-            if (col->expand)
-               num_expand_cols++;
-         }
+         if (!first_visible || first_visible->position > col->position)
+            first_visible = col;
+         if (!last_visible || last_visible->position < col->position)
+            last_visible = col;
+         
+         col->visible_width = col->width;
+         columns_width += col->width;
+         
+         if (col->expand)
+            num_expand_cols++;
       }
-      
-      /* At least one column is visible */
-      if (first_visible_col)
+   }
+   
+   /* At least one column is visible */
+   if (first_visible)
+   {
+      /* Calculate the width of the visible columns */
+      freespace = grid_width - columns_width;
+      if (freespace > 0)
       {
-         /* Calculate the width of the visible columns */
-         freespace = geometry.w - columns_width;
-         if (freespace > 0)
+         if (num_expand_cols > 0)
          {
-            if (num_expand_cols > 0)
+            for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
             {
-               for (i = 0; i < tree->num_cols; i++)
+               col = tree->columns[col_iter];
+               if (col->visible && col->expand)
                {
-                  col = tree->columns[i];
-                  if (col->visible && col->expand)
-                  {
-                     col->width += freespace / num_expand_cols;
-                     columns_width += freespace / num_expand_cols;
-                     col->visible_width += freespace / num_expand_cols;
-                  }
+                  col->width += freespace / num_expand_cols;
+                  columns_width += freespace / num_expand_cols;
+                  col->visible_width += freespace / num_expand_cols;
                }
             }
-            last_visible_col->visible_width += (geometry.w - columns_width);
          }
          
-         /* Calculate the horizontal position of the visible columns */
-         xoffset = -tree->scroll_x;
-         for (i = 0; i < tree->num_cols; i++)
+         /* Give the last column the remaining space */
+         last_visible->visible_width += (grid_width - columns_width);
+      }
+      
+      /* Calculate the horizontal position of the visible columns */
+      xoffset = -tree->scroll_x;
+      for (i = 0; i < tree->num_cols; i++)
+      {
+         for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
          {
-            for (j = 0; j < tree->num_cols; j++)
+            col = tree->columns[col_iter];
+            if (col->position == i)
             {
-               col = tree->columns[j];
-               if (col->position == i)
+               if (col->visible)
                {
-                  if (col->visible)
-                  {
-                     col->xoffset = xoffset;
-                     xoffset += col->visible_width;
-                  }
-                  break;
+                  col->xoffset = xoffset;
+                  xoffset += col->visible_width;
                }
+               break;
             }
          }
       }
    }
    
-   /* Move, resize, and show/hide the column separators and clips */
-   for (i = 0; i < tree->num_cols; i++)
+   if (first_visible_col)
+      *first_visible_col = first_visible;
+   if (last_visible_col)
+      *last_visible_col = last_visible;
+}
+
+/* Move, resize, and show/hide the column separators and clips. Used by 
etk_tree_grid_size_allocate() only */
+static void _etk_tree_columns_render(Etk_Tree *tree, Etk_Geometry 
grid_geometry, Etk_Tree_Col *last_visible_col)
+{
+   Etk_Tree_Col *col;
+   int col_iter;
+   
+   for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
    {
-      col = tree->columns[i];
+      col = tree->columns[col_iter];
       
       if (!col->visible)
       {
@@ -2434,18 +2554,18 @@
          int col_x1, col_x2;
          
          col_x1 = ETK_MAX(0, col->xoffset);
-         col_x2 = ETK_MIN(geometry.w, col->xoffset + col->visible_width);
+         col_x2 = ETK_MIN(grid_geometry.w, col->xoffset + col->visible_width);
          
          if (col_x1 <= col_x2)
          {
-            evas_object_move(col->clip, geometry.x + col_x1, geometry.y);
-            evas_object_resize(col->clip, col_x2 - col_x1 + 1, geometry.h);
+            evas_object_move(col->clip, grid_geometry.x + col_x1, 
grid_geometry.y);
+            evas_object_resize(col->clip, col_x2 - col_x1 + 1, 
grid_geometry.h);
             evas_object_show(col->clip);
             
-            if (col_x2 >= 0 && col_x2 < geometry.w && col != last_visible_col)
+            if (col_x2 >= 0 && col_x2 < grid_geometry.w && col != 
last_visible_col && tree->col_separators_visible)
             {
-               evas_object_move(col->separator, geometry.x + col_x2, 
geometry.y);
-               evas_object_resize(col->separator, 1, geometry.h);
+               evas_object_move(col->separator, grid_geometry.x + col_x2, 
grid_geometry.y);
+               evas_object_resize(col->separator, 1, grid_geometry.h);
                evas_object_show(col->separator);
             }
             else
@@ -2458,283 +2578,263 @@
          }
       }
    }
-   if (tree->root.num_children > 0)
-   {
-      evas_object_move(tree->grid_clip, geometry.x, geometry.y);
-      evas_object_resize(tree->grid_clip, geometry.w, geometry.h);
-      evas_object_show(tree->grid_clip);
-   }
-   else
-      evas_object_hide(tree->grid_clip);
-   
-   if (!tree->built)
-      return;
-   
-   /* Remove the rows marked as "deleted" */
-   if (tree->purge_job)
-   {
-      _etk_tree_purge(tree);
-      tree->purge_job = NULL;
-   }
-   
-   /* Save the rows currently rendered so we could emit the "row-shown/hidden" 
signals later */
-   prev_visible_rows = NULL;
-   new_visible_rows = NULL;
-   for (l = tree->row_objects; l; l = l->next)
-   {
-      Etk_Tree_Row_Object *row_object;
-      
-      row_object = l->data;
-      if (row_object->row)
-         prev_visible_rows = evas_list_append(prev_visible_rows, 
row_object->row);
-   }
+}
+
+/* Cache the sub-objects of the visible rows of the tree. Used by 
etk_tree_grid_size_allocate() only */
+static void _etk_tree_row_objects_cache(Etk_Tree *tree)
+{
+   Evas_List *l;
+   Etk_Tree_Col *col;
+   Etk_Tree_Model *model;
+   void *cell_data;
+   int col_iter, model_iter;
    
-   /* Cache the row objects */
-   for (i = 0; i < tree->num_cols; i++)
+   for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
    {
       Etk_Tree_Row_Object *row_object;
       
-      col = tree->columns[i];
-      for (j = 0; j < col->num_models; j++)
+      col = tree->columns[col_iter];
+      for (model_iter = 0; model_iter < col->num_models; model_iter++)
       {
-         if (col->models[j]->objects_cache)
+         model = col->models[model_iter];
+         
+         if (model->objects_cache)
          {
             for (l = tree->row_objects; l; l = l->next)
             {
                row_object = l->data;
+               
                if (row_object->row)
-               {
-                  col->models[j]->objects_cache(col->models[j], 
row_object->row->cells_data[i][j],
-                        row_object->cells[i].objects[j]);
-               }
+                  cell_data = 
row_object->row->cells_data[col_iter][model_iter];
                else
-                  col->models[j]->objects_cache(col->models[j], NULL, 
row_object->cells[i].objects[j]);
+                  cell_data = NULL;
+               
+               model->objects_cache(model, cell_data, 
row_object->cells[col_iter].objects[model_iter]);
             }
          }
       }
    }
+}
+
+/* Create or destroy row-objects if the height of the grid has changed. Used 
by etk_tree_grid_size_allocate() only */
+static void _etk_tree_row_objects_create_destroy(Etk_Tree *tree, Etk_Geometry 
grid_geometry)
+{
+   int num_visible_rows;
+   int current_num_rows;
+   int i;
    
-   /* Create or destroy row objects if the height of the grid has changed */
+   num_visible_rows = (grid_geometry.h / tree->rows_height) + 2;
+   current_num_rows = evas_list_count(tree->row_objects);
+   
+   if (current_num_rows < num_visible_rows)
    {
-      int num_visible_rows;
-      int current_num_rows;
-      
-      num_visible_rows = (geometry.h / tree->rows_height) + 2;
-      current_num_rows = evas_list_count(tree->row_objects);
-      
-      if (current_num_rows < num_visible_rows)
+      /* We add more row objects */
+      for (i = 0; i < (num_visible_rows - current_num_rows); i++)
       {
-         /* We add more row objects */
-         for (i = 0; i < (num_visible_rows - current_num_rows); i++)
-         {
-            Etk_Tree_Row_Object *row_object;
-            
-            if ((row_object = _etk_tree_row_object_create(tree)))
-               tree->row_objects = evas_list_append(tree->row_objects, 
row_object);
-         }
+         Etk_Tree_Row_Object *row_object;
+         
+         if ((row_object = _etk_tree_row_object_create(tree)))
+            tree->row_objects = evas_list_append(tree->row_objects, 
row_object);
       }
-      else if (current_num_rows > num_visible_rows)
+   }
+   else if (current_num_rows > num_visible_rows)
+   {
+      Evas_List *last, *prev;
+
+      /* We destroy the row objects that are no longer needed */
+      last = evas_list_last(tree->row_objects);
+      for (i = 0; i < (current_num_rows - num_visible_rows) && last; i++)
       {
-         Evas_List *last, *prev;
-         
-         /* We destroy the row objects that are no longer needed */
-         last = evas_list_last(tree->row_objects);
-         for (i = 0; i < (current_num_rows - num_visible_rows) && last; i++)
-         {
-            _etk_tree_row_object_destroy(tree, last->data);
-            prev = last->prev;
-            tree->row_objects = evas_list_remove_list(tree->row_objects, last);
-            last = prev;
-         }
+         _etk_tree_row_object_destroy(tree, last->data);
+         prev = last->prev;
+         tree->row_objects = evas_list_remove_list(tree->row_objects, last);
+         last = prev;
       }
    }
+}
+
+/* Update the position and the content of the row objects. Used by 
etk_tree_grid_size_allocate() only */
+static void _etk_tree_row_objects_update(Etk_Tree *tree, Etk_Geometry 
grid_geometry, Etk_Tree_Col *first_visible_col, Evas_List **prev_visible_rows, 
Evas_List **new_visible_rows)
+{
+   Evas *evas;
+   Evas_Object *obj;
+   Evas_List *l, *l2;
+   Etk_Tree_Col *col;
+   Etk_Tree_Row *row;
+   Etk_Tree_Row_Object *row_object;
+   Etk_Geometry cell_geometry, model_geometry;
+   Etk_Bool show_expanders;
+   Etk_Bool objects_created;
+   int expander_w, expander_h;
+   int x, y;
+   int total_width, w;
+   int row_id;
+   int row_y;
+   int depth;
+   int col_iter, model_iter;
+   int i;
    
-   /* Update the position and the content of the row objects */
+   if (!tree || !first_visible_col || !new_visible_rows || !prev_visible_rows)
+      return;
+   if (!(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(tree))))
+      return;
+   
+   depth = 0;
+   row_id = tree->scroll_y / tree->rows_height;
+   row_y = -(tree->scroll_y % tree->rows_height);
+   for (row = tree->root.first_child, i = 0; i < row_id && row; i++)
+      row = _etk_tree_row_next_to_render_get(row, &depth);
+   show_expanders = (tree->total_rows > tree->root.num_children && 
first_visible_col);
+   
+   for (l = tree->row_objects; l; l = l->next)
    {
-      Etk_Tree_Row *row;
-      Etk_Tree_Row_Object *row_object;
-      Etk_Geometry cell_geometry, model_geometry;
-      Etk_Bool show_expanders;
-      Etk_Bool objects_created;
-      Evas_List *l2;
-      int expander_w, expander_h;
-      int x, y;
-      int total_width, w;
-      int row_id;
-      int row_y;
-      int depth;
-      
-      depth = 0;
-      row_id = tree->scroll_y / tree->rows_height;
-      row_y = -(tree->scroll_y % tree->rows_height);
-      for (row = tree->root.first_child, i = 0; i < row_id && row; i++)
-         row = _etk_tree_row_next_to_render_get(row, &depth);
-      show_expanders = (tree->total_rows > tree->root.num_children && 
first_visible_col);
-      
-      for (l = tree->row_objects; l; l = l->next)
-      {
-         row_object = l->data;
-         
-         if (row)
-         {
-            /* If there is still a row to render, we render the content of the 
row */
-            evas_object_move(row_object->background, geometry.x, geometry.y + 
row_y);
-            evas_object_resize(row_object->background, geometry.w, 
tree->rows_height);
-            evas_object_show(row_object->background);
-            
-            if ((l2 = evas_list_find_list(prev_visible_rows, row)))
-               prev_visible_rows = evas_list_remove_list(prev_visible_rows, 
l2);
-            else
-               new_visible_rows = evas_list_append(new_visible_rows, row);
-            
-            if (show_expanders && row->num_children > 0)
-            {
-               edje_object_signal_emit(row_object->expander,
-                     row->unfolded ? "etk,action,unfold" : "etk,action,fold", 
"etk");
-               edje_object_message_signal_process(row_object->expander);
-               evas_object_show(row_object->expander);
-            }
-            else
-               evas_object_hide(row_object->expander);
-            
-            /* Render the sub-objects of the row's cells */
-            for (i = 0; i < tree->num_cols; i++)
+      row_object = l->data;
+      
+      if (row)
+      {
+         /* If there is still a row to render, we render the content of the 
row */
+         evas_object_move(row_object->background, grid_geometry.x, 
grid_geometry.y + row_y);
+         evas_object_resize(row_object->background, grid_geometry.w, 
tree->rows_height);
+         evas_object_show(row_object->background);
+         
+         if ((l2 = evas_list_find_list(*prev_visible_rows, row)))
+            *prev_visible_rows = evas_list_remove_list(*prev_visible_rows, l2);
+         else
+            *new_visible_rows = evas_list_append(*new_visible_rows, row);
+         
+         /* Show the expander if needed */
+         if (show_expanders && row->num_children > 0)
+         {
+            edje_object_signal_emit(row_object->expander,
+                  row->unfolded ? "etk,action,unfold" : "etk,action,fold", 
"etk");
+            edje_object_message_signal_process(row_object->expander);
+            evas_object_show(row_object->expander);
+         }
+         else
+            evas_object_hide(row_object->expander);
+         
+         /* Render the sub-objects of the row's cells */
+         for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
+         {
+            col = tree->columns[col_iter];
+            if (col->visible)
             {
-               col = tree->columns[i];
-               if (col->visible)
+               cell_geometry.x = grid_geometry.x + col->xoffset + 
CELL_HMARGINS;
+               cell_geometry.y = grid_geometry.y + row_y + CELL_VMARGINS;
+               cell_geometry.w = col->visible_width - (2 * CELL_HMARGINS);
+               cell_geometry.h = tree->rows_height - (2 * CELL_VMARGINS);
+               
+               /* Render the expander of the row */
+               if (col == first_visible_col && show_expanders)
                {
-                  cell_geometry.x = geometry.x + col->xoffset + CELL_HMARGINS;
-                  cell_geometry.y = geometry.y + row_y + CELL_VMARGINS;
-                  cell_geometry.w = col->visible_width - (2 * CELL_HMARGINS);
-                  cell_geometry.h = tree->rows_height - (2 * CELL_VMARGINS);
-                  
-                  /* Render the expander of the row */
-                  if (col == first_visible_col && show_expanders)
+                  edje_object_size_min_get(row_object->expander, &expander_w, 
&expander_h);
+                  if (row->num_children > 0)
                   {
-                     edje_object_size_min_get(row_object->expander, 
&expander_w, &expander_h);
-                     if (row->num_children > 0)
-                     {
-                        evas_object_move(row_object->expander,
-                              cell_geometry.x + (depth * expander_w), 
cell_geometry.y);
-                        evas_object_resize(row_object->expander, expander_w, 
expander_h);
-                     }
-                     cell_geometry.x += ((depth + 1) * expander_w) + 
CELL_HMARGINS;
-                     cell_geometry.w -= ((depth + 1) * expander_w) + 
CELL_HMARGINS;
+                     evas_object_move(row_object->expander,
+                           cell_geometry.x + (depth * expander_w), 
cell_geometry.y);
+                     evas_object_resize(row_object->expander, expander_w, 
expander_h);
                   }
-                  
-                  /* Render the sub-objects of the cell */
-                  total_width = 0;
-                  model_geometry = cell_geometry;
-                  for (j = 0; j < col->num_models; j++)
+                  cell_geometry.x += ((depth + 1) * expander_w) + 
CELL_HMARGINS;
+                  cell_geometry.w -= ((depth + 1) * expander_w) + 
CELL_HMARGINS;
+               }
+               
+               /* Render the sub-objects of the cell */
+               total_width = 0;
+               model_geometry = cell_geometry;
+               for (model_iter = 0; model_iter < col->num_models; model_iter++)
+               {
+                  if (col->models[model_iter]->render)
                   {
-                     if (col->models[j]->render)
+                     objects_created = 
col->models[model_iter]->render(col->models[model_iter], row, model_geometry,
+                           row->cells_data[col_iter][model_iter], 
row_object->cells[col_iter].objects[model_iter], evas);
+                     
+                     /* Objects have been created by the render() method, we 
add them to the tree */
+                     if (objects_created)
                      {
-                        objects_created = 
col->models[j]->render(col->models[j], row, model_geometry,
-                              row->cells_data[i][j], 
row_object->cells[i].objects[j], evas);
-                        
-                        /* Objects have been created by the render() method, 
we add them to the tree */
-                        if (objects_created)
+                        for (i = 0; i < ETK_TREE_MAX_OBJECTS_PER_MODEL; i++)
                         {
-                           for (k = 0; k < ETK_TREE_MAX_OBJECTS_PER_MODEL; k++)
+                           if ((obj = 
row_object->cells[col_iter].objects[model_iter][i])
+                                 && !evas_object_smart_parent_get(obj))
                            {
-                              if (row_object->cells[i].objects[j][k]
-                                    && 
!evas_object_smart_parent_get(row_object->cells[i].objects[j][k]))
-                              {
-                                 
evas_object_clip_set(row_object->cells[i].objects[j][k], col->clip);
-                                 etk_widget_member_object_add(tree->grid, 
row_object->cells[i].objects[j][k]);
-                              }
+                              evas_object_clip_set(obj, col->clip);
+                              etk_widget_member_object_add(tree->grid, obj);
                            }
                         }
-                        
-                        if (col->models[j]->width_get)
-                        {
-                           w = col->models[j]->width_get(col->models[j],
-                                 row->cells_data[i][j], 
row_object->cells[i].objects[j]);
-                        }
-                        else
-                           w = 0;
-                        
-                        if ((j + 1) != col->num_models && w > 0)
-                           w += MODEL_INTERSPACE;
-                        
-                        model_geometry.x += w;
-                        model_geometry.w -= w;
-                        total_width += w;
                      }
-                  }
-                  
-                  /* Align the cell objects */
-                  if (col->align != 0.0)
-                  {
-                     for (j = 0; j < col->num_models; j++)
+                     
+                     if (col->models[model_iter]->width_get)
                      {
-                        for (k = 0; k < ETK_TREE_MAX_OBJECTS_PER_MODEL; k++)
-                        {
-                           if (row_object->cells[i].objects[j][k])
-                           {
-                              
evas_object_geometry_get(row_object->cells[i].objects[j][k], &x, &y, NULL, 
NULL);
-                              
evas_object_move(row_object->cells[i].objects[j][k],
-                                    x + (col->align * (cell_geometry.w - 
total_width)), y);
-                           }
-                        }
+                        w = 
col->models[model_iter]->width_get(col->models[model_iter],
+                              row->cells_data[col_iter][model_iter], 
row_object->cells[col_iter].objects[model_iter]);
                      }
+                     else
+                        w = 0;
+                     
+                     if ((model_iter + 1) != col->num_models && w > 0)
+                        w += MODEL_INTERSPACE;
+                     
+                     model_geometry.x += w;
+                     model_geometry.w -= w;
+                     total_width += w;
                   }
                }
-               else
+               
+               /* Align the cell objects */
+               if (col->align != 0.0)
                {
-                  for (j = 0; j < col->num_models; j++)
+                  for (model_iter = 0; model_iter < col->num_models; 
model_iter++)
                   {
-                     for (k = 0; k < ETK_TREE_MAX_OBJECTS_PER_MODEL; k++)
+                     for (i = 0; i < ETK_TREE_MAX_OBJECTS_PER_MODEL; i++)
                      {
-                        if (row_object->cells[i].objects[j][k])
-                           
evas_object_hide(row_object->cells[i].objects[j][k]);
+                        if ((obj = 
row_object->cells[col_iter].objects[model_iter][i]))
+                        {
+                           evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+                           evas_object_move(obj, x + (col->align * 
(cell_geometry.w - total_width)), y);
+                        }
                      }
                   }
                }
             }
-            
-            _etk_tree_row_signal_emit(row, row_object, (row_id % 2 == 0) ? 
"etk,state,odd" : "etk,state,even");
-            _etk_tree_row_signal_emit(row, row_object, row->selected ? 
"etk,state,selected" : "etk,state,unselected");
-            edje_object_message_signal_process(row_object->background);
-            
-            evas_object_lower(row_object->background);
-            row_object->row = row;
+            /* If the column is not visible, we hide the corresponding 
row-objects */
+            else
+            {
+               for (model_iter = 0; model_iter < col->num_models; model_iter++)
+               {
+                  for (i = 0; i < ETK_TREE_MAX_OBJECTS_PER_MODEL; i++)
+                     
evas_object_hide(row_object->cells[col_iter].objects[model_iter][i]);
+               }
+            }
          }
-         else
+         
+         _etk_tree_row_signal_emit(row, row_object, (row_id % 2 == 0) ? 
"etk,state,odd" : "etk,state,even");
+         _etk_tree_row_signal_emit(row, row_object, row->selected ? 
"etk,state,selected" : "etk,state,unselected");
+         edje_object_message_signal_process(row_object->background);
+         
+         evas_object_lower(row_object->background);
+         row_object->row = row;
+      }
+      else
+      {
+         /* If there is no more row to render, we hide the row objects */
+         for (col_iter = 0; col_iter < tree->num_cols; col_iter++)
          {
-            /* If there is no more row to render, we hide the row objects */
-            for (i = 0; i < tree->num_cols; i++)
+            for (model_iter = 0; model_iter < 
tree->columns[col_iter]->num_models; model_iter++)
             {
-               for (j = 0; j < tree->columns[i]->num_models; j++)
+               for (i = 0; i < ETK_TREE_MAX_OBJECTS_PER_MODEL; i++)
                {
-                  for (k = 0; k < ETK_TREE_MAX_OBJECTS_PER_MODEL; k++)
-                  {
-                     if (row_object->cells[i].objects[j][k])
-                        evas_object_hide(row_object->cells[i].objects[j][k]);
-                  }
+                  if (row_object->cells[col_iter].objects[model_iter][i])
+                     
evas_object_hide(row_object->cells[col_iter].objects[model_iter][i]);
                }
             }
-            evas_object_hide(row_object->expander);
-            evas_object_hide(row_object->background);
-            row_object->row = NULL;
          }
-         
-         row = _etk_tree_row_next_to_render_get(row, &depth);
-         row_y += tree->rows_height;
-         row_id++;
+         evas_object_hide(row_object->expander);
+         evas_object_hide(row_object->background);
+         row_object->row = NULL;
       }
-   }
-   
-   /* Emit the "row-shown/hidden" signals */
-   while (prev_visible_rows)
-   {
-      etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_HIDDEN_SIGNAL], 
ETK_OBJECT(tree), NULL, prev_visible_rows->data);
-      prev_visible_rows = evas_list_remove_list(prev_visible_rows, 
prev_visible_rows);
-   }
-   while (new_visible_rows)
-   {
-      etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SHOWN_SIGNAL], 
ETK_OBJECT(tree), NULL, new_visible_rows->data);
-      new_visible_rows = evas_list_remove_list(new_visible_rows, 
new_visible_rows);
+      
+      row = _etk_tree_row_next_to_render_get(row, &depth);
+      row_y += tree->rows_height;
+      row_id++;
    }
 }
 
@@ -2762,18 +2862,18 @@
    /* Read the data from the theme */
    if (etk_widget_theme_data_get(ETK_WIDGET(tree), "tree_contains_headers", 
"%d", &tree_contains_headers) != 1)
       tree_contains_headers = 1;
-   if (etk_widget_theme_data_get(ETK_WIDGET(tree), "separator_color", "%d %d 
%d %d", &tree->separator_color.r,
-      &tree->separator_color.g, &tree->separator_color.b, 
&tree->separator_color.a) != 4)
+   if (etk_widget_theme_data_get(ETK_WIDGET(tree), "separator_color", "%d %d 
%d %d", &tree->col_separator_color.r,
+      &tree->col_separator_color.g, &tree->col_separator_color.b, 
&tree->col_separator_color.a) != 4)
    {
-      tree->separator_color.r = 0;
-      tree->separator_color.g = 0;
-      tree->separator_color.b = 0;
-      tree->separator_color.a = 0;
+      tree->col_separator_color.r = 0;
+      tree->col_separator_color.g = 0;
+      tree->col_separator_color.b = 0;
+      tree->col_separator_color.a = 0;
    }
    else
    {
-      evas_color_argb_premul(tree->separator_color.a, &tree->separator_color.r,
-            &tree->separator_color.g, &tree->separator_color.b);
+      evas_color_argb_premul(tree->col_separator_color.a, 
&tree->col_separator_color.r,
+            &tree->col_separator_color.g, &tree->col_separator_color.b);
    }
    /* if rows_height is not set */
    if (tree->rows_height == -1)
@@ -3316,8 +3416,8 @@
    etk_widget_member_object_add(tree->grid, col->clip);
 
    col->separator = evas_object_rectangle_add(evas);
-   evas_object_color_set(col->separator, tree->separator_color.r,
-         tree->separator_color.g, tree->separator_color.b, 
tree->separator_color.a);
+   evas_object_color_set(col->separator, tree->col_separator_color.r,
+         tree->col_separator_color.g, tree->col_separator_color.b, 
tree->col_separator_color.a);
    evas_object_pass_events_set(col->separator, 1);
    evas_object_clip_set(col->separator, col->clip);
    etk_widget_member_object_add(tree->grid, col->separator);
@@ -3865,6 +3965,11 @@
  * @prop_val ETK_TRUE
  * \par
  * @prop_name "headers-visible": Whether or not the headers of the columns are 
visible
+ * @prop_type Boolean
+ * @prop_rw
+ * @prop_val ETK_TRUE
+ * \par
+ * @prop_name "column-separators-visible": Whether or not the columns are 
separated by a visible vertical separator
  * @prop_type Boolean
  * @prop_rw
  * @prop_val ETK_TRUE
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_tree.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -3 -r1.37 -r1.38
--- etk_tree.h  27 Jul 2007 16:24:14 -0000      1.37
+++ etk_tree.h  21 Aug 2007 13:46:24 -0000      1.38
@@ -124,6 +124,8 @@
    int num_cols;
    Etk_Tree_Col **columns;
    Etk_Bool headers_visible;
+   Etk_Bool col_separators_visible;
+   Etk_Color col_separator_color;
    
    Etk_Tree_Col *col_to_resize;
    Etk_Bool col_resize_pointer_set;
@@ -143,7 +145,6 @@
    int scroll_y;
    
    Ecore_Job *purge_job;
-   Etk_Color separator_color;
    Etk_Bool tree_contains_headers;
    Etk_Tree_Mode mode;
    Etk_Bool multiple_select;
@@ -162,6 +163,8 @@
 Etk_Bool       etk_tree_multiple_select_get(Etk_Tree *tree);
 void           etk_tree_headers_visible_set(Etk_Tree *tree, Etk_Bool 
headers_visible);
 Etk_Bool       etk_tree_headers_visible_get(Etk_Tree *tree);
+void           etk_tree_column_separators_visible_set(Etk_Tree *tree, Etk_Bool 
col_separators_visible);
+Etk_Bool       etk_tree_column_separators_visible_get(Etk_Tree *tree);
 void           etk_tree_rows_height_set(Etk_Tree *tree, int rows_height);
 int            etk_tree_rows_height_get(Etk_Tree *tree);
 



-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to