summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/app_settings/settings.xml35
-rw-r--r--indra/newview/llfloatertools.cpp17
-rw-r--r--indra/newview/llfloatertools.h3
-rw-r--r--indra/newview/llfolderview.cpp6
-rw-r--r--indra/newview/llfolderviewitem.cpp4
-rw-r--r--indra/newview/llinventorybridge.cpp261
-rw-r--r--indra/newview/llinventorybridge.h3
-rw-r--r--indra/newview/llinventoryfunctions.cpp30
-rw-r--r--indra/newview/llinventoryfunctions.h19
-rw-r--r--indra/newview/llpanelmaininventory.cpp9
-rw-r--r--indra/newview/llpanelmaininventory.h1
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp35
-rw-r--r--indra/newview/llpaneloutfitsinventory.h8
-rw-r--r--indra/newview/llselectmgr.cpp20
-rw-r--r--indra/newview/llselectmgr.h1
-rw-r--r--indra/newview/llviewercontrol.cpp23
-rw-r--r--indra/newview/llviewermenu.cpp19
-rw-r--r--indra/newview/llvoavatarself.cpp37
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llwearable.cpp2
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml46
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml2
23 files changed, 364 insertions, 227 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 578f8fd4f0..6fa839235a 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5834,17 +5834,6 @@
<key>Value</key>
<integer>35</integer>
</map>
- <key>RenderAvatarInvisible</key>
- <map>
- <key>Comment</key>
- <string>Set your avatar as Invisible</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>RenderAvatarVP</key>
<map>
<key>Comment</key>
@@ -7792,6 +7781,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowDebugAppearanceEditor</key>
+ <map>
+ <key>Comment</key>
+ <string>Show debugging appearance editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ShowEmptyFoldersWhenSearching</key>
<map>
<key>Comment</key>
@@ -7890,7 +7890,18 @@
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
- </map>
+ </map>
+ <key>ShowObjectRenderingCost</key>
+ <map>
+ <key>Comment</key>
+ <string>Show the object rendering cost in build tools</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>ShowNavbarFavoritesPanel</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 7fb71d4d4f..babef5b63d 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -93,7 +93,7 @@
// Globals
LLFloaterTools *gFloaterTools = NULL;
-
+bool LLFloaterTools::sShowObjectCost = true;
const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
{
@@ -286,6 +286,8 @@ BOOL LLFloaterTools::postBuild()
mStatusText["grab"] = getString("status_grab");
mStatusText["place"] = getString("status_place");
mStatusText["selectland"] = getString("status_selectland");
+
+ sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost");
return TRUE;
}
@@ -425,16 +427,19 @@ void LLFloaterTools::refresh()
childSetTextArg("prim_count", "[COUNT]", prim_count_string);
// calculate selection rendering cost
- std::string prim_cost_string;
- LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
- childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
+ if (sShowObjectCost)
+ {
+ std::string prim_cost_string;
+ LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
+ childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
+ }
// disable the object and prim counts if nothing selected
bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
childSetEnabled("obj_count", have_selection);
childSetEnabled("prim_count", have_selection);
- childSetEnabled("RenderingCost", have_selection);
+ childSetEnabled("RenderingCost", have_selection && sShowObjectCost);
// Refresh child tabs
mPanelPermissions->refresh();
@@ -566,7 +571,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mBtnEdit ->setToggleState( edit_visible );
mRadioGroupEdit->setVisible( edit_visible );
bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
- childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible));
+ childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
if (mCheckSelectIndividual)
{
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 05a88a31d3..85aeb9f523 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -196,6 +196,9 @@ private:
protected:
LLSD mMediaSettings;
+
+public:
+ static bool sShowObjectCost;
};
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index db6998b267..98fae1c2a0 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -749,6 +749,12 @@ void LLFolderView::sanitizeSelection()
}
}
}
+
+ // Don't allow invisible items (such as root folders) to be selected.
+ if (item->getDontShowInHierarchy())
+ {
+ items_to_remove.push_back(item);
+ }
}
std::vector<LLFolderViewItem*>::iterator item_it;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 8a13964708..9ae0c9100a 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -199,7 +199,9 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
}
LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
- while(itemp && !itemp->getVisible())
+
+ // Skip over items that are invisible or are hidden from the UI.
+ while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy()))
{
LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
if (itemp == next_itemp)
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 35ae4dee8e..3fc2cbecbe 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -190,12 +190,7 @@ BOOL LLInvFVBridge::isItemRemovable()
{
return TRUE;
}
- if (gAgentWearables.isWearingItem(mUUID))
- {
- return FALSE;
- }
- const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if (avatar && avatar->isWearingAttachment(mUUID))
+ if (get_is_item_worn(mUUID))
{
return FALSE;
}
@@ -506,41 +501,6 @@ void hide_context_entries(LLMenuGL& menu,
}
}
-bool isWornLink(LLUUID link_id)
-{
- LLViewerInventoryItem *link = gInventory.getItem(link_id);
- if (!link)
- return false;
- LLViewerInventoryItem *item = link->getLinkedItem();
- if (!item)
- return false;
-
- switch(item->getType())
- {
- case LLAssetType::AT_OBJECT:
- {
- LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
- if(my_avatar && my_avatar->isWearingAttachment(item->getUUID()))
- return true;
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(gAgentWearables.isWearingItem(item->getUUID()))
- return true;
- break;
-
- case LLAssetType::AT_GESTURE:
- if (LLGestureManager::instance().isGestureActive(item->getUUID()))
- return true;
- break;
- default:
- break;
- }
- return false;
-}
-
// Helper for commonly-used entries
void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
std::vector<std::string> &items,
@@ -552,7 +512,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (is_sidepanel)
{
// Sidepanel includes restricted menu.
- if (obj && obj->getIsLinkType() && !isWornLink(mUUID))
+ if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
{
items.push_back(std::string("Remove Link"));
}
@@ -606,15 +566,18 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
disabled_items.push_back(std::string("Paste"));
}
- items.push_back(std::string("Paste As Link"));
- if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+ if (gAgent.isGodlike())
{
- disabled_items.push_back(std::string("Paste As Link"));
+ items.push_back(std::string("Paste As Link"));
+ if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Paste As Link"));
+ }
}
items.push_back(std::string("Paste Separator"));
- if (obj && obj->getIsLinkType() && !isWornLink(mUUID))
+ if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
{
items.push_back(std::string("Remove Link"));
}
@@ -1196,7 +1159,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
{
U8 font = LLFontGL::NORMAL;
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
// llinfos << "BOLD" << llendl;
font |= LLFontGL::BOLD;
@@ -1339,29 +1302,33 @@ BOOL LLItemBridge::isItemCopyable() const
LLViewerInventoryItem* item = getItem();
if (item)
{
- // can't copy worn objects. DEV-15183
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if( !avatarp )
+ // Can't copy worn objects. DEV-15183
+ if(get_is_item_worn(mUUID))
{
return FALSE;
}
- if(avatarp->isWearingAttachment(mUUID))
+ // You can never copy a link.
+ if (item->getIsLinkType())
{
return FALSE;
}
- // All items can be copied, not all can be pasted.
- // The only time an item can't be copied is if it's a link
- // return (item->getPermissions().allowCopyBy(gAgent.getID()));
- if (item->getIsLinkType())
+ if (gAgent.isGodlike())
{
- return FALSE;
+ // All items can be copied in god mode since you can
+ // at least paste-as-link the item, though you
+ // still may not be able paste the item.
+ return TRUE;
+ }
+ else
+ {
+ return (item->getPermissions().allowCopyBy(gAgent.getID()));
}
- return TRUE;
}
return FALSE;
}
+
BOOL LLItemBridge::copyToClipboard() const
{
if(isItemCopyable())
@@ -1472,10 +1439,7 @@ BOOL LLFolderBridge::isItemRemovable()
return FALSE;
}
- // Allow protected types to be removed, but issue a warning.
- // Restrict to god mode so users don't inadvertently mess up their inventory.
- if(LLFolderType::lookupIsProtectedType(category->getPreferredType()) &&
- !gAgent.isGodlike())
+ if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
{
return FALSE;
}
@@ -1681,23 +1645,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
for( i = 0; i < descendent_items.count(); i++ )
{
LLInventoryItem* item = descendent_items[i];
- if( (item->getType() == LLAssetType::AT_CLOTHING) ||
- (item->getType() == LLAssetType::AT_BODYPART) )
- {
- if( gAgentWearables.isWearingItem( item->getUUID() ) )
- {
- is_movable = FALSE; // It's generally movable, but not into the trash!
- break;
- }
- }
- else
- if( item->getType() == LLAssetType::AT_OBJECT )
+ if (get_is_item_worn(item->getUUID()))
{
- if( avatar->isWearingAttachment( item->getUUID() ) )
- {
- is_movable = FALSE; // It's generally movable, but not into the trash!
- break;
- }
+ is_movable = FALSE;
+ break; // It's generally movable, but not into the trash!
}
}
}
@@ -2187,6 +2138,12 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
restoreItem();
return;
}
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ else if ("delete_system_folder" == action)
+ {
+ removeSystemFolder();
+ }
+#endif
}
void LLFolderBridge::openItem()
@@ -2310,13 +2267,27 @@ BOOL LLFolderBridge::removeItem()
LLNotification::Params params("ConfirmDeleteProtectedCategory");
params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
- if (LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+ LLNotifications::instance().forceResponse(params, 0);
+ return TRUE;
+}
+
+
+BOOL LLFolderBridge::removeSystemFolder()
+{
+ const LLViewerInventoryCategory *cat = getCategory();
+ if (!LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
- LLNotifications::instance().add(params);
+ return FALSE;
}
- else
+
+ LLSD payload;
+ LLSD args;
+ args["FOLDERNAME"] = cat->getName();
+
+ LLNotification::Params params("ConfirmDeleteProtectedCategory");
+ params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
{
- LLNotifications::instance().forceResponse(params, 0);
+ LLNotifications::instance().add(params);
}
return TRUE;
}
@@ -2485,6 +2456,13 @@ void LLFolderBridge::folderOptionsMenu()
}
}
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ if (LLFolderType::lookupIsProtectedType(type))
+ {
+ mItems.push_back(std::string("Delete System Folder"));
+ }
+#endif
+
// wearables related functionality for folders.
//is_wearable
LLFindWearables is_wearable;
@@ -2512,7 +2490,10 @@ void LLFolderBridge::folderOptionsMenu()
mItems.push_back(std::string("Wear As Ensemble"));
}
mItems.push_back(std::string("Remove From Outfit"));
-
+ if (!areAnyContentsWorn(model))
+ {
+ disabled_items.push_back(std::string("Remove From Outfit"));
+ }
mItems.push_back(std::string("Outfit Separator"));
}
hide_context_entries(*mMenu, mItems, disabled_items);
@@ -2534,6 +2515,35 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv
return ((item_array.count() > 0) ? TRUE : FALSE );
}
+class LLFindWorn : public LLInventoryCollectFunctor
+{
+public:
+ LLFindWorn() {}
+ virtual ~LLFindWorn() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+ {
+ if (item && get_is_item_worn(item->getUUID()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+};
+
+BOOL LLFolderBridge::areAnyContentsWorn(LLInventoryModel* model) const
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLFindWorn is_worn;
+ model->collectDescendentsIf(mUUID,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_worn);
+ return (item_array.size() > 0);
+}
+
// Flags unused
void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
@@ -2656,6 +2666,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mItems.push_back(std::string("--no options--"));
mDisabledItems.push_back(std::string("--no options--"));
}
+
+ // Preemptively disable system folder removal if more than one item selected.
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ mDisabledItems.push_back(std::string("Delete System Folder"));
+ }
+
hide_context_entries(menu, mItems, mDisabledItems);
}
@@ -2998,19 +3015,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
if(is_movable && move_is_into_trash)
{
- switch(inv_item->getType())
- {
- case LLAssetType::AT_CLOTHING:
- case LLAssetType::AT_BODYPART:
- is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
- break;
-
- case LLAssetType::AT_OBJECT:
- is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
- break;
- default:
- break;
- }
+ is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
}
if ( is_movable )
@@ -4080,8 +4085,7 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
{
U8 font = LLFontGL::NORMAL;
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar && avatar->isWearingAttachment( mUUID ) )
+ if(get_is_item_worn( mUUID ) )
{
font |= LLFontGL::BOLD;
}
@@ -4097,9 +4101,9 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
std::string LLObjectBridge::getLabelSuffix() const
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar && avatar->isWearingAttachment( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
// e.g. "(worn on ...)" / "(attached to ...)"
@@ -4224,12 +4228,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
return;
}
- if( avatarp->isWearingAttachment( mUUID ) )
+ if( get_is_item_worn( mUUID ) )
{
items.push_back(std::string("Detach From Yourself"));
}
- else
- if( !isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
+ else if (!isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
{
items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Object Wear"));
@@ -4455,7 +4458,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
if (gAgent.isTeen() && item->isWearableType() &&
(item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT))
continue;
- if( gAgentWearables.isWearingItem (item->getLinkedUUID()) )
+ if (get_is_item_worn(item->getUUID()))
{
LLWearableList::instance().getAsset(item->getAssetUUID(),
item->getName(),
@@ -4471,18 +4474,21 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
for(i = 0; i < obj_count; ++i)
{
LLViewerInventoryItem *obj_item = obj_item_array.get(i);
- gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
- gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
-
- gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
-
- // this object might have been selected, so let the selection manager know it's gone now
- LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID());
- if (found_obj)
+ if (get_is_item_worn(obj_item->getUUID()))
{
- LLSelectMgr::getInstance()->remove(found_obj);
+ gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
+ gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
+
+ gMessageSystem->sendReliable( gAgent.getRegion()->getHost() );
+
+ // this object might have been selected, so let the selection manager know it's gone now
+ LLViewerObject *found_obj = gObjectList.findObject( obj_item->getLinkedUUID());
+ if (found_obj)
+ {
+ LLSelectMgr::getInstance()->remove(found_obj);
+ }
}
}
}
@@ -4492,7 +4498,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
for(i = 0; i < gest_count; ++i)
{
LLViewerInventoryItem *gest_item = gest_item_array.get(i);
- if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) )
+ if (get_is_item_worn(gest_item->getUUID()))
{
LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
gInventory.updateItem( gest_item );
@@ -4506,7 +4512,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
BOOL LLWearableBridge::renameItem(const std::string& new_name)
{
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
gAgentWearables.setWearableName( mUUID, new_name );
}
@@ -4515,7 +4521,7 @@ BOOL LLWearableBridge::renameItem(const std::string& new_name)
std::string LLWearableBridge::getLabelSuffix() const
{
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
// e.g. "(worn)"
return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
@@ -4549,7 +4555,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
}
else if (isRemoveAction(action))
{
- if(gAgentWearables.isWearingItem(mUUID))
+ if (get_is_item_worn(mUUID))
{
LLViewerInventoryItem* item = getItem();
if (item)
@@ -4580,7 +4586,7 @@ void LLWearableBridge::openItem()
}
else if(isAgentInventory())
{
- if( !gAgentWearables.isWearingItem( mUUID ) )
+ if( !get_is_item_worn( mUUID ) )
{
wearOnAvatar();
}
@@ -4680,7 +4686,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
case LLAssetType::AT_CLOTHING:
items.push_back(std::string("Take Off"));
case LLAssetType::AT_BODYPART:
- if (gAgentWearables.isWearingItem(item->getUUID()))
+ if (get_is_item_worn(item->getUUID()))
{
disabled_items.push_back(std::string("Wearable Wear"));
disabled_items.push_back(std::string("Wearable Add"));
@@ -4711,7 +4717,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
if(!item || !item->isComplete()) return FALSE;
}
- return (!gAgentWearables.isWearingItem(self->mUUID));
+ return (!get_is_item_worn(self->mUUID));
}
// Called from menus
@@ -4843,7 +4849,7 @@ BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return FALSE;
- return (gAgentWearables.isWearingItem(self->mUUID));
+ return (get_is_item_worn(self->mUUID));
}
// static
@@ -4880,7 +4886,7 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data;
if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
{
- return gAgentWearables.isWearingItem( self->mUUID );
+ return get_is_item_worn( self->mUUID );
}
return FALSE;
}
@@ -4890,7 +4896,7 @@ void LLWearableBridge::onRemoveFromAvatar(void* user_data)
{
LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return;
- if(gAgentWearables.isWearingItem(self->mUUID))
+ if(get_is_item_worn(self->mUUID))
{
LLViewerInventoryItem* item = self->getItem();
if (item)
@@ -4913,7 +4919,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
if(wearable)
{
- if( gAgentWearables.isWearingItem( item_id ) )
+ if( get_is_item_worn( item_id ) )
{
EWearableType type = wearable->getType();
@@ -5123,8 +5129,9 @@ void LLAnimationBridgeAction::doIt()
//virtual
void LLObjectBridgeAction::doIt()
{
+ /*
LLFloaterReg::showInstance("properties", mUUID);
-
+ */
LLInvFVBridgeAction::doIt();
}
@@ -5196,7 +5203,7 @@ void LLWearableBridgeAction::doIt()
}
else if(isAgentInventory())
{
- if(!gAgentWearables.isWearingItem(mUUID))
+ if(!get_is_item_worn(mUUID))
{
wearOnAvatar();
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 117e32c6be..4d83e9b684 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -292,7 +292,9 @@ public:
static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
virtual BOOL renameItem(const std::string& new_name);
+
virtual BOOL removeItem();
+ BOOL removeSystemFolder();
bool removeItemResponse(const LLSD& notification, const LLSD& response);
virtual void pasteFromClipboard();
@@ -339,6 +341,7 @@ protected:
static void createNewEyes(void* user_data);
BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);
+ BOOL areAnyContentsWorn(LLInventoryModel* model) const;
void modifyOutfit(BOOL append);
void determineFolderType();
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 75218e98e0..8f4136c01f 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -338,3 +338,33 @@ LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );
return LLUI::getUIImage(icon_name);
}
+
+BOOL get_is_item_worn(const LLUUID& id)
+{
+ const LLViewerInventoryItem* item = gInventory.getItem(id);
+ if (!item)
+ return FALSE;
+
+ switch(item->getType())
+ {
+ case LLAssetType::AT_OBJECT:
+ {
+ const LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
+ if(my_avatar && my_avatar->isWearingAttachment(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ }
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_CLOTHING:
+ if(gAgentWearables.isWearingItem(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ case LLAssetType::AT_GESTURE:
+ if (LLGestureManager::instance().isGestureActive(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 9916a2351c..968db84819 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -41,7 +41,9 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// This is a collection of miscellaneous functions and classes
-// that don't fit cleanly into any other class header.
+// that don't fit cleanly into any other class header. Eventually,
+// we should figure out where to put these functions so that we can
+// get rid of this generic file.
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -98,14 +100,17 @@ public:
};
const std::string& get_item_icon_name(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi );
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi );
LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi );
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi );
+
+// Is this item or its baseitem is worn, attached, etc...
+BOOL get_is_item_worn(const LLUUID& id);
#endif // LL_LLINVENTORYFUNCTIONS_H
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index c0da8f3daa..961d3dec8b 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -400,6 +400,7 @@ void LLPanelMainInventory::onClearSearch()
mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
mActivePanel->getRootFolder()->scrollToShowSelection();
}
+ mFilterSubString = "";
}
void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
@@ -417,6 +418,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
std::string uppercase_search_string = search_string;
LLStringUtil::toUpper(uppercase_search_string);
+ mFilterSubString = uppercase_search_string;
if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
{
// current filter and new filter empty, do nothing
@@ -431,7 +433,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
}
// set new filter string
- mActivePanel->setFilterSubString(uppercase_search_string);
+ mActivePanel->setFilterSubString(mFilterSubString);
}
@@ -484,6 +486,7 @@ void LLPanelMainInventory::onFilterSelected()
{
return;
}
+ setFilterSubString(mFilterSubString);
LLInventoryFilter* filter = mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = getFinder();
if (finder)
@@ -542,7 +545,7 @@ void LLPanelMainInventory::draw()
{
if (mActivePanel && mFilterEditor)
{
- mFilterEditor->setText(mActivePanel->getFilterSubString());
+ mFilterEditor->setText(mFilterSubString);
}
LLPanel::draw();
}
@@ -1016,9 +1019,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
const LLUUID& item_id = current_item->getListener()->getUUID();
const std::string &item_name = current_item->getListener()->getName();
+ mFilterSubString = item_name;
LLInventoryFilter *filter = mActivePanel->getFilter();
filter->setFilterSubString(item_name);
mFilterEditor->setText(item_name);
+
mFilterEditor->setFocus(TRUE);
filter->setFilterUUID(item_id);
filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 920de2665c..69f8a14583 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -123,6 +123,7 @@ private:
LLInventoryPanel* mActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;
+ std::string mFilterSubString;
//////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 5b36a5406a..f9777147b7 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -56,7 +56,10 @@
#include "llmenugl.h"
#include "llviewermenu.h"
+#include "llviewercontrol.h"
+
static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
+bool LLPanelOutfitsInventory::sShowDebugEditor = false;
LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
mActivePanel(NULL),
@@ -74,7 +77,7 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
// virtual
BOOL LLPanelOutfitsInventory::postBuild()
{
-
+ sShowDebugEditor = gSavedSettings.getBOOL("ShowDebugAppearanceEditor");
initTabPanels();
initListCommandsHandlers();
return TRUE;
@@ -86,6 +89,11 @@ void LLPanelOutfitsInventory::updateVerbs()
{
mParent->updateVerbs();
}
+
+ if (mListCommands)
+ {
+ mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor);
+ }
}
void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
@@ -96,6 +104,7 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
// virtual
void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
{
+ mFilterSubString = string;
if (string == "")
{
mActivePanel->setFilterSubString(LLStringUtil::null);
@@ -177,7 +186,6 @@ void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewIte
void LLPanelOutfitsInventory::onSelectorButtonClicked()
{
- /*
LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem();
LLFolderViewEventListener* listenerp = cur_item->getListener();
@@ -189,7 +197,6 @@ void LLPanelOutfitsInventory::onSelectorButtonClicked()
LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);
}
- */
}
LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
@@ -233,9 +240,11 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));
mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
- mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+ mListCommands->childSetAction("make_outfit_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
-
+
+ mListCommands->childSetAction("look_edit_btn", boost::bind(&LLPanelOutfitsInventory::onSelectorButtonClicked, this));
+
LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this
, _4 // BOOL drop
@@ -433,6 +442,9 @@ void LLPanelOutfitsInventory::initTabPanels()
LLInventoryPanel *panel = (*iter);
panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2));
}
+
+ mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");
+ mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));
}
void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
@@ -457,6 +469,19 @@ void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel,
onSelectionChange(items, user_action);
}
+void LLPanelOutfitsInventory::onTabChange()
+{
+ mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs");
+ if (!mActivePanel)
+ {
+ return;
+ }
+ mActivePanel->setFilterSubString(mFilterSubString);
+
+ bool is_my_outfits = (mActivePanel->getName() == "outfitslist_accordionpanel");
+ mListCommands->childSetEnabled("make_outfit_btn", is_my_outfits);
+}
+
LLInventoryPanel* LLPanelOutfitsInventory::getActivePanel()
{
return mActivePanel;
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index 9b6b483e3b..1e084750a0 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -44,6 +44,7 @@ class LLSaveFolderState;
class LLButton;
class LLMenuGL;
class LLSidepanelAppearance;
+class LLTabContainer;
class LLPanelOutfitsInventory : public LLPanel
{
@@ -76,7 +77,8 @@ protected:
private:
LLSidepanelAppearance* mParent;
LLSaveFolderState* mSavedFolderState;
-
+ LLTabContainer* mAppearanceTabs;
+ std::string mFilterSubString;
public:
//////////////////////////////////////////////////////////////////////////////////
@@ -87,6 +89,7 @@ public:
protected:
void initTabPanels();
void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onTabChange();
private:
LLInventoryPanel* mActivePanel;
@@ -117,6 +120,9 @@ private:
LLMenuGL* mMenuAdd;
// List Commands //
////////////////////////////////////////////////////////////////////////////////
+ ///
+public:
+ static bool sShowDebugEditor;
};
#endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 6e99d5a5f0..60a095506b 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -2277,6 +2277,26 @@ BOOL LLSelectMgr::selectGetAllValid()
return TRUE;
}
+//-----------------------------------------------------------------------------
+// selectGetAllValidAndObjectsFound() - return TRUE if selections are
+// valid and objects are found.
+//
+// For EXT-3114 - same as selectGetModify() without the modify check.
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetAllValidAndObjectsFound()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
//-----------------------------------------------------------------------------
// selectGetModify() - return TRUE if current agent can modify all
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 6641be335a..f8ecfd0674 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -535,6 +535,7 @@ public:
// Returns TRUE if the viewer has information on all selected objects
BOOL selectGetAllRootsValid();
BOOL selectGetAllValid();
+ BOOL selectGetAllValidAndObjectsFound();
// returns TRUE if you can modify all selected objects.
BOOL selectGetRootsModify();
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index f3db0ab170..57434bd1e4 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -72,6 +72,8 @@
#include "llrender.h"
#include "llbottomtray.h"
#include "llnavigationbar.h"
+#include "llfloatertools.h"
+#include "llpaneloutfitsinventory.h"
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
BOOL gHackGodmode = FALSE;
@@ -119,12 +121,6 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
return true;
}
-static bool handleSetSelfInvisible( const LLSD& newvalue)
-{
- LLVOAvatarSelf::onChangeSelfInvisible( newvalue.asBoolean() );
- return true;
-}
-
static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
{
if (gPipeline.isInit())
@@ -525,6 +521,18 @@ bool toggle_show_favorites_panel(const LLSD& newvalue)
return true;
}
+bool toggle_show_appearance_editor(const LLSD& newvalue)
+{
+ LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean();
+ return true;
+}
+
+bool toggle_show_object_render_cost(const LLSD& newvalue)
+{
+ LLFloaterTools::sShowObjectCost = newvalue.asBoolean();
+ return true;
+}
+
////////////////////////////////////////////////////////////////////////////
void settings_setup_listeners()
@@ -545,7 +553,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
- gSavedSettings.getControl("RenderAvatarInvisible")->getSignal()->connect(boost::bind(&handleSetSelfInvisible, _2));
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
@@ -668,6 +675,8 @@ void settings_setup_listeners()
gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&toggle_show_snapshot_button, _2));
gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));
gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
+ gSavedSettings.getControl("ShowDebugAppearanceEditor")->getSignal()->connect(boost::bind(&toggle_show_appearance_editor, _2));
+ gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index dfa775c292..f1ae573c32 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -633,6 +633,20 @@ class LLAdvancedCheckHUDInfo : public view_listener_t
}
};
+
+//////////////
+// FLYING //
+//////////////
+
+class LLAdvancedAgentFlyingInfo : public view_listener_t
+{
+ bool handleEvent(const LLSD&)
+ {
+ return gAgent.getFlying();
+ }
+};
+
+
///////////////////////
// CLEAR GROUP CACHE //
///////////////////////
@@ -2640,7 +2654,7 @@ bool enable_object_edit()
enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()
|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
}
- else if (LLSelectMgr::getInstance()->selectGetModify())
+ else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound())
{
enable = true;
}
@@ -7703,6 +7717,9 @@ void initialize_menus()
// Advanced Other Settings
view_listener_t::addMenu(new LLAdvancedClearGroupCache(), "Advanced.ClearGroupCache");
+ // Advanced > Shortcuts
+ view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
+
// Advanced > Render > Types
view_listener_t::addMenu(new LLAdvancedToggleRenderType(), "Advanced.ToggleRenderType");
view_listener_t::addMenu(new LLAdvancedCheckRenderType(), "Advanced.CheckRenderType");
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index b4c45c23d4..ecd6b05ded 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2021,43 +2021,6 @@ void LLVOAvatarSelf::onCustomizeEnd()
}
}
-// static
-void LLVOAvatarSelf::onChangeSelfInvisible(BOOL newvalue)
-{
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if (avatarp)
- {
- if (newvalue)
- {
- // we have just requested to set the avatar's baked textures to invisible
- avatarp->setInvisible(TRUE);
- }
- else
- {
- avatarp->setInvisible(FALSE);
- }
- }
-}
-
-void LLVOAvatarSelf::setInvisible(BOOL newvalue)
-{
- if (newvalue)
- {
- setCompositeUpdatesEnabled(FALSE);
- for (U32 i = 0; i < mBakedTextureDatas.size(); i++ )
- {
- setNewBakedTexture(mBakedTextureDatas[i].mTextureIndex, IMG_INVISIBLE);
- }
- gAgent.sendAgentSetAppearance();
- }
- else
- {
- setCompositeUpdatesEnabled(TRUE);
- invalidateAll();
- gAgent.sendAgentSetAppearance();
- }
-}
-
// HACK: this will null out the avatar's local texture IDs before the TE message is sent
// to ensure local texture IDs are not sent to other clients in the area.
// this is a short-term solution. The long term solution will be to not set the texture
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index c7bd4eaadc..dc70996f0b 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -308,8 +308,6 @@ public:
// Visibility
//--------------------------------------------------------------------
public:
- static void onChangeSelfInvisible(BOOL newvalue);
- void setInvisible(BOOL newvalue);
bool sendAppearanceMessage(LLMessageSystem *mesgsys) const;
/** Appearance
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 0405b9d28b..b789bd3650 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -356,7 +356,7 @@ BOOL LLWearable::importFile( LLFILE* file )
if( num_parameters != mVisualParamIndexMap.size() )
{
- llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. " << llendl;
+ llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. type: " << mType << llendl;
}
// parameters
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 0f400777b8..d29dfa7034 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -471,6 +471,14 @@
function="Inventory.DoToSelected"
parameter="delete" />
</menu_item_call>
+ <menu_item_call
+ label="Delete System Folder"
+ layout="topleft"
+ name="Delete System Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="delete_system_folder" />
+ </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_separator
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index ab73f135b9..5c99022f35 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -69,18 +69,7 @@
name="options_gear_btn"
top="6"
width="18" />
- <button
- follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
- layout="topleft"
- left_pad="5"
- name="add_btn"
- tool_tip="Add new item"
- width="18" />
- <dnd_button
+ <dnd_button
follows="bottom|left"
height="18"
image_selected="TrashItem_Press"
@@ -92,13 +81,34 @@
top="6"
width="18" />
<button
- follows="top|left"
- height="23"
- label="Wear"
+ follows="bottom|left"
+ height="23"
+ label="Edit Look"
layout="topleft"
- name="wear_btn"
- right="-5"
- top_pad="0"
+ left="10"
+ name="look_edit_btn"
+ top="26"
+ visible="false"
width="90" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Make Outfit"
+ layout="topleft"
+ name="make_outfit_btn"
+ tool_tip="Save appearance as an outfit"
+ top="26"
+ right="-110"
+ width="90" />
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Wear"
+ layout="topleft"
+ name="wear_btn"
+ right="-10"
+ top="26"
+ tool_tip="Wear selected outfit"
+ width="90" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 27f19d44fa..7f4b4aef82 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -107,6 +107,7 @@ left="0"
layout="topleft"
left="0"
name="panel_look_info"
+ top="35"
visible="false" />
<panel
class="panel_edit_wearable"
@@ -115,6 +116,7 @@ left="0"
layout="topleft"
left="0"
name="panel_edit_wearable"
+ top="35"
visible="false" />
</panel>