Author: fabien
Date: 2007-04-05 05:37:50 -0400 (Thu, 05 Apr 2007)
New Revision: 5758
Log:
Fixed several behavior bugs found when analysing STR#1648
and realized 1648 RFE
Now forward and backward menus work much better
and code is not as loose as before
(i.e: normalized backward and forward in a more general 'move' operation.
Not a wonder that we had so many trouble with menus
when reviewing the code.



Added:
   branches/fctrunk/README.STR
Modified:
   branches/fctrunk/fluid/fluid.cxx
   branches/fctrunk/src/Menu_popup.cxx

Added: branches/fctrunk/README.STR
===================================================================
--- branches/fctrunk/README.STR                         (rev 0)
+++ branches/fctrunk/README.STR 2007-04-05 09:37:50 UTC (rev 5758)
@@ -0,0 +1,2 @@
+str adressed or about to be adressed:
+STR#1648

Modified: branches/fctrunk/fluid/fluid.cxx
===================================================================
--- branches/fctrunk/fluid/fluid.cxx    2007-04-04 16:34:45 UTC (rev 5757)
+++ branches/fctrunk/fluid/fluid.cxx    2007-04-05 09:37:50 UTC (rev 5758)
@@ -279,7 +279,7 @@
        
     img = fltk::SharedImage::get(pngfile);
        if (img) {
-               img->fetch_if_needed(); // fetch in memory 
+               img->fetch_if_needed(); // fetch in memory, will also 
initialize w,h 
                template_preview->image(img);
                template_preview->redraw();
        }

Modified: branches/fctrunk/src/Menu_popup.cxx
===================================================================
--- branches/fctrunk/src/Menu_popup.cxx 2007-04-04 16:34:45 UTC (rev 5757)
+++ branches/fctrunk/src/Menu_popup.cxx 2007-04-05 09:37:50 UTC (rev 5758)
@@ -666,25 +666,30 @@
   return true;
 }
 
-static bool forward(MenuState& p, int menu) {
+static bool forward0(MenuState& p, int menu) {
   // go to next item in menu menu if possible
   MWindow &m = *(p.menus[menu]);
-  for (int item = p.indexes[menu]+1; item < m.children; item++) {
+  if (!m.children) return false; // empty submenu
+  for (int item = (p.indexes[menu]+1) % m.children; item < m.children; item++) 
{
     Widget* widget = m.get_widget(item);
     if (widget->takesevents()) return setitem(p, menu, item);
   }
   return false;
 }
 
-static bool backward(MenuState& p, int menu) {
+static bool move(MenuState& p, int menu,int delta) {
+  MWindow &m = *(p.menus[menu]);
+  if (!m.children) return false; // empty submenu
+  int  nc = m.children;
   // previous item in menu menu if possible
-  MWindow &m = *(p.menus[menu]);
-  for (int item = p.indexes[menu]-1; item >= 0; item--) {
+  for (int item = (p.indexes[menu]+nc+delta) % nc; item !=p.indexes[menu]; 
item=(item+nc+delta)%nc) {
     Widget* widget = m.get_widget(item);
-    if (widget->takesevents()) return setitem(p, menu, item);
+    if (widget->takesevents() ) return setitem(p, menu, item);
   }
   return false;
 }
+static bool backward(MenuState& p, int menu) {return move(p, menu, -1);}
+static bool forward(MenuState& p, int menu) { return move(p, menu, +1);}
 
 static bool track_mouse;
 
@@ -705,13 +710,16 @@
       }
       return 1;
     case UpKey:
-      if (p.hmenubar && p.level == 0) ;
-      else if (backward(p, p.level));
-      else if (p.hmenubar) setitem(p, 0, p.indexes[0]);
+      if (p.hmenubar && p.level == 0)  
+               if (forward(p, p.level+1) && //enter the submenu first
+                       p.hmenubar) 
+                 backward(p,p.level);
       return 1;
     case DownKey:
-      if (p.level || !p.hmenubar) forward(p, p.level);
-      else if (p.level+1 < p.nummenus) forward(p, p.level+1);
+      if (p.level || !p.hmenubar) 
+                 forward(p, p.level);
+      else if (p.level+1 < p.nummenus) 
+                 forward(p, p.level+1);
       return 1;
     case RightKey:
       if (p.hmenubar && (p.level<=0 || p.level==1 && p.nummenus==2))

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to