[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[E-devel] e_menu Patch



Attached is a patch to tidy up some FIXME's in e_menu.c. It simplifies
the previous and next item handling with a simple bit of additional
tracking.

It also makes way for keyboard navigation of the menu using first
character of the label which I will send in a separate email.

Review, comment, send to /dev/null, commit. Whatever.

Thanks,

metrics
Index: src/bin/e_menu.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_menu.c,v
retrieving revision 1.68
diff -u -r1.68 e_menu.c
--- src/bin/e_menu.c	9 Sep 2006 07:00:14 -0000	1.68
+++ src/bin/e_menu.c	27 Sep 2006 04:14:31 -0000
@@ -60,6 +60,7 @@
 static void _e_menu_activate_nth                  (int n);
 static E_Menu *_e_menu_active_get                 (void);
 static E_Menu_Item *_e_menu_item_active_get       (void);
+static Evas_List * _e_menu_list_item_active_get   (void);
 static int  _e_menu_outside_bounds_get            (int xdir, int ydir);
 static void _e_menu_scroll_by                     (int dx, int dy);
 static void _e_menu_mouse_autoscroll_check        (void);
@@ -521,6 +522,7 @@
    mi = E_OBJECT_ALLOC(E_Menu_Item, E_MENU_ITEM_TYPE, _e_menu_item_free);
    mi->menu = m;
    mi->menu->items = evas_list_append(mi->menu->items, mi);
+   mi->list_position = evas_list_last(mi->menu->items);
    return mi;
 }
 
@@ -1926,118 +1928,68 @@
 static void
 _e_menu_item_activate_next(void)
 {
-   E_Menu *m;
+   E_Menu_Item *mi;
+   Evas_List *ll;
 
-   /* FIXME: inefficient. should track active item */
-   m = _e_menu_active_get();
-   if (m)
+   ll = _e_menu_list_item_active_get();
+   mi = _e_menu_item_active_get();
+   if (ll && mi) 
      {
-	Evas_List *ll;
-	
-	for (ll = m->items; ll; ll = ll->next)
-	  {
-	     E_Menu_Item *mi;
-	     
+	/* Look at the next item and then cycle until we're not on
+	 * a separator. */
+	if (!(ll->next)) 
+	  ll = mi->menu->items;
+	else
+	   ll = ll->next;
+	mi = ll->data;
+	while (mi->separator)
+	  { 
+	     if (!(ll->next)) 
+	       ll = mi->menu->items;
+	     else
+	       ll = ll->next;
 	     mi = ll->data;
-	     if (mi->active) 
-	       {
-		  if (ll->next)
-		    {
-		       ll = ll->next;
-		       mi = ll->data;
-		       while ((mi->separator) && (ll->next))
-			 {
-			    ll = ll->next;
-			    mi = ll->data;
-			 }
-		       if ((mi->separator) && (!ll->next))
-			 {
-			    ll = m->items;
-			    mi = ll->data;
-			    while ((mi->separator) && (ll->next))
-			      {
-				 ll = ll->next;
-				 mi = ll->data;
-			      }
-			 }
-		       e_menu_item_active_set(mi, 1);
-		       _e_menu_item_ensure_onscreen(mi);
-		    }
-		  else
-		    {
-		       ll = m->items;
-		       mi = ll->data;
-		       while ((mi->separator) && (ll->next))
-			 {
-			    ll = ll->next;
-			    mi = ll->data;
-			 }
-		       e_menu_item_active_set(mi, 1);
-		       _e_menu_item_ensure_onscreen(mi);
-		    }
-		  return;
-	       }
 	  }
+
+	e_menu_item_active_set(mi, 1);
+	_e_menu_item_ensure_onscreen(mi);
+	return;
      }
+
    _e_menu_activate_first();
 }
 
 static void
 _e_menu_item_activate_previous(void)
 {
-   E_Menu *m;
+   E_Menu_Item *mi;
+   Evas_List *ll;
 
-   /* FIXME: inefficient. should track active item */
-   m = _e_menu_active_get();
-   if (m)
+   ll = _e_menu_list_item_active_get();
+   mi = _e_menu_item_active_get();
+   if (ll && mi) 
      {
-	Evas_List *ll;
-	
-	for (ll = m->items; ll; ll = ll->next)
-	  {
-	     E_Menu_Item *mi;
-	     
+	/* Look at the prev item and then cycle until we're not on
+	 * a separator. */
+	if (!(ll->prev)) 
+	  ll = evas_list_last(ll);
+	else
+	   ll = ll->prev;
+	mi = ll->data;
+	while (mi->separator)
+	  { 
+	     if (!(ll->prev)) 
+	       ll = evas_list_last(ll);
+	     else
+	       ll = ll->prev;
 	     mi = ll->data;
-	     if (mi->active) 
-	       {
-		  if (ll->prev)
-		    {
-		       ll = ll->prev;
-		       mi = ll->data;
-		       while ((mi->separator) && (ll->prev))
-			 {
-			    ll = ll->prev;
-			    mi = ll->data;
-			 }
-		       if ((mi->separator) && (!ll->prev))
-			 {
-			    ll = m->items;
-			    mi = ll->data;
-			    while ((mi->separator) && (ll->prev))
-			      {
-				 ll = ll->prev;
-				 mi = ll->data;
-			      }
-			 }
-		       e_menu_item_active_set(mi, 1);
-		       _e_menu_item_ensure_onscreen(mi);
-		    }
-		  else
-		    {
-		       ll = evas_list_last(m->items);
-		       mi = ll->data;
-		       while ((mi->separator) && (ll->prev))
-			 {
-			    ll = ll->prev;
-			    mi = ll->data;
-			 }
-		       e_menu_item_active_set(mi, 1);
-		       _e_menu_item_ensure_onscreen(mi);
-		    }
-		  return;
-	       }
 	  }
+
+	e_menu_item_active_set(mi, 1);
+	_e_menu_item_ensure_onscreen(mi);
+	return;
      }
+
    _e_menu_activate_first();
 }
 
@@ -2246,6 +2198,15 @@
    return _e_active_menu_item;
 }
 
+static Evas_List * 
+_e_menu_list_item_active_get(void)
+{
+   if (_e_active_menu_item)
+      return _e_active_menu_item->list_position;
+   else
+     return NULL;
+}
+
 static int
 _e_menu_outside_bounds_get(int xdir, int ydir)
 {
Index: src/bin/e_menu.h
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/bin/e_menu.h,v
retrieving revision 1.24
diff -u -r1.24 e_menu.h
--- src/bin/e_menu.h	3 Sep 2006 11:32:13 -0000	1.24
+++ src/bin/e_menu.h	27 Sep 2006 04:14:32 -0000
@@ -102,6 +102,8 @@
    Evas_Object   *event_object;
 
    E_App         *app;  /* For when this item is used for an app.  Experimental, if this makes it into cvs, kill onefang. */
+
+   Evas_List	 *list_position;
    
    int            label_w, label_h;
    int            icon_w, icon_h;