diff options
| author | Fabien Costantini <fabien@onepost.net> | 2012-04-15 20:11:36 +0000 |
|---|---|---|
| committer | Fabien Costantini <fabien@onepost.net> | 2012-04-15 20:11:36 +0000 |
| commit | b31264e473d9475d80d7d4cf7964f2b0051bfcba (patch) | |
| tree | 9b8f8707323b980cd0254c7dba7c0562ed9cdfc9 /src | |
| parent | efe0b2b939a7135b957acd626e3877f2375d6d62 (diff) | |
STR 2827 implementation. Implemented Reselect code and related API all within ABI controlled preprocessor blocks because of new attribute defintion would break ABI anyway. Because the code is already ABI controlled, I took the opportunity to keep keep the REASON enum sorted. Added test code in Tree.fl adequately.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9347 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Tree.cxx | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/Fl_Tree.cxx b/src/Fl_Tree.cxx index 0635c7d05..08934ce03 100644 --- a/src/Fl_Tree.cxx +++ b/src/Fl_Tree.cxx @@ -98,10 +98,11 @@ Fl_Tree::Fl_Tree(int X, int Y, int W, int H, const char *L) : Fl_Group(X,Y,W,H,L _callback_item = 0; _callback_reason = FL_TREE_REASON_NONE; _scrollbar_size = 0; // 0: uses Fl::scrollbar_size() - + #if FLTK_ABI_VERSION >= 10302 // NEW _lastselect = 0; + _itemReselectMode = FL_TREE_SELECTABLE_ONCE; #else // OLD: data initialized static inside handle() #endif @@ -257,7 +258,8 @@ int Fl_Tree::handle(int e) { // fprintf(stderr, "ERCODEBUG: Fl_Tree::handle(): Event was %s (%d)\n", fl_eventnames[e], e); // DEBUGGING if ( ! _root ) return(ret); switch ( e ) { - case FL_PUSH: { // clicked on a tree item? + case FL_PUSH: { + // clicked on a tree item? if (Fl::visible_focus() && handle(FL_FOCUS)) { Fl::focus(this); } @@ -273,6 +275,7 @@ int Fl_Tree::handle(int e) { } else if ( o->event_on_label(_prefs) && // label clicked? (!o->widget() || !Fl::event_inside(o->widget())) && // not inside widget (!_vscroll->visible() || !Fl::event_inside(_vscroll)) ) { // not on scroller + switch ( _prefs.selectmode() ) { case FL_TREE_SELECT_NONE: break; @@ -995,13 +998,25 @@ int Fl_Tree::is_close(const char *path) const { /// - 0 - item was already selected, no change was made /// int Fl_Tree::select(Fl_Tree_Item *item, int docallback) { - if ( ! item->is_selected() ) { + int alreadySelected = item->is_selected(); + + if ( !alreadySelected +#if FLTK_ABI_VERSION >= 10302 + || item_reselect_mode()==FL_TREE_SELECTABLE_ALWAYS +#endif + ) { item->select(); set_changed(); if ( docallback ) { - do_callback_for_item(item, FL_TREE_REASON_SELECTED); + do_callback_for_item(item, +#if FLTK_ABI_VERSION >= 10302 + alreadySelected ? FL_TREE_REASON_RESELECTED :FL_TREE_REASON_SELECTED); +#else + FL_TREE_REASON_SELECTED); +#endif } - redraw(); + + redraw(); return(1); } return(0); @@ -1165,7 +1180,13 @@ int Fl_Tree::select_only(Fl_Tree_Item *selitem, int docallback) { int changed = 0; for ( Fl_Tree_Item *item = first(); item; item = item->next() ) { if ( item == selitem ) { - if ( item->is_selected() ) continue; // don't count if already selected + if ( item->is_selected() + +#if FLTK_ABI_VERSION >= 10302 + && item_reselect_mode()!=FL_TREE_SELECTABLE_ALWAYS +#endif + + ) continue; // don't count if already selected select(item, docallback); ++changed; } else { |
