diff options
| author | richard <none@none> | 2009-12-15 19:38:22 -0800 | 
|---|---|---|
| committer | richard <none@none> | 2009-12-15 19:38:22 -0800 | 
| commit | 943cae62dbe41472b4515edbfca8a12e83dd6936 (patch) | |
| tree | d03d24affc67ad672853cd98752df83e9506a85d | |
| parent | 17d1d3c129c25dd27ddbf2d15ab8873a61c16658 (diff) | |
| parent | 3a02b9ec882c98009ae6c24913ee8a7a620b0f87 (diff) | |
merge
24 files changed, 362 insertions, 269 deletions
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index db1f019a81..7ad5f9608f 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -761,6 +761,29 @@ U8 LLFontGL::getStyleFromString(const std::string &style)  }  // static +std::string LLFontGL::getStringFromStyle(U8 style) +{ +	std::string style_string; +	if (style & NORMAL) +	{ +		style_string += "|NORMAL"; +	} +	if (style & BOLD) +	{ +		style_string += "|BOLD"; +	} +	if (style & ITALIC) +	{ +		style_string += "|ITALIC"; +	} +	if (style & UNDERLINE) +	{ +		style_string += "|UNDERLINE"; +	} +	return style_string; +} + +// static  std::string LLFontGL::nameFromFont(const LLFontGL* fontp)  {  	return fontp->mFontDescriptor.getName(); diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index bb7d8524e7..ea8eee7690 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -144,6 +144,7 @@ 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); diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index abd5436018..c1af428674 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -45,9 +45,8 @@ public:  	{  		Optional<std::string>	orientation;  		Optional<S32>			border_size; -		Optional<bool>			animate; -		Optional<bool>			clip; -		// mMinWidth and mMinHeight are calculated, not set in XML +		Optional<bool>			animate, +								clip;  		Params();  	}; diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index 86bd2f05ce..74e30cd633 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -43,15 +43,43 @@  #include "llui.h"  #include "llfocusmgr.h"  #include "lluictrlfactory.h" +#include "llsdutil.h"  static LLDefaultChildRegistry::Register<LLRadioGroup> r1("radio_group"); -static RadioGroupRegistry::Register<LLRadioCtrl> register_radio_ctrl("radio_item"); +/* + * An invisible view containing multiple mutually exclusive toggling  + * buttons (usually radio buttons).  Automatically handles the mutex + * condition by highlighting only one button at a time. + */ +class LLRadioCtrl : public LLCheckBoxCtrl  +{ +public: +	typedef LLRadioGroup::ItemParams Params; +	/*virtual*/ ~LLRadioCtrl(); +	/*virtual*/ void setValue(const LLSD& value); + +	/*virtual*/ BOOL postBuild(); + +	LLSD getPayload() { return mPayload; } +	// Ensure label is in an attribute, not the contents +	static void setupParamsForExport(Params& p, LLView* parent); + +protected: +	LLRadioCtrl(const LLRadioGroup::ItemParams& p); +	friend class LLUICtrlFactory; + +	LLSD mPayload;	// stores data that this item represents in the radio group +}; +static LLWidgetNameRegistry::StaticRegistrar register_radio_item(&typeid(LLRadioGroup::ItemParams), "radio_item");  LLRadioGroup::Params::Params() -:	has_border("draw_border") +:	has_border("draw_border"), +	items("item")   { +	addSynonym(items, "radio_item"); +  	name = "radio_group";  	mouse_opaque = true;  	follows.flags = FOLLOWS_LEFT | FOLLOWS_TOP; @@ -76,6 +104,24 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p)  	}  } +void LLRadioGroup::initFromParams(const Params& p) +{ +	LLUICtrl::initFromParams(p); +	for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin(); +		it != p.items().end(); +		++it) +	{ +		LLRadioGroup::ItemParams item_params(*it); +		item_params.font.setIfNotProvided(mFont); // apply radio group font by default +		item_params.commit_callback.function = boost::bind(&LLRadioGroup::onClickButton, this, _1); +		item_params.from_xui = p.from_xui; + +		LLRadioCtrl* item = LLUICtrlFactory::create<LLRadioCtrl>(item_params, this); +		mRadioButtons.push_back(item); +	} +} + +  LLRadioGroup::~LLRadioGroup()  {  } @@ -141,7 +187,7 @@ void LLRadioGroup::setIndexEnabled(S32 index, BOOL enabled)  BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)  { -	if (index < 0 || index >= (S32)mRadioButtons.size()) +	if (index < 0 || (S32)mRadioButtons.size() <= index )  	{  		return FALSE;  	} @@ -170,7 +216,7 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event)  	if (!from_event)  	{ -		setControlValue(getSelectedIndex()); +		setControlValue(getValue());  	}  	return TRUE; @@ -235,27 +281,6 @@ BOOL LLRadioGroup::handleKeyHere(KEY key, MASK mask)  	return handled;  } - -// When adding a child button, we need to ensure that the radio -// group gets a message when the button is clicked. - -/*virtual*/ -bool LLRadioGroup::addChild(LLView* view, S32 tab_group) -{ -	bool res = LLView::addChild(view, tab_group); -	if (res) -	{ -		LLRadioCtrl* radio_ctrl = dynamic_cast<LLRadioCtrl*>(view); -		if (radio_ctrl) -		{ -			radio_ctrl->setFont(mFont); -			radio_ctrl->setCommitCallback(boost::bind(&LLRadioGroup::onClickButton, this, _1)); -			mRadioButtons.push_back(radio_ctrl); -		} -	} -	return res; -} -  BOOL LLRadioGroup::handleMouseDown(S32 x, S32 y, MASK mask)  {  	// grab focus preemptively, before child button takes mousecapture @@ -302,13 +327,12 @@ void LLRadioGroup::onClickButton(LLUICtrl* ctrl)  void LLRadioGroup::setValue( const LLSD& value )  { -	std::string value_name = value.asString();  	int idx = 0;  	for (button_list_t::const_iterator iter = mRadioButtons.begin();  		 iter != mRadioButtons.end(); ++iter)  	{  		LLRadioCtrl* radio = *iter; -		if (radio->getName() == value_name) +		if (llsd_equals(radio->getPayload(), value))  		{  			setSelectedIndex(idx);  			idx = -1; @@ -325,7 +349,7 @@ void LLRadioGroup::setValue( const LLSD& value )  		}  		else  		{ -			llwarns << "LLRadioGroup::setValue: value not found: " << value_name << llendl; +			llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;  		}  	}  } @@ -337,7 +361,7 @@ LLSD LLRadioGroup::getValue() const  	for (button_list_t::const_iterator iter = mRadioButtons.begin();  		 iter != mRadioButtons.end(); ++iter)  	{ -		if (idx == index) return LLSD((*iter)->getName()); +		if (idx == index) return LLSD((*iter)->getPayload());  		++idx;  	}  	return LLSD(); @@ -357,11 +381,10 @@ LLUUID	LLRadioGroup::getCurrentID() const  BOOL	LLRadioGroup::setSelectedByValue(const LLSD& value, BOOL selected)  {  	S32 idx = 0; -	std::string value_string = value.asString();  	for (button_list_t::const_iterator iter = mRadioButtons.begin();  		 iter != mRadioButtons.end(); ++iter)  	{ -		if((*iter)->getName() == value_string) +		if(llsd_equals((*iter)->getPayload(), value))  		{  			setSelectedIndex(idx);  			return TRUE; @@ -380,11 +403,10 @@ LLSD	LLRadioGroup::getSelectedValue()  BOOL	LLRadioGroup::isSelected(const LLSD& value) const  {  	S32 idx = 0; -	std::string value_string = value.asString();  	for (button_list_t::const_iterator iter = mRadioButtons.begin();  		 iter != mRadioButtons.end(); ++iter)  	{ -		if((*iter)->getName() == value_string) +		if(llsd_equals((*iter)->getPayload(), value))  		{  			if (idx == mSelectedIndex)   			{ @@ -406,9 +428,21 @@ BOOL	LLRadioGroup::operateOnAll(EOperation op)  	return FALSE;  } -LLRadioCtrl::LLRadioCtrl(const LLRadioCtrl::Params& p) -	: LLCheckBoxCtrl(p) +LLRadioGroup::ItemParams::ItemParams() +:	value("value")  { +	addSynonym(value, "initial_value"); +} + +LLRadioCtrl::LLRadioCtrl(const LLRadioGroup::ItemParams& p) +:	LLCheckBoxCtrl(p), +	mPayload(p.value) +{ +	// use name as default "Value" for backwards compatibility +	if (!p.value.isProvided()) +	{ +		mPayload = p.name(); +	}  }  BOOL LLRadioCtrl::postBuild() diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h index 1e9b5115f8..b178bb36ca 100644 --- a/indra/llui/llradiogroup.h +++ b/indra/llui/llradiogroup.h @@ -37,35 +37,6 @@  #include "llcheckboxctrl.h"  #include "llctrlselectioninterface.h" - -/* - * An invisible view containing multiple mutually exclusive toggling  - * buttons (usually radio buttons).  Automatically handles the mutex - * condition by highlighting only one button at a time. - */ -class LLRadioCtrl : public LLCheckBoxCtrl  -{ -public: -	struct Params : public LLInitParam::Block<Params, LLCheckBoxCtrl::Params> -	{}; - -	/*virtual*/ ~LLRadioCtrl(); -	/*virtual*/ void setValue(const LLSD& value); - -	/*virtual*/ BOOL postBuild(); - -	// Ensure label is in an attribute, not the contents -	static void setupParamsForExport(Params& p, LLView* parent); - -protected: -	LLRadioCtrl(const Params& p); -	friend class LLUICtrlFactory; -}; - - -struct RadioGroupRegistry : public LLChildRegistry<RadioGroupRegistry> -{}; -  /*   * An invisible view containing multiple mutually exclusive toggling    * buttons (usually radio buttons).  Automatically handles the mutex @@ -76,25 +47,31 @@ class LLRadioGroup  {  public: +	struct ItemParams : public LLInitParam::Block<ItemParams, LLCheckBoxCtrl::Params> +	{ +		Optional<LLSD>	value; +		ItemParams(); +	}; +  	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>  	{ -		Optional<bool> has_border; +		Optional<bool>						has_border; +		Multiple<ItemParams, AtLeast<1> >	items;  		Params();  	}; -	// my valid children are stored in this registry -	typedef RadioGroupRegistry child_registry_t; -  protected:  	LLRadioGroup(const Params&);  	friend class LLUICtrlFactory;  public: + +	/*virtual*/ void initFromParams(const Params&); +  	virtual ~LLRadioGroup();  	virtual BOOL postBuild(); -	virtual bool addChild(LLView* view, S32 tab_group = 0);  	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);  	virtual BOOL handleKeyHere(KEY key, MASK mask); @@ -134,7 +111,7 @@ public:  private:  	const LLFontGL* mFont;  	S32 mSelectedIndex; -	typedef std::vector<LLRadioCtrl*> button_list_t; +	typedef std::vector<class LLRadioCtrl*> button_list_t;  	button_list_t mRadioButtons;  	BOOL mHasBorder; diff --git a/indra/llui/llsearcheditor.h b/indra/llui/llsearcheditor.h index bd2d595174..714aca9337 100644 --- a/indra/llui/llsearcheditor.h +++ b/indra/llui/llsearcheditor.h @@ -50,15 +50,17 @@ class LLSearchEditor : public LLUICtrl  public:  	struct Params : public LLInitParam::Block<Params, LLLineEditor::Params>  	{ -		Optional<LLButton::Params> search_button, clear_button; -		Optional<bool> search_button_visible, clear_button_visible; +		Optional<LLButton::Params>	search_button,  +									clear_button; +		Optional<bool>				search_button_visible,  +									clear_button_visible;  		Optional<commit_callback_t> keystroke_callback;  		Params() -		: search_button("search_button") -		, search_button_visible("search_button_visible") -		, clear_button("clear_button") -		, clear_button_visible("clear_button_visible") +		:	search_button("search_button"), +			search_button_visible("search_button_visible"), +			clear_button("clear_button"),  +			clear_button_visible("clear_button_visible")  		{  			name = "search_editor";  		} diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 6603887905..67d3ed408b 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1896,17 +1896,26 @@ namespace LLInitParam  		control("")  	{} -	LLUIColor TypedParam<LLUIColor>::getValueFromBlock() const +	void TypedParam<LLUIColor>::setValueFromBlock() const  	{  		if (control.isProvided())  		{ -			return LLUIColorTable::instance().getColor(control); +			mData.mValue = LLUIColorTable::instance().getColor(control);  		}  		else  		{ -			return LLColor4(red, green, blue, alpha); +			mData.mValue = LLColor4(red, green, blue, alpha);  		}  	} +	 +	void TypedParam<LLUIColor>::setBlockFromValue() +	{ +		LLColor4 color = mData.mValue.get(); +		red = color.mV[VRED]; +		green = color.mV[VGREEN]; +		blue = color.mV[VBLUE]; +		alpha = color.mV[VALPHA]; +	}  	void TypeValues<LLUIColor>::declareValues()  	{ @@ -1932,28 +1941,32 @@ namespace LLInitParam  		addSynonym(name, "");  	} -	const LLFontGL* TypedParam<const LLFontGL*>::getValueFromBlock() const +	void TypedParam<const LLFontGL*>::setValueFromBlock() const  	{ -		if (name.isProvided()) +		const LLFontGL* res_fontp = LLFontGL::getFontByName(name); +		if (res_fontp)  		{ -			const LLFontGL* res_fontp = LLFontGL::getFontByName(name); -			if (res_fontp) -			{ -				return res_fontp; -			} +			mData.mValue = res_fontp; +		} -			U8 fontstyle = 0; -			fontstyle = LLFontGL::getStyleFromString(style()); -			LLFontDescriptor desc(name(), size(), fontstyle); -			const LLFontGL* fontp = LLFontGL::getFont(desc); -			if (fontp) -			{ -				return fontp; -			} +		U8 fontstyle = 0; +		fontstyle = LLFontGL::getStyleFromString(style()); +		LLFontDescriptor desc(name(), size(), fontstyle); +		const LLFontGL* fontp = LLFontGL::getFont(desc); +		if (fontp) +		{ +			mData.mValue = fontp; +		}		 +	} +	 +	void TypedParam<const LLFontGL*>::setBlockFromValue() +	{ +		if (mData.mValue) +		{ +			name = LLFontGL::nameFromFont(mData.mValue); +			size = LLFontGL::sizeFromFont(mData.mValue); +			style = LLFontGL::getStringFromStyle(mData.mValue->getFontDesc().getStyle());  		} -		 -		// default to current value -		return mData.mValue;  	}  	TypedParam<LLRect>::TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) @@ -1966,7 +1979,7 @@ namespace LLInitParam  		height("height")  	{} -	LLRect TypedParam<LLRect>::getValueFromBlock() const +	void TypedParam<LLRect>::setValueFromBlock() const  	{  		LLRect rect; @@ -2027,7 +2040,17 @@ namespace LLInitParam  			rect.mBottom = bottom;  			rect.mTop = top;  		} -		return rect; +		mData.mValue = rect; +	} +	 +	void TypedParam<LLRect>::setBlockFromValue() +	{ +		left = mData.mValue.mLeft; +		right = mData.mValue.mRight; +		bottom = mData.mValue.mBottom; +		top = mData.mValue.mTop; +		width.setProvided(false); +		height.setProvided(false);  	}  	TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) @@ -2037,9 +2060,15 @@ namespace LLInitParam  	{  	} -	LLCoordGL TypedParam<LLCoordGL>::getValueFromBlock() const +	void TypedParam<LLCoordGL>::setValueFromBlock() const +	{ +		mData.mValue.set(x, y); +	} +	 +	void TypedParam<LLCoordGL>::setBlockFromValue()  	{ -		return LLCoordGL(x, y); +		x = mData.mValue.mX; +		y = mData.mValue.mY;  	} diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 5ec07f1941..5840e76f5c 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -379,7 +379,8 @@ namespace LLInitParam  		TypedParam(BlockDescriptor& descriptor, const char* name, const LLRect& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); -		LLRect getValueFromBlock() const; +		void setValueFromBlock() const; +		void setBlockFromValue();  	};  	template<> @@ -401,7 +402,8 @@ namespace LLInitParam  		Optional<std::string> control;  		TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); -		LLUIColor getValueFromBlock() const; +		void setValueFromBlock() const; +		void setBlockFromValue();  	};  	// provide a better default for Optional<const LLFontGL*> than NULL @@ -429,7 +431,8 @@ namespace LLInitParam  								style;  		TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); -		const LLFontGL* getValueFromBlock() const; +		void setValueFromBlock() const; +		void setBlockFromValue();  	};  	template<> @@ -467,7 +470,8 @@ namespace LLInitParam  						y;  		TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count); -		LLCoordGL getValueFromBlock() const; +		void setValueFromBlock() const; +		void setBlockFromValue();  	};  } diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index 3643bf44f7..625d3c63e5 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -105,9 +105,12 @@ void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitPa  	}  } +static LLFastTimer::DeclareTimer FTM_CREATE_CHILDREN("Create XUI Children"); +  //static   void LLUICtrlFactory::createChildren(LLView* viewp, LLXMLNodePtr node, const widget_registry_t& registry, LLXMLNodePtr output_node)  { +	LLFastTimer ft(FTM_CREATE_CHILDREN);  	if (node.isNull()) return;  	for (LLXMLNodePtr child_node = node->getFirstChild(); child_node.notNull(); child_node = child_node->getNextSibling()) @@ -393,7 +396,6 @@ BOOL LLUICtrlFactory::getAttributeColor(LLXMLNodePtr node, const std::string& na  //static  void LLUICtrlFactory::setCtrlParent(LLView* view, LLView* parent, S32 tab_group)  { -	if (tab_group < 0) tab_group = parent->getLastTabGroup();  	parent->addChild(view, tab_group);  } @@ -452,10 +454,4 @@ dummy_widget_creator_func_t* LLUICtrlFactory::getDefaultWidgetFunc(const std::ty  const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_type)  {  	return LLWidgetNameRegistry::instance().getValue(widget_type); -} - -// static -void LLUICtrlFactory::connect(LLView* parent, LLView* child) -{ -	parent->addChild(child); -} +}
\ No newline at end of file diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 55d7d745eb..6dab9521bb 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -180,34 +180,52 @@ public:  	void popFactoryFunctions();  	template<typename T> -	static T* create(typename T::Params& params, LLView* parent = NULL) +	static T* createWidget(typename T::Params& params, LLView* parent = NULL)  	{ -		//#pragma message("Generating LLUICtrlFactory::create") -		params.fillFrom(ParamDefaults<typename T::Params, 0>::instance().get()); -		//S32 foo = "test"; +		T* widget = NULL;  		if (!params.validateBlock())  		{  			llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl; +			//return NULL; +		} + +		{ +			LLFastTimer timer(FTM_WIDGET_CONSTRUCTION); +			widget = new T(params);	 +		} +		{ +			LLFastTimer timer(FTM_INIT_FROM_PARAMS); +			widget->initFromParams(params);  		} -		T* widget = new T(params); -		widget->initFromParams(params); +  		if (parent)  		{ -			connect(parent, widget); +			S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : parent->getLastTabGroup(); +			setCtrlParent(widget, parent, tab_group);  		}  		return widget;  	} -	// fix for gcc template instantiation annoyance -	static void connect(LLView* parent, LLView* child); -	 +	template<typename T> +	static T* create(typename T::Params& params, LLView* parent = NULL) +	{ +		params.fillFrom(ParamDefaults<typename T::Params, 0>::instance().get()); + +		T* widget = createWidget<T>(params, parent); +		if (widget) +		{ +			widget->postBuild(); +		} + +		return widget; +	} +  	LLView* createFromXML(LLXMLNodePtr node, LLView* parent, const std::string& filename, const widget_registry_t&, LLXMLNodePtr output_node );  	template<typename T>  	static T* createFromFile(const std::string &filename, LLView *parent, const widget_registry_t& registry, LLXMLNodePtr output_node = NULL)  	{ -		//#pragma message("Generating LLUICtrlFactory::createFromFile")  		T* widget = NULL;  		std::string skinned_filename = findSkinnedFilename(filename); @@ -272,7 +290,6 @@ fail:  	{  		LLFastTimer timer(FTM_WIDGET_SETUP); -		//#pragma message("Generating LLUICtrlFactory::defaultBuilder")  		typename T::Params params(getDefaultParams<T>());  		LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName()); @@ -292,34 +309,14 @@ fail:  		// Apply layout transformations, usually munging rect  		T::setupParams(params, parent); -		if (!params.validateBlock()) -		{ -			llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl; -		} -		T* widget; -		{ -			LLFastTimer timer(FTM_WIDGET_CONSTRUCTION); -			widget = new T(params);	 -		} -		{ -			LLFastTimer timer(FTM_INIT_FROM_PARAMS); -			widget->initFromParams(params); -		} - -		if (parent) -		{ -			S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : -1; -			setCtrlParent(widget, parent, tab_group); -		} -		 -		typedef typename T::child_registry_t registry_t; +		T* widget = createWidget<T>(params, parent); -		createChildren(widget, node, registry_t::instance(), output_node); +		createChildren(widget, node, typename T::child_registry_t::instance(), output_node); -		if (!widget->postBuild()) +		if (widget && !widget->postBuild())  		{  			delete widget; -			return NULL; +			widget = NULL;  		}  		return widget; diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index f941f391eb..1dfc281d93 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -161,22 +161,32 @@ void LLUIImage::onImageLoaded()  namespace LLInitParam  { -	LLUIImage* TypedParam<LLUIImage*>::getValueFromBlock() const +	void TypedParam<LLUIImage*>::setValueFromBlock() const  	{  		// The keyword "none" is specifically requesting a null image  		// do not default to current value. Used to overwrite template images.   		if (name() == "none")  		{ -			return NULL; +			mData.mValue = NULL;  		}  		LLUIImage* imagep =  LLUI::getUIImage(name()); -		if (!imagep) +		if (imagep)  		{ -			// default to current value -			imagep = mData.mValue; +			mData.mValue = imagep; +		} +	} +	 +	void TypedParam<LLUIImage*>::setBlockFromValue() +	{ +		if (mData.mValue == NULL) +		{ +			name = "none"; +		} +		else +		{ +			name = mData.mValue->getName();  		} -		return imagep;  	} diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h index 5fa9610ab2..bdfc44262d 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llui/lluiimage.h @@ -111,7 +111,8 @@ namespace LLInitParam  		{  		} -		LLUIImage* getValueFromBlock() const; +		void setValueFromBlock() const; +		void setBlockFromValue();  	};  	// Need custom comparison function for our test app, which only loads diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 8917e4b813..9f6fc1f298 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -2494,8 +2494,6 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)  	const S32 VPAD = 4;  	const S32 MIN_WIDGET_HEIGHT = 10; -	p.from_xui(true); -  	// *NOTE:  This will confuse export of floater/panel coordinates unless  	// the default is also "topleft".  JC  	if (p.layout().empty() && parent) @@ -2503,6 +2501,8 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)  		p.layout = parent->getLayout();  	} +	p.from_xui = true; +  	if (parent)  	{  		LLRect parent_rect = parent->getLocalRect(); @@ -2518,7 +2518,7 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)  		}  		// convert negative or centered coordinates to parent relative values -		// Note: some of this logic matches the logic in TypedParam<LLRect>::getValueFromBlock() +		// Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock()  		if (p.center_horiz)  		{ diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 493ddaa378..7e1e4a3d21 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -1,5 +1,5 @@  /**  - * @file llinitparam.h +f * @file llinitparam.h   * @brief parameter block abstraction for creating complex objects and    * parsing construction parameters from xml and LLSD   * @@ -405,6 +405,41 @@ namespace LLInitParam  	class BaseBlock  	{  	public: +		// "Multiple" constraint types +		struct AnyAmount +		{ +			static U32 minCount() { return 0; } +			static U32 maxCount() { return U32_MAX; } +		}; + +		template<U32 MIN_AMOUNT> +		struct AtLeast +		{ +			static U32 minCount() { return MIN_AMOUNT; } +			static U32 maxCount() { return U32_MAX; } +		}; + +		template<U32 MAX_AMOUNT> +		struct AtMost +		{ +			static U32 minCount() { return 0; } +			static U32 maxCount() { return MAX_AMOUNT; } +		}; + +		template<U32 MIN_AMOUNT, U32 MAX_AMOUNT> +		struct Between +		{ +			static U32 minCount() { return MIN_AMOUNT; } +			static U32 maxCount() { return MAX_AMOUNT; } +		}; + +		template<U32 EXACT_COUNT> +		struct Exactly +		{ +			static U32 minCount() { return EXACT_COUNT; } +			static U32 maxCount() { return EXACT_COUNT; } +		}; +  		// this typedef identifies derived classes as being blocks  		typedef void baseblock_base_class_t;  		LOG_CLASS(BaseBlock); @@ -1365,40 +1400,6 @@ namespace LLInitParam  		}  	}; -	struct AnyAmount -	{ -		static U32 minCount() { return 0; } -		static U32 maxCount() { return U32_MAX; } -	}; - -	template<U32 MIN_AMOUNT> -	struct AtLeast -	{ -		static U32 minCount() { return MIN_AMOUNT; } -		static U32 maxCount() { return U32_MAX; } -	}; - -	template<U32 MAX_AMOUNT> -	struct AtMost -	{ -		static U32 minCount() { return 0; } -		static U32 maxCount() { return MAX_AMOUNT; } -	}; - -	template<U32 MIN_AMOUNT, U32 MAX_AMOUNT> -	struct Between -	{ -		static U32 minCount() { return MIN_AMOUNT; } -		static U32 maxCount() { return MAX_AMOUNT; } -	}; - -	template<U32 EXACT_COUNT> -	struct Exactly -	{ -		static U32 minCount() { return EXACT_COUNT; } -		static U32 maxCount() { return EXACT_COUNT; } -	}; -  	template <typename DERIVED_BLOCK, typename BASE_BLOCK = BaseBlock>  	class Block   	:	public BASE_BLOCK @@ -1491,7 +1492,7 @@ namespace LLInitParam  		}; -		template <typename T, typename RANGE = AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> > +		template <typename T, typename RANGE = BaseBlock::AnyAmount, typename NAME_VALUE_LOOKUP = TypeValues<T> >  		class Multiple : public TypedParam<T, NAME_VALUE_LOOKUP, true>  		{  		public: @@ -1711,7 +1712,7 @@ namespace LLInitParam  			{  				if (block_t::validateBlock(true))  				{ -					mData.mValue = static_cast<const DERIVED*>(this)->getValueFromBlock(); +					static_cast<const DERIVED*>(this)->setValueFromBlock();  					// clear stale keyword associated with old value  					mData.clearKey();  					mData.mLastParamVersion = BaseBlock::getLastChangeVersion(); @@ -1737,6 +1738,7 @@ namespace LLInitParam  			mData.mValue = val;  			mData.clearKey();  			setProvided(flag_as_provided); +			static_cast<DERIVED*>(this)->setBlockFromValue();  		}  		void setIfNotProvided(value_assignment_t val, bool flag_as_provided = true) @@ -1768,7 +1770,7 @@ namespace LLInitParam  				// go ahead and issue warnings at this point if any param is invalid  				if(block_t::validateBlock(false))  				{ -					mData.mValue = static_cast<const DERIVED*>(this)->getValueFromBlock(); +					static_cast<const DERIVED*>(this)->setValueFromBlock();  					mData.clearKey();  					mData.mLastParamVersion = BaseBlock::getLastChangeVersion();  				} diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 5b03292b22..0694143190 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1527,7 +1527,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo  		object_count_str = llformat("%d", object_count);  		item_params.columns.add().value(object_count_str).font(FONT).column("count"); -		item_params.columns.add().value(formatted_time((time_t)most_recent_time)).font(FONT).column("mostrecent"); +		item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");  		self->mOwnerList->addRow(item_params); diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 05a88a31d3..2ec7ec46af 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -46,7 +46,6 @@ class LLPanelVolume;  class LLPanelContents;  class LLPanelFace;  class LLPanelLandInfo; -class LLRadioCtrl;  class LLRadioGroup;  class LLSlider;  class LLTabContainer; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 063491494e..ee5f2c6cfd 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -249,7 +249,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	childSetAction("connect_btn", onClickConnect, this); -	getChild<LLPanel>("login_widgets")->setDefaultBtn("connect_btn"); +	getChild<LLPanel>("login")->setDefaultBtn("connect_btn");  	std::string channel = gSavedSettings.getString("VersionChannelName");  	std::string version = llformat("%s (%d)", diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index 275ab5bb8b..9d3694873e 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -167,6 +167,7 @@                   left="1"                   name="radio"                   top="1" +                 value="0"                   width="82" />                  <radio_item                   height="16" @@ -174,6 +175,7 @@                   layout="topleft"                   left_delta="0"                   name="radio2" +                 value="1"                   top_delta="16"                   width="82" />              </radio_group> diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml index ffb11f3f18..3ed2bd7206 100644 --- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml @@ -30,26 +30,29 @@       top_pad="10"       width="320"       word_wrap="true" /> -    <combo_box -     follows="top|left" -     height="20" -     layout="topleft" -     left_delta="0" -     name="boolean_combo" -     top_pad="10" -     visible="false" -     width="100"> -        <combo_box.item -         label="TRUE" -         name="TRUE" -         value="true" /> -        <combo_box.item -         label="FALSE" -         name="FALSE" -         value="" /> -         <combo_box.commit_callback -           function="CommitSettings" /> -    </combo_box> +  <radio_group +   follows="top|left" +   height="30" +   layout="topleft" +   left_delta="0" +   name="boolean_combo" +   top_pad="10" +   visible="false" +   tab_stop="true"  +   width="100"> +    <radio_item +      top_pad="5"  +     label="TRUE" +     name="TRUE" +     value="true" /> +    <radio_item +      top_pad="5"  +     label="FALSE" +     name="FALSE" +     value="" /> +    <commit_callback +      function="CommitSettings" /> +  </radio_group>      <line_editor       height="20"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index fff53c1de2..d0e325b04e 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -16,13 +16,14 @@  	 control_name="ChatFontSize"       name="chat_font_size"       top="10" -     width="331"> +     width="440">          <radio_item           height="16"           label="Small"           layout="topleft"           left="0"           name="radio" +         value="0"            top="10"           width="125" />          <radio_item @@ -31,6 +32,7 @@           layout="topleft"           left_delta="145"           name="radio2" +         value="1"                    top_delta="0"           width="125" />          <radio_item @@ -39,6 +41,7 @@           layout="topleft"           left_delta="170"           name="radio3" +         value="2"            top_delta="0"           width="125" />      </radio_group> @@ -340,6 +343,7 @@        layout="topleft"        left="0"        name="radio" +      value="0"        top="0"        width="150" />       <radio_item @@ -348,6 +352,7 @@        layout="topleft"        left_delta="145"        name="radio2" +      value="1"        top_delta="0"        width="150" />      </radio_group> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index d711a2e6ec..8c64bafccc 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -217,6 +217,7 @@           layout="topleft"           left="0"           name="radio" +         value="0"           top_pad="0"           width="98" />          <radio_item @@ -225,6 +226,7 @@           layout="topleft"           left_pad="12"           name="radio2" +         value="1"           top_delta="0"           width="98" />          <radio_item @@ -233,6 +235,7 @@           layout="topleft"           left_pad="12"           name="radio3" +         value="2"            top_delta="0"           width="98" />      </radio_group> @@ -290,24 +293,24 @@       tool_tip="Click to open Color Picker"       top_pad="5"       width="32" /> -  <text -      type="string" -      length="1" -      follows="left|top" -      height="15" -      layout="topleft" -      left="30" -      name="title_afk_text" -      text_color="white" -      top_pad="-5" -      width="190"> -    Away timeout: -  </text> +    <text +     type="string" +     length="1" +     follows="left|top" +     height="15" +     layout="topleft" +     left="30" +     name="title_afk_text" +     text_color="white" +     top_pad="-5" +     width="190"> +        Away timeout: +    </text>    <combo_box              top_pad="-20"               height="20"              layout="topleft" -            control_name="AFKTimeout" +     control_name="AFKTimeout"              left="140"              label="Away Timeout:"               name="afk" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 04985d0fa9..f97ccafecc 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -28,7 +28,7 @@       follows="left|top"       height="15"       increment="0.025" -     initial_valu="1" +     initial_value="1"       layout="topleft"       left_delta="52"       max_val="1.4" @@ -656,6 +656,7 @@              layout="topleft"              left="3"              name="SunMoon" +            value="0"              top="3"              width="156" />             <radio_item @@ -664,6 +665,7 @@              layout="topleft"              left_delta="0"              name="LocalLights" +            value="1"              top_delta="16"              width="156" />          </radio_group> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index a7def5306e..e06c15502c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -268,24 +268,26 @@       name="use_external_browser"       top_pad="4"       width="480"> -        <radio_item -         height="20" -         label="Use built-in browser" -         layout="topleft" -		 left="0" -		 name="internal" -         tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." -		 top="0" -         width="480" /> -		<radio_item -         height="20" -         label="Use my browser (IE, Firefox)" -         layout="topleft" -         left_delta="0" -         name="external" -         tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen." -         top_delta="20" -         width="480" /> +      <radio_item +        height="20" +        label="Use built-in browser" +        layout="topleft" +        left="0" +        name="internal" +        value="0"  +        tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." +        top="0" +        width="480" /> +      <radio_item +        height="20" +        label="Use my browser (IE, Firefox)" +        layout="topleft" +        left_delta="0" +        name="external" +        value="1" +        tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen." +        top_delta="20" +        width="480" />      </radio_group>     <check_box diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 8e683bffc1..6324ec2bd8 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -26,18 +26,20 @@       top="2"       width="23" />      <text_editor -	 read_only = "true" -     follows="top|left|right" -     font="SansSerifHugeBold" -     height="29" -     layout="topleft" -     left_pad="10" -     name="user_name" -     text_color="white" -     top="0" -     value="(Loading...)" -     use_ellipses="true" -     width="275" /> +      allow_scroll="false"  +      bg_visible="false"  +      read_only = "true" +      follows="top|left|right" +      font="SansSerifHugeBold" +      height="29" +      layout="topleft" +      left_pad="10" +      name="user_name" +      text_color="white" +      top="0" +      value="(Loading...)" +      use_ellipses="true" +      width="275" />      <text       follows="top|left"       height="13"  | 
