summaryrefslogtreecommitdiff
path: root/indra/llui
diff options
context:
space:
mode:
authorRichard Linden <none@none>2012-01-31 15:34:32 -0800
committerRichard Linden <none@none>2012-01-31 15:34:32 -0800
commit20b46ef6f626c8c7960a4b9c02cae518448497b7 (patch)
tree87590c216d43eaf5ec081a98b2dbabd6da75e075 /indra/llui
parentf3ddb75b0373f22fe0bb2f46b0a30f018bddc0ee (diff)
EXP-1851 FIX Crash when trying to resize the bottom sections
more layout logic fixes and added renormalization to fractional sizes to eliminate drift
Diffstat (limited to 'indra/llui')
-rw-r--r--indra/llui/lllayoutstack.cpp56
-rw-r--r--indra/llui/lllayoutstack.h6
2 files changed, 31 insertions, 31 deletions
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index f43b84794d..88c2218f24 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -129,6 +129,10 @@ void LLLayoutPanel::setOrientation( LLLayoutStack::ELayoutOrientation orientatio
? getRect().getWidth()
: getRect().getHeight()));
+ if (mAutoResize == FALSE && mMinDim == -1)
+ {
+ setMinDim(layout_dim);
+ }
mTargetDim = llmax(layout_dim, getMinDim());
}
@@ -246,7 +250,7 @@ void LLLayoutStack::removeChild(LLView* view)
{
mPanels.erase(std::find(mPanels.begin(), mPanels.end(), embedded_panelp));
delete embedded_panelp;
- updateFractionalSizes();
+ normalizeFractionalSizes();
mNeedsLayout = true;
}
@@ -271,7 +275,7 @@ bool LLLayoutStack::addChild(LLView* child, S32 tab_group)
}
BOOL result = LLView::addChild(child, tab_group);
- updateFractionalSizes();
+ normalizeFractionalSizes();
return result;
}
@@ -306,7 +310,6 @@ void LLLayoutStack::updateLayout()
bool animation_in_progress = animatePanels();
F32 total_visible_fraction = 0.f;
- F32 total_open_fraction = 0.f;
S32 space_to_distribute = (mOrientation == HORIZONTAL)
? getRect().getWidth()
: getRect().getHeight();
@@ -318,20 +321,17 @@ void LLLayoutStack::updateLayout()
if (panelp->mAutoResize)
{
panelp->mTargetDim = panelp->getRelevantMinDim();
- if (!panelp->mCollapsed && panelp->getVisible())
- {
- total_open_fraction += panelp->mFractionalSize;
- }
}
space_to_distribute -= panelp->getVisibleDim() + llround((F32)mPanelSpacing * panelp->getVisibleAmount());
- total_visible_fraction += panelp->mFractionalSize;
+ total_visible_fraction += panelp->mFractionalSize * panelp->getVisibleAmount();
}
- llassert(total_visible_fraction < 1.01f);
+ llassert(total_visible_fraction < 1.05f);
// don't need spacing after last panel
space_to_distribute += panelp ? llround((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0;
+ S32 remaining_space = space_to_distribute;
F32 fraction_distributed = 0.f;
if (space_to_distribute > 0 && total_visible_fraction > 0.f)
{ // give space proportionally to visible auto resize panels
@@ -343,26 +343,23 @@ void LLLayoutStack::updateLayout()
S32 delta = llround((F32)space_to_distribute * fraction_to_distribute);
fraction_distributed += fraction_to_distribute;
panelp->mTargetDim += delta;
+ remaining_space -= delta;
}
}
}
- if (fraction_distributed < total_visible_fraction)
- { // distribute any left over pixels to non-collapsed, visible panels
- F32 fraction_left = total_visible_fraction - fraction_distributed;
- S32 space_left = llround((F32)space_to_distribute * (fraction_left / total_visible_fraction));
+ // distribute any left over pixels to non-collapsed, visible panels
+ BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ {
+ if (remaining_space == 0) break;
- BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)
+ if (panelp->mAutoResize
+ && !panelp->mCollapsed
+ && panelp->getVisible())
{
- if (panelp->mAutoResize
- && !panelp->mCollapsed
- && panelp->getVisible())
- {
- S32 space_for_panel = llmax(0, llround((F32)space_left * (panelp->mFractionalSize / total_open_fraction)));
- panelp->mTargetDim += space_for_panel;
- space_left -= space_for_panel;
- total_open_fraction -= panelp->mFractionalSize;
- }
+ S32 space_for_panel = remaining_space > 0 ? 1 : -1;
+ panelp->mTargetDim += space_for_panel;
+ remaining_space -= space_for_panel;
}
}
@@ -492,7 +489,7 @@ void LLLayoutStack::updateClass()
}
}
-void LLLayoutStack::updateFractionalSizes()
+void LLLayoutStack::normalizeFractionalSizes()
{
F32 total_resizable_dim = 0;
S32 num_auto_resize_panels = 0;
@@ -691,7 +688,9 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
case BEFORE_RESIZED_PANEL:
if (panelp->mAutoResize)
{ // freeze current size as fraction of overall auto_resize space
- F32 fractional_adjustment_factor = total_auto_resize_headroom / updated_auto_resize_headroom;
+ F32 fractional_adjustment_factor = updated_auto_resize_headroom == 0.f
+ ? 1.f
+ : total_auto_resize_headroom / updated_auto_resize_headroom;
F32 new_fractional_size = llclamp(panelp->mFractionalSize * fractional_adjustment_factor,
MIN_FRACTIONAL_SIZE,
MAX_FRACTIONAL_SIZE);
@@ -720,7 +719,6 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
else
{ // freeze new size as original size
panelp->mTargetDim = new_dim;
- fraction_remaining -= fraction_given_up;
}
which_panel = NEXT_PANEL;
break;
@@ -728,7 +726,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
if (panelp->mAutoResize)
{
fraction_remaining -= panelp->mFractionalSize;
- if (fraction_given_up != 0.f)
+ if (resized_panel->mAutoResize)
{
panelp->mFractionalSize = llclamp(panelp->mFractionalSize + fraction_given_up, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);
fraction_given_up = 0.f;
@@ -750,7 +748,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
which_panel = AFTER_RESIZED_PANEL;
break;
case AFTER_RESIZED_PANEL:
- if (panelp->mAutoResize)
+ if (panelp->mAutoResize && fraction_given_up != 0.f)
{
panelp->mFractionalSize = llclamp(panelp->mFractionalSize + (panelp->mFractionalSize / fraction_remaining) * fraction_given_up,
MIN_FRACTIONAL_SIZE,
@@ -760,6 +758,8 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&
break;
}
}
+ updateLayout();
+ normalizeFractionalSizes();
}
void LLLayoutStack::reshape(S32 width, S32 height, BOOL called_from_parent)
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 6c14a56444..4a8702e318 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -72,7 +72,7 @@ public:
/*virtual*/ void draw();
/*virtual*/ void removeChild(LLView*);
/*virtual*/ BOOL postBuild();
- /*virtual*/ bool addChild(LLView* child, S32 tab_group = 0);
+ /*virtual*/ bool addChild(LLView* child, S32 tab_groupdatefractuiona = 0);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
@@ -111,7 +111,7 @@ private:
LLLayoutPanel* findEmbeddedPanel(LLPanel* panelp) const;
LLLayoutPanel* findEmbeddedPanelByName(const std::string& name) const;
- void updateFractionalSizes();
+ void normalizeFractionalSizes();
void updatePanelRect( LLLayoutPanel* param1, const LLRect& new_rect );
S32 mPanelSpacing;
@@ -154,7 +154,7 @@ public:
void setVisible(BOOL visible);
S32 getLayoutDim() const;
- S32 getMinDim() const { return (mMinDim >= 0 || mAutoResize) ? llmax(0, mMinDim) : getLayoutDim(); }
+ S32 getMinDim() const { return llmax(0, mMinDim); }
void setMinDim(S32 value) { mMinDim = value; }
S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : getMinDim(); }