From aec61c579a40687e2696d38a535143d59f771416 Mon Sep 17 00:00:00 2001
From: Leslie Linden <leslie@lindenlab.com>
Date: Tue, 11 Oct 2011 10:07:19 -0700
Subject: [PATCH] Added 'execute_stop_function' command parameter to handle
 mouse down/up actions on toolbar buttons

---
 indra/llui/llbutton.cpp                 | 18 ++++++++++++++++++
 indra/llui/llbutton.h                   |  5 +++++
 indra/llui/llcommandmanager.cpp         |  4 ++++
 indra/llui/llcommandmanager.h           |  9 +++++++++
 indra/llui/lltoolbar.cpp                | 22 ++++++++++++++++++----
 indra/newview/app_settings/commands.xml |  2 ++
 6 files changed, 56 insertions(+), 4 deletions(-)

diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index ba3748a5736..2e9c7a5d3d7 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -296,6 +296,24 @@ void LLButton::onCommit()
 	LLUICtrl::onCommit();
 }
 
+boost::signals2::connection LLButton::setClickedCallback(const CommitCallbackParam& cb)
+{
+	return setClickedCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseDownCallback(const CommitCallbackParam& cb)
+{
+	return setMouseDownCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setMouseUpCallback(const CommitCallbackParam& cb)
+{
+	return setMouseUpCallback(initCommitCallback(cb));
+}
+boost::signals2::connection LLButton::setHeldDownCallback(const CommitCallbackParam& cb)
+{
+	return setHeldDownCallback(initCommitCallback(cb));
+}
+
+
 boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
 {
 	if (!mCommitSignal) mCommitSignal = new commit_signal_t();
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index a0a7b4e372c..ba0345f6109 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -170,6 +170,11 @@ class LLButton
 	void			setUseEllipses( BOOL use_ellipses )					{ mUseEllipses = use_ellipses; }
 
 
+	boost::signals2::connection setClickedCallback(const CommitCallbackParam& cb);
+	boost::signals2::connection setMouseDownCallback(const CommitCallbackParam& cb);
+	boost::signals2::connection setMouseUpCallback(const CommitCallbackParam& cb);
+	boost::signals2::connection setHeldDownCallback(const CommitCallbackParam& cb);
+
 	boost::signals2::connection setClickedCallback( const commit_signal_t::slot_type& cb ); // mouse down and up within button
 	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
 	boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb ); // mouse up, EVEN IF NOT IN BUTTON
diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp
index d8e035a3203..128ba609cb2 100644
--- a/indra/llui/llcommandmanager.cpp
+++ b/indra/llui/llcommandmanager.cpp
@@ -55,6 +55,8 @@ LLCommand::Params::Params()
 	, tooltip_ref("tooltip_ref")
 	, execute_function("execute_function")
 	, execute_parameters("execute_parameters")
+	, execute_stop_function("execute_stop_function")
+	, execute_stop_parameters("execute_stop_parameters")
 	, is_enabled_function("is_enabled_function")
 	, is_enabled_parameters("is_enabled_parameters")
 	, is_running_function("is_running_function")
@@ -72,6 +74,8 @@ LLCommand::LLCommand(const LLCommand::Params& p)
 	, mTooltipRef(p.tooltip_ref)
 	, mExecuteFunction(p.execute_function)
 	, mExecuteParameters(p.execute_parameters)
+	, mExecuteStopFunction(p.execute_stop_function)
+	, mExecuteStopParameters(p.execute_stop_parameters)
 	, mIsEnabledFunction(p.is_enabled_function)
 	, mIsEnabledParameters(p.is_enabled_parameters)
 	, mIsRunningFunction(p.is_running_function)
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
index 46e0fe6e69e..9b93ab735a4 100644
--- a/indra/llui/llcommandmanager.h
+++ b/indra/llui/llcommandmanager.h
@@ -116,6 +116,9 @@ class LLCommand
 		Mandatory<std::string>	execute_function;
 		Optional<LLSD>			execute_parameters;
 
+		Optional<std::string>	execute_stop_function;
+		Optional<LLSD>			execute_stop_parameters;
+		
 		Optional<std::string>	is_enabled_function;
 		Optional<LLSD>			is_enabled_parameters;
 
@@ -139,6 +142,9 @@ class LLCommand
 	const std::string& executeFunctionName() const { return mExecuteFunction; }
 	const LLSD& executeParameters() const { return mExecuteParameters; }
 
+	const std::string& executeStopFunctionName() const { return mExecuteStopFunction; }
+	const LLSD& executeStopParameters() const { return mExecuteStopParameters; }
+	
 	const std::string& isEnabledFunctionName() const { return mIsEnabledFunction; }
 	const LLSD& isEnabledParameters() const { return mIsEnabledParameters; }
 
@@ -159,6 +165,9 @@ class LLCommand
 	std::string mExecuteFunction;
 	LLSD        mExecuteParameters;
 
+	std::string mExecuteStopFunction;
+	LLSD        mExecuteStopParameters;
+	
 	std::string mIsEnabledFunction;
 	LLSD        mIsEnabledParameters;
 
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 89184f781f7..e74aab6e216 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -659,11 +659,25 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 
 	if (!mReadOnly)
 	{
-		LLUICtrl::CommitCallbackParam cbParam;
-		cbParam.function_name = commandp->executeFunctionName();
-		cbParam.parameter = commandp->executeParameters();
+		LLUICtrl::CommitCallbackParam executeParam;
+		executeParam.function_name = commandp->executeFunctionName();
+		executeParam.parameter = commandp->executeParameters();
 
-		button->setCommitCallback(cbParam);
+		// If we have a "stop" function then we map the command to mouse down / mouse up otherwise commit
+		const std::string& executeStopFunction = commandp->executeStopFunctionName();
+		if (executeStopFunction.length() > 0)
+		{
+			LLUICtrl::CommitCallbackParam executeStopParam;
+			executeStopParam.function_name = executeStopFunction;
+			executeStopParam.parameter = commandp->executeStopParameters();
+			
+			button->setMouseDownCallback(executeParam);
+			button->setMouseUpCallback(executeStopParam);
+		}
+		else
+		{
+			button->setCommitCallback(executeParam);
+		}
 
 		const std::string& isEnabledFunction = commandp->isEnabledFunctionName();
 		if (isEnabledFunction.length() > 0)
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index d758647d3a7..296d992b340 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -217,6 +217,8 @@
            tooltip_ref="Command_Speak_Tooltip"
            execute_function="Agent.ToggleMicrophone"
            execute_parameters="speak"
+           execute_stop_function=""
+           execute_stop_parameters="speak"
            is_enabled_function="Agent.IsActionAllowed"
            is_enabled_parameters="speak"
            is_running_function="Agent.IsMicrophoneOn"
-- 
GitLab