summaryrefslogtreecommitdiff
path: root/indra/newview/lltoolmgr.cpp
diff options
context:
space:
mode:
authorAnsariel <ansariel.hiller@phoenixviewer.com>2024-05-22 19:04:52 +0200
committerAnsariel <ansariel.hiller@phoenixviewer.com>2024-05-22 19:04:52 +0200
commit1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch)
treeab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/lltoolmgr.cpp
parent6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff)
parente1623bb276f83a43ce7a197e388720c05bdefe61 (diff)
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts: # autobuild.xml # indra/cmake/CMakeLists.txt # indra/cmake/GoogleMock.cmake # indra/llaudio/llaudioengine_fmodstudio.cpp # indra/llaudio/llaudioengine_fmodstudio.h # indra/llaudio/lllistener_fmodstudio.cpp # indra/llaudio/lllistener_fmodstudio.h # indra/llaudio/llstreamingaudio_fmodstudio.cpp # indra/llaudio/llstreamingaudio_fmodstudio.h # indra/llcharacter/llmultigesture.cpp # indra/llcharacter/llmultigesture.h # indra/llimage/llimage.cpp # indra/llimage/llimagepng.cpp # indra/llimage/llimageworker.cpp # indra/llimage/tests/llimageworker_test.cpp # indra/llmessage/tests/llmockhttpclient.h # indra/llprimitive/llgltfmaterial.h # indra/llrender/llfontfreetype.cpp # indra/llui/llcombobox.cpp # indra/llui/llfolderview.cpp # indra/llui/llfolderviewmodel.h # indra/llui/lllineeditor.cpp # indra/llui/lllineeditor.h # indra/llui/lltextbase.cpp # indra/llui/lltextbase.h # indra/llui/lltexteditor.cpp # indra/llui/lltextvalidate.cpp # indra/llui/lltextvalidate.h # indra/llui/lluictrl.h # indra/llui/llview.cpp # indra/llwindow/llwindowmacosx.cpp # indra/newview/app_settings/settings.xml # indra/newview/llappearancemgr.cpp # indra/newview/llappearancemgr.h # indra/newview/llavatarpropertiesprocessor.cpp # indra/newview/llavatarpropertiesprocessor.h # indra/newview/llbreadcrumbview.cpp # indra/newview/llbreadcrumbview.h # indra/newview/llbreastmotion.cpp # indra/newview/llbreastmotion.h # indra/newview/llconversationmodel.h # indra/newview/lldensityctrl.cpp # indra/newview/lldensityctrl.h # indra/newview/llface.inl # indra/newview/llfloatereditsky.cpp # indra/newview/llfloatereditwater.cpp # indra/newview/llfloateremojipicker.h # indra/newview/llfloaterimsessiontab.cpp # indra/newview/llfloaterprofiletexture.cpp # indra/newview/llfloaterprofiletexture.h # indra/newview/llgesturemgr.cpp # indra/newview/llgesturemgr.h # indra/newview/llimpanel.cpp # indra/newview/llimpanel.h # indra/newview/llinventorybridge.cpp # indra/newview/llinventorybridge.h # indra/newview/llinventoryclipboard.cpp # indra/newview/llinventoryclipboard.h # indra/newview/llinventoryfunctions.cpp # indra/newview/llinventoryfunctions.h # indra/newview/llinventorygallery.cpp # indra/newview/lllistbrowser.cpp # indra/newview/lllistbrowser.h # indra/newview/llpanelobjectinventory.cpp # indra/newview/llpanelprofile.cpp # indra/newview/llpanelprofile.h # indra/newview/llpreviewgesture.cpp # indra/newview/llsavedsettingsglue.cpp # indra/newview/llsavedsettingsglue.h # indra/newview/lltooldraganddrop.cpp # indra/newview/llurllineeditorctrl.cpp # indra/newview/llvectorperfoptions.cpp # indra/newview/llvectorperfoptions.h # indra/newview/llviewerparceloverlay.cpp # indra/newview/llviewertexlayer.cpp # indra/newview/llviewertexturelist.cpp # indra/newview/macmain.h # indra/test/test.cpp
Diffstat (limited to 'indra/newview/lltoolmgr.cpp')
-rw-r--r--indra/newview/lltoolmgr.cpp1060
1 files changed, 530 insertions, 530 deletions
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index a4f43bde11..dd247ef0f7 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -1,530 +1,530 @@
-/**
- * @file lltoolmgr.cpp
- * @brief LLToolMgr class implementation
- *
- * $LicenseInfo:firstyear=2001&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 "lltoolmgr.h"
-
-#include "lluictrl.h"
-#include "llmenugl.h"
-#include "llfloaterreg.h"
-
-//#include "llfirstuse.h"
-// tools and manipulators
-#include "llfloaterinspect.h"
-#include "lltool.h"
-#include "llmanipscale.h"
-#include "llmarketplacefunctions.h"
-#include "llselectmgr.h"
-#include "lltoolbrush.h"
-#include "lltoolcomp.h"
-#include "lltooldraganddrop.h"
-#include "lltoolface.h"
-#include "lltoolfocus.h"
-#include "lltoolgrab.h"
-#include "lltoolindividual.h"
-#include "lltoolmorph.h"
-#include "lltoolpie.h"
-#include "lltoolselectland.h"
-#include "lltoolobjpicker.h"
-#include "lltoolpipette.h"
-#include "llagent.h"
-#include "llagentcamera.h"
-#include "llviewercontrol.h"
-#include "llviewerjoystick.h"
-#include "llviewermenu.h"
-#include "llviewerparcelmgr.h"
-
-
-// Used when app not active to avoid processing hover.
-LLTool* gToolNull = NULL;
-
-LLToolset* gBasicToolset = NULL;
-LLToolset* gCameraToolset = NULL;
-//LLToolset* gLandToolset = NULL;
-LLToolset* gMouselookToolset = NULL;
-LLToolset* gFaceEditToolset = NULL;
-
-/////////////////////////////////////////////////////
-// LLToolMgr
-
-LLToolMgr::LLToolMgr()
- :
- mBaseTool(NULL),
- mSavedTool(NULL),
- mTransientTool( NULL ),
- mOverrideTool( NULL ),
- mSelectedTool( NULL ),
- mCurrentToolset( NULL )
-{
- // Not a panel, register these callbacks globally.
- LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Active", boost::bind(&LLToolMgr::inEdit, this));
- LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&LLToolMgr::canEdit, this));
- LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.EnabledOrActive", boost::bind(&LLToolMgr::buildEnabledOrActive, this));
- LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));
- LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Marketplace.Enabled", boost::bind(&LLToolMgr::canAccessMarketplace, this));
- LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Marketplace.Toggle", boost::bind(&LLToolMgr::toggleMarketplace, this, _2));
-
- gToolNull = new LLTool(LLStringUtil::null); // Does nothing
- setCurrentTool(gToolNull);
-
- gBasicToolset = new LLToolset();
- gCameraToolset = new LLToolset();
-// gLandToolset = new LLToolset();
- gMouselookToolset = new LLToolset();
- gFaceEditToolset = new LLToolset();
- gMouselookToolset->setShowFloaterTools(false);
- gFaceEditToolset->setShowFloaterTools(false);
-}
-
-void LLToolMgr::initTools()
-{
- static bool initialized = false;
- if(initialized)
- {
- return;
- }
- initialized = true;
- gBasicToolset->addTool( LLToolPie::getInstance() );
- gBasicToolset->addTool( LLToolCamera::getInstance() );
- gCameraToolset->addTool( LLToolCamera::getInstance() );
- gBasicToolset->addTool( LLToolGrab::getInstance() );
- gBasicToolset->addTool( LLToolCompTranslate::getInstance() );
- gBasicToolset->addTool( LLToolCompCreate::getInstance() );
- gBasicToolset->addTool( LLToolBrushLand::getInstance() );
- gMouselookToolset->addTool( LLToolCompGun::getInstance() );
- gBasicToolset->addTool( LLToolCompInspect::getInstance() );
- gFaceEditToolset->addTool( LLToolCamera::getInstance() );
-
- // On startup, use "select" tool
- setCurrentToolset(gBasicToolset);
-
- gBasicToolset->selectTool( LLToolPie::getInstance() );
-}
-
-LLToolMgr::~LLToolMgr()
-{
- delete gBasicToolset;
- gBasicToolset = NULL;
-
- delete gMouselookToolset;
- gMouselookToolset = NULL;
-
- delete gFaceEditToolset;
- gFaceEditToolset = NULL;
-
- delete gCameraToolset;
- gCameraToolset = NULL;
-
- delete gToolNull;
- gToolNull = NULL;
-}
-
-bool LLToolMgr::usingTransientTool()
-{
- return mTransientTool != nullptr;
-}
-
-void LLToolMgr::setCurrentToolset(LLToolset* current)
-{
- if (!current)
- return;
-
- // switching toolsets?
- if (current != mCurrentToolset)
- {
- // deselect current tool
- if (mSelectedTool)
- {
- mSelectedTool->handleDeselect();
- }
- mCurrentToolset = current;
- // select first tool of new toolset only if toolset changed
- mCurrentToolset->selectFirstTool();
- }
-
- // update current tool based on new toolset
- setCurrentTool( mCurrentToolset->getSelectedTool() );
-}
-
-LLToolset* LLToolMgr::getCurrentToolset()
-{
- return mCurrentToolset;
-}
-
-void LLToolMgr::setCurrentTool( LLTool* tool )
-{
- if (mTransientTool)
- {
- mTransientTool = NULL;
- }
-
- mBaseTool = tool;
- updateToolStatus();
-
- mSavedTool = NULL;
-}
-
-LLTool* LLToolMgr::getCurrentTool()
-{
- MASK override_mask = gKeyboard ? gKeyboard->currentMask(true) : 0;
-
- LLTool* cur_tool = NULL;
- // always use transient tools if available
- if (mTransientTool)
- {
- mOverrideTool = NULL;
- cur_tool = mTransientTool;
- }
- // tools currently grabbing mouse input will stay active
- else if (mSelectedTool && mSelectedTool->hasMouseCapture())
- {
- cur_tool = mSelectedTool;
- }
- else
- {
- mOverrideTool = mBaseTool ? mBaseTool->getOverrideTool(override_mask) : NULL;
-
- // use override tool if available otherwise drop back to base tool
- cur_tool = mOverrideTool ? mOverrideTool : mBaseTool;
- }
-
- LLTool* prev_tool = mSelectedTool;
- // Set the selected tool to avoid infinite recursion
- mSelectedTool = cur_tool;
-
- //update tool selection status
- if (prev_tool != cur_tool)
- {
- if (prev_tool)
- {
- prev_tool->handleDeselect();
- }
- if (cur_tool)
- {
- if ( LLToolCompInspect::getInstance()->isToolCameraActive()
- && prev_tool == LLToolCamera::getInstance()
- && cur_tool == LLToolPie::getInstance() )
- {
- LLFloaterInspect * inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
- if(inspect_instance && inspect_instance->getVisible())
- {
- setTransientTool(LLToolCompInspect::getInstance());
- }
- }
- else
- {
- cur_tool->handleSelect();
- }
- }
- }
-
- return mSelectedTool;
-}
-
-LLTool* LLToolMgr::getBaseTool()
-{
- return mBaseTool;
-}
-
-void LLToolMgr::updateToolStatus()
-{
- // call getcurrenttool() to calculate active tool and call handleSelect() and handleDeselect() immediately
- // when active tool changes
- getCurrentTool();
-}
-
-bool LLToolMgr::inEdit()
-{
- return mBaseTool != LLToolPie::getInstance() && mBaseTool != gToolNull;
-}
-
-bool LLToolMgr::canEdit()
-{
- return LLViewerParcelMgr::getInstance()->allowAgentBuild();
-}
-
-bool LLToolMgr::buildEnabledOrActive()
-{
- return LLFloaterReg::instanceVisible("build") || canEdit();
-}
-
-void LLToolMgr::toggleBuildMode(const LLSD& sdname)
-{
- const std::string& param = sdname.asString();
-
- LLFloaterReg::toggleInstanceOrBringToFront("build");
- if (param == "build" && !canEdit())
- {
- return;
- }
-
- bool build_visible = LLFloaterReg::instanceVisible("build");
- if (build_visible)
- {
- ECameraMode camMode = gAgentCamera.getCameraMode();
- if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode)
- {
- // pull the user out of mouselook or appearance mode when entering build mode
- handle_reset_view();
- }
-
- if (gSavedSettings.getBOOL("EditCameraMovement"))
- {
- // camera should be set
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- {
- handle_toggle_flycam();
- }
-
- if (gAgentCamera.getFocusOnAvatar())
- {
- // zoom in if we're looking at the avatar
- gAgentCamera.setFocusOnAvatar(false, ANIMATE);
- gAgentCamera.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis()));
- gAgentCamera.cameraZoomIn(0.666f);
- gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD );
- }
- }
-
-
- setCurrentToolset(gBasicToolset);
- getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
-
- // Could be first use
- //LLFirstUse::useBuild();
-
- gAgentCamera.resetView(false);
-
- // avoid spurious avatar movements
- LLViewerJoystick::getInstance()->setNeedsReset();
-
- }
- else
- {
- if (gSavedSettings.getBOOL("EditCameraMovement"))
- {
- // just reset the view, will pull us out of edit mode
- handle_reset_view();
- }
- else
- {
- // manually disable edit mode, but do not affect the camera
- gAgentCamera.resetView(false);
- LLFloaterReg::hideInstance("build");
- gViewerWindow->showCursor();
- }
- // avoid spurious avatar movements pulling out of edit mode
- LLViewerJoystick::getInstance()->setNeedsReset();
- }
-
-}
-
-bool LLToolMgr::inBuildMode()
-{
- // when entering mouselook inEdit() immediately returns true before
- // cameraMouselook() actually starts returning true. Also, appearance edit
- // sets build mode to true, so let's exclude that.
- bool b=(inEdit()
- && !gAgentCamera.cameraMouselook()
- && mCurrentToolset != gFaceEditToolset);
-
- return b;
-}
-
-bool LLToolMgr::canAccessMarketplace()
-{
- return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
-}
-
-void LLToolMgr::toggleMarketplace(const LLSD& sdname)
-{
- const std::string& param = sdname.asString();
-
- if ((param != "marketplace") || !canAccessMarketplace())
- {
- return;
- }
-
- LLFloaterReg::toggleInstanceOrBringToFront("marketplace_listings");
-}
-
-void LLToolMgr::setTransientTool(LLTool* tool)
-{
- if (!tool)
- {
- clearTransientTool();
- }
- else
- {
- if (mTransientTool)
- {
- mTransientTool = NULL;
- }
-
- mTransientTool = tool;
- }
-
- updateToolStatus();
-}
-
-void LLToolMgr::clearTransientTool()
-{
- if (mTransientTool)
- {
- mTransientTool = NULL;
- if (!mBaseTool)
- {
- LL_WARNS() << "mBaseTool is NULL" << LL_ENDL;
- }
- }
- updateToolStatus();
-}
-
-
-void LLToolMgr::onAppFocusLost()
-{
- if (LLApp::isExiting())
- return;
-
- if (mSelectedTool)
- {
- mSelectedTool->handleDeselect();
- }
- updateToolStatus();
-}
-
-void LLToolMgr::onAppFocusGained()
-{
- if (mSelectedTool)
- {
- mSelectedTool->handleSelect();
- }
- updateToolStatus();
-}
-
-void LLToolMgr::clearSavedTool()
-{
- mSavedTool = NULL;
-}
-
-/////////////////////////////////////////////////////
-// LLToolset
-
-void LLToolset::addTool(LLTool* tool)
-{
- mToolList.push_back( tool );
- if( !mSelectedTool )
- {
- mSelectedTool = tool;
- }
-}
-
-
-void LLToolset::selectTool(LLTool* tool)
-{
- mSelectedTool = tool;
- LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
-}
-
-
-void LLToolset::selectToolByIndex( S32 index )
-{
- LLTool *tool = (index >= 0 && index < (S32)mToolList.size()) ? mToolList[index] : NULL;
- if (tool)
- {
- mSelectedTool = tool;
- LLToolMgr::getInstance()->setCurrentTool( tool );
- }
-}
-
-bool LLToolset::isToolSelected( S32 index )
-{
- LLTool *tool = (index >= 0 && index < (S32)mToolList.size()) ? mToolList[index] : NULL;
- return (tool == mSelectedTool);
-}
-
-
-void LLToolset::selectFirstTool()
-{
- mSelectedTool = (0 < mToolList.size()) ? mToolList[0] : NULL;
- LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
-}
-
-
-void LLToolset::selectNextTool()
-{
- LLTool* next = NULL;
- for( tool_list_t::iterator iter = mToolList.begin();
- iter != mToolList.end(); )
- {
- LLTool* cur = *iter++;
- if( cur == mSelectedTool && iter != mToolList.end() )
- {
- next = *iter;
- break;
- }
- }
-
- if( next )
- {
- mSelectedTool = next;
- LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
- }
- else
- {
- selectFirstTool();
- }
-}
-
-void LLToolset::selectPrevTool()
-{
- LLTool* prev = NULL;
- for( tool_list_t::reverse_iterator iter = mToolList.rbegin();
- iter != mToolList.rend(); )
- {
- LLTool* cur = *iter++;
- if( cur == mSelectedTool && iter != mToolList.rend() )
- {
- prev = *iter;
- break;
- }
- }
-
- if( prev )
- {
- mSelectedTool = prev;
- LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
- }
- else if (mToolList.size() > 0)
- {
- selectToolByIndex((S32)mToolList.size()-1);
- }
-}
-
-////////////////////////////////////////////////////////////////////////////
-
-
+/**
+ * @file lltoolmgr.cpp
+ * @brief LLToolMgr class implementation
+ *
+ * $LicenseInfo:firstyear=2001&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 "lltoolmgr.h"
+
+#include "lluictrl.h"
+#include "llmenugl.h"
+#include "llfloaterreg.h"
+
+//#include "llfirstuse.h"
+// tools and manipulators
+#include "llfloaterinspect.h"
+#include "lltool.h"
+#include "llmanipscale.h"
+#include "llmarketplacefunctions.h"
+#include "llselectmgr.h"
+#include "lltoolbrush.h"
+#include "lltoolcomp.h"
+#include "lltooldraganddrop.h"
+#include "lltoolface.h"
+#include "lltoolfocus.h"
+#include "lltoolgrab.h"
+#include "lltoolindividual.h"
+#include "lltoolmorph.h"
+#include "lltoolpie.h"
+#include "lltoolselectland.h"
+#include "lltoolobjpicker.h"
+#include "lltoolpipette.h"
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llviewercontrol.h"
+#include "llviewerjoystick.h"
+#include "llviewermenu.h"
+#include "llviewerparcelmgr.h"
+
+
+// Used when app not active to avoid processing hover.
+LLTool* gToolNull = NULL;
+
+LLToolset* gBasicToolset = NULL;
+LLToolset* gCameraToolset = NULL;
+//LLToolset* gLandToolset = NULL;
+LLToolset* gMouselookToolset = NULL;
+LLToolset* gFaceEditToolset = NULL;
+
+/////////////////////////////////////////////////////
+// LLToolMgr
+
+LLToolMgr::LLToolMgr()
+ :
+ mBaseTool(NULL),
+ mSavedTool(NULL),
+ mTransientTool( NULL ),
+ mOverrideTool( NULL ),
+ mSelectedTool( NULL ),
+ mCurrentToolset( NULL )
+{
+ // Not a panel, register these callbacks globally.
+ LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Active", boost::bind(&LLToolMgr::inEdit, this));
+ LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&LLToolMgr::canEdit, this));
+ LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.EnabledOrActive", boost::bind(&LLToolMgr::buildEnabledOrActive, this));
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));
+ LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Marketplace.Enabled", boost::bind(&LLToolMgr::canAccessMarketplace, this));
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Marketplace.Toggle", boost::bind(&LLToolMgr::toggleMarketplace, this, _2));
+
+ gToolNull = new LLTool(LLStringUtil::null); // Does nothing
+ setCurrentTool(gToolNull);
+
+ gBasicToolset = new LLToolset();
+ gCameraToolset = new LLToolset();
+// gLandToolset = new LLToolset();
+ gMouselookToolset = new LLToolset();
+ gFaceEditToolset = new LLToolset();
+ gMouselookToolset->setShowFloaterTools(false);
+ gFaceEditToolset->setShowFloaterTools(false);
+}
+
+void LLToolMgr::initTools()
+{
+ static bool initialized = false;
+ if(initialized)
+ {
+ return;
+ }
+ initialized = true;
+ gBasicToolset->addTool( LLToolPie::getInstance() );
+ gBasicToolset->addTool( LLToolCamera::getInstance() );
+ gCameraToolset->addTool( LLToolCamera::getInstance() );
+ gBasicToolset->addTool( LLToolGrab::getInstance() );
+ gBasicToolset->addTool( LLToolCompTranslate::getInstance() );
+ gBasicToolset->addTool( LLToolCompCreate::getInstance() );
+ gBasicToolset->addTool( LLToolBrushLand::getInstance() );
+ gMouselookToolset->addTool( LLToolCompGun::getInstance() );
+ gBasicToolset->addTool( LLToolCompInspect::getInstance() );
+ gFaceEditToolset->addTool( LLToolCamera::getInstance() );
+
+ // On startup, use "select" tool
+ setCurrentToolset(gBasicToolset);
+
+ gBasicToolset->selectTool( LLToolPie::getInstance() );
+}
+
+LLToolMgr::~LLToolMgr()
+{
+ delete gBasicToolset;
+ gBasicToolset = NULL;
+
+ delete gMouselookToolset;
+ gMouselookToolset = NULL;
+
+ delete gFaceEditToolset;
+ gFaceEditToolset = NULL;
+
+ delete gCameraToolset;
+ gCameraToolset = NULL;
+
+ delete gToolNull;
+ gToolNull = NULL;
+}
+
+bool LLToolMgr::usingTransientTool()
+{
+ return mTransientTool != nullptr;
+}
+
+void LLToolMgr::setCurrentToolset(LLToolset* current)
+{
+ if (!current)
+ return;
+
+ // switching toolsets?
+ if (current != mCurrentToolset)
+ {
+ // deselect current tool
+ if (mSelectedTool)
+ {
+ mSelectedTool->handleDeselect();
+ }
+ mCurrentToolset = current;
+ // select first tool of new toolset only if toolset changed
+ mCurrentToolset->selectFirstTool();
+ }
+
+ // update current tool based on new toolset
+ setCurrentTool( mCurrentToolset->getSelectedTool() );
+}
+
+LLToolset* LLToolMgr::getCurrentToolset()
+{
+ return mCurrentToolset;
+}
+
+void LLToolMgr::setCurrentTool( LLTool* tool )
+{
+ if (mTransientTool)
+ {
+ mTransientTool = NULL;
+ }
+
+ mBaseTool = tool;
+ updateToolStatus();
+
+ mSavedTool = NULL;
+}
+
+LLTool* LLToolMgr::getCurrentTool()
+{
+ MASK override_mask = gKeyboard ? gKeyboard->currentMask(true) : 0;
+
+ LLTool* cur_tool = NULL;
+ // always use transient tools if available
+ if (mTransientTool)
+ {
+ mOverrideTool = NULL;
+ cur_tool = mTransientTool;
+ }
+ // tools currently grabbing mouse input will stay active
+ else if (mSelectedTool && mSelectedTool->hasMouseCapture())
+ {
+ cur_tool = mSelectedTool;
+ }
+ else
+ {
+ mOverrideTool = mBaseTool ? mBaseTool->getOverrideTool(override_mask) : NULL;
+
+ // use override tool if available otherwise drop back to base tool
+ cur_tool = mOverrideTool ? mOverrideTool : mBaseTool;
+ }
+
+ LLTool* prev_tool = mSelectedTool;
+ // Set the selected tool to avoid infinite recursion
+ mSelectedTool = cur_tool;
+
+ //update tool selection status
+ if (prev_tool != cur_tool)
+ {
+ if (prev_tool)
+ {
+ prev_tool->handleDeselect();
+ }
+ if (cur_tool)
+ {
+ if ( LLToolCompInspect::getInstance()->isToolCameraActive()
+ && prev_tool == LLToolCamera::getInstance()
+ && cur_tool == LLToolPie::getInstance() )
+ {
+ LLFloaterInspect * inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
+ if(inspect_instance && inspect_instance->getVisible())
+ {
+ setTransientTool(LLToolCompInspect::getInstance());
+ }
+ }
+ else
+ {
+ cur_tool->handleSelect();
+ }
+ }
+ }
+
+ return mSelectedTool;
+}
+
+LLTool* LLToolMgr::getBaseTool()
+{
+ return mBaseTool;
+}
+
+void LLToolMgr::updateToolStatus()
+{
+ // call getcurrenttool() to calculate active tool and call handleSelect() and handleDeselect() immediately
+ // when active tool changes
+ getCurrentTool();
+}
+
+bool LLToolMgr::inEdit()
+{
+ return mBaseTool != LLToolPie::getInstance() && mBaseTool != gToolNull;
+}
+
+bool LLToolMgr::canEdit()
+{
+ return LLViewerParcelMgr::getInstance()->allowAgentBuild();
+}
+
+bool LLToolMgr::buildEnabledOrActive()
+{
+ return LLFloaterReg::instanceVisible("build") || canEdit();
+}
+
+void LLToolMgr::toggleBuildMode(const LLSD& sdname)
+{
+ const std::string& param = sdname.asString();
+
+ LLFloaterReg::toggleInstanceOrBringToFront("build");
+ if (param == "build" && !canEdit())
+ {
+ return;
+ }
+
+ bool build_visible = LLFloaterReg::instanceVisible("build");
+ if (build_visible)
+ {
+ ECameraMode camMode = gAgentCamera.getCameraMode();
+ if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode)
+ {
+ // pull the user out of mouselook or appearance mode when entering build mode
+ handle_reset_view();
+ }
+
+ if (gSavedSettings.getBOOL("EditCameraMovement"))
+ {
+ // camera should be set
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ handle_toggle_flycam();
+ }
+
+ if (gAgentCamera.getFocusOnAvatar())
+ {
+ // zoom in if we're looking at the avatar
+ gAgentCamera.setFocusOnAvatar(false, ANIMATE);
+ gAgentCamera.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis()));
+ gAgentCamera.cameraZoomIn(0.666f);
+ gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ }
+ }
+
+
+ setCurrentToolset(gBasicToolset);
+ getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
+
+ // Could be first use
+ //LLFirstUse::useBuild();
+
+ gAgentCamera.resetView(false);
+
+ // avoid spurious avatar movements
+ LLViewerJoystick::getInstance()->setNeedsReset();
+
+ }
+ else
+ {
+ if (gSavedSettings.getBOOL("EditCameraMovement"))
+ {
+ // just reset the view, will pull us out of edit mode
+ handle_reset_view();
+ }
+ else
+ {
+ // manually disable edit mode, but do not affect the camera
+ gAgentCamera.resetView(false);
+ LLFloaterReg::hideInstance("build");
+ gViewerWindow->showCursor();
+ }
+ // avoid spurious avatar movements pulling out of edit mode
+ LLViewerJoystick::getInstance()->setNeedsReset();
+ }
+
+}
+
+bool LLToolMgr::inBuildMode()
+{
+ // when entering mouselook inEdit() immediately returns true before
+ // cameraMouselook() actually starts returning true. Also, appearance edit
+ // sets build mode to true, so let's exclude that.
+ bool b=(inEdit()
+ && !gAgentCamera.cameraMouselook()
+ && mCurrentToolset != gFaceEditToolset);
+
+ return b;
+}
+
+bool LLToolMgr::canAccessMarketplace()
+{
+ return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
+}
+
+void LLToolMgr::toggleMarketplace(const LLSD& sdname)
+{
+ const std::string& param = sdname.asString();
+
+ if ((param != "marketplace") || !canAccessMarketplace())
+ {
+ return;
+ }
+
+ LLFloaterReg::toggleInstanceOrBringToFront("marketplace_listings");
+}
+
+void LLToolMgr::setTransientTool(LLTool* tool)
+{
+ if (!tool)
+ {
+ clearTransientTool();
+ }
+ else
+ {
+ if (mTransientTool)
+ {
+ mTransientTool = NULL;
+ }
+
+ mTransientTool = tool;
+ }
+
+ updateToolStatus();
+}
+
+void LLToolMgr::clearTransientTool()
+{
+ if (mTransientTool)
+ {
+ mTransientTool = NULL;
+ if (!mBaseTool)
+ {
+ LL_WARNS() << "mBaseTool is NULL" << LL_ENDL;
+ }
+ }
+ updateToolStatus();
+}
+
+
+void LLToolMgr::onAppFocusLost()
+{
+ if (LLApp::isExiting())
+ return;
+
+ if (mSelectedTool)
+ {
+ mSelectedTool->handleDeselect();
+ }
+ updateToolStatus();
+}
+
+void LLToolMgr::onAppFocusGained()
+{
+ if (mSelectedTool)
+ {
+ mSelectedTool->handleSelect();
+ }
+ updateToolStatus();
+}
+
+void LLToolMgr::clearSavedTool()
+{
+ mSavedTool = NULL;
+}
+
+/////////////////////////////////////////////////////
+// LLToolset
+
+void LLToolset::addTool(LLTool* tool)
+{
+ mToolList.push_back( tool );
+ if( !mSelectedTool )
+ {
+ mSelectedTool = tool;
+ }
+}
+
+
+void LLToolset::selectTool(LLTool* tool)
+{
+ mSelectedTool = tool;
+ LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
+}
+
+
+void LLToolset::selectToolByIndex( S32 index )
+{
+ LLTool *tool = (index >= 0 && index < (S32)mToolList.size()) ? mToolList[index] : NULL;
+ if (tool)
+ {
+ mSelectedTool = tool;
+ LLToolMgr::getInstance()->setCurrentTool( tool );
+ }
+}
+
+bool LLToolset::isToolSelected( S32 index )
+{
+ LLTool *tool = (index >= 0 && index < (S32)mToolList.size()) ? mToolList[index] : NULL;
+ return (tool == mSelectedTool);
+}
+
+
+void LLToolset::selectFirstTool()
+{
+ mSelectedTool = (0 < mToolList.size()) ? mToolList[0] : NULL;
+ LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
+}
+
+
+void LLToolset::selectNextTool()
+{
+ LLTool* next = NULL;
+ for( tool_list_t::iterator iter = mToolList.begin();
+ iter != mToolList.end(); )
+ {
+ LLTool* cur = *iter++;
+ if( cur == mSelectedTool && iter != mToolList.end() )
+ {
+ next = *iter;
+ break;
+ }
+ }
+
+ if( next )
+ {
+ mSelectedTool = next;
+ LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
+ }
+ else
+ {
+ selectFirstTool();
+ }
+}
+
+void LLToolset::selectPrevTool()
+{
+ LLTool* prev = NULL;
+ for( tool_list_t::reverse_iterator iter = mToolList.rbegin();
+ iter != mToolList.rend(); )
+ {
+ LLTool* cur = *iter++;
+ if( cur == mSelectedTool && iter != mToolList.rend() )
+ {
+ prev = *iter;
+ break;
+ }
+ }
+
+ if( prev )
+ {
+ mSelectedTool = prev;
+ LLToolMgr::getInstance()->setCurrentTool( mSelectedTool );
+ }
+ else if (mToolList.size() > 0)
+ {
+ selectToolByIndex((S32)mToolList.size()-1);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+