diff options
author | Richard Nelson <richard@lindenlab.com> | 2007-02-17 03:02:16 +0000 |
---|---|---|
committer | Richard Nelson <richard@lindenlab.com> | 2007-02-17 03:02:16 +0000 |
commit | 73bc0fb42b5bcd80030d9f30d5cb57ec2397ba08 (patch) | |
tree | e7c0b2e22d4719123fd688e49a16b76a084c3f77 | |
parent | 12ac04231b8d358e70c830f7958f7efbc0f7c0d1 (diff) |
merge -r 56779:58057 /branches/selection_management
84 files changed, 2355 insertions, 2139 deletions
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index fd2c408fd4..0a21c3a2a7 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -10,6 +10,11 @@ #include "llmemory.h" +// not defining nullfunc will currently crash when trying to use a LLHandle +template< typename _Ty > + const typename LLHandle< _Ty >::NullFunc + LLHandle< _Ty >::sNullFunc = LLHandle< _Ty >::defaultNullFunc; + //---------------------------------------------------------------------------- //static diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 905d05254a..962a4aa5d5 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -120,6 +120,7 @@ public: } return mRef; } + S32 getNumRefs() const { return mRef; @@ -249,6 +250,154 @@ protected: Type* mPointer; }; +//template <class Type> +//class LLPointerTraits +//{ +// static Type* null(); +//}; +// +// Expands LLPointer to return a pointer to a special instance of class Type instead of NULL. +// This is useful in instances where operations on NULL pointers are semantically safe and/or +// when error checking occurs at a different granularity or in a different part of the code +// than when referencing an object via a LLHandle. +// + +template <class Type> +class LLHandle +{ +public: + LLHandle() : + mPointer(sNullFunc()) + { + ref(); + } + + LLHandle(Type* ptr) : + mPointer(nonNull(ptr)) + { + ref(); + } + + LLHandle(const LLHandle<Type>& ptr) : + mPointer(ptr.mPointer) + { + ref(); + } + + // support conversion up the type hierarchy. See Item 45 in Effective C++, 3rd Ed. + template<typename Subclass> + LLHandle(const LLPointer<Subclass>& ptr) : + mPointer(ptr.get()) + { + ref(); + } + + ~LLHandle() + { + unref(); + } + + Type* get() const { return mPointer; } + const Type* operator->() const { return mPointer; } + Type* operator->() { return mPointer; } + const Type& operator*() const { return *mPointer; } + Type& operator*() { return *mPointer; } + + operator BOOL() const { return (mPointer != sNullFunc()); } + operator bool() const { return (mPointer != sNullFunc()); } + bool operator!() const { return (mPointer == sNullFunc()); } + bool isNull() const { return (mPointer == sNullFunc()); } + bool notNull() const { return (mPointer != sNullFunc()); } + + + operator Type*() const { return mPointer; } + operator const Type*() const { return mPointer; } + bool operator !=(Type* ptr) const { return (mPointer != nonNull(ptr)); } + bool operator ==(Type* ptr) const { return (mPointer == nonNull(ptr)); } + bool operator ==(const LLHandle<Type>& ptr) const { return (mPointer == ptr.mPointer); } + bool operator < (const LLHandle<Type>& ptr) const { return (mPointer < ptr.mPointer); } + bool operator > (const LLHandle<Type>& ptr) const { return (mPointer > ptr.mPointer); } + + LLHandle<Type>& operator =(Type* ptr) + { + if( mPointer != ptr ) + { + unref(); + mPointer = nonNull(ptr); + ref(); + } + + return *this; + } + + LLHandle<Type>& operator =(const LLHandle<Type>& ptr) + { + if( mPointer != ptr.mPointer ) + { + unref(); + mPointer = ptr.mPointer; + ref(); + } + return *this; + } + + // support assignment up the type hierarchy. See Item 45 in Effective C++, 3rd Ed. + template<typename Subclass> + LLHandle<Type>& operator =(const LLHandle<Subclass>& ptr) + { + if( mPointer != ptr.get() ) + { + unref(); + mPointer = ptr.get(); + ref(); + } + return *this; + } + +public: + typedef Type* (*NullFunc)(); + static const NullFunc sNullFunc; + +protected: + void ref() + { + if (mPointer) + { + mPointer->ref(); + } + } + + void unref() + { + if (mPointer) + { + Type *tempp = mPointer; + mPointer = sNullFunc(); + tempp->unref(); + if (mPointer != sNullFunc()) + { + llwarns << "Unreference did assignment to non-NULL because of destructor" << llendl; + unref(); + } + } + } + + static Type* nonNull(Type* ptr) + { + return ptr == NULL ? sNullFunc() : ptr; + } + + static Type* defaultNullFunc() + { + llerrs << "No null value provided for LLHandle" << llendl; + return NULL; + } + +protected: + + Type* mPointer; +}; + // LLInitializedPointer is just a pointer with a default constructor that initializes it to NULL // NOT a smart pointer like LLPointer<> // Useful for example in std::map<int,LLInitializedPointer<LLFoo> > diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 5d4711ef10..22d898c5ce 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -527,6 +527,8 @@ void LLFloater::open() /* Flawfinder: ignore */ make_ui_sound("UISndWindowOpen"); } } + + onOpen(); } void LLFloater::close(bool app_quitting) @@ -1337,6 +1339,11 @@ void LLFloater::draw() } // virtual +void LLFloater::onOpen() +{ +} + +// virtual void LLFloater::onClose(bool app_quitting) { destroy(); diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index c1ef54ed42..a743081335 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -157,6 +157,9 @@ public: virtual void draw(); + // does nothing by default + virtual void onOpen(); + // Call destroy() to free memory, or setVisible(FALSE) to keep it // If app_quitting, you might not want to save your visibility. // Defaults to destroy(). diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 6ec0719ad5..7aaa306f05 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -385,11 +385,7 @@ void LLMenuItemGL::doIt( void ) { // close all open menus by default // if parent menu is actually visible (and we are not triggering menu item via accelerator) - // HACK: do not call hidemenus() from a pie menu item, as most pie menu operations - // assume that the thing you clicked on stays selected (parcel and/or object) after the - // pie menu is gone --RN - if (getMenu()->getWidgetType() != WIDGET_TYPE_PIE_MENU - && !getMenu()->getTornOff() + if (!getMenu()->getTornOff() && getMenu()->getVisible()) { LLMenuGL::sMenuContainer->hideMenus(); @@ -3283,7 +3279,7 @@ void LLPieMenuBranch::doIt( void ) S32 center_y; parent->localPointToScreen(rect.getWidth() / 2, rect.getHeight() / 2, ¢er_x, ¢er_y); - parent->hide(TRUE); + parent->hide(FALSE); mBranch->show( center_x, center_y, FALSE ); } @@ -3473,6 +3469,11 @@ BOOL LLPieMenu::handleMouseDown( S32 x, S32 y, MASK mask ) // to make sure it's within the item's rectangle handled = item->handleMouseDown( 0, 0, mask ); } + else if (!mRightMouseDown) + { + // call hidemenus to make sure transient selections get cleared + ((LLMenuHolderGL*)getParent())->hideMenus(); + } // always handle mouse down as mouse up will close open menus return handled; @@ -3546,6 +3547,11 @@ BOOL LLPieMenu::handleMouseUp( S32 x, S32 y, MASK mask ) hide(TRUE); } } + else if (!mRightMouseDown) + { + // call hidemenus to make sure transient selections get cleared + ((LLMenuHolderGL*)getParent())->hideMenus(); + } if (handled) { diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index ca8f2e0f6a..9d2f4fac32 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -462,17 +462,16 @@ void LLAgent::resetView(BOOL reset_camera) if (!gNoRender) { - gSelectMgr->deselectAll(); gSelectMgr->unhighlightAll(); // By popular request, keep land selection while walking around. JC // gParcelMgr->deselectLand(); + //FIXME: force deselect when walking? - RN + // gSelectMgr->deselectAll(); + // Hide all popup menus - gPieSelf->hide(FALSE); - gPieAvatar->hide(FALSE); - gPieObject->hide(FALSE); - gPieLand->hide(FALSE); + gMenuHolder->hideMenus(); } if (reset_camera && !gSavedSettings.getBOOL("FreezeTime")) @@ -1565,7 +1564,8 @@ F32 LLAgent::getCameraZoomFraction() { // 0.f -> camera zoomed all the way out // 1.f -> camera zoomed all the way in - if (gSelectMgr->getObjectCount() && gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) { // already [0,1] return mAvatarObject->mHUDTargetZoom; @@ -1612,7 +1612,9 @@ void LLAgent::setCameraZoomFraction(F32 fraction) { // 0.f -> camera zoomed all the way out // 1.f -> camera zoomed all the way in - if (gSelectMgr->getObjectCount() && gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) { mAvatarObject->mHUDTargetZoom = fraction; } @@ -1662,7 +1664,8 @@ void LLAgent::setCameraZoomFraction(F32 fraction) //----------------------------------------------------------------------------- void LLAgent::cameraOrbitAround(const F32 radians) { - if (gSelectMgr->getObjectCount() && gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) { // do nothing for hud selection } @@ -1684,7 +1687,8 @@ void LLAgent::cameraOrbitAround(const F32 radians) //----------------------------------------------------------------------------- void LLAgent::cameraOrbitOver(const F32 angle) { - if (gSelectMgr->getObjectCount() && gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) { // do nothing for hud selection } @@ -1718,7 +1722,8 @@ void LLAgent::cameraZoomIn(const F32 fraction) return; } - if (gSelectMgr->getObjectCount() && gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) { // just update hud zoom level mAvatarObject->mHUDTargetZoom /= fraction; @@ -2237,11 +2242,9 @@ void LLAgent::stopAutoPilot(BOOL user_cancel) resetAxes(mAutoPilotTargetFacing); } //NB: auto pilot can terminate for a reason other than reaching the destination - //TODO: enforce rotation constraint here as well - if (mAutoPilotFinishedCallback && - ((mAutoPilotTargetDist < mAutoPilotStopDistance) || (mAutoPilotNoProgressFrameCount > AUTOPILOT_MAX_TIME_NO_PROGRESS * gFPSClamped))) + if (mAutoPilotFinishedCallback) { - mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotTargetDist, mAutoPilotCallbackData); + mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData); } mLeaderID = LLUUID::null; @@ -2712,8 +2715,8 @@ U8 LLAgent::getRenderState() stopTyping(); } - if ((!gSelectMgr->isEmpty() && gSelectMgr->shouldShowSelection()) - || gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) )->isEditing() ) + if ((!gSelectMgr->getSelection()->isEmpty() && gSelectMgr->shouldShowSelection()) + || gToolMgr->getCurrentTool()->isEditing() ) { setRenderState(AGENT_STATE_EDITING); } @@ -2755,8 +2758,7 @@ void LLAgent::endAnimationUpdateUI() gMenuBarView->setVisible(TRUE); gStatusBar->setVisibleForMouselook(true); - gCurrentToolset = gBasicToolset; - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(gBasicToolset); // Only pop if we have pushed... if (TRUE == mViewsPushed) @@ -2804,8 +2806,7 @@ void LLAgent::endAnimationUpdateUI() { // make sure we ask to save changes - gCurrentToolset = gBasicToolset; - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(gBasicToolset); // HACK: If we're quitting, and we were in customize avatar, don't // let the mini-map go visible again. JC @@ -2842,8 +2843,7 @@ void LLAgent::endAnimationUpdateUI() // JC - Added for always chat in third person option gFocusMgr.setKeyboardFocus(NULL, NULL); - gCurrentToolset = gMouselookToolset; - gToolMgr->useSelectedTool( gMouselookToolset ); + gToolMgr->setCurrentToolset(gMouselookToolset); mViewsPushed = TRUE; @@ -2901,8 +2901,7 @@ void LLAgent::endAnimationUpdateUI() } else if (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR) { - gCurrentToolset = gFaceEditToolset; - gToolMgr->useSelectedTool( gFaceEditToolset ); + gToolMgr->setCurrentToolset(gFaceEditToolset); gFloaterMap->pushVisible(FALSE); /* @@ -3854,6 +3853,7 @@ void LLAgent::handleScrollWheel(S32 clicks) } else { + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); const F32 ROOT_ROOT_TWO = sqrt(F_SQRT2); // Block if camera is animating @@ -3862,7 +3862,7 @@ void LLAgent::handleScrollWheel(S32 clicks) return; } - if (gSelectMgr->getObjectCount() && gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD) { F32 zoom_factor = (F32)pow(0.8, -clicks); cameraZoomIn(zoom_factor); @@ -3933,9 +3933,7 @@ void LLAgent::changeCameraToMouselook(BOOL animate) // unpause avatar animation mPauseRequest = NULL; - gCurrentToolset = gMouselookToolset; - gCurrentToolset->selectFirstTool(); - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(gMouselookToolset); gSavedSettings.setBOOL("FirstPersonBtnState", FALSE); gSavedSettings.setBOOL("MouselookBtnState", TRUE); @@ -4017,9 +4015,7 @@ void LLAgent::changeCameraToFollow(BOOL animate) if (gBasicToolset) { - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectFirstTool(); - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(gBasicToolset); } if (mAvatarObject) @@ -4092,9 +4088,7 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate) { if (gBasicToolset) { - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectFirstTool(); - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(gBasicToolset); } mCameraLag.clearVec(); @@ -4157,9 +4151,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL animate) if (gFaceEditToolset) { - gCurrentToolset = gFaceEditToolset; - gCurrentToolset->selectFirstTool(); - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(gFaceEditToolset); } gSavedSettings.setBOOL("FirstPersonBtnState", FALSE); diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 0a10fa3db3..12891bd7b2 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -88,21 +88,22 @@ void LLFloaterAuction::show() void LLFloaterAuction::initialize() { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + mParcelp = gParcelMgr->getParcelSelection(); LLViewerRegion* region = gParcelMgr->getSelectionRegion(); - if(parcel && region && !parcel->getForSale()) + LLParcel* parcelp = mParcelp->getParcel(); + if(parcelp && region && !parcelp->getForSale()) { mParcelHost = region->getHost(); - mParcelID = parcel->getLocalID(); + mParcelID = parcelp->getLocalID(); - childSetText("parcel_text", parcel->getName()); + childSetText("parcel_text", parcelp->getName()); childEnable("snapshot_btn"); childEnable("ok_btn"); } else { mParcelHost.invalidate(); - if(parcel && parcel->getForSale()) + if(parcelp && parcelp->getForSale()) { childSetText("parcel_text", childGetText("already for sale")); } diff --git a/indra/newview/llfloaterauction.h b/indra/newview/llfloaterauction.h index fe5ce8f9d9..157222b501 100644 --- a/indra/newview/llfloaterauction.h +++ b/indra/newview/llfloaterauction.h @@ -20,6 +20,7 @@ // // Class which holds the functionality to start auctions. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLParcelSelection; class LLFloaterAuction : public LLFloater { @@ -45,6 +46,7 @@ private: LLTransactionID mTransactionID; LLAssetID mImageID; LLPointer<LLImageGL> mImage; + LLHandle<LLParcelSelection> mParcelp; S32 mParcelID; LLHost mParcelHost; }; diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index c4d0d6e208..eb5a3de1de 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -44,8 +44,6 @@ LLFloaterBuy::LLFloaterBuy() LLFloaterBuy::~LLFloaterBuy() { - gSelectMgr->deselectAll(); - sInstance = NULL; } @@ -61,7 +59,9 @@ void LLFloaterBuy::reset() // static void LLFloaterBuy::show(const LLSaleInfo& sale_info) { - if (gSelectMgr->getRootObjectCount() != 1) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + + if (selection->getRootObjectCount() != 1) { gViewerWindow->alertXml("BuyOneObjectOnly"); return; @@ -81,6 +81,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) sInstance->open(); /*Flawfinder: ignore*/ sInstance->setFocus(TRUE); sInstance->mSaleInfo = sale_info; + sInstance->mObjectSelection = gSelectMgr->getEditSelection(); // Always center the dialog. User can change the size, // but purchases are important and should be center screen. @@ -88,7 +89,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) // mid-session and the saved rect is off-center. sInstance->center(); - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = selection->getFirstRootNode(); if (!node) return; // Set title based on sale type @@ -162,7 +163,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) // Must do this after the floater is created, because // sometimes the inventory is already there and // the callback is called immediately. - LLViewerObject* obj = gSelectMgr->getFirstRootObject(); + LLViewerObject* obj = selection->getFirstRootObject(); sInstance->registerVOInventoryListener(obj,NULL); sInstance->requestVOInventory(); } diff --git a/indra/newview/llfloaterbuy.h b/indra/newview/llfloaterbuy.h index e90a77b7c9..fb61ccdfcc 100644 --- a/indra/newview/llfloaterbuy.h +++ b/indra/newview/llfloaterbuy.h @@ -22,6 +22,7 @@ class LLViewerObject; class LLSaleInfo; +class LLObjectSelection; class LLFloaterBuy : public LLFloater, public LLVOInventoryListener @@ -47,6 +48,7 @@ protected: private: static LLFloaterBuy* sInstance; + LLHandle<LLObjectSelection> mObjectSelection; LLSaleInfo mSaleInfo; }; diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index a09ebbfab4..155d4d6ff7 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -49,8 +49,6 @@ LLFloaterBuyContents::LLFloaterBuyContents() LLFloaterBuyContents::~LLFloaterBuyContents() { - gSelectMgr->deselectAll(); - sInstance = NULL; } @@ -58,7 +56,9 @@ LLFloaterBuyContents::~LLFloaterBuyContents() // static void LLFloaterBuyContents::show(const LLSaleInfo& sale_info) { - if (gSelectMgr->getRootObjectCount() != 1) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + + if (selection->getRootObjectCount() != 1) { gViewerWindow->alertXml("BuyContentsOneOnly"); return; @@ -77,6 +77,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info) sInstance->open(); /*Flawfinder: ignore*/ sInstance->setFocus(TRUE); + sInstance->mObjectSelection = gSelectMgr->getEditSelection(); // Always center the dialog. User can change the size, // but purchases are important and should be center screen. @@ -96,7 +97,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info) sInstance->mSaleInfo = sale_info; // Update the display - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = selection->getFirstRootNode(); if (!node) return; if(node->mPermissions->isGroupOwned()) { @@ -112,7 +113,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info) // Must do this after the floater is created, because // sometimes the inventory is already there and // the callback is called immediately. - LLViewerObject* obj = gSelectMgr->getFirstRootObject(); + LLViewerObject* obj = selection->getFirstRootObject(); sInstance->registerVOInventoryListener(obj,NULL); sInstance->requestVOInventory(); } diff --git a/indra/newview/llfloaterbuycontents.h b/indra/newview/llfloaterbuycontents.h index 1f834da668..2d6855500e 100644 --- a/indra/newview/llfloaterbuycontents.h +++ b/indra/newview/llfloaterbuycontents.h @@ -20,6 +20,7 @@ #include "llinventory.h" class LLViewerObject; +class LLObjectSelection; class LLFloaterBuyContents : public LLFloater, public LLVOInventoryListener @@ -43,6 +44,7 @@ protected: protected: static LLFloaterBuyContents* sInstance; + LLHandle<LLObjectSelection> mObjectSelection; LLSaleInfo mSaleInfo; }; diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index c3b2ae70e7..e0af892878 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -56,7 +56,7 @@ private: virtual ~LLFloaterBuyLandUI(); LLViewerRegion* mRegion; - LLParcel* mParcel; + LLParcelSelectionHandle mParcel; bool mIsClaim; bool mIsForGroup; @@ -127,7 +127,7 @@ public: static LLFloaterBuyLandUI* soleInstance(bool createIfNeeded); void setForGroup(bool is_for_group); - void setParcel(LLViewerRegion* region, LLParcel* parcel); + void setParcel(LLViewerRegion* region, LLParcelSelectionHandle parcel); void updateAgentInfo(); void updateParcelInfo(); @@ -186,7 +186,7 @@ static void cacheNameUpdateRefreshesBuyLand(const LLUUID&, // static void LLFloaterBuyLand::buyLand( - LLViewerRegion* region, LLParcel* parcel, bool is_for_group) + LLViewerRegion* region, LLParcelSelectionHandle parcel, bool is_for_group) { if(is_for_group && !gAgent.hasPowerInActiveGroup(GP_LAND_DEED)) { @@ -331,7 +331,7 @@ void LLFloaterBuyLandUI::SelectionObserver::changed() else { ui->setParcel( gParcelMgr->getSelectionRegion(), - gParcelMgr->getSelectedParcel()); + gParcelMgr->getParcelSelection()); } } } @@ -349,7 +349,8 @@ void LLFloaterBuyLandUI::updateAgentInfo() void LLFloaterBuyLandUI::updateParcelInfo() { - mParcelValid = mParcel && mRegion; + LLParcel* parcel = mParcel->getParcel(); + mParcelValid = parcel && mRegion; mParcelIsForSale = false; mParcelIsFirstLand = false; mParcelIsGroupLand = false; @@ -372,42 +373,41 @@ void LLFloaterBuyLandUI::updateParcelInfo() return; } - if (gParcelMgr->getMultipleOwners()) + if (mParcel->getMultipleOwners()) { mCannotBuyReason = childGetText("multiple_parcels_selected"); return; } + const LLUUID& parcelOwner = parcel->getOwnerID(); - const LLUUID& parcelOwner = mParcel->getOwnerID(); - - mIsClaim = mParcel->isPublic(); + mIsClaim = parcel->isPublic(); if (!mIsClaim) { - mParcelActualArea = mParcel->getArea(); - mParcelIsForSale = mParcel->getForSale(); - mParcelIsFirstLand = mParcel->getReservedForNewbie(); - mParcelIsGroupLand = mParcel->getIsGroupOwned(); - mParcelPrice = mParcelIsForSale ? mParcel->getSalePrice() : 0; + mParcelActualArea = parcel->getArea(); + mParcelIsForSale = parcel->getForSale(); + mParcelIsFirstLand = parcel->getReservedForNewbie(); + mParcelIsGroupLand = parcel->getIsGroupOwned(); + mParcelPrice = mParcelIsForSale ? parcel->getSalePrice() : 0; if (mParcelIsGroupLand) { - LLUUID group_id = mParcel->getGroupID(); + LLUUID group_id = parcel->getGroupID(); mParcelGroupContribution = gAgent.getGroupContribution(group_id); } } else { - mParcelActualArea = gParcelMgr->getClaimableArea(); + mParcelActualArea = mParcel->getClaimableArea(); mParcelIsForSale = true; - mParcelPrice = mParcelActualArea * mParcel->getClaimPricePerMeter(); + mParcelPrice = mParcelActualArea * parcel->getClaimPricePerMeter(); } mParcelBillableArea = llround(mRegion->getBillableFactor() * mParcelActualArea); mParcelSupportedObjects = llround( - mParcel->getMaxPrimCapacity() * mParcel->getParcelPrimBonus()); + parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()); // Can't have more than region max tasks, regardless of parcel // object bonus factor. LLViewerRegion* region = gParcelMgr->getSelectionRegion(); @@ -418,15 +418,16 @@ void LLFloaterBuyLandUI::updateParcelInfo() mParcelSupportedObjects, max_tasks_per_region); } - mParcelSoldWithObjects = mParcel->getSellWithObjects(); + mParcelSoldWithObjects = parcel->getSellWithObjects(); + - LLVector3 center = mParcel->getCenterpoint(); + LLVector3 center = parcel->getCenterpoint(); mParcelLocation = llformat("%s %d,%d", mRegion->getName().c_str(), (int)center[VX], (int)center[VY] ); - mParcelSnapshot = mParcel->getSnapshotID(); + mParcelSnapshot = parcel->getSnapshotID(); updateNames(); @@ -445,7 +446,7 @@ void LLFloaterBuyLandUI::updateParcelInfo() if (!mIsClaim) { - const LLUUID& authorizedBuyer = mParcel->getAuthorizedBuyerID(); + const LLUUID& authorizedBuyer = parcel->getAuthorizedBuyerID(); const LLUUID buyer = gAgent.getID(); const LLUUID newOwner = mIsForGroup ? gAgent.getGroupID() : buyer; @@ -484,7 +485,7 @@ void LLFloaterBuyLandUI::updateParcelInfo() return; } - if (gParcelMgr->hasOthersSelected()) + if (mParcel->hasOthersSelected()) { // Policy: Must not have someone else's land selected mCannotBuyReason = childGetText("not_owned_by_you"); @@ -503,7 +504,7 @@ void LLFloaterBuyLandUI::updateParcelInfo() } */ - if (mParcel->getReservedForNewbie()) + if (parcel->getReservedForNewbie()) { if (mIsForGroup) { @@ -814,7 +815,9 @@ void LLFloaterBuyLandUI::sendBuyLand() void LLFloaterBuyLandUI::updateNames() { - if (!mParcelValid) + LLParcel* parcelp = mParcel->getParcel(); + + if (!parcelp) { mParcelSellerName = ""; return; @@ -824,11 +827,11 @@ void LLFloaterBuyLandUI::updateNames() { mParcelSellerName = "Linden Lab"; } - else if (mParcel->getIsGroupOwned()) + else if (parcelp->getIsGroupOwned()) { char groupName[DB_LAST_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ - gCacheName->getGroupName(mParcel->getGroupID(), &groupName[0]); + gCacheName->getGroupName(parcelp->getGroupID(), &groupName[0]); mParcelSellerName = groupName; } else @@ -836,7 +839,7 @@ void LLFloaterBuyLandUI::updateNames() char firstName[DB_LAST_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ char lastName[DB_LAST_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ - gCacheName->getName(mParcel->getOwnerID(), firstName, lastName); + gCacheName->getName(parcelp->getOwnerID(), firstName, lastName); mParcelSellerName = llformat("%s %s", firstName, lastName); } } @@ -933,7 +936,7 @@ BOOL LLFloaterBuyLandUI::postBuild() return TRUE; } -void LLFloaterBuyLandUI::setParcel(LLViewerRegion* region, LLParcel* parcel) +void LLFloaterBuyLandUI::setParcel(LLViewerRegion* region, LLParcelSelectionHandle parcel) { if (mTransaction && mTransactionType == TransactionBuy) { diff --git a/indra/newview/llfloaterbuyland.h b/indra/newview/llfloaterbuyland.h index 22049d97a9..0a092bd01f 100644 --- a/indra/newview/llfloaterbuyland.h +++ b/indra/newview/llfloaterbuyland.h @@ -9,15 +9,15 @@ #ifndef LL_LLFLOATERBUYLAND_H #define LL_LLFLOATERBUYLAND_H -class LLParcel; class LLViewerRegion; class LLViewerTextEditor; +class LLParcelSelection; class LLFloaterBuyLand { public: static void buyLand(LLViewerRegion* region, - LLParcel* parcel, + LLHandle<LLParcelSelection> parcel, bool is_for_group); static void updateCovenantText(const std::string& string, const LLUUID& asset_id); static void updateEstateName(const std::string& name); diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 17a5cbec96..144833a3f5 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -616,7 +616,7 @@ void LLFloaterColorPicker::draw() } mPipetteBtn->setEnabled(gToolMgr != NULL); - mPipetteBtn->setToggleState(gToolMgr && gToolMgr->getCurrentTool(gKeyboard->currentMask(TRUE)) == gToolPipette); + mPipetteBtn->setToggleState(gToolMgr && gToolMgr->getCurrentTool() == gToolPipette); mApplyImmediateCheck->setEnabled(mActive && mCanApplyImmediately); mSelectBtn->setEnabled(mActive); @@ -1253,7 +1253,7 @@ void LLFloaterColorPicker::setActive(BOOL active) void LLFloaterColorPicker::stopUsingPipette() { - if (gToolMgr && gToolMgr->getCurrentTool(gKeyboard->currentMask(TRUE)) == gToolPipette) + if (gToolMgr && gToolMgr->getCurrentTool() == gToolPipette) { gToolMgr->clearTransientTool(); } diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index 7096f5dbf6..3b7a868472 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -1237,8 +1237,8 @@ void LLPanelObjectTools::onClickSetBySelection(void* data) LLPanelObjectTools* panelp = (LLPanelObjectTools*) data; if (!panelp) return; - LLSelectNode* node = gSelectMgr->getFirstRootNode(); - if (!node) node = gSelectMgr->getFirstNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); + if (!node) node = gSelectMgr->getSelection()->getFirstNode(); if (!node) return; LLString owner_name; diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index f45d22ba01..0b9d836a1a 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -25,15 +25,12 @@ LLFloaterInspect::~LLFloaterInspect(void) {
if(!gFloaterTools->getVisible())
{
- if(gToolMgr->getCurrentTool(MASK_NONE) == gToolInspect)
+ if(gToolMgr->getBaseTool() == gToolInspect)
{
select_tool(gToolNull);
}
- gSelectMgr->deselectAll();
// Switch back to basic toolset
- gCurrentToolset = gBasicToolset;
- gBasicToolset->selectFirstTool();
- gToolMgr->useSelectedTool( gBasicToolset );
+ gToolMgr->setCurrentToolset(gBasicToolset);
}
else
{
@@ -58,13 +55,16 @@ void LLFloaterInspect::show(void* ignored) LLFloaterInspect* self = new LLFloaterInspect;
self->open();
}
+
+ sInstance->mObjectSelection = gSelectMgr->getSelection();
select_tool(gToolInspect);
+ sInstance->refresh();
}
void LLFloaterInspect::onClickCreatorProfile(void* ctrl)
{
if(sInstance->mObjectList->getAllSelected().size() == 0) return;
- LLSelectNode* obj = gSelectMgr->getFirstNode();
+ LLSelectNode* obj = sInstance->mObjectSelection->getFirstNode();
LLUUID obj_id, creator_id;
obj_id = sInstance->mObjectList->getFirstSelected()->getUUID();
while(obj)
@@ -74,7 +74,7 @@ void LLFloaterInspect::onClickCreatorProfile(void* ctrl) creator_id = obj->mPermissions->getCreator();
break;
}
- obj = gSelectMgr->getNextNode();
+ obj = sInstance->mObjectSelection->getNextNode();
}
if(obj)
{
@@ -85,7 +85,7 @@ void LLFloaterInspect::onClickCreatorProfile(void* ctrl) void LLFloaterInspect::onClickOwnerProfile(void* ctrl)
{
if(sInstance->mObjectList->getAllSelected().size() == 0) return;
- LLSelectNode* obj = gSelectMgr->getFirstNode();
+ LLSelectNode* obj = sInstance->mObjectSelection->getFirstNode();
LLUUID obj_id, owner_id;
obj_id = sInstance->mObjectList->getFirstSelected()->getUUID();
while(obj)
@@ -95,7 +95,7 @@ void LLFloaterInspect::onClickOwnerProfile(void* ctrl) owner_id = obj->mPermissions->getOwner();
break;
}
- obj = gSelectMgr->getNextNode();
+ obj = sInstance->mObjectSelection->getNextNode();
}
if(obj)
{
@@ -109,7 +109,6 @@ BOOL LLFloaterInspect::postBuild() childSetAction("button owner",onClickOwnerProfile, this);
childSetAction("button creator",onClickCreatorProfile, this);
childSetCommitCallback("object_list", onSelectObject);
- refresh();
return TRUE;
}
@@ -143,7 +142,7 @@ void LLFloaterInspect::refresh() if(selected_index > -1) selected_uuid = mObjectList->getFirstSelected()->getUUID();
mObjectList->operateOnAll(LLScrollListCtrl::OP_DELETE);
//List all transient objects, then all linked objects
- LLSelectNode* obj = gSelectMgr->getFirstNode();
+ LLSelectNode* obj = mObjectSelection->getFirstNode();
LLSD row;
while(obj)
{
@@ -182,7 +181,7 @@ void LLFloaterInspect::refresh() row["columns"][3]["type"] = "text";
row["columns"][3]["value"] = time;
mObjectList->addElement(row, ADD_TOP);
- obj = gSelectMgr->getNextNode();
+ obj = mObjectSelection->getNextNode();
}
if(selected_index > -1 && mObjectList->getItemIndex(selected_uuid) == selected_index)
{
@@ -218,4 +217,4 @@ void LLFloaterInspect::draw() }
LLFloater::draw();
-}
+}
\ No newline at end of file diff --git a/indra/newview/llfloaterinspect.h b/indra/newview/llfloaterinspect.h index d43988a797..6a3f494978 100644 --- a/indra/newview/llfloaterinspect.h +++ b/indra/newview/llfloaterinspect.h @@ -14,6 +14,7 @@ #include "llfloater.h"
//class LLTool;
+class LLObjectSelection;
class LLScrollListCtrl;
class LLUICtrl;
@@ -42,6 +43,8 @@ protected: private:
// static data
static LLFloaterInspect* sInstance;
+
+ LLHandle<LLObjectSelection> mObjectSelection;
};
-#endif //LL_LLFLOATERINSPECT_H
+#endif //LL_LLFLOATERINSPECT_H
\ No newline at end of file diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 3997051782..d091b4c01f 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -94,7 +94,7 @@ static const BOOL BUY_PERSONAL_LAND = FALSE; LLFloaterLand* LLFloaterLand::sInstance = NULL; LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL; S32 LLFloaterLand::sLastTab = 0; -BOOL LLFloaterLand::sRequestReplyOnUpdate = TRUE; + LLViewHandle LLPanelLandGeneral::sBuyPassDialogHandle; // Local classes @@ -174,13 +174,11 @@ void LLFloaterLand::show() // If we've already got the parcel data, fill the // floater with it. - LLParcel *parcel = gParcelMgr->getSelectedParcel(); - if (parcel) + sInstance->mParcel = gParcelMgr->getFloatingParcelSelection(); + if (sInstance->mParcel->getParcel()) { sInstance->refresh(); } - - sRequestReplyOnUpdate = TRUE; } //static @@ -214,19 +212,6 @@ void LLFloaterLand::refreshAll() } } - -// virtual -BOOL LLFloaterLand::canClose() -{ - // canClose is checked as the first step of attempting to close - // the window, before focus is released from controls. Since we're - // closing the window and deselecting the land, we - // don't want replies to the upstream messages that get sent - // (because the reply will cause the land to be selected again). - sRequestReplyOnUpdate = FALSE; - return TRUE; -} - // virtual void LLFloaterLand::onClose(bool app_quitting) { @@ -234,10 +219,6 @@ void LLFloaterLand::onClose(bool app_quitting) delete sObserver; sObserver = NULL; - // Must do this after removing observer, otherwise - // infinite loops notifying and closing. - gParcelMgr->deselectLand(); - // Might have been showing owned objects gSelectMgr->unhighlightAll(); @@ -302,7 +283,7 @@ void LLFloaterLand::refresh() void* LLFloaterLand::createPanelLandGeneral(void* data) { LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelGeneral = new LLPanelLandGeneral(); + self->mPanelGeneral = new LLPanelLandGeneral(self->mParcel); return self->mPanelGeneral; } @@ -312,7 +293,7 @@ void* LLFloaterLand::createPanelLandGeneral(void* data) void* LLFloaterLand::createPanelLandCovenant(void* data) { LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelCovenant = new LLPanelLandCovenant(); + self->mPanelCovenant = new LLPanelLandCovenant(self->mParcel); return self->mPanelCovenant; } @@ -321,7 +302,7 @@ void* LLFloaterLand::createPanelLandCovenant(void* data) void* LLFloaterLand::createPanelLandObjects(void* data) { LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelObjects = new LLPanelLandObjects(); + self->mPanelObjects = new LLPanelLandObjects(self->mParcel); return self->mPanelObjects; } @@ -329,7 +310,7 @@ void* LLFloaterLand::createPanelLandObjects(void* data) void* LLFloaterLand::createPanelLandOptions(void* data) { LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelOptions = new LLPanelLandOptions(); + self->mPanelOptions = new LLPanelLandOptions(self->mParcel); return self->mPanelOptions; } @@ -337,7 +318,7 @@ void* LLFloaterLand::createPanelLandOptions(void* data) void* LLFloaterLand::createPanelLandMedia(void* data) { LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelMedia = new LLPanelLandMedia(); + self->mPanelMedia = new LLPanelLandMedia(self->mParcel); return self->mPanelMedia; } @@ -345,7 +326,7 @@ void* LLFloaterLand::createPanelLandMedia(void* data) void* LLFloaterLand::createPanelLandAccess(void* data) { LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelAccess = new LLPanelLandAccess(); + self->mPanelAccess = new LLPanelLandAccess(self->mParcel); return self->mPanelAccess; } @@ -353,7 +334,7 @@ void* LLFloaterLand::createPanelLandAccess(void* data) void* LLFloaterLand::createPanelLandBan(void* data) { LLFloaterLand* self = (LLFloaterLand*)data; - self->mPanelBan = new LLPanelLandBan(); + self->mPanelBan = new LLPanelLandBan(self->mParcel); return self->mPanelBan; } @@ -363,8 +344,9 @@ void* LLFloaterLand::createPanelLandBan(void* data) //--------------------------------------------------------------------------- -LLPanelLandGeneral::LLPanelLandGeneral() +LLPanelLandGeneral::LLPanelLandGeneral(LLParcelSelectionHandle& parcel) : LLPanel("land_general_panel"), + mParcel(parcel), mUncheckedSell(FALSE) { } @@ -452,9 +434,8 @@ BOOL LLPanelLandGeneral::postBuild() mBtnBuyGroupLand->setClickedCallback(onClickBuyLand, (void*)&BUY_GROUP_LAND); - static BOOL deselect_when_done = FALSE; mBtnBuyPass = LLUICtrlFactory::getButtonByName(this, "Buy Pass..."); - mBtnBuyPass->setClickedCallback(onClickBuyPass, &deselect_when_done); + mBtnBuyPass->setClickedCallback(onClickBuyPass, this); mBtnReleaseLand = LLUICtrlFactory::getButtonByName(this, "Abandon Land..."); mBtnReleaseLand->setClickedCallback(onClickRelease, NULL); @@ -479,7 +460,7 @@ void LLPanelLandGeneral::refresh() { mBtnStartAuction->setVisible(gAgent.isGodlike()); - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = mParcel->getParcel(); bool region_owner = false; LLViewerRegion* regionp = gParcelMgr->getSelectionRegion(); if(regionp && (regionp->getOwner() == gAgent.getID())) @@ -761,7 +742,7 @@ void LLPanelLandGeneral::refresh() // public void LLPanelLandGeneral::refreshNames() { - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = mParcel->getParcel(); if (!parcel) { mTextOwner->setText(""); @@ -841,7 +822,8 @@ void LLPanelLandGeneral::onClickSetGroup(void* userdata) // static void LLPanelLandGeneral::onClickProfile(void* data) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; + LLParcel* parcel = panelp->mParcel->getParcel(); if (!parcel) return; if (parcel->getIsGroupOwned()) @@ -866,7 +848,7 @@ void LLPanelLandGeneral::cbGroupID(LLUUID group_id, void* userdata) // public void LLPanelLandGeneral::setGroup(const LLUUID& group_id) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = mParcel->getParcel(); if (!parcel) return; // Set parcel properties and send message @@ -875,7 +857,7 @@ void LLPanelLandGeneral::setGroup(const LLUUID& group_id) //mTextGroup->setText(group_name); // Send update - gParcelMgr->sendParcelPropertiesUpdate(parcel, LLFloaterLand::sRequestReplyOnUpdate); + gParcelMgr->sendParcelPropertiesUpdate(parcel); // Update UI refresh(); @@ -888,16 +870,17 @@ void LLPanelLandGeneral::onClickBuyLand(void* data) gParcelMgr->startBuyLand(*for_group); } -BOOL LLPanelLandGeneral::enableDeedToGroup(void*) +BOOL LLPanelLandGeneral::enableDeedToGroup(void* data) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; + LLParcel* parcel = panelp->mParcel->getParcel(); return (parcel != NULL) && (parcel->getParcelFlag(PF_ALLOW_DEED_TO_GROUP)); } // static void LLPanelLandGeneral::onClickDeed(void*) { - //LLParcel* parcel = gParcelMgr->getSelectedParcel(); + //LLParcel* parcel = mParcel->getParcel(); //if (parcel) //{ gParcelMgr->startDeedLandToGroup(); @@ -918,17 +901,20 @@ void LLPanelLandGeneral::onClickReclaim(void*) } // static -BOOL LLPanelLandGeneral::enableBuyPass(void*) +BOOL LLPanelLandGeneral::enableBuyPass(void* data) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; + LLParcel* parcel = panelp != NULL ? panelp->mParcel->getParcel() : gParcelMgr->getParcelSelection()->getParcel(); return (parcel != NULL) && (parcel->getParcelFlag(PF_USE_PASS_LIST) && !gParcelMgr->isCollisionBanned()); } // static -void LLPanelLandGeneral::onClickBuyPass(void* deselect_when_done) +void LLPanelLandGeneral::onClickBuyPass(void* data) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; + LLParcel* parcel = panelp != NULL ? panelp->mParcel->getParcel() : gParcelMgr->getParcelSelection()->getParcel(); + if (!parcel) return; S32 pass_price = parcel->getPassPrice(); @@ -944,13 +930,14 @@ void LLPanelLandGeneral::onClickBuyPass(void* deselect_when_done) args["[PARCEL_NAME]"] = parcel_name; args["[TIME]"] = time; - sBuyPassDialogHandle = gViewerWindow->alertXml("LandBuyPass", args, cbBuyPass, deselect_when_done)->getHandle(); + sBuyPassDialogHandle = gViewerWindow->alertXml("LandBuyPass", args, cbBuyPass)->getHandle(); } // static -void LLPanelLandGeneral::onClickStartAuction(void*) +void LLPanelLandGeneral::onClickStartAuction(void* data) { - LLParcel* parcelp = gParcelMgr->getSelectedParcel(); + LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; + LLParcel* parcelp = panelp->mParcel->getParcel(); if(parcelp) { if(parcelp->getForSale()) @@ -967,18 +954,11 @@ void LLPanelLandGeneral::onClickStartAuction(void*) // static void LLPanelLandGeneral::cbBuyPass(S32 option, void* data) { - BOOL deselect_when_done = (BOOL)(intptr_t)data; - if (0 == option) { // User clicked OK gParcelMgr->buyPass(); } - - if (deselect_when_done) - { - gParcelMgr->deselectLand(); - } } //static @@ -992,7 +972,7 @@ void LLPanelLandGeneral::onCommitAny(LLUICtrl *ctrl, void *userdata) { LLPanelLandGeneral *panelp = (LLPanelLandGeneral *)userdata; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = panelp->mParcel->getParcel(); if (!parcel) { return; @@ -1015,7 +995,7 @@ void LLPanelLandGeneral::onCommitAny(LLUICtrl *ctrl, void *userdata) parcel->setContributeWithDeed(contribute_with_deed); // Send update to server - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); // Might have changed properties, so let's redraw! panelp->refresh(); @@ -1030,20 +1010,21 @@ void LLPanelLandGeneral::onClickSellLand(void* data) // static void LLPanelLandGeneral::onClickStopSellLand(void* data) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandGeneral* panelp = (LLPanelLandGeneral*)data; + LLParcel* parcel = panelp->mParcel->getParcel(); parcel->setParcelFlag(PF_FOR_SALE, FALSE); parcel->setSalePrice(0); parcel->setAuthorizedBuyerID(LLUUID::null); - gParcelMgr->sendParcelPropertiesUpdate(parcel, LLFloaterLand::sRequestReplyOnUpdate); + gParcelMgr->sendParcelPropertiesUpdate(parcel); } //--------------------------------------------------------------------------- // LLPanelLandObjects //--------------------------------------------------------------------------- -LLPanelLandObjects::LLPanelLandObjects() -: LLPanel("land_objects_panel") +LLPanelLandObjects::LLPanelLandObjects(LLParcelSelectionHandle& parcel) +: LLPanel("land_objects_panel"), mParcel(parcel) { } @@ -1211,7 +1192,7 @@ void LLPanelLandObjects::onDoubleClickOwner(void *userdata) // public void LLPanelLandObjects::refresh() { - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = mParcel->getParcel(); mBtnShowOwnerObjects->setEnabled(FALSE); mBtnShowGroupObjects->setEnabled(FALSE); @@ -1406,7 +1387,7 @@ void send_return_objects_message(S32 parcel_local_id, S32 return_type, void LLPanelLandObjects::callbackReturnOwnerObjects(S32 option, void* userdata) { LLPanelLandObjects *lop = (LLPanelLandObjects *)userdata; - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = lop->mParcel->getParcel(); if (0 == option) { if (parcel) @@ -1431,7 +1412,7 @@ void LLPanelLandObjects::callbackReturnOwnerObjects(S32 option, void* userdata) } gSelectMgr->unhighlightAll(); - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); lop->refresh(); } @@ -1439,7 +1420,7 @@ void LLPanelLandObjects::callbackReturnOwnerObjects(S32 option, void* userdata) void LLPanelLandObjects::callbackReturnGroupObjects(S32 option, void* userdata) { LLPanelLandObjects *lop = (LLPanelLandObjects *)userdata; - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = lop->mParcel->getParcel(); if (0 == option) { if (parcel) @@ -1453,7 +1434,7 @@ void LLPanelLandObjects::callbackReturnGroupObjects(S32 option, void* userdata) } } gSelectMgr->unhighlightAll(); - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); lop->refresh(); } @@ -1461,7 +1442,7 @@ void LLPanelLandObjects::callbackReturnGroupObjects(S32 option, void* userdata) void LLPanelLandObjects::callbackReturnOtherObjects(S32 option, void* userdata) { LLPanelLandObjects *lop = (LLPanelLandObjects *)userdata; - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = lop->mParcel->getParcel(); if (0 == option) { if (parcel) @@ -1471,7 +1452,7 @@ void LLPanelLandObjects::callbackReturnOtherObjects(S32 option, void* userdata) } } gSelectMgr->unhighlightAll(); - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); lop->refresh(); } @@ -1479,7 +1460,7 @@ void LLPanelLandObjects::callbackReturnOtherObjects(S32 option, void* userdata) void LLPanelLandObjects::callbackReturnOwnerList(S32 option, void* userdata) { LLPanelLandObjects *self = (LLPanelLandObjects *)userdata; - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = self->mParcel->getParcel(); if (0 == option) { if (parcel) @@ -1506,7 +1487,7 @@ void LLPanelLandObjects::callbackReturnOwnerList(S32 option, void* userdata) } } gSelectMgr->unhighlightAll(); - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); self->refresh(); } @@ -1524,7 +1505,7 @@ void LLPanelLandObjects::onClickReturnOwnerList(void* userdata) gParcelMgr->getPrimInfo(sw_max, sw_total, max, total, owned, group, other, selected, parcel_object_bonus, other_time); - LLParcel* parcelp = gParcelMgr->getSelectedParcel(); + LLParcel* parcelp = self->mParcel->getParcel(); if (!parcelp) return; // Make sure we have something selected. @@ -1558,7 +1539,7 @@ void LLPanelLandObjects::onClickRefresh(void* userdata) LLMessageSystem *msg = gMessageSystem; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) return; LLViewerRegion* region = gParcelMgr->getSelectionRegion(); @@ -1711,7 +1692,7 @@ void LLPanelLandObjects::onCommitList(LLUICtrl* ctrl, void* data) self->mBtnReturnOwnerList->setEnabled(TRUE); // Highlight this user's objects - clickShowCore(RT_LIST, &(self->mSelectedOwners)); + clickShowCore(self, RT_LIST, &(self->mSelectedOwners)); } } @@ -1738,30 +1719,30 @@ void LLPanelLandObjects::onClickName(void* userdata) } // static -void LLPanelLandObjects::clickShowCore(S32 return_type, uuid_list_t* list) +void LLPanelLandObjects::clickShowCore(LLPanelLandObjects* self, S32 return_type, uuid_list_t* list) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) return; send_parcel_select_objects(parcel->getLocalID(), return_type, list); } // static -void LLPanelLandObjects::onClickShowOwnerObjects(void*) +void LLPanelLandObjects::onClickShowOwnerObjects(void* userdata) { - clickShowCore(RT_OWNER); + clickShowCore((LLPanelLandObjects*)userdata, RT_OWNER); } // static -void LLPanelLandObjects::onClickShowGroupObjects(void*) +void LLPanelLandObjects::onClickShowGroupObjects(void* userdata) { - clickShowCore(RT_GROUP); + clickShowCore((LLPanelLandObjects*)userdata, (RT_GROUP)); } // static -void LLPanelLandObjects::onClickShowOtherObjects(void*) +void LLPanelLandObjects::onClickShowOtherObjects(void* userdata) { - clickShowCore(RT_OTHER); + clickShowCore((LLPanelLandObjects*)userdata, RT_OTHER); } // static @@ -1775,7 +1756,8 @@ void LLPanelLandObjects::onClickReturnOwnerObjects(void* userdata) gParcelMgr->getPrimInfo(sw_max, sw_total, max, total, owned, group, other, selected, parcel_object_bonus, other_time); - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata; + LLParcel* parcel = panelp->mParcel->getParcel(); if (!parcel) return; send_parcel_select_objects(parcel->getLocalID(), RT_OWNER); @@ -1813,7 +1795,8 @@ void LLPanelLandObjects::onClickReturnGroupObjects(void* userdata) gParcelMgr->getPrimInfo(sw_max, sw_total, max, total, owned, group, other, selected, parcel_object_bonus, other_time); - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata; + LLParcel* parcel = panelp->mParcel->getParcel(); if (!parcel) return; send_parcel_select_objects(parcel->getLocalID(), RT_GROUP); @@ -1840,7 +1823,8 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata) gParcelMgr->getPrimInfo(sw_max, sw_total, max, total, owned, group, other, selected, parcel_object_bonus, other_time); - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLPanelLandObjects* panelp = (LLPanelLandObjects*)userdata; + LLParcel* parcel = panelp->mParcel->getParcel(); if (!parcel) return; send_parcel_select_objects(parcel->getLocalID(), RT_OTHER); @@ -1884,7 +1868,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata) void LLPanelLandObjects::onLostFocus(LLLineEditor *caller, void* user_data) { LLPanelLandObjects *lop = (LLPanelLandObjects *)user_data; - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = lop->mParcel->getParcel(); if (parcel) { lop->mOtherTime = atoi(lop->mCleanOtherObjectsTime->getText().c_str()); @@ -1899,7 +1883,7 @@ void LLPanelLandObjects::onLostFocus(LLLineEditor *caller, void* user_data) // LLPanelLandOptions //--------------------------------------------------------------------------- -LLPanelLandOptions::LLPanelLandOptions() +LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel) : LLPanel("land_options_panel"), mCheckEditObjects(NULL), mCheckEditGroupObjects(NULL), @@ -1921,7 +1905,8 @@ LLPanelLandOptions::LLPanelLandOptions() mAllowPublishCtrl(NULL), mMatureCtrl(NULL), mPushRestrictionCtrl(NULL), - mPublishHelpButton(NULL) + mPublishHelpButton(NULL), + mParcel(parcel) { } @@ -2054,7 +2039,7 @@ LLPanelLandOptions::~LLPanelLandOptions() // public void LLPanelLandOptions::refresh() { - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = mParcel->getParcel(); if (!parcel) { @@ -2225,7 +2210,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata) { LLPanelLandOptions *self = (LLPanelLandOptions *)userdata; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) { return; @@ -2279,7 +2264,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata) parcel->setSnapshotID(snapshot_id); // Send current parcel data upstream to server - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); // Might have changed properties, so let's redraw! self->refresh(); @@ -2291,7 +2276,7 @@ void LLPanelLandOptions::onClickSet(void* userdata) { LLPanelLandOptions* self = (LLPanelLandOptions*)userdata; - LLParcel* selected_parcel = gParcelMgr->getSelectedParcel(); + LLParcel* selected_parcel = self->mParcel->getParcel(); if (!selected_parcel) return; LLParcel* agent_parcel = gParcelMgr->getAgentParcel(); @@ -2307,7 +2292,7 @@ void LLPanelLandOptions::onClickSet(void* userdata) selected_parcel->setUserLocation(pos_region); selected_parcel->setUserLookAt(gAgent.getFrameAgent().getAtAxis()); - gParcelMgr->sendParcelPropertiesUpdate(selected_parcel, LLFloaterLand::sRequestReplyOnUpdate); + gParcelMgr->sendParcelPropertiesUpdate(selected_parcel); self->refresh(); } @@ -2316,7 +2301,7 @@ void LLPanelLandOptions::onClickClear(void* userdata) { LLPanelLandOptions* self = (LLPanelLandOptions*)userdata; - LLParcel* selected_parcel = gParcelMgr->getSelectedParcel(); + LLParcel* selected_parcel = self->mParcel->getParcel(); if (!selected_parcel) return; // yes, this magic number of 0,0,0 means that it is clear @@ -2324,7 +2309,7 @@ void LLPanelLandOptions::onClickClear(void* userdata) selected_parcel->setUserLocation(zero_vec); selected_parcel->setUserLookAt(zero_vec); - gParcelMgr->sendParcelPropertiesUpdate(selected_parcel, LLFloaterLand::sRequestReplyOnUpdate); + gParcelMgr->sendParcelPropertiesUpdate(selected_parcel); self->refresh(); } @@ -2339,8 +2324,8 @@ void LLPanelLandOptions::onClickPublishHelp(void*) // LLPanelLandMedia //--------------------------------------------------------------------------- -LLPanelLandMedia::LLPanelLandMedia() -: LLPanel("land_media_panel") +LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel) +: LLPanel("land_media_panel"), mParcel(parcel) { } @@ -2382,7 +2367,7 @@ LLPanelLandMedia::~LLPanelLandMedia() // public void LLPanelLandMedia::refresh() { - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = mParcel->getParcel(); if (!parcel) { @@ -2467,7 +2452,7 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl *ctrl, void *userdata) { LLPanelLandMedia *self = (LLPanelLandMedia *)userdata; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) { return; @@ -2488,7 +2473,7 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl *ctrl, void *userdata) parcel->setMediaAutoScale ( media_auto_scale ); // Send current parcel data upstream to server - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); // Might have changed properties, so let's redraw! self->refresh(); @@ -2512,8 +2497,8 @@ void LLPanelLandMedia::onClickStartMedia ( void* data ) // LLPanelLandAccess //--------------------------------------------------------------------------- -LLPanelLandAccess::LLPanelLandAccess() -: LLPanel("land_access_panel") +LLPanelLandAccess::LLPanelLandAccess(LLParcelSelectionHandle& parcel) +: LLPanel("land_access_panel"), mParcel(parcel) { } @@ -2555,13 +2540,14 @@ BOOL LLPanelLandAccess::postBuild() LLPanelLandAccess::~LLPanelLandAccess() -{ } +{ +} void LLPanelLandAccess::refresh() { mListAccess->deleteAllItems(); - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = mParcel->getParcel(); if (parcel) { @@ -2667,7 +2653,7 @@ void LLPanelLandAccess::refresh() // public void LLPanelLandAccess::refreshNames() { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = mParcel->getParcel(); char group_name[DB_GROUP_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ group_name[0] = '\0'; if(parcel) @@ -2698,7 +2684,7 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) { LLPanelLandAccess *self = (LLPanelLandAccess *)userdata; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) { return; @@ -2731,7 +2717,7 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) parcel->setPassHours( pass_hours ); // Send current parcel data upstream to server - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); // Might have changed properties, so let's redraw! self->refresh(); @@ -2755,7 +2741,7 @@ void LLPanelLandAccess::callbackAvatarID(const std::vector<std::string>& names, void LLPanelLandAccess::addAvatar(LLUUID id) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = mParcel->getParcel(); if (!parcel) return; parcel->addToAccessList(id, 0); @@ -2775,7 +2761,7 @@ void LLPanelLandAccess::onClickRemove(void* data) LLScrollListItem* item = self->mListAccess->getFirstSelected(); if (!item) return; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) return; const LLUUID& agent_id = item->getUUID(); @@ -2792,8 +2778,8 @@ void LLPanelLandAccess::onClickRemove(void* data) //--------------------------------------------------------------------------- // LLPanelLandBan //--------------------------------------------------------------------------- -LLPanelLandBan::LLPanelLandBan() -: LLPanel("land_ban_panel") +LLPanelLandBan::LLPanelLandBan(LLParcelSelectionHandle& parcel) +: LLPanel("land_ban_panel"), mParcel(parcel) { } @@ -2837,7 +2823,7 @@ void LLPanelLandBan::refresh() { mList->deleteAllItems(); - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = mParcel->getParcel(); if (parcel) { @@ -2949,7 +2935,7 @@ void LLPanelLandBan::onCommitAny(LLUICtrl *ctrl, void *userdata) { LLPanelLandBan *self = (LLPanelLandBan*)userdata; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) { return; @@ -2968,7 +2954,7 @@ void LLPanelLandBan::onCommitAny(LLUICtrl *ctrl, void *userdata) parcel->setParcelFlag(PF_DENY_TRANSACTED, deny_access_transacted); // Send current parcel data upstream to server - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); // Might have changed properties, so let's redraw! self->refresh(); @@ -2992,7 +2978,7 @@ void LLPanelLandBan::callbackAvatarID(const std::vector<std::string>& names, con void LLPanelLandBan::addAvatar(LLUUID id) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = mParcel->getParcel(); if (!parcel) return; parcel->addToBanList(id, 0); @@ -3012,7 +2998,7 @@ void LLPanelLandBan::onClickRemove(void* data) LLScrollListItem* item = self->mList->getFirstSelected(); if (!item) return; - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = self->mParcel->getParcel(); if (!parcel) return; const LLUUID& agent_id = item->getUUID(); @@ -3027,8 +3013,8 @@ void LLPanelLandBan::onClickRemove(void* data) //--------------------------------------------------------------------------- // LLPanelLandRenters //--------------------------------------------------------------------------- -LLPanelLandRenters::LLPanelLandRenters() -: LLPanel("landrenters", LLRect(0,500,500,0)) +LLPanelLandRenters::LLPanelLandRenters(LLParcelSelectionHandle& parcel) +: LLPanel("landrenters", LLRect(0,500,500,0)), mParcel(parcel) { const S32 BTN_WIDTH = 64; @@ -3103,8 +3089,8 @@ void LLPanelLandRenters::onClickRemove(void*) //--------------------------------------------------------------------------- // LLPanelLandCovenant //--------------------------------------------------------------------------- -LLPanelLandCovenant::LLPanelLandCovenant() -: LLPanel("land_covenant_panel") +LLPanelLandCovenant::LLPanelLandCovenant(LLParcelSelectionHandle& parcel) +: LLPanel("land_covenant_panel"), mParcel(parcel) { } diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index a28fea261f..b1aad89d7d 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -31,6 +31,7 @@ class LLParcelSelectionObserver; class LLTabContainer; class LLTextureCtrl; class LLViewerTextEditor; +class LLParcelSelection; class LLPanelLandGeneral; class LLPanelLandObjects; @@ -54,9 +55,6 @@ public: static LLPanelLandObjects* getCurrentPanelLandObjects(); static LLPanelLandCovenant* getCurrentPanelLandCovenant(); - // Returns TRUE, but does some early prep work for closing the window. - virtual BOOL canClose(); - // Destroys itself on close. virtual void onClose(bool app_quitting); @@ -93,6 +91,8 @@ protected: LLPanelLandCovenant* mPanelCovenant; LLPanelLandRenters* mPanelRenters; + LLHandle<LLParcelSelection> mParcel; + public: // When closing the dialog, we want to deselect the land. But when // we send an update to the simulator, it usually replies with the @@ -106,7 +106,7 @@ class LLPanelLandGeneral : public LLPanel { public: - LLPanelLandGeneral(); + LLPanelLandGeneral(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandGeneral(); void refresh(); void refreshNames(); @@ -198,6 +198,8 @@ protected: LLButton* mBtnBuyPass; LLButton* mBtnStartAuction; + LLHandle<LLParcelSelection>& mParcel; + static LLViewHandle sBuyPassDialogHandle; }; @@ -205,7 +207,7 @@ class LLPanelLandObjects : public LLPanel { public: - LLPanelLandObjects(); + LLPanelLandObjects(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandObjects(); void refresh(); virtual void draw(); @@ -215,7 +217,7 @@ public: static void callbackReturnOtherObjects(S32, void*); static void callbackReturnOwnerList(S32, void*); - static void clickShowCore(S32 return_type, uuid_list_t* list = 0); + static void clickShowCore(LLPanelLandObjects* panelp, S32 return_type, uuid_list_t* list = 0); static void onClickShowOwnerObjects(void*); static void onClickShowGroupObjects(void*); static void onClickShowOtherObjects(void*); @@ -295,6 +297,8 @@ protected: LLString mSelectedName; S32 mSelectedCount; BOOL mSelectedIsGroup; + + LLHandle<LLParcelSelection>& mParcel; }; @@ -302,7 +306,7 @@ class LLPanelLandOptions : public LLPanel { public: - LLPanelLandOptions(); + LLPanelLandOptions(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandOptions(); void refresh(); @@ -340,6 +344,8 @@ protected: LLCheckBoxCtrl *mMatureCtrl; LLCheckBoxCtrl *mPushRestrictionCtrl; LLButton *mPublishHelpButton; + + LLHandle<LLParcelSelection>& mParcel; }; @@ -347,7 +353,7 @@ class LLPanelLandMedia : public LLPanel { public: - LLPanelLandMedia(); + LLPanelLandMedia(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandMedia(); void refresh(); @@ -365,6 +371,8 @@ protected: LLCheckBoxCtrl* mMediaAutoScaleCheck; //LLButton* mMediaStopButton; //LLButton* mMediaStartButton; + + LLHandle<LLParcelSelection>& mParcel; }; @@ -373,7 +381,7 @@ class LLPanelLandAccess : public LLPanel { public: - LLPanelLandAccess(); + LLPanelLandAccess(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandAccess(); void refresh(); void refreshNames(); @@ -407,6 +415,7 @@ protected: LLCheckBoxCtrl* mCheckTransacted; LLRadioGroup* mCheckStatusLevel; + LLHandle<LLParcelSelection>& mParcel; }; @@ -414,7 +423,7 @@ class LLPanelLandBan : public LLPanel { public: - LLPanelLandBan(); + LLPanelLandBan(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandBan(); void refresh(); @@ -437,6 +446,8 @@ protected: LLCheckBoxCtrl* mCheckDenyAnonymous; LLCheckBoxCtrl* mCheckDenyIdentified; LLCheckBoxCtrl* mCheckDenyTransacted; + + LLHandle<LLParcelSelection>& mParcel; }; @@ -444,7 +455,7 @@ class LLPanelLandRenters : public LLPanel { public: - LLPanelLandRenters(); + LLPanelLandRenters(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandRenters(); void refresh(); @@ -456,13 +467,15 @@ protected: LLNameListCtrl* mListRenters; LLButton* mBtnAddRenter; LLButton* mBtnRemoveRenter; + + LLHandle<LLParcelSelection>& mParcel; }; class LLPanelLandCovenant : public LLPanel { public: - LLPanelLandCovenant(); + LLPanelLandCovenant(LLHandle<LLParcelSelection>& parcelp); virtual ~LLPanelLandCovenant(); virtual BOOL postBuild(); void refresh(); @@ -470,6 +483,9 @@ public: static void updateEstateName(const std::string& name); static void updateLastModified(const std::string& text); static void updateEstateOwnerName(const std::string& name); + +protected: + LLHandle<LLParcelSelection>& mParcel; }; #endif diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index 7e15c373d4..7f29b37913 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -49,7 +49,6 @@ LLFloaterOpenObject::LLFloaterOpenObject() LLFloaterOpenObject::~LLFloaterOpenObject() { - gSelectMgr->deselectAll(); sInstance = NULL; } @@ -57,7 +56,7 @@ void LLFloaterOpenObject::refresh() { mPanelInventory->refresh(); - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = mObjectSelection->getFirstRootNode(); if (node) { std::string name = node->mName; @@ -84,7 +83,8 @@ void LLFloaterOpenObject::dirty() // static void LLFloaterOpenObject::show() { - if (gSelectMgr->getRootObjectCount() != 1) + LLObjectSelectionHandle object_selection = gSelectMgr->getSelection(); + if (object_selection->getRootObjectCount() != 1) { gViewerWindow->alertXml("UnableToViewContentsMoreThanOne"); return; @@ -99,19 +99,20 @@ void LLFloaterOpenObject::show() sInstance->open(); /* Flawfinder: ignore */ sInstance->setFocus(TRUE); + + sInstance->mObjectSelection = gSelectMgr->getEditSelection(); } -// static void LLFloaterOpenObject::moveToInventory(bool wear) { - if (gSelectMgr->getRootObjectCount() != 1) + if (mObjectSelection->getRootObjectCount() != 1) { gViewerWindow->alertXml("OnlyCopyContentsOfSingleItem"); return; } - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = mObjectSelection->getFirstRootNode(); if (!node) return; LLViewerObject* object = node->getObject(); if (!object) return; @@ -175,7 +176,7 @@ void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data) void LLFloaterOpenObject::onClickMoveToInventory(void* data) { LLFloaterOpenObject* self = (LLFloaterOpenObject*)data; - moveToInventory(false); + self->moveToInventory(false); self->close(); } @@ -183,7 +184,7 @@ void LLFloaterOpenObject::onClickMoveToInventory(void* data) void LLFloaterOpenObject::onClickMoveAndWear(void* data) { LLFloaterOpenObject* self = (LLFloaterOpenObject*)data; - moveToInventory(true); + self->moveToInventory(true); self->close(); } diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h index 8de8832ca9..88635d58b1 100644 --- a/indra/newview/llfloateropenobject.h +++ b/indra/newview/llfloateropenobject.h @@ -16,8 +16,7 @@ #include "llfloater.h" - - +class LLObjectSelection; class LLPanelInventory; class LLFloaterOpenObject @@ -40,9 +39,10 @@ protected: void refresh(); void draw(); + void moveToInventory(bool wear); + static void onClickMoveToInventory(void* data); static void onClickMoveAndWear(void* data); - static void moveToInventory(bool wear); static void callbackMoveInventory(S32 result, void* data); static void* createPanelInventory(void* data); @@ -50,6 +50,7 @@ protected: static LLFloaterOpenObject* sInstance; LLPanelInventory* mPanelInventory; + LLHandle<LLObjectSelection> mObjectSelection; BOOL mDirty; }; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 89ff4bc66d..84c99db8da 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -211,11 +211,6 @@ LLFloaterReporter::~LLFloaterReporter() std::for_each(mMCDList.begin(), mMCDList.end(), DeletePointer() ); mMCDList.clear(); - if (gSelectMgr) - { - gSelectMgr->deselectTransient(); - } - gDialogVisible = FALSE; } diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 65c5f5607e..098417d1b4 100755 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -36,15 +36,15 @@ private: virtual ~LLFloaterSellLandUI(); LLViewerRegion* mRegion; - LLParcel* mParcel; - bool mParcelIsForSale; - bool mSellToBuyer; - bool mChoseSellTo; - S32 mParcelPrice; - S32 mParcelActualArea; - LLUUID mParcelSnapshot; - LLUUID mAuthorizedBuyer; - bool mParcelSoldWithObjects; + LLParcelSelectionHandle mParcelSelection; + bool mParcelIsForSale; + bool mSellToBuyer; + bool mChoseSellTo; + S32 mParcelPrice; + S32 mParcelActualArea; + LLUUID mParcelSnapshot; + LLUUID mAuthorizedBuyer; + bool mParcelSoldWithObjects; void updateParcelInfo(); void refreshUI(); @@ -68,12 +68,19 @@ public: static LLFloaterSellLandUI* soleInstance(bool createIfNeeded); - bool setParcel(LLViewerRegion* region, LLParcel* parcel); + bool setParcel(LLViewerRegion* region, LLParcelSelectionHandle parcel); + +private: + class SelectionObserver : public LLParcelObserver + { + public: + virtual void changed(); + }; }; // static void LLFloaterSellLand::sellLand( - LLViewerRegion* region, LLParcel* parcel) + LLViewerRegion* region, LLParcelSelectionHandle parcel) { LLFloaterSellLandUI* ui = LLFloaterSellLandUI::soleInstance(true); if (ui->setParcel(region, parcel)) @@ -96,12 +103,20 @@ LLFloaterSellLandUI* LLFloaterSellLandUI::soleInstance(bool createIfNeeded) sInstance->center(); } + + static SelectionObserver* parcelSelectionObserver = NULL; + if (!parcelSelectionObserver) + { + parcelSelectionObserver = new SelectionObserver; + gParcelMgr->addObserver(parcelSelectionObserver); + } + return sInstance; } LLFloaterSellLandUI::LLFloaterSellLandUI() : LLFloater("Sell Land"), - mRegion(0), mParcel(0) + mRegion(0) { } @@ -113,6 +128,22 @@ LLFloaterSellLandUI::~LLFloaterSellLandUI() } } +void LLFloaterSellLandUI::SelectionObserver::changed() +{ + LLFloaterSellLandUI* ui = LLFloaterSellLandUI::soleInstance(false); + if (ui) + { + if (gParcelMgr->selectionEmpty()) + { + ui->close(); + } + else { + ui->setParcel( + gParcelMgr->getSelectionRegion(), + gParcelMgr->getParcelSelection()); + } + } +} void LLFloaterSellLandUI::onClose(bool app_quitting) { @@ -133,17 +164,18 @@ BOOL LLFloaterSellLandUI::postBuild() return TRUE; } -bool LLFloaterSellLandUI::setParcel(LLViewerRegion* region, LLParcel* parcel) +bool LLFloaterSellLandUI::setParcel(LLViewerRegion* region, LLParcelSelectionHandle parcel) { - if (!parcel) // || !can_agent_modify_parcel(parcel)) // can_agent_modify_parcel was deprecated by GROUPS + if (!parcel->getParcel()) // || !can_agent_modify_parcel(parcel)) // can_agent_modify_parcel was deprecated by GROUPS { return false; } mRegion = region; - mParcel = parcel; + mParcelSelection = parcel; mChoseSellTo = false; + updateParcelInfo(); refreshUI(); @@ -152,14 +184,17 @@ bool LLFloaterSellLandUI::setParcel(LLViewerRegion* region, LLParcel* parcel) void LLFloaterSellLandUI::updateParcelInfo() { - mParcelActualArea = mParcel->getArea(); - mParcelIsForSale = mParcel->getForSale(); + LLParcel* parcelp = mParcelSelection->getParcel(); + if (!parcelp) return; + + mParcelActualArea = parcelp->getArea(); + mParcelIsForSale = parcelp->getForSale(); if (mParcelIsForSale) { mChoseSellTo = true; } - mParcelPrice = mParcelIsForSale ? mParcel->getSalePrice() : 0; - mParcelSoldWithObjects = mParcel->getSellWithObjects(); + mParcelPrice = mParcelIsForSale ? parcelp->getSalePrice() : 0; + mParcelSoldWithObjects = parcelp->getSellWithObjects(); if (mParcelIsForSale) { childSetValue("price", mParcelPrice); @@ -178,9 +213,9 @@ void LLFloaterSellLandUI::updateParcelInfo() childSetValue("sell_objects", "none"); } - mParcelSnapshot = mParcel->getSnapshotID(); + mParcelSnapshot = parcelp->getSnapshotID(); - mAuthorizedBuyer = mParcel->getAuthorizedBuyerID(); + mAuthorizedBuyer = parcelp->getAuthorizedBuyerID(); mSellToBuyer = mAuthorizedBuyer.notNull(); if(mSellToBuyer) @@ -219,13 +254,16 @@ void LLFloaterSellLandUI::setBadge(const char* id, Badge badge) void LLFloaterSellLandUI::refreshUI() { + LLParcel* parcelp = mParcelSelection->getParcel(); + if (!parcelp) return; + LLTextureCtrl* snapshot = LLViewerUICtrlFactory::getTexturePickerByName(this, "info_image"); if (snapshot) { snapshot->setImageAssetID(mParcelSnapshot); } - childSetText("info_parcel", mParcel->getName()); + childSetText("info_parcel", parcelp->getName()); childSetTextArg("info_size", "[AREA]", llformat("%d", mParcelActualArea)); LLString price_str = childGetValue("price").asString(); @@ -358,7 +396,7 @@ void LLFloaterSellLandUI::doSelectAgent(void *userdata) void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data) { LLFloaterSellLandUI* floaterp = (LLFloaterSellLandUI*)data; - LLParcel* parcel = floaterp->mParcel; + LLParcel* parcel = floaterp->mParcelSelection->getParcel(); if (names.empty() || ids.empty()) return; @@ -383,7 +421,10 @@ void LLFloaterSellLandUI::doCancel(void *userdata) void LLFloaterSellLandUI::doShowObjects(void *userdata) { LLFloaterSellLandUI* self = (LLFloaterSellLandUI*)userdata; - send_parcel_select_objects(self->mParcel->getLocalID(), RT_SELL); + LLParcel* parcel = self->mParcelSelection->getParcel(); + if (!parcel) return; + + send_parcel_select_objects(parcel->getLocalID(), RT_SELL); LLNotifyBox::showXml("TransferObjectsHighlighted", callbackHighlightTransferable, @@ -401,7 +442,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata) { LLFloaterSellLandUI* self = (LLFloaterSellLandUI*)userdata; - LLParcel* parcel = self->mParcel; + LLParcel* parcel = self->mParcelSelection->getParcel(); // Do a confirmation if (!parcel->getForSale()) @@ -453,7 +494,8 @@ void LLFloaterSellLandUI::onConfirmSale(S32 option, void *userdata) return; } - LLParcel* parcel = self->mParcel; + LLParcel* parcel = self->mParcelSelection->getParcel(); + if (!parcel) return; // can_agent_modify_parcel deprecated by GROUPS // if (!can_agent_modify_parcel(parcel)) @@ -480,7 +522,7 @@ void LLFloaterSellLandUI::onConfirmSale(S32 option, void *userdata) } // Send update to server - gParcelMgr->sendParcelPropertiesUpdate( parcel, LLFloaterLand::sRequestReplyOnUpdate ); + gParcelMgr->sendParcelPropertiesUpdate( parcel ); self->close(); } diff --git a/indra/newview/llfloatersellland.h b/indra/newview/llfloatersellland.h index 077a775ffc..f9bf84ebcf 100755 --- a/indra/newview/llfloatersellland.h +++ b/indra/newview/llfloatersellland.h @@ -7,15 +7,17 @@ #ifndef LL_LLFLOATERSELLLAND_H #define LL_LLFLOATERSELLLAND_H +#include "llmemory.h" class LLParcel; class LLViewerRegion; +class LLParcelSelection; class LLFloaterSellLand { public: static void sellLand(LLViewerRegion* region, - LLParcel* parcel); + LLHandle<LLParcelSelection> parcel); }; #endif // LL_LLFLOATERSELLLAND_H diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 1b82b6b43d..05047e1a4a 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -813,13 +813,12 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) // freeze everything else gSavedSettings.setBOOL("FreezeTime", TRUE); - if (gCurrentToolset != gCameraToolset) + if (gToolMgr->getCurrentToolset() != gCameraToolset) { - sInstance->impl.mLastToolset = gCurrentToolset; - gCurrentToolset = gCameraToolset; + sInstance->impl.mLastToolset = gToolMgr->getCurrentToolset(); if (gToolMgr) { - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(gCameraToolset); } } } @@ -842,10 +841,9 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) // restore last tool (e.g. pie menu, etc) if (sInstance->impl.mLastToolset) { - gCurrentToolset = sInstance->impl.mLastToolset; if (gToolMgr) { - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(sInstance->impl.mLastToolset); } } } @@ -1220,10 +1218,9 @@ LLFloaterSnapshot::~LLFloaterSnapshot() if (impl.mLastToolset) { - gCurrentToolset = impl.mLastToolset; - if (gToolMgr && gCurrentToolset) + if (gToolMgr) { - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->setCurrentToolset(impl.mLastToolset); } } @@ -1487,7 +1484,7 @@ BOOL LLSnapshotFloaterView::handleMouseDown(S32 x, S32 y, MASK mask) // give floater a change to handle mouse, else camera tool if (childrenHandleMouseDown(x, y, mask) == NULL) { - gToolMgr->getCurrentTool(mask)->handleMouseDown( x, y, mask ); + gToolMgr->getCurrentTool()->handleMouseDown( x, y, mask ); } return TRUE; } @@ -1502,7 +1499,7 @@ BOOL LLSnapshotFloaterView::handleMouseUp(S32 x, S32 y, MASK mask) // give floater a change to handle mouse, else camera tool if (childrenHandleMouseUp(x, y, mask) == NULL) { - gToolMgr->getCurrentTool(mask)->handleMouseUp( x, y, mask ); + gToolMgr->getCurrentTool()->handleMouseUp( x, y, mask ); } return TRUE; } @@ -1517,7 +1514,7 @@ BOOL LLSnapshotFloaterView::handleHover(S32 x, S32 y, MASK mask) // give floater a change to handle mouse, else camera tool if (childrenHandleHover(x, y, mask) == NULL) { - gToolMgr->getCurrentTool(mask)->handleHover( x, y, mask ); + gToolMgr->getCurrentTool()->handleHover( x, y, mask ); } return TRUE; } diff --git a/indra/newview/llfloatertelehub.cpp b/indra/newview/llfloatertelehub.cpp index 25cfc12c3e..1c75b7e220 100644 --- a/indra/newview/llfloatertelehub.cpp +++ b/indra/newview/llfloatertelehub.cpp @@ -39,8 +39,8 @@ void LLFloaterTelehub::show() sInstance = new LLFloaterTelehub(); // Show tools floater by selecting translate (select) tool - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectTool( gToolTranslate ); + gToolMgr->setCurrentToolset(gBasicToolset); + gToolMgr->getCurrentToolset()->selectTool( gToolTranslate ); // Find tools floater, glue to bottom if (gFloaterTools) @@ -82,6 +82,8 @@ LLFloaterTelehub::LLFloaterTelehub() // otherwise you can't walk with arrow keys while floater is up list->setAllowKeyboardMovement(FALSE); } + + mObjectSelection = gSelectMgr->getEditSelection(); } LLFloaterTelehub::~LLFloaterTelehub() @@ -104,10 +106,10 @@ void LLFloaterTelehub::draw() // Per-frame updates, because we don't have a selection manager observer. void LLFloaterTelehub::refresh() { - LLViewerObject* object = gSelectMgr->getFirstRootObject(); + LLViewerObject* object = mObjectSelection->getFirstRootObject(); if(!object) { - object = gSelectMgr->getFirstObject(); + object = mObjectSelection->getFirstObject(); } BOOL have_selection = (object != NULL); diff --git a/indra/newview/llfloatertelehub.h b/indra/newview/llfloatertelehub.h index 39f12f9443..287769b037 100644 --- a/indra/newview/llfloatertelehub.h +++ b/indra/newview/llfloatertelehub.h @@ -13,6 +13,7 @@ #include "llfloater.h" class LLMessageSystem; +class LLObjectSelection; const S32 MAX_SPAWNPOINTS_PER_TELEHUB = 16; @@ -50,6 +51,8 @@ private: S32 mNumSpawn; LLVector3 mSpawnPointPos[MAX_SPAWNPOINTS_PER_TELEHUB]; + + LLHandle<LLObjectSelection> mObjectSelection; static LLFloaterTelehub* sInstance; }; diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index e21c7a45a8..34eb841568 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -376,7 +376,7 @@ LLFloaterTools::LLFloaterTools() factory_map["ContentsInventory"] = LLCallbackMap(createPanelContentsInventory, this);//LLPanelContents factory_map["land info panel"] = LLCallbackMap(createPanelLandInfo, this);//LLPanelLandInfo - gUICtrlFactory->buildFloater(this,"floater_tools.xml",&factory_map); + gUICtrlFactory->buildFloater(this,"floater_tools.xml",&factory_map,FALSE); mLargeHeight = getRect().getHeight(); mSmallHeight = mLargeHeight; @@ -459,7 +459,7 @@ void LLFloaterTools::resetToolState() void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) { - LLTool *tool = gToolMgr->getCurrentTool( mask ); + LLTool *tool = gToolMgr->getCurrentTool(); // HACK to allow seeing the buttons when you have the app in a window. // Keep the visibility the same as it @@ -560,7 +560,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) S32 index = mComboGridMode->getCurrentIndex(); mComboGridMode->removeall(); - switch (gSelectMgr->getSelectType()) + switch (mObjectSelection->getSelectType()) { case SELECT_TYPE_HUD: mComboGridMode->add("Screen"); @@ -707,6 +707,13 @@ BOOL LLFloaterTools::canClose() } // virtual +void LLFloaterTools::onOpen() +{ + mParcelSelection = gParcelMgr->getFloatingParcelSelection(); + mObjectSelection = gSelectMgr->getEditSelection(); +} + +// virtual void LLFloaterTools::onClose(bool app_quitting) { setMinimized(FALSE); @@ -725,10 +732,14 @@ void LLFloaterTools::onClose(bool app_quitting) resetToolState(); + mParcelSelection = NULL; + mObjectSelection = NULL; + // Switch back to basic toolset - gCurrentToolset = gBasicToolset; - gBasicToolset->selectFirstTool(); - gToolMgr->useSelectedTool( gBasicToolset ); + gToolMgr->setCurrentToolset(gBasicToolset); + // we were already in basic toolset, using build tools + // so manually reset tool to default (pie menu tool) + gToolMgr->getCurrentToolset()->selectFirstTool(); } void LLFloaterTools::showMore(BOOL show_more) @@ -936,6 +947,5 @@ void LLFloaterTools::setEditTool(void* tool_pointer) void LLFloaterTools::onFocusReceived() { - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectTool(gCurrentToolset->getSelectedTool()); + gToolMgr->setCurrentToolset(gBasicToolset); } diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index e13e15ba01..7c85444578 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -25,6 +25,11 @@ class LLPanelFace; class LLPanelLandInfo; class LLComboBox; class LLVolumeSliderCtrl; +class LLParcelSelection; +class LLObjectSelection; + +typedef LLHandle<LLParcelSelection> LLParcelSelectionHandle; +typedef LLHandle<LLObjectSelection> LLObjectSelectionHandle; class LLFloaterTools : public LLFloater @@ -42,6 +47,7 @@ public: LLFloaterTools(); virtual ~LLFloaterTools(); + virtual void onOpen(); virtual void onClose(bool app_quitting); virtual BOOL canClose(); @@ -156,7 +162,10 @@ public: LLPanelLandInfo *mPanelLandInfo; LLTabContainer* mTabLand; - + + LLParcelSelectionHandle mParcelSelection; + LLObjectSelectionHandle mObjectSelection; + private: BOOL mDirty; S32 mSmallHeight; diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index b51bdd057d..2cb6db5a16 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -226,9 +226,11 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) if (shrink_selection) { - for (LLViewerObject* vobjp = gSelectMgr->getFirstHighlightedObject(); + LLObjectSelectionHandle highlighted_objects = gSelectMgr->getHighlightedObjects(); + + for (LLViewerObject* vobjp = highlighted_objects->getFirstObject(); vobjp; - vobjp = gSelectMgr->getNextHighlightedObject()) + vobjp = highlighted_objects->getNextObject()) { LLDrawable* drawable = vobjp->mDrawable; if (!drawable || vobjp->getPCode() != LL_PCODE_VOLUME || vobjp->isAttachment()) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b2022eb658..b1b57fb003 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3317,7 +3317,7 @@ BOOL LLObjectBridge::renameItem(const LLString& new_name) { gSelectMgr->deselectAll(); gSelectMgr->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); - gSelectMgr->setObjectName( new_name ); + gSelectMgr->selectionSetObjectName( new_name ); gSelectMgr->deselectAll(); } } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index bdc57c798d..90455f5902 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -28,6 +28,7 @@ #include "llmutelist.h" #include "llnotify.h" #include "llcallbacklist.h" +#include "llpreview.h" #include <deque> //#define DIFF_INVENTORY_FILES @@ -2295,6 +2296,8 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo item_array_t items; update_map_t update; S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData); + bool all_one_folder = true; + LLUUID folder_id; for(S32 i = 0; i < count; ++i) { LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; @@ -2321,6 +2324,14 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo { ++update[titem->getParentUUID()]; } + if (folder_id.isNull()) + { + folder_id = titem->getParentUUID(); + } + else + { + all_one_folder = false; + } } if(account) { @@ -2344,6 +2355,18 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); if(!gInventory.isObjectDescendentOf(lastitem->getUUID(), trash_id)) { + LLMultiPreview* multi_previewp = LLMultiPreview::getAutoOpenInstance(folder_id); + if (!multi_previewp && all_one_folder) + { + S32 left, top; + gFloaterView->getNewFloaterPosition(&left, &top); + + multi_previewp = new LLMultiPreview(LLRect(left, top, left + 300, top - 100)); + LLMultiPreview::setAutoOpenInstance(multi_previewp, folder_id); + } + + LLFloater::setFloaterHost(multi_previewp); + bool show_keep_discard = lastitem->getPermissions().getCreator() != gAgent.getID(); switch(lastitem->getType()) { @@ -2374,6 +2397,13 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, boo default: break; } + + LLFloater::setFloaterHost(NULL); + if (multi_previewp) + { + multi_previewp->open(); + } + LLInventoryView* view = LLInventoryView::getActiveInventory(); if(view) { diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index 1eded15121..f47bbbd2b2 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -150,7 +150,7 @@ F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVecto { //update current snap subdivision level LLVector3 cam_to_reference; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { cam_to_reference = LLVector3(1.f / gAgent.getAvatarObject()->mHUDCurZoom, 0.f, 0.f); } @@ -167,12 +167,27 @@ F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVecto return subdivisions; } +void LLManip::handleSelect() +{ + mObjectSelection = gSelectMgr->getEditSelection(); +} + +void LLManip::handleDeselect() +{ + mObjectSelection = NULL; +} + +LLObjectSelectionHandle LLManip::getSelection() +{ + return mObjectSelection; +} + BOOL LLManip::handleHover(S32 x, S32 y, MASK mask) { // We only handle the event if mousedown started with us if( hasMouseCapture() ) { - if( gSelectMgr->isEmpty() ) + if( mObjectSelection->isEmpty() ) { // Somehow the object got deselected while we were dragging it. // Release the mouse @@ -217,7 +232,7 @@ BOOL LLManip::getMousePointOnPlaneAgent(LLVector3& point, S32 x, S32 y, LLVector BOOL LLManip::getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVector3d origin, LLVector3 normal) { - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { BOOL result = FALSE; F32 mouse_x = ((F32)x / gViewerWindow->getWindowWidth() - 0.5f) * gCamera->getAspect() / gAgent.getAvatarObject()->mHUDCurZoom; @@ -252,12 +267,12 @@ BOOL LLManip::getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVect // Given the line defined by mouse cursor (a1 + a_param*(a2-a1)) and the line defined by b1 + b_param*(b2-b1), // returns a_param and b_param for the points where lines are closest to each other. // Returns false if the two lines are parallel. -BOOL LLManip::nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, const LLVector3& b2, F32 &a_param, F32 &b_param ) const +BOOL LLManip::nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, const LLVector3& b2, F32 &a_param, F32 &b_param ) { LLVector3 a1; LLVector3 a2; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidth()) - 0.5f) * gCamera->getAspect() / gAgent.getAvatarObject()->mHUDCurZoom; F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeight()) - 0.5f) / gAgent.getAvatarObject()->mHUDCurZoom; @@ -305,11 +320,11 @@ LLVector3 LLManip::getSavedPivotPoint() const return gSelectMgr->getSavedBBoxOfSelection().getCenterAgent(); } -LLVector3 LLManip::getPivotPoint() const +LLVector3 LLManip::getPivotPoint() { - if (gSelectMgr->getFirstObject() && gSelectMgr->getObjectCount() == 1 && gSelectMgr->getSelectType() != SELECT_TYPE_HUD) + if (mObjectSelection->getFirstObject() && mObjectSelection->getObjectCount() == 1 && mObjectSelection->getSelectType() != SELECT_TYPE_HUD) { - return gSelectMgr->getFirstObject()->getPivotPositionAgent(); + return mObjectSelection->getFirstObject()->getPivotPositionAgent(); } return gSelectMgr->getBBoxOfSelection().getCenterAgent(); } @@ -322,10 +337,10 @@ void LLManip::renderGuidelines(BOOL draw_x, BOOL draw_y, BOOL draw_z) LLVector3 grid_scale; gSelectMgr->getGrid(grid_origin, grid_rot, grid_scale); - LLViewerObject* object = gSelectMgr->getFirstRootObject(); + LLViewerObject* object = mObjectSelection->getFirstRootObject(); if (!object) { - object = gSelectMgr->getFirstObject(); + object = mObjectSelection->getFirstObject(); if (!object) { return; @@ -447,7 +462,7 @@ void LLManip::renderTickText(const LLVector3& pos, const char* text, const LLCol { const LLFontGL* big_fontp = gResMgr->getRes( LLFONT_SANSSERIF ); - BOOL hud_selection = gSelectMgr->getSelectType() == SELECT_TYPE_HUD; + BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD; glMatrixMode(GL_MODELVIEW); glPushMatrix(); LLVector3 render_pos = pos; @@ -465,9 +480,9 @@ void LLManip::renderTickText(const LLVector3& pos, const char* text, const LLCol LLGLEnable tex(GL_TEXTURE_2D); shadow_color.mV[VALPHA] = color.mV[VALPHA] * 0.5f; gViewerWindow->setupViewport(1, -1); - hud_render_utf8text(text, render_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(text), 3.f, shadow_color, gSelectMgr->getSelectType() == SELECT_TYPE_HUD); + hud_render_utf8text(text, render_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(text), 3.f, shadow_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD); gViewerWindow->setupViewport(); - hud_render_utf8text(text, render_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(text), 3.f, color, gSelectMgr->getSelectType() == SELECT_TYPE_HUD); + hud_render_utf8text(text, render_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(text), 3.f, color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD); glPopMatrix(); } @@ -506,7 +521,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const char* suffi } } - BOOL hud_selection = gSelectMgr->getSelectType() == SELECT_TYPE_HUD; + BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD; glMatrixMode(GL_MODELVIEW); glPushMatrix(); LLVector3 render_pos = pos; diff --git a/indra/newview/llmanip.h b/indra/newview/llmanip.h index b1c2474166..b4101b65bd 100644 --- a/indra/newview/llmanip.h +++ b/indra/newview/llmanip.h @@ -17,6 +17,7 @@ class LLTextBox; class LLViewerObject; class LLToolComposite; class LLVector3; +class LLObjectSelection; const S32 MIN_DIVISION_PIXEL_WIDTH = 9; @@ -102,14 +103,18 @@ public: void renderGuidelines(BOOL draw_x = TRUE, BOOL draw_y = TRUE, BOOL draw_z = TRUE); static void renderXYZ(const LLVector3 &vec); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) = 0; /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); virtual EManipPart getHighlightedPart() { return LL_NO_PART; } virtual void highlightManipulators(S32 x, S32 y) {}; + virtual void handleSelect(); + virtual void handleDeselect(); + + LLHandle<LLObjectSelection> getSelection(); + protected: LLVector3 getSavedPivotPoint() const; - LLVector3 getPivotPoint() const; + LLVector3 getPivotPoint(); void getManipNormal(LLViewerObject* object, EManipPart manip, LLVector3 &normal); BOOL getManipAxis(LLViewerObject* object, EManipPart manip, LLVector3 &axis); F32 getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing = MIN_DIVISION_PIXEL_WIDTH); @@ -118,11 +123,12 @@ protected: void updateGridSettings(); BOOL getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVector3d origin, LLVector3 normal); BOOL getMousePointOnPlaneAgent(LLVector3& point, S32 x, S32 y, LLVector3 origin, LLVector3 normal); - BOOL nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, const LLVector3& b2, F32 &a_param, F32 &b_param ) const; + BOOL nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, const LLVector3& b2, F32 &a_param, F32 &b_param ); LLColor4 setupSnapGuideRenderPass(S32 pass); protected: LLFrameTimer mHelpTextTimer; BOOL mInSnapRegime; + LLHandle<LLObjectSelection> mObjectSelection; static F32 sHelpTextVisibleTime; static F32 sHelpTextFadeTime; diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 46014f2a0b..e9a6b1d1ba 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -62,7 +62,6 @@ const F32 SELECTED_MANIPULATOR_SCALE = 1.05f; const F32 MANIPULATOR_SCALE_HALF_LIFE = 0.07f; extern void handle_reset_rotation(void*); // in LLViewerWindow -extern void handle_first_tool(void*); LLManipRotate::LLManipRotate( LLToolComposite* composite ) : LLManip( "Rotate", composite ), @@ -89,6 +88,7 @@ void LLManipRotate::handleSelect() // *FIX: put this in mouseDown? gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); gFloaterTools->setStatusText("Drag colored bands to rotate object"); + LLManip::handleSelect(); } void LLManipRotate::handleDeselect() @@ -97,6 +97,7 @@ void LLManipRotate::handleDeselect() mManipPart = LL_NO_PART; gFloaterTools->setStatusText(""); + LLManip::handleDeselect(); } void LLManipRotate::render() @@ -108,7 +109,7 @@ void LLManipRotate::render() LLGLEnable gls_alpha_test(GL_ALPHA_TEST); // You can rotate if you can move - LLViewerObject* first_object = gSelectMgr->getFirstMoveableObject(TRUE); + LLViewerObject* first_object = mObjectSelection->getFirstMoveableObject(TRUE); if( !first_object ) { return; @@ -121,7 +122,7 @@ void LLManipRotate::render() glMatrixMode(GL_MODELVIEW); glPushMatrix(); - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom; glScalef(zoom, zoom, zoom); @@ -339,7 +340,7 @@ BOOL LLManipRotate::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - LLViewerObject* first_object = gSelectMgr->getFirstMoveableObject(TRUE); + LLViewerObject* first_object = mObjectSelection->getFirstMoveableObject(TRUE); if( first_object ) { LLViewerObject* hit_obj = gViewerWindow->lastObjectHit(); @@ -355,10 +356,10 @@ BOOL LLManipRotate::handleMouseDown(S32 x, S32 y, MASK mask) // Assumes that one of the parts of the manipulator was hit. BOOL LLManipRotate::handleMouseDownOnPart( S32 x, S32 y, MASK mask ) { - BOOL can_rotate = gSelectMgr->getObjectCount() != 0; - for (LLViewerObject* objectp = gSelectMgr->getFirstObject(); + BOOL can_rotate = mObjectSelection->getObjectCount() != 0; + for (LLViewerObject* objectp = mObjectSelection->getFirstObject(); objectp; - objectp = gSelectMgr->getNextObject()) + objectp = mObjectSelection->getNextObject()) { can_rotate = can_rotate && objectp->permMove() && (objectp->permModify() || gSavedSettings.getBOOL("SelectLinkedSet")); } @@ -463,7 +464,7 @@ BOOL LLManipRotate::handleHover(S32 x, S32 y, MASK mask) { if( hasMouseCapture() ) { - if( gSelectMgr->isEmpty() ) + if( mObjectSelection->isEmpty() ) { // Somehow the object got deselected while we were dragging it. setMouseCapture( FALSE ); @@ -531,7 +532,7 @@ void LLManipRotate::drag( S32 x, S32 y ) LLSelectNode* selectNode; BOOL using_linked_selection = gSavedSettings.getBOOL("SelectLinkedSet"); - for( selectNode = gSelectMgr->getFirstNode(); selectNode != NULL; selectNode = gSelectMgr->getNextNode() ) + for( selectNode = mObjectSelection->getFirstNode(); selectNode != NULL; selectNode = mObjectSelection->getNextNode() ) { object = selectNode->getObject(); @@ -603,7 +604,7 @@ void LLManipRotate::drag( S32 x, S32 y ) } // update positions - for( selectNode = gSelectMgr->getFirstNode(); selectNode != NULL; selectNode = gSelectMgr->getNextNode() ) + for( selectNode = mObjectSelection->getFirstNode(); selectNode != NULL; selectNode = mObjectSelection->getNextNode() ) { object = selectNode->getObject(); @@ -766,7 +767,7 @@ void LLManipRotate::renderSnapGuides() LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter ); LLVector3 cam_at_axis; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { cam_at_axis.setVec(1.f, 0.f, 0.f); } @@ -780,7 +781,7 @@ void LLManipRotate::renderSnapGuides() LLVector3 test_axis = constraint_axis; BOOL constrain_to_ref_object = FALSE; - if (gSelectMgr->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) { test_axis = test_axis * ~grid_rotation; } @@ -807,7 +808,7 @@ void LLManipRotate::renderSnapGuides() } LLVector3 projected_snap_axis = world_snap_axis; - if (gSelectMgr->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) { projected_snap_axis = projected_snap_axis * grid_rotation; } @@ -947,32 +948,32 @@ void LLManipRotate::renderSnapGuides() { if (i == 0) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Forward" : "East", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Forward" : "East", LLColor4::white); } else if (i == 16) { if (constraint_axis.mV[VZ] > 0.f) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Left" : "North", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Left" : "North", LLColor4::white); } else { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Right" : "South", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Right" : "South", LLColor4::white); } } else if (i == 32) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Back" : "West", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Back" : "West", LLColor4::white); } else { if (constraint_axis.mV[VZ] > 0.f) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Right" : "South", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Right" : "South", LLColor4::white); } else { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Left" : "North", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Left" : "North", LLColor4::white); } } } @@ -980,7 +981,7 @@ void LLManipRotate::renderSnapGuides() { if (i == 0) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Left" : "North", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Left" : "North", LLColor4::white); } else if (i == 16) { @@ -995,7 +996,7 @@ void LLManipRotate::renderSnapGuides() } else if (i == 32) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Right" : "South", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Right" : "South", LLColor4::white); } else { @@ -1019,11 +1020,11 @@ void LLManipRotate::renderSnapGuides() { if (constraint_axis.mV[VY] > 0.f) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Forward" : "East", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Forward" : "East", LLColor4::white); } else { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Back" : "West", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Back" : "West", LLColor4::white); } } else if (i == 32) @@ -1034,11 +1035,11 @@ void LLManipRotate::renderSnapGuides() { if (constraint_axis.mV[VY] > 0.f) { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Back" : "West", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Back" : "West", LLColor4::white); } else { - renderTickText(text_point, gSelectMgr->selectionIsAttachment() ? "Forward" : "East", LLColor4::white); + renderTickText(text_point, mObjectSelection->isAttachment() ? "Forward" : "East", LLColor4::white); } } } @@ -1053,7 +1054,7 @@ void LLManipRotate::renderSnapGuides() getObjectAxisClosestToMouse(object_axis); // project onto constraint plane - LLSelectNode* first_node = gSelectMgr->getFirstMoveableNode(TRUE); + LLSelectNode* first_node = mObjectSelection->getFirstMoveableNode(TRUE); object_axis = object_axis * first_node->getObject()->getRenderRotation(); object_axis = object_axis - (object_axis * getConstraintAxis()) * getConstraintAxis(); object_axis.normVec(); @@ -1137,7 +1138,7 @@ BOOL LLManipRotate::updateVisiblity() BOOL visible = FALSE; LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter ); - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mCenterToCam = LLVector3(-1.f / gAgent.getAvatarObject()->mHUDCurZoom, 0.f, 0.f); mCenterToCamNorm = mCenterToCam; @@ -1246,7 +1247,7 @@ LLQuaternion LLManipRotate::dragUnconstrained( S32 x, S32 y ) F32 angle = (-1.f + dist_to_intersection / dist_to_tangent_point) * in_sphere_angle; LLVector3 axis; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { axis = LLVector3(-1.f, 0.f, 0.f) % profile_center_to_intersection; } @@ -1289,7 +1290,7 @@ LLVector3 LLManipRotate::getConstraintAxis() gSelectMgr->getGrid(grid_origin, grid_rotation, grid_scale); - LLSelectNode* first_node = gSelectMgr->getFirstMoveableNode(TRUE); + LLSelectNode* first_node = mObjectSelection->getFirstMoveableNode(TRUE); if (first_node) { // *FIX: get agent local attachment grid working @@ -1303,7 +1304,7 @@ LLVector3 LLManipRotate::getConstraintAxis() LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) { - LLSelectNode* first_object_node = gSelectMgr->getFirstMoveableNode(TRUE); + LLSelectNode* first_object_node = mObjectSelection->getFirstMoveableNode(TRUE); LLVector3 constraint_axis = getConstraintAxis(); LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter ); @@ -1320,7 +1321,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) LLVector3 axis2; LLVector3 test_axis = constraint_axis; - if (gSelectMgr->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) { test_axis = test_axis * ~grid_rotation; } @@ -1344,7 +1345,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) axis1 = LLVector3::x_axis; } - if (gSelectMgr->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) { axis1 = axis1 * grid_rotation; } @@ -1366,7 +1367,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) // We're looking at the ring edge-on. LLVector3 snap_plane_center = (center + (constraint_axis * mRadiusMeters * 0.5f)); LLVector3 cam_to_snap_plane; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { cam_to_snap_plane.setVec(1.f, 0.f, 0.f); } @@ -1416,7 +1417,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) { // try other plane snap_plane_center = (center - (constraint_axis * mRadiusMeters * 0.5f)); - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { cam_to_snap_plane.setVec(1.f, 0.f, 0.f); } @@ -1463,7 +1464,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y ) if (snap_plane > 0) { LLVector3 cam_at_axis; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { cam_at_axis.setVec(1.f, 0.f, 0.f); } @@ -1661,9 +1662,10 @@ LLVector3 LLManipRotate::intersectRayWithSphere( const LLVector3& ray_pt, const } // Utility function. Should probably be moved to another class. +//static void LLManipRotate::mouseToRay( S32 x, S32 y, LLVector3* ray_pt, LLVector3* ray_dir ) { - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (gSelectMgr->getSelection()->getSelectType() == SELECT_TYPE_HUD) { F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidth()) - 0.5f) / gAgent.getAvatarObject()->mHUDCurZoom; F32 mouse_y = ((((F32)y) / gViewerWindow->getWindowHeight()) - 0.5f) / gAgent.getAvatarObject()->mHUDCurZoom; @@ -1685,7 +1687,7 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y ) mHighlightedPart = LL_NO_PART; //LLBBox bbox = gSelectMgr->getBBoxOfSelection(); - LLViewerObject *first_object = gSelectMgr->getFirstMoveableObject(TRUE); + LLViewerObject *first_object = mObjectSelection->getFirstMoveableObject(TRUE); if (!first_object) { @@ -1821,7 +1823,7 @@ void LLManipRotate::highlightManipulators( S32 x, S32 y ) S32 LLManipRotate::getObjectAxisClosestToMouse(LLVector3& object_axis) { - LLSelectNode* first_object_node = gSelectMgr->getFirstMoveableNode(TRUE); + LLSelectNode* first_object_node = mObjectSelection->getFirstMoveableNode(TRUE); if (!first_object_node) { diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 2b5926514e..cec8ff0b13 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -140,6 +140,7 @@ void LLManipScale::handleSelect() updateSnapGuides(bbox); gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); gFloaterTools->setStatusText("Click and drag to stretch selected side"); + LLManip::handleSelect(); } void LLManipScale::handleDeselect() @@ -147,6 +148,7 @@ void LLManipScale::handleDeselect() mHighlightedPart = LL_NO_PART; mManipPart = LL_NO_PART; gFloaterTools->setStatusText(""); + LLManip::handleDeselect(); } BOOL sort_manip_by_z(LLManipScale::ManipulatorHandle *new_manip, LLManipScale::ManipulatorHandle *test_manip) @@ -196,7 +198,7 @@ void LLManipScale::render() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom; glScalef(zoom, zoom, zoom); @@ -212,7 +214,7 @@ void LLManipScale::render() F32 range; F32 range_from_agent; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) gCamera->getViewHeightInPixels(); mBoxHandleSize /= gAgent.getAvatarObject()->mHUDCurZoom; @@ -311,10 +313,10 @@ BOOL LLManipScale::handleMouseDown(S32 x, S32 y, MASK mask) // Assumes that one of the arrows on an object was hit. BOOL LLManipScale::handleMouseDownOnPart( S32 x, S32 y, MASK mask ) { - BOOL can_scale = gSelectMgr->getObjectCount() != 0; - for (LLViewerObject* objectp = gSelectMgr->getFirstObject(); + BOOL can_scale = mObjectSelection->getObjectCount() != 0; + for (LLViewerObject* objectp = mObjectSelection->getFirstObject(); objectp; - objectp = gSelectMgr->getNextObject()) + objectp = mObjectSelection->getNextObject()) { can_scale = can_scale && objectp->permModify() && objectp->permMove() && !objectp->isSeat(); } @@ -377,7 +379,7 @@ BOOL LLManipScale::handleHover(S32 x, S32 y, MASK mask) { if( hasMouseCapture() ) { - if( gSelectMgr->isEmpty() ) + if( mObjectSelection->isEmpty() ) { // Somehow the object got deselected while we were dragging it. setMouseCapture( FALSE ); @@ -413,7 +415,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y) if( isSelectionScalable() ) { LLMatrix4 transform; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { LLVector4 translation(bbox.getPositionAgent()); transform.initRotTrans(bbox.getRotation(), translation); @@ -454,7 +456,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y) mManipulatorVertices[numManips++] = LLVector4(max.mV[VX], max.mV[VY], max.mV[VZ], 1.f); // 1-D highlights are applicable iff one object is selected - if( gSelectMgr->getObjectCount() == 1 ) + if( mObjectSelection->getObjectCount() == 1 ) { // face centers mManipulatorVertices[numManips++] = LLVector4(ctr.mV[VX], ctr.mV[VY], max.mV[VZ], 1.f); @@ -520,7 +522,7 @@ void LLManipScale::renderFaces( const LLBBox& bbox ) { // Don't bother to render the drag handles for 1-D scaling if // more than one object is selected or if it is an attachment - if ( gSelectMgr->getObjectCount() > 1 ) + if ( mObjectSelection->getObjectCount() > 1 ) { return; } @@ -926,7 +928,7 @@ void LLManipScale::dragCorner( S32 x, S32 y ) // find max and min scale factors that will make biggest object hit max absolute scale and smallest object hit min absolute scale LLSelectNode* selectNode; - for( selectNode = gSelectMgr->getFirstNode(); selectNode; selectNode = gSelectMgr->getNextNode() ) + for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) { LLViewerObject* cur = selectNode->getObject(); if( cur->permModify() && cur->permMove() && !cur->isAvatar() ) @@ -946,7 +948,7 @@ void LLManipScale::dragCorner( S32 x, S32 y ) LLVector3d drag_global = uniform ? mDragStartCenterGlobal : mDragFarHitGlobal; // do the root objects i.e. (TRUE == cur->isRootEdit()) - for( selectNode = gSelectMgr->getFirstNode(); selectNode; selectNode = gSelectMgr->getNextNode() ) + for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) { LLViewerObject* cur = selectNode->getObject(); if( cur->permModify() && cur->permMove() && !cur->isAvatar() && cur->isRootEdit() ) @@ -990,7 +992,7 @@ void LLManipScale::dragCorner( S32 x, S32 y ) } } // do the child objects i.e. (FALSE == cur->isRootEdit()) - for( selectNode = gSelectMgr->getFirstNode(); selectNode; selectNode = gSelectMgr->getNextNode() ) + for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) { LLViewerObject*cur = selectNode->getObject(); if( cur->permModify() && cur->permMove() && !cur->isAvatar() && !cur->isRootEdit() ) @@ -1209,7 +1211,7 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto LLVector3 drag_start_center_agent = gAgent.getPosAgentFromGlobal(mDragStartCenterGlobal); LLSelectNode *selectNode; - for( selectNode = gSelectMgr->getFirstNode(); selectNode; selectNode = gSelectMgr->getNextNode() ) + for( selectNode = mObjectSelection->getFirstNode(); selectNode; selectNode = mObjectSelection->getNextNode() ) { LLViewerObject*cur = selectNode->getObject(); if( cur->permModify() && cur->permMove() && !cur->isAvatar() ) @@ -1330,7 +1332,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) mScaleDir = box_corner_agent - mScaleCenter; mScaleDir.normVec(); - if(gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if(mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mSnapRegimeOffset = SNAP_GUIDE_SCREEN_OFFSET / gAgent.getAvatarObject()->mHUDCurZoom; @@ -1342,7 +1344,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) } LLVector3 cam_at_axis; F32 snap_guide_length; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { cam_at_axis.setVec(1.f, 0.f, 0.f); snap_guide_length = SNAP_GUIDE_SCREEN_LENGTH / gAgent.getAvatarObject()->mHUDCurZoom; @@ -1389,7 +1391,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox) { LLVector3 local_scale_dir = partToUnitVector( mManipPart ); LLVector3 local_camera_dir; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { local_camera_dir = LLVector3(-1.f, 0.f, 0.f) * ~bbox.getRotation(); } @@ -1668,7 +1670,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox) start_tick = -(llmin(ticks_from_scale_center_1, num_ticks_per_side1)); stop_tick = llmin(max_ticks1, num_ticks_per_side1); - F32 grid_resolution = gSelectMgr->getSelectType() == SELECT_TYPE_HUD ? 0.25f : llmax(gSavedSettings.getF32("GridResolution"), 0.001f); + F32 grid_resolution = mObjectSelection->getSelectType() == SELECT_TYPE_HUD ? 0.25f : llmax(gSavedSettings.getF32("GridResolution"), 0.001f); S32 label_sub_div_offset_1 = llround(fmod(dist_grid_axis - grid_offset1, mScaleSnapUnit1 * 32.f) / (mScaleSnapUnit1 / max_subdivisions)); S32 label_sub_div_offset_2 = llround(fmod(dist_grid_axis - grid_offset2, mScaleSnapUnit2 * 32.f) / (mScaleSnapUnit2 / max_subdivisions)); @@ -1774,7 +1776,7 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox) // render help text - if (gSelectMgr->getSelectType() != SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() != SELECT_TYPE_HUD) { if (mHelpTextTimer.getElapsedTimeF32() < sHelpTextVisibleTime + sHelpTextFadeTime && sNumTimesHelpTextShown < sMaxTimesShowHelpText) { @@ -1796,10 +1798,10 @@ void LLManipScale::renderSnapGuides(const LLBBox& bbox) std::string help_text = "Move mouse cursor over ruler"; LLColor4 help_text_color = LLColor4::white; help_text_color.mV[VALPHA] = clamp_rescale(mHelpTextTimer.getElapsedTimeF32(), sHelpTextVisibleTime, sHelpTextVisibleTime + sHelpTextFadeTime, grid_alpha, 0.f); - hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, gSelectMgr->getSelectType() == SELECT_TYPE_HUD); + hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD); help_text = "to snap to grid"; help_text_pos -= gCamera->getUpAxis() * mSnapRegimeOffset * 0.4f; - hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, gSelectMgr->getSelectType() == SELECT_TYPE_HUD); + hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD); } } } @@ -2003,14 +2005,16 @@ LLVector3 LLManipScale::nearestAxis( const LLVector3& v ) const return LLVector3( coords[greatest_index] ); } -BOOL LLManipScale::isSelectionScalable() const +//FIXME: make this const once we switch to iterator interface +//(making object traversal a const-able operation) +BOOL LLManipScale::isSelectionScalable() { // An selection is scalable if you are allowed to both edit and move // everything in it, and it does not have any sitting agents - BOOL scalable = gSelectMgr->getFirstObject() ? TRUE : FALSE; - for(LLViewerObject* cur = gSelectMgr->getFirstObject(); + BOOL scalable = mObjectSelection->getFirstObject() ? TRUE : FALSE; + for(LLViewerObject* cur = mObjectSelection->getFirstObject(); cur; - cur = gSelectMgr->getNextObject() ) + cur = mObjectSelection->getNextObject() ) { if( !(cur->permModify() && cur->permMove()) || cur->isSeat()) diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h index 0ba141cc01..af6fb91b15 100644 --- a/indra/newview/llmanipscale.h +++ b/indra/newview/llmanipscale.h @@ -94,7 +94,7 @@ private: F32 partToMinScale( S32 part, const LLBBox& bbox ) const; LLVector3 nearestAxis( const LLVector3& v ) const; - BOOL isSelectionScalable() const; + BOOL isSelectionScalable(); void stretchFace( const LLVector3& drag_start_agent, const LLVector3& drag_delta_agent); diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index b1a9b06720..f308eb9f5c 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -238,6 +238,7 @@ void LLManipTranslate::handleSelect() { gSelectMgr->saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); gFloaterTools->setStatusText("Drag to move, shift-drag to copy"); + LLManip::handleSelect(); } void LLManipTranslate::handleDeselect() @@ -245,6 +246,7 @@ void LLManipTranslate::handleDeselect() mHighlightedPart = LL_NO_PART; mManipPart = LL_NO_PART; gFloaterTools->setStatusText(""); + LLManip::handleDeselect(); } BOOL LLManipTranslate::handleMouseDown(S32 x, S32 y, MASK mask) @@ -270,10 +272,10 @@ BOOL LLManipTranslate::handleMouseDown(S32 x, S32 y, MASK mask) // Assumes that one of the arrows on an object was hit. BOOL LLManipTranslate::handleMouseDownOnPart( S32 x, S32 y, MASK mask ) { - BOOL can_move = gSelectMgr->getObjectCount() != 0; - for (LLViewerObject* objectp = gSelectMgr->getFirstObject(); + BOOL can_move = mObjectSelection->getObjectCount() != 0; + for (LLViewerObject* objectp = mObjectSelection->getFirstObject(); objectp; - objectp = gSelectMgr->getNextObject()) + objectp = mObjectSelection->getNextObject()) { can_move = can_move && objectp->permMove() && (objectp->permModify() || gSavedSettings.getBOOL("SelectLinkedSet")); } @@ -313,7 +315,7 @@ BOOL LLManipTranslate::handleMouseDownOnPart( S32 x, S32 y, MASK mask ) LLVector3 axis; - LLSelectNode *selectNode = gSelectMgr->getFirstMoveableNode(TRUE); + LLSelectNode *selectNode = mObjectSelection->getFirstMoveableNode(TRUE); if (!selectNode) { @@ -388,7 +390,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) BOOL rotated = FALSE; // ...build mode moves camera about focus point - if (gSelectMgr->getSelectType() != SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() != SELECT_TYPE_HUD) { if (x < ROTATE_H_MARGIN) { @@ -452,7 +454,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) // pick the first object to constrain to grid w/ common origin // this is so we don't screw up groups - LLSelectNode* selectNode = gSelectMgr->getFirstMoveableNode(TRUE); + LLSelectNode* selectNode = mObjectSelection->getFirstMoveableNode(TRUE); if (!selectNode) { // somehow we lost the object! @@ -624,9 +626,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) LLVector3d clamped_relative_move = axis_magnitude * axis_d; // scalar multiply LLVector3 clamped_relative_move_f = (F32)axis_magnitude * axis_f; // scalar multiply - for(selectNode = gSelectMgr->getFirstNode(); + for(selectNode = mObjectSelection->getFirstNode(); selectNode; - selectNode = gSelectMgr->getNextNode() ) + selectNode = mObjectSelection->getNextNode() ) { object = selectNode->getObject(); @@ -792,7 +794,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y) { mHighlightedPart = LL_NO_PART; - if (!gSelectMgr->getObjectCount()) + if (!mObjectSelection->getObjectCount()) { return; } @@ -813,7 +815,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y) LLMatrix4 transform; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { relative_camera_dir = LLVector3(1.f, 0.f, 0.f) * ~grid_rotation; LLVector4 translation(object_position); @@ -1060,7 +1062,7 @@ void LLManipTranslate::render() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom; glScalef(zoom, zoom, zoom); @@ -1098,7 +1100,7 @@ void LLManipTranslate::renderSnapGuides() return; } - LLSelectNode *first_node = gSelectMgr->getFirstMoveableNode(TRUE); + LLSelectNode *first_node = mObjectSelection->getFirstMoveableNode(TRUE); if (!first_node) { return; @@ -1123,7 +1125,7 @@ void LLManipTranslate::renderSnapGuides() getManipAxis(first_object, mManipPart, translate_axis); LLVector3 at_axis_abs; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { at_axis_abs = LLVector3::x_axis * ~grid_rotation; } @@ -1198,7 +1200,7 @@ void LLManipTranslate::renderSnapGuides() F32 guide_size_meters; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { guide_size_meters = 1.f / gAgent.getAvatarObject()->mHUDCurZoom; mSnapOffsetMeters = mArrowLengthMeters * 1.5f; @@ -1400,7 +1402,7 @@ void LLManipTranslate::renderSnapGuides() } } } - if (gSelectMgr->getSelectType() != SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() != SELECT_TYPE_HUD) { // render helpful text if (mHelpTextTimer.getElapsedTimeF32() < sHelpTextVisibleTime + sHelpTextFadeTime && sNumTimesHelpTextShown < sMaxTimesShowHelpText) @@ -1424,10 +1426,10 @@ void LLManipTranslate::renderSnapGuides() std::string help_text = "Move mouse cursor over ruler to snap"; LLColor4 help_text_color = LLColor4::white; help_text_color.mV[VALPHA] = clamp_rescale(mHelpTextTimer.getElapsedTimeF32(), sHelpTextVisibleTime, sHelpTextVisibleTime + sHelpTextFadeTime, line_alpha, 0.f); - hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, gSelectMgr->getSelectType() == SELECT_TYPE_HUD); + hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD); help_text = "to snap to grid"; help_text_pos -= gCamera->getUpAxis() * mSnapOffsetMeters * 0.2f; - hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, gSelectMgr->getSelectType() == SELECT_TYPE_HUD); + hud_render_utf8text(help_text, help_text_pos, *big_fontp, LLFontGL::NORMAL, -0.5f * big_fontp->getWidthF32(help_text), 3.f, help_text_color, mObjectSelection->getSelectType() == SELECT_TYPE_HUD); } } } @@ -1592,17 +1594,17 @@ void LLManipTranslate::renderGrid(F32 x, F32 y, F32 size, F32 r, F32 g, F32 b, F void LLManipTranslate::renderText() { - if (gSelectMgr->getRootObjectCount() && !gSelectMgr->selectionIsAttachment()) + if (mObjectSelection->getRootObjectCount() && !mObjectSelection->isAttachment()) { LLVector3 pos = getPivotPoint(); renderXYZ(pos); } else { - LLViewerObject* objectp = gSelectMgr->getFirstRootObject(); + LLViewerObject* objectp = mObjectSelection->getFirstRootObject(); if(!objectp) { - objectp = gSelectMgr->getFirstObject(); + objectp = mObjectSelection->getFirstObject(); } if (objectp) @@ -1621,7 +1623,7 @@ void LLManipTranslate::renderTranslationHandles() gSelectMgr->getGrid(grid_origin, grid_rotation, grid_scale); LLVector3 at_axis; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { at_axis = LLVector3::x_axis * ~grid_rotation; } @@ -1657,13 +1659,13 @@ void LLManipTranslate::renderTranslationHandles() mPlaneManipPositions.mV[VZ] = -1.f; } - LLViewerObject *first_object = gSelectMgr->getFirstMoveableObject(TRUE); + LLViewerObject *first_object = mObjectSelection->getFirstMoveableObject(TRUE); if (!first_object) return; LLVector3 selection_center = getPivotPoint(); // Drag handles - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWindowHeight(); mArrowLengthMeters /= gAgent.getAvatarObject()->mHUDCurZoom; @@ -1716,7 +1718,7 @@ void LLManipTranslate::renderTranslationHandles() LLVector3 relative_camera_dir; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { relative_camera_dir = LLVector3::x_axis * invRotation; } @@ -1988,7 +1990,7 @@ void LLManipTranslate::renderTranslationHandles() // draw arrows for deeper faces first, closer faces last LLVector3 camera_axis; - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) { camera_axis = LLVector3::x_axis; } diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 848a9c26ae..4c76e7491b 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -96,8 +96,8 @@ void LLPanelContents::getState(LLViewerObject *objectp ) // unambiguous destination for the object. if( editable && all_volume && - ((gSelectMgr->getRootObjectCount() == 1) - || (gSelectMgr->getObjectCount() == 1))) + ((gSelectMgr->getSelection()->getRootObjectCount() == 1) + || (gSelectMgr->getSelection()->getObjectCount() == 1))) { //mBtnNewScript->setEnabled(TRUE); childSetEnabled("button new script",TRUE); @@ -112,10 +112,10 @@ void LLPanelContents::getState(LLViewerObject *objectp ) void LLPanelContents::refresh() { - LLViewerObject* object = gSelectMgr->getFirstRootObject(); + LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(); if(!object) { - object = gSelectMgr->getFirstObject(); + object = gSelectMgr->getSelection()->getFirstObject(); } getState(object); @@ -134,10 +134,10 @@ void LLPanelContents::refresh() // static void LLPanelContents::onClickNewScript(void *userdata) { - LLViewerObject* object = gSelectMgr->getFirstRootObject(); + LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(); if(!object) { - object = gSelectMgr->getFirstObject(); + object = gSelectMgr->getSelection()->getFirstObject(); } if(object) { diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index d9ef9e4c13..cdcaed43f9 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -238,7 +238,8 @@ void LLPanelFace::sendTextureInfo() { S32 te; LLViewerObject* object; - for ( gSelectMgr->getFirstTE(&object, &te); object; gSelectMgr->getNextTE(&object, &te) ) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) ) { BOOL valid; F32 value; @@ -317,7 +318,7 @@ void LLPanelFace::sendTextureInfo() } } - for ( object = gSelectMgr->getFirstObject(); object; object = gSelectMgr->getNextObject() ) + for ( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) { object->sendTEUpdate(); } @@ -325,7 +326,7 @@ void LLPanelFace::sendTextureInfo() void LLPanelFace::getState() { - LLViewerObject* objectp = gSelectMgr->getFirstObject(); + LLViewerObject* objectp = gSelectMgr->getSelection()->getFirstObject(); if( objectp && objectp->getPCode() == LL_PCODE_VOLUME) @@ -600,7 +601,7 @@ BOOL LLPanelFace::allFacesSameValue( F32 (get_face_value(LLViewerObject*, S32)), // Get the value from the primary selected TE F32 first_value = *value; BOOL got_first = FALSE; - gSelectMgr->getPrimaryTE(&object, &te); + gSelectMgr->getSelection()->getPrimaryTE(&object, &te); if (object) { first_value = get_face_value(object, te); @@ -609,7 +610,8 @@ BOOL LLPanelFace::allFacesSameValue( F32 (get_face_value(LLViewerObject*, S32)), // Now iterate through all TEs to test for sameness BOOL identical = TRUE; - for ( gSelectMgr->getFirstTE(&object, &te); object; gSelectMgr->getNextTE(&object, &te) ) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) ) { if (!got_first) { @@ -760,13 +762,13 @@ void LLPanelFace::onCommitFullbright(LLUICtrl* ctrl, void* userdata) BOOL LLPanelFace::onDragTexture(LLUICtrl*, LLInventoryItem* item, void*) { BOOL accept = TRUE; - LLViewerObject* obj = gSelectMgr->getFirstRootObject(); + LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject(); while(accept && obj) { if(!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item)) accept = FALSE; else - obj = gSelectMgr->getNextRootObject(); + obj = gSelectMgr->getSelection()->getNextRootObject(); } return accept; } @@ -823,7 +825,8 @@ void LLPanelFace::onClickAutoFix(void* userdata) LLViewerObject* object; // for all selected objects - for ( gSelectMgr->getFirstTE(&object, &te); object; gSelectMgr->getNextTE(&object, &te) ) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for ( selection->getFirstTE(&object, &te); object; selection->getNextTE(&object, &te) ) { // only do this if it's a media texture if ( object->getTE ( te )->getID() == LLMediaEngine::getInstance()->getImageUUID () ) @@ -848,7 +851,7 @@ void LLPanelFace::onClickAutoFix(void* userdata) }; // not clear why this is in a separate loop but i followed the patter from further up this file just in case. - for ( object = gSelectMgr->getFirstObject(); object; object = gSelectMgr->getNextObject() ) + for ( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) { object->sendTEUpdate(); }; diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index 1a8885d05b..9363b98d12 100644 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -90,7 +90,7 @@ void LLPanelLandInfo::refreshAll() // public void LLPanelLandInfo::refresh() { - LLParcel *parcel = gParcelMgr->getSelectedParcel(); + LLParcel *parcel = gParcelMgr->getParcelSelection()->getParcel(); LLViewerRegion *regionp = gParcelMgr->getSelectionRegion(); if (!parcel || !regionp) @@ -158,7 +158,7 @@ void LLPanelLandInfo::refresh() // and it must not be a whole parcel. if (gParcelMgr->getSelectedArea() > PARCEL_UNIT_AREA //&& gParcelMgr->getSelfCount() > 1 - && !gParcelMgr->getWholeParcelSelected()) + && !gParcelMgr->getParcelSelection()->getWholeParcelSelected()) { childSetEnabled("button join land",TRUE); } @@ -181,7 +181,7 @@ void LLPanelLandInfo::refresh() &rent_price, &for_sale, &dwell); - if(is_public || (is_for_sale && gParcelMgr->getWholeParcelSelected())) + if(is_public || (is_for_sale && gParcelMgr->getParcelSelection()->getWholeParcelSelected())) { childSetTextArg("label_area_price","[PRICE]", llformat("%d",claim_price)); childSetTextArg("label_area_price","[AREA]", llformat("%d",area)); @@ -227,7 +227,7 @@ void LLPanelLandInfo::onClickJoin(void*) void LLPanelLandInfo::onClickAbout(void*) { // Promote the rectangle selection to a parcel selection - if (!gParcelMgr->getWholeParcelSelected()) + if (!gParcelMgr->getParcelSelection()->getWholeParcelSelected()) { gParcelMgr->selectParcelInRectangle(); } diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index ac50425e67..39d77c630b 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -256,11 +256,11 @@ LLPanelObject::~LLPanelObject() void LLPanelObject::getState( ) { - LLViewerObject* objectp = gSelectMgr->getFirstRootObject(); + LLViewerObject* objectp = gSelectMgr->getSelection()->getFirstRootObject(); LLViewerObject* root_objectp = objectp; if(!objectp) { - objectp = gSelectMgr->getFirstObject(); + objectp = gSelectMgr->getSelection()->getFirstObject(); // *FIX: shouldn't we just keep the child? if (objectp) { @@ -372,9 +372,9 @@ void LLPanelObject::getState( ) owners_identical = gSelectMgr->selectGetOwner(owner_id, owner_name); // BUG? Check for all objects being editable? - S32 roots_selected = gSelectMgr->getRootObjectCount(); + S32 roots_selected = gSelectMgr->getSelection()->getRootObjectCount(); BOOL editable = root_objectp->permModify(); - S32 selected_count = gSelectMgr->getObjectCount(); + S32 selected_count = gSelectMgr->getSelection()->getObjectCount(); BOOL single_volume = (gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME )) && (selected_count == 1); @@ -1506,7 +1506,7 @@ void LLPanelObject::draw() const LLColor4 blue( 0.f, 0.5f, 1.0f, 1); // Tune the colors of the labels - LLTool* tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); + LLTool* tool = gToolMgr->getCurrentTool(); if (tool == gToolTranslate) { @@ -1626,7 +1626,7 @@ void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data) BOOL new_state = self->mCheckLock->get(); - gSelectMgr->setObjectPermissions(PERM_OWNER, !new_state, PERM_MOVE | PERM_MODIFY); + gSelectMgr->selectionSetObjectPermissions(PERM_OWNER, !new_state, PERM_MOVE | PERM_MODIFY); } // static diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 332d22ade6..155e178a5e 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -128,16 +128,16 @@ void LLPanelPermissions::refresh() BtnDeedToGroup->setLabelUnselected(deedText); } BOOL root_selected = TRUE; - LLSelectNode* nodep = gSelectMgr->getFirstRootNode(); - S32 object_count = gSelectMgr->getRootObjectCount(); + LLSelectNode* nodep = gSelectMgr->getSelection()->getFirstRootNode(); + S32 object_count = gSelectMgr->getSelection()->getRootObjectCount(); if(!nodep || 0 == object_count) { - nodep = gSelectMgr->getFirstNode(); - object_count = gSelectMgr->getObjectCount(); + nodep = gSelectMgr->getSelection()->getFirstNode(); + object_count = gSelectMgr->getSelection()->getObjectCount(); root_selected = FALSE; } - //BOOL attachment_selected = gSelectMgr->selectionIsAttachment(); + //BOOL attachment_selected = gSelectMgr->getSelection()->isAttachment(); //attachment_selected = false; LLViewerObject* objectp = NULL; if(nodep) objectp = nodep->getObject(); @@ -230,7 +230,7 @@ void LLPanelPermissions::refresh() BOOL is_one_object = (object_count == 1); // BUG: fails if a root and non-root are both single-selected. - BOOL is_perm_modify = (gSelectMgr->getFirstRootNode() + BOOL is_perm_modify = (gSelectMgr->getSelection()->getFirstRootNode() && gSelectMgr->selectGetRootsModify()) || gSelectMgr->selectGetModify(); const LLView* keyboard_focus_view = gFocusMgr.getKeyboardFocus(); @@ -354,8 +354,8 @@ void LLPanelPermissions::refresh() // Pre-compute object info string - S32 prim_count = gSelectMgr->getObjectCount(); - S32 obj_count = gSelectMgr->getRootObjectCount(); + S32 prim_count = gSelectMgr->getSelection()->getObjectCount(); + S32 obj_count = gSelectMgr->getSelection()->getRootObjectCount(); LLString object_info_string; if (1 == obj_count) @@ -833,7 +833,7 @@ void LLPanelPermissions::onClickDeedToGroup(void* data) // static void LLPanelPermissions::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm) { - LLViewerObject* object = gSelectMgr->getFirstRootObject(); + LLViewerObject* object = gSelectMgr->getSelection()->getFirstRootObject(); if(!object) return; // Checkbox will have toggled itself @@ -841,7 +841,7 @@ void LLPanelPermissions::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; BOOL new_state = check->get(); - gSelectMgr->setObjectPermissions(field, new_state, perm); + gSelectMgr->selectionSetObjectPermissions(field, new_state, perm); } // static @@ -892,8 +892,8 @@ void LLPanelPermissions::onCommitName(LLUICtrl*, void* data) LLLineEditor* tb = gUICtrlFactory->getLineEditorByName(self,"Object Name"); if(tb) { - gSelectMgr->setObjectName(tb->getText()); -// gSelectMgr->setObjectName(self->mLabelObjectName->getText()); + gSelectMgr->selectionSetObjectName(tb->getText()); +// gSelectMgr->selectionSetObjectName(self->mLabelObjectName->getText()); } } @@ -906,7 +906,7 @@ void LLPanelPermissions::onCommitDesc(LLUICtrl*, void* data) LLLineEditor* le = gUICtrlFactory->getLineEditorByName(self,"Object Description"); if(le) { - gSelectMgr->setObjectDescription(le->getText()); + gSelectMgr->selectionSetObjectDescription(le->getText()); } } @@ -968,7 +968,7 @@ void LLPanelPermissions::setAllSaleInfo() } LLSaleInfo sale_info(sale_type, price); - gSelectMgr->setObjectSaleInfo(sale_info); + gSelectMgr->selectionSetObjectSaleInfo(sale_info); // If turned off for-sale, make sure click-action buy is turned // off as well @@ -1022,7 +1022,7 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*) { // Verify object has script with money() handler LLSelectionPayable payable; - bool can_pay = gSelectMgr->applyToObjects(&payable); + bool can_pay = gSelectMgr->getSelection()->applyToObjects(&payable); if (!can_pay) { // Warn, but do it anyway. diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index d43513fc54..508645e227 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -117,11 +117,11 @@ LLPanelVolume::~LLPanelVolume() void LLPanelVolume::getState( ) { - LLViewerObject* objectp = gSelectMgr->getFirstRootObject(); + LLViewerObject* objectp = gSelectMgr->getSelection()->getFirstRootObject(); LLViewerObject* root_objectp = objectp; if(!objectp) { - objectp = gSelectMgr->getFirstObject(); + objectp = gSelectMgr->getSelection()->getFirstObject(); // *FIX: shouldn't we just keep the child? if (objectp) { @@ -166,7 +166,7 @@ void LLPanelVolume::getState( ) // BUG? Check for all objects being editable? BOOL editable = root_objectp->permModify(); BOOL single_volume = gSelectMgr->selectionAllPCode( LL_PCODE_VOLUME ) - && gSelectMgr->getObjectCount() == 1; + && gSelectMgr->getSelection()->getObjectCount() == 1; // Select Single Message if (single_volume) diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index a2cb01310f..7241b939ad 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -33,6 +33,7 @@ // Globals and statics LLPreview::preview_multimap_t LLPreview::sPreviewsBySource; LLPreview::preview_map_t LLPreview::sInstances; +std::map<LLUUID, LLViewHandle> LLMultiPreview::sAutoOpenPreviewHandles; // Functions LLPreview::LLPreview(const std::string& name) : @@ -200,11 +201,11 @@ void LLPreview::onCommit() { gSelectMgr->deselectAll(); gSelectMgr->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); - gSelectMgr->setObjectDescription( childGetText("desc") ); + gSelectMgr->selectionSetObjectDescription( childGetText("desc") ); if( has_sale_info ) { - gSelectMgr->setObjectSaleInfo( sale_info ); + gSelectMgr->selectionSetObjectSaleInfo( sale_info ); } gSelectMgr->deselectAll(); @@ -492,3 +493,23 @@ void LLMultiPreview::tabOpen(LLFloater* opened_floater, bool from_click) opened_preview->loadAsset(); } } + +//static +LLMultiPreview* LLMultiPreview::getAutoOpenInstance(const LLUUID& id) +{ + handle_map_t::iterator found_it = sAutoOpenPreviewHandles.find(id); + if (found_it != sAutoOpenPreviewHandles.end()) + { + return (LLMultiPreview*)gFloaterView->getFloaterByHandle(found_it->second); + } + return NULL; +} + +//static +void LLMultiPreview::setAutoOpenInstance(LLMultiPreview* previewp, const LLUUID& id) +{ + if (previewp) + { + sAutoOpenPreviewHandles[id] = previewp->getHandle(); + } +}
\ No newline at end of file diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 6477393267..ac3f4da996 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -15,7 +15,7 @@ #include "lluuid.h" #include "llviewerinventory.h" #include "lltabcontainer.h" -#include "lllineeditor.h" +#include <map> class LLLineEditor; class LLRadioGroup; @@ -28,6 +28,13 @@ public: /*virtual*/void open(); /*Flawfinder: ignore*/ /*virtual*/void tabOpen(LLFloater* opened_floater, bool from_click); + + static LLMultiPreview* getAutoOpenInstance(const LLUUID& id); + static void setAutoOpenInstance(LLMultiPreview* previewp, const LLUUID& id); + +protected: + typedef std::map<LLUUID, LLViewHandle> handle_map_t; + static std::map<LLUUID, LLViewHandle> sAutoOpenPreviewHandles; }; class LLPreview : public LLFloater diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index 8b0f55aff9..871a0c55b7 100644 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -16,6 +16,7 @@ #include "audioengine.h" #include "llviewermessage.h" // send_guid_sound_trigger #include "llagent.h" // gAgent +#include "lllineeditor.h" #include "llvieweruictrlfactory.h" extern LLAudioEngine* gAudiop; diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index d1817c8cda..b9c63b5ad8 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -23,6 +23,7 @@ #include "llimagetga.h" #include "llfilepicker.h" #include "llvieweruictrlfactory.h" +#include "lllineeditor.h" const S32 PREVIEW_TEXTURE_MIN_WIDTH = 300; const S32 PREVIEW_TEXTURE_MIN_HEIGHT = 120; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 3ae4ba9107..b1c6ea7213 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -103,6 +103,10 @@ LLColor4 LLSelectMgr::sHighlightParentColor; LLColor4 LLSelectMgr::sHighlightChildColor; LLColor4 LLSelectMgr::sContextSilhouetteColor; +static LLObjectSelection* get_null_object_selection(); +template<> + const LLHandle<LLObjectSelection>::NullFunc + LLHandle<LLObjectSelection>::sNullFunc = get_null_object_selection; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // struct LLDeRezInfo @@ -127,6 +131,13 @@ struct LLDeRezInfo // Functions // +LLObjectSelection* get_null_object_selection() +{ + static LLObjectSelectionHandle null_ptr(new LLObjectSelection()); + return (LLObjectSelection*)null_ptr; +} + + //----------------------------------------------------------------------------- // LLSelectMgr() //----------------------------------------------------------------------------- @@ -158,7 +169,9 @@ LLSelectMgr::LLSelectMgr() gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD); mGridValid = FALSE; - mSelectType = SELECT_TYPE_WORLD; + mSelectedObjects = new LLObjectSelection(); + mHoverObjects = new LLObjectSelection(); + mHighlightedObjects = new LLObjectSelection(); } @@ -167,55 +180,18 @@ LLSelectMgr::LLSelectMgr() //----------------------------------------------------------------------------- LLSelectMgr::~LLSelectMgr() { - mHoverObjects.deleteAllNodes(); - mSelectedObjects.deleteAllNodes(); - mHighlightedObjects.deleteAllNodes(); + mHoverObjects->deleteAllNodes(); + mSelectedObjects->deleteAllNodes(); + mHighlightedObjects->deleteAllNodes(); mRectSelectedObjects.clear(); mGridObjects.deleteAllNodes(); - mUndoQueue.clear(); - mRedoQueue.clear(); -} - -bool LLSelectMgr::applyToObjects(LLSelectedObjectFunctor* func) -{ - bool result = true; - LLViewerObject* object; - for (object = getFirstObject(); object != NULL; object = getNextObject()) - { - result = result && func->apply(object); - } - return result; -} - -bool LLSelectMgr::applyToRootObjects(LLSelectedObjectFunctor* func) -{ - bool result = true; - LLViewerObject* object; - for (object = getFirstRootObject(); - object != NULL; - object = getNextRootObject()) - { - result = result && func->apply(object); - } - return result; -} - -bool LLSelectMgr::applyToNodes(LLSelectedNodeFunctor *func) -{ - bool result = true; - LLSelectNode* node; - for (node = getFirstNode(); node != NULL; node = getNextNode()) - { - result = result && func->apply(node); - } - return result; } void LLSelectMgr::updateEffects() { if (mEffectsTimer.getElapsedTimeF32() > 1.f) { - mSelectedObjects.updateEffects(); + mSelectedObjects->updateEffects(); mEffectsTimer.reset(); } } @@ -223,7 +199,7 @@ void LLSelectMgr::updateEffects() //----------------------------------------------------------------------------- // Select just the object, not any other group members. //----------------------------------------------------------------------------- -void LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face) +LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face) { llassert( object ); @@ -232,13 +208,13 @@ void LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face) // make sure point at position is updated updatePointAt(); gEditMenuHandler = this; - return; + return NULL; } if (!canSelectObject(object)) { //make_ui_sound("UISndInvalidOp"); - return; + return NULL; } // llinfos << "Adding object to selected object list" << llendl; @@ -272,16 +248,18 @@ void LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face) // have selection manager handle edit menu immediately after // user selects an object - if (getObjectCount()) + if (mSelectedObjects->getObjectCount()) { gEditMenuHandler = this; } + + return mSelectedObjects; } //----------------------------------------------------------------------------- // Select the object, parents and children. //----------------------------------------------------------------------------- -void LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) +LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) { llassert( obj ); @@ -292,13 +270,13 @@ void LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) // make sure pointat position is updated updatePointAt(); gEditMenuHandler = this; - return; + return NULL; } if (!canSelectObject(obj)) { //make_ui_sound("UISndInvalidOp"); - return; + return NULL; } // Since we're selecting a family, start at the root, but @@ -347,16 +325,18 @@ void LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) // have selection manager handle edit menu immediately after // user selects an object - if (getObjectCount()) + if (mSelectedObjects->getObjectCount()) { gEditMenuHandler = this; } + + return mSelectedObjects; } //----------------------------------------------------------------------------- // Select the object, parents and children. //----------------------------------------------------------------------------- -void LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, +LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, BOOL send_to_sim) { // Collect all of the objects, children included @@ -364,7 +344,7 @@ void LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& o LLViewerObject *object; S32 i; - if (object_list.count() < 1) return; + if (object_list.count() < 1) return NULL; // NOTE -- we add the objects in REVERSE ORDER // to preserve the order in the mSelectedObjects list @@ -410,25 +390,25 @@ void LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& o // have selection manager handle edit menu immediately after // user selects an object - if (getObjectCount()) + if (mSelectedObjects->getObjectCount()) { gEditMenuHandler = this; } + + return mSelectedObjects; } // Use for when the simulator kills an object. This version also // handles informing the current tool of the object's deletion. // // Caller needs to call dialog_refresh_all if necessary. -BOOL LLSelectMgr::selectionRemoveObject(const LLUUID &id) +BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id) { - - BOOL object_found = FALSE; LLTool *tool = NULL; if (!gNoRender) { - tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); + tool = gToolMgr->getCurrentTool(); // It's possible that the tool is editing an object that is not selected LLViewerObject* tool_editing_object = tool->getEditingObject(); @@ -443,13 +423,13 @@ BOOL LLSelectMgr::selectionRemoveObject(const LLUUID &id) if( !object_found ) { LLViewerObject* prevobjp = NULL; - for( LLViewerObject* tobjp = getFirstObject(); tobjp != NULL; tobjp = getNextObject() ) + for( LLViewerObject* tobjp = mSelectedObjects->getFirstObject(); tobjp != NULL; tobjp = mSelectedObjects->getNextObject() ) { if (tobjp == prevobjp) { // Somehow we got stuck in an infinite loop... (DaveP) // this logic is kind of twisted, not sure how this is happening, so... - llwarns << "Detected infinite loop #1 in LLSelectMgr::selectionRemoveObject:|" << llendl; + llwarns << "Detected infinite loop #1 in LLSelectMgr::removeObjectFromSelections:|" << llendl; //MikeS. adding warning and comment... //These infinite loops happen because the LLSelectMgr iteration routines are non-reentrant. //deselectObjectAndFamily uses getFirstObject and getNextObject to mess with the array, @@ -473,7 +453,7 @@ BOOL LLSelectMgr::selectionRemoveObject(const LLUUID &id) if(object_found == TRUE){ //MikeS. adding warning... This happens when removing a linked attachment while sitting on an object.. //I think the selection manager needs to be rewritten. BAD. - llwarns << "Detected infinite loop #2 in LLSelectMgr::selectionRemoveObject:|" << llendl; + llwarns << "Detected infinite loop #2 in LLSelectMgr::removeObjectFromSelections:|" << llendl; break; } object_found = TRUE; @@ -594,11 +574,11 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add nodep = new LLSelectNode(objectp, TRUE); if (add_to_end) { - mSelectedObjects.addNodeAtEnd(nodep); + mSelectedObjects->addNodeAtEnd(nodep); } else { - mSelectedObjects.addNode(nodep); + mSelectedObjects->addNode(nodep); } objectp->setSelected(TRUE); @@ -615,7 +595,7 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add { // we want this object to be selected for real // so clear transient flag - LLSelectNode* select_node = findSelectNode(objectp); + LLSelectNode* select_node = mSelectedObjects->findNode(objectp); if (select_node) { select_node->setTransient(FALSE); @@ -631,21 +611,21 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoable) { // check to see if object is already in list - LLSelectNode *nodep = findSelectNode(objectp); + LLSelectNode *nodep = mSelectedObjects->findNode(objectp); // if not in list, add it if (!nodep) { nodep = new LLSelectNode(objectp, TRUE); - mSelectedObjects.addNode(nodep); + mSelectedObjects->addNode(nodep); } else { // make this a full-fledged selection nodep->setTransient(FALSE); // Move it to the front of the list - mSelectedObjects.removeNode(nodep); - mSelectedObjects.addNode(nodep); + mSelectedObjects->removeNode(nodep); + mSelectedObjects->addNode(nodep); } // Make sure the object is tagged as selected @@ -679,26 +659,26 @@ void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoab } -void LLSelectMgr::setHoverObject(LLViewerObject *objectp) +LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp) { // Always blitz hover list when setting - mHoverObjects.deleteAllNodes(); + mHoverObjects->deleteAllNodes(); if (!objectp) { - return; + return NULL; } // Can't select yourself if (objectp->mID == gAgentID) { - return; + return NULL; } // Can't select land if (objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) { - return; + return NULL; } // Collect all of the objects @@ -714,15 +694,16 @@ void LLSelectMgr::setHoverObject(LLViewerObject *objectp) { cur_objectp = objects[i]; nodep = new LLSelectNode(cur_objectp, FALSE); - mHoverObjects.addNodeAtEnd(nodep); + mHoverObjects->addNodeAtEnd(nodep); } requestObjectPropertiesFamily(objectp); + return mHoverObjects; } LLSelectNode *LLSelectMgr::getHoverNode() { - return getHoverObjects().getFirstRootNode(); + return getHoverObjects()->getFirstRootNode(); } void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp) @@ -823,20 +804,20 @@ void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp) void LLSelectMgr::unhighlightAll() { mRectSelectedObjects.clear(); - mHighlightedObjects.deleteAllNodes(); + mHighlightedObjects->deleteAllNodes(); } -void LLSelectMgr::selectHighlightedObjects() +LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects() { - if (!mHighlightedObjects.getNumNodes()) + if (!mHighlightedObjects->getNumNodes()) { - return; + return NULL; } LLSelectNode *nodep; - for (nodep = mHighlightedObjects.getFirstNode(); + for (nodep = mHighlightedObjects->getFirstNode(); nodep; - nodep = mHighlightedObjects.getNextNode()) + nodep = mHighlightedObjects->getNextNode()) { LLViewerObject* objectp = nodep->getObject(); @@ -852,12 +833,12 @@ void LLSelectMgr::selectHighlightedObjects() } LLSelectNode* new_nodep = new LLSelectNode(*nodep); - mSelectedObjects.addNode(new_nodep); + mSelectedObjects->addNode(new_nodep); // flag this object as selected objectp->setSelected(TRUE); - mSelectType = getSelectTypeForObject(objectp); + mSelectedObjects->mSelectType = getSelectTypeForObject(objectp); // request properties on root objects if (objectp->isRootEdit()) @@ -873,10 +854,12 @@ void LLSelectMgr::selectHighlightedObjects() saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); updatePointAt(); - if (getObjectCount()) + if (mSelectedObjects->getObjectCount()) { gEditMenuHandler = this; } + + return mSelectedObjects; } void LLSelectMgr::deselectHighlightedObjects() @@ -938,7 +921,7 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 & grid_object = NULL; } - if (mGridMode == GRID_MODE_LOCAL && gSelectMgr->getObjectCount()) + if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount()) { LLBBox bbox = mSavedSelectionBBox; mGridOrigin = mSavedSelectionBBox.getCenterAgent(); @@ -992,18 +975,18 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 & } else // GRID_MODE_WORLD or just plain default { - LLViewerObject* first_object = gSelectMgr->getFirstRootObject(); + LLViewerObject* first_object = mSelectedObjects->getFirstRootObject(); if (!first_object) { - first_object = gSelectMgr->getFirstObject(); + first_object = mSelectedObjects->getFirstObject(); } mGridOrigin.clearVec(); mGridRotation.loadIdentity(); - mSelectType = getSelectTypeForObject( first_object ); + mSelectedObjects->mSelectType = getSelectTypeForObject( first_object ); - switch (mSelectType) + switch (mSelectedObjects->mSelectType) { case SELECT_TYPE_ATTACHMENT: if (first_object) @@ -1032,59 +1015,6 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 & mGridValid = TRUE; } - - -LLSelectNode* LLSelectMgr::findSelectNode(LLViewerObject *object) -{ - return mSelectedObjects.findNode(object); -} - -//----------------------------------------------------------------------------- -// contains() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::contains(LLViewerObject* object) -{ - return mSelectedObjects.findNode(object) != NULL; -} - - -//----------------------------------------------------------------------------- -// contains() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::contains(LLViewerObject* object, S32 te) -{ - LLSelectNode *nodep; - if (te == SELECT_ALL_TES) - { - // ...all faces - for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() ) - { - if (nodep->getObject() == object) - { - BOOL all_selected = TRUE; - for (S32 i = 0; i < SELECT_MAX_TES; i++) - { - all_selected = all_selected && nodep->isTESelected(i); - } - return all_selected; - } - } - return FALSE; - } - else - { - // ...one face - for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() ) - { - if (nodep->getObject() == object && nodep->isTESelected(te)) - { - return TRUE; - } - } - return FALSE; - } -} - //----------------------------------------------------------------------------- // remove() - an array of objects //----------------------------------------------------------------------------- @@ -1097,14 +1027,14 @@ void LLSelectMgr::remove(LLDynamicArray<LLViewerObject*>& objects) for(S32 i = 0; i < count; i++) { objectp = objects.get(i); - for(nodep = mSelectedObjects.getFirstNode(); + for(nodep = mSelectedObjects->getFirstNode(); nodep != NULL; - nodep = mSelectedObjects.getNextNode()) + nodep = mSelectedObjects->getNextNode()) { if(nodep->getObject() == objectp) { objectp->setSelected(FALSE); - mSelectedObjects.removeNode(nodep); + mSelectedObjects->removeNode(nodep); break; } } @@ -1121,7 +1051,7 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable) { // check if object already in list // *FIX: can we just check isSelected()? - LLSelectNode *nodep = findSelectNode(objectp); + LLSelectNode *nodep = mSelectedObjects->findNode(objectp); if (!nodep) { @@ -1133,12 +1063,12 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable) if (objectp->getNumTEs() <= 0) { // object doesn't have faces, so blow it away - mSelectedObjects.removeNode(nodep); + mSelectedObjects->removeNode(nodep); objectp->setSelected( FALSE ); } else if (te == SELECT_ALL_TES) { - mSelectedObjects.removeNode(nodep); + mSelectedObjects->removeNode(nodep); objectp->setSelected( FALSE ); } else if (0 <= te && te < SELECT_MAX_TES) @@ -1164,7 +1094,7 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable) // ...all faces now turned off, so remove if (!found) { - mSelectedObjects.removeNode(nodep); + mSelectedObjects->removeNode(nodep); objectp->setSelected( FALSE ); // BUG: Doesn't update simulator that object is gone. @@ -1187,12 +1117,12 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable) void LLSelectMgr::removeAll() { LLViewerObject *objectp; - for (objectp = mSelectedObjects.getFirstObject(); objectp; objectp = mSelectedObjects.getNextObject() ) + for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject() ) { objectp->setSelected( FALSE ); } - mSelectedObjects.deleteAllNodes(); + mSelectedObjects->deleteAllNodes(); updateSelectionCenter(); dialog_refresh_all(); @@ -1209,9 +1139,9 @@ void LLSelectMgr::promoteSelectionToRoot() LLSelectNode* nodep; LLViewerObject *objectp; - for (nodep = mSelectedObjects.getFirstNode(); + for (nodep = mSelectedObjects->getFirstNode(); nodep; - nodep = mSelectedObjects.getNextNode() ) + nodep = mSelectedObjects->getNextNode() ) { if (nodep->mIndividualSelection) { @@ -1247,9 +1177,9 @@ void LLSelectMgr::demoteSelectionToIndividuals() { LLDynamicArray<LLViewerObject*> objects; - for (LLViewerObject* root_objectp = mSelectedObjects.getFirstRootObject(); + for (LLViewerObject* root_objectp = mSelectedObjects->getFirstRootObject(); root_objectp; - root_objectp = mSelectedObjects.getNextRootObject()) + root_objectp = mSelectedObjects->getNextRootObject()) { root_objectp->addThisAndNonJointChildren(objects); } @@ -1265,71 +1195,20 @@ void LLSelectMgr::demoteSelectionToIndividuals() } //----------------------------------------------------------------------------- -// getObjectCount() -//----------------------------------------------------------------------------- -S32 LLSelectMgr::getObjectCount() -{ - return mSelectedObjects.getNumNodes(); -} - - -//----------------------------------------------------------------------------- -// getTECount() -//----------------------------------------------------------------------------- -S32 LLSelectMgr::getTECount() -{ - S32 count = 0; - - LLSelectNode* nodep; - for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() ) - { - if (nodep->getObject()) - { - S32 num_tes = nodep->getObject()->getNumTEs(); - for (S32 te = 0; te < num_tes; te++) - { - if (nodep->isTESelected(te)) - { - count++; - } - } - } - } - - return count; -} - -//----------------------------------------------------------------------------- -// getRootObjectCount() -//----------------------------------------------------------------------------- -S32 LLSelectMgr::getRootObjectCount() -{ - LLSelectNode *nodep; - - S32 count = 0; - for(nodep = mSelectedObjects.getFirstRootNode(); nodep; nodep = mSelectedObjects.getNextRootNode()) - { - ++count; - } - return count; -} - - -//----------------------------------------------------------------------------- // dump() //----------------------------------------------------------------------------- void LLSelectMgr::dump() { - llinfos << "Selection Manager: " << mSelectedObjects.getNumNodes() << " items" << llendl; + llinfos << "Selection Manager: " << mSelectedObjects->getNumNodes() << " items" << llendl; llinfos << "TE mode " << mTEMode << llendl; S32 i = 0; LLViewerObject *objectp; - for (objectp = mSelectedObjects.getFirstObject(); + for (objectp = mSelectedObjects->getFirstObject(); objectp; - objectp = mSelectedObjects.getNextObject()) + objectp = mSelectedObjects->getNextObject()) { llinfos << "Object " << i << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl; llinfos << " hasLSL " << objectp->flagScripted() << llendl; @@ -1347,14 +1226,14 @@ void LLSelectMgr::dump() // Face iterator S32 te; - for (mSelectedObjects.getFirstTE(&objectp, &te); + for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; - mSelectedObjects.getNextTE(&objectp, &te)) + mSelectedObjects->getNextTE(&objectp, &te)) { llinfos << "Object " << objectp << " te " << te << llendl; } - llinfos << mHighlightedObjects.getNumNodes() << " objects currently highlighted." << llendl; + llinfos << mHighlightedObjects->getNumNodes() << " objects currently highlighted." << llendl; llinfos << "Center global " << mSelectionCenterGlobal << llendl; } @@ -1383,7 +1262,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) if(item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) - && (mSelectedObjects.getNumNodes() > 1) ) + && (mSelectedObjects->getNumNodes() > 1) ) { llwarns << "Attempted to apply no-copy texture to multiple objects" << llendl; @@ -1394,7 +1273,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) S32 te; // Apply the texture to each side - for (mSelectedObjects.getFirstTE(&objectp, &te); objectp; mSelectedObjects.getNextTE(&objectp, &te)) + for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te)) { if (item) @@ -1405,14 +1284,14 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) // *TODO: Replace mSelectedObjects with a REAL container class! LLViewerObject* tmp_object; S32 tmp_te; - mSelectedObjects.getCurrentTE(&tmp_object,&tmp_te); + mSelectedObjects->getCurrentTE(&tmp_object,&tmp_te); if ((tmp_object != objectp) || (tmp_te != te) ) { //AAARG someone has moved our list around! - mSelectedObjects.getFirstTE(&tmp_object, &tmp_te); + mSelectedObjects->getFirstTE(&tmp_object, &tmp_te); while ((tmp_object != objectp) || (tmp_te != te)) { - mSelectedObjects.getNextTE(&tmp_object, &tmp_te); + mSelectedObjects->getNextTE(&tmp_object, &tmp_te); } } } @@ -1427,9 +1306,9 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) } // 1 particle effect per object - if (mSelectType != SELECT_TYPE_HUD) + if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD) { - for (objectp = mSelectedObjects.getFirstObject(); objectp; objectp = mSelectedObjects.getNextObject()) + for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject()) { LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); effectp->setSourceObject(gAgent.getAvatarObject()); @@ -1447,7 +1326,7 @@ void LLSelectMgr::selectionSetColor(const LLColor4 &color) { LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1456,7 +1335,7 @@ void LLSelectMgr::selectionSetColor(const LLColor4 &color) } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1473,7 +1352,7 @@ void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color) LLViewerObject* object; LLColor4 new_color = color; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1484,7 +1363,7 @@ void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color) } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1500,7 +1379,7 @@ void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha) { LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1511,7 +1390,7 @@ void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha) } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1525,11 +1404,11 @@ void LLSelectMgr::selectionRevertColors() LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { - LLSelectNode* nodep = mSelectedObjects.findNode(object); + LLSelectNode* nodep = mSelectedObjects->findNode(object); if (nodep && te < (S32)nodep->mSavedColors.size()) { LLColor4 color = nodep->mSavedColors[te]; @@ -1539,7 +1418,7 @@ void LLSelectMgr::selectionRevertColors() } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1554,11 +1433,11 @@ BOOL LLSelectMgr::selectionRevertTextures() S32 te; BOOL revert_successful = TRUE; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { - LLSelectNode* nodep = mSelectedObjects.findNode(object); + LLSelectNode* nodep = mSelectedObjects->findNode(object); if (nodep && te < (S32)nodep->mSavedTextures.size()) { LLUUID id = nodep->mSavedTextures[te]; @@ -1577,7 +1456,7 @@ BOOL LLSelectMgr::selectionRevertTextures() } // propagate texture changes to server - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1592,7 +1471,7 @@ void LLSelectMgr::selectionSetBumpmap(U8 bumpmap) { LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1601,7 +1480,7 @@ void LLSelectMgr::selectionSetBumpmap(U8 bumpmap) } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1614,7 +1493,7 @@ void LLSelectMgr::selectionSetTexGen(U8 texgen) { LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1623,7 +1502,7 @@ void LLSelectMgr::selectionSetTexGen(U8 texgen) } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1637,7 +1516,7 @@ void LLSelectMgr::selectionSetShiny(U8 shiny) { LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1646,7 +1525,7 @@ void LLSelectMgr::selectionSetShiny(U8 shiny) } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1659,7 +1538,7 @@ void LLSelectMgr::selectionSetFullbright(U8 fullbright) { LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1668,7 +1547,7 @@ void LLSelectMgr::selectionSetFullbright(U8 fullbright) } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1699,7 +1578,7 @@ void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string& media_flags = LLTextureEntry::MF_WEB_PAGE; } - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) ) { if (object->permModify()) { @@ -1708,7 +1587,7 @@ void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string& } } - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -1730,7 +1609,7 @@ LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object) { LLSelectNode* nodep; - for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() ) + for (nodep = mSelectedObjects->getFirstNode(); nodep; nodep = mSelectedObjects->getNextNode() ) { if((nodep->getObject() == object) && nodep->mValid) { @@ -1749,7 +1628,7 @@ BOOL LLSelectMgr::selectionGetTexUUID(LLUUID& id) { LLViewerObject* first_objectp; S32 first_te; - mSelectedObjects.getPrimaryTE(&first_objectp, &first_te); + mSelectedObjects->getPrimaryTE(&first_objectp, &first_te); // nothing selected if (!first_objectp) @@ -1767,7 +1646,7 @@ BOOL LLSelectMgr::selectionGetTexUUID(LLUUID& id) BOOL identical = TRUE; LLViewerObject *objectp; S32 te; - for (mSelectedObjects.getFirstTE(&objectp, &te); objectp; mSelectedObjects.getNextTE(&objectp, &te) ) + for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te) ) { if (objectp->getTEImage(te) != first_imagep) { @@ -1787,7 +1666,7 @@ BOOL LLSelectMgr::selectionGetColor(LLColor4 &color) { LLViewerObject* first_object; S32 first_te; - mSelectedObjects.getPrimaryTE(&first_object, &first_te); + mSelectedObjects->getPrimaryTE(&first_object, &first_te); // nothing selected if (!first_object) @@ -1808,7 +1687,7 @@ BOOL LLSelectMgr::selectionGetColor(LLColor4 &color) BOOL identical = TRUE; LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) { if (!object->getTE(te) || (object->getTE(te)->getColor() != first_color)) { @@ -1829,7 +1708,7 @@ BOOL LLSelectMgr::selectionGetBumpmap(U8 *bumpmap) { LLViewerObject* first_object; S32 first_te; - mSelectedObjects.getPrimaryTE(&first_object, &first_te); + mSelectedObjects->getPrimaryTE(&first_object, &first_te); // nothing selected if (!first_object) @@ -1850,7 +1729,7 @@ BOOL LLSelectMgr::selectionGetBumpmap(U8 *bumpmap) BOOL identical = TRUE; LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) { if (!object->getTE(te) || (object->getTE(te)->getBumpmap() != first_value)) { @@ -1870,7 +1749,7 @@ BOOL LLSelectMgr::selectionGetShiny(U8 *shiny) { LLViewerObject* first_object; S32 first_te; - mSelectedObjects.getPrimaryTE(&first_object, &first_te); + mSelectedObjects->getPrimaryTE(&first_object, &first_te); // nothing selected if (!first_object) @@ -1891,7 +1770,7 @@ BOOL LLSelectMgr::selectionGetShiny(U8 *shiny) BOOL identical = TRUE; LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) { if (!object->getTE(te) || (object->getTE(te)->getShiny() != first_value)) { @@ -1911,7 +1790,7 @@ BOOL LLSelectMgr::selectionGetFullbright(U8 *fullbright) { LLViewerObject* first_object; S32 first_te; - mSelectedObjects.getPrimaryTE(&first_object, &first_te); + mSelectedObjects->getPrimaryTE(&first_object, &first_te); // nothing selected if (!first_object) @@ -1932,7 +1811,7 @@ BOOL LLSelectMgr::selectionGetFullbright(U8 *fullbright) BOOL identical = TRUE; LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) { if (!object->getTE(te) || (object->getTE(te)->getFullbright() != first_value)) { @@ -1950,7 +1829,7 @@ bool LLSelectMgr::selectionGetMediaType(U8 *media_type) { LLViewerObject* first_object; S32 first_te; - mSelectedObjects.getPrimaryTE(&first_object, &first_te); + mSelectedObjects->getPrimaryTE(&first_object, &first_te); // nothing selected if (!first_object) @@ -1971,7 +1850,7 @@ bool LLSelectMgr::selectionGetMediaType(U8 *media_type) bool identical = true; LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) { if (!object->getTE(te) || (object->getTE(te)->getMediaFlags() != first_value)) { @@ -1992,7 +1871,7 @@ bool LLSelectMgr::selectionGetMediaType(U8 *media_type) void LLSelectMgr::selectionSetMaterial(U8 material) { LLViewerObject* object; - for (object = mSelectedObjects.getFirstObject(); object != NULL; object = mSelectedObjects.getNextObject() ) + for (object = mSelectedObjects->getFirstObject(); object != NULL; object = mSelectedObjects->getNextObject() ) { if (object->permModify()) { @@ -2008,7 +1887,7 @@ void LLSelectMgr::selectionSetMaterial(U8 material) BOOL LLSelectMgr::selectionAllPCode(LLPCode code) { LLViewerObject *object; - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if (object->getPCode() != code) { @@ -2023,13 +1902,13 @@ BOOL LLSelectMgr::selectionAllPCode(LLPCode code) //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectionGetMaterial(U8 *out_material) { - LLViewerObject *object = mSelectedObjects.getFirstObject(); + LLViewerObject *object = mSelectedObjects->getFirstObject(); if (!object) return FALSE; U8 material = object->getMaterial(); BOOL identical = TRUE; - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if ( material != object->getMaterial()) { @@ -2044,13 +1923,13 @@ BOOL LLSelectMgr::selectionGetMaterial(U8 *out_material) BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action) { - LLViewerObject *object = mSelectedObjects.getFirstObject(); + LLViewerObject *object = mSelectedObjects->getFirstObject(); if (!object) return FALSE; U8 action = object->getClickAction(); BOOL identical = TRUE; - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if ( action != object->getClickAction()) { @@ -2066,7 +1945,7 @@ BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action) void LLSelectMgr::selectionSetClickAction(U8 action) { LLViewerObject* object = NULL; - for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { object->setClickAction(action); } @@ -2099,7 +1978,7 @@ void LLSelectMgr::sendGodlikeRequest(const LLString& request, const LLString& pa } godlike_request_t data(request, param); - if(!getRootObjectCount()) + if(!mSelectedObjects->getRootObjectCount()) { LLMessageSystem* msg = gMessageSystem; msg->newMessage(message_type.c_str()); @@ -2153,7 +2032,7 @@ void LLSelectMgr::selectionResetRotation() LLQuaternion identity(0.f, 0.f, 0.f, 1.f); LLViewerObject* object; - for (object = mSelectedObjects.getFirstRootObject(); object; object = mSelectedObjects.getNextRootObject() ) + for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() ) { object->setRotation(identity); if (object->mDrawable.notNull()) @@ -2169,7 +2048,7 @@ void LLSelectMgr::selectionRotateAroundZ(F32 degrees) LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) ); LLViewerObject* object; - for (object = mSelectedObjects.getFirstRootObject(); object; object = mSelectedObjects.getNextRootObject() ) + for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() ) { object->setRotation( object->getRotationEdit() * rot ); if (object->mDrawable.notNull()) @@ -2188,7 +2067,7 @@ void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter) { LLViewerObject* object; S32 te; - for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) + for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te)) { if (!object->permModify()) { @@ -2213,7 +2092,7 @@ void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter) object->setTEScale(te, new_s, new_t); } - for (object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject()) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject()) { if (object->permModify()) { @@ -2280,7 +2159,7 @@ void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch) BOOL send = FALSE; - for (selectNode = mSelectedObjects.getFirstNode(); selectNode; selectNode = mSelectedObjects.getNextNode()) + for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode()) { object = selectNode->getObject(); if (!object->permModify()) @@ -2338,7 +2217,7 @@ void LLSelectMgr::selectionResetTexInfo(S32 selected_face) S32 start_face, end_face; LLViewerObject* object; - for (object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject()) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject()) { if (!object->permModify()) { @@ -2373,259 +2252,12 @@ void LLSelectMgr::selectionResetTexInfo(S32 selected_face) } //----------------------------------------------------------------------------- -// getFirstEditableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLSelectMgr::getFirstEditableObject(BOOL get_root) -{ - LLViewerObject* object = NULL; - for(LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject()) - { - if( cur->permModify() ) - { - object = cur; - break; - } - } - - if (get_root && object) - { - LLViewerObject *parent; - while ((parent = (LLViewerObject*)object->getParent())) - { - if (parent->isSelected()) - { - object = parent; - } - else - { - break; - } - } - } - - return object; -} - -//----------------------------------------------------------------------------- -// getFirstMoveableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLSelectMgr::getFirstMoveableObject(BOOL get_root) -{ - LLViewerObject* object = NULL; - for(LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject()) - { - if( cur->permMove() ) - { - object = cur; - break; - } - } - - if (get_root && object && !object->isJointChild()) - { - LLViewerObject *parent; - while ((parent = (LLViewerObject*)object->getParent())) - { - if (parent->isSelected()) - { - object = parent; - } - else - { - break; - } - } - } - - return object; -} - -//----------------------------------------------------------------------------- -// getFirstEditableNode() -//----------------------------------------------------------------------------- -LLSelectNode* LLSelectMgr::getFirstEditableNode(BOOL get_root) -{ - LLSelectNode* selectNode = NULL; - - if (get_root) - { - for(selectNode = mSelectedObjects.getFirstRootNode(); selectNode; selectNode = mSelectedObjects.getNextRootNode()) - { - if( selectNode->getObject()->permModify() ) - { - return selectNode; - break; - } - } - } - for(selectNode = mSelectedObjects.getFirstNode(); selectNode; selectNode = mSelectedObjects.getNextNode()) - { - if( selectNode->getObject()->permModify() ) - { - return selectNode; - break; - } - } - - return NULL; -} - -//----------------------------------------------------------------------------- -// getFirstMoveableNode() -//----------------------------------------------------------------------------- -LLSelectNode* LLSelectMgr::getFirstMoveableNode(BOOL get_root) -{ - LLSelectNode* selectNode = NULL; - - if (get_root) - { - for(selectNode = mSelectedObjects.getFirstRootNode(); selectNode; selectNode = mSelectedObjects.getNextRootNode()) - { - if( selectNode->getObject()->permMove() ) - { - return selectNode; - break; - } - } - } - for(selectNode = mSelectedObjects.getFirstNode(); selectNode; selectNode = mSelectedObjects.getNextNode()) - { - if( selectNode->getObject()->permMove() ) - { - return selectNode; - break; - } - } - - return NULL; -} - -//----------------------------------------------------------------------------- -// getFirstDeleteableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLSelectMgr::getFirstDeleteableObject(BOOL get_root) -{ - //RN: don't currently support deletion of child objects, as that requires separating them first - // then derezzing to trash - get_root = TRUE; - - LLViewerObject* object = NULL; - if (get_root) - { - for(LLViewerObject* current = getFirstRootObject(); - current != NULL; - current = getNextRootObject()) - { - // you can delete an object if permissions allow it, you are - // the owner, you are an officer in the group that owns the - // object, or you are not the owner but it is on land you own - // or land owned by your group. (whew!) - if( (current->permModify()) - || (current->permYouOwner()) - || (!current->permAnyOwner()) // public - || (current->isOverAgentOwnedLand()) - || (current->isOverGroupOwnedLand()) - ) - { - - if( !current->isAttachment() ) - { - object = current; - break; - } - } - } - } - else - { - for(LLViewerObject* current = getFirstObject(); - current != NULL; - current = getNextObject()) - { - // you can delete an object if permissions allow it, you are - // the owner, you are an officer in the group that owns the - // object, or you are not the owner but it is on land you own - // or land owned by your group. (whew!) - if( (current->permModify()) - || (current->permYouOwner()) - || (!current->permAnyOwner()) // public - || (current->isOverAgentOwnedLand()) - || (current->isOverGroupOwnedLand()) - ) - { - if( !current->isAttachment() ) - { - object = current; - break; - } - } - } - } - - return object; -} - -//----------------------------------------------------------------------------- -// getFirstCopyableObject() -//----------------------------------------------------------------------------- -LLViewerObject* LLSelectMgr::getFirstCopyableObject(BOOL get_root) -{ - LLViewerObject* object = NULL; - for(LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject()) - { - if( cur->permCopy() && !cur->isAttachment()) - { - object = cur; - break; - } - } - - if (get_root && object) - { - LLViewerObject *parent; - while ((parent = (LLViewerObject*)object->getParent())) - { - if (parent->isSelected()) - { - object = parent; - } - else - { - break; - } - } - } - - return object; -} - -//----------------------------------------------------------------------------- -// areMultpleEditableObjectsSelected() -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::areMultpleEditableObjectsSelected() -{ - S32 count = 0; - for( LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject() ) - { - if( cur->permModify() ) - { - count++; - if( count > 1 ) - { - return TRUE; - } - } - } - return FALSE; -} - -//----------------------------------------------------------------------------- // selectGetAllRootsValid() // Returns true if the viewer has information on all selected objects //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetAllRootsValid() { - for( LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode() ) + for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if( !node->mValid ) @@ -2648,7 +2280,7 @@ BOOL LLSelectMgr::selectGetAllRootsValid() //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetAllValid() { - for( LLSelectNode* node = getFirstNode(); node; node = getNextNode() ) + for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) { if( !node->mValid ) @@ -2671,7 +2303,7 @@ BOOL LLSelectMgr::selectGetAllValid() //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetModify() { - for( LLSelectNode* node = getFirstNode(); node; node = getNextNode() ) + for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) { if( !node->mValid ) { @@ -2693,7 +2325,7 @@ BOOL LLSelectMgr::selectGetModify() //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetRootsModify() { - for( LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode() ) + for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if( !node->mValid ) { @@ -2716,7 +2348,7 @@ BOOL LLSelectMgr::selectGetRootsModify() //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetRootsTransfer() { - for(LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode()) + for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) { if(!node->mValid) { @@ -2737,7 +2369,7 @@ BOOL LLSelectMgr::selectGetRootsTransfer() //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetRootsCopy() { - for(LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode()) + for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) { if(!node->mValid) { @@ -2758,8 +2390,8 @@ BOOL LLSelectMgr::selectGetRootsCopy() //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name) { - LLSelectNode* node = getFirstRootNode(); - if(!node) node = getFirstNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); + if(!node) node = mSelectedObjects->getFirstNode(); if(!node) return FALSE; if(!node->mValid) return FALSE; LLViewerObject* obj = node->getObject(); @@ -2769,7 +2401,7 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name) id = node->mPermissions->getCreator(); BOOL identical = TRUE; - for ( node = getNextRootNode(); node; node = getNextRootNode() ) + for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if (!node->mValid) { @@ -2808,8 +2440,8 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name) //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name) { - LLSelectNode* node = getFirstRootNode(); - if(!node) node = getFirstNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); + if(!node) node = mSelectedObjects->getFirstNode(); if(!node) return FALSE; if(!node->mValid) return FALSE; LLViewerObject* obj = node->getObject(); @@ -2821,7 +2453,7 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name) node->mPermissions->getOwnership(id, group_owner); BOOL identical = TRUE; - for ( node = getNextRootNode(); node; node = getNextRootNode() ) + for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if (!node->mValid) { @@ -2876,8 +2508,8 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name) //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name) { - LLSelectNode* node = getFirstRootNode(); - if(!node) node = getFirstNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); + if(!node) node = mSelectedObjects->getFirstNode(); if(!node) return FALSE; if(!node->mValid) return FALSE; LLViewerObject* obj = node->getObject(); @@ -2887,7 +2519,7 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name) id = node->mPermissions->getLastOwner(); BOOL identical = TRUE; - for ( node = getNextRootNode(); node; node = getNextRootNode() ) + for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if (!node->mValid) { @@ -2935,8 +2567,8 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name) //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetGroup(LLUUID& id) { - LLSelectNode* node = getFirstRootNode(); - if(!node) node = getFirstNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); + if(!node) node = mSelectedObjects->getFirstNode(); if(!node) return FALSE; if(!node->mValid) return FALSE; LLViewerObject* obj = node->getObject(); @@ -2946,7 +2578,7 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& id) id = node->mPermissions->getGroup(); BOOL identical = TRUE; - for ( node = getNextRootNode(); node; node = getNextRootNode() ) + for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if (!node->mValid) { @@ -2971,8 +2603,8 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& id) //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectIsGroupOwned() { - LLSelectNode* node = getFirstRootNode(); - if(!node) node = getFirstNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); + if(!node) node = mSelectedObjects->getFirstNode(); if(!node) return FALSE; if(!node->mValid) return FALSE; LLViewerObject* obj = node->getObject(); @@ -2983,7 +2615,7 @@ BOOL LLSelectMgr::selectIsGroupOwned() if(is_group_owned) { - for ( node = getNextRootNode(); node; node = getNextRootNode() ) + for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if (!node->mValid) { @@ -3012,7 +2644,7 @@ BOOL LLSelectMgr::selectIsGroupOwned() //----------------------------------------------------------------------------- BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off) { - LLSelectNode* node = getFirstRootNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); if (!node) return FALSE; if (!node->mValid) return FALSE; @@ -3021,7 +2653,7 @@ BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off) U32 mask_or = 0x00000000; BOOL all_valid = TRUE; - for ( node = getFirstRootNode(); node; node = getNextRootNode() ) + for ( node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if (!node->mValid) { @@ -3075,17 +2707,17 @@ BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off) BOOL LLSelectMgr::selectGetOwnershipCost(S32* out_cost) { - return mSelectedObjects.getOwnershipCost(*out_cost); + return mSelectedObjects->getOwnershipCost(*out_cost); } BOOL LLSelectMgr::selectGetPermissions(LLPermissions& perm) { - LLSelectNode* node = getFirstRootNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); if (!node) return FALSE; if (!node->mValid) return FALSE; BOOL valid = TRUE; perm = *(node->mPermissions); - for(node = getNextRootNode(); node != NULL; node = getNextRootNode()) + for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode()) { if(!node->mValid) { @@ -3105,9 +2737,9 @@ void LLSelectMgr::selectDelete() BOOL locked_but_deleteable_object = FALSE; BOOL no_copy_but_deleteable_object = FALSE; BOOL all_owned_by_you = TRUE; - for(LLViewerObject* obj = getFirstObject(); + for(LLViewerObject* obj = mSelectedObjects->getFirstObject(); obj != NULL; - obj = getNextObject()) + obj = mSelectedObjects->getNextObject()) { if( obj->isAttachment() ) { @@ -3226,13 +2858,13 @@ void LLSelectMgr::confirmDelete(S32 option, void* data) (void*)info, SEND_ONLY_ROOTS); // VEFFECT: Delete Object - one effect for all deletes - if (self->mSelectType != SELECT_TYPE_HUD) + if (self->mSelectedObjects->mSelectType != SELECT_TYPE_HUD) { LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); effectp->setPositionGlobal( self->getSelectionCenterGlobal() ); effectp->setColor(LLColor4U(gAgent.getEffectColor())); F32 duration = 0.5f; - duration += self->getObjectCount() / 64.f; + duration += self->mSelectedObjects->getObjectCount() / 64.f; effectp->setDuration(duration); } @@ -3240,7 +2872,7 @@ void LLSelectMgr::confirmDelete(S32 option, void* data) // Keep track of how many objects have been deleted. F64 obj_delete_count = gViewerStats->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT); - obj_delete_count += self->getObjectCount(); + obj_delete_count += self->mSelectedObjects->getObjectCount(); gViewerStats->setStat(LLViewerStats::ST_OBJECT_DELETE_COUNT, obj_delete_count ); } break; @@ -3270,7 +2902,7 @@ BOOL LLSelectMgr::selectIsForSale(S32& price) price = 0; LLSelectNode *node; - for (node = getFirstRootNode(); node; node = getNextRootNode() ) + for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() ) { if (node->mSaleInfo.isForSale()) { @@ -3287,12 +2919,12 @@ BOOL LLSelectMgr::selectIsForSale(S32& price) // accumulated sale info. BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& sale_info) { - LLSelectNode* node = getFirstRootNode(); + LLSelectNode* node = mSelectedObjects->getFirstRootNode(); if (!node) return FALSE; if (!node->mValid) return FALSE; BOOL valid = TRUE; sale_info = node->mSaleInfo; - for(node = getNextRootNode(); node != NULL; node = getNextRootNode()) + for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode()) { if(!node->mValid) { @@ -3306,12 +2938,12 @@ BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& sale_info) BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& ag_perm) { - LLSelectNode* node = getFirstNode(); + LLSelectNode* node = mSelectedObjects->getFirstNode(); if (!node) return FALSE; if (!node->mValid) return FALSE; BOOL valid = TRUE; ag_perm = node->mAggregatePerm; - for(node = getNextNode(); node != NULL; node = getNextNode()) + for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode()) { if(!node->mValid) { @@ -3325,12 +2957,12 @@ BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& ag_perm) BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& ag_perm) { - LLSelectNode* node = getFirstNode(); + LLSelectNode* node = mSelectedObjects->getFirstNode(); if (!node) return FALSE; if (!node->mValid) return FALSE; BOOL valid = TRUE; ag_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm; - for(node = getNextNode(); node != NULL; node = getNextNode()) + for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode()) { if(!node->mValid) { @@ -3343,12 +2975,6 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& a } -// returns TRUE is any node is currenly worn as an attachment -BOOL LLSelectMgr::selectionIsAttachment() -{ - return (mSelectType == SELECT_TYPE_ATTACHMENT || mSelectType == SELECT_TYPE_HUD); -} - //-------------------------------------------------------------------- // Duplicate objects //-------------------------------------------------------------------- @@ -3364,7 +2990,7 @@ struct LLDuplicateData void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy) { - if (selectionIsAttachment()) + if (mSelectedObjects->isAttachment()) { //RN: do not duplicate attachments make_ui_sound("UISndInvalidOp"); @@ -3384,7 +3010,7 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy) } else { - for (LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode()) + for (LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) { node->mDuplicated = TRUE; node->mDuplicatePos = node->getObject()->getPositionGlobal(); @@ -3395,7 +3021,7 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy) void LLSelectMgr::repeatDuplicate() { - if (selectionIsAttachment()) + if (mSelectedObjects->isAttachment()) { //RN: do not duplicate attachments make_ui_sound("UISndInvalidOp"); @@ -3405,7 +3031,7 @@ void LLSelectMgr::repeatDuplicate() LLSelectNode* node; LLDynamicArray<LLViewerObject*> non_duplicated_objects; - for (node = getFirstRootNode(); node; node = getNextRootNode()) + for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) { if (!node->mDuplicated) { @@ -3428,7 +3054,7 @@ void LLSelectMgr::repeatDuplicate() sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS); // move current selection based on delta from duplication position and update duplication position - for (node = getFirstRootNode(); node; node = getNextRootNode()) + for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode()) { if (node->mDuplicated) { @@ -3483,7 +3109,7 @@ void LLSelectMgr::selectDuplicateOnRay(const LLVector3 &ray_start_region, BOOL copy_rotates, BOOL select_copy) { - if (selectionIsAttachment()) + if (mSelectedObjects->isAttachment()) { // do not duplicate attachments make_ui_sound("UISndInvalidOp"); @@ -3695,7 +3321,7 @@ struct LLPermData }; // TODO: Make this able to fail elegantly. -void LLSelectMgr::setObjectPermissions(U8 field, +void LLSelectMgr::selectionSetObjectPermissions(U8 field, BOOL set, U32 mask, BOOL override) @@ -3732,7 +3358,7 @@ void LLSelectMgr::sendSelect() void LLSelectMgr::deselectAll() { - if (!mSelectedObjects.getNumNodes()) + if (!mSelectedObjects->getNumNodes()) { return; } @@ -3753,42 +3379,29 @@ void LLSelectMgr::deselectAll() updateSelectionCenter(); } -void LLSelectMgr::deselectTransient() +void LLSelectMgr::deselectUnused() { - std::set<LLViewerObject*> objects_to_deselect; - LLSelectNode *nodep; - for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode()) + // no more outstanding references to this selection + if (mSelectedObjects->getNumRefs() == 1) { - if (nodep->isTransient()) - { - objects_to_deselect.insert(nodep->getObject()); - } - } - - std::set<LLViewerObject*>::iterator iter; - for (iter = objects_to_deselect.begin(); - iter != objects_to_deselect.end(); - ++iter) - { - deselectObjectOnly(*iter); + deselectAll(); } - - gHUDManager->clearJoints(); - updateSelectionCenter(); } void LLSelectMgr::convertTransient() { - LLSelectNode *nodep; - for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode()) + // use STL-style iteration to avoid recursive iteration problems + LLObjectSelection::iterator node_it; + for (node_it = mSelectedObjects->begin(); node_it != mSelectedObjects->end(); ++node_it) { + LLSelectNode *nodep = *node_it; nodep->setTransient(FALSE); } } void LLSelectMgr::deselectAllIfTooFar() { - if (isEmpty() || mSelectType == SELECT_TYPE_HUD) + if (mSelectedObjects->isEmpty() || mSelectedObjects->mSelectType == SELECT_TYPE_HUD) { return; } @@ -3825,10 +3438,10 @@ void LLSelectMgr::deselectAllIfTooFar() } -void LLSelectMgr::setObjectName(const LLString& name) +void LLSelectMgr::selectionSetObjectName(const LLString& name) { // we only work correctly if 1 object is selected. - if(getRootObjectCount() == 1) + if(mSelectedObjects->getRootObjectCount() == 1) { sendListToRegions("ObjectName", packAgentAndSessionID, @@ -3836,7 +3449,7 @@ void LLSelectMgr::setObjectName(const LLString& name) (void*)name.c_str(), SEND_ONLY_ROOTS); } - else if(getObjectCount() == 1) + else if(mSelectedObjects->getObjectCount() == 1) { sendListToRegions("ObjectName", packAgentAndSessionID, @@ -3846,10 +3459,10 @@ void LLSelectMgr::setObjectName(const LLString& name) } } -void LLSelectMgr::setObjectDescription(const LLString& desc) +void LLSelectMgr::selectionSetObjectDescription(const LLString& desc) { // we only work correctly if 1 object is selected. - if(getRootObjectCount() == 1) + if(mSelectedObjects->getRootObjectCount() == 1) { sendListToRegions("ObjectDescription", packAgentAndSessionID, @@ -3857,7 +3470,7 @@ void LLSelectMgr::setObjectDescription(const LLString& desc) (void*)desc.c_str(), SEND_ONLY_ROOTS); } - else if(getObjectCount() == 1) + else if(mSelectedObjects->getObjectCount() == 1) { sendListToRegions("ObjectDescription", packAgentAndSessionID, @@ -3867,11 +3480,11 @@ void LLSelectMgr::setObjectDescription(const LLString& desc) } } -void LLSelectMgr::setObjectCategory(const LLCategory& category) +void LLSelectMgr::selectionSetObjectCategory(const LLCategory& category) { // for now, we only want to be able to set one root category at // a time. - if(getRootObjectCount() != 1) return; + if(mSelectedObjects->getRootObjectCount() != 1) return; sendListToRegions("ObjectCategory", packAgentAndSessionID, packObjectCategory, @@ -3879,10 +3492,10 @@ void LLSelectMgr::setObjectCategory(const LLCategory& category) SEND_ONLY_ROOTS); } -void LLSelectMgr::setObjectSaleInfo(const LLSaleInfo& sale_info) +void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info) { // Only one sale info at a time for now - if(getRootObjectCount() != 1) return; + if(mSelectedObjects->getRootObjectCount() != 1) return; sendListToRegions("ObjectSaleInfo", packAgentAndSessionID, packObjectSaleInfo, @@ -3896,9 +3509,9 @@ void LLSelectMgr::setObjectSaleInfo(const LLSaleInfo& sale_info) void LLSelectMgr::sendAttach(U8 attachment_point) { - LLViewerObject* attach_object = mSelectedObjects.getFirstRootObject(); + LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject(); - if (!attach_object || !gAgent.getAvatarObject() || mSelectType != SELECT_TYPE_WORLD) + if (!attach_object || !gAgent.getAvatarObject() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) { return; } @@ -3964,7 +3577,7 @@ void LLSelectMgr::sendAttach(U8 attachment_point) void LLSelectMgr::sendDetach() { - if (!mSelectedObjects.getNumNodes() || mSelectType == SELECT_TYPE_WORLD) + if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD) { return; } @@ -3980,7 +3593,7 @@ void LLSelectMgr::sendDetach() void LLSelectMgr::sendDropAttachment() { - if (!mSelectedObjects.getNumNodes() || mSelectType == SELECT_TYPE_WORLD) + if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD) { return; } @@ -3999,7 +3612,7 @@ void LLSelectMgr::sendDropAttachment() void LLSelectMgr::sendLink() { - if (!mSelectedObjects.getNumNodes()) + if (!mSelectedObjects->getNumNodes()) { return; } @@ -4014,7 +3627,7 @@ void LLSelectMgr::sendLink() void LLSelectMgr::sendDelink() { - if (!mSelectedObjects.getNumNodes()) + if (!mSelectedObjects->getNumNodes()) { return; } @@ -4036,7 +3649,7 @@ void LLSelectMgr::sendDelink() void LLSelectMgr::sendHinge(U8 type) { - if (!mSelectedObjects.getNumNodes()) + if (!mSelectedObjects->getNumNodes()) { return; } @@ -4052,7 +3665,7 @@ void LLSelectMgr::sendHinge(U8 type) void LLSelectMgr::sendDehinge() { - if (!mSelectedObjects.getNumNodes()) + if (!mSelectedObjects->getNumNodes()) { return; } @@ -4067,7 +3680,7 @@ void LLSelectMgr::sendDehinge() void LLSelectMgr::sendSelect() { - if (!mSelectedObjects.getNumNodes()) + if (!mSelectedObjects->getNumNodes()) { return; } @@ -4097,7 +3710,7 @@ void LLSelectMgr::selectionDump() { LLViewerObject *object; - for (object = getFirstObject(); object; object = getNextObject() ) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { object->dump(); } @@ -4106,7 +3719,7 @@ void LLSelectMgr::selectionDump() void LLSelectMgr::saveSelectedObjectColors() { LLSelectNode* selectNode; - for (selectNode = getFirstNode(); selectNode; selectNode = getNextNode() ) + for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() ) { selectNode->saveColors(); } @@ -4117,7 +3730,7 @@ void LLSelectMgr::saveSelectedObjectTextures() LLSelectNode* selectNode; // invalidate current selection so we update saved textures - for (selectNode = getFirstNode(); selectNode; selectNode = getNextNode() ) + for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() ) { selectNode->mValid = FALSE; } @@ -4133,13 +3746,13 @@ void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type) { LLSelectNode* selectNode; - if (isEmpty()) + if (mSelectedObjects->isEmpty()) { // nothing selected, so nothing to save return; } - for (selectNode = getFirstNode(); selectNode; selectNode = getNextNode() ) + for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() ) { LLViewerObject* object; object = selectNode->getObject(); @@ -4170,42 +3783,6 @@ void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type) selectNode->mSavedScale = object->getScale(); selectNode->saveTextureScaleRatios(); - if (object->isAttachment() && - action_type != SELECT_ACTION_TYPE_PICK) - { - LLSelectAction* selectAction = new LLSelectAction(); - selectAction->mActionType = action_type; - selectAction->mPosition = object->getPosition(); - selectAction->mRotation = object->getRotation(); - selectAction->mScale = object->getScale(); - selectAction->mObjectID = object->getID(); - selectAction->mIndividualSelection = selectNode->mIndividualSelection; - - mUndoQueue.push_back(selectAction); - - while ((mUndoQueue.size() > (U32)MAX_ACTION_QUEUE_SIZE)) - { - LLSelectAction* action = mUndoQueue.front(); - mUndoQueue.pop_front(); - delete action; - } - - // remove this object from the redo queue - std::deque<LLSelectAction*>::iterator it; - for (it = mRedoQueue.begin(); it != mRedoQueue.end();) - { - if ((*it)->mObjectID == object->getID()) - { - LLSelectAction* actionp = *it; - it = mRedoQueue.erase(it); - delete actionp; - } - else - { - ++it; - } - } - } } mSavedSelectionBBox = getBBoxOfSelection(); } @@ -4214,7 +3791,7 @@ void LLSelectMgr::selectionUpdatePhysics(BOOL physics) { LLViewerObject *object; - for (object = getFirstObject(); object; object = getNextObject() ) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if ( !object->permModify() // preemptive permissions check || !(object->isRoot() // don't send for child objects @@ -4230,7 +3807,7 @@ void LLSelectMgr::selectionUpdateTemporary(BOOL is_temporary) { LLViewerObject *object; - for (object = getFirstObject(); object; object = getNextObject() ) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if ( !object->permModify() // preemptive permissions check || !(object->isRoot() // don't send for child objects @@ -4246,7 +3823,7 @@ void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom) { LLViewerObject *object; - for (object = getFirstObject(); object; object = getNextObject() ) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if ( !object->permModify() // preemptive permissions check || !(object->isRoot() // don't send for child objects @@ -4262,7 +3839,7 @@ void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows) { LLViewerObject *object; - for (object = getFirstObject(); object; object = getNextObject() ) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { if ( !object->permModify() // preemptive permissions check || object->isJointChild()) @@ -4491,65 +4068,65 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name, switch(send_type) { case SEND_ONLY_ROOTS: - node = mSelectedObjects.getFirstRootNode(); + node = mSelectedObjects->getFirstRootNode(); while(node) { nodes_to_send.push(node); - node = mSelectedObjects.getNextRootNode(); + node = mSelectedObjects->getNextRootNode(); } break; case SEND_INDIVIDUALS: - node = mSelectedObjects.getFirstNode(); + node = mSelectedObjects->getFirstNode(); while(node) { nodes_to_send.push(node); - node = mSelectedObjects.getNextNode(); + node = mSelectedObjects->getNextNode(); } break; case SEND_ROOTS_FIRST: // first roots... - node = mSelectedObjects.getFirstNode(); + node = mSelectedObjects->getFirstNode(); while(node) { if (node->getObject()->isRootEdit()) { nodes_to_send.push(node); } - node = mSelectedObjects.getNextNode(); + node = mSelectedObjects->getNextNode(); } // then children... - node = mSelectedObjects.getFirstNode(); + node = mSelectedObjects->getFirstNode(); while(node) { if (!node->getObject()->isRootEdit()) { nodes_to_send.push(node); } - node = mSelectedObjects.getNextNode(); + node = mSelectedObjects->getNextNode(); } break; case SEND_CHILDREN_FIRST: // first children... - node = mSelectedObjects.getFirstNode(); + node = mSelectedObjects->getFirstNode(); while(node) { if (!node->getObject()->isRootEdit()) { nodes_to_send.push(node); } - node = mSelectedObjects.getNextNode(); + node = mSelectedObjects->getNextNode(); } // ...then roots - node = mSelectedObjects.getFirstNode(); + node = mSelectedObjects->getFirstNode(); while(node) { if (node->getObject()->isRootEdit()) { nodes_to_send.push(node); } - node = mSelectedObjects.getNextNode(); + node = mSelectedObjects->getNextNode(); } break; @@ -4731,9 +4308,9 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data // Iterate through nodes at end, since it can be on both the regular AND hover list BOOL found = FALSE; LLSelectNode* node; - for (node = gSelectMgr->mSelectedObjects.getFirstNode(); + for (node = gSelectMgr->mSelectedObjects->getFirstNode(); node; - node = gSelectMgr->mSelectedObjects.getNextNode()) + node = gSelectMgr->mSelectedObjects->getNextNode()) { if (node->getObject()->mID == id) { @@ -4881,9 +4458,9 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use // Now look through all of the hovered nodes BOOL found = FALSE; LLSelectNode* node; - for (node = gSelectMgr->mHoverObjects.getFirstNode(); + for (node = gSelectMgr->mHoverObjects->getFirstNode(); node; - node = gSelectMgr->mHoverObjects.getNextNode()) + node = gSelectMgr->mHoverObjects->getNextNode()) { if (node->getObject()->mID == id) { @@ -4966,7 +4543,7 @@ void LLSelectMgr::updateSilhouettes() if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom) { - for (node = mSelectedObjects.getFirstNode(); node; node = mSelectedObjects.getNextNode() ) + for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) { if (node->getObject()) { @@ -4979,7 +4556,7 @@ void LLSelectMgr::updateSilhouettes() LLDynamicArray<LLViewerObject*> changed_objects; - if (mSelectedObjects.getNumNodes()) + if (mSelectedObjects->getNumNodes()) { //gGLSPipelineSelection.set(); @@ -4988,7 +4565,7 @@ void LLSelectMgr::updateSilhouettes() for (S32 pass = 0; pass < 2; pass++) { - for (node = mSelectedObjects.getFirstNode(); node; node = mSelectedObjects.getNextNode() ) + for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) { LLViewerObject* objectp = node->getObject(); @@ -5058,7 +4635,7 @@ void LLSelectMgr::updateSilhouettes() // remove highlight nodes not in roots list LLDynamicArray<LLSelectNode*> remove_these_nodes; LLDynamicArray<LLViewerObject*> remove_these_roots; - for (LLSelectNode* nodep = mHighlightedObjects.getFirstNode(); nodep; nodep = mHighlightedObjects.getNextNode()) + for (LLSelectNode* nodep = mHighlightedObjects->getFirstNode(); nodep; nodep = mHighlightedObjects->getNextNode()) { LLViewerObject* objectp = nodep->getObject(); if (objectp->isRoot() || !select_linked_set) @@ -5087,7 +4664,7 @@ void LLSelectMgr::updateSilhouettes() S32 i; for (i = 0; i < remove_these_nodes.count(); i++) { - mHighlightedObjects.removeNode(remove_these_nodes[i]); + mHighlightedObjects->removeNode(remove_these_nodes[i]); } // remove all root objects already being highlighted @@ -5109,7 +4686,7 @@ void LLSelectMgr::updateSilhouettes() continue; } - mHighlightedObjects.addNode(rect_select_node); + mHighlightedObjects->addNode(rect_select_node); if (!select_linked_set) { @@ -5128,7 +4705,7 @@ void LLSelectMgr::updateSilhouettes() rect_select_node = new LLSelectNode(objectp->mChildList[i], TRUE); rect_select_node->selectAllTEs(TRUE); - mHighlightedObjects.addNode(rect_select_node); + mHighlightedObjects->addNode(rect_select_node); } } } @@ -5139,7 +4716,7 @@ void LLSelectMgr::updateSilhouettes() //BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); for (S32 pass = 0; pass < 2; pass++) { - for (node = mHighlightedObjects.getFirstNode(); node; node = mHighlightedObjects.getNextNode() ) + for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() ) { LLViewerObject* objectp = node->getObject(); @@ -5188,7 +4765,7 @@ void LLSelectMgr::updateSilhouettes() } else { - mHighlightedObjects.deleteAllNodes(); + mHighlightedObjects->deleteAllNodes(); } for (S32 i = 0; i < changed_objects.count(); i++) @@ -5235,13 +4812,13 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f); glScalef(cur_zoom, cur_zoom, cur_zoom); } - if (mSelectedObjects.getNumNodes()) + if (mSelectedObjects->getNumNodes()) { glPushAttrib(GL_FOG_BIT); LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID(); for (S32 pass = 0; pass < 2; pass++) { - for (node = mSelectedObjects.getFirstNode(); node; node = mSelectedObjects.getNextNode() ) + for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() ) { LLViewerObject* objectp = node->getObject(); if (objectp->isHUDAttachment() != for_hud) @@ -5272,13 +4849,13 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) glPopAttrib(); } - if (mHighlightedObjects.getNumNodes()) + if (mHighlightedObjects->getNumNodes()) { // render silhouettes for highlighted objects BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); for (S32 pass = 0; pass < 2; pass++) { - for (node = mHighlightedObjects.getFirstNode(); node; node = mHighlightedObjects.getNextNode() ) + for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() ) { LLViewerObject* objectp = node->getObject(); if (objectp->isHUDAttachment() != for_hud) @@ -5889,7 +5466,7 @@ void LLSelectMgr::updateSelectionCenter() const F32 MOVE_SELECTION_THRESHOLD = 1.f; // Movement threshold in meters for updating selection // center (tractor beam) - LLViewerObject* object = mSelectedObjects.getFirstObject(); + LLViewerObject* object = mSelectedObjects->getFirstObject(); if (!object) { // nothing selected, probably grabbing @@ -5906,9 +5483,9 @@ void LLSelectMgr::updateSelectionCenter() } else { - mSelectType = getSelectTypeForObject(object); + mSelectedObjects->mSelectType = getSelectTypeForObject(object); - if (mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) { mPauseRequest = gAgent.getAvatarObject()->requestPause(); } @@ -5917,7 +5494,7 @@ void LLSelectMgr::updateSelectionCenter() mPauseRequest = NULL; } - if (mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject()) + if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject()) { // reset hud ZOOM gAgent.getAvatarObject()->mHUDTargetZoom = 1.f; @@ -5933,11 +5510,11 @@ void LLSelectMgr::updateSelectionCenter() gHUDManager->clearJoints(); LLDynamicArray < LLViewerObject *> jointed_objects; - for (object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) + for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() ) { LLViewerObject *myAvatar = gAgent.getAvatarObject(); LLViewerObject *root = object->getRootEdit(); - if (mSelectType == SELECT_TYPE_WORLD && // not an attachment + if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment !root->isChild(myAvatar) && // not the object you're sitting on !object->isAvatar()) // not another avatar { @@ -5964,7 +5541,7 @@ void LLSelectMgr::updateSelectionCenter() if ( !(gAgentID == LLUUID::null) ) { - LLTool *tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); + LLTool *tool = gToolMgr->getCurrentTool(); if (mShowSelection) { LLVector3d select_center_global; @@ -5991,7 +5568,7 @@ void LLSelectMgr::updateSelectionCenter() } // give up edit menu if no objects selected - if (gEditMenuHandler == this && getObjectCount() == 0) + if (gEditMenuHandler == this && mSelectedObjects->getObjectCount() == 0) { gEditMenuHandler = NULL; } @@ -6001,7 +5578,7 @@ void LLSelectMgr::updatePointAt() { if (mShowSelection) { - if (getObjectCount()) + if (mSelectedObjects->getObjectCount()) { LLVector3 select_offset; LLViewerObject *click_object = gObjectList.findObject(gLastHitObjectID); @@ -6017,8 +5594,8 @@ void LLSelectMgr::updatePointAt() else { // didn't click on an object this time, revert to pointing at center of first object - gAgent.setPointAt(POINTAT_TARGET_SELECT, getFirstObject()); - gAgent.setLookAt(LOOKAT_TARGET_SELECT, getFirstObject()); + gAgent.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); + gAgent.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject()); } } else @@ -6048,7 +5625,7 @@ LLBBox LLSelectMgr::getBBoxOfSelection() const //----------------------------------------------------------------------------- BOOL LLSelectMgr::canUndo() { - return getFirstEditableObject() != NULL; + return mSelectedObjects->getFirstEditableObject() != NULL; } //----------------------------------------------------------------------------- @@ -6066,7 +5643,7 @@ void LLSelectMgr::undo() //----------------------------------------------------------------------------- BOOL LLSelectMgr::canRedo() { - return getFirstEditableObject() != NULL; + return mSelectedObjects->getFirstEditableObject() != NULL; } //----------------------------------------------------------------------------- @@ -6084,7 +5661,7 @@ void LLSelectMgr::redo() //----------------------------------------------------------------------------- BOOL LLSelectMgr::canDoDelete() { - return getFirstDeleteableObject() != NULL; + return mSelectedObjects->getFirstDeleteableObject() != NULL; } //----------------------------------------------------------------------------- @@ -6100,7 +5677,7 @@ void LLSelectMgr::doDelete() //----------------------------------------------------------------------------- BOOL LLSelectMgr::canDeselect() { - return !isEmpty(); + return !mSelectedObjects->isEmpty(); } //----------------------------------------------------------------------------- @@ -6115,7 +5692,7 @@ void LLSelectMgr::deselect() //----------------------------------------------------------------------------- BOOL LLSelectMgr::canDuplicate() { - return getFirstCopyableObject() != NULL; + return mSelectedObjects->getFirstCopyableObject() != NULL; } //----------------------------------------------------------------------------- // duplicate() @@ -6125,125 +5702,6 @@ void LLSelectMgr::duplicate() LLVector3 offset(0.5f, 0.5f, 0.f); selectDuplicate(offset, TRUE); } -//----------------------------------------------------------------------------- -// undoRedo() -//----------------------------------------------------------------------------- -U32 LLSelectMgr::undoRedo(std::deque<LLSelectAction*> &queue_src, std::deque<LLSelectAction*> &queue_dst, const LLUUID &object_id) -{ - if (queue_src.size() == 0) - { - return 0; - } - - U32 update_type = 0; - std::deque<LLSelectAction*> temp_queue; - LLSelectAction* src_actionp = queue_src.back(); - - while (src_actionp->mObjectID != object_id) - { - temp_queue.push_back(src_actionp); - queue_src.pop_back(); - if (!queue_src.size()) - { - // put everything back - LLSelectAction* actionp; - while (temp_queue.size()) - { - actionp = temp_queue.back(); - temp_queue.pop_back(); - queue_src.push_back(actionp); - } - return 0; - } - src_actionp = queue_src.back(); - } - - if(src_actionp) - { - LLSelectAction* dst_actionp = new LLSelectAction(); - dst_actionp->mActionType = src_actionp->mActionType; - dst_actionp->mObjectID = src_actionp->mObjectID; - dst_actionp->mIndividualSelection = src_actionp->mIndividualSelection; - - LLViewerObject* object = gObjectList.findObject(src_actionp->mObjectID); - if (object && object->mDrawable.notNull()) - { - LLVector3 old_position_local = object->getPosition(); - - switch(src_actionp->mActionType) - { - case SELECT_ACTION_TYPE_MOVE: - dst_actionp->mPosition = object->mDrawable->getPosition(); - object->setPosition(src_actionp->mPosition, TRUE); - if (object->isRootEdit() && src_actionp->mIndividualSelection) - { - // counter-translate children - LLVector3 parent_offset = (src_actionp->mPosition - old_position_local) * ~object->getRotation(); - - // counter-translate child objects if we are moving the root as an individual - for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++) - { - LLViewerObject* childp = object->mChildList[child_num]; - childp->setPosition(childp->getPosition() - parent_offset); - } - } - update_type |= UPD_POSITION; - break; - case SELECT_ACTION_TYPE_ROTATE: - dst_actionp->mPosition = object->mDrawable->getPosition(); - dst_actionp->mRotation = object->mDrawable->getRotation(); - object->setRotation(src_actionp->mRotation, TRUE); - object->setPosition(src_actionp->mPosition, TRUE); - if (object->isRootEdit() && src_actionp->mIndividualSelection) - { - // counter-translate and rotate children - LLVector3 parent_offset = (src_actionp->mPosition - old_position_local) * ~object->getRotation(); - - for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++) - { - LLViewerObject* childp = object->mChildList[child_num]; - LLQuaternion delta_rot_inv = dst_actionp->mRotation * ~src_actionp->mRotation; - childp->setPosition((childp->getPosition() * delta_rot_inv) - parent_offset); - childp->setRotation(childp->getRotation() * delta_rot_inv ); - } - } - update_type |= UPD_ROTATION | UPD_POSITION; - break; - case SELECT_ACTION_TYPE_SCALE: - dst_actionp->mPosition = object->mDrawable->getPosition(); - dst_actionp->mScale = object->getScale(); - object->setScale(src_actionp->mScale, TRUE); - object->setPosition(src_actionp->mPosition, TRUE); - update_type |= UPD_SCALE | UPD_POSITION; - break; - default: - // do nothing - break; - } - } - queue_src.pop_back(); - delete src_actionp; - queue_dst.push_back(dst_actionp); - while (queue_dst.size() > (U32)MAX_ACTION_QUEUE_SIZE) - { - LLSelectAction* action = queue_dst.front(); - queue_dst.pop_front(); - delete action; - } - - } - - // put everything back - LLSelectAction* actionp; - while (temp_queue.size()) - { - actionp = temp_queue.back(); - temp_queue.pop_back(); - queue_src.push_back(actionp); - } - - return update_type; -} ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object) { @@ -6268,7 +5726,7 @@ ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object) void LLSelectMgr::validateSelection() { LLViewerObject* objectp; - for (objectp = getFirstObject(); objectp; objectp = getNextObject()) + for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject()) { if (!canSelectObject(objectp)) { @@ -6304,44 +5762,47 @@ BOOL LLSelectMgr::canSelectObject(LLViewerObject* object) if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE; ESelectType selection_type = getSelectTypeForObject(object); - if (getObjectCount() > 0 && mSelectType != selection_type) return FALSE; + if (mSelectedObjects->getObjectCount() > 0 && mSelectedObjects->mSelectType != selection_type) return FALSE; return TRUE; } -LLSelectNodeList::LLSelectNodeList() : std::list<LLSelectNode*>() +LLObjectSelection::LLObjectSelection() : + std::list<LLSelectNode*>(), + LLRefCount(), + mCurrentTE(-1), + mCurrentNode(end()), + mSelectType(SELECT_TYPE_WORLD) { - mCurrentTE = -1; - mCurrentNode = end(); } -LLSelectNodeList::~LLSelectNodeList() +LLObjectSelection::~LLObjectSelection() { std::for_each(begin(), end(), DeletePointer()); } -void LLSelectNodeList::updateEffects() +void LLObjectSelection::updateEffects() { } -S32 LLSelectNodeList::getNumNodes() +S32 LLObjectSelection::getNumNodes() { return size(); } -void LLSelectNodeList::addNode(LLSelectNode *nodep) +void LLObjectSelection::addNode(LLSelectNode *nodep) { push_front(nodep); mSelectNodeMap[nodep->getObject()] = nodep; } -void LLSelectNodeList::addNodeAtEnd(LLSelectNode *nodep) +void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep) { push_back(nodep); mSelectNodeMap[nodep->getObject()] = nodep; } -void LLSelectNodeList::removeNode(LLSelectNode *nodep) +void LLObjectSelection::removeNode(LLSelectNode *nodep) { std::list<LLSelectNode*>::iterator iter = begin(); while(iter != end()) @@ -6358,14 +5819,14 @@ void LLSelectNodeList::removeNode(LLSelectNode *nodep) } } -void LLSelectNodeList::deleteAllNodes() +void LLObjectSelection::deleteAllNodes() { std::for_each(begin(), end(), DeletePointer()); clear(); mSelectNodeMap.clear(); } -LLSelectNode* LLSelectNodeList::findNode(LLViewerObject* objectp) +LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp) { std::map<LLViewerObject*, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp); if (found_it != mSelectNodeMap.end()) @@ -6378,7 +5839,7 @@ LLSelectNode* LLSelectNodeList::findNode(LLViewerObject* objectp) //----------------------------------------------------------------------------- // getFirstNode() //----------------------------------------------------------------------------- -LLSelectNode *LLSelectNodeList::getFirstNode() +LLSelectNode *LLObjectSelection::getFirstNode() { mCurrentNode = begin();//getFirstData(); @@ -6399,7 +5860,7 @@ LLSelectNode *LLSelectNodeList::getFirstNode() //----------------------------------------------------------------------------- // getCurrentNode() //----------------------------------------------------------------------------- -LLSelectNode *LLSelectNodeList::getCurrentNode() +LLSelectNode *LLObjectSelection::getCurrentNode() { while (mCurrentNode != end() && !(*mCurrentNode)->getObject()) { @@ -6417,7 +5878,7 @@ LLSelectNode *LLSelectNodeList::getCurrentNode() //----------------------------------------------------------------------------- // getNextNode() //----------------------------------------------------------------------------- -LLSelectNode *LLSelectNodeList::getNextNode() +LLSelectNode *LLObjectSelection::getNextNode() { ++mCurrentNode; @@ -6439,7 +5900,7 @@ LLSelectNode *LLSelectNodeList::getNextNode() //----------------------------------------------------------------------------- // getFirstObject() //----------------------------------------------------------------------------- -LLViewerObject* LLSelectNodeList::getFirstObject() +LLViewerObject* LLObjectSelection::getFirstObject() { mCurrentNode = begin(); @@ -6461,7 +5922,7 @@ LLViewerObject* LLSelectNodeList::getFirstObject() //----------------------------------------------------------------------------- // getNextObject() //----------------------------------------------------------------------------- -LLViewerObject* LLSelectNodeList::getNextObject() +LLViewerObject* LLObjectSelection::getNextObject() { ++mCurrentNode;// = getNextData(); @@ -6484,7 +5945,7 @@ LLViewerObject* LLSelectNodeList::getNextObject() //----------------------------------------------------------------------------- // getPrimaryTE() //----------------------------------------------------------------------------- -void LLSelectNodeList::getPrimaryTE(LLViewerObject* *object, S32 *te) +void LLObjectSelection::getPrimaryTE(LLViewerObject* *object, S32 *te) { // initialize object and te *te = 0; @@ -6539,7 +6000,7 @@ void LLSelectNodeList::getPrimaryTE(LLViewerObject* *object, S32 *te) //----------------------------------------------------------------------------- // getFirstTE() //----------------------------------------------------------------------------- -void LLSelectNodeList::getFirstTE(LLViewerObject* *object, S32 *te) +void LLObjectSelection::getFirstTE(LLViewerObject* *object, S32 *te) { // start with first face mCurrentTE = 0; @@ -6593,7 +6054,7 @@ void LLSelectNodeList::getFirstTE(LLViewerObject* *object, S32 *te) //----------------------------------------------------------------------------- // getNextFace() //----------------------------------------------------------------------------- -void LLSelectNodeList::getNextTE(LLViewerObject* *object, S32 *te) +void LLObjectSelection::getNextTE(LLViewerObject* *object, S32 *te) { // try next face mCurrentTE++; @@ -6636,7 +6097,7 @@ void LLSelectNodeList::getNextTE(LLViewerObject* *object, S32 *te) return; } -void LLSelectNodeList::getCurrentTE(LLViewerObject* *object, S32 *te) +void LLObjectSelection::getCurrentTE(LLViewerObject* *object, S32 *te) { if (mCurrentNode != end()) { @@ -6652,7 +6113,7 @@ void LLSelectNodeList::getCurrentTE(LLViewerObject* *object, S32 *te) //----------------------------------------------------------------------------- // getFirstRootNode() //----------------------------------------------------------------------------- -LLSelectNode *LLSelectNodeList::getFirstRootNode() +LLSelectNode *LLObjectSelection::getFirstRootNode() { LLSelectNode *cur_node = getFirstNode(); @@ -6671,7 +6132,7 @@ LLSelectNode *LLSelectNodeList::getFirstRootNode() //----------------------------------------------------------------------------- // getNextRootNode() //----------------------------------------------------------------------------- -LLSelectNode *LLSelectNodeList::getNextRootNode() +LLSelectNode *LLObjectSelection::getNextRootNode() { LLSelectNode *cur_node = getNextNode(); @@ -6689,7 +6150,7 @@ LLSelectNode *LLSelectNodeList::getNextRootNode() //----------------------------------------------------------------------------- // getFirstRootObject() //----------------------------------------------------------------------------- -LLViewerObject *LLSelectNodeList::getFirstRootObject() +LLViewerObject *LLObjectSelection::getFirstRootObject() { LLSelectNode *node = getFirstRootNode(); @@ -6707,7 +6168,7 @@ LLViewerObject *LLSelectNodeList::getFirstRootObject() //----------------------------------------------------------------------------- // getNextRootObject() //----------------------------------------------------------------------------- -LLViewerObject *LLSelectNodeList::getNextRootObject() +LLViewerObject *LLObjectSelection::getNextRootObject() { LLSelectNode *node = getNextRootNode(); @@ -6724,7 +6185,7 @@ LLViewerObject *LLSelectNodeList::getNextRootObject() //----------------------------------------------------------------------------- // isEmpty() //----------------------------------------------------------------------------- -BOOL LLSelectNodeList::isEmpty() +BOOL LLObjectSelection::isEmpty() { return (size() == 0); } @@ -6732,7 +6193,7 @@ BOOL LLSelectNodeList::isEmpty() //----------------------------------------------------------------------------- // getOwnershipCost() //----------------------------------------------------------------------------- -BOOL LLSelectNodeList::getOwnershipCost(S32 &cost) +BOOL LLObjectSelection::getOwnershipCost(S32 &cost) { S32 count = 0; for( LLSelectNode* nodep = getFirstNode(); nodep; nodep = getNextNode() ) @@ -6744,3 +6205,341 @@ BOOL LLSelectNodeList::getOwnershipCost(S32 &cost) return (count > 0); } + + + +//----------------------------------------------------------------------------- +// getObjectCount() +//----------------------------------------------------------------------------- +S32 LLObjectSelection::getObjectCount() +{ + return getNumNodes(); +} + + +//----------------------------------------------------------------------------- +// getTECount() +//----------------------------------------------------------------------------- +S32 LLObjectSelection::getTECount() +{ + S32 count = 0; + + LLSelectNode* nodep; + for (nodep = getFirstNode(); nodep; nodep = getNextNode() ) + { + if (nodep->getObject()) + { + S32 num_tes = nodep->getObject()->getNumTEs(); + for (S32 te = 0; te < num_tes; te++) + { + if (nodep->isTESelected(te)) + { + count++; + } + } + } + } + + return count; +} + +//----------------------------------------------------------------------------- +// getRootObjectCount() +//----------------------------------------------------------------------------- +S32 LLObjectSelection::getRootObjectCount() +{ + LLSelectNode *nodep; + + S32 count = 0; + for(nodep = getFirstRootNode(); nodep; nodep = getNextRootNode()) + { + ++count; + } + return count; +} + +bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func) +{ + bool result = true; + LLViewerObject* object; + for (object = getFirstObject(); object != NULL; object = getNextObject()) + { + result = result && func->apply(object); + } + return result; +} + +bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func) +{ + bool result = true; + LLViewerObject* object; + for (object = getFirstRootObject(); + object != NULL; + object = getNextRootObject()) + { + result = result && func->apply(object); + } + return result; +} + +bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func) +{ + bool result = true; + LLSelectNode* node; + for (node = getFirstNode(); node != NULL; node = getNextNode()) + { + result = result && func->apply(node); + } + return result; +} + +//----------------------------------------------------------------------------- +// contains() +//----------------------------------------------------------------------------- +BOOL LLObjectSelection::contains(LLViewerObject* object) +{ + return findNode(object) != NULL; +} + + +//----------------------------------------------------------------------------- +// contains() +//----------------------------------------------------------------------------- +BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te) +{ + LLSelectNode *nodep; + if (te == SELECT_ALL_TES) + { + // ...all faces + for (nodep = getFirstNode(); nodep; nodep = getNextNode() ) + { + if (nodep->getObject() == object) + { + BOOL all_selected = TRUE; + for (S32 i = 0; i < SELECT_MAX_TES; i++) + { + all_selected = all_selected && nodep->isTESelected(i); + } + return all_selected; + } + } + return FALSE; + } + else + { + // ...one face + for (nodep = getFirstNode(); nodep; nodep = getNextNode() ) + { + if (nodep->getObject() == object && nodep->isTESelected(te)) + { + return TRUE; + } + } + return FALSE; + } +} + +// returns TRUE is any node is currenly worn as an attachment +BOOL LLObjectSelection::isAttachment() +{ + return (mSelectType == SELECT_TYPE_ATTACHMENT || mSelectType == SELECT_TYPE_HUD); +} + +//----------------------------------------------------------------------------- +// getFirstMoveableNode() +//----------------------------------------------------------------------------- +LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root) +{ + LLSelectNode* selectNode = NULL; + + if (get_root) + { + for(selectNode = getFirstRootNode(); selectNode; selectNode = getNextRootNode()) + { + if( selectNode->getObject()->permMove() ) + { + return selectNode; + break; + } + } + } + for(selectNode = getFirstNode(); selectNode; selectNode = getNextNode()) + { + if( selectNode->getObject()->permMove() ) + { + return selectNode; + break; + } + } + + return NULL; +} + +//----------------------------------------------------------------------------- +// getFirstCopyableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_root) +{ + LLViewerObject* object = NULL; + for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject()) + { + if( cur->permCopy() && !cur->isAttachment()) + { + object = cur; + break; + } + } + + if (get_root && object) + { + LLViewerObject *parent; + while ((parent = (LLViewerObject*)object->getParent())) + { + if (parent->isSelected()) + { + object = parent; + } + else + { + break; + } + } + } + + return object; +} + + +//----------------------------------------------------------------------------- +// getFirstDeleteableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstDeleteableObject(BOOL get_root) +{ + //RN: don't currently support deletion of child objects, as that requires separating them first + // then derezzing to trash + get_root = TRUE; + + LLViewerObject* object = NULL; + if (get_root) + { + for(LLViewerObject* current = getFirstRootObject(); + current != NULL; + current = getNextRootObject()) + { + // you can delete an object if permissions allow it, you are + // the owner, you are an officer in the group that owns the + // object, or you are not the owner but it is on land you own + // or land owned by your group. (whew!) + if( (current->permModify()) + || (current->permYouOwner()) + || (!current->permAnyOwner()) // public + || (current->isOverAgentOwnedLand()) + || (current->isOverGroupOwnedLand()) + ) + { + + if( !current->isAttachment() ) + { + object = current; + break; + } + } + } + } + else + { + for(LLViewerObject* current = getFirstObject(); + current != NULL; + current = getNextObject()) + { + // you can delete an object if permissions allow it, you are + // the owner, you are an officer in the group that owns the + // object, or you are not the owner but it is on land you own + // or land owned by your group. (whew!) + if( (current->permModify()) + || (current->permYouOwner()) + || (!current->permAnyOwner()) // public + || (current->isOverAgentOwnedLand()) + || (current->isOverGroupOwnedLand()) + ) + { + if( !current->isAttachment() ) + { + object = current; + break; + } + } + } + } + + return object; +} + + +//----------------------------------------------------------------------------- +// getFirstEditableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_root) +{ + LLViewerObject* object = NULL; + for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject()) + { + if( cur->permModify() ) + { + object = cur; + break; + } + } + + if (get_root && object) + { + LLViewerObject *parent; + while ((parent = (LLViewerObject*)object->getParent())) + { + if (parent->isSelected()) + { + object = parent; + } + else + { + break; + } + } + } + + return object; +} + +//----------------------------------------------------------------------------- +// getFirstMoveableObject() +//----------------------------------------------------------------------------- +LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_root) +{ + LLViewerObject* object = NULL; + for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject()) + { + if( cur->permMove() ) + { + object = cur; + break; + } + } + + if (get_root && object && !object->isJointChild()) + { + LLViewerObject *parent; + while ((parent = (LLViewerObject*)object->getParent())) + { + if (parent->isSelected()) + { + object = parent; + } + else + { + break; + } + } + } + + return object; +}
\ No newline at end of file diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 77c1206b89..2b1568fb45 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -91,11 +91,12 @@ typedef enum e_selection_type SELECT_TYPE_HUD }ESelectType; -class LLSelectNodeList : public std::list<LLSelectNode*> +class LLObjectSelection : public std::list<LLSelectNode*>, public LLRefCount { + friend class LLSelectMgr; public: - LLSelectNodeList(); - virtual ~LLSelectNodeList(); + LLObjectSelection(); + virtual ~LLObjectSelection(); void updateEffects(); @@ -110,6 +111,8 @@ public: LLSelectNode *getFirstRootNode(); LLSelectNode *getNextRootNode(); + LLSelectNode* getFirstMoveableNode(BOOL get_root = FALSE); + // iterate through objects LLViewerObject* getFirstObject(); LLViewerObject* getNextObject(); @@ -118,6 +121,11 @@ public: LLViewerObject *getFirstRootObject(); LLViewerObject *getNextRootObject(); + LLViewerObject* getFirstEditableObject(BOOL get_root = FALSE); + LLViewerObject* getFirstCopyableObject(BOOL get_root = FALSE); + LLViewerObject* getFirstDeleteableObject(BOOL get_root = FALSE); + LLViewerObject* getFirstMoveableObject(BOOL get_root = FALSE); + // iterate through texture entries void getPrimaryTE(LLViewerObject* *object, S32 *te); void getFirstTE(LLViewerObject* *object, S32 *te); @@ -130,24 +138,36 @@ public: void deleteAllNodes(); // Delete all nodes S32 getNumNodes(); LLSelectNode* findNode(LLViewerObject* objectp); + + // count members + S32 getObjectCount(); + S32 getTECount(); + S32 getRootObjectCount(); + + BOOL contains(LLViewerObject* object); + BOOL contains(LLViewerObject* object, S32 te); + + // returns TRUE is any node is currenly worn as an attachment + BOOL isAttachment(); + + // Apply functors to various subsets of the selected objects + // Returns the AND of all apply() calls. + bool applyToRootObjects(LLSelectedObjectFunctor* func); + bool applyToObjects(LLSelectedObjectFunctor* func); + bool applyToNodes(LLSelectedNodeFunctor* func); + + ESelectType getSelectType() { return mSelectType; } + private: - const LLSelectNodeList &operator=(const LLSelectNodeList &); + const LLObjectSelection &operator=(const LLObjectSelection &); - std::list<LLSelectNode*>::iterator mCurrentNode; - S32 mCurrentTE; - std::map<LLViewerObject*, LLSelectNode*> mSelectNodeMap; + std::list<LLSelectNode*>::iterator mCurrentNode; + S32 mCurrentTE; + std::map<LLViewerObject*, LLSelectNode*> mSelectNodeMap; + ESelectType mSelectType; }; -struct LLSelectAction -{ -public: - EActionType mActionType; - LLVector3 mPosition; - LLVector3 mScale; - LLQuaternion mRotation; - LLUUID mObjectID; - BOOL mIndividualSelection; -}; +typedef LLHandle<LLObjectSelection> LLObjectSelectionHandle; class LLSelectMgr : public LLEditMenuHandler { @@ -168,6 +188,7 @@ public: static LLColor4 sHighlightChildColor; static LLColor4 sHighlightInspectColor; static LLColor4 sContextSilhouetteColor; + public: LLSelectMgr(); ~LLSelectMgr(); @@ -188,115 +209,90 @@ public: virtual void duplicate(); virtual BOOL canDuplicate(); - // Apply functors to various subsets of the selected objects - // Returns the AND of all apply() calls. - bool applyToRootObjects(LLSelectedObjectFunctor* func); - bool applyToObjects(LLSelectedObjectFunctor* func); - bool applyToNodes(LLSelectedNodeFunctor* func); - void updateEffects(); // Update HUD effects void setForceSelection(BOOL force) { mForceSelection = force; } + //////////////////////////////////////////////////////////////// + // Selection methods + //////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////// + // Add + //////////////////////////////////////////////////////////////// + // For when you want just a child object. - void selectObjectOnly(LLViewerObject* object, S32 face = SELECT_ALL_TES); + LLObjectSelectionHandle selectObjectOnly(LLViewerObject* object, S32 face = SELECT_ALL_TES); // This method is meant to select an object, and then select all // of the ancestors and descendents. This should be the normal behavior. - void selectObjectAndFamily(LLViewerObject* object, BOOL add_to_end = FALSE); + LLObjectSelectionHandle selectObjectAndFamily(LLViewerObject* object, BOOL add_to_end = FALSE); // Same as above, but takes a list of objects. Used by rectangle select. - void selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, BOOL send_to_sim = TRUE); + LLObjectSelectionHandle selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, BOOL send_to_sim = TRUE); - void deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim = TRUE); + // converts all objects currently highlighted to a selection, and returns it + LLObjectSelectionHandle selectHighlightedObjects(); - void deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim = TRUE); + LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp); - void deselectTransient(); // deselect "temporarily" selected objects (via pie menu) - void convertTransient(); // converts temporarily selected objects to full-fledged selections + void highlightObjectOnly(LLViewerObject *objectp); + void highlightObjectAndFamily(LLViewerObject *objectp); + void highlightObjectAndFamily(const LLDynamicArray<LLViewerObject*>& list); + + //////////////////////////////////////////////////////////////// + // Remove + //////////////////////////////////////////////////////////////// + + void deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim = TRUE); + void deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim = TRUE); // Send deselect messages to simulator, then clear the list void deselectAll(); + // deselect only if nothing else currently referencing the selection + void deselectUnused(); + // Deselect if the selection center is too far away from the agent. void deselectAllIfTooFar(); - BOOL selectionRemoveObject(const LLUUID &id); - - BOOL contains(LLViewerObject* object); - BOOL contains(LLViewerObject* object, S32 te); - - ESelectType getSelectType() { return mSelectType; } - - // count members - S32 getObjectCount(); - S32 getTECount(); - S32 getRootObjectCount(); - - BOOL isEmpty() { return !mSelectedObjects.getNumNodes(); } - - BOOL shouldShowSelection() { return mShowSelection; } - - LLSelectNodeList &getHoverObjects() { return mHoverObjects; } - LLSelectNodeList &getSelectedObjects() { return mSelectedObjects; } - - // iterate through objects - LLViewerObject* getFirstObject() { return mSelectedObjects.getFirstObject(); } - LLViewerObject* getNextObject() { return mSelectedObjects.getNextObject(); } - - // iterate through root objects - LLViewerObject *getFirstRootObject() { return mSelectedObjects.getFirstRootObject(); } - LLViewerObject *getNextRootObject() { return mSelectedObjects.getNextRootObject(); } - - LLViewerObject* getFirstHighlightedObject() { return mHighlightedObjects.getFirstObject(); } - LLViewerObject* getNextHighlightedObject() { return mHighlightedObjects.getNextObject(); } - - // iterate through tes - void getPrimaryTE(LLViewerObject* *object, S32 *te) { mSelectedObjects.getPrimaryTE(object, te); } - void getFirstTE(LLViewerObject* *object, S32 *te) { mSelectedObjects.getFirstTE(object, te); } - void getNextTE(LLViewerObject* *object, S32 *te) { mSelectedObjects.getNextTE(object, te); }; - - void setHoverObject(LLViewerObject *objectp); - - void addGridObject(LLViewerObject* objectp); - void clearGridObjects(); - void setGridMode(EGridMode mode); - EGridMode getGridMode() { return mGridMode; } - void getGrid(LLVector3& origin, LLQuaternion& rotation, LLVector3 &scale); + // Removes all highlighted objects from current selection + void deselectHighlightedObjects(); - void highlightObjectOnly(LLViewerObject *objectp); - void highlightObjectAndFamily(LLViewerObject *objectp); - void highlightObjectAndFamily(const LLDynamicArray<LLViewerObject*>& list); void unhighlightObjectOnly(LLViewerObject *objectp); void unhighlightObjectAndFamily(LLViewerObject *objectp); void unhighlightAll(); - void selectHighlightedObjects(); - void deselectHighlightedObjects(); - LLSelectNode *findSelectNode(LLViewerObject *objectp); - LLSelectNode *getFirstRootNode() { return mSelectedObjects.getFirstRootNode(); } - LLSelectNode *getNextRootNode() { return mSelectedObjects.getNextRootNode(); } - LLSelectNode* getFirstNode() { return mSelectedObjects.getFirstNode(); } - LLSelectNode* getNextNode() { return mSelectedObjects.getNextNode(); } + BOOL removeObjectFromSelections(const LLUUID &id); + + //////////////////////////////////////////////////////////////// + // Selection accessors + //////////////////////////////////////////////////////////////// + LLObjectSelectionHandle getHoverObjects() { return mHoverObjects; } + LLObjectSelectionHandle getSelection() { return mSelectedObjects; } + // right now this just renders the selection with root/child colors instead of a single color + LLObjectSelectionHandle getEditSelection() { convertTransient(); return mSelectedObjects; } + LLObjectSelectionHandle getHighlightedObjects() { return mHighlightedObjects; } LLSelectNode *getHoverNode(); + //////////////////////////////////////////////////////////////// + // Grid manipulation + //////////////////////////////////////////////////////////////// + void addGridObject(LLViewerObject* objectp); + void clearGridObjects(); + void setGridMode(EGridMode mode); + EGridMode getGridMode() { return mGridMode; } + void getGrid(LLVector3& origin, LLQuaternion& rotation, LLVector3 &scale); + BOOL getTEMode() { return mTEMode; } void setTEMode(BOOL b) { mTEMode = b; } - LLViewerObject* getFirstCopyableObject(BOOL get_root = FALSE); - LLViewerObject* getFirstEditableObject(BOOL get_root = FALSE); - LLViewerObject* getFirstMoveableObject(BOOL get_root = FALSE); - LLViewerObject* getFirstDeleteableObject(BOOL get_root = FALSE); - - LLSelectNode* getFirstEditableNode(BOOL get_root = FALSE); - LLSelectNode* getFirstMoveableNode(BOOL get_root = FALSE); + BOOL shouldShowSelection() { return mShowSelection; } LLBBox getBBoxOfSelection() const; LLBBox getSavedBBoxOfSelection() const { return mSavedSelectionBBox; } - BOOL areMultpleEditableObjectsSelected(); - void dump(); void cleanup(); @@ -304,17 +300,18 @@ public: void renderSilhouettes(BOOL for_hud); void enableSilhouette(BOOL enable) { mRenderSilhouettes = enable; } - // Utility functions to operate on the list - - void saveSelectedObjectTransform(EActionType action_type); - void saveSelectedObjectColors(); - void saveSelectedObjectTextures(); - - void selectionUpdatePhysics(BOOL use_physics); - void selectionUpdateTemporary(BOOL is_temporary); - void selectionUpdatePhantom(BOOL is_ghost); - void selectionUpdateCastShadows(BOOL cast_shadows); - void selectionDump(); + //////////////////////////////////////////////////////////////// + // Utility functions that operate on the current selection + //////////////////////////////////////////////////////////////// + void saveSelectedObjectTransform(EActionType action_type); + void saveSelectedObjectColors(); + void saveSelectedObjectTextures(); + + void selectionUpdatePhysics(BOOL use_physics); + void selectionUpdateTemporary(BOOL is_temporary); + void selectionUpdatePhantom(BOOL is_ghost); + void selectionUpdateCastShadows(BOOL cast_shadows); + void selectionDump(); BOOL selectionAllPCode(LLPCode code); // all objects have this PCode BOOL selectionGetMaterial(U8 *material); // all objects have same material @@ -343,11 +340,11 @@ public: void selectionSetMediaTypeAndURL( U8 media_type, const std::string& media_url ); void selectionSetClickAction(U8 action); - void setObjectPermissions(U8 perm_field, BOOL set, U32 perm_mask, BOOL override = FALSE); - void setObjectName(const LLString& name); - void setObjectDescription(const LLString& desc); - void setObjectCategory(const LLCategory& category); - void setObjectSaleInfo(const LLSaleInfo& sale_info); + void selectionSetObjectPermissions(U8 perm_field, BOOL set, U32 perm_mask, BOOL override = FALSE); + void selectionSetObjectName(const LLString& name); + void selectionSetObjectDescription(const LLString& desc); + void selectionSetObjectCategory(const LLCategory& category); + void selectionSetObjectSaleInfo(const LLSaleInfo& sale_info); void selectionTexScaleAutofit(F32 repeats_per_meter); void selectionResetTexInfo(S32 te); // sets S,T to 1 @@ -414,23 +411,20 @@ public: // with the aggregate permissions for texture inventory items of the selection. BOOL selectGetAggregateTexturePermissions(LLAggregatePermissions& ag_perm); - // returns TRUE is any node is currenly worn as an attachment - BOOL selectionIsAttachment(); - LLPermissions* findObjectPermissions(const LLViewerObject* object); void selectDelete(); // Delete on simulator - void selectForceDelete(); // just delete, no into trash + void selectForceDelete(); // just delete, no into trash void selectDuplicate(const LLVector3& offset, BOOL select_copy); // Duplicate on simulator void repeatDuplicate(); - void selectDuplicateOnRay(const LLVector3 &ray_start_region, - const LLVector3 &ray_end_region, - BOOL bypass_raycast, - BOOL ray_end_is_intersection, - const LLUUID &ray_target_id, - BOOL copy_centers, - BOOL copy_rotates, - BOOL select_copy); + void selectDuplicateOnRay(const LLVector3 &ray_start_region, + const LLVector3 &ray_end_region, + BOOL bypass_raycast, + BOOL ray_end_is_intersection, + const LLUUID &ray_target_id, + BOOL copy_centers, + BOOL copy_rotates, + BOOL select_copy); void sendMultipleUpdate(U32 type); // Position, rotation, scale all in one void sendOwner(const LLUUID& owner_id, const LLUUID& group_id, BOOL override = FALSE); @@ -471,7 +465,7 @@ public: void demoteSelectionToIndividuals(); private: - + void convertTransient(); // converts temporarily selected objects to full-fledged selections ESelectType getSelectTypeForObject(LLViewerObject* object); void addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add_to_end = FALSE); void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point); @@ -482,7 +476,6 @@ private: void (*pack_body)(LLSelectNode* node, void *user_data), void *user_data, ESendType send_type); - U32 undoRedo(std::deque<LLSelectAction*> &queue_src, std::deque<LLSelectAction*> &queue_dst, const LLUUID &object_id); static void packAgentID( void *); static void packAgentAndSessionID(void* user_data); @@ -517,22 +510,19 @@ private: static void confirmDelete(S32 option, void* data); private: - LLPointer<LLViewerImage> mSilhouetteImagep; - - LLSelectNodeList mSelectedObjects; - - LLSelectNodeList mHoverObjects; - + LLPointer<LLViewerImage> mSilhouetteImagep; + LLObjectSelectionHandle mSelectedObjects; + LLObjectSelectionHandle mHoverObjects; + LLObjectSelectionHandle mHighlightedObjects; std::set<LLPointer<LLViewerObject> > mRectSelectedObjects; - LLSelectNodeList mGridObjects; + LLObjectSelection mGridObjects; LLQuaternion mGridRotation; LLVector3 mGridOrigin; LLVector3 mGridScale; EGridMode mGridMode; BOOL mGridValid; - LLSelectNodeList mHighlightedObjects; BOOL mTEMode; // render te LLVector3d mSelectionCenterGlobal; @@ -544,15 +534,10 @@ private: BOOL mRenderSilhouettes; // do we render the silhouette LLBBox mSavedSelectionBBox; - ESelectType mSelectType; - LLFrameTimer mEffectsTimer; BOOL mForceSelection; - std::deque<LLSelectAction*> mUndoQueue; - std::deque<LLSelectAction*> mRedoQueue; - - LLAnimPauseRequest mPauseRequest; + LLAnimPauseRequest mPauseRequest; }; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 5eae8c2ff1..b2f2a861ed 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -296,7 +296,7 @@ void LLFloaterTexturePicker::setCanApplyImmediately(BOOL b) void LLFloaterTexturePicker::stopUsingPipette() { - if (gToolMgr && gToolMgr->getCurrentTool(gKeyboard->currentMask(TRUE)) == gToolPipette) + if (gToolMgr && gToolMgr->getCurrentTool() == gToolPipette) { gToolMgr->clearTransientTool(); } @@ -451,7 +451,7 @@ void LLFloaterTexturePicker::draw() childSetEnabled("show_folders_check", mActive && mCanApplyImmediately && !mNoCopyTextureSelected); childSetEnabled("Select", mActive); childSetEnabled("Pipette", gToolMgr != NULL && mActive); - childSetValue("Pipette", gToolMgr && gToolMgr->getCurrentTool(gKeyboard->currentMask(TRUE)) == gToolPipette); + childSetValue("Pipette", gToolMgr && gToolMgr->getCurrentTool() == gToolPipette); //RN: reset search bar to reflect actual search query (all caps, for example) mSearchEdit->setText(mInventoryPanel->getFilterSubString()); diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 01bc0bd5fd..d115cf1158 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -131,7 +131,8 @@ void LLTextureView::draw() { S32 te; LLViewerObject *objectp; - for (gSelectMgr->getFirstTE(&objectp, &te); objectp; gSelectMgr->getNextTE(&objectp, &te)) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for (selection->getFirstTE(&objectp, &te); objectp; selection->getNextTE(&objectp, &te)) { if (imagep == objectp->getTEImage(te)) { diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index f9ff070289..1053e4a569 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -16,6 +16,7 @@ #include "llviewerwindow.h" #include "lltoolcomp.h" +#include "lltoolfocus.h" #include "llfocusmgr.h" #include "llagent.h" #include "llviewborder.h" @@ -135,6 +136,14 @@ BOOL LLTool::handleKey(KEY key, MASK mask) return FALSE; } +LLTool* LLTool::getOverrideTool(MASK mask) +{ + if (mask & MASK_ALT) + { + return gToolCamera; + } + return NULL; +} // static void LLTool::onMouseCaptureLost( LLMouseHandler* old_captor ) diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h index f0e1b170bd..d67a0d7d24 100644 --- a/indra/newview/lltool.h +++ b/indra/newview/lltool.h @@ -58,6 +58,8 @@ public: virtual void handleSelect() { } // do stuff when your tool is selected virtual void handleDeselect() { } // clean up when your tool is deselected + virtual LLTool* getOverrideTool(MASK mask); + // isAlwaysRendered() - return true if this is a tool that should // always be rendered regardless of selection. virtual BOOL isAlwaysRendered() { return FALSE; } diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index 8255008aa0..e56635e181 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -163,7 +163,7 @@ void LLToolBrushLand::modifyLandInSelectionGlobal() return; } - if (gToolMgr->getCurrentTool(gKeyboard->currentMask(TRUE)) == gToolParcel) + if (gToolMgr->getCurrentTool() == gToolParcel) { // selecting land, don't do anything return; @@ -282,8 +282,8 @@ void LLToolBrushLand::modifyLandInSelectionGlobal() msg->addF32Fast(_PREHASH_Seconds, seconds); msg->addF32Fast(_PREHASH_Height, mStartingZ); - BOOL parcel_selected = gParcelMgr->getWholeParcelSelected(); - LLParcel* selected_parcel = gParcelMgr->getSelectedParcel(); + BOOL parcel_selected = gParcelMgr->getParcelSelection()->getWholeParcelSelected(); + LLParcel* selected_parcel = gParcelMgr->getParcelSelection()->getParcel(); if (parcel_selected && selected_parcel) { @@ -516,7 +516,7 @@ void LLToolBrushLand::onIdle( void* brush_tool ) { LLToolBrushLand* self = reinterpret_cast<LLToolBrushLand*>(brush_tool); - if( gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ) == self ) + if( gToolMgr->getCurrentTool() == self ) { self->brush(); } diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 945a172b1c..3f111583b5 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -148,7 +148,7 @@ void LLToolCompInspect::pickCallback(S32 x, S32 y, MASK mask) if( hit_obj ) { - if (gSelectMgr->getObjectCount()) + if (gSelectMgr->getSelection()->getObjectCount()) { gEditMenuHandler = gSelectMgr; } @@ -222,7 +222,7 @@ void LLToolCompTranslate::pickCallback(S32 x, S32 y, MASK mask) if( hit_obj || gToolTranslate->mManip->getHighlightedPart() != LLManip::LL_NO_PART ) { - if (gSelectMgr->getObjectCount()) + if (gToolTranslate->mManip->getSelection()->getObjectCount()) { gEditMenuHandler = gSelectMgr; } @@ -253,9 +253,22 @@ BOOL LLToolCompTranslate::handleMouseUp(S32 x, S32 y, MASK mask) return LLToolComposite::handleMouseUp(x, y, mask); } +LLTool* LLToolCompTranslate::getOverrideTool(MASK mask) +{ + if (mask == MASK_CONTROL) + { + return gToolRotate; + } + else if (mask == (MASK_CONTROL | MASK_SHIFT)) + { + return gToolStretch; + } + return LLToolComposite::getOverrideTool(mask); +} + BOOL LLToolCompTranslate::handleDoubleClick(S32 x, S32 y, MASK mask) { - if (!gSelectMgr->isEmpty() && mManip->getHighlightedPart() == LLManip::LL_NO_PART) + if (mManip->getSelection()->isEmpty() && mManip->getHighlightedPart() == LLManip::LL_NO_PART) { // You should already have an object selected from the mousedown. // If so, show its properties @@ -331,7 +344,7 @@ void LLToolCompScale::pickCallback(S32 x, S32 y, MASK mask) if( hit_obj || gToolStretch->mManip->getHighlightedPart() != LLManip::LL_NO_PART) { - if (gSelectMgr->getObjectCount()) + if (gToolStretch->mManip->getSelection()->getObjectCount()) { gEditMenuHandler = gSelectMgr; } @@ -359,9 +372,20 @@ BOOL LLToolCompScale::handleMouseUp(S32 x, S32 y, MASK mask) return LLToolComposite::handleMouseUp(x, y, mask); } +LLTool* LLToolCompScale::getOverrideTool(MASK mask) +{ + if (mask == MASK_CONTROL) + { + return gToolRotate; + } + + return LLToolComposite::getOverrideTool(mask); +} + + BOOL LLToolCompScale::handleDoubleClick(S32 x, S32 y, MASK mask) { - if (!gSelectMgr->isEmpty() && mManip->getHighlightedPart() == LLManip::LL_NO_PART) + if (!mManip->getSelection()->isEmpty() && mManip->getHighlightedPart() == LLManip::LL_NO_PART) { // You should already have an object selected from the mousedown. // If so, show its properties @@ -515,7 +539,7 @@ void LLToolCompRotate::pickCallback(S32 x, S32 y, MASK mask) if( hit_obj || gToolRotate->mManip->getHighlightedPart() != LLManip::LL_NO_PART) { - if (gSelectMgr->getObjectCount()) + if (gToolRotate->mManip->getSelection()->getObjectCount()) { gEditMenuHandler = gSelectMgr; } @@ -543,10 +567,18 @@ BOOL LLToolCompRotate::handleMouseUp(S32 x, S32 y, MASK mask) return LLToolComposite::handleMouseUp(x, y, mask); } +LLTool* LLToolCompRotate::getOverrideTool(MASK mask) +{ + if (mask == (MASK_CONTROL | MASK_SHIFT)) + { + return gToolStretch; + } + return LLToolComposite::getOverrideTool(mask); +} BOOL LLToolCompRotate::handleDoubleClick(S32 x, S32 y, MASK mask) { - if (!gSelectMgr->isEmpty() && mManip->getHighlightedPart() == LLManip::LL_NO_PART) + if (!mManip->getSelection()->isEmpty() && mManip->getHighlightedPart() == LLManip::LL_NO_PART) { // You should already have an object selected from the mousedown. // If so, show its properties @@ -649,7 +681,7 @@ BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask) // On mousedown, start grabbing gGrabTransientTool = this; - gCurrentToolset->selectTool( (LLTool*) mGrab ); + gToolMgr->getCurrentToolset()->selectTool( (LLTool*) mGrab ); return gToolGrab->handleMouseDown(x, y, mask); } @@ -666,7 +698,7 @@ BOOL LLToolCompGun::handleDoubleClick(S32 x, S32 y, MASK mask) // On mousedown, start grabbing gGrabTransientTool = this; - gCurrentToolset->selectTool( (LLTool*) mGrab ); + gToolMgr->getCurrentToolset()->selectTool( (LLTool*) mGrab ); return gToolGrab->handleDoubleClick(x, y, mask); } diff --git a/indra/newview/lltoolcomp.h b/indra/newview/lltoolcomp.h index c319904ee8..c348379a16 100644 --- a/indra/newview/lltoolcomp.h +++ b/indra/newview/lltoolcomp.h @@ -110,6 +110,8 @@ public: virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); // Returns to the default tool virtual void render(); + virtual LLTool* getOverrideTool(MASK mask); + static void pickCallback(S32 x, S32 y, MASK mask); }; @@ -129,8 +131,9 @@ public: virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); // Returns to the default tool virtual void render(); + virtual LLTool* getOverrideTool(MASK mask); + static void pickCallback(S32 x, S32 y, MASK mask); - }; @@ -150,6 +153,8 @@ public: virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual void render(); + virtual LLTool* getOverrideTool(MASK mask); + static void pickCallback(S32 x, S32 y, MASK mask); protected: diff --git a/indra/newview/lltoolface.cpp b/indra/newview/lltoolface.cpp index c35fcb434c..e103af0bd3 100644 --- a/indra/newview/lltoolface.cpp +++ b/indra/newview/lltoolface.cpp @@ -42,7 +42,7 @@ LLToolFace::~LLToolFace() BOOL LLToolFace::handleDoubleClick(S32 x, S32 y, MASK mask) { - if (!gSelectMgr->isEmpty()) + if (!gSelectMgr->getSelection()->isEmpty()) { // You should already have an object selected from the mousedown. // If so, show its properties @@ -90,7 +90,7 @@ void LLToolFace::pickCallback(S32 x, S32 y, MASK mask) // object wasn't selected so add the object and face gSelectMgr->selectObjectOnly(hit_obj, hit_face); } - else if (!gSelectMgr->contains(hit_obj, hit_face) ) + else if (!gSelectMgr->getSelection()->contains(hit_obj, hit_face) ) { // object is selected, but not this face, so add it. gSelectMgr->addAsIndividual(hit_obj, hit_face); diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 627a49a6cc..2d1cb9c493 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -43,9 +43,6 @@ BOOL gCameraBtnPan = FALSE; const S32 SLOP_RANGE = 4; const F32 FOCUS_OFFSET_FACTOR = 1.f; -extern void handle_first_tool(void*); - - // // Camera - shared functionality // @@ -136,7 +133,8 @@ void LLToolCamera::pickCallback(S32 x, S32 y, MASK mask) // check for hud attachments if (hit_obj && hit_obj->isHUDAttachment()) { - if (!gSelectMgr->getObjectCount() || gSelectMgr->getSelectType() != SELECT_TYPE_HUD) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + if (!selection->getObjectCount() || selection->getSelectType() != SELECT_TYPE_HUD) { gToolCamera->mValidClickPoint = FALSE; return; @@ -175,7 +173,7 @@ void LLToolCamera::pickCallback(S32 x, S32 y, MASK mask) } //RN: check to see if this is mouse-driving as opposed to ALT-zoom or Focus tool else if (mask & MASK_ALT || - (gToolMgr->getCurrentTool(mask)->getName() == "Camera")) + (gToolMgr->getCurrentTool()->getName() == "Camera")) { LLViewerObject* hit_obj = gViewerWindow->lastObjectHit(); if (hit_obj) diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h index 1d3d4a728b..e43da21036 100644 --- a/indra/newview/lltoolfocus.h +++ b/indra/newview/lltoolfocus.h @@ -27,6 +27,8 @@ public: virtual void handleSelect(); virtual void handleDeselect(); + virtual LLTool* getOverrideTool(MASK mask) { return NULL; } + static void pickCallback(S32 x, S32 y, MASK mask); BOOL mouseSteerMode() { return mMouseSteering; } diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index 898322d5ca..549719250c 100644 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -126,7 +126,7 @@ void LLToolGrab::pickCallback(S32 x, S32 y, MASK mask) BOOL extend_select = (mask & MASK_SHIFT); - if (!extend_select && !gSelectMgr->isEmpty()) + if (!extend_select && !gSelectMgr->getSelection()->isEmpty()) { gSelectMgr->deselectAll(); gToolGrab->mDeselectedThisClick = TRUE; diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h index 5073d0e211..ebe74cb5b1 100644 --- a/indra/newview/lltoolgrab.h +++ b/indra/newview/lltoolgrab.h @@ -34,7 +34,7 @@ public: virtual void handleSelect(); virtual void handleDeselect(); - + virtual LLViewerObject* getEditingObject(); virtual LLVector3d getEditingPointGlobal(); virtual BOOL isEditing(); diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp index 4c01b86153..c4bc524796 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -48,7 +48,7 @@ void LLToolGun::handleDeselect() BOOL LLToolGun::handleMouseDown(S32 x, S32 y, MASK mask) { gGrabTransientTool = this; - gCurrentToolset->selectTool( gToolGrab ); + gToolMgr->getCurrentToolset()->selectTool( gToolGrab ); return gToolGrab->handleMouseDown(x, y, mask); } diff --git a/indra/newview/lltoolgun.h b/indra/newview/lltoolgun.h index d567db30ca..4232a401fd 100644 --- a/indra/newview/lltoolgun.h +++ b/indra/newview/lltoolgun.h @@ -26,6 +26,7 @@ public: virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleHover(S32 x, S32 y, MASK mask); + virtual LLTool* getOverrideTool(MASK mask) { return NULL; } virtual BOOL clipMouseWhenDown() { return FALSE; } private: diff --git a/indra/newview/lltoolindividual.cpp b/indra/newview/lltoolindividual.cpp index a5afd379ed..a6c74be00e 100644 --- a/indra/newview/lltoolindividual.cpp +++ b/indra/newview/lltoolindividual.cpp @@ -66,7 +66,7 @@ void LLToolIndividual::pickCallback(S32 x, S32 y, MASK mask) BOOL LLToolIndividual::handleDoubleClick(S32 x, S32 y, MASK mask) { - if(!gSelectMgr->isEmpty()) + if(!gSelectMgr->getSelection()->isEmpty()) { // You should already have an object selected from the mousedown. // If so, show its inventory. @@ -85,10 +85,10 @@ BOOL LLToolIndividual::handleDoubleClick(S32 x, S32 y, MASK mask) void LLToolIndividual::handleSelect() { - LLViewerObject* obj = gSelectMgr->getFirstRootObject(); + LLViewerObject* obj = gSelectMgr->getSelection()->getFirstRootObject(); if(!obj) { - obj = gSelectMgr->getFirstObject(); + obj = gSelectMgr->getSelection()->getFirstObject(); } gSelectMgr->deselectAll(); if(obj) diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 2c69db10c5..7c9cd1b199 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -34,7 +34,6 @@ LLToolMgr* gToolMgr = NULL; // Used when app not active to avoid processing hover. LLTool* gToolNull = NULL; -LLToolset* gCurrentToolset = NULL; LLToolset* gBasicToolset = NULL; LLToolset* gCameraToolset = NULL; //LLToolset* gLandToolset = NULL; @@ -46,10 +45,12 @@ LLToolset* gFaceEditToolset = NULL; LLToolMgr::LLToolMgr() : - mCurrentTool(NULL), + mBaseTool(NULL), mSavedTool(NULL), mTransientTool( NULL ), - mOverrideTool( NULL ) + mOverrideTool( NULL ), + mSelectedTool( NULL ), + mCurrentToolset( NULL ) { gToolNull = new LLTool(NULL); // Does nothing setCurrentTool(gToolNull); @@ -59,8 +60,6 @@ LLToolMgr::LLToolMgr() // gLandToolset = new LLToolset(); gMouselookToolset = new LLToolset(); gFaceEditToolset = new LLToolset(); - - gCurrentToolset = gBasicToolset; } void LLToolMgr::initTools() @@ -178,8 +177,8 @@ void LLToolMgr::initTools() gToolObjPicker = new LLToolObjPicker(); // On startup, use "select" tool + setCurrentToolset(gBasicToolset); gBasicToolset->selectTool( gToolPie ); - useSelectedTool( gBasicToolset ); } LLToolMgr::~LLToolMgr() @@ -248,138 +247,103 @@ LLToolMgr::~LLToolMgr() gToolNull = NULL; } - -void LLToolMgr::useSelectedTool( LLToolset* vp ) -{ - setCurrentTool( vp->getSelectedTool() ); -} - BOOL LLToolMgr::usingTransientTool() { return mTransientTool ? TRUE : FALSE; } -void LLToolMgr::setCurrentTool( LLTool* tool ) +void LLToolMgr::setCurrentToolset(LLToolset* current) { - if (tool == mCurrentTool) + if (!current) return; + + // switching toolsets? + if (current != mCurrentToolset) { - // didn't change tool, so don't mess with - // handleSelect or handleDeselect - return; + // deselect current tool + if (mSelectedTool) + { + mSelectedTool->handleDeselect(); + } + mCurrentToolset = current; + // select first tool of new toolset only if toolset changed + mCurrentToolset->selectFirstTool(); } + // update current tool based on new toolset + setCurrentTool( mCurrentToolset->getSelectedTool() ); +} + +LLToolset* LLToolMgr::getCurrentToolset() +{ + return mCurrentToolset; +} +void LLToolMgr::setCurrentTool( LLTool* tool ) +{ if (mTransientTool) { - mTransientTool->handleDeselect(); mTransientTool = NULL; } - else if( mCurrentTool ) - { - mCurrentTool->handleDeselect(); - } - mCurrentTool = tool; - if (mCurrentTool) - { - mCurrentTool->handleSelect(); - } + mBaseTool = tool; + updateToolStatus(); } -LLTool* LLToolMgr::getCurrentTool(MASK override_mask) +LLTool* LLToolMgr::getCurrentTool() { - // In mid-drag, always keep the current tool - if (gToolTranslate->hasMouseCapture() - || gToolRotate->hasMouseCapture() - || gToolStretch->hasMouseCapture()) - { - // might have gotten here by overriding another tool - if (mOverrideTool) - { - return mOverrideTool; - } - else - { - return mCurrentTool; - } - } + MASK override_mask = gKeyboard->currentMask(TRUE); + LLTool* cur_tool = NULL; + // always use transient tools if available if (mTransientTool) { mOverrideTool = NULL; - return mTransientTool; + cur_tool = mTransientTool; } - - if (mCurrentTool == gToolGun) + // tools currently grabbing mouse input will stay active + else if (mSelectedTool && mSelectedTool->hasMouseCapture()) { - mOverrideTool = NULL; - return mCurrentTool; + cur_tool = mSelectedTool; } - - // ALT always gets you the camera tool - if (override_mask & MASK_ALT) + else { - mOverrideTool = gToolCamera; - return mOverrideTool; - } + mOverrideTool = mBaseTool ? mBaseTool->getOverrideTool(override_mask) : NULL; - if (mCurrentTool == gToolCamera) - { - // ...can't switch out of camera - mOverrideTool = NULL; - return mCurrentTool; - } - else if (mCurrentTool == gToolGrab) - { - // ...can't switch out of grab - mOverrideTool = NULL; - return mCurrentTool; + // use override tool if available otherwise drop back to base tool + cur_tool = mOverrideTool ? mOverrideTool : mBaseTool; } - else if (mCurrentTool == gToolInspect) - { - // ...can't switch out of grab - mOverrideTool = NULL; - return mCurrentTool; - } - else + + //update tool selection status + if (mSelectedTool != cur_tool) { - // ...can switch between editing tools - if (override_mask == MASK_CONTROL) - { - // Control lifts when in the pie tool, otherwise switches to rotate - if (mCurrentTool == gToolPie) - { - mOverrideTool = gToolGrab; - } - else - { - mOverrideTool = gToolRotate; - } - return mOverrideTool; - } - else if (override_mask == (MASK_CONTROL | MASK_SHIFT)) + if (mSelectedTool) { - // Shift-Control spins when in the pie tool, otherwise switches to scale - if (mCurrentTool == gToolPie) - { - mOverrideTool = gToolGrab; - } - else - { - mOverrideTool = gToolStretch; - } - return mOverrideTool; + mSelectedTool->handleDeselect(); } - else + if (cur_tool) { - mOverrideTool = NULL; - return mCurrentTool; + cur_tool->handleSelect(); } + mSelectedTool = cur_tool; } + + return mSelectedTool; +} + +LLTool* LLToolMgr::getBaseTool() +{ + return mBaseTool; +} + +void LLToolMgr::updateToolStatus() +{ + // call getcurrenttool() to calculate active tool and call handleSelect() and handleDeselect() immediately + // when active tool changes + getCurrentTool(); } BOOL LLToolMgr::inEdit() { - return mCurrentTool != gToolPie && mCurrentTool != gToolNull; + return mBaseTool != gToolPie && mBaseTool != gToolNull; } void LLToolMgr::setTransientTool(LLTool* tool) @@ -392,34 +356,26 @@ void LLToolMgr::setTransientTool(LLTool* tool) { if (mTransientTool) { - mTransientTool->handleDeselect(); mTransientTool = NULL; } - else if (mCurrentTool) - { - mCurrentTool->handleDeselect(); - } mTransientTool = tool; - mTransientTool->handleSelect(); } + + updateToolStatus(); } void LLToolMgr::clearTransientTool() { if (mTransientTool) { - mTransientTool->handleDeselect(); mTransientTool = NULL; - if (mCurrentTool) - { - mCurrentTool->handleSelect(); - } - else + if (!mBaseTool) { - llwarns << "mCurrentTool is NULL" << llendl; + llwarns << "mBaseTool is NULL" << llendl; } } + updateToolStatus(); } @@ -428,26 +384,19 @@ void LLToolMgr::clearTransientTool() // release this locking. void LLToolMgr::onAppFocusLost() { - if (mCurrentTool - && mCurrentTool == gToolGun) - { - mCurrentTool->handleDeselect(); - } - mSavedTool = mCurrentTool; - mCurrentTool = gToolNull; + mSavedTool = mBaseTool; + mBaseTool = gToolNull; + updateToolStatus(); } void LLToolMgr::onAppFocusGained() { if (mSavedTool) { - if (mSavedTool == gToolGun) - { - mCurrentTool->handleSelect(); - } - mCurrentTool = mSavedTool; + mBaseTool = mSavedTool; mSavedTool = NULL; } + updateToolStatus(); } ///////////////////////////////////////////////////// @@ -491,7 +440,10 @@ BOOL LLToolset::isToolSelected( S32 index ) void LLToolset::selectFirstTool() { mSelectedTool = mToolList.getFirstData(); - gToolMgr->setCurrentTool( mSelectedTool ); + if (gToolMgr) + { + gToolMgr->setCurrentTool( mSelectedTool ); + } } @@ -540,5 +492,5 @@ void LLToolset::selectPrevTool() void select_tool( void *tool_pointer ) { LLTool *tool = (LLTool *)tool_pointer; - gCurrentToolset->selectTool( tool ); + gToolMgr->getCurrentToolset()->selectTool( tool ); } diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h index b54a893b0e..a57ebc32a6 100644 --- a/indra/newview/lltoolmgr.h +++ b/indra/newview/lltoolmgr.h @@ -32,27 +32,33 @@ public: // Must be called after gSavedSettings set up. void initTools(); - LLTool* getCurrentTool(MASK override_mask); + LLTool* getCurrentTool(); // returns active tool, taking into account keyboard state + LLTool* getBaseTool(); // returns active tool when overrides are deactivated BOOL inEdit(); - void useSelectedTool( LLToolset* vp ); void setTransientTool(LLTool* tool); void clearTransientTool(); BOOL usingTransientTool(); + void setCurrentToolset(LLToolset* current); + LLToolset* getCurrentToolset(); + void onAppFocusGained(); void onAppFocusLost(); protected: friend class LLToolset; // to allow access to setCurrentTool(); void setCurrentTool(LLTool* tool); + void updateToolStatus(); protected: - LLTool* mCurrentTool; + LLTool* mBaseTool; LLTool* mSavedTool; // The current tool at the time application focus was lost. LLTool* mTransientTool; LLTool* mOverrideTool; // Tool triggered by keyboard override + LLTool* mSelectedTool; // last known active tool + LLToolset* mCurrentToolset; }; // Sets of tools for various modes @@ -87,7 +93,6 @@ void select_tool(void *tool); // Globals (created and destroyed by LLViewerWindow) extern LLToolMgr* gToolMgr; -extern LLToolset* gCurrentToolset; extern LLToolset* gBasicToolset; extern LLToolset *gCameraToolset; //extern LLToolset *gLandToolset; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 89df9c5249..68834fe564 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -63,7 +63,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) // if buttons swapped, don't pick transparent so users can't "pay" // transparent objects gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback, - TRUE, TRUE); + FALSE, TRUE); mGrabMouseButtonDown = TRUE; return TRUE; } @@ -194,7 +194,7 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show) !always_show) { gGrabTransientTool = this; - gCurrentToolset->selectTool( gToolGrab ); + gToolMgr->getCurrentToolset()->selectTool( gToolGrab ); return gToolGrab->handleObjectHit( object, x, y, mask); } @@ -253,8 +253,8 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show) // Spawn pie menu if (mHitLand) { - gParcelMgr->selectParcelAt( gLastHitPosGlobal ); - + LLParcelSelectionHandle selection = gParcelMgr->selectParcelAt( gLastHitPosGlobal ); + gMenuHolder->setParcelSelection(selection); gPieLand->show(x, y, mPieMouseButtonDown); // VEFFECT: ShowPie @@ -269,6 +269,8 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show) } else if (object) { + gMenuHolder->setObjectSelection(gSelectMgr->getSelection()); + if (object->isAvatar() || (object->isAttachment() && !object->isHUDAttachment() && !object->permYouOwner())) { @@ -302,7 +304,7 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show) { // BUG: What about chatting child objects? LLString name; - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if (node) { name = node->mName; @@ -397,7 +399,7 @@ void LLToolPie::selectionPropertiesReceived() if (sClickActionObject && !sClickActionObject->isDead()) { - LLViewerObject* root = gSelectMgr->getFirstRootObject(); + LLViewerObject* root = gSelectMgr->getSelection()->getFirstRootObject(); if (root == sClickActionObject) { U8 action = root->getClickAction(); @@ -603,6 +605,19 @@ void LLToolPie::handleDeselect() gSelectMgr->validateSelection(); } +LLTool* LLToolPie::getOverrideTool(MASK mask) +{ + if (mask == MASK_CONTROL) + { + return gToolGrab; + } + else if (mask == (MASK_CONTROL | MASK_SHIFT)) + { + return gToolGrab; + } + + return LLTool::getOverrideTool(mask); +} void LLToolPie::stopEditing() { diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index d440a443e2..6826b66ea7 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -33,6 +33,7 @@ public: virtual void onMouseCaptureLost(); virtual void handleDeselect(); + virtual LLTool* getOverrideTool(MASK mask); static void leftMouseCallback(S32 x, S32 y, MASK mask); static void rightMouseCallback(S32 x, S32 y, MASK mask); diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index facfda2c85..20677fea98 100644 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -110,7 +110,7 @@ BOOL LLToolPlacer::placeObject(S32 x, S32 y, MASK mask) // ...and go back to the default tool if (added && !gSavedSettings.getBOOL("CreateToolKeepSelected")) { - gCurrentToolset->selectTool( gToolTranslate ); + gToolMgr->getCurrentToolset()->selectTool( gToolTranslate ); } return added; diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index a303776ade..14ffb00158 100644 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -174,9 +174,10 @@ void LLToolSelect::handleObjectSelection(LLViewerObject *object, MASK mask, BOOL if (!already_selected) { LLViewerObject* root_object = (LLViewerObject*)object->getRootEdit(); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); // this is just a temporary selection - LLSelectNode* select_node = gSelectMgr->findSelectNode(root_object); + LLSelectNode* select_node = selection->findNode(root_object); if (select_node) { select_node->setTransient(TRUE); @@ -184,7 +185,7 @@ void LLToolSelect::handleObjectSelection(LLViewerObject *object, MASK mask, BOOL for (S32 i = 0; i < (S32)root_object->mChildList.size(); i++) { - select_node = gSelectMgr->findSelectNode(root_object->mChildList[i]); + select_node = selection->findNode(root_object->mChildList[i]); if (select_node) { select_node->setTransient(TRUE); diff --git a/indra/newview/lltoolselectland.cpp b/indra/newview/lltoolselectland.cpp index 7d51d4a81c..f64bf6bf2d 100644 --- a/indra/newview/lltoolselectland.cpp +++ b/indra/newview/lltoolselectland.cpp @@ -46,6 +46,10 @@ LLToolSelectLand::LLToolSelectLand( ) mLastShowParcelOwners(FALSE) { } +LLToolSelectLand::~LLToolSelectLand() +{ +} + BOOL LLToolSelectLand::handleMouseDown(S32 x, S32 y, MASK mask) { @@ -114,7 +118,7 @@ BOOL LLToolSelectLand::handleMouseUp(S32 x, S32 y, MASK mask) roundXY(mEastNorthTop); // Don't auto-select entire parcel. - gParcelMgr->selectLand( mWestSouthBottom, mEastNorthTop, FALSE ); + mSelection = gParcelMgr->selectLand( mWestSouthBottom, mEastNorthTop, FALSE ); } mMouseOutsideSlop = FALSE; @@ -201,6 +205,7 @@ void LLToolSelectLand::handleSelect() void LLToolSelectLand::handleDeselect() { gFloaterTools->setStatusText(""); + mSelection = NULL; //gParcelMgr->deselectLand(); gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners); } diff --git a/indra/newview/lltoolselectland.h b/indra/newview/lltoolselectland.h index 9ae2b071b5..02158b1495 100644 --- a/indra/newview/lltoolselectland.h +++ b/indra/newview/lltoolselectland.h @@ -12,11 +12,14 @@ #include "lltool.h" #include "v3dmath.h" +class LLParcelSelection; + class LLToolSelectLand : public LLTool { public: LLToolSelectLand( ); + virtual ~LLToolSelectLand(); /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); @@ -49,6 +52,7 @@ protected: LLVector3d mEastNorthTop; // global coords, from drag BOOL mLastShowParcelOwners; // store last Show Parcel Owners setting + LLHandle<LLParcelSelection> mSelection; // hold on to a parcel selection }; extern LLToolSelectLand *gToolParcel; diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp index 49e5896ab7..f5c1e0b90b 100644 --- a/indra/newview/lltoolview.cpp +++ b/indra/newview/lltoolview.cpp @@ -129,7 +129,7 @@ void LLToolView::draw() { // turn off highlighting for all containers // and hide all option panels except for the selected one. - LLTool* selected = gCurrentToolset->getSelectedTool(); + LLTool* selected = gToolMgr->getCurrentToolset()->getSelectedTool(); for( LLToolContainer* contain = mContainList.getFirstData(); contain != NULL; contain = mContainList.getNextData() @@ -169,7 +169,6 @@ void LLToolView::onClickToolButton(void* userdata) LLToolContainer* clicked = (LLToolContainer*) userdata; // Switch to this one - gCurrentToolset->selectTool( clicked->mTool ); - gToolMgr->useSelectedTool( gCurrentToolset ); + gToolMgr->getCurrentToolset()->selectTool( clicked->mTool ); } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 838bf68f3d..9b6fc425fa 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -420,9 +420,6 @@ BOOL get_visibility(void*); void request_friendship(const LLUUID& agent_id); // Tools menu -void handle_first_tool(void*); -void handle_next_tool(void*); -void handle_previous_tool(void*); void handle_force_unlock(void*); void handle_selected_texture_info(void*); void handle_dump_image_list(void*); @@ -980,6 +977,7 @@ void init_debug_ui_menu(LLMenuGL* menu) menu->append(new LLMenuItemToggleGL("Debug SelectMgr", &gDebugSelectMgr)); menu->append(new LLMenuItemToggleGL("Debug Clicks", &gDebugClicks)); menu->append(new LLMenuItemToggleGL("Debug Views", &LLView::sDebugRects)); + menu->append(new LLMenuItemCheckGL("Show Name Tooltips", toggle_show_xui_names, NULL, check_show_xui_names, NULL)); menu->append(new LLMenuItemToggleGL("Debug Mouse Events", &LLView::sDebugMouseHandling)); menu->append(new LLMenuItemToggleGL("Debug Keys", &LLView::sDebugKeys)); menu->append(new LLMenuItemToggleGL("Debug WindowProc", &gDebugWindowProc)); @@ -1427,7 +1425,7 @@ class LLObjectRateOwner : public view_listener_t bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { // Don't allow rating of group owned objects. - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if (!node) return true; if (node->mPermissions->isGroupOwned()) { @@ -1517,12 +1515,13 @@ class LLObjectEnableReportAbuse : public view_listener_t BOOL enable_attach(void*) { // All root objects must be owned by agent. + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); BOOL rv = FALSE; - LLViewerObject* obj = gSelectMgr->getFirstRootObject(); + LLViewerObject* obj = selection->getFirstRootObject(); if(obj) { rv = TRUE; - for(obj = gSelectMgr->getFirstRootObject() ; obj != NULL; obj = gSelectMgr->getNextRootObject()) + for(obj = selection->getFirstRootObject() ; obj != NULL; obj = selection->getNextRootObject()) { for (U32 child_num = 0; child_num < obj->mChildList.size(); child_num++ ) { @@ -1572,7 +1571,6 @@ class LLObjectTouch : public view_listener_t msg->addU32Fast(_PREHASH_LocalID, object->mLocalID); msg->sendMessage(object->getRegion()->getHost()); - gSelectMgr->deselectTransient(); return true; } }; @@ -1588,7 +1586,7 @@ class LLObjectEnableTouch : public view_listener_t gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); // Update label based on the node touch name if available. - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if (node && node->mValid && !node->mTouchName.empty()) { gMenuHolder->childSetText("Object Touch", node->mTouchName); @@ -1604,7 +1602,7 @@ class LLObjectEnableTouch : public view_listener_t void label_touch(LLString& label, void*) { - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if (node && node->mValid && !node->mTouchName.empty()) { label.assign(node->mTouchName); @@ -1620,8 +1618,6 @@ bool handle_object_open() LLViewerObject* obj = gObjectList.findObject(gLastHitObjectID); if(!obj) return true; - // transient selection must be made permanent - gSelectMgr->convertTransient(); LLFloaterOpenObject::show(); return true; } @@ -1682,8 +1678,8 @@ bool toggle_build_mode() gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD ); } - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectTool( gToolCreate ); + gToolMgr->setCurrentToolset(gBasicToolset); + gToolMgr->getCurrentToolset()->selectTool( gToolCreate ); // Could be first use LLFirstUse::useBuild(); @@ -1719,8 +1715,8 @@ class LLObjectBuild : public view_listener_t gViewerWindow->moveCursorToCenter(); } - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectTool( gToolCreate ); + gToolMgr->setCurrentToolset(gBasicToolset); + gToolMgr->getCurrentToolset()->selectTool( gToolCreate ); // Could be first use LLFirstUse::useBuild(); @@ -1733,12 +1729,12 @@ class LLObjectEdit : public view_listener_t bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { gParcelMgr->deselectLand(); - // convert transient selections to permanent - gSelectMgr->convertTransient(); if (gAgent.getFocusOnAvatar() && !gToolMgr->inEdit()) { - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD || !gSavedSettings.getBOOL("EditCameraMovement")) + LLObjectSelectionHandle selection = gSelectMgr->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 @@ -1758,7 +1754,7 @@ class LLObjectEdit : public view_listener_t gFloaterTools->open(); /* Flawfinder: ignore */ - gCurrentToolset = gBasicToolset; + gToolMgr->setCurrentToolset(gBasicToolset); gFloaterTools->setEditTool( gToolTranslate ); // Could be first use @@ -1771,7 +1767,6 @@ class LLObjectInspect : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - gSelectMgr->convertTransient(); LLFloaterInspect::show(); return true; } @@ -1804,8 +1799,8 @@ class LLLandBuild : public view_listener_t } - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectTool( gToolCreate ); + gToolMgr->setCurrentToolset(gBasicToolset); + gToolMgr->getCurrentToolset()->selectTool( gToolCreate ); // Could be first use LLFirstUse::useBuild(); @@ -1974,7 +1969,7 @@ class LLObjectMute : public view_listener_t // it's an object id = object->getID(); - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if (node) { name = node->mName; @@ -1994,7 +1989,6 @@ class LLObjectMute : public view_listener_t gFloaterMute->show(); } - gSelectMgr->deselectAll(); return true; } }; @@ -2012,9 +2006,6 @@ bool handle_go_to() strings.push_back(val); send_generic_message("autopilot", strings); - // Don't select anything - gSelectMgr->deselectTransient(); - gParcelMgr->deselectLand(); if (gAgent.getAvatarObject() && !gSavedSettings.getBOOL("AutoPilotLocksCamera")) @@ -2359,9 +2350,9 @@ BOOL enable_buy(void*) { // In order to buy, there must only be 1 purchaseable object in // the selection manger. - if(gSelectMgr->getRootObjectCount() != 1) return FALSE; + if(gSelectMgr->getSelection()->getRootObjectCount() != 1) return FALSE; LLViewerObject* obj = NULL; - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if(node) { obj = node->getObject(); @@ -2422,14 +2413,12 @@ void handle_buy_object(LLSaleInfo sale_info) return; } - gSelectMgr->convertTransient(); LLFloaterBuy::show(sale_info); } void handle_buy_contents(LLSaleInfo sale_info) { - gSelectMgr->convertTransient(); LLFloaterBuyContents::show(sale_info); } @@ -2772,7 +2761,6 @@ bool handle_sit_or_stand() if (sitting_on_selection()) { gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); - gSelectMgr->deselectTransient(); return true; } @@ -2793,8 +2781,6 @@ bool handle_sit_or_stand() gMessageSystem->addVector3Fast(_PREHASH_Offset, offset_single); object->getRegion()->sendReliableMessage(); - - gSelectMgr->deselectTransient(); } return true; } @@ -2809,11 +2795,14 @@ class LLObjectSitOrStand : public view_listener_t void near_sit_down_point(BOOL success, void *) { - gAgent.setFlying(FALSE); - gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); + if (success) + { + gAgent.setFlying(FALSE); + gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); - // Might be first sit - LLFirstUse::useSit(); + // Might be first sit + LLFirstUse::useSit(); + } } class LLLandSit : public view_listener_t @@ -3153,13 +3142,12 @@ void reset_view_final( BOOL proceed, void* ) gAgent.changeCameraToDefault(); gAgent.resetView(!gFloaterTools->getVisible()); + gFloaterTools->close(); gViewerWindow->showCursor(); // Switch back to basic toolset - gCurrentToolset = gBasicToolset; - gBasicToolset->selectFirstTool(); - gToolMgr->useSelectedTool( gBasicToolset ); + gToolMgr->setCurrentToolset(gBasicToolset); } class LLViewLookAtLastChatter : public view_listener_t @@ -3232,7 +3220,7 @@ class LLEditEnableDuplicate : public view_listener_t void disabled_duplicate(void*) { - if (gSelectMgr->getFirstObject()) + if (gSelectMgr->getSelection()->getFirstObject()) { LLNotifyBox::showXml("CopyFailed"); } @@ -3262,7 +3250,7 @@ void handle_deed_object_to_group(void*) BOOL enable_deed_object_to_group(void*) { - if(gSelectMgr->isEmpty()) return FALSE; + if(gSelectMgr->getSelection()->isEmpty()) return FALSE; LLPermissions perm; LLUUID group_id; @@ -3321,8 +3309,8 @@ void handle_object_owner_permissive(void*) if(gAgent.isGodlike()) { // do the objects. - gSelectMgr->setObjectPermissions(PERM_BASE, TRUE, PERM_ALL, TRUE); - gSelectMgr->setObjectPermissions(PERM_OWNER, TRUE, PERM_ALL, TRUE); + gSelectMgr->selectionSetObjectPermissions(PERM_BASE, TRUE, PERM_ALL, TRUE); + gSelectMgr->selectionSetObjectPermissions(PERM_OWNER, TRUE, PERM_ALL, TRUE); } } @@ -3338,7 +3326,7 @@ void handle_object_owner_self(void*) // Shortcut to set owner permissions to not editable. void handle_object_lock(void*) { - gSelectMgr->setObjectPermissions(PERM_OWNER, FALSE, PERM_MODIFY); + gSelectMgr->selectionSetObjectPermissions(PERM_OWNER, FALSE, PERM_MODIFY); } void handle_object_asset_ids(void*) @@ -3490,8 +3478,9 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id) } //gInventoryView->setPanelOpen(TRUE); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); LLViewerObject* object = NULL; - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = selection->getFirstRootNode(); if(!node) return; object = node->getObject(); if(!object) return; @@ -3502,7 +3491,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id) // everything that we'll actually be derezzing. LLDynamicArray<LLViewerObject*> derez_objects; BOOL can_derez_current; - for( ; node != NULL; node = gSelectMgr->getNextRootNode()) + for( ; node != NULL; node = selection->getNextRootNode()) { object = node->getObject(); if(!object || !node->mValid) continue; @@ -3636,42 +3625,47 @@ class LLToolsTakeCopy : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - if (gSelectMgr->isEmpty()) return true; + if (gSelectMgr->getSelection()->isEmpty()) return true; const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id); - // Only deselect if we're not building - if (!gToolMgr->inEdit()) - { - gSelectMgr->deselectTransient(); - } return true; } }; -void callback_return_to_owner(S32 option, void* data) -{ - if (0 == option) - { - // Ignore category ID for this derez destination. - derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null); - } -} - // You can return an object to its owner if it is on your land. class LLObjectReturn : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - if (gSelectMgr->isEmpty()) return true; + if (gSelectMgr->getSelection()->isEmpty()) return true; + + mObjectSelection = gSelectMgr->getEditSelection(); gViewerWindow->alertXml("ReturnToOwner", - callback_return_to_owner, - NULL); + onReturnToOwner, + (void*)this); return true; } + + static void onReturnToOwner(S32 option, void* data) + { + LLObjectReturn* object_return = (LLObjectReturn*)data; + + if (0 == option) + { + // Ignore category ID for this derez destination. + derez_objects(DRD_RETURN_TO_OWNER, LLUUID::null); + } + + // drop reference to current selection + object_return->mObjectSelection = NULL; + } + +protected: + LLObjectSelectionHandle mObjectSelection; }; @@ -3701,10 +3695,11 @@ class LLObjectEnableReturn : public view_listener_t } else { + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); LLViewerObject* obj = NULL; - for(obj = gSelectMgr->getFirstRootObject(); + for(obj = selection->getFirstRootObject(); obj; - obj = gSelectMgr->getNextRootObject()) + obj = selection->getNextRootObject()) { if (obj->isOverAgentOwnedLand() || obj->isOverGroupOwnedLand() @@ -3725,22 +3720,16 @@ class LLObjectEnableReturn : public view_listener_t void force_take_copy(void*) { - if (gSelectMgr->isEmpty()) return; + if (gSelectMgr->getSelection()->isEmpty()) return; const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id); - - // Only deselect if we're not building - if (!gToolMgr->inEdit()) - { - gSelectMgr->deselectTransient(); - } } #ifdef _CORY_TESTING void force_export_copy(void*) { LLViewerObject* object = NULL; - LLSelectNode* node = gSelectMgr->getFirstNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstNode(); if(!node) return; object = node->getObject(); if(!object) return; @@ -3761,7 +3750,7 @@ void force_export_copy(void*) S32 object_index = 0; - for( ; node != NULL; node = gSelectMgr->getNextNode()) + for( ; node != NULL; node = gSelectMgr->getSelection()->getNextNode()) { object = node->getObject(); if(!object || !node->mValid) @@ -4090,16 +4079,16 @@ void handle_take() { // we want to use the folder this was derezzed from if it's // available. Otherwise, derez to the normal place. - if(gSelectMgr->isEmpty()) return; + if(gSelectMgr->getSelection()->isEmpty()) return; LLSelectNode* node = NULL; LLViewerObject* object = NULL; BOOL you_own_everything = TRUE; BOOL locked_but_takeable_object = FALSE; LLUUID category_id; - for(node = gSelectMgr->getFirstRootNode(); + for(node = gSelectMgr->getSelection()->getFirstRootNode(); node != NULL; - node = gSelectMgr->getNextRootNode()) + node = gSelectMgr->getSelection()->getNextRootNode()) { object = node->getObject(); if(object) @@ -4222,9 +4211,9 @@ BOOL enable_take() } LLViewerObject* object = NULL; - for(LLSelectNode* node = gSelectMgr->getFirstRootNode(); + for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); node != NULL; - node = gSelectMgr->getNextRootNode()) + node = gSelectMgr->getSelection()->getNextRootNode()) { object = node->getObject(); if(!object || !node->mValid) continue; @@ -4258,7 +4247,7 @@ class LLToolsBuyOrTake : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - if (gSelectMgr->isEmpty()) + if (gSelectMgr->getSelection()->isEmpty()) { return true; } @@ -4338,9 +4327,9 @@ class LLToolsEnableBuyOrTake : public view_listener_t BOOL is_selection_buy_not_take() { LLViewerObject* obj = NULL; - for(LLSelectNode* node = gSelectMgr->getFirstRootNode(); + for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); node != NULL; - node = gSelectMgr->getNextRootNode()) + node = gSelectMgr->getSelection()->getNextRootNode()) { obj = node->getObject(); if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale())) @@ -4357,9 +4346,9 @@ S32 selection_price() { LLViewerObject* obj = NULL; S32 total_price = 0; - for(LLSelectNode* node = gSelectMgr->getFirstRootNode(); + for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); node != NULL; - node = gSelectMgr->getNextRootNode()) + node = gSelectMgr->getSelection()->getNextRootNode()) { obj = node->getObject(); if(obj && !(obj->permYouOwner()) && (node->mSaleInfo.isForSale())) @@ -4408,7 +4397,7 @@ void handle_buy_currency(void*) void handle_buy(void*) { - if (gSelectMgr->isEmpty()) return; + if (gSelectMgr->getSelection()->isEmpty()) return; LLSaleInfo sale_info; BOOL valid = gSelectMgr->selectGetSaleInfo(sale_info); @@ -4435,7 +4424,7 @@ class LLObjectBuy : public view_listener_t BOOL sitting_on_selection() { - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if (!node) { return FALSE; @@ -4480,7 +4469,7 @@ class LLToolsSaveToObjectInventory : public view_listener_t { if(gSelectMgr) { - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if(node && (node->mValid) && (!node->mFromTaskID.isNull())) { // *TODO: check to see if the fromtaskid object exists. @@ -4499,9 +4488,10 @@ class LLToolsSnapObjectXY : public view_listener_t F64 snap_size = (F64)gSavedSettings.getF32("GridResolution"); LLViewerObject* obj; - for (obj = gSelectMgr->getFirstRootObject(); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for (obj = selection->getFirstRootObject(); obj != NULL; - obj = gSelectMgr->getNextRootObject()) + obj = selection->getNextRootObject()) { if (obj->permModify()) { @@ -4557,11 +4547,12 @@ class LLToolsEnableLink : public view_listener_t // in component mode, can't link if (gSavedSettings.getBOOL("SelectLinkedSet")) { - if(gSelectMgr->selectGetAllRootsValid() && gSelectMgr->getRootObjectCount() >= 2) + if(gSelectMgr->selectGetAllRootsValid() && gSelectMgr->getSelection()->getRootObjectCount() >= 2) { - for(LLViewerObject* object = gSelectMgr->getFirstRootObject(); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for(LLViewerObject* object = selection->getFirstRootObject(); object != NULL; - object = gSelectMgr->getNextRootObject()) + object = selection->getNextRootObject()) { if(object->permModify()) { @@ -4586,7 +4577,7 @@ class LLToolsLink : public view_listener_t return true; } - S32 object_count = gSelectMgr->getObjectCount(); + S32 object_count = gSelectMgr->getSelection()->getObjectCount(); if (object_count > MAX_CHILDREN_PER_TASK + 1) { LLStringBase<char>::format_map_t args; @@ -4597,7 +4588,7 @@ class LLToolsLink : public view_listener_t return true; } - if(gSelectMgr->getRootObjectCount() < 2) + if(gSelectMgr->getSelection()->getRootObjectCount() < 2) { gViewerWindow->alertXml("CannotLinkIncompleteSet"); return true; @@ -4627,8 +4618,8 @@ class LLToolsEnableUnlink : public view_listener_t bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { bool new_value = gSelectMgr->selectGetAllRootsValid() && - gSelectMgr->getFirstEditableObject() && - !gSelectMgr->getFirstEditableObject()->isAttachment(); + gSelectMgr->getSelection()->getFirstEditableObject() && + !gSelectMgr->getSelection()->getFirstEditableObject()->isAttachment(); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -4690,7 +4681,7 @@ void handle_dehinge(void*) BOOL enable_dehinge(void*) { - LLViewerObject* obj = gSelectMgr->getFirstEditableObject(); + LLViewerObject* obj = gSelectMgr->getSelection()->getFirstEditableObject(); return obj && !obj->isAttachment(); } @@ -5890,12 +5881,13 @@ LLUploadDialog *gExportDialog = NULL; void handle_export_selected( void * ) { - if (gSelectMgr->isEmpty()) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + if (selection->isEmpty()) { return; } llinfos << "Exporting selected objects:" << llendl; - LLViewerObject *object = gSelectMgr->getFirstRootObject(); + LLViewerObject *object = selection->getFirstRootObject(); gExporterRequestID.generate(); gExportDirectory = ""; @@ -5907,7 +5899,7 @@ void handle_export_selected( void * ) msg->addUUIDFast(_PREHASH_RequestID, gExporterRequestID); msg->addS16Fast(_PREHASH_VolumeDetail, 4); - for (; object != NULL; object = gSelectMgr->getNextRootObject()) + for (; object != NULL; object = selection->getNextRootObject()) { msg->nextBlockFast(_PREHASH_ObjectData); msg->addUUIDFast(_PREHASH_ObjectID, object->getID()); @@ -5921,7 +5913,7 @@ void handle_export_selected( void * ) BOOL menu_check_build_tool( void* user_data ) { S32 index = (intptr_t) user_data; - return gCurrentToolset->isToolSelected( index ); + return gToolMgr->getCurrentToolset()->isToolSelected( index ); } void handle_reload_settings(void*) @@ -6070,7 +6062,7 @@ class LLToolsLookAtSelection : public view_listener_t { const F32 PADDING_FACTOR = 2.f; BOOL zoom = (userdata.asString() == "zoom"); - if (!gSelectMgr->isEmpty()) + if (!gSelectMgr->getSelection()->isEmpty()) { gAgent.setFocusOnAvatar(FALSE, ANIMATE); @@ -6083,11 +6075,11 @@ class LLToolsLookAtSelection : public view_listener_t if (zoom) { - gAgent.setCameraPosAndFocusGlobal(gSelectMgr->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance), gSelectMgr->getSelectionCenterGlobal(), gSelectMgr->getFirstObject()->mID ); + gAgent.setCameraPosAndFocusGlobal(gSelectMgr->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance), gSelectMgr->getSelectionCenterGlobal(), gSelectMgr->getSelection()->getFirstObject()->mID ); } else { - gAgent.setFocusGlobal( gSelectMgr->getSelectionCenterGlobal(), gSelectMgr->getFirstObject()->mID ); + gAgent.setFocusGlobal( gSelectMgr->getSelectionCenterGlobal(), gSelectMgr->getSelection()->getFirstObject()->mID ); } } return true; @@ -6112,7 +6104,6 @@ class LLAvatarAddFriend : public view_listener_t { request_friendship(avatar->getID()); } - gSelectMgr->deselectTransient(); return true; } }; @@ -6239,7 +6230,7 @@ class LLObjectEnableSitOrStand : public view_listener_t } else { - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if (node && node->mValid && !node->mSitName.empty()) { label.assign(node->mSitName); @@ -6275,25 +6266,6 @@ void dump_inventory(void*) gInventory.dumpInventory(); } - -void handle_first_tool(void*) -{ - gCurrentToolset->selectFirstTool(); -} - - -void handle_next_tool(void*) -{ - gCurrentToolset->selectNextTool(); -} - - -void handle_previous_tool(void*) -{ - gCurrentToolset->selectPrevTool(); -} - - // forcibly unlock an object void handle_force_unlock(void*) { @@ -6302,7 +6274,7 @@ void handle_force_unlock(void*) // Second, lie to the viewer and mark it editable and unowned LLViewerObject* object; - for (object = gSelectMgr->getFirstObject(); object; object = gSelectMgr->getNextObject() ) + for (object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) { object->mFlags |= FLAGS_OBJECT_MOVE; object->mFlags |= FLAGS_OBJECT_MODIFY; @@ -6722,8 +6694,8 @@ void handle_focus(void *) gViewerWindow->moveCursorToCenter(); // Switch to camera toolset -// gCurrentToolset = gCameraToolset; - gCurrentToolset->selectTool( gToolCamera ); +// gToolMgr->setCurrentToolset(gCameraToolset); + gToolMgr->getCurrentToolset()->selectTool( gToolCamera ); } class LLLandEdit : public view_listener_t @@ -6749,10 +6721,10 @@ class LLLandEdit : public view_listener_t gParcelMgr->selectParcelAt( gLastHitPosGlobal ); gFloaterTools->showMore(TRUE); - gFloaterView->bringToFront( gFloaterTools ); + gFloaterView->bringToFront( gFloaterTools ); // Switch to land edit toolset - gCurrentToolset->selectTool( gToolParcel ); + gToolMgr->getCurrentToolset()->selectTool( gToolParcel ); return true; } }; @@ -6764,7 +6736,7 @@ class LLWorldEnableBuyLand : public view_listener_t bool new_value = gParcelMgr->canAgentBuyParcel( gParcelMgr->selectionEmpty() ? gParcelMgr->getAgentParcel() - : gParcelMgr->getSelectedParcel(), + : gParcelMgr->getParcelSelection()->getParcel(), false); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; @@ -6774,7 +6746,7 @@ class LLWorldEnableBuyLand : public view_listener_t BOOL enable_buy_land(void*) { return gParcelMgr->canAgentBuyParcel( - gParcelMgr->getSelectedParcel(), false); + gParcelMgr->getParcelSelection()->getParcel(), false); } @@ -6795,46 +6767,59 @@ void handle_move(void*) gViewerWindow->moveCursorToCenter(); - gCurrentToolset = gBasicToolset; - gCurrentToolset->selectTool( gToolGrab ); -} - - -void near_attach_object(BOOL success, void *user_data) -{ - LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; - - U8 attachment_id; - if (attachment) - { - attachment_id = gAgent.getAvatarObject()->mAttachmentPoints.reverseLookup(attachment); - } - else - { - // interpret 0 as "default location" - attachment_id = 0; - } - - gSelectMgr->sendAttach(attachment_id); + gToolMgr->setCurrentToolset(gBasicToolset); + gToolMgr->getCurrentToolset()->selectTool( gToolGrab ); } class LLObjectAttachToAvatar : public view_listener_t { +public: + static void setObjectSelection(LLObjectSelectionHandle selection) { sObjectSelection = selection; } + +private: bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - LLViewerObject* selectedObject = gSelectMgr->getFirstRootObject(); + setObjectSelection(gSelectMgr->getSelection()); + LLViewerObject* selectedObject = sObjectSelection->getFirstRootObject(); if (selectedObject) { - confirm_replace_attachment(0, NULL); + LLViewerJointAttachment* attachment_point = gAgent.getAvatarObject()->mAttachmentPoints[userdata.asInteger()]; + confirm_replace_attachment(0, attachment_point); } return true; } + +protected: + static LLObjectSelectionHandle sObjectSelection; }; +LLObjectSelectionHandle LLObjectAttachToAvatar::sObjectSelection; + +void near_attach_object(BOOL success, void *user_data) +{ + if (success) + { + LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; + + U8 attachment_id; + if (attachment) + { + attachment_id = gAgent.getAvatarObject()->mAttachmentPoints.reverseLookup(attachment); + } + else + { + // interpret 0 as "default location" + attachment_id = 0; + } + gSelectMgr->sendAttach(attachment_id); + } + LLObjectAttachToAvatar::setObjectSelection(NULL); +} + // move this somewhere global void handle_attach_to_avatar(void* user_data) { - LLViewerObject* selectedObject = gSelectMgr->getFirstRootObject(); + LLViewerObject* selectedObject = gSelectMgr->getSelection()->getFirstRootObject(); if (selectedObject) { LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; @@ -6853,8 +6838,7 @@ void confirm_replace_attachment(S32 option, void* user_data) { if (option == 0/*YES*/) { - gSelectMgr->convertTransient(); - LLViewerObject* selectedObject = gSelectMgr->getFirstRootObject(); + LLViewerObject* selectedObject = gSelectMgr->getSelection()->getFirstRootObject(); if (selectedObject) { const F32 MIN_STOP_DISTANCE = 1.f; // meters @@ -6921,12 +6905,7 @@ class LLAttachmentDrop : public view_listener_t // objects. Thus we need to clear the list, make sure it only // contains the object the user clicked, send the message, // then clear the list. - // We use deselectAll to update the simulator's notion of what's - // selected, and removeAll just to change things locally. - //gSelectMgr->deselectAll(); - //gSelectMgr->selectObjectAndFamily(object); gSelectMgr->sendDropAttachment(); - gSelectMgr->deselectTransient(); return true; } }; @@ -7029,10 +7008,9 @@ class LLAttachmentDetach : public view_listener_t // We use deselectAll to update the simulator's notion of what's // selected, and removeAll just to change things locally. //RN: I thought it was more useful to detach everything that was selected - if (gSelectMgr->selectionIsAttachment()) + if (gSelectMgr->getSelection()->isAttachment()) { gSelectMgr->sendDetach(); - gSelectMgr->deselectAll(); } return true; } @@ -7149,8 +7127,10 @@ class LLAttachmentEnableDetach : public view_listener_t BOOL object_selected_and_point_valid(void *user_data) { //LLViewerJointAttachment *attachment = (LLViewerJointAttachment *)user_data; + if (gSelectMgr == NULL) return FALSE; - for (LLViewerObject *object = gSelectMgr->getFirstRootObject(); object; object = gSelectMgr->getNextRootObject()) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for (LLViewerObject *object = selection->getFirstRootObject(); object; object = selection->getNextRootObject()) { for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++ ) { @@ -7161,12 +7141,11 @@ BOOL object_selected_and_point_valid(void *user_data) } } - return ((gSelectMgr != NULL) && - (gSelectMgr->getRootObjectCount() == 1) && - (gSelectMgr->getFirstRootObject()->getPCode() == LL_PCODE_VOLUME) && - gSelectMgr->getFirstRootObject()->permYouOwner() && - !((LLViewerObject*)gSelectMgr->getFirstRootObject()->getRoot())->isAvatar() && - (gSelectMgr->getFirstRootObject()->getNVPair("AssetContainer") == NULL)); + return (selection->getRootObjectCount() == 1) && + (selection->getFirstRootObject()->getPCode() == LL_PCODE_VOLUME) && + selection->getFirstRootObject()->permYouOwner() && + !((LLViewerObject*)selection->getFirstRootObject()->getRoot())->isAvatar() && + (selection->getFirstRootObject()->getNVPair("AssetContainer") == NULL); } // Also for seeing if object can be attached. See above. @@ -7177,13 +7156,14 @@ class LLObjectEnableWear : public view_listener_t bool new_value = false; if (gSelectMgr) { - LLViewerObject* first_root = gSelectMgr->getFirstRootObject(); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + LLViewerObject* first_root = selection->getFirstRootObject(); if (first_root) { - new_value = gSelectMgr->getRootObjectCount() == 1 + new_value = selection->getRootObjectCount() == 1 && first_root->getPCode() == LL_PCODE_VOLUME && first_root->permYouOwner() - && !((LLViewerObject*)gSelectMgr->getFirstRootObject()->getRoot())->isAvatar() + && !((LLViewerObject*)selection->getFirstRootObject()->getRoot())->isAvatar() && (first_root->getNVPair("AssetContainer") == NULL); } } @@ -7266,9 +7246,9 @@ class LLToolsSelectedScriptAction : public view_listener_t BOOL scripted = FALSE; BOOL modifiable = FALSE; - for(LLViewerObject* obj = gSelectMgr->getFirstObject(); + for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); obj; - obj = gSelectMgr->getNextObject()) + obj = gSelectMgr->getSelection()->getNextObject()) { scripted = obj->flagScripted(); modifiable = obj->permModify(); @@ -7301,9 +7281,9 @@ void handle_reset_selection(void*) BOOL scripted = FALSE; BOOL modifiable = FALSE; - for(LLViewerObject* obj = gSelectMgr->getFirstObject(); + for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); obj; - obj = gSelectMgr->getNextObject()) + obj = gSelectMgr->getSelection()->getNextObject()) { scripted = obj->flagScripted(); modifiable = obj->permModify(); @@ -7334,9 +7314,9 @@ void handle_set_run_selection(void*) BOOL scripted = FALSE; BOOL modifiable = FALSE; - for(LLViewerObject* obj = gSelectMgr->getFirstObject(); + for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); obj; - obj = gSelectMgr->getNextObject()) + obj = gSelectMgr->getSelection()->getNextObject()) { scripted = obj->flagScripted(); modifiable = obj->permModify(); @@ -7367,9 +7347,9 @@ void handle_set_not_run_selection(void*) BOOL scripted = FALSE; BOOL modifiable = FALSE; - for(LLViewerObject* obj = gSelectMgr->getFirstObject(); + for(LLViewerObject* obj = gSelectMgr->getSelection()->getFirstObject(); obj; - obj = gSelectMgr->getNextObject()) + obj = gSelectMgr->getSelection()->getNextObject()) { scripted = obj->flagScripted(); modifiable = obj->permModify(); @@ -7396,7 +7376,7 @@ void handle_set_not_run_selection(void*) void handle_selected_texture_info(void*) { LLSelectNode* node = NULL; - for (node = gSelectMgr->getFirstNode(); node != NULL; node = gSelectMgr->getNextNode()) + for (node = gSelectMgr->getSelection()->getFirstNode(); node != NULL; node = gSelectMgr->getSelection()->getNextNode()) { if (!node->mValid) continue; @@ -7583,7 +7563,7 @@ class LLSomethingSelected : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - bool new_value = !(gSelectMgr->isEmpty()); + bool new_value = !(gSelectMgr->getSelection()->isEmpty()); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -7593,7 +7573,8 @@ class LLSomethingSelectedNoHUD : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - bool new_value = !(gSelectMgr->isEmpty()) && !(gSelectMgr->getSelectType() == SELECT_TYPE_HUD); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + bool new_value = !(selection->isEmpty()) && !(selection->getSelectType() == SELECT_TYPE_HUD); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -7601,14 +7582,14 @@ class LLSomethingSelectedNoHUD : public view_listener_t BOOL enable_more_than_one_selected(void* ) { - return (gSelectMgr->getObjectCount() > 1); + return (gSelectMgr->getSelection()->getObjectCount() > 1); } class LLEditableSelected : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - bool new_value = (gSelectMgr->getFirstEditableObject() != NULL); + bool new_value = (gSelectMgr->getSelection()->getFirstEditableObject() != NULL); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -7627,10 +7608,11 @@ class LLToolsEnableTakeCopy : public view_listener_t if (gInProductionGrid || !gAgent.isGodlike()) # endif { - LLViewerObject* obj = gSelectMgr->getFirstRootObject(); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + LLViewerObject* obj = selection->getFirstRootObject(); if(obj) { - for( ; obj; obj = gSelectMgr->getNextRootObject()) + for( ; obj; obj = selection->getNextRootObject()) { if(!(obj->permCopy()) || obj->isAttachment()) { @@ -7650,11 +7632,15 @@ class LLToolsEnableTakeCopy : public view_listener_t BOOL enable_selection_you_own_all(void*) { LLViewerObject *obj; - for (obj = gSelectMgr->getFirstRootObject(); obj; obj = gSelectMgr->getNextRootObject()) + if (gSelectMgr) { - if (!obj->permYouOwner()) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for (obj = selection->getFirstRootObject(); obj; obj = selection->getNextRootObject()) { - return FALSE; + if (!obj->permYouOwner()) + { + return FALSE; + } } } @@ -7663,15 +7649,18 @@ BOOL enable_selection_you_own_all(void*) BOOL enable_selection_you_own_one(void*) { - LLViewerObject *obj; - for (obj = gSelectMgr->getFirstRootObject(); obj; obj = gSelectMgr->getNextRootObject()) + if (gSelectMgr) { - if (obj->permYouOwner()) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + LLViewerObject *obj; + for (obj = selection->getFirstRootObject(); obj; obj = selection->getNextRootObject()) { - return TRUE; + if (obj->permYouOwner()) + { + return TRUE; + } } } - return FALSE; } @@ -7705,9 +7694,9 @@ BOOL enable_save_into_inventory(void*) { // find the last root LLSelectNode* last_node = NULL; - for(LLSelectNode* node = gSelectMgr->getFirstRootNode(); + for(LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); node != NULL; - node = gSelectMgr->getNextRootNode()) + node = gSelectMgr->getSelection()->getNextRootNode()) { last_node = node; } @@ -7751,7 +7740,7 @@ BOOL enable_save_into_task_inventory(void*) { if(gSelectMgr) { - LLSelectNode* node = gSelectMgr->getFirstRootNode(); + LLSelectNode* node = gSelectMgr->getSelection()->getFirstRootNode(); if(node && (node->mValid) && (!node->mFromTaskID.isNull())) { // *TODO: check to see if the fromtaskid object exists. @@ -7792,7 +7781,7 @@ class LLFileEnableUpload : public view_listener_t BOOL enable_export_selected(void *) { - if (gSelectMgr->isEmpty()) + if (gSelectMgr->getSelection()->isEmpty()) { return FALSE; } @@ -7823,7 +7812,7 @@ class LLToolsEnableToolNotPie : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - bool new_value = ( gToolMgr->getCurrentTool(MASK_NONE) != gToolPie ); + bool new_value = ( gToolMgr->getBaseTool() != gToolPie ); gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); return true; } @@ -8212,10 +8201,10 @@ class LLToolsUseSelectionForGrid : public view_listener_t bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { gSelectMgr->clearGridObjects(); - - for (LLViewerObject* objectp = gSelectMgr->getFirstRootObject(); + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for (LLViewerObject* objectp = selection->getFirstRootObject(); objectp; - objectp = gSelectMgr->getNextRootObject()) + objectp = selection->getNextRootObject()) { gSelectMgr->addGridObject(objectp); } @@ -8240,25 +8229,35 @@ void handle_test_load_url(void*) // LLViewerMenuHolderGL // +LLViewerMenuHolderGL::LLViewerMenuHolderGL() : LLMenuHolderGL() +{ +} + BOOL LLViewerMenuHolderGL::hideMenus() { BOOL handled = LLMenuHolderGL::hideMenus(); - if (handled) - { - gSelectMgr->deselectTransient(); - if(!gFloaterTools->getVisible() - && !LLFloaterLand::floaterVisible() - && !LLFloaterBuyLand::isOpen()) - { - gParcelMgr->deselectLand(); - } - } + + // drop pie menu selection + mParcelSelection = NULL; + mObjectSelection = NULL; + gMenuBarView->clearHoverItem(); gMenuBarView->resetMenuTrigger(); return handled; } +void LLViewerMenuHolderGL::setParcelSelection(LLHandle<LLParcelSelection> selection) +{ + mParcelSelection = selection; +} + +void LLViewerMenuHolderGL::setObjectSelection(LLHandle<LLObjectSelection> selection) +{ + mObjectSelection = selection; +} + + const LLRect LLViewerMenuHolderGL::getMenuRect() const { return LLRect(0, mRect.getHeight() - MENU_BAR_HEIGHT, mRect.getWidth(), STATUS_BAR_HEIGHT); @@ -8586,23 +8585,23 @@ class LLToolsSelectTool : public view_listener_t LLString tool_name = userdata.asString(); if (tool_name == "focus") { - gCurrentToolset->selectToolByIndex(1); + gToolMgr->getCurrentToolset()->selectToolByIndex(1); } else if (tool_name == "move") { - gCurrentToolset->selectToolByIndex(2); + gToolMgr->getCurrentToolset()->selectToolByIndex(2); } else if (tool_name == "edit") { - gCurrentToolset->selectToolByIndex(3); + gToolMgr->getCurrentToolset()->selectToolByIndex(3); } else if (tool_name == "create") { - gCurrentToolset->selectToolByIndex(4); + gToolMgr->getCurrentToolset()->selectToolByIndex(4); } else if (tool_name == "land") { - gCurrentToolset->selectToolByIndex(5); + gToolMgr->getCurrentToolset()->selectToolByIndex(5); } return true; } diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 182190ccdf..f2d7e360c7 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -18,6 +18,8 @@ class LLUICtrl; class LLView; +class LLParcelSelection; +class LLObjectSelection; struct LLResourceData { @@ -126,11 +128,18 @@ class LLPermissions; class LLViewerMenuHolderGL : public LLMenuHolderGL { public: - LLViewerMenuHolderGL() : LLMenuHolderGL() {}; + LLViewerMenuHolderGL(); virtual BOOL hideMenus(); + + void setParcelSelection(LLHandle<LLParcelSelection> selection); + void setObjectSelection(LLHandle<LLObjectSelection> selection); + virtual const LLRect getMenuRect() const; - //virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); + +protected: + LLHandle<LLParcelSelection> mParcelSelection; + LLHandle<LLObjectSelection> mObjectSelection; }; extern const LLString SAVE_INTO_INVENTORY; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index f402fc320b..502171584c 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2990,7 +2990,7 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data) //llinfos << "Kill message for local " << local_id << llendl; } - gSelectMgr->selectionRemoveObject(id); + gSelectMgr->removeObjectFromSelections(id); // ...don't kill the avatar if (!(id == gAgentID)) @@ -3472,12 +3472,15 @@ void process_camera_constraint(LLMessageSystem *mesgsys, void **user_data) void near_sit_object(BOOL success, void *data) { - // Send message to sit on object - gMessageSystem->newMessageFast(_PREHASH_AgentSit); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gAgent.sendReliableMessage(); + if (success) + { + // Send message to sit on object + gMessageSystem->newMessageFast(_PREHASH_AgentSit); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gAgent.sendReliableMessage(); + } } void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) @@ -3518,9 +3521,6 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) { gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(sit_spot), "Sit", &sitRotation, near_sit_object, NULL, 0.5f); } - - // deselect transient selections (pie menu) when sitting - gSelectMgr->deselectTransient(); } else { diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index b630572a9b..f4c733299f 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -211,7 +211,7 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp, && update_type != OUT_TERSE_IMPROVED && objectp->mCreateSelected) { - if ( gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ) != gToolPie ) + if ( gToolMgr->getCurrentTool() != gToolPie ) { //llinfos << "DEBUG selecting " << objectp->mID << " " // << objectp->mLocalID << llendl; @@ -565,7 +565,8 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) } // Selected - for (objectp = gSelectMgr->getFirstRootObject(); objectp; objectp = gSelectMgr->getNextRootObject()) + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + for (objectp = selection->getFirstRootObject(); objectp; objectp = selection->getNextRootObject()) { objectp->boostTexturePriority(); } @@ -1421,7 +1422,7 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port) if (orphans_found && objectp->isSelected()) { - LLSelectNode* nodep = gSelectMgr->findSelectNode(objectp); + LLSelectNode* nodep = gSelectMgr->getSelection()->findNode(objectp); if (nodep && !nodep->mIndividualSelection) { // rebuild selection with orphans diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 81576bd5fc..c1d2f2742e 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -46,6 +46,7 @@ const F32 PARCEL_COLLISION_DRAW_SECS = 1.f; + // Globals LLViewerParcelMgr *gParcelMgr = NULL; @@ -53,6 +54,12 @@ U8* LLViewerParcelMgr::sPackedOverlay = NULL; LLUUID gCurrentMovieID = LLUUID::null; +static LLParcelSelection* get_null_parcel_selection(); +template<> + const LLHandle<LLParcelSelection>::NullFunc + LLHandle<LLParcelSelection>::sNullFunc = get_null_parcel_selection; + + // Local functions void optionally_start_music(const LLString& music_url); void callback_start_music(S32 option, void* data); @@ -83,8 +90,6 @@ struct LLGodForceOwnerData // LLViewerParcelMgr::LLViewerParcelMgr() : mSelected(FALSE), - mSelectedMultipleOwners(FALSE), - mWholeParcelSelected(FALSE), mWestSouth(), mEastNorth(), mSelectedDwell(0.f), @@ -94,11 +99,12 @@ LLViewerParcelMgr::LLViewerParcelMgr() mRenderCollision(FALSE), mRenderSelection(TRUE), mCollisionBanned(0), - mCollisionTimer(), - mMediaParcelId(0), - mMediaRegionId(0) + mCollisionTimer() { - mParcel = new LLParcel(); + mCurrentParcel = new LLParcel(); + mCurrentParcelSelection = new LLParcelSelection(mCurrentParcel); + mFloatingParcelSelection = new LLParcelSelection(mCurrentParcel); + mAgentParcel = new LLParcel(); mHoverParcel = new LLParcel(); mCollisionParcel = new LLParcel(); @@ -130,8 +136,14 @@ LLViewerParcelMgr::LLViewerParcelMgr() LLViewerParcelMgr::~LLViewerParcelMgr() { - delete mParcel; - mParcel = NULL; + mCurrentParcelSelection->setParcel(NULL); + mCurrentParcelSelection = NULL; + + mFloatingParcelSelection->setParcel(NULL); + mFloatingParcelSelection = NULL; + + delete mCurrentParcel; + mCurrentParcel = NULL; delete mAgentParcel; mAgentParcel = NULL; @@ -156,32 +168,17 @@ LLViewerParcelMgr::~LLViewerParcelMgr() mAgentParcelOverlay = NULL; } - -void LLViewerParcelMgr::destroyGL() -{ - mBlockedImage = NULL; - mPassImage = NULL; -} - - -void LLViewerParcelMgr::restoreGL() -{ - mBlockedImage = gImageList.getImage(mBlockedImageID, TRUE, TRUE); - mPassImage = gImageList.getImage(mPassImageID, TRUE, TRUE); -} - - void LLViewerParcelMgr::dump() { llinfos << "Parcel Manager Dump" << llendl; llinfos << "mSelected " << S32(mSelected) << llendl; llinfos << "Selected parcel: " << llendl; llinfos << mWestSouth << " to " << mEastNorth << llendl; - mParcel->dump(); - llinfos << "banning " << mParcel->mBanList.size() << llendl; + mCurrentParcel->dump(); + llinfos << "banning " << mCurrentParcel->mBanList.size() << llendl; - access_map_const_iterator cit = mParcel->mBanList.begin(); - access_map_const_iterator end = mParcel->mBanList.end(); + access_map_const_iterator cit = mCurrentParcel->mBanList.begin(); + access_map_const_iterator end = mCurrentParcel->mBanList.end(); for ( ; cit != end; ++cit) { llinfos << "ban id " << (*cit).first << llendl; @@ -214,27 +211,27 @@ void LLViewerParcelMgr::getDisplayInfo(S32* area_out, S32* claim_out, if (mSelected) { - if (mSelectedMultipleOwners) + if (mCurrentParcelSelection->mSelectedMultipleOwners) { - area = getClaimableArea(); + area = mCurrentParcelSelection->getClaimableArea(); } else { area = getSelectedArea(); } - if (mParcel->getForSale()) + if (mCurrentParcel->getForSale()) { - price = mParcel->getSalePrice(); + price = mCurrentParcel->getSalePrice(); for_sale = TRUE; } else { - price = area * mParcel->getClaimPricePerMeter(); + price = area * mCurrentParcel->getClaimPricePerMeter(); for_sale = FALSE; } - rent = mParcel->getTotalRent(); + rent = mCurrentParcel->getTotalRent(); dwell = mSelectedDwell; } @@ -248,51 +245,27 @@ void LLViewerParcelMgr::getDisplayInfo(S32* area_out, S32* claim_out, void LLViewerParcelMgr::getPrimInfo(S32 &sw_max, S32 &sw_total, S32 &max, S32 &total, S32 &owner, S32 &group, S32 &other, S32& selected, F32 &parcel_object_bonus, S32 &other_clean) { - if (mSelected && mParcel) + if (mSelected && mCurrentParcel) { - sw_max = mParcel->getSimWideMaxPrimCapacity(); - sw_total = mParcel->getSimWidePrimCount(); - max = llround(mParcel->getMaxPrimCapacity()*mParcel->getParcelPrimBonus()); - total = mParcel->getPrimCount(); - owner = mParcel->getOwnerPrimCount(); - group = mParcel->getGroupPrimCount(); - other = mParcel->getOtherPrimCount(); - selected = mParcel->getSelectedPrimCount(); - parcel_object_bonus = mParcel->getParcelPrimBonus(); - other_clean = mParcel->getCleanOtherTime(); + sw_max = mCurrentParcel->getSimWideMaxPrimCapacity(); + sw_total = mCurrentParcel->getSimWidePrimCount(); + max = llround(mCurrentParcel->getMaxPrimCapacity()*mCurrentParcel->getParcelPrimBonus()); + total = mCurrentParcel->getPrimCount(); + owner = mCurrentParcel->getOwnerPrimCount(); + group = mCurrentParcel->getGroupPrimCount(); + other = mCurrentParcel->getOtherPrimCount(); + selected = mCurrentParcel->getSelectedPrimCount(); + parcel_object_bonus = mCurrentParcel->getParcelPrimBonus(); + other_clean = mCurrentParcel->getCleanOtherTime(); } } -BOOL LLViewerParcelMgr::getMultipleOwners() const -{ - return mSelectedMultipleOwners; -} - - -BOOL LLViewerParcelMgr::getWholeParcelSelected() const -{ - return mWholeParcelSelected; -} - - -S32 LLViewerParcelMgr::getClaimableArea() const -{ - const S32 UNIT_AREA = S32( PARCEL_GRID_STEP_METERS * PARCEL_GRID_STEP_METERS ); - return mSelectedPublicCount * UNIT_AREA; -} - -bool LLViewerParcelMgr::hasOthersSelected() const -{ - return mSelectedOtherCount != 0; -} - - S32 LLViewerParcelMgr::getSelectedArea() const { S32 rv = 0; - if(mSelected && mParcel && mWholeParcelSelected) + if(mSelected && mCurrentParcel && mCurrentParcelSelection->mWholeParcelSelected) { - rv = mParcel->getArea(); + rv = mCurrentParcel->getArea(); } else if(mSelected) { @@ -428,7 +401,7 @@ void LLViewerParcelMgr::writeAgentParcelFromBitmap(U8* bitmap) // Given a point, find the PARCEL_GRID_STEP x PARCEL_GRID_STEP block // containing it and select that. -void LLViewerParcelMgr::selectParcelAt(const LLVector3d& pos_global) +LLParcelSelectionHandle LLViewerParcelMgr::selectParcelAt(const LLVector3d& pos_global) { LLVector3d southwest = pos_global; LLVector3d northeast = pos_global; @@ -442,14 +415,14 @@ void LLViewerParcelMgr::selectParcelAt(const LLVector3d& pos_global) northeast.mdV[VY] = llround( northeast.mdV[VY], (F64)PARCEL_GRID_STEP_METERS ); // Snap to parcel - selectLand( southwest, northeast, TRUE ); + return selectLand( southwest, northeast, TRUE ); } // Tries to select the parcel inside the rectangle -void LLViewerParcelMgr::selectParcelInRectangle() +LLParcelSelectionHandle LLViewerParcelMgr::selectParcelInRectangle() { - selectLand(mWestSouth, mEastNorth, TRUE); + return selectLand(mWestSouth, mEastNorth, TRUE); } @@ -479,28 +452,32 @@ void LLViewerParcelMgr::selectCollisionParcel() mRequestResult = PARCEL_RESULT_NO_DATA; // Hack: Copy some data over temporarily - mParcel->setName( mCollisionParcel->getName() ); - mParcel->setDesc( mCollisionParcel->getDesc() ); - mParcel->setPassPrice(mCollisionParcel->getPassPrice()); - mParcel->setPassHours(mCollisionParcel->getPassHours()); + mCurrentParcel->setName( mCollisionParcel->getName() ); + mCurrentParcel->setDesc( mCollisionParcel->getDesc() ); + mCurrentParcel->setPassPrice(mCollisionParcel->getPassPrice()); + mCurrentParcel->setPassHours(mCollisionParcel->getPassHours()); // clear the list of segments to prevent flashing resetSegments(mHighlightSegments); + mFloatingParcelSelection->setParcel(mCurrentParcel); + mCurrentParcelSelection->setParcel(NULL); + mCurrentParcelSelection = new LLParcelSelection(mCurrentParcel); + mSelected = TRUE; - mWholeParcelSelected = TRUE; + mCurrentParcelSelection->mWholeParcelSelected = TRUE; notifyObservers(); return; } // snap_selection = auto-select the hit parcel, if there is exactly one -void LLViewerParcelMgr::selectLand(const LLVector3d &corner1, const LLVector3d &corner2, +LLParcelSelectionHandle LLViewerParcelMgr::selectLand(const LLVector3d &corner1, const LLVector3d &corner2, BOOL snap_selection) { if (!gWorldp) { - return; + return NULL; } sanitize_corners( corner1, corner2, mWestSouth, mEastNorth ); @@ -511,7 +488,7 @@ void LLViewerParcelMgr::selectLand(const LLVector3d &corner1, const LLVector3d & { mSelected = FALSE; notifyObservers(); - return; + return NULL; } // ...y isn't more than one meter away @@ -520,7 +497,7 @@ void LLViewerParcelMgr::selectLand(const LLVector3d &corner1, const LLVector3d & { mSelected = FALSE; notifyObservers(); - return; + return NULL; } // Can't select across region boundary @@ -537,7 +514,7 @@ void LLViewerParcelMgr::selectLand(const LLVector3d &corner1, const LLVector3d & { // just in case they somehow selected no land. mSelected = FALSE; - return; + return NULL; } if (region != region_other) @@ -545,50 +522,13 @@ void LLViewerParcelMgr::selectLand(const LLVector3d &corner1, const LLVector3d & LLNotifyBox::showXml("CantSelectLandFromMultipleRegions"); mSelected = FALSE; notifyObservers(); - return; + return NULL; } // Build region global copies of corners LLVector3 wsb_region = region->getPosRegionFromGlobal( mWestSouth ); LLVector3 ent_region = region->getPosRegionFromGlobal( mEastNorth ); - /* - // Check land to make sure all is either public, owned, or self - LLViewerParcelOverlay* overlay = region->getParcelOverlay(); - if (!overlay) - { - llerrs << "No overlay in LLViewerParcelMgr::selectLand" << llendl; - return; - } - - U8 start_ownership = overlay->ownership( wsb_region ); - BOOL identical = TRUE; - S32 x_steps = S32( getSelectionWidth() / PARCEL_GRID_STEP_METERS ); - S32 y_steps = S32( getSelectionHeight() / PARCEL_GRID_STEP_METERS ); - - for (S32 x = 0; x < x_steps && identical; x++ ) - { - for (S32 y = 0; y < y_steps && identical; y++ ) - { - // strange recomputation each time to avoid error accumulation - LLVector3 check = wsb_region; - check.mV[VX] += x * PARCEL_GRID_STEP_METERS; - check.mV[VY] += y * PARCEL_GRID_STEP_METERS; - - identical = (start_ownership == overlay->ownership(check)); - } - } - - if (!identical) - { - add_chat("Can't select mix of your own, other people's and public land.", FALSE, "", FALSE, CHAT_SOURCE_SYSTEM); - add_chat("Try selecting a smaller piece of land.", FALSE, "", FALSE, CHAT_SOURCE_SYSTEM); - mSelected = FALSE; - notifyObservers(); - return; - } - */ - // Send request message LLMessageSystem *msg = gMessageSystem; msg->newMessageFast(_PREHASH_ParcelPropertiesRequest); @@ -609,12 +549,24 @@ void LLViewerParcelMgr::selectLand(const LLVector3d &corner1, const LLVector3d & // clear the list of segments to prevent flashing resetSegments(mHighlightSegments); + mFloatingParcelSelection->setParcel(mCurrentParcel); + mCurrentParcelSelection->setParcel(NULL); + mCurrentParcelSelection = new LLParcelSelection(mCurrentParcel); + mSelected = TRUE; - mWholeParcelSelected = snap_selection; + mCurrentParcelSelection->mWholeParcelSelected = snap_selection; notifyObservers(); - return; + return mCurrentParcelSelection; } +void LLViewerParcelMgr::deselectUnused() +{ + // no more outstanding references to this selection, other than our own + if (mCurrentParcelSelection->getNumRefs() == 1 && mFloatingParcelSelection->getNumRefs() == 1) + { + deselectLand(); + } +} void LLViewerParcelMgr::deselectLand() { @@ -623,14 +575,20 @@ void LLViewerParcelMgr::deselectLand() mSelected = FALSE; // Invalidate the selected parcel - mParcel->setLocalID(-1); - mParcel->mAccessList.clear(); - mParcel->mBanList.clear(); - //mParcel->mRenterList.reset(); + mCurrentParcel->setLocalID(-1); + mCurrentParcel->mAccessList.clear(); + mCurrentParcel->mBanList.clear(); + //mCurrentParcel->mRenterList.reset(); mSelectedDwell = 0.f; notifyObservers(); + + // invalidate parcel selection so that existing users of this selection can clean up + mCurrentParcelSelection->setParcel(NULL); + mFloatingParcelSelection->setParcel(NULL); + // create new parcel selection + mCurrentParcelSelection = new LLParcelSelection(mCurrentParcel); } } @@ -675,18 +633,15 @@ BOOL LLViewerParcelMgr::selectionEmpty() const } -LLParcel *LLViewerParcelMgr::getSelectedParcel() const +LLParcelSelectionHandle LLViewerParcelMgr::getParcelSelection() const { - if (mSelected) - { - return mParcel; - } - else - { - return NULL; - } + return mCurrentParcelSelection; } +LLParcelSelectionHandle LLViewerParcelMgr::getFloatingParcelSelection() const +{ + return mFloatingParcelSelection; +} LLParcel *LLViewerParcelMgr::getAgentParcel() const { @@ -905,11 +860,11 @@ void LLViewerParcelMgr::sendParcelAccessListRequest(U32 flags) if (flags & AL_BAN) { - mParcel->mBanList.clear(); + mCurrentParcel->mBanList.clear(); } if (flags & AL_ACCESS) { - mParcel->mAccessList.clear(); + mCurrentParcel->mAccessList.clear(); } // Only the headers differ @@ -920,7 +875,7 @@ void LLViewerParcelMgr::sendParcelAccessListRequest(U32 flags) msg->nextBlockFast(_PREHASH_Data); msg->addS32Fast(_PREHASH_SequenceID, 0); msg->addU32Fast(_PREHASH_Flags, flags); - msg->addS32("LocalID", mParcel->getLocalID() ); + msg->addS32("LocalID", mCurrentParcel->getLocalID() ); msg->sendReliable( region->getHost() ); } @@ -943,7 +898,7 @@ void LLViewerParcelMgr::sendParcelDwellRequest() msg->addUUID("AgentID", gAgent.getID() ); msg->addUUID("SessionID", gAgent.getSessionID()); msg->nextBlock("Data"); - msg->addS32("LocalID", mParcel->getLocalID()); + msg->addS32("LocalID", mCurrentParcel->getLocalID()); msg->addUUID("ParcelID", LLUUID::null); // filled in on simulator msg->sendReliable( region->getHost() ); } @@ -982,8 +937,8 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id) llinfos << "Region " << region->getOriginGlobal() << llendl; - LLGodForceOwnerData* data = new LLGodForceOwnerData(owner_id, mParcel->getLocalID(), region->getHost()); - if(mParcel->getAuctionID()) + LLGodForceOwnerData* data = new LLGodForceOwnerData(owner_id, mCurrentParcel->getLocalID(), region->getHost()); + if(mCurrentParcel->getAuctionID()) { gViewerWindow->alertXml("ForceOwnerAuctionWarning", callback_god_force_owner, @@ -1033,7 +988,7 @@ void LLViewerParcelMgr::sendParcelGodForceToContent() msg->addUUID("AgentID", gAgent.getID()); msg->addUUID("SessionID", gAgent.getSessionID()); msg->nextBlock("ParcelData"); - msg->addS32("LocalID", mParcel->getLocalID()); + msg->addS32("LocalID", mCurrentParcel->getLocalID()); msg->sendReliable(region->getHost()); } @@ -1061,7 +1016,7 @@ void LLViewerParcelMgr::sendParcelRelease() msg->addUUID("AgentID", gAgent.getID() ); msg->addUUID("SessionID", gAgent.getSessionID() ); msg->nextBlock("Data"); - msg->addS32("LocalID", mParcel->getLocalID() ); + msg->addS32("LocalID", mCurrentParcel->getLocalID() ); //msg->addU32("Flags", flags); msg->sendReliable( region->getHost() ); @@ -1099,7 +1054,7 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy( BOOL is_claim, BOOL remove_contribution) { - if (!mSelected || !mParcel) + if (!mSelected || !mCurrentParcel) { gViewerWindow->alertXml("CannotBuyLandNothingSelected"); return NULL; @@ -1144,7 +1099,7 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy( if (!is_claim) { - info->mParcelID = mParcel->getLocalID(); + info->mParcelID = mCurrentParcel->getLocalID(); } else { @@ -1197,7 +1152,7 @@ void LLViewerParcelMgr::deleteParcelBuy(ParcelBuyInfo*& info) void LLViewerParcelMgr::sendParcelDeed(const LLUUID& group_id) { - if (!mSelected || !mParcel) + if (!mSelected || !mCurrentParcel) { gViewerWindow->alertXml("CannotDeedLandNothingSelected"); return; @@ -1221,7 +1176,7 @@ void LLViewerParcelMgr::sendParcelDeed(const LLUUID& group_id) msg->addUUID("SessionID", gAgent.getSessionID() ); msg->nextBlock("Data"); msg->addUUID("GroupID", group_id ); - msg->addS32("LocalID", mParcel->getLocalID() ); + msg->addS32("LocalID", mCurrentParcel->getLocalID() ); //msg->addU32("JoinNeighbors", join); msg->sendReliable( region->getHost() ); } @@ -1235,7 +1190,7 @@ void LLViewerParcelMgr::sendParcelDeed(const LLUUID& group_id) void LLViewerParcelMgr::makeLandmarkAtSelection() { // Don't create for parcels you don't own - if (gAgent.getID() != mParcel->getOwnerID()) + if (gAgent.getID() != mCurrentParcel->getOwnerID()) { return; } @@ -1271,7 +1226,7 @@ const char* LLViewerParcelMgr::getAgentParcelName() const } -void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, BOOL want_reply_to_update) +void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel) { if (!parcel) return; @@ -1288,7 +1243,8 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, BOOL want_r msg->addS32Fast(_PREHASH_LocalID, parcel->getLocalID() ); U32 flags = 0x0; - if (want_reply_to_update) flags |= 0x01; + // request new properties update from simulator + flags |= 0x01; msg->addU32("Flags", flags); parcel->packMessage(msg); @@ -1432,7 +1388,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use { // ...selected parcels report this sequence id gParcelMgr->mRequestResult = PARCEL_RESULT_SUCCESS; - parcel = gParcelMgr->mParcel; + parcel = gParcelMgr->mCurrentParcel; } else if (sequence_id == HOVERED_PARCEL_SEQ_ID) { @@ -1541,11 +1497,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use if (sequence_id == SELECTED_PARCEL_SEQ_ID) { // Update selected counts - gParcelMgr->mSelectedSelfCount = self_count; - gParcelMgr->mSelectedOtherCount = other_count; - gParcelMgr->mSelectedPublicCount = public_count; + gParcelMgr->mCurrentParcelSelection->mSelectedSelfCount = self_count; + gParcelMgr->mCurrentParcelSelection->mSelectedOtherCount = other_count; + gParcelMgr->mCurrentParcelSelection->mSelectedPublicCount = public_count; - gParcelMgr->mSelectedMultipleOwners = + gParcelMgr->mCurrentParcelSelection->mSelectedMultipleOwners = (request_result == PARCEL_RESULT_MULTIPLE); // Select the whole parcel @@ -1565,7 +1521,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use west_south.mV[VY], east_north.mV[VX], east_north.mV[VY] ); - gParcelMgr->mWholeParcelSelected = FALSE; + gParcelMgr->mCurrentParcelSelection->mWholeParcelSelected = FALSE; } else if (0 == local_id) { @@ -1579,7 +1535,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use aabb_min.mV[VY], aabb_max.mV[VX], aabb_max.mV[VY] ); - gParcelMgr->mWholeParcelSelected = TRUE; + gParcelMgr->mCurrentParcelSelection->mWholeParcelSelected = TRUE; } else { @@ -1599,7 +1555,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use delete bitmap; bitmap = NULL; - gParcelMgr->mWholeParcelSelected = TRUE; + gParcelMgr->mCurrentParcelSelection->mWholeParcelSelected = TRUE; } // Request access list information for this land @@ -1944,7 +1900,7 @@ void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void msg->getU32Fast( _PREHASH_Data, _PREHASH_Flags, message_flags); msg->getS32Fast( _PREHASH_Data, _PREHASH_LocalID, parcel_id); - LLParcel* parcel = gParcelMgr->mParcel; + LLParcel* parcel = gParcelMgr->mCurrentParcel; if (!parcel) return; if (parcel_id != parcel->getLocalID()) @@ -1986,7 +1942,7 @@ void LLViewerParcelMgr::processParcelDwellReply(LLMessageSystem* msg, void**) F32 dwell; msg->getF32("Data", "Dwell", dwell); - if (local_id == gParcelMgr->mParcel->getLocalID()) + if (local_id == gParcelMgr->mCurrentParcel->getLocalID()) { gParcelMgr->mSelectedDwell = dwell; gParcelMgr->notifyObservers(); @@ -2010,7 +1966,7 @@ void LLViewerParcelMgr::sendParcelAccessListUpdate(U32 which) LLMessageSystem* msg = gMessageSystem; - LLParcel* parcel = mParcel; + LLParcel* parcel = mCurrentParcel; if (!parcel) return; if (which & AL_ACCESS) @@ -2131,17 +2087,17 @@ void LLViewerParcelMgr::sendParcelAccessListUpdate(U32 which) void LLViewerParcelMgr::deedLandToGroup() { char group_name[MAX_STRING]; /* Flawfinder: ignore */ - gCacheName->getGroupName(mParcel->getGroupID(), group_name); + gCacheName->getGroupName(mCurrentParcel->getGroupID(), group_name); LLString::format_map_t args; - args["[AREA]"] = llformat("%d", mParcel->getArea()); + args["[AREA]"] = llformat("%d", mCurrentParcel->getArea()); args["[GROUP_NAME]"] = group_name; - if(mParcel->getContributeWithDeed()) + if(mCurrentParcel->getContributeWithDeed()) { char first_name[DB_FIRST_NAME_BUF_SIZE]; /* Flawfinder: ignore */ first_name[0] = '\0'; char last_name[DB_FIRST_NAME_BUF_SIZE]; /* Flawfinder: ignore */ last_name[0] = '\0'; - gCacheName->getName(mParcel->getOwnerID(), first_name, last_name); + gCacheName->getName(mCurrentParcel->getOwnerID(), first_name, last_name); args["[FIRST_NAME]"] = first_name; args["[LAST_NAME]"] = last_name; gViewerWindow->alertXml("DeedLandToGroupWithContribution",args, deedAlertCB, NULL); @@ -2157,7 +2113,7 @@ void LLViewerParcelMgr::deedAlertCB(S32 option, void*) { if (option == 0) { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = gParcelMgr->getParcelSelection()->getParcel(); LLUUID group_id; if(parcel) { @@ -2188,7 +2144,7 @@ void LLViewerParcelMgr::startReleaseLand() return; } - if (!isParcelOwnedByAgent(mParcel, GP_LAND_RELEASE) + if (!isParcelOwnedByAgent(mCurrentParcel, GP_LAND_RELEASE) && !(gAgent.canManageEstate())) { gViewerWindow->alertXml("CannotReleaseLandDontOwn"); @@ -2213,7 +2169,7 @@ void LLViewerParcelMgr::startReleaseLand() } */ - if (!mWholeParcelSelected) + if (!mCurrentParcelSelection->mWholeParcelSelected) { gViewerWindow->alertXml("CannotReleaseLandPartialSelection"); return; @@ -2221,7 +2177,7 @@ void LLViewerParcelMgr::startReleaseLand() // Compute claim price LLStringBase<char>::format_map_t args; - args["[AREA]"] = llformat("%d",mParcel->getArea()); + args["[AREA]"] = llformat("%d",mCurrentParcel->getArea()); gViewerWindow->alertXml("ReleaseLandWarning", args, releaseAlertCB, this); } @@ -2233,7 +2189,7 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const return false; } - if (mSelected && parcel == mParcel) + if (mSelected && parcel == mCurrentParcel) { if (mRequestResult == PARCEL_RESULT_NO_DATA) { @@ -2273,12 +2229,12 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const void LLViewerParcelMgr::startBuyLand(BOOL is_for_group) { - LLFloaterBuyLand::buyLand(getSelectionRegion(), mParcel, is_for_group == TRUE); + LLFloaterBuyLand::buyLand(getSelectionRegion(), mCurrentParcelSelection, is_for_group == TRUE); } void LLViewerParcelMgr::startSellLand() { - LLFloaterSellLand::sellLand(getSelectionRegion(), mParcel); + LLFloaterSellLand::sellLand(getSelectionRegion(), mCurrentParcelSelection); } void LLViewerParcelMgr::startDivideLand() @@ -2289,7 +2245,7 @@ void LLViewerParcelMgr::startDivideLand() return; } - if (mWholeParcelSelected) + if (mCurrentParcelSelection->mWholeParcelSelected) { gViewerWindow->alertXml("CannotDivideLandPartialSelection"); return; @@ -2341,13 +2297,13 @@ void LLViewerParcelMgr::startJoinLand() return; } - if (mWholeParcelSelected) + if (mCurrentParcelSelection->mWholeParcelSelected) { gViewerWindow->alertXml("CannotJoinLandEntireParcelSelected"); return; } - if (!mSelectedMultipleOwners) + if (!mCurrentParcelSelection->mSelectedMultipleOwners) { gViewerWindow->alertXml("CannotJoinLandSelection"); return; @@ -2393,7 +2349,7 @@ void LLViewerParcelMgr::callbackJoinLand(S32 option, void* data) void LLViewerParcelMgr::startDeedLandToGroup() { - if (!mSelected || !mParcel) + if (!mSelected || !mCurrentParcel) { gViewerWindow->alertXml("CannotDeedLandNothingSelected"); return; @@ -2423,7 +2379,7 @@ void LLViewerParcelMgr::startDeedLandToGroup() if(!gAgent.isGodlike()) { if((region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) - && (mParcel->getOwnerID() != region->getOwner())) + && (mCurrentParcel->getOwnerID() != region->getOwner())) { LLStringBase<char>::format_map_t args; args["[REGION]"] = region->getName(); @@ -2437,7 +2393,7 @@ void LLViewerParcelMgr::startDeedLandToGroup() } void LLViewerParcelMgr::reclaimParcel() { - LLParcel* parcel = gParcelMgr->getSelectedParcel(); + LLParcel* parcel = gParcelMgr->getParcelSelection()->getParcel(); LLViewerRegion* regionp = gParcelMgr->getSelectionRegion(); if(parcel && parcel->getOwnerID().notNull() && (parcel->getOwnerID() != gAgent.getID()) @@ -2466,7 +2422,7 @@ void LLViewerParcelMgr::releaseAlertCB(S32 option, void *) void LLViewerParcelMgr::buyPass() { - LLParcel* parcel = getSelectedParcel(); + LLParcel* parcel = getParcelSelection()->getParcel(); if (!parcel) return; LLViewerRegion* region = getSelectionRegion(); @@ -2560,3 +2516,58 @@ void sanitize_corners(const LLVector3d &corner1, east_north_top.mdV[VZ] = llmax( corner1.mdV[VZ], corner2.mdV[VZ] ); } +// +// LLParcelSelection +// +LLParcelSelection::LLParcelSelection() : + mParcel(NULL), + mSelectedMultipleOwners(FALSE), + mWholeParcelSelected(FALSE), + mSelectedPublicCount(0), + mSelectedSelfCount(0), + mSelectedOtherCount(0) +{ +} + +LLParcelSelection::LLParcelSelection(LLParcel* parcel) : + mParcel(parcel), + mSelectedMultipleOwners(FALSE), + mWholeParcelSelected(FALSE), + mSelectedPublicCount(0), + mSelectedSelfCount(0), + mSelectedOtherCount(0) +{ +} + +LLParcelSelection::~LLParcelSelection() +{ +} + +BOOL LLParcelSelection::getMultipleOwners() const +{ + return mSelectedMultipleOwners; +} + + +BOOL LLParcelSelection::getWholeParcelSelected() const +{ + return mWholeParcelSelected; +} + + +S32 LLParcelSelection::getClaimableArea() const +{ + const S32 UNIT_AREA = S32( PARCEL_GRID_STEP_METERS * PARCEL_GRID_STEP_METERS ); + return mSelectedPublicCount * UNIT_AREA; +} + +bool LLParcelSelection::hasOthersSelected() const +{ + return mSelectedOtherCount != 0; +} + +LLParcelSelection* get_null_parcel_selection() +{ + static LLParcelSelectionHandle null_ptr = new LLParcelSelection(); + return null_ptr; +}
\ No newline at end of file diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index d9823c82a0..d7677c70e4 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -49,15 +49,56 @@ public: virtual void changed() = 0; }; +class LLParcelSelection : public LLRefCount +{ + friend class LLViewerParcelMgr; + +public: + LLParcelSelection(LLParcel* parcel); + LLParcelSelection(); + + ~LLParcelSelection(); + + // this can return NULL at any time, as parcel selection + // might have been invalidated. + LLParcel* getParcel() { return mParcel; } + + // Return the number of grid units that are owned by you within + // the selection (computed by server). + S32 getSelfCount() const { return mSelectedSelfCount; } + + // Returns area that will actually be claimed in meters squared. + S32 getClaimableArea() const; + bool hasOthersSelected() const; + + // Does the selection have multiple land owners in it? + BOOL getMultipleOwners() const; + + // Is the entire parcel selected, or just a part? + BOOL getWholeParcelSelected() const; + +protected: + void setParcel(LLParcel* parcel) { mParcel = parcel; } + +protected: + + LLParcel* mParcel; + BOOL mSelectedMultipleOwners; + BOOL mWholeParcelSelected; + S32 mSelectedSelfCount; + S32 mSelectedOtherCount; + S32 mSelectedPublicCount; +}; + +typedef LLHandle<LLParcelSelection> LLParcelSelectionHandle; + class LLViewerParcelMgr { + public: LLViewerParcelMgr(); ~LLViewerParcelMgr(); - void destroyGL(); - void restoreGL(); - BOOL selectionEmpty() const; F32 getSelectionWidth() const { return F32(mEastNorth.mdV[VX] - mWestSouth.mdV[VX]); } F32 getSelectionHeight() const { return F32(mEastNorth.mdV[VY] - mWestSouth.mdV[VY]); } @@ -68,16 +109,6 @@ public: void getPrimInfo(S32 &sw_max, S32 &sw_total, S32 &max, S32 &total, S32 &owner, S32 &group, S32 &other, S32& selected, F32 &parcel_object_bonus, S32 &other_clean); - // Does the selection have multiple land owners in it? - BOOL getMultipleOwners() const; - - // Is the entire parcel selected, or just a part? - BOOL getWholeParcelSelected() const; - - // Returns area that will actually be claimed in meters squared. - S32 getClaimableArea() const; - bool hasOthersSelected() const; - // Returns selected area S32 getSelectedArea() const; @@ -96,18 +127,19 @@ public: void selectCollisionParcel(); // Select the parcel at a specific point - void selectParcelAt(const LLVector3d& pos_global); + LLHandle<LLParcelSelection> selectParcelAt(const LLVector3d& pos_global); // Take the current rectangle select, and select the parcel contained // within it. - void selectParcelInRectangle(); + LLParcelSelectionHandle selectParcelInRectangle(); // Select a piece of land - void selectLand(const LLVector3d &corner1, const LLVector3d &corner2, + LLParcelSelectionHandle selectLand(const LLVector3d &corner1, const LLVector3d &corner2, BOOL snap_to_parcel); // Clear the selection, and stop drawing the highlight. void deselectLand(); + void deselectUnused(); void addObserver(LLParcelObserver* observer); void removeObserver(LLParcelObserver* observer); @@ -122,15 +154,23 @@ public: BOOL canHearSound(const LLVector3d &pos_global) const; - LLParcel *getSelectedParcel() const; + // Returns a reference counted pointer to current parcel selection. + // Selection does not change to reflect new selections made by user + // Use this when implementing a task UI that refers to a specific + // selection. + LLParcelSelectionHandle getParcelSelection() const; + + // Returns a reference counted pointer to current parcel selection. + // Pointer tracks whatever the user has currently selected. + // Use this when implementing an inspector UI. + // http://en.wikipedia.org/wiki/Inspector_window + LLParcelSelectionHandle getFloatingParcelSelection() const; + + //LLParcel *getParcelSelection() const; LLParcel *getAgentParcel() const; BOOL inAgentParcel(const LLVector3d &pos_global) const; - // Return the number of grid units that are owned by you within - // the selection (computed by server). - S32 getSelfCount() const { return mSelectedSelfCount; } - // Returns a pointer only when it has valid data. LLParcel* getHoverParcel() const; @@ -172,7 +212,7 @@ public: // containing the southwest corner of the selection. // If want_reply_to_update, simulator will send back a ParcelProperties // message. - void sendParcelPropertiesUpdate(LLParcel* parcel, BOOL want_reply_to_update); + void sendParcelPropertiesUpdate(LLParcel* parcel); // Takes an Access List flag, like AL_ACCESS or AL_BAN void sendParcelAccessListUpdate(U32 which); @@ -265,26 +305,23 @@ protected: //void finishClaim(BOOL user_to_user_sale, U32 join); private: - BOOL mSelected; - BOOL mSelectedMultipleOwners; - BOOL mWholeParcelSelected; - S32 mSelectedSelfCount; - S32 mSelectedOtherCount; - S32 mSelectedPublicCount; + BOOL mSelected; - LLParcel *mParcel; // selected parcel info - S32 mRequestResult; // result of last parcel request - LLVector3d mWestSouth; - LLVector3d mEastNorth; - F32 mSelectedDwell; + LLParcel* mCurrentParcel; // selected parcel info + LLParcelSelectionHandle mCurrentParcelSelection; + LLParcelSelectionHandle mFloatingParcelSelection; + S32 mRequestResult; // result of last parcel request + LLVector3d mWestSouth; + LLVector3d mEastNorth; + F32 mSelectedDwell; - LLParcel *mAgentParcel; // info for parcel agent is in - S32 mAgentParcelSequenceID; // incrementing counter to suppress out of order updates + LLParcel *mAgentParcel; // info for parcel agent is in + S32 mAgentParcelSequenceID; // incrementing counter to suppress out of order updates - LLParcel* mHoverParcel; - S32 mHoverRequestResult; - LLVector3d mHoverWestSouth; - LLVector3d mHoverEastNorth; + LLParcel* mHoverParcel; + S32 mHoverRequestResult; + LLVector3d mHoverWestSouth; + LLVector3d mHoverEastNorth; LLDynamicArray<LLParcelObserver*> mObservers; @@ -293,30 +330,30 @@ private: // we can represent edges of the grid. // WEST_MASK = draw west edge // SOUTH_MASK = draw south edge - S32 mParcelsPerEdge; - U8* mHighlightSegments; - U8* mAgentParcelOverlay; + S32 mParcelsPerEdge; + U8* mHighlightSegments; + U8* mAgentParcelOverlay; // Raw data buffer for unpacking parcel overlay chunks // Size = parcels_per_edge * parcels_per_edge / parcel_overlay_chunks - static U8* sPackedOverlay; + static U8* sPackedOverlay; // Watch for pending collisions with a parcel you can't access. // If it's coming, draw the parcel's boundaries. - LLParcel* mCollisionParcel; - U8* mCollisionSegments; - BOOL mRenderCollision; - BOOL mRenderSelection; - S32 mCollisionBanned; - LLFrameTimer mCollisionTimer; - LLUUID mBlockedImageID; - LLUUID mPassImageID; - LLPointer<LLViewerImage> mBlockedImage; - LLPointer<LLViewerImage> mPassImage; + LLParcel* mCollisionParcel; + U8* mCollisionSegments; + BOOL mRenderCollision; + BOOL mRenderSelection; + S32 mCollisionBanned; + LLFrameTimer mCollisionTimer; + LLUUID mBlockedImageID; + LLUUID mPassImageID; + LLPointer<LLViewerImage> mBlockedImage; + LLPointer<LLViewerImage> mPassImage; // Media - S32 mMediaParcelId; - U64 mMediaRegionId; + S32 mMediaParcelId; + U64 mMediaRegionId; }; extern LLViewerParcelMgr *gParcelMgr; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 871dfcbdea..10bd3cd102 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -378,7 +378,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask if (gToolMgr) { // Don't let the user move the mouse out of the window until mouse up. - if( gToolMgr->getCurrentTool(mask)->clipMouseWhenDown() ) + if( gToolMgr->getCurrentTool()->clipMouseWhenDown() ) { mWindow->setMouseClipping(TRUE); } @@ -429,7 +429,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask if (gToolMgr) { - if(gToolMgr->getCurrentTool(mask)->handleMouseDown( x, y, mask ) ) + if(gToolMgr->getCurrentTool()->handleMouseDown( x, y, mask ) ) { // This is necessary to force clicks in the world to cause edit // boxes that might have keyboard focus to relinquish it, and hence @@ -507,7 +507,7 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma if (gToolMgr) { - if(gToolMgr->getCurrentTool(mask)->handleDoubleClick( x, y, mask ) ) + if(gToolMgr->getCurrentTool()->handleDoubleClick( x, y, mask ) ) { return TRUE; } @@ -550,7 +550,7 @@ BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) LLTool *tool = NULL; if (gToolMgr) { - tool = gToolMgr->getCurrentTool(mask); + tool = gToolMgr->getCurrentTool(); if( tool->clipMouseWhenDown() ) { @@ -649,7 +649,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK if (gToolMgr) { // Don't let the user move the mouse out of the window until mouse up. - if( gToolMgr->getCurrentTool(mask)->clipMouseWhenDown() ) + if( gToolMgr->getCurrentTool()->clipMouseWhenDown() ) { mWindow->setMouseClipping(TRUE); } @@ -692,7 +692,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK if (gToolMgr) { - if(gToolMgr->getCurrentTool(mask)->handleRightMouseDown( x, y, mask ) ) + if(gToolMgr->getCurrentTool()->handleRightMouseDown( x, y, mask ) ) { // This is necessary to force clicks in the world to cause edit // boxes that might have keyboard focus to relinquish it, and hence @@ -750,7 +750,7 @@ BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK m LLTool *tool = NULL; if (gToolMgr) { - tool = gToolMgr->getCurrentTool(mask); + tool = gToolMgr->getCurrentTool(); if( tool->clipMouseWhenDown() ) { @@ -1909,7 +1909,7 @@ void LLViewerWindow::draw() if (gToolMgr) { // Draw tool specific overlay on world - gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) )->draw(); + gToolMgr->getCurrentTool()->draw(); } if( gAgent.cameraMouselook() ) @@ -2097,7 +2097,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) if (gToolMgr) { - if( gToolMgr->getCurrentTool(mask)->handleKey(key, mask) ) + if( gToolMgr->getCurrentTool()->handleKey(key, mask) ) { return TRUE; } @@ -2457,7 +2457,7 @@ BOOL LLViewerWindow::handlePerFrameHover() LLTool *tool = NULL; if (gToolMgr && gHoverView) { - tool = gToolMgr->getCurrentTool(mask); + tool = gToolMgr->getCurrentTool(); if(!handled && tool) { @@ -2477,8 +2477,8 @@ BOOL LLViewerWindow::handlePerFrameHover() // Suppress the toolbox view if our source tool was the pie tool, // and we've overridden to something else. mSuppressToolbox = - (gToolMgr->getCurrentTool(MASK_NONE) == gToolPie) && - (gToolMgr->getCurrentTool(mask) != gToolPie); + (gToolMgr->getBaseTool() == gToolPie) && + (gToolMgr->getCurrentTool() != gToolPie); } @@ -2539,8 +2539,8 @@ BOOL LLViewerWindow::handlePerFrameHover() (tool != gToolPie // not default tool && tool != gToolGun // not coming out of mouselook && !mSuppressToolbox // not override in third person - && gCurrentToolset != gFaceEditToolset // not special mode - && gCurrentToolset != gMouselookToolset + && gToolMgr->getCurrentToolset() != gFaceEditToolset // not special mode + && gToolMgr->getCurrentToolset() != gMouselookToolset && (!captor || captor->isView())) // not dragging ) { @@ -2653,7 +2653,7 @@ BOOL LLViewerWindow::handlePerFrameHover() mLastMousePoint = mCurrentMousePoint; // last ditch force of edit menu to selection manager - if (gEditMenuHandler == NULL && gSelectMgr && gSelectMgr->getObjectCount()) + if (gEditMenuHandler == NULL && gSelectMgr && gSelectMgr->getSelection()->getObjectCount()) { gEditMenuHandler = gSelectMgr; } @@ -2689,15 +2689,15 @@ BOOL LLViewerWindow::handlePerFrameHover() gChatBar->startChat(NULL); } - // sync land selection with edit and about land dialogs - if (gParcelMgr - && !gMenuHolder->hasVisibleMenu() - && !LLFloaterLand::floaterVisible() - && !LLFloaterBuyLand::isOpen() - && !LLPanelLandGeneral::buyPassDialogVisible() - && (!gFloaterTools || !gFloaterTools->getVisible())) + // cleanup unused selections + if (gParcelMgr) { - gParcelMgr->deselectLand(); + gParcelMgr->deselectUnused(); + } + + if (gSelectMgr) + { + gSelectMgr->deselectUnused(); } return handled; @@ -2745,6 +2745,7 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point) void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud ) { LLViewerObject* object; + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); if (!for_hud && !for_gl_pick) { @@ -2760,15 +2761,15 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, gParcelMgr->renderParcelCollision(); } } - else if (( for_hud && gSelectMgr->getSelectType() == SELECT_TYPE_HUD) || - (!for_hud && gSelectMgr->getSelectType() != SELECT_TYPE_HUD)) + else if (( for_hud && selection->getSelectType() == SELECT_TYPE_HUD) || + (!for_hud && selection->getSelectType() != SELECT_TYPE_HUD)) { gSelectMgr->renderSilhouettes(for_hud); stop_glerror(); // setup HUD render - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD && gSelectMgr->getObjectCount()) + if (selection->getSelectType() == SELECT_TYPE_HUD && gSelectMgr->getSelection()->getObjectCount()) { LLBBox hud_bbox = gAgent.getAvatarObject()->getHUDBBox(); @@ -2794,12 +2795,12 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE); glMatrixMode(GL_MODELVIEW); glPushMatrix(); - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD) + if (selection->getSelectType() == SELECT_TYPE_HUD) { F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom; glScalef(zoom, zoom, zoom); } - for( object = gSelectMgr->getFirstObject(); object; object = gSelectMgr->getNextObject() ) + for( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) { LLDrawable* drawable = object->mDrawable; if (drawable && drawable->isLight()) @@ -2834,7 +2835,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, // not be recalculated at this time. If they are, then group rotations will break. // Draw arrows at average center of all selected objects - LLTool* tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); + LLTool* tool = gToolMgr->getCurrentTool(); if (tool) { if(tool->isAlwaysRendered()) @@ -2843,13 +2844,13 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, } else { - if( !gSelectMgr->isEmpty() ) + if( !gSelectMgr->getSelection()->isEmpty() ) { BOOL moveable_object_selected = FALSE; BOOL all_selected_objects_move = TRUE; BOOL all_selected_objects_modify = TRUE; BOOL selecting_linked_set = gSavedSettings.getBOOL("SelectLinkedSet"); - for( object = gSelectMgr->getFirstObject(); object; object = gSelectMgr->getNextObject() ) + for( object = gSelectMgr->getSelection()->getFirstObject(); object; object = gSelectMgr->getSelection()->getNextObject() ) { BOOL this_object_movable = FALSE; if (object->permMove() && (object->permModify() || selecting_linked_set)) @@ -2884,7 +2885,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, } } } - if (gSelectMgr->getSelectType() == SELECT_TYPE_HUD && gSelectMgr->getObjectCount()) + if (selection->getSelectType() == SELECT_TYPE_HUD && selection->getObjectCount()) { glMatrixMode(GL_PROJECTION); glPopMatrix(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b21df05afe..193fd4e325 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1925,9 +1925,10 @@ void LLVOAvatar::buildCharacter() { LLMenuItemCallGL* item; item = new LLMenuItemCallGL(attachment->getName(), - &handle_attach_to_avatar, - object_selected_and_point_valid, - attachment); + NULL, + object_selected_and_point_valid); + item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", mAttachmentPoints.reverseLookup(attachment)); + gAttachPieMenu->append(item); attachment_found = TRUE; @@ -1979,9 +1980,9 @@ void LLVOAvatar::buildCharacter() { LLMenuItemCallGL* item; item = new LLMenuItemCallGL(attachment->getName(), - &handle_attach_to_avatar, - object_selected_and_point_valid, - attachment); + NULL, + object_selected_and_point_valid); + item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", mAttachmentPoints.reverseLookup(attachment)); gAttachScreenPieMenu->append(item); gDetachScreenPieMenu->append(new LLMenuItemCallGL(attachment->getName(), &handle_detach_from_avatar, object_attached, attachment)); @@ -1998,8 +1999,11 @@ void LLVOAvatar::buildCharacter() { continue; } - gAttachSubMenu->append(new LLMenuItemCallGL(attachment->getName(), - &handle_attach_to_avatar, object_selected_and_point_valid, &attach_label, attachment)); + LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(), + NULL, &object_selected_and_point_valid, &attach_label, NULL); + item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", mAttachmentPoints.reverseLookup(attachment)); + gAttachSubMenu->append(item); + gDetachSubMenu->append(new LLMenuItemCallGL(attachment->getName(), &handle_detach_from_avatar, object_attached, &detach_label, attachment)); @@ -2049,8 +2053,10 @@ void LLVOAvatar::buildCharacter() LLViewerJointAttachment* attachment = attach_it->second; - gAttachBodyPartPieMenus[group]->append(new LLMenuItemCallGL(attachment->getName(), - &handle_attach_to_avatar, object_selected_and_point_valid, attachment)); + LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(), + NULL, object_selected_and_point_valid); + gAttachBodyPartPieMenus[group]->append(item); + item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", mAttachmentPoints.reverseLookup(attachment)); gDetachBodyPartPieMenus[group]->append(new LLMenuItemCallGL(attachment->getName(), &handle_detach_from_avatar, object_attached, attachment)); @@ -2448,7 +2454,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) if (attached_object && !attached_object->isDead() && attachment->getValid()) { // if selecting any attachments, update all of them as non-damped - if (gSelectMgr->getObjectCount() && gSelectMgr->selectionIsAttachment()) + if (gSelectMgr->getSelection()->getObjectCount() && gSelectMgr->getSelection()->isAttachment()) { gPipeline.updateMoveNormalAsync(attached_object->mDrawable); } @@ -2905,22 +2911,24 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) if (!mBeam.isNull()) { + LLObjectSelectionHandle selection = gSelectMgr->getSelection(); + if (gAgent.mPointAt.notNull()) { // get point from pointat effect mBeam->setPositionGlobal(gAgent.mPointAt->getPointAtPosGlobal()); mBeam->triggerLocal(); } - else if (gSelectMgr->getFirstRootObject() && - gSelectMgr->getSelectType() != SELECT_TYPE_HUD) + else if (selection->getFirstRootObject() && + selection->getSelectType() != SELECT_TYPE_HUD) { - LLViewerObject* objectp = gSelectMgr->getFirstRootObject(); + LLViewerObject* objectp = selection->getFirstRootObject(); mBeam->setTargetObject(objectp); } else { mBeam->setTargetObject(NULL); - LLTool *tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); + LLTool *tool = gToolMgr->getCurrentTool(); if (tool->isEditing()) { if (tool->getEditingObject()) @@ -3654,7 +3662,7 @@ BOOL LLVOAvatar::needsRenderBeam() { return FALSE; } - LLTool *tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); + LLTool *tool = gToolMgr->getCurrentTool(); BOOL is_touching_or_grabbing = (tool == gToolGrab && gToolGrab->isEditing()); if (gToolGrab->getEditingObject() && diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 0962d3e479..445f8c6fbf 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -2299,7 +2299,7 @@ void LLPipeline::stateSort() { LLViewerObject *vobjp; S32 te; - gSelectMgr->getFirstTE(&vobjp,&te); + gSelectMgr->getSelection()->getFirstTE(&vobjp,&te); while (vobjp) { @@ -2351,7 +2351,7 @@ void LLPipeline::stateSort() } } } - gSelectMgr->getNextTE(&vobjp,&te); + gSelectMgr->getSelection()->getNextTE(&vobjp,&te); } } } |