This is a sample code based on the table-simple example by Greg Ercolano with 
the popup added.
I hope you can see the problem
Regards.


#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Table_Row.H>
#include <FL/Fl_Menu_Button.H>
#include <FL/fl_draw.H>

#define MAX_ROWS 30
#define MAX_COLS 4

// Derive a class from Fl_Table
class MyTable : public Fl_Table_Row {
  void DrawData(int X, int Y, int W, int H) {
          fl_push_clip(X,Y,W,H);
      // Draw cell bg
      fl_rectf(X,Y,W,H);
      // Draw box border
      fl_color(color()); fl_rect(X,Y,W,H);
    fl_pop_clip();
  }

  void draw_cell(TableContext context, int ROW=0, int COL=0, int X=0, int Y=0, 
int W=0, int H=0) {
    switch ( context ) {
      case CONTEXT_CELL:                        // Draw data in cells
                        if (row_selected(ROW))
                                {
                                printf("draw_cell Row=%d Col=%d Context=%d X=%d 
Y=%d W=%d H=%d\n", ROW, COL, context, X, Y, W, H);
                                fl_color(FL_YELLOW);
                                }
                        else
                                fl_color(FL_WHITE);
        DrawData(X,Y,W,H);
        return;
      default:
        return;
    }
  }
   static void event_callback(Fl_Widget*, void*);
        void event_callback2();
public:
  Fl_Menu_Button *popmenu;

  MyTable(int X, int Y, int W, int H, const char *L=0) : 
Fl_Table_Row(X,Y,W,H,L) {
    // Rows
    rows(MAX_ROWS);             // how many rows
    // Cols
    cols(MAX_COLS);             // how many columns
    col_width_all(180);          // default width of columns
    end();                      // end the Fl_Table group
        callback (&event_callback, (void*)this);
  }
  ~MyTable() { }
};

void MyTable::event_callback(Fl_Widget*, void *data)
{
    MyTable *o = (MyTable*)data;
    o->event_callback2();
}

void MyTable::event_callback2()
///\brief Callback for table events
        {
        int R = callback_row(),
                C = callback_col();

        TableContext context = callback_context();
        printf("event_callback2 Row=%d Col=%d Context=%d Event=%d 
InteractiveResize? %d\n",
                R, C, (int)context, (int)Fl::event(), 
(int)is_interactive_resize());
        switch (Fl::event())
                {
                case FL_PUSH: //Any mouse click
                        if (Fl::event_button () == FL_RIGHT_MOUSE)
                                {
                                popmenu->position (Fl::event_x (), Fl::event_y 
());
                                popmenu->show ();
                                popmenu->popup ();
                                }
                        else
                                {
                                popmenu->hide ();
                                }
                        break;
                }
        }

Fl_Menu_Item menu_popmenu[] = {
 {"Insert Before...", 0,  0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
 {"Insert After...", 0,  0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
 {"Delete", 0,  0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
 {"Edit...", 0,  0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
 {0,0,0,0,0,0,0,0,0}
};

int main(int argc, char **argv) {
  Fl_Double_Window win(900, 400, "Simple Table");
  MyTable table(0,0,880,380);
  table.type (MyTable::SELECT_SINGLE);
  Fl_Menu_Button popmenu (30,30,100,100);
  popmenu.menu(menu_popmenu);
  popmenu.type(Fl_Menu_Button::POPUP3);
  table.popmenu = &popmenu;
  win.end();
  win.resizable(table);
  win.show(argc,argv);
  return(Fl::run());
}

> On 09.11.2011 15:51, David Lopez wrote:
> > Dear members:
> > I have a window containing an Fl_Table, and an Fl_Menu_Button which is 
> > normally hidden. The table handles the right click events to show a popup 
> > menu that allows user to operate with the current row (Delete, Edit, etc.).
> > That works fine, but the problem is that when the menu option is selected, 
> > the click event is alse handled by the table and the selected row changes.
> > I tried to catch the click events in a class derived from Fl_Menu_Button 
> > (the popup object) but it does not receive the FL_PUSH event.
> > I am using FLTK 1.3
> > Any helping idea would be appreciated.
> > Thank you very much.
>
> Can you post a short, but complete and compilable example
> program that shows the effect (as short as possible, and w/o
> the extra class you used to catch the click events)?
>
> Reading your description, this looks like a bug, but w/o seeing
> real code it's difficult to decide.
>
> Albrecht

_______________________________________________
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to