500 lines
8.7 KiB
C++
500 lines
8.7 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* 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 )
|
|
{
|
|
gToolNull = new LLTool(NULL); // Does nothing
|
|
setCurrentTool(gToolNull);
|
|
|
|
gBasicToolset = new LLToolset();
|
|
gCameraToolset = new LLToolset();
|
|
// gLandToolset = new LLToolset();
|
|
gMouselookToolset = new LLToolset();
|
|
gFaceEditToolset = new LLToolset();
|
|
}
|
|
|
|
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
|
|
setCurrentToolset(gBasicToolset);
|
|
gBasicToolset->selectTool( gToolPie );
|
|
}
|
|
|
|
LLToolMgr::~LLToolMgr()
|
|
{
|
|
delete gToolPie;
|
|
gToolPie = NULL;
|
|
|
|
delete gToolInspect;
|
|
gToolInspect = 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;
|
|
}
|
|
|
|
BOOL LLToolMgr::usingTransientTool()
|
|
{
|
|
return mTransientTool ? TRUE : FALSE;
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
LLTool* LLToolMgr::getCurrentTool()
|
|
{
|
|
MASK override_mask = gKeyboard->currentMask(TRUE);
|
|
|
|
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;
|
|
}
|
|
|
|
//update tool selection status
|
|
if (mSelectedTool != cur_tool)
|
|
{
|
|
if (mSelectedTool)
|
|
{
|
|
mSelectedTool->handleDeselect();
|
|
}
|
|
if (cur_tool)
|
|
{
|
|
cur_tool->handleSelect();
|
|
}
|
|
mSelectedTool = cur_tool;
|
|
}
|
|
|
|
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 != gToolPie && mBaseTool != gToolNull;
|
|
}
|
|
|
|
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)
|
|
{
|
|
llwarns << "mBaseTool is NULL" << llendl;
|
|
}
|
|
}
|
|
updateToolStatus();
|
|
}
|
|
|
|
|
|
// 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()
|
|
{
|
|
mSavedTool = mBaseTool;
|
|
mBaseTool = gToolNull;
|
|
updateToolStatus();
|
|
}
|
|
|
|
void LLToolMgr::onAppFocusGained()
|
|
{
|
|
if (mSavedTool)
|
|
{
|
|
mBaseTool = mSavedTool;
|
|
mSavedTool = NULL;
|
|
}
|
|
updateToolStatus();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////
|
|
// 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();
|
|
if (gToolMgr)
|
|
{
|
|
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;
|
|
gToolMgr->getCurrentToolset()->selectTool( tool );
|
|
}
|