EXP-1181 FIX As a designer, I would like to specify default floater positions using relative coordinates

store and load floater relative positions
master
Richard Linden 2012-02-27 13:06:10 -08:00
parent 8024727d45
commit fbfad41587
4 changed files with 98 additions and 48 deletions

View File

@ -543,10 +543,18 @@ LLFloater::~LLFloater()
void LLFloater::storeRectControl()
{
if( mRectControl.size() > 1 )
if (!mRectControl.empty())
{
getControlGroup()->setRect( mRectControl, getRect() );
}
if (!mPosXControl.empty() && mPositioning == LLFloaterEnums::POSITIONING_RELATIVE)
{
getControlGroup()->setF32( mPosXControl, mPosition.mX );
}
if (!mPosYControl.empty() && mPositioning == LLFloaterEnums::POSITIONING_RELATIVE)
{
getControlGroup()->setF32( mPosYControl, mPosition.mY );
}
}
void LLFloater::storeVisibilityControl()
@ -565,23 +573,6 @@ void LLFloater::storeDockStateControl()
}
}
LLRect LLFloater::getSavedRect() const
{
LLRect rect;
if (mRectControl.size() > 1)
{
rect = getControlGroup()->getRect(mRectControl);
}
return rect;
}
bool LLFloater::hasSavedRect() const
{
return !getSavedRect().isEmpty();
}
// static
std::string LLFloater::getControlName(const std::string& name, const LLSD& key)
{
@ -875,18 +866,39 @@ bool LLFloater::applyRectControl()
mRectControl.clear();
mPositioning = LLFloaterEnums::POSITIONING_CASCADE_GROUP;
}
else if (mRectControl.size() > 1)
else
{
// If we have a saved rect, use it
const LLRect& rect = getControlGroup()->getRect(mRectControl);
saved_rect = rect.notEmpty();
if (saved_rect)
if (!mRectControl.empty())
{
setOrigin(rect.mLeft, rect.mBottom);
if (mResizable)
// If we have a saved rect, use it
const LLRect& rect = getControlGroup()->getRect(mRectControl);
if (rect.notEmpty()) saved_rect = true;
if (saved_rect)
{
reshape(llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight()));
setOrigin(rect.mLeft, rect.mBottom);
if (mResizable)
{
reshape(llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight()));
}
}
}
if (!mPosXControl.empty() && !mPosYControl.empty())
{
LLControlVariablePtr x_control = getControlGroup()->getControl(mPosXControl);
LLControlVariablePtr y_control = getControlGroup()->getControl(mPosYControl);
if (x_control.notNull()
&& y_control.notNull()
&& !x_control->isDefault()
&& !y_control->isDefault())
{
mPosition.mX = x_control->getValue().asReal();
mPosition.mY = y_control->getValue().asReal();
mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
applyRelativePosition();
saved_rect = true;
}
}
}
@ -949,14 +961,8 @@ void LLFloater::applyPositioning(LLFloater* other)
case LLFloaterEnums::POSITIONING_RELATIVE:
{
LLRect snap_rect = gFloaterView->getSnapRect();
LLRect floater_view_screen_rect = gFloaterView->calcScreenRect();
snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom);
LLRect floater_screen_rect = calcScreenRect();
applyRelativePosition();
LLCoordGL new_center = mPosition.convert();
LLCoordGL cur_center(floater_screen_rect.getCenterX(), floater_screen_rect.getCenterY());
translate(new_center.mX - cur_center.mX, new_center.mY - cur_center.mY);
break;
}
default:
@ -1630,7 +1636,7 @@ void LLFloater::onClickTearOff(LLFloater* self)
self->openFloater(self->getKey());
// only force position for floaters that don't have that data saved
if (self->mRectControl.size() <= 1)
if (self->mRectControl.empty())
{
new_rect.setLeftTopAndSize(host_floater->getRect().mLeft + 5, host_floater->getRect().mTop - floater_header_size - 5, self->getRect().getWidth(), self->getRect().getHeight());
self->setRect(new_rect);
@ -2918,9 +2924,11 @@ void LLFloater::setInstanceName(const std::string& name)
std::string ctrl_name = getControlName(mInstanceName, mKey);
// save_rect and save_visibility only apply to registered floaters
if (!mRectControl.empty())
if (mSaveRect)
{
mRectControl = LLFloaterReg::declareRectControl(ctrl_name);
mPosXControl = LLFloaterReg::declarePosXControl(ctrl_name);
mPosYControl = LLFloaterReg::declarePosYControl(ctrl_name);
}
if (!mVisibilityControl.empty())
{
@ -3001,10 +3009,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
mPositioning = p.positioning;
if (p.save_rect && mRectControl.empty())
{
mRectControl = "t"; // flag to build mRectControl name once mInstanceName is set
}
mSaveRect = p.save_rect;
if (p.save_visibility)
{
mVisibilityControl = "t"; // flag to build mVisibilityControl name once mInstanceName is set
@ -3283,6 +3288,19 @@ void LLFloater::stackWith(LLFloater& other)
other.setFollows(FOLLOWS_LEFT | FOLLOWS_TOP);
}
void LLFloater::applyRelativePosition()
{
LLRect snap_rect = gFloaterView->getSnapRect();
LLRect floater_view_screen_rect = gFloaterView->calcScreenRect();
snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom);
LLRect floater_screen_rect = calcScreenRect();
LLCoordGL new_center = mPosition.convert();
LLCoordGL cur_center(floater_screen_rect.getCenterX(), floater_screen_rect.getCenterY());
translate(new_center.mX - cur_center.mX, new_center.mY - cur_center.mY);
}
LLCoordFloater::LLCoordFloater(F32 x, F32 y, LLFloater& floater)
: coord_t(x, y)
{

View File

@ -269,8 +269,6 @@ public:
BOOL isResizable() const { return mResizable; }
void setResizeLimits( S32 min_width, S32 min_height );
void getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; }
LLRect getSavedRect() const;
bool hasSavedRect() const;
static std::string getControlName(const std::string& name, const LLSD& key);
static LLControlGroup* getControlGroup();
@ -361,6 +359,8 @@ protected:
virtual bool applyRectControl();
bool applyDockState();
void applyPositioning(LLFloater* other);
void applyRelativePosition();
void storeRectControl();
void storeVisibilityControl();
void storeDockStateControl();
@ -424,7 +424,10 @@ public:
commit_signal_t* mMinimizeSignal;
protected:
bool mSaveRect;
std::string mRectControl;
std::string mPosXControl;
std::string mPosYControl;
std::string mVisibilityControl;
std::string mDocStateControl;
LLSD mKey; // Key used for retrieving instances; set (for now) by LLFLoaterReg

View File

@ -358,9 +358,7 @@ void LLFloaterReg::restoreVisibleInstances()
//static
std::string LLFloaterReg::getRectControlName(const std::string& name)
{
std::string res = std::string("floater_rect_") + name;
LLStringUtil::replaceChar( res, ' ', '_' );
return res;
return std::string("floater_rect_") + getBaseControlName(name);
}
//static
@ -368,19 +366,48 @@ std::string LLFloaterReg::declareRectControl(const std::string& name)
{
std::string controlname = getRectControlName(name);
LLFloater::getControlGroup()->declareRect(controlname, LLRect(),
llformat("Window Position and Size for %s", name.c_str()),
llformat("Window Size for %s", name.c_str()),
TRUE);
return controlname;
}
std::string LLFloaterReg::declarePosXControl(const std::string& name)
{
std::string controlname = std::string("floater_pos_x_") + getBaseControlName(name);
LLFloater::getControlGroup()->declareF32(controlname,
10.f,
llformat("Window X Position for %s", name.c_str()),
TRUE);
return controlname;
}
std::string LLFloaterReg::declarePosYControl(const std::string& name)
{
std::string controlname = std::string("floater_pos_y_") + getBaseControlName(name);
LLFloater::getControlGroup()->declareF32(controlname,
10.f,
llformat("Window Y Position for %s", name.c_str()),
TRUE);
return controlname;
}
//static
std::string LLFloaterReg::getVisibilityControlName(const std::string& name)
{
std::string res = std::string("floater_vis_") + name;
return std::string("floater_vis_") + getBaseControlName(name);
}
//static
std::string LLFloaterReg::getBaseControlName(const std::string& name)
{
std::string res(name);
LLStringUtil::replaceChar( res, ' ', '_' );
return res;
}
//static
std::string LLFloaterReg::declareVisibilityControl(const std::string& name)
{

View File

@ -115,9 +115,11 @@ public:
// Control Variables
static std::string getRectControlName(const std::string& name);
static std::string declareRectControl(const std::string& name);
static std::string declarePosXControl(const std::string& name);
static std::string declarePosYControl(const std::string& name);
static std::string getVisibilityControlName(const std::string& name);
static std::string declareVisibilityControl(const std::string& name);
static std::string getBaseControlName(const std::string& name);
static std::string declareDockStateControl(const std::string& name);
static std::string getDockStateControlName(const std::string& name);