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* 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));
|
||||
}
|
||||
|
||||
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()
|
||||
: mMaxParamOffset(0),
|
||||
mInitializationState(UNINITIALIZED),
|
||||
@@ -150,7 +181,8 @@ namespace LLInitParam
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -196,12 +228,7 @@ namespace LLInitParam
|
||||
if (serialize_func)
|
||||
{
|
||||
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);
|
||||
name_stack.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -295,7 +322,7 @@ namespace LLInitParam
|
||||
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();
|
||||
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;
|
||||
|
||||
ParamDescriptor::deserialize_func_t deserialize_func = NULL;
|
||||
Param* paramp = NULL;
|
||||
|
||||
BlockDescriptor::param_map_t::iterator found_it = block_data.mNamedParams.find(top_name);
|
||||
if (found_it != block_data.mNamedParams.end())
|
||||
{
|
||||
// find pointer to member parameter from offset table
|
||||
paramp = getParamFromHandle(found_it->second->mParamHandle);
|
||||
deserialize_func = found_it->second->mDeserializeFunc;
|
||||
Param* paramp = getParamFromHandle(found_it->second->mParamHandle);
|
||||
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);
|
||||
++new_name_stack.first;
|
||||
@@ -358,36 +382,6 @@ namespace LLInitParam
|
||||
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)
|
||||
{
|
||||
BlockDescriptor& block_data = mostDerivedBlockDescriptor();
|
||||
@@ -460,7 +454,7 @@ namespace LLInitParam
|
||||
if (merge_func)
|
||||
{
|
||||
Param* paramp = getParamFromHandle((*it)->mParamHandle);
|
||||
llassert(paramp->mEnclosingBlockOffset == (*it)->mParamHandle);
|
||||
llassert(paramp->getEnclosingBlockOffset() == (*it)->mParamHandle);
|
||||
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;
|
||||
|
||||
LLSD* child_sd = it->first.empty() ? sd_to_write : &(*sd_to_write)[it->first];
|
||||
|
||||
if (child_sd->isArray())
|
||||
LLSD* child_sd;
|
||||
if (it->first.empty())
|
||||
{
|
||||
child_sd = sd_to_write;
|
||||
if (child_sd->isUndefined())
|
||||
{
|
||||
*child_sd = LLSD::emptyArray();
|
||||
}
|
||||
if (new_traversal)
|
||||
{
|
||||
// write to new element at end
|
||||
@@ -240,22 +244,7 @@ LLSD& LLParamSDParserUtilities::getSDWriteNode(LLSD& input, LLInitParam::Parser:
|
||||
}
|
||||
else
|
||||
{
|
||||
if (new_traversal
|
||||
&& 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;
|
||||
}
|
||||
sd_to_write = &(*sd_to_write)[it->first];
|
||||
}
|
||||
it->second = false;
|
||||
}
|
||||
@@ -283,8 +272,9 @@ void LLParamSDParserUtilities::readSDValues(read_sd_cb_t cb, const LLSD& sd, LLI
|
||||
it != sd.endArray();
|
||||
++it)
|
||||
{
|
||||
stack.back().second = true;
|
||||
stack.push_back(make_pair(std::string(), true));
|
||||
readSDValues(cb, *it, stack);
|
||||
stack.pop_back();
|
||||
}
|
||||
}
|
||||
else if (sd.isUndefined())
|
||||
@@ -313,8 +303,14 @@ namespace LLInitParam
|
||||
{
|
||||
// LLSD specialization
|
||||
// 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::String string;
|
||||
@@ -328,15 +324,18 @@ namespace LLInitParam
|
||||
}
|
||||
|
||||
//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);
|
||||
}
|
||||
|
||||
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)
|
||||
Parser::name_stack_t stack;
|
||||
LLParamSDParserUtilities::readSDValues(boost::bind(&serializeElement, boost::ref(p), _1, _2), mValue, stack);
|
||||
// attempt to write LLSD out directly
|
||||
if (!p.writeValue<LLSD>(mValue, name_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();
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
std::string LLFontGL::sizeFromFont(const LLFontGL* fontp)
|
||||
{
|
||||
return fontp->getFontDesc().getSize();
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLFontGL::nameFromHAlign(LLFontGL::HAlign align)
|
||||
{
|
||||
@@ -1162,6 +1169,41 @@ LLFontGL* LLFontGL::getFont(const LLFontDescriptor& 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
|
||||
std::string LLFontGL::getFontPathSystem()
|
||||
{
|
||||
|
||||
@@ -171,7 +171,9 @@ public:
|
||||
// Takes a string with potentially several flags, i.e. "NORMAL|BOLD|ITALIC"
|
||||
static U8 getStyleFromString(const std::string &style);
|
||||
static std::string getStringFromStyle(U8 style);
|
||||
|
||||
static std::string nameFromFont(const LLFontGL* fontp);
|
||||
static std::string sizeFromFont(const LLFontGL* fontp);
|
||||
|
||||
static std::string nameFromHAlign(LLFontGL::HAlign align);
|
||||
static LLFontGL::HAlign hAlignFromName(const std::string& name);
|
||||
@@ -201,6 +203,9 @@ public:
|
||||
static LLFontGL* getFontSansSerifBold();
|
||||
static LLFontGL* getFontExtChar();
|
||||
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 getFontPathSystem();
|
||||
|
||||
@@ -313,3 +313,227 @@ void LLUI::setQAMode(BOOL 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 "llcoord.h"
|
||||
#include "v2math.h"
|
||||
#include "llinitparam.h"
|
||||
#include "llregistry.h"
|
||||
#include "llrender2dutils.h"
|
||||
#include "llpointer.h"
|
||||
#include "lluicolor.h"
|
||||
#include "lluiimage.h"
|
||||
#include <boost/signals2.hpp>
|
||||
|
||||
// for initparam specialization
|
||||
#include "llfontgl.h"
|
||||
|
||||
|
||||
// LLUIFactory
|
||||
#include "llsd.h"
|
||||
|
||||
@@ -504,4 +510,99 @@ protected:
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user