diff options
| -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); | 
