LLInitParam/LLUI Params enhancement
Specialized param handling for common linden types And pre-viewer-interesting modernized llinitparam.* (includes llsdparam.cpp update)
This commit is contained in:
@@ -40,7 +40,9 @@ namespace LLInitParam
|
|||||||
{
|
{
|
||||||
const U8* my_addr = reinterpret_cast<const U8*>(this);
|
const U8* my_addr = reinterpret_cast<const U8*>(this);
|
||||||
const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
|
const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
|
||||||
mEnclosingBlockOffset = 0x7FFFffff & (U32)(my_addr - block_addr);
|
U32 enclosing_block_offset = 0x7FFFffff & (U32)(my_addr - block_addr);
|
||||||
|
mEnclosingBlockOffsetLow = enclosing_block_offset & 0x0000ffff;
|
||||||
|
mEnclosingBlockOffsetHigh = (enclosing_block_offset & 0x007f0000) >> 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -112,6 +114,35 @@ namespace LLInitParam
|
|||||||
std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams));
|
std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlockDescriptor::addParam(const ParamDescriptorPtr in_param, const char* char_name)
|
||||||
|
{
|
||||||
|
// create a copy of the param descriptor in mAllParams
|
||||||
|
// so other data structures can store a pointer to it
|
||||||
|
mAllParams.push_back(in_param);
|
||||||
|
ParamDescriptorPtr param(mAllParams.back());
|
||||||
|
|
||||||
|
std::string name(char_name);
|
||||||
|
if ((size_t)param->mParamHandle > mMaxParamOffset)
|
||||||
|
{
|
||||||
|
llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.empty())
|
||||||
|
{
|
||||||
|
mUnnamedParams.push_back(param);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// don't use insert, since we want to overwrite existing entries
|
||||||
|
mNamedParams[name] = param;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param->mValidationFunc)
|
||||||
|
{
|
||||||
|
mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BlockDescriptor::BlockDescriptor()
|
BlockDescriptor::BlockDescriptor()
|
||||||
: mMaxParamOffset(0),
|
: mMaxParamOffset(0),
|
||||||
mInitializationState(UNINITIALIZED),
|
mInitializationState(UNINITIALIZED),
|
||||||
@@ -150,7 +181,8 @@ namespace LLInitParam
|
|||||||
|
|
||||||
bool BaseBlock::submitValue(Parser::name_stack_t& name_stack, Parser& p, bool silent)
|
bool BaseBlock::submitValue(Parser::name_stack_t& name_stack, Parser& p, bool silent)
|
||||||
{
|
{
|
||||||
if (!deserializeBlock(p, std::make_pair(name_stack.begin(), name_stack.end()), true))
|
Parser::name_stack_range_t range = std::make_pair(name_stack.begin(), name_stack.end());
|
||||||
|
if (!deserializeBlock(p, range, true))
|
||||||
{
|
{
|
||||||
if (!silent)
|
if (!silent)
|
||||||
{
|
{
|
||||||
@@ -196,12 +228,7 @@ namespace LLInitParam
|
|||||||
if (serialize_func)
|
if (serialize_func)
|
||||||
{
|
{
|
||||||
const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL;
|
const Param* diff_param = diff_block ? diff_block->getParamFromHandle(param_handle) : NULL;
|
||||||
// each param descriptor remembers its serial number
|
|
||||||
// so we can inspect the same param under different names
|
|
||||||
// and see that it has the same number
|
|
||||||
name_stack.push_back(std::make_pair("", true));
|
|
||||||
serialize_func(*param, parser, name_stack, diff_param);
|
serialize_func(*param, parser, name_stack, diff_param);
|
||||||
name_stack.pop_back();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,7 +322,7 @@ namespace LLInitParam
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack_range, bool ignored)
|
bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t& name_stack_range, bool ignored)
|
||||||
{
|
{
|
||||||
BlockDescriptor& block_data = mostDerivedBlockDescriptor();
|
BlockDescriptor& block_data = mostDerivedBlockDescriptor();
|
||||||
bool names_left = name_stack_range.first != name_stack_range.second;
|
bool names_left = name_stack_range.first != name_stack_range.second;
|
||||||
@@ -308,15 +335,12 @@ namespace LLInitParam
|
|||||||
{
|
{
|
||||||
const std::string& top_name = name_stack_range.first->first;
|
const std::string& top_name = name_stack_range.first->first;
|
||||||
|
|
||||||
ParamDescriptor::deserialize_func_t deserialize_func = NULL;
|
|
||||||
Param* paramp = NULL;
|
|
||||||
|
|
||||||
BlockDescriptor::param_map_t::iterator found_it = block_data.mNamedParams.find(top_name);
|
BlockDescriptor::param_map_t::iterator found_it = block_data.mNamedParams.find(top_name);
|
||||||
if (found_it != block_data.mNamedParams.end())
|
if (found_it != block_data.mNamedParams.end())
|
||||||
{
|
{
|
||||||
// find pointer to member parameter from offset table
|
// find pointer to member parameter from offset table
|
||||||
paramp = getParamFromHandle(found_it->second->mParamHandle);
|
Param* paramp = getParamFromHandle(found_it->second->mParamHandle);
|
||||||
deserialize_func = found_it->second->mDeserializeFunc;
|
ParamDescriptor::deserialize_func_t deserialize_func = found_it->second->mDeserializeFunc;
|
||||||
|
|
||||||
Parser::name_stack_range_t new_name_stack(name_stack_range.first, name_stack_range.second);
|
Parser::name_stack_range_t new_name_stack(name_stack_range.first, name_stack_range.second);
|
||||||
++new_name_stack.first;
|
++new_name_stack.first;
|
||||||
@@ -358,36 +382,6 @@ namespace LLInitParam
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
|
||||||
void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name)
|
|
||||||
{
|
|
||||||
// create a copy of the param descriptor in mAllParams
|
|
||||||
// so other data structures can store a pointer to it
|
|
||||||
block_data.mAllParams.push_back(in_param);
|
|
||||||
ParamDescriptorPtr param(block_data.mAllParams.back());
|
|
||||||
|
|
||||||
std::string name(char_name);
|
|
||||||
if ((size_t)param->mParamHandle > block_data.mMaxParamOffset)
|
|
||||||
{
|
|
||||||
llerrs << "Attempted to register param with block defined for parent class, make sure to derive from LLInitParam::Block<YOUR_CLASS, PARAM_BLOCK_BASE_CLASS>" << llendl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name.empty())
|
|
||||||
{
|
|
||||||
block_data.mUnnamedParams.push_back(param);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// don't use insert, since we want to overwrite existing entries
|
|
||||||
block_data.mNamedParams[name] = param;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (param->mValidationFunc)
|
|
||||||
{
|
|
||||||
block_data.mValidationList.push_back(std::make_pair(param->mParamHandle, param->mValidationFunc));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseBlock::addSynonym(Param& param, const std::string& synonym)
|
void BaseBlock::addSynonym(Param& param, const std::string& synonym)
|
||||||
{
|
{
|
||||||
BlockDescriptor& block_data = mostDerivedBlockDescriptor();
|
BlockDescriptor& block_data = mostDerivedBlockDescriptor();
|
||||||
@@ -460,7 +454,7 @@ namespace LLInitParam
|
|||||||
if (merge_func)
|
if (merge_func)
|
||||||
{
|
{
|
||||||
Param* paramp = getParamFromHandle((*it)->mParamHandle);
|
Param* paramp = getParamFromHandle((*it)->mParamHandle);
|
||||||
llassert(paramp->mEnclosingBlockOffset == (*it)->mParamHandle);
|
llassert(paramp->getEnclosingBlockOffset() == (*it)->mParamHandle);
|
||||||
some_param_changed |= merge_func(*paramp, *other_paramp, overwrite);
|
some_param_changed |= merge_func(*paramp, *other_paramp, overwrite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -223,10 +223,14 @@ LLSD& LLParamSDParserUtilities::getSDWriteNode(LLSD& input, LLInitParam::Parser:
|
|||||||
{
|
{
|
||||||
bool new_traversal = it->second;
|
bool new_traversal = it->second;
|
||||||
|
|
||||||
LLSD* child_sd = it->first.empty() ? sd_to_write : &(*sd_to_write)[it->first];
|
LLSD* child_sd;
|
||||||
|
if (it->first.empty())
|
||||||
if (child_sd->isArray())
|
|
||||||
{
|
{
|
||||||
|
child_sd = sd_to_write;
|
||||||
|
if (child_sd->isUndefined())
|
||||||
|
{
|
||||||
|
*child_sd = LLSD::emptyArray();
|
||||||
|
}
|
||||||
if (new_traversal)
|
if (new_traversal)
|
||||||
{
|
{
|
||||||
// write to new element at end
|
// write to new element at end
|
||||||
@@ -240,22 +244,7 @@ LLSD& LLParamSDParserUtilities::getSDWriteNode(LLSD& input, LLInitParam::Parser:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (new_traversal
|
sd_to_write = &(*sd_to_write)[it->first];
|
||||||
&& child_sd->isDefined()
|
|
||||||
&& !child_sd->isArray())
|
|
||||||
{
|
|
||||||
// copy child contents into first element of an array
|
|
||||||
LLSD new_array = LLSD::emptyArray();
|
|
||||||
new_array.append(*child_sd);
|
|
||||||
// assign array to slot that previously held the single value
|
|
||||||
*child_sd = new_array;
|
|
||||||
// return next element in that array
|
|
||||||
sd_to_write = &((*child_sd)[1]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sd_to_write = child_sd;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
it->second = false;
|
it->second = false;
|
||||||
}
|
}
|
||||||
@@ -283,8 +272,9 @@ void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd, LLI
|
|||||||
it != sd.endArray();
|
it != sd.endArray();
|
||||||
++it)
|
++it)
|
||||||
{
|
{
|
||||||
stack.back().second = true;
|
stack.push_back(make_pair(std::string(), true));
|
||||||
readSDValues(cb, *it, stack);
|
readSDValues(cb, *it, stack);
|
||||||
|
stack.pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sd.isUndefined())
|
else if (sd.isUndefined())
|
||||||
@@ -313,8 +303,14 @@ namespace LLInitParam
|
|||||||
{
|
{
|
||||||
// LLSD specialization
|
// LLSD specialization
|
||||||
// block param interface
|
// block param interface
|
||||||
bool ParamValue<LLSD, TypeValues<LLSD>, false>::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, bool new_name)
|
bool ParamValue<LLSD, NOT_BLOCK>::deserializeBlock(Parser& p, Parser::name_stack_range_t& name_stack, bool new_name)
|
||||||
{
|
{
|
||||||
|
if (name_stack.first == name_stack.second
|
||||||
|
&& p.readValue<LLSD>(mValue))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
LLSD& sd = LLParamSDParserUtilities::getSDWriteNode(mValue, name_stack);
|
LLSD& sd = LLParamSDParserUtilities::getSDWriteNode(mValue, name_stack);
|
||||||
|
|
||||||
LLSD::String string;
|
LLSD::String string;
|
||||||
@@ -328,15 +324,18 @@ namespace LLInitParam
|
|||||||
}
|
}
|
||||||
|
|
||||||
//static
|
//static
|
||||||
void ParamValue<LLSD, TypeValues<LLSD>, false>::serializeElement(Parser& p, const LLSD& sd, Parser::name_stack_t& name_stack)
|
void ParamValue<LLSD, NOT_BLOCK>::serializeElement(Parser& p, const LLSD& sd, Parser::name_stack_t& name_stack)
|
||||||
{
|
{
|
||||||
p.writeValue<LLSD::String>(sd.asString(), name_stack);
|
p.writeValue<LLSD::String>(sd.asString(), name_stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParamValue<LLSD, TypeValues<LLSD>, false>::serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block) const
|
void ParamValue<LLSD, NOT_BLOCK>::serializeBlock(Parser& p, Parser::name_stack_t& name_stack, const BaseBlock* diff_block) const
|
||||||
{
|
{
|
||||||
// read from LLSD value and serialize out to parser (which could be LLSD, XUI, etc)
|
// attempt to write LLSD out directly
|
||||||
Parser::name_stack_t stack;
|
if (!p.writeValue<LLSD>(mValue, name_stack))
|
||||||
LLParamSDParserUtilities::readSDValues(boost::bind(&serializeElement, boost::ref(p), _1, _2), mValue, stack);
|
{
|
||||||
|
// otherwise read from LLSD value and serialize out to parser (which could be LLSD, XUI, etc)
|
||||||
|
LLParamSDParserUtilities::readSDValues(boost::bind(&serializeElement, boost::ref(p), _1, _2), mValue, name_stack);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1046,6 +1046,13 @@ std::string LLFontGL::nameFromFont(const LLFontGL* fontp)
|
|||||||
return fontp->getFontDesc().getName();
|
return fontp->getFontDesc().getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// static
|
||||||
|
std::string LLFontGL::sizeFromFont(const LLFontGL* fontp)
|
||||||
|
{
|
||||||
|
return fontp->getFontDesc().getSize();
|
||||||
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
std::string LLFontGL::nameFromHAlign(LLFontGL::HAlign align)
|
std::string LLFontGL::nameFromHAlign(LLFontGL::HAlign align)
|
||||||
{
|
{
|
||||||
@@ -1162,6 +1169,41 @@ LLFontGL* LLFontGL::getFont(const LLFontDescriptor& desc)
|
|||||||
return sFontRegistry->getFont(desc);
|
return sFontRegistry->getFont(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
LLFontGL* LLFontGL::getFontByName(const std::string& name)
|
||||||
|
{
|
||||||
|
// check for most common fonts first
|
||||||
|
if (name == "SANSSERIF")
|
||||||
|
{
|
||||||
|
return getFontSansSerif();
|
||||||
|
}
|
||||||
|
else if (name == "SANSSERIF_SMALL")
|
||||||
|
{
|
||||||
|
return getFontSansSerifSmall();
|
||||||
|
}
|
||||||
|
else if (name == "SANSSERIF_BIG")
|
||||||
|
{
|
||||||
|
return getFontSansSerifBig();
|
||||||
|
}
|
||||||
|
else if (name == "SMALL" || name == "OCRA")
|
||||||
|
{
|
||||||
|
// *BUG: Should this be "MONOSPACE"? Do we use "OCRA" anymore?
|
||||||
|
// Does "SMALL" mean "SERIF"?
|
||||||
|
return getFontMonospace();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//static
|
||||||
|
LLFontGL* LLFontGL::getFontDefault()
|
||||||
|
{
|
||||||
|
return getFontSansSerif(); // Fallback to sans serif as default font
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
std::string LLFontGL::getFontPathSystem()
|
std::string LLFontGL::getFontPathSystem()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -171,7 +171,9 @@ public:
|
|||||||
// Takes a string with potentially several flags, i.e. "NORMAL|BOLD|ITALIC"
|
// Takes a string with potentially several flags, i.e. "NORMAL|BOLD|ITALIC"
|
||||||
static U8 getStyleFromString(const std::string &style);
|
static U8 getStyleFromString(const std::string &style);
|
||||||
static std::string getStringFromStyle(U8 style);
|
static std::string getStringFromStyle(U8 style);
|
||||||
|
|
||||||
static std::string nameFromFont(const LLFontGL* fontp);
|
static std::string nameFromFont(const LLFontGL* fontp);
|
||||||
|
static std::string sizeFromFont(const LLFontGL* fontp);
|
||||||
|
|
||||||
static std::string nameFromHAlign(LLFontGL::HAlign align);
|
static std::string nameFromHAlign(LLFontGL::HAlign align);
|
||||||
static LLFontGL::HAlign hAlignFromName(const std::string& name);
|
static LLFontGL::HAlign hAlignFromName(const std::string& name);
|
||||||
@@ -201,6 +203,9 @@ public:
|
|||||||
static LLFontGL* getFontSansSerifBold();
|
static LLFontGL* getFontSansSerifBold();
|
||||||
static LLFontGL* getFontExtChar();
|
static LLFontGL* getFontExtChar();
|
||||||
static LLFontGL* getFont(const LLFontDescriptor& desc);
|
static LLFontGL* getFont(const LLFontDescriptor& desc);
|
||||||
|
// Use with legacy names like "SANSSERIF_SMALL" or "OCRA"
|
||||||
|
static LLFontGL* getFontByName(const std::string& name);
|
||||||
|
static LLFontGL* getFontDefault(); // default fallback font
|
||||||
|
|
||||||
static std::string getFontPathLocal();
|
static std::string getFontPathLocal();
|
||||||
static std::string getFontPathSystem();
|
static std::string getFontPathSystem();
|
||||||
|
|||||||
@@ -313,3 +313,227 @@ void LLUI::setQAMode(BOOL b)
|
|||||||
LLUI::sQAMode = b;
|
LLUI::sQAMode = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace LLInitParam
|
||||||
|
{
|
||||||
|
ParamValue<LLUIColor>::ParamValue(const LLUIColor& color)
|
||||||
|
: super_t(color),
|
||||||
|
red("red"),
|
||||||
|
green("green"),
|
||||||
|
blue("blue"),
|
||||||
|
alpha("alpha"),
|
||||||
|
control("")
|
||||||
|
{
|
||||||
|
updateBlockFromValue(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<LLUIColor>::updateValueFromBlock()
|
||||||
|
{
|
||||||
|
if (control.isProvided() && !control().empty())
|
||||||
|
{
|
||||||
|
updateValue(LLUI::sColorsGroup->controlExists(control) ? LLUI::sColorsGroup->getColor(control) : LLUI::sConfigGroup->getColor(control)); // Singu Note: Most of our colors will be in sColorsGroup (skin), but some may be moved to settings for users.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
updateValue(LLColor4(red, green, blue, alpha));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<LLUIColor>::updateBlockFromValue(bool make_block_authoritative)
|
||||||
|
{
|
||||||
|
LLColor4 color = getValue();
|
||||||
|
red.set(color.mV[VRED], make_block_authoritative);
|
||||||
|
green.set(color.mV[VGREEN], make_block_authoritative);
|
||||||
|
blue.set(color.mV[VBLUE], make_block_authoritative);
|
||||||
|
alpha.set(color.mV[VALPHA], make_block_authoritative);
|
||||||
|
control.set("", make_block_authoritative);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b)
|
||||||
|
{
|
||||||
|
return !(a->getFontDesc() < b->getFontDesc())
|
||||||
|
&& !(b->getFontDesc() < a->getFontDesc());
|
||||||
|
}
|
||||||
|
|
||||||
|
ParamValue<const LLFontGL*>::ParamValue(const LLFontGL* fontp)
|
||||||
|
: super_t(fontp),
|
||||||
|
name("name"),
|
||||||
|
size("size"),
|
||||||
|
style("style")
|
||||||
|
{
|
||||||
|
if (!fontp)
|
||||||
|
{
|
||||||
|
updateValue(LLFontGL::getFontDefault());
|
||||||
|
}
|
||||||
|
addSynonym(name, "");
|
||||||
|
updateBlockFromValue(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<const LLFontGL*>::updateValueFromBlock()
|
||||||
|
{
|
||||||
|
const LLFontGL* res_fontp = LLFontGL::getFontByName(name);
|
||||||
|
if (res_fontp)
|
||||||
|
{
|
||||||
|
updateValue(res_fontp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
U8 fontstyle = 0;
|
||||||
|
fontstyle = LLFontGL::getStyleFromString(style());
|
||||||
|
LLFontDescriptor desc(name(), size(), fontstyle);
|
||||||
|
const LLFontGL* fontp = LLFontGL::getFont(desc);
|
||||||
|
if (fontp)
|
||||||
|
{
|
||||||
|
updateValue(fontp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
updateValue(LLFontGL::getFontDefault());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<const LLFontGL*>::updateBlockFromValue(bool make_block_authoritative)
|
||||||
|
{
|
||||||
|
if (getValue())
|
||||||
|
{
|
||||||
|
name.set(LLFontGL::nameFromFont(getValue()), make_block_authoritative);
|
||||||
|
size.set(LLFontGL::sizeFromFont(getValue()), make_block_authoritative);
|
||||||
|
style.set(LLFontGL::getStringFromStyle(getValue()->getFontDesc().getStyle()), make_block_authoritative);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ParamValue<LLRect>::ParamValue(const LLRect& rect)
|
||||||
|
: super_t(rect),
|
||||||
|
left("left"),
|
||||||
|
top("top"),
|
||||||
|
right("right"),
|
||||||
|
bottom("bottom"),
|
||||||
|
width("width"),
|
||||||
|
height("height")
|
||||||
|
{
|
||||||
|
updateBlockFromValue(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<LLRect>::updateValueFromBlock()
|
||||||
|
{
|
||||||
|
LLRect rect;
|
||||||
|
|
||||||
|
//calculate from params
|
||||||
|
// prefer explicit left and right
|
||||||
|
if (left.isProvided() && right.isProvided())
|
||||||
|
{
|
||||||
|
rect.mLeft = left;
|
||||||
|
rect.mRight = right;
|
||||||
|
}
|
||||||
|
// otherwise use width along with specified side, if any
|
||||||
|
else if (width.isProvided())
|
||||||
|
{
|
||||||
|
// only right + width provided
|
||||||
|
if (right.isProvided())
|
||||||
|
{
|
||||||
|
rect.mRight = right;
|
||||||
|
rect.mLeft = right - width;
|
||||||
|
}
|
||||||
|
else // left + width, or just width
|
||||||
|
{
|
||||||
|
rect.mLeft = left;
|
||||||
|
rect.mRight = left + width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// just left, just right, or none
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rect.mLeft = left;
|
||||||
|
rect.mRight = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefer explicit bottom and top
|
||||||
|
if (bottom.isProvided() && top.isProvided())
|
||||||
|
{
|
||||||
|
rect.mBottom = bottom;
|
||||||
|
rect.mTop = top;
|
||||||
|
}
|
||||||
|
// otherwise height along with specified side, if any
|
||||||
|
else if (height.isProvided())
|
||||||
|
{
|
||||||
|
// top + height provided
|
||||||
|
if (top.isProvided())
|
||||||
|
{
|
||||||
|
rect.mTop = top;
|
||||||
|
rect.mBottom = top - height;
|
||||||
|
}
|
||||||
|
// bottom + height or just height
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rect.mBottom = bottom;
|
||||||
|
rect.mTop = bottom + height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// just bottom, just top, or none
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rect.mBottom = bottom;
|
||||||
|
rect.mTop = top;
|
||||||
|
}
|
||||||
|
updateValue(rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<LLRect>::updateBlockFromValue(bool make_block_authoritative)
|
||||||
|
{
|
||||||
|
// because of the ambiguity in specifying a rect by position and/or dimensions
|
||||||
|
// we use the lowest priority pairing so that any valid pairing in xui
|
||||||
|
// will override those calculated from the rect object
|
||||||
|
// in this case, that is left+width and bottom+height
|
||||||
|
LLRect& value = getValue();
|
||||||
|
|
||||||
|
right.set(value.mRight, false);
|
||||||
|
left.set(value.mLeft, make_block_authoritative);
|
||||||
|
width.set(value.getWidth(), make_block_authoritative);
|
||||||
|
|
||||||
|
top.set(value.mTop, false);
|
||||||
|
bottom.set(value.mBottom, make_block_authoritative);
|
||||||
|
height.set(value.getHeight(), make_block_authoritative);
|
||||||
|
}
|
||||||
|
|
||||||
|
ParamValue<LLCoordGL>::ParamValue(const LLCoordGL& coord)
|
||||||
|
: super_t(coord),
|
||||||
|
x("x"),
|
||||||
|
y("y")
|
||||||
|
{
|
||||||
|
updateBlockFromValue(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<LLCoordGL>::updateValueFromBlock()
|
||||||
|
{
|
||||||
|
updateValue(LLCoordGL(x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParamValue<LLCoordGL>::updateBlockFromValue(bool make_block_authoritative)
|
||||||
|
{
|
||||||
|
x.set(getValue().mX, make_block_authoritative);
|
||||||
|
y.set(getValue().mY, make_block_authoritative);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TypeValues<LLFontGL::HAlign>::declareValues()
|
||||||
|
{
|
||||||
|
declare("left", LLFontGL::LEFT);
|
||||||
|
declare("right", LLFontGL::RIGHT);
|
||||||
|
declare("center", LLFontGL::HCENTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TypeValues<LLFontGL::VAlign>::declareValues()
|
||||||
|
{
|
||||||
|
declare("top", LLFontGL::TOP);
|
||||||
|
declare("center", LLFontGL::VCENTER);
|
||||||
|
declare("baseline", LLFontGL::BASELINE);
|
||||||
|
declare("bottom", LLFontGL::BOTTOM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TypeValues<LLFontGL::ShadowType>::declareValues()
|
||||||
|
{
|
||||||
|
declare("none", LLFontGL::NO_SHADOW);
|
||||||
|
declare("hard", LLFontGL::DROP_SHADOW);
|
||||||
|
declare("soft", LLFontGL::DROP_SHADOW_SOFT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,12 +32,18 @@
|
|||||||
#include "llcontrol.h"
|
#include "llcontrol.h"
|
||||||
#include "llcoord.h"
|
#include "llcoord.h"
|
||||||
#include "v2math.h"
|
#include "v2math.h"
|
||||||
|
#include "llinitparam.h"
|
||||||
#include "llregistry.h"
|
#include "llregistry.h"
|
||||||
#include "llrender2dutils.h"
|
#include "llrender2dutils.h"
|
||||||
#include "llpointer.h"
|
#include "llpointer.h"
|
||||||
|
#include "lluicolor.h"
|
||||||
#include "lluiimage.h"
|
#include "lluiimage.h"
|
||||||
#include <boost/signals2.hpp>
|
#include <boost/signals2.hpp>
|
||||||
|
|
||||||
|
// for initparam specialization
|
||||||
|
#include "llfontgl.h"
|
||||||
|
|
||||||
|
|
||||||
// LLUIFactory
|
// LLUIFactory
|
||||||
#include "llsd.h"
|
#include "llsd.h"
|
||||||
|
|
||||||
@@ -504,4 +510,99 @@ protected:
|
|||||||
|
|
||||||
template <typename T> T* LLParamBlock<T>::sBlock = NULL;
|
template <typename T> T* LLParamBlock<T>::sBlock = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
namespace LLInitParam
|
||||||
|
{
|
||||||
|
template<>
|
||||||
|
class ParamValue<LLRect>
|
||||||
|
: public CustomParamValue<LLRect>
|
||||||
|
{
|
||||||
|
typedef CustomParamValue<LLRect> super_t;
|
||||||
|
public:
|
||||||
|
Optional<S32> left,
|
||||||
|
top,
|
||||||
|
right,
|
||||||
|
bottom,
|
||||||
|
width,
|
||||||
|
height;
|
||||||
|
|
||||||
|
ParamValue(const LLRect& value);
|
||||||
|
|
||||||
|
void updateValueFromBlock();
|
||||||
|
void updateBlockFromValue(bool make_block_authoritative);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class ParamValue<LLUIColor>
|
||||||
|
: public CustomParamValue<LLUIColor>
|
||||||
|
{
|
||||||
|
typedef CustomParamValue<LLUIColor> super_t;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Optional<F32> red,
|
||||||
|
green,
|
||||||
|
blue,
|
||||||
|
alpha;
|
||||||
|
Optional<std::string> control;
|
||||||
|
|
||||||
|
ParamValue(const LLUIColor& color);
|
||||||
|
void updateValueFromBlock();
|
||||||
|
void updateBlockFromValue(bool make_block_authoritative);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class ParamValue<const LLFontGL*>
|
||||||
|
: public CustomParamValue<const LLFontGL* >
|
||||||
|
{
|
||||||
|
typedef CustomParamValue<const LLFontGL*> super_t;
|
||||||
|
public:
|
||||||
|
Optional<std::string> name,
|
||||||
|
size,
|
||||||
|
style;
|
||||||
|
|
||||||
|
ParamValue(const LLFontGL* value);
|
||||||
|
void updateValueFromBlock();
|
||||||
|
void updateBlockFromValue(bool make_block_authoritative);
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeValues<LLFontGL::HAlign> : public TypeValuesHelper<LLFontGL::HAlign>
|
||||||
|
{
|
||||||
|
static void declareValues();
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeValues<LLFontGL::VAlign> : public TypeValuesHelper<LLFontGL::VAlign>
|
||||||
|
{
|
||||||
|
static void declareValues();
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct TypeValues<LLFontGL::ShadowType> : public TypeValuesHelper<LLFontGL::ShadowType>
|
||||||
|
{
|
||||||
|
static void declareValues();
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct ParamCompare<const LLFontGL*, false>
|
||||||
|
{
|
||||||
|
static bool equals(const LLFontGL* a, const LLFontGL* b);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class ParamValue<LLCoordGL>
|
||||||
|
: public CustomParamValue<LLCoordGL>
|
||||||
|
{
|
||||||
|
typedef CustomParamValue<LLCoordGL> super_t;
|
||||||
|
public:
|
||||||
|
Optional<S32> x,
|
||||||
|
y;
|
||||||
|
|
||||||
|
ParamValue(const LLCoordGL& val);
|
||||||
|
void updateValueFromBlock();
|
||||||
|
void updateBlockFromValue(bool make_block_authoritative);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user