From e44ba343a600a2c4bef21077fd5964401eb22b55 Mon Sep 17 00:00:00 2001 From: Lirusaito Date: Fri, 29 Mar 2013 03:01:18 -0400 Subject: [PATCH] Further LLViewerMenu updates --- indra/newview/lltoolpie.cpp | 17 +- indra/newview/llviewermenu.cpp | 1199 ++++++++++++++++-------------- indra/newview/llviewermenu.h | 42 +- indra/newview/llvoavatarself.cpp | 3 + 4 files changed, 678 insertions(+), 583 deletions(-) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 0dc00f826..ccb5eeef8 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -207,15 +207,16 @@ BOOL LLToolPie::pickAndShowMenu(BOOL always_show) // touch behavior down below... break; case CLICK_ACTION_SIT: - if ((isAgentAvatarValid()) && (!gAgentAvatarp->isSitting()) - && (!gSavedSettings.getBOOL("DisableClickSit"))) // agent not already sitting { - handle_sit_or_stand(); - // put focus in world when sitting on an object - gFocusMgr.setKeyboardFocus(NULL); - return TRUE; - } // else nothing (fall through to touch) - + if (!gSavedSettings.getBOOL("DisableClickSit")) + if (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) // agent not already sitting + { + handle_object_sit_or_stand(); + // put focus in world when sitting on an object + gFocusMgr.setKeyboardFocus(NULL); + return TRUE; + } // else nothing (fall through to touch) + } case CLICK_ACTION_PAY: if ((object && object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b6d71012b..b627fef4f 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3,10 +3,9 @@ * @brief Builds menus out of items. * * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * * Second Life Viewer Source Code + * Copyright (c) 2002-2009, Linden Research, Inc. + * * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement @@ -36,6 +35,7 @@ // linden library includes #include "llanimationstates.h" // For ANIM_AGENT_AWAY +#include "llavatarnamecache.h" // IDEVO #include "llinventorypanel.h" #include "llnotifications.h" #include "llnotificationsutil.h" @@ -177,11 +177,11 @@ #include "scriptcounter.h" #include "llfloaterdisplayname.h" -#include "llavatarnamecache.h" #include "floaterao.h" #include "slfloatermediafilter.h" #include "llviewerobjectbackup.h" #include "llagentui.h" +#include "lltoolgrab.h" #include "llpathfindingmanager.h" #include @@ -317,7 +317,6 @@ void handle_agent_stop_moving(void*); void print_packets_lost(void*); void drop_packet(void*); void velocity_interpolate( void* ); -void toggle_wind_audio(void); void handle_rebake_textures(void*); BOOL check_admin_override(void*); void handle_admin_override_toggle(void*); @@ -509,8 +508,8 @@ BOOL enable_selection_you_own_one(void*); BOOL enable_save_into_inventory(void*); BOOL enable_save_into_task_inventory(void*); -BOOL enable_detach(void*); -BOOL enable_region_owner(void*); +BOOL enable_detach(const LLSD& = LLSD()); +BOOL is_god_customer_service(void*); void menu_toggle_attached_lights(void* user_data); void menu_toggle_attached_particles(void* user_data); @@ -566,6 +565,7 @@ void pre_init_menus() LLMenuItemGL::sHighlightForeground = gColors.getColor( "MenuItemHighlightFgColor" ); } + void initialize_menus(); //----------------------------------------------------------------------------- @@ -729,8 +729,6 @@ void init_menus() menu->addChild(new LLMenuItemCheckGL( "Streaming Audio Display", &handle_ticker_toggle, &handle_ticker_enabled, &handle_singleton_check, NULL )); - - // // Add in the pose stand ------------------------------------------- /*LLMenuGL* sub = new LLMenuGL("Pose Stand..."); @@ -744,7 +742,7 @@ void init_menus() sub->addChild(new LLMenuItemCallGL( "Legs Half Arms Out", &handle_pose_stand_lhao, NULL)); sub->addChild(new LLMenuItemCallGL( "Stop Pose Stand", &handle_pose_stand_stop, NULL)); // ------------------------------------------------------*/ - + menu->addChild(new LLMenuItemCheckGL("Pose Stand",&handle_toggle_pose, NULL, &handle_check_pose, NULL)); //these should always be last in a sub menu @@ -773,7 +771,7 @@ void init_menus() show_debug_menus(); gLoginMenuBarView = (LLMenuBarGL*)LLUICtrlFactory::getInstance()->buildMenu("menu_login.xml", gMenuHolder); - + menu = new LLMenuGL(CLIENT_MENU_NAME); menu->setCanTearOff(FALSE); menu->addChild(new LLMenuItemCallGL("Debug Settings...", handle_singleton_toggle, NULL, NULL)); @@ -1534,7 +1532,7 @@ void init_debug_avatar_menu(LLMenuGL* menu) // HACK for easy testing of avatar geometry sub_menu->addChild(new LLMenuItemCallGL( "Toggle Character Geometry", - &handle_god_request_avatar_geometry, &enable_god_customer_service, NULL)); + &handle_god_request_avatar_geometry, &is_god_customer_service, NULL)); sub_menu->addChild(new LLMenuItemCallGL("Test Male", handle_test_male)); @@ -1651,7 +1649,7 @@ void init_server_menu(LLMenuGL* menu) menu->addChild(sub); sub->addChild(new LLMenuItemCallGL( "Take Copy", - &force_take_copy, &enable_god_customer_service, NULL, + &force_take_copy, &is_god_customer_service, NULL, 'O', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); #ifdef _CORY_TESTING sub->addChild(new LLMenuItemCallGL( "Export Copy", @@ -1664,17 +1662,17 @@ void init_server_menu(LLMenuGL* menu) //sub->addChild(new LLMenuItemCallGL( "Force Ownership/Permissive", // &handle_object_owner_self_and_permissive, NULL, NULL, 'K', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); sub->addChild(new LLMenuItemCallGL( "Force Owner To Me", - &handle_object_owner_self, &enable_god_customer_service)); + &handle_object_owner_self, &is_god_customer_service)); sub->addChild(new LLMenuItemCallGL( "Force Owner Permissive", - &handle_object_owner_permissive, &enable_god_customer_service)); + &handle_object_owner_permissive, &is_god_customer_service)); //sub->addChild(new LLMenuItemCallGL( "Force Totally Permissive", // &handle_object_permissive)); sub->addChild(new LLMenuItemCallGL( "Delete", - &handle_force_delete, &enable_god_customer_service, NULL, KEY_DELETE, MASK_SHIFT | MASK_ALT | MASK_CONTROL)); + &handle_force_delete, &is_god_customer_service, NULL, KEY_DELETE, MASK_SHIFT | MASK_ALT | MASK_CONTROL)); sub->addChild(new LLMenuItemCallGL( "Lock", - &handle_object_lock, &enable_god_customer_service, NULL, 'L', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); + &handle_object_lock, &is_god_customer_service, NULL, 'L', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); sub->addChild(new LLMenuItemCallGL( "Get Asset IDs", - &handle_object_asset_ids, &enable_god_customer_service, NULL, 'I', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); + &handle_object_asset_ids, &is_god_customer_service, NULL, 'I', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); sub->createJumpKeys(); } { @@ -1683,14 +1681,14 @@ void init_server_menu(LLMenuGL* menu) sub->addChild(new LLMenuItemCallGL("Owner To Me", &handle_force_parcel_owner_to_me, - &enable_god_customer_service, NULL)); + &is_god_customer_service, NULL)); sub->addChild(new LLMenuItemCallGL("Set to Linden Content", &handle_force_parcel_to_content, - &enable_god_customer_service, NULL, + &is_god_customer_service, NULL, 'C', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); sub->addSeparator(); sub->addChild(new LLMenuItemCallGL("Claim Public Land", - &handle_claim_public_land, &enable_god_customer_service)); + &handle_claim_public_land, &is_god_customer_service)); sub->createJumpKeys(); } @@ -1699,7 +1697,7 @@ void init_server_menu(LLMenuGL* menu) menu->addChild(sub); sub->addChild(new LLMenuItemCallGL("Dump Temp Asset Data", &handle_region_dump_temp_asset_data, - &enable_god_customer_service, NULL)); + &is_god_customer_service, NULL)); sub->createJumpKeys(); } menu->addChild(new LLMenuItemCallGL( "God Tools...", @@ -1708,7 +1706,7 @@ void init_server_menu(LLMenuGL* menu) menu->addSeparator(); menu->addChild(new LLMenuItemCallGL("Save Region State", - &LLPanelRegionTools::onSaveState, &enable_god_customer_service, NULL)); + &LLPanelRegionTools::onSaveState, &is_god_customer_service, NULL)); menu->createJumpKeys(); } @@ -1780,97 +1778,76 @@ class LLObjectTouch : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - if (!object) return true; - - LLPickInfo pick = LLToolPie::getInstance()->getPick(); - -// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-1.1.0l | OK - // NOTE: fallback code since we really shouldn't be getting an active selection if we can't touch this - if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canTouch(object, pick.mObjectOffset)) ) - { - RLV_ASSERT(false); - return true; - } -// [/RLVa:KB] - - LLMessageSystem *msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_ObjectGrab); - msg->nextBlockFast( _PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast( _PREHASH_ObjectData); - msg->addU32Fast( _PREHASH_LocalID, object->mLocalID); - msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero ); - msg->nextBlock("SurfaceInfo"); - msg->addVector3("UVCoord", LLVector3(pick.mUVCoords)); - msg->addVector3("STCoord", LLVector3(pick.mSTCoords)); - msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace); - msg->addVector3("Position", pick.mIntersection); - msg->addVector3("Normal", pick.mNormal); - msg->addVector3("Binormal", pick.mBinormal); - msg->sendMessage( object->getRegion()->getHost()); - - // *NOTE: Hope the packets arrive safely and in order or else - // there will be some problems. - // *TODO: Just fix this bad assumption. - msg->newMessageFast(_PREHASH_ObjectDeGrab); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addU32Fast(_PREHASH_LocalID, object->mLocalID); - msg->nextBlock("SurfaceInfo"); - msg->addVector3("UVCoord", LLVector3(pick.mUVCoords)); - msg->addVector3("STCoord", LLVector3(pick.mSTCoords)); - msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace); - msg->addVector3("Position", pick.mIntersection); - msg->addVector3("Normal", pick.mNormal); - msg->addVector3("Binormal", pick.mBinormal); - msg->sendMessage(object->getRegion()->getHost()); - + handle_object_touch(); return true; } }; +void handle_object_touch() +{ + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if (!object) return; + + LLPickInfo pick = LLToolPie::getInstance()->getPick(); + +// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-1.1.0l + // NOTE: fallback code since we really shouldn't be getting an active selection if we can't touch this + if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canTouch(object, pick.mObjectOffset)) ) + { + RLV_ASSERT(false); + return; + } +// [/RLVa:KB] + + // *NOTE: Hope the packets arrive safely and in order or else + // there will be some problems. + // *TODO: Just fix this bad assumption. + send_ObjectGrab_message(object, pick, LLVector3::zero); + send_ObjectDeGrab_message(object, pick); +} + + +bool enable_object_touch(const LLSD& userdata) +{ + LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + + bool new_value = obj && obj->flagHandleTouch(); +// [RLVa:KB] - Checked: 2010-11-12 (RLVa-1.2.1g) | Added: RLVa-1.2.1g + if ( (rlv_handler_t::isEnabled()) && (new_value) ) + { + // RELEASE-RLVa: [RLVa-1.2.1] Make sure this stays in sync with handle_object_touch() + new_value = gRlvHandler.canTouch(obj, LLToolPie::getInstance()->getPick().mObjectOffset); + } +// [/RLVa:KB] + + std::string touch_text; + + // Update label based on the node touch name if available. + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); + if (node && node->mValid && !node->mTouchName.empty()) + { + touch_text = node->mTouchName; + } + else + { + touch_text = userdata["data"].asString(); + } + + gMenuHolder->childSetText("Object Touch", touch_text); + gMenuHolder->childSetText("Attachment Object Touch", touch_text); + return new_value; +}; // One object must have touch sensor class LLObjectEnableTouch : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - bool new_value = obj && obj->flagHandleTouch(); -// [RLVa:KB] - Version: 1.23.4 | Checked: 2010-01-01 (RLVa-1.1.0l) | Modified: RLVa-1.1.0l - if ( (new_value) && (rlv_handler_t::isEnabled()) && (!gRlvHandler.canTouch(obj, LLToolPie::getInstance()->getPick().mObjectOffset)) ) - { - new_value = false; - } -// [/RLVa:KB] - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); - - // Update label based on the node touch name if available. - LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); - - std::string touch_text; - if (node && node->mValid && !node->mTouchName.empty()) - { - touch_text = node->mTouchName; - } - else - { - touch_text = userdata["data"].asString(); - } - - gMenuHolder->childSetText("Object Touch", touch_text); - gMenuHolder->childSetText("Attachment Object Touch", touch_text); - + gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_object_touch(userdata)); return true; } }; - //void label_touch(std::string& label, void*) //{ // LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); @@ -1884,56 +1861,47 @@ class LLObjectEnableTouch : public view_listener_t // } //} -bool handle_object_open() +void handle_object_open() { - LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - if(!obj) return true; - - LLFloaterOpenObject::show(); - return true; +// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Added: RLVa-1.2.0e + if (enable_object_open()) + LLFloaterOpenObject::show(); +// [/RLVa:KB] +// LLFloaterOpenObject::show(); } class LLObjectOpen : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2011-09-16 (RLVa-1.1.4b) | Modified: RLVa-1.1.4b - // TODO-RLVa: shouldn't we be checking for fartouch here as well? - const LLViewerObject* pObj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canEdit(pObj)) ) - { - return true; - } -// [/RLVa:KB] - - return handle_object_open(); + handle_object_open(); + return true; } }; +bool enable_object_open() +{ + // Look for contents in root object, which is all the LLFloaterOpenObject + // understands. + LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if (!obj) return false; + + LLViewerObject* root = obj->getRootEdit(); + if (!root) return false; + + return root->allowOpen(); +} + class LLObjectEnableOpen : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - // Look for contents in root object, which is all the LLFloaterOpenObject - // understands. - LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - bool new_value = (obj != NULL); - if (new_value) - { - LLViewerObject* root = obj->getRootEdit(); - if (!root) new_value = false; - else new_value = root->allowOpen(); - } - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); + gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_object_open()); return true; } }; - - - - class LLViewJoystickFlycam : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -1947,8 +1915,8 @@ class LLViewCheckJoystickFlycam : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - bool new_val = LLViewerJoystick::getInstance()->getOverrideCamera(); - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_val); + bool new_value = LLViewerJoystick::getInstance()->getOverrideCamera(); + gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } }; @@ -2004,73 +1972,99 @@ class LLObjectBuild : public view_listener_t } }; + +void handle_object_edit() +{ + LLViewerParcelMgr::getInstance()->deselectLand(); + +// Singu TODO: Find out if this RLVa patch is still needed, it has been removed from upstream. +// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f + if (rlv_handler_t::isEnabled()) + { + bool fRlvCanEdit = (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDITOBJ)); + if (!fRlvCanEdit) + { + LLObjectSelectionHandle hSel = LLSelectMgr::getInstance()->getSelection(); + RlvSelectIsEditable f; + if ((hSel.notNull()) && ((hSel->getFirstRootNode(&f, TRUE)) != NULL)) + return; // Can't edit any object under @edit=n + } + else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && + (SELECT_TYPE_WORLD == LLSelectMgr::getInstance()->getSelection()->getSelectType()) && + (dist_vec_squared(gAgent.getPositionAgent(), LLToolPie::getInstance()->getPick().mIntersection) > 1.5f * 1.5f) ) + { + // TODO-RLVa: this code is rather redundant since we'll never get an active selection to show a pie menu for + return; // Can't edit in-world objects farther than 1.5m away under @fartouch=n + } + } +// [/RLVa:KB] + + if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit()) + { + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + + if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement")) + { + // always freeze camera in space, even if camera doesn't move + // so, for example, follow cam scripts can't affect you when in build mode + gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null); + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + } + else + { + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); + LLViewerObject* selected_objectp = selection->getFirstRootObject(); + if (selected_objectp) + { + // zoom in on object center instead of where we clicked, as we need to see the manipulator handles + gAgentCamera.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID()); + gAgentCamera.cameraZoomIn(0.666f); + gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD ); + gViewerWindow->moveCursorToCenter(); + } + } + } + + gFloaterTools->open(); + + LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); + gFloaterTools->setEditTool( LLToolCompTranslate::getInstance() ); + + LLViewerJoystick::getInstance()->moveObjects(true); + LLViewerJoystick::getInstance()->setNeedsReset(true); + + // Could be first use + LLFirstUse::useBuild(); + return; +} + class LLObjectEdit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLViewerParcelMgr::getInstance()->deselectLand(); - -// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) | Modified: RLVa-0.2.0f - if (rlv_handler_t::isEnabled()) - { - bool fRlvCanEdit = (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDITOBJ)); - if (!fRlvCanEdit) - { - LLObjectSelectionHandle hSel = LLSelectMgr::getInstance()->getSelection(); - RlvSelectIsEditable f; - if ((hSel.notNull()) && ((hSel->getFirstRootNode(&f, TRUE)) != NULL)) - return true; // Can't edit any object under @edit=n - } - else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH)) && - (SELECT_TYPE_WORLD == LLSelectMgr::getInstance()->getSelection()->getSelectType()) && - (dist_vec_squared(gAgent.getPositionAgent(), LLToolPie::getInstance()->getPick().mIntersection) > 1.5f * 1.5f) ) - { - // TODO-RLVa: this code is rather redundant since we'll never get an active selection to show a pie menu for - return true; // Can't edit in-world objects farther than 1.5m away under @fartouch=n - } - } -// [/RLVa:KB] - - if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit()) - { - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - - if (selection->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement")) - { - // always freeze camera in space, even if camera doesn't move - // so, for example, follow cam scripts can't affect you when in build mode - gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null); - gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); - } - else - { - gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); - LLViewerObject* selected_objectp = selection->getFirstRootObject(); - if (selected_objectp) - { - // zoom in on object center instead of where we clicked, as we need to see the manipulator handles - gAgentCamera.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID()); - gAgentCamera.cameraZoomIn(0.666f); - gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD ); - gViewerWindow->moveCursorToCenter(); - } - } - } - - gFloaterTools->open(); /* Flawfinder: ignore */ - - LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); - gFloaterTools->setEditTool( LLToolCompTranslate::getInstance() ); - - LLViewerJoystick::getInstance()->moveObjects(true); - LLViewerJoystick::getInstance()->setNeedsReset(true); - - // Could be first use - LLFirstUse::useBuild(); + handle_object_edit(); return true; } }; +// [SL:KB] - Patch: Inventory-AttachmentEdit - Checked: 2010-08-25 (Catznip-2.2.0a) | Added: Catznip-2.1.2a +void handle_attachment_edit(const LLUUID& idItem) +{ + const LLInventoryItem* pItem = gInventory.getItem(idItem); + if ( (!isAgentAvatarValid()) || (!pItem) ) + return; + + LLViewerObject* pAttachObj = gAgentAvatarp->getWornAttachment(pItem->getLinkedUUID()); + if (!pAttachObj) + return; + + LLSelectMgr::getInstance()->deselectAll(); + LLSelectMgr::getInstance()->selectObjectAndFamily(pAttachObj); + + handle_object_edit(); +} +// [/SL:KB] + class LLObjectInspect : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -2083,8 +2077,8 @@ class LLObjectInspect : public view_listener_t // Derenderizer. Originally by Phox. class LLObjectDerender : public view_listener_t { - bool handleEvent(LLPointer event, const LLSD& userdata) - { + bool handleEvent(LLPointer event, const LLSD& userdata) + { LLViewerObject* slct = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); if(!slct)return true; @@ -2092,17 +2086,17 @@ class LLObjectDerender : public view_listener_t LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); LLUUID root_key; //delivers null in linked parts if used as getFirstRootNode() - LLSelectNode* node = selection->getFirstRootNode(NULL,TRUE); + LLSelectNode* node = selection->getFirstRootNode(NULL,TRUE); /*this works for derendering entire object if child is selected - LLSelectNode* node = selection->getFirstNode(); + LLSelectNode* node = selection->getFirstNode(); //Delivers node even when linked parts, but only first node LLViewerObject* obj = node->getObject(); LLViewerObject* parent = (LLViewerObject*)obj->getParent();*/ - if(node) + if(node) { root_key = node->getObject()->getID(); llinfos << "Derender node has key " << root_key << llendl; @@ -2111,21 +2105,23 @@ class LLObjectDerender : public view_listener_t { llinfos << "Derender node is null " << llendl; } - + LLViewerRegion* cur_region = gAgent.getRegion(); std::string entry_name; - if(slct->isAvatar()){ + if (slct->isAvatar()) + { LLNameValue* firstname = slct->getNVPair("FirstName"); LLNameValue* lastname = slct->getNVPair("LastName"); entry_name = llformat("Derendered: (AV) %s %s",firstname->getString(),lastname->getString()); } - else{ - if(root_key.isNull()) + else + { + if (root_key.isNull()) { return true; } id = root_key; - if(!node->mName.empty()) + if (!node->mName.empty()) { if(cur_region) entry_name = llformat("Derendered: %s in region %s",node->mName.c_str(),cur_region->getName().c_str()); @@ -2135,21 +2131,21 @@ class LLObjectDerender : public view_listener_t else { if(cur_region) - entry_name = llformat("Derendered: (unkown object) in region %s",cur_region->getName().c_str()); + entry_name = llformat("Derendered: (unknown object) in region %s",cur_region->getName().c_str()); else - entry_name = "Derendered: (unkown object)"; + entry_name = "Derendered: (unknown object)"; } } - LLSD indata; - indata["entry_type"] = 6; //AT_TEXTURE - indata["entry_name"] = entry_name; - indata["entry_agent"] = gAgent.getID(); - // ...don't kill the avatar - if (!(id == gAgentID)) + if (id != gAgentID) { + LLSD indata; + indata["entry_type"] = 6; //AT_TEXTURE + indata["entry_name"] = entry_name; + indata["entry_agent"] = gAgentID; + LLFloaterBlacklist::addEntry(id,indata); LLSelectMgr::getInstance()->deselectAll(); LLViewerObject *objectp = gObjectList.findObject(id); @@ -2346,42 +2342,82 @@ BOOL enable_object_build(void*) return can_build; } +bool enable_object_edit() +{ + // *HACK: The new "prelude" Help Islands have a build sandbox area, + // so users need the Edit and Create pie menu options when they are + // there. Eventually this needs to be replaced with code that only + // lets you edit objects if you have permission to do so (edit perms, + // group edit, god). See also lltoolbar.cpp. JC + bool enable = false; + if (gAgent.inPrelude()) + { + enable = LLViewerParcelMgr::getInstance()->allowAgentBuild() + || LLSelectMgr::getInstance()->getSelection()->isAttachment(); + } + else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound()) + { +// enable = true; +// [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c + bool fRlvCanEdit = (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDITOBJ)); + if (!fRlvCanEdit) + { + LLObjectSelectionHandle hSel = LLSelectMgr::getInstance()->getSelection(); + RlvSelectIsEditable f; + fRlvCanEdit = (hSel.notNull()) && ((hSel->getFirstRootNode(&f, TRUE)) == NULL); + } + enable = fRlvCanEdit; +// [/RLVa:KB] + } + + return enable; +} + class LLEnableEdit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - // *HACK: The new "prelude" Help Islands have a build sandbox area, - // so users need the Edit and Create pie menu options when they are - // there. Eventually this needs to be replaced with code that only - // lets you edit objects if you have permission to do so (edit perms, - // group edit, god). See also lltoolbar.cpp. JC - bool enable = true; - if (gAgent.inPrelude()) - { - enable = LLViewerParcelMgr::getInstance()->allowAgentBuild() - || LLSelectMgr::getInstance()->getSelection()->isAttachment(); - } -// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b) - // TODO-RLV: include fartouch here? - if ( (rlv_handler_t::isEnabled()) && (enable) ) - { - // We have no way of knowing whether we're being called for "Create" or for "Edit", but we can - // make an educated guess based on the currently active selection which puts us halfway there. - BOOL fActiveSelection = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); - - if ( (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) ) - enable = false; // Edit and rez restricted, disable them both - else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)) && (fActiveSelection) ) - enable = false; // Edit restricted and there's an active selection => disable Edit and Create - else if ( (gRlvHandler.hasBehaviour(RLV_BHVR_REZ)) && (!fActiveSelection) ) - enable = false; // Rez restricted and there's no active selection => disable Create - } -// [/RLVa:KB] - gMenuHolder->findControl(userdata["control"].asString())->setValue(enable); + gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_object_edit()); return true; } }; + +bool enable_object_select_in_pathfinding_linksets() +{ + return LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetEditableLinksets(); +} + +class LLObjectEnablePFLinksetsSelected : public view_listener_t +{ + bool handleEvent(LLPointer event, const LLSD& userdata) + { + return enable_object_select_in_pathfinding_linksets(); + } +}; + +class LLObjectPFCharactersSelected : public view_listener_t +{ + bool handleEvent(LLPointer event, const LLSD& userdata) + { + LLFloaterPathfindingCharacters::openCharactersWithSelectedObjects(); + return true; + } +}; + +bool enable_object_select_in_pathfinding_characters() +{ + return LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetViewableCharacters(); +} + +class LLObjectEnablePFCharactersSelected : public view_listener_t +{ + bool handleEvent(LLPointer event, const LLSD& userdata) + { + return enable_object_select_in_pathfinding_characters(); + } +}; + class LLSelfRemoveAllAttachments : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -2404,7 +2440,7 @@ class LLSelfEnableRemoveAllAttachments : public view_listener_t LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; // if (attachment->getNumObjects() > 0) -// [RLVa:KB] - Checked: 2010-03-04 (RLVa-1.2.0a) | Added: RLVa-1.2.0a | OK +// [RLVa:KB] - Checked: 2010-03-04 (RLVa-1.2.0a) | Added: RLVa-1.2.0a if ( (attachment->getNumObjects() > 0) && ((!rlv_handler_t::isEnabled()) || (gRlvAttachmentLocks.canDetach(attachment))) ) // [/RLVa:KB] { @@ -2447,27 +2483,36 @@ BOOL enable_has_attachments(void*) // } //} +bool enable_object_mute() +{ + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if (!object) return false; + + LLVOAvatar* avatar = find_avatar_from_object(object); + if (avatar) + { + // It's an avatar + bool is_linden = + LLMuteList::getInstance()->isLinden(avatar->getID()); + bool is_self = avatar->isSelf(); +// return !is_linden && !is_self; +// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.2.1b + return !is_linden && !is_self && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES); +// [/RLVa:KB] + } + else + { + // Just a regular object + return LLSelectMgr::getInstance()->getSelection()->contains( object, SELECT_ALL_TES ) && + !LLMuteList::getInstance()->isMuted(object->getID()); + } +} + class LLObjectEnableMute : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - bool new_value = (object != NULL); - if (new_value) - { - LLVOAvatar* avatar = find_avatar_from_object(object); - if (avatar) - { - // It's an avatar - BOOL is_linden = LLMuteList::getInstance()->isLinden(avatar->getID()); - BOOL is_self = avatar->isSelf(); - new_value = !is_linden && !is_self; -// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | OK - new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); -// [/RLVa:KB] - } - } - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); + gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_object_mute()); return true; } }; @@ -2748,41 +2793,6 @@ class LLObjectPFLinksetsSelected : public view_listener_t } }; -bool enable_object_select_in_pathfinding_linksets() -{ - return LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetEditableLinksets(); -} - -class LLObjectEnablePFLinksetsSelected : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - return enable_object_select_in_pathfinding_linksets(); - } -}; - -class LLObjectPFCharactersSelected : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterPathfindingCharacters::openCharactersWithSelectedObjects(); - return true; - } -}; - -bool enable_object_select_in_pathfinding_characters() -{ - return LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetViewableCharacters(); -} - -class LLObjectEnablePFCharactersSelected : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - return enable_object_select_in_pathfinding_characters(); - } -}; - class LLAvatarAnims : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -2959,6 +2969,58 @@ bool callback_freeze(const LLSD& notification, const LLSD& response) return false; } + +void handle_avatar_freeze(const LLSD& avatar_id) +{ + // Use avatar_id if available, otherwise default to right-click avatar + LLVOAvatar* avatar = NULL; + if (avatar_id.asUUID().notNull()) + { + avatar = find_avatar_from_object(avatar_id.asUUID()); + } + else + { + avatar = find_avatar_from_object( + LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); + } + + if( avatar ) + { + std::string fullname = avatar->getFullname(); + LLSD payload; + payload["avatar_id"] = avatar->getID(); + + if (!fullname.empty()) + { + LLSD args; +// args["AVATAR_NAME"] = fullname; +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e + args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname); +// [/RLVa:KB] + LLNotificationsUtil::add("FreezeAvatarFullname", + args, + payload, + callback_freeze); + } + else + { + LLNotificationsUtil::add("FreezeAvatar", + LLSD(), + payload, + callback_freeze); + } + } +} + +class LLAvatarFreeze : public view_listener_t +{ + bool handleEvent(LLPointer event, const LLSD& userdata) + { + handle_avatar_freeze(LLUUID::null); + return true; + } +}; + class LLScriptCount : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -3014,51 +3076,11 @@ class LLObjectEnableScriptDelete : public view_listener_t } }; -class LLAvatarFreeze : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); - if( avatar ) - { - std::string fullname = avatar->getFullname(); - LLSD payload; - payload["avatar_id"] = avatar->getID(); - - if (!fullname.empty()) - { - LLSD args; -// args["AVATAR_NAME"] = fullname; -// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e | OK - args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname); -// [/RLVa:KB] - LLNotificationsUtil::add("FreezeAvatarFullname", - args, - payload, - callback_freeze); - } - else - { - LLNotificationsUtil::add("FreezeAvatar", - LLSD(), - payload, - callback_freeze); - } - } - return true; - } -}; - class LLAvatarVisibleDebug : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - //bool new_value = gAgent.isGodlike(); -// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) - // TODO-RLVa: can you actually use this to cheat anything? - bool new_value = gAgent.isGodlike() && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); -// [/RLVa:KB] - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); + gMenuHolder->findControl(userdata["control"].asString())->setValue(gAgent.isGodlike()); return true; } }; @@ -3130,11 +3152,20 @@ bool callback_eject(const LLSD& notification, const LLSD& response) return false; } -class LLAvatarEject : public view_listener_t +void handle_avatar_eject(const LLSD& avatar_id) { - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); + // Use avatar_id if available, otherwise default to right-click avatar + LLVOAvatar* avatar = NULL; + if (avatar_id.asUUID().notNull()) + { + avatar = find_avatar_from_object(avatar_id.asUUID()); + } + else + { + avatar = find_avatar_from_object( + LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); + } + if( avatar ) { LLSD payload; @@ -3151,7 +3182,7 @@ class LLAvatarEject : public view_listener_t { LLSD args; // args["AVATAR_NAME"] = fullname; -// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e | OK +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname); // [/RLVa:KB] LLNotificationsUtil::add("EjectAvatarFullname", @@ -3174,7 +3205,7 @@ class LLAvatarEject : public view_listener_t { LLSD args; // args["AVATAR_NAME"] = fullname; -// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e | OK +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.0e args["AVATAR_NAME"] = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? fullname : RlvStrings::getAnonym(fullname); // [/RLVa:KB] LLNotificationsUtil::add("EjectAvatarFullnameNoBan", @@ -3191,6 +3222,13 @@ class LLAvatarEject : public view_listener_t } } } +} + +class LLAvatarEject : public view_listener_t +{ + bool handleEvent(LLPointer event, const LLSD& userdata) + { + handle_avatar_eject(LLUUID::null); return true; } }; @@ -3223,31 +3261,45 @@ class LLAvatarClientUUID : public view_listener_t } }; +bool enable_freeze_eject(const LLSD& avatar_id) +{ + // Use avatar_id if available, otherwise default to right-click avatar + LLVOAvatar* avatar = NULL; + if (avatar_id.asUUID().notNull()) + { + avatar = find_avatar_from_object(avatar_id.asUUID()); + } + else + { + avatar = find_avatar_from_object( + LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); + } + if (!avatar) return false; + + // Gods can always freeze + if (gAgent.isGodlike()) return true; + + // Estate owners / managers can freeze + // Parcel owners can also freeze + const LLVector3& pos = avatar->getPositionRegion(); + const LLVector3d& pos_global = avatar->getPositionGlobal(); + LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); + LLViewerRegion* region = avatar->getRegion(); + if (!region) return false; + + bool new_value = region->isOwnedSelf(pos); + if (!new_value || region->isOwnedGroup(pos)) + { + new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); + } + return new_value; +} + class LLAvatarEnableFreezeEject : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); - bool new_value = (avatar != NULL); - - if (new_value) - { - const LLVector3& pos = avatar->getPositionRegion(); - const LLVector3d& pos_global = avatar->getPositionGlobal(); - LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); - LLViewerRegion* region = avatar->getRegion(); - new_value = (region != NULL); - if (new_value) - { - new_value = region->isOwnedSelf(pos); - if (!new_value || region->isOwnedGroup(pos)) - { - new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); - } - } - } - - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); + gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_freeze_eject(LLUUID::null)); return true; } }; @@ -3506,11 +3558,7 @@ class LLSelfSitOrStand : public view_listener_t { if (gAgentAvatarp && gAgentAvatarp->isSitting()) { -// [RLVa:KB] - Alternate: Snowglobe-1.3.X | Checked: 2009-12-29 (RLVa-1.1.0k) | Added: RLVa-1.1.0k | OK - if (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) - return true; -// [/RLVa:KB] - gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); + gAgent.standUp(); } else { @@ -3523,11 +3571,26 @@ class LLSelfSitOrStand : public view_listener_t } }; +bool enable_standup_self() +{ +// [RLVa:KB] - Checked: 2010-04-01 (RLVa-1.2.0c) | Modified: RLVa-1.0.0g + return isAgentAvatarValid() && gAgentAvatarp->isSitting() && !gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT); +// [/RLVa:KB] +// return isAgentAvatarValid() && gAgentAvatarp->isSitting(); +} + +bool enable_sitdown_self() +{ +// [RLVa:KB] - Checked: 2010-08-28 (RLVa-1.2.1a) | Added: RLVa-1.2.1a + return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying() && !gRlvHandler.hasBehaviour(RLV_BHVR_SIT); +// [/RLVa:KB] +// return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying(); +} + class LLSelfEnableSitOrStand : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - bool new_value = gAgentAvatarp && !gAgent.getFlying(); // gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); std::string label; @@ -3540,25 +3603,16 @@ class LLSelfEnableSitOrStand : public view_listener_t sit_text = param.substr(0, offset); stand_text = param.substr(offset+1); } - - if (gAgentAvatarp && gAgentAvatarp->isSitting()) - { -// [RLVa:KB] - Alternate: Snowglobe-1.3.X | Checked: 2009-12-29 (RLVa-1.1.0k) | Added: RLVa-1.1.0k | OK - new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)); -// [/RLVa:KB] - label = stand_text; - } - else - { -// [RLVa:KB] - Alternate: Snowglobe-1.3.X | Checked: 2009-12-29 (RLVa-1.1.0k) | Added: RLVa-1.1.0k | OK - new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_SIT)); -// [/RLVa:KB] - label = sit_text; - } -// [RLVa:KB] - Alternate: Snowglobe-1.3.X | Checked: 2009-12-29 (RLVa-1.1.0k) | Added: RLVa-1.1.0k | OK + bool new_value = true; + if (enable_standup_self()) + label = stand_text; + else if (enable_sitdown_self()) + label = sit_text; + else + new_value = false; + gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); -// [/RLVa:KB] gMenuHolder->childSetText("Self Sit", label); gMenuHolder->childSetText("Self Sit Attachment", label); @@ -3777,12 +3831,10 @@ class LLAvatarEnableAddFriend : public view_listener_t bool handleEvent(LLPointer event, const LLSD& userdata) { LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); - bool new_value = avatar && !is_agent_friend(avatar->getID()); - -// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | OK - new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); +// bool new_value = avatar && !is_agent_friend(avatar->getID()); +// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f + bool new_value = avatar && !is_agent_friend(avatar->getID()) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); // [/RLVa:KB] - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -3836,36 +3888,54 @@ class LLEditEnableChangeDisplayname : public view_listener_t } }; +bool is_object_sittable() +{ +// [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Added: RLVa-1.1.0j + // RELEASE-RLVa: [SL-2.2.0] Make sure we're examining the same object that handle_sit_or_stand() will request a sit for + if (rlv_handler_t::isEnabled()) + { + const LLPickInfo& pick = LLToolPie::getInstance()->getPick(); + if ( (pick.mObjectID.notNull()) && (!gRlvHandler.canSit(pick.getObject(), pick.mObjectOffset)) ) + return false; + } +// [/RLVa:KB] + + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + + if (object && object->getPCode() == LL_PCODE_VOLUME) + { + return true; + } + else + { + return false; + } +} + + // only works on pie menu -bool handle_sit_or_stand() +void handle_object_sit_or_stand() { LLPickInfo pick = LLToolPie::getInstance()->getPick(); LLViewerObject *object = pick.getObject();; - // - //if (!object || pick.mPickType == LLPickInfo::PICK_FLORA) - if (!object) - // + if (!object || pick.mPickType == LLPickInfo::PICK_FLORA) { - return true; + return; } -// [RLVa:KB] - Checked: 2009-12-22 (RLVa-1.1.0k) | Modified: RLVa-1.1.0j | OK - // Block if we can't sit on the selected object (also handles sitting and prevented from standing up) - if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canSit(object, pick.mObjectOffset)) ) - { - return true; - } -// [/RLVa:KB] - if (sitting_on_selection()) { gAgent.standUp(); - return true; + return; } // get object selection offset - if (object && object->getPCode() == LL_PCODE_VOLUME) +// if (object && object->getPCode() == LL_PCODE_VOLUME) +// [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Modified: RLVa-1.2.0c + if ( (object && object->getPCode() == LL_PCODE_VOLUME) && + ((!rlv_handler_t::isEnabled()) || (gRlvHandler.canSit(object, pick.mObjectOffset))) ) +// [/RLVa:KB] { // [RLVa:KB] - Checked: 2010-08-29 (RLVa-1.2.1c) | Added: RLVa-1.2.1c if ( (gRlvHandler.hasBehaviour(RLV_BHVR_STANDTP)) && (isAgentAvatarValid()) ) @@ -3873,7 +3943,7 @@ bool handle_sit_or_stand() if (gAgentAvatarp->isSitting()) { gAgent.standUp(); - return true; + return; } gRlvHandler.setSitSource(gAgent.getPositionGlobal()); } @@ -3889,14 +3959,14 @@ bool handle_sit_or_stand() object->getRegion()->sendReliableMessage(); } - return true; } class LLObjectSitOrStand : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - return handle_sit_or_stand(); + handle_object_sit_or_stand(); + return true; } }; @@ -3916,12 +3986,12 @@ class LLLandSit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.2.1f | OK +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.2.1f if ( (rlv_handler_t::isEnabled()) && ((!gRlvHandler.canStand()) || (gRlvHandler.hasBehaviour(RLV_BHVR_SIT))) ) return true; // [/RLVa:KB] - gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); + gAgent.standUp(); LLViewerParcelMgr::getInstance()->deselectLand(); LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal; @@ -4031,15 +4101,6 @@ void velocity_interpolate( void* data ) } } - -void toggle_wind_audio(void) -{ - if (gAudiop) - { - gAudiop->enableWind(!(gAudiop->isWindEnabled())); - } -} - //------------------------------------------------------------------- // Help menu functions //------------------------------------------------------------------- @@ -4170,7 +4231,6 @@ class LLEditEnableDuplicate : public view_listener_t } }; - void handle_duplicate_in_place(void*) { llinfos << "handle_duplicate_in_place" << llendl; @@ -4535,12 +4595,12 @@ static void derez_objects( // if(!gSavedSettings.getBOOL("DisablePointAtAndBeam")) { - // + // // VEFFECT: DerezObject LLHUDEffectSpiral* effectp = (LLHUDEffectSpiral*)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); effectp->setPositionGlobal(object->getPositionGlobal()); effectp->setColor(LLColor4U(gAgent.getEffectColor())); - // + // } // } @@ -4580,6 +4640,7 @@ class LLToolsTakeCopy : public view_listener_t void handle_take_copy() { if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; + // [RLVa:KB] - Checked: 2010-03-07 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canStand()) ) { @@ -4600,10 +4661,12 @@ class LLObjectReturn : public view_listener_t { public: LLObjectReturn() : mFirstRegion(NULL) {} + +private: bool handleEvent(LLPointer event, const LLSD& userdata) { if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return true; -// [RLVa:KB] - Checked: 2010-03-24 (RLVa-1.2.0e) | Modified: RLVa-1.0.0b | OK +// [RLVa:KB] - Checked: 2010-03-24 (RLVa-1.4.0a) | Modified: RLVa-1.0.0b if ( (rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn()) ) return true; // [/RLVa:KB] @@ -4689,13 +4752,13 @@ void handle_take() // we want to use the folder this was derezzed from if it's // available. Otherwise, derez to the normal place. // if(LLSelectMgr::getInstance()->getSelection()->isEmpty()) -// [RLVa:KB] - Checked: 2010-03-24 (RLVa-1.2.0e) | Modified: RLVa-1.0.0b | OK +// [RLVa:KB] - Checked: 2010-03-24 (RLVa-1.2.0e) | Modified: RLVa-1.0.0b if ( (LLSelectMgr::getInstance()->getSelection()->isEmpty()) || ((rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn())) ) // [/RLVa:KB] { return; } - + BOOL you_own_everything = TRUE; BOOL locked_but_takeable_object = FALSE; LLUUID category_id; @@ -4767,6 +4830,9 @@ void handle_take() LLNotification::Params params("ConfirmObjectTakeLock"); params.payload(payload) + // MAINT-290 + // Reason: Showing the confirmation dialog resets object selection, thus there is nothing to derez. + // Fix: pass selection to the confirm_take, so that selection doesn't "die" after confirmation dialog is opened .functor(boost::bind(&confirm_take, _1, _2, LLSelectMgr::instance().getSelection())); if(locked_but_takeable_object || @@ -4809,7 +4875,7 @@ bool confirm_take(const LLSD& notification, const LLSD& response, LLObjectSelect BOOL enable_take() { // if (sitting_on_selection()) -// [RLVa:KB] - Checked: 2010-03-24 (RLVa-1.2.0e) | Modified: RLVa-1.0.0b | OK +// [RLVa:KB] - Checked: 2010-03-24 (RLVa-1.2.0e) | Modified: RLVa-1.0.0b if ( (sitting_on_selection()) || ((rlv_handler_t::isEnabled()) && (!rlvCanDeleteOrReturn())) ) // [/RLVa:KB] { @@ -4875,6 +4941,7 @@ void handle_buy_or_take() handle_take(); } } + class LLToolsBuyOrTake : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -4884,7 +4951,6 @@ class LLToolsBuyOrTake : public view_listener_t } }; - bool visible_take_object() { return !is_selection_buy_not_take() && enable_take(); @@ -5352,7 +5418,6 @@ class LLToolsReleaseKeys : public view_listener_t // [/RLVa:KB] gAgent.forceReleaseControls(); - return true; } }; @@ -5361,11 +5426,11 @@ class LLToolsEnableReleaseKeys : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f) | Modified: RLVa-1.0.5a | OK - gMenuHolder->findControl(userdata["control"].asString())->setValue( - gAgent.anyControlGrabbed() && ((!rlv_handler_t::isEnabled()) || (!gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE))) ); +// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f) | Modified: RLVa-1.0.5a + gMenuHolder->findControl(userdata["control"].asString())->setValue(gAgent.anyControlGrabbed() && + ( (!rlv_handler_t::isEnabled()) || (!gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) )); // [/RLVa:KB] - //gMenuHolder->findControl(userdata["control"].asString())->setValue( gAgent.anyControlGrabbed() ); +// gMenuHolder->findControl(userdata["control"].asString())->setValue(gAgent.anyControlGrabbed()); return true; } }; @@ -5762,7 +5827,7 @@ void show_debug_menus() if ( gMenuBarView ) { BOOL debug = gSavedSettings.getBOOL("UseDebugMenus"); - + if(debug) { LLFirstUse::useDebugMenus(); @@ -5828,6 +5893,7 @@ void toggle_debug_menus(void*) // gExportDialog = LLUploadDialog::modalUploadDialog("Exporting selected objects..."); // } +// BOOL menu_check_build_tool( void* user_data ) { @@ -5976,11 +6042,9 @@ class LLWorldCreateLandmark : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Added: RLVa-1.0.0a | OK +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.4.5) | Added: RLVa-1.0.0 if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) - { return true; - } // [/RLVa:KB] LLViewerRegion* agent_region = gAgent.getRegion(); @@ -6093,15 +6157,11 @@ class LLAvatarInviteToGroup : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | OK - if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) - { - return true; - } -// [/RLVa:KB] - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); - if(avatar) +// if(avatar) +// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.0d) | Added: RLVa-1.2.0d + if ( (avatar) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ) +// [/RLVa:KB] { invite_to_group(avatar->getID()); } @@ -6113,15 +6173,11 @@ class LLAvatarAddFriend : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | OK - if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) - { - return true; // Fallback code [see LLAvatarEnableAddFriend::handleEvent()] - } -// [/RLVa:KB] - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); - if(avatar && !is_agent_friend(avatar->getID())) +// if(avatar && !is_agent_friend(avatar->getID())) +// [RLVa:KB] - Checked: 2010-04-20 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f + if ( (avatar && !is_agent_friend(avatar->getID())) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ) +// [/RLVa:KB] { request_friendship(avatar->getID()); } @@ -6165,7 +6221,7 @@ bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjec return false; } -bool handle_give_money_dialog() +void handle_give_money_dialog() { LLNotification::Params params("BusyModePay"); params.functor(boost::bind(complete_give_money, _1, _2, LLSelectMgr::getInstance()->getSelection())); @@ -6179,63 +6235,93 @@ bool handle_give_money_dialog() { LLNotifications::instance().forceResponse(params, 1); } - return true; } class LLPayObject : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - return handle_give_money_dialog(); - } -}; - -class LLEnablePayObject : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); - bool new_value = (avatar != NULL); - if (!new_value) - { - LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - if( object ) - { - LLViewerObject *parent = (LLViewerObject *)object->getParent(); - if((object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) - { - new_value = true; - } - } - } - -// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) - // Don't enable "Pay..." on the avatar pie menu under @shownames=n - new_value &= (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) || (avatar == NULL); -// [/RLVa:KB] - - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); + handle_give_money_dialog(); return true; } }; +bool enable_pay_avatar() +{ + LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + LLVOAvatar* avatar = find_avatar_from_object(obj); +// return (avatar != NULL); +// [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.1b) | Added: RLVa-1.2.1b + return (avatar != NULL) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); +// [/RLVa:KB] +} + +bool enable_pay_object() +{ + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if( object ) + { + LLViewerObject *parent = (LLViewerObject *)object->getParent(); + if((object->flagTakesMoney()) || (parent && parent->flagTakesMoney())) + { + return true; + } + } + return false; +} + +bool enable_object_stand_up() +{ + // 'Object Stand Up' menu item is enabled when agent is sitting on selection +// return sitting_on_selection(); +// [RLVa:KB] - Checked: 2010-07-24 (RLVa-1.2.0g) | Added: RLVa-1.2.0g + return sitting_on_selection() && ( (!rlv_handler_t::isEnabled()) || (gRlvHandler.canStand()) ); +// [/RLVa:KB] +} + +bool enable_object_sit(/*LLUICtrl* ctrl*/) +{ + // 'Object Sit' menu item is enabled when agent is not sitting on selection + bool sitting_on_sel = sitting_on_selection(); + /* + if (!sitting_on_sel) + { + std::string item_name = ctrl->getName(); + + // init default labels + init_default_item_label(item_name); + + // Update label + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); + if (node && node->mValid && !node->mSitName.empty()) + { + gMenuHolder->childSetText(item_name, node->mSitName); + } + else + { + gMenuHolder->childSetText(item_name, get_default_item_label(item_name)); + } + } + */ + +// [RLVa:KB] - Checked: 2010-04-01 (RLVa-1.2.0c) | Modified: RLVa-1.2.0c + // RELEASE-RLVA: [SL-2.2.0] Make this match what happens in handle_object_sit_or_stand() + if (rlv_handler_t::isEnabled()) + { + const LLPickInfo& pick = LLToolPie::getInstance()->getPick(); + if (pick.mObjectID.notNull()) + sitting_on_sel = !gRlvHandler.canSit(pick.getObject(), pick.mObjectOffset); + } +// [/RLVa:KB] + + return !sitting_on_sel && is_object_sittable(); +} + class LLObjectEnableSitOrStand : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - bool new_value = false; - LLViewerObject* dest_object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - - if(dest_object) - { - if(dest_object->getPCode() == LL_PCODE_VOLUME) - { - new_value = true; - } - } -// [RLVa:KB] - Checked: 2009-12-22 (RLVa-1.1.0k) | Added: RLVa-1.1.0j -// gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); -// [/RLVa:KB] + bool new_value; // Update label std::string label; @@ -6248,12 +6334,11 @@ class LLObjectEnableSitOrStand : public view_listener_t sit_text = param.substr(0, offset); stand_text = param.substr(offset+1); } + if (sitting_on_selection()) { label = stand_text; -// [RLVa:KB] - Checked: 2009-12-22 (RLVa-1.1.0k) | Added: RLVa-1.1.0j - new_value &= !gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT); -// [/RLVa:KB] + new_value = enable_object_stand_up(); } else { @@ -6266,27 +6351,24 @@ class LLObjectEnableSitOrStand : public view_listener_t { label = sit_text; } -// [RLVa:KB] - Checked: 2009-12-22 (RLVa-1.1.0k) | Added: RLVa-1.1.0j - if ( (rlv_handler_t::isEnabled()) && (new_value) ) - { - // RELEASE-RLVa: [2009-12-22] make sure we examine the same object that handle_sit_or_stand() will request a sit for - const LLPickInfo& pick = LLToolPie::getInstance()->getPick(); - if (pick.mObjectID.notNull()) - { - new_value = gRlvHandler.canSit(pick.getObject(), pick.mObjectOffset); - } - } -// [/RLVa:KB] + new_value = enable_object_sit(); } gMenuHolder->childSetText("Object Sit", label); -// [RLVa:KB] - Checked: 2009-12-22 (RLVa-1.1.0k) | Added: RLVa-1.1.0j gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); -// [/RLVa:KB] return true; } }; +class LLEnablePayObject : public view_listener_t +{ + bool handleEvent(LLPointer event, const LLSD& userdata) + { + gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_pay_avatar() || enable_pay_object()); + return true; + } +}; + void edit_ui(void*) { LLFloater::setEditModeEnabled(!LLFloater::getEditModeEnabled()); @@ -6302,6 +6384,7 @@ void dump_inventory(void*) gInventory.dumpInventory(); } + void handle_dump_followcam(void*) { LLFollowCamMgr::dump(); @@ -6605,6 +6688,7 @@ class LLFloaterVisible : public view_listener_t } }; + bool callback_show_url(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); @@ -6720,6 +6804,7 @@ class LLShowAgentGroups : public view_listener_t return true; } }; + class LLLandEdit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -6778,7 +6863,6 @@ BOOL enable_buy_land(void*) } - class LLObjectAttachToAvatar : public view_listener_t { public: @@ -6797,7 +6881,7 @@ private: if (index > 0) attachment_point = get_if_there(gAgentAvatarp->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL); -// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.2.1f | OK +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.2.1f // RELEASE-RLVa: [SL-2.2.0] If 'index != 0' then the object will be "add attached" [see LLSelectMgr::sendAttach()] if ( (rlv_handler_t::isEnabled()) && ( ((!index) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY))) || // Can't wear on default @@ -6953,7 +7037,7 @@ class LLAttachmentDrop : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0e) | Modified: RLVa-1.0.5 | OK +// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0e) | Modified: RLVa-1.0.5 if (rlv_handler_t::isEnabled()) { if (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) @@ -7066,7 +7150,6 @@ void detach_label(std::string& label, void* user_data) } } - class LLAttachmentDetach : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -7103,7 +7186,7 @@ class LLAttachmentDetach : public view_listener_t return true; } -// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0a) | Modified: RLVa-1.0.5 | OK +// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0a) | Modified: RLVa-1.0.5 // NOTE: copy/paste of the code in enable_detach() if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) ) { @@ -7189,9 +7272,9 @@ class LLAttachmentEnableDrop : public view_listener_t } //now check to make sure that the item is actually in the inventory before we enable dropping it -// bool new_value = enable_detach(NULL) && can_build && item; -// [RLVa:KB] - Checked: 2009-07-05 (RLVa-1.0.0b) - bool new_value = enable_detach(NULL) && can_build && item && (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ)); +// bool new_value = enable_detach() && can_build && item; +// [RLVa:KB] - Checked: 2010-03-24 (RLVa-1.0.0b) | Modified: RLVa-1.0.0b + bool new_value = enable_detach() && can_build && item && (!gRlvHandler.hasBehaviour(RLV_BHVR_REZ)); // [/RLVa:KB] gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); @@ -7199,7 +7282,7 @@ class LLAttachmentEnableDrop : public view_listener_t } }; -BOOL enable_detach(void*) +BOOL enable_detach(const LLSD&) { LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); if (!object || @@ -7215,7 +7298,7 @@ BOOL enable_detach(void*) // ...if it's you, good to detach if (avatar->getID() == gAgent.getID()) { -// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0a) | Modified: RLVa-1.0.5 | OK +// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0a) | Modified: RLVa-1.0.5 // NOTE: this code is reused as-is in LLAttachmentDetach::handleEvent() and LLAttachmentDrop::handleEvent() // so any changes here should be reflected there as well @@ -7242,7 +7325,7 @@ class LLAttachmentEnableDetach : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - bool new_value = enable_detach(NULL); + bool new_value = enable_detach(); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -7256,6 +7339,7 @@ BOOL object_selected_and_point_valid(void *user_data) { if (!isAgentAvatarValid()) return FALSE; + // RELEASE-RLVa: look at the caller graph for this function on every new release // -> 1.22.11 and 1.23.4 // - object_is_wearable() => dead code [user_data == NULL => default attach point => OK!] @@ -7272,7 +7356,6 @@ BOOL object_selected_and_point_valid(void *user_data) } // [/RLVa:KB] - //LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); for (LLObjectSelection::root_iterator iter = selection->root_begin(); iter != selection->root_end(); iter++) @@ -7300,6 +7383,8 @@ BOOL object_selected_and_point_valid(void *user_data) } +// [RLVa:KB] - Checked: 2010-03-16 (RLVa-1.2.0a) | Added: RLVa-1.2.0a +/* BOOL object_is_wearable() { if (!object_selected_and_point_valid(NULL)) @@ -7322,6 +7407,8 @@ BOOL object_is_wearable() } return FALSE; } +*/ +// [/RLVa:KB] // Also for seeing if object can be attached. See above. @@ -7443,7 +7530,7 @@ class LLToolsSelectedScriptAction : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f) | Modified: RLVa-1.0.5a | OK +// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f) | Modified: RLVa-1.0.5a // We'll allow resetting the scripts of objects on a non-attachable attach point since they wouldn't be able to circumvent anything if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) ) { @@ -7570,7 +7657,7 @@ void handle_dump_image_list(void*) void handle_test_male(void*) { -// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a | OK +// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a // TODO-RLVa: [RLVa-1.2.1] Is there any reason to still block this? if ( (rlv_handler_t::isEnabled()) && ((gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) || (gRlvWearableLocks.hasLockedWearableType(RLV_LOCK_ANY))) ) @@ -7585,7 +7672,7 @@ void handle_test_male(void*) void handle_test_female(void*) { -// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a | OK +// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a // TODO-RLVa: [RLVa-1.2.1] Is there any reason to still block this? if ( (rlv_handler_t::isEnabled()) && ((gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) || (gRlvWearableLocks.hasLockedWearableType(RLV_LOCK_ANY))) ) @@ -7751,7 +7838,7 @@ BOOL enable_more_than_one_selected(void* ) static bool is_editable_selected() { -// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.5a | OK +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.5a // RELEASE-RLVa: [SL-2.2.0] Check that this still isn't called by anything but script actions in the Build menu if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) ) { @@ -8041,21 +8128,15 @@ class LLWorldEnableTeleportHome : public view_listener_t LLViewerRegion* regionp = gAgent.getRegion(); bool agent_on_prelude = (regionp && regionp->isPrelude()); bool enable_teleport_home = gAgent.isGodlike() || !agent_on_prelude; -// [RLVa:KB] - Checked: 2009-12-22 (RLVa-1.1.0k) | Added: RLVa-1.1.0j - enable_teleport_home &= !gRlvHandler.hasBehaviour(RLV_BHVR_TPLM); +// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.2.1f + enable_teleport_home &= + (!rlv_handler_t::isEnabled()) || ((!gRlvHandler.hasBehaviour(RLV_BHVR_TPLM)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC))); // [/RLVa:KB] gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_teleport_home); return true; } }; -BOOL enable_region_owner(void*) -{ - if(gAgent.getRegion() && gAgent.getRegion()->getOwner() == gAgent.getID()) - return TRUE; - return enable_god_customer_service(NULL); -} - BOOL enable_god_full(void*) { return gAgent.getGodLevel() >= GOD_FULL; @@ -8066,20 +8147,17 @@ BOOL enable_god_liaison(void*) return gAgent.getGodLevel() >= GOD_LIAISON; } -BOOL enable_god_customer_service(void*) +BOOL is_god_customer_service(void*) { return gAgent.getGodLevel() >= GOD_CUSTOMER_SERVICE; } BOOL enable_god_basic(void*) { -// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) - // RELEASE-RLVa: check that this function isn't used for anything other than to enable/disable showing the "God Tools..." floater - return (gAgent.getGodLevel() > GOD_NOT) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)); -// [/RLVa:KB] - //return gAgent.getGodLevel() > GOD_NOT; + return gAgent.getGodLevel() > GOD_NOT; } + void toggle_show_xui_names(void *) { gSavedSettings.setBOOL("ShowXUINames", !gSavedSettings.getBOOL("ShowXUINames")); @@ -8205,10 +8283,8 @@ void slow_mo_animations(void*) void handle_dump_avatar_local_textures(void*) { - if( isAgentAvatarValid() ) - { - gAgentAvatarp->dumpLocalTextures(); - } + if (!isAgentAvatarValid()) return; + gAgentAvatarp->dumpLocalTextures(); } void handle_debug_avatar_textures(void*) @@ -8730,14 +8806,22 @@ LLViewerMenuHolderGL::LLViewerMenuHolderGL() BOOL LLViewerMenuHolderGL::hideMenus() { - BOOL handled = LLMenuHolderGL::hideMenus(); + BOOL handled = FALSE; + + if (LLMenuHolderGL::hideMenus()) + { + handled = TRUE; + } // drop pie menu selection mParcelSelection = NULL; mObjectSelection = NULL; - gMenuBarView->clearHoverItem(); - gMenuBarView->resetMenuTrigger(); + if (gMenuBarView) + { + gMenuBarView->clearHoverItem(); + gMenuBarView->resetMenuTrigger(); + } return handled; } @@ -8936,7 +9020,7 @@ class LLViewShowHUDAttachments : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.1a) | Modified: RLVa-1.0.0c | OK +// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.1a) | Modified: RLVa-1.0.0c if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedHUD()) && (LLPipeline::sShowHUDAttachments) ) return true; // [/RLVa:KB] @@ -8964,13 +9048,15 @@ class LLEditEnableTakeOff : public view_listener_t std::string control_name = userdata["control"].asString(); std::string clothing = userdata["data"].asString(); LLWearableType::EType type = LLWearableType::typeNameToType(clothing); - if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT) -// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.1.3b) | Modified: RLVa-1.1.3b | OK - if ( !(rlv_handler_t::isEnabled()) || (gRlvWearableLocks.canRemove(type)) ) +// if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT) +// [RLVa:KB] - Checked: 2010-03-20 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a + // NOTE: see below - enable if there is at least one wearable on this type that can be removed + if ( (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT) && + ((!rlv_handler_t::isEnabled()) || (gRlvWearableLocks.canRemove(type))) ) // [/RLVa:KB] - - new_value = LLAgentWearables::selfHasWearable(type); - + { + new_value = LLAgentWearables::selfHasWearable(type); + } gMenuHolder->findControl(control_name)->setValue(new_value); return false; } @@ -9007,6 +9093,7 @@ class LLEditTakeOff : public view_listener_t return true; // No wearable found that can be removed } // [/RLVa:KB] + LLUUID item_id = gAgentWearables.getWearableItemID(type,wearable_index); LLAppearanceMgr::instance().removeItemFromAvatar(item_id); } @@ -9058,7 +9145,7 @@ class LLWorldEnvSettings : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { -// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a) | Modified: RLVa-1.0.0g | OK +// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a) | Modified: RLVa-1.0.0g if (gRlvHandler.hasBehaviour(RLV_BHVR_SETENV)) return true; // [/RLVa:KB] diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index e17b242dd..265f77fd3 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -83,12 +83,12 @@ void confirm_replace_attachment(S32 option, void* user_data); void handle_detach_from_avatar(void* user_data); void attach_label(std::string& label, void* user_data); void detach_label(std::string& label, void* user_data); -BOOL object_selected_and_point_valid(void* user_data); -BOOL object_attached(void* user_data); void handle_detach(void*); +// [SL:KB] - Patch: Inventory-AttachmentEdit - Checked: 2010-08-25 (Catznip-2.2.0a) | Added: Catznip-2.1.2a +void handle_attachment_edit(const LLUUID& idItem); +// [/SL:KB] BOOL enable_god_full(void* user_data); BOOL enable_god_liaison(void* user_data); -BOOL enable_god_customer_service(void* user_data); BOOL enable_god_basic(void* user_data); void set_underclothes_menu_options(); @@ -97,7 +97,9 @@ void exchange_callingcard(const LLUUID& dest_id); void handle_gestures(void*); void handle_sit_down(void*); void handle_object_build(void*); -bool handle_object_open(); +void handle_object_touch(); +bool enable_object_open(); +void handle_object_open(); bool visible_take_object(); bool enable_object_take_copy(); @@ -112,6 +114,14 @@ void handle_look_at_selection(const LLSD& param); void handle_object_return(); void handle_object_delete(); +// Takes avatar UUID, or if no UUID passed, uses last selected object +void handle_avatar_freeze(const LLSD& avatar_id); + +// Takes avatar UUID, or if no UUID passed, uses last selected object +void handle_avatar_eject(const LLSD& avatar_id); + +bool enable_freeze_eject(const LLSD& avatar_id); + // Can anyone take a free copy of the object? // *TODO: Move to separate file bool anyone_copy_selection(LLSelectNode* nodep); @@ -124,8 +134,9 @@ void handle_save_snapshot(void *); void handle_toggle_flycam(); void handle_fake_away_status(void*); -bool handle_sit_or_stand(); -bool handle_give_money_dialog(); +void handle_object_sit_or_stand(); +void handle_give_money_dialog(); +bool enable_pay_object(); bool enable_buy_object(); bool handle_go_to(); @@ -158,19 +169,12 @@ extern LLViewerMenuHolderGL* gMenuHolder; extern LLMenuBarGL* gLoginMenuBarView; // Pie menus -extern LLPieMenu *gPieSelf; -extern LLPieMenu *gPieAvatar; -extern LLPieMenu *gPieObject; -extern LLPieMenu *gPieAttachment; -extern LLPieMenu *gPieLand; -extern LLPieMenu* gPieRate; - -// Pie menus -extern LLPieMenu *gPieSelfSimple; -extern LLPieMenu *gPieAvatarSimple; -extern LLPieMenu *gPieObjectSimple; -extern LLPieMenu *gPieAttachmentSimple; -extern LLPieMenu *gPieLandSimple; +extern LLPieMenu *gPieSelf; +extern LLPieMenu *gPieAvatar; +extern LLPieMenu *gPieObject; +extern LLPieMenu *gPieAttachment; +extern LLPieMenu *gPieLand; +extern LLPieMenu *gPieRate; // Needed to build menus when attachment site list available extern LLMenuGL* gAttachSubMenu; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 6ce7fd2e5..e8f305734 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -77,6 +77,9 @@ LLPointer gAgentAvatarp = NULL; +BOOL object_attached(void *user_data); +BOOL object_selected_and_point_valid(void *user_data); + BOOL isAgentAvatarValid() { return (gAgentAvatarp.notNull() && gAgentAvatarp->isValid() &&