diff options
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llmenugl.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/llmenugl.h | 3 | ||||
| -rw-r--r-- | indra/llui/llpanel.cpp | 9 | ||||
| -rw-r--r-- | indra/llui/llui.cpp | 48 | ||||
| -rw-r--r-- | indra/llui/lluictrlfactory.cpp | 27 | ||||
| -rw-r--r-- | indra/llui/lluictrlfactory.h | 8 | 
6 files changed, 83 insertions, 15 deletions
| diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index b77126996e..b4a1bcb7c5 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -139,6 +139,7 @@ LLMenuItemGL::Params::Params()  :	shortcut("shortcut"),  	jump_key("jump_key", KEY_NONE),  	use_mac_ctrl("use_mac_ctrl", false), +	allow_key_repeat("allow_key_repeat", false),  	rect("rect"),  	left("left"),  	top("top"), @@ -160,7 +161,7 @@ LLMenuItemGL::Params::Params()  LLMenuItemGL::LLMenuItemGL(const LLMenuItemGL::Params& p)  :	LLUICtrl(p),  	mJumpKey(p.jump_key), -	mAllowKeyRepeat(FALSE), +	mAllowKeyRepeat(p.allow_key_repeat),  	mHighlight( FALSE ),  	mGotHover( FALSE ),  	mBriefItem( FALSE ), diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 6f0f83d4b9..7668f301ea 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -61,7 +61,8 @@ public:  	{  		Optional<std::string>	shortcut;  		Optional<KEY>			jump_key; -		Optional<bool>			use_mac_ctrl; +		Optional<bool>			use_mac_ctrl, +								allow_key_repeat;  		Ignored					rect,  								left, diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 0cd052eefa..9ebdcb87c6 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -508,16 +508,19 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu  		if (xml_filename.empty())  		{  			node->getAttributeString("filename", xml_filename); +			setXMLFilename(xml_filename);  		}  		if (!xml_filename.empty())  		{ +			LLUICtrlFactory::instance().pushFileName(xml_filename); +  			LLFastTimer timer(FTM_EXTERNAL_PANEL_LOAD);  			if (output_node)  			{  				//if we are exporting, we want to export the current xml  				//not the referenced xml -				LLXUIParser::instance().readXUI(node, params, xml_filename); +				LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName());  				Params output_params(params);  				setupParamsForExport(output_params, parent);  				output_node->setName(node->getName()->mString); @@ -533,13 +536,13 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu  				return FALSE;  			} -			LLXUIParser::instance().readXUI(referenced_xml, params, xml_filename); +			LLXUIParser::instance().readXUI(referenced_xml, params, LLUICtrlFactory::getInstance()->getCurFileName());  			// add children using dimensions from referenced xml for consistent layout  			setShape(params.rect);  			LLUICtrlFactory::createChildren(this, referenced_xml, child_registry_t::instance()); -			setXMLFilename(xml_filename); +			LLUICtrlFactory::instance().popFileName();  		}  		// ask LLUICtrlFactory for filename, since xml_filename might be empty diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index bf12384a28..dff1cb93e7 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1752,6 +1752,33 @@ std::string LLUI::getLanguage()  	return language;  } +struct SubDir : public LLInitParam::Block<SubDir> +{ +	Mandatory<std::string> value; + +	SubDir() +	:	value("value") +	{} +}; + +struct Directory : public LLInitParam::Block<Directory> +{ +	Multiple<SubDir, AtLeast<1> > subdirs; + +	Directory() +	:	subdirs("subdir") +	{} +}; + +struct Paths : public LLInitParam::Block<Paths> +{ +	Multiple<Directory, AtLeast<1> > directories; + +	Paths() +	:	directories("directory") +	{} +}; +  //static  void LLUI::setupPaths()  { @@ -1759,21 +1786,36 @@ void LLUI::setupPaths()  	LLXMLNodePtr root;  	BOOL success  = LLXMLNode::parseFile(filename, root, NULL); +	Paths paths; +	LLXUIParser::instance().readXUI(root, paths, filename); +  	sXUIPaths.clear(); -	if (success) +	if (success && paths.validateBlock())  	{  		LLStringUtil::format_map_t path_args;  		path_args["[LANGUAGE]"] = LLUI::getLanguage(); -		for (LLXMLNodePtr path = root->getFirstChild(); path.notNull(); path = path->getNextSibling()) +		for (LLInitParam::ParamIterator<Directory>::const_iterator it = paths.directories().begin(),  +				end_it = paths.directories().end(); +			it != end_it; +			++it)  		{ -			std::string path_val_ui(path->getValue()); +			std::string path_val_ui; +			for (LLInitParam::ParamIterator<SubDir>::const_iterator subdir_it = it->subdirs().begin(), +					subdir_end_it = it->subdirs().end(); +				subdir_it != subdir_end_it;) +			{ +				path_val_ui += subdir_it->value(); +				if (++subdir_it != subdir_end_it) +					path_val_ui += gDirUtilp->getDirDelimiter(); +			}  			LLStringUtil::format(path_val_ui, path_args);  			if (std::find(sXUIPaths.begin(), sXUIPaths.end(), path_val_ui) == sXUIPaths.end())  			{  				sXUIPaths.push_back(path_val_ui);  			} +  		}  	}  	else // parsing failed diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index 4dd155f8e5..6b337e0d74 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -101,7 +101,9 @@ void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitPa  	if (LLUICtrlFactory::getLayeredXMLNode(filename, root_node))  	{ +		LLUICtrlFactory::instance().pushFileName(filename);  		LLXUIParser::instance().readXUI(root_node, block, filename); +		LLUICtrlFactory::instance().popFileName();  	}  } @@ -211,7 +213,7 @@ bool LLUICtrlFactory::buildFloater(LLFloater* floaterp, const std::string& filen  	bool res = true;  	lldebugs << "Building floater " << filename << llendl; -	mFileNames.push_back(gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), filename)); +	pushFileName(filename);  	{  		if (!floaterp->getFactoryMap().empty())  		{ @@ -234,7 +236,7 @@ bool LLUICtrlFactory::buildFloater(LLFloater* floaterp, const std::string& filen  			mFactoryStack.pop_front();  		}  	} -	mFileNames.pop_back(); +	popFileName();  	return res;  } @@ -283,7 +285,7 @@ BOOL LLUICtrlFactory::buildPanel(LLPanel* panelp, const std::string& filename, L  	lldebugs << "Building panel " << filename << llendl; -	mFileNames.push_back(gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), filename)); +	pushFileName(filename);  	{  		if (!panelp->getFactoryMap().empty())  		{ @@ -306,7 +308,7 @@ BOOL LLUICtrlFactory::buildPanel(LLPanel* panelp, const std::string& filename, L  			mFactoryStack.pop_front();  		}  	} -	mFileNames.pop_back(); +	popFileName();  	return didPost;  } @@ -364,6 +366,23 @@ LLPanel* LLUICtrlFactory::createFactoryPanel(const std::string& name)  	return create<LLPanel>(panel_p);  } +std::string LLUICtrlFactory::getCurFileName()  +{  +	return mFileNames.empty() ? "" : gDirUtilp->getWorkingDir() + gDirUtilp->getDirDelimiter() + mFileNames.back();  +} + + +void LLUICtrlFactory::pushFileName(const std::string& name)  +{  +	mFileNames.push_back(gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), name));  +} + +void LLUICtrlFactory::popFileName()  +{  +	mFileNames.pop_back();  +} + +  //-----------------------------------------------------------------------------  //static diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index b1fa6add67..7da96ffce3 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -170,7 +170,9 @@ public:  	// Returns 0 on success  	S32 saveToXML(LLView* viewp, const std::string& filename); -	std::string getCurFileName() { return mFileNames.empty() ? "" : mFileNames.back(); } +	std::string getCurFileName(); +	void pushFileName(const std::string& name); +	void popFileName();  	static BOOL getAttributeColor(LLXMLNodePtr node, const std::string& name, LLColor4& color); @@ -229,7 +231,7 @@ public:  		T* widget = NULL;  		std::string skinned_filename = findSkinnedFilename(filename); -		getInstance()->mFileNames.push_back(skinned_filename); +		instance().pushFileName(filename);  		{  			LLXMLNodePtr root_node; @@ -263,7 +265,7 @@ public:  			}  		}  fail: -		getInstance()->mFileNames.pop_back(); +		instance().popFileName();  		return widget;  	} | 
