SL-17818 Crash at childrenHandleDragAndDrop

master
Andrey Kleshchev 2022-07-22 10:56:37 +03:00
parent 3f89c98dac
commit bb318110ef
1 changed files with 42 additions and 1 deletions

View File

@ -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())