From d6be2b49041c3ea51205bdd5a0ea7890afb9a5e5 Mon Sep 17 00:00:00 2001
From: Leslie Linden <leslie@lindenlab.com>
Date: Tue, 18 Oct 2011 17:11:05 -0700
Subject: [PATCH] EXP-1348 FIX -- Speak button activated when dragging and
 dropping between toolbars and moving back to Tool box

* Dragging and dropping the speak button will aggressively turn off the
  microphone now, regardless of the initial state of the button.

Reviewed by Richard.
---
 indra/llui/lltoolbar.cpp        | 45 ++++++++++++++++++++++++++++++++-
 indra/llui/lltoolbar.h          |  1 +
 indra/newview/lltoolbarview.cpp |  6 +++++
 3 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 629c7d9bc74..c559a2bf1d8 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -302,7 +302,50 @@ bool LLToolBar::enableCommand(const LLCommandId& commandId, bool enabled)
 		command_id_map::iterator it = mButtonMap.find(commandId.uuid());
 		if (it != mButtonMap.end())
 		{
-			it->second->setEnabled(enabled);
+			command_button = it->second;
+			command_button->setEnabled(enabled);
+		}
+	}
+
+	return (command_button != NULL);
+}
+
+bool LLToolBar::stopCommandInProgress(const LLCommandId& commandId)
+{
+	//
+	// Note from Leslie:
+	//
+	// This implementation was largely put in place to handle EXP-1348 which is related to
+	// dragging and dropping the "speak" button.  The "speak" button can be in one of two
+	// modes, i.e., either a toggle action or a push-to-talk action.  Because of this it
+	// responds to mouse down and mouse up in different ways, based on which behavior the
+	// button is currently set to obey.  This was the simplest way of getting the button
+	// to turn off the microphone for both behaviors without risking duplicate state.
+	//
+
+	LLToolBarButton * command_button = NULL;
+
+	if (commandId != LLCommandId::null)
+	{
+		LLCommand* command = LLCommandManager::instance().getCommand(commandId);
+		llassert(command);
+
+		// If this command has an explicit function for execution stop
+		if (command->executeStopFunctionName().length() > 0)
+		{
+			command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+			if (it != mButtonMap.end())
+			{
+				command_button = it->second;
+				llassert(command_button->mIsRunningSignal);
+
+				// Check to see if it is running
+				if ((*command_button->mIsRunningSignal)(command_button, command->isRunningParameters()))
+				{
+					// Trigger an additional button commit, which calls mouse down, mouse up and commit
+					command_button->onCommit();
+				}
+			}
 		}
 	}
 
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index 616710ea70f..ad42d1fa353 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -185,6 +185,7 @@ class LLToolBar
 	int  removeCommand(const LLCommandId& commandId);		// Returns the rank the removed command was at, RANK_NONE if not found
 	bool hasCommand(const LLCommandId& commandId) const;
 	bool enableCommand(const LLCommandId& commandId, bool enabled);
+	bool stopCommandInProgress(const LLCommandId& commandId);
 
 	void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; }
 	void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index 21e682f0728..c7c8268eb94 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -355,6 +355,12 @@ BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp
 			LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_VIEWER;
 			LLUUID srcID;
 			LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src, srcID);
+
+			// Second, stop the command if it is in progress and requires stopping!
+			LLCommandId command_id = LLCommandId(uuid);
+			gToolBarView->mToolbarLeft->stopCommandInProgress(command_id);
+			gToolBarView->mToolbarRight->stopCommandInProgress(command_id);
+			gToolBarView->mToolbarBottom->stopCommandInProgress(command_id);
 			
 			// Second, check if the command is present in one of the 3 toolbars
 			// If it is, store the command, the toolbar and the rank in the toolbar and
-- 
GitLab