STR# 2827 cont'd:

> Prevent 'changed' flag from being set during reselect
> test/tree.fl: added chooser so user can test with item reselect enabled|disabled
  (Chooser deactivated if the ABI option is not enabled)



git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9358 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Greg Ercolano 2012-04-19 08:50:04 +00:00
parent 55b3b19bbc
commit 055a7d47ed
2 changed files with 98 additions and 54 deletions

View File

@ -102,7 +102,7 @@ Fl_Tree::Fl_Tree(int X, int Y, int W, int H, const char *L) : Fl_Group(X,Y,W,H,L
#if FLTK_ABI_VERSION >= 10302
// NEW
_lastselect = 0;
_itemReselectMode = FL_TREE_SELECTABLE_ONCE;
_itemReselectMode = FL_TREE_SELECTABLE_ONCE;
#else
// OLD: data initialized static inside handle()
#endif
@ -1019,24 +1019,23 @@ int Fl_Tree::is_close(const char *path) const {
///
int Fl_Tree::select(Fl_Tree_Item *item, int docallback) {
int alreadySelected = item->is_selected();
if ( !alreadySelected
#if FLTK_ABI_VERSION >= 10302
|| item_reselect_mode()==FL_TREE_SELECTABLE_ALWAYS
#endif
) {
if ( !alreadySelected ) {
item->select();
set_changed();
if ( docallback ) {
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
do_callback_for_item(item, FL_TREE_REASON_SELECTED);
}
redraw();
return(1);
}
#if FLTK_ABI_VERSION >= 10302
// NEW
if ( alreadySelected ) {
if ( (item_reselect_mode() == FL_TREE_SELECTABLE_ALWAYS) && docallback ) {
do_callback_for_item(item, FL_TREE_REASON_RESELECTED);
}
}
#endif
return(0);
}
@ -1198,13 +1197,18 @@ 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()
#if FLTK_ABI_VERSION >= 10302
&& item_reselect_mode()!=FL_TREE_SELECTABLE_ALWAYS
// 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
) continue; // don't count if already selected
select(item, docallback);
++changed;
} else {

View File

@ -218,35 +218,43 @@ Function {} {open
} {
Fl_Window window {
label tree open
xywh {800 102 1015 445} type Double visible
xywh {709 21 1015 465} type Double visible
} {
Fl_Group tree {
label Tree
user_data 1234
callback {G_cb_counter++; // Increment callback counter whenever tree callback is invoked
\#if FLTK_ABI_VERSION >= 10302
tree->item_reselect_mode(FL_TREE_SELECTABLE_ALWAYS);
\#endif
Fl_Tree_Item *item = tree->callback_item();
if ( item ) {
fprintf(stderr, "TREE CALLBACK: label='%s' userdata=%ld reason=%s\\n",
fprintf(stderr, "TREE CALLBACK: label='%s' userdata=%ld reason=%s, changed=%d",
item->label(),
(long)(fl_intptr_t)tree->user_data(),
reason_as_name(tree->callback_reason()));
reason_as_name(tree->callback_reason()),
tree->changed() ? 1 : 0);
// More than one click? show click count
// Should only happen if reason==FL_TREE_REASON_RESELECTED.
//
if ( Fl::event_clicks() > 0 ) {
fprintf(stderr, ", clicks=%d\\n", (Fl::event_clicks()+1));
} else {
fprintf(stderr, "\\n");
}
} else {
fprintf(stderr, "TREE CALLBACK: reason=%s item=(no item -- probably multiple items were changed at once)\\n",
reason_as_name(tree->callback_reason()));
}} open selected
tooltip {Test tree} xywh {15 22 280 411} box DOWN_BOX color 55 selection_color 15
fprintf(stderr, "TREE CALLBACK: reason=%s, changed=%d, item=(no item -- probably multiple items were changed at once)\\n",
reason_as_name(tree->callback_reason()),
tree->changed() ? 1 : 0);
}
tree->clear_changed();} open
tooltip {Test tree} xywh {15 22 280 424} box DOWN_BOX color 55 selection_color 15
class Fl_Tree
} {}
Fl_Group {} {open
xywh {300 5 705 427}
xywh {300 5 705 440}
code0 {o->resizable(0);}
} {
Fl_Box {} {
label {Tree Globals}
tooltip {These controls only affect the selected items. If no items are selected, all existing items in tree are modified.} xywh {311 23 335 263} box GTK_DOWN_BOX color 47 labelsize 12 align 1
tooltip {These controls only affect the selected items. If no items are selected, all existing items in tree are modified.} xywh {311 23 334 280} box GTK_DOWN_BOX color 47 labelsize 12 align 1
}
Fl_Value_Slider margintop_slider {
label {margintop()}
@ -438,6 +446,35 @@ switch ( selectmode_chooser->value() ) {
xywh {60 60 36 21} labelsize 12
}
}
Fl_Choice reselectmode_chooser {
label {Item Reselect Mode}
callback {\#if FLTK_ABI_VERSION >= 10302
// NEW
// Set reselection mode
switch ( reselectmode_chooser->value() ) {
case 0: tree->item_reselect_mode(FL_TREE_SELECTABLE_ONCE); break;
case 1: tree->item_reselect_mode(FL_TREE_SELECTABLE_ALWAYS); break;
}
\#else
// OLD
reselectmode_chooser->deactivate(); // deactivate if this ABI feature is disabled
reselectmode_chooser->tooltip("DISABLED.\\n"
"Set FLTK_ABI_VERSION to 10302 (or higher)\\n"
"to get this feature");
\#endif} selected
tooltip {Enable 'reselect' events} xywh {486 168 140 21} down_box BORDER_BOX labelsize 12 textsize 11
code0 {reselectmode_chooser->value(1);}
code1 {reselectmode_chooser->do_callback();}
} {
MenuItem {} {
label {Selectable Once}
xywh {50 50 36 21} labelsize 12
}
MenuItem {} {
label {Selectable Always}
xywh {60 60 36 21} labelsize 12
}
}
Fl_Choice whenmode_chooser {
label When
callback {// Set when mode
@ -447,7 +484,7 @@ switch ( whenmode_chooser->value() ) {
case 2: tree->when(FL_WHEN_NEVER); break;
default: tree->when(FL_WHEN_RELEASE); break;
}}
tooltip {Sets when() the tree's callback is invoked} xywh {486 168 140 21} down_box BORDER_BOX labelsize 12 textsize 11
tooltip {Sets when() the tree's callback is invoked} xywh {486 192 140 21} down_box BORDER_BOX labelsize 12 textsize 11
code0 {whenmode_chooser->value(1);}
code1 {cb_whenmode_chooser(whenmode_chooser, (void*)0);}
} {
@ -468,7 +505,7 @@ switch ( whenmode_chooser->value() ) {
label {Enable user icons?}
user_data tree
callback {AssignUserIcons();}
tooltip {Tests Fl_Tree_Item::usericon()} xywh {486 194 20 16} down_box DOWN_BOX labelsize 12 align 7
tooltip {Tests Fl_Tree_Item::usericon()} xywh {486 221 20 16} down_box DOWN_BOX labelsize 12 align 7
code0 {usericon_radio->value(1);}
}
Fl_Check_Button showroot_radio {
@ -476,7 +513,7 @@ switch ( whenmode_chooser->value() ) {
user_data tree
callback {int onoff = showroot_radio->value();
tree->showroot(onoff);}
tooltip {Tests tree->showroot();} xywh {486 211 20 16} down_box DOWN_BOX labelsize 12 align 7
tooltip {Tests tree->showroot();} xywh {486 237 20 16} down_box DOWN_BOX labelsize 12 align 7
code0 {int onoff = tree->showroot(); showroot_radio->value(onoff);}
}
Fl_Check_Button visiblefocus_checkbox {
@ -484,7 +521,7 @@ tree->showroot(onoff);}
user_data tree
callback {int onoff = visiblefocus_checkbox->value();
tree->visible_focus(onoff);}
tooltip {Toggles the tree's visible_focus() box} xywh {486 228 20 16} down_box DOWN_BOX labelsize 12 align 7
tooltip {Toggles the tree's visible_focus() box} xywh {486 254 20 16} down_box DOWN_BOX labelsize 12 align 7
code0 {int onoff = tree->visible_focus(); visiblefocus_checkbox->value(onoff);}
}
Fl_Button selection_color_button {
@ -493,17 +530,17 @@ tree->visible_focus(onoff);}
selection_color_button->color(val); // update modified color to button
tree->selection_color(val);
tree->redraw();}
tooltip {Changes the tree widget's selection color. Tests Fl_Tree::selection_color()} xywh {486 251 16 16} box DOWN_BOX labelsize 12 align 7
tooltip {Changes the tree widget's selection color. Tests Fl_Tree::selection_color()} xywh {486 277 16 16} box DOWN_BOX labelsize 12 align 7
code0 {o->color(tree->selection_color());}
}
Fl_Box {} {
label {Test Operations}
tooltip {These controls only affect the defaults for new items that are created. These test the Fl_Tree_Prefs methods.} xywh {311 312 335 120} box GTK_DOWN_BOX color 47 labelsize 12 align 1
tooltip {These controls only affect the defaults for new items that are created. These test the Fl_Tree_Prefs methods.} xywh {311 325 335 120} box GTK_DOWN_BOX color 47 labelsize 12 align 1
}
Fl_Box showitem_box {
label {show_item()
}
xywh {331 335 70 82} box GTK_DOWN_BOX labelsize 11 align 1
xywh {331 348 70 82} box GTK_DOWN_BOX labelsize 11 align 1
}
Fl_Button {} {
label Show
@ -511,7 +548,7 @@ tree->redraw();}
tree->show_item(item);}
tooltip {Tests show_item() with no position specified.
Makes the selected item visible IF it is off-screen.
No change made if it is not off-screen.} xywh {346 344 40 17} labelsize 11
No change made if it is not off-screen.} xywh {346 357 40 17} labelsize 11
}
Fl_Button {} {
label Top
@ -523,7 +560,7 @@ Scrolls selected item to the top of the display
To use:
1) open '500 items'
2) select item 0010
3) Hit Top/Mid/Bot} xywh {346 361 40 16} labelsize 11
3) Hit Top/Mid/Bot} xywh {346 374 40 16} labelsize 11
}
Fl_Button {} {
label Mid
@ -534,7 +571,7 @@ Scrolls the selected item to the middle of the display
To use:
1) open '500 items'
2) select 'item 0010'
3) Hit Top/Mid/Bot} xywh {346 377 40 16} labelsize 11
3) Hit Top/Mid/Bot} xywh {346 390 40 16} labelsize 11
}
Fl_Button {} {
label Bot
@ -545,7 +582,7 @@ Scrolls the selected item to the bottom of the display
To use:
1) open '500 items'
2) select 'item 0010'
3) Hit Top/Mid/Bot} xywh {346 393 40 16} labelsize 11
3) Hit Top/Mid/Bot} xywh {346 406 40 16} labelsize 11
}
Fl_Button loaddb_button {
label {Load Database...}
@ -556,7 +593,7 @@ if (filename) {
tree->load(prefs);
tree->redraw();
}}
tooltip {Load the contents of an Fl_Preferences database into the tree view} xywh {431 338 95 16} labelsize 9
tooltip {Load the contents of an Fl_Preferences database into the tree view} xywh {431 351 95 16} labelsize 9
}
Fl_Button insertabove_button {
label {Insert Above}
@ -571,12 +608,12 @@ while (item) {
}
tree->redraw();}
tooltip {Inserts three items above the selected items} xywh {431 358 95 16} labelsize 9
tooltip {Inserts three items above the selected items} xywh {431 371 95 16} labelsize 9
}
Fl_Button rebuildtree_button {
label {Rebuild Tree}
callback {RebuildTree();}
tooltip {Rebuilds the tree with defaults} xywh {431 378 95 16} labelsize 9
tooltip {Rebuilds the tree with defaults} xywh {431 391 95 16} labelsize 9
}
Fl_Button showpathname_button {
label {Show Pathname}
@ -589,14 +626,14 @@ switch ( tree->item_pathname(pathname, sizeof(pathname), item) ) {
case -1: fl_message("item_pathname() returned -1 (NOT FOUND)"); break;
case -2: fl_message("item_pathname() returned -2 (STRING TOO LONG)"); break;
}}
tooltip {Show the pathname for the selected item. Tests the Fl_Tree::item_pathname() method.} xywh {431 398 95 16} labelsize 9
tooltip {Show the pathname for the selected item. Tests the Fl_Tree::item_pathname() method.} xywh {431 411 95 16} labelsize 9
}
Fl_Button clearall_button {
label {Clear All}
callback {tree->clear();
tree->redraw();}
tooltip {Clears all items
Tests Fl_Tree::clear()} xywh {531 338 95 16} labelsize 9
Tests Fl_Tree::clear()} xywh {531 351 95 16} labelsize 9
}
Fl_Button testcallbackflag_button {
label {Test Callback Flag}
@ -661,18 +698,18 @@ G_cb_counter = 0; tree->select("ROOT"); if ( !G_cb_counter ) fl_alert("FAIL
tree->deselect("ROOT"); // leave deselected
fl_alert("TEST COMPLETED\\n If you didn't see any error dialogs, test PASSED.");}
tooltip {Test the 'docallback' argument can disable callbacks.} xywh {531 358 95 16} labelsize 9
tooltip {Test the 'docallback' argument can disable callbacks.} xywh {531 371 95 16} labelsize 9
}
Fl_Button testrootshowself_button {
label {Root Show Self}
callback {Fl_Tree_Item *root = tree->root();
fprintf(stderr, "--- Show Tree\\n");
if (root) root->show_self();}
tooltip {Test the root->'show_self() method to show the entire tree} xywh {530 378 95 16} labelsize 9
tooltip {Test the root->'show_self() method to show the entire tree} xywh {530 391 95 16} labelsize 9
}
Fl_Box {} {
label {Selected Items}
tooltip {These controls only affect the selected items. If no items are selected, all existing items in tree are modified.} xywh {661 23 335 263} box GTK_DOWN_BOX color 47 labelsize 12 align 1
tooltip {These controls only affect the selected items. If no items are selected, all existing items in tree are modified.} xywh {661 23 335 280} box GTK_DOWN_BOX color 47 labelsize 12 align 1
}
Fl_Choice all_font_choice {
label {Label Font}
@ -1022,14 +1059,14 @@ else tree->deselect_all(item); // deselect /ROOT and its children}
}
Fl_Box {} {
label {New Item Defaults}
tooltip {These controls only affect the defaults for new items that are created. These test the Fl_Tree_Prefs methods.} xywh {661 312 335 120} box GTK_DOWN_BOX color 47 labelsize 12 align 1
tooltip {These controls only affect the defaults for new items that are created. These test the Fl_Tree_Prefs methods.} xywh {661 325 335 120} box GTK_DOWN_BOX color 47 labelsize 12 align 1
}
Fl_Button item_labelfgcolor_button {
label item_labelfgcolor
callback {Fl_Color val = EditColor(tree->item_labelfgcolor()); // Let user edit the color
tree->item_labelfgcolor(val); // apply modified color to tree
item_labelfgcolor_button->color(val); // update modified color to button}
tooltip {Sets the *default* label foreground color for new items created. Does NOT affect existing items.} xywh {828 327 16 16} box DOWN_BOX labelsize 12 align 7
tooltip {Sets the *default* label foreground color for new items created. Does NOT affect existing items.} xywh {828 340 16 16} box DOWN_BOX labelsize 12 align 7
code0 {o->color(tree->item_labelfgcolor());}
}
Fl_Button item_labelbgcolor_button {
@ -1037,14 +1074,14 @@ item_labelfgcolor_button->color(val); // update modified color to button}
callback {Fl_Color val = EditColor(tree->item_labelbgcolor()); // Let user edit the color
tree->item_labelbgcolor(val); // apply modified color to tree
item_labelbgcolor_button->color(val); // update modified color to button}
tooltip {Sets the *default* label background color for new items created. Does NOT affect existing items.} xywh {828 345 16 16} box DOWN_BOX labelsize 12 align 7
tooltip {Sets the *default* label background color for new items created. Does NOT affect existing items.} xywh {828 358 16 16} box DOWN_BOX labelsize 12 align 7
code0 {item_labelbgcolor_button->color(tree->item_labelbgcolor());}
}
Fl_Choice item_font_choice {
label {Item label font}
callback {Fl_Font val = (Fl_Font)item_font_choice->value(); // get chooser's current font value
tree->item_labelfont(val); // change font in tree}
tooltip {Sets the default font used for new items created. Does NOT affect existing items.} xywh {828 371 140 21} down_box BORDER_BOX labelsize 12 textsize 12
tooltip {Sets the default font used for new items created. Does NOT affect existing items.} xywh {828 384 140 21} down_box BORDER_BOX labelsize 12 textsize 12
code0 {o->value((int)tree->item_labelfont()); // get tree's current font, assign to chooser}
} {
MenuItem {} {
@ -1116,7 +1153,7 @@ tree->item_labelfont(val); // change font in tree}
label item_labelsize
user_data tree
callback {tree->item_labelsize((int)item_labelsize_slider->value());}
tooltip {Sets the default labelsize used for new items. Does NOT affect existing items.} xywh {828 396 140 16} type Horizontal labelsize 12 align 4 textsize 12
tooltip {Sets the default labelsize used for new items. Does NOT affect existing items.} xywh {828 409 140 16} type Horizontal labelsize 12 align 4 textsize 12
code0 {o->value((int)tree->item_labelsize());}
code1 {o->range(1.0, 50.0);}
code2 {o->step(1.0);}
@ -1171,7 +1208,7 @@ while (item) {
item = item->next();
}
tree->redraw();}
tooltip {Adds 20,000 items to the selected item's parent} xywh {530 398 95 16} labelsize 9
tooltip {Adds 20,000 items to the selected item's parent} xywh {530 411 95 16} labelsize 9
}
}
Fl_Box resizer_box {
@ -1180,6 +1217,9 @@ tree->redraw();}
}
code {// Initialize Tree
tree->root_label("ROOT");
\#if FLTK_ABI_VERSION >= 10302
tree->item_reselect_mode(FL_TREE_SELECTABLE_ALWAYS);
\#endif
RebuildTree();
/*tree->show_self();*/} {}
code {// FLTK stuff