diff options
92 files changed, 895 insertions, 691 deletions
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index 528a7bb4a5..40a9752268 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -181,16 +181,18 @@ void LLCharacter::requestStopMotion( LLMotion* motion)  // updateMotions()  //-----------------------------------------------------------------------------  static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation"); +static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim");  void LLCharacter::updateMotions(e_update_t update_type)  { -	LLFastTimer t(FTM_UPDATE_ANIMATION);  	if (update_type == HIDDEN_UPDATE)  	{ +		LLFastTimer t(FTM_UPDATE_HIDDEN_ANIMATION);  		mMotionController.updateMotionsMinimal();  	}  	else  	{ +		LLFastTimer t(FTM_UPDATE_ANIMATION);  		// unpause if the number of outstanding pause requests has dropped to the initial one  		if (mMotionController.isPaused() && mPauseRequest->getNumRefs() == 1)  		{ diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 0237c80efa..a4f69e7ac1 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -244,23 +244,6 @@ void LLConsole::draw()  	}  } -void LLConsole::addLine(const std::string& utf8line) -{ -	LLWString wline = utf8str_to_wstring(utf8line); -	addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f)); -} - -void LLConsole::addLine(const LLWString& wline) -{ -	addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f)); -} - -void LLConsole::addLine(const std::string& utf8line, F32 size, const LLColor4 &color) -{ -	LLWString wline = utf8str_to_wstring(utf8line); -	addLine(wline, size, color); -} -  //Generate highlight color segments for this paragraph.  Pass in default color of paragraph.  void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color)   { @@ -383,21 +366,45 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b  //Pass in the string and the default color for this block of text.  LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width)  -						: mParagraphText(str), mAddTime(add_time), mMaxWidth(-1) +:	mParagraphText(str), mAddTime(add_time), mMaxWidth(-1)  {  	makeParagraphColorSegments(color);  	updateLines( screen_width, font );  } -void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color) +// called once per frame regardless of console visibility +// static +void LLConsole::updateClass()  {	 -	Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont,  (F32)getRect().getWidth() ); -	 -	mParagraphs.push_back ( paragraph ); +	LLInstanceTrackerScopedGuard guard; + +	for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it) +	{ +		it->update(); +	}  +} + +void LLConsole::update() +{ +	{ +		LLMutexLock lock(&mMutex); + +		while (!mLines.empty()) +		{ +			mParagraphs.push_back( +				Paragraph(	mLines.front(),  +							LLColor4::white,  +							mTimer.getElapsedTimeF32(),  +							mFont,  +							(F32)getRect().getWidth())); +			mLines.pop_front(); +		} +	}  	// remove old paragraphs which can't possibly be visible any more.  ::draw() will do something similar but more conservative - we do this here because ::draw() isn't guaranteed to ever be called!  (i.e. the console isn't visible) -        while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines))) -        { -                mParagraphs.pop_front(); -        } +	while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines))) +	{ +			mParagraphs.pop_front(); +	}  } + diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h index 4719950f28..f38e2bc9c2 100644 --- a/indra/llui/llconsole.h +++ b/indra/llui/llconsole.h @@ -40,7 +40,7 @@  class LLSD; -class LLConsole : public LLFixedBuffer, public LLUICtrl +class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker<LLConsole>  {  public:  	typedef enum e_font_size @@ -68,6 +68,9 @@ protected:  	friend class LLUICtrlFactory;  public: +	// call once per frame to pull data out of LLFixedBuffer +	static void updateClass(); +  	//A paragraph color segment defines the color of text in a line   	//of text that was received for console display.  It has no   	//notion of line wraps, screen position, or the text it contains. @@ -139,14 +142,12 @@ public:  	// -1 = monospace, 0 means small, font size = 1 means big  	void			setFontSize(S32 size_index); -	void			addLine(const std::string& utf8line, F32 size, const LLColor4 &color); -	void			addLine(const LLWString& wline, F32 size, const LLColor4 &color);  	// Overrides  	/*virtual*/ void	draw(); -	/*virtual*/ void	addLine(const std::string& utf8line); -	/*virtual*/ void	addLine(const LLWString& line);  private: +	void		update(); +  	F32			mLinePersistTime; // Age at which to stop drawing.  	F32			mFadeTime; // Age at which to start fading  	const LLFontGL*	mFont; diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index 57baf28dab..a94f0206a6 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -223,10 +223,10 @@ void LLDockableFloater::draw()  	LLFloater::draw();  } -void LLDockableFloater::setDockControl(LLDockControl* dockControl) +void LLDockableFloater::setDockControl(LLDockControl* dockControl, bool docked /* = true */)  {  	mDockControl.reset(dockControl); -	setDocked(mDockControl.get() != NULL && mDockControl.get()->isDockVisible()); +	setDocked(docked && mDockControl.get() != NULL && mDockControl.get()->isDockVisible());  }  const LLUIImagePtr& LLDockableFloater::getDockTongue() diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h index 2b1ce99ae2..4d747390af 100644 --- a/indra/llui/lldockablefloater.h +++ b/indra/llui/lldockablefloater.h @@ -127,7 +127,7 @@ private:  	void resetInstance();  protected: -	void setDockControl(LLDockControl* dockControl); +	void setDockControl(LLDockControl* dockControl, bool docked = true);  	const LLUIImagePtr& getDockTongue();  private: diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index cb81c39103..50942e55ca 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -331,6 +331,10 @@ void LLMultiSliderCtrl::updateText()  void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)  {  	LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent()); +	llassert(self); +	if (!self) // cast failed - wrong type! :O +		return; +  	if (!ctrl)  		return; diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp index 6fa99df82e..491eeeab54 100644 --- a/indra/llui/llsearcheditor.cpp +++ b/indra/llui/llsearcheditor.cpp @@ -60,6 +60,7 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)  	line_editor_params.keystroke_callback(boost::bind(&LLSearchEditor::handleKeystroke, this));  	mSearchEditor = LLUICtrlFactory::create<LLLineEditor>(line_editor_params); +	mSearchEditor->setPassDelete(TRUE);  	addChild(mSearchEditor);  	if (p.search_button_visible) @@ -79,10 +80,12 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)  	if (p.clear_button_visible)  	{  		// Set up clear button. -		S32 clr_btn_width = getRect().getHeight(); // button is square, and as tall as search editor -		LLRect clear_btn_rect(getRect().getWidth() - clr_btn_width, getRect().getHeight(), getRect().getWidth(), 0);  		LLButton::Params clr_btn_params(p.clear_button);  		clr_btn_params.name(std::string("clear button")); +		S32 clr_btn_top = clr_btn_params.rect.bottom + clr_btn_params.rect.height; +		S32 clr_btn_right = getRect().getWidth() - clr_btn_params.pad_right; +		S32 clr_btn_left = clr_btn_right - clr_btn_params.rect.width; +		LLRect clear_btn_rect(clr_btn_left, clr_btn_top, clr_btn_right, p.clear_button.rect.bottom);  		clr_btn_params.rect(clear_btn_rect) ;  		clr_btn_params.follows.flags(FOLLOWS_RIGHT|FOLLOWS_TOP);  		clr_btn_params.tab_stop(false); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index fe699cfa01..13340e7ded 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -1631,14 +1631,9 @@ void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon)  void LLTabContainer::reshapeTuple(LLTabTuple* tuple)  {  	static LLUICachedControl<S32> tab_padding ("UITabPadding", 0); -	static LLUICachedControl<S32> image_top_padding ("UIButtonImageTopPadding", 2); -	static LLUICachedControl<S32> image_bottom_padding ("UIButtonImageBottomPadding", 2);  	if (!mIsVertical)  	{ -		tuple->mButton->setImageOverlayTopPad(image_top_padding); -		tuple->mButton->setImageOverlayBottomPad(image_bottom_padding); -  		// remove current width from total tab strip width  		mTotalTabWidth -= tuple->mButton->getRect().getWidth(); diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp index 3b8bbbe805..4ba41db2fc 100644 --- a/indra/lscript/lscript_compile/lscript_tree.cpp +++ b/indra/lscript/lscript_compile/lscript_tree.cpp @@ -10626,6 +10626,8 @@ LLScriptScript::LLScriptScript(LLScritpGlobalStorage *globals,  		}  		temp = temp->mNextp;  	} + +	mClassName[0] = '\0';  }  void LLScriptScript::setBytecodeDest(const char* dst_filename) diff --git a/indra/lscript/lscript_compile/lscript_tree.h b/indra/lscript/lscript_compile/lscript_tree.h index a667e1eb5b..7de9606dfc 100644 --- a/indra/lscript/lscript_compile/lscript_tree.h +++ b/indra/lscript/lscript_compile/lscript_tree.h @@ -1876,7 +1876,7 @@ class LLScriptStateChange : public LLScriptStatement  {  public:  	LLScriptStateChange(S32 line, S32 col, LLScriptIdentifier *identifier) -		: LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier) +		: LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier), mReturnType(LST_NULL)  	{  	} @@ -2210,7 +2210,7 @@ class LLScriptState : public LLScriptFilePosition  {  public:  	LLScriptState(S32 line, S32 col, LSCRIPTStateType type, LLScriptIdentifier *identifier, LLScriptEventHandler *event) -		: LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL) +		: LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL), mStateScope(NULL)  	{  	} diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index db4e0b5afd..d0c2f3cb34 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8456,6 +8456,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>ShowVoiceVisualizersInCalls</key> +    <map> +      <key>Comment</key> +      <string>Enables in-world voice visualizers, voice gestures and lip-sync while in group or P2P calls.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowVolumeSettingsPopup</key>      <map>        <key>Comment</key> @@ -9949,28 +9960,6 @@        <key>Value</key>        <integer>15</integer>      </map> -    <key>UIButtonImageTopPadding</key> -    <map> -      <key>Comment</key> -      <string>Button Overlay Image Top Padding</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>2</integer> -    </map> -    <key>UIButtonImageBottomPadding</key> -    <map> -      <key>Comment</key> -      <string>Button Overlay Image Bottom Padding</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>S32</string> -      <key>Value</key> -      <integer>2</integer> -    </map>  	<key>UploadBakedTexOld</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 59f61dfdfb..7929946620 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -5027,9 +5027,9 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const  	}  } -BOOL LLAgent::isInGroup(const LLUUID& group_id) const +BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod /* FALSE */) const  { -	if (isGodlike()) +	if (!ingnore_God_mod && isGodlike())  		return true;  	S32 count = mGroups.count(); diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index beede7fbe3..1573fd7131 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -982,7 +982,7 @@ private:  	//--------------------------------------------------------------------  public:  	// Checks against all groups in the entire agent group list. -	BOOL 			isInGroup(const LLUUID& group_id) const; +	BOOL 			isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const;  protected:  	// Only used for building titles.  	BOOL			isGroupMember() const 		{ return !mGroupID.isNull(); }  diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 7404fe5bc4..72ab9235cf 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -150,11 +150,17 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const  				sim_access_string.c_str());  			break;  		case LOCATION_FORMAT_NO_MATURITY: -		case LOCATION_FORMAT_FULL:  			buffer = llformat("%s (%d, %d, %d)",  				region_name.c_str(),  				pos_x, pos_y, pos_z);  			break; +		case LOCATION_FORMAT_FULL: +			buffer = llformat("%s (%d, %d, %d)%s%s", +				region_name.c_str(), +				pos_x, pos_y, pos_z, +				sim_access_string.empty() ? "" : " - ", +				sim_access_string.c_str()); +			break;  		}  	}  	else diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 9ff5de29c3..68ee9cd612 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -299,6 +299,10 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i  	{  		gAgentWearables.makeNewOutfitDone(mType, mIndex);  	} +	if (mTodo & CALL_WEARITEM) +	{ +		LLAppearanceManager::instance().addCOFItemLink(inv_item, true); +	}  }  void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type, @@ -510,7 +514,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,  			type,  			index,  			new_wearable, -			addWearableToAgentInventoryCallback::CALL_UPDATE); +			addWearableToAgentInventoryCallback::CALL_WEARITEM);  	LLUUID category_id;  	if (save_in_lost_and_found)  	{ @@ -1290,25 +1294,29 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,  							j,  							new_wearable,  							todo); -					if (isWearableCopyable((EWearableType)type, j)) -					{ -						copy_inventory_item( -							gAgent.getID(), -							item->getPermissions().getOwner(), -							item->getUUID(), -							folder_id, -							new_name, -							cb); -					} -					else +					llassert(item); +					if (item)  					{ -						move_inventory_item( -							gAgent.getID(), -							gAgent.getSessionID(), -							item->getUUID(), -							folder_id, -							new_name, -							cb); +						if (isWearableCopyable((EWearableType)type, j)) +						{ +							copy_inventory_item( +									    gAgent.getID(), +									    item->getPermissions().getOwner(), +									    item->getUUID(), +									    folder_id, +									    new_name, +									    cb); +						} +						else +						{ +							move_inventory_item( +									    gAgent.getID(), +									    gAgent.getSessionID(), +									    item->getUUID(), +									    folder_id, +									    new_name, +									    cb); +						}  					}  				}  			} @@ -1597,31 +1605,32 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it  		LLWearable* new_wearable = wearables[i];  		LLPointer<LLInventoryItem> new_item = items[i]; -		const EWearableType type = new_wearable->getType(); -		wearables_to_remove[type] = FALSE; - -		// MULTI_WEARABLE: using 0th -		LLWearable* old_wearable = getWearable(type, 0); -		if (old_wearable) +		llassert(new_wearable); +		if (new_wearable)  		{ -			const LLUUID& old_item_id = getWearableItemID(type, 0); -			if ((old_wearable->getAssetID() == new_wearable->getAssetID()) && -				(old_item_id == new_item->getUUID())) -			{ -				lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl; -				continue; -			} +			const EWearableType type = new_wearable->getType(); +			wearables_to_remove[type] = FALSE; -			// Assumes existing wearables are not dirty. -			if (old_wearable->isDirty()) +			// MULTI_WEARABLE: using 0th +			LLWearable* old_wearable = getWearable(type, 0); +			if (old_wearable)  			{ -				llassert(0); -				continue; +				const LLUUID& old_item_id = getWearableItemID(type, 0); +				if ((old_wearable->getAssetID() == new_wearable->getAssetID()) && +				    (old_item_id == new_item->getUUID())) +				{ +					lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl; +					continue; +				} +				 +				// Assumes existing wearables are not dirty. +				if (old_wearable->isDirty()) +				{ +					llassert(0); +					continue; +				}  			} -		} -		if (new_wearable) -		{  			new_wearable->setItemID(new_item->getUUID());  			setWearable(type,0,new_wearable);  		} diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index b4f58674af..858540a5f5 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -244,7 +244,8 @@ private:  			CALL_UPDATE = 1,  			CALL_RECOVERDONE = 2,  			CALL_CREATESTANDARDDONE = 4, -			CALL_MAKENEWOUTFITDONE = 8 +			CALL_MAKENEWOUTFITDONE = 8, +			CALL_WEARITEM = 16  		};  		// MULTI-WEARABLE: index is an EWearableType - more confusing usage. diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 062e291161..eb4a47664b 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -676,6 +676,11 @@ void LLAppearanceManager::filterWearableItems(  		if (!item->isWearableType())  			continue;  		EWearableType type = item->getWearableType(); +		if(type < 0 || type >= WT_COUNT) +		{ +			LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL; +			continue; +		}  		items_by_type[type].push_back(item);  	} diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index 0aaaa8e705..76e058a1c3 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -304,7 +304,9 @@ void LLCallFloater::updateSession()  	updateAgentModeratorState();  	//show floater for voice calls & only in CONNECTED to voice channel state -	if (!is_local_chat && LLVoiceChannel::STATE_CONNECTED == voice_channel->getState()) +	if (!is_local_chat && +	    voice_channel && +	    LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())  	{  		LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);  		bool show_me = !(im_floater && im_floater->getVisible()); @@ -333,6 +335,7 @@ void LLCallFloater::refreshParticipantList()  	{  		mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT);  		mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1)); +		mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS);  		if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)  		{ diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 996139fccc..c3bda26aac 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -63,6 +63,7 @@  #include "llviewerobjectlist.h"  #include "llviewerwindow.h"  #include "llvoavatar.h" +#include "llavataractions.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs @@ -711,7 +712,21 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)  		if(notify)  		{  			// Popup a notify box with online status of this agent -			LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args); +			LLNotificationPtr notification; + +			if (online) +			{ +				notification = +					LLNotificationsUtil::add("FriendOnline", +											 args, +											 LLSD().with("respond_on_mousedown", TRUE), +											 boost::bind(&LLAvatarActions::startIM, agent_id)); +			} +			else +			{ +				notification = +					LLNotificationsUtil::add("FriendOffline", args); +			}  			// If there's an open IM session with this agent, send a notification there too.  			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id); diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 13a5df353d..9368d9cb7c 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -66,6 +66,8 @@ static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");  const static std::string NEW_LINE(rawstr_to_utf8("\n")); +const static U32 LENGTH_OF_TIME_STR = std::string("12:00").length(); +  // support for secondlife:///app/objectim/{UUID}/ SLapps  class LLObjectIMHandler : public LLCommandHandler  { @@ -257,7 +259,9 @@ public:  		mSessionID = chat.mSessionID;  		mSourceType = chat.mSourceType;  		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4)); -		if(chat.mFromID.isNull()) + +		//*TODO overly defensive thing, source type should be maintained out there +		if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM)  		{  			mSourceType = CHAT_SOURCE_SYSTEM;  		} @@ -267,17 +271,13 @@ public:  		userName->setReadOnlyColor(style_params.readonly_color());  		userName->setColor(style_params.color()); -		if(!chat.mFromName.empty()) -		{ -			userName->setValue(chat.mFromName); -			mFrom = chat.mFromName; -		} -		else +		userName->setValue(chat.mFromName); +		if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)  		{ -			std::string SL = LLTrans::getString("SECOND_LIFE"); -			userName->setValue(SL); +			userName->setValue(LLTrans::getString("SECOND_LIFE"));  		} +  		mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;  		setTimeField(chat); @@ -287,20 +287,17 @@ public:  		if(mSourceType != CHAT_SOURCE_AGENT)  			icon->setDrawTooltip(false); -		if(!chat.mFromID.isNull()) +		switch (mSourceType)  		{ -			if(mSourceType != CHAT_SOURCE_AGENT) -				icon->setValue(LLSD("OBJECT_Icon")); -			else +			case CHAT_SOURCE_AGENT:  				icon->setValue(chat.mFromID); - -			 -		} -		else if (userName->getValue().asString()==LLTrans::getString("SECOND_LIFE")) -		{ -			icon->setValue(LLSD("SL_Logo")); +				break; +			case CHAT_SOURCE_OBJECT: +				icon->setValue(LLSD("OBJECT_Icon")); +				break; +			case CHAT_SOURCE_SYSTEM: +				icon->setValue(LLSD("SL_Logo"));  		} -  	}  	/*virtual*/ void draw() @@ -544,6 +541,7 @@ void LLChatHistory::clear()  void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params)  {  	bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean(); +  	if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())  	{  		mUnreadChatSources.insert(chat.mFromName); @@ -609,6 +607,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  		style_params.font.style = "ITALIC";  	} +	//*HACK we graying out chat history by graying out messages that contains full date in a time string +	bool message_from_log = chat.mTimeStr.length() > LENGTH_OF_TIME_STR;  +	if (message_from_log) +	{ +		style_params.color(LLColor4::grey); +		style_params.readonly_color(LLColor4::grey); +	} +  	if (use_plain_text_chat_history)  	{  		mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params); @@ -644,10 +650,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  				mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>"  + delimiter,  									false, link_params);  			} -			else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() ) +			else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)  			{  				LLStyle::Params link_params(style_params); -				link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); +				link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));  				// Convert the name to a hotlink and add to message.  				mEditor->appendText(chat.mFromName + delimiter, false, link_params);  			} diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index d12fd48ffb..80acc71a41 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -182,6 +182,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)  	mAtlasInfop = NULL ;  	mUsingAtlas  = FALSE ; +	mHasMedia = FALSE ;  } @@ -1327,17 +1328,33 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	return TRUE;  } +//check if the face has a media +BOOL LLFace::hasMedia() const  +{ +	if(mHasMedia) +	{ +		return TRUE ; +	} +	if(mTexture.notNull())  +	{ +		return mTexture->hasParcelMedia() ;  //if has a parcel media +	} + +	return FALSE ; //no media. +} +  const F32 LEAST_IMPORTANCE = 0.05f ;  const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;  F32 LLFace::getTextureVirtualSize()  {  	F32 radius; -	F32 cos_angle_to_view_dir; -	mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius); +	F32 cos_angle_to_view_dir;	 +	BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius); -	if (mPixelArea <= 0) +	if (mPixelArea < 0.0001f || !in_frustum)  	{ +		setVirtualSize(0.f) ;  		return 0.f;  	} @@ -1374,23 +1391,48 @@ F32 LLFace::getTextureVirtualSize()  		}  	} +	setVirtualSize(face_area) ; +  	return face_area;  } -F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) +BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)  {  	//get area of circle around face  	LLVector3 center = getPositionAgent(); -	LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f; -	 +	LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;	  	LLViewerCamera* camera = LLViewerCamera::getInstance(); + +	F32 size_squared = size.lengthSquared() ;  	LLVector3 lookAt = center - camera->getOrigin(); -	F32 dist = lookAt.normVec() ; +	F32 dist = lookAt.normVec() ;	  	//get area of circle around node -	F32 app_angle = atanf(size.length()/dist); +	F32 app_angle = atanf(fsqrtf(size_squared) / dist);  	radius = app_angle*LLDrawable::sCurPixelAngle; -	F32 face_area = radius*radius * 3.14159f; +	mPixelArea = radius*radius * 3.14159f; +	cos_angle_to_view_dir = lookAt * camera->getXAxis() ; + +	//if has media, check if the face is out of the view frustum.	 +	if(hasMedia()) +	{ +		if(!camera->AABBInFrustum(center, size))  +		{ +			mImportanceToCamera = 0.f ; +			return false ; +		} +		if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum +		{ +			cos_angle_to_view_dir = 1.0f ; +		} +		else +		{		 +			if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared) +			{ +				cos_angle_to_view_dir = 1.0f ; +			} +		} +	}  	if(dist < mBoundingSphereRadius) //camera is very close  	{ @@ -1398,12 +1440,11 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)  		mImportanceToCamera = 1.0f ;  	}  	else -	{ -		cos_angle_to_view_dir = lookAt * camera->getXAxis() ;	 +	{		  		mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;  	} -	return face_area ; +	return true ;  }  //the projection of the face partially overlaps with the screen diff --git a/indra/newview/llface.h b/indra/newview/llface.h index e12b64a2f2..67dd97e6f7 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -194,6 +194,9 @@ public:  	F32         getTextureVirtualSize() ;  	F32         getImportanceToCamera()const {return mImportanceToCamera ;} +	void        setHasMedia(bool has_media)  { mHasMedia = has_media ;} +	BOOL        hasMedia() const ; +  	//for atlas  	LLTextureAtlasSlot*   getAtlasInfo() ;  	void                  setAtlasInUse(BOOL flag); @@ -208,7 +211,7 @@ public:  private:	  	F32         adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius ); -	F32         calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ; +	BOOL        calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;  public:  	static F32  calcImportanceToCamera(F32 to_view_dir, F32 dist); @@ -262,7 +265,7 @@ private:  	//based on the distance from the face to the view point and the angle from the face center to the view direction.  	F32         mImportanceToCamera ;   	F32         mBoundingSphereRadius ; - +	bool        mHasMedia ;  	//atlas  	LLPointer<LLTextureAtlasSlot> mAtlasInfop ; diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 1e8a739d78..bf7c735488 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -1264,8 +1264,11 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn  void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)  {  	LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId); - -	items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem); +	llassert(beforeItem); +	if (beforeItem) +	{ +		items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem); +	}  }  // EOF diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index fb724f30e0..fbb90c69f3 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -287,6 +287,7 @@ BOOL LLFeatureManager::loadFeatureTables()  			if (!flp)  			{  				LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL; +				return FALSE;  			}  			S32 available;  			F32 recommended; diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index b684e1f985..9c1ac2631d 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -203,12 +203,12 @@ BOOL LLFloaterGesture::postBuild()  	gInventory.addObserver(this);  	fetchDescendents(folders); -	buildGestureList(); -	 -	mGestureList->setFocus(TRUE); -  	if (mGestureList)  	{ +		buildGestureList(); +	 +		mGestureList->setFocus(TRUE); +  		const BOOL ascending = TRUE;  		mGestureList->sortByColumn(std::string("name"), ascending);  		mGestureList->selectFirstItem(); @@ -223,10 +223,10 @@ BOOL LLFloaterGesture::postBuild()  void LLFloaterGesture::refreshAll()  { -	buildGestureList(); -  	if (!mGestureList) return; +	buildGestureList(); +  	if (mSelectedID.isNull())  	{  		mGestureList->selectFirstItem(); @@ -427,8 +427,13 @@ void LLFloaterGesture::onClickPlay()  		BOOL inform_server = TRUE;  		BOOL deactivate_similar = FALSE;  		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id)); -		LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar); -		LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL; +		LLViewerInventoryItem *item = gInventory.getItem(item_id); +		llassert(item); +		if (item) +		{ +			LLGestureManager::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar); +			LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL; +		}  	}  	else  	{ @@ -510,15 +515,16 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)  		if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))  			return;  		LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID); +		llassert(gesture_dir);  		LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);  		for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)  		{  			LLInventoryItem* item = gInventory.getItem(*it); -			LLStringUtil::format_map_t string_args; -			string_args["[COPY_NAME]"] = item->getName(); -			if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE) +			if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE)  			{ +				LLStringUtil::format_map_t string_args; +				string_args["[COPY_NAME]"] = item->getName();  				LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << "  "<< item->getUUID() << " into "  										<< gesture_dir->getName() << "  "<< gesture_dir->getUUID() << LL_ENDL;  				copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(),  diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index 90db8988b2..94b5ebba00 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -112,10 +112,15 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data)  {  	LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;  	if (!self) return; -	void* data = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected()->getUserdata(); -	if (data) +	LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected(); +	llassert(firstselected); +	if (firstselected)  	{ -		gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); +		void* data = firstselected->getUserdata(); +		if (data) +		{ +			gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); +		}  	}  } @@ -124,10 +129,15 @@ void LLNotificationChannelPanel::onClickNotificationReject(void* user_data)  {  	LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;  	if (!self) return; -	void* data = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected()->getUserdata(); -	if (data) +	LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected(); +	llassert(firstselected); +	if (firstselected)  	{ -		gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); +		void* data = firstselected->getUserdata(); +		if (data) +		{ +			gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); +		}  	}  } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 3c9f7492a2..43111d76f7 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -110,8 +110,6 @@  const F32 MAX_USER_FAR_CLIP = 512.f;  const F32 MIN_USER_FAR_CLIP = 64.f; -const S32 ASPECT_RATIO_STR_LEN = 100; -  class LLVoiceSetKeyDialog : public LLModalDialog  {  public: @@ -283,7 +281,6 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator)  }  // static  std::string LLFloaterPreference::sSkin = ""; -F32 LLFloaterPreference::sAspectRatio = 0.0;  //////////////////////////////////////////////  // LLFloaterPreference @@ -324,11 +321,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)  	mCommitCallbackRegistrar.add("Pref.VertexShaderEnable",     boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));	  	mCommitCallbackRegistrar.add("Pref.WindowedMod",            boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));	  	mCommitCallbackRegistrar.add("Pref.UpdateSliderText",       boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));	 -	mCommitCallbackRegistrar.add("Pref.AutoDetectAspect",       boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));	  	mCommitCallbackRegistrar.add("Pref.ParcelMediaAutoPlayEnable",       boost::bind(&LLFloaterPreference::onCommitParcelMediaAutoPlayEnable, this));	  	mCommitCallbackRegistrar.add("Pref.MediaEnabled",           boost::bind(&LLFloaterPreference::onCommitMediaEnabled, this));	  	mCommitCallbackRegistrar.add("Pref.MusicEnabled",           boost::bind(&LLFloaterPreference::onCommitMusicEnabled, this));	 -	mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio",    boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));	  	mCommitCallbackRegistrar.add("Pref.QualityPerformance",     boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));	  	mCommitCallbackRegistrar.add("Pref.applyUIColor",			boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));  	mCommitCallbackRegistrar.add("Pref.getUIColor",				boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2)); @@ -359,12 +354,7 @@ BOOL LLFloaterPreference::postBuild()  LLFloaterPreference::~LLFloaterPreference()  {  	// clean up user data -	LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");  	LLComboBox* ctrl_window_size = getChild<LLComboBox>("windowsize combo"); -	for (S32 i = 0; i < ctrl_aspect_ratio->getItemCount(); i++) -	{ -		ctrl_aspect_ratio->setCurrentByIndex(i); -	}  	for (S32 i = 0; i < ctrl_window_size->getItemCount(); i++)  	{  		ctrl_window_size->setCurrentByIndex(i); @@ -514,8 +504,6 @@ void LLFloaterPreference::cancel()  	LLFloaterReg::hideInstance("pref_voicedevicesettings"); -	gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio); -  }  void LLFloaterPreference::onOpen(const LLSD& key) @@ -968,37 +956,6 @@ void LLFloaterPreference::disableUnavailableSettings()  	}  } -void LLFloaterPreference::onCommitAutoDetectAspect() -{ -	BOOL auto_detect = getChild<LLCheckBoxCtrl>("aspect_auto_detect")->get(); -	F32 ratio; -	 -	if (auto_detect) -	{ -		S32 numerator = 0; -		S32 denominator = 0; -		 -		// clear any aspect ratio override -		gViewerWindow->mWindow->setNativeAspectRatio(0.f); -		fractionFromDecimal(gViewerWindow->mWindow->getNativeAspectRatio(), numerator, denominator); -		 -		std::string aspect; -		if (numerator != 0) -		{ -			aspect = llformat("%d:%d", numerator, denominator); -		} -		else -		{ -			aspect = llformat("%.3f", gViewerWindow->mWindow->getNativeAspectRatio()); -		} -		 -		getChild<LLComboBox>( "aspect_ratio")->setLabel(aspect); -		 -		ratio = gViewerWindow->mWindow->getNativeAspectRatio(); -		gSavedSettings.setF32("FullScreenAspectRatio", ratio); -	} -} -  void LLFloaterPreference::onCommitParcelMediaAutoPlayEnable()  {  	BOOL autoplay = getChild<LLCheckBoxCtrl>("autoplay_enabled")->get(); @@ -1266,56 +1223,9 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b  	}  } -void LLFloaterPreference::onKeystrokeAspectRatio() -{ -	getChild<LLCheckBoxCtrl>("aspect_auto_detect")->set(FALSE); -} -  void LLFloaterPreference::applyResolution()  { -	LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");  	gGL.flush(); -	char aspect_ratio_text[ASPECT_RATIO_STR_LEN];		/*Flawfinder: ignore*/ -	if (ctrl_aspect_ratio->getCurrentIndex() == -1) -	{ -		// *Can't pass const char* from c_str() into strtok -		strncpy(aspect_ratio_text, ctrl_aspect_ratio->getSimple().c_str(), sizeof(aspect_ratio_text) -1);	/*Flawfinder: ignore*/ -		aspect_ratio_text[sizeof(aspect_ratio_text) -1] = '\0'; -		char *element = strtok(aspect_ratio_text, ":/\\"); -		if (!element) -		{ -			sAspectRatio = 0.f; // will be clamped later -		} -		else -		{ -			LLLocale locale(LLLocale::USER_LOCALE); -			sAspectRatio = (F32)atof(element); -		} -		 -		// look for denominator -		element = strtok(NULL, ":/\\"); -		if (element) -		{ -			LLLocale locale(LLLocale::USER_LOCALE); -			 -			F32 denominator = (F32)atof(element); -			if (denominator != 0.f) -			{ -				sAspectRatio /= denominator; -			} -		} -	} -	else -	{ -		sAspectRatio = (F32)ctrl_aspect_ratio->getValue().asReal(); -	} -	 -	// presumably, user entered a non-numeric value if aspect_ratio == 0.f -	if (sAspectRatio != 0.f) -	{ -		sAspectRatio = llclamp(sAspectRatio, 0.2f, 5.f); -		gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio); -	}  	// Screen resolution  	S32 num_resolutions; @@ -1393,48 +1303,6 @@ BOOL LLPanelPreference::postBuild()  		childSetText("email_address",getString("log_in_to_change") );  //		childSetText("busy_response", getString("log_in_to_change"));		  	} - - -	if(hasChild("aspect_ratio")) -	{ -		// We used to set up fullscreen resolution and window size -		// controls here, see LLFloaterWindowSize::initWindowSizeControls() -		 -		if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio")) -		{ -			LLFloaterPreference::sAspectRatio = gViewerWindow->getDisplayAspectRatio(); -		} -		else -		{ -			LLFloaterPreference::sAspectRatio = gSavedSettings.getF32("FullScreenAspectRatio"); -		} - -		getChild<LLComboBox>("aspect_ratio")->setTextEntryCallback(boost::bind(&LLPanelPreference::setControlFalse, this, LLSD("FullScreenAutoDetectAspectRatio") ));	 -		 - -		S32 numerator = 0; -		S32 denominator = 0; -		fractionFromDecimal(LLFloaterPreference::sAspectRatio, numerator, denominator);		 -		 -		LLUIString aspect_ratio_text = getString("aspect_ratio_text"); -		if (numerator != 0) -		{ -			aspect_ratio_text.setArg("[NUM]", llformat("%d",  numerator)); -			aspect_ratio_text.setArg("[DEN]", llformat("%d",  denominator)); -		}	 -		else -		{ -			aspect_ratio_text = llformat("%.3f", LLFloaterPreference::sAspectRatio); -		} -		 -		LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio"); -		//mCtrlAspectRatio->setCommitCallback(onSelectAspectRatio, this); -		// add default aspect ratios -		ctrl_aspect_ratio->add(aspect_ratio_text, &LLFloaterPreference::sAspectRatio, ADD_TOP); -		ctrl_aspect_ratio->setCurrentByIndex(0); -		 -		refresh(); -	}  	//////////////////////PanelPrivacy ///////////////////  	if (hasChild("media_enabled")) diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 0827c7c2b2..93b39d72bc 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -128,10 +128,8 @@ public:  	void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);  	void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name); -	void onKeystrokeAspectRatio();  //	void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator); -	void onCommitAutoDetectAspect();  	void onCommitParcelMediaAutoPlayEnable();  	void onCommitMediaEnabled();  	void onCommitMusicEnabled(); @@ -142,7 +140,6 @@ public:  	void buildPopupLists();  	static void refreshSkin(void* data);  	static void cleanupBadSetting(); -	static F32 sAspectRatio;	  private:  	static std::string sSkin;  	bool mGotPersonalInfo; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index bde86a4034..5c0593ad29 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -880,7 +880,11 @@ void LLFloaterProperties::dirtyAll()  		 iter != inst_list.end(); ++iter)  	{  		LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter); -		floater->dirty(); +		llassert(floater); // else cast failed - wrong type D: +		if (floater) +		{ +			floater->dirty(); +		}  	}  } diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 4edd09b02c..e2b083a29b 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -666,8 +666,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)  	if (mCheckCopyCenters) mCheckCopyCenters	->setVisible( create_visible );  	if (mCheckCopyRotates) mCheckCopyRotates	->setVisible( create_visible ); -	if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); -	if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() ); +	if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); +	if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );  	// Land buttons  	BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() ); diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 3e804bef9d..f61c86db14 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -362,8 +362,7 @@ BOOL LLFadeEventTimer::tick()  	if(NULL == mParent)	// no more need to tick, so suicide  	{ -		delete this; -		return FALSE; +		return TRUE;  	}  	// Set up colors diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp index 66a1f6701f..1bbee2625c 100644 --- a/indra/newview/llfloaterwater.cpp +++ b/indra/newview/llfloaterwater.cpp @@ -574,12 +574,10 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r  		LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");  		LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");  		LLComboBox* key_combo = NULL; -		LLMultiSliderCtrl* mult_sldr = NULL;  		if (day_cycle)   		{  			key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets"); -			mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");  		}  		std::string name = combo_box->getSelectedValue().asString(); diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp index ea6fda7303..c1b15c578c 100644 --- a/indra/newview/llfloaterwindlight.cpp +++ b/indra/newview/llfloaterwindlight.cpp @@ -749,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS  		LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");  		LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");  		LLComboBox* key_combo = NULL; -		LLMultiSliderCtrl* mult_sldr = NULL;  		if (day_cycle)   		{  			key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets"); -			mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");  		}  		std::string name(combo_box->getSelectedValue().asString()); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 57c7ba8e27..8dbdfff635 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -195,7 +195,8 @@ LLFolderView::LLFolderView(const Params& p)  	mCallbackRegistrar(NULL),  	mParentPanel(p.parent_panel),  	mUseEllipses(false), -	mDraggingOverItem(NULL) +	mDraggingOverItem(NULL), +	mStatusTextBox(NULL)  {  	LLRect rect = p.rect;  	LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom); @@ -231,6 +232,18 @@ LLFolderView::LLFolderView(const Params& p)  	mRenamer = LLUICtrlFactory::create<LLLineEditor> (params);  	addChild(mRenamer); +	// Textbox +	LLTextBox::Params text_p; +	LLRect new_r(5, 13-50, 300, 0-50); +	text_p.name(std::string(p.name)); +	text_p.rect(new_r); +	text_p.font(getLabelFontForStyle(mLabelStyle)); +	text_p.visible(false); +	text_p.allow_html(true); +	mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p); +	//addChild(mStatusTextBox); + +  	// make the popup menu available  	LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  	if (!menu) @@ -253,6 +266,7 @@ LLFolderView::~LLFolderView( void )  	mScrollContainer = NULL;  	mRenameItem = NULL;  	mRenamer = NULL; +	mStatusTextBox = NULL;  	if( gEditMenuHandler == this )  	{ @@ -874,7 +888,7 @@ void LLFolderView::draw()  			LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  	} -	LLFontGL* font = getLabelFontForStyle(mLabelStyle); +	//LLFontGL* font = getLabelFontForStyle(mLabelStyle);  	// if cursor has moved off of me during drag and drop  	// close all auto opened folders @@ -911,19 +925,23 @@ void LLFolderView::draw()  		|| mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)  	{  		mStatusText.clear(); +		mStatusTextBox->setVisible( FALSE );  	}  	else  	{  		if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())  		{  			mStatusText = LLTrans::getString("Searching"); -			font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL,  LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); +			//font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL,  LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  		}  		else  		{  			mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage()); -			font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL,  LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); +			//font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL,  LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  		} +		mStatusTextBox->setValue(mStatusText); +		mStatusTextBox->setVisible( TRUE ); +		  	}  	LLFolderViewFolder::draw(); diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 56ebdfcf79..faf6a9cf23 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -62,6 +62,7 @@ class LLLineEditor;  class LLMenuGL;  class LLScrollContainer;  class LLUICtrl; +class LLTextBox;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLFolderViewFunctor @@ -327,7 +328,7 @@ protected:  	LLUUID							mSelectThisID; // if non null, select this item -	LLPanel*				mParentPanel; +	LLPanel*						mParentPanel;  	/**  	 * Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll. @@ -344,6 +345,8 @@ protected:  public:  	static F32 sAutoOpenTime; +	LLTextBox*						mStatusTextBox; +  };  bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b); diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 4c1019a882..4db75bbd8a 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -677,9 +677,12 @@ void LLGroupMgrGroupData::sendRoleChanges()  				break;  			}  			case RC_UPDATE_ALL: +				// fall through  			case RC_UPDATE_POWERS:  				need_power_recalc = true; +				// fall through  			case RC_UPDATE_DATA: +				// fall through  			default:   			{  				LLGroupRoleData* group_role_data = (*role_it).second; @@ -762,7 +765,7 @@ void LLGroupMgr::addObserver(LLGroupMgrObserver* observer)  		mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));  } -void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer) +void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)  {  	if(group_id.notNull() && observer)  	{ @@ -792,7 +795,7 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)  	}  } -void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer) +void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)  {  	if(group_id.isNull() || !observer)  	{ @@ -1364,7 +1367,7 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)  			gi->second->mChanged = FALSE; -			// notify LLParticularGroupMgrObserver +			// notify LLParticularGroupObserver  		    observer_map_t::iterator obs_it = mParticularObservers.find(group_id);  		    if(obs_it == mParticularObservers.end())  		        return; diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 588b4a9034..2c86de8b97 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -53,10 +53,10 @@ protected:  	LLUUID	mID;  }; -class LLParticularGroupMgrObserver +class LLParticularGroupObserver  {  public: -	virtual ~LLParticularGroupMgrObserver(){} +	virtual ~LLParticularGroupObserver(){}  	virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0;  }; @@ -313,9 +313,9 @@ public:  	~LLGroupMgr();  	void addObserver(LLGroupMgrObserver* observer); -	void addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer); +	void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);  	void removeObserver(LLGroupMgrObserver* observer); -	void removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer); +	void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);  	LLGroupMgrGroupData* getGroupData(const LLUUID& id);  	void sendGroupPropertiesRequest(const LLUUID& group_id); @@ -374,7 +374,7 @@ private:  	typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;  	group_map_t mGroups; -	typedef std::set<LLParticularGroupMgrObserver*> observer_set_t; +	typedef std::set<LLParticularGroupObserver*> observer_set_t;  	typedef std::map<LLUUID,observer_set_t> observer_map_t;  	observer_map_t mParticularObservers;  }; diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 53cdfcc9b2..94b540a7e1 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -271,6 +271,7 @@ BOOL LLIMFloater::postBuild()  	mInputEditor->setCommitOnFocusLost( FALSE );  	mInputEditor->setRevertOnEsc( FALSE );  	mInputEditor->setReplaceNewlinesWithSpaces( FALSE ); +	mInputEditor->setPassDelete( TRUE );  	std::string session_name(LLIMModel::instance().getName(mSessionID)); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index ba034609e9..49521b5987 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -93,7 +93,7 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,  	LLIconCtrl* icon = 0; -	if(gAgent.isInGroup(session_id)) +	if(gAgent.isInGroup(session_id, TRUE))  	{  		LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();  		icon_params.group_id = session_id; @@ -121,36 +121,6 @@ void LLIMFloaterContainer::onCloseFloater(LLUUID& id)  	mSessions.erase(id);  } -void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type) -{ -	if (APT_PROPERTIES == type) -	{ -		LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data); -		if (avatar_data) -		{ -			LLUUID avatar_id = avatar_data->avatar_id; -			LLUUID* cached_avatarId = LLAvatarIconIDCache::getInstance()->get(avatar_id); -			if(cached_avatarId && cached_avatarId->notNull() && avatar_data->image_id != *cached_avatarId) -			{ -				LLAvatarIconIDCache::getInstance()->add(avatar_id,avatar_data->image_id); -				mTabContainer->setTabImage(get_ptr_in_map(mSessions, avatar_id), avatar_data->image_id); -			} -		} -	} -} - -void LLIMFloaterContainer::changed(const LLUUID& group_id, LLGroupChange gc) -{ -	if (GC_PROPERTIES == gc) -	{ -		LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id); -		if (group_data && group_data->mInsigniaID.notNull()) -		{ -			mTabContainer->setTabImage(get_ptr_in_map(mSessions, group_id), group_data->mInsigniaID); -		} -	} -} -  void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)  {  	LLUUID session_id = data["from_id"].asUUID(); diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index b07ef2d71d..46c0617c01 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -43,7 +43,7 @@  class LLTabContainer; -class LLIMFloaterContainer : public LLMultiFloater, public LLAvatarPropertiesObserver, public LLParticularGroupMgrObserver +class LLIMFloaterContainer : public LLMultiFloater  {  public:  	LLIMFloaterContainer(const LLSD& seed); @@ -57,9 +57,6 @@ public:  								BOOL select_added_floater,   								LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); -	void processProperties(void* data, EAvatarProcessorType type); -	void changed(const LLUUID& group_id, LLGroupChange gc); -  	static LLFloater* getCurrentVoiceFloater();  	static LLIMFloaterContainer* findInstance(); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 32482a065c..77e3012d26 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -77,6 +77,9 @@ const static std::string IM_FROM_ID("from_id");  const static std::string NO_SESSION("(IM Session Doesn't Exist)");  const static std::string ADHOC_NAME_SUFFIX(" Conference"); +const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other"); +const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent"); +  std::string LLCallDialogManager::sPreviousSessionlName = "";  LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;  std::string LLCallDialogManager::sCurrentSessionlName = ""; @@ -253,12 +256,12 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES  			{  			case LLVoiceChannel::STATE_CALL_STARTED :  				message = other_avatar_name + " " + started_call; -				LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); +				LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);  				break;  			case LLVoiceChannel::STATE_CONNECTED :  				message = you + " " + joined_call; -				LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); +				LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);  			default:  				break;  			} @@ -269,11 +272,11 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES  			{  			case LLVoiceChannel::STATE_CALL_STARTED :  				message = you + " " + started_call; -				LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); +				LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);  				break;  			case LLVoiceChannel::STATE_CONNECTED :  				message = other_avatar_name + " " + joined_call; -				LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); +				LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);  			default:  				break;  			} @@ -288,7 +291,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES  			{  			case LLVoiceChannel::STATE_CONNECTED :  				message = you + " " + joined_call; -				LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); +				LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);  			default:  				break;  			} @@ -299,7 +302,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES  			{  			case LLVoiceChannel::STATE_CALL_STARTED :  				message = you + " " + started_call; -				LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); +				LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);  				break;  			default:  				break; @@ -1372,7 +1375,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)  	}  	sSession = session; -	sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3)); +	sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4));  	if(sCurrentSessionlName != session->mName)  	{  		sPreviousSessionlName = sCurrentSessionlName; @@ -1403,7 +1406,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)  } -void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction) +void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent)  {  	LLSD mCallDialogPayload;  	LLOutgoingCallDialog* ocd = NULL; @@ -1423,6 +1426,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat  	mCallDialogPayload["state"] = new_state;  	mCallDialogPayload["disconnected_channel_name"] = sSession->mName;  	mCallDialogPayload["session_type"] = sSession->mSessionType; +	mCallDialogPayload["ended_by_agent"] = ended_by_agent;  	switch(new_state)  	{			 @@ -1618,14 +1622,16 @@ void LLOutgoingCallDialog::show(const LLSD& key)  			channel_name = LLTextUtil::formatPhoneNumber(channel_name);  		}  		childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name); -		childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString()); +		childSetTextArg("nearby_P2P_by_other", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());  		// skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,  		// so no reconnection to nearby chat happens (EXT-4397)  		bool voice_works = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();  		std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string();  		childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby); -		childSetTextArg("nearby_P2P", "[RECONNECT_NEARBY]", reconnect_nearby); + +		const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER; +		childSetTextArg(nearby_str, "[RECONNECT_NEARBY]", reconnect_nearby);  	}  	std::string callee_name = mPayload["session_name"].asString(); @@ -1659,6 +1665,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)  	{  	case LLVoiceChannel::STATE_CALL_STARTED :  		getChild<LLTextBox>("calling")->setVisible(true); +		getChild<LLButton>("Cancel")->setVisible(true);  		if(show_oldchannel)  		{  			getChild<LLTextBox>("leaving")->setVisible(true); @@ -1680,7 +1687,8 @@ void LLOutgoingCallDialog::show(const LLSD& key)  	case LLVoiceChannel::STATE_HUNG_UP :  		if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)  		{ -			getChild<LLTextBox>("nearby_P2P")->setVisible(true); +			const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER; +			getChild<LLTextBox>(nearby_str)->setVisible(true);  		}   		else  		{ @@ -1699,7 +1707,8 @@ void LLOutgoingCallDialog::hideAllText()  	getChild<LLTextBox>("calling")->setVisible(false);  	getChild<LLTextBox>("leaving")->setVisible(false);  	getChild<LLTextBox>("connecting")->setVisible(false); -	getChild<LLTextBox>("nearby_P2P")->setVisible(false); +	getChild<LLTextBox>("nearby_P2P_by_other")->setVisible(false); +	getChild<LLTextBox>("nearby_P2P_by_agent")->setVisible(false);  	getChild<LLTextBox>("nearby")->setVisible(false);  	getChild<LLTextBox>("noanswer")->setVisible(false);  } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 21c7626109..ad6cede727 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -452,7 +452,7 @@ public:  	static void initClass();  	static void onVoiceChannelChanged(const LLUUID &session_id); -	static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction); +	static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent);  protected:  	static std::string sPreviousSessionlName; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index da95eaefca..019a4b22c3 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2434,7 +2434,10 @@ void LLFolderBridge::pasteFromClipboard()  					//we have to update inventory locally too  					LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);  					llassert(viitem); -					changeItemParent(model, viitem, parent_id, FALSE); +					if (viitem) +					{ +						changeItemParent(model, viitem, parent_id, FALSE); +					}  				}  				else  				{ diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 33623539e9..3553137f53 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -195,6 +195,62 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)  	}  } +static void assign_clothing_bodypart_icon(EInventoryIcon &idx, U32 attachment_point) +{ +	const EWearableType wearable_type = EWearableType(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point); +	switch(wearable_type) +	{ +		case WT_SHAPE: +			idx = BODYPART_SHAPE_ICON_NAME; +			break; +		case WT_SKIN: +			idx = BODYPART_SKIN_ICON_NAME; +			break; +		case WT_HAIR: +			idx = BODYPART_HAIR_ICON_NAME; +			break; +		case WT_EYES: +			idx = BODYPART_EYES_ICON_NAME; +			break; +		case WT_SHIRT: +			idx = CLOTHING_SHIRT_ICON_NAME; +			break; +		case WT_PANTS: +			idx = CLOTHING_PANTS_ICON_NAME; +			break; +		case WT_SHOES: +			idx = CLOTHING_SHOES_ICON_NAME; +			break; +		case WT_SOCKS: +			idx = CLOTHING_SOCKS_ICON_NAME; +			break; +		case WT_JACKET: +			idx = CLOTHING_JACKET_ICON_NAME; +			break; +		case WT_GLOVES: +			idx = CLOTHING_GLOVES_ICON_NAME; +			break; +		case WT_UNDERSHIRT: +			idx = CLOTHING_UNDERSHIRT_ICON_NAME; +			break; +		case WT_UNDERPANTS: +			idx = CLOTHING_UNDERPANTS_ICON_NAME; +			break; +		case WT_SKIRT: +			idx = CLOTHING_SKIRT_ICON_NAME; +			break; +		case WT_ALPHA: +			idx = CLOTHING_ALPHA_ICON_NAME; +			break; +		case WT_TATTOO: +			idx = CLOTHING_TATTOO_ICON_NAME; +			break; +		default: +			break; +	} +} +										   +  const std::string& get_item_icon_name(LLAssetType::EType asset_type,  							 LLInventoryType::EType inventory_type,  							 U32 attachment_point, @@ -249,62 +305,11 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type,  		break;  	case LLAssetType::AT_CLOTHING:  		idx = CLOTHING_ICON_NAME; -	case LLAssetType::AT_BODYPART : -		if(LLAssetType::AT_BODYPART == asset_type) -		{ -			idx = BODYPART_ICON_NAME; -		} -		switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point) -		{ -		case WT_SHAPE: -			idx = BODYPART_SHAPE_ICON_NAME; -			break; -		case WT_SKIN: -			idx = BODYPART_SKIN_ICON_NAME; -			break; -		case WT_HAIR: -			idx = BODYPART_HAIR_ICON_NAME; -			break; -		case WT_EYES: -			idx = BODYPART_EYES_ICON_NAME; -			break; -		case WT_SHIRT: -			idx = CLOTHING_SHIRT_ICON_NAME; -			break; -		case WT_PANTS: -			idx = CLOTHING_PANTS_ICON_NAME; -			break; -		case WT_SHOES: -			idx = CLOTHING_SHOES_ICON_NAME; -			break; -		case WT_SOCKS: -			idx = CLOTHING_SOCKS_ICON_NAME; -			break; -		case WT_JACKET: -			idx = CLOTHING_JACKET_ICON_NAME; -			break; -		case WT_GLOVES: -			idx = CLOTHING_GLOVES_ICON_NAME; -			break; -		case WT_UNDERSHIRT: -			idx = CLOTHING_UNDERSHIRT_ICON_NAME; -			break; -		case WT_UNDERPANTS: -			idx = CLOTHING_UNDERPANTS_ICON_NAME; -			break; -		case WT_SKIRT: -			idx = CLOTHING_SKIRT_ICON_NAME; -			break; -		case WT_ALPHA: -			idx = CLOTHING_ALPHA_ICON_NAME; -			break; -		case WT_TATTOO: -			idx = CLOTHING_TATTOO_ICON_NAME; -			break; -		default: -			// no-op, go with choice above -			break; -		} +		assign_clothing_bodypart_icon(idx, attachment_point); +		break; +	case LLAssetType::AT_BODYPART: +		idx = BODYPART_ICON_NAME; +		assign_clothing_bodypart_icon(idx, attachment_point);  		break;  	case LLAssetType::AT_NOTECARD:  		idx = NOTECARD_ICON_NAME; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 467255d1a7..ca9b942629 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -143,6 +143,7 @@ BOOL LLInventoryPanel::postBuild()  		addChild(mScroller);  		mScroller->addChild(mFolders);  		mFolders->setScrollContainer(mScroller); +		mFolders->addChild(mFolders->mStatusTextBox);  	}  	// Set up the callbacks from the inventory we're viewing, and then build everything. diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index 52de8355e9..60e41b64ac 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -36,6 +36,7 @@  #include "llnotificationhandler.h"  #include "llnotifications.h" +#include "llprogressview.h"  #include "lltoastnotifypanel.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" @@ -116,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify)  		p.is_modal = mIsModal;  		p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1); +		// Show alert in middle of progress view (during teleport) (EXT-1093) +		LLProgressView* progress = gViewerWindow->getProgressView(); +		LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled(); +		mChannel->updatePositionAndSize(rc, rc); +  		LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);  		if(channel)  			channel->addToast(p); diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 06a682c905..05261a65de 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -36,6 +36,7 @@  #include "llagent.h"  #include "llfloateravatarpicker.h"  #include "llbutton.h" +#include "llcallingcard.h"  #include "llcombobox.h"  #include "llgroupactions.h"  #include "llgroupmgr.h" @@ -405,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)  	{  		LLUUID agent_id = agent_ids[i];  		LLViewerObject* dest = gObjectList.findObject(agent_id); +		std::string fullname;  		if(dest && dest->isAvatar())  		{ -			std::string fullname; -			LLSD args;  			LLNameValue* nvfirst = dest->getNVPair("FirstName");  			LLNameValue* nvlast = dest->getNVPair("LastName");  			if(nvfirst && nvlast)  			{ -				args["FIRST"] = std::string(nvfirst->getString()); -				args["LAST"] = std::string(nvlast->getString());  				fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());  			}  			if (!fullname.empty()) @@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)  				names.push_back("(Unknown)");  			}  		} +		else +		{ +			//looks like user try to invite offline friend +			//for offline avatar_id gObjectList.findObject() will return null +			//so we need to do this additional search in avatar tracker, see EXT-4732 +			if (LLAvatarTracker::instance().isBuddy(agent_id)) +			{ +				if (!gCacheName->getFullName(agent_id, fullname)) +				{ +					// actually it should happen, just in case +					gCacheName->get(LLUUID(agent_id), false, boost::bind( +							&LLPanelGroupInvite::addUserCallback, this, _1, _2, +							_3)); +					// for this special case! +					//when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence +					// removed id will be added in callback +					agent_ids.erase(agent_ids.begin() + i); +				} +				else +				{ +					names.push_back(fullname); +				} +			} +		}  	}  	mImplementation->addUsers(names, agent_ids);  } +void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name) +{ +	std::vector<std::string> names; +	std::vector<LLUUID> agent_ids; +	std::string full_name = first_name + " " + last_name; +	agent_ids.push_back(id); +	names.push_back(first_name + " " + last_name); + +	mImplementation->addUsers(names, agent_ids); +}  void LLPanelGroupInvite::draw()  {  	LLPanel::draw(); diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h index 37135b488a..b095dd2395 100644 --- a/indra/newview/llpanelgroupinvite.h +++ b/indra/newview/llpanelgroupinvite.h @@ -43,6 +43,10 @@ public:  	~LLPanelGroupInvite();  	void addUsers(std::vector<LLUUID>& agent_ids); +	/** +	 * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers(). +	 */   +	void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);  	void clear();  	void update(); diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index cbd6f64a48..8e305a5674 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -224,14 +224,6 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)  		childSetEnabled("share_btn", FALSE);  		childSetEnabled("teleport_btn", FALSE);  		childSetEnabled("pay_btn", FALSE); - -        getChild<LLTextBox>("avatar_name")->setValue(im_session->mName); -        getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName); -	} -	else -	{ -		// If the participant is an avatar, fetch the currect name -		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));  	}  } @@ -247,19 +239,6 @@ void LLPanelIMControlPanel::changed(U32 mask)  	}  } -void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) -{ -	if ( id == mAvatarID ) -	{ -		std::string avatar_name; -		avatar_name.assign(first); -		avatar_name.append(" "); -		avatar_name.append(last); -		getChild<LLTextBox>("avatar_name")->setValue(avatar_name); -		getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name); -	} -} -  LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):  mParticipantList(NULL)  { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 3ab505a084..ce8fc58e56 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -89,9 +89,6 @@ public:  	// LLFriendObserver trigger  	virtual void changed(U32 mask); -protected: -	void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); -  private:  	void onViewProfileButtonClicked();  	void onAddFriendButtonClicked(); diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 36a542cfa0..cd6c727b5c 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -406,21 +406,24 @@ void LLPanelLandmarkInfo::populateFoldersList()  	// Put the "Landmarks" folder first in list.  	LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); -	const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); -	if (!cat) +	const LLViewerInventoryCategory* lmcat = gInventory.getCategory(landmarks_id); +	if (!lmcat)  	{  		llwarns << "Cannot find the landmarks folder" << llendl;  	} -	std::string cat_full_name = getFullFolderName(cat); -	mFolderCombo->add(cat_full_name, cat->getUUID()); +	else +	{ +		std::string cat_full_name = getFullFolderName(lmcat); +		mFolderCombo->add(cat_full_name, lmcat->getUUID()); +	}  	typedef std::vector<folder_pair_t> folder_vec_t;  	folder_vec_t folders;  	// Sort the folders by their full name.  	for (S32 i = 0; i < cats.count(); i++)  	{ -		cat = cats.get(i); -		cat_full_name = getFullFolderName(cat); +		const LLViewerInventoryCategory* cat = cats.get(i); +		std::string cat_full_name = getFullFolderName(cat);  		folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));  	}  	sort(folders.begin(), folders.end(), cmp_folders); diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index f601a8d51c..64a265219b 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -206,7 +206,7 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)  {	  	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;  	self->mAutoLoop->clear(); -	self->mAutoPlay->clear(); +	self->mAutoPlay->setValue(LLSD(TRUE)); // set default value for auto play to true;  	self->mAutoScale->clear();  	self->mAutoZoom ->clear();  	self->mCurrentURL->clear(); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index ada65c98a4..8eb0b69491 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -843,10 +843,13 @@ void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel)  			{  				LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(  					mClassifiedsList->getItemByValue(values[n])); - -				c_item->setClassifiedName(panel->getClassifiedName()); -				c_item->setDescription(panel->getDescription()); -				c_item->setSnapshotId(panel->getSnapshotId()); +				llassert(c_item); +				if (c_item) +				{ +					c_item->setClassifiedName(panel->getClassifiedName()); +					c_item->setDescription(panel->getDescription()); +					c_item->setSnapshotId(panel->getSnapshotId()); +				}  			}  		}  	} diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 17a970cfcf..26b57c003b 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -1048,14 +1048,13 @@ void LLPanelPlaces::updateVerbs()  	mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);  	mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); -	mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); +	mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);  	mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn);  	mSaveBtn->setVisible(isLandmarkEditModeOn);  	mCancelBtn->setVisible(isLandmarkEditModeOn);  	mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);  	mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); -	mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);  	if (is_place_info_visible)  	{ diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp index 6c6eb7c719..f1e450a083 100644 --- a/indra/newview/llplacesinventorypanel.cpp +++ b/indra/newview/llplacesinventorypanel.cpp @@ -118,6 +118,7 @@ BOOL LLPlacesInventoryPanel::postBuild()  	mScroller->addChild(mFolders);  	mFolders->setScrollContainer(mScroller); +	mFolders->addChild(mFolders->mStatusTextBox);  	// cut subitems diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index a8feaf690d..3221745fa3 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -661,7 +661,9 @@ void LLScriptEdCore::onBtnDynamicHelp()  		live_help_floater = new LLFloater(LLSD());  		LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL);  		LLFloater* parent = dynamic_cast<LLFloater*>(getParent()); -		parent->addDependentFloater(live_help_floater, TRUE); +		llassert(parent); +		if (parent) +			parent->addDependentFloater(live_help_floater, TRUE);  		live_help_floater->childSetCommitCallback("lock_check", onCheckLock, this);  		live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor"));  		live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, this); diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index a81ec61263..d452ef2228 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -67,6 +67,7 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)  LLScriptFloater::LLScriptFloater(const LLSD& key)  : LLDockableFloater(NULL, true, key)  , mScriptForm(NULL) +, mSaveFloaterPosition(false)  {  	setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));  	setOverlapsScreenChannel(true); @@ -105,27 +106,29 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)  	LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);  	floater->setNotificationId(notification_id);  	floater->createForm(notification_id); -	LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE); -	if (floater->getDockControl() == NULL) +	if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))  	{ -		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(notification_id); -		if (chiclet == NULL) -		{ -			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0); -		} -		else -		{ -			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); -		} - -		floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(), -			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, floater, _1))); +		floater->setSavePosition(true); +		floater->restorePosition(); +	} +	else +	{ +		floater->dockToChiclet(true);  	} +	LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE); +  	return floater;  } +void LLScriptFloater::setNotificationId(const LLUUID& id) +{ +	mNotificationId = id; +	// Lets save object id now while notification exists +	mObjectId = notification_id_to_object_id(id); +} +  void LLScriptFloater::getAllowedRect(LLRect& rect)  {  	rect = gViewerWindow->getWorldViewRectRaw(); @@ -162,6 +165,8 @@ void LLScriptFloater::createForm(const LLUUID& notification_id)  void LLScriptFloater::onClose(bool app_quitting)  { +	savePosition(); +  	if(getNotificationId().notNull())  	{  		LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId()); @@ -172,6 +177,8 @@ void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)  {  	LLDockableFloater::setDocked(docked, pop_on_undock); +	savePosition(); +  	hideToastsIfNeeded();  } @@ -208,6 +215,33 @@ void LLScriptFloater::onMouseDown()  	}  } +void LLScriptFloater::savePosition() +{ +	if(getSavePosition() && mObjectId.notNull()) +	{ +		LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()}; +		LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi); +	} +} + +void LLScriptFloater::restorePosition() +{ +	LLScriptFloaterManager::FloaterPositionInfo fpi; +	if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi)) +	{ +		dockToChiclet(fpi.mDockState); +		if(!fpi.mDockState) +		{ +			// Un-docked floater is opened in 0,0, now move it to saved position +			translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop); +		} +	} +	else +	{ +		dockToChiclet(true); +	} +} +  void LLScriptFloater::onFocusLost()  {  	if(getNotificationId().notNull()) @@ -225,6 +259,33 @@ void LLScriptFloater::onFocusReceived()  	}  } +void LLScriptFloater::dockToChiclet(bool dock) +{ +	if (getDockControl() == NULL) +	{ +		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId()); +		if (chiclet == NULL) +		{ +			llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl; +			return; +		} +		else +		{ +			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet); +		} + +		// Stop saving position while we dock floater +		bool save = getSavePosition(); +		setSavePosition(false); + +		setDockControl(new LLDockControl(chiclet, this, getDockTongue(), +			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, this, _1)), dock); + +		// Restore saving +		setSavePosition(save); +	} +} +  void LLScriptFloater::hideToastsIfNeeded()  {  	using namespace LLNotificationsUI; @@ -326,6 +387,7 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)  	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);  	if(floater)  	{ +		floater->savePosition();  		floater->setNotificationId(LLUUID::null);  		floater->closeFloater();  	} @@ -445,4 +507,27 @@ LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloate  	return mNotifications.end();  } +void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi) +{ +	if(object_id.notNull()) +	{ +		LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi; +	} +	else +	{ +		llwarns << "Invalid object id" << llendl; +	} +} + +bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi) +{ +	floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id); +	if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it) +	{ +		fpi = it->second; +		return true; +	} +	return false; +} +  // EOF diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index f7efff83f9..ec3ec4b540 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -84,16 +84,21 @@ public:  	static std::string getObjectName(const LLUUID& notification_id); -	/** -	* Callback for notification toast buttons. -	*/ -	static void onToastButtonClick(const LLSD¬ification, const LLSD&response); -  	typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;  	boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }  	boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); } +	struct FloaterPositionInfo +	{ +		LLRect mRect; +		bool mDockState; +	}; + +	void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi); + +	bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi); +  protected:  	typedef std::map<std::string, EObjectType> object_type_map; @@ -111,6 +116,11 @@ private:  	object_signal_t mNewObjectSignal;  	object_signal_t mToggleFloaterSignal; + +	// <object_id, floater position> +	typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t; + +	floater_position_map_t mFloaterPositions;  };  /** @@ -141,7 +151,7 @@ public:  	const LLUUID& getNotificationId() { return mNotificationId; } -	void setNotificationId(const LLUUID& id) { mNotificationId = id; } +	void setNotificationId(const LLUUID& id);  	/**  	 * Close notification if script floater is closed. @@ -158,6 +168,14 @@ public:  	 */  	/*virtual*/ void setVisible(BOOL visible); +	bool getSavePosition() { return mSaveFloaterPosition; } + +	void setSavePosition(bool save) { mSaveFloaterPosition = save; } + +	void savePosition(); + +	void restorePosition(); +  protected:  	/** @@ -181,9 +199,13 @@ protected:  	/*virtual*/ void onFocusReceived(); +	void dockToChiclet(bool dock); +  private:  	LLToastNotifyPanel* mScriptForm;  	LLUUID mNotificationId; +	LLUUID mObjectId; +	bool mSaveFloaterPosition;  };  #endif //LL_SCRIPTFLOATER_H diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp index 93a70b6471..a130878176 100644 --- a/indra/newview/llsearchcombobox.cpp +++ b/indra/newview/llsearchcombobox.cpp @@ -78,6 +78,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)  	button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this));  	mSearchButton = LLUICtrlFactory::create<LLButton>(button_params);  	mTextEntry->addChild(mSearchButton); +	mTextEntry->setPassDelete(TRUE);  	setButtonVisible(p.dropdown_button_visible);  	mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2)); diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 44348ba429..0275736f6d 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -231,20 +231,23 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  	// PERMISSIONS LOOKUP //  	//////////////////////// +	llassert(item); +	if (!item) return; +  	// do not enable the UI for incomplete items.  	BOOL is_complete = item->isComplete();  	const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType());  	const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD);  	const LLPermissions& perm = item->getPermissions();  	const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm,  -															GP_OBJECT_MANIPULATE); +								GP_OBJECT_MANIPULATE);  	const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,  -													  GP_OBJECT_SET_SALE) && +							  GP_OBJECT_SET_SALE) &&  		!cannot_restrict_permissions;  	const BOOL is_link = item->getIsLinkType();  	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); -	bool not_in_trash = item && (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id); +	bool not_in_trash = (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);  	// You need permission to modify the object to modify an inventory  	// item in it. diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 3343ee88bd..e4773f99c5 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -40,6 +40,12 @@ const std::string LLSLURL::PREFIX_SL_HELP		= "secondlife://app.";  const std::string LLSLURL::PREFIX_SL			= "sl://";  const std::string LLSLURL::PREFIX_SECONDLIFE	= "secondlife://";  const std::string LLSLURL::PREFIX_SLURL_OLD		= "http://slurl.com/secondlife/"; + +// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag +// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this +// version is required also. +const std::string LLSLURL::PREFIX_SLURL_WWW		= "http://www.slurl.com/secondlife/"; +  const std::string LLSLURL::PREFIX_SLURL			= "http://maps.secondlife.com/secondlife/";  const std::string LLSLURL::APP_TOKEN = "app/"; @@ -68,7 +74,10 @@ std::string LLSLURL::stripProtocol(const std::string& url)  	{  		stripped.erase(0, PREFIX_SLURL_OLD.length());  	} - +	else if (matchPrefix(stripped, PREFIX_SLURL_WWW)) +	{ +		stripped.erase(0, PREFIX_SLURL_WWW.length()); +	}  	return stripped;  } @@ -81,6 +90,7 @@ bool LLSLURL::isSLURL(const std::string& url)  	if (matchPrefix(url, PREFIX_SECONDLIFE))	return true;  	if (matchPrefix(url, PREFIX_SLURL))			return true;  	if (matchPrefix(url, PREFIX_SLURL_OLD))		return true; +	if (matchPrefix(url, PREFIX_SLURL_WWW))		return true;  	return false;  } @@ -91,6 +101,7 @@ bool LLSLURL::isSLURLCommand(const std::string& url)  	if (matchPrefix(url, PREFIX_SL + APP_TOKEN) ||  		matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) ||  		matchPrefix(url, PREFIX_SLURL + APP_TOKEN) || +		matchPrefix(url, PREFIX_SLURL_WWW + APP_TOKEN) ||  		matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) )  	{  		return true; diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h index 21b32ce409..6a695e84f3 100644 --- a/indra/newview/llslurl.h +++ b/indra/newview/llslurl.h @@ -51,6 +51,7 @@ public:  	static const std::string PREFIX_SECONDLIFE;  	static const std::string PREFIX_SLURL;  	static const std::string PREFIX_SLURL_OLD; +	static const std::string PREFIX_SLURL_WWW;  	static const std::string APP_TOKEN; diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp index 2485563cbc..61705c4eb3 100644 --- a/indra/newview/llstylemap.cpp +++ b/indra/newview/llstylemap.cpp @@ -49,6 +49,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)  		if (source != LLUUID::null && source != gAgent.getID() )  		{  			style_params.color.control = "HTMLLinkColor"; +			style_params.readonly_color.control = "HTMLLinkColor";  			style_params.link_href =   					LLSLURL::buildCommand("agent", source, "inspect");  		} @@ -56,6 +57,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)  		{  			// Make the resident's own name white and don't make the name clickable.  			style_params.color = LLColor4::white; +			style_params.readonly_color = LLColor4::white;  		}  		mMap[source] = style_params; @@ -75,11 +77,13 @@ const LLStyle::Params &LLStyleMap::lookup(const LLUUID& id, const std::string& l  		if (id != LLUUID::null && !link.empty())  		{  			style_params.color.control = "HTMLLinkColor"; +			style_params.readonly_color.control = "HTMLLinkColor";  			style_params.link_href = link;  		}  		else  		{  			style_params.color = LLColor4::white; +			style_params.readonly_color = LLColor4::white;  		}  		mMap[id] = style_params;  	} diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 4a61130785..6dcf4bc798 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -982,7 +982,12 @@ bool LLTextureFetchWorker::doWork(S32 param)  		}  		if (mLoadedDiscard < 0)  		{ -			llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; +			//llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl; + +			//abort, don't decode +			mState = DONE; +			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); +			return true;  		}  		setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it  		mRawImage = NULL; diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 7ae2404203..cb43beb819 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -141,32 +141,6 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)  	return LLToastPanel::handleToolTip(x, y, mask);  } -void LLToastIMPanel::showInspector() -{ -	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID); -	if(!im_session) -	{ -		llwarns << "Invalid IM session" << llendl; -		return; -	} - -	switch(im_session->mSessionType) -	{ -	case LLIMModel::LLIMSession::P2P_SESSION: -		LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); -		break; -	case LLIMModel::LLIMSession::GROUP_SESSION: -		LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); -		break; -	case LLIMModel::LLIMSession::ADHOC_SESSION: -		LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID)); -		break; -	default: -		llwarns << "Unknown IM session type" << llendl; -		break; -	} -} -  void LLToastIMPanel::spawnNameToolTip()  {  	// Spawn at right side of the name textbox. @@ -176,7 +150,7 @@ void LLToastIMPanel::spawnNameToolTip()  	LLToolTip::Params params;  	params.background_visible(false); -	params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this)); +	params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE));  	params.delay_time(0.0f);		// spawn instantly on hover  	params.image(LLUI::getUIImage("Info_Small"));  	params.message(""); @@ -201,7 +175,7 @@ void LLToastIMPanel::spawnGroupIconToolTip()  	LLInspector::Params params;  	params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); -	params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this)); +	params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_group", LLSD().with("group_id", mSessionID), FALSE));  	params.delay_time(0.100f);  	params.image(LLUI::getUIImage("Info_Small"));  	params.message(g_data.mName); @@ -214,16 +188,15 @@ void LLToastIMPanel::spawnGroupIconToolTip()  void LLToastIMPanel::initIcon()  { -	LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); -  	mAvatarIcon->setVisible(FALSE);  	mGroupIcon->setVisible(FALSE); -	sys_msg_icon->setVisible(FALSE);  	mAdhocIcon->setVisible(FALSE);  	if(mAvatarName->getValue().asString() == SYSTEM_FROM)  	{ -		sys_msg_icon->setVisible(TRUE); +		// "sys_msg_icon" was disabled by Erica in the changeset: 5109 (85181bc92cbe) +		// and "dummy widget" warnings appeared in log. +		// It does not make sense to have such image with empty name. Removed for EXT-5057.  	}  	else  	{ diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 4d741456c4..980b51337f 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -294,6 +294,15 @@ void LLToastNotifyPanel::adjustPanelForTipNotice()  	mControlPanel->setVisible(FALSE);  	reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight()); + +	if (mNotification->getPayload().has("respond_on_mousedown") +		&& mNotification->getPayload()["respond_on_mousedown"] ) +	{ +		mInfoPanel->setMouseDownCallback( +			boost::bind(&LLNotification::respond, +						mNotification, +						mNotification->getResponseTemplate())); +	}  }  // static diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index bf1e307d71..fdf9e1df2e 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1485,6 +1485,12 @@ BOOL LLToolPie::pickRightMouseDownCallback()  			while( object && object->isAttachment())  			{  				object = (LLViewerObject*)object->getParent(); +				llassert(object); +			} + +			if (!object) +			{ +				return TRUE; // unexpected, but escape  			}  			// Object is an avatar, so check for mute by id. diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 8aae90ec3c..b15a9a9e99 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2555,7 +2555,7 @@ void handle_object_inspect()  		key["task"] = "task";  		LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);  	} - +	  	/*  	// Old floater properties  	LLFloaterReg::showInstance("inspect", LLSD()); @@ -5599,8 +5599,6 @@ void handle_buy_currency()  	LLFloaterBuyCurrency::buyCurrency();  } - -  class LLFloaterVisible : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -5644,6 +5642,25 @@ class LLShowSidetrayPanel : public view_listener_t  	}  }; +class LLSidetrayPanelVisible : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string panel_name = userdata.asString(); +		// Toggle the panel +		if (LLSideTray::getInstance()->isPanelActive(panel_name)) +		{ +			return true; +		} +		else +		{ +			return false; +		} +		 +	} +}; + +  bool callback_show_url(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -8028,6 +8045,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");  	view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel"); +	view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible");  	view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");  	view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");  	view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 6bad8843fd..84b270f8cc 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -796,84 +796,88 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  	//LLAssetType::EType pref_loc = data->mPreferredLocation;  	BOOL is_balance_sufficient = TRUE; -	if(result >= 0) +	if(data)  	{ -		LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; - -		if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || -			LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || -			LLAssetType::AT_ANIMATION == data->mAssetInfo.mType) +		if (result >= 0)  		{ -			// Charge the user for the upload. -			LLViewerRegion* region = gAgent.getRegion(); - -			if(!(can_afford_transaction(expected_upload_cost))) -			{ -				LLFloaterBuyCurrency::buyCurrency( -					llformat(LLTrans::getString("UploadingCosts").c_str(), -							 data->mAssetInfo.getName().c_str()), -					         expected_upload_cost); -				is_balance_sufficient = FALSE; -			} -			else if(region) +			LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; +			 +			if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || +			    LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || +			    LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)  			{ -				// Charge user for upload -				gStatusBar->debitBalance(expected_upload_cost); +				// Charge the user for the upload. +				LLViewerRegion* region = gAgent.getRegion(); -				LLMessageSystem* msg = gMessageSystem; -				msg->newMessageFast(_PREHASH_MoneyTransferRequest); -				msg->nextBlockFast(_PREHASH_AgentData); -				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -				msg->nextBlockFast(_PREHASH_MoneyData); -				msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); -				msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); -				msg->addU8("Flags", 0); -				// we tell the sim how much we were expecting to pay so it -				// can respond to any discrepancy -				msg->addS32Fast(_PREHASH_Amount, expected_upload_cost); -				msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); -				msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); -				msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); -				msg->addStringFast(_PREHASH_Description, NULL); -				msg->sendReliable(region->getHost()); +				if(!(can_afford_transaction(expected_upload_cost))) +				{ +					LLFloaterBuyCurrency::buyCurrency( +									  llformat(LLTrans::getString("UploadingCosts").c_str(), +										   data->mAssetInfo.getName().c_str()), +									  expected_upload_cost); +					is_balance_sufficient = FALSE; +				} +				else if(region) +				{ +					// Charge user for upload +					gStatusBar->debitBalance(expected_upload_cost); +					 +					LLMessageSystem* msg = gMessageSystem; +					msg->newMessageFast(_PREHASH_MoneyTransferRequest); +					msg->nextBlockFast(_PREHASH_AgentData); +					msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +					msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +					msg->nextBlockFast(_PREHASH_MoneyData); +					msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); +					msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); +					msg->addU8("Flags", 0); +					// we tell the sim how much we were expecting to pay so it +					// can respond to any discrepancy +					msg->addS32Fast(_PREHASH_Amount, expected_upload_cost); +					msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); +					msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); +					msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); +					msg->addStringFast(_PREHASH_Description, NULL); +					msg->sendReliable(region->getHost()); +				}  			} -		} -		if(is_balance_sufficient) -		{ -			// Actually add the upload to inventory -			llinfos << "Adding " << uuid << " to inventory." << llendl; -			const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); -			if(folder_id.notNull()) +			if(is_balance_sufficient)  			{ -				U32 next_owner_perms = data->mNextOwnerPerm; -				if(PERM_NONE == next_owner_perms) +				// Actually add the upload to inventory +				llinfos << "Adding " << uuid << " to inventory." << llendl; +				const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); +				if(folder_id.notNull())  				{ -					next_owner_perms = PERM_MOVE | PERM_TRANSFER; +					U32 next_owner_perms = data->mNextOwnerPerm; +					if(PERM_NONE == next_owner_perms) +					{ +						next_owner_perms = PERM_MOVE | PERM_TRANSFER; +					} +					create_inventory_item(gAgent.getID(), gAgent.getSessionID(), +							      folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), +							      data->mAssetInfo.getDescription(), data->mAssetInfo.mType, +							      data->mInventoryType, NOT_WEARABLE, next_owner_perms, +							      LLPointer<LLInventoryCallback>(NULL)); +				} +				else +				{ +					llwarns << "Can't find a folder to put it in" << llendl;  				} -				create_inventory_item(gAgent.getID(), gAgent.getSessionID(), -					folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), -					data->mAssetInfo.getDescription(), data->mAssetInfo.mType, -					data->mInventoryType, NOT_WEARABLE, next_owner_perms, -					LLPointer<LLInventoryCallback>(NULL)); -			} -			else -			{ -				llwarns << "Can't find a folder to put it in" << llendl;  			}  		} -	} -	else // 	if(result >= 0) -	{ -		LLSD args; -		args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); -		args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); -		LLNotificationsUtil::add("CannotUploadReason", args); +		else // 	if(result >= 0) +		{ +			LLSD args; +			args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); +			args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); +			LLNotificationsUtil::add("CannotUploadReason", args); +		}  	}  	LLUploadDialog::modalUploadFinished();  	delete data; +	data = NULL;  	// *NOTE: This is a pretty big hack. What this does is check the  	// file picker if there are any more pending uploads. If so, diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index ace5c5038e..2858081dc9 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -233,6 +233,10 @@ public:  extern LLViewerObjectList gObjectList;  // Inlines +/** + * Note: + * it will return NULL for offline avatar_id  + */  inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)  {  	std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 9893eb5dce..b66f58d853 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1519,12 +1519,12 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		}  		else if (!isJustBound() && mCachedRawImageReady)  		{ -			if(mBoostLevel < BOOST_HIGH) -			{ -				// We haven't rendered this in a while, de-prioritize it -				desired_discard += 2; -			} -			else +			//if(mBoostLevel < BOOST_HIGH) +			//{ +			//	// We haven't rendered this in a while, de-prioritize it +			//	desired_discard += 2; +			//} +			//else  			{  				// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is  				desired_discard = cur_discard; @@ -2342,14 +2342,8 @@ void LLViewerFetchedTexture::setCachedRawImage()  			{  				--i ;  			} -			//if(mForSculpt) -			//{ -			//	mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ; -			//} -			//else -			{ -				mRawImage->scale(w >> i, h >> i) ; -			} +			 +			mRawImage->scale(w >> i, h >> i) ;  		}  		mCachedRawImage = mRawImage ;  		mCachedRawDiscardLevel = mRawDiscardLevel + i ;			 @@ -2699,7 +2693,7 @@ void LLViewerLODTexture::processTextureStats()  		}  		else  		{ -			if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f) +			if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f)  			{  				//if is a big image and not being used recently, nor close to the view point, do not load hi-res data.  				mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ; @@ -2885,12 +2879,11 @@ LLViewerMediaTexture::~LLViewerMediaTexture()  void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)  { -	mGLTexturep = NULL ; -	init(false); +	llassert(mGLTexturep.notNull()) ; +  	mUseMipMaps = usemipmaps ;  	getLastReferencedTimer()->reset() ; - -	generateGLTexture() ; +	mGLTexturep->setUseMipMaps(mUseMipMaps) ;  	mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ;  } @@ -2995,6 +2988,10 @@ void LLViewerMediaTexture::initVirtualSize()  void LLViewerMediaTexture::addMediaToFace(LLFace* facep)   { +	if(facep) +	{ +		facep->setHasMedia(true) ; +	}  	if(!mIsPlaying)  	{  		return ; //no need to add the face because the media is not in playing. @@ -3005,14 +3002,16 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep)  void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep)   { -	if(!mIsPlaying) -	{ -		return ; //no need to remove the face because the media is not in playing. -	}  	if(!facep)  	{  		return ;  	} +	facep->setHasMedia(false) ; + +	if(!mIsPlaying) +	{ +		return ; //no need to remove the face because the media is not in playing. +	}	  	mIsPlaying = FALSE ; //set to remove the media from the face.  	switchTexture(facep) ; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4a86e1ca41..b76a2e150f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2463,6 +2463,8 @@ void LLViewerWindow::updateUI()  {  	static std::string last_handle_msg; +	LLConsole::updateClass(); +  	// animate layout stacks so we have up to date rect for world view  	LLLayoutStack::updateClass(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f2f769980b..7a6a48d1b3 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1492,9 +1492,9 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)  	//-------------------------------------------------------------------------  	// parse the file  	//------------------------------------------------------------------------- -	BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE ); +	BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE ); -	if (!success) +	if (!parsesuccess)  	{  		llerrs << "Can't parse skeleton file: " << filename << llendl;  		return FALSE; @@ -1505,11 +1505,13 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)  	if (!root)   	{  		llerrs << "No root node found in avatar skeleton file: " << filename << llendl; +		return FALSE;  	}  	if( !root->hasName( "linden_skeleton" ) )  	{  		llerrs << "Invalid avatar skeleton file header: " << filename << llendl; +		return FALSE;  	}  	std::string version; @@ -1517,6 +1519,7 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)  	if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )  	{  		llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl; +		return FALSE;  	}  	return TRUE; @@ -2192,13 +2195,16 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  	// store off last frame's root position to be consistent with camera position  	LLVector3 root_pos_last = mRoot.getWorldPosition();  	BOOL detailed_update = updateCharacter(agent); -	BOOL voice_enabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel();  	if (gNoRender)  	{  		return TRUE;  	} +	static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false); +	bool voice_enabled = (visualizers_in_calls || gVoiceClient->inProximalChannel()) && +						 gVoiceClient->getVoiceEnabled(mID); +  	idleUpdateVoiceVisualizer( voice_enabled );  	idleUpdateMisc( detailed_update );  	idleUpdateAppearanceAnimation(); @@ -3090,7 +3096,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  	if (!visible)  	{ -		//updateMotions(LLCharacter::HIDDEN_UPDATE); +		updateMotions(LLCharacter::HIDDEN_UPDATE);  		return FALSE;  	} diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index bb09a18cc3..dfd67d0c38 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -122,7 +122,8 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess  	mState(STATE_NO_CHANNEL_INFO),   	mSessionName(session_name),  	mCallDirection(OUTGOING_CALL), -	mIgnoreNextSessionLeave(FALSE) +	mIgnoreNextSessionLeave(FALSE), +	mCallEndedByAgent(false)  {  	mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName; @@ -412,7 +413,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)  	EState old_state = mState;  	mState = new_state;  	if (!mStateChangedCallback.empty()) -		mStateChangedCallback(old_state, mState, mCallDirection); +		mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);  }  //static @@ -779,7 +780,8 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)  			}  			else  			{ -				// other user hung up				 +				// other user hung up, so we didn't end the call				 +				mCallEndedByAgent = false;			  			}  			deactivate();  		} @@ -810,6 +812,9 @@ void LLVoiceChannelP2P::activate()  {  	if (callStarted()) return; +	//call will be counted as ended by user unless this variable is changed in handleStatusChange() +	mCallEndedByAgent = true; +  	LLVoiceChannel::activate();  	if (callStarted()) diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index cb86671305..941cccacc3 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -58,7 +58,7 @@ public:  		OUTGOING_CALL  	} EDirection; -	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction)> state_changed_signal_t; +	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t;  	// on current channel changed signal  	typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; @@ -122,6 +122,8 @@ protected:  	std::string	mSessionName;  	LLSD mNotifyArgs;  	LLSD mCallDialogPayload; +	// true if call was ended by agent +	bool mCallEndedByAgent;  	BOOL		mIgnoreNextSessionLeave;  	LLHandle<LLPanel> mLoginNotificationHandle; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index bfe38c14ba..fa00396c34 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -679,6 +679,7 @@ void LLVOVolume::updateTextureVirtualSize()  			vsize = area;  			imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);   			face->setPixelArea(area); // treat as full screen +			face->setVirtualSize(vsize);  		}  		else  		{ @@ -695,8 +696,7 @@ void LLVOVolume::updateTextureVirtualSize()  				gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE);  			}  		} -		 -		face->setVirtualSize(vsize); +				  		if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))  		{  			if (vsize < min_vsize) min_vsize = vsize; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index bd22fc5f2e..dd9634a234 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1355,6 +1355,7 @@ void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep)  	if (!drawablep)  	{  		llerrs << "updateMove called with NULL drawablep" << llendl; +		return;  	}  	if (drawablep->isState(LLDrawable::EARLY_MOVE))  	{ diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 44c9284b36..593bbe4b5e 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -369,7 +369,7 @@ Leyla Linden               </text>               layout="topleft"               left_delta="0"               name="Sell with landowners objects in parcel." -             top_pad="-3" +             top_pad="-2"               width="186">                  Objects included in sale              </text> diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index cc9afe4474..2bafd1bdef 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -96,13 +96,24 @@ No Answer.  Please try again later.     height="40"     layout="topleft"     left="77" -   name="nearby_P2P" +   name="nearby_P2P_by_other"     top="27"     width="315"     word_wrap="true">      [VOICE_CHANNEL_NAME] has ended the call.  [RECONNECT_NEARBY]    </text>    <text +   font="SansSerifLarge" +   height="40" +   layout="topleft" +   left="77" +   name="nearby_P2P_by_agent" +   top="27" +   width="315" +   word_wrap="true"> +    You have ended the call.  [RECONNECT_NEARBY] +  </text> +  <text       font="SansSerif"       height="50"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index df6c7bd9cb..07a366da7f 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -55,9 +55,10 @@          </menu_item_call>          <menu_item_check           label="My Inventory" -         layout="topleft"           name="Inventory" -         shortcut="control|shift|I"> +         layout="topleft" +         shortcut="control|shift|I" +		 visible="false">              <menu_item_check.on_check               function="Floater.Visible"               parameter="inventory" /> @@ -65,24 +66,31 @@               function="Floater.Toggle"               parameter="inventory" />          </menu_item_check> -        <menu_item_call -         label="Show Inventory in Side Tray" +        <menu_item_check +         label="My Inventory"           name="ShowSidetrayInventory" +         layout="topleft"           shortcut="control|I" -         visible="false"> -            <menu_item_call.on_click +		 visible="true"> +            <menu_item_check.on_check +             function="SidetrayPanelVisible" +             parameter="sidepanel_inventory" /> +            <menu_item_check.on_click               function="ShowSidetrayPanel"               parameter="sidepanel_inventory" /> -        </menu_item_call> -        <menu_item_call +        </menu_item_check> +        <menu_item_check           label="My Gestures"           layout="topleft"           name="Gestures"           shortcut="control|G"> -            <menu_item_call.on_click +            <menu_item_check.on_check +             function="Floater.Visible" +             parameter="gestures" /> +            <menu_item_check.on_click               function="Floater.Toggle"               parameter="gestures" /> -        </menu_item_call> +        </menu_item_check>          <menu           label="My Status"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 1f16aea2ef..5f46ad7860 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -159,7 +159,6 @@ Maximum 200 per group daily           left_pad="3"           max_length="511"           name="create_message" -         text_type="ascii"           top_delta="0"           width="220"           word_wrap="true" /> diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index c7e5b25e06..28c4adf67c 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -11,15 +11,6 @@       name="avatar_icon"       top="-5"       width="105"/> -    <text -     follows="top|left|right" -     font="SansSerifLarge" -     height="19" -     layout="topleft" -     name="avatar_name" -     use_ellipses="true" -     value="Unknown" -     width="110" />      <layout_stack       mouse_opaque="false"       border_size="0" @@ -30,7 +21,7 @@       left="5"       name="button_stack"       orientation="vertical" -     top_pad="-5" +     top_pad="5"       width="105">          <layout_panel           mouse_opaque="false" 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 a0ad38cf76..34fd3352a3 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -56,16 +56,6 @@           name="adhoc_icon"           top="3"           width="18" /> -        <!--<icon -         follows="right" -         height="20" -         image_name="" -         layout="topleft" -         left="3" -         mouse_opaque="true" -         name="sys_msg_icon" -         top="0" -         width="20" />-->          <text           follows="left|right"           font.style="BOLD" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 4030c7184a..c6a4233c9c 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -37,7 +37,7 @@ halign="center"       top_pad="4"       width="305">          <inventory_panel -	border="false" +	       border="false"           follows="all"           height="295"           label="MY INVENTORY" @@ -48,7 +48,7 @@ halign="center"           top="16"           width="290" />          <inventory_panel -	border="false" +	       border="false"           follows="all"           height="295"           label="RECENT" @@ -67,7 +67,7 @@ halign="center"       height="30"       layout="bottomleft"       left="0" -	 visible="true" +	   visible="true"       name="bottom_panel"       width="330">          <button @@ -118,7 +118,7 @@ halign="center"       mouse_opaque="false"       name="Inventory Menu"       top="0" -	 visible="true" +	   visible="true"       width="290">          <menu           height="101" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 31ea54cf40..446bf0dc6e 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -236,7 +236,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t               layout="topleft"               left="0"               name="group_list" -             no_filtered_groups_msg="No groups" +             no_filtered_groups_msg="[secondlife:///app/search/groups Try fine the group in search?]"               no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]"               top="0"               width="313" /> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 887a89d518..9ef3649d9c 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -24,6 +24,7 @@ bg_opaque_color="DkGray2"    layout="topleft"    left="6"    name="picks_panel_text" +  wrap="true"    top="10"    width="313"/>   <accordion diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 433dfc17fe..2e81139ef2 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -9,13 +9,22 @@   name="chat"   top="1"   width="517"> -    <radio_group +  <text +   follows="left|top" +   layout="topleft" +   left="30" +   height="12" +   width="120" +   top="10"> +    Font size: +  </text> +  <radio_group       height="30"       layout="topleft" -     left="30" -	 control_name="ChatFontSize" +     left="40" +	   control_name="ChatFontSize"       name="chat_font_size" -     top="10" +     top_pad="0"       width="440">          <radio_item           height="16" @@ -45,12 +54,24 @@           top_delta="0"           width="125" />      </radio_group> + +    <text +      follows="left|top" +      layout="topleft" +      left="30" +      height="12" +      top_pad="10"  +      width="120" +      > +    Font colors: +    </text>   +        <color_swatch       can_apply_immediately="true"       follows="left|top"       height="47"       layout="topleft" -     left="30" +     left="40"       name="user"       top_pad="10"       width="44" > @@ -79,7 +100,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="180" +     left="190"       name="agent"       top_pad="-17"       width="44" > @@ -110,7 +131,7 @@       height="47"       label_width="60"       layout="topleft" -     left="350" +     left="360"       name="im"       top_pad="-17"       width="44"> @@ -141,7 +162,7 @@       height="47"       label_width="44"       layout="topleft" -     left="30" +     left="40"       name="system"       top_pad="40"       width="44" > @@ -171,7 +192,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="180" +     left="190"       name="script_error"       top_pad="-17"       width="44"> @@ -201,7 +222,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="350" +     left="360"       name="objects"       top_pad="-17"       width="44" > @@ -231,7 +252,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="30" +     left="40"       name="owner"       top_pad="40"       width="44" > @@ -261,7 +282,7 @@       follows="left|top"       height="47"       layout="topleft" -     left="180" +     left="190"       name="links"       top_pad="-17"       width="44" > @@ -314,6 +335,8 @@       top_pad="5"       width="400" />      <text +     follows="left|top" +     layout="topleft"       left="30"       height="20"       width="120" @@ -321,17 +344,20 @@       Show IMs in:      </text>      <text -	 left_pad="6" -	 height="20" -	 width="100" -	 text_color="White_25" -	 > +     follows="left|top" +     layout="topleft" +     top_delta="0"  +     left="120"  +  	 height="20" +	   width="100" +     text_color="White_25" +	  >        (requires restart)        </text>      <radio_group       height="30"       layout="topleft" -     left="30" +     left="40"       control_name="ChatWindow"       name="chat_window"       top_pad="0" 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 f7e3ede93c..f78d90c434 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -17,6 +17,7 @@       follows="left|bottom"       height="23"       label="Clear History" +     tool_tip="Clear login image, last location, teleport history, web, and texture cache"       layout="topleft"       left="30"       name="clear_cache" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index a5dc14c69d..39762d57fb 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1805,7 +1805,7 @@ Clears (deletes) the media and all params from the given face.  	<string name="LeaveMouselook">Press ESC to return to World View</string>  	<!-- inventory --> -	<string name="InventoryNoMatchingItems">No matching items found in inventory.</string> +	<string name="InventoryNoMatchingItems">[secondlife:///app/search/groups No matching items found in inventory.Try "Search"?]</string>    <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>  	<string name="InventoryNoTexture">  		You do not have a copy of @@ -2129,7 +2129,7 @@ this texture in your inventory  	<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>    <!-- panel picks --> -  <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string> +  <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>    <string name="PicksClassifiedsLoadingText">Loading...</string>  	<!-- Multi Preview Floater --> diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index 1228f6be3d..0720621f0b 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -16,6 +16,6 @@  	  image_unselected="Search"  	  image_selected="Search" />    <clear_button label="" -   image_unselected="Icon_Close_Foreground" -   image_selected="Icon_Close_Press" /> +   image_unselected="Icon_Close_Toast" +   image_selected="Icon_Close_Toast" />  </filter_editor> diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index 1616e4c3f7..a9a760b3a4 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -15,7 +15,11 @@      height="13"   	  image_unselected="Search"  	  image_selected="Search" /> -  <clear_button  +  <clear_button +   bottom="4" +   height="16"     image_unselected="Icon_Close_Foreground" -   image_selected="Icon_Close_Press" /> +   image_selected="Icon_Close_Press" +   pad_right="4" +   width="16" />  </search_editor> diff --git a/install.xml b/install.xml index 1e8fa70d46..2461ac8786 100644 --- a/install.xml +++ b/install.xml @@ -962,9 +962,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>windows</key>            <map>              <key>md5sum</key> -            <string>df0f751818dddb566d55499286c727a8</string> +            <string>1e9798dc424a6f6c2bea50649bbcc7ae</string>              <key>url</key> -            <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100208.tar.bz2</uri> +            <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100210.tar.bz2</uri>            </map>          </map>        </map>  | 
