545 lines
9.4 KiB
C++
545 lines
9.4 KiB
C++
/**
|
|
* @file lltoolmgr.cpp
|
|
* @brief LLToolMgr class implementation
|
|
*
|
|
* Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
|
|
* $License$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
|
|
#include "lltoolmgr.h"
|
|
|
|
#include "lltool.h"
|
|
// tools and manipulators
|
|
#include "llmanipscale.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 "lltoolplacer.h"
|
|
#include "lltoolselect.h"
|
|
#include "lltoolselectland.h"
|
|
#include "lltoolobjpicker.h"
|
|
#include "lltoolpipette.h"
|
|
|
|
// Globals (created and destroyed by LLAgent)
|
|
LLToolMgr* gToolMgr = NULL;
|
|
|
|
// Used when app not active to avoid processing hover.
|
|
LLTool* gToolNull = NULL;
|
|
|
|
LLToolset* gCurrentToolset = NULL;
|
|
LLToolset* gBasicToolset = NULL;
|
|
LLToolset* gCameraToolset = NULL;
|
|
//LLToolset* gLandToolset = NULL;
|
|
LLToolset* gMouselookToolset = NULL;
|
|
LLToolset* gFaceEditToolset = NULL;
|
|
|
|
/////////////////////////////////////////////////////
|
|
// LLToolMgr
|
|
|
|
LLToolMgr::LLToolMgr()
|
|
:
|
|
mCurrentTool(NULL),
|
|
mSavedTool(NULL),
|
|
mTransientTool( NULL ),
|
|
mOverrideTool( NULL )
|
|
{
|
|
gToolNull = new LLTool(NULL); // Does nothing
|
|
setCurrentTool(gToolNull);
|
|
|
|
gBasicToolset = new LLToolset();
|
|
gCameraToolset = new LLToolset();
|
|
// gLandToolset = new LLToolset();
|
|
gMouselookToolset = new LLToolset();
|
|
gFaceEditToolset = new LLToolset();
|
|
|
|
gCurrentToolset = gBasicToolset;
|
|
}
|
|
|
|
void LLToolMgr::initTools()
|
|
{
|
|
// Initialize all the tools
|
|
// Variables that are reused for each tool
|
|
LLTool* tool = NULL;
|
|
|
|
//
|
|
// Pie tool (not visible in UI, implicit)
|
|
//
|
|
gToolPie = new LLToolPie();
|
|
|
|
gBasicToolset->addTool( gToolPie );
|
|
// gCameraToolset->addTool( gToolPie );
|
|
// gLandToolset->addTool( gToolPie );
|
|
|
|
// Camera tool
|
|
gToolCamera = new LLToolCamera();
|
|
gBasicToolset ->addTool( gToolCamera );
|
|
gCameraToolset->addTool( gToolCamera );
|
|
|
|
//
|
|
// Grab tool
|
|
//
|
|
gToolGrab = new LLToolGrab();
|
|
tool = gToolGrab;
|
|
|
|
gBasicToolset->addTool( tool );
|
|
|
|
//
|
|
// Translation tool
|
|
//
|
|
gToolTranslate = new LLToolCompTranslate();
|
|
tool = gToolTranslate;
|
|
|
|
gBasicToolset->addTool( tool );
|
|
|
|
//
|
|
// Scale ("Stretch") tool
|
|
//
|
|
gToolStretch = new LLToolCompScale();
|
|
tool = gToolStretch;
|
|
|
|
|
|
//
|
|
// Rotation tool
|
|
//
|
|
gToolRotate = new LLToolCompRotate();
|
|
tool = gToolRotate;
|
|
|
|
|
|
//
|
|
// Face tool
|
|
//
|
|
gToolFace = new LLToolFace();
|
|
tool = gToolFace;
|
|
|
|
//
|
|
// Pipette tool
|
|
//
|
|
gToolPipette = new LLToolPipette();
|
|
|
|
//
|
|
// Individual object selector
|
|
//
|
|
gToolIndividual = new LLToolIndividual();
|
|
|
|
|
|
//
|
|
// Create object tool
|
|
//
|
|
gToolCreate = new LLToolCompCreate();
|
|
tool = gToolCreate;
|
|
|
|
gBasicToolset->addTool( tool );
|
|
|
|
//
|
|
// Land brush tool
|
|
//
|
|
gToolLand = new LLToolBrushLand();
|
|
tool = gToolLand;
|
|
|
|
gBasicToolset->addTool( tool );
|
|
|
|
|
|
//
|
|
// Land select tool
|
|
//
|
|
gToolParcel = new LLToolSelectLand();
|
|
tool = gToolParcel;
|
|
|
|
//
|
|
// Gun tool
|
|
//
|
|
gToolGun = new LLToolCompGun();
|
|
gMouselookToolset->addTool( gToolGun );
|
|
|
|
//
|
|
// Inspect tool
|
|
//
|
|
gToolInspect = new LLToolCompInspect();
|
|
gBasicToolset->addTool( gToolInspect );
|
|
|
|
//
|
|
// Face edit tool
|
|
//
|
|
// gToolMorph = new LLToolMorph();
|
|
// gFaceEditToolset->addTool( gToolMorph );
|
|
gFaceEditToolset->addTool( gToolCamera );
|
|
|
|
// Drag and drop tool
|
|
gToolDragAndDrop = new LLToolDragAndDrop();
|
|
|
|
gToolObjPicker = new LLToolObjPicker();
|
|
|
|
// On startup, use "select" tool
|
|
gBasicToolset->selectTool( gToolPie );
|
|
useSelectedTool( gBasicToolset );
|
|
}
|
|
|
|
LLToolMgr::~LLToolMgr()
|
|
{
|
|
delete gToolPie;
|
|
gToolPie = NULL;
|
|
|
|
delete gToolGun;
|
|
gToolGun = NULL;
|
|
|
|
delete gToolCamera;
|
|
gToolCamera = NULL;
|
|
|
|
// delete gToolMorph;
|
|
// gToolMorph = NULL;
|
|
|
|
delete gToolDragAndDrop;
|
|
gToolDragAndDrop = NULL;
|
|
|
|
delete gBasicToolset;
|
|
gBasicToolset = NULL;
|
|
|
|
delete gToolGrab;
|
|
gToolGrab = NULL;
|
|
|
|
delete gToolRotate;
|
|
gToolRotate = NULL;
|
|
|
|
delete gToolTranslate;
|
|
gToolTranslate = NULL;
|
|
|
|
delete gToolStretch;
|
|
gToolStretch = NULL;
|
|
|
|
delete gToolIndividual;
|
|
gToolIndividual = NULL;
|
|
|
|
delete gToolPipette;
|
|
gToolPipette = NULL;
|
|
|
|
delete gToolCreate;
|
|
gToolCreate = NULL;
|
|
|
|
delete gToolFace;
|
|
gToolFace = NULL;
|
|
|
|
delete gToolLand;
|
|
gToolLand = NULL;
|
|
|
|
delete gToolParcel;
|
|
gToolParcel = NULL;
|
|
|
|
delete gToolObjPicker;
|
|
gToolObjPicker = NULL;
|
|
|
|
delete gMouselookToolset;
|
|
gMouselookToolset = NULL;
|
|
|
|
delete gFaceEditToolset;
|
|
gFaceEditToolset = NULL;
|
|
|
|
delete gCameraToolset;
|
|
gCameraToolset = NULL;
|
|
|
|
delete gToolNull;
|
|
gToolNull = NULL;
|
|
}
|
|
|
|
|
|
void LLToolMgr::useSelectedTool( LLToolset* vp )
|
|
{
|
|
setCurrentTool( vp->getSelectedTool() );
|
|
}
|
|
|
|
BOOL LLToolMgr::usingTransientTool()
|
|
{
|
|
return mTransientTool ? TRUE : FALSE;
|
|
}
|
|
|
|
void LLToolMgr::setCurrentTool( LLTool* tool )
|
|
{
|
|
if (tool == mCurrentTool)
|
|
{
|
|
// didn't change tool, so don't mess with
|
|
// handleSelect or handleDeselect
|
|
return;
|
|
}
|
|
|
|
if (mTransientTool)
|
|
{
|
|
mTransientTool->handleDeselect();
|
|
mTransientTool = NULL;
|
|
}
|
|
else if( mCurrentTool )
|
|
{
|
|
mCurrentTool->handleDeselect();
|
|
}
|
|
|
|
mCurrentTool = tool;
|
|
if (mCurrentTool)
|
|
{
|
|
mCurrentTool->handleSelect();
|
|
}
|
|
}
|
|
|
|
LLTool* LLToolMgr::getCurrentTool(MASK override_mask)
|
|
{
|
|
// In mid-drag, always keep the current tool
|
|
if (gToolTranslate->hasMouseCapture()
|
|
|| gToolRotate->hasMouseCapture()
|
|
|| gToolStretch->hasMouseCapture())
|
|
{
|
|
// might have gotten here by overriding another tool
|
|
if (mOverrideTool)
|
|
{
|
|
return mOverrideTool;
|
|
}
|
|
else
|
|
{
|
|
return mCurrentTool;
|
|
}
|
|
}
|
|
|
|
if (mTransientTool)
|
|
{
|
|
mOverrideTool = NULL;
|
|
return mTransientTool;
|
|
}
|
|
|
|
if (mCurrentTool == gToolGun)
|
|
{
|
|
mOverrideTool = NULL;
|
|
return mCurrentTool;
|
|
}
|
|
|
|
// ALT always gets you the camera tool
|
|
if (override_mask & MASK_ALT)
|
|
{
|
|
mOverrideTool = gToolCamera;
|
|
return mOverrideTool;
|
|
}
|
|
|
|
if (mCurrentTool == gToolCamera)
|
|
{
|
|
// ...can't switch out of camera
|
|
mOverrideTool = NULL;
|
|
return mCurrentTool;
|
|
}
|
|
else if (mCurrentTool == gToolGrab)
|
|
{
|
|
// ...can't switch out of grab
|
|
mOverrideTool = NULL;
|
|
return mCurrentTool;
|
|
}
|
|
else if (mCurrentTool == gToolInspect)
|
|
{
|
|
// ...can't switch out of grab
|
|
mOverrideTool = NULL;
|
|
return mCurrentTool;
|
|
}
|
|
else
|
|
{
|
|
// ...can switch between editing tools
|
|
if (override_mask == MASK_CONTROL)
|
|
{
|
|
// Control lifts when in the pie tool, otherwise switches to rotate
|
|
if (mCurrentTool == gToolPie)
|
|
{
|
|
mOverrideTool = gToolGrab;
|
|
}
|
|
else
|
|
{
|
|
mOverrideTool = gToolRotate;
|
|
}
|
|
return mOverrideTool;
|
|
}
|
|
else if (override_mask == (MASK_CONTROL | MASK_SHIFT))
|
|
{
|
|
// Shift-Control spins when in the pie tool, otherwise switches to scale
|
|
if (mCurrentTool == gToolPie)
|
|
{
|
|
mOverrideTool = gToolGrab;
|
|
}
|
|
else
|
|
{
|
|
mOverrideTool = gToolStretch;
|
|
}
|
|
return mOverrideTool;
|
|
}
|
|
else
|
|
{
|
|
mOverrideTool = NULL;
|
|
return mCurrentTool;
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL LLToolMgr::inEdit()
|
|
{
|
|
return mCurrentTool != gToolPie && mCurrentTool != gToolNull;
|
|
}
|
|
|
|
void LLToolMgr::setTransientTool(LLTool* tool)
|
|
{
|
|
if (!tool)
|
|
{
|
|
clearTransientTool();
|
|
}
|
|
else
|
|
{
|
|
if (mTransientTool)
|
|
{
|
|
mTransientTool->handleDeselect();
|
|
mTransientTool = NULL;
|
|
}
|
|
else if (mCurrentTool)
|
|
{
|
|
mCurrentTool->handleDeselect();
|
|
}
|
|
|
|
mTransientTool = tool;
|
|
mTransientTool->handleSelect();
|
|
}
|
|
}
|
|
|
|
void LLToolMgr::clearTransientTool()
|
|
{
|
|
if (mTransientTool)
|
|
{
|
|
mTransientTool->handleDeselect();
|
|
mTransientTool = NULL;
|
|
if (mCurrentTool)
|
|
{
|
|
mCurrentTool->handleSelect();
|
|
}
|
|
else
|
|
{
|
|
llwarns << "mCurrentTool is NULL" << llendl;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// The "gun tool", used for handling mouselook, captures the mouse and
|
|
// locks it within the window. When the app loses focus we need to
|
|
// release this locking.
|
|
void LLToolMgr::onAppFocusLost()
|
|
{
|
|
if (mCurrentTool
|
|
&& mCurrentTool == gToolGun)
|
|
{
|
|
mCurrentTool->handleDeselect();
|
|
}
|
|
mSavedTool = mCurrentTool;
|
|
mCurrentTool = gToolNull;
|
|
}
|
|
|
|
void LLToolMgr::onAppFocusGained()
|
|
{
|
|
if (mSavedTool)
|
|
{
|
|
if (mSavedTool == gToolGun)
|
|
{
|
|
mCurrentTool->handleSelect();
|
|
}
|
|
mCurrentTool = mSavedTool;
|
|
mSavedTool = NULL;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////
|
|
// LLToolset
|
|
|
|
void LLToolset::addTool(LLTool* tool)
|
|
{
|
|
llassert( !mToolList.checkData( tool ) ); // check for duplicates
|
|
|
|
mToolList.addDataAtEnd( tool );
|
|
if( !mSelectedTool )
|
|
{
|
|
mSelectedTool = tool;
|
|
}
|
|
}
|
|
|
|
|
|
void LLToolset::selectTool(LLTool* tool)
|
|
{
|
|
mSelectedTool = tool;
|
|
gToolMgr->setCurrentTool( mSelectedTool );
|
|
}
|
|
|
|
|
|
void LLToolset::selectToolByIndex( S32 index )
|
|
{
|
|
LLTool *tool = mToolList.getNthData( index );
|
|
if (tool)
|
|
{
|
|
mSelectedTool = tool;
|
|
gToolMgr->setCurrentTool( tool );
|
|
}
|
|
}
|
|
|
|
BOOL LLToolset::isToolSelected( S32 index )
|
|
{
|
|
return (mToolList.getNthData( index ) == mSelectedTool);
|
|
}
|
|
|
|
|
|
void LLToolset::selectFirstTool()
|
|
{
|
|
mSelectedTool = mToolList.getFirstData();
|
|
gToolMgr->setCurrentTool( mSelectedTool );
|
|
}
|
|
|
|
|
|
void LLToolset::selectNextTool()
|
|
{
|
|
LLTool* next = NULL;
|
|
for( LLTool* cur = mToolList.getFirstData(); cur; cur = mToolList.getNextData() )
|
|
{
|
|
if( cur == mSelectedTool )
|
|
{
|
|
next = mToolList.getNextData();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( !next )
|
|
{
|
|
next = mToolList.getFirstData();
|
|
}
|
|
|
|
mSelectedTool = next;
|
|
gToolMgr->setCurrentTool( mSelectedTool );
|
|
}
|
|
|
|
void LLToolset::selectPrevTool()
|
|
{
|
|
LLTool* prev = NULL;
|
|
for( LLTool* cur = mToolList.getLastData(); cur; cur = mToolList.getPreviousData() )
|
|
{
|
|
if( cur == mSelectedTool )
|
|
{
|
|
prev = mToolList.getPreviousData();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( !prev )
|
|
{
|
|
prev = mToolList.getLastData();
|
|
}
|
|
|
|
mSelectedTool = prev;
|
|
gToolMgr->setCurrentTool( mSelectedTool );
|
|
}
|
|
|
|
void select_tool( void *tool_pointer )
|
|
{
|
|
LLTool *tool = (LLTool *)tool_pointer;
|
|
gCurrentToolset->selectTool( tool );
|
|
}
|