Author: sanel.z
Date: 2007-06-05 11:56:31 -0400 (Tue, 05 Jun 2007)
New Revision: 5872
Log:
Allow sliders in the menu to be movable


Modified:
   trunk/fltk/Widget.h
   trunk/src/Menu_popup.cxx
   trunk/src/Valuator.cxx

Modified: trunk/fltk/Widget.h
===================================================================
--- trunk/fltk/Widget.h 2007-06-05 15:10:41 UTC (rev 5871)
+++ trunk/fltk/Widget.h 2007-06-05 15:56:31 UTC (rev 5872)
@@ -72,10 +72,11 @@
     // Values for type() shared by Button and menu Item, and for fake RTTI:
     NORMAL = 0,
     RESERVED_TYPE      = 0x64,
-    TOGGLE = RESERVED_TYPE+1,
-    RADIO  = RESERVED_TYPE+2,
+    TOGGLE    = RESERVED_TYPE+1,
+    RADIO     = RESERVED_TYPE+2,
+    VALUATOR  = RESERVED_TYPE+4,
     GROUP_TYPE         = 0xe0,
-    WINDOW_TYPE                = 0xf0
+    WINDOW_TYPE        = 0xf0
   };
 
   uchar        type() const            { return type_; }

Modified: trunk/src/Menu_popup.cxx
===================================================================
--- trunk/src/Menu_popup.cxx    2007-06-05 15:10:41 UTC (rev 5871)
+++ trunk/src/Menu_popup.cxx    2007-06-05 15:56:31 UTC (rev 5872)
@@ -73,13 +73,13 @@
 class MWindow;
 
 struct MenuState {
-  int level;   // which level of nesting current item is in
+  int level;    // which level of nesting current item is in
   int indexes[MAX_LEVELS]; // index in each level of selected item
   MWindow* menus[MAX_LEVELS]; // windows that have been created
   int nummenus; // number of windows (may be level+1 or level+2)
   bool menubar; // if true menus[0] is a menubar
   bool hmenubar; // menubar&&menus[0] is horizontal
-  bool changed;        // did the menu items change
+  bool changed; // did the menu items change
   int state; // one of the enumeration below
   Menu* widget; // widget that is making this menu
   // return the widget being pointed at:
@@ -135,7 +135,7 @@
     item->flags(save_flags);
 
     if (!menustate->hmenubar &&
-       menustate->widget->children(menustate->indexes,1)>=0) {
+    menustate->widget->children(menustate->indexes,1)>=0) {
       // Use the item's fontsize for the size of the arrow, rather than h:
       int nh = int(item->textsize());
       draw_glyph(ALIGN_RIGHT, Rectangle(w()-nh, ((h()-nh)>>1), nh, nh));
@@ -164,7 +164,7 @@
   int children;
   MenuTitle* title;
   bool is_menubar;
-  int drawn_selected;  // last redraw has this selected
+  int drawn_selected;   // last redraw has this selected
   MWindow(MenuState*, int level, const Rectangle& R, const char* title, int 
rightedge);
   ~MWindow();
   int find_selected(int mx, int my);
@@ -252,8 +252,8 @@
     } else {
       unsigned hotkey = item->shortcut();
       if (hotkey) {
-       int w1 = int(getwidth(key_name(hotkey)) + 8.5);
-       if (w1 > hotKeysW) hotKeysW = w1;
+    int w1 = int(getwidth(key_name(hotkey)) + 8.5);
+    if (w1 > hotKeysW) hotKeysW = w1;
       }
     }
   }
@@ -280,7 +280,7 @@
     selection from one item to the next.
 */
 void Menu::draw_in(Widget* widget, const int* indexes, int level,
-                  int selected, int drawn_selected) const {
+           int selected, int drawn_selected) const {
   Box* box = menubox(widget);
   const unsigned char damage = widget->damage();
 
@@ -324,20 +324,20 @@
       Flags flags = item->flags();
       if (flags&INACTIVE) flags |= INACTIVE_R;
       if (i == selected && !(flags & (OUTPUT|INACTIVE))) {
-       flags |= (SELECTED|HIGHLIGHT);
+    flags |= (SELECTED|HIGHLIGHT);
       } else {
-       flags &= ~(SELECTED|HIGHLIGHT);
+    flags &= ~(SELECTED|HIGHLIGHT);
       }
       if (damage==DAMAGE_CHILD) {
-       // see if we need to erase background
-       Box* b = item->box();
-       if (!b->fills_rectangle()) {
-         push_clip(ir);
-         Rectangle r(widget->w(), widget->h());
-         drawstyle(widget->style(),0);
-         box->draw(r);
-         pop_clip();
-       }
+    // see if we need to erase background
+    Box* b = item->box();
+    if (!b->fills_rectangle()) {
+      push_clip(ir);
+      Rectangle r(widget->w(), widget->h());
+      drawstyle(widget->style(),0);
+      box->draw(r);
+      pop_clip();
+    }
       }
 
       push_matrix();
@@ -355,15 +355,15 @@
 
       if (horizontal) ;
       else if (this->children(array,level+1)>=0) {
-       // Use the item's fontsize for the size of the arrow, rather than h:
-       int nh = int(item->textsize());
-       draw_glyph(ALIGN_RIGHT, Rectangle(ir.r()-nh, ir.y()+((ir.h()-nh)>>1), 
nh, nh));
+    // Use the item's fontsize for the size of the arrow, rather than h:
+    int nh = int(item->textsize());
+    draw_glyph(ALIGN_RIGHT, Rectangle(ir.r()-nh, ir.y()+((ir.h()-nh)>>1), nh, 
nh));
       } else if (!widget->parent()) {
-       unsigned hotkey = item->shortcut();
-       if (hotkey)
-         item->labeltype()->draw(key_name(hotkey),
-                                 Rectangle(ir.x(), ir.y(), ir.w()-3, ir.h()),
-                                 ALIGN_RIGHT);
+    unsigned hotkey = item->shortcut();
+    if (hotkey)
+      item->labeltype()->draw(key_name(hotkey),
+                  Rectangle(ir.x(), ir.y(), ir.w()-3, ir.h()),
+                  ALIGN_RIGHT);
       }
       item->flags(save_flags);
     }
@@ -379,7 +379,7 @@
     items into the widget.
 */
 int Menu::find_selected(Widget* widget, const int* indexes, int level,
-                       int mx, int my) const {
+            int mx, int my) const {
   if (mx < 0 || my < 0) return -1;
   if (widget->horizontal()) {
     if (my >= widget->h()) return -1;
@@ -425,7 +425,7 @@
     the draw() method had been used to draw the items into the widget.
 */
 Rectangle Menu::get_location(Widget* widget, const int* indexes, int level,
-                            int index) const
+                 int index) const
 {
   Rectangle r(widget->w(), widget->h());
   menubox(widget)->inset(r);
@@ -470,7 +470,7 @@
 ////////////////////////////////////////////////////////////////
 
 MWindow::MWindow(MenuState* m, int l, const Rectangle& rectangle,
-                const char* t, int rightedge)
+         const char* t, int rightedge)
   : MenuWindow(rectangle.x(), rectangle.y(), rectangle.w(), rectangle.h(), 0), 
menustate(m), level(l)
 {
   box_from_menuwindow = style()->box();
@@ -562,8 +562,8 @@
   Widget* widget = this;
   if (menustate->menubar && !level) widget = menustate->widget;
   return menustate->widget->get_location(widget,
-                                        menustate->indexes, level,
-                                        index).y();
+                     menustate->indexes, level,
+                     index).y();
 }
 
 // return the left edge of an item:
@@ -571,14 +571,14 @@
   Widget* widget = this;
   if (menustate->menubar && !level) widget = menustate->widget;
   return menustate->widget->get_location(widget,
-                                        menustate->indexes, level,
-                                        index).x();
+                     menustate->indexes, level,
+                     index).x();
 }
 
 void MWindow::draw() {
   int selected = level <= menustate->level ? menustate->indexes[level] : -1;
   menustate->widget->draw_in(this, menustate->indexes, level,
-                            selected, drawn_selected);
+                 selected, drawn_selected);
   drawn_selected = selected;
 }
 
@@ -589,15 +589,15 @@
   if (menustate->menubar && !level) widget = menustate->widget;
   return
     menustate->widget->find_selected(widget,
-                                    menustate->indexes, level, mx, my);
+                     menustate->indexes, level, mx, my);
 }
 
 ////////////////////////////////////////////////////////////////
 // The Menu::popup() run-time:
 
 enum {INITIAL_STATE = 0,// no mouse up or down since popup() called
-      PUSH_STATE,      // mouse has been pushed on a normal item
-      DONE_STATE       // execute the selected item
+      PUSH_STATE,   // mouse has been pushed on a normal item
+      DONE_STATE    // execute the selected item
 };
 
 // scroll so item i is visible on screen, return true if it moves
@@ -687,21 +687,21 @@
 }
 
 static bool track_mouse;
+#include <stdio.h>
 
 int MWindow::handle(int event) {
   MenuState &p = *menustate;
   Widget* widget = 0;
-  //printf("event %08x  key %08x\n", event, event_key());
+
   switch (event) {
-
   case KEY:
     track_mouse = event_state(ANY_BUTTON);
     switch (event_key()) {
     case LeftAccKey:
     case RightAccKey:
       if (style()->hide_underscore() && !event_clicks()) {
-       for (int i = 0; i < p.nummenus; i++)
-         p.menus[i]->redraw();
+    for (int i = 0; i < p.nummenus; i++)
+      p.menus[i]->redraw();
       }
       return 1;
     case UpKey:
@@ -715,13 +715,13 @@
       return 1;
     case RightKey:
       if (p.hmenubar && (p.level<=0 || p.level==1 && p.nummenus==2))
-       forward(p, 0);
+    forward(p, 0);
       else if (p.level+1 < p.nummenus) forward(p, p.level+1);
       return 1;
     case LeftKey:
       if (p.hmenubar && p.level<=1) backward(p, 0);
       else if (p.level > 0)
-       setitem(p, p.level-1, p.indexes[p.level-1]);
+    setitem(p, p.level-1, p.indexes[p.level-1]);
       return 1;
     case SpaceKey:
     case ReturnKey:
@@ -743,30 +743,30 @@
       static char lastkey; // test for same key multiple times
       if (p.indexes[menu] < 0) lastkey = 0;
       for (int item = 0; item < mw.children; item++) {
-       widget = mw.get_widget(item);
-//     if (widget->active() && widget->test_shortcut(false)) {
-//       setitem(p, menu, item);
-//       lastkey = 0;
-//       goto EXECUTE;
-//     }
-       // continue unless this item can be picked by the keystroke:
-       if (!widget->takesevents()) continue;
-       if (widget->test_label_shortcut()) {
-         // underscored items are jumped to immediately on first keystroke:
-         if (event_text()[0]!=lastkey) {nextitem = item; continue;}
-       } else {
-         const char* l = widget->label();
-         if (!l || tolower(*l) != event_text()[0]) continue;
-       }
-       // cycle around the selectable items:
-       if (nextitem < 0 ||
-           nextitem <= p.indexes[menu] && item > p.indexes[menu])
-         nextitem = item;
+    widget = mw.get_widget(item);
+//  if (widget->active() && widget->test_shortcut(false)) {
+//    setitem(p, menu, item);
+//    lastkey = 0;
+//    goto EXECUTE;
+//  }
+    // continue unless this item can be picked by the keystroke:
+    if (!widget->takesevents()) continue;
+    if (widget->test_label_shortcut()) {
+      // underscored items are jumped to immediately on first keystroke:
+      if (event_text()[0]!=lastkey) {nextitem = item; continue;}
+    } else {
+      const char* l = widget->label();
+      if (!l || tolower(*l) != event_text()[0]) continue;
+    }
+    // cycle around the selectable items:
+    if (nextitem < 0 ||
+        nextitem <= p.indexes[menu] && item > p.indexes[menu])
+      nextitem = item;
       }
       lastkey = event_text()[0];
       if (nextitem >= 0) {
-       setitem(p, menu, nextitem);
-       goto EXECUTE; // now menu items autoexecute see STR#980  return 1;
+    setitem(p, menu, nextitem);
+    goto EXECUTE; // now menu items autoexecute see STR#980  return 1;
       }
     }}
     return 1; // always eat all the keystrokes
@@ -774,15 +774,15 @@
   case KEYUP:
     if (event_key()==LeftAccKey || event_key()==RightAccKey) {
       if (event_is_click()) {
-       // checking for event_clicks insures that the keyup matches the
-       // keydown that preceeded it, so Alt was pressed & released without
-       // any intermediate values.
-       exit_modal();
-       return 1;
+    // checking for event_clicks insures that the keyup matches the
+    // keydown that preceeded it, so Alt was pressed & released without
+    // any intermediate values.
+    exit_modal();
+    return 1;
       }
       if (style()->hide_underscore()) {
-       for (int i = 0; i < p.nummenus; i++)
-         p.menus[i]->redraw();
+    for (int i = 0; i < p.nummenus; i++)
+      p.menus[i]->redraw();
       }
     }
     return 0;
@@ -800,31 +800,41 @@
     // search the visible menus from top down for item being pointed at:
     for (menu = p.nummenus-1; ; menu--) {
       if (menu < 0) { // not pointing at anything:
-       // quit if they clicked off the menus:
-       if (event == PUSH) {exit_modal(); return 0;}
-       // keep the lowest-visible menu visible but with nothing selected:
-       menu = p.nummenus-1;
-       item = -1;
-       break;
+    // quit if they clicked off the menus:
+    if (event == PUSH) {exit_modal(); return 0;}
+    // keep the lowest-visible menu visible but with nothing selected:
+    menu = p.nummenus-1;
+    item = -1;
+    break;
       }
       item = p.menus[menu]->find_selected(mx, my);
       if (item >= 0) break;
     }
     if (setitem(p, menu,item)) return 1;
     if (item < 0) return 1;
+
     if (event == PUSH) {
       // redraw checkboxes so they preview the state they will be in:
       Widget* widget = p.menus[menu]->get_widget(item);
-      if (checkmark(widget)) p.menus[menu]->redraw(DAMAGE_CHILD);
+      if (checkmark(widget)) 
+          p.menus[menu]->redraw(DAMAGE_CHILD);
+    } else if (event == DRAG) {
+      // allow scrolling for valuators, but ignore their handle() returns
+      Widget* widget = p.menus[menu]->get_widget(item);
+      if (widget->type() == Widget::VALUATOR) {
+          widget->handle(event);
+          p.menus[menu]->redraw(DAMAGE_CHILD);
+      }     
     } else if (p.level || !p.hmenubar) {
       // item didn't change on drag/move, check for autoscroll:
       if (event_y_root() <= MENUAREA.y()) {
-       if (!p.menus[menu]->autoscroll(item)) backward(p, p.level);
+    if (!p.menus[menu]->autoscroll(item)) backward(p, p.level);
       } else if (event_y_root() >= MENUAREA.b()-1) {
-       if (!p.menus[menu]->autoscroll(item)) forward(p, p.level);
+    if (!p.menus[menu]->autoscroll(item)) forward(p, p.level);
       }
     }
-    return 1;}
+    return 1;
+  }
 
   case RELEASE:
     pushed_ = 0;
@@ -843,16 +853,16 @@
       widget = p.current_widget();
       if (widget->takesevents()) {
 #if 0
-       if (widget->flag(MENU_STAYS_UP) && (!p.menubar || p.level)) {
-         p.widget->set_item(p.indexes, p.level);
-         p.widget->execute(widget);
-         Window* mw = p.menus[p.level];
-         if (widget->type() == Item::RADIO) mw->redraw();
-         else if (checkmark(widget)) mw->redraw(DAMAGE_CHILD);
-         return 1;
-       }
+    if (widget->flag(MENU_STAYS_UP) && (!p.menubar || p.level)) {
+      p.widget->set_item(p.indexes, p.level);
+      p.widget->execute(widget);
+      Window* mw = p.menus[p.level];
+      if (widget->type() == Item::RADIO) mw->redraw();
+      else if (checkmark(widget)) mw->redraw(DAMAGE_CHILD);
+      return 1;
+    }
 #endif
-       p.state = DONE_STATE;
+    p.state = DONE_STATE;
       }
     }
     exit_modal();
@@ -876,7 +886,7 @@
       rectangle.move(w->x(), w->y());
   } else {
     rectangle.move(event_x_root()-event_x(),
-                  event_y_root()-event_y());
+           event_y_root()-event_y());
   }
   if (fltk::event() == fltk::PUSH)
     monitor = &Monitor::find(event_x_root(), event_y_root());
@@ -932,10 +942,10 @@
       int dy = mw->y()-nY;
       int dx = mw->x()-nX;
       for (int menu = 0; menu < p.level; menu++) {
-       MWindow* t = p.menus[menu];
-       int nx = t->x()+dx; if (nx < 0) {nx = 0; dx = -t->x();}
-       int ny = t->y()+dy; if (ny < 0) {ny = 0; dy = -t->y();}
-       t->position(nx, ny);
+    MWindow* t = p.menus[menu];
+    int nx = t->x()+dx; if (nx < 0) {nx = 0; dx = -t->x();}
+    int ny = t->y()+dy; if (ny < 0) {ny = 0; dy = -t->y();}
+    t->position(nx, ny);
       }
     }
     // show all the menus:
@@ -988,13 +998,13 @@
       *(Rectangle*)(mw->title) = r;
       mw->title->show(p.menus[0]->child_of());
       if (widget->takesevents() && p.current_children()>=0) {
-       // if it is a real menu we add it to the list of displayed menus
-       p.menus[p.nummenus++] = mw;
-       mw->show(p.menus[0]->child_of());
+    // if it is a real menu we add it to the list of displayed menus
+    p.menus[p.nummenus++] = mw;
+    mw->show(p.menus[0]->child_of());
       } else {
-       // Non-submenus in the menubar produce "buttons" which I "highlight"
-       // my making a fake submenu with only the title box displayed.
-       p.fakemenu = mw;
+    // Non-submenus in the menubar produce "buttons" which I "highlight"
+    // my making a fake submenu with only the title box displayed.
+    p.fakemenu = mw;
       }
 
     } else if (p.current_children()>=0) {
@@ -1002,7 +1012,7 @@
       int nX = mw->x() + mw->w();
       int nY = mw->y() + mw->ypos(index) - mw->ypos(0);
       mw = new MWindow(&p, p.nummenus, Rectangle(nX, nY, 0, 0), 0,
-                      p.nummenus ? p.menus[p.nummenus-1]->x() : 0);
+               p.nummenus ? p.menus[p.nummenus-1]->x() : 0);
       p.menus[p.nummenus++] = mw;
       mw->show(p.menus[0]->child_of());
 

Modified: trunk/src/Valuator.cxx
===================================================================
--- trunk/src/Valuator.cxx      2007-06-05 15:10:41 UTC (rev 5871)
+++ trunk/src/Valuator.cxx      2007-06-05 15:56:31 UTC (rev 5872)
@@ -76,6 +76,7 @@
   clear_flag(ALIGN_MASK);
   set_flag(ALIGN_BOTTOM);
   when(WHEN_CHANGED);
+  type(Widget::VALUATOR); // for Item
   value_ = 0.0;
   step_ = 0;
   minimum_ = 0;

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

Reply via email to