Jonathan Murphy wrote:
> What I would like is a single
> callback that will put the value of each input into output.

        You were close, see below.

        I'd say the main thing you were missing is setting the
        callback inside the loop. The way you had it, only the
        last instance got the callback.

        The other thing was keeping track of the Fl_Widget*
        between the static and non-static callback, so that you
        can get the Fl_Float_Input instance.

        I added the option when(FL_WHEN_CHANGED), so that whenever
        any input is being changed, the output is updated as you type.
        Commenting that out will go back to what you had, where you
        have to hit Enter for the output to update.

-------------------------------------------- snip
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Scroll.H>
#include <FL/Fl_Output.H>
#include <FL/Fl_Float_Input.H>

#define COLS 8
#define ROWS 16

class Table : public Fl_Scroll
{
public:
   Table(int X, int Y, int W, int H, const char*L);
   ~Table();
   Fl_Float_Input *in;
   int r, c;
private:
   static void in_cb(Fl_Widget*, void*);
   inline void in_cb_i(Fl_Widget*);              // CHANGED.
};

Fl_Double_Window *win;
Fl_Output *out;
Table::Table *table;

Table::Table(int X, int Y, int W, int H, const char*L) : Fl_Scroll(X,Y,W,H,L)
{
   int cellw = 60;
   int cellh = 20;
   int xx = X, yy = Y;
   for (r=0; r<ROWS; r++ )
     {
       for (c=0; c<COLS; c++ )
         {
           {
             in = new Fl_Float_Input(xx,yy,cellw,cellh);
             in->box(FL_PLASTIC_UP_BOX);
             in->value("0.00");
             in->when(FL_WHEN_CHANGED);                           // ADDED 
(OPTIONAL).
             in->callback(in_cb, this);                           // MOVED 
HERE..
           }
           xx += cellw;
         }
       xx = X;
       yy += cellh;
     }
   //// in->callback(in_cb, this);                                // ..FROM 
HERE.

   end();
}

Table::~Table(){}

void Table::in_cb(Fl_Widget* o, void* v)
{
   ((Table*)v)->in_cb_i(o);                              // CHANGED.
}

void Table::in_cb_i(Fl_Widget*o)                        // CHANGED.
{
   Fl_Float_Input *in = (Fl_Float_Input*)o;              // ADDED.
   out->value(in->value());
}

int main()
{
   Fl::scheme("plastic");
   win = new Fl_Double_Window(480, 380);
   table = new Table(0, 0, 480, 320, "");
   out = new Fl_Output(200, 340, 80, 20, "");
   win->resizable();
   win->show();
   return(Fl::run());
}

-------------------------------------------- snip
_______________________________________________
fltk mailing list
[EMAIL PROTECTED]
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to