EXP-1228 FIX Create toolbar widget class that displays list of buttons horizontally or vertically
buttons are now centered and sized according to content created floater_test_toolbar.xml to testmaster
parent
3df9545017
commit
64f30a302d
|
|
@ -314,7 +314,7 @@ boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t
|
|||
}
|
||||
|
||||
|
||||
// *TODO: Deprecate (for backwards compatability only)
|
||||
// *TODO: Deprecate (for backwards compatibility only)
|
||||
boost::signals2::connection LLButton::setClickedCallback( button_callback_t cb, void* data )
|
||||
{
|
||||
return setClickedCallback(boost::bind(cb, data));
|
||||
|
|
@ -919,7 +919,7 @@ void LLButton::setToggleState(BOOL b)
|
|||
|
||||
void LLButton::setFlashing( BOOL b )
|
||||
{
|
||||
if (b != mFlashing)
|
||||
if ((bool)b != mFlashing)
|
||||
{
|
||||
mFlashing = b;
|
||||
mFlashingTimer.reset();
|
||||
|
|
|
|||
|
|
@ -327,15 +327,14 @@ private:
|
|||
LLUIColor mImageColor;
|
||||
LLUIColor mDisabledImageColor;
|
||||
|
||||
BOOL mIsToggle;
|
||||
BOOL mScaleImage;
|
||||
bool mIsToggle;
|
||||
bool mScaleImage;
|
||||
|
||||
BOOL mDropShadowedText;
|
||||
BOOL mAutoResize;
|
||||
BOOL mUseEllipses;
|
||||
BOOL mBorderEnabled;
|
||||
|
||||
BOOL mFlashing;
|
||||
bool mDropShadowedText;
|
||||
bool mAutoResize;
|
||||
bool mUseEllipses;
|
||||
bool mBorderEnabled;
|
||||
bool mFlashing;
|
||||
|
||||
LLFontGL::HAlign mHAlign;
|
||||
S32 mLeftHPad;
|
||||
|
|
@ -355,9 +354,9 @@ private:
|
|||
F32 mHoverGlowStrength;
|
||||
F32 mCurGlowStrength;
|
||||
|
||||
BOOL mNeedsHighlight;
|
||||
BOOL mCommitOnReturn;
|
||||
BOOL mFadeWhenDisabled;
|
||||
bool mNeedsHighlight;
|
||||
bool mCommitOnReturn;
|
||||
bool mFadeWhenDisabled;
|
||||
bool mForcePressedState;
|
||||
|
||||
LLFrameTimer mFlashingTimer;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ LLLayoutPanel::LLLayoutPanel(const Params& p)
|
|||
mMaxDim(p.max_dim),
|
||||
mAutoResize(p.auto_resize),
|
||||
mUserResize(p.user_resize),
|
||||
mFitContent(p.fit_content),
|
||||
mCollapsed(FALSE),
|
||||
mCollapseAmt(0.f),
|
||||
mVisibleAmt(1.f), // default to fully visible
|
||||
|
|
@ -104,6 +105,14 @@ F32 LLLayoutPanel::getCollapseFactor(LLLayoutStack::ELayoutOrientation orientati
|
|||
}
|
||||
}
|
||||
|
||||
void LLLayoutPanel::fitToContent()
|
||||
{
|
||||
if (mFitContent)
|
||||
{
|
||||
setShape(calcBoundingRect());
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// LLLayoutStack
|
||||
//
|
||||
|
|
@ -324,6 +333,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
|
|||
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
|
||||
{
|
||||
LLLayoutPanel* panelp = (*panel_it);
|
||||
panelp->fitToContent();
|
||||
if (panelp->getVisible())
|
||||
{
|
||||
if (mAnimate)
|
||||
|
|
@ -478,7 +488,9 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
|
|||
{
|
||||
// shrink proportionally to amount over minimum
|
||||
// so we can do this in one pass
|
||||
delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_width - relevant_min) / (F32)shrink_headroom_available)) : 0;
|
||||
delta_size = (shrink_headroom_available > 0)
|
||||
? llround((F32)pixels_to_distribute * ((F32)(cur_width - relevant_min) / (F32)shrink_headroom_available))
|
||||
: 0;
|
||||
shrink_headroom_available -= (cur_width - relevant_min);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -161,14 +161,16 @@ public:
|
|||
min_dim,
|
||||
max_dim;
|
||||
Optional<bool> user_resize,
|
||||
auto_resize;
|
||||
auto_resize,
|
||||
fit_content;
|
||||
|
||||
Params()
|
||||
: expanded_min_dim("expanded_min_dim", 0),
|
||||
min_dim("min_dim", 0),
|
||||
max_dim("max_dim", 0),
|
||||
user_resize("user_resize", true),
|
||||
auto_resize("auto_resize", true)
|
||||
auto_resize("auto_resize", true),
|
||||
fit_content("fit_content", false)
|
||||
{
|
||||
addSynonym(min_dim, "min_width");
|
||||
addSynonym(min_dim, "min_height");
|
||||
|
|
@ -206,18 +208,20 @@ protected:
|
|||
LLLayoutPanel(const Params& p);
|
||||
|
||||
F32 getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation);
|
||||
void fitToContent();
|
||||
|
||||
bool mExpandedMinDimSpecified;
|
||||
S32 mExpandedMinDim;
|
||||
bool mExpandedMinDimSpecified;
|
||||
S32 mExpandedMinDim;
|
||||
|
||||
S32 mMinDim;
|
||||
S32 mMaxDim;
|
||||
BOOL mAutoResize;
|
||||
BOOL mUserResize;
|
||||
BOOL mCollapsed;
|
||||
S32 mMinDim;
|
||||
S32 mMaxDim;
|
||||
bool mAutoResize;
|
||||
bool mUserResize;
|
||||
bool mCollapsed;
|
||||
bool mFitContent;
|
||||
F32 mVisibleAmt;
|
||||
F32 mCollapseAmt;
|
||||
class LLResizeBar* mResizeBar;
|
||||
F32 mVisibleAmt;
|
||||
F32 mCollapseAmt;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -41,37 +41,118 @@ LLToolBar::LLToolBar(const Params& p)
|
|||
: LLUICtrl(p),
|
||||
mOrientation(p.orientation),
|
||||
mStack(NULL)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void LLToolBar::draw()
|
||||
{
|
||||
gl_rect_2d(getLocalRect(), LLColor4::blue, TRUE);
|
||||
}
|
||||
{}
|
||||
|
||||
void LLToolBar::initFromParams(const LLToolBar::Params& p)
|
||||
{
|
||||
LLLayoutStack::Params centering_stack_p;
|
||||
centering_stack_p.rect = getLocalRect();
|
||||
centering_stack_p.follows.flags = FOLLOWS_ALL;
|
||||
centering_stack_p.orientation = p.orientation;
|
||||
centering_stack_p.name = "centering_stack";
|
||||
|
||||
LLLayoutPanel::Params border_panel_p;
|
||||
border_panel_p.name = "border_panel";
|
||||
border_panel_p.rect = getLocalRect();
|
||||
border_panel_p.auto_resize = true;
|
||||
border_panel_p.user_resize = false;
|
||||
|
||||
LLLayoutStack* centering_stack = LLUICtrlFactory::create<LLLayoutStack>(centering_stack_p);
|
||||
addChild(centering_stack);
|
||||
|
||||
LLLayoutPanel::Params center_panel_p;
|
||||
center_panel_p.name = "center_panel";
|
||||
center_panel_p.rect = getLocalRect();
|
||||
center_panel_p.auto_resize = false;
|
||||
center_panel_p.user_resize = false;
|
||||
center_panel_p.fit_content = true;
|
||||
|
||||
centering_stack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
|
||||
LLLayoutPanel* center_panel = LLUICtrlFactory::create<LLLayoutPanel>(center_panel_p);
|
||||
centering_stack->addChild(center_panel);
|
||||
centering_stack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p));
|
||||
|
||||
LLLayoutStack::Params stack_p;
|
||||
stack_p.rect = getLocalRect();
|
||||
stack_p.follows.flags = FOLLOWS_ALL;
|
||||
stack_p.name = "button_stack";
|
||||
stack_p.orientation = p.orientation;
|
||||
stack_p.follows.flags = (mOrientation == LLLayoutStack::HORIZONTAL)
|
||||
? (FOLLOWS_TOP|FOLLOWS_BOTTOM) // horizontal
|
||||
: (FOLLOWS_LEFT|FOLLOWS_RIGHT); // vertical
|
||||
|
||||
mStack = LLUICtrlFactory::create<LLLayoutStack>(stack_p);
|
||||
addChild(mStack);
|
||||
center_panel->addChild(mStack);
|
||||
|
||||
BOOST_FOREACH (LLButton::Params button_p, p.buttons)
|
||||
BOOST_FOREACH (LLToolBarButton::Params button_p, p.buttons)
|
||||
{
|
||||
LLLayoutPanel::Params panel_p;
|
||||
panel_p.name = button_p.name() + "_panel";
|
||||
panel_p.rect = button_p.rect;
|
||||
panel_p.user_resize = false;
|
||||
panel_p.auto_resize= false;
|
||||
// remove any offset from button
|
||||
LLRect button_rect(button_p.rect);
|
||||
|
||||
LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
|
||||
LLButton* button = LLUICtrlFactory::create<LLButton>(button_p);
|
||||
panel->addChild(button);
|
||||
mStack->addChild(panel);
|
||||
if (mOrientation == LLLayoutStack::HORIZONTAL)
|
||||
{
|
||||
button_rect.setOriginAndSize(0, 0, 0, getRect().getHeight());
|
||||
}
|
||||
else // VERTICAL
|
||||
{
|
||||
button_rect.setOriginAndSize(0, 0, 0, button_rect.getHeight());
|
||||
}
|
||||
button_p.follows.flags = FOLLOWS_NONE;
|
||||
button_p.rect = button_rect;
|
||||
button_p.chrome = true;
|
||||
button_p.auto_resize = true;
|
||||
|
||||
LLToolBarButton* button = LLUICtrlFactory::create<LLToolBarButton>(button_p);
|
||||
|
||||
addButton(button);
|
||||
}
|
||||
|
||||
updateLayout();
|
||||
}
|
||||
|
||||
void LLToolBar::addButton(LLToolBarButton* buttonp)
|
||||
{
|
||||
LLLayoutPanel::Params panel_p;
|
||||
panel_p.name = buttonp->getName() + "_panel";
|
||||
panel_p.user_resize = false;
|
||||
panel_p.auto_resize= false;
|
||||
panel_p.fit_content = true;
|
||||
|
||||
LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p);
|
||||
|
||||
panel->addChild(buttonp);
|
||||
mStack->addChild(panel);
|
||||
mButtons.push_back(buttonp);
|
||||
}
|
||||
|
||||
void LLToolBar::updateLayout()
|
||||
{
|
||||
S32 total_width = 0;
|
||||
S32 total_height = 0;
|
||||
S32 max_width = getRect().getWidth();
|
||||
S32 max_height = getRect().getHeight();
|
||||
|
||||
BOOST_FOREACH(LLToolBarButton* button, mButtons)
|
||||
{
|
||||
total_width += button->getRect().getWidth();
|
||||
total_height += button->getRect().getHeight();
|
||||
max_width = llmax(button->getRect().getWidth(), max_width);
|
||||
max_height = llmax(button->getRect().getHeight(), max_height);
|
||||
}
|
||||
|
||||
if (mOrientation == LLLayoutStack::HORIZONTAL)
|
||||
{
|
||||
mStack->reshape(total_width, mStack->getParent()->getRect().getHeight());
|
||||
}
|
||||
else
|
||||
{
|
||||
mStack->reshape(mStack->getParent()->getRect().getWidth(), total_height);
|
||||
reshape(max_width, getRect().getHeight());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLToolBar::draw()
|
||||
{
|
||||
LLUICtrl::draw();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,28 +32,44 @@
|
|||
#include "lllayoutstack.h"
|
||||
#include "llbutton.h"
|
||||
|
||||
class LLToolBarButton : public LLButton
|
||||
{
|
||||
public:
|
||||
struct Params : public LLInitParam::Block<Params, LLButton::Params>
|
||||
{
|
||||
};
|
||||
|
||||
LLToolBarButton(const Params& p) : LLButton(p) {}
|
||||
|
||||
};
|
||||
|
||||
class LLToolBar
|
||||
: public LLUICtrl
|
||||
{
|
||||
public:
|
||||
|
||||
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
|
||||
{
|
||||
Mandatory<LLLayoutStack::ELayoutOrientation> orientation;
|
||||
Multiple<LLButton::Params> buttons;
|
||||
Mandatory<LLLayoutStack::ELayoutOrientation,
|
||||
LLLayoutStack::OrientationNames> orientation;
|
||||
Multiple<LLToolBarButton::Params> buttons;
|
||||
|
||||
Params();
|
||||
};
|
||||
|
||||
void draw();
|
||||
/*virtual*/ void draw();
|
||||
|
||||
protected:
|
||||
friend class LLUICtrlFactory;
|
||||
LLToolBar(const Params&);
|
||||
void initFromParams(const Params&);
|
||||
void addButton(LLToolBarButton* buttonp);
|
||||
void updateLayout();
|
||||
|
||||
private:
|
||||
LLLayoutStack::ELayoutOrientation mOrientation;
|
||||
LLLayoutStack* mStack;
|
||||
LLLayoutStack::ELayoutOrientation mOrientation;
|
||||
LLLayoutStack* mStack;
|
||||
std::list<LLToolBarButton*> mButtons;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
legacy_header_height="18"
|
||||
can_resize="true"
|
||||
height="500"
|
||||
layout="topleft"
|
||||
name="floater_test_toolbar"
|
||||
translate="false"
|
||||
width="500">
|
||||
<toolbar name="test_toolbar_horizontal"
|
||||
follows="left|right|top"
|
||||
height="50"
|
||||
width="500"
|
||||
left="0"
|
||||
top="20"
|
||||
orientation="horizontal">
|
||||
<button width="0"
|
||||
auto_resize="true"
|
||||
label="Button 1"/>
|
||||
<button width="0"
|
||||
auto_resize="true"
|
||||
label="Button with long label"/>
|
||||
<button width="0"
|
||||
auto_resize="true"
|
||||
label="Button with longest label of all"/>
|
||||
</toolbar>
|
||||
<toolbar name="test_toolbar_vertical"
|
||||
follows="left|bottom|top"
|
||||
height="430"
|
||||
width="100"
|
||||
left="0"
|
||||
top="70"
|
||||
orientation="vertical">
|
||||
<button height="30"
|
||||
label="Button 1"/>
|
||||
<button height="50"
|
||||
label="Button 2"/>
|
||||
<button height="60"
|
||||
label="Button 3"/>
|
||||
</toolbar>
|
||||
|
||||
</floater>
|
||||
Loading…
Reference in New Issue