From de1e1db9600a03ab5b0dc3f04a5bdcee30632f05 Mon Sep 17 00:00:00 2001
From: prep <none@none>
Date: Wed, 13 Jun 2012 10:50:46 -0400
Subject: [PATCH] WIP for path-702.

---
 indra/newview/CMakeLists.txt                  |   2 +
 indra/newview/llpanelnavmeshrebake.cpp        | 179 ++++++++++++++++++
 indra/newview/llpanelnavmeshrebake.h          |  77 ++++++++
 indra/newview/llpathfindingmanager.cpp        |  14 +-
 indra/newview/llpathfindingmanager.h          |   6 +
 indra/newview/llviewerwindow.cpp              |  10 +-
 .../default/xui/en/panel_toolbar_view.xml     |   2 +-
 7 files changed, 286 insertions(+), 4 deletions(-)
 create mode 100644 indra/newview/llpanelnavmeshrebake.cpp
 create mode 100644 indra/newview/llpanelnavmeshrebake.h

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b47615b198a..4d295ac5e56 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -383,6 +383,7 @@ set(viewer_SOURCE_FILES
     llpanelmediasettingspermissions.cpp
     llpanelmediasettingssecurity.cpp
     llpanelme.cpp
+    llpanelnavmeshrebake.cpp
     llpanelnearbymedia.cpp
     llpanelobject.cpp
     llpanelobjectinventory.cpp
@@ -948,6 +949,7 @@ set(viewer_HEADER_FILES
     llpanelmediasettingspermissions.h
     llpanelmediasettingssecurity.h
     llpanelme.h
+    llpanelnavmeshrebake.h
     llpanelnearbymedia.h
     llpanelobject.h
     llpanelobjectinventory.h
diff --git a/indra/newview/llpanelnavmeshrebake.cpp b/indra/newview/llpanelnavmeshrebake.cpp
new file mode 100644
index 00000000000..99b2bf288ce
--- /dev/null
+++ b/indra/newview/llpanelnavmeshrebake.cpp
@@ -0,0 +1,179 @@
+/**
+ * @file LLPanelNavMeshRebake.cpp
+ * @author 
+ * @brief
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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 "llpathfindingmanager.h"
+
+#include <string>
+#include <map>
+
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
+#include "llpanelnavmeshrebake.h"
+#include "llagent.h"
+#include "llfloaterreg.h"
+#include "llhints.h"
+#include "lltooltip.h"
+#include "llbutton.h"
+#include "llpanel.h"
+
+LLPanelNavMeshRebake::LLPanelNavMeshRebake() 
+: mNavMeshRebakeButton(NULL)
+, mAttached(false)
+{
+	// make sure we have the only instance of this class
+	static bool b = true;
+	llassert_always(b);
+	b=false;
+}
+
+// static
+LLPanelNavMeshRebake* LLPanelNavMeshRebake::getInstance()
+{
+	static LLPanelNavMeshRebake* panel = getPanel();
+	return panel;
+}
+
+//static
+void LLPanelNavMeshRebake::setMode( ESNavMeshRebakeMode mode )
+{
+	LLPanelNavMeshRebake* panel = getInstance();
+
+	panel->mNavMeshRebakeButton->setVisible( true );
+
+	//visibility of it should be updated after updating visibility of the buttons
+	panel->setVisible(TRUE);
+}
+
+void LLPanelNavMeshRebake::clearMode( ESNavMeshRebakeMode mode )
+{
+	LLPanelNavMeshRebake* panel = getInstance();
+	switch(mode)
+	{
+	case NMRM_Visible:
+		panel->mNavMeshRebakeButton->setVisible(FALSE);
+		break;
+	
+	default:
+		llerrs << "Unexpected mode is passed: " << mode << llendl;
+	}
+}
+
+BOOL LLPanelNavMeshRebake::postBuild()
+{
+	mNavMeshRebakeButton = getChild<LLButton>("navmesh_btn");
+	mNavMeshRebakeButton->setCommitCallback(boost::bind(&LLPanelNavMeshRebake::onNavMeshRebakeClick, this));
+	mNavMeshRebakeButton->setVisible( TRUE );
+	LLHints::registerHintTarget("navmesh_btn", mNavMeshRebakeButton->getHandle());
+
+	return TRUE;
+}
+
+void LLPanelNavMeshRebake::setVisible( BOOL visible )
+{
+
+	LLPanel::setVisible(visible);
+}
+
+BOOL LLPanelNavMeshRebake::handleToolTip(S32 x, S32 y, MASK mask)
+{
+	LLToolTipMgr::instance().unblockToolTips();
+
+	if (mNavMeshRebakeButton->getVisible())
+	{
+		LLToolTipMgr::instance().show(mNavMeshRebakeButton->getToolTip());
+	}
+	return LLPanel::handleToolTip(x, y, mask);
+}
+
+void LLPanelNavMeshRebake::reparent(LLView* rootp)
+{
+	LLPanel* parent = dynamic_cast<LLPanel*>(getParent());
+	if (!parent)
+	{
+		return;
+	}
+
+	rootp->addChild(this);
+	mAttached = true;
+}
+
+//static
+LLPanelNavMeshRebake* LLPanelNavMeshRebake::getPanel()
+{
+	LLPanelNavMeshRebake* panel = new LLPanelNavMeshRebake();
+	panel->buildFromFile("panel_navmesh_rebake.xml");
+
+	panel->setVisible(FALSE);
+
+	llinfos << "Build LLPanelNavMeshRebake panel" << llendl;
+
+	//prep#panel->updatePosition();
+	return panel;
+}
+
+void LLPanelNavMeshRebake::onNavMeshRebakeClick()
+{
+	setFocus(FALSE); 
+	mNavMeshRebakeButton->setVisible(FALSE); 
+}
+
+/**
+ * Updates position  to be center aligned with Move button.
+ */
+/*
+void LLPanelNavMeshRebake::updatePosition()
+{
+	if (mAttached) return;
+
+	S32 y_pos = 0;
+	S32 bottom_tb_center = 0;
+	if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom"))
+	{
+		y_pos = toolbar_bottom->getRect().getHeight();
+		bottom_tb_center = toolbar_bottom->getRect().getCenterX();
+	}
+
+	S32 left_tb_width = 0;
+	if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))
+	{
+		left_tb_width = toolbar_left->getRect().getWidth();
+	}
+
+	if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("navmesh_rebake_container"))
+	{
+		panel_ssf_container->setOrigin(0, y_pos);
+	}
+
+	S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width;
+
+	setOrigin( x_pos, 0);
+
+
+	*/
diff --git a/indra/newview/llpanelnavmeshrebake.h b/indra/newview/llpanelnavmeshrebake.h
new file mode 100644
index 00000000000..81710a140d8
--- /dev/null
+++ b/indra/newview/llpanelnavmeshrebake.h
@@ -0,0 +1,77 @@
+/**
+ * @file llpanelenavmeshrebake.h
+ * @author 
+ * @brief 
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, 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_NAVMESHREBAKE_H
+#define LL_NAVMESHREBAKE_H
+
+
+class LLPanelNavMeshRebake : public LLPanel
+{
+	LOG_CLASS(LLPanelNavMeshRebake);
+
+public:
+
+	typedef enum navmesh_rebake_mode_t
+	{
+		NMRM_Visible,
+		NMRM_Visible_Waiting_Response,
+		NVRM_Hiddeb
+	} ESNavMeshRebakeMode;
+
+	void reparent( LLView* rootp );
+
+	static LLPanelNavMeshRebake* getInstance();
+	static void setMode( ESNavMeshRebakeMode mode );
+	static void clearMode( ESNavMeshRebakeMode mode );
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void setVisible( BOOL visible );
+
+	
+	/*virtual*/ void draw(){/*updatePosition(); */LLPanel::draw();}
+	/*virtual*/ BOOL handleToolTip( S32 x, S32 y, MASK mask );
+
+
+protected:
+	LLPanelNavMeshRebake();
+
+
+private:
+	static LLPanelNavMeshRebake* getPanel();
+	void onNavMeshRebakeClick();
+	//void updatePosition();
+
+	LLButton* mNavMeshRebakeButton;
+	
+
+	LLHandle<LLPanel> mOriginalParent;
+
+	
+	bool	mAttached;
+};
+
+#endif //LL_NAVMESHREBAKE_H
+
diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp
index f54c9892dfe..6d0629698ac 100644
--- a/indra/newview/llpathfindingmanager.cpp
+++ b/indra/newview/llpathfindingmanager.cpp
@@ -52,6 +52,7 @@
 #include "lluuid.h"
 #include "llviewerregion.h"
 #include "llweb.h"
+#include "llpanelnavmeshrebake.h"
 
 #define CAP_SERVICE_RETRIEVE_NAVMESH      "RetrieveNavMeshSrc"
 
@@ -268,7 +269,7 @@ class CharactersResponder : public LLHTTPClient::Responder
 
 LLPathfindingManager::LLPathfindingManager()
 	: LLSingleton<LLPathfindingManager>(),
-	mNavMeshMap()
+	mNavMeshMap(),mShowNavMeshRebake(false)
 {
 }
 
@@ -315,7 +316,15 @@ LLPathfindingNavMesh::navmesh_slot_t LLPathfindingManager::registerNavMeshListen
 void LLPathfindingManager::requestGetNavMeshForRegion(LLViewerRegion *pRegion)
 {
 	LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForRegion(pRegion);
-
+	//prep#s#test
+	LLView* rootp = LLUI::getRootView();
+ 	LLPanel* panel_nmr_container = rootp->getChild<LLPanel>("navmesh_rebake_container");
+	LLPanelNavMeshRebake* panel_namesh_rebake = LLPanelNavMeshRebake::getInstance();
+	panel_nmr_container->addChild( panel_namesh_rebake );
+	panel_nmr_container->setVisible( TRUE );
+	panel_namesh_rebake->reparent( rootp );
+	LLPanelNavMeshRebake::getInstance()->setVisible( TRUE );
+	//prep#e
 	if (pRegion == NULL)
 	{
 		navMeshPtr->handleNavMeshNotEnabled();
@@ -955,3 +964,4 @@ void CharactersResponder::error(U32 pStatus, const std::string &pReason)
 	LLPathfindingObjectListPtr characterListPtr =  LLPathfindingObjectListPtr(new LLPathfindingCharacterList());
 	mCharactersCallback(mRequestId, LLPathfindingManager::kRequestError, characterListPtr);
 }
+
diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h
index 40c0e6b140f..635179e5a0b 100644
--- a/indra/newview/llpathfindingmanager.h
+++ b/indra/newview/llpathfindingmanager.h
@@ -39,6 +39,8 @@
 #include "llpathfindingnavmesh.h"
 #include "llsingleton.h"
 #include "lluuid.h"
+#include "llpanel.h"
+#include "llmoveview.h"
 
 class LLViewerRegion;
 class LLPathfindingNavMeshStatus;
@@ -122,6 +124,10 @@ class LLPathfindingManager : public LLSingleton<LLPathfindingManager>
 #endif // XXX_STINSON_AGENT_STATE_DELETE_ME
 
 	NavMeshMap mNavMeshMap;
+
+
+	BOOL mShowNavMeshRebake;
 };
 
+
 #endif // LL_LLPATHFINDINGMANAGER_H
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index ee2171fb07d..4d31876beae 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -200,6 +200,9 @@
 #include "llviewerwindowlistener.h"
 #include "llpaneltopinfobar.h"
 
+//prep#
+#include "llpathfindingmanager.h"
+
 #if LL_WINDOWS
 #include <tchar.h> // For Unicode conversion methods
 #endif
@@ -1923,7 +1926,12 @@ void LLViewerWindow::initWorldUI()
 	LLPanelStandStopFlying* panel_stand_stop_flying	= LLPanelStandStopFlying::getInstance();
 	panel_ssf_container->addChild(panel_stand_stop_flying);
 	panel_ssf_container->setVisible(TRUE);
-
+	//prep#
+	/*LLPanel* panel_nmr_container = getRootView()->getChild<LLPanel>("navmesh_rebake_container");
+	LLPanelNavMeshRebake* panel_namesh_rebake	= LLPanelNavMeshRebake::getInstance();
+	panel_nmr_container->addChild(panel_namesh_rebake);
+	panel_nmr_container->setVisible(TRUE);
+	*/
 	// Load and make the toolbars visible
 	// Note: we need to load the toolbars only *after* the user is logged in and IW
 	if (gToolBarView)
diff --git a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
index 58911bed562..107683f1f05 100644
--- a/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_toolbar_view.xml
@@ -97,7 +97,7 @@
                visible="false"
                width="200"/>
       </layout_panel>
-      <layout_panel name="right_toolbar_panel"
+       <layout_panel name="right_toolbar_panel"
                     auto_resize="false"
                     height="500"
                     width="30"
-- 
GitLab