On 02/20/12 04:09, Geoffrey Mellar wrote: > Hello, > i want a Fl_tree widget to call the callback function > only if there is a double click.
Yes, there should really be an example that shows how to do this. If there was, this bug probably would have been caught. > Because there is no > FL_WHEN_DOUBLE_CLICK or something else I decided to > use <tree>.when(FL_WHEN_NEVER). With this option enabled, > a callback should never happen. There is a handle function > to recognize the double click. > This works fine but despite > the call to wid_waypoint_list.when(FL_WHEN_NEVER); there are > also callbacks on every other widget action. Is anyone > familiar with this problem? Sounds like a bug in Fl_Tree's handling of when(). Inside Fl_Tree::handle(), calls like this: select_only(_item_focus); ..should really be changed to this: select_only(_item_focus, when()); I've submitted STR #2807 on your behalf: http://fltk.org/str.php?L2807 Should be fixed in the next update to 1.3. I'll try to post a patch for SVN which you can use to fix Fl_Tree to support FL_WHEN_NEVER properly. There really should be an easier way to allow callback() to handle multi-clicks more easily than having to derive from Fl_Tree and override handle(). I should probably implement an FL_TREE_REASON_CLICKED so that any click events on an item can be detected, instead of just select/deselect/open/closed events. Regarding detecting double-clicks on items, I think you should be able to something like this for now: #include <stdio.h> #include <FL/Fl.H> #include <FL/Fl_Double_Window.H> #include <FL/Fl_Tree.H> // // Detecting double-click on Fl_Tree item for 1.3.0. // erco 1.0 02/20/2012 // 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) { if ( e == FL_PUSH ) { // Mouse click? const Fl_Tree_Item *item = find_clicked(); // item clicked if ( item ) { // valid item? callback_item((Fl_Tree_Item*)item); // set callback item callback_reason(FL_TREE_REASON_SELECTED); // set callback reason do_callback(); } } return(Fl_Tree::handle(e)); } }; void TreeCallback(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: { if ( Fl::event_clicks() == 1 ) { fprintf(stderr, "Item '%s' double clicked\n", item->label()); } break; } default: break; } } int main(int argc, char *argv[]) { Fl_Double_Window *win = new Fl_Double_Window(250, 400, "Simple Tree"); win->begin(); // Create the tree MyTree *tree = new MyTree(10, 10, win->w()-20, win->h()-20); tree->showroot(0); tree->callback(TreeCallback); // Add some items tree->add("Flintstones/Fred"); tree->add("Flintstones/Wilma"); tree->add("Flintstones/Pebbles"); tree->add("Simpsons/Homer"); tree->add("Simpsons/Marge"); tree->add("Simpsons/Bart"); tree->add("Simpsons/Lisa"); 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