lltoolobjpicker.cpp

Go to the documentation of this file.
00001 
00032 // LLToolObjPicker is a transient tool, useful for a single object pick.
00033 
00034 #include "llviewerprecompiledheaders.h"
00035 
00036 #include "lltoolobjpicker.h"
00037 
00038 #include "llagent.h"
00039 #include "llselectmgr.h"
00040 #include "llworld.h"
00041 #include "llviewercontrol.h"
00042 #include "llmenugl.h"
00043 #include "lltoolmgr.h"
00044 #include "llviewerobject.h"
00045 #include "llviewerobjectlist.h"
00046 #include "llviewermenu.h"
00047 #include "llviewercamera.h"
00048 #include "llviewerwindow.h"
00049 #include "lldrawable.h"
00050 
00051 
00052 LLToolObjPicker::LLToolObjPicker()
00053 :       LLTool( "ObjPicker", NULL ),
00054         mPicked( FALSE ),
00055         mHitObjectID( LLUUID::null ),
00056         mExitCallback( NULL ),
00057         mExitCallbackData( NULL )
00058 { }
00059 
00060 
00061 // returns TRUE if an object was selected 
00062 BOOL LLToolObjPicker::handleMouseDown(S32 x, S32 y, MASK mask)
00063 {
00064         LLView* viewp = gViewerWindow->getRootView();
00065         BOOL handled = viewp->handleMouseDown(x, y, mask);
00066 
00067         mHitObjectID.setNull();
00068 
00069         if (! handled)
00070         {
00071                 // didn't click in any UI object, so must have clicked in the world
00072                 gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, pickCallback);
00073                 handled = TRUE;
00074         }
00075         else
00076         {
00077                 if (hasMouseCapture())
00078                 {
00079                         setMouseCapture(FALSE);
00080                 }
00081                 else
00082                 {
00083                         llwarns << "PickerTool doesn't have mouse capture on mouseDown" << llendl;      
00084                 }
00085         }
00086 
00087         // Pass mousedown to base class
00088         LLTool::handleMouseDown(x, y, mask);
00089 
00090         return handled;
00091 }
00092 
00093 void LLToolObjPicker::pickCallback(S32 x, S32 y, MASK mask)
00094 {
00095         // You must hit the body for this tool to think you hit the object.
00096         LLViewerObject* objectp = NULL;
00097         objectp = gObjectList.findObject( gLastHitObjectID );
00098         if (objectp)
00099         {
00100                 LLToolObjPicker::getInstance()->mHitObjectID = objectp->mID;
00101                 LLToolObjPicker::getInstance()->mPicked = TRUE;
00102         }
00103 }
00104 
00105 
00106 BOOL LLToolObjPicker::handleMouseUp(S32 x, S32 y, MASK mask)
00107 {
00108         LLView* viewp = gViewerWindow->getRootView();
00109         BOOL handled = viewp->handleHover(x, y, mask);
00110         if (handled)
00111         {
00112                 // let UI handle this
00113         }
00114 
00115         LLTool::handleMouseUp(x, y, mask);
00116         if (hasMouseCapture())
00117         {
00118                 setMouseCapture(FALSE);
00119         }
00120         else
00121         {
00122                 llwarns << "PickerTool doesn't have mouse capture on mouseUp" << llendl;        
00123         }
00124         return handled;
00125 }
00126 
00127 
00128 BOOL LLToolObjPicker::handleHover(S32 x, S32 y, MASK mask)
00129 {
00130         LLView *viewp = gViewerWindow->getRootView();
00131         BOOL handled = viewp->handleHover(x, y, mask);
00132         if (!handled) 
00133         {
00134                 // Used to do pick on hover.  Now we just always display the cursor.
00135                 ECursorType cursor = UI_CURSOR_ARROWLOCKED;
00136 
00137                 cursor = UI_CURSOR_TOOLPICKOBJECT3;
00138 
00139                 gViewerWindow->getWindow()->setCursor(cursor);
00140         }
00141         return handled;
00142 }
00143 
00144 
00145 void LLToolObjPicker::onMouseCaptureLost()
00146 {
00147         if (mExitCallback)
00148         {
00149                 mExitCallback(mExitCallbackData);
00150 
00151                 mExitCallback = NULL;
00152                 mExitCallbackData = NULL;
00153         }
00154 
00155         mPicked = FALSE;
00156         mHitObjectID.setNull();
00157 }
00158 
00159 // virtual
00160 void LLToolObjPicker::setExitCallback(void (*callback)(void *), void *callback_data)
00161 {
00162         mExitCallback = callback;
00163         mExitCallbackData = callback_data;
00164 }
00165 
00166 // virtual
00167 void LLToolObjPicker::handleSelect()
00168 {
00169         LLTool::handleSelect();
00170         setMouseCapture(TRUE);
00171 }
00172 
00173 // virtual
00174 void LLToolObjPicker::handleDeselect()
00175 {
00176         if (hasMouseCapture())
00177         {
00178                 LLTool::handleDeselect();
00179                 setMouseCapture(FALSE);
00180         }
00181 }
00182 
00183 

Generated on Fri May 16 08:34:07 2008 for SecondLife by  doxygen 1.5.5