Fix rearranging children in Fl_Scroll (#546)

Implement Fl_Scroll::on_move()
Fix indexing in Fl_Group::on_move()
This commit is contained in:
Matthias Melcher 2022-11-17 08:34:06 +01:00 committed by GitHub
parent 402764f5c1
commit 72415b534d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 10 deletions

View File

@ -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();

View File

@ -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

View File

@ -104,6 +104,24 @@ int Fl_Scroll::on_insert(Fl_Widget *candidate, int index) {
return 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.