implemented Range and ClampedValue classes to standardize min/max settings

fixed not serializing named values when values provided from code
meow-7.2.2
Richard Nelson 2011-10-03 18:52:22 -07:00
parent 05dd98a423
commit edacb7b336
9 changed files with 185 additions and 40 deletions

View File

@ -319,7 +319,7 @@ void LLToolBar::resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row
{
if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL)
{
button->reshape(llclamp(button->getRect().getWidth(), button->mMinWidth, button->mMaxWidth), max_row_girth);
button->reshape(button->mWidthRange.clamp(button->getRect().getWidth()), max_row_girth);
}
else // VERTICAL
{
@ -378,10 +378,10 @@ void LLToolBar::updateLayoutAsNeeded()
BOOST_FOREACH(LLToolBarButton* button, mButtons)
{
button->reshape(button->mMinWidth, button->mDesiredHeight);
button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight);
button->autoResize();
S32 button_clamped_width = llclamp(button->getRect().getWidth(), button->mMinWidth, button->mMaxWidth);
S32 button_clamped_width = button->mWidthRange.clamp(button->getRect().getWidth());
S32 button_length = (orientation == LLLayoutStack::HORIZONTAL)
? button_clamped_width
: button->getRect().getHeight();
@ -396,7 +396,7 @@ void LLToolBar::updateLayoutAsNeeded()
{
if (orientation == LLLayoutStack::VERTICAL)
{ // row girth (width in this case) is clamped to allowable button widths
max_row_girth = llclamp(max_row_girth, button->mMinWidth, button->mMaxWidth);
max_row_girth = button->mWidthRange.clamp(max_row_girth);
}
// make buttons in current row all same girth
@ -543,8 +543,7 @@ LLToolBarButton::LLToolBarButton(const Params& p)
: LLButton(p),
mMouseDownX(0),
mMouseDownY(0),
mMinWidth(p.min_button_width),
mMaxWidth(p.max_button_width),
mWidthRange(p.button_width),
mDesiredHeight(p.desired_height),
mId("")
{}

View File

@ -41,13 +41,11 @@ class LLToolBarButton : public LLButton
public:
struct Params : public LLInitParam::Block<Params, LLButton::Params>
{
Optional<S32> min_button_width,
max_button_width,
desired_height;
Optional<LLUI::Range<S32> > button_width;
Optional<S32> desired_height;
Params()
: min_button_width("min_button_width", 0),
max_button_width("max_button_width", S32_MAX),
: button_width("button_width"),
desired_height("desired_height", 20)
{}
@ -62,8 +60,7 @@ private:
LLCommandId mId;
S32 mMouseDownX;
S32 mMouseDownY;
S32 mMinWidth;
S32 mMaxWidth;
LLUI::Range<S32> mWidthRange;
S32 mDesiredHeight;
};

View File

@ -169,8 +169,8 @@ bool LLToolBarView::loadToolbars(bool force_default)
{
if (toolbar_set.left_toolbar.button_display_mode.isProvided())
{
U32 button_type = toolbar_set.left_toolbar.button_display_mode;
mToolbarLeft->setButtonType((LLToolBarEnums::ButtonType)(button_type));
LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode;
mToolbarLeft->setButtonType(button_type);
}
BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.left_toolbar.commands)
{
@ -181,8 +181,8 @@ bool LLToolBarView::loadToolbars(bool force_default)
{
if (toolbar_set.right_toolbar.button_display_mode.isProvided())
{
U32 button_type = toolbar_set.right_toolbar.button_display_mode;
mToolbarRight->setButtonType((LLToolBarEnums::ButtonType)(button_type));
LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode;
mToolbarRight->setButtonType(button_type);
}
BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.right_toolbar.commands)
{
@ -193,8 +193,8 @@ bool LLToolBarView::loadToolbars(bool force_default)
{
if (toolbar_set.bottom_toolbar.button_display_mode.isProvided())
{
U32 button_type = toolbar_set.bottom_toolbar.button_display_mode;
mToolbarBottom->setButtonType((LLToolBarEnums::ButtonType)(button_type));
LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode;
mToolbarBottom->setButtonType(button_type);
}
BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.bottom_toolbar.commands)
{
@ -223,17 +223,17 @@ void LLToolBarView::saveToolbars() const
LLToolBarView::ToolbarSet toolbar_set;
if (mToolbarLeft)
{
toolbar_set.left_toolbar.button_display_mode = (int)(mToolbarLeft->getButtonType());
toolbar_set.left_toolbar.button_display_mode = mToolbarLeft->getButtonType();
addToToolset(mToolbarLeft->getCommandsList(),toolbar_set.left_toolbar);
}
if (mToolbarRight)
{
toolbar_set.right_toolbar.button_display_mode = (int)(mToolbarRight->getButtonType());
toolbar_set.right_toolbar.button_display_mode = mToolbarRight->getButtonType();
addToToolset(mToolbarRight->getCommandsList(),toolbar_set.right_toolbar);
}
if (mToolbarBottom)
{
toolbar_set.bottom_toolbar.button_display_mode = (int)(mToolbarBottom->getButtonType());
toolbar_set.bottom_toolbar.button_display_mode = mToolbarBottom->getButtonType();
addToToolset(mToolbarBottom->getCommandsList(),toolbar_set.bottom_toolbar);
}

View File

@ -50,8 +50,8 @@ public:
// the user folder for the user specific (saved) settings
struct Toolbar : public LLInitParam::Block<Toolbar>
{
Mandatory<U32> button_display_mode;
Multiple<LLCommandId::Params> commands;
Mandatory<LLToolBarEnums::ButtonType> button_display_mode;
Multiple<LLCommandId::Params> commands;
Toolbar();
};
struct ToolbarSet : public LLInitParam::Block<ToolbarSet>

View File

@ -147,6 +147,132 @@ class LLUI
{
LOG_CLASS(LLUI);
public:
//
// Classes
//
template <typename T>
struct Range
{
typedef Range<T> self_t;
struct Params : public LLInitParam::Block<Params>
{
Optional<T> minimum,
maximum;
Params()
: minimum("min", 0),
maximum("max", S32_MAX)
{
}
};
// correct for inverted params
Range(const Params& p = Params())
: mMin(p.minimum),
mMax(p.maximum)
{
sanitizeRange();
}
Range(T minimum, T maximum)
: mMin(minimum),
mMax(maximum)
{
sanitizeRange();
}
S32 clamp(T input)
{
if (input < mMin) return mMin;
if (input > mMax) return mMax;
return input;
}
void setRange(T minimum, T maximum)
{
mMin = minimum;
mMax = maximum;
sanitizeRange();
}
S32 getMin() { return mMin; }
S32 getMax() { return mMax; }
bool operator==(const self_t& other) const
{
return mMin == other.mMin
&& mMax == other.mMax;
}
private:
void sanitizeRange()
{
if (mMin > mMax)
{
llwarns << "Bad interval range (" << mMin << ", " << mMax << ")" << llendl;
// since max is usually the most dangerous one to ignore (buffer overflow, etc), prefer it
// in the case of a malformed range
mMin = mMax;
}
}
T mMin,
mMax;
};
template<typename T>
struct ClampedValue : public Range<T>
{
typedef Range<T> range_t;
struct Params : public LLInitParam::Block<Params, typename range_t::Params>
{
Mandatory<S32> value;
Params()
: value("", 0)
{
addSynonym(value, "value");
}
};
ClampedValue(const Params& p)
: range_t(p)
{}
ClampedValue(const range_t& range)
: range_t(range)
{
// set value here, after range has been sanitized
mValue = clamp(0);
}
ClampedValue(T value, const range_t& range = range_t())
: range_t(range)
{
mValue = clamp(value);
}
T get()
{
return mValue;
}
void set(T value)
{
mValue = clamp(value);
}
private:
T mValue;
};
typedef ClampedValue<S32> ClampedS32;
//
// Methods
//

View File

@ -87,6 +87,7 @@ namespace LLInitParam
void setValueName(const std::string& key) {}
std::string getValueName() const { return ""; }
std::string calcValueName(const T& value) const { return ""; }
void clearValueName() const {}
static bool getValueFromName(const std::string& name, T& value)
@ -124,6 +125,22 @@ namespace LLInitParam
return mValueName;
}
std::string calcValueName(const T& value) const
{
value_name_map_t* map = getValueNames();
for (value_name_map_t::iterator it = map->begin(), end_it = map->end();
it != end_it;
++it)
{
if (ParamCompare<T>::equals(it->second, value))
{
return it->first;
}
}
return "";
}
void clearValueName() const
{
mValueName.clear();
@ -709,18 +726,19 @@ namespace LLInitParam
{
if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), key))
{
if (!parser.writeValue(key, name_stack))
{
return;
}
parser.writeValue(key, name_stack);
}
}
// then try to serialize value directly
else if (!diff_param || !ParamCompare<T>::equals(typed_param.getValue(), static_cast<const self_t*>(diff_param)->getValue()))
{
if (!parser.writeValue(typed_param.getValue(), name_stack))
if (!parser.writeValue(typed_param.getValue(), name_stack))
{
return;
std::string calculated_key = typed_param.calcValueName(typed_param.getValue());
if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->getValueName(), calculated_key))
{
parser.writeValue(calculated_key, name_stack);
}
}
}
}
@ -1002,9 +1020,14 @@ namespace LLInitParam
if(key.empty())
// not parsed via name values, write out value directly
{
if (!parser.writeValue(*it, name_stack))
bool value_written == parser.writeValue(*it, name_stack);
if (!value_written)
{
break;
std::string calculated_key = typed_param.calcValueName(typed_param.getValue());
if (!parser.writeValue(calculated_key, name_stack))
{
break;
}
}
}
else

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toolbars>
<bottom_toolbar
button_display_mode="0">
button_display_mode="icons_with_text">
<command name="chat"/>
<command name="speak"/>
<command name="places"/>
@ -12,7 +12,7 @@
<command name="howto"/>
</bottom_toolbar>
<left_toolbar
button_display_mode="1">
button_display_mode="icons_only">
<command name="avatar"/>
<command name="inventory"/>
<command name="snapshot"/>

View File

@ -48,8 +48,8 @@
button_display_mode="icons_with_text"
follows="all"
left="20"
button_icon_and_text.max_button_width="140"
button_icon_and_text.min_button_width="70"
button_icon_and_text.button_width.max="140"
button_icon_and_text.button_width.min="70"
name="toybox_toolbar"
pad_left="5"
pad_right="5"

View File

@ -12,8 +12,8 @@
bg_opaque_image_overlay="MouseGray"
background_opaque="true"/>
<button_icon_and_text imgoverlay_label_space="7"
min_button_width="70"
max_button_width="140"
button_width.min="70"
button_width.max="140"
desired_height="24"
pad_left="10"
pad_right="10"
@ -25,8 +25,8 @@
<button_icon pad_left="10"
pad_right="10"
desired_height="35"
min_button_width="35"
max_button_width="35"
button_width.min="35"
button_width.max="35"
follows="left|top"
label=""
chrome="true"