Author: fabien
Date: 2012-04-15 14:16:48 -0700 (Sun, 15 Apr 2012)
New Revision: 9349
Log:
Applied STR 2827 changes back to fltk3.

Modified:
   branches/branch-3.0/examples/tree-simple.cxx
   branches/branch-3.0/include/FL/Fl_Tree.H
   branches/branch-3.0/include/fltk3/Tree.h
   branches/branch-3.0/src/fltk3/Tree.cxx

Modified: branches/branch-3.0/examples/tree-simple.cxx
===================================================================
--- branches/branch-3.0/examples/tree-simple.cxx        2012-04-15 20:47:02 UTC 
(rev 9348)
+++ branches/branch-3.0/examples/tree-simple.cxx        2012-04-15 21:16:48 UTC 
(rev 9349)
@@ -44,6 +44,12 @@
       fprintf(stderr, "TreeCallback: Item selected='%s', Full 
pathname='%s'\n", item->label(), pathname);
       break;
     }
+    case FL_TREE_REASON_RESELECTED: {
+      char pathname[256];
+      tree->item_pathname(pathname, sizeof(pathname), item);
+      fprintf(stderr, "TreeCallback: Item reselected='%s', Full 
pathname='%s'\n", item->label(), pathname);
+      break;
+    }
     case FL_TREE_REASON_DESELECTED:
       // fprintf(stderr, "TreeCallback: Item '%s' deselected\n", 
item->label());
       break;

Modified: branches/branch-3.0/include/FL/Fl_Tree.H
===================================================================
--- branches/branch-3.0/include/FL/Fl_Tree.H    2012-04-15 20:47:02 UTC (rev 
9348)
+++ branches/branch-3.0/include/FL/Fl_Tree.H    2012-04-15 21:16:48 UTC (rev 
9349)
@@ -44,11 +44,11 @@
   FL_TREE_REASON_NONE=0,
   FL_TREE_REASON_SELECTED,
   FL_TREE_REASON_DESELECTED,
+  FL_TREE_REASON_RESELECTED,
   FL_TREE_REASON_OPENED,
   FL_TREE_REASON_CLOSED
 };
 
-
 FLTK3_WRAPPER_INTERFACE_BEGIN(Fl_Tree, Tree)
 FLTK3_WRAPPER_INTERFACE_WIDGET(Fl_Tree, Tree)
 FLTK3_WRAPPER_INTERFACE_END()
@@ -56,6 +56,29 @@
 
 class FL_EXPORT Fl_Tree : public Fl_Group {
 
+public:
+  /// \enum Fl_Tree_Item_Select_Mode
+  /// Defines the ways an item can be (re) selected.
+  ///
+  enum Fl_Tree_Item_Reselect_Mode
+  {
+    FL_TREE_SELECTABLE_ONCE=0, /// backward compatible default: an item can 
only be selected once
+    FL_TREE_SELECTABLE_ALWAYS  /// needed for new RESELECT feature
+  };
+       
+  //! Returns the current item re/selection mode
+  Fl_Tree_Item_Reselect_Mode item_reselect_mode() const {
+       return _itemReselectMode;
+  }
+  
+  //! Sets the item re/selection mode
+  void item_reselect_mode(Fl_Tree_Item_Reselect_Mode mode) {
+       _itemReselectMode = mode;
+  }
+
+private:
+       Fl_Tree_Item_Reselect_Mode _itemReselectMode;
+
 protected:
 
   // Fl_Scrollbar *_vscroll;

Modified: branches/branch-3.0/include/fltk3/Tree.h
===================================================================
--- branches/branch-3.0/include/fltk3/Tree.h    2012-04-15 20:47:02 UTC (rev 
9348)
+++ branches/branch-3.0/include/fltk3/Tree.h    2012-04-15 21:16:48 UTC (rev 
9349)
@@ -127,6 +127,7 @@
   ///   switch ( tree->callback_reason() ) {
   ///     case fltk3::TREE_REASON_SELECTED: [..]
   ///     case fltk3::TREE_REASON_DESELECTED: [..]
+  ///     case fltk3::TREE_REASON_RESELECTED: [..]
   ///     case fltk3::TREE_REASON_OPENED: [..]
   ///     case fltk3::TREE_REASON_CLOSED: [..]
   ///   }
@@ -194,6 +195,7 @@
     TREE_REASON_NONE=0,        ///< unknown reason
     TREE_REASON_SELECTED,      ///< an item was selected
     TREE_REASON_DESELECTED,    ///< an item was de-selected
+    TREE_REASON_RESELECTED,    ///< an item was re-selected
     TREE_REASON_OPENED,        ///< an item was opened
     TREE_REASON_CLOSED         ///< an item was closed
   };
@@ -207,7 +209,30 @@
     fltk3::TreeReason _callback_reason;                // reason for the 
callback
     fltk3::TreePrefs  _prefs;                  // all the tree's settings
     int            _scrollbar_size;            // size of scrollbar trough
+  
+  public:
+    /// \enum Fl_Tree_Item_Select_Mode
+    /// Defines the ways an item can be (re) selected.
+    ///
+    enum Tree_Item_Reselect_Mode
+    {
+      TREE_SELECTABLE_ONCE=0, /// backward compatible default: an item can 
only be selected once
+      TREE_SELECTABLE_ALWAYS, /// needed for new RESELECT feature
+    };
     
+    //! Returns the current item re/selection mode
+    Tree_Item_Reselect_Mode item_reselect_mode() const {
+      return _itemReselectMode;
+    }
+  
+    //! Sets the item re/selection mode
+    void item_reselect_mode(Tree_Item_Reselect_Mode mode) {
+      _itemReselectMode = mode;
+    }
+
+  private:
+    Tree_Item_Reselect_Mode _itemReselectMode;
+
   protected:
     /// Vertical scrollbar
     fltk3::Scrollbar *_vscroll;
@@ -526,11 +551,14 @@
     ///     -   0 - item was already selected, no change was made
     ///
     int select(fltk3::TreeItem *item, int docallback=1) {
-      if ( ! item->is_selected() ) {
-        item->select();
-        set_changed();
-        if ( docallback ) {
-          do_callback_for_item(item, fltk3::TREE_REASON_SELECTED);
+      int alreadySelected = item->is_selected();
+  
+      if ( !alreadySelected || item_reselect_mode()== TREE_SELECTABLE_ALWAYS ) 
{
+       item->select();
+       set_changed();
+       if ( docallback ) {
+         do_callback_for_item(item, alreadySelected ? 
+                              TREE_REASON_RESELECTED : TREE_REASON_SELECTED);
         }
         redraw();
         return(1);

Modified: branches/branch-3.0/src/fltk3/Tree.cxx
===================================================================
--- branches/branch-3.0/src/fltk3/Tree.cxx      2012-04-15 20:47:02 UTC (rev 
9348)
+++ branches/branch-3.0/src/fltk3/Tree.cxx      2012-04-15 21:16:48 UTC (rev 
9349)
@@ -104,6 +104,8 @@
   _callback_item   = 0;
   _callback_reason = fltk3::TREE_REASON_NONE;
   _scrollbar_size  = 0;                                // 0: uses 
fltk3::scrollbar_size()
+  _itemReselectMode = TREE_SELECTABLE_ONCE;
+
   box(fltk3::DOWN_BOX);
   color(fltk3::BACKGROUND2_COLOR, fltk3::SELECTION_COLOR);
   when(fltk3::WHEN_CHANGED);
@@ -796,7 +798,8 @@
   int changed = 0;
   for ( fltk3::TreeItem *item = first(); item; item = item->next() ) {
     if ( item == selitem ) {
-      if ( item->is_selected() ) continue;     // don't count if already 
selected
+      if ( item->is_selected() &&  item_reselect_mode()!=TREE_SELECTABLE_ALWAYS
+) continue;    // don't count if already selected
       select(item, docallback);
       ++changed;
     } else {

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

Reply via email to