Author: greg.ercolano
Date: 2012-04-19 01:50:04 -0700 (Thu, 19 Apr 2012)
New Revision: 9358
Log:
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)



Modified:
   branches/branch-1.3/src/Fl_Tree.cxx
   branches/branch-1.3/test/tree.fl

Modified: branches/branch-1.3/src/Fl_Tree.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Tree.cxx 2012-04-19 00:34:40 UTC (rev 9357)
+++ branches/branch-1.3/src/Fl_Tree.cxx 2012-04-19 08:50:04 UTC (rev 9358)
@@ -102,7 +102,7 @@
 #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::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 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 {

Modified: branches/branch-1.3/test/tree.fl
===================================================================
--- branches/branch-1.3/test/tree.fl    2012-04-19 00:34:40 UTC (rev 9357)
+++ branches/branch-1.3/test/tree.fl    2012-04-19 08:50:04 UTC (rev 9358)
@@ -218,35 +218,43 @@
 } {
   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 @@
           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 @@
   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 @@
         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 @@
         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 @@
         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 @@
 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->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 @@
 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 @@
 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 @@
 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 @@
   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 @@
 }
 
 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 @@
     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 @@
 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 @@
       }
       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 @@
         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 @@
         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 @@
     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 @@
   }
   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

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to