Thanks! I missed the "find_clicked()" method, so I thought it would be more complicated than that to add event checking for that. Also thank you for the code example, it'll help me speed up the creation of what I need =)
> On 05/17/12 20:27, Greg Ercolano wrote: > > On 05/17/12 11:56, Eugenio Bargiacchi wrote: > >> What do you suggest as a workaround for me while waiting on the next > >> awesome release? Is the Fl_Button method the only way? > >> > > > > I'd suggest derive your own class from Fl_Tree, > > and make a handle() method catch FL_PUSH and check for > > the right mouse, and if so, determine the item and then > > Fl_Tree::select() it, eg: > > > > int handle(int e) { > > switch (e) { > > case FL_PUSH: > > if ( Fl::event_button() == FL_RIGHT_MOUSE ) { > > Fl_Tree_Item *item = (Fl_Tree_Item*)find_clicked(); > > if ( item ) { > > printf("*Right* click on item '%s'\n", > > item->label()); > > select(item); // for example, select the > > item > > } > > } > > break; > > } > > return(Fl_Tree::handle(e)); > > } > > > > Your tree callback can then check if Fl::event_button() is > > FL_RIGHT_MOUSE > > and act accordingly. > > Oh, and I should have mentioned calling select(item) in the above > triggers your tree callback, which is why you can then add the > code you want to the tree callback. > > Here's a compilable example using the above technique to show how > it enables right clicking to eg. select items, and how to have your > tree callback detect right clicks (see the ** RIGHT MOUSE ** message): > > > #include <stdio.h> > #include <FL/Fl.H> > #include <FL/Fl_Double_Window.H> > #include <FL/Fl_Tree.H> > #include <FL/Fl_Menu_Button.H> > class MyTree : public Fl_Tree > { > public: > MyTree(int X,int Y,int W,int H,const char*L=0):Fl_Tree(X,Y,W,H,L) { > } > int handle(int e) { > switch (e) { > case FL_PUSH: > if ( Fl::event_button() == FL_RIGHT_MOUSE ) { > Fl_Tree_Item *item = (Fl_Tree_Item*)find_clicked(); > if ( item ) { > printf("*Right* click on item '%s'\n", item->label()); > select(item); // for example, select the > item > } > } > break; > } > return(Fl_Tree::handle(e)); > } > }; > > // Tree's callback > // Invoked whenever an item's state changes. > // > void Tree_CB(Fl_Widget *w, void *data) { > Fl_Tree *tree = (Fl_Tree*)w; > Fl_Tree_Item *item = (Fl_Tree_Item*)tree->callback_item(); > if ( ! item ) return; > switch ( tree->callback_reason() ) { > case FL_TREE_REASON_SELECTED: { > char pathname[256]; > tree->item_pathname(pathname, sizeof(pathname), item); > if ( Fl::event_button() == FL_RIGHT_MOUSE ) > { fprintf(stderr, "** RIGHT MOUSE **: "); } > fprintf(stderr, "Tree_CB: Item selected='%s', Full pathname='%s'\n", > item->label(), pathname); > break; > } > case FL_TREE_REASON_DESELECTED: > fprintf(stderr, "Tree_CB: Item '%s' deselected\n", item->label()); > break; > case FL_TREE_REASON_OPENED: > fprintf(stderr, "Tree_CB: Item '%s' opened\n", item->label()); > break; > case FL_TREE_REASON_CLOSED: > fprintf(stderr, "Tree_CB: Item '%s' closed\n", item->label()); > default: > break; > } > } > > int main(int argc, char *argv[]) { > Fl_Double_Window win(250, 400, "Simple Tree"); > MyTree tree(10, 10, win.w()-20, win.h()-20); > tree.callback(Tree_CB); > tree.add("Aaa/a-0001"); > tree.add("Aaa/a-0002"); > tree.add("Aaa/a-0003"); > tree.add("Bbb/b-0001"); > tree.add("Bbb/b-0002"); > tree.add("Bbb/b-0003"); > tree.end(); > win.end(); > win.resizable(win); > win.show(argc, argv); > return(Fl::run()); > } _______________________________________________ fltk mailing list fltk@easysw.com http://lists.easysw.com/mailman/listinfo/fltk