summaryrefslogtreecommitdiff
path: root/src/Fl_Tree.cxx
diff options
context:
space:
mode:
authorGreg Ercolano <erco@seriss.com>2013-11-06 20:12:08 +0000
committerGreg Ercolano <erco@seriss.com>2013-11-06 20:12:08 +0000
commit52d395ad818d28053d34e7a634d4c9c3eb8ab755 (patch)
treedcbd101c22235898459593e018549c2ab973e04a /src/Fl_Tree.cxx
parent2fd7086605e46f93525abc3ffbcc18489d9ba7d8 (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/Fl_Tree.cxx')
-rw-r--r--src/Fl_Tree.cxx42
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);
}