mirror of
https://github.com/fltk/fltk.git
synced 2026-06-01 23:06:54 +08:00
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
This commit is contained in:
@@ -43,6 +43,13 @@ void TreeCallback(Fl_Widget *w, void *data) {
|
|||||||
break;
|
break;
|
||||||
case FL_TREE_REASON_CLOSED:
|
case FL_TREE_REASON_CLOSED:
|
||||||
// fprintf(stderr, "TreeCallback: Item '%s' closed\n", item->label());
|
// fprintf(stderr, "TreeCallback: Item '%s' closed\n", item->label());
|
||||||
|
break;
|
||||||
|
#if FLTK_ABI_VERSION >= 10301
|
||||||
|
// To enable this callback, use tree->item_reselect_mode(FL_TREE_SELECTABLE_ALWAYS);
|
||||||
|
case FL_TREE_REASON_RESELECTED:
|
||||||
|
// fprintf(stderr, "TreeCallback: Item '%s' reselected\n", item->label());
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-16
@@ -1317,29 +1317,33 @@ int Fl_Tree::select_only(Fl_Tree_Item *selitem, int docallback) {
|
|||||||
selitem = selitem ? selitem : first(); // NULL? use first()
|
selitem = selitem ? selitem : first(); // NULL? use first()
|
||||||
if ( ! selitem ) return(0);
|
if ( ! selitem ) return(0);
|
||||||
int changed = 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() ) {
|
for ( Fl_Tree_Item *item = first(); item; item = item->next() ) {
|
||||||
if ( item == selitem ) {
|
if ( item == selitem ) continue; // don't do anything to selitem yet..
|
||||||
#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);
|
|
||||||
++changed;
|
|
||||||
} else {
|
|
||||||
if ( item->is_selected() ) {
|
if ( item->is_selected() ) {
|
||||||
deselect(item, docallback);
|
deselect(item, docallback);
|
||||||
++changed;
|
++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);
|
return(changed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user