diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-09-10 00:48:20 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-09-10 00:57:39 +0300 | 
| commit | c118c2762302b44fb312752c6d94c384bfda529a (patch) | |
| tree | 0b61d3cdc73bf0bb87c87a84e779ab62a91d6fae | |
| parent | e9da22cecc526087b62c39c5d0824ec918b874bc (diff) | |
SL-18117 Smarter add and detach inventory menus
The 'exceptions' solution is a bit ugly, but alternative is remaking all inventory and chat menus to act based on registars
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 34 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.cpp | 56 | 
2 files changed, 79 insertions, 11 deletions
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index c18ee0c4a0..e29308d3d1 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -734,15 +734,15 @@ void hide_context_entries(LLMenuGL& menu,  		}  		bool found = false; -		menuentry_vec_t::const_iterator itor2; -		for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) -		{ -			if (*itor2 == name) -			{ -				found = true; -				break; -			} -		} + +        std::string myinput; +        std::vector<std::string> mylist{ "a", "b", "c" }; + +        menuentry_vec_t::const_iterator itor2 = std::find(entries_to_show.begin(), entries_to_show.end(), name); +        if (itor2 != entries_to_show.end()) +        { +            found = true; +        }  		// Don't allow multiple separators in a row (e.g. such as if there are no items  		// between two separators). @@ -760,7 +760,21 @@ void hide_context_entries(LLMenuGL& menu,  				menu_item->setVisible(FALSE);  			} -			menu_item->setEnabled(FALSE); +            if (menu_item->getEnabled()) +            { +                // These should stay enabled unless specifically disabled +                const menuentry_vec_t exceptions = { +                    "Detach From Yourself", +                    "Wearable And Object Wear", +                    "Wearable Add", +                }; + +                menuentry_vec_t::const_iterator itor2 = std::find(exceptions.begin(), exceptions.end(), name); +                if (itor2 == exceptions.end()) +                { +                    menu_item->setEnabled(FALSE); +                } +            }  		}  		else  		{ diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 27edc8148e..fb73d391ec 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2583,8 +2583,62 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root  	}  	std::set<LLUUID> selected_uuid_set = LLAvatarActions::getInventorySelectedUUIDs(); + +    // copy list of applicable items into a vector for bulk handling      uuid_vec_t ids; -    std::copy(selected_uuid_set.begin(), selected_uuid_set.end(), std::back_inserter(ids)); +    if (action == "wear" || action == "wear_add") +    { +        const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); +        const LLUUID mp_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false); +        std::copy_if(selected_uuid_set.begin(), +            selected_uuid_set.end(), +            std::back_inserter(ids), +            [trash_id, mp_id](LLUUID id) +        { +            if (get_is_item_worn(id) +                || LLAppearanceMgr::instance().getIsInCOF(id) +                || gInventory.isObjectDescendentOf(id, trash_id)) +            { +                return false; +            } +            if (mp_id.notNull() && gInventory.isObjectDescendentOf(id, mp_id)) +            { +                return false; +            } +            LLInventoryObject* obj = (LLInventoryObject*)gInventory.getObject(id); +            if (!obj) +            { +                return false; +            } +            if (obj->getIsLinkType() && gInventory.isObjectDescendentOf(obj->getLinkedUUID(), trash_id)) +            { +                return false; +            } +            if (obj->getIsLinkType() && LLAssetType::lookupIsLinkType(obj->getType())) +            { +                // missing +                return false; +            } +            return true; +        } +        ); +    } +    else if (isRemoveAction(action)) +    { +        std::copy_if(selected_uuid_set.begin(), +            selected_uuid_set.end(), +            std::back_inserter(ids), +            [](LLUUID id) +        { +            return get_is_item_worn(id); +        } +        ); +    } +    else +    { +        std::copy(selected_uuid_set.begin(), selected_uuid_set.end(), std::back_inserter(ids)); +    } +      // Check for actions that get handled in bulk      if (action == "wear")      {  | 
