00001
00032
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
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
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
00088 LLTool::handleMouseDown(x, y, mask);
00089
00090 return handled;
00091 }
00092
00093 void LLToolObjPicker::pickCallback(S32 x, S32 y, MASK mask)
00094 {
00095
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
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
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
00160 void LLToolObjPicker::setExitCallback(void (*callback)(void *), void *callback_data)
00161 {
00162 mExitCallback = callback;
00163 mExitCallbackData = callback_data;
00164 }
00165
00166
00167 void LLToolObjPicker::handleSelect()
00168 {
00169 LLTool::handleSelect();
00170 setMouseCapture(TRUE);
00171 }
00172
00173
00174 void LLToolObjPicker::handleDeselect()
00175 {
00176 if (hasMouseCapture())
00177 {
00178 LLTool::handleDeselect();
00179 setMouseCapture(FALSE);
00180 }
00181 }
00182
00183