diff options
author | Todd Stinson <stinson@lindenlab.com> | 2012-02-21 18:40:40 -0800 |
---|---|---|
committer | Todd Stinson <stinson@lindenlab.com> | 2012-02-21 18:40:40 -0800 |
commit | 1757f3967874a2885b45e3324bf19f677e76f6bc (patch) | |
tree | 388a9a8ac49314e30cd66e926bebb26a40056516 /indra/newview | |
parent | 85660a9b95e466abc064304869a79db393543440 (diff) |
PATH-296: Refining the behavior of the freeze/unfreeze functionality to support both basic and edit/test pathfinding floaters open at the same time.
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llfloaterpathfindingbasic.cpp | 54 | ||||
-rw-r--r-- | indra/newview/llfloaterpathfindingbasic.h | 15 | ||||
-rw-r--r-- | indra/newview/llpathfindingmanager.cpp | 104 | ||||
-rw-r--r-- | indra/newview/llpathfindingmanager.h | 37 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_pathfinding_basic.xml | 7 |
5 files changed, 150 insertions, 67 deletions
diff --git a/indra/newview/llfloaterpathfindingbasic.cpp b/indra/newview/llfloaterpathfindingbasic.cpp index af20a510c1..654189d4ef 100644 --- a/indra/newview/llfloaterpathfindingbasic.cpp +++ b/indra/newview/llfloaterpathfindingbasic.cpp @@ -25,8 +25,6 @@ * $/LicenseInfo$
*/
-#include <boost/bind.hpp>
-
#include "llviewerprecompiledheaders.h"
#include "llfloaterpathfindingbasic.h"
#include "llsd.h"
@@ -34,6 +32,9 @@ #include "llbutton.h"
#include "llpathfindingmanager.h"
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+
//---------------------------------------------------------------------------
// LLFloaterPathfindingBasic
//---------------------------------------------------------------------------
@@ -60,19 +61,25 @@ BOOL LLFloaterPathfindingBasic::postBuild() return LLFloater::postBuild();
}
-void LLFloaterPathfindingBasic::onOpen(const LLSD& key)
+void LLFloaterPathfindingBasic::onOpen(const LLSD& pKey)
{
- LLPathfindingManager *pathfindingManager = LLPathfindingManager::getInstance();
- if (pathfindingManager->isPathfindingEnabledForCurrentRegion())
+ LLFloater::onOpen(pKey);
+
+ if (!mAgentStateSlot.connected())
{
- LLPathfindingManager::getInstance()->requestGetAgentState(boost::bind(&LLFloaterPathfindingBasic::onAgentStateCB, this, _1));
+ mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateSignal(boost::bind(&LLFloaterPathfindingBasic::onAgentStateCB, this, _1));
}
- else
+ setAgentState(LLPathfindingManager::getInstance()->getAgentState());
+}
+
+void LLFloaterPathfindingBasic::onClose(bool pIsAppQuitting)
+{
+ if (mAgentStateSlot.connected())
{
- setAgentState(LLPathfindingManager::kAgentStateNotEnabled);
+ mAgentStateSlot.disconnect();
}
- LLFloater::onOpen(key);
+ LLFloater::onClose(pIsAppQuitting);
}
LLFloaterPathfindingBasic::LLFloaterPathfindingBasic(const LLSD& pSeed)
@@ -82,7 +89,7 @@ LLFloaterPathfindingBasic::LLFloaterPathfindingBasic(const LLSD& pSeed) mUnfreezeButton(NULL),
mFreezeLabel(NULL),
mFreezeButton(NULL),
- mAgentState(LLPathfindingManager::kAgentStateInitialDefault)
+ mAgentStateSlot()
{
}
@@ -93,13 +100,13 @@ LLFloaterPathfindingBasic::~LLFloaterPathfindingBasic() void LLFloaterPathfindingBasic::onUnfreezeClicked()
{
mUnfreezeButton->setEnabled(FALSE);
- LLPathfindingManager::getInstance()->requestSetAgentState(LLPathfindingManager::kAgentStateUnfrozen, boost::bind(&LLFloaterPathfindingBasic::onAgentStateCB, this, _1));
+ LLPathfindingManager::getInstance()->requestSetAgentState(LLPathfindingManager::kAgentStateUnfrozen);
}
void LLFloaterPathfindingBasic::onFreezeClicked()
{
mUnfreezeButton->setEnabled(FALSE);
- LLPathfindingManager::getInstance()->requestSetAgentState(LLPathfindingManager::kAgentStateFrozen, boost::bind(&LLFloaterPathfindingBasic::onAgentStateCB, this, _1));
+ LLPathfindingManager::getInstance()->requestSetAgentState(LLPathfindingManager::kAgentStateFrozen);
}
void LLFloaterPathfindingBasic::onAgentStateCB(LLPathfindingManager::EAgentState pAgentState)
@@ -109,26 +116,33 @@ void LLFloaterPathfindingBasic::onAgentStateCB(LLPathfindingManager::EAgentState void LLFloaterPathfindingBasic::setAgentState(LLPathfindingManager::EAgentState pAgentState)
{
+ static const LLColor4 warningColor = LLUIColorTable::instance().getColor("DrYellow");
+ LLStyle::Params styleParams;
+
switch (pAgentState)
{
+ case LLPathfindingManager::kAgentStateUnknown :
+ mStatusText->setVisible(TRUE);
+ mStatusText->setText((LLStringExplicit)getString("status_querying_state"), styleParams);
+ break;
case LLPathfindingManager::kAgentStateNotEnabled :
mStatusText->setVisible(TRUE);
- mStatusText->setText((LLStringExplicit)getString("pathfinding_not_enabled"));
- mAgentState = pAgentState;
+ styleParams.color = warningColor;
+ mStatusText->setText((LLStringExplicit)getString("status_pathfinding_not_enabled"), styleParams);
break;
case LLPathfindingManager::kAgentStateError :
mStatusText->setVisible(TRUE);
- mStatusText->setText((LLStringExplicit)getString("unable_to_change_state"));
- // Do not actually change the current state in the error case allowing user to retry previous command
+ styleParams.color = warningColor;
+ mStatusText->setText((LLStringExplicit)getString("status_unable_to_change_state"), styleParams);
break;
default :
mStatusText->setVisible(FALSE);
- mAgentState = pAgentState;
break;
}
- switch (mAgentState)
+ switch (LLPathfindingManager::getInstance()->getLastKnownNonErrorAgentState())
{
+ case LLPathfindingManager::kAgentStateUnknown :
case LLPathfindingManager::kAgentStateNotEnabled :
mUnfreezeLabel->setEnabled(FALSE);
mUnfreezeButton->setEnabled(FALSE);
@@ -147,12 +161,8 @@ void LLFloaterPathfindingBasic::setAgentState(LLPathfindingManager::EAgentState mFreezeLabel->setEnabled(TRUE);
mFreezeButton->setEnabled(TRUE);
break;
- case LLPathfindingManager::kAgentStateError :
- llassert(0);
- break;
default :
llassert(0);
break;
}
}
-
diff --git a/indra/newview/llfloaterpathfindingbasic.h b/indra/newview/llfloaterpathfindingbasic.h index 356a270ca0..f765917cd7 100644 --- a/indra/newview/llfloaterpathfindingbasic.h +++ b/indra/newview/llfloaterpathfindingbasic.h @@ -42,7 +42,8 @@ class LLFloaterPathfindingBasic public: virtual BOOL postBuild(); - virtual void onOpen(const LLSD& key); + virtual void onOpen(const LLSD& pKey); + virtual void onClose(bool pIsAppQuitting); protected: @@ -59,12 +60,12 @@ private: void setAgentState(LLPathfindingManager::EAgentState pAgentState); - LLTextBase *mStatusText; - LLTextBase *mUnfreezeLabel; - LLButton *mUnfreezeButton; - LLTextBase *mFreezeLabel; - LLButton *mFreezeButton; - LLPathfindingManager::EAgentState mAgentState; + LLTextBase *mStatusText; + LLTextBase *mUnfreezeLabel; + LLButton *mUnfreezeButton; + LLTextBase *mFreezeLabel; + LLButton *mFreezeButton; + LLPathfindingManager::agent_state_slot_t mAgentStateSlot; }; #endif // LL_LLFLOATERPATHFINDINGBASIC_H diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index e46ec0e171..3905e6d9f3 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -27,8 +27,6 @@ #include <string>
-#include <boost/function.hpp>
-
#include "llviewerprecompiledheaders.h"
#include "llpathfindingmanager.h"
#include "llsingleton.h"
@@ -36,6 +34,9 @@ #include "llagent.h"
#include "llviewerregion.h"
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
#define CAP_SERVICE_RETRIEVE_NAVMESH "RetrieveNavMeshSrc"
#define CAP_SERVICE_AGENT_STATE "AgentPreferences"
@@ -48,7 +49,7 @@ class AgentStateResponder : public LLHTTPClient::Responder
{
public:
- AgentStateResponder(LLPathfindingManager::agent_state_callback_t pAgentStateCB, const std::string &pCapabilityURL);
+ AgentStateResponder(const std::string &pCapabilityURL, LLPathfindingManager::EAgentState pRequestedAgentState = LLPathfindingManager::kAgentStateUnknown);
virtual ~AgentStateResponder();
virtual void result(const LLSD &pContent);
@@ -57,8 +58,8 @@ public: protected:
private:
- LLPathfindingManager::agent_state_callback_t mAgentStateCB;
- std::string mCapabilityURL;
+ std::string mCapabilityURL;
+ LLPathfindingManager::EAgentState mRequestedAgentState;
};
//---------------------------------------------------------------------------
@@ -66,6 +67,10 @@ private: //---------------------------------------------------------------------------
LLPathfindingManager::LLPathfindingManager()
+ : LLSingleton<LLPathfindingManager>(),
+ mAgentStateSignal(),
+ mAgentState(kAgentStateUnknown),
+ mLastKnownNonErrorAgentState(kAgentStateUnknown)
{
}
@@ -79,52 +84,103 @@ bool LLPathfindingManager::isPathfindingEnabledForCurrentRegion() const return !retrieveNavMeshURL.empty();
}
-void LLPathfindingManager::requestGetAgentState(agent_state_callback_t pAgentStateCB) const
+LLPathfindingManager::agent_state_slot_t LLPathfindingManager::registerAgentStateSignal(agent_state_callback_t pAgentStateCallback)
{
- std::string agentStateURL = getAgentStateURLForCurrentRegion();
+ return mAgentStateSignal.connect(pAgentStateCallback);
+}
- if (agentStateURL.empty())
+LLPathfindingManager::EAgentState LLPathfindingManager::getAgentState()
+{
+ if (!isPathfindingEnabledForCurrentRegion())
{
- pAgentStateCB(kAgentStateError);
+ setAgentState(kAgentStateNotEnabled);
}
else
{
- LLHTTPClient::ResponderPtr responder = new AgentStateResponder(pAgentStateCB, agentStateURL);
- LLHTTPClient::get(agentStateURL, responder);
+ if (!isValidAgentState(mAgentState))
+ {
+ requestGetAgentState();
+ }
}
+
+ return mAgentState;
}
-void LLPathfindingManager::requestSetAgentState(EAgentState pAgentState, agent_state_callback_t pAgentStateCB) const
+LLPathfindingManager::EAgentState LLPathfindingManager::getLastKnownNonErrorAgentState() const
{
+ return mLastKnownNonErrorAgentState;
+}
+
+void LLPathfindingManager::requestSetAgentState(EAgentState pRequestedAgentState)
+{
+ llassert(isValidAgentState(pRequestedAgentState));
std::string agentStateURL = getAgentStateURLForCurrentRegion();
if (agentStateURL.empty())
{
- pAgentStateCB(kAgentStateError);
+ setAgentState(kAgentStateNotEnabled);
}
else
{
LLSD request;
- request[ALTER_PERMANENT_OBJECTS_FIELD] = static_cast<LLSD::Boolean>(pAgentState == kAgentStateUnfrozen);
+ request[ALTER_PERMANENT_OBJECTS_FIELD] = static_cast<LLSD::Boolean>(pRequestedAgentState == kAgentStateUnfrozen);
- LLHTTPClient::ResponderPtr responder = new AgentStateResponder(pAgentStateCB, agentStateURL);
+ LLHTTPClient::ResponderPtr responder = new AgentStateResponder(agentStateURL, pRequestedAgentState);
LLHTTPClient::post(agentStateURL, request, responder);
}
}
-void LLPathfindingManager::handleAgentStateResult(const LLSD &pContent, agent_state_callback_t pAgentStateCB) const
+bool LLPathfindingManager::isValidAgentState(EAgentState pAgentState)
+{
+ return ((pAgentState == kAgentStateFrozen) || (pAgentState == kAgentStateUnfrozen));
+}
+
+void LLPathfindingManager::requestGetAgentState()
+{
+ std::string agentStateURL = getAgentStateURLForCurrentRegion();
+
+ if (agentStateURL.empty())
+ {
+ setAgentState(kAgentStateNotEnabled);
+ }
+ else
+ {
+ LLHTTPClient::ResponderPtr responder = new AgentStateResponder(agentStateURL);
+ LLHTTPClient::get(agentStateURL, responder);
+ }
+}
+
+void LLPathfindingManager::setAgentState(EAgentState pAgentState)
+{
+ mAgentState = pAgentState;
+
+ if (mAgentState != kAgentStateError)
+ {
+ mLastKnownNonErrorAgentState = mAgentState;
+ }
+
+ mAgentStateSignal(mAgentState);
+}
+
+void LLPathfindingManager::handleAgentStateResult(const LLSD &pContent, EAgentState pRequestedAgentState)
{
llassert(pContent.has(ALTER_PERMANENT_OBJECTS_FIELD));
llassert(pContent.get(ALTER_PERMANENT_OBJECTS_FIELD).isBoolean());
EAgentState agentState = (pContent.get(ALTER_PERMANENT_OBJECTS_FIELD).asBoolean() ? kAgentStateUnfrozen : kAgentStateFrozen);
- pAgentStateCB(agentState);
+ if (isValidAgentState(pRequestedAgentState) && (agentState != pRequestedAgentState))
+ {
+ agentState = kAgentStateError;
+ llassert(0);
+ }
+
+ setAgentState(agentState);
}
-void LLPathfindingManager::handleAgentStateError(U32 pStatus, const std::string &pReason, const std::string &pURL, agent_state_callback_t pAgentStateCB) const
+void LLPathfindingManager::handleAgentStateError(U32 pStatus, const std::string &pReason, const std::string &pURL)
{
llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
- pAgentStateCB(kAgentStateError);
+ setAgentState(kAgentStateError);
}
std::string LLPathfindingManager::getRetrieveNavMeshURLForCurrentRegion() const
@@ -160,9 +216,9 @@ std::string LLPathfindingManager::getCapabilityURLForCurrentRegion(const std::st // AgentStateResponder
//---------------------------------------------------------------------------
-AgentStateResponder::AgentStateResponder(LLPathfindingManager::agent_state_callback_t pAgentStateCB, const std::string &pCapabilityURL)
- : mAgentStateCB(pAgentStateCB),
- mCapabilityURL(pCapabilityURL)
+AgentStateResponder::AgentStateResponder(const std::string &pCapabilityURL, LLPathfindingManager::EAgentState pRequestedAgentState)
+ : mCapabilityURL(pCapabilityURL),
+ mRequestedAgentState(pRequestedAgentState)
{
}
@@ -172,10 +228,10 @@ AgentStateResponder::~AgentStateResponder() void AgentStateResponder::result(const LLSD &pContent)
{
- LLPathfindingManager::getInstance()->handleAgentStateResult(pContent, mAgentStateCB);
+ LLPathfindingManager::getInstance()->handleAgentStateResult(pContent, mRequestedAgentState);
}
void AgentStateResponder::error(U32 pStatus, const std::string &pReason)
{
- LLPathfindingManager::getInstance()->handleAgentStateError(pStatus, pReason, mCapabilityURL, mAgentStateCB);
+ LLPathfindingManager::getInstance()->handleAgentStateError(pStatus, pReason, mCapabilityURL);
}
diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h index e8aa8385cf..a9432f9077 100644 --- a/indra/newview/llpathfindingmanager.h +++ b/indra/newview/llpathfindingmanager.h @@ -31,6 +31,7 @@ #include <string>
#include <boost/function.hpp>
+#include <boost/signals2.hpp>
#include "llsingleton.h"
@@ -38,35 +39,49 @@ class LLFloater; class LLPathfindingManager : public LLSingleton<LLPathfindingManager>
{
+ friend class AgentStateResponder;
public:
typedef enum {
- kAgentStateNotEnabled = 0,
- kAgentStateFrozen = 1,
- kAgentStateUnfrozen = 2,
- kAgentStateError = 3,
- kAgentStateInitialDefault = kAgentStateUnfrozen
+ kAgentStateUnknown,
+ kAgentStateFrozen,
+ kAgentStateUnfrozen,
+ kAgentStateNotEnabled,
+ kAgentStateError
} EAgentState;
- typedef boost::function<void (EAgentState pAgentState)> agent_state_callback_t;
+ typedef boost::function<void (EAgentState pAgentState)> agent_state_callback_t;
+ typedef boost::signals2::signal<void (EAgentState pAgentState)> agent_state_signal_t;
+ typedef boost::signals2::connection agent_state_slot_t;
LLPathfindingManager();
virtual ~LLPathfindingManager();
bool isPathfindingEnabledForCurrentRegion() const;
- void requestGetAgentState(agent_state_callback_t pAgentStateCB) const;
- void requestSetAgentState(EAgentState, agent_state_callback_t pAgentStateCB) const;
-
- void handleAgentStateResult(const LLSD &pContent, agent_state_callback_t pAgentStateCB) const;
- void handleAgentStateError(U32 pStatus, const std::string &pReason, const std::string &pURL, agent_state_callback_t pAgentStateCB) const;
+ agent_state_slot_t registerAgentStateSignal(agent_state_callback_t pAgentStateCallback);
+ EAgentState getAgentState();
+ EAgentState getLastKnownNonErrorAgentState() const;
+ void requestSetAgentState(EAgentState pAgentState);
protected:
private:
+ static bool isValidAgentState(EAgentState pAgentState);
+
+ void requestGetAgentState();
+ void setAgentState(EAgentState pAgentState);
+
+ void handleAgentStateResult(const LLSD &pContent, EAgentState pRequestedAgentState);
+ void handleAgentStateError(U32 pStatus, const std::string &pReason, const std::string &pURL);
+
std::string getRetrieveNavMeshURLForCurrentRegion() const;
std::string getAgentStateURLForCurrentRegion() const;
std::string getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const;
+
+ agent_state_signal_t mAgentStateSignal;
+ EAgentState mAgentState;
+ EAgentState mLastKnownNonErrorAgentState;
};
#endif // LL_LLPATHFINDINGMANAGER_H
diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_basic.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_basic.xml index f53d11bb1d..7af40bbff6 100644 --- a/indra/newview/skins/default/xui/en/floater_pathfinding_basic.xml +++ b/indra/newview/skins/default/xui/en/floater_pathfinding_basic.xml @@ -11,14 +11,15 @@ single_instance="true" title="Basic pathfinding setup" width="312"> - <floater.string name="pathfinding_not_enabled">This region is not enabled for pathfinding.</floater.string> - <floater.string name="unable_to_change_state">Unable to change modes successfully.</floater.string> + <floater.string name="status_pathfinding_not_enabled">This region is not enabled for pathfinding.</floater.string> + <floater.string name="status_unable_to_change_state">Unable to change modes successfully.</floater.string> + <floater.string name="status_querying_state">Checking status ...</floater.string> <text height="13" word_wrap="false" use_ellipses="false" type="string" - text_color="DrYellow" + text_color="LabelTextColor" length="1" follows="left|top" layout="topleft" |