diff options
| author | Dave SIMmONs <simon@lindenlab.com> | 2011-03-28 16:54:40 -0700 | 
|---|---|---|
| committer | Dave SIMmONs <simon@lindenlab.com> | 2011-03-28 16:54:40 -0700 | 
| commit | f2bb81d17660054697ed984afc0e3f8d90f77eda (patch) | |
| tree | b7a4b137dcdab719bf9e877cc6d6466f9c437f25 /indra | |
| parent | 0642000a12785bc4e17b334751f386bd1ec6c702 (diff) | |
Added LLEventHost API for gestures.  Have new llgesturelistener.cpp and .h files, wired up to LLGestureMgr class.  Reviewed by Kelly
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llgesturelistener.cpp | 159 | ||||
| -rw-r--r-- | indra/newview/llgesturelistener.h | 52 | ||||
| -rw-r--r-- | indra/newview/llgesturemgr.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llgesturemgr.h | 4 | 
5 files changed, 219 insertions, 0 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index d6a144f1dc..ef48fcdf2f 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -232,6 +232,7 @@ set(viewer_SOURCE_FILES      llfolderviewitem.cpp      llfollowcam.cpp      llfriendcard.cpp +    llgesturelistener.cpp      llgesturemgr.cpp      llgiveinventory.cpp      llglsandbox.cpp @@ -776,6 +777,7 @@ set(viewer_HEADER_FILES      llfolderviewitem.h      llfollowcam.h      llfriendcard.h +    llgesturelistener.h      llgesturemgr.h      llgiveinventory.h      llgroupactions.h diff --git a/indra/newview/llgesturelistener.cpp b/indra/newview/llgesturelistener.cpp new file mode 100644 index 0000000000..f682700746 --- /dev/null +++ b/indra/newview/llgesturelistener.cpp @@ -0,0 +1,159 @@ +/**
 + * @file   llgesturelistener.cpp
 + * @author Dave Simmons
 + * @date   2011-03-28
 + * @brief  Implementation for LLGestureListener.
 + *
 + * $LicenseInfo:firstyear=2011&license=viewerlgpl$
 + * Second Life Viewer Source Code
 + * Copyright (C) 2011, Linden Research, Inc.
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation;
 + * version 2.1 of the License only.
 + *
 + * This library is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with this library; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 + *
 + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 + * $/LicenseInfo$
 + */
 +
 +#include "llviewerprecompiledheaders.h"
 +
 +#include "llgesturelistener.h"
 +#include "llgesturemgr.h"
 +#include "llmultigesture.h"
 +
 +
 +LLGestureListener::LLGestureListener()
 +  : LLEventAPI("LLGesture",
 +               "LLGesture listener interface to control gestures")
 +{
 +    add("getActiveGestures",
 +        "Return information about the agent's available gestures [\"reply\"]:\n"
 +        "[\"gestures\"]: list of gestures.  This is a dictionary with UUID strings as keys\n"
 +		"  and the following values:\n"
 +		"     [\"name\"]: name of the gesture, may be empty\n"
 +		"     [\"trigger\"]: trigger string used to invoke via user chat, may be empty\n"
 +		"     [\"playing\"]: true or false indicating the playing state",
 +        &LLGestureListener::getActiveGestures,
 +        LLSDMap("reply", LLSD()));
 +	add("isGesturePlaying",
 +		"[\"id\"]: UUID of the gesture to query.  Returns True or False in [\"playing\"] value of the result",
 +        &LLGestureListener::isGesturePlaying);
 +	add("startGesture",
 +		"[\"id\"]: UUID of the gesture to start play",
 +        &LLGestureListener::startGesture);
 +	add("stopGesture",
 +		"[\"id\"]: UUID of the gesture to stop",
 +        &LLGestureListener::stopGesture);
 +}
 +
 +
 +// "getActiveGestures" command
 +void LLGestureListener::getActiveGestures(const LLSD& event_data) const
 +{
 +	LLSD reply = LLSD::emptyMap();
 +	LLSD gesture_map = LLSD::emptyMap();
 +
 +	const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures(); + +	// Scan active gesture map and get all the names +	LLGestureMgr::item_map_t::const_iterator it; +	for (it = active_gestures.begin(); it != active_gestures.end(); ++it) +	{ +		LLMultiGesture* gesture = (*it).second; +		if (gesture) +		{	// Add an entry to the result map with the LLUUID as key with a map containing data +			LLSD info = LLSD::emptyMap(); +			info["name"] = (LLSD::String) gesture->mName; +			info["trigger"] = (LLSD::String) gesture->mTrigger; +			info["playing"] = (LLSD::Boolean) gesture->mPlaying; + +			gesture_map[(*it).first.asString()] = info; +		} +	} +
 +	reply["gestures"] = gesture_map;
 +	sendReply(reply, event_data);
 +}
 +
 +
 +
 +// "isGesturePlaying" command
 +void LLGestureListener::isGesturePlaying(const LLSD& event_data) const
 +{
 +	bool is_playing = false;
 +	if (event_data.has("id"))
 +	{
 +		LLUUID gesture_id = event_data["id"].asUUID();
 +		if (gesture_id.notNull())
 +		{
 +			is_playing = LLGestureMgr::instance().isGesturePlaying(gesture_id);
 +		}
 +		else
 +		{
 +			llwarns << "isGesturePlaying did not find a gesture object for " << gesture_id << llendl;
 +		}
 +	}
 +	else
 +	{
 +		llwarns << "isGesturePlaying didn't have 'id' value passed in" << llendl;
 +	}
 +
 +	LLSD reply = LLSD::emptyMap();
 +	reply["playing"] = (LLSD::Boolean) is_playing;
 +	sendReply(reply, event_data);
 +}
 +
 +
 +// "startGesture" command
 +void LLGestureListener::startGesture(LLSD const & event_data) const
 +{
 +	startOrStopGesture(event_data, true);
 +}
 +
 +
 +// "stopGesture" command
 +void LLGestureListener::stopGesture(LLSD const & event_data) const
 +{
 +	startOrStopGesture(event_data, false);
 +}
 +
 +
 +// Real code for "startGesture" or "stopGesture"
 +void LLGestureListener::startOrStopGesture(LLSD const & event_data, bool start) const
 +{
 +	if (event_data.has("id"))
 +	{
 +		LLUUID gesture_id = event_data["id"].asUUID();
 +		if (gesture_id.notNull())
 +		{
 +			if (start)
 +			{
 +				LLGestureMgr::instance().playGesture(gesture_id); +			} +			else +			{ +				LLGestureMgr::instance().stopGesture(gesture_id); +			} +		}
 +		else
 +		{
 +			llwarns << "startOrStopGesture did not find a gesture object for " << gesture_id << llendl;
 +		}
 +	}
 +	else
 +	{
 +		llwarns << "startOrStopGesture didn't have 'id' value passed in" << llendl;
 +	}
 +}
 +
 diff --git a/indra/newview/llgesturelistener.h b/indra/newview/llgesturelistener.h new file mode 100644 index 0000000000..326881ac2b --- /dev/null +++ b/indra/newview/llgesturelistener.h @@ -0,0 +1,52 @@ +/**
 + * @file   llgesturelistener.h
 + * @author Dave Simmons
 + * @date   2011-03-15
 + * @brief  Class definition for LLGestureListener.
 + *
 + * $LicenseInfo:firstyear=2011&license=viewerlgpl$
 + * Second Life Viewer Source Code
 + * Copyright (C) 2011, Linden Research, Inc.
 + *
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation;
 + * version 2.1 of the License only.
 + *
 + * This library is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with this library; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 + *
 + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 + * $/LicenseInfo$
 + */
 +
 +
 +#ifndef LL_LLGESTURELISTENER_H
 +#define LL_LLGESTURELISTENER_H
 +
 +#include "lleventapi.h"
 +
 +class LLSD;
 +
 +class LLGestureListener : public LLEventAPI
 +{
 +public:
 +	LLGestureListener();
 +
 +private:
 +    void getActiveGestures(LLSD const & gesture_data) const;
 +	void isGesturePlaying(LLSD const & gesture_data) const;
 +    void startGesture(LLSD const & gesture_data) const;
 +    void stopGesture(LLSD const & gesture_data) const;
 +
 +	void startOrStopGesture(LLSD const & event_data, bool start) const;
 +};
 +
 +#endif // LL_LLGESTURELISTENER_H
 +
 diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index f658287fb1..c5b821c360 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -51,6 +51,7 @@  #include "llviewerstats.h"  #include "llnearbychatbar.h"  #include "llappearancemgr.h" +#include "llgesturelistener.h"  // Longest time, in seconds, to wait for all animations to stop playing  const F32 MAX_WAIT_ANIM_SECS = 30.f; @@ -68,6 +69,7 @@ LLGestureMgr::LLGestureMgr()  	mLoadingCount(0)  {  	gInventory.addObserver(this); +	mListener.reset(new LLGestureListener());  } diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index b9935efeb3..e305895797 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -37,6 +37,7 @@  #include "llviewerinventory.h"  class LLMultiGesture; +class LLGestureListener;  class LLGestureStep;  class LLUUID;  class LLVFS; @@ -172,6 +173,9 @@ private:  	callback_map_t mCallbackMap;  	std::vector<LLMultiGesture*> mPlaying;	  	BOOL mValid; + +	// LLEventHost interface +	boost::shared_ptr<LLGestureListener> mListener;  };  #endif | 
