diff options
| -rw-r--r-- | indra/newview/llfavoritesbar.cpp | 43 | 
1 files changed, 42 insertions, 1 deletions
| diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index a02bb56489..70e8437190 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -471,7 +471,25 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  			}  			// check if we are dragging an existing item from the favorites bar -			if (item && mDragItemId == item->getUUID()) +            bool existing_drop = false; +            if (item && mDragItemId == item->getUUID()) +            { +                // There is a chance of mDragItemId being obsolete +                // ex: can happen if something interrupts viewer, which +                // results in viewer not geting a 'mouse up' signal +                for (LLInventoryModel::item_array_t::iterator i = mItems.begin(); i != mItems.end(); ++i) +                { +                    LLViewerInventoryItem* currItem = *i; + +                    if (currItem->getUUID() == mDragItemId) +                    { +                        existing_drop = true; +                        break; +                    } +                } +            } + +            if (existing_drop)  			{  				*accept = ACCEPT_YES_SINGLE; @@ -500,6 +518,7 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  					if (mItems.empty())  					{  						setLandingTab(NULL); +                        mLastTab = NULL;  					}  					handleNewFavoriteDragAndDrop(item, favorites_id, x, y);  				} @@ -515,6 +534,12 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y)  { +    if (mItems.empty()) +    { +        // Isn't supposed to be empty +        return; +    } +  	// Identify the button hovered and the side to drop  	LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab);  	bool insert_before = true;	 @@ -787,6 +812,7 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update)  	if(mItems.empty())  	{  		mBarLabel->setVisible(TRUE); +        mLastTab = NULL;  	}  	else  	{ @@ -833,6 +859,10 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update)  					dynamic_cast<LLFavoriteLandmarkButton*> (*cur_it);  			if (button)  			{ +                if (mLastTab == button) +                { +                    mLastTab = NULL; +                }  				removeChild(button);  				delete button;  			} @@ -870,6 +900,17 @@ void LLFavoritesBarCtrl::updateButtons(bool force_update)  			mLastTab = last_new_button;  		} +        if (!mLastTab && mItems.size() > 0) +        { +            // mMoreTextBox was removed, so LLFavoriteLandmarkButtons +            // should be the only ones in the list +            LLFavoriteLandmarkButton* button = dynamic_cast<LLFavoriteLandmarkButton*> (childs->back()); +            if (button) +            { +                mLastTab = button; +            } +        } +  		mFirstDropDownItem = j;  		// Chevron button  		if (mFirstDropDownItem < mItems.size()) | 
