diff options
| -rw-r--r-- | indra/llui/lltoolbar.cpp | 45 | ||||
| -rw-r--r-- | indra/llui/lltoolbar.h | 1 | ||||
| -rw-r--r-- | indra/newview/lltoolbarview.cpp | 6 | 
3 files changed, 51 insertions, 1 deletions
| diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 629c7d9bc7..c559a2bf1d 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 616710ea70..ad42d1fa35 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -185,6 +185,7 @@ public:  	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 21e682f072..c7c8268eb9 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 | 
