diff options
| author | Greg Ercolano <erco@seriss.com> | 2013-11-06 20:12:08 +0000 |
|---|---|---|
| committer | Greg Ercolano <erco@seriss.com> | 2013-11-06 20:12:08 +0000 |
| commit | 52d395ad818d28053d34e7a634d4c9c3eb8ab755 (patch) | |
| tree | dcbd101c22235898459593e018549c2ab973e04a /src | |
| parent | 2fd7086605e46f93525abc3ffbcc18489d9ba7d8 (diff) | |
Fix problem with Fl_Tree::select_only() invoking select callbacks
before all other items have first been deselected.
Also: added some related demo code to tree-simple to demonstrate
'reselect' callbacks, where a callback can be invoked when an item
that's selected already is 're-selected'.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10015 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Tree.cxx | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/src/Fl_Tree.cxx b/src/Fl_Tree.cxx index 2623ba57b..0ff40a8c7 100644 --- a/src/Fl_Tree.cxx +++ b/src/Fl_Tree.cxx @@ -1317,29 +1317,33 @@ int Fl_Tree::select_only(Fl_Tree_Item *selitem, int docallback) { selitem = selitem ? selitem : first(); // NULL? use first() if ( ! selitem ) return(0); int changed = 0; + // Deselect everything first. + // Prevents callbacks from seeing more than one item selected. + // for ( Fl_Tree_Item *item = first(); item; item = item->next() ) { - if ( item == selitem ) { -#if FLTK_ABI_VERSION >= 10301 - // NEW - if ( item->is_selected() ) { // already selected? - if ( item_reselect_mode() == FL_TREE_SELECTABLE_ALWAYS ) { - select(item, docallback); // handles callback with reason==reselect - } - continue; // leave 'changed' unmodified (nothing changed) - } -#else - // OLD - if ( item->is_selected() ) continue; // don't count if already selected -#endif - select(item, docallback); + if ( item == selitem ) continue; // don't do anything to selitem yet.. + if ( item->is_selected() ) { + deselect(item, docallback); ++changed; - } else { - if ( item->is_selected() ) { - deselect(item, docallback); - ++changed; - } } } +#if FLTK_ABI_VERSION >= 10301 + // Should we 'reselect' item if already selected? + if ( selitem->is_selected() && (item_reselect_mode()==FL_TREE_SELECTABLE_ALWAYS) ) { + // Selection unchanged, so no ++change + select(selitem, docallback); // do callback with reason=reselect + } else if ( !selitem->is_selected() ) { + // Item was not already selected, select and indicate changed + select(selitem, docallback); + ++changed; + } +#else + if ( !selitem->is_selected() ) { + // All items deselected, now select the one we want + select(selitem, docallback); + ++changed; + } +#endif return(changed); } |
