diff options
Diffstat (limited to 'indra')
82 files changed, 917 insertions, 699 deletions
| diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h index 46456882ba..a77bd211f3 100644 --- a/indra/llcommon/llchat.h +++ b/indra/llcommon/llchat.h @@ -79,6 +79,7 @@ public:  	:	mText(text),  		mFromName(),  		mFromID(), +		mNotifId(),  		mSourceType(CHAT_SOURCE_AGENT),  		mChatType(CHAT_TYPE_NORMAL),  		mAudible(CHAT_AUDIBLE_FULLY), @@ -94,6 +95,7 @@ public:  	std::string		mText;		// UTF-8 line of text  	std::string		mFromName;	// agent or object name  	LLUUID			mFromID;	// agent id or object id +	LLUUID			mNotifId;  	EChatSourceType	mSourceType;  	EChatType		mChatType;  	EChatAudible	mAudible; diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 59499f987b..0237c80efa 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -66,7 +66,9 @@ LLConsole::LLConsole(const LLConsole::Params& p)  :	LLUICtrl(p),  	LLFixedBuffer(p.max_lines),  	mLinePersistTime(p.persist_time), // seconds -	mFont(p.font) +	mFont(p.font), +	mConsoleWidth(0), +	mConsoleHeight(0)  {  	if (p.font_size_index.isProvided())  	{ diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h index 5800a82922..4719950f28 100644 --- a/indra/llui/llconsole.h +++ b/indra/llui/llconsole.h @@ -150,8 +150,6 @@ private:  	F32			mLinePersistTime; // Age at which to stop drawing.  	F32			mFadeTime; // Age at which to start fading  	const LLFontGL*	mFont; -	S32			mLastBoxHeight; -	S32			mLastBoxWidth;  	S32			mConsoleWidth;  	S32			mConsoleHeight; diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index 0d8e54aa48..d836a5f4cd 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -37,7 +37,11 @@  LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,  		const LLUIImagePtr& dockTongue, DocAt dockAt, get_allowed_rect_callback_t get_allowed_rect_callback) : -		mDockWidget(dockWidget), mDockableFloater(dockableFloater), mDockTongue(dockTongue) +		mDockWidget(dockWidget), +		mDockableFloater(dockableFloater), +		mDockTongue(dockTongue), +		mDockTongueX(0), +		mDockTongueY(0)  {  	mDockAt = dockAt; diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 3694ecd4f4..92993650a7 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -289,8 +289,8 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/)  		onCommit();  	} -	// Stretch selected items rect to ensure it won't be clipped -	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); +	// Stretch selected item rect to ensure it won't be clipped +	mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));  }  void LLFlatListView::setNoItemsCommentText(const std::string& comment_text) @@ -393,7 +393,7 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)  	LLViewBorder::Params params;  	params.name("scroll border"); -	params.rect(getSelectedItemsRect()); +	params.rect(getLastSelectedItemRect());  	params.visible(false);  	params.bevel_style(LLViewBorder::BEVEL_IN);  	mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params); @@ -480,8 +480,8 @@ void LLFlatListView::rearrangeItems()  		item_new_top -= (rc.getHeight() + mItemPad);  	} -	// Stretch selected items rect to ensure it won't be clipped -	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); +	// Stretch selected item rect to ensure it won't be clipped +	mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));  }  void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask) @@ -664,8 +664,8 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)  		onCommit();  	} -	// Stretch selected items rect to ensure it won't be clipped -	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); +	// Stretch selected item rect to ensure it won't be clipped +	mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));  	return true;  } @@ -680,23 +680,6 @@ LLRect LLFlatListView::getLastSelectedItemRect()  	return mSelectedItemPairs.back()->first->getRect();  } -LLRect LLFlatListView::getSelectedItemsRect() -{ -	if (!mSelectedItemPairs.size()) -	{ -		return LLRect::null; -	} -	LLRect rc = getLastSelectedItemRect(); -	for ( pairs_const_iterator_t -			  it = mSelectedItemPairs.begin(), -			  it_end = mSelectedItemPairs.end(); -		  it != it_end; ++it ) -	{ -		rc.unionWith((*it)->first->getRect()); -	} -	return rc; -} -  void LLFlatListView::selectFirstItem	()  {  	selectItemPair(mItemPairs.front(), true); @@ -819,8 +802,8 @@ bool LLFlatListView::selectAll()  		onCommit();  	} -	// Stretch selected items rect to ensure it won't be clipped -	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); +	// Stretch selected item rect to ensure it won't be clipped +	mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));  	return true;  } diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 5999e79f61..949a731507 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -368,8 +368,6 @@ protected:  	LLRect getLastSelectedItemRect(); -	LLRect getSelectedItemsRect(); -  	void   ensureSelectedVisible();  private: diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index a67094b8ce..035ca3f26b 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -384,7 +384,8 @@ LLNotificationTemplate::LLNotificationTemplate() :  	mExpireSeconds(0),  	mExpireOption(-1),  	mURLOption(-1), -    mURLOpenExternally(-1), +	mURLOpenExternally(-1), +	mPersist(false),  	mUnique(false),  	mPriority(NOTIFICATION_PRIORITY_NORMAL)  { diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index aeb4cebf1b..d55e0f4043 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -371,7 +371,7 @@ private:  	// this is just for making it easy to look things up in a set organized by UUID -- DON'T USE IT  	// for anything real! -	LLNotification(LLUUID uuid) : mId(uuid) {} + LLNotification(LLUUID uuid) : mId(uuid), mCancelled(false), mRespondedTo(false), mIgnored(false), mTemporaryResponder(false) {}  	void cancel(); @@ -621,7 +621,7 @@ namespace LLNotificationComparators  	struct orderBy  	{  		typedef boost::function<T (LLNotificationPtr)> field_t; -		orderBy(field_t field, EDirection = ORDER_INCREASING) : mField(field) {} +        	orderBy(field_t field, EDirection direction = ORDER_INCREASING) : mField(field), mDirection(direction) {}  		bool operator()(LLNotificationPtr lhs, LLNotificationPtr rhs)  		{  			if (mDirection == ORDER_DECREASING) diff --git a/indra/llui/llnotificationsutil.cpp b/indra/llui/llnotificationsutil.cpp index f343d27cb4..54bdb4bd66 100644 --- a/indra/llui/llnotificationsutil.cpp +++ b/indra/llui/llnotificationsutil.cpp @@ -94,3 +94,8 @@ void LLNotificationsUtil::cancel(LLNotificationPtr pNotif)  {  	LLNotifications::instance().cancel(pNotif);  } + +LLNotificationPtr LLNotificationsUtil::find(LLUUID uuid) +{ +	return LLNotifications::instance().find(uuid); +} diff --git a/indra/llui/llnotificationsutil.h b/indra/llui/llnotificationsutil.h index d552fa915b..338204924a 100644 --- a/indra/llui/llnotificationsutil.h +++ b/indra/llui/llnotificationsutil.h @@ -65,6 +65,8 @@ namespace LLNotificationsUtil  	S32 getSelectedOption(const LLSD& notification, const LLSD& response);  	void cancel(LLNotificationPtr pNotif); + +	LLNotificationPtr find(LLUUID uuid);  }  #endif diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4c0c895a7d..1c32c690a8 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -156,13 +156,11 @@ set(viewer_SOURCE_FILES      llfloaterbuycurrency.cpp      llfloaterbuyland.cpp      llfloatercamera.cpp -    llfloaterchatterbox.cpp      llfloatercolorpicker.cpp      llfloatercustomize.cpp      llfloaterdaycycle.cpp      llfloaterenvsettings.cpp      llfloaterfonttest.cpp -    llfloaterfriends.cpp      llfloatergesture.cpp      llfloatergodtools.cpp      llfloatergroupinvite.cpp @@ -241,7 +239,6 @@ set(viewer_SOURCE_FILES      llimfloater.cpp      llimfloatercontainer.cpp      llimhandler.cpp -    llimpanel.cpp      llimview.cpp      llinspect.cpp      llinspectavatar.cpp @@ -273,7 +270,6 @@ set(viewer_SOURCE_FILES      llmaniptranslate.cpp      llmediactrl.cpp      llmediadataclient.cpp -    llmediaremotectrl.cpp      llmemoryview.cpp      llmenucommands.cpp      llmetricperformancetester.cpp @@ -297,7 +293,6 @@ set(viewer_SOURCE_FILES      llnotificationscripthandler.cpp      llnotificationtiphandler.cpp      lloutputmonitorctrl.cpp -    lloverlaybar.cpp      llpanelavatar.cpp      llpanelavatartag.cpp      llpanelblockedlist.cpp @@ -418,7 +413,6 @@ set(viewer_SOURCE_FILES      lltoastnotifypanel.cpp      lltoastpanel.cpp      lltool.cpp -    lltoolbar.cpp      lltoolbrush.cpp      lltoolcomp.cpp      lltooldraganddrop.cpp @@ -513,7 +507,6 @@ set(viewer_SOURCE_FILES      llvoground.cpp      llvoicechannel.cpp      llvoiceclient.cpp -    llvoiceremotectrl.cpp      llvoicevisualizer.cpp      llvoinventorylistener.cpp      llvopartgroup.cpp @@ -663,13 +656,11 @@ set(viewer_HEADER_FILES      llfloaterbuycurrency.h      llfloaterbuyland.h      llfloatercamera.h -    llfloaterchatterbox.h      llfloatercolorpicker.h      llfloatercustomize.h      llfloaterdaycycle.h      llfloaterenvsettings.h      llfloaterfonttest.h -    llfloaterfriends.h      llfloatergesture.h      llfloatergodtools.h      llfloatergroupinvite.h @@ -747,7 +738,6 @@ set(viewer_HEADER_FILES      llhudview.h      llimfloater.h      llimfloatercontainer.h -    llimpanel.h      llimview.h      llinspect.h      llinspectavatar.h @@ -780,7 +770,6 @@ set(viewer_HEADER_FILES      llmaniptranslate.h      llmediactrl.h      llmediadataclient.h -    llmediaremotectrl.h      llmemoryview.h      llmenucommands.h      llmetricperformancetester.h @@ -799,7 +788,6 @@ set(viewer_HEADER_FILES      llnotificationhandler.h      llnotificationmanager.h      lloutputmonitorctrl.h -    lloverlaybar.h      llpanelavatar.h      llpanelavatartag.h      llpanelblockedlist.h @@ -923,7 +911,6 @@ set(viewer_HEADER_FILES      lltoastnotifypanel.h      lltoastpanel.h      lltool.h -    lltoolbar.h      lltoolbrush.h      lltoolcomp.h      lltooldraganddrop.h @@ -1016,7 +1003,6 @@ set(viewer_HEADER_FILES      llvoground.h      llvoicechannel.h      llvoiceclient.h -    llvoiceremotectrl.h      llvoicevisualizer.h      llvoinventorylistener.h      llvopartgroup.h diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index da0e9238d6..2354323a66 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2805,7 +2805,6 @@ void LLAgent::endAnimationUpdateUI()  		LLNavigationBar::getInstance()->setVisible(TRUE);  		gStatusBar->setVisibleForMouselook(true); -		LLBottomTray::getInstance()->setVisible(TRUE);  		LLBottomTray::getInstance()->onMouselookModeOut();  		LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE); @@ -2906,7 +2905,6 @@ void LLAgent::endAnimationUpdateUI()  		gStatusBar->setVisibleForMouselook(false);  		LLBottomTray::getInstance()->onMouselookModeIn(); -		LLBottomTray::getInstance()->setVisible(FALSE);  		LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE);  		LLSideTray::getInstance()->updateSidetrayVisibility(); diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index dd50b482cf..38d1e01d08 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -35,11 +35,11 @@  #include "llsingleton.h"  #include "llinventorymodel.h" -#include "llviewerinventory.h"  #include "llcallbacklist.h"  class LLWearable;  class LLWearableHoldingPattern; +class LLInventoryCallback;  class LLAppearanceManager: public LLSingleton<LLAppearanceManager>  { diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 9aa15789ed..2d694eefd3 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -163,7 +163,6 @@  #include "llvotree.h"  #include "llvoavatar.h"  #include "llfolderview.h" -#include "lltoolbar.h"  #include "llagentpilot.h"  #include "llvovolume.h"  #include "llflexibleobject.h"  @@ -414,7 +413,6 @@ static void settings_to_globals()  	LLVOAvatar::sVisibleInFirstPerson	= gSavedSettings.getBOOL("FirstPersonAvatarVisible");  	// clamp auto-open time to some minimum usable value  	LLFolderView::sAutoOpenTime			= llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay")); -	LLToolBar::sInventoryAutoOpenTime	= gSavedSettings.getF32("InventoryAutoOpenDelay");  	LLSelectMgr::sRectSelectInclusive	= gSavedSettings.getBOOL("RectangleSelectInclusive");  	LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections");  	LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius"); @@ -2893,7 +2891,14 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q  void LLAppViewer::userQuit()  { -	LLNotificationsUtil::add("ConfirmQuit"); +	if (gDisconnected) +	{ +		requestQuit(); +	} +	else +	{ +		LLNotificationsUtil::add("ConfirmQuit"); +	}  }  static bool finish_early_exit(const LLSD& notification, const LLSD& response) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index bd68d52868..a2d594cfa2 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -62,6 +62,39 @@ namespace  	const std::string& PANEL_GESTURE_NAME	= "gesture_panel";  } +class LLBottomTrayLite +	: public LLPanel +{ +public: +	LLBottomTrayLite() +		: mNearbyChatBar(NULL), +		  mGesturePanel(NULL) +	{ +		mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); +		LLUICtrlFactory::getInstance()->buildPanel(this, "panel_bottomtray_lite.xml"); +		// Necessary for focus movement among child controls +		setFocusRoot(TRUE); +	} + +	BOOL postBuild() +	{ +		mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); +		mGesturePanel = getChild<LLPanel>("gesture_panel"); +		return TRUE; +	} + +	void onFocusLost() +	{ +		if (gAgent.cameraMouselook()) +		{ +			LLBottomTray::getInstance()->setVisible(FALSE); +		} +	} + +	LLNearbyChatBar*	mNearbyChatBar; +	LLPanel*			mGesturePanel; +}; +  LLBottomTray::LLBottomTray(const LLSD&)  :	mChicletPanel(NULL),  	mSpeakPanel(NULL), @@ -76,6 +109,8 @@ LLBottomTray::LLBottomTray(const LLSD&)  ,	mSnapshotPanel(NULL)  ,	mGesturePanel(NULL)  ,	mCamButton(NULL) +,	mBottomTrayLite(NULL) +,	mIsInLiteMode(false)  {  	// Firstly add ourself to IMSession observers, so we catch session events  	// before chiclets do that. @@ -100,6 +135,12 @@ LLBottomTray::LLBottomTray(const LLSD&)  	// Necessary for focus movement among child controls  	setFocusRoot(TRUE); + +	{ +		mBottomTrayLite = new LLBottomTrayLite(); +		mBottomTrayLite->setFollowsAll(); +		mBottomTrayLite->setVisible(FALSE); +	}  }  LLBottomTray::~LLBottomTray() @@ -134,6 +175,11 @@ void* LLBottomTray::createNearbyChatBar(void* userdata)  	return new LLNearbyChatBar();  } +LLNearbyChatBar* LLBottomTray::getNearbyChatBar() +{ +	return mIsInLiteMode ? mBottomTrayLite->mNearbyChatBar : mNearbyChatBar; +} +  LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)  {  	LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id); @@ -237,68 +283,27 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b  	mSpeakBtn->setEnabled(enable);  } -//virtual -void LLBottomTray::onFocusLost() +void LLBottomTray::onMouselookModeOut()  { -	if (gAgent.cameraMouselook()) -	{ -		setVisible(FALSE); -	} +	mIsInLiteMode = false; +	mBottomTrayLite->setVisible(FALSE); +	mNearbyChatBar->getChatBox()->setText(mBottomTrayLite->mNearbyChatBar->getChatBox()->getText()); +	setVisible(TRUE);  } -void LLBottomTray::savePanelsShape() +void LLBottomTray::onMouselookModeIn()  { -	mSavedShapeList.clear(); -	for (child_list_const_iter_t -			 child_it = mToolbarStack->beginChild(), -			 child_it_end = mToolbarStack->endChild(); -		 child_it != child_it_end; ++child_it) -	{ -		mSavedShapeList.push_back( (*child_it)->getRect() ); -	} -} +	setVisible(FALSE); -void LLBottomTray::restorePanelsShape() -{ -	if (mSavedShapeList.size() != mToolbarStack->getChildCount()) -		return; -	int i = 0; -	for (child_list_const_iter_t -			 child_it = mToolbarStack->beginChild(), -			 child_it_end = mToolbarStack->endChild(); -		 child_it != child_it_end; ++child_it) -	{ -		(*child_it)->setShape(mSavedShapeList[i++]); -	} -} +	// Attach the lite bottom tray +	if (getParent() && mBottomTrayLite->getParent() != getParent()) +		getParent()->addChild(mBottomTrayLite); -void LLBottomTray::onMouselookModeOut() -{ -	// Apply the saved settings when we are not in mouselook mode, see EXT-3988. -	{ -		setTrayButtonVisibleIfPossible (RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"), false); -		setTrayButtonVisibleIfPossible (RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"),    false); -		setTrayButtonVisibleIfPossible (RS_BUTTON_CAMERA,   gSavedSettings.getBOOL("ShowCameraButton"),  false); -		setTrayButtonVisibleIfPossible (RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton"),false); -	} -	// HACK: To avoid usage the LLLayoutStack logic of resizing, we force the updateLayout -	// and then restore children saved shapes. See EXT-4309. -	BOOL saved_anim = mToolbarStack->getAnimate(); -	mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE); -	// 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); -	// Restore saved shapes. -	restorePanelsShape(); -} +	mBottomTrayLite->setShape(getLocalRect()); +	mBottomTrayLite->mNearbyChatBar->getChatBox()->setText(mNearbyChatBar->getChatBox()->getText()); +	mBottomTrayLite->mGesturePanel->setVisible(gSavedSettings.getBOOL("ShowGestureButton")); -void LLBottomTray::onMouselookModeIn() -{ -	savePanelsShape(); -	mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE); +	mIsInLiteMode = true;  }  //virtual @@ -306,31 +311,14 @@ void LLBottomTray::onMouselookModeIn()  // If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true),  void LLBottomTray::setVisible(BOOL visible)  { -	LLPanel::setVisible(visible); - -	// *NOTE: we must check mToolbarStack against NULL because setVisible is called from the  -	// LLPanel::initFromParams BEFORE postBuild is called and child controls are not exist yet -	if (NULL != mToolbarStack) +	if (mIsInLiteMode)  	{ -		BOOL visibility = gAgent.cameraMouselook() ? false : true; - -		for ( child_list_const_iter_t child_it = mToolbarStack->getChildList()->begin();  -			child_it != mToolbarStack->getChildList()->end(); child_it++) -		{ -			LLView* viewp = *child_it; -			std::string name = viewp->getName(); - -			// Chat bar and gesture button are shown even in mouselook mode. -			// But the move, camera and snapshot buttons shouldn't be displayed. See EXT-3988. -			if ("chat_bar" == name || "gesture_panel" == name || (visibility && ("movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name))) -				continue; -			else  -			{ -				viewp->setVisible(visibility); -			} -		} +		mBottomTrayLite->setVisible(visible); +	} +	else +	{ +		LLPanel::setVisible(visible);  	} -  	if(visible)  		gFloaterView->setSnapOffsetBottom(getRect().getHeight());  	else @@ -535,7 +523,18 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)  	if (mChicletPanel && mToolbarStack && mNearbyChatBar)  	{ -		mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); +		// 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) @@ -637,7 +636,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)  		mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight()); -		log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel"); +		log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel");  		lldebugs << "RS_CHATBAR_INPUT"  			<< ", delta_panel: " << delta_panel @@ -1057,6 +1056,11 @@ void LLBottomTray::initStateProcessedObjectMap()  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel));  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));  	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel)); + +	mDummiesMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLUICtrl>("after_gesture_panel"))); +	mDummiesMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLUICtrl>("after_movement_panel"))); +	mDummiesMap.insert(std::make_pair(RS_BUTTON_CAMERA,   getChild<LLUICtrl>("after_cam_panel"))); +	mDummiesMap.insert(std::make_pair(RS_BUTTON_SPEAK,    getChild<LLUICtrl>("after_speak_panel")));  }  void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) @@ -1069,6 +1073,11 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis  	}  	panel->setVisible(visible); + +	if (mDummiesMap.count(shown_object_type)) +	{ +		mDummiesMap[shown_object_type]->setVisible(visible); +	}  }  void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification) @@ -1084,6 +1093,8 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type  			return;  		} +		const S32 dummy_width = mDummiesMap.count(shown_object_type) ? mDummiesMap[shown_object_type]->getRect().getWidth() : 0; +  		const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();  		const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); @@ -1093,7 +1104,7 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type  		const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width)  			+ (chiclet_panel_width - chiclet_panel_min_width); -		const S32 required_width = panel->getRect().getWidth(); +		const S32 required_width = panel->getRect().getWidth() + dummy_width;  		can_be_set = available_width >= required_width;  	} diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 562ee56912..ee0eb13218 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -46,6 +46,7 @@ class LLNotificationChiclet;  class LLSpeakButton;  class LLNearbyChatBar;  class LLIMChiclet; +class LLBottomTrayLite;  // Build time optimization, generate once in .cpp file  #ifndef LLBOTTOMTRAY_CPP @@ -60,13 +61,14 @@ class LLBottomTray  {  	LOG_CLASS(LLBottomTray);  	friend class LLSingleton<LLBottomTray>; +	friend class LLBottomTrayLite;  public:  	~LLBottomTray();  	BOOL postBuild();  	LLChicletPanel*		getChicletPanel()	{return mChicletPanel;} -	LLNearbyChatBar*		getNearbyChatBar()	{return mNearbyChatBar;} +	LLNearbyChatBar*		getNearbyChatBar();  	void onCommitGesture(LLUICtrl* ctrl); @@ -79,7 +81,6 @@ public:  	virtual void reshape(S32 width, S32 height, BOOL called_from_parent); -	virtual void onFocusLost();  	virtual void setVisible(BOOL visible);  	// Implements LLVoiceClientStatusObserver::onChange() to enable the speak @@ -172,13 +173,6 @@ private:  	 */  	void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true); -	/** -	 * Save and restore children shapes. -	 * Used to avoid the LLLayoutStack resizing logic between mouse look mode switching. -	 */ -	void savePanelsShape(); -	void restorePanelsShape(); -  	MASK mResizeState;  	typedef std::map<EResizeState, LLPanel*> state_object_map_t; @@ -187,8 +181,8 @@ private:  	typedef std::map<EResizeState, S32> state_object_width_map_t;  	state_object_width_map_t mObjectDefaultWidthMap; -	typedef std::vector<LLRect> shape_list_t; -	shape_list_t mSavedShapeList; +	typedef std::map<EResizeState, LLUICtrl*> dummies_map_t; +	dummies_map_t mDummiesMap;  protected: @@ -214,6 +208,8 @@ protected:  	LLPanel*			mGesturePanel;  	LLButton*			mCamButton;  	LLButton*			mMovementButton; +	LLBottomTrayLite*   mBottomTrayLite; +	bool                mIsInLiteMode;  };  #endif // LL_LLBOTTOMPANEL_H diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index f1e7e622b3..a570862675 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -51,9 +51,12 @@  #include "llslurl.h"  #include "lllayoutstack.h"  #include "llagent.h" +#include "llnotificationsutil.h" +#include "lltoastnotifypanel.h"  #include "llviewerregion.h"  #include "llworld.h" +  #include "llsidetray.h"//for blocked objects panel  static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history"); @@ -310,7 +313,7 @@ protected:  			showSystemContextMenu(x,y);  		if(mSourceType == CHAT_SOURCE_AGENT)  			showAvatarContextMenu(x,y); -		if(mSourceType == CHAT_SOURCE_OBJECT) +		if(mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom)  			showObjectContextMenu(x,y);  	} @@ -654,8 +657,36 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  		mLastMessageTimeStr = chat.mTimeStr;  	} -	std::string message = irc_me ? chat.mText.substr(3) : chat.mText; -	mEditor->appendText(message, FALSE, style_params); +   if (chat.mNotifId.notNull()) +	{ +		LLNotificationPtr notification = LLNotificationsUtil::find(chat.mNotifId); +		if (notification != NULL) +		{ +			LLToastNotifyPanel* notify_box = new LLToastNotifyPanel( +					notification); +			notify_box->setFollowsLeft(); +			notify_box->setFollowsRight(); +			//Prepare the rect for the view +			LLRect target_rect = mEditor->getDocumentView()->getRect(); +			// squeeze down the widget by subtracting padding off left and right +			target_rect.mLeft += mLeftWidgetPad + mEditor->getHPad(); +			target_rect.mRight -= mRightWidgetPad; +			notify_box->reshape(target_rect.getWidth(), +					notify_box->getRect().getHeight()); +			notify_box->setOrigin(target_rect.mLeft, notify_box->getRect().mBottom); + +			LLInlineViewSegment::Params params; +			params.view = notify_box; +			params.left_pad = mLeftWidgetPad; +			params.right_pad = mRightWidgetPad; +			mEditor->appendWidget(params, "\n", false); +		} +	} +	else +	{ +		std::string message = irc_me ? chat.mText.substr(3) : chat.mText; +		mEditor->appendText(message, FALSE, style_params); +	}  	mEditor->blockUndo();  	// automatically scroll to end when receiving chat from myself diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 6a2b7fc218..b947943619 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -39,8 +39,6 @@ class LLVOAvatar;  class LLDrawPoolAvatar : public LLFacePool  { -protected: -	S32					mNumFaces;  public:  	enum  	{ diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 8428be194f..0f76165053 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -48,8 +48,11 @@  #include "pipeline.h"  #include "llviewershadermgr.h" -LLDrawPoolSky::LLDrawPoolSky() : -	LLFacePool(POOL_SKY), mShader(NULL) +LLDrawPoolSky::LLDrawPoolSky() +:	LLFacePool(POOL_SKY), +	 +	mSkyTex(NULL), +	mShader(NULL)  {  } @@ -132,6 +135,7 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)  		return;  	} +	llassert(mSkyTex);  	mSkyTex[side].bindTexture(TRUE);  	face.renderIndexed(); diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h index 68a8172dd0..614f645243 100644 --- a/indra/newview/lldrawpoolwater.h +++ b/indra/newview/lldrawpoolwater.h @@ -47,7 +47,6 @@ protected:  	LLPointer<LLViewerTexture> mWaterImagep;  	LLPointer<LLViewerTexture> mWaterNormp; -	const LLWaterSurface *mWaterSurface;  public:  	static BOOL sSkipScreenCopy;  	static BOOL sNeedsReflectionUpdate; diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 0e42ff09d8..f5bb777419 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -685,7 +685,7 @@ void LLFavoritesBarCtrl::updateButtons()  			{  				// an child's order  and mItems  should be same     				if (button->getLandmarkId() != item->getUUID() // sort order has been changed -					|| button->getLabelSelected() != item->getDisplayName() // favorite's name has been changed +					|| button->getLabelSelected() != item->getName() // favorite's name has been changed  					|| button->getRect().mRight < rightest_point) // favbar's width has been changed  				{  					break; @@ -780,8 +780,8 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem  	 * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough.  	 * Problem will gone, if we  stretch out the button. For that reason I have to put additional  20 pixels.  	 */ -	int requred_width = mFont->getWidth(item->getDisplayName()) + 20; -	int width = requred_width > def_button_width? def_button_width : requred_width; +	int required_width = mFont->getWidth(item->getName()) + 20; +	int width = required_width > def_button_width? def_button_width : required_width;  	LLFavoriteLandmarkButton* fav_btn = NULL;  	// do we have a place for next button + double buttonHGap + mChevronButton ?  diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index 383963a41d..dd218d428f 100644 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -99,8 +99,14 @@ protected:  class LLFeatureManager : public LLFeatureList, public LLSingleton<LLFeatureManager>  {  public: -	LLFeatureManager() : -		LLFeatureList("default"), mInited(FALSE), mTableVersion(0), mSafe(FALSE), mGPUClass(GPU_CLASS_UNKNOWN) +	LLFeatureManager() +	:	LLFeatureList("default"), + +		mInited(FALSE), +		mTableVersion(0), +		mSafe(FALSE), +		mGPUClass(GPU_CLASS_UNKNOWN), +		mGPUSupported(FALSE)  	{  	}  	~LLFeatureManager() {cleanupFeatureTables();} diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 5c3a54e34b..b2f700069f 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -43,6 +43,7 @@  #include "llviewerregion.h"  #include "lscript_rt_interface.h"  #include "llviewercontrol.h" +#include "llviewerinventory.h"  #include "llviewerobject.h"  #include "llviewerregion.h"  #include "llresmgr.h" diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index 31f4f5c3e1..bffcff7059 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -44,8 +44,6 @@  #include "llfloater.h"  #include "llscrolllistctrl.h" -#include "llviewerinventory.h" -  class LLFloaterBulkPermission : public LLFloater, public LLVOInventoryListener  {  	friend class LLFloaterReg; diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp index 84b423399e..774caaec90 100644 --- a/indra/newview/llfloaterchatterbox.cpp +++ b/indra/newview/llfloaterchatterbox.cpp @@ -216,11 +216,11 @@ void LLFloaterChatterBox::onOpen(const LLSD& key)  	}  	else if (key.isDefined())  	{ -		LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID()); +		/*LLFloaterIMPanel* impanel = gIMMgr->findFloaterBySession(key.asUUID());  		if (impanel)  		{  			impanel->openFloater(); -		} +		}*/  	}  } diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index de65c6f876..b684e1f985 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -367,7 +367,14 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur  		element["columns"][3]["font"]["name"] = "SANSSERIF";  		element["columns"][3]["font"]["style"] = font_style;  	} -	list->addElement(element, ADD_BOTTOM); + +	LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM); +	if(sl_item) +	{ +		LLFontGL::StyleFlags style = LLGestureManager::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL; +		// *TODO find out why ["font"]["style"] does not affect font style +		((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(style); +	}  }  void LLFloaterGesture::getSelectedIds(std::vector<LLUUID>& ids) @@ -401,8 +408,7 @@ bool LLFloaterGesture::isActionEnabled(const LLSD& command)  		}  		return false;  	} -	else if("copy_uuid" == command_name || "edit_gesture" == command_name  -			|| "inspect" == command_name) +	else if("copy_uuid" == command_name || "edit_gesture" == command_name)  	{  		return	mGestureList->getAllSelected().size() == 1;  	} diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index e77c93b5f8..ef444c8ba4 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1207,7 +1207,7 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im  	childEnable("log_nearby_chat");  	childEnable("log_instant_messages");  	childEnable("show_timestamps_check_im"); -	childEnable("log_path_string"); +	childDisable("log_path_string");// LineEditor becomes readonly in this case.  	childEnable("log_path_button");  	std::string display_email(email); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 4a1eb51dbe..0f3c176cea 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -248,6 +248,7 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)  			if ( objectp->isAttachment() )  			{  				objectp = (LLViewerObject*)objectp->getRoot(); +				mObjectID = objectp->getID();  			}  			// correct the region and position information @@ -278,7 +279,7 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)  					object_owner.append("Unknown");  				} -				setFromAvatar(object_id, object_owner); +				setFromAvatar(mObjectID, object_owner);  			}  			else  			{ diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 4b48626b22..b05eb84e52 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -40,7 +40,6 @@  #include "llinventoryfilter.h"  #include "llpanel.h"  #include "llviewercontrol.h"	// gSavedSettings -#include "llviewerinventory.h"  #include "llviewerwindow.h"		// Argh, only for setCursor()  // linden library includes diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index d6e2bb0445..3653371d76 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -75,11 +75,12 @@ public:  			return false;  		} +		//*TODO by what to replace showing groups floater?  		if (tokens[0].asString() == "list")  		{  			if (tokens[1].asString() == "show")  			{ -				LLFloaterReg::showInstance("contacts", "groups"); +				//LLFloaterReg::showInstance("contacts", "groups");  				return true;  			}              return false; diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp index 0b03d49cbc..5760242bc8 100644 --- a/indra/newview/llgroupiconctrl.cpp +++ b/indra/newview/llgroupiconctrl.cpp @@ -94,6 +94,7 @@ void LLGroupIconCtrl::setValue(const LLSD& value)  		if (mGroupId != value.asUUID())  		{  			mGroupId = value.asUUID(); +			mID = mGroupId; // set LLGroupMgrObserver::mID to make callbacks work  			// Check if cache already contains image_id for that group  			if (!updateFromCache()) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index c0f22fcea2..9e52d4c6c2 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -601,8 +601,18 @@ void LLIMFloater::updateMessages()  			chat.mFromID = from_id;  			chat.mSessionID = mSessionID;  			chat.mFromName = from; -			chat.mText = message;  			chat.mTimeStr = time; + +			// process offer notification +			if (msg.has("notification_id")) +			{ +				chat.mNotifId = msg["notification_id"].asUUID(); +			} +			//process text message +			else +			{ +				chat.mText = message; +			}  			mChatHistory->appendMessage(chat, use_plain_text_chat_history);  			mLastMessageIndex = msg["index"].asInteger(); @@ -610,6 +620,13 @@ void LLIMFloater::updateMessages()  	}  } +void LLIMFloater::reloadMessages() +{ +	mChatHistory->clear(); +	mLastMessageIndex = -1; +	updateMessages(); +} +  // static  void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata )  { diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index 0ca0325451..9552b30737 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -80,6 +80,7 @@ public:  	// get new messages from LLIMModel  	void updateMessages(); +	void reloadMessages();  	static void onSendMsg( LLUICtrl*, void*);  	void sendMsg(); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 1254664330..80d2778934 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -52,7 +52,6 @@  #include "llbottomtray.h"  #include "llcallingcard.h"  #include "llchat.h" -#include "llfloaterchatterbox.h"  #include "llimfloater.h"  #include "llgroupiconctrl.h"  #include "llmd5.h" @@ -64,6 +63,7 @@  #include "llnotificationsutil.h"  #include "llnearbychat.h"  #include "llspeakers.h" //for LLIMSpeakerMgr +#include "lltextbox.h"  #include "lltextutil.h"  #include "llviewercontrol.h"  #include "llviewerparcelmgr.h" @@ -538,13 +538,6 @@ void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, con  			gIMMgr->startCall(new_session_id);  		}  	} - -	//*TODO remove this "floater" stuff when Communicate Floater is gone -	LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(old_session_id); -	if (floater) -	{ -		floater->sessionInitReplyReceived(new_session_id); -	}  }  void LLIMModel::testMessages() @@ -679,15 +672,6 @@ bool LLIMModel::proccessOnlineOfflineNotification(  	const LLUUID& session_id,   	const std::string& utf8_text)  { -	// Add message to old one floater -	LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id); -	if ( floater ) -	{ -		if ( !utf8_text.empty() ) -		{ -			floater->addHistoryLine(utf8_text, LLUIColorTable::instance().getColor("SystemChatColor")); -		} -	}  	// Add system message to history  	return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);  } @@ -955,9 +939,6 @@ void LLIMModel::sendMessage(const std::string& utf8_text,  		history_echo += ": " + utf8_text; -		LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id); -		if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID()); -  		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);  		if (speaker_mgr)  		{ @@ -1275,33 +1256,16 @@ LLUUID LLIMMgr::computeSessionID(  	return session_id;  } -inline LLFloater* getFloaterBySessionID(const LLUUID session_id) -{ -	LLFloater* floater = NULL; -	if ( gIMMgr ) -	{ -		floater = dynamic_cast < LLFloater* > -			( gIMMgr->findFloaterBySession(session_id) ); -	} -	if ( !floater ) -	{ -		floater = dynamic_cast < LLFloater* > -			( LLIMFloater::findInstance(session_id) ); -	} -	return floater; -} -  void  LLIMMgr::showSessionStartError(  	const std::string& error_string,  	const LLUUID session_id)  { -	const LLFloater* floater = getFloaterBySessionID (session_id); -	if (!floater) return; +	if (!hasSession(session_id)) return;  	LLSD args;  	args["REASON"] = LLTrans::getString(error_string); -	args["RECIPIENT"] = floater->getTitle(); +	args["RECIPIENT"] = LLIMModel::getInstance()->getName(session_id);  	LLSD payload;  	payload["session_id"] = session_id; @@ -1339,12 +1303,11 @@ LLIMMgr::showSessionForceClose(  	const std::string& reason_string,  	const LLUUID session_id)  { -	const LLFloater* floater = getFloaterBySessionID (session_id); -	if (!floater) return; +	if (!hasSession(session_id)) return;  	LLSD args; -	args["NAME"] = floater->getTitle(); +	args["NAME"] = LLIMModel::getInstance()->getName(session_id);  	args["REASON"] = LLTrans::getString(reason_string);  	LLSD payload; @@ -1366,7 +1329,7 @@ LLIMMgr::onConfirmForceCloseError(  	//only 1 option really  	LLUUID session_id = notification["payload"]["session_id"]; -	LLFloater* floater = getFloaterBySessionID (session_id); +	LLFloater* floater = LLIMFloater::findInstance(session_id);  	if ( floater )  	{  		floater->closeFloater(FALSE); @@ -2114,8 +2077,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)  // Member Functions  // -LLIMMgr::LLIMMgr() : -	mIMReceived(FALSE) +LLIMMgr::LLIMMgr()  {  	mPendingInvitations = LLSD::emptyMap();  	mPendingAgentListUpdates = LLSD::emptyMap(); @@ -2146,7 +2108,6 @@ void LLIMMgr::addMessage(  		return;  	} -	LLFloaterIMPanel* floater;  	LLUUID new_session_id = session_id;  	if (new_session_id.isNull())  	{ @@ -2165,32 +2126,7 @@ void LLIMMgr::addMessage(  	if (new_session)  	{  		LLIMModel::getInstance()->newSession(new_session_id, fixed_session_name, dialog, other_participant_id); -	} - -	floater = findFloaterBySession(new_session_id); -	if (!floater) -	{ -		floater = findFloaterBySession(other_participant_id); -		if (floater) -		{ -			llinfos << "found the IM session " << session_id  -				<< " by participant " << other_participant_id << llendl; -		} -	} - -	// create IM window as necessary -	if(!floater) -	{ -		floater = createFloater( -			new_session_id, -			other_participant_id, -			fixed_session_name, -			dialog, -			FALSE); -	} -	if (new_session) -	{  		// When we get a new IM, and if you are a god, display a bit  		// of information about the source. This is to help liaisons  		// when answering questions. @@ -2209,50 +2145,13 @@ void LLIMMgr::addMessage(  			//<< "*** region_id: " << region_id << std::endl  			//<< "*** position: " << position << std::endl; -			floater->addHistoryLine(bonus_info.str(), LLUIColorTable::instance().getColor("SystemChatColor"));  			LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, bonus_info.str());  		}  		make_ui_sound("UISndNewIncomingIMSession");  	} -	// now add message to floater -	bool is_from_system = target_id.isNull() || (from == SYSTEM_FROM); -	const LLColor4& color = ( is_from_system ?  -							  LLUIColorTable::instance().getColor("SystemChatColor") :  -							  LLUIColorTable::instance().getColor("IMChatColor")); -	if ( !link_name ) -	{ -		floater->addHistoryLine(msg,color); // No name to prepend, so just add the message normally -	} -	else -	{ -		floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message -	} -  	LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg); - -	if( !LLFloaterReg::instanceVisible("communicate") && !floater->getVisible()) -	{ -		LLFloaterChatterBox* chat_floater = LLFloaterChatterBox::getInstance(); -		 -		//if the IM window is not open and the floater is not visible (i.e. not torn off) -		LLFloater* previouslyActiveFloater = chat_floater->getActiveFloater(); - -		// select the newly added floater (or the floater with the new line added to it). -		// it should be there. -		chat_floater->selectFloater(floater); - -		//there was a previously unseen IM, make that old tab flashing -		//it is assumed that the most recently unseen IM tab is the one current selected/active -		if ( previouslyActiveFloater && getIMReceived() ) -		{ -			chat_floater->setFloaterFlashing(previouslyActiveFloater, TRUE); -		} - -		//notify of a new IM -		notifyNewIM(); -	}  }  void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args) @@ -2285,14 +2184,6 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess  	}  } -void LLIMMgr::notifyNewIM() -{ -	if(!LLFloaterReg::instanceVisible("communicate")) -	{ -		mIMReceived = TRUE; -	} -} -  S32 LLIMMgr::getNumberOfUnreadIM()  {  	std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it; @@ -2319,16 +2210,6 @@ S32 LLIMMgr::getNumberOfUnreadParticipantMessages()  	return num;  } -void LLIMMgr::clearNewIMNotification() -{ -	mIMReceived = FALSE; -} - -BOOL LLIMMgr::getIMReceived() const -{ -	return mIMReceived; -} -  void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id)  {  	LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id); @@ -2416,21 +2297,6 @@ LLUUID LLIMMgr::addSession(  		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);  	} -	//*TODO remove this "floater" thing when Communicate Floater's gone -	LLFloaterIMPanel* floater = findFloaterBySession(session_id); -	if(!floater) -	{ -		// On creation, use the first element of ids as the -		// "other_participant_id" -		floater = createFloater( -			session_id, -			other_participant_id, -			name, -			dialog, -			TRUE, -			ids); -	} -  	//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions  	if (!new_session) return session_id; @@ -2441,7 +2307,7 @@ LLUUID LLIMMgr::addSession(  	// Only warn for regular IMs - not group IMs  	if( dialog == IM_NOTHING_SPECIAL )  	{ -		noteMutedUsers(session_id, floater, ids); +		noteMutedUsers(session_id, ids);  	}  	return session_id; @@ -2462,14 +2328,6 @@ void LLIMMgr::removeSession(const LLUUID& session_id)  {  	llassert_always(hasSession(session_id)); -	//*TODO remove this floater thing when Communicate Floater is being deleted (IB) -	LLFloaterIMPanel* floater = findFloaterBySession(session_id); -	if(floater) -	{ -		mFloaters.erase(floater->getHandle()); -		LLFloaterChatterBox::getInstance()->removeFloater(floater); -	} -  	clearPendingInvitation(session_id);  	clearPendingAgentListUpdates(session_id); @@ -2579,50 +2437,12 @@ void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::stri  	LLFloaterReg::showInstance("incoming_call", payload, TRUE);  } +//*TODO disconnects all sessions  void LLIMMgr::disconnectAllSessions()  { -	LLFloaterIMPanel* floater = NULL; -	std::set<LLHandle<LLFloater> >::iterator handle_it; -	for(handle_it = mFloaters.begin(); -		handle_it != mFloaters.end(); -		) -	{ -		floater = (LLFloaterIMPanel*)handle_it->get(); - -		// MUST do this BEFORE calling floater->onClose() because that may remove the item from the set, causing the subsequent increment to crash. -		++handle_it; - -		if (floater) -		{ -			floater->setEnabled(FALSE); -			floater->closeFloater(TRUE); -		} -	} -} - - -// This method returns the im panel corresponding to the uuid -// provided. The uuid can either be a session id or an agent -// id. Returns NULL if there is no matching panel. -LLFloaterIMPanel* LLIMMgr::findFloaterBySession(const LLUUID& session_id) -{ -	LLFloaterIMPanel* rv = NULL; -	std::set<LLHandle<LLFloater> >::iterator handle_it; -	for(handle_it = mFloaters.begin(); -		handle_it != mFloaters.end(); -		++handle_it) -	{ -		rv = (LLFloaterIMPanel*)handle_it->get(); -		if(rv && session_id == rv->getSessionID()) -		{ -			break; -		} -		rv = NULL; -	} -	return rv; +	//*TODO disconnects all IM sessions  } -  BOOL LLIMMgr::hasSession(const LLUUID& session_id)  {  	return LLIMModel::getInstance()->findIMSession(session_id) != NULL; @@ -2806,49 +2626,14 @@ bool LLIMMgr::isVoiceCall(const LLUUID& session_id)  	return im_session->mStartedAsIMCall;  } -// create a floater and update internal representation for -// consistency. Returns the pointer, caller (the class instance since -// it is a private method) is not responsible for deleting the -// pointer.  Add the floater to this but do not select it. -LLFloaterIMPanel* LLIMMgr::createFloater( -	const LLUUID& session_id, -	const LLUUID& other_participant_id, -	const std::string& session_label, -	EInstantMessage dialog, -	BOOL user_initiated, -	const LLDynamicArray<LLUUID>& ids) -{ -	if (session_id.isNull()) -	{ -		llwarns << "Creating LLFloaterIMPanel with null session ID" << llendl; -	} - -	llinfos << "LLIMMgr::createFloater: from " << other_participant_id  -			<< " in session " << session_id << llendl; -	LLFloaterIMPanel* floater = new LLFloaterIMPanel(session_label, -													 session_id, -													 other_participant_id, -													 ids, -													 dialog); -	LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END; -	LLFloaterChatterBox::getInstance()->addFloater(floater, FALSE, i_pt); -	mFloaters.insert(floater->getHandle()); -	return floater; -} -  void LLIMMgr::noteOfflineUsers(  	const LLUUID& session_id, -	LLFloaterIMPanel* floater,  	const LLDynamicArray<LLUUID>& ids)  {  	S32 count = ids.count();  	if(count == 0)  	{  		const std::string& only_user = LLTrans::getString("only_user_message"); -		if (floater) -		{ -			floater->addHistoryLine(only_user, LLUIColorTable::instance().getColor("SystemChatColor")); -		}  		LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, only_user);  	}  	else @@ -2872,7 +2657,7 @@ void LLIMMgr::noteOfflineUsers(  	}  } -void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater, +void LLIMMgr::noteMutedUsers(const LLUUID& session_id,  								  const LLDynamicArray<LLUUID>& ids)  {  	// Don't do this if we don't have a mute list. @@ -2893,9 +2678,6 @@ void LLIMMgr::noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* floater  			{  				LLUIString muted = LLTrans::getString("muted_message"); -				//*TODO remove this "floater" thing when Communicate Floater's gone -				floater->addHistoryLine(muted); -  				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, muted);  				break;  			} @@ -2916,12 +2698,6 @@ void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)  void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)  {  	LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID); -	LLFloaterIMPanel* floater = findFloaterBySession(session_id); -	if (floater) -	{ -		floater->processIMTyping(im_info, typing); -	} -  	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);  	if ( im_floater )  	{ @@ -2967,15 +2743,6 @@ public:  				speaker_mgr->updateSpeakers(gIMMgr->getPendingAgentListUpdates(session_id));  			} -			LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id); -			if (floaterp) -			{ -				if ( body.has("session_info") ) -				{ -					floaterp->processSessionUpdate(body["session_info"]); -				} -			} -  			LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);  			if ( im_floater )  			{ @@ -3070,11 +2837,6 @@ public:  		const LLSD& input) const  	{  		LLUUID session_id = input["body"]["session_id"].asUUID(); -		LLFloaterIMPanel* floaterp = gIMMgr->findFloaterBySession(session_id); -		if (floaterp) -		{ -			floaterp->processSessionUpdate(input["body"]["info"]); -		}  		LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);  		if ( im_floater )  		{ diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 0386ff234d..b573490fa3 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -39,9 +39,8 @@  #include "lllogchat.h"  #include "llvoicechannel.h" -class LLFloaterChatterBox; -class LLUUID; -class LLFloaterIMPanel; + +  class LLFriendObserver;  class LLCallDialogManager;	  class LLIMSpeakerMgr; @@ -361,15 +360,9 @@ public:  	void processIMTypingStart(const LLIMInfo* im_info);  	void processIMTypingStop(const LLIMInfo* im_info); -	void notifyNewIM(); -	void clearNewIMNotification(); -  	// automatically start a call once the session has initialized  	void autoStartCallOnStartup(const LLUUID& session_id); -	// IM received that you haven't seen yet -	BOOL getIMReceived() const; -  	// Calc number of all unread IMs  	S32 getNumberOfUnreadIM(); @@ -386,11 +379,6 @@ public:  	BOOL hasSession(const LLUUID& session_id); -	// This method returns the im panel corresponding to the uuid -	// provided. The uuid must be a session id. Returns NULL if there -	// is no matching panel. -	LLFloaterIMPanel* findFloaterBySession(const LLUUID& session_id); -  	static LLUUID computeSessionID(EInstantMessage dialog, const LLUUID& other_participant_id);  	void clearPendingInvitation(const LLUUID& session_id); @@ -402,10 +390,6 @@ public:  		const LLSD& updates);  	void clearPendingAgentListUpdates(const LLUUID& session_id); -	//HACK: need a better way of enumerating existing session, or listening to session create/destroy events -	//@deprecated, is used only by LLToolBox, which is not used anywhere, right? (IB) -	const std::set<LLHandle<LLFloater> >& getIMFloaterHandles() { return mFloaters; } -  	void addSessionObserver(LLIMSessionObserver *);  	void removeSessionObserver(LLIMSessionObserver *); @@ -436,23 +420,12 @@ private:  	 */  	void removeSession(const LLUUID& session_id); -	// create a panel and update internal representation for -	// consistency. Returns the pointer, caller (the class instance -	// since it is a private method) is not responsible for deleting -	// the pointer. -	LLFloaterIMPanel* createFloater(const LLUUID& session_id, -									const LLUUID& target_id, -									const std::string& name, -									EInstantMessage dialog, -									BOOL user_initiated = FALSE,  -									const LLDynamicArray<LLUUID>& ids = LLDynamicArray<LLUUID>()); -  	// This simple method just iterates through all of the ids, and  	// prints a simple message if they are not online. Used to help  	// reduce 'hello' messages to the linden employees unlucky enough  	// to have their calling card in the default inventory. -	void noteOfflineUsers(const LLUUID& session_id, LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids); -	void noteMutedUsers(const LLUUID& session_id, LLFloaterIMPanel* panel, const LLDynamicArray<LLUUID>& ids); +	void noteOfflineUsers(const LLUUID& session_id, const LLDynamicArray<LLUUID>& ids); +	void noteMutedUsers(const LLUUID& session_id, const LLDynamicArray<LLUUID>& ids);  	void processIMTypingCore(const LLIMInfo* im_info, BOOL typing); @@ -464,15 +437,9 @@ private:  private: -	//*TODO should be deleted when Communicate Floater is being deleted -	std::set<LLHandle<LLFloater> > mFloaters; -  	typedef std::list <LLIMSessionObserver *> session_observers_list_t;  	session_observers_list_t mSessionObservers; -	// An IM has been received that you haven't seen yet. -	BOOL mIMReceived; -  	LLSD mPendingInvitations;  	LLSD mPendingAgentListUpdates;  }; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 6c9c7d15be..e04d3ec5a0 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -5079,7 +5079,7 @@ void	LLLandmarkBridgeAction::doIt()  		payload["asset_id"] = item->getAssetUUID();		  		LLSD args;  -		args["LOCATION"] = item->getDisplayName();  +		args["LOCATION"] = item->getName();   		LLNotificationsUtil::add("TeleportFromLandmark", args, payload);  	} diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index b4dcb566e4..cd20d64ca8 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -39,7 +39,6 @@  #include "llfolderviewitem.h"  #include "llinventorymodel.h"	// gInventory.backgroundFetchActive()  #include "llviewercontrol.h" -#include "llviewerinventory.h"  #include "llfolderview.h"  // linden library includes diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 2885ba13fa..33623539e9 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -76,7 +76,6 @@  #include "lltabcontainer.h"  #include "lltooldraganddrop.h"  #include "lluictrlfactory.h" -#include "llviewerinventory.h"  #include "llviewermessage.h"  #include "llviewerobjectlist.h"  #include "llviewerregion.h" diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 961f7adc0a..bdf1ebddac 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -142,6 +142,105 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item)  	return rv;  } +/* +This namespace contains a functionality to remove LM prefixes were used to store sort order of +Favorite Landmarks in landmarks' names. +Once being in Favorites folder LM inventory Item has such prefix. +Due to another solution is implemented in EXT-3985 these prefixes should be removed. + +*NOTE: It will be unnecessary after the first successful session in viewer 2.0. +Can be removed before public release. + +Implementation details: +At the first run with this patch it patches all cached landmarks: removes LM sort prefixes and +updates them on the viewer and server sides. +Also it calls fetching agent's inventory to process not yet loaded landmarks too. +If fetching is successfully done it will store special per-agent empty file-marker +in the user temporary folder (where cached inventory is loaded) while caching agent's inventory. +After that in will not affect the viewer until cached marker is removed. +*/ +namespace LMSortPrefix +{ +	bool cleanup_done = false; +	const std::string getMarkerPath() +	{ +		std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, gAgentID.asString())); +		std::string marker_filename = llformat("%s-lm_prefix_marker", path.c_str()); + +		return marker_filename; +	} +	bool wasClean() +	{ +		static bool was_clean = false; +		static bool already_init = false; +		if (already_init) return was_clean; + +		already_init = true; +		std::string path_to_marker = getMarkerPath(); +		was_clean = LLFile::isfile(path_to_marker); + +		return was_clean; +	} + +	void setLandmarksWereCleaned() +	{ +		if (cleanup_done) +		{ +			std::string path_to_marker = getMarkerPath(); +			LLFILE* file = LLFile::fopen(path_to_marker, "w"); +			if(!file) +			{ +				llwarns << "unable to save marker that LM prefixes were removed: " << path_to_marker << llendl; +				return; +			} + +			fclose(file); +		} +	} + +	void removePrefix(LLPointer<LLViewerInventoryItem> inv_item) +	{ +		if (wasClean()) +		{ +			LL_INFOS_ONCE("") << "Inventory was cleaned for this avatar. Patch can be removed." << LL_ENDL; +			return; +		} + +		if (LLInventoryType::IT_LANDMARK != inv_item->getInventoryType()) return; + +		std::string old_name = inv_item->getName(); + +		S32 sort_field = -1; +		std::string display_name; +		BOOL exists = LLViewerInventoryItem::extractSortFieldAndDisplayName(old_name, &sort_field, &display_name); +		if (exists && sort_field != -1) +		{ +			llinfos << "Removing Landmark sort field and separator for: " << old_name << " | " << inv_item->getUUID() << llendl; +			LLUUID parent_uuid = inv_item->getParentUUID(); +			if (gInventory.getCategory(parent_uuid)) +			{ +				llinfos << "parent folder is: " << gInventory.getCategory(parent_uuid)->getName() << llendl; +			} + + +			// mark item completed to avoid error while copying and updating server +			inv_item->setComplete(TRUE); +			LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item.get()); +			new_item->rename(display_name); +			gInventory.updateItem(new_item); +			new_item->updateServer(FALSE); + +			gInventory.notifyObservers(); +		} +	} + +	void completeCleanup() +	{ +		// background fetch is completed. can save marker +		cleanup_done = true; +	} +} +  ///----------------------------------------------------------------------------  /// Class LLInventoryModel  ///---------------------------------------------------------------------------- @@ -1736,6 +1835,8 @@ void LLInventoryModel::stopBackgroundFetch()  		gIdleCallbacks.deleteFunction(&LLInventoryModel::backgroundFetch, NULL);  		sBulkFetchCount=0;  		sMinTimeBetweenFetches=0.0f; + +		LMSortPrefix::completeCleanup();  	}  } @@ -1882,6 +1983,13 @@ void LLInventoryModel::cache(  	const LLUUID& parent_folder_id,  	const LLUUID& agent_id)  { +	if (getRootFolderID() == parent_folder_id) +	{ +		// *TODO: mantipov: can be removed before public release, EXT-3985 +		//save marker to avoid fetching inventory on future sessions +		LMSortPrefix::setLandmarksWereCleaned(); +	} +  	lldebugs << "Caching " << parent_folder_id << " for " << agent_id  			 << llendl;  	LLViewerInventoryCategory* root_cat = getCategory(parent_folder_id); @@ -2692,6 +2800,28 @@ void LLInventoryModel::buildParentChildMap()  			// The inv tree is built.  			mIsAgentInvUsable = true; +			{// *TODO: mantipov: can be removed before public release, EXT-3985 +				/* +				*HACK: mantipov: to cleanup landmarks were marked with sort index prefix in name. +				Is necessary to be called once per account after EXT-3985 is implemented. +				So, let fetch agent's inventory, processing will be done in processInventoryDescendents() +				Should be removed before public release. +				*/ +				if (!LMSortPrefix::wasClean()) +				{ +					cat_array_t cats; +					item_array_t items; +					collectDescendents(agent_inv_root_id, cats, items, INCLUDE_TRASH); + +					for (item_array_t::const_iterator it= items.begin(); it != items.end(); ++it) +					{ +						LMSortPrefix::removePrefix(*it); +					} + +					gInventory.startBackgroundFetch(agent_inv_root_id); +				} +			} +  			llinfos << "Inventory initialized, notifying observers" << llendl;  			addChangedMask(LLInventoryObserver::ALL, LLUUID::null);  			notifyObservers(); @@ -3457,6 +3587,10 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)  			continue;  		}  		gInventory.updateItem(titem); + +		{// *TODO: mantipov: can be removed before public release, EXT-3985 +			LMSortPrefix::removePrefix(titem); +		}  	}  	// set version and descendentcount according to message. diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 7e71ac90b4..12a2c370d2 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -759,7 +759,9 @@ bool LLInventoryPanel::beginIMSession()  				S32 count = item_array.count();  				if(count > 0)  				{ -					LLFloaterReg::showInstance("communicate"); +					//*TODO by what to replace that? +					//LLFloaterReg::showInstance("communicate"); +  					// create the session  					LLAvatarTracker& at = LLAvatarTracker::instance();  					LLUUID id; diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 5981baab60..4bf2bac649 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -651,6 +651,9 @@ void LLPanelStandStopFlying::reparent(LLFloaterMove* move_view)  		// Detach from movement controls.   		parent->removeChild(this);  		mOriginalParent.get()->addChild(this); +		// update parent with self visibility (it is changed in setVisible()). EXT-4743 +		mOriginalParent.get()->setVisible(getVisible()); +  		mAttached = false;  		updatePosition(); // don't defer until next draw() to avoid flicker  	} diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index c1666f5666..2d3c4b187e 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -58,7 +58,6 @@  #include "llagent.h"  #include "llviewergenericmessage.h"	// for gGenericDispatcher  #include "llworld.h" //for particle system banning -#include "llimpanel.h"  #include "llimview.h"  #include "llnotifications.h"  #include "llviewerobjectlist.h" @@ -472,12 +471,6 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n  		if (reason == LLMuteList::AR_IM)  		{ -			LLFloaterIMPanel *timp = gIMMgr->findFloaterBySession(agent_id); -			if (timp) -			{ -				timp->addHistoryLine(message); -			} -  			LLIMModel::getInstance()->addMessage(agent_id, SYSTEM_FROM, LLUUID::null, message);  		}  	} diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 6cf8bcb417..ad98a29fb2 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -97,9 +97,9 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)  	mList = LLUICtrlFactory::create<LLScrollListCtrl>(params); -	// *HACK: adding list as a child to NonSideTrayView to make it fully visible without +	// *HACK: adding list as a child to FloaterViewHolder to make it fully visible without  	// making it top control (because it would cause problems). -	gViewerWindow->getNonSideTrayView()->addChild(mList); +	gViewerWindow->getFloaterViewHolder()->addChild(mList);  	mList->setVisible(FALSE);  	//****************************Gesture Part********************************/ diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index e57674d31c..5f4768e321 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -277,6 +277,11 @@ public:  	static bool canSpawnIMSession(const LLNotificationPtr& notification);  	/** +	 * Checks sufficient conditions to add notification toast panel IM floater. +	 */ +	static bool canAddNotifPanelToIM(const LLNotificationPtr& notification); + +	/**  	 * Checks if passed notification can create IM session and be written into it.  	 *  	 * This method uses canLogToIM() & canSpawnIMSession(). @@ -297,6 +302,11 @@ public:  	static void logToIMP2P(const LLNotificationPtr& notification);  	/** +	 * Writes notification message to IM  p2p session. +	 */ +	static void logToIMP2P(const LLNotificationPtr& notification, bool to_file_only); + +	/**  	 * Writes group notice notification message to IM  group session.  	 */  	static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification); @@ -309,7 +319,7 @@ public:  	/**  	 * Spawns IM session.  	 */ -	static void spawnIMSession(const std::string& name, const LLUUID& from_id); +	static LLUUID spawnIMSession(const std::string& name, const LLUUID& from_id);  	/**  	 * Returns name from the notification's substitution. @@ -319,6 +329,16 @@ public:  	 * @param notification - Notification which substitution's name will be returned.  	 */  	static std::string getSubstitutionName(const LLNotificationPtr& notification); + +	/** +	 * Adds notification panel to the IM floater. +	 */ +	static void addNotifPanelToIM(const LLNotificationPtr& notification); + +	/** +	 * Reloads IM floater messages. +	 */ +	static void reloadIMFloaterMessages(const LLNotificationPtr& notification);  };  } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 02f948eca9..16218f6d53 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -39,6 +39,7 @@  #include "llagent.h"  #include "llfloaterreg.h"  #include "llnearbychat.h" +#include "llimfloater.h"  using namespace LLNotificationsUI; @@ -91,6 +92,13 @@ bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification)  }  // static +bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification) +{ +	return OFFER_FRIENDSHIP == notification->getName(); +} + + +// static  bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notification)  {  	return canLogToIM(notification) && canSpawnIMSession(notification); @@ -137,6 +145,12 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type,  // static  void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification)  { +	logToIMP2P(notification, false); +} + +// static +void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_file_only) +{  	const std::string name = LLHandlerUtil::getSubstitutionName(notification);  	const std::string session_name = notification->getPayload().has( @@ -148,8 +162,16 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification)  	{  		LLUUID from_id = notification->getPayload()["from_id"]; -		logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(), -				from_id, from_id); +		if(to_file_only) +		{ +			logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(), +					LLUUID(), LLUUID()); +		} +		else +		{ +			logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(), +					from_id, from_id); +		}  	}  } @@ -191,7 +213,7 @@ void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChat  }  // static -void LLHandlerUtil::spawnIMSession(const std::string& name, const LLUUID& from_id) +LLUUID LLHandlerUtil::spawnIMSession(const std::string& name, const LLUUID& from_id)  {  	LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id); @@ -199,8 +221,10 @@ void LLHandlerUtil::spawnIMSession(const std::string& name, const LLUUID& from_i  			session_id);  	if (session == NULL)  	{ -		LLIMMgr::instance().addSession(name, IM_NOTHING_SPECIAL, from_id); +		session_id = LLIMMgr::instance().addSession(name, IM_NOTHING_SPECIAL, from_id);  	} + +	return session_id;  }  // static @@ -210,3 +234,49 @@ std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notifica  		? notification->getSubstitutions()["NAME"]  		: notification->getSubstitutions()["[NAME]"];  } + +// static +void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification) +{ +	const std::string name = LLHandlerUtil::getSubstitutionName(notification); +	LLUUID from_id = notification->getPayload()["from_id"]; + +	LLUUID session_id = spawnIMSession(name, from_id); +	// add offer to session +	LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession( +			session_id); +	llassert_always(session != NULL); + +	LLSD offer; +	offer["notification_id"] = notification->getID(); +	offer["from_id"] = notification->getPayload()["from_id"]; +	offer["from"] = name; +	offer["time"] = LLLogChat::timestamp(true); +	session->mMsgs.push_front(offer); + +	LLIMFloater::show(session_id); +} + +// static +void LLHandlerUtil::reloadIMFloaterMessages( +		const LLNotificationPtr& notification) +{ +	LLUUID from_id = notification->getPayload()["from_id"]; +	LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id); +	LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>( +			"impanel", session_id); +	if (im_floater != NULL) +	{ +		LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession( +				session_id); +		if(session != NULL) +		{ +			session->mMsgs.clear(); +			std::list<LLSD> chat_history; +			LLLogChat::loadAllHistory(session->mHistoryFileName, chat_history); +			session->addMessagesFromHistory(chat_history); +		} + +		im_floater->reloadMessages(); +	} +} diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index fad0c6a91e..8c13b0fafa 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -93,7 +93,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")  	{ -		LLHandlerUtil::logToIMP2P(notification); +  		if( notification->getPayload().has("give_inventory_notification")  			&& !notification->getPayload()["give_inventory_notification"] ) @@ -103,18 +103,25 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  		}  		else  		{ +			LLUUID session_id;  			if (LLHandlerUtil::canSpawnIMSession(notification))  			{  				const std::string name = LLHandlerUtil::getSubstitutionName(notification);  				LLUUID from_id = notification->getPayload()["from_id"]; -				LLHandlerUtil::spawnIMSession(name, from_id); +				session_id = LLHandlerUtil::spawnIMSession(name, from_id);  			} -			if (notification->getPayload().has("SUPPRESS_TOAST") +			if (LLHandlerUtil::canAddNotifPanelToIM(notification)) +			{ +				LLHandlerUtil::addNotifPanelToIM(notification); +				LLHandlerUtil::logToIMP2P(notification, true); +			} +			else if (notification->getPayload().has("SUPPRESS_TOAST")  						&& notification->getPayload()["SUPPRESS_TOAST"])  			{ +				LLHandlerUtil::logToIMP2P(notification);  				LLNotificationsUtil::cancel(notification);  			}  			else @@ -131,6 +138,8 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  				if(channel)  					channel->addToast(p); +				LLHandlerUtil::logToIMP2P(notification); +  				// send a signal to the counter manager  				mNewNotificationSignal();  			} @@ -146,6 +155,10 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  		}  		else  		{ +			if (LLHandlerUtil::canAddNotifPanelToIM(notification)) +			{ +				LLHandlerUtil::reloadIMFloaterMessages(notification); +			}  			mChannel->killToastByNotificationID(notification->getID());  		}  	} diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 9d591ef43d..2a7d097f94 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -50,7 +50,6 @@  // project includes  #include "llagent.h" -#include "llfloaterbulkpermission.h"  #include "llpanelobjectinventory.h"  #include "llpreviewscript.h"  #include "llresmgr.h" @@ -60,6 +59,7 @@  #include "lltoolmgr.h"  #include "lltrans.h"  #include "llviewerassettype.h" +#include "llviewerinventory.h"  #include "llviewerobject.h"  #include "llviewerregion.h"  #include "llviewerwindow.h" diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 21b253223f..51fc670d87 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -679,6 +679,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)  			LLSD row;  			row["columns"][0]["value"] = pending.str(); +			row["columns"][0]["column"] = "name";  			mListVisibleMembers->setEnabled(FALSE);  			mListVisibleMembers->addElement(row); @@ -731,9 +732,11 @@ void LLPanelGroupGeneral::updateMembers()  		row["columns"][1]["value"] = member->getTitle();  		row["columns"][1]["font"]["name"] = "SANSSERIF_SMALL";  		row["columns"][1]["font"]["style"] = style; + +		std::string status = member->getOnlineStatus(); -		row["columns"][2]["column"] = "online"; -		row["columns"][2]["value"] = member->getOnlineStatus(); +		row["columns"][2]["column"] = "status"; +		row["columns"][2]["value"] = status;  		row["columns"][2]["font"]["name"] = "SANSSERIF_SMALL";  		row["columns"][2]["font"]["style"] = style; @@ -846,6 +849,7 @@ void LLPanelGroupGeneral::reset()  	{  		LLSD row;  		row["columns"][0]["value"] = "no members yet"; +		row["columns"][0]["column"] = "name";  		mListVisibleMembers->deleteAllItems();  		mListVisibleMembers->setEnabled(FALSE); diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 45fc3d4688..6210973dae 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -614,7 +614,7 @@ void LLPanelGroupNotices::showNotice(const std::string& subject,  		mViewInventoryIcon->setVisible(TRUE);  		std::stringstream ss; -		ss << "        " << LLViewerInventoryItem::getDisplayName(inventory_name); +		ss << "        " << inventory_name;  		mViewInventoryName->setText(ss.str());  		mBtnOpenAttachment->setEnabled(TRUE); diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 7a17d4a1f0..36a542cfa0 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -367,7 +367,6 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)  	}  	LLStringUtil::replaceChar(desc, '\n', ' '); -	LLViewerInventoryItem::insertDefaultSortField(name);  	// If no folder chosen use the "Landmarks" folder.  	LLLandmarkActions::createLandmarkHere(name, desc, diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 501dac5dff..470cfca8fe 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -61,7 +61,14 @@ ContextMenu::~ContextMenu()  	// It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw()  	// via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel.  	// we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725 -	if (mMenu) 	mMenu->die(); + +	// menu holder deletes its menus on viewer exit, so we have no way to determine if instance  +	// of mMenu has already been deleted except of using LLHandle. EXT-4762. +	if (!mMenuHandle.isDead()) +	{ +		mMenu->die(); +		mMenu = NULL; +	}  }  void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y) @@ -86,6 +93,7 @@ void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids,  	std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());  	mMenu = createMenu(); +	mMenuHandle = mMenu->getHandle();  	mMenu->show(x, y);  	LLMenuGL::showPopup(spawning_view, mMenu, x, y);  } diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 7251f6dbbd..913638d8c8 100644 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -62,6 +62,7 @@ protected:  	std::vector<LLUUID>	mUUIDs;  	LLContextMenu*		mMenu; +	LLHandle<LLView>	mMenuHandle;  };  /** diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 6005881148..43e0f9a88c 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -46,7 +46,6 @@  #include "llnotificationsutil.h"  #include "lltextbox.h"  #include "llviewermenu.h" -#include "llviewerinventory.h"  #include "lllandmarkactions.h"  #include "llclipboard.h" diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 84bdaafacf..53e351e66e 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -155,6 +155,12 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob  	return preview;  } +void LLPreviewGesture::draw() +{ +	// Skip LLPreview::draw() to avoid description update +	LLFloater::draw(); +} +  // virtual  BOOL LLPreviewGesture::handleKeyHere(KEY key, MASK mask)  { @@ -497,11 +503,9 @@ BOOL LLPreviewGesture::postBuild()  	if (item)   	{ -		childSetCommitCallback("desc", LLPreview::onText, this);  		childSetText("desc", item->getDescription());  		childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); -		childSetCommitCallback("name", LLPreview::onText, this);  		childSetText("name", item->getName());  		childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);  	} @@ -1077,6 +1081,8 @@ void LLPreviewGesture::saveIfNeeded()  	}  	else  	{ +		LLPreview::onCommit(); +  		// Every save gets a new UUID.  Yup.  		LLTransactionID tid;  		LLAssetID asset_id; diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h index 19fa1dcc37..5968e936ef 100644 --- a/indra/newview/llpreviewgesture.h +++ b/indra/newview/llpreviewgesture.h @@ -60,6 +60,7 @@ public:  	virtual ~LLPreviewGesture();  	// LLView +	/*virtual*/ void draw();  	/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);  	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  									 EDragAndDropType cargo_type, diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp index 56e342c3ce..f51462dcce 100644 --- a/indra/newview/llsidepanelinventorysubpanel.cpp +++ b/indra/newview/llsidepanelinventorysubpanel.cpp @@ -44,7 +44,6 @@  #include "lllineeditor.h"  #include "llradiogroup.h"  #include "llviewercontrol.h" -#include "llviewerinventory.h"  #include "llviewerobjectlist.h" diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index e49044cdca..add61c00cf 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -127,17 +127,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification  	pAttachLink->setVisible(hasInventory);  	pAttachIcon->setVisible(hasInventory);  	if (hasInventory) { -		std::string dis_name; -		std::string inv_name = payload["inventory_name"]; - -		if (LLViewerInventoryItem::extractSortFieldAndDisplayName(inv_name, NULL, &dis_name)) -		{ -			pAttachLink->setValue(dis_name); -		} -		else -		{ -			pAttachLink->setValue(inv_name); -		} +		pAttachLink->setValue(payload["inventory_name"]);  		mInventoryOffer = new LLOfferInfo(payload["inventory_offer"]);  		childSetActionTextbox("attachment", boost::bind( diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 89a58cd736..a436dc0546 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -33,7 +33,10 @@  #include "llviewerprecompiledheaders.h"  #include "lltoastimpanel.h" +#include "llagent.h"  #include "llfloaterreg.h" +#include "llgroupactions.h" +#include "llgroupiconctrl.h"  #include "llnotifications.h"  #include "llinstantmessage.h"  #include "lltooltip.h" @@ -45,11 +48,12 @@ const S32 LLToastIMPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT	= 6;  //--------------------------------------------------------------------------  LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notification),  								mAvatarIcon(NULL), mAvatarName(NULL), -								mTime(NULL), mMessage(NULL) +								mTime(NULL), mMessage(NULL), mGroupIcon(NULL)  {  	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_instant_message.xml");  	LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); +	mGroupIcon = getChild<LLGroupIconCtrl>("group_icon");  	mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon");  	mAvatarName = getChild<LLTextBox>("user_name");  	mTime = getChild<LLTextBox>("time_box"); @@ -86,17 +90,26 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) :	LLToastPanel(p.notif  	mAvatarID = p.avatar_id;  	mNotification = p.notification; +	mAvatarIcon->setVisible(FALSE); +	mGroupIcon->setVisible(FALSE); +	sys_msg_icon->setVisible(FALSE); +  	if(p.from == SYSTEM_FROM)  	{ -		mAvatarIcon->setVisible(FALSE);  		sys_msg_icon->setVisible(TRUE);  	}  	else  	{ -		mAvatarIcon->setVisible(TRUE); -		sys_msg_icon->setVisible(FALSE); - -		mAvatarIcon->setValue(p.avatar_id); +		if(LLGroupActions::isInGroup(mSessionID)) +		{ +			mGroupIcon->setVisible(TRUE); +			mGroupIcon->setValue(p.session_id); +		} +		else +		{ +			mAvatarIcon->setVisible(TRUE); +			mAvatarIcon->setValue(p.avatar_id); +		}  	}  	S32 maxLinesCount; @@ -128,11 +141,39 @@ BOOL LLToastIMPanel::handleMouseDown(S32 x, S32 y, MASK mask)  BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)  {  	// It's not our direct child, so parentPointInView() doesn't work. -	LLRect name_rect; -	mAvatarName->localRectToOtherView(mAvatarName->getLocalRect(), &name_rect, this); -	if (!name_rect.pointInRect(x, y)) -		return LLToastPanel::handleToolTip(x, y, mask); +	LLRect ctrl_rect; + +	mAvatarName->localRectToOtherView(mAvatarName->getLocalRect(), &ctrl_rect, this); +	if (ctrl_rect.pointInRect(x, y)) +	{ +		spawnNameToolTip(); +		return TRUE; +	} + +	mGroupIcon->localRectToOtherView(mGroupIcon->getLocalRect(), &ctrl_rect, this); +	if(mGroupIcon->getVisible() && ctrl_rect.pointInRect(x, y)) +	{ +		spawnGroupIconToolTip(); +		return TRUE; +	} + +	return LLToastPanel::handleToolTip(x, y, mask); +} + +void LLToastIMPanel::showInspector() +{ +	if(LLGroupActions::isInGroup(mSessionID)) +	{ +		LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); +	} +	else +	{ +		LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); +	} +} +void LLToastIMPanel::spawnNameToolTip() +{  	// Spawn at right side of the name textbox.  	LLRect sticky_rect = mAvatarName->calcScreenRect();  	S32 icon_x = llmin(sticky_rect.mLeft + mAvatarName->getTextPixelWidth() + 3, sticky_rect.mRight - 16); @@ -149,10 +190,31 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)  	params.sticky_rect(sticky_rect);  	LLToolTipMgr::getInstance()->show(params); -	return TRUE;  } -void LLToastIMPanel::showInspector() +void LLToastIMPanel::spawnGroupIconToolTip()  { -	LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); +	// Spawn at right bottom side of group icon. +	LLRect sticky_rect = mGroupIcon->calcScreenRect(); +	LLCoordGL pos(sticky_rect.mRight, sticky_rect.mBottom); + +	LLGroupData g_data; +	if(!gAgent.getGroupData(mSessionID, g_data)) +	{ +		llwarns << "Error getting group data" << llendl; +	} + +	LLInspector::Params params; +	params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); +	params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this)); +	params.delay_time(0.100f); +	params.image(LLUI::getUIImage("Info_Small")); +	params.message(g_data.mName); +	params.padding(3); +	params.pos(pos); +	params.max_width(300); + +	LLToolTipMgr::getInstance()->show(params);  } + +// EOF diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h index 154e6dae16..444c0af144 100644 --- a/indra/newview/lltoastimpanel.h +++ b/indra/newview/lltoastimpanel.h @@ -39,6 +39,7 @@  #include "llbutton.h"  #include "llavatariconctrl.h" +class LLGroupIconCtrl;  class LLToastIMPanel: public LLToastPanel   { @@ -61,12 +62,17 @@ public:  	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, MASK mask);  private:  	void showInspector(); + +	void spawnNameToolTip(); +	void spawnGroupIconToolTip(); +  	static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT;  	LLNotificationPtr	mNotification;  	LLUUID				mSessionID;  	LLUUID				mAvatarID;  	LLAvatarIconCtrl*	mAvatarIcon; +	LLGroupIconCtrl*	mGroupIcon;  	LLTextBox*			mAvatarName;  	LLTextBox*			mTime;  	LLTextBox*			mMessage; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 94acb2ae8c..4d741456c4 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -43,6 +43,7 @@  #include "lluiconstants.h"  #include "llrect.h"  #include "lltrans.h" +#include "llnotificationsutil.h"  const S32 BOTTOM_PAD = VPAD * 3;  S32 BUTTON_WIDTH = 90; @@ -235,6 +236,10 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt  LLToastNotifyPanel::~LLToastNotifyPanel()   {  	std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer()); +	if (LLNotificationsUtil::find(mNotification->getID()) != NULL) +	{ +		LLNotifications::getInstance()->cancel(mNotification); +	}  }  void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top)  { diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp index e7dc7ae522..404eab9249 100644 --- a/indra/newview/lltoolbar.cpp +++ b/indra/newview/lltoolbar.cpp @@ -54,7 +54,6 @@  #include "lltooldraganddrop.h"  #include "llfloaterinventory.h"  #include "llfloaterchatterbox.h" -#include "llfloaterfriends.h"  #include "llfloatersnapshot.h"  #include "llinventorypanel.h"  #include "lltoolmgr.h" @@ -70,7 +69,6 @@  #include "llviewerwindow.h"  #include "lltoolgrab.h"  #include "llcombobox.h" -#include "llimpanel.h"  #include "lllayoutstack.h"  #if LL_DARWIN @@ -265,12 +263,12 @@ void LLToolBar::updateCommunicateList()  	communicate_button->removeall(); -	LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater(); +	//LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater();  	LLScrollListItem* itemp = NULL;  	LLSD contact_sd;  	contact_sd["value"] = "contacts"; -	contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();  +	/*contact_sd["columns"][0]["value"] = LLFloaterMyFriends::getInstance()->getShortTitle();   	if (LLFloaterMyFriends::getInstance() == frontmost_floater)  	{  		contact_sd["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";  @@ -280,7 +278,7 @@ void LLToolBar::updateCommunicateList()  		{  			selected = "contacts";  		} -	} +	}*/  	itemp = communicate_button->addElement(contact_sd, ADD_TOP);  	communicate_button->addSeparator(ADD_TOP); @@ -290,7 +288,7 @@ void LLToolBar::updateCommunicateList()  	std::set<LLHandle<LLFloater> >::const_iterator floater_handle_it; -	if (gIMMgr->getIMFloaterHandles().size() > 0) +	/*if (gIMMgr->getIMFloaterHandles().size() > 0)  	{  		communicate_button->addSeparator(ADD_TOP);  	} @@ -316,7 +314,7 @@ void LLToolBar::updateCommunicateList()  			}  			itemp = communicate_button->addElement(im_sd, ADD_TOP);  		} -	} +	}*/  	communicate_button->setValue(selected);  } @@ -340,7 +338,7 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)  	}  	else if (selected_option.asString() == "redock")  	{ -		LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance(); +		/*LLFloaterChatterBox* chatterbox_instance = LLFloaterChatterBox::getInstance();  		if(chatterbox_instance)  		{  			chatterbox_instance->addFloater(LLFloaterMyFriends::getInstance(), FALSE); @@ -361,7 +359,7 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)  				}  			}  			LLFloaterReg::showInstance("communicate", session_to_show); -		} +		}*/  	}  	else if (selected_option.asString() == "mute list")  	{ @@ -369,11 +367,11 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, const LLSD& user_data)  	}  	else if (selected_option.isUndefined()) // user just clicked the communicate button, treat as toggle  	{ -		LLFloaterReg::toggleInstance("communicate"); +		/*LLFloaterReg::toggleInstance("communicate");*/  		}  	else // otherwise selection_option is undifined or a specific IM session id  	{ -		LLFloaterReg::showInstance("communicate", selected_option); +		/*LLFloaterReg::showInstance("communicate", selected_option);*/  	}  } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 57434bd1e4..64eabe65cf 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -63,7 +63,6 @@  #include "llviewerjoystick.h"  #include "llviewerparcelmgr.h"  #include "llparcel.h" -#include "lloverlaybar.h"  #include "llkeyboard.h"  #include "llerrorcontrol.h"  #include "llappviewer.h" @@ -257,35 +256,6 @@ static bool handleJoystickChanged(const LLSD& newvalue)  	return true;  } -static bool handleAudioStreamMusicChanged(const LLSD& newvalue) -{ -	if (gAudiop) -	{ -		if ( newvalue.asBoolean() ) -		{ -			if (LLViewerParcelMgr::getInstance()->getAgentParcel() -				&& !LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL().empty()) -			{ -				// if music isn't playing, start it -				if (gOverlayBar && !gOverlayBar->musicPlaying()) -				{ -					LLOverlayBar::toggleMusicPlay(NULL); -				} -			} -		} -		else -		{ -			// if music is playing, stop it. -			if (gOverlayBar && gOverlayBar->musicPlaying()) -				{ -					LLOverlayBar::toggleMusicPlay(NULL); -				} - -		} -	} -	return true; -} -  static bool handleUseOcclusionChanged(const LLSD& newvalue)  {  	LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery  @@ -592,7 +562,6 @@ void settings_setup_listeners()  	gSavedSettings.getControl("AudioLevelVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));  	gSavedSettings.getControl("AudioLevelDoppler")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));  	gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); -	gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _2));  	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));  	gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));  	gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2)); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index e87d380e4d..658d1c9ddd 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -54,7 +54,6 @@  #include "llfloaterbulkpermission.h"  #include "llfloaterbump.h"  #include "llfloatercamera.h" -#include "llfloaterchatterbox.h"  #include "llfloaterdaycycle.h"  #include "llfloatersearch.h"  #include "llfloaterenvsettings.h" @@ -69,7 +68,6 @@  #include "llfloaterhud.h"  #include "llfloaterimagepreview.h"  #include "llimfloater.h" -#include "llimpanel.h"  #include "llfloaterinspect.h"  #include "llfloaterinventory.h"  #include "llfloaterjoystick.h" @@ -116,7 +114,6 @@  #include "llinspectobject.h"  #include "llinspectremoteobject.h"  #include "llinspecttoast.h" -#include "llmediaremotectrl.h"  #include "llmoveview.h"  #include "llnearbychat.h"  #include "llpanelblockedlist.h" @@ -155,9 +152,8 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);  	//LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>);  	LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>); -	LLFloaterReg::add("communicate", "floater_chatterbox.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatterBox>); +  	LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>); -	LLFloaterReg::add("contacts", "floater_my_friends.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMyFriends>);	  	LLFloaterReg::add("env_day_cycle", "floater_day_cycle_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDayCycle>);  	LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>); @@ -265,8 +261,5 @@ void LLViewerFloaterReg::registerFloaters()  	// *NOTE: Please keep these alphabetized for easier merges -	// debug use only -	LLFloaterReg::add("media_remote_ctrl", "floater_media_remote.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaRemoteCtrl>); -  	LLFloaterReg::registerControlVariables(); // Make sure visibility and rect controls get preserved when saving  } diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index b330c1ba83..3001992630 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -34,6 +34,7 @@  #include "llviewerinventory.h"  #include "llnotificationsutil.h" +#include "llsdserialize.h"  #include "message.h"  #include "indra_constants.h" @@ -1171,81 +1172,196 @@ const std::string& LLViewerInventoryItem::getName() const  		return linked_category->getName();  	} -	return getDisplayName(); +	return  LLInventoryItem::getName();  } -const std::string& LLViewerInventoryItem::getDisplayName() const +/** + * Class to store sorting order of favorites landmarks in a local file. EXT-3985. + * It replaced previously implemented solution to store sort index in landmark's name as a "<N>@" prefix. + * Data are stored in user home directory. + */ +class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage> +	, public LLDestroyClass<LLFavoritesOrderStorage>  { -	std::string result; -	BOOL hasSortField = extractSortFieldAndDisplayName(0, &result); +public: +	/** +	 * Sets sort index for specified with LLUUID favorite landmark +	 */ +	void setSortIndex(const LLUUID& inv_item_id, S32 sort_index); + +	/** +	 * Gets sort index for specified with LLUUID favorite landmark +	 */ +	S32 getSortIndex(const LLUUID& inv_item_id); +	void removeSortIndex(const LLUUID& inv_item_id); + +	/** +	 * Implementation of LLDestroyClass. Calls cleanup() instance method. +	 * +	 * It is important this callback is called before gInventory is cleaned. +	 * For now it is called from LLAppViewer::cleanup() -> LLAppViewer::disconnectViewer(), +	 * Inventory is cleaned later from LLAppViewer::cleanup() after LLAppViewer::disconnectViewer() is called. +	 * @see cleanup() +	 */ +	static void destroyClass(); + +	const static S32 NO_INDEX; +private: +	friend class LLSingleton<LLFavoritesOrderStorage>; +	LLFavoritesOrderStorage() : mIsDirty(false) { load(); } +	~LLFavoritesOrderStorage() { save(); } + +	/** +	 * Removes sort indexes for items which are not in Favorites bar for now. +	 */ +	void cleanup(); + +	const static std::string SORTING_DATA_FILE_NAME; + +	void load(); +	void save(); + +	typedef std::map<LLUUID, S32> sort_index_map_t; +	sort_index_map_t mSortIndexes; + +	bool mIsDirty; + +	struct IsNotInFavorites +	{ +		IsNotInFavorites(const LLInventoryModel::item_array_t& items) +			: mFavoriteItems(items) +		{ -	return mDisplayName = hasSortField ? result : LLInventoryItem::getName(); -} +		} -// static -std::string LLViewerInventoryItem::getDisplayName(const std::string& name) -{ -	std::string result; -	BOOL hasSortField = extractSortFieldAndDisplayName(name, 0, &result); +		/** +		 * Returns true if specified item is not found among inventory items +		 */ +		bool operator()(const sort_index_map_t::value_type& id_index_pair) const +		{ +			LLPointer<LLViewerInventoryItem> item = gInventory.getItem(id_index_pair.first); +			if (item.isNull()) return true; -	return hasSortField ? result : name; -} +			LLInventoryModel::item_array_t::const_iterator found_it = +				std::find(mFavoriteItems.begin(), mFavoriteItems.end(), item); -S32 LLViewerInventoryItem::getSortField() const -{ -	S32 result; -	BOOL hasSortField = extractSortFieldAndDisplayName(&result, 0); +			return found_it == mFavoriteItems.end(); +		} +	private: +		LLInventoryModel::item_array_t mFavoriteItems; +	}; + +}; + +const std::string LLFavoritesOrderStorage::SORTING_DATA_FILE_NAME = "landmarks_sorting.xml"; +const S32 LLFavoritesOrderStorage::NO_INDEX = -1; -	return hasSortField ? result : -1; +void LLFavoritesOrderStorage::setSortIndex(const LLUUID& inv_item_id, S32 sort_index) +{ +	mSortIndexes[inv_item_id] = sort_index; +	mIsDirty = true;  } -void LLViewerInventoryItem::setSortField(S32 sortField) +S32 LLFavoritesOrderStorage::getSortIndex(const LLUUID& inv_item_id)  { -	using std::string; +	sort_index_map_t::const_iterator it = mSortIndexes.find(inv_item_id); +	if (it != mSortIndexes.end()) +	{ +		return it->second; +	} +	return NO_INDEX; +} -	std::stringstream ss; -	ss << sortField; +void LLFavoritesOrderStorage::removeSortIndex(const LLUUID& inv_item_id) +{ +	mSortIndexes.erase(inv_item_id); +	mIsDirty = true; +} -	string newSortField = ss.str(); +// static +void LLFavoritesOrderStorage::destroyClass() +{ +	LLFavoritesOrderStorage::instance().cleanup(); +} -	const char separator = getSeparator(); -	const string::size_type separatorPos = mName.find(separator, 0); +void LLFavoritesOrderStorage::load() +{ +	// load per-resident sorting information +	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); -	if (separatorPos < string::npos) +	LLSD settings_llsd; +	llifstream file; +	file.open(filename); +	if (file.is_open())  	{ -		// the name of the LLViewerInventoryItem already consists of sort field and display name. -		mName = newSortField + separator + mName.substr(separatorPos + 1, string::npos); +		LLSDSerialize::fromXML(settings_llsd, file);  	} -	else + +	for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); +		iter != settings_llsd.endMap(); ++iter)  	{ -		// there is no sort field in the name of LLViewerInventoryItem, we should add it -		mName = newSortField + separator + mName; +		mSortIndexes.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger()));  	}  } -void LLViewerInventoryItem::rename(const std::string& n) +void LLFavoritesOrderStorage::save()  { -	using std::string; +	// nothing to save if clean +	if (!mIsDirty) return; -	string new_name(n); -	LLStringUtil::replaceNonstandardASCII(new_name, ' '); -	LLStringUtil::replaceChar(new_name, '|', ' '); -	LLStringUtil::trim(new_name); -	LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN); +	// If we quit from the login screen we will not have an SL account +	// name.  Don't try to save, otherwise we'll dump a file in +	// C:\Program Files\SecondLife\ or similar. JC +	std::string user_dir = gDirUtilp->getLindenUserDir(); +	if (!user_dir.empty()) +	{ +		std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME); +		LLSD settings_llsd; -	const char separator = getSeparator(); -	const string::size_type separatorPos = mName.find(separator, 0); +		for(sort_index_map_t::const_iterator iter = mSortIndexes.begin(); iter != mSortIndexes.end(); ++iter) +		{ +			settings_llsd[iter->first.asString()] = iter->second; +		} -	if (separatorPos < string::npos) -	{ -		mName.replace(separatorPos + 1, string::npos, new_name); -	} -	else -	{ -		mName = new_name; +		llofstream file; +		file.open(filename); +		LLSDSerialize::toPrettyXML(settings_llsd, file);  	}  } +void LLFavoritesOrderStorage::cleanup() +{ +	// nothing to clean +	if (!mIsDirty) return; + +	const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH); + +	IsNotInFavorites is_not_in_fav(items); + +	sort_index_map_t  aTempMap; +	//copy unremoved values from mSortIndexes to aTempMap +	std::remove_copy_if(mSortIndexes.begin(), mSortIndexes.end(),  +		inserter(aTempMap, aTempMap.begin()), +		is_not_in_fav); + +	//Swap the contents of mSortIndexes and aTempMap +	mSortIndexes.swap(aTempMap); +} + + +S32 LLViewerInventoryItem::getSortField() const +{ +	return LLFavoritesOrderStorage::instance().getSortIndex(mUUID); +} + +void LLViewerInventoryItem::setSortField(S32 sortField) +{ +	LLFavoritesOrderStorage::instance().setSortIndex(mUUID, sortField); +} +  const LLPermissions& LLViewerInventoryItem::getPermissions() const  {  	// Use the actual permissions of the symlink, not its parent. @@ -1334,6 +1450,8 @@ U32 LLViewerInventoryItem::getCRC32() const  	return LLInventoryItem::getCRC32();	  } +// *TODO: mantipov: should be removed with LMSortPrefix patch in llinventorymodel.cpp, EXT-3985 +static char getSeparator() { return '@'; }  BOOL LLViewerInventoryItem::extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName)  {  	using std::string; @@ -1369,12 +1487,6 @@ BOOL LLViewerInventoryItem::extractSortFieldAndDisplayName(const std::string& na  	return result;  } -void LLViewerInventoryItem::insertDefaultSortField(std::string& name) -{ -	name.insert(0, std::string("1") + getSeparator()); -} - -  // This returns true if the item that this item points to   // doesn't exist in memory (i.e. LLInventoryModel).  The baseitem  // might still be in the database but just not loaded yet. diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 7f3f019b07..c24f76c87a 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -64,12 +64,8 @@ public:  	virtual LLAssetType::EType getType() const;  	virtual const LLUUID& getAssetUUID() const;  	virtual const std::string& getName() const; -	virtual const std::string& getDisplayName() const; -	static std::string getDisplayName(const std::string& name); -	static char getSeparator() { return '@'; }  	virtual S32 getSortField() const;  	virtual void setSortField(S32 sortField); -	virtual void rename(const std::string& new_name);  	virtual const LLPermissions& getPermissions() const;  	virtual const LLUUID& getCreatorUUID() const;  	virtual const std::string& getDescription() const; @@ -82,7 +78,6 @@ public:  	virtual U32 getCRC32() const; // really more of a checksum.  	static BOOL extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName); -	static void insertDefaultSortField(std::string& name);  	// construct a complete viewer inventory item  	LLViewerInventoryItem(const LLUUID& uuid, const LLUUID& parent_uuid, diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 96251f7571..f7f30a5136 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -53,7 +53,6 @@  #include "llfloaterbuycontents.h"  #include "llfloaterbuycurrency.h"  #include "llfloatercustomize.h" -#include "llfloaterchatterbox.h"  #include "llfloatergodtools.h"  #include "llfloaterinventory.h"  #include "llfloaterland.h" @@ -82,7 +81,6 @@  #include "llsidetray.h"  #include "llstatusbar.h"  #include "lltextureview.h" -#include "lltoolbar.h"  #include "lltoolcomp.h"  #include "lltoolmgr.h"  #include "lltoolpie.h" diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index f24fe07065..9240833632 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -630,7 +630,6 @@ bool join_group_response(const LLSD& notification, const LLSD& response)  			delete_context_data = FALSE;  			LLSD args;  			args["NAME"] = name; -			args["INVITE"] = message;  			LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification["payload"]);  		}  	} @@ -1435,31 +1434,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  	return false;  } -std::string get_display_name(const std::string& name) -{ -	// We receive landmark name as \'<n>@name\' where <n> is a number -	// LLViewerInventoryItem::getDisplayName will remove \'<n>@ though we need the \' -	// Lets save all chars preceding @ and insert them back after <n>@ was removed - -	std::string saved; - -	if(std::string::npos != name.find(LLViewerInventoryItem::getSeparator())) -	{ -		int n = 0; -		while(!isdigit(name[n]) && LLViewerInventoryItem::getSeparator() != name[n]) -		{ -			++n; -		} -		saved = name.substr(0, n); -	} - -	std::string d_name = LLViewerInventoryItem::getDisplayName(name); -	d_name.insert(0, saved); -	LLStringUtil::trim(d_name); - -	return d_name; -} -  void inventory_offer_handler(LLOfferInfo* info)  {  	//Until throttling is implmented, busy mode should reject inventory instead of silently @@ -1497,11 +1471,6 @@ void inventory_offer_handler(LLOfferInfo* info)  		LLStringUtil::truncate(msg, indx);  	} -	if(LLAssetType::AT_LANDMARK == info->mType) -	{ -		msg = get_display_name(msg); -	} -  	LLSD args;  	args["[OBJECTNAME]"] = msg; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index b3450a8f36..9d7ccd99c6 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -69,7 +69,6 @@  #include "llviewerparceloverlay.h"  #include "llviewerregion.h"  #include "llworld.h" -#include "lloverlaybar.h"  #include "roles_constants.h"  #include "llweb.h" @@ -1815,7 +1814,7 @@ void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void  	if (parcel_id != parcel->getLocalID())  	{ -		llwarns << "processParcelAccessListReply for parcel " << parcel_id +		LL_WARNS_ONCE("") << "processParcelAccessListReply for parcel " << parcel_id  			<< " which isn't the selected parcel " << parcel->getLocalID()<< llendl;  		return;  	} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8692cdcc57..cd6b9e2c50 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -101,7 +101,6 @@  #include "llfloaterbuildoptions.h"  #include "llfloaterbuyland.h"  #include "llfloatercamera.h" -#include "llfloaterchatterbox.h"  #include "llfloatercustomize.h"  #include "llfloaterland.h"  #include "llfloaterinspect.h" @@ -128,7 +127,6 @@  #include "llmorphview.h"  #include "llmoveview.h"  #include "llnavigationbar.h" -#include "lloverlaybar.h"  #include "llpreviewtexture.h"  #include "llprogressview.h"  #include "llresmgr.h" @@ -147,7 +145,6 @@  #include "lltexturefetch.h"  #include "lltextureview.h"  #include "lltool.h" -#include "lltoolbar.h"  #include "lltoolcomp.h"  #include "lltooldraganddrop.h"  #include "lltoolface.h" @@ -1463,10 +1460,6 @@ void LLViewerWindow::initWorldUI()  	bottom_tray_container->addChild(bottom_tray);  	bottom_tray_container->setVisible(TRUE); -	// Pre initialize instance communicate instance; -	//  currently needs to happen before initializing chat or IM -	LLFloaterReg::getInstance("communicate"); -  	LLRect morph_view_rect = full_window;  	morph_view_rect.stretch( -STATUS_BAR_HEIGHT );  	morph_view_rect.mTop = full_window.mTop - 32; diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 589999c026..9d49fb69d6 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -698,7 +698,11 @@ void LLVoiceChannelProximal::handleStatusChange(EStatusType status)  		// do not notify user when leaving proximal channel  		return;  	case STATUS_VOICE_DISABLED: -		LLCallInfoDialog::show("unavailable", mNotifyArgs); +		//skip showing "Voice not available at your current location" when agent voice is disabled (EXT-4749) +		if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()) +		{ +			LLCallInfoDialog::show("unavailable", mNotifyArgs); +		}  		return;  	default:  		break; diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index a0d42d9b5f..560c2ab469 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -72,8 +72,6 @@  #include "llvoavatarself.h"  #include "llvoicechannel.h" -#include "llfloaterfriends.h"  //VIVOX, inorder to refresh communicate panel -  // for base64 decoding  #include "apr_base64.h" diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 5636256856..d6a9837b86 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -38,7 +38,6 @@  #include "llassetstorage.h"  #include "llagent.h"  #include "llvoavatar.h" -#include "llviewerinventory.h"  #include "llviewerstats.h"  #include "llnotificationsutil.h"  #include "llinventorymodel.h" diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index d2e5473157..9aaa660574 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -12,7 +12,7 @@   can_minimize="true"   can_close="true"   visible="false" - width="360" + width="440"   can_resize="true"   min_width="250"   min_height="190"> @@ -20,7 +20,7 @@     animate="false"     follows="all"    height="320" -  width="360" +  width="440"    layout="topleft"    orientation="horizontal"    name="im_panels" @@ -38,7 +38,7 @@         left="0"         top="0"         height="200" -	     width="245" +	     width="325"         user_resize="true">          <button            height="20" @@ -65,7 +65,7 @@           parse_highlights="true"           allow_html="true"          left="1" -         width="240"> +         width="320">          </chat_history>          <line_editor           bottom="0" @@ -75,7 +75,7 @@           label="To"           layout="bottomleft"           name="chat_editor" -         width="240"> +         width="320">          </line_editor>      </layout_panel>    </layout_stack> diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml index d96f3c5494..649f0edff7 100644 --- a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml @@ -62,14 +62,4 @@           function="Gesture.EnableAction"           parameter="edit_gesture" />      </menu_item_call> -    <menu_item_call -     label="Inspect" -     layout="topleft" -     name="inspect"> -        <on_click -         function="Gesture.Action.ShowPreview" /> -        <on_enable -         function="Gesture.EnableAction" -         parameter="inspect" /> -    </menu_item_call>  </menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d3e08cad3a..636db2b59b 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2941,7 +2941,6 @@ Chat and instant messages will be hidden. Instant messages will get your Busy mo     type="alert">  You have reached your maximum number of groups. Please leave another group before joining this one, or decline the offer.  [NAME] has invited you to join a group as a member. -[INVITE]      <usetemplate       name="okcancelbuttons"       notext="Decline" @@ -5157,7 +5156,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th    <notification     icon="notify.tga"     name="OfferFriendship" -   type="alertmodal"> +   type="offer">  [NAME] is offering friendship.  [MESSAGE] @@ -5172,10 +5171,6 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th         index="1"         name="Decline"         text="Decline"/> -      <button -       index="2" -       name="Send IM" -       text="Send IM"/>      </form>    </notification> diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml index 39170b90ca..072ea882e6 100644 --- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml @@ -29,7 +29,7 @@       text_color="white"       top="5"       width="250"> -        Blocked List +        Block List       </text>      <scroll_list       follows="all" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 09ec2137b7..aad55685d2 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -87,7 +87,7 @@              image_name="spacer24.tga"              layout="topleft"              left="0" -            name="DUMMY" +            name="after_speak_panel"              min_width="3"              top="0"              width="3"/> @@ -127,7 +127,7 @@           layout="topleft"           left="0"           min_width="3" -         name="DUMMY" +         name="after_gesture_panel"           top="0"           width="3"/>          <layout_panel @@ -169,7 +169,7 @@           layout="topleft"           left="0"           min_width="3" -         name="DUMMY" +         name="after_movement_panel"           top="0"           width="3"/>          <layout_panel @@ -212,7 +212,7 @@           layout="topleft"           left="0"           min_width="3" -         name="DUMMY" +         name="after_cam_panel"           top="0"           width="3"/>          <layout_panel @@ -317,6 +317,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.           layout="topleft"           left="0"           min_width="4" +         name="DUMMY"           top="0"           width="5"/>          <layout_panel diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..6e9476f814 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + default_tab_group="2" + mouse_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + follows="left|bottom|right" + height="33" + layout="topleft" + left="0" + name="bottom_tray_lite" + tab_stop="true" + top="28" + chrome="true" + border_visible="false" + visible="false" + width="1000"> +    <layout_stack +     mouse_opaque="false" +     border_size="0" +     clip="false" +     follows="all" +     height="28" +     layout="topleft" +     left="0" +     name="toolbar_stack_lite" +     orientation="horizontal" +     top="0" +     width="1000"> +        <icon +         auto_resize="false" +         follows="left|right" +         height="10" +         image_name="spacer24.tga" +         layout="topleft" +         min_width="2" +         left="0" +         top="0" +         width="2" /> +        <layout_panel +         mouse_opaque="false" +         auto_resize="true" +         follows="left|right" +         height="28" +         layout="topleft" +         left="0" +         min_height="23" +         width="310" +         top="4" +         min_width="188" +         name="chat_bar" +         user_resize="false" +         filename="panel_nearby_chat_bar.xml" /> +        <layout_panel +         mouse_opaque="false" +         auto_resize="false" +         follows="right" +         height="28" +         layout="topleft" +         min_height="28" +         width="82" +         top_delta="0" +         min_width="52" +         name="gesture_panel" +         user_resize="false"> +            <gesture_combo_list +             follows="left|right" +             height="23" +             label="Gesture" +             layout="topleft" +             name="Gesture" +             left="0" +             top="5" +             width="82" +             tool_tip="Shows/hides gestures"> +                <gesture_combo_list.combo_button +                 pad_right="10" +                 use_ellipses="true" /> +            </gesture_combo_list> +        </layout_panel> +        <icon +         auto_resize="false" +         color="0 0 0 0" +         follows="left|right" +         height="10" +         image_name="spacer24.tga" +         layout="topleft" +         left="0" +         min_width="3" +         name="after_gesture_panel" +         top="0" +         width="3"/> +    </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index af73faf9a1..b903032ed5 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -42,17 +42,20 @@ Hover your mouse over the options for more help.       height="156"       layout="topleft"       left="0" -     right="-1"       name="visible_members"       top_pad="2">          <name_list.columns           label="Member"           name="name" -         relative_width="0.6" /> +         relative_width="0.4" />          <name_list.columns           label="Title"           name="title"           relative_width="0.4" /> +        <name_list.columns +         label="Status" +         name="status" +         relative_width="0.2" />        </name_list>           <text           follows="left|top|right" diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index 7204e57479..5a1bc32db0 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -35,6 +35,16 @@           name="avatar_icon"           top="3"           width="18" /> +        <group_icon +         follows="right" +         height="18" +         default_icon_name="Generic_Group" +         layout="topleft" +         left="3" +         mouse_opaque="false" +         name="group_icon" +         top="3" +         width="18" />          <!--<icon           follows="right"           height="20" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index a0fcf59fc8..82821a1dfe 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -707,7 +707,8 @@              top_delta="16"              width="315" />          </radio_group> -	</panel>	 +	</panel> +	          <button       follows="left|bottom"       height="23" @@ -717,7 +718,8 @@       left="10"       name="Apply"       top="383" -     width="115"> +     width="115" +      >          <button.commit_callback           function="Pref.Apply" />      </button> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 0aaeb6114e..f7e3ede93c 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -174,8 +174,7 @@      </text>          <line_editor       bottom="366" -     control_name="InstantMessageLogFolder" -     enabled="false" +     control_name="InstantMessageLogPath"       follows="top|left|right"       halign="right"       height="23" | 
