summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2022-11-20 14:11:19 +0100
committerAlbrecht Schlosser <albrechts.fltk@online.de>2022-11-20 14:11:19 +0100
commitbe928430a6cc642b82bc1dfe6a94823ae0dd5016 (patch)
tree99ce8a1eefd47433a9f676c7fbccf245d3385a13
parent8a53fc96117de38cc63515ff2e94d435184dbe9e (diff)
Fix Fl_Group::insert() and Fl_Scroll::on_move()
-rw-r--r--src/Fl_Group.cxx7
-rw-r--r--src/Fl_Scroll.cxx9
2 files changed, 9 insertions, 7 deletions
diff --git a/src/Fl_Group.cxx b/src/Fl_Group.cxx
index f9bbcb541..a492a6ac9 100644
--- a/src/Fl_Group.cxx
+++ b/src/Fl_Group.cxx
@@ -513,8 +513,11 @@ void Fl_Group::insert(Fl_Widget &o, int 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) || (index < 0)) return; // this includes (children_ == 1)
- if (index >= children_) index = children_ - 1;
+ if (index < 0) return; // don't move: requested by subclass
+ if (index > children_)
+ index = children_;
+ if (index > n) index--; // compensate for removal and re-insertion
+ if (index == n) return; // same position; this includes (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 fd7f4fbae..bee0d7120 100644
--- a/src/Fl_Scroll.cxx
+++ b/src/Fl_Scroll.cxx
@@ -113,13 +113,12 @@ int Fl_Scroll::on_insert(Fl_Widget *candidate, int index) {
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
+ \param old_index the current index of the child that will be moved
+ \param new_index 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;
+int Fl_Scroll::on_move(int old_index, int new_index) {
+ return on_insert(child(old_index), new_index);
}
/**