diff options
Diffstat (limited to 'indra/newview/llfavoritesbar.cpp')
-rw-r--r-- | indra/newview/llfavoritesbar.cpp | 2900 |
1 files changed, 1450 insertions, 1450 deletions
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index c1d8828229..d3c9cd26d7 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llfavoritesbar.cpp * @brief LLFavoritesBarCtrl class implementation * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -67,86 +67,86 @@ const S32 DROP_DOWN_MENU_TOP_PAD = 13; class LLLandmarkInfoGetter { public: - LLLandmarkInfoGetter() - : mLandmarkID(LLUUID::null), - mName("(Loading...)"), - mPosX(0), - mPosY(0), - mPosZ(0), - mLoaded(false) - { - mHandle.bind(this); - } - - void setLandmarkID(const LLUUID& id) { mLandmarkID = id; } - const LLUUID& getLandmarkId() const { return mLandmarkID; } - - const std::string& getName() - { - if(!mLoaded) - requestNameAndPos(); - - return mName; - } - - S32 getPosX() - { - if (!mLoaded) - requestNameAndPos(); - return mPosX; - } - - S32 getPosY() - { - if (!mLoaded) - requestNameAndPos(); - return mPosY; - } - - S32 getPosZ() - { - if (!mLoaded) - requestNameAndPos(); - return mPosZ; - } + LLLandmarkInfoGetter() + : mLandmarkID(LLUUID::null), + mName("(Loading...)"), + mPosX(0), + mPosY(0), + mPosZ(0), + mLoaded(false) + { + mHandle.bind(this); + } + + void setLandmarkID(const LLUUID& id) { mLandmarkID = id; } + const LLUUID& getLandmarkId() const { return mLandmarkID; } + + const std::string& getName() + { + if(!mLoaded) + requestNameAndPos(); + + return mName; + } + + S32 getPosX() + { + if (!mLoaded) + requestNameAndPos(); + return mPosX; + } + + S32 getPosY() + { + if (!mLoaded) + requestNameAndPos(); + return mPosY; + } + + S32 getPosZ() + { + if (!mLoaded) + requestNameAndPos(); + return mPosZ; + } private: - /** - * Requests landmark data from server. - */ - void requestNameAndPos() - { - if (mLandmarkID.isNull()) - return; - - LLVector3d g_pos; - if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos)) - { - LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos, - boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, static_cast<LLHandle<LLLandmarkInfoGetter> >(mHandle), _1, _2, _3, _4)); - } - } - - static void landmarkNameCallback(LLHandle<LLLandmarkInfoGetter> handle, const std::string& name, S32 x, S32 y, S32 z) - { - LLLandmarkInfoGetter* getter = handle.get(); - if (getter) - { - getter->mPosX = x; - getter->mPosY = y; - getter->mPosZ = z; - getter->mName = name; - getter->mLoaded = true; - } - } - - LLUUID mLandmarkID; - std::string mName; - S32 mPosX; - S32 mPosY; - S32 mPosZ; - bool mLoaded; - LLRootHandle<LLLandmarkInfoGetter> mHandle; + /** + * Requests landmark data from server. + */ + void requestNameAndPos() + { + if (mLandmarkID.isNull()) + return; + + LLVector3d g_pos; + if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos)) + { + LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos, + boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, static_cast<LLHandle<LLLandmarkInfoGetter> >(mHandle), _1, _2, _3, _4)); + } + } + + static void landmarkNameCallback(LLHandle<LLLandmarkInfoGetter> handle, const std::string& name, S32 x, S32 y, S32 z) + { + LLLandmarkInfoGetter* getter = handle.get(); + if (getter) + { + getter->mPosX = x; + getter->mPosY = y; + getter->mPosZ = z; + getter->mName = name; + getter->mLoaded = true; + } + } + + LLUUID mLandmarkID; + std::string mName; + S32 mPosX; + S32 mPosY; + S32 mPosZ; + bool mLoaded; + LLRootHandle<LLLandmarkInfoGetter> mHandle; }; /** @@ -154,64 +154,64 @@ private: * show SLURL as button tooltip. * *NOTE: dzaporozhan: This is a workaround. We could set tooltips for buttons * in createButtons function but landmark data is not available when Favorites Bar is - * created. Thats why we are requesting landmark data after + * created. Thats why we are requesting landmark data after */ class LLFavoriteLandmarkButton : public LLButton { public: - BOOL handleToolTip(S32 x, S32 y, MASK mask) - { - std::string region_name = mLandmarkInfoGetter.getName(); - - if (!region_name.empty()) - { - std::string extra_message = llformat("%s (%d, %d, %d)", region_name.c_str(), - mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ()); - - LLToolTip::Params params; - params.message = llformat("%s\n%s", getLabelSelected().c_str(), extra_message.c_str()); - params.max_width = 1000; - params.sticky_rect = calcScreenRect(); - - LLToolTipMgr::instance().show(params); - } - return TRUE; - } - - /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask) - { - LLFavoritesBarCtrl* fb = dynamic_cast<LLFavoritesBarCtrl*>(getParent()); - - if (fb) - { - fb->handleHover(x, y, mask); - } - - return LLButton::handleHover(x, y, mask); - } - - void setLandmarkID(const LLUUID& id){ mLandmarkInfoGetter.setLandmarkID(id); } - const LLUUID& getLandmarkId() const { return mLandmarkInfoGetter.getLandmarkId(); } - - void onMouseEnter(S32 x, S32 y, MASK mask) - { - if (LLToolDragAndDrop::getInstance()->hasMouseCapture()) - { - LLUICtrl::onMouseEnter(x, y, mask); - } - else - { - LLButton::onMouseEnter(x, y, mask); - } - } + BOOL handleToolTip(S32 x, S32 y, MASK mask) + { + std::string region_name = mLandmarkInfoGetter.getName(); + + if (!region_name.empty()) + { + std::string extra_message = llformat("%s (%d, %d, %d)", region_name.c_str(), + mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ()); + + LLToolTip::Params params; + params.message = llformat("%s\n%s", getLabelSelected().c_str(), extra_message.c_str()); + params.max_width = 1000; + params.sticky_rect = calcScreenRect(); + + LLToolTipMgr::instance().show(params); + } + return TRUE; + } + + /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask) + { + LLFavoritesBarCtrl* fb = dynamic_cast<LLFavoritesBarCtrl*>(getParent()); + + if (fb) + { + fb->handleHover(x, y, mask); + } + + return LLButton::handleHover(x, y, mask); + } + + void setLandmarkID(const LLUUID& id){ mLandmarkInfoGetter.setLandmarkID(id); } + const LLUUID& getLandmarkId() const { return mLandmarkInfoGetter.getLandmarkId(); } + + void onMouseEnter(S32 x, S32 y, MASK mask) + { + if (LLToolDragAndDrop::getInstance()->hasMouseCapture()) + { + LLUICtrl::onMouseEnter(x, y, mask); + } + else + { + LLButton::onMouseEnter(x, y, mask); + } + } protected: - LLFavoriteLandmarkButton(const LLButton::Params& p) : LLButton(p) {} - friend class LLUICtrlFactory; + LLFavoriteLandmarkButton(const LLButton::Params& p) : LLButton(p) {} + friend class LLUICtrlFactory; private: - LLLandmarkInfoGetter mLandmarkInfoGetter; + LLLandmarkInfoGetter mLandmarkInfoGetter; }; /** @@ -219,60 +219,60 @@ private: * show SLURL as button tooltip. * *NOTE: dzaporozhan: This is a workaround. We could set tooltips for buttons * in showDropDownMenu function but landmark data is not available when Favorites Bar is - * created. Thats why we are requesting landmark data after + * created. Thats why we are requesting landmark data after */ class LLFavoriteLandmarkMenuItem : public LLMenuItemCallGL { public: - BOOL handleToolTip(S32 x, S32 y, MASK mask) - { - std::string region_name = mLandmarkInfoGetter.getName(); - if (!region_name.empty()) - { - LLToolTip::Params params; - params.message = llformat("%s\n%s (%d, %d)", getLabel().c_str(), region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY()); - params.sticky_rect = calcScreenRect(); - LLToolTipMgr::instance().show(params); - } - return TRUE; - } - - void setLandmarkID(const LLUUID& id){ mLandmarkInfoGetter.setLandmarkID(id); } - - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) - { - if (mMouseDownSignal) - (*mMouseDownSignal)(this, x, y, mask); - return LLMenuItemCallGL::handleMouseDown(x, y, mask); - } - - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) - { - if (mMouseUpSignal) - (*mMouseUpSignal)(this, x, y, mask); - return LLMenuItemCallGL::handleMouseUp(x, y, mask); - } - - virtual BOOL handleHover(S32 x, S32 y, MASK mask) - { - if (fb) - { - fb->handleHover(x, y, mask); - } - - return TRUE; - } - - void initFavoritesBarPointer(LLFavoritesBarCtrl* fb) { this->fb = fb; } + BOOL handleToolTip(S32 x, S32 y, MASK mask) + { + std::string region_name = mLandmarkInfoGetter.getName(); + if (!region_name.empty()) + { + LLToolTip::Params params; + params.message = llformat("%s\n%s (%d, %d)", getLabel().c_str(), region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY()); + params.sticky_rect = calcScreenRect(); + LLToolTipMgr::instance().show(params); + } + return TRUE; + } + + void setLandmarkID(const LLUUID& id){ mLandmarkInfoGetter.setLandmarkID(id); } + + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) + { + if (mMouseDownSignal) + (*mMouseDownSignal)(this, x, y, mask); + return LLMenuItemCallGL::handleMouseDown(x, y, mask); + } + + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) + { + if (mMouseUpSignal) + (*mMouseUpSignal)(this, x, y, mask); + return LLMenuItemCallGL::handleMouseUp(x, y, mask); + } + + virtual BOOL handleHover(S32 x, S32 y, MASK mask) + { + if (fb) + { + fb->handleHover(x, y, mask); + } + + return TRUE; + } + + void initFavoritesBarPointer(LLFavoritesBarCtrl* fb) { this->fb = fb; } protected: - LLFavoriteLandmarkMenuItem(const LLMenuItemCallGL::Params& p) : LLMenuItemCallGL(p) {} - friend class LLUICtrlFactory; + LLFavoriteLandmarkMenuItem(const LLMenuItemCallGL::Params& p) : LLMenuItemCallGL(p) {} + friend class LLUICtrlFactory; private: - LLLandmarkInfoGetter mLandmarkInfoGetter; - LLFavoritesBarCtrl* fb; + LLLandmarkInfoGetter mLandmarkInfoGetter; + LLFavoritesBarCtrl* fb; }; /** @@ -285,23 +285,23 @@ private: class LLFavoriteLandmarkToggleableMenu : public LLToggleableMenu { public: - virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) - { - *accept = ACCEPT_NO; - return TRUE; - } + virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) + { + *accept = ACCEPT_NO; + return TRUE; + } protected: - LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p): - LLToggleableMenu(p) - { - } + LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p): + LLToggleableMenu(p) + { + } - friend class LLUICtrlFactory; + friend class LLUICtrlFactory; }; /** @@ -312,58 +312,58 @@ protected: class LLItemCopiedCallback : public LLInventoryCallback { public: - LLItemCopiedCallback(S32 sortField): mSortField(sortField) {} + LLItemCopiedCallback(S32 sortField): mSortField(sortField) {} - virtual void fire(const LLUUID& inv_item) - { - LLViewerInventoryItem* item = gInventory.getItem(inv_item); + virtual void fire(const LLUUID& inv_item) + { + LLViewerInventoryItem* item = gInventory.getItem(inv_item); - if (item) - { + if (item) + { LLFavoritesBarCtrl::sWaitingForCallabck = 0.f; - LLFavoritesOrderStorage::instance().setSortIndex(item, mSortField); + LLFavoritesOrderStorage::instance().setSortIndex(item, mSortField); - item->setComplete(TRUE); - item->updateServer(FALSE); + item->setComplete(TRUE); + item->updateServer(FALSE); - gInventory.updateItem(item); - gInventory.notifyObservers(); - LLFavoritesOrderStorage::instance().saveOrder(); - } + gInventory.updateItem(item); + gInventory.notifyObservers(); + LLFavoritesOrderStorage::instance().saveOrder(); + } - LLView::getWindow()->setCursor(UI_CURSOR_ARROW); - } + LLView::getWindow()->setCursor(UI_CURSOR_ARROW); + } private: - S32 mSortField; + S32 mSortField; }; // updateButtons's helper struct LLFavoritesSort { - // Sorting by creation date and name - // TODO - made it customizible using gSavedSettings - bool operator()(const LLViewerInventoryItem* const& a, const LLViewerInventoryItem* const& b) - { - S32 sortField1 = LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID()); - S32 sortField2 = LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID()); - - if (!(sortField1 < 0 && sortField2 < 0)) - { - return sortField2 > sortField1; - } - - time_t first_create = a->getCreationDate(); - time_t second_create = b->getCreationDate(); - if (first_create == second_create) - { - return (LLStringUtil::compareDict(a->getName(), b->getName()) < 0); - } - else - { - return (first_create > second_create); - } - } + // Sorting by creation date and name + // TODO - made it customizible using gSavedSettings + bool operator()(const LLViewerInventoryItem* const& a, const LLViewerInventoryItem* const& b) + { + S32 sortField1 = LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID()); + S32 sortField2 = LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID()); + + if (!(sortField1 < 0 && sortField2 < 0)) + { + return sortField2 > sortField1; + } + + time_t first_create = a->getCreationDate(); + time_t second_create = b->getCreationDate(); + if (first_create == second_create) + { + return (LLStringUtil::compareDict(a->getName(), b->getName()) < 0); + } + else + { + return (first_create > second_create); + } + } }; @@ -377,104 +377,104 @@ LLFavoritesBarCtrl::Params::Params() } LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p) -: LLUICtrl(p), - mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()), - mOverflowMenuHandle(), - mContextMenuHandle(), - mImageDragIndication(p.image_drag_indication), - mShowDragMarker(FALSE), - mLandingTab(NULL), - mLastTab(NULL), +: LLUICtrl(p), + mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()), + mOverflowMenuHandle(), + mContextMenuHandle(), + mImageDragIndication(p.image_drag_indication), + mShowDragMarker(FALSE), + mLandingTab(NULL), + mLastTab(NULL), mItemsListDirty(false), - mUpdateDropDownItems(true), - mRestoreOverflowMenu(false), - mGetPrevItems(true), - mMouseX(0), - mMouseY(0), - mItemsChangedTimer() -{ - // Register callback for menus with current registrar (will be parent panel's registrar) - LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected", - boost::bind(&LLFavoritesBarCtrl::doToSelected, this, _2)); - - // Add this if we need to selectively enable items - LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Favorites.EnableSelected", - boost::bind(&LLFavoritesBarCtrl::enableSelected, this, _2)); - - gInventory.addObserver(this); - - //make chevron button - LLTextBox::Params more_button_params(p.more_button); - mMoreTextBox = LLUICtrlFactory::create<LLTextBox> (more_button_params); - mMoreTextBox->setClickedCallback(boost::bind(&LLFavoritesBarCtrl::onMoreTextBoxClicked, this)); - addChild(mMoreTextBox); - LLRect rect = mMoreTextBox->getRect(); - mMoreTextBox->setRect(LLRect(rect.mLeft - rect.getWidth(), rect.mTop, rect.mRight, rect.mBottom)); - - mDropDownItemsCount = 0; - - LLTextBox::Params label_param(p.label); - mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param); - addChild(mBarLabel); + mUpdateDropDownItems(true), + mRestoreOverflowMenu(false), + mGetPrevItems(true), + mMouseX(0), + mMouseY(0), + mItemsChangedTimer() +{ + // Register callback for menus with current registrar (will be parent panel's registrar) + LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected", + boost::bind(&LLFavoritesBarCtrl::doToSelected, this, _2)); + + // Add this if we need to selectively enable items + LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Favorites.EnableSelected", + boost::bind(&LLFavoritesBarCtrl::enableSelected, this, _2)); + + gInventory.addObserver(this); + + //make chevron button + LLTextBox::Params more_button_params(p.more_button); + mMoreTextBox = LLUICtrlFactory::create<LLTextBox> (more_button_params); + mMoreTextBox->setClickedCallback(boost::bind(&LLFavoritesBarCtrl::onMoreTextBoxClicked, this)); + addChild(mMoreTextBox); + LLRect rect = mMoreTextBox->getRect(); + mMoreTextBox->setRect(LLRect(rect.mLeft - rect.getWidth(), rect.mTop, rect.mRight, rect.mBottom)); + + mDropDownItemsCount = 0; + + LLTextBox::Params label_param(p.label); + mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param); + addChild(mBarLabel); } LLFavoritesBarCtrl::~LLFavoritesBarCtrl() { - gInventory.removeObserver(this); + gInventory.removeObserver(this); - if (mOverflowMenuHandle.get()) mOverflowMenuHandle.get()->die(); - if (mContextMenuHandle.get()) mContextMenuHandle.get()->die(); + if (mOverflowMenuHandle.get()) mOverflowMenuHandle.get()->die(); + if (mContextMenuHandle.get()) mContextMenuHandle.get()->die(); } BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - *accept = ACCEPT_NO; - - LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); - if (LLToolDragAndDrop::SOURCE_AGENT != source && LLToolDragAndDrop::SOURCE_LIBRARY != source) return FALSE; - - switch (cargo_type) - { - - case DAD_LANDMARK: - { - /* - * add a callback to the end drag event. - * the callback will disconnet itself immediately after execution - * this is done because LLToolDragAndDrop is a common tool so it shouldn't - * be overloaded with redundant callbacks. - */ - if (!mEndDragConnection.connected()) - { - mEndDragConnection = LLToolDragAndDrop::getInstance()->setEndDragCallback(boost::bind(&LLFavoritesBarCtrl::onEndDrag, this)); - } - - // Copy the item into the favorites folder (if it's not already there). - LLInventoryItem *item = (LLInventoryItem *)cargo_data; - - if (LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(findChildByLocalCoords(x, y))) - { - setLandingTab(dest); - } - else if (mLastTab && (x >= mLastTab->getRect().mRight)) - { - /* - * the condition dest == NULL can be satisfied not only in the case - * of dragging to the right from the last tab of the favbar. there is a - * small gap between each tab. if the user drags something exactly there - * then mLandingTab will be set to NULL and the dragged item will be pushed - * to the end of the favorites bar. this is incorrect behavior. that's why - * we need an additional check which excludes the case described previously - * making sure that the mouse pointer is beyond the last tab. - */ - setLandingTab(NULL); - } - - // check if we are dragging an existing item from the favorites bar + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + *accept = ACCEPT_NO; + + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + if (LLToolDragAndDrop::SOURCE_AGENT != source && LLToolDragAndDrop::SOURCE_LIBRARY != source) return FALSE; + + switch (cargo_type) + { + + case DAD_LANDMARK: + { + /* + * add a callback to the end drag event. + * the callback will disconnet itself immediately after execution + * this is done because LLToolDragAndDrop is a common tool so it shouldn't + * be overloaded with redundant callbacks. + */ + if (!mEndDragConnection.connected()) + { + mEndDragConnection = LLToolDragAndDrop::getInstance()->setEndDragCallback(boost::bind(&LLFavoritesBarCtrl::onEndDrag, this)); + } + + // Copy the item into the favorites folder (if it's not already there). + LLInventoryItem *item = (LLInventoryItem *)cargo_data; + + if (LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(findChildByLocalCoords(x, y))) + { + setLandingTab(dest); + } + else if (mLastTab && (x >= mLastTab->getRect().mRight)) + { + /* + * the condition dest == NULL can be satisfied not only in the case + * of dragging to the right from the last tab of the favbar. there is a + * small gap between each tab. if the user drags something exactly there + * then mLandingTab will be set to NULL and the dragged item will be pushed + * to the end of the favorites bar. this is incorrect behavior. that's why + * we need an additional check which excludes the case described previously + * making sure that the mouse pointer is beyond the last tab. + */ + setLandingTab(NULL); + } + + // check if we are dragging an existing item from the favorites bar bool existing_drop = false; if (item && mDragItemId == item->getUUID()) { @@ -494,46 +494,46 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, } if (existing_drop) - { - *accept = ACCEPT_YES_SINGLE; - - showDragMarker(TRUE); - - if (drop) - { - handleExistingFavoriteDragAndDrop(x, y); - } - } - else - { - const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - if (item->getParentUUID() == favorites_id) - { - LL_WARNS("FavoritesBar") << "Attemt to copy a favorite item into the same folder." << LL_ENDL; - break; - } - - *accept = ACCEPT_YES_COPY_MULTI; - - showDragMarker(TRUE); - - if (drop) - { - if (mItems.empty()) - { - setLandingTab(NULL); + { + *accept = ACCEPT_YES_SINGLE; + + showDragMarker(TRUE); + + if (drop) + { + handleExistingFavoriteDragAndDrop(x, y); + } + } + else + { + const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + if (item->getParentUUID() == favorites_id) + { + LL_WARNS("FavoritesBar") << "Attemt to copy a favorite item into the same folder." << LL_ENDL; + break; + } + + *accept = ACCEPT_YES_COPY_MULTI; + + showDragMarker(TRUE); + + if (drop) + { + if (mItems.empty()) + { + setLandingTab(NULL); mLastTab = NULL; - } - handleNewFavoriteDragAndDrop(item, favorites_id, x, y); - } - } - } - break; - default: - break; - } - - return TRUE; + } + handleNewFavoriteDragAndDrop(item, favorites_id, x, y); + } + } + } + break; + default: + break; + } + + return TRUE; } void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y) @@ -544,159 +544,159 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y) return; } - // Identify the button hovered and the side to drop - LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); - bool insert_before = true; - if (!dest) - { - insert_before = false; - dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab); - } - - // There is no need to handle if an item was dragged onto itself - if (dest && dest->getLandmarkId() == mDragItemId) - { - return; - } - - // Insert the dragged item in the right place - if (dest) - { - LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId(), insert_before); - } - else - { - // This can happen when the item list is empty - mItems.push_back(gInventory.getItem(mDragItemId)); - } - - LLFavoritesOrderStorage::instance().saveItemsOrder(mItems); - - LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); - - if (menu && menu->getVisible()) - { - menu->setVisible(FALSE); - showDropDownMenu(); - } + // Identify the button hovered and the side to drop + LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); + bool insert_before = true; + if (!dest) + { + insert_before = false; + dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab); + } + + // There is no need to handle if an item was dragged onto itself + if (dest && dest->getLandmarkId() == mDragItemId) + { + return; + } + + // Insert the dragged item in the right place + if (dest) + { + LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId(), insert_before); + } + else + { + // This can happen when the item list is empty + mItems.push_back(gInventory.getItem(mDragItemId)); + } + + LLFavoritesOrderStorage::instance().saveItemsOrder(mItems); + + LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); + + if (menu && menu->getVisible()) + { + menu->setVisible(FALSE); + showDropDownMenu(); + } } void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, const LLUUID& favorites_id, S32 x, S32 y) { - // Identify the button hovered and the side to drop - LLFavoriteLandmarkButton* dest = NULL; - bool insert_before = true; - if (!mItems.empty()) - { - // [MAINT-2386] When multiple landmarks are selected and dragged onto an empty favorites bar, - // the viewer would crash when casting mLastTab below, as mLastTab is still null when the - // second landmark is being added. - // To ensure mLastTab is valid, we need to call updateButtons() at the end of this function - dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); - if (!dest) - { - insert_before = false; - dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab); - } - } - - // There is no need to handle if an item was dragged onto itself - if (dest && dest->getLandmarkId() == mDragItemId) - { - return; - } - - LLPointer<LLViewerInventoryItem> viewer_item = new LLViewerInventoryItem(item); - - // Insert the dragged item in the right place - if (dest) - { - insertItem(mItems, dest->getLandmarkId(), viewer_item, insert_before); - } - else - { - // This can happen when the item list is empty - mItems.push_back(viewer_item); - } - - int sortField = 0; - LLPointer<LLItemCopiedCallback> cb; + // Identify the button hovered and the side to drop + LLFavoriteLandmarkButton* dest = NULL; + bool insert_before = true; + if (!mItems.empty()) + { + // [MAINT-2386] When multiple landmarks are selected and dragged onto an empty favorites bar, + // the viewer would crash when casting mLastTab below, as mLastTab is still null when the + // second landmark is being added. + // To ensure mLastTab is valid, we need to call updateButtons() at the end of this function + dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); + if (!dest) + { + insert_before = false; + dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab); + } + } + + // There is no need to handle if an item was dragged onto itself + if (dest && dest->getLandmarkId() == mDragItemId) + { + return; + } + + LLPointer<LLViewerInventoryItem> viewer_item = new LLViewerInventoryItem(item); + + // Insert the dragged item in the right place + if (dest) + { + insertItem(mItems, dest->getLandmarkId(), viewer_item, insert_before); + } + else + { + // This can happen when the item list is empty + mItems.push_back(viewer_item); + } + + int sortField = 0; + LLPointer<LLItemCopiedCallback> cb; const F64 CALLBACK_WAIT_TIME = 30.f; sWaitingForCallabck = LLTimer::getTotalSeconds() + CALLBACK_WAIT_TIME; - // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field - for (LLInventoryModel::item_array_t::iterator i = mItems.begin(); i != mItems.end(); ++i) - { - LLViewerInventoryItem* currItem = *i; - - if (currItem->getUUID() == item->getUUID()) - { - cb = new LLItemCopiedCallback(++sortField); - } - else - { - LLFavoritesOrderStorage::instance().setSortIndex(currItem, ++sortField); - - currItem->setComplete(TRUE); - currItem->updateServer(FALSE); - - gInventory.updateItem(currItem); - } - } - - LLToolDragAndDrop* tool_dad = LLToolDragAndDrop::getInstance(); - if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD) - { - viewer_item->setType(LLAssetType::AT_LANDMARK); - copy_inventory_from_notecard(favorites_id, - tool_dad->getObjectID(), - tool_dad->getSourceID(), - viewer_item.get(), - gInventoryCallbacks.registerCB(cb)); - } - else - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - favorites_id, - std::string(), - cb); - } - - // [MAINT-2386] Ensure the favorite button has been created and is valid. - // This also ensures that mLastTab will be valid when dropping multiple - // landmarks to an empty favorites bar. - updateButtons(); - - LL_INFOS("FavoritesBar") << "Copied inventory item #" << item->getUUID() << " to favorites." << LL_ENDL; + // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field + for (LLInventoryModel::item_array_t::iterator i = mItems.begin(); i != mItems.end(); ++i) + { + LLViewerInventoryItem* currItem = *i; + + if (currItem->getUUID() == item->getUUID()) + { + cb = new LLItemCopiedCallback(++sortField); + } + else + { + LLFavoritesOrderStorage::instance().setSortIndex(currItem, ++sortField); + + currItem->setComplete(TRUE); + currItem->updateServer(FALSE); + + gInventory.updateItem(currItem); + } + } + + LLToolDragAndDrop* tool_dad = LLToolDragAndDrop::getInstance(); + if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD) + { + viewer_item->setType(LLAssetType::AT_LANDMARK); + copy_inventory_from_notecard(favorites_id, + tool_dad->getObjectID(), + tool_dad->getSourceID(), + viewer_item.get(), + gInventoryCallbacks.registerCB(cb)); + } + else + { + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + favorites_id, + std::string(), + cb); + } + + // [MAINT-2386] Ensure the favorite button has been created and is valid. + // This also ensures that mLastTab will be valid when dropping multiple + // landmarks to an empty favorites bar. + updateButtons(); + + LL_INFOS("FavoritesBar") << "Copied inventory item #" << item->getUUID() << " to favorites." << LL_ENDL; } //virtual void LLFavoritesBarCtrl::changed(U32 mask) { - if (mFavoriteFolderId.isNull()) - { - mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - - if (mFavoriteFolderId.notNull()) - { - gInventory.fetchDescendentsOf(mFavoriteFolderId); - } - } - else - { - LLInventoryModel::item_array_t items; - LLInventoryModel::cat_array_t cats; - LLIsType is_type(LLAssetType::AT_LANDMARK); - gInventory.collectDescendentsIf(mFavoriteFolderId, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - LLFavoritesOrderStorage::instance().getSLURL((*i)->getAssetUUID()); - } + if (mFavoriteFolderId.isNull()) + { + mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + + if (mFavoriteFolderId.notNull()) + { + gInventory.fetchDescendentsOf(mFavoriteFolderId); + } + } + else + { + LLInventoryModel::item_array_t items; + LLInventoryModel::cat_array_t cats; + LLIsType is_type(LLAssetType::AT_LANDMARK); + gInventory.collectDescendentsIf(mFavoriteFolderId, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + LLFavoritesOrderStorage::instance().getSLURL((*i)->getAssetUUID()); + } if (sWaitingForCallabck < LLTimer::getTotalSeconds()) { @@ -714,7 +714,7 @@ void LLFavoritesBarCtrl::changed(U32 mask) { mItemsListDirty = true; } - } + } } //virtual @@ -724,48 +724,48 @@ void LLFavoritesBarCtrl::reshape(S32 width, S32 height, BOOL called_from_parent) S32 delta_height = height - getRect().getHeight(); bool force_update = delta_width || delta_height || sForceReshape; - LLUICtrl::reshape(width, height, called_from_parent); - updateButtons(force_update); + LLUICtrl::reshape(width, height, called_from_parent); + updateButtons(force_update); } void LLFavoritesBarCtrl::draw() { - LLUICtrl::draw(); - - if (mShowDragMarker) - { - S32 w = mImageDragIndication->getWidth(); - S32 h = mImageDragIndication->getHeight(); - - if (mLandingTab) - { - // mouse pointer hovers over an existing tab - LLRect rect = mLandingTab->getRect(); - mImageDragIndication->draw(rect.mLeft, rect.getHeight(), w, h); - } - else if (mLastTab) - { - // mouse pointer hovers over the favbar empty space (right to the last tab) - LLRect rect = mLastTab->getRect(); - mImageDragIndication->draw(rect.mRight, rect.getHeight(), w, h); - } - // Once drawn, mark this false so we won't draw it again (unless we hit the favorite bar again) - mShowDragMarker = FALSE; - } - if (mItemsChangedTimer.getStarted()) - { - if (mItemsChangedTimer.getElapsedTimeF32() > 1.f) - { - LLFavoritesOrderStorage::instance().saveFavoritesRecord(); - mItemsChangedTimer.stop(); - } - } - - if(!mItemsChangedTimer.getStarted() && LLFavoritesOrderStorage::instance().mUpdateRequired) - { - LLFavoritesOrderStorage::instance().mUpdateRequired = false; - mItemsChangedTimer.start(); - } + LLUICtrl::draw(); + + if (mShowDragMarker) + { + S32 w = mImageDragIndication->getWidth(); + S32 h = mImageDragIndication->getHeight(); + + if (mLandingTab) + { + // mouse pointer hovers over an existing tab + LLRect rect = mLandingTab->getRect(); + mImageDragIndication->draw(rect.mLeft, rect.getHeight(), w, h); + } + else if (mLastTab) + { + // mouse pointer hovers over the favbar empty space (right to the last tab) + LLRect rect = mLastTab->getRect(); + mImageDragIndication->draw(rect.mRight, rect.getHeight(), w, h); + } + // Once drawn, mark this false so we won't draw it again (unless we hit the favorite bar again) + mShowDragMarker = FALSE; + } + if (mItemsChangedTimer.getStarted()) + { + if (mItemsChangedTimer.getElapsedTimeF32() > 1.f) + { + LLFavoritesOrderStorage::instance().saveFavoritesRecord(); + mItemsChangedTimer.stop(); + } + } + + if(!mItemsChangedTimer.getStarted() && LLFavoritesOrderStorage::instance().mUpdateRequired) + { + LLFavoritesOrderStorage::instance().mUpdateRequired = false; + mItemsChangedTimer.start(); + } if (mItemsListDirty && sWaitingForCallabck < LLTimer::getTotalSeconds()) { @@ -783,21 +783,21 @@ void LLFavoritesBarCtrl::draw() const LLButton::Params& LLFavoritesBarCtrl::getButtonParams() { - static LLButton::Params button_params; - static bool params_initialized = false; - - if (!params_initialized) - { - LLXMLNodePtr button_xml_node; - if(LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", button_xml_node)) - { - LLXUIParser parser; - parser.readXUI(button_xml_node, button_params, "favorites_bar_button.xml"); - } - params_initialized = true; - } - - return button_params; + static LLButton::Params button_params; + static bool params_initialized = false; + + if (!params_initialized) + { + LLXMLNodePtr button_xml_node; + if(LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", button_xml_node)) + { + LLXUIParser parser; + parser.readXUI(button_xml_node, button_params, "favorites_bar_button.xml"); + } + params_initialized = true; + } + + return button_params; } void LLFavoritesBarCtrl::updateButtons(bool force_update) @@ -808,45 +808,45 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update) } mItemsListDirty = false; - mItems.clear(); - - if (!collectFavoriteItems(mItems)) - { - return; - } - - if(mGetPrevItems && gInventory.isCategoryComplete(mFavoriteFolderId)) - { - for (LLInventoryModel::item_array_t::iterator it = mItems.begin(); it != mItems.end(); it++) - { - LLFavoritesOrderStorage::instance().mFavoriteNames[(*it)->getUUID()]= (*it)->getName(); - } - LLFavoritesOrderStorage::instance().mPrevFavorites = mItems; - mGetPrevItems = false; - - if (LLFavoritesOrderStorage::instance().isStorageUpdateNeeded()) - { - if (!mItemsChangedTimer.getStarted()) - { - mItemsChangedTimer.start(); - } - } - } - - const LLButton::Params& button_params = getButtonParams(); - - if(mItems.empty()) - { - mBarLabel->setVisible(TRUE); + mItems.clear(); + + if (!collectFavoriteItems(mItems)) + { + return; + } + + if(mGetPrevItems && gInventory.isCategoryComplete(mFavoriteFolderId)) + { + for (LLInventoryModel::item_array_t::iterator it = mItems.begin(); it != mItems.end(); it++) + { + LLFavoritesOrderStorage::instance().mFavoriteNames[(*it)->getUUID()]= (*it)->getName(); + } + LLFavoritesOrderStorage::instance().mPrevFavorites = mItems; + mGetPrevItems = false; + + if (LLFavoritesOrderStorage::instance().isStorageUpdateNeeded()) + { + if (!mItemsChangedTimer.getStarted()) + { + mItemsChangedTimer.start(); + } + } + } + + const LLButton::Params& button_params = getButtonParams(); + + if(mItems.empty()) + { + mBarLabel->setVisible(TRUE); mLastTab = NULL; - } - else - { - mBarLabel->setVisible(FALSE); - } - const child_list_t* childs = getChildList(); - child_list_const_iter_t child_it = childs->begin(); - int first_changed_item_index = 0; + } + else + { + mBarLabel->setVisible(FALSE); + } + const child_list_t* childs = getChildList(); + child_list_const_iter_t child_it = childs->begin(); + int first_changed_item_index = 0; if (!force_update) { //lets find first changed button @@ -870,65 +870,65 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update) child_it++; } } - // now first_changed_item_index should contains a number of button that need to change - - if (first_changed_item_index <= mItems.size()) - { - // Rebuild the buttons only - // child_list_t is a linked list, so safe to erase from the middle if we pre-increment the iterator - - while (child_it != childs->end()) - { - //lets remove other landmarks button and rebuild it - child_list_const_iter_t cur_it = child_it++; - LLFavoriteLandmarkButton* button = - dynamic_cast<LLFavoriteLandmarkButton*> (*cur_it); - if (button) - { + // now first_changed_item_index should contains a number of button that need to change + + if (first_changed_item_index <= mItems.size()) + { + // Rebuild the buttons only + // child_list_t is a linked list, so safe to erase from the middle if we pre-increment the iterator + + while (child_it != childs->end()) + { + //lets remove other landmarks button and rebuild it + child_list_const_iter_t cur_it = child_it++; + LLFavoriteLandmarkButton* button = + dynamic_cast<LLFavoriteLandmarkButton*> (*cur_it); + if (button) + { if (mLastTab == button) { mLastTab = NULL; } - removeChild(button); - delete button; - } - } - // we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning - // keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton - if (mMoreTextBox->getParent() == this) - { - removeChild(mMoreTextBox); - } - int last_right_edge = 0; - //calculate new buttons offset - if (getChildList()->size() > 0) - { - //find last visible child to get the rightest button offset - child_list_const_reverse_iter_t last_visible_it = - std::find_if( - childs->rbegin(), childs->rend(), - [](const child_list_t::value_type& child) - { return child->getVisible(); }); - if(last_visible_it != childs->rend()) - { - last_right_edge = (*last_visible_it)->getRect().mRight; - } - } - //last_right_edge is saving coordinates - LLButton* last_new_button = NULL; - int j = first_changed_item_index; - for (; j < mItems.size(); j++) - { - last_new_button = createButton(mItems[j], button_params, last_right_edge); - if (!last_new_button) - { - break; - } - sendChildToBack(last_new_button); - last_right_edge = last_new_button->getRect().mRight; - - mLastTab = last_new_button; - } + removeChild(button); + delete button; + } + } + // we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning + // keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton + if (mMoreTextBox->getParent() == this) + { + removeChild(mMoreTextBox); + } + int last_right_edge = 0; + //calculate new buttons offset + if (getChildList()->size() > 0) + { + //find last visible child to get the rightest button offset + child_list_const_reverse_iter_t last_visible_it = + std::find_if( + childs->rbegin(), childs->rend(), + [](const child_list_t::value_type& child) + { return child->getVisible(); }); + if(last_visible_it != childs->rend()) + { + last_right_edge = (*last_visible_it)->getRect().mRight; + } + } + //last_right_edge is saving coordinates + LLButton* last_new_button = NULL; + int j = first_changed_item_index; + for (; j < mItems.size(); j++) + { + last_new_button = createButton(mItems[j], button_params, last_right_edge); + if (!last_new_button) + { + break; + } + sendChildToBack(last_new_button); + last_right_edge = last_new_button->getRect().mRight; + + mLastTab = last_new_button; + } if (!mLastTab && mItems.size() > 0) { // mMoreTextBox was removed, so LLFavoriteLandmarkButtons @@ -940,348 +940,348 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update) } } - mFirstDropDownItem = j; - // Chevron button - if (mFirstDropDownItem < mItems.size()) - { - // if updateButton had been called it means: - //or there are some new favorites, or width had been changed - // so if we need to display chevron button, we must update dropdown items too. - mUpdateDropDownItems = true; - S32 buttonHGap = button_params.rect.left; // default value - LLRect rect; - // Chevron button should stay right aligned - rect.setOriginAndSize(getRect().mRight - mMoreTextBox->getRect().getWidth() - buttonHGap, 0, - mMoreTextBox->getRect().getWidth(), - mMoreTextBox->getRect().getHeight()); - - addChild(mMoreTextBox); - mMoreTextBox->setRect(rect); - mMoreTextBox->setVisible(TRUE); - } - // Update overflow menu - LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mOverflowMenuHandle.get()); - if (overflow_menu && overflow_menu->getVisible() && (overflow_menu->getItemCount() != mDropDownItemsCount)) - { - overflow_menu->setVisible(FALSE); - if (mUpdateDropDownItems) - { - showDropDownMenu(); - } - } - } - else - { - mUpdateDropDownItems = false; - } + mFirstDropDownItem = j; + // Chevron button + if (mFirstDropDownItem < mItems.size()) + { + // if updateButton had been called it means: + //or there are some new favorites, or width had been changed + // so if we need to display chevron button, we must update dropdown items too. + mUpdateDropDownItems = true; + S32 buttonHGap = button_params.rect.left; // default value + LLRect rect; + // Chevron button should stay right aligned + rect.setOriginAndSize(getRect().mRight - mMoreTextBox->getRect().getWidth() - buttonHGap, 0, + mMoreTextBox->getRect().getWidth(), + mMoreTextBox->getRect().getHeight()); + + addChild(mMoreTextBox); + mMoreTextBox->setRect(rect); + mMoreTextBox->setVisible(TRUE); + } + // Update overflow menu + LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mOverflowMenuHandle.get()); + if (overflow_menu && overflow_menu->getVisible() && (overflow_menu->getItemCount() != mDropDownItemsCount)) + { + overflow_menu->setVisible(FALSE); + if (mUpdateDropDownItems) + { + showDropDownMenu(); + } + } + } + else + { + mUpdateDropDownItems = false; + } } LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem> item, const LLButton::Params& button_params, S32 x_offset) { - S32 def_button_width = button_params.rect.width; - S32 button_x_delta = button_params.rect.left; // default value - S32 curr_x = x_offset; - - /** - * WORKAROUND: - * There are some problem with displaying of fonts in buttons. - * Empty space or ellipsis might be displayed instead of last symbols, even though the width of the button is enough. - * The problem disappears if we pad the button with 20 pixels. - */ - int required_width = mFont->getWidth(item->getName()) + 20; - int width = required_width > def_button_width? def_button_width : required_width; - LLFavoriteLandmarkButton* fav_btn = NULL; - - // do we have a place for next button + double buttonHGap + mMoreTextBox ? - if(curr_x + width + 2*button_x_delta + mMoreTextBox->getRect().getWidth() > getRect().mRight ) - { - return NULL; - } - LLButton::Params fav_btn_params(button_params); - fav_btn = LLUICtrlFactory::create<LLFavoriteLandmarkButton>(fav_btn_params); - if (NULL == fav_btn) - { - LL_WARNS("FavoritesBar") << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << LL_ENDL; - return NULL; - } - - addChild(fav_btn); - - LLRect butt_rect (fav_btn->getRect()); - fav_btn->setLandmarkID(item->getUUID()); - butt_rect.setOriginAndSize(curr_x + button_x_delta, fav_btn->getRect().mBottom, width, fav_btn->getRect().getHeight()); - - fav_btn->setRect(butt_rect); - // change only left and save bottom - fav_btn->setFont(mFont); - fav_btn->setLabel(item->getName()); - fav_btn->setToolTip(item->getName()); - fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); - fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 )); - - fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4)); - fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4)); - - return fav_btn; + S32 def_button_width = button_params.rect.width; + S32 button_x_delta = button_params.rect.left; // default value + S32 curr_x = x_offset; + + /** + * WORKAROUND: + * There are some problem with displaying of fonts in buttons. + * Empty space or ellipsis might be displayed instead of last symbols, even though the width of the button is enough. + * The problem disappears if we pad the button with 20 pixels. + */ + int required_width = mFont->getWidth(item->getName()) + 20; + int width = required_width > def_button_width? def_button_width : required_width; + LLFavoriteLandmarkButton* fav_btn = NULL; + + // do we have a place for next button + double buttonHGap + mMoreTextBox ? + if(curr_x + width + 2*button_x_delta + mMoreTextBox->getRect().getWidth() > getRect().mRight ) + { + return NULL; + } + LLButton::Params fav_btn_params(button_params); + fav_btn = LLUICtrlFactory::create<LLFavoriteLandmarkButton>(fav_btn_params); + if (NULL == fav_btn) + { + LL_WARNS("FavoritesBar") << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << LL_ENDL; + return NULL; + } + + addChild(fav_btn); + + LLRect butt_rect (fav_btn->getRect()); + fav_btn->setLandmarkID(item->getUUID()); + butt_rect.setOriginAndSize(curr_x + button_x_delta, fav_btn->getRect().mBottom, width, fav_btn->getRect().getHeight()); + + fav_btn->setRect(butt_rect); + // change only left and save bottom + fav_btn->setFont(mFont); + fav_btn->setLabel(item->getName()); + fav_btn->setToolTip(item->getName()); + fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); + fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 )); + + fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4)); + fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4)); + + return fav_btn; } BOOL LLFavoritesBarCtrl::postBuild() { - // make the popup menu available - LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_favorites.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - if (!menu) - { - menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu"); - } - menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor")); - mContextMenuHandle = menu->getHandle(); + // make the popup menu available + LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_favorites.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + if (!menu) + { + menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu"); + } + menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor")); + mContextMenuHandle = menu->getHandle(); - return TRUE; + return TRUE; } BOOL LLFavoritesBarCtrl::collectFavoriteItems(LLInventoryModel::item_array_t &items) { - if (mFavoriteFolderId.isNull()) - return FALSE; - + if (mFavoriteFolderId.isNull()) + return FALSE; - LLInventoryModel::cat_array_t cats; - LLIsType is_type(LLAssetType::AT_LANDMARK); - gInventory.collectDescendentsIf(mFavoriteFolderId, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + LLInventoryModel::cat_array_t cats; - std::sort(items.begin(), items.end(), LLFavoritesSort()); + LLIsType is_type(LLAssetType::AT_LANDMARK); + gInventory.collectDescendentsIf(mFavoriteFolderId, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - if (needToSaveItemsOrder(items)) - { - S32 sortField = 0; - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - LLFavoritesOrderStorage::instance().setSortIndex((*i), ++sortField); - } - LLFavoritesOrderStorage::instance().mSaveOnExit = true; - } + std::sort(items.begin(), items.end(), LLFavoritesSort()); - return TRUE; + if (needToSaveItemsOrder(items)) + { + S32 sortField = 0; + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + LLFavoritesOrderStorage::instance().setSortIndex((*i), ++sortField); + } + LLFavoritesOrderStorage::instance().mSaveOnExit = true; + } + + return TRUE; } void LLFavoritesBarCtrl::onMoreTextBoxClicked() { - LLUI::getInstance()->getMousePositionScreen(&mMouseX, &mMouseY); - showDropDownMenu(); + LLUI::getInstance()->getMousePositionScreen(&mMouseX, &mMouseY); + showDropDownMenu(); } void LLFavoritesBarCtrl::showDropDownMenu() { - if (mOverflowMenuHandle.isDead()) - { - createOverflowMenu(); - } - - LLToggleableMenu* menu = (LLToggleableMenu*)mOverflowMenuHandle.get(); - if (menu && menu->toggleVisibility()) - { - if (mUpdateDropDownItems) - { - updateMenuItems(menu); - } - - menu->buildDrawLabels(); - menu->updateParent(LLMenuGL::sMenuContainer); - menu->setButtonRect(mMoreTextBox->getRect(), this); - positionAndShowMenu(menu); - mDropDownItemsCount = menu->getItemCount(); - } + if (mOverflowMenuHandle.isDead()) + { + createOverflowMenu(); + } + + LLToggleableMenu* menu = (LLToggleableMenu*)mOverflowMenuHandle.get(); + if (menu && menu->toggleVisibility()) + { + if (mUpdateDropDownItems) + { + updateMenuItems(menu); + } + + menu->buildDrawLabels(); + menu->updateParent(LLMenuGL::sMenuContainer); + menu->setButtonRect(mMoreTextBox->getRect(), this); + positionAndShowMenu(menu); + mDropDownItemsCount = menu->getItemCount(); + } } void LLFavoritesBarCtrl::createOverflowMenu() { - LLToggleableMenu::Params menu_p; - menu_p.name("favorites menu"); - menu_p.can_tear_off(false); - menu_p.visible(false); - menu_p.scrollable(true); - menu_p.max_scrollable_items = 10; - menu_p.preferred_width = DROP_DOWN_MENU_WIDTH; + LLToggleableMenu::Params menu_p; + menu_p.name("favorites menu"); + menu_p.can_tear_off(false); + menu_p.visible(false); + menu_p.scrollable(true); + menu_p.max_scrollable_items = 10; + menu_p.preferred_width = DROP_DOWN_MENU_WIDTH; - LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p); - mOverflowMenuHandle = menu->getHandle(); + LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p); + mOverflowMenuHandle = menu->getHandle(); } void LLFavoritesBarCtrl::updateMenuItems(LLToggleableMenu* menu) { - menu->empty(); + menu->empty(); - U32 widest_item = 0; + U32 widest_item = 0; - for (S32 i = mFirstDropDownItem; i < mItems.size(); i++) - { - LLViewerInventoryItem* item = mItems.at(i); - const std::string& item_name = item->getName(); + for (S32 i = mFirstDropDownItem; i < mItems.size(); i++) + { + LLViewerInventoryItem* item = mItems.at(i); + const std::string& item_name = item->getName(); - LLFavoriteLandmarkMenuItem::Params item_params; - item_params.name(item_name); - item_params.label(item_name); - item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); + LLFavoriteLandmarkMenuItem::Params item_params; + item_params.name(item_name); + item_params.label(item_name); + item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); - LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params); - menu_item->initFavoritesBarPointer(this); - menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4)); - menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4)); - menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4)); - menu_item->setLandmarkID(item->getUUID()); + LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params); + menu_item->initFavoritesBarPointer(this); + menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4)); + menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4)); + menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4)); + menu_item->setLandmarkID(item->getUUID()); - fitLabelWidth(menu_item); + fitLabelWidth(menu_item); - widest_item = llmax(widest_item, menu_item->getNominalWidth()); + widest_item = llmax(widest_item, menu_item->getNominalWidth()); - menu->addChild(menu_item); - } + menu->addChild(menu_item); + } - addOpenLandmarksMenuItem(menu); - mUpdateDropDownItems = false; + addOpenLandmarksMenuItem(menu); + mUpdateDropDownItems = false; } void LLFavoritesBarCtrl::fitLabelWidth(LLMenuItemCallGL* menu_item) { - U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth()); - std::string item_name = menu_item->getName(); - - // Check whether item name wider than menu - if (menu_item->getNominalWidth() > max_width) - { - S32 chars_total = item_name.length(); - S32 chars_fitted = 1; - menu_item->setLabel(LLStringExplicit("")); - S32 label_space = max_width - menu_item->getFont()->getWidth("...") - - menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels) - - while (chars_fitted < chars_total - && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space) - { - chars_fitted++; - } - chars_fitted--; // Rolling back one char, that doesn't fit - - menu_item->setLabel(item_name.substr(0, chars_fitted) + "..."); - } + U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth()); + std::string item_name = menu_item->getName(); + + // Check whether item name wider than menu + if (menu_item->getNominalWidth() > max_width) + { + S32 chars_total = item_name.length(); + S32 chars_fitted = 1; + menu_item->setLabel(LLStringExplicit("")); + S32 label_space = max_width - menu_item->getFont()->getWidth("...") - + menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels) + + while (chars_fitted < chars_total + && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space) + { + chars_fitted++; + } + chars_fitted--; // Rolling back one char, that doesn't fit + + menu_item->setLabel(item_name.substr(0, chars_fitted) + "..."); + } } void LLFavoritesBarCtrl::addOpenLandmarksMenuItem(LLToggleableMenu* menu) { - std::string label_untrans = "Open landmarks"; - std::string label_transl; - bool translated = LLTrans::findString(label_transl, label_untrans); - - LLMenuItemCallGL::Params item_params; - item_params.name("open_my_landmarks"); - item_params.label(translated ? label_transl: label_untrans); - LLSD key; - key["type"] = "open_landmark_tab"; - item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", key)); - LLMenuItemCallGL* menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params); - - fitLabelWidth(menu_item); - - LLMenuItemSeparatorGL::Params sep_params; - sep_params.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor"); - sep_params.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor"); - sep_params.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor"); - sep_params.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor"); - LLMenuItemSeparatorGL* separator = LLUICtrlFactory::create<LLMenuItemSeparatorGL>(sep_params); - - menu->addChild(separator); - menu->addChild(menu_item); + std::string label_untrans = "Open landmarks"; + std::string label_transl; + bool translated = LLTrans::findString(label_transl, label_untrans); + + LLMenuItemCallGL::Params item_params; + item_params.name("open_my_landmarks"); + item_params.label(translated ? label_transl: label_untrans); + LLSD key; + key["type"] = "open_landmark_tab"; + item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", key)); + LLMenuItemCallGL* menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params); + + fitLabelWidth(menu_item); + + LLMenuItemSeparatorGL::Params sep_params; + sep_params.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor"); + sep_params.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor"); + sep_params.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor"); + sep_params.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor"); + LLMenuItemSeparatorGL* separator = LLUICtrlFactory::create<LLMenuItemSeparatorGL>(sep_params); + + menu->addChild(separator); + menu->addChild(menu_item); } void LLFavoritesBarCtrl::positionAndShowMenu(LLToggleableMenu* menu) { - U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth()); + U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth()); - S32 menu_x = getRect().getWidth() - max_width; - S32 menu_y = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD; + S32 menu_x = getRect().getWidth() - max_width; + S32 menu_y = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD; - // the menu should be offset of the right edge of the window - // so it's no covered by buttons in the right-side toolbar. - LLToolBar* right_toolbar = gToolBarView->getChild<LLToolBar>("toolbar_right"); - if (right_toolbar && right_toolbar->hasButtons()) - { - S32 toolbar_top = 0; + // the menu should be offset of the right edge of the window + // so it's no covered by buttons in the right-side toolbar. + LLToolBar* right_toolbar = gToolBarView->getChild<LLToolBar>("toolbar_right"); + if (right_toolbar && right_toolbar->hasButtons()) + { + S32 toolbar_top = 0; - if (LLView* top_border_panel = right_toolbar->getChild<LLView>("button_panel")) - { - toolbar_top = top_border_panel->calcScreenRect().mTop; - } + if (LLView* top_border_panel = right_toolbar->getChild<LLView>("button_panel")) + { + toolbar_top = top_border_panel->calcScreenRect().mTop; + } - // Calculating the bottom (in screen coord) of the drop down menu - S32 menu_top = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD; - S32 menu_bottom = menu_top - menu->getRect().getHeight(); - S32 menu_bottom_screen = 0; + // Calculating the bottom (in screen coord) of the drop down menu + S32 menu_top = getParent()->getRect().mBottom - DROP_DOWN_MENU_TOP_PAD; + S32 menu_bottom = menu_top - menu->getRect().getHeight(); + S32 menu_bottom_screen = 0; - localPointToScreen(0, menu_bottom, &menu_top, &menu_bottom_screen); + localPointToScreen(0, menu_bottom, &menu_top, &menu_bottom_screen); - if (menu_bottom_screen < toolbar_top) - { - menu_x -= right_toolbar->getRect().getWidth(); - } - } + if (menu_bottom_screen < toolbar_top) + { + menu_x -= right_toolbar->getRect().getWidth(); + } + } - LLMenuGL::showPopup(this, menu, menu_x, menu_y, mMouseX, mMouseY); + LLMenuGL::showPopup(this, menu, menu_x, menu_y, mMouseX, mMouseY); } void LLFavoritesBarCtrl::onButtonClick(LLUUID item_id) { - // We only have one Inventory, gInventory. Some day this should be better abstracted. - LLInvFVBridgeAction::doAction(item_id,&gInventory); + // We only have one Inventory, gInventory. Some day this should be better abstracted. + LLInvFVBridgeAction::doAction(item_id,&gInventory); } void LLFavoritesBarCtrl::onButtonRightClick( LLUUID item_id,LLView* fav_button,S32 x,S32 y,MASK mask) { - mSelectedItemID = item_id; - - LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get(); - if (!menu) - { - return; - } - - // Remember that the context menu was shown simultaneously with the overflow menu, - // so that we can restore the overflow menu when user clicks a context menu item - // (which hides the overflow menu). - { - LLView* overflow_menu = mOverflowMenuHandle.get(); - mRestoreOverflowMenu = overflow_menu && overflow_menu->getVisible(); - } - - // Release mouse capture so hover events go to the popup menu - // because this is happening during a mouse down. - gFocusMgr.setMouseCapture(NULL); - - menu->updateParent(LLMenuGL::sMenuContainer); - LLMenuGL::showPopup(fav_button, menu, x, y); + mSelectedItemID = item_id; + + LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get(); + if (!menu) + { + return; + } + + // Remember that the context menu was shown simultaneously with the overflow menu, + // so that we can restore the overflow menu when user clicks a context menu item + // (which hides the overflow menu). + { + LLView* overflow_menu = mOverflowMenuHandle.get(); + mRestoreOverflowMenu = overflow_menu && overflow_menu->getVisible(); + } + + // Release mouse capture so hover events go to the popup menu + // because this is happening during a mouse down. + gFocusMgr.setMouseCapture(NULL); + + menu->updateParent(LLMenuGL::sMenuContainer); + LLMenuGL::showPopup(fav_button, menu, x, y); } BOOL LLFavoritesBarCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) { - BOOL handled = childrenHandleRightMouseDown( x, y, mask) != NULL; - if(!handled && !gMenuHolder->hasVisibleMenu()) - { - show_navbar_context_menu(this,x,y); - handled = true; - } - - return handled; + BOOL handled = childrenHandleRightMouseDown( x, y, mask) != NULL; + if(!handled && !gMenuHolder->hasVisibleMenu()) + { + show_navbar_context_menu(this,x,y); + handled = true; + } + + return handled; } void copy_slurl_to_clipboard_cb(std::string& slurl) { - LLClipboard::instance().copyToClipboard(utf8str_to_wstring(slurl),0,slurl.size()); + LLClipboard::instance().copyToClipboard(utf8str_to_wstring(slurl),0,slurl.size()); - LLSD args; - args["SLURL"] = slurl; - LLNotificationsUtil::add("CopySLURL", args); + LLSD args; + args["SLURL"] = slurl; + LLNotificationsUtil::add("CopySLURL", args); } @@ -1303,48 +1303,48 @@ bool LLFavoritesBarCtrl::enableSelected(const LLSD& userdata) void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) { - std::string action = userdata.asString(); - LL_INFOS("FavoritesBar") << "Action = " << action << " Item = " << mSelectedItemID.asString() << LL_ENDL; - - LLViewerInventoryItem* item = gInventory.getItem(mSelectedItemID); - if (!item) - return; - - if (action == "open") - { - onButtonClick(item->getUUID()); - } - else if (action == "about") - { - LLSD key; - key["type"] = "landmark"; - key["id"] = mSelectedItemID; - - LLFloaterSidePanelContainer::showPanel("places", key); - } - else if (action == "copy_slurl") - { - LLVector3d posGlobal; - LLLandmarkActions::getLandmarkGlobalPos(mSelectedItemID, posGlobal); - - if (!posGlobal.isExactlyZero()) - { - LLLandmarkActions::getSLURLfromPosGlobal(posGlobal, copy_slurl_to_clipboard_cb); - } - } - else if (action == "show_on_map") - { - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - - LLVector3d posGlobal; - LLLandmarkActions::getLandmarkGlobalPos(mSelectedItemID, posGlobal); - - if (!posGlobal.isExactlyZero() && worldmap_instance) - { - worldmap_instance->trackLocation(posGlobal); - LLFloaterReg::showInstance("world_map", "center"); - } - } + std::string action = userdata.asString(); + LL_INFOS("FavoritesBar") << "Action = " << action << " Item = " << mSelectedItemID.asString() << LL_ENDL; + + LLViewerInventoryItem* item = gInventory.getItem(mSelectedItemID); + if (!item) + return; + + if (action == "open") + { + onButtonClick(item->getUUID()); + } + else if (action == "about") + { + LLSD key; + key["type"] = "landmark"; + key["id"] = mSelectedItemID; + + LLFloaterSidePanelContainer::showPanel("places", key); + } + else if (action == "copy_slurl") + { + LLVector3d posGlobal; + LLLandmarkActions::getLandmarkGlobalPos(mSelectedItemID, posGlobal); + + if (!posGlobal.isExactlyZero()) + { + LLLandmarkActions::getSLURLfromPosGlobal(posGlobal, copy_slurl_to_clipboard_cb); + } + } + else if (action == "show_on_map") + { + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + + LLVector3d posGlobal; + LLLandmarkActions::getLandmarkGlobalPos(mSelectedItemID, posGlobal); + + if (!posGlobal.isExactlyZero() && worldmap_instance) + { + worldmap_instance->trackLocation(posGlobal); + LLFloaterReg::showInstance("world_map", "center"); + } + } else if (action == "create_pick") { LLSD args; @@ -1352,21 +1352,21 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) args["item_id"] = item->getUUID(); LLFloaterSidePanelContainer::showPanel("places", args); } - else if (action == "cut") - { - } - else if (action == "copy") - { - LLClipboard::instance().copyToClipboard(mSelectedItemID, LLAssetType::AT_LANDMARK); - } - else if (action == "paste") - { - pasteFromClipboard(); - } - else if (action == "delete") - { - gInventory.removeItem(mSelectedItemID); - } + else if (action == "cut") + { + } + else if (action == "copy") + { + LLClipboard::instance().copyToClipboard(mSelectedItemID, LLAssetType::AT_LANDMARK); + } + else if (action == "paste") + { + pasteFromClipboard(); + } + else if (action == "delete") + { + gInventory.removeItem(mSelectedItemID); + } else if (action == "rename") { LLSD args; @@ -1377,20 +1377,20 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) LLNotificationsUtil::add("RenameLandmark", args, payload, boost::bind(onRenameCommit, _1, _2)); } - else if (action == "move_to_landmarks") - { - change_item_parent(mSelectedItemID, gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK)); - } - - // Pop-up the overflow menu again (it gets hidden whenever the user clicks a context menu item). - // See EXT-4217 and STORM-207. - LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); - if (mRestoreOverflowMenu && menu && !menu->getVisible()) - { - menu->resetScrollPositionOnShow(false); - showDropDownMenu(); - menu->resetScrollPositionOnShow(true); - } + else if (action == "move_to_landmarks") + { + change_item_parent(mSelectedItemID, gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK)); + } + + // Pop-up the overflow menu again (it gets hidden whenever the user clicks a context menu item). + // See EXT-4217 and STORM-207. + LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); + if (mRestoreOverflowMenu && menu && !menu->getVisible()) + { + menu->resetScrollPositionOnShow(false); + showDropDownMenu(); + menu->resetScrollPositionOnShow(true); + } } bool LLFavoritesBarCtrl::onRenameCommit(const LLSD& notification, const LLSD& response) @@ -1417,183 +1417,183 @@ bool LLFavoritesBarCtrl::onRenameCommit(const LLSD& notification, const LLSD& re BOOL LLFavoritesBarCtrl::isClipboardPasteable() const { - if (!LLClipboard::instance().hasContents()) - { - return FALSE; - } - - std::vector<LLUUID> objects; - LLClipboard::instance().pasteFromClipboard(objects); - S32 count = objects.size(); - for(S32 i = 0; i < count; i++) - { - const LLUUID &item_id = objects.at(i); - - // Can't paste folders - const LLInventoryCategory *cat = gInventory.getCategory(item_id); - if (cat) - { - return FALSE; - } - - const LLInventoryItem *item = gInventory.getItem(item_id); - if (item && LLAssetType::AT_LANDMARK != item->getType()) - { - return FALSE; - } - } - return TRUE; + if (!LLClipboard::instance().hasContents()) + { + return FALSE; + } + + std::vector<LLUUID> objects; + LLClipboard::instance().pasteFromClipboard(objects); + S32 count = objects.size(); + for(S32 i = 0; i < count; i++) + { + const LLUUID &item_id = objects.at(i); + + // Can't paste folders + const LLInventoryCategory *cat = gInventory.getCategory(item_id); + if (cat) + { + return FALSE; + } + + const LLInventoryItem *item = gInventory.getItem(item_id); + if (item && LLAssetType::AT_LANDMARK != item->getType()) + { + return FALSE; + } + } + return TRUE; } void LLFavoritesBarCtrl::pasteFromClipboard() const { - LLInventoryModel* model = &gInventory; - if(model && isClipboardPasteable()) - { - LLInventoryItem* item = NULL; - std::vector<LLUUID> objects; - LLClipboard::instance().pasteFromClipboard(objects); - S32 count = objects.size(); - LLUUID parent_id(mFavoriteFolderId); - for(S32 i = 0; i < count; i++) - { - item = model->getItem(objects.at(i)); - if (item) - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - parent_id, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - } - } + LLInventoryModel* model = &gInventory; + if(model && isClipboardPasteable()) + { + LLInventoryItem* item = NULL; + std::vector<LLUUID> objects; + LLClipboard::instance().pasteFromClipboard(objects); + S32 count = objects.size(); + LLUUID parent_id(mFavoriteFolderId); + for(S32 i = 0; i < count; i++) + { + item = model->getItem(objects.at(i)); + if (item) + { + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + parent_id, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + } + } } void LLFavoritesBarCtrl::onButtonMouseDown(LLUUID id, LLUICtrl* ctrl, S32 x, S32 y, MASK mask) { - // EXT-6997 (Fav bar: Pop-up menu for LM in overflow dropdown is kept after LM was dragged away) - // mContextMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu. - // We have to check and set visibility of pop-up menu in such a way instead of using - // LLMenuHolderGL::hideMenus() because it will close both menus(dropdown and pop-up), but - // we need to close only pop-up menu while dropdown one should be still opened. - LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get(); - if(menu && menu->getVisible()) - { - menu->setVisible(FALSE); - } + // EXT-6997 (Fav bar: Pop-up menu for LM in overflow dropdown is kept after LM was dragged away) + // mContextMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu. + // We have to check and set visibility of pop-up menu in such a way instead of using + // LLMenuHolderGL::hideMenus() because it will close both menus(dropdown and pop-up), but + // we need to close only pop-up menu while dropdown one should be still opened. + LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get(); + if(menu && menu->getVisible()) + { + menu->setVisible(FALSE); + } - mDragItemId = id; - mStartDrag = TRUE; + mDragItemId = id; + mStartDrag = TRUE; - S32 screenX, screenY; - localPointToScreen(x, y, &screenX, &screenY); + S32 screenX, screenY; + localPointToScreen(x, y, &screenX, &screenY); - LLToolDragAndDrop::getInstance()->setDragStart(screenX, screenY); + LLToolDragAndDrop::getInstance()->setDragStart(screenX, screenY); } void LLFavoritesBarCtrl::onButtonMouseUp(LLUUID id, LLUICtrl* ctrl, S32 x, S32 y, MASK mask) { - mStartDrag = FALSE; - mDragItemId = LLUUID::null; + mStartDrag = FALSE; + mDragItemId = LLUUID::null; } void LLFavoritesBarCtrl::onEndDrag() { - mEndDragConnection.disconnect(); + mEndDragConnection.disconnect(); - showDragMarker(FALSE); - mDragItemId = LLUUID::null; - LLView::getWindow()->setCursor(UI_CURSOR_ARROW); + showDragMarker(FALSE); + mDragItemId = LLUUID::null; + LLView::getWindow()->setCursor(UI_CURSOR_ARROW); } BOOL LLFavoritesBarCtrl::handleHover(S32 x, S32 y, MASK mask) { - if (mDragItemId != LLUUID::null && mStartDrag) - { - S32 screenX, screenY; - localPointToScreen(x, y, &screenX, &screenY); + if (mDragItemId != LLUUID::null && mStartDrag) + { + S32 screenX, screenY; + localPointToScreen(x, y, &screenX, &screenY); - if(LLToolDragAndDrop::getInstance()->isOverThreshold(screenX, screenY)) - { - LLToolDragAndDrop::getInstance()->beginDrag( - DAD_LANDMARK, mDragItemId, - LLToolDragAndDrop::SOURCE_LIBRARY); + if(LLToolDragAndDrop::getInstance()->isOverThreshold(screenX, screenY)) + { + LLToolDragAndDrop::getInstance()->beginDrag( + DAD_LANDMARK, mDragItemId, + LLToolDragAndDrop::SOURCE_LIBRARY); - mStartDrag = FALSE; + mStartDrag = FALSE; - return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask); - } - } + return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask); + } + } - return TRUE; + return TRUE; } LLUICtrl* LLFavoritesBarCtrl::findChildByLocalCoords(S32 x, S32 y) { - LLUICtrl* ctrl = NULL; - const child_list_t* list = getChildList(); - - for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i) - { - // Look only for children that are favorite buttons - if ((*i)->getName() == "favorites_bar_btn") - { - LLRect rect = (*i)->getRect(); - // We consider a button hit if the cursor is left of the right side - // This makes the hit a bit less finicky than hitting directly on the button itself - if (x <= rect.mRight) - { - ctrl = dynamic_cast<LLUICtrl*>(*i); - break; - } - } - } - return ctrl; + LLUICtrl* ctrl = NULL; + const child_list_t* list = getChildList(); + + for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i) + { + // Look only for children that are favorite buttons + if ((*i)->getName() == "favorites_bar_btn") + { + LLRect rect = (*i)->getRect(); + // We consider a button hit if the cursor is left of the right side + // This makes the hit a bit less finicky than hitting directly on the button itself + if (x <= rect.mRight) + { + ctrl = dynamic_cast<LLUICtrl*>(*i); + break; + } + } + } + return ctrl; } BOOL LLFavoritesBarCtrl::needToSaveItemsOrder(const LLInventoryModel::item_array_t& items) { - BOOL result = FALSE; + BOOL result = FALSE; - // if there is an item without sort order field set, we need to save items order - for (LLInventoryModel::item_array_t::const_iterator i = items.begin(); i != items.end(); ++i) - { - if (LLFavoritesOrderStorage::instance().getSortIndex((*i)->getUUID()) < 0) - { - result = TRUE; - break; - } - } + // if there is an item without sort order field set, we need to save items order + for (LLInventoryModel::item_array_t::const_iterator i = items.begin(); i != items.end(); ++i) + { + if (LLFavoritesOrderStorage::instance().getSortIndex((*i)->getUUID()) < 0) + { + result = TRUE; + break; + } + } - return result; + return result; } void LLFavoritesBarCtrl::insertItem(LLInventoryModel::item_array_t& items, const LLUUID& dest_item_id, LLViewerInventoryItem* insertedItem, bool insert_before) { - // Get the iterator to the destination item - LLInventoryModel::item_array_t::iterator it_dest = LLInventoryModel::findItemIterByUUID(items, dest_item_id); - if (it_dest == items.end()) - return; - - // Go to the next element if one wishes to insert after the dest element - if (!insert_before) - { - ++it_dest; - } - - // Insert the source item in the right place - if (it_dest != items.end()) - { - items.insert(it_dest, insertedItem); - } - else - { - // Append to the list if it_dest reached the end - items.push_back(insertedItem); - } + // Get the iterator to the destination item + LLInventoryModel::item_array_t::iterator it_dest = LLInventoryModel::findItemIterByUUID(items, dest_item_id); + if (it_dest == items.end()) + return; + + // Go to the next element if one wishes to insert after the dest element + if (!insert_before) + { + ++it_dest; + } + + // Insert the source item in the right place + if (it_dest != items.end()) + { + items.insert(it_dest, insertedItem); + } + else + { + // Append to the list if it_dest reached the end + items.push_back(insertedItem); + } } const std::string LLFavoritesOrderStorage::SORTING_DATA_FILE_NAME = "landmarks_sorting.xml"; @@ -1602,40 +1602,40 @@ bool LLFavoritesOrderStorage::mSaveOnExit = false; void LLFavoritesOrderStorage::setSortIndex(const LLViewerInventoryItem* inv_item, S32 sort_index) { - mSortIndexes[inv_item->getUUID()] = sort_index; - mIsDirty = true; - getSLURL(inv_item->getAssetUUID()); + mSortIndexes[inv_item->getUUID()] = sort_index; + mIsDirty = true; + getSLURL(inv_item->getAssetUUID()); } S32 LLFavoritesOrderStorage::getSortIndex(const LLUUID& inv_item_id) { - sort_index_map_t::const_iterator it = mSortIndexes.find(inv_item_id); - if (it != mSortIndexes.end()) - { - return it->second; - } - return NO_INDEX; + sort_index_map_t::const_iterator it = mSortIndexes.find(inv_item_id); + if (it != mSortIndexes.end()) + { + return it->second; + } + return NO_INDEX; } void LLFavoritesOrderStorage::removeSortIndex(const LLUUID& inv_item_id) { - mSortIndexes.erase(inv_item_id); - mIsDirty = true; + mSortIndexes.erase(inv_item_id); + mIsDirty = true; } void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id) { - slurls_map_t::iterator slurl_iter = mSLURLs.find(asset_id); - if (slurl_iter != mSLURLs.end()) return; // SLURL for current landmark is already cached + slurls_map_t::iterator slurl_iter = mSLURLs.find(asset_id); + if (slurl_iter != mSLURLs.end()) return; // SLURL for current landmark is already cached - LLLandmark* lm = gLandmarkList.getAsset(asset_id, - boost::bind(&LLFavoritesOrderStorage::onLandmarkLoaded, this, asset_id, _1)); - if (lm) - { + LLLandmark* lm = gLandmarkList.getAsset(asset_id, + boost::bind(&LLFavoritesOrderStorage::onLandmarkLoaded, this, asset_id, _1)); + if (lm) + { LL_DEBUGS("FavoritesBar") << "landmark for " << asset_id << " already loaded" << LL_ENDL; - onLandmarkLoaded(asset_id, lm); - } - return; + onLandmarkLoaded(asset_id, lm); + } + return; } // static @@ -1660,112 +1660,112 @@ std::string LLFavoritesOrderStorage::getStoredFavoritesFilename() // static void LLFavoritesOrderStorage::destroyClass() { - LLFavoritesOrderStorage::instance().cleanup(); + LLFavoritesOrderStorage::instance().cleanup(); - std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); - llifstream file; - file.open(old_filename.c_str()); - if (file.is_open()) - { + std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + llifstream file; + file.open(old_filename.c_str()); + if (file.is_open()) + { file.close(); - std::string new_filename = getStoredFavoritesFilename(); + std::string new_filename = getStoredFavoritesFilename(); LL_INFOS("FavoritesBar") << "moving favorites from old name '" << old_filename << "' to new name '" << new_filename << "'" << LL_ENDL; - LLFile::copy(old_filename,new_filename); - LLFile::remove(old_filename); - } - - std::string filename = getSavedOrderFileName(); - file.open(filename.c_str()); - if (file.is_open()) - { - file.close(); - LLFile::remove(filename); - } - if(mSaveOnExit || gSavedSettings.getBOOL("UpdateRememberPasswordSetting")) - { - LLFavoritesOrderStorage::instance().saveFavoritesRecord(true); - } + LLFile::copy(old_filename,new_filename); + LLFile::remove(old_filename); + } + + std::string filename = getSavedOrderFileName(); + file.open(filename.c_str()); + if (file.is_open()) + { + file.close(); + LLFile::remove(filename); + } + if(mSaveOnExit || gSavedSettings.getBOOL("UpdateRememberPasswordSetting")) + { + LLFavoritesOrderStorage::instance().saveFavoritesRecord(true); + } } std::string LLFavoritesOrderStorage::getSavedOrderFileName() { - // If we quit from the login screen we will not have an SL account - // name. Don't try to save, otherwise we'll dump a file in - // C:\Program Files\SecondLife\ or similar. JC - std::string user_dir = gDirUtilp->getLindenUserDir(); + // If we quit from the login screen we will not have an SL account + // name. Don't try to save, otherwise we'll dump a file in + // C:\Program Files\SecondLife\ or similar. JC + std::string user_dir = gDirUtilp->getLindenUserDir(); return (user_dir.empty() ? "" : gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME)); } void LLFavoritesOrderStorage::load() { - std::string filename = getSavedOrderFileName(); - LLSD settings_llsd; - llifstream file; - file.open(filename.c_str()); - if (file.is_open()) - { - LLSDSerialize::fromXML(settings_llsd, file); - LL_INFOS("FavoritesBar") << "loaded favorites order from '" << filename << "' " - << (settings_llsd.isMap() ? "" : "un") << "successfully" - << LL_ENDL; - file.close(); - mSaveOnExit = true; - - for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); - iter != settings_llsd.endMap(); ++iter) - { - mSortIndexes.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger())); - } - } - else - { - filename = getStoredFavoritesFilename(); - if (!filename.empty()) - { - llifstream in_file; - in_file.open(filename.c_str()); - LLSD fav_llsd; - if (in_file.is_open()) - { - LLSDSerialize::fromXML(fav_llsd, in_file); - LL_INFOS("FavoritesBar") << "loaded favorites from '" << filename << "' " - << (fav_llsd.isMap() ? "" : "un") << "successfully" - << LL_ENDL; - in_file.close(); - if (fav_llsd.isMap() && fav_llsd.has(gAgentUsername)) - { - mStorageFavorites = fav_llsd[gAgentUsername]; - - S32 index = 0; - bool needs_validation = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"); - for (LLSD::array_iterator iter = mStorageFavorites.beginArray(); - iter != mStorageFavorites.endArray(); ++iter) - { - // Validation - LLUUID fv_id = iter->get("id").asUUID(); - if (needs_validation - && (fv_id.isNull() - || iter->get("asset_id").asUUID().isNull() - || iter->get("name").asString().empty() - || iter->get("slurl").asString().empty())) - { - mRecreateFavoriteStorage = true; - } - - mSortIndexes.insert(std::make_pair(fv_id, index)); - index++; - } - } - } - else - { - LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL; - } - } - } + std::string filename = getSavedOrderFileName(); + LLSD settings_llsd; + llifstream file; + file.open(filename.c_str()); + if (file.is_open()) + { + LLSDSerialize::fromXML(settings_llsd, file); + LL_INFOS("FavoritesBar") << "loaded favorites order from '" << filename << "' " + << (settings_llsd.isMap() ? "" : "un") << "successfully" + << LL_ENDL; + file.close(); + mSaveOnExit = true; + + for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); + iter != settings_llsd.endMap(); ++iter) + { + mSortIndexes.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger())); + } + } + else + { + filename = getStoredFavoritesFilename(); + if (!filename.empty()) + { + llifstream in_file; + in_file.open(filename.c_str()); + LLSD fav_llsd; + if (in_file.is_open()) + { + LLSDSerialize::fromXML(fav_llsd, in_file); + LL_INFOS("FavoritesBar") << "loaded favorites from '" << filename << "' " + << (fav_llsd.isMap() ? "" : "un") << "successfully" + << LL_ENDL; + in_file.close(); + if (fav_llsd.isMap() && fav_llsd.has(gAgentUsername)) + { + mStorageFavorites = fav_llsd[gAgentUsername]; + + S32 index = 0; + bool needs_validation = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"); + for (LLSD::array_iterator iter = mStorageFavorites.beginArray(); + iter != mStorageFavorites.endArray(); ++iter) + { + // Validation + LLUUID fv_id = iter->get("id").asUUID(); + if (needs_validation + && (fv_id.isNull() + || iter->get("asset_id").asUUID().isNull() + || iter->get("name").asString().empty() + || iter->get("slurl").asString().empty())) + { + mRecreateFavoriteStorage = true; + } + + mSortIndexes.insert(std::make_pair(fv_id, index)); + index++; + } + } + } + else + { + LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL; + } + } + } } // static @@ -1828,7 +1828,7 @@ void LLFavoritesOrderStorage::removeFavoritesRecordOfUser(const std::string &use // static void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() { - std::string filename = getStoredFavoritesFilename(); + std::string filename = getStoredFavoritesFilename(); if (!filename.empty()) { LLSD fav_llsd; @@ -1838,39 +1838,39 @@ void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() { LLSDSerialize::fromXML(fav_llsd, file); file.close(); - + LLAvatarName av_name; LLAvatarNameCache::get( gAgentID, &av_name ); // Note : use the "John Doe" and not the "john.doe" version of the name. // See saveFavoritesSLURLs() here above for the reason why. if (fav_llsd.has(av_name.getUserName())) { - LLSD user_llsd = fav_llsd[av_name.getUserName()]; - - if ((user_llsd.beginArray()!= user_llsd.endArray()) && user_llsd.beginArray()->has("id")) - { - for (LLSD::array_iterator iter = user_llsd.beginArray();iter != user_llsd.endArray(); ++iter) - { - LLSD value; - value["id"]= iter->get("id").asUUID(); - iter->assign(value); - } - fav_llsd[av_name.getUserName()] = user_llsd; - llofstream file; - file.open(filename.c_str()); - if ( file.is_open() ) - { - LLSDSerialize::toPrettyXML(fav_llsd, file); - file.close(); - } - } - else - { - LL_INFOS("FavoritesBar") << "Removed favorites for " << av_name.getUserName() << LL_ENDL; - fav_llsd.erase(av_name.getUserName()); - } + LLSD user_llsd = fav_llsd[av_name.getUserName()]; + + if ((user_llsd.beginArray()!= user_llsd.endArray()) && user_llsd.beginArray()->has("id")) + { + for (LLSD::array_iterator iter = user_llsd.beginArray();iter != user_llsd.endArray(); ++iter) + { + LLSD value; + value["id"]= iter->get("id").asUUID(); + iter->assign(value); + } + fav_llsd[av_name.getUserName()] = user_llsd; + llofstream file; + file.open(filename.c_str()); + if ( file.is_open() ) + { + LLSDSerialize::toPrettyXML(fav_llsd, file); + file.close(); + } + } + else + { + LL_INFOS("FavoritesBar") << "Removed favorites for " << av_name.getUserName() << LL_ENDL; + fav_llsd.erase(av_name.getUserName()); + } } - + llofstream out_file; out_file.open(filename.c_str()); if ( out_file.is_open() ) @@ -1886,97 +1886,97 @@ void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark) { - if (landmark) + if (landmark) { LL_DEBUGS("FavoritesBar") << "landmark for " << asset_id << " loaded" << LL_ENDL; LLVector3d pos_global; if (!landmark->getGlobalPos(pos_global)) { - // If global position was unknown on first getGlobalPos() call - // it should be set for the subsequent calls. - landmark->getGlobalPos(pos_global); + // If global position was unknown on first getGlobalPos() call + // it should be set for the subsequent calls. + landmark->getGlobalPos(pos_global); } if (!pos_global.isExactlyZero()) { - LL_DEBUGS("FavoritesBar") << "requesting slurl for landmark " << asset_id << LL_ENDL; - LLLandmarkActions::getSLURLfromPosGlobal(pos_global, - boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1)); + LL_DEBUGS("FavoritesBar") << "requesting slurl for landmark " << asset_id << LL_ENDL; + LLLandmarkActions::getSLURLfromPosGlobal(pos_global, + boost::bind(&LLFavoritesOrderStorage::storeFavoriteSLURL, this, asset_id, _1)); } } } void LLFavoritesOrderStorage::storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl) { - LL_DEBUGS("FavoritesBar") << "Saving landmark SLURL '" << slurl << "' for " << asset_id << LL_ENDL; - mSLURLs[asset_id] = slurl; + LL_DEBUGS("FavoritesBar") << "Saving landmark SLURL '" << slurl << "' for " << asset_id << LL_ENDL; + mSLURLs[asset_id] = slurl; } void LLFavoritesOrderStorage::cleanup() { - // nothing to clean - if (!mIsDirty) return; + // nothing to clean + if (!mIsDirty) return; - const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH); + const LLUUID fav_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + gInventory.collectDescendents(fav_id, cats, items, LLInventoryModel::EXCLUDE_TRASH); - IsNotInFavorites is_not_in_fav(items); + IsNotInFavorites is_not_in_fav(items); - sort_index_map_t aTempMap; - //copy unremoved values from mSortIndexes to aTempMap - std::remove_copy_if(mSortIndexes.begin(), mSortIndexes.end(), - inserter(aTempMap, aTempMap.begin()), - is_not_in_fav); + sort_index_map_t aTempMap; + //copy unremoved values from mSortIndexes to aTempMap + std::remove_copy_if(mSortIndexes.begin(), mSortIndexes.end(), + inserter(aTempMap, aTempMap.begin()), + is_not_in_fav); - //Swap the contents of mSortIndexes and aTempMap - mSortIndexes.swap(aTempMap); + //Swap the contents of mSortIndexes and aTempMap + mSortIndexes.swap(aTempMap); } // See also LLInventorySort where landmarks in the Favorites folder are sorted. class LLViewerInventoryItemSort { public: - bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b) - { - return LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID()) - < LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID()); - } + bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b) + { + return LLFavoritesOrderStorage::instance().getSortIndex(a->getUUID()) + < LLFavoritesOrderStorage::instance().getSortIndex(b->getUUID()); + } }; void LLFavoritesOrderStorage::saveOrder() { - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - LLIsType is_type(LLAssetType::AT_LANDMARK); - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - std::sort(items.begin(), items.end(), LLViewerInventoryItemSort()); - saveItemsOrder(items); + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsType is_type(LLAssetType::AT_LANDMARK); + LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + std::sort(items.begin(), items.end(), LLViewerInventoryItemSort()); + saveItemsOrder(items); } void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array_t& items ) { - int sortField = 0; - // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field - for (LLInventoryModel::item_array_t::const_iterator i = items.begin(); i != items.end(); ++i) - { - LLViewerInventoryItem* item = *i; + int sortField = 0; + // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field + for (LLInventoryModel::item_array_t::const_iterator i = items.begin(); i != items.end(); ++i) + { + LLViewerInventoryItem* item = *i; - setSortIndex(item, ++sortField); + setSortIndex(item, ++sortField); - item->setComplete(TRUE); - item->updateServer(FALSE); + item->setComplete(TRUE); + item->updateServer(FALSE); - gInventory.updateItem(item); + gInventory.updateItem(item); - // Tell the parent folder to refresh its sort order. - gInventory.addChangedMask(LLInventoryObserver::SORT, item->getParentUUID()); - } + // Tell the parent folder to refresh its sort order. + gInventory.addChangedMask(LLInventoryObserver::SORT, item->getParentUUID()); + } - gInventory.notifyObservers(); + gInventory.notifyObservers(); } @@ -1984,184 +1984,184 @@ void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array // * @param target_item_id - LLUUID of the target item before which source item should be placed. void LLFavoritesOrderStorage::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id) { - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - LLIsType is_type(LLAssetType::AT_LANDMARK); - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsType is_type(LLAssetType::AT_LANDMARK); + LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - // ensure items are sorted properly before changing order. EXT-3498 - std::sort(items.begin(), items.end(), LLViewerInventoryItemSort()); + // ensure items are sorted properly before changing order. EXT-3498 + std::sort(items.begin(), items.end(), LLViewerInventoryItemSort()); - // update order - gInventory.updateItemsOrder(items, source_item_id, target_item_id); + // update order + gInventory.updateItemsOrder(items, source_item_id, target_item_id); - saveItemsOrder(items); + saveItemsOrder(items); } BOOL LLFavoritesOrderStorage::saveFavoritesRecord(bool pref_changed) { - pref_changed |= mRecreateFavoriteStorage; - mRecreateFavoriteStorage = false; - - // Can get called before inventory is done initializing. - if (!gInventory.isInventoryUsable()) - { - return FALSE; - } - - LLUUID favorite_folder= gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - if (favorite_folder.isNull()) - { - return FALSE; - } - - LLInventoryModel::item_array_t items; - LLInventoryModel::cat_array_t cats; - - LLIsType is_type(LLAssetType::AT_LANDMARK); - gInventory.collectDescendentsIf(favorite_folder, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - - std::sort(items.begin(), items.end(), LLFavoritesSort()); - bool name_changed = false; - - for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++) - { - if(mFavoriteNames[(*it)->getUUID()] != ((*it)->getName())) - { - mFavoriteNames[(*it)->getUUID()] = (*it)->getName(); - name_changed = true; - } - } - - for (std::set<LLUUID>::iterator it = mMissingSLURLs.begin(); it != mMissingSLURLs.end(); it++) - { - slurls_map_t::iterator slurl_iter = mSLURLs.find(*it); - if (slurl_iter != mSLURLs.end()) - { - pref_changed = true; - break; - } - } - - if((items != mPrevFavorites) || name_changed || pref_changed || gSavedSettings.getBOOL("UpdateRememberPasswordSetting")) - { - std::string filename = getStoredFavoritesFilename(); - if (!filename.empty()) - { - llifstream in_file; - in_file.open(filename.c_str()); - LLSD fav_llsd; - if (in_file.is_open()) - { - LLSDSerialize::fromXML(fav_llsd, in_file); - in_file.close(); - } - else - { - LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL; - } - - LLSD user_llsd; - S32 fav_iter = 0; - mMissingSLURLs.clear(); + pref_changed |= mRecreateFavoriteStorage; + mRecreateFavoriteStorage = false; + + // Can get called before inventory is done initializing. + if (!gInventory.isInventoryUsable()) + { + return FALSE; + } + + LLUUID favorite_folder= gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + if (favorite_folder.isNull()) + { + return FALSE; + } + + LLInventoryModel::item_array_t items; + LLInventoryModel::cat_array_t cats; + + LLIsType is_type(LLAssetType::AT_LANDMARK); + gInventory.collectDescendentsIf(favorite_folder, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + + std::sort(items.begin(), items.end(), LLFavoritesSort()); + bool name_changed = false; + + for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++) + { + if(mFavoriteNames[(*it)->getUUID()] != ((*it)->getName())) + { + mFavoriteNames[(*it)->getUUID()] = (*it)->getName(); + name_changed = true; + } + } + + for (std::set<LLUUID>::iterator it = mMissingSLURLs.begin(); it != mMissingSLURLs.end(); it++) + { + slurls_map_t::iterator slurl_iter = mSLURLs.find(*it); + if (slurl_iter != mSLURLs.end()) + { + pref_changed = true; + break; + } + } + + if((items != mPrevFavorites) || name_changed || pref_changed || gSavedSettings.getBOOL("UpdateRememberPasswordSetting")) + { + std::string filename = getStoredFavoritesFilename(); + if (!filename.empty()) + { + llifstream in_file; + in_file.open(filename.c_str()); + LLSD fav_llsd; + if (in_file.is_open()) + { + LLSDSerialize::fromXML(fav_llsd, in_file); + in_file.close(); + } + else + { + LL_WARNS("FavoritesBar") << "unable to open favorites from '" << filename << "'" << LL_ENDL; + } + + LLSD user_llsd; + S32 fav_iter = 0; + mMissingSLURLs.clear(); LLSD save_pass; save_pass["save_password"] = gSavedSettings.getBOOL("RememberPassword"); user_llsd[fav_iter] = save_pass; fav_iter++; - for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++) - { - LLSD value; - if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) - { - value["name"] = (*it)->getName(); - value["asset_id"] = (*it)->getAssetUUID(); - value["id"] = (*it)->getUUID(); - slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]); - if (slurl_iter != mSLURLs.end()) - { - value["slurl"] = slurl_iter->second; - user_llsd[fav_iter] = value; - } - else - { - getSLURL((*it)->getAssetUUID()); - value["slurl"] = ""; - user_llsd[fav_iter] = value; - mUpdateRequired = true; - mMissingSLURLs.insert((*it)->getAssetUUID()); - } - } - else - { - value["id"] = (*it)->getUUID(); - user_llsd[fav_iter] = value; - } - - fav_iter ++; - } - - LLAvatarName av_name; - LLAvatarNameCache::get( gAgentID, &av_name ); - // Note : use the "John Doe" and not the "john.doe" version of the name - // as we'll compare it with the stored credentials in the login panel. - fav_llsd[av_name.getUserName()] = user_llsd; - llofstream file; - file.open(filename.c_str()); - if ( file.is_open() ) - { - LLSDSerialize::toPrettyXML(fav_llsd, file); - file.close(); - mSaveOnExit = false; - } - else - { - LL_WARNS("FavoritesBar") << "unable to open favorites storage for '" << av_name.getUserName() - << "' at '" << filename << "' " << LL_ENDL; - } - } - mPrevFavorites = items; - } - - return TRUE; + for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); it++) + { + LLSD value; + if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) + { + value["name"] = (*it)->getName(); + value["asset_id"] = (*it)->getAssetUUID(); + value["id"] = (*it)->getUUID(); + slurls_map_t::iterator slurl_iter = mSLURLs.find(value["asset_id"]); + if (slurl_iter != mSLURLs.end()) + { + value["slurl"] = slurl_iter->second; + user_llsd[fav_iter] = value; + } + else + { + getSLURL((*it)->getAssetUUID()); + value["slurl"] = ""; + user_llsd[fav_iter] = value; + mUpdateRequired = true; + mMissingSLURLs.insert((*it)->getAssetUUID()); + } + } + else + { + value["id"] = (*it)->getUUID(); + user_llsd[fav_iter] = value; + } + + fav_iter ++; + } + + LLAvatarName av_name; + LLAvatarNameCache::get( gAgentID, &av_name ); + // Note : use the "John Doe" and not the "john.doe" version of the name + // as we'll compare it with the stored credentials in the login panel. + fav_llsd[av_name.getUserName()] = user_llsd; + llofstream file; + file.open(filename.c_str()); + if ( file.is_open() ) + { + LLSDSerialize::toPrettyXML(fav_llsd, file); + file.close(); + mSaveOnExit = false; + } + else + { + LL_WARNS("FavoritesBar") << "unable to open favorites storage for '" << av_name.getUserName() + << "' at '" << filename << "' " << LL_ENDL; + } + } + mPrevFavorites = items; + } + + return TRUE; } void LLFavoritesOrderStorage::showFavoritesOnLoginChanged(BOOL show) { - if (show) - { - saveFavoritesRecord(true); - } - else - { - removeFavoritesRecordOfUser(); - } + if (show) + { + saveFavoritesRecord(true); + } + else + { + removeFavoritesRecordOfUser(); + } } bool LLFavoritesOrderStorage::isStorageUpdateNeeded() { - if (!mRecreateFavoriteStorage) - { - for (LLSD::array_iterator iter = mStorageFavorites.beginArray(); - iter != mStorageFavorites.endArray(); ++iter) - { - if (mFavoriteNames[iter->get("id").asUUID()] != iter->get("name").asString()) - { - mRecreateFavoriteStorage = true; - return true; - } - } - } - return false; + if (!mRecreateFavoriteStorage) + { + for (LLSD::array_iterator iter = mStorageFavorites.beginArray(); + iter != mStorageFavorites.endArray(); ++iter) + { + if (mFavoriteNames[iter->get("id").asUUID()] != iter->get("name").asString()) + { + mRecreateFavoriteStorage = true; + return true; + } + } + } + return false; } void AddFavoriteLandmarkCallback::fire(const LLUUID& inv_item_id) { - if (mTargetLandmarkId.isNull()) return; + if (mTargetLandmarkId.isNull()) return; - LLFavoritesOrderStorage::instance().rearrangeFavoriteLandmarks(inv_item_id, mTargetLandmarkId); + LLFavoritesOrderStorage::instance().rearrangeFavoriteLandmarks(inv_item_id, mTargetLandmarkId); } // EOF |