diff options
| -rw-r--r-- | doc/contributions.txt | 7 | ||||
| -rw-r--r-- | indra/cmake/Variables.cmake | 2 | ||||
| -rw-r--r-- | indra/llui/lltexteditor.cpp | 24 | ||||
| -rw-r--r-- | indra/llui/lltexteditor.h | 2 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 165 | ||||
| -rw-r--r-- | indra/newview/llappviewer.h | 6 | ||||
| -rw-r--r-- | indra/newview/llfloaterbulkpermission.cpp | 36 | ||||
| -rw-r--r-- | indra/newview/llfloaterbulkpermission.h | 16 | ||||
| -rw-r--r-- | indra/newview/llmaniprotate.cpp | 232 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_bulk_perms.xml | 19 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_group_notices.xml | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_preferences_advanced.xml | 2 | 
12 files changed, 346 insertions, 169 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 10c935f9bb..55434267a7 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -311,6 +311,7 @@ Cron Stardust  	VWR-10579  	VWR-25120  	STORM-1075 +	STORM-1919  Cypren Christenson  	STORM-417  Dante Tucker @@ -497,6 +498,8 @@ Ima Mechanique  	STORM-959  	STORM-1175  	STORM-1708 +	STORM-1855 +	VWR-20553  Imnotgoing Sideways  Inma Rau  Innula Zenovka @@ -640,12 +643,15 @@ Jonathan Yap  	STORM-1793  	STORM-1810  	STORM-1877 +	STORM-1892 +	STORM-1894  	STORM-1860  	STORM-1852  	STORM-1870  	STORM-1872  	STORM-1858  	STORM-1862 +	STORM-1918  Kadah Coba  	STORM-1060      STORM-1843 @@ -1038,6 +1044,7 @@ Satanello Miami  Satomi Ahn  	STORM-501  	STORM-229 +	VWR-20553  	VWR-24502  Scrim Pinion  Scrippy Scofield diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 4b459f1a48..a64ce2d4ba 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -141,7 +141,7 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")  set(GRID agni CACHE STRING "Target Grid")  set(VIEWER ON CACHE BOOL "Build Second Life viewer.") -set(VIEWER_CHANNEL "LindenDeveloper" CACHE STRING "Viewer Channel Name") +set(VIEWER_CHANNEL "Second Life Developer" CACHE STRING "Viewer Channel Name")  set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for A/B Testing")  if (XCODE_VERSION GREATER 4.2) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 2f120479d9..646786d4cf 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1119,7 +1119,8 @@ void LLTextEditor::addChar(llwchar wc)  	}  } -void LLTextEditor::addLineBreakChar() + +void LLTextEditor::addLineBreakChar(BOOL group_together)  {  	if( !getEnabled() )  	{ @@ -1137,7 +1138,7 @@ void LLTextEditor::addLineBreakChar()  	LLStyleConstSP sp(new LLStyle(LLStyle::Params()));  	LLTextSegmentPtr segment = new LLLineBreakTextSegment(sp, mCursorPos); -	S32 pos = execute(new TextCmdAddChar(mCursorPos, FALSE, '\n', segment)); +	S32 pos = execute(new TextCmdAddChar(mCursorPos, group_together, '\n', segment));  	setCursorPos(mCursorPos + pos);  } @@ -1478,21 +1479,28 @@ void LLTextEditor::pasteTextWithLinebreaks(LLWString & clean_string)  	std::basic_string<llwchar>::size_type start = 0;  	std::basic_string<llwchar>::size_type pos = clean_string.find('\n',start); -	while(pos!=-1) +	while((pos != -1) && (pos != clean_string.length() -1))  	{  		if(pos!=start)  		{  			std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,pos-start); -			setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +			setCursorPos(mCursorPos + insert(mCursorPos, str, TRUE, LLTextSegmentPtr()));  		} -		addLineBreakChar(); -		 +		addLineBreakChar(TRUE);			// Add a line break and group with the next addition. +  		start = pos+1;  		pos = clean_string.find('\n',start);  	} -	std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start); -	setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +	if (pos != start) +	{ +		std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start); +		setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +	} +	else +	{ +		addLineBreakChar(FALSE);		// Add a line break and end the grouping. +	}  }  // copy selection to primary diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 969e072704..ad46ed45ec 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -248,7 +248,7 @@ protected:  	// Undoable operations  	void			addChar(llwchar c); // at mCursorPos  	S32				addChar(S32 pos, llwchar wc); -	void			addLineBreakChar(); +	void			addLineBreakChar(BOOL group_together = FALSE);  	S32				overwriteChar(S32 pos, llwchar wc);  	void			removeChar();  	S32 			removeChar(S32 pos); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 53c694eaca..1c6f099185 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -324,7 +324,7 @@ BOOL gLogoutInProgress = FALSE;  ////////////////////////////////////////////////////////////  // Internal globals... that should be removed.  static std::string gArgs; - +const int MAX_MARKER_LENGTH = 1024;  const std::string MARKER_FILE_NAME("SecondLife.exec_marker");  const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker");  const std::string LLERROR_MARKER_FILE_NAME("SecondLife.llerror_marker"); @@ -638,7 +638,7 @@ LLTextureFetch* LLAppViewer::sTextureFetch = NULL;  LLAppViewer::LLAppViewer() :   	mMarkerFile(), -	mLogoutMarkerFile(NULL), +	mLogoutMarkerFile(),  	mReportedCrash(false),  	mNumSessions(0),  	mPurgeCache(false), @@ -3219,8 +3219,8 @@ void LLAppViewer::writeSystemInfo()  	}  	// Dump some debugging info -	LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME") -			<< " version " << LLVersionInfo::getShortVersion() << LL_ENDL; +	LL_INFOS("SystemInfo") << "Application: " << LLTrans::getString("APP_NAME") << LL_ENDL; +	LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::getChannelAndVersion() << LL_ENDL;  	// Dump the local time and time zone  	time_t now; @@ -3346,22 +3346,27 @@ void LLAppViewer::handleViewerCrash()  	//we're already in a crash situation	  	if (gDirUtilp)  	{ -		std::string crash_file_name; -		if(gLLErrorActivated) crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME); -		else crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME); -		llinfos << "Creating crash marker file " << crash_file_name << llendl; +		std::string crash_file_name = ( gLLErrorActivated ) +			? gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME) +			: gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME); +		LL_INFOS("MarkerFile") << "Creating crash marker file " << crash_file_name << LL_ENDL;  		LLAPRFile crash_file ;  		crash_file.open(crash_file_name, LL_APR_W);  		if (crash_file.getFileHandle())  		{  			LL_INFOS("MarkerFile") << "Created crash marker file " << crash_file_name << LL_ENDL; +			recordMarkerVersion(crash_file);  		}  		else  		{  			LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_file_name << LL_ENDL;  		}		  	} +	else +	{ +		LL_WARNS("MarkerFile") << "No gDirUtilp with which to create error marker file name" << LL_ENDL; +	}		  	if (gMessageSystem && gDirUtilp)  	{ @@ -3413,7 +3418,7 @@ bool LLAppViewer::anotherInstanceRunning()  	// If the file is currently locked, that means another process is already running.  	std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME); -	LL_DEBUGS("MarkerFile") << "Checking marker file for lock..." << LL_ENDL; +	LL_DEBUGS("MarkerFile") << "Checking marker file '"<< marker_file << "' for lock..." << LL_ENDL;  	//Freeze case checks  	if (LLAPRFile::isExist(marker_file, NULL, LL_APR_RB)) @@ -3439,6 +3444,46 @@ bool LLAppViewer::anotherInstanceRunning()  	return false;  } +// static +void LLAppViewer::recordMarkerVersion(LLAPRFile& marker_file)  +{		 +	std::string marker_version(LLVersionInfo::getChannelAndVersion()); +	if ( marker_version.length() > MAX_MARKER_LENGTH ) +	{ +		LL_WARNS_ONCE("MarkerFile") << "Version length ("<< marker_version.length()<< ") greater than maximum: marker matching may be incorrect" << LL_ENDL; +	} + +	// record the viewer version in the marker file +	marker_file.write(marker_version.data(), marker_version.length()); +} + +bool LLAppViewer::markerIsSameVersion(const std::string& marker_name) const +{ +	bool sameVersion = false; + +	std::string my_version(LLVersionInfo::getChannelAndVersion()); +	char marker_version[MAX_MARKER_LENGTH]; +	S32  marker_version_length; + +	LLAPRFile marker_file; +	marker_file.open(marker_name, LL_APR_RB); +	if (marker_file.getFileHandle()) +	{ +		marker_version_length = marker_file.read(marker_version, sizeof(marker_version)); +		LL_DEBUGS("MarkerFile") << "Compare markers: "; +		std::string marker_string(marker_version, marker_version_length); +		LL_CONT << "\n   mine '" << my_version    << "'" +				<< "\n marker '" << marker_string << "'" +				<< LL_ENDL; +		if ( 0 == my_version.compare( 0, my_version.length(), marker_version, 0, marker_version_length ) ) +		{ +			sameVersion = true; +		} +		marker_file.close(); +	} +	return sameVersion; +} +  void LLAppViewer::initMarkerFile()  {  	//First, check for the existence of other files. @@ -3461,27 +3506,55 @@ void LLAppViewer::initMarkerFile()  	if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning())  	{ -		gLastExecEvent = LAST_EXEC_FROZE; -		LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL; +		if ( markerIsSameVersion(mMarkerFileName) ) +		{ +			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found" << LL_ENDL; +			gLastExecEvent = LAST_EXEC_FROZE; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found, but versions did not match" << LL_ENDL; +		}  	}      	if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))  	{ -		gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; -		LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		if (markerIsSameVersion(logout_marker_file)) +		{ +			gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; +			LL_INFOS("MarkerFile") << "Logout crashed '"<< logout_marker_file << "', setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Logout crash marker '"<< logout_marker_file << "' found, but versions did not match" << LL_ENDL; +		}  		LLAPRFile::remove(logout_marker_file);  	}  	if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB))  	{ -		if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; -		else gLastExecEvent = LAST_EXEC_LLERROR_CRASH; -		LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		if (markerIsSameVersion(llerror_marker_file)) +		{ +			gLastExecEvent = ( gLastExecEvent == LAST_EXEC_LOGOUT_FROZE ) +				? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_LLERROR_CRASH; +			LL_INFOS("MarkerFile") << "Last exec LLError '"<< llerror_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Last exec LLError marker '"<< llerror_marker_file << "' found, but versions did not match" << LL_ENDL; +		}  		LLAPRFile::remove(llerror_marker_file);  	}  	if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))  	{ -		if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; -		else gLastExecEvent = LAST_EXEC_OTHER_CRASH; -		LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		if (markerIsSameVersion(error_marker_file)) +		{ +			gLastExecEvent = (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) +				? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_OTHER_CRASH; +			LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL; +		}  		LLAPRFile::remove(error_marker_file);  	} @@ -3497,35 +3570,48 @@ void LLAppViewer::initMarkerFile()  	if (s == APR_SUCCESS && mMarkerFile.getFileHandle())  	{ -		LL_DEBUGS("MarkerFile") << "Marker file created." << LL_ENDL; +		LL_DEBUGS("MarkerFile") << "Marker file '"<< mMarkerFileName << "' created." << LL_ENDL; +		if (APR_SUCCESS == apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE))  +		{ +			recordMarkerVersion(mMarkerFile); +			LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL; +		}  	}  	else  	{ -		LL_INFOS("MarkerFile") << "Failed to create marker file." << LL_ENDL; -		return; -	} -	if (apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS)  -	{ -		mMarkerFile.close() ; -		LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL; -		return; +		LL_INFOS("MarkerFile") << "Failed to create marker file '"<< mMarkerFileName << "'." << LL_ENDL;  	} - -	LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL;  }  void LLAppViewer::removeMarkerFile(bool leave_logout_marker)  { -	LL_DEBUGS("MarkerFile") << "removeMarkerFile()" << LL_ENDL; +	LL_DEBUGS("MarkerFile") << "removeMarkerFile("<<leave_logout_marker<<")" << LL_ENDL;  	if (mMarkerFile.getFileHandle())  	{ -		mMarkerFile.close() ; +		LL_DEBUGS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"'"<< LL_ENDL; +		mMarkerFile.close();  		LLAPRFile::remove( mMarkerFileName );  	} -	if (mLogoutMarkerFile != NULL && !leave_logout_marker) +	else  	{ +		LL_WARNS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"' not open"<< LL_ENDL; +	} +	if (!leave_logout_marker) +	{ +		if (mLogoutMarkerFile.getFileHandle()) +		{ +			LL_DEBUGS("MarkerFile") << "removeMarkerFile marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL; +			mLogoutMarkerFile.close(); +		} +		else +		{ +			LL_WARNS("MarkerFile") << "removeMarkerFile marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; +		}  		LLAPRFile::remove( mLogoutMarkerFileName ); -		mLogoutMarkerFile = NULL;  	}  } @@ -4727,16 +4813,15 @@ void LLAppViewer::sendLogoutRequest()  		mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME);  		LLAPRFile outfile ; -		outfile.open(mLogoutMarkerFileName, LL_APR_W); -		mLogoutMarkerFile =  outfile.getFileHandle() ; -		if (mLogoutMarkerFile) +		mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_W); +		if (mLogoutMarkerFile.getFileHandle())  		{ -			llinfos << "Created logout marker file " << mLogoutMarkerFileName << llendl; -    		apr_file_close(mLogoutMarkerFile); +			LL_INFOS("MarkerFile") << "Created logout marker file '"<< mLogoutMarkerFileName << "' " << mLogoutMarkerFileName << LL_ENDL; +			recordMarkerVersion(outfile);  		}  		else  		{ -			llwarns << "Cannot create logout marker file " << mLogoutMarkerFileName << llendl; +			LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL;  		}		  	}  } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 7563d672e3..0cc02b14e6 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -217,7 +217,9 @@ private:  	bool anotherInstanceRunning();   	void initMarkerFile();  -     +	static void recordMarkerVersion(LLAPRFile& marker_file); +	bool markerIsSameVersion(const std::string& marker_name) const; +	      void idle();       void idleShutdown();  	// update avatar SLID and display name caches @@ -237,7 +239,7 @@ private:  	LLAPRFile mMarkerFile; // A file created to indicate the app is running.  	std::string mLogoutMarkerFileName; -	apr_file_t* mLogoutMarkerFile; // A file created to indicate the app is running. +	LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running.  	LLOSInfo mSysOSInfo;  diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 39b6e465f3..76f62a7880 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -57,6 +57,7 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)  	mDone(FALSE)  {  	mID.generate(); +	mCommitCallbackRegistrar.add("BulkPermission.Ok",		boost::bind(&LLFloaterBulkPermission::onOkBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.Apply",	boost::bind(&LLFloaterBulkPermission::onApplyBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.Close",	boost::bind(&LLFloaterBulkPermission::onCloseBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.CheckAll",	boost::bind(&LLFloaterBulkPermission::onCheckAll, this)); @@ -66,6 +67,21 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)  BOOL LLFloaterBulkPermission::postBuild()  { +	mBulkChangeIncludeAnimations = gSavedSettings.getBOOL("BulkChangeIncludeAnimations"); +	mBulkChangeIncludeBodyParts = gSavedSettings.getBOOL("BulkChangeIncludeBodyParts"); +	mBulkChangeIncludeClothing = gSavedSettings.getBOOL("BulkChangeIncludeClothing"); +	mBulkChangeIncludeGestures = gSavedSettings.getBOOL("BulkChangeIncludeGestures"); +	mBulkChangeIncludeNotecards = gSavedSettings.getBOOL("BulkChangeIncludeNotecards"); +	mBulkChangeIncludeObjects = gSavedSettings.getBOOL("BulkChangeIncludeObjects"); +	mBulkChangeIncludeScripts = gSavedSettings.getBOOL("BulkChangeIncludeScripts"); +	mBulkChangeIncludeSounds = gSavedSettings.getBOOL("BulkChangeIncludeSounds"); +	mBulkChangeIncludeTextures = gSavedSettings.getBOOL("BulkChangeIncludeTextures"); +	mBulkChangeShareWithGroup = gSavedSettings.getBOOL("BulkChangeShareWithGroup"); +	mBulkChangeEveryoneCopy = gSavedSettings.getBOOL("BulkChangeEveryoneCopy"); +	mBulkChangeNextOwnerModify = gSavedSettings.getBOOL("BulkChangeNextOwnerModify"); +	mBulkChangeNextOwnerCopy = gSavedSettings.getBOOL("BulkChangeNextOwnerCopy"); +	mBulkChangeNextOwnerTransfer = gSavedSettings.getBOOL("BulkChangeNextOwnerTransfer"); +  	return TRUE;  } @@ -144,6 +160,12 @@ void LLFloaterBulkPermission::inventoryChanged(LLViewerObject* viewer_object,  	}  } +void LLFloaterBulkPermission::onOkBtn() +{ +	doApply(); +	closeFloater(); +} +  void LLFloaterBulkPermission::onApplyBtn()  {  	doApply(); @@ -151,6 +173,20 @@ void LLFloaterBulkPermission::onApplyBtn()  void LLFloaterBulkPermission::onCloseBtn()  { +	gSavedSettings.setBOOL("BulkChangeIncludeAnimations", mBulkChangeIncludeAnimations); +	gSavedSettings.setBOOL("BulkChangeIncludeBodyParts", mBulkChangeIncludeBodyParts); +	gSavedSettings.setBOOL("BulkChangeIncludeClothing", mBulkChangeIncludeClothing); +	gSavedSettings.setBOOL("BulkChangeIncludeGestures", mBulkChangeIncludeGestures); +	gSavedSettings.setBOOL("BulkChangeIncludeNotecards", mBulkChangeIncludeNotecards); +	gSavedSettings.setBOOL("BulkChangeIncludeObjects", mBulkChangeIncludeObjects); +	gSavedSettings.setBOOL("BulkChangeIncludeScripts", mBulkChangeIncludeScripts); +	gSavedSettings.setBOOL("BulkChangeIncludeSounds", mBulkChangeIncludeSounds); +	gSavedSettings.setBOOL("BulkChangeIncludeTextures", mBulkChangeIncludeTextures); +	gSavedSettings.setBOOL("BulkChangeShareWithGroup", mBulkChangeShareWithGroup); +	gSavedSettings.setBOOL("BulkChangeEveryoneCopy", mBulkChangeEveryoneCopy); +	gSavedSettings.setBOOL("BulkChangeNextOwnerModify", mBulkChangeNextOwnerModify); +	gSavedSettings.setBOOL("BulkChangeNextOwnerCopy", mBulkChangeNextOwnerCopy); +	gSavedSettings.setBOOL("BulkChangeNextOwnerTransfer", mBulkChangeNextOwnerTransfer);  	closeFloater();  } diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index 7dd05df7ee..25e76eca65 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -72,6 +72,7 @@ private:  								bool is_new);  	void onCloseBtn(); +	void onOkBtn();  	void onApplyBtn();  	void onCommitCopy();  	void onCheckAll() { doCheckUncheckAll(TRUE); } @@ -94,6 +95,21 @@ private:  	LLUUID mCurrentObjectID;  	BOOL mDone; +	bool mBulkChangeIncludeAnimations; +	bool mBulkChangeIncludeBodyParts; +	bool mBulkChangeIncludeClothing; +	bool mBulkChangeIncludeGestures; +	bool mBulkChangeIncludeNotecards; +	bool mBulkChangeIncludeObjects; +	bool mBulkChangeIncludeScripts; +	bool mBulkChangeIncludeSounds; +	bool mBulkChangeIncludeTextures; +	bool mBulkChangeShareWithGroup; +	bool mBulkChangeEveryoneCopy; +	bool mBulkChangeNextOwnerModify; +	bool mBulkChangeNextOwnerCopy; +	bool mBulkChangeNextOwnerTransfer; +  	LLUUID mID;  	const char* mStartString; diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 826e8d560a..c8b446872b 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1376,74 +1376,28 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )  		BOOL hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis);  		projected_mouse -= snap_plane_center; -		S32 snap_plane = 0; - -		F32 dot = cam_to_snap_plane * constraint_axis; -		if (llabs(dot) < 0.01f) -		{ -			// looking at ring edge on, project onto view plane and check if mouse is past ring -			getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane); -			projected_mouse -= snap_plane_center; -			dot = projected_mouse * constraint_axis; -			if (projected_mouse * constraint_axis > 0) -			{ -				snap_plane = 1; -			} -			projected_mouse -= dot * constraint_axis; -		} -		else if (dot > 0.f) -		{ -			// look for mouse position outside and in front of snap circle -			if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f) -			{ -				snap_plane = 1; -			} -		} -		else -		{ -			// look for mouse position inside or in back of snap circle -			if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit) -			{ -				snap_plane = 1; -			} -		} - -		if (snap_plane == 0) -		{ -			// try other plane -			snap_plane_center = (center - (constraint_axis * mRadiusMeters * 0.5f)); -			if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) -			{ -				cam_to_snap_plane.setVec(1.f, 0.f, 0.f); -			} -			else -			{ -				cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent(); -				cam_to_snap_plane.normVec(); -			} - -			hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis); -			projected_mouse -= snap_plane_center; - -			dot = cam_to_snap_plane * constraint_axis; +		if (gSavedSettings.getBOOL("SnapEnabled")) { +			S32 snap_plane = 0; +	 +			F32 dot = cam_to_snap_plane * constraint_axis;  			if (llabs(dot) < 0.01f)  			{  				// looking at ring edge on, project onto view plane and check if mouse is past ring  				getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane);  				projected_mouse -= snap_plane_center;  				dot = projected_mouse * constraint_axis; -				if (projected_mouse * constraint_axis < 0) +				if (projected_mouse * constraint_axis > 0)  				{ -					snap_plane = 2; +					snap_plane = 1;  				}  				projected_mouse -= dot * constraint_axis;  			} -			else if (dot < 0.f) +			else if (dot > 0.f)  			{  				// look for mouse position outside and in front of snap circle  				if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f)  				{ -					snap_plane = 2; +					snap_plane = 1;  				}  			}  			else @@ -1451,78 +1405,136 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )  				// look for mouse position inside or in back of snap circle  				if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit)  				{ -					snap_plane = 2; +					snap_plane = 1;  				}  			} -		} - -		if (snap_plane > 0) -		{ -			LLVector3 cam_at_axis; -			if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) -			{ -				cam_at_axis.setVec(1.f, 0.f, 0.f); -			} -			else -			{ -				cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent(); -				cam_at_axis.normVec(); -			} - -			// first, project mouse onto screen plane at point tangent to rotation radius.  -			getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_at_axis); -			// project that point onto rotation plane -			projected_mouse -= snap_plane_center; -			projected_mouse -= projected_vec(projected_mouse, constraint_axis); - -			F32 mouse_lateral_dist = llmin(SNAP_GUIDE_INNER_RADIUS * mRadiusMeters, projected_mouse.magVec()); -			F32 mouse_depth = SNAP_GUIDE_INNER_RADIUS * mRadiusMeters; -			if (llabs(mouse_lateral_dist) > 0.01f) -			{ -				mouse_depth = sqrtf((SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) * (SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) -  -									(mouse_lateral_dist * mouse_lateral_dist)); -			} -			LLVector3 projected_camera_at = cam_at_axis - projected_vec(cam_at_axis, constraint_axis); -			projected_mouse -= mouse_depth * projected_camera_at; - -			if (!mInSnapRegime) +	 +			if (snap_plane == 0)  			{ -				mSmoothRotate = TRUE; +				// try other plane +				snap_plane_center = (center - (constraint_axis * mRadiusMeters * 0.5f)); +				if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) +				{ +					cam_to_snap_plane.setVec(1.f, 0.f, 0.f); +				} +				else +				{ +					cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent(); +					cam_to_snap_plane.normVec(); +				} +	 +				hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis); +				projected_mouse -= snap_plane_center; +	 +				dot = cam_to_snap_plane * constraint_axis; +				if (llabs(dot) < 0.01f) +				{ +					// looking at ring edge on, project onto view plane and check if mouse is past ring +					getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane); +					projected_mouse -= snap_plane_center; +					dot = projected_mouse * constraint_axis; +					if (projected_mouse * constraint_axis < 0) +					{ +						snap_plane = 2; +					} +					projected_mouse -= dot * constraint_axis; +				} +				else if (dot < 0.f) +				{ +					// look for mouse position outside and in front of snap circle +					if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f) +					{ +						snap_plane = 2; +					} +				} +				else +				{ +					// look for mouse position inside or in back of snap circle +					if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit) +					{ +						snap_plane = 2; +					} +				}  			} -			mInSnapRegime = TRUE; -			// 0 to 360 deg -			F32 mouse_angle = fmodf(atan2(projected_mouse * axis1, projected_mouse * axis2) * RAD_TO_DEG + 360.f, 360.f); -			F32 relative_mouse_angle = fmodf(mouse_angle + (SNAP_ANGLE_DETENTE / 2), SNAP_ANGLE_INCREMENT); -			//fmodf(llround(mouse_angle * RAD_TO_DEG, 7.5f) + 360.f, 360.f); - -			LLVector3 object_axis; -			getObjectAxisClosestToMouse(object_axis); -			object_axis = object_axis * first_object_node->mSavedRotation; - -			// project onto constraint plane -			object_axis = object_axis - (object_axis * getConstraintAxis()) * getConstraintAxis(); -			object_axis.normVec(); - -			if (relative_mouse_angle < SNAP_ANGLE_DETENTE) +			if (snap_plane > 0)  			{ -				F32 quantized_mouse_angle = mouse_angle - (relative_mouse_angle - (SNAP_ANGLE_DETENTE * 0.5f)); -				angle = (quantized_mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				LLVector3 cam_at_axis; +				if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) +				{ +					cam_at_axis.setVec(1.f, 0.f, 0.f); +				} +				else +				{ +					cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent(); +					cam_at_axis.normVec(); +				} +	 +				// first, project mouse onto screen plane at point tangent to rotation radius.  +				getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_at_axis); +				// project that point onto rotation plane +				projected_mouse -= snap_plane_center; +				projected_mouse -= projected_vec(projected_mouse, constraint_axis); +	 +				F32 mouse_lateral_dist = llmin(SNAP_GUIDE_INNER_RADIUS * mRadiusMeters, projected_mouse.magVec()); +				F32 mouse_depth = SNAP_GUIDE_INNER_RADIUS * mRadiusMeters; +				if (llabs(mouse_lateral_dist) > 0.01f) +				{ +					mouse_depth = sqrtf((SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) * (SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) -  +										(mouse_lateral_dist * mouse_lateral_dist)); +				} +				LLVector3 projected_camera_at = cam_at_axis - projected_vec(cam_at_axis, constraint_axis); +				projected_mouse -= mouse_depth * projected_camera_at; +	 +				if (!mInSnapRegime) +				{ +					mSmoothRotate = TRUE; +				} +				mInSnapRegime = TRUE; +				// 0 to 360 deg +				F32 mouse_angle = fmodf(atan2(projected_mouse * axis1, projected_mouse * axis2) * RAD_TO_DEG + 360.f, 360.f); +				 +				F32 relative_mouse_angle = fmodf(mouse_angle + (SNAP_ANGLE_DETENTE / 2), SNAP_ANGLE_INCREMENT); +				//fmodf(llround(mouse_angle * RAD_TO_DEG, 7.5f) + 360.f, 360.f); +	 +				LLVector3 object_axis; +				getObjectAxisClosestToMouse(object_axis); +				object_axis = object_axis * first_object_node->mSavedRotation; +	 +				// project onto constraint plane +				object_axis = object_axis - (object_axis * getConstraintAxis()) * getConstraintAxis(); +				object_axis.normVec(); +	 +				if (relative_mouse_angle < SNAP_ANGLE_DETENTE) +				{ +					F32 quantized_mouse_angle = mouse_angle - (relative_mouse_angle - (SNAP_ANGLE_DETENTE * 0.5f)); +					angle = (quantized_mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				} +				else +				{ +					angle = (mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				} +				return LLQuaternion( -angle, constraint_axis );  			}  			else  			{ -				angle = (mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				if (mInSnapRegime) +				{ +					mSmoothRotate = TRUE; +				} +				mInSnapRegime = FALSE;  			} -			return LLQuaternion( -angle, constraint_axis );  		} -		else -		{ +		else {  			if (mInSnapRegime)  			{  				mSmoothRotate = TRUE;  			}  			mInSnapRegime = FALSE; - +		} +		 +		if (!mInSnapRegime) +		{  			LLVector3 up_from_axis = mCenterToCamNorm % constraint_axis;  			up_from_axis.normVec();  			LLVector3 cur_intersection; diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 4e0cfb0cd4..e7ab3cacdc 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -6,7 +6,7 @@   layout="topleft"   name="floaterbulkperms"   help_topic="floaterbulkperms" - title="EDIT CONTENT PERMISSIONS" + title="ADJUST CONTENT PERMISSIONS"   width="410">      <floater.string       name="nothing_to_modify_text"> @@ -192,7 +192,7 @@       name="newperms"       top="90"       width="250"> -        New Content Permissions +        Adjust Content Permissions To      </text>        <text         type="string" @@ -292,11 +292,22 @@       height="23"       label="OK"       layout="topleft" -     left="205" -     name="apply" +     left="110" +     name="ok"       top_pad="10"       width="90">        <button.commit_callback +       function="BulkPermission.Ok"/> +    </button> +    <button +     follows="left|top" +     height="23" +     label="Apply" +     layout="topleft" +     left_pad="5" +     name="apply" +     width="90"> +      <button.commit_callback         function="BulkPermission.Apply"/>      </button>      <button diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 6d5fb51e85..c8ce5cdebf 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -202,14 +202,14 @@ Maximum 200 per group daily              Drag and drop item here to attach it:          </text>          <icon -         height="72" +         height="48"           image_name="DropTarget"           layout="topleft"           left_pad="10"           mouse_opaque="true"           name="drop_icon"           top_delta="-10" -         width="72" /> +         width="110" />          <button           follows="left|top"           layout="topleft" 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 2cc9d9c1b0..50fd57494f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -138,7 +138,7 @@     initial_value="1"     layout="topleft"     left_pad="0" -   max_val="1.4" +   max_val="1.5"     min_val="0.75"     name="ui_scale_slider"     top_pad="-14" | 
