Guys,
I'm a fltk/c newbie, so I'll really appreciate any suggestions of improvement 
with the handle() function.
I am trying to add keyboard up/down navigation to my simple Tree.

#include <FL/Fl.H>
#include <stdio.h>
#include <FL/Fl.H>
#include <FL/Fl_Pixmap.H>
#include <FL/Fl_Group.H>
#include <FL/Fl_Tree.H>
#include <FL/fl_ask.H>
#include <FL/Fl_Double_Window.H>
#define FL_Down         0xff54  ///< The down arrow key.
#define FL_Up           0xff52  ///< The up arrow key.

Fl_Double_Window *window=(Fl_Double_Window *)0;

class MyTree: public Fl_Tree
{
public:
        MyTree(int width, int height, int xlim, int ylim);
        int handle (int event);
        ~MyTree(){}
};

MyTree::MyTree(int width, int height, int xlim, int ylim)
:Fl_Tree(width, height, xlim, ylim)
{
}

int MyTree::handle(int e)
{
        int ret = Fl::event_key();
        if (e== 12 && ret == FL_Down)
        {
                Fl_Tree_Item *item = item_clicked();
                if ( item ) {
                        if (item != last())
                        {
                                item = item->next();
                                item_clicked(item);
                                deselect_all();        // deselect all items
                                select(item);        // select this one
                                redraw();
                                set_changed();
                                do_callback((Fl_Widget*)this, user_data());
                        }
                }
                return 1;
        }
        else if (e==12 & ret == FL_Up)
        {
                Fl_Tree_Item *item = item_clicked();
                if ( item ) {
                        if (!item->is_root())
                        {
                                item = item->prev();
                                item_clicked(item);
                                deselect_all();        // deselect all items
                                select(item);        // select this one
                                redraw();
                                set_changed();
                                do_callback((Fl_Widget*)this, user_data());
                        }
                }
                return 1;
        }
        return Fl_Tree::handle(e);
}

MyTree *tree=(MyTree *)0;

void RebuildTree() { // REBUILD THE TREE TO MAKE CURRENT "DEFAULT" PREFS TAKE 
EFFECT
        tree->clear();
        tree->add("Aaa");
        tree->add("Bbb");
        tree->add("Ccc");
        tree->add("Ddd");
        tree->add("Bbb/child-01");
        tree->add("Bbb/child-01/111");
        tree->add("Bbb/child-01/222");
        tree->add("Bbb/child-01/333");
        tree->redraw();
}

static void cb_tree(MyTree*, void*) {
        Fl_Tree_Item *item = tree->item_clicked();
        fprintf(stderr, "TREE CALLBACK: label='%s' userdata=%ld\n",
                item->label(),
                (long)tree->user_data());
}

int main(int argc, char **argv) {
        window = new Fl_Double_Window(580, 695, "test-Fl_Tree");
        tree = new MyTree(15, 15, 550, 390);
        tree->callback((Fl_Callback*)cb_tree, (void*)(1234));
        tree->end();
        // Initialize Tree
        tree->root_label("ROOT");
        RebuildTree();
        window->resizable(window);
        window->size_range(window->w(), window->h(), 0, 0);
        window->show(argc, argv);
        return Fl::run();
}

_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to