diff options
| author | Kent Quirk <q@lindenlab.com> | 2010-12-15 09:18:22 -0500 | 
|---|---|---|
| committer | Kent Quirk <q@lindenlab.com> | 2010-12-15 09:18:22 -0500 | 
| commit | cc345710d240b85e7e5b219fc5a8af01349549bc (patch) | |
| tree | 8d82f880d6e2f4200dd8e43d104cf4cbaec8e546 | |
| parent | b159a961bd29e88503b1fa62c3e9cf4212e0bf1d (diff) | |
| parent | 10d9328b86991272b6cbc7eda73e8f09afccfb52 (diff) | |
Merge
| -rw-r--r-- | BuildParams | 3 | ||||
| -rw-r--r-- | indra/newview/llpanelprofile.cpp | 131 | ||||
| -rw-r--r-- | indra/newview/llpanelprofile.h | 30 | 
3 files changed, 141 insertions, 23 deletions
| diff --git a/BuildParams b/BuildParams index 8e4164d5ca..dadacb0682 100644 --- a/BuildParams +++ b/BuildParams @@ -46,9 +46,6 @@ viewer-beta.viewer_channel = "Second Life Beta Viewer"  viewer-beta.login_channel = "Second Life Beta Viewer"  viewer-beta.build_debug_release_separately = true  viewer-beta.build_viewer_update_version_manager = true -# Settings to test new code ticket service -viewer-beta.codeticket_server_url = "http://pdp75.lindenlab.com:8000/codeticket/linden/" -viewer-beta.codeticket_add_context = true  # ========================================  # Viewer Release diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 6038ab20d8..b035d7d473 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -114,11 +114,109 @@ public:  LLAgentHandler gAgentHandler; +//-- LLPanelProfile::ChildStack begins ---------------------------------------- +LLPanelProfile::ChildStack::ChildStack() +:	mParent(NULL) +{ +} + +void LLPanelProfile::ChildStack::setParent(LLPanel* parent) +{ +	llassert_always(parent != NULL); +	mParent = parent; +} + +/// Save current parent's child views and remove them from the child list. +bool LLPanelProfile::ChildStack::push() +{ +	view_list_t vlist = *mParent->getChildList(); + +	for (view_list_t::const_iterator it = vlist.begin(); it != vlist.end(); ++it) +	{ +		LLView* viewp = *it; +		mParent->removeChild(viewp); +	} + +	mStack.push_back(vlist); +	dump(); +	return true; +} + +/// Restore saved children (adding them back to the child list). +bool LLPanelProfile::ChildStack::pop() +{ +	if (mStack.size() == 0) +	{ +		llwarns << "Empty stack" << llendl; +		llassert(mStack.size() == 0); +		return false; +	} + +	view_list_t& top = mStack.back(); +	for (view_list_t::const_iterator it = top.begin(); it != top.end(); ++it) +	{ +		LLView* viewp = *it; +		mParent->addChild(viewp); +	} + +	mStack.pop_back(); +	dump(); +	return true; +} + +/// Temporarily add all saved children back. +void LLPanelProfile::ChildStack::preParentReshape() +{ +	mSavedStack = mStack; +	while(mStack.size() > 0) +	{ +		pop(); +	} +} + +/// Add the temporarily saved children back. +void LLPanelProfile::ChildStack::postParentReshape() +{ +	mStack = mSavedStack; +	mSavedStack = stack_t(); + +	for (stack_t::const_iterator stack_it = mStack.begin(); stack_it != mStack.end(); ++stack_it) +	{ +		const view_list_t& vlist = (*stack_it); +		for (view_list_t::const_iterator list_it = vlist.begin(); list_it != vlist.end(); ++list_it) +		{ +			LLView* viewp = *list_it; +			lldebugs << "removing " << viewp->getName() << llendl; +			mParent->removeChild(viewp); +		} +	} +} + +void LLPanelProfile::ChildStack::dump() +{ +	unsigned lvl = 0; +	lldebugs << "child stack dump:" << llendl; +	for (stack_t::const_iterator stack_it = mStack.begin(); stack_it != mStack.end(); ++stack_it, ++lvl) +	{ +		std::ostringstream dbg_line; +		dbg_line << "lvl #" << lvl << ":"; +		const view_list_t& vlist = (*stack_it); +		for (view_list_t::const_iterator list_it = vlist.begin(); list_it != vlist.end(); ++list_it) +		{ +			dbg_line << " " << (*list_it)->getName(); +		} +		lldebugs << dbg_line.str() << llendl; +	} +} + +//-- LLPanelProfile::ChildStack ends ------------------------------------------ +  LLPanelProfile::LLPanelProfile()   : LLPanel()   , mTabCtrl(NULL)   , mAvatarId(LLUUID::null)  { +	mChildStack.setParent(this);  }  BOOL LLPanelProfile::postBuild() @@ -136,6 +234,15 @@ BOOL LLPanelProfile::postBuild()  	return TRUE;  } +// virtual +void LLPanelProfile::reshape(S32 width, S32 height, BOOL called_from_parent) +{ +	// Temporarily add saved children back and reshape them. +	mChildStack.preParentReshape(); +	LLPanel::reshape(width, height, called_from_parent); +	mChildStack.postParentReshape(); +} +  void LLPanelProfile::onOpen(const LLSD& key)  {  	// open the desired panel @@ -177,7 +284,6 @@ void LLPanelProfile::onOpen(const LLSD& key)  	}  } -//*TODO redo panel toggling  void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key)  {  	// TRUE - we need to open/expand "panel" @@ -204,21 +310,10 @@ void LLPanelProfile::onTabSelected(const LLSD& param)  	}  } -void LLPanelProfile::setAllChildrenVisible(BOOL visible) -{ -	const child_list_t* child_list = getChildList(); -	child_list_const_iter_t child_it = child_list->begin(); -	for (; child_it != child_list->end(); ++child_it) -	{ -		LLView* viewp = *child_it; -		viewp->setVisible(visible); -	} -} -  void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)  {  	// Hide currently visible panel (STORM-690). -	setAllChildrenVisible(FALSE); +	mChildStack.push();  	// Add the panel or bring it to front.  	if (panel->getParent() != this) @@ -231,7 +326,7 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)  	}  	panel->setVisible(TRUE); - +	panel->setFocus(TRUE); // prevent losing focus by the floater  	panel->onOpen(params);  	LLRect new_rect = getRect(); @@ -249,15 +344,17 @@ void LLPanelProfile::closePanel(LLPanel* panel)  		removeChild(panel);  		// Make the underlying panel visible. +		mChildStack.pop(); + +		// Prevent losing focus by the floater  		const child_list_t* child_list = getChildList();  		if (child_list->size() > 0)  		{ -			child_list->front()->setVisible(TRUE); -			child_list->front()->setFocus(TRUE); // prevent losing focus by the floater +			child_list->front()->setFocus(TRUE);  		}  		else  		{ -			llwarns << "No underlying panel to make visible." << llendl; +			llwarns << "No underlying panel to focus." << llendl;  		}  	}  } diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index d2bcee8076..0a572e6f25 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -41,7 +41,7 @@ class LLPanelProfile : public LLPanel  public:  	/*virtual*/ BOOL postBuild(); - +	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	/*virtual*/ void onOpen(const LLSD& key);  	virtual void togglePanel(LLPanel*, const LLSD& key = LLSD()); @@ -58,8 +58,6 @@ protected:  	virtual void onTabSelected(const LLSD& param); -	virtual void setAllChildrenVisible(BOOL visible); -  	LLTabContainer* getTabCtrl() { return mTabCtrl; }  	const LLUUID& getAvatarId() { return mAvatarId; } @@ -72,8 +70,34 @@ protected:  private: +	//-- ChildStack begins ---------------------------------------------------- +	class ChildStack +	{ +		LOG_CLASS(LLPanelProfile::ChildStack); +	public: +		ChildStack(); +		void setParent(LLPanel* parent); + +		bool push(); +		bool pop(); +		void preParentReshape(); +		void postParentReshape(); + +	private: +		void dump(); + +		typedef LLView::child_list_t view_list_t; +		typedef std::list<view_list_t> stack_t; + +		stack_t		mStack; +		stack_t		mSavedStack; +		LLPanel*	mParent; +	}; +	//-- ChildStack ends ------------------------------------------------------ +  	LLTabContainer* mTabCtrl;	  	profile_tabs_t mTabContainer; +	ChildStack		mChildStack;  	LLUUID mAvatarId;  }; | 
