diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2024-07-19 14:35:41 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> | 2024-07-19 19:59:32 +0300 | 
| commit | 54c15a7054af296a62b91f677b11a97cea94bfe8 (patch) | |
| tree | a55f7717a04ed7c37ccb9d4f85f49c4f9b3b4463 | |
| parent | f0d7ccdbe0ccadb47847ca9ed2939c7c8ed06788 (diff) | |
viewer#1923 Fix dependent floater going too far from parent
| -rw-r--r-- | indra/llui/llfloater.cpp | 56 | 
1 files changed, 48 insertions, 8 deletions
| diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index d0eb9a1873..12d5c41de1 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1205,24 +1205,64 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)              {                  S32 delta_x = 0;                  S32 delta_y = 0; + +                // take translation of dependee floater into account +                delta_x += new_rect.mLeft - old_rect.mLeft; +                delta_y += new_rect.mBottom - old_rect.mBottom; +                  // check to see if it snapped to right or top, and move if dependee floater is resizing                  LLRect dependent_rect = floaterp->getRect(); -                if (dependent_rect.mLeft - getRect().mLeft >= old_rect.getWidth() || // dependent on my right? -                    dependent_rect.mRight == getRect().mLeft + old_rect.getWidth()) // dependent aligned with my right +                if ((dependent_rect.mLeft - getRect().mLeft >= old_rect.getWidth() || // dependent on my right? +                     dependent_rect.mRight == getRect().mLeft + old_rect.getWidth()) // dependent aligned with my right +                    && dependent_rect.mBottom <= old_rect.mTop + 1)                  {                      // was snapped directly onto right side or aligned with it                      delta_x += new_rect.getWidth() - old_rect.getWidth(); + +                    // make sure dependent still touches floater and din't go too high, +                    // it can go over edge, but should't detach completely +                    if (delta_y > 0 +                        && dependent_rect.mBottom + delta_y > new_rect.mTop) +                    { +                        delta_y = llmax(new_rect.mTop - dependent_rect.mBottom, 0); +                    } +                } +                else if (dependent_rect.mRight == old_rect.mLeft) +                { +                    // make sure dependent still touches floater and don't go too high +                    if (delta_y > 0 +                        && dependent_rect.mBottom <= old_rect.mTop +                        && dependent_rect.mBottom + delta_y > new_rect.mTop) +                    { +                        delta_y = llmax(new_rect.mTop - dependent_rect.mBottom, 0); +                    }                  } -                if (dependent_rect.mBottom - getRect().mBottom >= old_rect.getHeight() || -                    dependent_rect.mTop == getRect().mBottom + old_rect.getHeight()) + +                if ((dependent_rect.mBottom - getRect().mBottom >= old_rect.getHeight() || +                     dependent_rect.mTop == getRect().mBottom + old_rect.getHeight()) +                    && dependent_rect.mLeft <= old_rect.mRight + 1)                  {                      // was snapped directly onto top side or aligned with it                      delta_y += new_rect.getHeight() - old_rect.getHeight(); -                } -                // take translation of dependee floater into account as well -                delta_x += new_rect.mLeft - old_rect.mLeft; -                delta_y += new_rect.mBottom - old_rect.mBottom; +                    // make sure dependent still touches floater +                    // and din't go too far to the right +                    if (delta_x > 0 +                        && dependent_rect.mLeft + delta_x > new_rect.mRight) +                    { +                        delta_x = llmax(new_rect.mRight - dependent_rect.mLeft, 0); +                    } +                } +                else if (dependent_rect.mTop == old_rect.mBottom) +                { +                    // make sure dependent still touches floater and don't go too far to the right +                    if (delta_x > 0 +                        && dependent_rect.mLeft <= old_rect.mRight +                        && dependent_rect.mLeft + delta_x > new_rect.mRight) +                    { +                        delta_x = llmax(new_rect.mRight - dependent_rect.mLeft, 0); +                    } +                }                  dependent_rect.translate(delta_x, delta_y);                  floaterp->setShape(dependent_rect, by_user); | 
