summaryrefslogtreecommitdiff
path: root/src/Fl_Tree.cxx
diff options
context:
space:
mode:
authorFabien Costantini <fabien@onepost.net>2012-04-15 20:11:36 +0000
committerFabien Costantini <fabien@onepost.net>2012-04-15 20:11:36 +0000
commitb31264e473d9475d80d7d4cf7964f2b0051bfcba (patch)
tree9b8f8707323b980cd0254c7dba7c0562ed9cdfc9 /src/Fl_Tree.cxx
parentefe0b2b939a7135b957acd626e3877f2375d6d62 (diff)
STR 2827 implementation. Implemented Reselect code and related API all within ABI controlled preprocessor blocks because of new attribute defintion would break ABI anyway. Because the code is already ABI controlled, I took the opportunity to keep keep the REASON enum sorted. Added test code in Tree.fl adequately.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9347 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_Tree.cxx')
-rw-r--r--src/Fl_Tree.cxx33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/Fl_Tree.cxx b/src/Fl_Tree.cxx
index 0635c7d05..08934ce03 100644
--- a/src/Fl_Tree.cxx
+++ b/src/Fl_Tree.cxx
@@ -98,10 +98,11 @@ Fl_Tree::Fl_Tree(int X, int Y, int W, int H, const char *L) : Fl_Group(X,Y,W,H,L
_callback_item = 0;
_callback_reason = FL_TREE_REASON_NONE;
_scrollbar_size = 0; // 0: uses Fl::scrollbar_size()
-
+
#if FLTK_ABI_VERSION >= 10302
// NEW
_lastselect = 0;
+ _itemReselectMode = FL_TREE_SELECTABLE_ONCE;
#else
// OLD: data initialized static inside handle()
#endif
@@ -257,7 +258,8 @@ int Fl_Tree::handle(int e) {
// fprintf(stderr, "ERCODEBUG: Fl_Tree::handle(): Event was %s (%d)\n", fl_eventnames[e], e); // DEBUGGING
if ( ! _root ) return(ret);
switch ( e ) {
- case FL_PUSH: { // clicked on a tree item?
+ case FL_PUSH: {
+ // clicked on a tree item?
if (Fl::visible_focus() && handle(FL_FOCUS)) {
Fl::focus(this);
}
@@ -273,6 +275,7 @@ int Fl_Tree::handle(int e) {
} else if ( o->event_on_label(_prefs) && // label clicked?
(!o->widget() || !Fl::event_inside(o->widget())) && // not inside widget
(!_vscroll->visible() || !Fl::event_inside(_vscroll)) ) { // not on scroller
+
switch ( _prefs.selectmode() ) {
case FL_TREE_SELECT_NONE:
break;
@@ -995,13 +998,25 @@ int Fl_Tree::is_close(const char *path) const {
/// - 0 - item was already selected, no change was made
///
int Fl_Tree::select(Fl_Tree_Item *item, int docallback) {
- if ( ! item->is_selected() ) {
+ int alreadySelected = item->is_selected();
+
+ if ( !alreadySelected
+#if FLTK_ABI_VERSION >= 10302
+ || item_reselect_mode()==FL_TREE_SELECTABLE_ALWAYS
+#endif
+ ) {
item->select();
set_changed();
if ( docallback ) {
- do_callback_for_item(item, FL_TREE_REASON_SELECTED);
+ 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
}
- redraw();
+
+ redraw();
return(1);
}
return(0);
@@ -1165,7 +1180,13 @@ 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() ) continue; // don't count if already selected
+ if ( item->is_selected()
+
+#if FLTK_ABI_VERSION >= 10302
+ && item_reselect_mode()!=FL_TREE_SELECTABLE_ALWAYS
+#endif
+
+ ) continue; // don't count if already selected
select(item, docallback);
++changed;
} else {