diff options
| -rw-r--r-- | indra/llui/lllayoutstack.cpp | 6 | ||||
| -rw-r--r-- | indra/llui/lllayoutstack.h | 3 | ||||
| -rw-r--r-- | indra/newview/llbottomtray.cpp | 73 | ||||
| -rw-r--r-- | indra/newview/llbottomtray.h | 5 | 
4 files changed, 83 insertions, 4 deletions
| diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index ab25d1d62b..0ff7557ead 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -368,10 +368,10 @@ S32 LLLayoutStack::getDefaultWidth(S32 cur_width)  	return cur_width;  } -void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel) +void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front)  {  	LayoutPanel* embedded_panel_to_move = findEmbeddedPanel(panel_to_move); -	LayoutPanel* embedded_target_panel = findEmbeddedPanel(target_panel); +	LayoutPanel* embedded_target_panel = move_to_front ? *mPanels.begin() : findEmbeddedPanel(target_panel);  	if (!embedded_panel_to_move || !embedded_target_panel || embedded_panel_to_move == embedded_target_panel)  	{ @@ -380,7 +380,7 @@ void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel)  	}  	e_panel_list_t::iterator it = std::find(mPanels.begin(), mPanels.end(), embedded_panel_to_move);  	mPanels.erase(it); -	it = std::find(mPanels.begin(), mPanels.end(), embedded_target_panel); +	it = move_to_front ? mPanels.begin() : std::find(mPanels.begin(), mPanels.end(), embedded_target_panel);  	mPanels.insert(it, embedded_panel_to_move);  } diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index b5287db1cf..6fcc8e2ac3 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -74,8 +74,9 @@ public:  	S32 getNumPanels() { return mPanels.size(); }  	/**  	 * Moves panel_to_move before target_panel inside layout stack (both panels should already be there). +	 * If move_to_front is true target_panel is ignored and panel_to_move is moved to the beginning of mPanels  	 */ -	void movePanel(LLPanel* panel_to_move, LLPanel* target_panel); +	void movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front = false);  	void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);  	void setPanelUserResize(const std::string& panel_name, BOOL user_resize); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 9869ae6e2d..053c400e74 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -50,10 +50,13 @@  #include "llviewerparcelmgr.h"  #include "llviewerwindow.h" +#include "llsdserialize.h"  // Distance from mouse down on which drag'n'drop should be started.  #define DRAG_START_DISTANCE 3 +static const std::string SORTING_DATA_FILE_NAME = "bottomtray_buttons_order.xml"; +  LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtray_button");  // LLBottomtrayButton methods @@ -549,6 +552,8 @@ BOOL LLBottomTray::postBuild()  	showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());  	showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty()); +	loadButtonsOrder(); +  	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&update_build_button_enable_state));  	return TRUE; @@ -691,6 +696,74 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()  			++it2;  		}  	} + +	saveButtonsOrder(); +} + +void LLBottomTray::saveButtonsOrder() +{ +	std::string user_dir = gDirUtilp->getLindenUserDir(); +	if (user_dir.empty()) return; +	 +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); +	LLSD settings_llsd; +	int i = 0; +	const resize_state_vec_t::const_iterator it_end = mButtonsOrder.end(); +	// we use numbers as keys for map which is saved in file and contains resize states as its values +	for (resize_state_vec_t::const_iterator it = mButtonsOrder.begin(); it != it_end; ++it, i++) +	{ +		std::string str = llformat("%d", i); +		settings_llsd[str] = *it;		 +	} +	llofstream file; +	file.open(filename); +	LLSDSerialize::toPrettyXML(settings_llsd, file); +} + +void LLBottomTray::loadButtonsOrder() +{ +	// load per-resident sorting information +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); + +	LLSD settings_llsd; +	llifstream file; +	file.open(filename); +	if (!file.is_open()) return; +	 +	LLSDSerialize::fromXML(settings_llsd, file); +	 + +	mButtonsOrder.clear(); +	mButtonsProcessOrder.clear(); +	int i = 0; +	// getting button order from file +	for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); +		iter != settings_llsd.endMap(); ++iter, ++i) +	{ +		std::string str = llformat("%d", i); +		EResizeState state = (EResizeState)settings_llsd[str].asInteger(); +		mButtonsOrder.push_back(state); +		// RS_BUTTON_SPEAK is skipped, because it shouldn't be in mButtonsProcessOrder (it does not hide or shrink). +		if (state != RS_BUTTON_SPEAK) +		{ +			mButtonsProcessOrder.push_back(state); +		}		 +	} + +	// There are other panels in layout stack order of which is not saved. Also, panels order of which is saved, +	// are already in layout stack but in wrong order. The most convenient way to place them is moving them  +	// to front one by one (because in this case we don't have to pass the panel before which we want to insert our +	// panel to movePanel()). So panels are moved in order from the end of mButtonsOrder vector(reverse iterator is used). +	const resize_state_vec_t::const_reverse_iterator it_end = mButtonsOrder.rend(); +	// placing panels in layout stack according to button order which we loaded in previous for +	for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i) +	{ +		LLPanel* panel_to_move = *it == RS_BUTTON_SPEAK ? mSpeakPanel : mStateProcessedObjectMap[*it]; +		mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend 		 +	} +	// Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it +	// manually here +	mToolbarStack->movePanel(mNearbyChatBar, NULL, true);  }  void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 6697d6f679..0973445157 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -188,6 +188,11 @@ private:  	 */  	void updateButtonsOrdersAfterDnD(); +	// saves order of buttons to file on disk +	void saveButtonsOrder(); +	// reads order of buttons from file on disk +	void loadButtonsOrder(); +  	/**  	 * Updates child controls size and visibility when it is necessary to reduce total width.  	 * | 
