summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2026-09-22 14:57:20 +0800
committerErik Kundiman <erik@megapahit.org>2026-09-22 14:57:20 +0800
commit8bd0b8370765e762a570def7fbb99dc3ec4538f2 (patch)
tree337c3eeaaecff6f8176b0c6e1a2d9a61da56dc74
parent384e13aa5c82a594fbc431efd775ad583c0b9705 (diff)
parent0a60806f8973c05b68cf65a5a01c41d81ff2da7b (diff)
Merge tag 'Second_Life_Develop#0a60806f-2026-09-22' into 26.5
-rw-r--r--indra/llui/llfolderview.cpp48
-rw-r--r--indra/llui/llfolderview.h5
-rw-r--r--indra/llui/llfolderviewitem.cpp12
-rw-r--r--indra/newview/llpanelobjectinventory.cpp25
4 files changed, 71 insertions, 19 deletions
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index baab17830b..8ece3384cd 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -257,20 +257,13 @@ LLFolderView::LLFolderView(const Params& p)
// Destroys the object
LLFolderView::~LLFolderView( void )
{
- mRenamerTopLostSignalConnection.disconnect();
- if (mRenamer)
- {
- // instead of using closeRenamer remove it directly,
- // since it might already be hidden
- LLUI::getInstance()->removePopup(mRenamer);
- }
-
// The release focus call can potentially call the
// scrollcontainer, which can potentially be called with a partly
// destroyed scollcontainer. Just null it out here, and no worries
// about calling into the invalid scroll container.
// Same with the renamer.
mScrollContainer = NULL;
+ cancelRenaming();
mRenameItem = NULL;
mRenamer = NULL;
mStatusTextBox = NULL;
@@ -655,7 +648,10 @@ void LLFolderView::commitRename( const LLSD& data )
// since this can be called from 'focus lost' event.
// Ex: clicking inworld should commit the rename.
finishRenamingItem();
- arrange( NULL, NULL );
+ if (mRenamer && mViewModel)
+ {
+ arrange( NULL, NULL );
+ }
}
void LLFolderView::draw()
@@ -729,7 +725,7 @@ void LLFolderView::draw()
void LLFolderView::finishRenamingItem( void )
{
- if (!mRenamer)
+ if(!mRenamer || !mViewModel)
{
return;
}
@@ -758,12 +754,33 @@ void LLFolderView::closeRenamer( void )
}
}
+void LLFolderView::cancelRenaming( void )
+{
+ mRenamerTopLostSignalConnection.disconnect();
+
+ if (mRenamer)
+ {
+ mRenamer->setCommitOnFocusLost(false);
+ if (LLUI::instanceExists())
+ {
+ LLUI::getInstance()->removePopup(mRenamer);
+ }
+ if (gFocusMgr.childHasKeyboardFocus(mRenamer))
+ {
+ gFocusMgr.releaseFocusIfNeeded(mRenamer);
+ }
+ mRenamer->setVisible(false);
+ }
+
+ mRenameItem = NULL;
+}
+
void LLFolderView::removeSelectedItems()
{
if(getVisible() && getEnabled())
{
- // just in case we're removing the renaming item.
- mRenameItem = NULL;
+ // Cancel active rename in case the renaming item is among the selected items
+ cancelRenaming();
// create a temporary structure which we will use to remove
// items, since the removal will futz with internal data
@@ -1087,6 +1104,7 @@ void LLFolderView::startRenamingSelectedItem( void )
mRenamer->setText(item->getName());
mRenamer->selectAll();
mRenamer->setVisible( true );
+ mRenamer->setCommitOnFocusLost( true );
// set focus will fail unless item is visible
mRenamer->setFocus( true );
if (!mRenamerTopLostSignalConnection.connected())
@@ -1626,11 +1644,7 @@ bool LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
void LLFolderView::deleteAllChildren()
{
- mRenamerTopLostSignalConnection.disconnect();
- if (mRenamer)
- {
- LLUI::getInstance()->removePopup(mRenamer);
- }
+ cancelRenaming();
if (mPopupMenuHandle.get())
{
mPopupMenuHandle.get()->die();
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index 368a86ea84..2224ea6e42 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -196,8 +196,11 @@ public:
LLFolderViewItem* getNextUnselectedItem();
- // Public rename functionality - can only start the process
+ // Public rename functionality
void startRenamingSelectedItem( void );
+ void cancelRenaming( void );
+ LLFolderViewItem* getRenameItem() const { return mRenameItem; }
+ bool isRenaming() const { return mRenameItem != NULL; }
// LLView functionality
///*virtual*/ bool handleKey( KEY key, MASK mask, bool called_from_parent );
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index c8ef421677..dea95de955 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -565,7 +565,15 @@ bool LLFolderViewItem::isRemovable()
void LLFolderViewItem::destroyView()
{
- getRoot()->removeFromSelectionList(this);
+ LLFolderView* root = getRoot();
+ if (root)
+ {
+ root->removeFromSelectionList(this);
+ if (root->getRenameItem() == this)
+ {
+ root->cancelRenaming();
+ }
+ }
if (mParentFolder)
{
@@ -1822,6 +1830,8 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item, bool deparent_mode
{
if (item->isSelected())
getRoot()->clearSelection();
+ if (getRoot() && getRoot()->getRenameItem() == item)
+ getRoot()->cancelRenaming();
items_t::iterator it = std::find(mItems.begin(), mItems.end(), item);
if(it == mItems.end())
{
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 5f5c8302fe..33231e8405 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1349,6 +1349,14 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
// Destroys the object
LLPanelObjectInventory::~LLPanelObjectInventory()
{
+ if (mFolders)
+ {
+ mFolders->cancelRenaming();
+ if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+ {
+ LLEditMenuHandler::gEditMenuHandler = NULL;
+ }
+ }
if (!gIdleCallbacks.deleteFunction(idle, this))
{
LL_WARNS() << "LLPanelObjectInventory::~LLPanelObjectInventory() failed to delete callback" << LL_ENDL;
@@ -1398,6 +1406,15 @@ void LLPanelObjectInventory::clearContents()
clearItemIDs();
+ if (mFolders)
+ {
+ mFolders->cancelRenaming();
+ if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+ {
+ LLEditMenuHandler::gEditMenuHandler = NULL;
+ }
+ }
+
if( mScroller )
{
// removes mFolders
@@ -1780,6 +1797,14 @@ void LLPanelObjectInventory::draw()
void LLPanelObjectInventory::deleteAllChildren()
{
+ if (mFolders)
+ {
+ mFolders->cancelRenaming();
+ if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+ {
+ LLEditMenuHandler::gEditMenuHandler = NULL;
+ }
+ }
mScroller = NULL;
mFolders = NULL;
LLView::deleteAllChildren();