summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-07-22 10:56:37 +0300
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2022-07-22 10:56:37 +0300
commitbb318110efaa7161015be4228d985e49aefec8f8 (patch)
tree2de375cadeb161d84ef8de01ffe1d862ef976bd8
parent3f89c98dac05c24a8897330f0bd96bfabdd8096f (diff)
SL-17818 Crash at childrenHandleDragAndDrop
-rw-r--r--indra/newview/llfavoritesbar.cpp43
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())