summaryrefslogtreecommitdiff
path: root/indra/newview/lltoolobjpicker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/lltoolobjpicker.cpp')
-rw-r--r--indra/newview/lltoolobjpicker.cpp162
1 files changed, 162 insertions, 0 deletions
diff --git a/indra/newview/lltoolobjpicker.cpp b/indra/newview/lltoolobjpicker.cpp
new file mode 100644
index 0000000000..ca74a64bf8
--- /dev/null
+++ b/indra/newview/lltoolobjpicker.cpp
@@ -0,0 +1,162 @@
+/**
+ * @file lltoolobjpicker.cpp
+ * @brief LLToolObjPicker class implementation
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+// LLToolObjPicker is a transient tool, useful for a single object pick.
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltoolobjpicker.h"
+
+#include "llagent.h"
+#include "llselectmgr.h"
+#include "llworld.h"
+#include "viewer.h" // for gFPSClamped, pie menus
+#include "llviewercontrol.h"
+#include "llmenugl.h"
+#include "lltoolmgr.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewermenu.h"
+#include "llviewercamera.h"
+#include "llviewerwindow.h"
+#include "lldrawable.h"
+
+LLToolObjPicker* gToolObjPicker = NULL;
+
+LLToolObjPicker::LLToolObjPicker()
+: LLTool( "ObjPicker", NULL ),
+ mPicked( FALSE ),
+ mHitObjectID( LLUUID::null ),
+ mExitCallback( NULL ),
+ mExitCallbackData( NULL )
+{ }
+
+
+// returns TRUE if an object was selected
+BOOL LLToolObjPicker::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ LLView* viewp = gViewerWindow->getRootView();
+ BOOL handled = viewp->handleMouseDown(x, y, mask);
+
+ mHitObjectID.setNull();
+
+ if (! handled)
+ {
+ // didn't click in any UI object, so must have clicked in the world
+ gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, pickCallback);
+ handled = TRUE;
+ }
+ else
+ {
+ if (hasMouseCapture())
+ {
+ setMouseCapture(FALSE);
+ }
+ else
+ {
+ llwarns << "PickerTool doesn't have mouse capture on mouseDown" << llendl;
+ }
+ }
+
+ // Pass mousedown to base class
+ LLTool::handleMouseDown(x, y, mask);
+
+ return handled;
+}
+
+void LLToolObjPicker::pickCallback(S32 x, S32 y, MASK mask)
+{
+ // You must hit the body for this tool to think you hit the object.
+ LLViewerObject* objectp = NULL;
+ objectp = gObjectList.findObject( gLastHitObjectID );
+ if (objectp)
+ {
+ gToolObjPicker->mHitObjectID = objectp->mID;
+ gToolObjPicker->mPicked = TRUE;
+ }
+}
+
+
+BOOL LLToolObjPicker::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ LLView* viewp = gViewerWindow->getRootView();
+ BOOL handled = viewp->handleHover(x, y, mask);
+ if (handled)
+ {
+ // let UI handle this
+ }
+
+ LLTool::handleMouseUp(x, y, mask);
+ if (hasMouseCapture())
+ {
+ setMouseCapture(FALSE);
+ }
+ else
+ {
+ llwarns << "PickerTool doesn't have mouse capture on mouseUp" << llendl;
+ }
+ return handled;
+}
+
+
+BOOL LLToolObjPicker::handleHover(S32 x, S32 y, MASK mask)
+{
+ LLView *viewp = gViewerWindow->getRootView();
+ BOOL handled = viewp->handleHover(x, y, mask);
+ if (!handled)
+ {
+ // Used to do pick on hover. Now we just always display the cursor.
+ ECursorType cursor = UI_CURSOR_ARROWLOCKED;
+
+ cursor = UI_CURSOR_TOOLPICKOBJECT3;
+
+ gViewerWindow->getWindow()->setCursor(cursor);
+ }
+ return handled;
+}
+
+
+void LLToolObjPicker::onMouseCaptureLost()
+{
+ if (mExitCallback)
+ {
+ mExitCallback(mExitCallbackData);
+
+ mExitCallback = NULL;
+ mExitCallbackData = NULL;
+ }
+
+ mPicked = FALSE;
+ mHitObjectID.setNull();
+}
+
+// virtual
+void LLToolObjPicker::setExitCallback(void (*callback)(void *), void *callback_data)
+{
+ mExitCallback = callback;
+ mExitCallbackData = callback_data;
+}
+
+// virtual
+void LLToolObjPicker::handleSelect()
+{
+ LLTool::handleSelect();
+ setMouseCapture(TRUE);
+}
+
+// virtual
+void LLToolObjPicker::handleDeselect()
+{
+ if (hasMouseCapture())
+ {
+ LLTool::handleDeselect();
+ setMouseCapture(FALSE);
+ }
+}
+
+