diff options
| author | callum <none@none> | 2011-10-14 15:22:10 -0700 | 
|---|---|---|
| committer | callum <none@none> | 2011-10-14 15:22:10 -0700 | 
| commit | bfda156022df272cda390e22dd31937b74eceb39 (patch) | |
| tree | 202cf50815a6304d4262955a1c097d80641452b5 /indra | |
| parent | baed4d8f4338e8788d1948af4c49d01fc8f32a98 (diff) | |
| parent | bdf6363e6aa4216913607e83bfc5e159f2535407 (diff) | |
merge with head
Diffstat (limited to 'indra')
29 files changed, 700 insertions, 3625 deletions
| diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index 6e39fcd714..6397bbd0de 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -92,7 +92,7 @@ void LLDockControl::setDock(LLView* dockWidget)  void LLDockControl::getAllowedRect(LLRect& rect)  { -	rect = mDockableFloater->getRootView()->getRect(); +	rect = mDockableFloater->getRootView()->getChild<LLView>("non_toolbar_panel")->getRect();  }  void LLDockControl::repositionDockable() diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 97ccfeac29..4024e93b33 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -102,7 +102,6 @@ set(viewer_SOURCE_FILES      llavatarlist.cpp      llavatarlistitem.cpp      llavatarpropertiesprocessor.cpp -    llbottomtray.cpp      llbox.cpp      llbreadcrumbview.cpp      llbrowsernotification.cpp @@ -118,6 +117,7 @@ set(viewer_SOURCE_FILES      llchatitemscontainerctrl.cpp      llchatmsgbox.cpp      llchiclet.cpp +    llchicletbar.cpp      llclassifiedinfo.cpp      llclassifiedstatsresponder.cpp      llcofwearables.cpp @@ -448,7 +448,6 @@ set(viewer_SOURCE_FILES      llsky.cpp      llslurl.cpp      llspatialpartition.cpp -    llspeakbutton.cpp      llspeakers.cpp      llspeakingindicatormanager.cpp      llsplitbutton.cpp @@ -668,7 +667,6 @@ set(viewer_HEADER_FILES      llavatarlist.h      llavatarlistitem.h      llavatarpropertiesprocessor.h -    llbottomtray.h      llbox.h      llbreadcrumbview.h      llbuycurrencyhtml.h @@ -684,6 +682,7 @@ set(viewer_HEADER_FILES      llchatitemscontainerctrl.h      llchatmsgbox.h      llchiclet.h +    llchicletbar.h      llclassifiedinfo.h      llclassifiedstatsresponder.h      llcofwearables.h @@ -1009,7 +1008,6 @@ set(viewer_HEADER_FILES      llsky.h      llslurl.h      llspatialpartition.h -    llspeakbutton.h      llspeakers.h      llspeakingindicatormanager.h      llsplitbutton.h diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 5fc95f123a..773e20eda7 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -36,10 +36,10 @@  #include "llagentwearables.h"  #include "llagentui.h"  #include "llanimationstates.h" -#include "llbottomtray.h"  #include "llcallingcard.h"  #include "llcapabilitylistener.h"  #include "llchannelmanager.h" +#include "llchicletbar.h"  #include "llconsole.h"  #include "llenvmanager.h"  #include "llfirstuse.h" @@ -1876,7 +1876,7 @@ void LLAgent::endAnimationUpdateUI()  			LLPanelTopInfoBar::getInstance()->setVisible(TRUE);  		} -		LLBottomTray::getInstance()->onMouselookModeOut(); +		LLChicletBar::getInstance()->setVisible(TRUE);  		LLPanelStandStopFlying::getInstance()->setVisible(TRUE); @@ -1985,7 +1985,7 @@ void LLAgent::endAnimationUpdateUI()  		LLPanelTopInfoBar::getInstance()->setVisible(FALSE); -		LLBottomTray::getInstance()->onMouselookModeIn(); +		LLChicletBar::getInstance()->setVisible(FALSE);  		LLPanelStandStopFlying::getInstance()->setVisible(FALSE); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp deleted file mode 100644 index af91702f9b..0000000000 --- a/indra/newview/llbottomtray.cpp +++ /dev/null @@ -1,1996 +0,0 @@ -/**  - * @file llbottomtray.cpp - * @brief LLBottomTray class implementation - * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" // must be first include - -#define LLBOTTOMTRAY_CPP -#include "llbottomtray.h" - -// library includes -#include "llfloaterreg.h" -#include "llfloatersidepanelcontainer.h" -#include "llflyoutbutton.h" -#include "lllayoutstack.h" -#include "llnotifications.h" -#include "llnotificationsutil.h" -#include "lltexteditor.h" - -// newview includes -#include "llagent.h" -#include "llagentcamera.h" -#include "llavataractions.h" -#include "llchiclet.h" -#include "llfloatercamera.h" -#include "llhints.h" -#include "llimfloater.h" // for LLIMFloater -#include "llnearbychatbar.h" -#include "llnearbychatbarlistener.h" -#include "llspeakbutton.h" -#include "llsplitbutton.h" -#include "llsyswellwindow.h" -#include "lltoolmgr.h" -#include "llviewerparcelmgr.h" - -#include "llviewerwindow.h" -#include "llsdserialize.h" -#include "llfirstuse.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 - -// virtual -BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask) -{ -	if (mCanDrag) -	{ -		// pass hover to bottomtray -		S32 screenX, screenY; -		localPointToScreen(x, y, &screenX, &screenY); -		LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); - -		return TRUE; -	} -	else -	{ -		return LLButton::handleHover(x, y, mask); -	} -} -//virtual -BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask) -{ -	if (mCanDrag) -	{ -	S32 screenX, screenY; -	localPointToScreen(x, y, &screenX, &screenY); -	// pass mouse up to bottomtray -	LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY); -	} -	return LLButton::handleMouseUp(x, y, mask); -} -//virtual -BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask) -{ -	if (mCanDrag) -	{ -	S32 screenX, screenY; -	localPointToScreen(x, y, &screenX, &screenY); -	// pass mouse up to bottomtray -	LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY); -	} -	return LLButton::handleMouseDown(x, y, mask); -} - -static void update_build_button_enable_state() -{ -	bool can_edit = LLToolMgr::getInstance()->canEdit(); - -	LLBottomTray::getInstance()->getChildView("build_btn")->setEnabled(can_edit); -} - -// Build time optimization, generate extern template once in .cpp file -template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); - -namespace -{ -	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel"; - -	S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel) -	{ -		S32 minimal_width = 0; -		llassert(stack); -		if ( stack && panel && panel->getVisible() ) -		{ -			stack->getPanelMinSize(panel->getName(), &minimal_width); -		} -		return minimal_width; -	} - -	S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel) -	{ -		S32 max_width = 0; -		llassert(stack); -		if ( stack && panel && panel->getVisible() ) -		{ -			stack->getPanelMaxSize(panel->getName(), &max_width); -		} -		return max_width; -	} - -	S32 get_curr_width(LLUICtrl* ctrl) -	{ -		S32 cur_width = 0; -		if ( ctrl && ctrl->getVisible() ) -		{ -			cur_width = ctrl->getRect().getWidth(); -		} -		return cur_width; -	} -} - -class LLBottomTrayLite -	: public LLPanel -{ -public: -	LLBottomTrayLite() -		: mNearbyChatBar(NULL), -		mChatBarContainer(NULL), -		  mGesturePanel(NULL) -	{ -		//mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); -		buildFromFile("panel_bottomtray_lite.xml"); -	} - -	BOOL postBuild() -	{ -		//mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar"); -		mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel"); -		mGesturePanel = getChild<LLPanel>("gesture_panel"); - -		// Hide "show_nearby_chat" button  -		if (mNearbyChatBar) -		{ -			LLLineEditor* chat_box = mNearbyChatBar->getChatBox(); -			LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat"); -			S32 delta_width = show_btn->getRect().getWidth(); -			show_btn->setVisible(FALSE); -			chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight()); -		} -		return TRUE; -	} - -	void onFocusLost() -	{ -		if (gAgentCamera.cameraMouselook()) -		{ -			LLBottomTray::getInstance()->setVisible(FALSE); -		} -	} - -	LLNearbyChatBar*	mNearbyChatBar; -	LLLayoutPanel*		mChatBarContainer; -	LLPanel*			mGesturePanel; -}; - -LLBottomTray::LLBottomTray(const LLSD&) -:	mDesiredNearbyChatWidth(0), -	mChicletPanel(NULL), -	mSpeakPanel(NULL), -	mSpeakBtn(NULL), -	mNearbyChatBar(NULL), -	mChatBarContainer(NULL), -	mNearbyCharResizeHandlePanel(NULL), -	mToolbarStack(NULL), -	mMovementButton(NULL), -	mResizeState(RS_NORESIZE), -	mBottomTrayContextMenu(NULL), -	mCamButton(NULL), -	mBottomTrayLite(NULL), -	mIsInLiteMode(false), -	mDragStarted(false), -	mDraggedItem(NULL), -	mLandingTab(NULL), -	mCheckForDrag(false) -{ -	// Firstly add our self to IMSession observers, so we catch session events -	// before chiclets do that. -	LLIMMgr::getInstance()->addSessionObserver(this); - -	//mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); - -	buildFromFile("panel_bottomtray.xml"); - -	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); - -	//this is to fix a crash that occurs because LLBottomTray is a singleton -	//and thus is deleted at the end of the viewers lifetime, but to be cleanly -	//destroyed LLBottomTray requires some subsystems that are long gone -	//LLUI::getRootView()->addChild(this); - -	{ -		mBottomTrayLite = new LLBottomTrayLite(); -		mBottomTrayLite->setFollowsAll(); -		mBottomTrayLite->setVisible(FALSE); -	} - -	mImageDragIndication = LLUI::getUIImage(getString("DragIndicationImageName")); -	mDesiredNearbyChatWidth = mNearbyChatBar ? mNearbyChatBar->getRect().getWidth() : 0; -} - -LLBottomTray::~LLBottomTray() -{ -	if (!LLSingleton<LLIMMgr>::destroyed()) -	{ -		LLIMMgr::getInstance()->removeSessionObserver(this); -	} - -	if (mNearbyChatBar) -	{ -		// store custom width of chatbar panel. -		S32 custom_width = mChatBarContainer->getRect().getWidth(); -		gSavedSettings.setS32("ChatBarCustomWidth", custom_width); -	} - -	// emulate previous floater behavior to be hidden on startup. -	// override effect of save_visibility=true. -	// this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly: -	//		i.g when floater changes its visibility - button changes its toggle state. -	getChild<LLUICtrl>("build_btn")->setControlValue(false); -	getChild<LLUICtrl>("search_btn")->setControlValue(false); -	getChild<LLUICtrl>("world_map_btn")->setControlValue(false); -} - -// *TODO Vadim: why void* ? -void* LLBottomTray::createNearbyChatBar(void* userdata) -{ -	//return new LLNearbyChatBar(); -	return NULL; -} - -LLNearbyChatBar* LLBottomTray::getNearbyChatBar() -{ -	return mIsInLiteMode ? mBottomTrayLite->mNearbyChatBar : mNearbyChatBar; -} - -LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id) -{ -	LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id); - -	switch (im_chiclet_type) -	{ -	case LLIMChiclet::TYPE_IM: -		return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id); -	case LLIMChiclet::TYPE_GROUP: -		return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id); -	case LLIMChiclet::TYPE_AD_HOC: -		return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id); -	case LLIMChiclet::TYPE_UNKNOWN: -		break; -	} - -	return NULL; -} - -//virtual -void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) -{ -	if (!getChicletPanel()) return; - -	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id); -	if (!session) return; - -	// no need to spawn chiclets for participants in P2P calls called through Avaline -	if (session->isP2P() && session->isOtherParticipantAvaline()) return; - -	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; - -	LLIMChiclet* chiclet = createIMChiclet(session_id); -	if(chiclet) -	{ -		chiclet->setIMSessionName(name); -		chiclet->setOtherParticipantId(other_participant_id); -		 -		LLIMFloater::onIMChicletCreated(session_id); - -	} -	else -	{ -		llerrs << "Could not create chiclet" << llendl; -	} -} - -//virtual -void LLBottomTray::sessionRemoved(const LLUUID& session_id) -{ -	if(getChicletPanel()) -	{ -		// IM floater should be closed when session removed and associated chiclet closed -		LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>( -				"impanel", session_id); -		if (iMfloater != NULL) -		{ -			iMfloater->closeFloater(); -		} - -		getChicletPanel()->removeChiclet(session_id); -	} -} - -void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) -{ -	//this is only needed in case of outgoing ad-hoc/group chat sessions -	LLChicletPanel* chiclet_panel = getChicletPanel(); -	if (chiclet_panel) -	{ -		//it should be ad-hoc im chiclet or group im chiclet -		LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id); -		if (chiclet) chiclet->setSessionId(new_session_id); -	} -} - -S32 LLBottomTray::getTotalUnreadIMCount() -{ -	return getChicletPanel()->getTotalUnreadIMCount(); -} - -// virtual -void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal) -{ -	// Time it takes to connect to voice channel might be pretty long, -	// so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED. -	BOOL enable = FALSE; - -	switch (status) -	{ -	// Do not add STATUS_VOICE_ENABLED because voice chat is  -	// inactive until STATUS_JOINED -	case STATUS_JOINED: -		enable = TRUE; -		break; -	default: -		enable = FALSE; -		break; -	} - -	// We have to enable/disable right and left parts of speak button separately (EXT-4648) -	getChild<LLButton>("speak_btn")->setEnabled(enable); - -	// skipped to avoid button blinking -	if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) -	{ -		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); - -		gAgent.setVoiceConnected(voice_status); - -		getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status); -		gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(voice_status); -		if (voice_status) -		{ -			LLFirstUse::speak(true); -		} -	} -} - -void LLBottomTray::onMouselookModeOut() -{ -	mIsInLiteMode = false; -	mBottomTrayLite->setVisible(FALSE); -	//mNearbyChatBar->getChatBox()->setText(mBottomTrayLite->mNearbyChatBar->getChatBox()->getText()); -	setVisible(TRUE); -} - -void LLBottomTray::onMouselookModeIn() -{ -	setVisible(FALSE); - -	// Attach the lite bottom tray -	if (getParent() && mBottomTrayLite->getParent() != getParent()) -		getParent()->addChild(mBottomTrayLite); - -	mBottomTrayLite->setShape(getLocalRect()); -	//mBottomTrayLite->mNearbyChatBar->getChatBox()->setText(mNearbyChatBar->getChatBox()->getText()); -	//mBottomTrayLite->mGesturePanel->setVisible(gSavedSettings.getBOOL("ShowGestureButton")); - -	mIsInLiteMode = true; -} - -//virtual -// setVisible used instead of onVisibilityChange, since LLAgent calls it on entering/leaving mouselook mode. -// If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true), -void LLBottomTray::setVisible(BOOL visible) -{ -	if (mIsInLiteMode) -	{ -		mBottomTrayLite->setVisible(visible); -	} -	else  -	{ -		LLPanel::setVisible(visible); -	} -} - -S32 LLBottomTray::notifyParent(const LLSD& info) -{ -	if(info.has("well_empty")) // implementation of EXT-3397 -	{ -		const std::string chiclet_name = info["well_name"]; - -		// only "im_well" or "notification_well" names are expected. -		// They are set in panel_bottomtray.xml in <chiclet_im_well> & <chiclet_notification> -		llassert("im_well" == chiclet_name || "notification_well" == chiclet_name); - -		BOOL should_be_visible = !info["well_empty"]; -		showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible); -		return 1; -	} - -	if (info.has("action") && info["action"] == "resize") -	{ -		const std::string& name = info["view_name"]; - -		// expected only resize of nearby chatbar -		if (mChatBarContainer->getName() != name) return LLPanel::notifyParent(info); - -		const S32 new_width = info["new_width"]; - -		processChatbarCustomization(new_width); - -		return 2; -	} -	return LLPanel::notifyParent(info); -} - -void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask) -{ -	// We should show BottomTrayContextMenu in last  turn -	if (mBottomTrayContextMenu && !LLMenuGL::sMenuContainer->getVisibleMenu()) -	{ -		    //there are no other context menu (IM chiclet etc ), so we can show BottomTrayContextMenu - -		    updateContextMenu(x, y, mask); -			mBottomTrayContextMenu->buildDrawLabels(); -			mBottomTrayContextMenu->updateParent(LLMenuGL::sMenuContainer); -			LLMenuGL::showPopup(this, mBottomTrayContextMenu, x, y); -		 -	} -} - -void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask) -{ -	LLUICtrl* edit_box = mNearbyChatBar->getChild<LLUICtrl>("chat_box"); - -	S32 local_x = x - mChatBarContainer->getRect().mLeft - edit_box->getRect().mLeft; -	S32 local_y = y - mChatBarContainer->getRect().mBottom - edit_box->getRect().mBottom; - -	bool in_edit_box = edit_box->pointInView(local_x, local_y); - -	mBottomTrayContextMenu->setItemVisible("Separator", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Cut", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Copy", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Paste", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Delete", in_edit_box); -	mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box); -} - -void LLBottomTray::showSpeakButton(bool visible) -{ -	// Show/hide the button -	setTrayButtonVisible(RS_BUTTON_SPEAK, visible); - -	// and adjust other panels according to the occupied/freed space. -	const S32 panel_width = mSpeakPanel->getRect().getWidth(); -	if (visible) -	{ -		processWidthDecreased(-panel_width); -	} -	else -	{ -		processWidthIncreased(panel_width); -	} -} - -void LLBottomTray::toggleMovementControls() -{ -	if (mMovementButton) -		mMovementButton->onCommit(); -} - -void LLBottomTray::toggleCameraControls() -{ -	if (mCamButton) -		mCamButton->onCommit(); -} - -BOOL LLBottomTray::postBuild() -{ -	LLHints::registerHintTarget("bottom_tray", LLView::getHandle()); -	LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destination_btn")->getHandle()); -	LLHints::registerHintTarget("avatar_picker_btn", getChild<LLUICtrl>("avatar_btn")->getHandle()); - -	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); -	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2)); - -	mBottomTrayContextMenu =  LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); -	gMenuHolder->addChild(mBottomTrayContextMenu); - -	//mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar"); -	//LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle()); - -	//mListener.reset(new LLNearbyChatBarListener(*mNearbyChatBar)); - -	mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel"); -	mNearbyCharResizeHandlePanel = getChild<LLPanel>("chat_bar_resize_handle_panel"); - -	mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); -	mMovementButton = getChild<LLButton>("movement_btn"); -	LLHints::registerHintTarget("move_btn", mMovementButton->getHandle()); -	mCamButton = getChild<LLButton>("camera_btn"); -	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); - -	mSpeakPanel = getChild<LLPanel>("speak_panel"); -	mSpeakBtn = findChild<LLSpeakButton>("talk"); -	if (mSpeakBtn) -	{ -		LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle()); - -		// Localization tool doesn't understand custom buttons like <talk_button> -		mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); -		mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") ); -	}	 -	else -	{ -		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn")); -		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn")); -	} - - -	// Both parts of speak button should be initially disabled because -	// it takes some time between logging in to world and connecting to voice channel. -	getChild<LLButton>("speak_btn")->setEnabled(false); -	getChild<LLButton>("speak_flyout_btn")->setEnabled(false); -	gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(false); - -	// Registering Chat Bar to receive Voice client status change notifications. -	LLVoiceClient::getInstance()->addObserver(this); - -	//mNearbyChatBar->getChatBox()->setContextMenu(NULL); - -	mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); - -	initResizeStateContainers(); - -	setButtonsControlsAndListeners(); - -	initButtonsVisibility(); - -	// update wells visibility: -	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; -} - -//Drag-n-drop - -void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y) -{ -	if (ctrl == NULL) return; -	LLView* parent_view = ctrl->getParent(); -	if(parent_view != NULL) -	{ -		// we actually drag'n'drop panel (not button) in code, so have to find a parent -		// of button which called this method on mouse down. -		LLPanel* parent = dynamic_cast<LLPanel*>(parent_view); -		// It may happen that we clicked not usual button, but button inside widget(speak, gesture) -		// so we'll need to get a level higher to reach layout panel as a parent. -		if(parent == NULL) parent = dynamic_cast<LLPanel*>(parent_view->getParent()); -		if (parent && parent->getVisible()) -		{ -			mDraggedItem = parent; -			mCheckForDrag = true; -			mStartX = x; -			mStartY = y; -		} -	} -} - -LLPanel* LLBottomTray::findChildPanelByLocalCoords(S32 x, S32 y) -{ -	LLPanel* ctrl = 0; -	S32 screenX, screenY; -	const child_list_t* list = mToolbarStack->getChildList(); - -	localPointToScreen(x, y, &screenX, &screenY); - -	// look for a child panel which contains the point (screenX, screenY) in it's rectangle -	for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i) -	{ -		LLRect rect; -		localRectToScreen((*i)->getRect(), &rect); - -		if (rect.pointInRect(screenX, screenY)) -		{ -			ctrl = dynamic_cast<LLPanel*>(*i); -			break; -		} -	} - -	return ctrl; -} - -void LLBottomTray::onDraggableButtonHover(S32 x, S32 y) -{ -	// if mouse down on draggable item was done, check whether we should start DnD -	if (mCheckForDrag) -	{ -		// Start drag'n'drop if mouse cursor was dragged away frome mouse down location enough -		if(sqrt((float)((mStartX-x)*(mStartX-x)+(mStartY-y)*(mStartY-y))) > DRAG_START_DISTANCE) -		{ -			mDragStarted = true; -			mCheckForDrag = false; -		} -	} -	if (mDragStarted) -	{ -		// Check whether the cursor is over draggable area, find which panel it is and set is as -		// landing tab for drag'n'drop -		if(isCursorOverDraggableArea(x, y)) -		{ -			LLPanel* panel = findChildPanelByLocalCoords(x,y); -			if (panel && panel != mDraggedItem) mLandingTab = panel; -			gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROWDRAG); -		} -		else -		{ -			gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO); -		} -	} -	else -	{ -		// Reset cursor in case you move your mouse from the drag handle to a button. -		getWindow()->setCursor(UI_CURSOR_ARROW); - -	} -} - -bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y) -{ -	// Draggable area lasts from the nearby chat input resize handle -	// to the chiclet area (exlusively). -	bool result = getRect().pointInRect(x, y); -	result = result && mNearbyCharResizeHandlePanel->calcScreenRect().mRight < x; -	result = result && mChicletPanel->calcScreenRect().mRight > x; -	return result; -} - -void LLBottomTray::updateButtonsOrdersAfterDnD() -{ -	// *TODO: change implementation of this method to support simplify it -	// (and according to future possible changes in the way button order is saved between sessions). -	state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin(); -	state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end(); -	EResizeState dragged_state = RS_NORESIZE; -	EResizeState landing_state = RS_NORESIZE; -	bool landing_state_found = false; -	// Find states for dragged item and landing tab -	for (; it != it_end; ++it) -	{ -		if (it->second == mDraggedItem) -		{ -			dragged_state = it->first; -		} -		else if (it->second == mLandingTab) -		{ -			landing_state = it->first; -			landing_state_found = true; -		} -	} - -	if (dragged_state == RS_NORESIZE) -	{ -		llwarns << "Cannot determine what button is being dragged" << llendl; -		llassert(dragged_state != RS_NORESIZE); -		return; -	} - -	lldebugs << "Will place " << resizeStateToString(dragged_state) -		<< " before " << resizeStateToString(landing_state) << llendl; - -	// Update order of buttons according to drag'n'drop -	mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state)); -	if (!landing_state_found && mLandingTab == getChild<LLPanel>(PANEL_CHICLET_NAME)) -	{ -		mButtonsOrder.push_back(dragged_state); -	} -	else -	{ -		if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; // just a random fallback -		mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state); -	} - -	// Synchronize button process order with their order -	resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin(); -	const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end(); -	resize_state_vec_t::iterator it2 = mButtonsProcessOrder.begin(); -	for (; it1 != it_end1; ++it1) -	{ -		// Skip Speak because it is not in mButtonsProcessOrder(it's the reason why mButtonsOrder was introduced). -		// If any other draggable items will be added to bottomtray later, they should also be skipped here. -		if (*it1 != RS_BUTTON_SPEAK) -		{ -			*it2 = *it1; -			++it2; -		} -	} - -	saveButtonsOrder(); -} - -void LLBottomTray::saveButtonsOrder() -{ -	if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; - -	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() -{ -	if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return; - -	// 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 = getButtonPanel(*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 -	// (along with its drag handle) manually here. -	mToolbarStack->movePanel(getChild<LLLayoutPanel>("chat_bar_resize_handle_panel"), NULL, true); -	mToolbarStack->movePanel(mChatBarContainer, NULL, true); -} - -void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y) -{ -	//if mouse up happened over area where drop is possible, change order of buttons -	if (mLandingTab != NULL && mDraggedItem != NULL && mDragStarted) -	{ -		if(isCursorOverDraggableArea(x, y)) -		{ -			// change order of panels in layout stack -			mToolbarStack->movePanel(mDraggedItem, (LLPanel*)mLandingTab); -			// change order of buttons in order vectors -			updateButtonsOrdersAfterDnD(); -		} -	} -	gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); -	mDragStarted = false; -	mDraggedItem = NULL; -	mLandingTab = NULL; -	mCheckForDrag = false; -} - -void LLBottomTray::draw() -{ -	LLPanel::draw(); -	if (mLandingTab) -	{ -		static S32 w = mImageDragIndication->getWidth(); -		static S32 h = mImageDragIndication->getHeight(); -		LLRect rect = mLandingTab->calcScreenRect(); -		mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h); -	} -	getChild<LLButton>("show_profile_btn")->setToggleState(LLAvatarActions::profileVisible(gAgent.getID())); - -	LLPanel* panel = LLFloaterSidePanelContainer::getPanel("people", "panel_people"); -	if (panel && panel->isInVisibleChain()) -	{ -		getChild<LLButton>("show_people_button")->setToggleState(true); -	} -	else -	{ -		getChild<LLButton>("show_people_button")->setToggleState(false); -	} - -	LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser")); -	bool help_floater_visible = (help_browser && help_browser->isInVisibleChain()); - -	getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible); - -	bool openmic = LLVoiceClient::getInstance()->getUserPTTState(); -	bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled(); -	getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled); -	getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled); - -} - -bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata) -{ -	std::string item = userdata.asString(); -	/* -	LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box"); -	 -	if (item == "can_cut") -	{ -		return edit_box->canCut(); -	} -	else if (item == "can_copy") -	{ -		return edit_box->canCopy(); -	} -	else if (item == "can_paste") -	{ -		return edit_box->canPaste(); -	} -	else if (item == "can_delete") -	{ -		return edit_box->canDoDelete(); -	} -	else if (item == "can_select_all") -	{ -		return edit_box->canSelectAll() && (edit_box->getLength()>0); -	}*/ -	return true; -} - - -void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata) -{/* -	std::string item = userdata.asString(); -	LLLineEditor* edit_box = mNearbyChatBar->findChild<LLLineEditor>("chat_box"); - -	if (item == "cut") -	{ -		edit_box->cut(); -	} -	else if (item == "copy") -	{ -		edit_box->copy(); -	} -	else if (item == "paste") -	{ -		edit_box->paste(); -		edit_box->setFocus(TRUE); -	} -	else if (item == "delete") -	{ -		edit_box->doDelete(); -	} -	else if (item == "select_all") -	{ -		edit_box->selectAll(); -	}*/ -} - -void LLBottomTray::log(LLView* panel, const std::string& descr) -{ -	if (NULL == panel) return; -	LLView* layout = panel->getParent(); -	LL_DEBUGS("Bottom Tray Rects") << descr << ": " -		<< "panel: " << panel->getName() -		<< ", rect: " << panel->getRect() -  -  -		<< " layout: " << layout->getName() -		<< ", rect: " << layout->getRect() -		<< LL_ENDL; -} - -void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	static S32 debug_calling_number = 0; -	lldebugs << "**************************************** " << ++debug_calling_number << llendl; - -	S32 current_width = getRect().getWidth(); -	S32 delta_width = width - current_width; -	lldebugs << "Reshaping: "  -		<< ", width: " << width -		<< ", cur width: " << current_width -		<< ", delta_width: " << delta_width -		<< ", called_from_parent: " << called_from_parent -		<< llendl; - -	if (mNearbyChatBar)			log(mNearbyChatBar, "before"); -	if (mChicletPanel)			log(mChicletPanel, "before"); - -	// Difference between bottom tray width required to fit its children and the actual width. (see EXT-991) -	// Positive value means that bottom tray is not wide enough. -	// Negative value means that there is free space. -	static S32 extra_shrink_width = 0; -	bool should_be_reshaped = true; - -	if (mChicletPanel && mToolbarStack && mNearbyChatBar) -	{ -		// Firstly, update layout stack to ensure we deal with correct panel sizes. -		{ -			BOOL saved_anim = mToolbarStack->getAnimate(); -			// Set chiclet panel to be autoresized by default. -			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); -			// Disable animation to prevent layout updating in several frames. -			mToolbarStack->setAnimate(FALSE); -			// Force the updating of layout to reset panels collapse factor. -			mToolbarStack->updateLayout(); -			// Restore animate state. -			mToolbarStack->setAnimate(saved_anim); -		} - -		// bottom tray is narrowed -		if (delta_width < 0) -		{ -			if (extra_shrink_width > 0) // not enough space -			{ -				extra_shrink_width += llabs(delta_width); -				should_be_reshaped = false; -			} -			else -			{ -				extra_shrink_width = processWidthDecreased(delta_width); - -				// increase new width to extra_shrink_width value to not reshape less than bottom tray minimum -				width += extra_shrink_width; -			} -		} -		// bottom tray is widened -		else -		{ -			if (extra_shrink_width > delta_width) -			{ -				// Still not enough space. -				// Only subtract the delta from the required delta and don't reshape. -				extra_shrink_width -= delta_width; -				should_be_reshaped = false; -			} -			else  -			{ -				if (extra_shrink_width > 0) -				{ -					// If we have some extra shrink width let's reduce delta_width & width -					delta_width -= extra_shrink_width; -					width -= extra_shrink_width; -					extra_shrink_width = 0; -				} -				processWidthIncreased(delta_width); -			} -		} -	} - -	if (should_be_reshaped) -	{ -		lldebugs << "Reshape all children with width: " << width << llendl; -		LLPanel::reshape(width, height, called_from_parent); -	} - -	if (mNearbyChatBar)			log(mNearbyChatBar, "after"); -	if (mChicletPanel)			log(mChicletPanel, "after"); - - -	// Restore width of the chatbar on first reshape. -	// we can not to do this from postBuild because reshape is called from parent view on startup -	// creation after it and reset width according to resize logic. -	static bool needs_restore_custom_state = true; -	if (mChatBarContainer && needs_restore_custom_state) -	{ -		// restore custom width of chatbar panel. -		S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth"); -		if (new_width > 0) -		{ -			mDesiredNearbyChatWidth = new_width; -			processChatbarCustomization(new_width); -			lldebugs << "Setting nearby chat bar width to " << new_width << " px" << llendl; -			mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight()); -		} -		needs_restore_custom_state = false; -	} - -} - -S32 LLBottomTray::processWidthDecreased(S32 delta_width) -{ -	bool still_should_be_processed = true; - -	const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom(); - -	// There are four steps of processing width decrease. If in one of them required width was reached, -	// further are not needed. -	// 1. Decreasing width of chiclet panel. -	if (chiclet_panel_shrink_headroom > 0) -	{ -		// we have some space to decrease chiclet panel -		S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom); - -		lldebugs << "delta_width: " << delta_width -			<< ", panel_delta_min: " << chiclet_panel_shrink_headroom -			<< ", shrink_by: " << shrink_by -			<< llendl; - -		// is chiclet panel wide enough to process resizing? -		delta_width += chiclet_panel_shrink_headroom; - -		still_should_be_processed = delta_width < 0; - -		lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; -		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); -		log(mChicletPanel, "after processing panel decreasing via chiclet panel"); - -		lldebugs << "RS_CHICLET_PANEL"  -			<< ", delta_width: " << delta_width -			<< llendl; -	} - -	S32 buttons_freed_width = 0; -	// 2. Decreasing width of buttons. -	if (still_should_be_processed) -	{ -		processShrinkButtons(delta_width, buttons_freed_width); -		still_should_be_processed = delta_width < 0; -	} - -	// 3. Decreasing width of nearby chat. -	const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mChatBarContainer); -	const S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); -	if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) -	{ -		// we have some space to decrease chatbar panel -		S32 chatbar_shrink_headroom = chatbar_panel_width - chatbar_panel_min_width; - -		S32 shrink_by = llmin(-delta_width, chatbar_shrink_headroom); - -		// is chatbar panel wide enough to process resizing? -		delta_width += chatbar_shrink_headroom; - -		still_should_be_processed = delta_width < 0; - -		// chatbar should only be shrunk here, not stretched -		if (shrink_by > 0) -		{ -			//lldebugs << "Shrinking nearby chat bar by " << delta_panel << " px " << llendl; -			//mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mChatBarContainer->getRect().getHeight()); -		} - -		log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel"); - -		lldebugs << "RS_CHATBAR_INPUT" -			<< ", shrink_by: " << shrink_by -			<< ", delta_width: " << delta_width -			<< llendl; -	} - -	S32 extra_shrink_width = 0; -	// 4. Hiding buttons if needed. -	if (still_should_be_processed) -	{ -		processHideButtons(delta_width, buttons_freed_width); - -		if (delta_width < 0) -		{ -			extra_shrink_width = -delta_width; -			llwarns << "There is no enough width to reshape all children: "  -				<< extra_shrink_width << llendl; -		} - -		if (buttons_freed_width > 0) -		{ -			S32 nearby_needed_width = mDesiredNearbyChatWidth; -			if ( 0) -			{ -				S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width;  -				log(mNearbyChatBar, "before applying compensative width"); -				lldebugs << "Extending nearby chat bar by " << compensative_width << " px" << llendl; -				mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() ); -				log(mNearbyChatBar, "after applying compensative width"); -				lldebugs << buttons_freed_width << llendl; -			} -		} -	} - -	return extra_shrink_width; -} - -void LLBottomTray::processWidthIncreased(S32 delta_width) -{ -	if (delta_width <= 0) return; - -	// how much room we have to show hidden buttons -	S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); - -	lldebugs << "Distributing (" << getChicletPanelShrinkHeadroom() -		<< " + " << delta_width << ") = " << available_width << " px" << llendl; - -	// 1. Try showing buttons that have been auto-hidden. -	S32 processed_width = processShowButtons(available_width); -	lldebugs << "processed_width = " << processed_width << ", delta_width = " << delta_width << llendl; - -	lldebugs << "Available_width after showing buttons: " << available_width << llendl; - -	// If the newly shown buttons have consumed more than delta_width pixels, -	// shrink the chiclet panel. -	if (processed_width > delta_width) -	{ -		// 1. use delta width of resizing -		S32 shrink_by = processed_width - delta_width; - -		// 2. use width available via decreasing of chiclet panel -		if (shrink_by > 0) -		{ -			lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; -			mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); -			log(mChicletPanel, "after applying compensative width for chiclets: "); -			lldebugs << shrink_by << llendl; -		} - -		// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels -		delta_width -= processed_width; -	} - -	// 2. Expand the nearby chat bar if needed. -	S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); -	lldebugs << "delta_width = " << delta_width -		<< ", chatbar_panel_width = " << chatbar_panel_width -		<< ", mDesiredNearbyChatWidth = " << mDesiredNearbyChatWidth << llendl; -	if (delta_width > 0 && chatbar_panel_width < mDesiredNearbyChatWidth) -	{ -		S32 extend_by_max = mDesiredNearbyChatWidth - chatbar_panel_width; -		S32 extend_by = llmin(delta_width, extend_by_max); -		lldebugs << "Unprocessed delta width: " << delta_width -			<< " px, chatbar can be extended by " << extend_by_max -			<< " px, extending it by " << extend_by << " px" -			<< llendl; - -		delta_width -= extend_by_max; -		lldebugs << "Extending nearby chat bar by " << extend_by << " px " << llendl; -		mChatBarContainer->reshape(chatbar_panel_width + extend_by, mChatBarContainer->getRect().getHeight()); -		log(mNearbyChatBar, "applied unprocessed delta width"); -	} - -	// 3. Expand buttons that have been auto-shrunk, -	// if we haven't yet consumed all the available headroom. -	if (delta_width > 0) -	{ -		S32 available_width = delta_width + getChicletPanelShrinkHeadroom(); -		processExtendButtons(available_width); -	} -} - -S32 LLBottomTray::processShowButtons(S32& available_width) -{ -	lldebugs << "Distributing " << available_width << " px" << llendl; -	S32 original_available_width = available_width; - -	// process buttons from left to right -	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -	for (; it != it_end; ++it) -	{ -		// is there available space? -		if (available_width <= 0) break; - -		// try to show next button -		processShowButton(*it, available_width); -	} - -	return original_available_width - available_width; -} - -bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) -{ -	// Check if the button was previously auto-hidden (due to lack of space). -	if (!isAutoHidden(shown_object_type)) -	{ -		return false; -	} - -	// Ok. Try showing the button. -	return showButton(shown_object_type, available_width); -} - -void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width) -{ -	// process buttons from right to left -	resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin(); -	const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend(); - -	for (; it != it_end; ++it) -	{ -		// is it still necessary to hide a button? -		if (required_width >= 0) break; - -		// try to hide next button -		processHideButton(*it, required_width, buttons_freed_width); -	} -} - -void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width) -{ -	lldebugs << "Trying to hide object type: " << processed_object_type << llendl; -	LLPanel* panel = getButtonPanel(processed_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	if (panel->getVisible()) -	{ -		required_width += panel->getRect().getWidth(); - -		if (required_width > 0) -		{ -			buttons_freed_width += required_width; -		} - -		setTrayButtonVisible(processed_object_type, false); - -		setAutoHidden(processed_object_type, true); - -		lldebugs << "processing object type: " << processed_object_type -			<< ", buttons_freed_width: " << buttons_freed_width -			<< llendl; -	} -} - -void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_width) -{ -	// process buttons from right to left -	resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin(); -	const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend(); - -	// iterate through buttons in the mButtonsProcessOrder first -	for (; it != it_end; ++it) -	{ -		// is it still necessary to hide a button? -		if (required_width >= 0) break; - -		// try to shrink next button -		processShrinkButton(*it, required_width); -	} - -	// then shrink Speak button -	if (required_width < 0) -	{ -		S32 panel_min_width = 0; -		std::string panel_name = mSpeakPanel->getName(); -		bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width); -		if (!success) -		{ -			lldebugs << "Panel was not found to get its min width: " << panel_name << llendl; -		} -		else -		{ -			S32 panel_width = mSpeakPanel->getRect().getWidth(); -			S32 possible_shrink_width = panel_width - panel_min_width; - -			if (possible_shrink_width > 0) -			{ -				if (mSpeakBtn) -				{	 -					mSpeakBtn->setLabelVisible(false); -				} - -				mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight()); - -				required_width += possible_shrink_width; - -				if (required_width > 0) -				{ -					buttons_freed_width += required_width; -				} - -				lldebugs << "Shrunk Speak button panel: " << panel_name -					<< ", shrunk width: " << possible_shrink_width -					<< ", rest width to process: " << required_width -					<< llendl; -			} -		} -	} -} - -void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width) -{ -	LLPanel* panel = getButtonPanel(processed_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	if (panel->getVisible()) -	{ -		S32 panel_width = panel->getRect().getWidth(); -		S32 panel_min_width = 0; -		std::string panel_name = panel->getName(); -		bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width); -		S32 possible_shrink_width = panel_width - panel_min_width; - -		if (!success) -		{ -			lldebugs << "Panel was not found to get its min width: " << panel_name << llendl; -		} -		// we have some space to free by shrinking the button -		else if (possible_shrink_width > 0) -		{ -			// let calculate real width to shrink - -			// 1. apply all possible width -			required_width += possible_shrink_width; - -			// 2. it it is too much...  -			if (required_width > 0) -			{ -				// reduce applied shrunk width to the excessive value. -				possible_shrink_width -= required_width; -				required_width = 0; -			} -			panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight()); - -			lldebugs << "Shrunk panel: " << panel_name -				<< ", shrunk width: " << possible_shrink_width -				<< ", rest width to process: " << required_width -				<< llendl; -		} -	} -} - - -void LLBottomTray::processExtendButtons(S32& available_width) -{ -	// do not allow extending any buttons if we have some buttons hidden via resize -	if (isAutoHidden(RS_BUTTONS_CAN_BE_HIDDEN)) return; - -	lldebugs << "Distributing " << available_width << " px" << llendl; - -	// First try extending the Speak button. -	if (available_width > 0) -	{ -		if (!processExtendSpeakButton(available_width)) -		{ -			// The Speak button needs extension but lacks some space. -			// Don't extend other buttons in this case: the Speak button -			// should consume the available headroom first. -			return; -		} -	} - -	// Then process the other buttons from left to right. -	if (available_width > 0) -	{ -		resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -		const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -		// iterate through buttons in the mButtonsProcessOrder first -		for (; it != it_end; ++it) -		{ -			// is there available space? -			if (available_width <= 0) break; - -			// try to extend next button -			processExtendButton(*it, available_width); -		} -	} -} - -bool LLBottomTray::processExtendSpeakButton(S32& available_width) -{ -	if (available_width <= 0) -	{ -		llassert(available_width > 0); -		return true; -	} - -	const S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; -	const S32 panel_width = mSpeakPanel->getRect().getWidth(); -	const S32 required_headroom = panel_max_width - panel_width; - -	if (panel_width < panel_max_width) // if the button isn't extended already -	{ -		if (available_width < required_headroom) // not enough space -		{ -			lldebugs << "Need (" << required_headroom << " - " << available_width << ") = " -				<< (required_headroom - available_width) << " more px" -				<< " to extend the Speak button"<< llendl; - -			return false; // Don't extend other buttons until we extend Speak. -		} - -		// Reshape the Speak button to its maximum width. -		if (mSpeakBtn) mSpeakBtn->setLabelVisible(true); -		mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); - -		available_width -= required_headroom; -		llassert(available_width >= 0); - -		lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() -			<< ", extended width: " << required_headroom -			<< ", rest width to process: " << available_width -			<< llendl; -	} - -	return true; -} - -void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width) -{ -	llassert(available_width >= 0); - -	LLPanel* panel = getButtonPanel(processed_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	if (!panel->getVisible()) return; - -	// Widen the button up to its maximum width, but by not more than <available_width> px. -	S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type]; -	S32 panel_width = panel->getRect().getWidth(); -	S32 required_headroom = panel_max_width - panel_width; - -	S32 extend_by = llmin(available_width, required_headroom); -	if (extend_by > 0) -	{ -		panel->reshape(panel_width + extend_by, panel->getRect().getHeight()); - -		// Decrease amount of headroom available for other panels. -		available_width -= extend_by; - -		lldebugs << "Extending " << panel->getName() -			<< " by " << extend_by -			<< " px; remaining available width: " << available_width -			<< llendl; -	} -} - -bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const -{ -	// Check that all buttons (that can be hidden on resize) -	// to the left of the given one are already shown. - -	// process buttons in direct order (from left to right) -	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -	MASK buttons_before_mask = RS_NORESIZE; -	for (; it != it_end; ++it) -	{ -		const EResizeState button_type = *it; -		if (button_type == processed_object_type) break; - -		buttons_before_mask |= button_type; -	} - -	return !isAutoHidden(buttons_before_mask); -} - -void LLBottomTray::initResizeStateContainers() -{ -	// init map with objects should be processed for each type -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLPanel>("speak_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2"))); -	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel"))); - -	// init an order of processed buttons -	mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS); -	mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS); -	mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT); -	mButtonsProcessOrder.push_back(RS_BUTTON_BUILD); -	mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH); -	mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP); -	mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP); -	mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1); -	mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE); -	mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE); -	mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2); -	mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO); -	mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT); -	mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA); -	mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES); - -	mButtonsOrder.push_back(RS_BUTTON_SPEAK); -	mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end()); - -	// init default widths - -	// process buttons that can be hidden on resize... -	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -	for (; it != it_end; ++it) -	{ -		const EResizeState button_type = *it; -		// is there an appropriate object? -		LLPanel* button_panel = getButtonPanel(button_type); -		if (!button_panel) continue; - -		// set default width for it. -		mObjectDefaultWidthMap[button_type] = button_panel->getRect().getWidth(); -	} - -	// ... and add Speak button because it also can be shrunk. -	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth(); -} - -// this method must be called before restoring of the chat entry field on startup -// because it resets chatbar's width according to resize logic. -void LLBottomTray::initButtonsVisibility() -{ -	setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn ); -	setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton")); -	setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton")); -	setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); -	setVisibleAndFitWidths(RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton")); -	setVisibleAndFitWidths(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton")); -	setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton")); -	setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton")); -	setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton")); -	lldebugs << "mResizeState = " << resizeStateMaskToString(mResizeState) << llendl; -} - -void LLBottomTray::setButtonsControlsAndListeners() -{ -	// always show the speak panel if using the basic skin -	if (mSpeakBtn) -	{ -		gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); -	}	 - -	gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2)); -	gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2)); -	gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); -	gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SNAPSHOT, _2)); -	gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2)); -	gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2)); -	gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2)); -	gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2)); - - -	LLButton* build_btn = getChild<LLButton>("build_btn"); -	// set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml -	std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build"); -	// Set the button control value (toggle state) to the floater visibility control (Sets the value as well) -	build_btn->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name)); -} - -bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility) -{ -	if (LLBottomTray::instanceExists()) -	{ -		LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean()); -	} -	return true; -} - -bool LLBottomTray::showButton(EResizeState button_type, S32& available_width) -{ -	LLPanel* panel = getButtonPanel(button_type); -	if (NULL == panel) -	{ -		return false; -	} - -	if (panel->getVisible()) -	{ -		return false; -	} - -	// Check if none of the buttons to the left of the given one was auto-hidden. -	// (we auto-show the buttons left to right). -	if (!canButtonBeShown(button_type)) -	{ -		return false; -	} - -	// Make sure we have enough room to show this button. -	const S32 required_width = panel->getRect().getWidth(); -	if (available_width < required_width) -	{ -		lldebugs << "Need " << (required_width - available_width) << " more px to show " << resizeStateToString(button_type) << llendl; -		return false; -	} - -	// All good. Show the button. -	setTrayButtonVisible(button_type, true); - -	// Let the caller know that there is now less available space. -	available_width -= required_width; - -	lldebugs << "Showing button " << resizeStateToString(button_type) -		<< ", remaining available width: " << available_width -		<< llendl; -	setAutoHidden(button_type, false); - -	return true; -} - -void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) -{ -	LLPanel* panel = getButtonPanel(shown_object_type); -	if (NULL == panel) -	{ -		return; -	} - -	panel->setVisible(visible); -} - -void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification) -{ -	if (!setVisibleAndFitWidths(shown_object_type, visible) && visible && raise_notification) -	{ -		LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown", -								 LLSD(), -								 LLSD(), -								 LLNotificationFunctorRegistry::instance().DONOTHING); -	} -} - -bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible) -{ -	// The Speak button is treated specially: if voice is enabled, -	// the button should be displayed no matter how much space we've got. -	if (object_type == RS_BUTTON_SPEAK) -	{ -		showSpeakButton(visible); -		return true; -	} - -	LLPanel* cur_panel = getButtonPanel(object_type); -	if (NULL == cur_panel) -	{ -		return false; -	} - -	bool is_set = true; - -	if (visible) -	{ -		// Assume that only chiclet panel can be auto-resized -		const S32 available_width = getChicletPanelShrinkHeadroom(); - -		S32 preferred_width = mObjectDefaultWidthMap[object_type]; -		S32 current_width = cur_panel->getRect().getWidth(); -		S32 result_width = 0; -		bool decrease_width = false; - -		if (preferred_width > 0 && available_width >= preferred_width) -		{ -			result_width = preferred_width; -		} -		else if (available_width >= current_width) -		{ -			result_width = current_width; -		} -		else -		{ -			// Calculate the possible shrunk width as difference between current and minimal widths -			const S32 chatbar_shrunk_width = -				mChatBarContainer->getRect().getWidth() - get_panel_min_width(mToolbarStack, mChatBarContainer); - -			S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel); -			S32 sum_of_curr_widths = get_curr_width(mSpeakPanel); - -			resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin(); -			const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end(); - -			for (; it != it_end; ++it) -			{ -				LLPanel* cur_panel = getButtonPanel(*it); -				sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel); -				sum_of_curr_widths += get_curr_width(cur_panel); -			} - -			const S32 possible_shrunk_width = -				chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths); - -			// Minimal width of current panel -			S32 minimal_width = 0; -			mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width); - -			if ( (available_width + possible_shrunk_width) >= minimal_width) -			{ -				// There is enough space for minimal width, but set the result_width -				// to preferred_width so buttons widths decreasing will be done in predefined order -				result_width = (preferred_width > 0) ? preferred_width : current_width; -				decrease_width = true; -			} -			else -			{ -				lldebugs << "Need " << (minimal_width - available_width - possible_shrunk_width) -					<< " more px to show " << resizeStateToString(object_type) << llendl; - -				// Make the button uppear when we have more available space. -				setAutoHidden(object_type, true); -				return false; -			} -		} - -		if (result_width != current_width) -		{ -			cur_panel->reshape(result_width, cur_panel->getRect().getHeight()); -			current_width = result_width; -		} - -		is_set = showButton(object_type, current_width); - -		// Shrink buttons if needed -		if (is_set && decrease_width) -		{ -			processWidthDecreased( -result_width); -		} -	} -	else -	{ -		const S32 delta_width = get_curr_width(cur_panel); - -		setTrayButtonVisible(object_type, false); - -		// Mark button NOT to show while future bottom tray extending -		lldebugs << "Removing " << resizeStateToString(object_type) << " from mResizeState" << llendl; -		setAutoHidden(object_type, false); - -		// Extend other buttons if need -		if (delta_width) -		{ -			processWidthIncreased(delta_width); -		} -	} -	return is_set; -} - -LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type) -{ -	// Don't use the operator[] because it inserts a NULL value if the key is not found. -	if (mStateProcessedObjectMap.count(button_type) == 0) -	{ -		llwarns << "Cannot find a panel for " << resizeStateToString(button_type) << llendl; -		llassert(mStateProcessedObjectMap.count(button_type) == 1); -		return NULL; -	} - -	return mStateProcessedObjectMap[button_type]; -} - -void LLBottomTray::showWellButton(EResizeState object_type, bool visible) -{ -	llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type ); - -	const std::string panel_name = RS_IM_WELL == object_type ? "im_well_panel" : "notification_well_panel"; - -	LLView * panel = getChild<LLView>(panel_name); - -	// if necessary visibility is set nothing to do here -	if (panel->getVisible() == (BOOL)visible) return; - -	S32 panel_width = panel->getRect().getWidth(); -	panel->setVisible(visible); - -	if (visible) -	{ -		// method assumes that input param is a negative value -		processWidthDecreased(-panel_width); -	} -	else -	{ -		processWidthIncreased(panel_width); -	} -} - -void LLBottomTray::processChatbarCustomization(S32 new_width) -{ -	if (NULL == mNearbyChatBar) return; - -	const S32 delta_width = mChatBarContainer->getRect().getWidth() - new_width; - -	if (delta_width == 0) return; - -	{ -		static unsigned dbg_cnt = 0; -		lldebugs << llformat("*** (%03d) ************************************* %d", delta_width, ++dbg_cnt) << llendl; -	} - -	mDesiredNearbyChatWidth = new_width; - -	const S32 available_chiclet_shrink_width = getChicletPanelShrinkHeadroom(); -	llassert(available_chiclet_shrink_width >= 0); - -	if (delta_width > 0) // panel gets narrowly -	{ -		S32 total_possible_width = delta_width + available_chiclet_shrink_width; -		processShowButtons(total_possible_width); -		processExtendButtons(total_possible_width); -	} -	// here (delta_width < 0) // panel gets wider -	else //if (-delta_width > available_chiclet_shrink_width) -	{ -		S32 required_width = delta_width + available_chiclet_shrink_width; -		S32 buttons_freed_width = 0; -		processShrinkButtons(required_width, buttons_freed_width); -		processHideButtons(required_width, buttons_freed_width); -	} -} - -S32 LLBottomTray::getChicletPanelShrinkHeadroom() const -{ -	static const S32 min_width = mChicletPanel->getMinWidth(); -	const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth(); - -	S32 shrink_headroom = cur_width - min_width; -	llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum -	return shrink_headroom; -} - -// static -std::string LLBottomTray::resizeStateToString(EResizeState state) -{ -	const char *rs_string = "UNKNOWN_BUTTON"; -	 -	switch (state) -	{ -		case RS_NORESIZE:               rs_string = "RS_NORESIZE";              break; -		case RS_CHICLET_PANEL:          rs_string = "RS_CHICLET_PANEL";         break; -		case RS_CHATBAR_INPUT:          rs_string = "RS_CHATBAR_INPUT";         break; -		case RS_BUTTON_SNAPSHOT:        rs_string = "RS_BUTTON_SNAPSHOT";       break; -		case RS_BUTTON_CAMERA:          rs_string = "RS_BUTTON_CAMERA";         break; -		case RS_BUTTON_MOVEMENT:        rs_string = "RS_BUTTON_MOVEMENT";       break; -		case RS_BUTTON_GESTURES:        rs_string = "RS_BUTTON_GESTURES";       break; -		case RS_BUTTON_SPEAK:           rs_string = "RS_BUTTON_SPEAK";          break; -		case RS_IM_WELL:                rs_string = "RS_IM_WELL";               break; -		case RS_NOTIFICATION_WELL:      rs_string = "RS_NOTIFICATION_WELL";     break; -		case RS_BUTTON_BUILD:           rs_string = "RS_BUTTON_BUILD";          break; -		case RS_BUTTON_SEARCH:          rs_string = "RS_BUTTON_SEARCH";         break; -		case RS_BUTTON_WORLD_MAP:       rs_string = "RS_BUTTON_WORLD_MAP";      break; -		case RS_BUTTON_MINI_MAP:        rs_string = "RS_BUTTON_MINI_MAP";       break; -		case RS_BUTTON_DESTINATIONS:    rs_string = "RS_BUTTON_DESTINATIONS";   break; -		case RS_BUTTON_AVATARS:         rs_string = "RS_BUTTON_AVATARS";        break; -		case RS_BUTTON_PEOPLE:          rs_string = "RS_BUTTON_PEOPLE";         break; -		case RS_BUTTON_PROFILE:         rs_string = "RS_BUTTON_PROFILE";        break; -		case RS_BUTTON_HOWTO:           rs_string = "RS_BUTTON_HOWTO";          break; -		case RS_BUTTON_SPLITTER_1:      rs_string = "RS_BUTTON_SPLITTER_1";     break; -		case RS_BUTTON_SPLITTER_2:      rs_string = "RS_BUTTON_SPLITTER_2";     break; -		case RS_BUTTONS_CAN_BE_HIDDEN:  rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break; -		// No default to track additions. -	} - -	return rs_string; -} - -// static -std::string LLBottomTray::resizeStateMaskToString(MASK mask) -{ -	std::string res; - -	bool add_delimiter = false; -    for (U32 i = 0; i < 16; i++) -    { -    	EResizeState state = (EResizeState) (1 << i); -    	if (mask & state) -    	{ -    		if (!add_delimiter) -    		{ -    			add_delimiter = true; -    		} -    		else -    		{ -    			res += ", "; -    		} - -			res += resizeStateToString(state); -    	} -    } - -    if (res.empty()) -    { -    	res = resizeStateToString(RS_NORESIZE); -    } - -    res += llformat(" (0x%X)", mask); -    return res; -} - -bool LLBottomTray::isAutoHidden(MASK button_types) const -{ -	return (mResizeState & button_types) != 0; -} - -void LLBottomTray::setAutoHidden(MASK button_types, bool hide) -{ -	if (hide) -	{ -		mResizeState |= button_types; -	} -	else -	{ -		mResizeState &= ~button_types; -	} -} - -//EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h deleted file mode 100644 index e26b0792e9..0000000000 --- a/indra/newview/llbottomtray.h +++ /dev/null @@ -1,564 +0,0 @@ -/**  -* @file llbottomtray.h -* @brief LLBottomTray class header file -* -* $LicenseInfo:firstyear=2009&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2010, Linden Research, Inc. -*  -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License only. -*  -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -* Lesser General Public License for more details. -*  -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA -*  -* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA -* $/LicenseInfo$ -*/ - -#ifndef LL_LLBOTTOMPANEL_H -#define LL_LLBOTTOMPANEL_H - -#include "llpanel.h" -#include "llimview.h" -#include "llbutton.h" - -class LLChicletPanel; -class LLLayoutStack; -class LLSpeakButton; -class LLNearbyChatBar; -class LLIMChiclet; -class LLBottomTrayLite; -class LLLayoutPanel; -class LLMenuGL; -class LLNearbyChatBarListener; - -// Build time optimization, generate once in .cpp file -#ifndef LLBOTTOMTRAY_CPP -extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); -#endif - -/** - * Class for buttons that should have drag'n'drop ability in bottomtray. - * These buttons pass mouse events handling to bottomtray. - */ -class LLBottomtrayButton : public LLButton -{ -public: -	struct Params : public LLInitParam::Block<Params, LLButton::Params> -	{ -		Optional<bool> can_drag; -		Params() -		: can_drag("can_drag", true){} -	}; -	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); -	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); -	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); - -protected: -	LLBottomtrayButton(const Params& p) -	:	LLButton(p), -		mCanDrag(p.can_drag) -	{ - -	} -	friend class LLUICtrlFactory; - -	bool mCanDrag; -}; - -class LLBottomTray  -	: public LLSingleton<LLBottomTray> -	, public LLPanel -	, public LLIMSessionObserver -	, public LLVoiceClientStatusObserver -{ -	LOG_CLASS(LLBottomTray); -	friend class LLSingleton<LLBottomTray>; -	friend class LLBottomTrayLite; -public: -	~LLBottomTray(); - -	BOOL postBuild(); - -	LLChicletPanel*		getChicletPanel()	{return mChicletPanel;} -	LLNearbyChatBar*		getNearbyChatBar(); - -	void onCommitGesture(LLUICtrl* ctrl); - -	// LLIMSessionObserver observe triggers -	virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id); -	virtual void sessionRemoved(const LLUUID& session_id); -	void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); - -	S32 getTotalUnreadIMCount(); - -	virtual void reshape(S32 width, S32 height, BOOL called_from_parent); - -	virtual void setVisible(BOOL visible); - -	/*virtual*/ S32 notifyParent(const LLSD& info); - -	// Implements LLVoiceClientStatusObserver::onChange() to enable the speak -	// button when voice is available -	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); - -	void showBottomTrayContextMenu(S32 x, S32 y, MASK mask); - -	void showSpeakButton(bool visible); - -	void toggleMovementControls(); -	void toggleCameraControls(); - -	void onMouselookModeIn(); -	void onMouselookModeOut(); - -	/** -	 * Creates IM Chiclet based on session type (IM chat or Group chat) -	 */ -	LLIMChiclet* createIMChiclet(const LLUUID& session_id); - -	// Below are methods that were introduced or overriden in bottomtray to handle drag'n'drop - -	virtual void draw(); - -	/** -	 * These three methods handle drag'n'drop, they may be called directly from child buttons. -	 * handleHover and other virtual handle* couldn't be used here, because we should call LLPanel::handle*, -	 * but x and y here are often outside of bottomtray. -	 */ -	void onDraggableButtonHover(S32 x, S32 y); -	void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y); -	void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y); - - -private: -	typedef enum e_resize_state -	{ -		RS_NORESIZE				= 0x0000, -		RS_CHICLET_PANEL		= 0x0001, -		RS_CHATBAR_INPUT		= 0x0002, -		RS_BUTTON_SNAPSHOT		= 0x0004, -		RS_BUTTON_CAMERA		= 0x0008, -		RS_BUTTON_MOVEMENT		= 0x0010, -		RS_BUTTON_GESTURES		= 0x0020, -		RS_BUTTON_SPEAK			= 0x0040, -		RS_IM_WELL				= 0x0080, -		RS_NOTIFICATION_WELL	= 0x0100, -		RS_BUTTON_BUILD			= 0x0200, -		RS_BUTTON_SEARCH		= 0x0400, -		RS_BUTTON_WORLD_MAP		= 0x0800, -		RS_BUTTON_MINI_MAP		= 0x1000, -		RS_BUTTON_DESTINATIONS	= 0x2000, -		RS_BUTTON_AVATARS		= 0x4000, -		RS_BUTTON_PEOPLE		= 0x8000, -		RS_BUTTON_PROFILE		= 0x10000, -		RS_BUTTON_HOWTO			= 0x20000, -		RS_BUTTON_SPLITTER_1	= 0x40000, -		RS_BUTTON_SPLITTER_2	= 0x80000, - -		/* -		Once new button that can be hidden on resize is added don't forget to update related places: -			- RS_BUTTONS_CAN_BE_HIDDEN enum value below. -			- initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder -		*/ - -		/** -		 * Specifies buttons which can be hidden when bottom tray is shrunk. -		 * They are: Gestures, Movement (Move), Camera (View), Snapshot -		 *		new: Build, Search, Map, World Map, Mini-Map, destinations, avatars -		 */ -		RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES -									| RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP -									| RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS -	}EResizeState; - -	// Below are three methods that were introduced to handle drag'n'drop - -	/** -	 * finds a panel under the specified LOCAL point -	 */ -	LLPanel* findChildPanelByLocalCoords(S32 x, S32 y); - -	/** -	 * checks whether the cursor is over an area where the dragged button may be dropped -	 */ -	bool isCursorOverDraggableArea(S32 x, S32 y); - -	/** -	 * Updates process(shrink/show/hide) order of buttons and order in which they'll be stored for further save/load. -	 * It is called when dragged button is dropped -	 */ -	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. -	 * -	 * Process order: -	 *	- reduce chiclet panel to its minimal width; -	 *  - reduce chatbar to its minimal width; -	 *  - reduce visible buttons from right to left to their minimal width; -	 *  - hide visible buttons from right to left; -	 * When button is hidden chatbar extended to fill released space if it is necessary. -	 * -	 * @param[in] delta_width - value by which bottom tray should be shrunk. It is a negative value. -	 * @return positive value which bottom tray can not process when it reaches its minimal width. -	 *		Zero if there was enough space to process delta_width. -	 */ -	S32 processWidthDecreased(S32 delta_width); - -	/** -	 * Updates child controls size and visibility when it is necessary to extend total width. -	 * -	 * Process order: -	 *  - show invisible buttons should be shown from left to right if possible; -	 *  - extend visible buttons from left to right to their default width; -	 *  - extend chatbar to its maximal width; -	 *	- extend chiclet panel to all available space; -	 * When chatbar & chiclet panels are wider then their minimal width they can be reduced to allow -	 * a button gets visible in case if passed delta_width is not enough (chatbar first). -	 * -	 * @param[in] delta_width - value by which bottom tray should be extended. It is a positive value. -	 */ -	void processWidthIncreased(S32 delta_width); - -	/** helper function to log debug messages */ -	void log(LLView* panel, const std::string& descr); - -	/** -	 * Tries to show hidden by resize buttons using available width. -	 * -	 * Gets buttons visible if there is enough space. Reduces available_width in this case. -	 * -	 * @params[in, out] available_width - reference to available width to be used to show buttons. -	 * @see processShowButton() -	 * @return consumed pixels (difference in available width). -	 */ -	S32 processShowButtons(S32& available_width); - -	/** -	 * Tries to show panel with specified button using available width. -	 * -	 * Shows button specified by type if there is enough space. Reduces available_width in this case. -	 * -	 * @params[in] shown_object_type - type of button to be shown. -	 * @params[in, out] available_width - reference to available width to be used to show button. -	 * -	 * @return true if button can be shown, false otherwise -	 */ -	bool processShowButton(EResizeState shown_object_type, S32& available_width); - -	/** -	 * Hides visible panels with all buttons that may be hidden by resize if it is necessary. -	 * -	 * When button gets hidden some space is released in bottom tray. -	 * This space is taken into account for several consecutive calls for several buttons. -	 * -	 * @params[in, out] required_width - reference to required width to be released. This is a negative value. -	 *			Its absolute value is decreased by shown panel width. -	 * @params[in, out] buttons_freed_width - reference to value released over required one. -	 *			If panel's width is more than required difference is added to buttons_freed_width. -	 * @see processHideButton() -	 */ -	void processHideButtons(S32& required_width, S32& buttons_freed_width); - -	/** -	 * Hides panel with specified button if it is visible. -	 * -	 * When button gets hidden some space is released in bottom tray. -	 * This space is taken into account for several consecutive calls for several buttons. -	 * -	 * @params[in] processed_object_type - type of button to be hide. -	 * @params[in, out] required_width - reference to required width to be released. This is a negative value. -	 *			Its absolute value is decreased by panel width. -	 * @params[in, out] buttons_freed_width - reference to value released over required one. -	 *			If panel's width is more than required difference is added to buttons_freed_width. -	 */ -	void processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width); - -	/** -	 * Shrinks shown buttons to reduce total taken space. -	 * -	 * Shrinks buttons that may be shrunk smoothly first. Then shrinks Speak button. -	 * -	 * @param[in, out] required_width - reference to width value which should be released when buttons are shrunk. It is a negative value. -	 * It is increased on the value processed by buttons. -	 * @params[in, out] buttons_freed_width - reference to value released over required one. -	 *			If width of panel with Speak button is more than required that difference is added -	 *				to buttons_freed_width. -	 *			This is because Speak button shrinks discretely unlike other buttons which are changed smoothly. -	 */ -	void processShrinkButtons(S32& required_width, S32& buttons_freed_width); - -	/** -	 * Shrinks panel with specified button if it is visible. -	 * -	 * @params[in] processed_object_type - type of button to be shrunk. -	 * @param[in, out] required_width - reference to width value which should be released when button is shrunk. It is a negative value. -	 * It is increased on the value released by the button. -	 */ -	void processShrinkButton(EResizeState processed_object_type, S32& required_width); - -	/** -	 * Extends shown buttons to increase total taken space. -	 * -	 * Extends buttons that may be extended smoothly first. Then extends Speak button. -	 * -	 * @param[in, out] available_width - reference to width value which buttons can use to be extended. -	 *		It is a positive value. It is decreased on the value processed by buttons. -	 */ -	void processExtendButtons(S32& available_width); - -	/** -	 * Extends the Speak button if there is enough headroom. -	 * -	 * Unlike other buttons, the Speak buttons has only two possible widths: -	 * the minimal one (without label) and the maximal (default) one. -	 * -	 * If the button is at its minimum width there is not enough headroom to -	 * reshape it to the maximum width, the method does nothing. -	 * -	 * @param available_width Available headroom. -	 * @return false if the button requires extension but there's not enough headroom, true otherwise. -	 */ -	bool processExtendSpeakButton(S32& available_width); - -	/** -	 * Extends shown button to increase total taken space. -	 * -	 * @params[in] processed_object_type - type of button to be extended. -	 * @param[in, out] available_width - reference to width value which button can use to be extended. -	 *		It is a positive value. It is decreased on the value processed by buttons. -	 */ -	void processExtendButton(EResizeState processed_object_type, S32& available_width); - -	/** -	 * Determines if specified by type object can be shown. It should be hidden by shrink before. -	 * -	 * Processes buttons a such way to show buttons in constant order: -	 *   - Gestures, Move, View, Snapshot -	 */ -	bool canButtonBeShown(EResizeState processed_object_type) const; - -	/** -	 * Initializes all containers stored data related to children resize state. -	 * -	 * @see mStateProcessedObjectMap -	 * @see mObjectDefaultWidthMap -	 * @see mButtonsProcessOrder -	 */ -	void initResizeStateContainers(); - -	/** -	 * Initializes buttons' visibility depend on stored Control Settings. -	 */ -	void initButtonsVisibility(); - -	/** -	 * Initializes listeners of Control Settings to toggle appropriate buttons' visibility. -	 * -	 * @see toggleShowButton() -	 */ -	void setButtonsControlsAndListeners(); - -	/** -	 * Toggles visibility of specified button depend on passed value. -	 * -	 * @param button_type - type of button to be toggled -	 * @param new_visibility - new visibility of the button -	 * -	 * @see setButtonsControlsAndListeners() -	 */ -	static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility); - -	/** -	 * Show the button if there is enough space. -	 * -	 * @param[in]      button_type -    type of button to be shown. -	 * @param[in, out] available_width  amount of available space on the bottom bar. -	 * -	 * @return true if button was shown, false that's not possible (not enough space, etc) -	 */ -	bool showButton(EResizeState button_type, S32& available_width); - -	/** -	 * Sets passed visibility to object specified by resize type. -	 */ -	void setTrayButtonVisible(EResizeState shown_object_type, bool visible); - -	/** -	 * Sets passed visibility to object specified by resize type if it is possible. -	 * -	 * If it is impossible to show required button due to there is no enough room in bottom tray -	 * it will no be shown. Is called via context menu commands. -	 * In this case Alert Dialog will be shown to notify user about that. -	 * -	 * Method also stores resize state to be processed while future bottom tray extending: -	 *  - if hidden while resizing button should be hidden it will not be shown while extending; -	 *  - if hidden via context menu button should be shown but there is no enough room for now -	 *    it will be shown while extending. -	 */ -	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true); - -	/** -	 * Sets passed visibility to required button and fit widths of shown -	 * buttons(notice that method can shrink widths to -	 * allocate needed room in bottom tray). -	 * Returns true if visibility of required button was set. -	 */ -	bool setVisibleAndFitWidths(EResizeState object_type, bool visible); - -	/** -	 * Get panel containing the given button. -	 * -	 * @see mStateProcessedObjectMap -	 */ -	LLPanel* getButtonPanel(EResizeState button_type); - -	/** -	 * Shows/hides panel with specified well button (IM or Notification) -	 * -	 * @param[in] object_type - type of well button to be processed. -	 *		Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL. -	 * @param[in] visible - flag specified whether button should be shown or hidden. -	 */ -	void showWellButton(EResizeState object_type, bool visible); - -	/** -	 * Handles a customization of chatbar width. -	 * -	 * When chatbar gets wider layout stack will reduce chiclet panel (it is auto-resizable) -	 *	But once chiclet panel reaches its minimal width Stack will force to reduce buttons width. -	 *	including Speak button. The similar behavior is when chatbar gets narrowly. -	 * This methods force resize behavior to resize buttons properly in these cases. -	 */ -	void processChatbarCustomization(S32 new_width); - -	/** -	 * @return difference between current chiclet panel width and the minimum. -	 */ -	S32 getChicletPanelShrinkHeadroom() const; - -	/// Get button name for debugging. -	static std::string resizeStateToString(EResizeState state); - -	/// Dump a mask for debugging -	static std::string resizeStateMaskToString(MASK mask); - -	/// @return true if any of the the passed buttons have been auto-hidden due to lack of available space. -	bool isAutoHidden(MASK button_types) const; - -	/** -	 * (Un)Mark the buttons as hidden. -	 * -	 * Auto-hidden buttons are those that re-appear as soon as we have enough available space. -	 */ -	void setAutoHidden(MASK button_types, bool hide); - -	/// Buttons automatically hidden due to lack of space. -	MASK mResizeState; - -	/** -	 * Mapping of button types to the layout panels the buttons are wrapped in. -	 * -	 * Used by getButtonPanel(). -	 */ -	typedef std::map<EResizeState, LLPanel*> state_object_map_t; -	state_object_map_t mStateProcessedObjectMap; - -	/// Default (maximum) widths of the layout panels. -	typedef std::map<EResizeState, S32> state_object_width_map_t; -	state_object_width_map_t mObjectDefaultWidthMap; - -	typedef std::vector<EResizeState> resize_state_vec_t; - -	/** -	 * Contains order in which child buttons should be processed in show/hide, extend/shrink methods. -	 */ -	resize_state_vec_t mButtonsProcessOrder; - -	/** -	 * Contains order in which child buttons are shown. -	 * It traces order of all bottomtray buttons that may change place via drag'n'drop and should -	 * save and load it between sessions. mButtonsProcessOrder is not enough for it because it contains only -	 * buttons that may be hidden. -	 */ -	resize_state_vec_t mButtonsOrder; - -protected: - -	LLBottomTray(const LLSD& key = LLSD()); - -	static void* createNearbyChatBar(void* userdata); - -	void updateContextMenu(S32 x, S32 y, MASK mask); -	void onContextMenuItemClicked(const LLSD& userdata); -	bool onContextMenuItemEnabled(const LLSD& userdata); - -	// Either default or saved after user's manual resize width of nearby chat. -	// Nearby chat will not always have it, because sometimes it can be shrunk on resize, -	// but when possible it will be restored back to this value. -	S32					mDesiredNearbyChatWidth; -	LLChicletPanel* 	mChicletPanel; -	LLPanel*			mSpeakPanel; -	LLSpeakButton* 		mSpeakBtn; -	LLNearbyChatBar*	mNearbyChatBar; -	LLLayoutPanel*		mChatBarContainer; -	LLPanel*		mNearbyCharResizeHandlePanel; -	LLLayoutStack*		mToolbarStack; -	LLMenuGL*			mBottomTrayContextMenu; -	LLButton*			mCamButton; -	LLButton*			mMovementButton; -	LLBottomTrayLite*   mBottomTrayLite; -	bool                mIsInLiteMode; - -	// Drag'n'Drop - -	/** -	 * Is true if mouse down happened on draggable button. -	 * Set false whether on drag start or on mouse up. -	 */ -	bool mCheckForDrag; -	/** -	 * These two variables hold corrdinates of mouse down on draggable button. -	 * They are used to compare with current coordinates of cursor and determine whether drag'n'drop should start. -	 */ -	S32 mStartX; -	S32 mStartY; -	/** -	 * True if drag'n'drop is happening. -	 */ -	bool mDragStarted; - -	/** -	 * Pointer to panel which is currently dragged (though it seems to user that button is dragged, -	 * we are changing place of layout panel). -	 */ -	LLPanel* mDraggedItem; -	/** -	 * Panel before which the dragged button will be inserted. -	 */ -	LLPanel* mLandingTab; -	/** -	 * Image used to show position where dragged button will be dropped. -	 */ -	LLUIImage* mImageDragIndication; - -	// We want only one LLNearbyChatBarListener object, so it's tied to this singleton -	boost::shared_ptr<LLNearbyChatBarListener> mListener; -}; - -#endif // LL_LLBOTTOMPANEL_H diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index fb3abb132b..d6095cce07 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -60,7 +60,6 @@  #include "llui.h"  #include "llviewermenu.h"  #include "lluictrlfactory.h" -#include "llbottomtray.h"  //  // Globals diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 245157923d..a076374903 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -29,7 +29,7 @@  #include "llagent.h"  #include "llavataractions.h" -#include "llbottomtray.h" +#include "llchicletbar.h"  #include "lleventtimer.h"  #include "llgroupactions.h"  #include "lliconctrl.h" @@ -214,10 +214,10 @@ void LLSysWellChiclet::updateWidget(bool is_window_empty)  {  	mButton->setEnabled(!is_window_empty); -	LLSD params; -	params["well_empty"] = is_window_empty; -	params["well_name"] = getName(); -	notifyParent(params); +	if (LLChicletBar::instanceExists()) +	{ +		LLChicletBar::getInstance()->showWellButton(getName(), !is_window_empty); +	}  }  // virtual  BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -297,7 +297,7 @@ void LLIMWellChiclet::createMenu()  void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)  {  	const LLUUID& session_id = session_data["session_id"]; -	const S32 counter = LLBottomTray::getInstance()->getTotalUnreadIMCount(); +	const S32 counter = LLChicletBar::getInstance()->getTotalUnreadIMCount();  	const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container")  		&& !LLFloaterReg::instanceVisible("impanel", session_id); diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp new file mode 100644 index 0000000000..a17e1d13f5 --- /dev/null +++ b/indra/newview/llchicletbar.cpp @@ -0,0 +1,340 @@ +/**  + * @file llchicletbar.cpp + * @brief LLChicletBar class implementation + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" // must be first include + +#include "llchicletbar.h" + +// library includes +#include "llfloaterreg.h" +#include "lllayoutstack.h" + +// newview includes +#include "llchiclet.h" +#include "llimfloater.h" // for LLIMFloater +#include "llsyswellwindow.h" + +namespace +{ +	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel"; + +	S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel) +	{ +		S32 minimal_width = 0; +		llassert(stack); +		if ( stack && panel && panel->getVisible() ) +		{ +			stack->getPanelMinSize(panel->getName(), &minimal_width); +		} +		return minimal_width; +	} + +	S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel) +	{ +		S32 max_width = 0; +		llassert(stack); +		if ( stack && panel && panel->getVisible() ) +		{ +			stack->getPanelMaxSize(panel->getName(), &max_width); +		} +		return max_width; +	} + +	S32 get_curr_width(LLUICtrl* ctrl) +	{ +		S32 cur_width = 0; +		if ( ctrl && ctrl->getVisible() ) +		{ +			cur_width = ctrl->getRect().getWidth(); +		} +		return cur_width; +	} +} + +LLChicletBar::LLChicletBar(const LLSD&) +:	mChicletPanel(NULL), +	mToolbarStack(NULL) +{ +	// Firstly add our self to IMSession observers, so we catch session events +	// before chiclets do that. +	LLIMMgr::getInstance()->addSessionObserver(this); + +	buildFromFile("panel_chiclet_bar.xml"); +} + +LLChicletBar::~LLChicletBar() +{ +	if (!LLSingleton<LLIMMgr>::destroyed()) +	{ +		LLIMMgr::getInstance()->removeSessionObserver(this); +	} +} + +LLIMChiclet* LLChicletBar::createIMChiclet(const LLUUID& session_id) +{ +	LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id); + +	switch (im_chiclet_type) +	{ +	case LLIMChiclet::TYPE_IM: +		return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id); +	case LLIMChiclet::TYPE_GROUP: +		return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id); +	case LLIMChiclet::TYPE_AD_HOC: +		return getChicletPanel()->createChiclet<LLAdHocChiclet>(session_id); +	case LLIMChiclet::TYPE_UNKNOWN: +		break; +	} + +	return NULL; +} + +//virtual +void LLChicletBar::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) +{ +	if (!getChicletPanel()) return; + +	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id); +	if (!session) return; + +	// no need to spawn chiclets for participants in P2P calls called through Avaline +	if (session->isP2P() && session->isOtherParticipantAvaline()) return; + +	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return; + +	LLIMChiclet* chiclet = createIMChiclet(session_id); +	if(chiclet) +	{ +		chiclet->setIMSessionName(name); +		chiclet->setOtherParticipantId(other_participant_id); +		 +		LLIMFloater::onIMChicletCreated(session_id); + +	} +	else +	{ +		llwarns << "Could not create chiclet" << llendl; +	} +} + +//virtual +void LLChicletBar::sessionRemoved(const LLUUID& session_id) +{ +	if(getChicletPanel()) +	{ +		// IM floater should be closed when session removed and associated chiclet closed +		LLIMFloater* iMfloater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); +		if (iMfloater != NULL) +		{ +			iMfloater->closeFloater(); +		} + +		getChicletPanel()->removeChiclet(session_id); +	} +} + +void LLChicletBar::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) +{ +	//this is only needed in case of outgoing ad-hoc/group chat sessions +	LLChicletPanel* chiclet_panel = getChicletPanel(); +	if (chiclet_panel) +	{ +		//it should be ad-hoc im chiclet or group im chiclet +		LLChiclet* chiclet = chiclet_panel->findChiclet<LLChiclet>(old_session_id); +		if (chiclet) chiclet->setSessionId(new_session_id); +	} +} + +S32 LLChicletBar::getTotalUnreadIMCount() +{ +	return getChicletPanel()->getTotalUnreadIMCount(); +} + +BOOL LLChicletBar::postBuild() +{ +	mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); +	mChicletPanel = getChild<LLChicletPanel>("chiclet_list"); + +	showWellButton("im_well", !LLIMWellWindow::getInstance()->isWindowEmpty()); +	showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty()); + +	return TRUE; +} + +void LLChicletBar::showWellButton(const std::string& well_name, bool visible) +{ +	LLView * panel = findChild<LLView>(well_name + "_panel"); +	if (!panel)	return; + +	panel->setVisible(visible); +} + +void LLChicletBar::log(LLView* panel, const std::string& descr) +{ +	if (NULL == panel) return; +	LLView* layout = panel->getParent(); +	LL_DEBUGS("Chiclet Bar Rects") << descr << ": " +		<< "panel: " << panel->getName() +		<< ", rect: " << panel->getRect() +		<< " layout: " << layout->getName() +		<< ", rect: " << layout->getRect() +		<< LL_ENDL; +} + +void LLChicletBar::reshape(S32 width, S32 height, BOOL called_from_parent) +{ +	static S32 debug_calling_number = 0; +	lldebugs << "**************************************** " << ++debug_calling_number << llendl; + +	S32 current_width = getRect().getWidth(); +	S32 delta_width = width - current_width; +	lldebugs << "Reshaping: " +		<< ", width: " << width +		<< ", cur width: " << current_width +		<< ", delta_width: " << delta_width +		<< ", called_from_parent: " << called_from_parent +		<< llendl; + +	if (mChicletPanel)			log(mChicletPanel, "before"); + +	// Difference between chiclet bar width required to fit its children and the actual width. (see EXT-991) +	// Positive value means that chiclet bar is not wide enough. +	// Negative value means that there is free space. +	static S32 extra_shrink_width = 0; +	bool should_be_reshaped = true; + +	if (mChicletPanel && mToolbarStack) +	{ +		// Firstly, update layout stack to ensure we deal with correct panel sizes. +		{ +			BOOL saved_anim = mToolbarStack->getAnimate(); +			// Set chiclet panel to be autoresized by default. +			mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); +			// Disable animation to prevent layout updating in several frames. +			mToolbarStack->setAnimate(FALSE); +			// Force the updating of layout to reset panels collapse factor. +			mToolbarStack->updateLayout(); +			// Restore animate state. +			mToolbarStack->setAnimate(saved_anim); +		} + +		// chiclet bar is narrowed +		if (delta_width < 0) +		{ +			if (extra_shrink_width > 0) // not enough space +			{ +				extra_shrink_width += llabs(delta_width); +				should_be_reshaped = false; +			} +			else +			{ +				extra_shrink_width = processWidthDecreased(delta_width); + +				// increase new width to extra_shrink_width value to not reshape less than chiclet bar minimum +				width += extra_shrink_width; +			} +		} +		// chiclet bar is widened +		else +		{ +			if (extra_shrink_width > delta_width) +			{ +				// Still not enough space. +				// Only subtract the delta from the required delta and don't reshape. +				extra_shrink_width -= delta_width; +				should_be_reshaped = false; +			} +			else if (extra_shrink_width > 0) +			{ +				// If we have some extra shrink width let's reduce delta_width & width +				delta_width -= extra_shrink_width; +				width -= extra_shrink_width; +				extra_shrink_width = 0; +			} +		} +	} + +	if (should_be_reshaped) +	{ +		lldebugs << "Reshape all children with width: " << width << llendl; +		LLPanel::reshape(width, height, called_from_parent); +	} + +	if (mChicletPanel)			log(mChicletPanel, "after"); +} + +S32 LLChicletBar::processWidthDecreased(S32 delta_width) +{ +	bool still_should_be_processed = true; + +	const S32 chiclet_panel_shrink_headroom = getChicletPanelShrinkHeadroom(); + +	// Decreasing width of chiclet panel. +	if (chiclet_panel_shrink_headroom > 0) +	{ +		// we have some space to decrease chiclet panel +		S32 shrink_by = llmin(-delta_width, chiclet_panel_shrink_headroom); + +		lldebugs << "delta_width: " << delta_width +			<< ", panel_delta_min: " << chiclet_panel_shrink_headroom +			<< ", shrink_by: " << shrink_by +			<< llendl; + +		// is chiclet panel wide enough to process resizing? +		delta_width += chiclet_panel_shrink_headroom; + +		still_should_be_processed = delta_width < 0; + +		lldebugs << "Shrinking chiclet panel by " << shrink_by << " px" << llendl; +		mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - shrink_by, mChicletPanel->getParent()->getRect().getHeight()); +		log(mChicletPanel, "after processing panel decreasing via chiclet panel"); + +		lldebugs << "RS_CHICLET_PANEL" +			<< ", delta_width: " << delta_width +			<< llendl; +	} + +	S32 extra_shrink_width = 0; + +	if (still_should_be_processed) +	{ +		extra_shrink_width = -delta_width; +		llwarns << "There is no enough width to reshape all children: " +			<< extra_shrink_width << llendl; +	} + +	return extra_shrink_width; +} + +S32 LLChicletBar::getChicletPanelShrinkHeadroom() const +{ +	static const S32 min_width = mChicletPanel->getMinWidth(); +	const S32 cur_width = mChicletPanel->getParent()->getRect().getWidth(); + +	S32 shrink_headroom = cur_width - min_width; +	llassert(shrink_headroom >= 0); // the panel cannot get narrower than the minimum +	return shrink_headroom; +} diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h new file mode 100644 index 0000000000..224dfbb647 --- /dev/null +++ b/indra/newview/llchicletbar.h @@ -0,0 +1,99 @@ +/**  +* @file llchicletbar.h +* @brief LLChicletBar class header file +* +* $LicenseInfo:firstyear=2011&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, Linden Research, Inc. +*  +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +*  +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +*  +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +*  +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#ifndef LL_LLCHICLETBAR_H +#define LL_LLCHICLETBAR_H + +#include "llpanel.h" +#include "llimview.h" + +class LLChicletPanel; +class LLIMChiclet; +class LLLayoutPanel; +class LLLayoutStack; + +class LLChicletBar +	: public LLSingleton<LLChicletBar> +	, public LLPanel +	, public LLIMSessionObserver +{ +	LOG_CLASS(LLChicletBar); +	friend class LLSingleton<LLChicletBar>; +public: +	~LLChicletBar(); + +	BOOL postBuild(); + +	LLChicletPanel*	getChicletPanel() { return mChicletPanel; } + +	// LLIMSessionObserver observe triggers +	virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id); +	virtual void sessionRemoved(const LLUUID& session_id); +	void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); + +	S32 getTotalUnreadIMCount(); + +	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent); + +	/** +	 * Creates IM Chiclet based on session type (IM chat or Group chat) +	 */ +	LLIMChiclet* createIMChiclet(const LLUUID& session_id); + +	/** +	 * Shows/hides panel with specified well button (IM or Notification) +	 * +	 * @param well_name - name of the well panel to be processed. +	 * @param visible - a flag specifying whether a button should be shown or hidden. +	 */ +	void showWellButton(const std::string& well_name, bool visible); + +private: +	/** +	 * Updates child controls size and visibility when it is necessary to reduce total width. +	 * +	 * @param delta_width - value by which chiclet bar should be shrunk. It is a negative value. +	 * @returns positive value which chiclet bar can not process when it reaches its minimal width. +	 *		Zero if there was enough space to process delta_width. +	 */ +	S32 processWidthDecreased(S32 delta_width); + +	/** helper function to log debug messages */ +	void log(LLView* panel, const std::string& descr); + +	/** +	 * @return difference between current chiclet panel width and the minimum. +	 */ +	S32 getChicletPanelShrinkHeadroom() const; + +protected: +	LLChicletBar(const LLSD& key = LLSD()); + +	LLChicletPanel* 	mChicletPanel; +	LLLayoutStack*		mToolbarStack; +}; + +#endif // LL_LLCHICLETBAR_H diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp index e692f1735a..56c0806546 100644 --- a/indra/newview/llfloatersounddevices.cpp +++ b/indra/newview/llfloatersounddevices.cpp @@ -28,7 +28,6 @@  #include "llfloatersounddevices.h" -#include "llbottomtray.h"  #include "lldraghandle.h"  #include "llpanelvoicedevicesettings.h" @@ -55,9 +54,6 @@ LLFloaterSoundDevices::~LLFloaterSoundDevices()  BOOL LLFloaterSoundDevices::postBuild()  {  	LLTransientDockableFloater::postBuild(); -		 -	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn"); -	setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));  	setIsChrome(TRUE);  	if (mDragHandle) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 14d85246e9..f5cda52d44 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -34,9 +34,9 @@  #include "llappviewer.h"  #include "llavatarnamecache.h"  #include "llbutton.h" -#include "llbottomtray.h"  #include "llchannelmanager.h"  #include "llchiclet.h" +#include "llchicletbar.h"  #include "llfloaterreg.h"  #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container  #include "llinventoryfunctions.h" @@ -117,14 +117,14 @@ void LLIMFloater::onFocusLost()  {  	LLIMModel::getInstance()->resetActiveSessionID(); -	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false); +	LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);  }  void LLIMFloater::onFocusReceived()  {  	LLIMModel::getInstance()->setActiveSessionID(mSessionID); -	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true); +	LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);  	if (getVisible())  	{ @@ -444,7 +444,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  		if (floater->getDockControl() == NULL)  		{  			LLChiclet* chiclet = -					LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>( +					LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(  							session_id);  			if (chiclet == NULL)  			{ @@ -452,11 +452,11 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  			}  			else  			{ -				LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); +				LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);  			}  			floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), -					LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1))); +					LLDockControl::BOTTOM));  		}  		// window is positioned, now we can show it. @@ -466,11 +466,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)  	return floater;  } -void LLIMFloater::getAllowedRect(LLRect& rect) -{ -	rect = gViewerWindow->getWorldViewRectScaled(); -} -  void LLIMFloater::setDocked(bool docked, bool pop_on_undock)  {  	// update notification channel state @@ -522,7 +517,7 @@ void LLIMFloater::setVisible(BOOL visible)  	if(!visible)  	{ -		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID); +		LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);  		if(chiclet)  		{  			chiclet->setToggleState(false); diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index 8a3020ea10..f7cd35b5eb 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -145,8 +145,6 @@ private:  	static void*	createPanelIMControl(void* userdata);  	static void*	createPanelGroupControl(void* userdata);  	static void* 	createPanelAdHocControl(void* userdata); -	// gets a rect that bounds possible positions for the LLIMFloater on a screen (EXT-1111) -	void getAllowedRect(LLRect& rect);  	// Add the "User is typing..." indicator.  	void addTypingIndicator(const LLIMInfo* im_info); diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index b3b0c93b99..0250af6a0e 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -41,7 +41,6 @@  #include "llagent.h"  #include "llbutton.h" -#include "llbottomtray.h"  #include "llcallingcard.h"  #include "llchannelmanager.h"  #include "llchat.h" diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 4602533736..64d5152ebe 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -46,7 +46,6 @@  #include "llagentui.h"  #include "llappviewer.h"  #include "llavatariconctrl.h" -#include "llbottomtray.h"  #include "llcallingcard.h"  #include "llchat.h"  #include "llimfloater.h" @@ -1675,24 +1674,11 @@ LLCallDialog::~LLCallDialog()  	LLUI::removePopup(this);  } -void LLCallDialog::getAllowedRect(LLRect& rect) -{ -	rect = gViewerWindow->getWorldViewRectScaled(); -} -  BOOL LLCallDialog::postBuild()  {  	if (!LLDockableFloater::postBuild())  		return FALSE; -	// dock the dialog to the Speak Button, where other sys messages appear -	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel"); - -	setDockControl(new LLDockControl( -		anchor_panel, this, -		getDockTongue(), LLDockControl::TOP, -		boost::bind(&LLCallDialog::getAllowedRect, this, _1))); -  	return TRUE;  } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 0ee56c8070..93b604d36a 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -508,8 +508,6 @@ protected:  	virtual bool lifetimeHasExpired();  	virtual void onLifetimeExpired(); -	virtual void getAllowedRect(LLRect& rect); -  	/**  	 * Sets icon depend on session.  	 * diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 573985b76e..52d4971b2d 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -29,7 +29,6 @@  #include "llagentdata.h" // for gAgentID  #include "llnearbychathandler.h" -#include "llbottomtray.h"  #include "llchatitemscontainerctrl.h"  #include "llfirstuse.h"  #include "llfloaterscriptdebug.h" diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 170e23e4c5..85a7e75271 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -28,9 +28,9 @@  #include "llscriptfloater.h"  #include "llagentcamera.h" -#include "llbottomtray.h"  #include "llchannelmanager.h"  #include "llchiclet.h" +#include "llchicletbar.h"  #include "llfloaterreg.h"  #include "lllslconstants.h"  #include "llnotifications.h" @@ -95,7 +95,7 @@ bool LLScriptFloater::toggle(const LLUUID& notification_id)  		show(notification_id);  	} -	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true); +	LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);  	return true;  } @@ -131,11 +131,6 @@ void LLScriptFloater::setNotificationId(const LLUUID& id)  	mObjectId = notification_id_to_object_id(id);  } -void LLScriptFloater::getAllowedRect(LLRect& rect) -{ -	rect = gViewerWindow->getWorldViewRectScaled(); -} -  void LLScriptFloater::createForm(const LLUUID& notification_id)  {  	// delete old form @@ -211,7 +206,7 @@ void LLScriptFloater::setVisible(BOOL visible)  	if(!visible)  	{ -		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId()); +		LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());  		if(chiclet)  		{  			chiclet->setToggleState(false); @@ -224,7 +219,7 @@ void LLScriptFloater::onMouseDown()  	if(getNotificationId().notNull())  	{  		// Remove new message icon -		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId()); +		LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());  		if (chiclet == NULL)  		{  			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0); @@ -267,7 +262,7 @@ void LLScriptFloater::onFocusLost()  {  	if(getNotificationId().notNull())  	{ -		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false); +		LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);  	}  } @@ -276,7 +271,7 @@ void LLScriptFloater::onFocusReceived()  	// first focus will be received before setObjectId() call - don't toggle chiclet  	if(getNotificationId().notNull())  	{ -		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true); +		LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);  	}  } @@ -284,7 +279,7 @@ void LLScriptFloater::dockToChiclet(bool dock)  {  	if (getDockControl() == NULL)  	{ -		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId()); +		LLChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());  		if (chiclet == NULL)  		{  			llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl; @@ -292,7 +287,7 @@ void LLScriptFloater::dockToChiclet(bool dock)  		}  		else  		{ -			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); +			LLChicletBar::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);  		}  		// Stop saving position while we dock floater @@ -300,7 +295,7 @@ void LLScriptFloater::dockToChiclet(bool dock)  		setSavePosition(false);  		setDockControl(new LLDockControl(chiclet, this, getDockTongue(), -			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, this, _1))); +			LLDockControl::BOTTOM));  		setDocked(dock); @@ -352,7 +347,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)  		script_notification_map_t::const_iterator it = findUsingObjectId(object_id);  		if(it != mNotifications.end())  		{ -			LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first); +			LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);  			if(chiclet)  			{  				// Pass the new_message icon state further. @@ -375,11 +370,11 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)  	// Create inventory offer chiclet for offer type notifications  	if( OBJ_GIVE_INVENTORY == obj_type )  	{ -		LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id); +		LLChicletBar::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);  	}  	else  	{ -		LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id); +		LLChicletBar::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);  	}  	LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message); @@ -413,7 +408,7 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  	}  	// remove related chiclet -	LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id); +	LLChicletBar::getInstance()->getChicletPanel()->removeChiclet(notification_id);  	LLIMWellWindow::getInstance()->removeObjectRow(notification_id); diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index 8e959a3d0e..70451194b3 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -185,8 +185,6 @@ protected:  	 */  	void createForm(const LLUUID& object_id); -	/*virtual*/ void getAllowedRect(LLRect& rect); -  	/**  	 * Hide all notification toasts.  	 */ diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp deleted file mode 100644 index bbe573c546..0000000000 --- a/indra/newview/llspeakbutton.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/**  -* @file llspeakbutton.cpp -* @brief LLSpeakButton class implementation -* -* $LicenseInfo:firstyear=2002&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2010, Linden Research, Inc. -*  -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License only. -*  -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -* Lesser General Public License for more details. -*  -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA -*  -* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA -* $/LicenseInfo$ -*/ - -#include "llviewerprecompiledheaders.h" // must be first include - -#include "llbutton.h" -#include "llfloaterreg.h" - -#include "llagent.h" -#include "llbottomtray.h" -#include "llcallfloater.h" -#include "lloutputmonitorctrl.h" -#include "lltransientfloatermgr.h" - -#include "llspeakbutton.h" - -#include "llbottomtray.h" -#include "llfirstuse.h" - -static LLDefaultChildRegistry::Register<LLSpeakButton> t1("talk_button"); - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -LLSpeakButton::Params::Params() -:	speak_button("speak_button"), -	show_button("show_button"), -	monitor("monitor") -{} - -LLSpeakButton::LLSpeakButton(const Params& p) -: LLUICtrl(p) -, mOutputMonitor(NULL) -, mSpeakBtn(NULL) -, mShowBtn(NULL) -{ -	LLRect rect = p.rect(); -	LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0); -	LLRect show_rect = p.show_button.rect(); -	show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0); - -	speak_rect.mRight -= show_rect.getWidth(); -	show_rect.mLeft = speak_rect.getWidth(); -	show_rect.mRight = rect.getWidth(); - -	LLButton::Params speak_params = p.speak_button; -	speak_params.rect(speak_rect); -	mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params); -	addChild(mSpeakBtn); -	LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn); - -	mSpeakBtn->setMouseDownCallback(boost::bind(&LLSpeakButton::onMouseDown_SpeakBtn, this)); -	mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this)); -	mSpeakBtn->setToggleState(FALSE); - -	LLBottomtrayButton::Params show_params = p.show_button; -	show_params.rect(show_rect); -	mShowBtn = LLUICtrlFactory::create<LLBottomtrayButton>(show_params); -	addChild(mShowBtn); -	LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn); - -// 	mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this)); -// 	mShowBtn->setToggleState(FALSE); - -	static const S32 MONITOR_RIGHT_PAD = 2; - -	LLRect monitor_rect = p.monitor.rect(); -	S32 monitor_height = monitor_rect.getHeight(); -	monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD; -	monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD; -	monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2); -	monitor_rect.mTop = monitor_rect.mBottom + monitor_height; - -	LLOutputMonitorCtrl::Params monitor_params = p.monitor; -	monitor_params.draw_border(false); -	monitor_params.rect(monitor_rect); -	monitor_params.auto_update(true); -	monitor_params.speaker_id(gAgentID); -	mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params); -	mSpeakBtn->addChild(mOutputMonitor); - -	// never show "muted" because you can't mute yourself -	mOutputMonitor->setIsMuted(false); -	mOutputMonitor->setIsAgentControl(true); - -	//*TODO find a better place to do that -	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true); -} - -LLSpeakButton::~LLSpeakButton() -{ -	if(LLTransientFloaterMgr::instanceExists()) -	{ -		LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn); -		LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); -	} -} - -void LLSpeakButton::setSpeakToolTip(const std::string& msg) -{ -	mSpeakBtn->setToolTip(msg); -} - -void LLSpeakButton::setShowToolTip(const std::string& msg) -{ -	mShowBtn->setToolTip(msg); -} - -void LLSpeakButton::setLabelVisible(bool visible) -{ -	static std::string label_selected = mSpeakBtn->getLabelSelected(); -	static std::string label_unselected = mSpeakBtn->getLabelUnselected(); - -	if (visible) -	{ -		mSpeakBtn->setLabelSelected(label_selected); -		mSpeakBtn->setLabelUnselected(label_unselected); -	} -	else -	{ -		static LLStringExplicit empty_string(""); -		mSpeakBtn->setLabelSelected(empty_string); -		mSpeakBtn->setLabelUnselected(empty_string); -	} -} - -////////////////////////////////////////////////////////////////////////// -/// PROTECTED SECTION -////////////////////////////////////////////////////////////////////////// -void LLSpeakButton::onMouseDown_SpeakBtn() -{ -	bool down = true; -	LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk -	LLFirstUse::speak(false); -} -void LLSpeakButton::onMouseUp_SpeakBtn() -{ -	bool down = false; -	LLVoiceClient::getInstance()->inputUserControlState(down); -} - diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h deleted file mode 100644 index 7db01112ef..0000000000 --- a/indra/newview/llspeakbutton.h +++ /dev/null @@ -1,88 +0,0 @@ -/**  -* @file llspeakbutton.h -* @brief LLSpeakButton class header file -* -* $LicenseInfo:firstyear=2002&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2010, Linden Research, Inc. -*  -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License only. -*  -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -* Lesser General Public License for more details. -*  -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA -*  -* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA -* $/LicenseInfo$ -*/ - -#ifndef LL_LLSPEAKBUTTON_H -#define LL_LLSPEAKBUTTON_H - -#include "llinitparam.h" -#include "lluictrl.h" - -class LLCallFloater; -class LLButton; -class LLOutputMonitorCtrl; -class LLBottomtrayButton; - -/* - * Button displaying voice chat status. Displays voice chat options when - * clicked. -*/ -class LLSpeakButton : public LLUICtrl -{ -public: - -	struct Params :	public LLInitParam::Block<Params, LLUICtrl::Params> -	{ -		Optional<LLButton::Params> speak_button; -		Optional<LLBottomtrayButton::Params> show_button; -		Optional<LLOutputMonitorCtrl::Params> monitor; - -		Params(); -	}; - -	/*virtual*/ ~LLSpeakButton(); -	 -	// *HACK: Need to put tooltips in a translatable location, -	// the panel that contains this button. -	void setSpeakToolTip(const std::string& msg); -	void setShowToolTip(const std::string& msg); - -	/** -	 * Sets visibility of speak button's label according to passed parameter. -	 * -	 * It removes label/selected label if "visible" is false and restores otherwise. -	 * -	 * @param visible if true - show label and selected label. -	 *  -	 * @see mSpeakBtn -	 * @see LLBottomTray::processShrinkButtons() -	 */ -	void setLabelVisible(bool visible); - -protected: -	friend class LLUICtrlFactory; -	LLSpeakButton(const Params& p); - -	void onMouseDown_SpeakBtn(); -	void onMouseUp_SpeakBtn(); - -private: -	LLButton*	mSpeakBtn; -	LLBottomtrayButton*	mShowBtn; -	LLHandle<LLFloater> mPrivateCallPanel; -	LLOutputMonitorCtrl* mOutputMonitor; -}; - -#endif // LL_LLSPEAKBUTTON_H diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index cb49976e5f..ffe864e220 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -35,16 +35,17 @@  #include "llfloaterreg.h"  #include "llnotifications.h" -#include "llbottomtray.h"  #include "llscriptfloater.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h"  #include "llchiclet.h" +#include "llchicletbar.h"  #include "lltoastpanel.h"  #include "llnotificationmanager.h"  #include "llnotificationsutil.h"  #include "llspeakers.h" +#include "lltoolbarview.h"  //---------------------------------------------------------------------------------  LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(NULL, true,  key), @@ -140,15 +141,6 @@ void LLSysWellWindow::initChannel()  }  //--------------------------------------------------------------------------------- -void LLSysWellWindow::getAllowedRect(LLRect& rect) -{ -	rect = gViewerWindow->getWorldViewRectScaled(); -} - -//--------------------------------------------------------------------------------- - - -//---------------------------------------------------------------------------------  void LLSysWellWindow::setVisible(BOOL visible)  {  	if (visible) @@ -156,8 +148,8 @@ void LLSysWellWindow::setVisible(BOOL visible)  		if (NULL == getDockControl() && getDockTongue().notNull())  		{  			setDockControl(new LLDockControl( -				LLBottomTray::getInstance()->getChild<LLView>(getAnchorViewName()), this, -				getDockTongue(), LLDockControl::TOP, boost::bind(&LLSysWellWindow::getAllowedRect, this, _1))); +				LLChicletBar::getInstance()->getChild<LLView>(getAnchorViewName()), this, +				getDockTongue(), LLDockControl::BOTTOM));  		}  	} diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index 9f8ab01810..52e5370505 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -76,11 +76,6 @@ public:  	static const S32 MIN_WINDOW_WIDTH		= 318;  protected: - -	// gets a rect that bounds possible positions for the SysWellWindow on a screen (EXT-1111) -	void getAllowedRect(LLRect& rect); - -  	// init Window's channel  	virtual void initChannel(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 10563971b3..560cc2a314 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -42,7 +42,6 @@  #include "llagentcamera.h"  #include "llagentwearables.h"  #include "llagentpilot.h" -#include "llbottomtray.h"  #include "llcompilequeue.h"  #include "llconsole.h"  #include "lldaycyclemanager.h" @@ -7799,7 +7798,7 @@ class LLWorldToggleMovementControls : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLBottomTray::getInstance()->toggleMovementControls(); +		LLFloaterReg::toggleInstanceOrBringToFront("moveview");  		return true;  	}  }; @@ -7808,7 +7807,7 @@ class LLWorldToggleCameraControls : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLBottomTray::getInstance()->toggleCameraControls(); +		LLFloaterReg::toggleInstanceOrBringToFront("camera");  		return true;  	}  }; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 0873e4f6ea..af7c92ff0f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -84,6 +84,7 @@  // newview includes  #include "llagent.h"  #include "llbox.h" +#include "llchicletbar.h"  #include "llconsole.h"  #include "llviewercontrol.h"  #include "llcylinder.h" @@ -186,7 +187,6 @@  #include "llviewerjoystick.h"  #include "llviewernetwork.h"  #include "llpostprocess.h" -#include "llbottomtray.h"  #include "llnearbychatbar.h"  #include "llagentui.h"  #include "llwearablelist.h" @@ -1853,13 +1853,12 @@ void LLViewerWindow::initWorldUI()  	//getRootView()->sendChildToFront(gFloaterView);  	//getRootView()->sendChildToFront(gSnapshotFloaterView); -	// new bottom panel -	LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container"); -	LLBottomTray* bottom_tray = LLBottomTray::getInstance(); -	bottom_tray->setShape(bottom_tray_container->getLocalRect()); -	bottom_tray->setFollowsAll(); -	bottom_tray_container->addChild(bottom_tray); -	bottom_tray_container->setVisible(TRUE); +	LLPanel* chiclet_container = getRootView()->getChild<LLPanel>("chiclet_container"); +	LLChicletBar* chiclet_bar = LLChicletBar::getInstance(); +	chiclet_bar->setShape(chiclet_container->getLocalRect()); +	chiclet_bar->setFollowsAll(); +	chiclet_container->addChild(chiclet_bar); +	chiclet_container->setVisible(TRUE);  	LLRect morph_view_rect = full_window;  	morph_view_rect.stretch( -STATUS_BAR_HEIGHT ); @@ -2168,10 +2167,10 @@ void LLViewerWindow::reshape(S32 width, S32 height)  // Hide normal UI when a logon fails  void LLViewerWindow::setNormalControlsVisible( BOOL visible )  { -	if(LLBottomTray::instanceExists()) +	if(LLChicletBar::instanceExists())  	{ -		LLBottomTray::getInstance()->setVisible(visible); -		LLBottomTray::getInstance()->setEnabled(visible); +		LLChicletBar::getInstance()->setVisible(visible); +		LLChicletBar::getInstance()->setEnabled(visible);  	}  	if ( gMenuBarView ) @@ -4926,8 +4925,8 @@ S32 LLViewerWindow::getChatConsoleBottomPad()  {  	S32 offset = 0; -	if(LLBottomTray::instanceExists()) -		offset += LLBottomTray::getInstance()->getRect().getHeight(); +	if(gToolBarView) +		offset += gToolBarView->getChild<LLView>("bottom_toolbar_panel")->getRect().getHeight();  	return offset;  } diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 90a05cd9e5..05cd1d79b0 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -55,7 +55,7 @@  #include "llimview.h" // for LLIMMgr  #include "llparcel.h"  #include "llviewerparcelmgr.h" -//#include "llfirstuse.h" +#include "llfirstuse.h"  #include "llspeakers.h"  #include "lltrans.h"  #include "llviewerwindow.h" @@ -6258,6 +6258,19 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta  		it = mStatusObservers.upper_bound(observer);  	} +	// skipped to avoid speak button blinking +	if (   status != LLVoiceClientStatusObserver::STATUS_JOINING +		&& status != LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL) +	{ +		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); + +		gAgent.setVoiceConnected(voice_status); + +		if (voice_status) +		{ +			LLFirstUse::speak(true); +		} +	}  }  void LLVivoxVoiceClient::addObserver(LLFriendObserver* observer) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml deleted file mode 100644 index 2737746c0e..0000000000 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ /dev/null @@ -1,530 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="true" - bg_alpha_color="DkGray" - bg_opaque_color="DkGray" - chrome="true" - follows="left|bottom|right" - focus_root="true" - height="33" - layout="topleft" - left="0" - name="bottom_tray" - top="28" - width="1310"> -  <string -     name="DragIndicationImageName" -     value="Accordion_ArrowOpened_Off" /> -  <string -     name="SpeakBtnToolTip" -     value="Turns microphone on/off" /> -  <string -     name="VoiceControlBtnToolTip" -     value="Shows/hides voice control panel" /> -  <layout_stack -     border_size="0" -     clip="false" -     follows="all" -     height="28" -   layout="topleft" -   left="0" -     mouse_opaque="false" -     name="toolbar_stack" -     orientation="horizontal" -     top="0" -     width="1310"> -    <layout_panel -         auto_resize="false" -         user_resize="false" -         min_width="2" -         width="2" /> -    <layout_panel -         auto_resize="false" -         layout="topleft" -         max_width="320" -         min_width="214" -         height="28" -         mouse_opaque="false" -		 name="chat_bar_layout_panel" -         user_resize="true" -     width="250" > -          <panel -            name="chat_bar" -            filename="panel_nearby_chat_bar.xml" -            left="0" -            height="28" -        width="248" -            top="0" -            mouse_opaque="false" -            follows="left|right" -          /> -    </layout_panel> -    <!-- -         This 5px Panel is an indicator of where the resize handle is. -         The panel provides a gap between the resize handle icon and a button to the right.   -        --> -    <layout_panel -     auto_resize="false" -     layout="topleft" -     max_width="5" -     min_width="5" -     name="chat_bar_resize_handle_panel" -     user_resize="false" -     width="5"> -      <icon -       follows="top|right" -       height="25" -       image_name="ChatBarHandle" -       layout="topleft" -       left="-7" -       name="resize_handle" -       top="4" -       width="5" /> -    </layout_panel> -    <layout_panel -        auto_resize="false" -        follows="left|right" -        height="28" -        layout="topleft" -        min_height="28" -        min_width="59" -        mouse_opaque="false" -        name="speak_panel" -        top_delta="0" -        user_resize="false" -        width="108"> -      <talk_button -       follows="left|right" -       height="23" -       layout="topleft" -       left="0" -       name="talk" -       top="5" -       width="105"> -        <show_button -         tab_stop="true"> -          <init_callback -           function="Button.SetDockableFloaterToggle" -           parameter="voice_controls" /> -        </show_button> -        <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. -                 & pad_right is default value for long label which can be right aligned. See EXT-6318 --> -        <speak_button -         halign="center" -         label="Speak" -         label_selected="Speak" -         name="speak_btn" -         pad_right="20" -         tab_stop="true" -         use_ellipses="true" /> -      </talk_button> -    </layout_panel> -    <layout_panel -         auto_resize="false" -         follows="right" -         height="28" -         layout="topleft" -         min_height="28" -         min_width="65" -         mouse_opaque="false" -         name="gesture_panel" -         top_delta="0" -         user_resize="false" -         width="85"> -      <gesture_combo_list -             follows="left|right" -             height="23" -             label="Gesture" -             layout="topleft" -             left="0" -             name="Gesture" -             tool_tip="Shows/hides gestures" -             top="5" -             width="82"> -        <combo_button -                 pad_right="10" -                 use_ellipses="true" /> -        <combo_list -                 page_lines="17" /> -      </gesture_combo_list> -    </layout_panel> -    <layout_panel -         auto_resize="false" -     follows="right" -     height="28" -     layout="topleft" -     min_height="28" -     min_width="52" -     mouse_opaque="false" -     name="movement_panel" -     user_resize="false" -     width="83"> -      <bottomtray_button -       follows="left|right" -       height="23" -       image_pressed="PushButton_Press" -       image_pressed_selected="PushButton_Selected_Press" -       image_selected="PushButton_Selected_Press" -       is_toggle="true" -       label="Move" -       layout="topleft" -       name="movement_btn" -       tool_tip="Shows/hides movement controls" -       top="5" -       use_ellipses="true" -       width="80"> -        <init_callback -         function="Button.SetDockableFloaterToggle" -         parameter="moveview" /> -      </bottomtray_button> - -    </layout_panel> -    <layout_panel -     auto_resize="false" -         follows="left|right" -         height="28" -         layout="topleft" -         min_height="28" -         min_width="52" -         mouse_opaque="false" -         name="cam_panel" -         user_resize="false" -         width="83"> -      <bottomtray_button -             follows="left|right" -             height="23" -             image_pressed="PushButton_Press" -             image_pressed_selected="PushButton_Selected_Press" -             image_selected="PushButton_Selected_Press" -             is_toggle="true" -             label="View" -             layout="topleft" -             left="0" -             name="camera_btn" -             tool_tip="Shows/hides camera controls" -             top="5" -             use_ellipses="true" -             width="80"> -        <init_callback -                 function="Button.SetDockableFloaterToggle" -                 parameter="camera" /> -      </bottomtray_button> -    </layout_panel> -    <layout_panel -         auto_resize="false" -         follows="left|right" -         height="28" -         layout="topleft" -     min_width="40" -		  mouse_opaque="false" -     name="snapshot_panel" -		  user_resize="false" -     width="39"> -      <bottomtray_button -			follows="left|right" -			height="23" -       image_overlay="Snapshot_Off" -			image_pressed="PushButton_Press" -			image_pressed_selected="PushButton_Selected_Press" -			image_selected="PushButton_Selected_Press" -       is_toggle="true" -			layout="topleft" -			left="0" -       name="snapshots" -       tool_tip="Take snapshot" -			top="5" -       width="36"> -        <init_callback -         function="Button.SetFloaterToggle" -         parameter="snapshot" /> -      </bottomtray_button> -    </layout_panel> -    <layout_panel -		  auto_resize="false" -		  follows="left|right" -		  height="28" -		  layout="topleft" -		  min_height="28" -     min_width="52" -		  mouse_opaque="false" -     name="build_btn_panel" -		  user_resize="false" -     width="83"> -      <!--*FIX: Build Floater is not opened with default registration. Will be fixed soon. -Disabled for now. ---> -      <bottomtray_button -			follows="left|right" -			height="23" -			image_pressed="PushButton_Press" -			image_pressed_selected="PushButton_Selected_Press" -			image_selected="PushButton_Selected_Press" -       is_toggle="true" -       label="Build" -			layout="topleft" -			left="0" -       name="build_btn" -       tool_tip="Shows/hides Build Tools" -			top="5" -			use_ellipses="true" -       width="80"> -        <commit_callback -         function="Build.Toggle" -         parameter="build" /> -      </bottomtray_button> -    </layout_panel> -    <layout_panel -		  auto_resize="false" -		  follows="left|right" -		  height="28" -		  layout="topleft" -         min_height="28" -     min_width="52" -         mouse_opaque="false" -     name="search_btn_panel" -         user_resize="false" -         width="83"> -            <bottomtray_button -             follows="left|right" -             height="23" -             image_pressed="PushButton_Press" -             image_pressed_selected="PushButton_Selected_Press" -             image_selected="PushButton_Selected_Press" -             is_toggle="true" -             label="Search" -             layout="topleft" -             left="0" -             name="search_btn" -             tool_tip="Shows/hides Search" -             top="5" -             use_ellipses="true" -             width="80"> -                <init_callback -                 function="Button.SetFloaterToggle" -                 parameter="search" /> -            </bottomtray_button> -        </layout_panel> -        <layout_panel -         auto_resize="false" -         follows="left|right" -         height="28" -         layout="topleft" -         min_height="28" -         min_width="52" -         mouse_opaque="false" -         name="world_map_btn_panel" -         user_resize="false" -         width="83"> -            <bottomtray_button -             follows="left|right" -             height="23" -             image_pressed="PushButton_Press" -             image_pressed_selected="PushButton_Selected_Press" -             image_selected="PushButton_Selected_Press" -             is_toggle="true" -             label="Map" -             layout="topleft" -             left="0" -             name="world_map_btn" -             tool_tip="Shows/hides World Map" -             top="5" -             use_ellipses="true" -             width="80"> -                <init_callback -                 function="Button.SetFloaterToggle" -                 parameter="world_map" /> -            </bottomtray_button> -        </layout_panel> -        <layout_panel -         auto_resize="false" -         follows="left|right" -         height="28" -         layout="topleft" -         min_height="28" -     min_width="62" -         mouse_opaque="false" -         name="mini_map_btn_panel" -         user_resize="false" -         width="83"> -            <bottomtray_button -             follows="left|right" -             height="23" -             image_pressed="PushButton_Press" -             image_pressed_selected="PushButton_Selected_Press" -             image_selected="PushButton_Selected_Press" -             is_toggle="true" -             label="Mini-map" -             layout="topleft" -             left="0" -             name="mini_map_btn" -             tool_tip="Shows/hides mini-map" -             top="5" -             use_ellipses="true" -             width="80"> -                <init_callback -                 function="Button.SetFloaterToggle" -                 parameter="mini_map" /> -            </bottomtray_button> -        </layout_panel> -        <layout_panel -         follows="left|right" -         height="30" -         layout="topleft" -         min_width="95" -         mouse_opaque="false" -         name="chiclet_list_panel" -         top="0" -         user_resize="false" -         width="189"> -<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same -as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> -      <chiclet_panel -             chiclet_padding="4" -             follows="left|right" -             height="24" -             layout="topleft" -             left="1" -             min_width="95" -             mouse_opaque="false" -             name="chiclet_list" -             top="7" -             width="189"> -        <button -                 auto_resize="true" -                 follows="right" -                 height="29" -                 image_hover_selected="SegmentedBtn_Left_Over" -                 image_hover_unselected="SegmentedBtn_Left_Over" -                 image_overlay="Arrow_Small_Left" -                 image_pressed="SegmentedBtn_Left_Press" -                 image_pressed_selected="SegmentedBtn_Left_Press" -                 image_selected="SegmentedBtn_Left_Off" -                 image_unselected="SegmentedBtn_Left_Off" -                 layout="topleft" -                 name="chicklet_left_scroll_button" -                 tab_stop="false" -                 top="-28" -                 visible="false" -                 width="7" /> -        <button -                 auto_resize="true" -                 follows="right" -                 height="29" -                 image_hover_selected="SegmentedBtn_Right_Over" -                 image_hover_unselected="SegmentedBtn_Right_Over" -                 image_overlay="Arrow_Small_Right" -                 image_pressed="SegmentedBtn_Right_Press" -                 image_pressed_selected="SegmentedBtn_Right_Press" -                 image_selected="SegmentedBtn_Right_Off" -                 image_unselected="SegmentedBtn_Right_Off" -                 layout="topleft" -                 name="chicklet_right_scroll_button" -                 tab_stop="false" -                 top="-28" -                 visible="false" -                 width="7" /> -      </chiclet_panel> -    </layout_panel> -    <layout_panel auto_resize="false" -                      user_resize="false" -                      width="4" -                      min_width="4"/> -    <layout_panel -         auto_resize="false" -         follows="right" -         height="28" -         layout="topleft" -         min_height="28" -         min_width="37" -         name="im_well_panel" -         top="0" -         user_resize="false" -         width="37"> -      <chiclet_im_well -             follows="right" -             height="28" -             layout="topleft" -             left="0" -             max_displayed_count="99" -             name="im_well" -             top="0" -             width="35"> -        <!-- -Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button -xml attribute           Description -image_unselected        "Unlit" - there are no new messages -image_selected          "Unlit" + "Selected" - there are no new messages and the Well is open -image_pressed           "Lit" - there are new messages -image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well is open -             --> -        <button -                 auto_resize="true" -                 follows="right" -                 halign="center" -                 height="23" -                 image_overlay="Unread_IM" -                 image_overlay_alignment="center" -                 image_pressed="WellButton_Lit" -                 image_pressed_selected="WellButton_Lit_Selected" -                 image_selected="PushButton_Press" -                 label_color="Black" -                 left="0" -                 name="Unread IM messages" -                 tool_tip="Conversations" -                 width="34"> -          <init_callback -                     function="Button.SetDockableFloaterToggle" -                     parameter="im_well_window" /> -        </button> -      </chiclet_im_well> -    </layout_panel> -    <layout_panel -         auto_resize="false" -         follows="right" -         height="28" -         layout="topleft" -         min_height="28" -         min_width="37" -         name="notification_well_panel" -         top="0" -         user_resize="false" -         width="37"> -      <chiclet_notification -             follows="right" -             height="23" -             layout="topleft" -             left="0" -             max_displayed_count="99" -             name="notification_well" -             top="5" -             width="35"> -        <button -                 auto_resize="true" -                 bottom_pad="3" -                 follows="right" -                 halign="center" -                 height="23" -                 image_overlay="Notices_Unread" -                 image_overlay_alignment="center" -                 image_pressed="WellButton_Lit" -                 image_pressed_selected="WellButton_Lit_Selected" -                 image_selected="PushButton_Press" -                 label_color="Black" -                 left="0" -                 name="Unread" -                 tool_tip="Notifications" -                 width="34"> -          <init_callback -                     function="Button.SetDockableFloaterToggle" -                     parameter="notification_well_window" /> -        </button> -      </chiclet_notification> -    </layout_panel> -    <layout_panel -		   auto_resize="false" -		   user_resize="false" -		   min_width="4" -		   name="DUMMY2" -		   width="8" /> -  </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml new file mode 100644 index 0000000000..355a76e05f --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="false" + chrome="true" + follows="left|top|right" + height="30" + layout="topleft" + mouse_opaque="false" + name="chiclet_bar" + width="1310"> +  <layout_stack +     border_size="0" +     clip="false" +     follows="all" +     height="30" +     layout="topleft" +     left="0" +     mouse_opaque="false" +     name="toolbar_stack" +     orientation="horizontal" +     top="0" +     width="1310"> +        <layout_panel +         follows="left|right" +         height="30" +         layout="topleft" +         min_width="95" +         mouse_opaque="false" +         name="chiclet_list_panel" +         top="0" +         user_resize="false" +         width="189"> +      <chiclet_panel +             chiclet_padding="4" +             follows="left|right" +             height="24" +             layout="topleft" +             left="1" +             min_width="95" +             mouse_opaque="false" +             name="chiclet_list" +             top="7" +             width="189"> +        <button +                 auto_resize="true" +                 follows="right" +                 height="29" +                 image_hover_selected="SegmentedBtn_Left_Over" +                 image_hover_unselected="SegmentedBtn_Left_Over" +                 image_overlay="Arrow_Small_Left" +                 image_pressed="SegmentedBtn_Left_Press" +                 image_pressed_selected="SegmentedBtn_Left_Press" +                 image_selected="SegmentedBtn_Left_Off" +                 image_unselected="SegmentedBtn_Left_Off" +                 layout="topleft" +                 name="chicklet_left_scroll_button" +                 tab_stop="false" +                 top="-28" +                 visible="false" +                 width="7" /> +        <button +                 auto_resize="true" +                 follows="right" +                 height="29" +                 image_hover_selected="SegmentedBtn_Right_Over" +                 image_hover_unselected="SegmentedBtn_Right_Over" +                 image_overlay="Arrow_Small_Right" +                 image_pressed="SegmentedBtn_Right_Press" +                 image_pressed_selected="SegmentedBtn_Right_Press" +                 image_selected="SegmentedBtn_Right_Off" +                 image_unselected="SegmentedBtn_Right_Off" +                 layout="topleft" +                 name="chicklet_right_scroll_button" +                 tab_stop="false" +                 top="-28" +                 visible="false" +                 width="7" /> +      </chiclet_panel> +    </layout_panel> +    <layout_panel auto_resize="false" +                      user_resize="false" +                      width="4" +                      min_width="4"/> +    <layout_panel +         auto_resize="false" +         follows="right" +         height="28" +         layout="topleft" +         min_height="28" +         min_width="37" +         name="im_well_panel" +         top="0" +         user_resize="false" +         width="37"> +      <chiclet_im_well +             follows="right" +             height="28" +             layout="topleft" +             left="0" +             max_displayed_count="99" +             name="im_well" +             top="0" +             width="35"> +        <!-- +Emulate 4 states of button by background images, see details in EXT-3147. The same should be for notification_well button +xml attribute           Description +image_unselected        "Unlit" - there are no new messages +image_selected          "Unlit" + "Selected" - there are no new messages and the Well is open +image_pressed           "Lit" - there are new messages +image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well is open +             --> +        <button +                 auto_resize="true" +                 follows="right" +                 halign="center" +                 height="23" +                 image_overlay="Unread_IM" +                 image_overlay_alignment="center" +                 image_pressed="WellButton_Lit" +                 image_pressed_selected="WellButton_Lit_Selected" +                 image_selected="PushButton_Press" +                 label_color="Black" +                 left="0" +                 name="Unread IM messages" +                 tool_tip="Conversations" +                 width="34"> +          <init_callback +                     function="Button.SetDockableFloaterToggle" +                     parameter="im_well_window" /> +        </button> +      </chiclet_im_well> +    </layout_panel> +    <layout_panel +         auto_resize="false" +         follows="right" +         height="28" +         layout="topleft" +         min_height="28" +         min_width="37" +         name="notification_well_panel" +         top="0" +         user_resize="false" +         width="37"> +      <chiclet_notification +             follows="right" +             height="23" +             layout="topleft" +             left="0" +             max_displayed_count="99" +             name="notification_well" +             top="5" +             width="35"> +        <button +                 auto_resize="true" +                 bottom_pad="3" +                 follows="right" +                 halign="center" +                 height="23" +                 image_overlay="Notices_Unread" +                 image_overlay_alignment="center" +                 image_pressed="WellButton_Lit" +                 image_pressed_selected="WellButton_Lit_Selected" +                 image_selected="PushButton_Press" +                 label_color="Black" +                 left="0" +                 name="Unread" +                 tool_tip="Notifications" +                 width="34"> +          <init_callback +                     function="Button.SetDockableFloaterToggle" +                     parameter="notification_well_window" /> +        </button> +      </chiclet_notification> +    </layout_panel> +  </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml deleted file mode 100644 index 0f330a7b98..0000000000 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ /dev/null @@ -1,174 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- Side tray cannot show background because it is always -	partially on screen to hold tab buttons. --> -<side_tray -  name="sidebar" -  background_visible="false" -  mouse_opaque="true" -  width="333" -  collapsed="true" -> -  <!-- Individual tabs must show background to have seemless -	appearance up to tray panel header word like "Home". -	Embedded panels are inset by a pixel and so their -	backgrounds will not block the world fully. --> - -  <sidetray_tab -    name="sidebar_openclose" -    help_topic="sidebar_openclose" -    tab_title="Toggle Sidebar" -    description="Toggle Sidebar." -    image="TabIcon_Open_Off" -	image_selected="TabIcon_Close_Off" -    mouse_opaque="false" -    background_visible="true" -  > -    <panel /> <!-- dummy panel, never to actually be seen --> -  </sidetray_tab> - -  <sidetray_tab -    name="sidebar_home" -    help_topic="sidebar_home" -    tab_title="Home" -    description="Home." -    image="TabIcon_Home_Off" -    image_selected="TabIcon_Home_Selected" -    mouse_opaque="false" -    background_visible="true" -  > -      <panel -        class="panel_sidetray_home" -        name="panel_home" -        filename="panel_sidetray_home_tab.xml" -        label="home" -      /> -  </sidetray_tab> - -  <sidetray_tab -    name="sidebar_me" -    help_topic="sidebar_me" -    tab_title="My Profile" -    description="Edit your public profile and Picks." -    image="TabIcon_Me_Off" -    image_selected="TabIcon_Me_Selected" -    mouse_opaque="false" -    background_visible="true" -  > -    <panel_container -      name="panel_container" -      default_panel_name="panel_me" -      width="333" -    > -      <panel -        class="panel_me" -        name="panel_me" -        filename="panel_me.xml" -        label="Me" -      /> - -    </panel_container> -  </sidetray_tab> - -  <sidetray_tab -    name="sidebar_people" -    help_topic="sidebar_people" -    tab_title="People" -    description="Find your friends, contacts and people nearby." -    image="TabIcon_People_Off" -    image_selected="TabIcon_People_Selected" -    mouse_opaque="false" -    background_visible="true" -  > -    <panel_container -      name="panel_container" -      default_panel_name="panel_people" -      width="333" -    > -      <panel -        class="panel_people" -        name="panel_people" -        filename="panel_people.xml" -      /> -      <panel -        class="panel_profile_view" -        name="panel_profile_view" -        filename="panel_profile_view.xml" -      /> -      <panel -        class="panel_group_info_sidetray" -        name="panel_group_info_sidetray" -        filename="panel_group_info_sidetray.xml" -        label="Group Profile" -        font="SansSerifBold" -      /> -      <panel -        class="panel_block_list_sidetray" -        name="panel_block_list_sidetray" -        filename="panel_block_list_sidetray.xml" -        label="Blocked Residents & Objects" -        font="SansSerifBold" -      /> - -    </panel_container> -  </sidetray_tab> - -  <sidetray_tab -    name="sidebar_places" -    help_topic="sidebar_places" -    tab_title="Places" -    label="Places" -    description="Find places to go and places you've visited before." -    image="TabIcon_Places_Off" -	image_selected="TabIcon_Places_Selected" -    mouse_opaque="false" -    background_visible="true" -  > -      <panel -        class="panel_places" -        name="panel_places" -        filename="panel_places.xml" -        label="Places" -        font="SansSerifBold" -      /> -  </sidetray_tab> - -  <sidetray_tab -    name="sidebar_inventory" -    help_topic="sidebar_inventory" -    tab_title="My Inventory" -    description="Browse your inventory." -    image="TabIcon_Things_Off" -    image_selected="TabIcon_Things_Selected" -    mouse_opaque="false" -    background_visible="true" -  > -      <badge location="top_left" location_percent_vcenter="50" location_percent_hcenter="95" /> -      <panel -        class="sidepanel_inventory" -        name="sidepanel_inventory" -        filename="sidepanel_inventory.xml" -        label="Edit Inventory" -        font="SansSerifBold" -      /> -  </sidetray_tab> - -  <sidetray_tab -    name="sidebar_appearance" -    help_topic="sidebar_appearance" -    tab_title="My Appearance" -    description="Change your appearance and current look." -    image="TabIcon_Appearance_Off" -    image_selected="TabIcon_Appearance_Selected" -    mouse_opaque="false" -    background_visible="true" -  > -      <panel -        class="sidepanel_appearance" -        name="sidepanel_appearance" -        filename="sidepanel_appearance.xml" -        label="Edit Appearance" -        font="SansSerifBold" -      /> -  </sidetray_tab> - -</side_tray> diff --git a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml index 5475fcd245..3c69a0cb6c 100644 --- a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml +++ b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml @@ -64,14 +64,32 @@                      user_resize="false"                      mouse_opaque="false"                      height="100" -                    width="100"> +                    width="200">          <view top="0"                follows="all"                height="100"                left="0"                mouse_opaque="false"                name="floater_snap_region" -              width="100"/> +              width="200"/> +        <view top="0" +              follows="left|top|bottom" +              height="100" +              left="0" +              mouse_opaque="false" +              name="minimized_floaters_region" +              width="160"/> +        <panel follows="left|top|right" +               layout="topleft" +               height="30" +               left_pad="10" +               mouse_opaque="false" +               name="chiclet_container" +               tab_stop="false" +               top="0" +               bg_visible="false" +               width="20"> +        </panel>                    <panel bottom="100"                 follows="left|right|bottom"                 height="25" @@ -80,7 +98,7 @@                 tab_stop="false"                 name="stand_stop_flying_container"                 visible="false" -               width="100"/> +               width="200"/>        </layout_panel>        <layout_panel name="right_toolbar_panel"                      auto_resize="false" | 
