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
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk