BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) { LLViewerObject* obj = mPick.getObject(); U8 click_action = final_click_action(obj); if (click_action != CLICK_ACTION_NONE) { switch(click_action) { case CLICK_ACTION_BUY: case CLICK_ACTION_PAY: case CLICK_ACTION_OPEN: // Because these actions open UI dialogs, we won't change // the cursor again until the next hover and GL pick over // the world. Keep the cursor an arrow, assuming that // after the user moves off the UI, they won't be on the // same object anymore. gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); // Make sure the hover-picked object is ignored. gHoverView->resetLastHoverObject(); break; default: break; } } mGrabMouseButtonDown = FALSE; LLToolMgr::getInstance()->clearTransientTool(); gAgent.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on return LLTool::handleMouseUp(x, y, mask); }
static bool needs_tooltip(LLSelectNode* nodep) { if (!nodep) return false; LLViewerObject* object = nodep->getObject(); LLViewerObject *parent = (LLViewerObject *)object->getParent(); if (object->flagHandleTouch() || (parent && parent->flagHandleTouch()) || object->flagTakesMoney() || (parent && parent->flagTakesMoney()) || object->flagAllowInventoryAdd() ) { return true; } U8 click_action = final_click_action(object); if (click_action != 0) { return true; } if (nodep->mValid) { bool anyone_copy = anyone_copy_selection(nodep); bool for_sale = for_sale_selection(nodep); if (anyone_copy || for_sale) { return true; } } return false; }
// Choose the "most relevant" operation for this object, and show a button for // that operation as the left-most button in the inspector. void LLInspectObject::updateButtons(LLSelectNode* nodep) { // We'll start with everyone hidden and show the ones we need hideButtons(); LLViewerObject* object = nodep->getObject(); LLViewerObject *parent = (LLViewerObject*)object->getParent(); bool for_copy = anyone_copy_selection(nodep); bool for_sale = enable_buy_object(); S32 price = nodep->mSaleInfo.getSalePrice(); U8 click_action = final_click_action(object); if (for_copy || (for_sale && price == 0)) { // Free copies have priority over other operations getChild<LLUICtrl>("take_free_copy_btn")->setVisible(true); } else if (for_sale) { getChild<LLUICtrl>("buy_btn")->setVisible(true); } else if ( enable_pay_object() ) { getChild<LLUICtrl>("pay_btn")->setVisible(true); } else if (click_action == CLICK_ACTION_SIT) { // Click-action sit must come before "open" because many objects on // which you can sit have scripts, and hence can be opened getChild<LLUICtrl>("sit_btn")->setVisible(true); updateSitLabel(nodep); } else if (object->flagHandleTouch() || (parent && parent->flagHandleTouch())) { getChild<LLUICtrl>("touch_btn")->setVisible(true); updateTouchLabel(nodep); } else if ( enable_object_open() ) { // Open is last because anything with a script in it can be opened getChild<LLUICtrl>("open_btn")->setVisible(true); } else { // By default, we can sit on anything getChild<LLUICtrl>("sit_btn")->setVisible(true); updateSitLabel(nodep); } // No flash focusFirstItem(FALSE, FALSE); }
ECursorType cursor_from_object(LLViewerObject* object) { LLViewerObject* parent = NULL; if (object) { parent = object->getRootEdit(); } U8 click_action = final_click_action(object); ECursorType cursor = UI_CURSOR_ARROW; switch(click_action) { case CLICK_ACTION_SIT: { if (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) // not already sitting? { cursor = UI_CURSOR_TOOLSIT; } } break; case CLICK_ACTION_BUY: cursor = UI_CURSOR_TOOLBUY; break; case CLICK_ACTION_OPEN: // Open always opens the parent. if (parent && parent->allowOpen()) { cursor = UI_CURSOR_TOOLOPEN; } break; case CLICK_ACTION_PAY: if ((object && object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) { cursor = UI_CURSOR_TOOLBUY; } break; case CLICK_ACTION_ZOOM: cursor = UI_CURSOR_TOOLZOOMIN; break; case CLICK_ACTION_PLAY: case CLICK_ACTION_OPEN_MEDIA: cursor = cursor_from_parcel_media(click_action); break; default: break; } return cursor; }
ECursorType cursor_from_object(LLViewerObject* object) { LLViewerObject* parent = NULL; if (object) { parent = object->getRootEdit(); } U8 click_action = final_click_action(object); ECursorType cursor = UI_CURSOR_ARROW; switch(click_action) { case CLICK_ACTION_SIT: // if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->mIsSitting)) // not already sitting? // [RLVa:KB] - Checked: 2009-12-22 (RLVa-1.1.0k) | Added: RLVa-1.1.0j if ( ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->mIsSitting)) && // not already sitting? ((!rlv_handler_t::isEnabled()) || (gRlvHandler.canSit(object, gViewerWindow->getHoverPick().mObjectOffset))) ) // [/RLVa:KB] { cursor = UI_CURSOR_TOOLSIT; } break; case CLICK_ACTION_BUY: cursor = UI_CURSOR_TOOLBUY; break; case CLICK_ACTION_OPEN: // Open always opens the parent. if (parent && parent->allowOpen()) { cursor = UI_CURSOR_TOOLOPEN; } break; case CLICK_ACTION_PAY: if ((object && object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) { cursor = UI_CURSOR_TOOLPAY; } break; case CLICK_ACTION_PLAY: case CLICK_ACTION_OPEN_MEDIA: cursor = cursor_from_parcel_media(click_action); break; default: break; } return cursor; }
BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) { if (gDebugClicks) { llinfos << "LLToolPie handleDoubleClick (becoming mouseDown)" << llendl; } if (gSavedSettings.getBOOL("DoubleClickAutoPilot")) { if (mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) { handle_go_to(); return TRUE; } else if (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()) { // Hit an object // HACK: Call the last hit position the point we hit on the object //gLastHitPosGlobal += gLastHitObjectOffset; handle_go_to(); return TRUE; } } else /* code added to support double click teleports */ if (gSavedSettings.getBOOL("DoubleClickTeleport")) { LLViewerObject* objp = mPick.getObject(); LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL; bool is_in_world = mPick.mObjectID.notNull() && objp && !objp->isHUDAttachment(); bool is_land = mPick.mPickType == LLPickInfo::PICK_LAND; bool pos_non_zero = !mPick.mPosGlobal.isExactlyZero(); bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch()); bool has_click_action = final_click_action(objp); if (pos_non_zero && (is_land || (is_in_world && !has_touch_handler && !has_click_action))) { LLVector3d pos = mPick.mPosGlobal; pos.mdV[VZ] += gAgent.getAvatarObject()->getPelvisToFoot(); gAgent.teleportViaLocationLookAt(pos); return TRUE; } } return FALSE; }
BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) { if (gDebugClicks) { llinfos << "LLToolPie handleDoubleClick (becoming mouseDown)" << llendl; } if (gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport")) { if (mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) { handle_go_to(); return TRUE; } else if (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()) { // Hit an object // Do not go to attachments... if (mPick.getObject() && !mPick.getObject()->isHUDAttachment()) { // HACK: Call the last hit position the point we hit on the object //gLastHitPosGlobal += gLastHitObjectOffset; handle_go_to(); return TRUE; } } } else /* code added to support double click teleports */ if (gSavedSettings.getBOOL("DoubleClickTeleport")) { LLViewerObject* objp = mPick.getObject(); LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL; bool is_in_world = mPick.mObjectID.notNull() && objp && !objp->isHUDAttachment(); bool is_land = mPick.mPickType == LLPickInfo::PICK_LAND; bool pos_non_zero = !mPick.mPosGlobal.isExactlyZero(); bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch()); bool has_click_action = final_click_action(objp); if (pos_non_zero && (is_land || (is_in_world && !has_touch_handler && !has_click_action))) { LLVector3d pos = mPick.mPosGlobal; pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot(); gAgent.teleportViaLocationLookAt(pos); return TRUE; } } return FALSE; /* JC - don't do go-there, because then double-clicking on physical objects gets you into trouble. // If double-click on object or land, go there. LLViewerObject *object = gViewerWindow->getLastPick().getObject(); if (object) { if (object->isAvatar()) { LLFloaterAvatarInfo::showFromAvatar(object->getID()); } else { handle_go_to(NULL); } } else if (!gLastHitPosGlobal.isExactlyZero()) { handle_go_to(NULL); } return TRUE; */ }
BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) { if (gDebugClicks) { llinfos << "LLToolPie handleDoubleClick (becoming mouseDown)" << llendl; } LLViewerObject *object = mPick.getObject(); if(object) { //Zwagoth: No more teleport to HUD attachments. >:o if (object->isHUDAttachment()) { LL_DEBUGS("DoubleClicks") << "Double clicked HUD" << LL_ENDL; return FALSE; } //Armin: No more teleport to other attachments or Avatars including self ... if (object->isAttachment()) { LL_DEBUGS("DoubleClicks") << "Double clicked attachment (not HUD)" << LL_ENDL; return FALSE; } if (object->isAvatar()&& object == gAgent.getAvatarObject() ) { LL_DEBUGS("DoubleClicks") << "Double clicked self" << LL_ENDL; return FALSE; } if (object->isAvatar()) { LL_DEBUGS("DoubleClicks") << "Double clicked other Avatar" << LL_ENDL; return FALSE;// or what about open profile or IM session or ... } if (final_click_action(object)) { LL_DEBUGS("DoubleClicks") << "Double clicked an object with a click action" << LL_ENDL; return FALSE; } LLViewerObject* parent = object->getRootEdit(); if (object->flagHandleTouch() || (parent && parent->flagHandleTouch())) { LL_DEBUGS("DoubleClicks") << "Double clicked a touch-scripted object" << LL_ENDL; return FALSE; } const LLTextureEntry* tep = object->getTE(mPick.mObjectFace); viewer_media_t media_impl = tep ? LLViewerMedia::getMediaImplFromTextureID(tep->getID()) : NULL; if (media_impl.notNull() && media_impl->hasMedia()) { LL_DEBUGS("DoubleClicks") << "Double clicked running parcel media" << LL_ENDL; return FALSE; } } std::string action = gSavedSettings.getString("DoubleClickAction"); LLStringUtil::toLower(action); if (action == "none") { return FALSE; } else if (action == "go") { if (mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) { handle_go_to_confirm(); return TRUE; } else if (mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()) { handle_go_to_confirm(); return TRUE; } } else { llwarns << "Unhandled DoubleClickAction setting: " << action << llendl; } return FALSE; }