Enlightenment CVS committal

Author  : moom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_tree2.c etk_tree2.h 


Log Message:
* [Tree2] Add etk_tree2_row_scroll_to() and keyboard navigation


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_tree2.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- etk_tree2.c 6 Jan 2007 19:23:09 -0000       1.13
+++ etk_tree2.c 6 Jan 2007 20:24:43 -0000       1.14
@@ -411,19 +411,6 @@
 }
 
 /**
- * @brief Gets the scrolled view of the tree.
- * It can be used to change the scrollbars' policy, or to get the scroll-value
- * @param tree a tree
- * @return Returns the scrolled view of the tree
- */
-Etk_Scrolled_View *etk_tree2_scrolled_view_get(Etk_Tree2 *tree)
-{
-   if (!tree)
-      return NULL;
-   return ETK_SCROLLED_VIEW(tree->scrolled_view);
-}
-
-/**
  * @brief Inserts a new column into a tree
  * @param tree a tree
  * @param title the tile of the column
@@ -1505,6 +1492,62 @@
    return row->tree;
 }
 
+/**
+ * @brief Gets the scrolled view of the tree.
+ * It can be used to change the scrollbars' policy, or to get the scroll-value
+ * @param tree a tree
+ * @return Returns the scrolled view of the tree
+ */
+Etk_Scrolled_View *etk_tree2_scrolled_view_get(Etk_Tree2 *tree)
+{
+   if (!tree)
+      return NULL;
+   return ETK_SCROLLED_VIEW(tree->scrolled_view);
+}
+
+/**
+ * @brief Scrolls to the given row of the tree, in order to make it visible
+ * @param row the row to scroll to
+ * @param center whether or not the row should be centered in the view
+ */
+void etk_tree2_row_scroll_to(Etk_Tree2_Row *row, Etk_Bool center)
+{
+   Etk_Tree2 *tree;
+   Etk_Tree2_Row *r;
+   int i;
+   
+   if (!row || !(tree = row->tree))
+      return;
+   
+   for (r = etk_tree2_first_row_get(tree), i = 0; r; r = 
etk_tree2_row_walk_next(r, ETK_FALSE), i++)
+   {
+      if (r == row)
+      {
+         int row_offset, new_offset;
+         int tree_height;
+         
+         row_offset = i * tree->rows_height;
+         etk_widget_inner_geometry_get(tree->grid, NULL, NULL, NULL, 
&tree_height);
+         
+         /* If the row is already entirely visible and the row should not be 
centered, we do nothing */
+         if (center || (row_offset < tree->scroll_y)
+            || ((row_offset + tree->rows_height) > (tree->scroll_y + 
tree_height)))
+         {
+            if (center)
+               new_offset = row_offset + (tree->rows_height - tree_height) / 2;
+            else if (row_offset < tree->scroll_y)
+               new_offset = row_offset;
+            else
+               new_offset = row_offset - tree_height + tree->rows_height;
+            
+            
etk_range_value_set(etk_scrolled_view_vscrollbar_get(ETK_SCROLLED_VIEW(tree->scrolled_view)),
 new_offset);
+         }
+         
+         return;
+      }
+   }
+}
+
 /**************************
  *
  * Etk specific functions
@@ -2513,21 +2556,58 @@
 static void _etk_tree2_key_down_cb(Etk_Object *object, Etk_Event_Key_Down 
*event, void *data)
 {
    Etk_Tree2 *tree;
+   Etk_Tree2_Row *selected_row, *row_to_select;
    
    if (!(tree = ETK_TREE2(object)))
       return;
    
-   if (event->modifiers == ETK_MODIFIER_NONE)
+   /* CTRL + A: Select all the rows */
+   if (strcmp(event->keyname, "a") == 0 && (event->modifiers & 
ETK_MODIFIER_CTRL))
    {
+      etk_tree2_select_all(tree);
+      etk_signal_stop();
    }
-   else if (event->modifiers & ETK_MODIFIER_CTRL)
+   /* Up arrow: Select the previous row */
+   else if (strcmp(event->keyname, "Up") == 0)
    {
-      /* CTRL + A: Select all the rows */
-      if (strcmp(event->keyname, "a") == 0)
+      if (!(selected_row = etk_tree2_selected_row_get(tree))
+         || !(row_to_select = etk_tree2_row_walk_prev(selected_row, 
ETK_FALSE)))
       {
-         etk_tree2_select_all(tree);
-         etk_signal_stop();
+         row_to_select = etk_tree2_last_row_get(tree);
+         while (!etk_tree2_row_is_folded(row_to_select) && 
etk_tree2_row_last_child_get(row_to_select))
+            row_to_select = etk_tree2_row_last_child_get(row_to_select);
       }
+      
+      _etk_tree2_row_select(tree, row_to_select, event->modifiers);
+      etk_tree2_row_scroll_to(row_to_select, ETK_FALSE);
+      etk_signal_stop();
+   }
+   /* Down arrow: Select the next row */
+   else if (strcmp(event->keyname, "Down") == 0)
+   {
+      if (!(selected_row = etk_tree2_selected_row_get(tree))
+         || !(row_to_select = etk_tree2_row_walk_next(selected_row, 
ETK_FALSE)))
+      {
+         row_to_select = etk_tree2_first_row_get(tree);
+      }
+      
+      _etk_tree2_row_select(tree, row_to_select, event->modifiers);
+      etk_tree2_row_scroll_to(row_to_select, ETK_FALSE);
+      etk_signal_stop();
+   }
+   /* Left arrow: Fold the selected row */
+   else if (strcmp(event->keyname, "Left") == 0)
+   {
+      if ((selected_row = etk_tree2_selected_row_get(tree)))
+         etk_tree2_row_fold(selected_row);
+      etk_signal_stop();
+   }
+   /* Right arrow: Unfold the selected row */
+   else if (strcmp(event->keyname, "Right") == 0)
+   {
+      if ((selected_row = etk_tree2_selected_row_get(tree)))
+         etk_tree2_row_unfold(selected_row);
+      etk_signal_stop();
    }
 }
 
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_tree2.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- etk_tree2.h 6 Jan 2007 19:23:10 -0000       1.10
+++ etk_tree2.h 6 Jan 2007 20:24:43 -0000       1.11
@@ -165,8 +165,6 @@
 void etk_tree2_freeze(Etk_Tree2 *tree);
 void etk_tree2_thaw(Etk_Tree2 *tree);
 
-Etk_Scrolled_View *etk_tree2_scrolled_view_get(Etk_Tree2 *tree);
-
 Etk_Tree2_Col *etk_tree2_col_new(Etk_Tree2 *tree, const char *title, int 
width, float alignment);
 int            etk_tree2_num_cols_get(Etk_Tree2 *tree);
 Etk_Tree2_Col *etk_tree2_nth_col_get(Etk_Tree2 *tree, int nth);
@@ -232,6 +230,9 @@
 Etk_Tree2_Row *etk_tree2_row_walk_prev(Etk_Tree2_Row *row, Etk_Bool 
include_folded);
 Etk_Tree2_Row *etk_tree2_row_walk_next(Etk_Tree2_Row *row, Etk_Bool 
include_folded);
 Etk_Tree2     *etk_tree2_row_tree_get(Etk_Tree2_Row *row);
+
+Etk_Scrolled_View *etk_tree2_scrolled_view_get(Etk_Tree2 *tree);
+void               etk_tree2_row_scroll_to(Etk_Tree2_Row *row, Etk_Bool 
center);
 
 /** @} */
 



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