diff options
| -rw-r--r-- | FL/Fl_Scroll.H | 4 | ||||
| -rw-r--r-- | src/Fl_Group.cxx | 15 | ||||
| -rw-r--r-- | src/Fl_Scroll.cxx | 18 |
3 files changed, 27 insertions, 10 deletions
diff --git a/FL/Fl_Scroll.H b/FL/Fl_Scroll.H index 1d4934389..1917c96fd 100644 --- a/FL/Fl_Scroll.H +++ b/FL/Fl_Scroll.H @@ -146,8 +146,8 @@ protected: // (STR#1895) protected: - virtual int on_insert(Fl_Widget*, int); - // virtual int on_move(int, int); // Not (yet) implemented. Do we need this? + int on_insert(Fl_Widget*, int); // override + int on_move(int, int); // override void fix_scrollbar_order(); void bbox(int&,int&,int&,int&) const; void draw(); diff --git a/src/Fl_Group.cxx b/src/Fl_Group.cxx index bcdb962f6..f9bbcb541 100644 --- a/src/Fl_Group.cxx +++ b/src/Fl_Group.cxx @@ -489,10 +489,9 @@ int Fl_Group::on_insert(Fl_Widget *candidate, int index) { By returning -1, Fl_Group::insert will not move the child. \param oldIndex the current index of the child that will be moved - \param newIndex the new index of the child, counted with the old - child already removed - \return index to position the child as planned - \return a new index to force the child to a different position + \param newIndex the new index of the child + \return \p newIndex to position the child as planned + \return a different index to force the child to a different position \return -1 to keep the group from moving the child */ int Fl_Group::on_move(int oldIndex, int newIndex) { @@ -511,11 +510,11 @@ void Fl_Group::insert(Fl_Widget &o, int index) { if (o.parent()) { Fl_Group* g = o.parent(); int n = g->find(o); - if (g == this) { // avoid expensive remove() and add() if we just move a widget within the group - if (index > n) index--; + if (g == this) { + // avoid expensive remove() and add() if we just move a widget within the group index = on_move(n, index); - if (index == n) return; // this includes (children_ == 1) - if (index >= children_ || index < 0) return; + if ((index == n) || (index < 0)) return; // this includes (children_ == 1) + if (index >= children_) index = children_ - 1; if (index > n) memmove(array_+n, array_+(n+1), (index-n) * sizeof(Fl_Widget*)); else diff --git a/src/Fl_Scroll.cxx b/src/Fl_Scroll.cxx index f218915a8..fd7f4fbae 100644 --- a/src/Fl_Scroll.cxx +++ b/src/Fl_Scroll.cxx @@ -105,6 +105,24 @@ int Fl_Scroll::on_insert(Fl_Widget *candidate, int index) { } /** + Change new position of a child before it is moved. + + Fix new position if the new child is planned to be moved after the scrollbars. + We can assume that the scrollbars are always the last two children! + + Fl_Group calls this when a widget is moved within the list of children. + We return a new index if the widget would be moved after the scrollbars. + + \param oldIndex the current index of the child that will be moved + \param newIndex the new index of the child + \return new index, possibly corrected to avoid last two scrollbar entries + */ +int Fl_Scroll::on_move(int oldIndex, int newIndex) { + // Compensate index for the widget that will be removed before it re-inserted + return on_insert( child(oldIndex), newIndex+1 ) - 1; +} + +/** Removes the widget at \p index from the group and deletes it. This method does nothing if \p index is out of bounds or |
