diff options
| author | angela <angela@lindenlab.com> | 2009-11-03 11:09:44 +0800 | 
|---|---|---|
| committer | angela <angela@lindenlab.com> | 2009-11-03 11:09:44 +0800 | 
| commit | 0b1ed9af5f32c7869cdf05763e4d6d5730b66327 (patch) | |
| tree | 986e2baeee191338dcb3c063af80992b47f1ddb9 | |
| parent | 399e922d33ae36d415431a512020771e058454cd (diff) | |
| parent | 3c1c0d7544805df7d77b7f2af4ab1f83ebf0839c (diff) | |
merge
70 files changed, 888 insertions, 386 deletions
| @@ -1,6 +1,10 @@  syntax: glob +# WinMerge temp files +*.bak +# Compiled python bytecode  *.pyc +# Emacs temp files  *~  .*.swp  LICENSES diff --git a/indra/cmake/DeploySharedLibs.cmake b/indra/cmake/DeploySharedLibs.cmake new file mode 100644 index 0000000000..a7e772bd75 --- /dev/null +++ b/indra/cmake/DeploySharedLibs.cmake @@ -0,0 +1,67 @@ +# DeploySharedLibs.cmake +# This is a script to be run at build time! Its not part of the cmake configuration! +# See indra/cmake/LLSharedLibs.cmake for a macro that simplifies adding a command to a target to run this script. + +# This  script requires a few cmake variable to be set on the command line: +# BIN_NAME= The full path the the binary to search for dependecies. +# SEARCH_DIRS= The full paths to dirs to search for dependencies. +# DST_PATH= The full path where the dependecies will be copied.  +include(GetPrerequisites) +message("Getting recursive dependencies for file: ${BIN_NAME}") +set(EXCLUDE_SYSTEM 1) +set(RECURSE 1) +get_filename_component(EXE_PATH ${BIN_NAME} PATH) + +get_prerequisites( ${BIN_NAME} RESULTS ${EXCLUDE_SYSTEM} ${RECURSE} "${EXE_PATH}" "${SEARCH_DIRS}" ) + +foreach(DEP ${RESULTS}) +  Message("Processing dependency: ${DEP}") +  get_filename_component(DEP_FILE ${DEP} NAME) +  set(DEP_FILES ${DEP_FILES} ${DEP_FILE}) +endforeach(DEP) + +if(DEP_FILES) +  list(REMOVE_DUPLICATES DEP_FILES) +endif(DEP_FILES) + +foreach(DEP_FILE ${DEP_FILES}) +  if(FOUND_FILES) +	list(FIND FOUND_FILES ${DEP_FILE} FOUND) +  else(FOUND_FILES) +	set(FOUND -1) +  endif(FOUND_FILES) + +  if(FOUND EQUAL -1) +	find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH) +	if(DEP_PATH) +	  set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}") +	  set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call. +	else(DEP_PATH) +	  set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE}) +	endif(DEP_PATH) +  endif(FOUND EQUAL -1) +endforeach(DEP_FILE) + +if(MISSING_FILES) +  message("Missing:") +  foreach(FILE ${MISSING_FILES}) +	message("  ${FILE}") +  endforeach(FILE) +  message("Searched in:") +  foreach(SEARCH_DIR ${SEARCH_DIRS}) +	message("  ${SEARCH_DIR}") +  endforeach(SEARCH_DIR) +  message(FATAL_ERROR "Failed") +endif(MISSING_FILES) + +if(FOUND_FILES) +  foreach(FILE ${FOUND_FILES}) +	get_filename_component(DST_FILE ${FILE} NAME) +	set(DST_FILE "${DST_PATH}/${DST_FILE}") +	message("Copying ${FILE} to ${DST_FILE}") +	execute_process( +	  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE} +	  ) +  endforeach(FILE ${FOUND_FILES}) +endif(FOUND_FILES) +message("Success!") diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake new file mode 100644 index 0000000000..a8c81609bb --- /dev/null +++ b/indra/cmake/LLSharedLibs.cmake @@ -0,0 +1,31 @@ +# ll_deploy_sharedlibs_command +# target_exe: the cmake target of the executable for which the shared libs will be deployed. +# search_dirs: a list of dirs to search for the dependencies +# dst_path: path to copy deps to, relative to the output location of the target_exe +macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path)  +  get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION) + +  if(DARWIN) +    get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE) +    if(IS_BUNDLE) +      get_filename_component(TARGET_FILE ${OUTPUT_LOCATION} NAME) +      set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS) +      set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE}) +    endif(IS_BUNDLE) +  else(DARWIN) +    message(FATAL_ERROR "Only darwin currently supported!") +  endif(DARWIN) +   +  add_custom_command( +    TARGET ${target_exe} POST_BUILD +    COMMAND ${CMAKE_COMMAND}  +    ARGS +    "-DBIN_NAME=\"${OUTPUT_LOCATION}\"" +    "-DSEARCH_DIRS=\"${search_dirs}\"" +    "-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\"" +    "-P" +    "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake" +    ) + +endmacro(ll_deploy_sharedlibs_command) + diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 721e5670e7..c027aa7bdd 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -671,9 +671,9 @@ std::string ll_convert_wide_to_string(const wchar_t* in)  }  #endif // LL_WINDOWS -long LLStringOps::sltOffset; -long LLStringOps::localTimeOffset; -bool LLStringOps::daylightSavings; +long LLStringOps::sPacificTimeOffset = 0; +long LLStringOps::sLocalTimeOffset = 0; +bool LLStringOps::sPacificDaylightTime = 0;  std::map<std::string, std::string> LLStringOps::datetimeToCodes;  S32	LLStringOps::collate(const llwchar* a, const llwchar* b) @@ -700,11 +700,11 @@ void LLStringOps::setupDatetimeInfo (bool daylight)  	tmpT = gmtime (&nowT);  	gmtT = mktime (tmpT); -	localTimeOffset = (long) (gmtT - localT); +	sLocalTimeOffset = (long) (gmtT - localT); -	daylightSavings = daylight; -	sltOffset = (daylightSavings? 7 : 8 ) * 60 * 60; +	sPacificDaylightTime = daylight; +	sPacificTimeOffset = (sPacificDaylightTime? 7 : 8 ) * 60 * 60;  	datetimeToCodes["wkday"]	= "%a";		// Thu  	datetimeToCodes["weekday"]	= "%A";		// Thursday @@ -957,7 +957,7 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token,  	}  	else if (param != "utc") // slt  	{ -		secFromEpoch -= LLStringOps::getSltOffset(); +		secFromEpoch -= LLStringOps::getPacificTimeOffset();  	}  	// if never fell into those two ifs above, param must be utc @@ -980,7 +980,7 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token,  		{  			// "slt" = Second Life Time, which is deprecated.  			// If not utc or user local time, fallback to Pacific time -			replacement = LLStringOps::getDaylightSavings() ? "PDT" : "PST"; +			replacement = LLStringOps::getPacificDaylightTime() ? "PDT" : "PST";  		}  		return true;  	} diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 0f2f05a0d8..edbb007f61 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -151,9 +151,9 @@ struct char_traits<U16>  class LL_COMMON_API LLStringOps
  {
  private:
 -	static long sltOffset;
 -	static long localTimeOffset;
 -	static bool daylightSavings;
 +	static long sPacificTimeOffset;
 +	static long sLocalTimeOffset;
 +	static bool sPacificDaylightTime;
  	static std::map<std::string, std::string> datetimeToCodes;
  public:
 @@ -184,10 +184,13 @@ public:  	static S32	collate(const char* a, const char* b) { return strcoll(a, b); }
  	static S32	collate(const llwchar* a, const llwchar* b);
 -	static void setupDatetimeInfo (bool daylight);
 -	static long getSltOffset (void) {return sltOffset;}
 -	static long getLocalTimeOffset (void) {return localTimeOffset;}
 -	static bool getDaylightSavings (void) {return daylightSavings;}
 +	static void setupDatetimeInfo(bool pacific_daylight_time);
 +	static long getPacificTimeOffset(void) { return sPacificTimeOffset;}
 +	static long getLocalTimeOffset(void) { return sLocalTimeOffset;}
 +	// Is the Pacific time zone (aka server time zone)
 +	// currently in daylight savings time?
 +	static bool getPacificDaylightTime(void) { return sPacificDaylightTime;}
 +
  	static std::string getDatetimeCode (std::string key);
  };
 diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 8bb9e0d9ff..aca4dc56ee 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -135,6 +135,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)  				res->mKey = key;  				res->setInstanceName(name);  				res->applyRectControl(); // Can't apply rect control until setting instance name +				res->applyDockState();//same...  				if (res->mAutoTile && !res->getHost() && index > 0)  				{  					const LLRect& cur_rect = res->getRect(); diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt index daf3e10857..1d6494fecf 100644 --- a/indra/mac_crash_logger/CMakeLists.txt +++ b/indra/mac_crash_logger/CMakeLists.txt @@ -10,6 +10,7 @@ include(LLMessage)  include(LLVFS)  include(LLXML)  include(Linking) +include(LLSharedLibs)  include_directories(      ${LLCOMMON_INCLUDE_DIRS} @@ -74,3 +75,7 @@ add_custom_command(      ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib    ) +ll_deploy_sharedlibs_command( +  mac-crash-logger +  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}"  +  "../Resources")  diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt index 0eac76fa69..d7bd6f993c 100644 --- a/indra/mac_updater/CMakeLists.txt +++ b/indra/mac_updater/CMakeLists.txt @@ -77,3 +77,7 @@ add_custom_command(      ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib    ) +ll_deploy_sharedlibs_command( +  mac-updater +  "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}"  +  "../Resources")  diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp index e873a0d034..99e0199a29 100644 --- a/indra/media_plugins/example/media_plugin_example.cpp +++ b/indra/media_plugins/example/media_plugin_example.cpp @@ -52,7 +52,7 @@ class MediaPluginExample :  	private:  		bool init(); -		void update( int milliseconds ); +		void update( F64 milliseconds );  		void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );  		bool mFirstTime; @@ -276,7 +276,7 @@ void MediaPluginExample::receiveMessage( const char* message_string )  					if ( key == ' ')  					{  						mLastUpdateTime = 0; -						update( 0 ); +						update( 0.0f );  					};  				};  			} @@ -293,7 +293,7 @@ void MediaPluginExample::receiveMessage( const char* message_string )  				mLastUpdateTime = 0;  				mFirstTime = true;  				mStopAction = false; -				update( 0 ); +				update( 0.0f );  			}  			else  			if ( message_name == "browse_stop" ) @@ -302,7 +302,7 @@ void MediaPluginExample::receiveMessage( const char* message_string )  					mXInc[ n ] = mYInc[ n ] = 0;  				mStopAction = true; -				update( 0 ); +				update( 0.0f );  			}  			else  			{ @@ -339,7 +339,7 @@ void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned ch  ////////////////////////////////////////////////////////////////////////////////  // -void MediaPluginExample::update( int milliseconds ) +void MediaPluginExample::update( F64 milliseconds )  {  	if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )  		return; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c4722b772e..768fdd4103 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5294,7 +5294,6 @@        <key>Value</key>        <integer>1</integer>      </map> -      <key>PluginInstancesCPULimit</key>      <map>        <key>Comment</key> @@ -5361,6 +5360,17 @@        <key>Value</key>  	  <integer>13</integer>      </map> +	<key>PrimMediaControlsUseHoverControlSet</key> +	<map> +	  <key>Comment</key> +      <string>Whether or not hovering over prim media uses minimal "hover" controls or the authored control set.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>PrimMediaMaxRetries</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 06c9171d67..873215169e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -238,8 +238,6 @@ U32	gFrameCount = 0;  U32 gForegroundFrameCount = 0; // number of frames that app window was in foreground  LLPumpIO* gServicePump = NULL; -BOOL gPacificDaylightTime = FALSE; -  U64 gFrameTime = 0;  F32 gFrameTimeSeconds = 0.f;  F32 gFrameIntervalSeconds = 0.f; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index d970aa6ae1..73256a8fe6 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -301,10 +301,6 @@ extern U32 gForegroundFrameCount;  extern LLPumpIO* gServicePump; -// Is the Pacific time zone (aka server time zone) -// currently in daylight savings time? -extern BOOL gPacificDaylightTime; -  extern U64      gFrameTime;					// The timestamp of the most-recently-processed frame  extern F32		gFrameTimeSeconds;			// Loses msec precision after ~4.5 hours...  extern F32		gFrameIntervalSeconds;		// Elapsed time between current and previous gFrameTimeSeconds diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 65a2b8b5e6..7b2dc02864 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -79,6 +79,8 @@ static const LLFlatListView::ItemReverseComparator REVERSE_NAME_COMPARATOR(NAME_  LLAvatarList::Params::Params()  : ignore_online_status("ignore_online_status", false)  , show_last_interaction_time("show_last_interaction_time", false) +, show_info_btn("show_info_btn", true) +, show_profile_btn("show_profile_btn", true)  {  } @@ -89,6 +91,9 @@ LLAvatarList::LLAvatarList(const Params& p)  , mContextMenu(NULL)  , mDirty(true) // to force initial update  , mLITUpdateTimer(NULL) +, mShowIcons(true) +, mShowInfoBtn(p.show_info_btn) +, mShowProfileBtn(p.show_profile_btn)  {  	setCommitOnSelectionChange(true); @@ -253,6 +258,8 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is  	item->childSetVisible("info_btn", false);  	item->setAvatarIconVisible(mShowIcons); +	item->setShowInfoBtn(mShowInfoBtn); +	item->setShowProfileBtn(mShowProfileBtn);  	addItem(item, id, pos);  } diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 8f2f0249a6..51d3760d39 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -59,6 +59,8 @@ public:  	{  		Optional<bool> ignore_online_status; // show all items as online  		Optional<bool> show_last_interaction_time; // show most recent interaction time. *HACK: move this to a derived class +		Optional<bool> show_info_btn; +		Optional<bool> show_profile_btn;  		Params();  	}; @@ -96,6 +98,8 @@ private:  	bool mShowLastInteractionTime;  	bool mDirty;  	bool mShowIcons; +	bool mShowInfoBtn; +	bool mShowProfileBtn;  	LLTimer*				mLITUpdateTimer; // last interaction time update timer  	std::string				mIconParamName; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 8464430501..a7ac14c948 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -42,8 +42,6 @@  #include "llavatariconctrl.h"  #include "llbutton.h" -S32 LLAvatarListItem::sIconWidth = 0; -  LLAvatarListItem::LLAvatarListItem()  :	LLPanel(),  	mAvatarIcon(NULL), @@ -53,15 +51,17 @@ LLAvatarListItem::LLAvatarListItem()  	mInfoBtn(NULL),  	mProfileBtn(NULL),  	mContextMenu(NULL), -	mOnlineStatus(E_UNKNOWN) +	mOnlineStatus(E_UNKNOWN), +	mShowInfoBtn(true), +	mShowProfileBtn(true)  {  	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml");  	// Remember avatar icon width including its padding from the name text box,  	// so that we can hide and show the icon again later. -	if (!sIconWidth) -	{ -		sIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft; -	} + +	mIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft; +	mInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight; +	mProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight;  }  LLAvatarListItem::~LLAvatarListItem() @@ -116,8 +116,8 @@ BOOL  LLAvatarListItem::postBuild()  void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)  {  	childSetVisible("hovered_icon", true); -	mInfoBtn->setVisible(true); -	mProfileBtn->setVisible(true); +	mInfoBtn->setVisible(mShowInfoBtn); +	mProfileBtn->setVisible(mShowProfileBtn);  	LLPanel::onMouseEnter(x, y, mask);  } @@ -202,6 +202,34 @@ void LLAvatarListItem::setLastInteractionTime(const std::string& val)  	mLastInteractionTime->setValue(val);  } +void LLAvatarListItem::setShowInfoBtn(bool show) +{ +	// Already done? Then do nothing. +	if(mShowInfoBtn == show) +		return; +	mShowInfoBtn = show; +	S32 width_delta = show ? - mInfoBtnWidth : mInfoBtnWidth; + +	//Translating speaking indicator +	mSpeakingIndicator->translate(width_delta, 0); +	//Reshaping avatar name +	mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight()); +} + +void LLAvatarListItem::setShowProfileBtn(bool show) +{ +	// Already done? Then do nothing. +	if(mShowProfileBtn == show) +			return; +	mShowProfileBtn = show; +	S32 width_delta = show ? - mProfileBtnWidth : mProfileBtnWidth; + +	//Translating speaking indicator +	mSpeakingIndicator->translate(width_delta, 0); +	//Reshaping avatar name +	mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight()); +} +  void LLAvatarListItem::setAvatarIconVisible(bool visible)  {  	// Already done? Then do nothing. @@ -213,7 +241,7 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible)  	// Move the avatar name horizontally by icon size + its distance from the avatar name.  	LLRect name_rect = mAvatarName->getRect(); -	name_rect.mLeft += visible ? sIconWidth : -sIconWidth; +	name_rect.mLeft += visible ? mIconWidth : -mIconWidth;  	mAvatarName->setRect(name_rect);  } diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 10c0b17005..cd7a85c3dc 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -64,6 +64,9 @@ public:  	void setName(const std::string& name);  	void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);  	void setLastInteractionTime(const std::string& val); +	//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly +	void setShowProfileBtn(bool hide); +	void setShowInfoBtn(bool hide);  	void setAvatarIconVisible(bool visible);  	const LLUUID& getAvatarId() const; @@ -99,7 +102,13 @@ private:  	LLUUID mAvatarId;  	EOnlineStatus mOnlineStatus; -	static S32	sIconWidth; // icon width + padding +	//Flag indicating that info/profile button shouldn't be shown at all. +	//Speaker indicator and avatar name coords are translated accordingly +	bool mShowInfoBtn; +	bool mShowProfileBtn; +	S32	 mIconWidth; // icon width + padding +	S32  mInfoBtnWidth; //info btn width + padding +	S32  mProfileBtnWidth; //profile btn width + padding  };  #endif //LL_LLAVATARLISTITEM_H diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 7a81d0c4a1..e8812d87ee 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -62,7 +62,6 @@  #include "llviewerwindow.h"  #include "llvoavatar.h"  #include "llimview.h" -#include "llimpanel.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs @@ -719,18 +718,8 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)  			// 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); -			LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id); -			if (floater) -			{ -				std::string notifyMsg = notification->getMessage(); -				if (!notifyMsg.empty()) -				{ -					floater->addHistoryLine(notifyMsg,LLUIColorTable::instance().getColor("SystemChatColor")); -				} -			} - -			//*TODO instead of adding IM message about online/offline status -			//do something like graying avatar icon on messages from a user that went offline, and  make it colored when online. +			std::string notify_msg = notification->getMessage(); +			LLIMModel::instance().proccessOnlineOfflineNotification(session_id, notify_msg);  		}  		mModifyMask |= LLFriendObserver::ONLINE; diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 979a1a9a60..c4bfd71999 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -35,6 +35,8 @@  #include "lluictrlfactory.h"  #include "lltextbox.h"  #include "lllineeditor.h" +#include "llviewercontrol.h" +#include "llversionviewer.h"  #include "llcurrencyuimanager.h" @@ -156,6 +158,11 @@ void LLCurrencyUIManager::Impl::updateCurrencyInfo()  		"secureSessionId",  		gAgent.getSecureSessionID().asString());  	keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy); +	keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName")); +	keywordArgs.appendInt("viewerMajorVersion", LL_VERSION_MAJOR); +	keywordArgs.appendInt("viewerMinorVersion", LL_VERSION_MINOR); +	keywordArgs.appendInt("viewerPatchVersion", LL_VERSION_PATCH); +	keywordArgs.appendInt("viewerBuildVersion", LL_VERSION_BUILD);  	LLXMLRPCValue params = LLXMLRPCValue::createArray();  	params.append(keywordArgs); @@ -209,7 +216,12 @@ void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password)  	{  		keywordArgs.appendString("password", password);  	} -	 +	keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName")); +	keywordArgs.appendInt("viewerMajorVersion", LL_VERSION_MAJOR); +	keywordArgs.appendInt("viewerMinorVersion", LL_VERSION_MINOR); +	keywordArgs.appendInt("viewerPatchVersion", LL_VERSION_PATCH); +	keywordArgs.appendInt("viewerBuildVersion", LL_VERSION_BUILD); +  	LLXMLRPCValue params = LLXMLRPCValue::createArray();  	params.append(keywordArgs); diff --git a/indra/newview/lleventinfo.cpp b/indra/newview/lleventinfo.cpp index 9be45d18fb..aabd7ed997 100644 --- a/indra/newview/lleventinfo.cpp +++ b/indra/newview/lleventinfo.cpp @@ -33,7 +33,6 @@  #include "llviewerprecompiledheaders.h"  #include "lleventinfo.h" -#include "llappviewer.h"	// for gPacificDaylightTime  #include "lluuid.h"  #include "message.h" diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 63ea990d14..88658f7b9f 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -39,6 +39,7 @@  #include "llagent.h"
  #include "llappviewer.h" 
  #include "llsecondlifeurls.h"
 +#include "llvoiceclient.h"
  #include "lluictrlfactory.h"
  #include "llviewertexteditor.h"
  #include "llviewercontrol.h"
 @@ -268,6 +269,7 @@ LLSD LLFloaterAbout::getInfo()  	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
  	bool want_fullname = true;
  	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
 +	info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown";
  	// TODO: Implement media plugin version query
  	info["QT_WEBKIT_VERSION"] = "4.5.2";
 diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index 8b64f913e0..68f06b1e5b 100644 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -40,7 +40,6 @@  #include "llsd.h"  #include "lluictrlfactory.h"  #include "llviewermessage.h" -#include "llappviewer.h"		// gPacificDaylightTime  ///----------------------------------------------------------------------------  /// Class LLFloaterBump diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 8b3391726a..a199da3b00 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1043,11 +1043,15 @@ void LLFloaterPreference::onClickSetKey()  void LLFloaterPreference::setKey(KEY key)  {  	childSetValue("modifier_combo", LLKeyboard::stringFromKey(key)); +	// update the control right away since we no longer wait for apply +	getChild<LLUICtrl>("modifier_combo")->onCommit();  }  void LLFloaterPreference::onClickSetMiddleMouse()  {  	childSetValue("modifier_combo", "MiddleMouse"); +	// update the control right away since we no longer wait for apply +	getChild<LLUICtrl>("modifier_combo")->onCommit();  }  void LLFloaterPreference::onClickSkipDialogs() diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index b21df87093..dee86f4a22 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -51,6 +51,7 @@  #include "llviewerwindow.h"  #include "llvoicechannel.h"  #include "lltransientfloatermgr.h" +#include "llinventorymodel.h" @@ -265,7 +266,7 @@ void LLIMFloater::draw()  		}  	} -	LLFloater::draw(); +	LLTransientDockableFloater::draw();  } @@ -602,6 +603,162 @@ void LLIMFloater::processSessionUpdate(const LLSD& session_update)  	}  } +BOOL LLIMFloater::handleDragAndDrop(S32 x, S32 y, MASK mask, +						   BOOL drop, EDragAndDropType cargo_type, +						   void *cargo_data, EAcceptance *accept, +						   std::string& tooltip_msg) +{ + +	if (mDialog == IM_NOTHING_SPECIAL) +	{ +		LLToolDragAndDrop::handleGiveDragAndDrop(mOtherParticipantUUID, mSessionID, drop, +												 cargo_type, cargo_data, accept); +	} + +	// handle case for dropping calling cards (and folders of calling cards) onto invitation panel for invites +	else if (isInviteAllowed()) +	{ +		*accept = ACCEPT_NO; + +		if (cargo_type == DAD_CALLINGCARD) +		{ +			if (dropCallingCard((LLInventoryItem*)cargo_data, drop)) +			{ +				*accept = ACCEPT_YES_MULTI; +			} +		} +		else if (cargo_type == DAD_CATEGORY) +		{ +			if (dropCategory((LLInventoryCategory*)cargo_data, drop)) +			{ +				*accept = ACCEPT_YES_MULTI; +			} +		} +	} +	return TRUE; +} + +BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop) +{ +	BOOL rv = isInviteAllowed(); +	if(rv && item && item->getCreatorUUID().notNull()) +	{ +		if(drop) +		{ +			std::vector<LLUUID> ids; +			ids.push_back(item->getCreatorUUID()); +			inviteToSession(ids); +		} +	} +	else +	{ +		// set to false if creator uuid is null. +		rv = FALSE; +	} +	return rv; +} + +BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop) +{ +	BOOL rv = isInviteAllowed(); +	if(rv && category) +	{ +		LLInventoryModel::cat_array_t cats; +		LLInventoryModel::item_array_t items; +		LLUniqueBuddyCollector buddies; +		gInventory.collectDescendentsIf(category->getUUID(), +										cats, +										items, +										LLInventoryModel::EXCLUDE_TRASH, +										buddies); +		S32 count = items.count(); +		if(count == 0) +		{ +			rv = FALSE; +		} +		else if(drop) +		{ +			std::vector<LLUUID> ids; +			ids.reserve(count); +			for(S32 i = 0; i < count; ++i) +			{ +				ids.push_back(items.get(i)->getCreatorUUID()); +			} +			inviteToSession(ids); +		} +	} +	return rv; +} + +BOOL LLIMFloater::isInviteAllowed() const +{ + +	return ( (IM_SESSION_CONFERENCE_START == mDialog) +			 || (IM_SESSION_INVITE == mDialog) ); +} + +class LLSessionInviteResponder : public LLHTTPClient::Responder +{ +public: +	LLSessionInviteResponder(const LLUUID& session_id) +	{ +		mSessionID = session_id; +	} + +	void error(U32 statusNum, const std::string& reason) +	{ +		llinfos << "Error inviting all agents to session" << llendl; +		//throw something back to the viewer here? +	} + +private: +	LLUUID mSessionID; +}; + +BOOL LLIMFloater::inviteToSession(const std::vector<LLUUID>& ids) +{ +	LLViewerRegion* region = gAgent.getRegion(); +	if (!region) +	{ +		return FALSE; +	} + +	S32 count = ids.size(); + +	if( isInviteAllowed() && (count > 0) ) +	{ +		llinfos << "LLIMFloater::inviteToSession() - inviting participants" << llendl; + +		std::string url = region->getCapability("ChatSessionRequest"); + +		LLSD data; + +		data["params"] = LLSD::emptyArray(); +		for (int i = 0; i < count; i++) +		{ +			data["params"].append(ids[i]); +		} + +		data["method"] = "invite"; +		data["session-id"] = mSessionID; +		LLHTTPClient::post( +			url, +			data, +			new LLSessionInviteResponder( +					mSessionID)); +	} +	else +	{ +		llinfos << "LLIMFloater::inviteToSession -" +				<< " no need to invite agents for " +				<< mDialog << llendl; +		// successful add, because everyone that needed to get added +		// was added. +	} + +	return TRUE; +} +  void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info)  {  	// We may have lost a "stop-typing" packet, don't add it twice diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index d2aac57ee2..f5edb3188a 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -35,11 +35,13 @@  #include "lltransientdockablefloater.h"  #include "lllogchat.h" +#include "lltooldraganddrop.h"  class LLLineEditor;  class LLPanelChatControlPanel;  class LLChatHistory; - +class LLInventoryItem; +class LLInventoryCategory;  /**   * Individual IM window that appears at the bottom of the screen, @@ -90,10 +92,21 @@ public:  	void processIMTyping(const LLIMInfo* im_info, BOOL typing);  	void processSessionUpdate(const LLSD& session_update); +	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, +							   BOOL drop, EDragAndDropType cargo_type, +							   void *cargo_data, EAcceptance *accept, +							   std::string& tooltip_msg); +  private:  	// process focus events to set a currently active session  	/* virtual */ void onFocusLost();  	/* virtual */ void onFocusReceived(); + +	BOOL dropCallingCard(LLInventoryItem* item, BOOL drop); +	BOOL dropCategory(LLInventoryCategory* category, BOOL drop); + +	BOOL isInviteAllowed() const; +	BOOL inviteToSession(const std::vector<LLUUID>& agent_ids);  	static void		onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );  	static void		onInputEditorFocusLost(LLFocusableElement* caller, void* userdata); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 49fc9d8055..66a3e3e85c 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -89,9 +89,6 @@ LLIMMgr* gIMMgr = NULL;  const static std::string IM_SEPARATOR(": "); -std::map<LLUUID, LLIMModel::LLIMSession*> LLIMModel::sSessionsMap; - -  void toast_callback(const LLSD& msg){  	// do not show toast in busy mode or it goes from agent @@ -105,7 +102,13 @@ void toast_callback(const LLSD& msg){  	{  		return;  	} -	 + +	// Skip toasting for system messages +	if (msg["from_id"].asUUID() == LLUUID::null) +	{ +		return; +	} +  	LLSD args;  	args["MESSAGE"] = msg["message"];  	args["TIME"] = msg["time"]; @@ -232,6 +235,12 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f  	message["index"] = (LLSD::Integer)mMsgs.size();   	mMsgs.push_front(message);  + +	if (mSpeakers && from_id.notNull()) +	{ +		mSpeakers->speakerChatted(from_id); +		mSpeakers->setSpeakerTyping(from_id, FALSE); +	}  }  void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata) @@ -252,12 +261,11 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const  LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const  { -	return get_if_there(LLIMModel::instance().sSessionsMap, session_id, +	return get_if_there(mId2SessionMap, session_id,  		(LLIMModel::LLIMSession*) NULL);  } -//*TODO change name to represent session initialization aspect (IB) -void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_session_id) +void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)  {  	LLIMSession* session = findIMSession(old_session_id);  	if (session) @@ -266,8 +274,8 @@ void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_  		if (old_session_id != new_session_id)  		{ -			sSessionsMap.erase(old_session_id); -			sSessionsMap[new_session_id] = session; +			mId2SessionMap.erase(old_session_id); +			mId2SessionMap[new_session_id] = session;  			gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);  		} @@ -316,14 +324,14 @@ void LLIMModel::testMessages()  bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,   						   const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)  { -	if (is_in_map(sSessionsMap, session_id)) +	if (findIMSession(session_id))  	{  		llwarns << "IM Session " << session_id << " already exists" << llendl;  		return false;  	}  	LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids); -	sSessionsMap[session_id] = session; +	mId2SessionMap[session_id] = session;  	LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id); @@ -333,9 +341,9 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co  bool LLIMModel::clearSession(const LLUUID& session_id)  { -	if (sSessionsMap.find(session_id) == sSessionsMap.end()) return false; -	delete (sSessionsMap[session_id]); -	sSessionsMap.erase(session_id); +	if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false; +	delete (mId2SessionMap[session_id]); +	mId2SessionMap.erase(session_id);  	return true;  } @@ -383,7 +391,6 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,  	return true;  } -//*TODO rewrite chat history persistence using LLSD serialization (IB)  bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)  {  	S32 im_log_option =  gSavedPerAccountSettings.getS32("IMLogOptions"); @@ -403,6 +410,23 @@ bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, con  	return false;  } +bool LLIMModel::proccessOnlineOfflineNotification( +	const LLUUID& session_id,  +	const std::string& utf8_text) +{ +	// Add message to old one floater +	LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id); +	if ( floater ) +	{ +		if ( !utf8_text.empty() ) +		{ +			floater->addHistoryLine(utf8_text, LLUIColorTable::instance().getColor("SystemChatColor")); +		} +	} +	// Add system message to history +	return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text); +} +  bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,   						   const std::string& utf8_text, bool log2file /* = true */) {   	LLIMSession* session = findIMSession(session_id); @@ -547,8 +571,7 @@ void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_p  	}  } - -//*TODO update list of messages in a LLIMSession (IB) +//*TODO this method is better be moved to the LLIMMgr  void LLIMModel::sendMessage(const std::string& utf8_text,  					 const LLUUID& im_session_id,  					 const LLUUID& other_participant_id, @@ -1443,14 +1466,6 @@ void LLIMMgr::addMessage(  	else  	{  		floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message - -		//*TODO consider moving that speaker management stuff into model (IB) -		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(new_session_id); -		if (speaker_mgr) -		{ -			speaker_mgr->speakerChatted(gAgentID); -			speaker_mgr->setSpeakerTyping(gAgentID, FALSE); -		}  	}  	LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg); @@ -1516,7 +1531,7 @@ S32 LLIMMgr::getNumberOfUnreadIM()  	std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;  	S32 num = 0; -	for(it = LLIMModel::sSessionsMap.begin(); it != LLIMModel::sSessionsMap.end(); ++it) +	for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)  	{  		num += (*it).second->mNumUnread;  	} @@ -1582,7 +1597,9 @@ LLUUID LLIMMgr::addSession(  	LLUUID session_id = computeSessionID(dialog,other_participant_id); -	if (!LLIMModel::getInstance()->findIMSession(session_id)) +	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id); + +	if (new_session)  	{  		LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);  	} @@ -1604,6 +1621,9 @@ LLUUID LLIMMgr::addSession(  			ids);  	} +	//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions +	if (!new_session) return session_id; +	  	noteOfflineUsers(session_id, floater, ids);  	// Only warn for regular IMs - not group IMs @@ -1612,8 +1632,6 @@ LLUUID LLIMMgr::addSession(  		noteMutedUsers(session_id, floater, ids);  	} - -  	return session_id;  } @@ -2013,7 +2031,7 @@ void LLIMMgr::noteOfflineUsers(  	{  		const LLRelationship* info = NULL;  		LLAvatarTracker& at = LLAvatarTracker::instance(); -		LLIMModel* im_model = LLIMModel::getInstance(); +		LLIMModel& im_model = LLIMModel::instance();  		for(S32 i = 0; i < count; ++i)  		{  			info = at.getBuddyInfo(ids.get(i)); @@ -2024,13 +2042,7 @@ void LLIMMgr::noteOfflineUsers(  				LLUIString offline = LLTrans::getString("offline_message");  				offline.setArg("[FIRST]", first);  				offline.setArg("[LAST]", last); - -				if (floater) -				{ -					floater->addHistoryLine(offline, LLUIColorTable::instance().getColor("SystemChatColor")); -				} - -				im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, offline); +				im_model.proccessOnlineOfflineNotification(session_id, offline);  			}  		}  	} @@ -2122,7 +2134,7 @@ public:  		{  			session_id = body["session_id"].asUUID(); -			LLIMModel::getInstance()->updateSessionID(temp_session_id, session_id); +			LLIMModel::getInstance()->processSessionInitializedReply(temp_session_id, session_id);  			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);  			if (speaker_mgr) diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index d0bd594df1..f986d9dcdb 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -92,8 +92,8 @@ public:  	void	resetActiveSessionID() { mActiveSessionID.setNull(); }  	LLUUID	getActiveSessionID() { return mActiveSessionID; } -	//*TODO make it non-static as LLIMMOdel is a singleton (IB) -	static std::map<LLUUID, LLIMSession*> sSessionsMap;  //mapping session_id to session +	/** Session id to session object */ +	std::map<LLUUID, LLIMSession*> mId2SessionMap;  	typedef boost::signals2::signal<void(const LLSD&)> session_signal_t;  	typedef boost::function<void(const LLSD&)> session_callback_t; @@ -109,7 +109,7 @@ public:  	/**  	 * Rebind session data to a new session id.  	 */ -	void updateSessionID(const LLUUID& old_session_id, const LLUUID& new_session_id); +	void processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id);  	boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }  	boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); } @@ -136,7 +136,12 @@ public:  	 * It sends new message signal for each added message.  	 */  	bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true); -	 + +	/** +	 * Add a system message to an IM Model +	 */ +	bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text); +  	/**  	 * Get a session's name.   	 * For a P2P chat - it's an avatar's name,  diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 99580d0918..bfad2b1624 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -107,9 +107,12 @@ private:  	void onClickPay();  	void onClickBlock();  	void onClickReport(); +	void onClickFreeze(); +	void onClickEject();  	void onClickZoomIn();    	void onClickFindOnMap();  	bool onVisibleFindOnMap(); +	bool onVisibleFreezeEject();  	void onClickMuteVolume();  	void onVolumeChange(const LLSD& data); @@ -190,11 +193,16 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)  	mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup",	boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.Pay",	boost::bind(&LLInspectAvatar::onClickPay, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.Block",	boost::bind(&LLInspectAvatar::onClickBlock, this));	 +	mCommitCallbackRegistrar.add("InspectAvatar.Freeze", +		boost::bind(&LLInspectAvatar::onClickFreeze, this));	 +	mCommitCallbackRegistrar.add("InspectAvatar.Eject", +		boost::bind(&LLInspectAvatar::onClickEject, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.Report",	boost::bind(&LLInspectAvatar::onClickReport, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap",	boost::bind(&LLInspectAvatar::onClickFindOnMap, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this));  	mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap",	boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));	 - +	mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject",	 +		boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this));	  	// can't make the properties request until the widgets are constructed  	// as it might return immediately, so do it in postBuild. @@ -437,13 +445,13 @@ void LLInspectAvatar::nameUpdatedCallback(  void LLInspectAvatar::onClickAddFriend()  {  	LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName); +	closeFloater();  }  void LLInspectAvatar::onClickViewProfile()  { -	// hide inspector when showing profile -	setFocus(FALSE);  	LLAvatarActions::showProfile(mAvatarID); +	closeFloater();  }  bool LLInspectAvatar::onVisibleFindOnMap() @@ -451,24 +459,33 @@ bool LLInspectAvatar::onVisibleFindOnMap()  	return gAgent.isGodlike() || is_agent_mappable(mAvatarID);  } +bool LLInspectAvatar::onVisibleFreezeEject() +{ +	return enable_freeze_eject( LLSD(mAvatarID) ); +} +  void LLInspectAvatar::onClickIM()  {   	LLAvatarActions::startIM(mAvatarID); +	closeFloater();  }  void LLInspectAvatar::onClickTeleport()  {  	LLAvatarActions::offerTeleport(mAvatarID); +	closeFloater();  }  void LLInspectAvatar::onClickInviteToGroup()  {  	LLAvatarActions::inviteToGroup(mAvatarID); +	closeFloater();  }  void LLInspectAvatar::onClickPay()  {  	LLAvatarActions::pay(mAvatarID); +	closeFloater();  }  void LLInspectAvatar::onClickBlock() @@ -476,11 +493,25 @@ void LLInspectAvatar::onClickBlock()  	LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT);  	LLMuteList::getInstance()->add(mute);  	LLPanelBlockedList::showPanelAndSelect(mute.mID); +	closeFloater();  }  void LLInspectAvatar::onClickReport()  {  	LLFloaterReporter::showFromObject(mAvatarID); +	closeFloater(); +} + +void LLInspectAvatar::onClickFreeze() +{ +	handle_avatar_freeze( LLSD(mAvatarID) ); +	closeFloater(); +} + +void LLInspectAvatar::onClickEject() +{ +	handle_avatar_eject( LLSD(mAvatarID) ); +	closeFloater();  }  void LLInspectAvatar::onClickZoomIn()  diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index 091346d3b4..0b07dd4f21 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -133,6 +133,33 @@ public:  	}  }; +// Returns true if the given inventory item is a landmark pointing to the current parcel. +// Used to find out if there is at least one landmark from current parcel. +class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor +{ +private:	 +	bool mFounded;// to avoid unnecessary  check +	 +public: +	LLFistAgentParcelLandmark(): mFounded(false){} +	 +	/*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +	{ +		if (mFounded || !item || item->getType() != LLAssetType::AT_LANDMARK) +			return false; + +		LLLandmark* landmark = gLandmarkList.getAsset(item->getAssetUUID()); +		if (!landmark) // the landmark not been loaded yet +			return false; + +		LLVector3d landmark_global_pos; +		if (!landmark->getGlobalPos(landmark_global_pos)) +			return false; +		mFounded = LLViewerParcelMgr::getInstance()->inAgentParcel(landmark_global_pos); +		return mFounded; +	} +}; +  static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,  							LLInventoryModel::item_array_t& items,  							LLInventoryCollectFunctor& add) @@ -172,6 +199,16 @@ bool LLLandmarkActions::landmarkAlreadyExists()  	return findLandmarkForAgentPos() != NULL;  } +//static +bool LLLandmarkActions::hasParcelLandmark() +{ +	LLFistAgentParcelLandmark get_first_agent_landmark; +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	fetch_landmarks(cats, items, get_first_agent_landmark); +	return !items.empty(); +	 +}  // *TODO: This could be made more efficient by only fetching the FIRST  // landmark that meets the criteria diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h index 32f05e702b..312426cab0 100644 --- a/indra/newview/lllandmarkactions.h +++ b/indra/newview/lllandmarkactions.h @@ -50,9 +50,14 @@ public:  	 */  	static LLInventoryModel::item_array_t fetchLandmarksByName(std::string& name, BOOL if_use_substring);  	/** -	 * @brief Checks whether landmark exists for current parcel. +	 * @brief Checks whether landmark exists for current agent position.  	 */  	static bool landmarkAlreadyExists(); +	 +	/** +	 * @brief Checks whether landmark exists for current parcel. +	 */ +	static bool hasParcelLandmark();  	/**  	 * @brief Searches landmark for global position. diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 00f12ae2eb..8fe317a292 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -294,6 +294,11 @@ void LLLocationInputCtrl::hideList()  BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, MASK mask)  { + +	if(mAddLandmarkBtn->parentPointInView(x,y)) +	{ +		updateAddLandmarkTooltip(); +	}  	// Let the buttons show their tooltips.  	if (LLUICtrl::handleToolTip(x, y, mask))  	{ @@ -602,11 +607,12 @@ void LLLocationInputCtrl::enableAddLandmarkButton(bool val)  // depending on whether current parcel has been landmarked.  void LLLocationInputCtrl::updateAddLandmarkButton()  { -	bool landmark_exists = LLLandmarkActions::landmarkAlreadyExists(); -	enableAddLandmarkButton(!landmark_exists); - +	enableAddLandmarkButton(LLLandmarkActions::hasParcelLandmark()); +} +void LLLocationInputCtrl::updateAddLandmarkTooltip() +{  	std::string tooltip; -	if(landmark_exists) +	if(LLLandmarkActions::landmarkAlreadyExists())  	{  		tooltip = mEditLandmarkTooltip;  	} diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index c74a294ca3..44dc0cb251 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -107,6 +107,7 @@ private:  	bool 					findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);  	void					setText(const LLStringExplicit& text);  	void					updateAddLandmarkButton(); +	void 					updateAddLandmarkTooltip();  	void 					updateContextMenu();  	void					updateWidgetlayout();  	void					changeLocationPresentation(); diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 957513e154..8a8ad9d073 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -262,8 +262,9 @@ void LLNearbyChatScreenChannel::showToastsBottom()  			toast_rect.setLeftTopAndSize(getRect().mLeft , toast_top, toast_rect.getWidth() ,toast_rect.getHeight());  			toast->setRect(toast_rect); -			 +			toast->setIsHidden(false);  			toast->setVisible(TRUE); +			  			bottom = toast->getRect().mTop;  		}		  	} diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index f9eeaf1e9e..b54975b76b 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -54,10 +54,16 @@ void LLPanelChatControlPanel::onEndCallButtonClicked()  	gIMMgr->endCall(mSessionId);  } +void LLPanelChatControlPanel::onOpenVoiceControlsClicked() +{ +	// TODO: implement Voice Control Panel opening +} +  BOOL LLPanelChatControlPanel::postBuild()  {  	childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this));  	childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this)); +	childSetAction("voice_ctrls_btn", boost::bind(&LLPanelChatControlPanel::onOpenVoiceControlsClicked, this));  	return TRUE;  } @@ -73,8 +79,10 @@ void LLPanelChatControlPanel::draw()  	LLVoiceChannel* voice_channel = session->mVoiceChannel;  	if (voice_channel && voice_enabled)  	{ -		childSetVisible("end_call_btn", voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED); -		childSetVisible("call_btn", voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED); +		bool is_call_started = ( voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED ); +		childSetVisible("end_call_btn", is_call_started); +		childSetVisible("voice_ctrls_btn", is_call_started); +		childSetVisible("call_btn", ! is_call_started);  	}  	bool session_initialized = session->mSessionInitialized; diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 220b7b14ba..d25f33935a 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -50,6 +50,7 @@ public:  	void onCallButtonClicked();  	void onEndCallButtonClicked(); +	void onOpenVoiceControlsClicked();  	virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 48a93f0d42..c9598a2576 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -184,9 +184,9 @@ void LLLandmarksPanel::updateVerbs()  	if (!isTabVisible())   		return; -	BOOL enabled = isLandmarkSelected(); -	mTeleportBtn->setEnabled(enabled); -	mShowOnMapBtn->setEnabled(enabled); +	bool landmark_selected = isLandmarkSelected(); +	mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport")); +	mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map"));  	// TODO: mantipov: Uncomment when mShareBtn is supported  	// Share button should be enabled when neither a folder nor a landmark is selected diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 5af27a5ec1..34644cfe42 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -54,6 +54,7 @@  #include "llaccordionctrltab.h"  #include "llagent.h"  #include "llagentui.h" +#include "llappviewer.h"  #include "llavatarpropertiesprocessor.h"  #include "llcallbacklist.h"  #include "llexpandabletextbox.h" @@ -1003,13 +1004,15 @@ void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata)  	LLPanelPlaceInfo* self  = static_cast<LLPanelPlaceInfo*>(userdata);  	if(!self->getVisible())  		return; +	if(!gDisconnected) +	{ +		static F32 radius  = gSavedSettings.getF32("YouAreHereDistance"); -	static F32 radius  = gSavedSettings.getF32("YouAreHereDistance"); - -	BOOL display_banner = self->mLastSelectedRegionID == gAgent.getRegion()->getRegionID() &&  +		BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&   			LLAgentUI::checkAgentDistance(self->mPosRegion, radius); -	self->mYouAreHerePanel->setVisible(display_banner); +		self->mYouAreHerePanel->setVisible(display_banner); +	}  }  void LLPanelPlaceInfo::onForSaleBannerClick() diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index e4b32c4820..58ca481b77 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -228,7 +228,10 @@ void LLPanelPrimMediaControls::updateShape()  	bool can_navigate = parcel->getMediaAllowNavigate();  	bool enabled = false; -	bool has_focus = media_impl->hasFocus(); +	// There is no such thing as "has_focus" being different from normal controls set +	// anymore (as of user feedback from bri 10/09).  So we cheat here and force 'has_focus' +	// to 'true' (or, actually, we use a setting) +	bool has_focus = (gSavedSettings.getBOOL("PrimMediaControlsUseHoverControlSet")) ? media_impl->hasFocus() : true;  	setVisible(enabled);  	if (objectp) @@ -310,8 +313,8 @@ void LLPanelPrimMediaControls::updateShape()  			fwd_ctrl->setEnabled(has_focus);  			media_address_ctrl->setVisible(false);  			media_address_ctrl->setEnabled(false); -			media_play_slider_panel->setVisible(!mini_controls); -			media_play_slider_panel->setEnabled(!mini_controls); +			media_play_slider_panel->setVisible(has_focus && !mini_controls); +			media_play_slider_panel->setEnabled(has_focus && !mini_controls);  			volume_ctrl->setVisible(has_focus);  			volume_up_ctrl->setVisible(has_focus); diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp index 1d16c4ef5e..d4ab5013f9 100644 --- a/indra/newview/llpanelprofileview.cpp +++ b/indra/newview/llpanelprofileview.cpp @@ -32,10 +32,12 @@  #include "llviewerprecompiledheaders.h" +#include "llavatarconstants.h"  #include "lluserrelations.h"  #include "llpanelprofileview.h" +#include "llavatarpropertiesprocessor.h"  #include "llcallingcard.h"  #include "llpanelavatar.h"  #include "llpanelpicks.h" @@ -48,14 +50,46 @@ static std::string PANEL_NOTES = "panel_notes";  static const std::string PANEL_PROFILE = "panel_profile";  static const std::string PANEL_PICKS = "panel_picks"; + +class AvatarStatusObserver : public LLAvatarPropertiesObserver +{ +public: +	AvatarStatusObserver(LLPanelProfileView* profile_view) +	{ +		mProfileView = profile_view; +	} + +	void processProperties(void* data, EAvatarProcessorType type) +	{ +		if(APT_PROPERTIES != type) return; +		const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data); +		if(avatar_data && mProfileView->getAvatarId() == avatar_data->avatar_id) +		{ +			mProfileView->processOnlineStatus(avatar_data->flags & AVATAR_ONLINE); +			LLAvatarPropertiesProcessor::instance().removeObserver(mProfileView->getAvatarId(), this); +		} +	} + +	void subscribe() +	{ +		LLAvatarPropertiesProcessor::instance().addObserver(mProfileView->getAvatarId(), this); +	} + +private: +	LLPanelProfileView* mProfileView; +}; +  LLPanelProfileView::LLPanelProfileView()  :	LLPanelProfile()  ,	mStatusText(NULL) +,	mAvatarStatusObserver(NULL)  { +	mAvatarStatusObserver = new AvatarStatusObserver(this);  }  LLPanelProfileView::~LLPanelProfileView(void)  { +	delete mAvatarStatusObserver;  }  /*virtual*/  @@ -66,6 +100,9 @@ void LLPanelProfileView::onOpen(const LLSD& key)  	{  		id = key["id"];  	} + +	// subscribe observer to get online status. Request will be sent by LLPanelAvatarProfile itself +	mAvatarStatusObserver->subscribe();  	if(id.notNull() && getAvatarId() != id)  	{  		setAvatarId(id); @@ -74,10 +111,12 @@ void LLPanelProfileView::onOpen(const LLSD& key)  	// Update the avatar name.  	gCacheName->get(getAvatarId(), FALSE,  		boost::bind(&LLPanelProfileView::onAvatarNameCached, this, _1, _2, _3, _4)); - +/* +// disable this part of code according to EXT-2022. See processOnlineStatus  	// status should only show if viewer has permission to view online/offline. EXT-453   	mStatusText->setVisible(isGrantedToSeeOnlineStatus());  	updateOnlineStatus(); +*/  	LLPanelProfile::onOpen(key);  } @@ -93,6 +132,7 @@ BOOL LLPanelProfileView::postBuild()  	getTabContainer()[PANEL_PROFILE]->childSetVisible("status_combo", FALSE);  	mStatusText = getChild<LLTextBox>("status"); +	mStatusText->setVisible(false);  	childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL); @@ -135,13 +175,18 @@ void LLPanelProfileView::updateOnlineStatus()  		return;  	bool online = relationship->isOnline(); -//	std::string statusName();  	std::string status = getString(online ? "status_online" : "status_offline");  	mStatusText->setValue(status);  } +void LLPanelProfileView::processOnlineStatus(bool online) +{ +	mAvatarIsOnline = online; +	mStatusText->setVisible(online); +} +  void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group)  {  	llassert(getAvatarId() == id); @@ -155,7 +200,7 @@ void LLPanelProfileView::togglePanel(LLPanel* panel)  	{  		// LLPanelProfile::togglePanel shows/hides all children,  		// we don't want to display online status for non friends, so re-hide it here -		mStatusText->setVisible(isGrantedToSeeOnlineStatus()); +		mStatusText->setVisible(mAvatarIsOnline);  	}  } diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h index 07a6c3a9a0..b59d1d42f3 100644 --- a/indra/newview/llpanelprofileview.h +++ b/indra/newview/llpanelprofileview.h @@ -40,6 +40,7 @@  class LLPanelProfile;  class LLPanelProfileTab;  class LLTextBox; +class AvatarStatusObserver;  /**  * Panel for displaying Avatar's profile. It consists of three sub panels - Profile, @@ -49,6 +50,7 @@ class LLPanelProfileView : public LLPanelProfile  {  	LOG_CLASS(LLPanelProfileView);  	friend class LLUICtrlFactory; +	friend class AvatarStatusObserver;  public: @@ -65,8 +67,9 @@ public:  protected:  	void onBackBtnClick(); -	bool isGrantedToSeeOnlineStatus(); -	void updateOnlineStatus(); +	bool isGrantedToSeeOnlineStatus(); // deprecated after EXT-2022 is implemented +	void updateOnlineStatus(); // deprecated after EXT-2022 is implemented +	void processOnlineStatus(bool online);  private:  	// LLCacheName will call this function when avatar name is loaded from server. @@ -78,6 +81,8 @@ private:  		BOOL is_group);  	LLTextBox* mStatusText; +	AvatarStatusObserver* mAvatarStatusObserver; +	bool mAvatarIsOnline;  };  #endif //LL_LLPANELPROFILEVIEW_H diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d68897b64f..759c86f3a0 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -801,6 +801,8 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32  		return NULL;  	} +	mHoverObjects->mPrimaryObject = objectp;  +  	objectp = objectp->getRootEdit();  	// is the requested object the same as the existing hover object root? @@ -834,6 +836,11 @@ LLSelectNode *LLSelectMgr::getHoverNode()  	return mHoverObjects->getFirstRootNode();  } +LLSelectNode *LLSelectMgr::getPrimaryHoverNode() +{ +	return mHoverObjects->mSelectNodeMap[mHoverObjects->mPrimaryObject]; +} +  void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)  {  	if (!objectp) diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 6e757ef976..2050a73f26 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -404,6 +404,7 @@ public:  	LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1);  	LLSelectNode *getHoverNode(); +	LLSelectNode *getPrimaryHoverNode();  	void highlightObjectOnly(LLViewerObject *objectp);  	void highlightObjectAndFamily(LLViewerObject *objectp); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 43b039f94e..9aa74e8b9f 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1149,7 +1149,8 @@ bool idle_startup()  				}  				//setup map of datetime strings to codes and slt & local time offset from utc -				LLStringOps::setupDatetimeInfo (gPacificDaylightTime); +				// *TODO: Does this need to be here? +				LLStringOps::setupDatetimeInfo (false);  				transition_back_to_login_panel(emsg.str());  				show_connect_box = true;  			} @@ -3037,14 +3038,15 @@ bool process_login_success_response()  			gAgent.setGenderChosen(TRUE);  		} +		bool pacific_daylight_time = false;  		flag = login_flags["daylight_savings"].asString();  		if(flag == "Y")  		{ -			gPacificDaylightTime  = (flag == "Y") ? TRUE : FALSE; +			pacific_daylight_time = (flag == "Y");  		}  		//setup map of datetime strings to codes and slt & local time offset from utc -		LLStringOps::setupDatetimeInfo (gPacificDaylightTime); +		LLStringOps::setupDatetimeInfo(pacific_daylight_time);  	}  	LLSD initial_outfit = response["initial-outfit"][0]; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 419603e14e..c255418429 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -409,7 +409,6 @@ bool LLSysWellWindow::isWindowEmpty()  void LLSysWellWindow::sessionAdded(const LLUUID& session_id,  		const std::string& name, const LLUUID& other_participant_id)  { -	//*TODO get rid of get_session_value, session_id's are unique, cause performance degradation with lots chiclets (IB)  	if (mMessageList->getItemByValue(session_id) == NULL)  	{  		S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 304f1dffaf..0a9e72506b 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -598,6 +598,9 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)  static bool needs_tooltip(LLSelectNode* nodep)  { +	if (!nodep)  +		return false; +  	LLViewerObject* object = nodep->getObject();  	LLViewerObject *parent = (LLViewerObject *)object->getParent();  	if (object->flagHandleTouch() @@ -773,7 +776,10 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)  					}  				} -				bool needs_tip = needs_tooltip(nodep); +				// also check the primary node since sometimes it can have an action even though +				// the root node doesn't +				bool needs_tip = needs_tooltip(nodep) ||  +					             needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode());  				if (show_all_object_tips || needs_tip)  				{ diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index cd60a8d560..5b8902dec4 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -582,7 +582,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)  	}  	else  	{ -		gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR)); +		gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));  	}  	if (gRenderForSelect) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index e89f17cf72..55e4f28e75 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1190,6 +1190,17 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)  }  ////////////////////////////////////////////////////////////////////////////////////////// +std::string LLViewerMediaImpl::getName() const  +{  +	if (mMediaSource) +	{ +		return mMediaSource->getMediaName(); +	} +	 +	return LLStringUtil::null;  +}; + +//////////////////////////////////////////////////////////////////////////////////////////  void LLViewerMediaImpl::navigateBack()  {  	if (mMediaSource) diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index dac0482078..d6dde0c93e 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -228,7 +228,7 @@ public:  	/*virtual*/ BOOL	handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; };  	/*virtual*/ BOOL	handleMiddleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };  	/*virtual*/ BOOL	handleMiddleMouseUp(S32 x, S32 y, MASK mask) {return FALSE; }; -	/*virtual*/ std::string getName() const { return LLStringUtil::null; }; +	/*virtual*/ std::string getName() const;  	/*virtual*/ void	screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {};  	/*virtual*/ void	localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {}; @@ -258,7 +258,7 @@ public:  	void calculateInterest();  	F64 getInterest() const { return mInterest; };  	F64 getApproximateTextureInterest(); -	S32 getProximity() { return mProximity; }; +	S32 getProximity() const { return mProximity; };  	// Mark this object as being used in a UI panel instead of on a prim  	// This will be used as part of the interest sorting algorithm. diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 2f7040aaa3..657c58364f 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -86,6 +86,9 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac  		mFocusedObjectID = objectp->getID();  		mFocusedObjectFace = face;  		mFocusedObjectNormal = pick_normal; +		 +		// Focusing on a media face clears its disable flag. +		media_impl->setDisabled(false);  		LLTextureEntry* tep = objectp->getTE(face);  		if(tep->hasMedia()) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 864cf9d57b..9da9ff5ce7 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2963,11 +2963,20 @@ bool callback_freeze(const LLSD& notification, const LLSD& response)  } -class LLAvatarFreeze : public view_listener_t +void handle_avatar_freeze(const LLSD& avatar_id)  { -	bool handleEvent(const LLSD& userdata) -	{ -		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); +		// Use avatar_id if available, otherwise default to right-click avatar +		LLVOAvatar* avatar = NULL; +		if (avatar_id.asUUID().notNull()) +		{ +			avatar = find_avatar_from_object(avatar_id.asUUID()); +		} +		else +		{ +			avatar = find_avatar_from_object( +				LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); +		} +  		if( avatar )  		{  			std::string fullname = avatar->getFullname(); @@ -2991,9 +3000,7 @@ class LLAvatarFreeze : public view_listener_t  							callback_freeze);  			}  		} -		return true; -	} -}; +}  class LLAvatarVisibleDebug : public view_listener_t  { @@ -3003,14 +3010,6 @@ class LLAvatarVisibleDebug : public view_listener_t  	}  }; -class LLAvatarEnableDebug : public view_listener_t -{ -	bool handleEvent(const LLSD& userdata) -	{ -		return gAgent.isGodlike(); -	} -}; -  class LLAvatarDebug : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -3087,11 +3086,20 @@ bool callback_eject(const LLSD& notification, const LLSD& response)  	return false;  } -class LLAvatarEject : public view_listener_t +void handle_avatar_eject(const LLSD& avatar_id)  { -	bool handleEvent(const LLSD& userdata) -	{ -		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); +		// Use avatar_id if available, otherwise default to right-click avatar +		LLVOAvatar* avatar = NULL; +		if (avatar_id.asUUID().notNull()) +		{ +			avatar = find_avatar_from_object(avatar_id.asUUID()); +		} +		else +		{ +			avatar = find_avatar_from_object( +				LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); +		} +  		if( avatar )  		{  			LLSD payload; @@ -3142,38 +3150,41 @@ class LLAvatarEject : public view_listener_t  				}  			}  		} -		return true; -	} -}; +} -class LLAvatarEnableFreezeEject : public view_listener_t +bool enable_freeze_eject(const LLSD& avatar_id)  { -	bool handleEvent(const LLSD& userdata) +	// Use avatar_id if available, otherwise default to right-click avatar +	LLVOAvatar* avatar = NULL; +	if (avatar_id.asUUID().notNull())  	{ -		LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); -		bool new_value = (avatar != NULL); +		avatar = find_avatar_from_object(avatar_id.asUUID()); +	} +	else +	{ +		avatar = find_avatar_from_object( +			LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); +	} +	if (!avatar) return false; -		if (new_value) -		{ -			const LLVector3& pos = avatar->getPositionRegion(); -			const LLVector3d& pos_global = avatar->getPositionGlobal(); -			LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); -			LLViewerRegion* region = avatar->getRegion(); -			new_value = (region != NULL); -						 -			if (new_value) -			{ -				new_value = region->isOwnedSelf(pos); -				if (!new_value || region->isOwnedGroup(pos)) -				{ -					new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); -				} -			} -		} +	// Gods can always freeze +	if (gAgent.isGodlike()) return true; -		return new_value; +	// Estate owners / managers can freeze +	// Parcel owners can also freeze +	const LLVector3& pos = avatar->getPositionRegion(); +	const LLVector3d& pos_global = avatar->getPositionGlobal(); +	LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); +	LLViewerRegion* region = avatar->getRegion(); +	if (!region) return false; +				 +	bool new_value = region->isOwnedSelf(pos); +	if (!new_value || region->isOwnedGroup(pos)) +	{ +		new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);  	} -}; +	return new_value; +}  class LLAvatarGiveCard : public view_listener_t  { @@ -8021,18 +8032,18 @@ void initialize_menus()  	view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute");  	view_listener_t::addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend");  	view_listener_t::addMenu(new LLAvatarAddContact(), "Avatar.AddContact"); -	view_listener_t::addMenu(new LLAvatarFreeze(), "Avatar.Freeze"); +	commit.add("Avatar.Freeze", boost::bind(&handle_avatar_freeze, LLSD()));  	view_listener_t::addMenu(new LLAvatarDebug(), "Avatar.Debug");  	view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug"); -	view_listener_t::addMenu(new LLAvatarEnableDebug(), "Avatar.EnableDebug");  	view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup");  	view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard"); -	view_listener_t::addMenu(new LLAvatarEject(), "Avatar.Eject"); +	commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD()));  	view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM");  	view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");  	view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend"); -	view_listener_t::addMenu(new LLAvatarEnableFreezeEject(), "Avatar.EnableFreezeEject"); +	enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); +	visible.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));  	// Object pie menu  	view_listener_t::addMenu(new LLObjectBuild(), "Object.Build"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 6d32df2bc5..b65878b5e6 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -101,6 +101,14 @@ void handle_take_copy();  void handle_look_at_selection(const LLSD& param);  void handle_zoom_to_object(LLUUID object_id); +// Takes avatar UUID, or if no UUID passed, uses last selected object +void handle_avatar_freeze(const LLSD& avatar_id); + +// Takes avatar UUID, or if no UUID passed, uses last selected object +void handle_avatar_eject(const LLSD& avatar_id); + +bool enable_freeze_eject(const LLSD& avatar_id); +  // Can anyone take a free copy of the object?  // *TODO: Move to separate file  bool anyone_copy_selection(LLSelectNode* nodep); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 8b7df63884..5fd762ab3d 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2380,7 +2380,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  			switch(chat.mChatType)  			{  			case CHAT_TYPE_WHISPER: -				verb = "(" + LLTrans::getString("whisper") + ")"; +				verb = LLTrans::getString("whisper") + " ";  				break;  			case CHAT_TYPE_DEBUG_MSG:  			case CHAT_TYPE_OWNER: @@ -2388,7 +2388,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)  				verb = "";  				break;  			case CHAT_TYPE_SHOUT: -				verb = "(" + LLTrans::getString("shout") + ")"; +				verb = LLTrans::getString("shout") + " ";  				break;  			case CHAT_TYPE_START:  			case CHAT_TYPE_STOP: diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 2834284a9b..df5481c874 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -254,6 +254,7 @@ protected:  	std::string		nameString;  	std::string		audioMediaString;  	std::string		displayNameString; +	std::string		deviceString;  	int				participantType;  	bool			isLocallyMuted;  	bool			isModeratorMuted; @@ -485,6 +486,14 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)  			{  				gVoiceClient->clearRenderDevices();  			} +			else if (!stricmp("CaptureDevice", tag)) +			{ +				deviceString.clear(); +			} +			else if (!stricmp("RenderDevice", tag)) +			{ +				deviceString.clear(); +			}  			else if (!stricmp("Buddies", tag))  			{  				gVoiceClient->deleteAllBuddies(); @@ -508,7 +517,6 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)  void LLVivoxProtocolParser::EndTag(const char *tag)  {  	const std::string& string = textBuffer; -	bool clearbuffer = true;  	responseDepth--; @@ -580,6 +588,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)  			nameString = string;  		else if (!stricmp("DisplayName", tag))  			displayNameString = string; +		else if (!stricmp("Device", tag)) +			deviceString = string;  		else if (!stricmp("AccountName", tag))  			nameString = string;  		else if (!stricmp("ParticipantType", tag)) @@ -596,18 +606,13 @@ void LLVivoxProtocolParser::EndTag(const char *tag)  			uriString = string;  		else if (!stricmp("Presence", tag))  			statusString = string; -		else if (!stricmp("Device", tag)) -		{ -			// This closing tag shouldn't clear the accumulated text. -			clearbuffer = false; -		}  		else if (!stricmp("CaptureDevice", tag))  		{ -			gVoiceClient->addCaptureDevice(textBuffer); +			gVoiceClient->addCaptureDevice(deviceString);  		}  		else if (!stricmp("RenderDevice", tag))  		{ -			gVoiceClient->addRenderDevice(textBuffer); +			gVoiceClient->addRenderDevice(deviceString);  		}  		else if (!stricmp("Buddy", tag))  		{ @@ -648,12 +653,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)  		else if (!stricmp("SubscriptionType", tag))  			subscriptionType = string; - -		if(clearbuffer) -		{ -			textBuffer.clear(); -			accumulateText= false; -		} +		textBuffer.clear(); +		accumulateText= false;  		if (responseDepth == 0)  		{ @@ -1160,7 +1161,8 @@ LLVoiceClient::LLVoiceClient() :  	mVoiceEnabled(false),  	mWriteInProgress(false), -	mLipSyncEnabled(false) +	mLipSyncEnabled(false), +	mAPIVersion("Unknown")  {	  	gVoiceClient = this; @@ -3749,6 +3751,7 @@ void LLVoiceClient::connectorCreateResponse(int statusCode, std::string &statusS  	{  		// Connector created, move forward.  		LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL; +		mAPIVersion = versionID;  		mConnectorHandle = connectorHandle;  		if(getState() == stateConnectorStarting)  		{ diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index bddd18dee8..9df96d9a52 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -204,6 +204,9 @@ static	void updatePosition(void);  		void keyDown(KEY key, MASK mask);  		void keyUp(KEY key, MASK mask);  		void middleMouseState(bool down); + +		// Return the version of the Vivox library +		std::string getAPIVersion() const { return mAPIVersion; }  		/////////////////////////////  		// Accessors for data related to nearby speakers @@ -739,6 +742,8 @@ static	std::string nameFromsipURI(const std::string &uri);  		BOOL		mLipSyncEnabled; +		std::string	mAPIVersion; +  		typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;  		observer_set_t mParticipantObservers; diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 829d631473..f198f3a0cf 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -37,7 +37,6 @@  #include "llregionhandle.h"  #include "message.h" -#include "llappviewer.h"	// for gPacificDaylightTime  #include "llagent.h"  #include "llmapresponders.h"  #include "llviewercontrol.h" diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a37de468b3..0dc1a88ee8 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7908,6 +7908,7 @@ void LLPipeline::generateHighlight(LLCamera& camera)  		mHighlight.flush();  		gGL.setColorMask(true, false); +		gViewerWindow->setup3DViewport();  	}  } diff --git a/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png b/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.pngBinary files differ index 6f2726c3e6..d7ec04237b 100644 --- a/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png +++ b/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index c322d2aebb..a75d38d967 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -488,6 +488,9 @@    <!--WARNING OLD ART *do not use*--> + <texture name="Banner_ForSale" file_name="Banner_ForSale.png" preload="false" /> +  <texture name="Banner_YouAreHere" file_name="Banner_YouAreHere.png" preload="false" /> +    <texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />    <texture name="btn_chatbar_selected.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" /> @@ -532,15 +535,6 @@    <texture name="move_down_in.tga" preload="false" />    <texture name="move_down_out.tga" preload="false" /> -  <texture name="tool_grab.tga" /> -  <texture name="tool_grab_active.tga" /> - -  <texture name="tool_face.tga" /> -  <texture name="tool_face_active.tga" /> - -  <texture name="tool_create.tga" /> -  <texture name="tool_create_active.tga" /> -    <texture name="up_arrow.tga" file_name="up_arrow.png" />    <texture name="down_arrow.tga" file_name="down_arrow.png" /> @@ -605,54 +599,6 @@    <texture name="icon_popular.tga" />    <texture name="icon_top_pick.tga" /> -  <texture name="inv_folder_animation.tga" /> -  <texture name="inv_folder_bodypart.tga" /> -  <texture name="inv_folder_callingcard.tga" /> -  <texture name="inv_folder_clothing.tga" /> -  <texture name="inv_folder_current_outfit.tga" /> -  <texture name="inv_folder_gesture.tga" /> -  <texture name="inv_folder_landmark.tga" /> -  <texture name="inv_folder_lostandfound.tga" /> -  <texture name="inv_folder_my_outfits.tga" /> -  <texture name="inv_folder_notecard.tga" /> -  <texture name="inv_folder_object.tga" /> -  <texture name="inv_folder_outfit.tga" /> -  <texture name="inv_folder_plain_closed.tga" /> -  <texture name="inv_folder_script.tga" /> -  <texture name="inv_folder_snapshot.tga" /> -  <texture name="inv_folder_sound.tga" /> -  <texture name="inv_folder_texture.tga" /> -  <texture name="inv_folder_trash.tga" /> - -  <texture name="inv_item_animation.tga" /> -  <texture name="inv_item_skin.tga" /> -  <texture name="inv_item_callingcard_offline.tga" /> -  <texture name="inv_item_callingcard_online.tga" /> -  <texture name="inv_item_eyes.tga" /> -  <texture name="inv_item_gesture.tga" /> -  <texture name="inv_item_gloves.tga" /> -  <texture name="inv_item_hair.tga" /> -  <texture name="inv_item_jacket.tga" /> -  <texture name="inv_item_landmark.tga" /> -  <texture name="inv_item_landmark_visited.tga" /> -  <texture name="inv_item_linkitem.tga" /> -  <texture name="inv_item_linkfolder.tga" /> -  <texture name="inv_item_notecard.tga" /> -  <texture name="inv_item_object.tga" /> -  <texture name="inv_item_object_multi.tga" /> -  <texture name="inv_item_pants.tga" /> -  <texture name="inv_item_script.tga" /> -  <texture name="inv_item_shape.tga" /> -  <texture name="inv_item_shirt.tga" /> -  <texture name="inv_item_shoes.tga" /> -  <texture name="inv_item_skirt.tga" /> -  <texture name="inv_item_snapshot.tga" /> -  <texture name="inv_item_socks.tga" /> -  <texture name="inv_item_sound.tga" /> -  <texture name="inv_item_texture.tga" /> -  <texture name="inv_item_underpants.tga" /> -  <texture name="inv_item_undershirt.tga" /> -    <texture name="lag_status_critical.tga" />    <texture name="lag_status_good.tga" />    <texture name="lag_status_warning.tga" /> @@ -679,37 +625,6 @@    <texture name="notify_next.png" preload="true" />    <texture name="notify_box_icon.tga" /> -  <texture name="object_cone.tga" /> -  <texture name="object_cone_active.tga" /> -  <texture name="object_cube.tga" /> -  <texture name="object_cube_active.tga" /> -  <texture name="object_cylinder.tga" /> -  <texture name="object_cylinder_active.tga" /> -  <texture name="object_grass.tga" /> -  <texture name="object_grass_active.tga" /> -  <texture name="object_hemi_cone.tga" /> -  <texture name="object_hemi_cone_active.tga" /> -  <texture name="object_hemi_cylinder.tga" /> -  <texture name="object_hemi_cylinder_active.tga" /> -  <texture name="object_hemi_sphere.tga" /> -  <texture name="object_hemi_sphere_active.tga" /> -  <texture name="object_prism.tga" /> -  <texture name="object_prism_active.tga" /> -  <texture name="object_pyramid.tga" /> -  <texture name="object_pyramid_active.tga" /> -  <texture name="object_ring.tga" /> -  <texture name="object_ring_active.tga" /> -  <texture name="object_sphere.tga" /> -  <texture name="object_sphere_active.tga" /> -  <texture name="object_tetrahedron.tga" /> -  <texture name="object_tetrahedron_active.tga" /> -  <texture name="object_torus.tga" /> -  <texture name="object_torus_active.tga" /> -  <texture name="object_tree.tga" /> -  <texture name="object_tree_active.tga" /> -  <texture name="object_tube.tga" /> -  <texture name="object_tube_active.tga" /> -    <texture name="pixiesmall.j2c" use_mips="true" />    <texture name="script_error.j2c" use_mips="true" />    <texture name="silhouette.j2c" use_mips="true" /> @@ -725,11 +640,6 @@    <texture name="status_no_push.tga" />    <texture name="status_no_scripts.tga" /> -  <texture name="tool_dozer.tga" /> -  <texture name="tool_dozer_active.tga" /> -  <texture name="tool_zoom.tga" /> -  <texture name="tool_zoom_active.tga" /> -    <texture name="icn_active-speakers-dot-lvl0.tga" />    <texture name="icn_active-speakers-dot-lvl1.tga" />    <texture name="icn_active-speakers-dot-lvl2.tga" /> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 02c6ed1b20..3f2636ae52 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -49,6 +49,7 @@ libcurl Version: [LIBCURL_VERSION]  J2C Decoder Version: [J2C_VERSION]  Audio Driver Version: [AUDIO_DRIVER_VERSION]  Qt Webkit Version: [QT_WEBKIT_VERSION] +Vivox Version: [VIVOX_VERSION]  </floater.string>    <floater.string       name="none"> diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index 3f4f8b197f..1fd9b95318 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -104,9 +104,9 @@               layout="topleft"               left="10"               name="InstructSelectFriend" -             top="15" +             top="5"               width="200"> -                Select a friend(s): +                Select a person:              </text>              <button               follows="top|right" diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml index b6cf05aefc..92a6111759 100644 --- a/indra/newview/skins/default/xui/en/floater_im.xml +++ b/indra/newview/skins/default/xui/en/floater_im.xml @@ -1,5 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <multi_floater + legacy_header_height="18"    can_resize="true"   follows="left|bottom"   height="422" diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index d9c3ff77d9..26d2f4e497 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -3,7 +3,7 @@   legacy_header_height="18"   background_visible="true"   follows="left|top|right|bottom" - height="250" + height="270"   layout="topleft"   left="0"   name="panel_im" @@ -17,7 +17,7 @@   min_width="200"   min_height="150">    <layout_stack follows="left|top|right|bottom" -                height="235" +                height="255"                  width="365"                  layout="topleft"                  orientation="horizontal" @@ -29,11 +29,11 @@        layout="topleft"        top_delta="-3"        width="146" -      height="225" +      height="255"        follows="left"        label="IM Control Panel"        user_resize="false" /> -    <layout_panel height="235" +    <layout_panel height="255"                    width="200"                    left_delta="146"                     top="0" @@ -56,7 +56,7 @@         length="1"         follows="left|top|right|bottom"         font="SansSerif" -       height="185" +       height="205"         layout="topleft"         name="chat_history"         parse_highlights="true" diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index 65dd4e74ff..e7c5bf8585 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -14,6 +14,7 @@   help_topic="nearby_chat"   save_rect="true"   title="Nearby Chat" + save_dock_state="true"   save_visibility="true"   single_instance="true"   width="320"> diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index 3797055054..b44de8e178 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -75,7 +75,7 @@       left="4"       max_length="65536"       name="Notecard Editor" -     allow_html="true"  +     allow_html="false"        handle_edit_keys_directly="true"       tab_group="1"       top="46" diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index edff1a093a..6049476a43 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -68,7 +68,7 @@      <menu_item_call.on_click
       function="InspectAvatar.Freeze"/>
      <menu_item_call.on_visible
 -     function="IsGodCustomerService"/>
 +     function="InspectAvatar.VisibleFreezeEject"/>
    </menu_item_call>
    <menu_item_call
     label="Eject"
 @@ -76,13 +76,13 @@      <menu_item_call.on_click
       function="InspectAvatar.Eject"/>
      <menu_item_call.on_visible
 -     function="IsGodCustomerService"/>
 +     function="InspectAvatar.VisibleFreezeEject"/>
    </menu_item_call>
    <menu_item_call
     label="Debug"
     name="debug">
      <menu_item_call.on_click
 -     function="InspectAvatar.Debug"/>
 +     function="Avatar.Debug"/>
      <menu_item_call.on_visible
       function="IsGodCustomerService"/>
    </menu_item_call>
 diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 8db745fab7..f50acc224f 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -13,17 +13,26 @@       left="3"       name="speakers_list"       opaque="false" +     show_info_btn="false" +     show_profile_btn="false"       top="10"       width="140" />      <button       name="call_btn"       label="Call" -     width="90" +     width="125"       height="20" />      <button       name="end_call_btn"       label="End Call" -     width="90" +     width="125"       height="20"        visible="false"/> +    <button +     enabled="false" +     name="voice_ctrls_btn" +     label="Open Voice Controls" +     width="125" +     height="20" +     visible="false"/>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 73a1bae1c6..61bd1d186e 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -10,7 +10,7 @@   left="0"   name="bottom_tray"   top="28" - chrome="true"  + chrome="true"   border_visible="false"   width="1000">      <layout_stack @@ -47,7 +47,7 @@           min_width="300"           name="chat_bar"           user_resize="false" -         filename="panel_nearby_chat_bar.xml"/> +         filename="panel_nearby_chat_bar.xml" />          <layout_panel           mouse_opaque="false"           auto_resize="false" @@ -55,23 +55,22 @@           height="28"           layout="topleft"           min_height="28" -         width="96" +         width="100"           top_delta="0"           min_width="96"           name="speak_panel"           user_resize="false"> -		    <chiclet_talk -		     follows="right" -		     height="23" -		     speak_button.font="SansSerifMedium" -		     speak_button.tab_stop="true" -		     show_button.tab_stop="true" -		     layout="topleft" -		     left="0" -		     name="talk" -		     top="3" -		     width="96" /> -         </layout_panel> +         <chiclet_talk +          follows="right" +          height="23" +          speak_button.tab_stop="true" +          show_button.tab_stop="true" +          layout="topleft" +          left="0" +          name="talk" +          top="3" +          width="100" /> +        </layout_panel>  		 <icon           auto_resize="false"           follows="left|right" @@ -89,21 +88,21 @@           height="28"           layout="topleft"           min_height="28" -         width="76" +         width="80"           top_delta="0"           min_width="76"           name="gesture_panel"           user_resize="false"> -		    <button -		      follows="right" -		     height="23" -		     label="Gesture" -		     layout="topleft" -		     name="Gesture" -		     left="0" -		     top="3" -             use_ellipses="true" -		     width="76" /> +         <button +           follows="right" +          height="23" +          label="Gesture" +          layout="topleft" +          name="Gesture" +          left="0" +          top="3" +         use_ellipses="true" +          width="80" />          </layout_panel>  		 <icon           auto_resize="false" @@ -124,7 +123,7 @@           layout="topleft"           min_height="28"           name="movement_panel" -         width="76" +         width="80"           min_width="76">              <button               follows="left|right" @@ -136,7 +135,7 @@               name="movement_btn"               tool_tip="Show/hide movement controls"               top="3" -             width="76"> +             width="80">                  <button.init_callback                   function="Button.SetDockableFloaterToggle"                   parameter="moveview" /> @@ -175,7 +174,7 @@               tool_tip="Show/hide camera controls"               top="3"               name="camera_btn" -             width="76"> +             width="80">                  <button.init_callback                   function="Button.SetDockableFloaterToggle"                   parameter="camera" /> @@ -199,28 +198,19 @@           height="28"           layout="topleft"           name="snapshot_panel" -         width="35"> -            <split_button -             arrow_position="right" +         width="40"> +            <button           follows="left|right"               height="23"               left="0" +             label=""               layout="topleft"               name="snapshots" -             width="46" -             top="3"> -                <split_button.item -                 image_overlay="Snapshot_Off" -                 name="snapshot" -                 tool_tip="Take snapshot" -                 /> -                <split_button.arrow_button -                 name="snapshot_settings" -                 image_overlay="Widget_UpArrow" -                 tool_tip="Snapshot and Preset Views" -                 width="18" +             width="36" +             top="3" +             image_overlay="Snapshot_Off" +            tool_tip="Take snapshot"                   /> -            </split_button>          </layout_panel>          <layout_panel           mouse_opaque="false" @@ -297,7 +287,7 @@           height="10"           image_name="spacer24.tga"           layout="topleft" -         left="0" +         right="-1"           top="0"           width="10"/>      </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 15b6b2a00d..9ed510dff3 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -2,7 +2,7 @@  <panel   name="panel_im_control_panel"   width="146" - height="215" + height="238"   border="false">      <avatar_list       color="DkGray2" @@ -13,23 +13,32 @@       left="3"       name="speakers_list"       opaque="false" +     show_info_btn="false" +     show_profile_btn="false"       top="10"       width="140" />      <button       name="group_info_btn"       label="Group Info"       left_delta="3" -     width="90" +     width="125"       height="20" />      <button       name="call_btn"       label="Call" -     width="90" +     width="125"       height="20" />      <button       name="end_call_btn"       label="End Call" -     width="90" +     width="125"       height="20"        visible="false"/> +    <button +	 enabled="false" +     name="voice_ctrls_btn" +     label="Open Voice Controls" +     width="125" +     height="20" +     visible="false"/>  </panel> 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 dca52def49..c4cdaa41f9 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 @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel name="panel_im_control_panel" -       width="96" -       height="225" +       width="125" +       height="248"         border="false">    <avatar_icon name="avatar_icon" @@ -11,17 +11,17 @@    <button name="view_profile_btn"            label="View Profile"            left_delta="3" -          width="90" +          width="125"  		  height="20" />    <button name="add_friend_btn"            label="Add Friend" -          width="90" +          width="125"            height="20" />    <button name="call_btn"            label="Call" -          width="90" +          width="125"            height="20" />      <button @@ -29,11 +29,19 @@       label="End Call"       name="end_call_btn"       visible="false" -     width="90" /> +     width="125" /> + +  <button +	 enabled="false" +     name="voice_ctrls_btn" +     label="Open Voice Controls" +     width="125" +     height="20" +     visible="false"/>    <button name="share_btn"            label="Share" -          width="90" +          width="125"            height="20" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 91dcdce23b..b8fc72b754 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -240,8 +240,8 @@ Avatars:       width="256"       top_pad="5"/>      <radio_group -	 enabled_control="ShowScriptErrors" -	 control_name="ShowScriptErrorsLocation" +     enabled_control="ShowScriptErrors" +     control_name="ShowScriptErrorsLocation"       follows="top|left"       draw_border="false"       height="40" @@ -269,6 +269,8 @@ Avatars:      </radio_group>       <check_box       follows="top|left" +     enabled_control="EnableVoiceChat" +     control_name="PushToTalkToggle"       height="20"       label="Use Push-to-talk in toggle mode"       layout="topleft" @@ -279,6 +281,9 @@ Avatars:       tool_tip="When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down."/>      <line_editor       follows="top|left" +     control_name="PushToTalkButton" +     enabled="false"  +     enabled_control="EnableVoiceChat"       height="19"       left_delta="50"       max_length="254" @@ -287,22 +292,30 @@ Avatars:       top_pad="0"       width="280" />      <button -	follows="top|left" -	height="20" -	label="Set Key" -	left_delta="0" -        name="set_voice_hotkey_button" -	width="115" -	top_pad="5" /> +     follows="top|left" +     enabled_control="EnableVoiceChat" +     height="20" +     label="Set Key" +     left_delta="0" +     name="set_voice_hotkey_button" +     width="115" +     top_pad="5"> +          <button.commit_callback +          function="Pref.VoiceSetKey" /> +    </button>      <button -        bottom_delta="0" -	follows="left" -	font="SansSerif" -	halign="center" -	height="20" -	label="Middle Mouse Button" -	left_delta="120" -	mouse_opaque="true" -	name="set_voice_middlemouse_button" -	width="160" /> +     bottom_delta="0" +     enabled_control="EnableVoiceChat" +     follows="left" +     font="SansSerif" +     halign="center" +     height="20" +     label="Middle Mouse Button" +     left_delta="120" +     mouse_opaque="true" +     name="set_voice_middlemouse_button" +     width="160"> +          <button.commit_callback +          function="Pref.VoiceSetMiddleMouse" /> +    </button>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml index 73a7d95ff4..f559343b34 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml @@ -28,15 +28,14 @@       visible="false"       width="320" />      <icon -     height="20" -     follows="top|right|left" -     image_name="ListItem_Select" +     height="16" +     follows="top|left" +     image_name="Inv_Landmark"       layout="topleft"       left="0"       name="landmark_icon"       top="0" -     visible="false" -     width="20" /> +     width="16" />      <text       follows="left|right"       height="20" | 
