merge from PE's viewer-trunk
commit
83f108503a
|
|
@ -139,7 +139,7 @@ public:
|
|||
*/
|
||||
const LLAccordionCtrlTab* getExpandedTab() const;
|
||||
|
||||
const LLAccordionCtrlTab* getSelectedTab() const { return mSelectedTab; }
|
||||
LLAccordionCtrlTab* getSelectedTab() const { return mSelectedTab; }
|
||||
|
||||
bool getFitParent() const {return mFitParent;}
|
||||
|
||||
|
|
|
|||
|
|
@ -2723,7 +2723,10 @@ LLOnHoverChangeableTextSegment::LLOnHoverChangeableTextSegment( LLStyleConstSP s
|
|||
F32 LLOnHoverChangeableTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)
|
||||
{
|
||||
F32 result = LLNormalTextSegment::draw(start, end, selection_start, selection_end, draw_rect);
|
||||
mStyle = mNormalStyle;
|
||||
if (end == mEnd - mStart)
|
||||
{
|
||||
mStyle = mNormalStyle;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -366,7 +366,7 @@ std::string LLUrlEntryAgent::getTooltip(const std::string &string) const
|
|||
bool LLUrlEntryAgent::underlineOnHoverOnly(const std::string &string) const
|
||||
{
|
||||
std::string url = getUrl(string);
|
||||
return LLStringUtil::endsWith(url, "/about");
|
||||
return LLStringUtil::endsWith(url, "/about") || LLStringUtil::endsWith(url, "/inspect");
|
||||
}
|
||||
|
||||
std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
|
||||
|
|
|
|||
|
|
@ -699,8 +699,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
{
|
||||
LLStyle::Params link_params(style_params);
|
||||
link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
|
||||
// Convert the name to a hotlink and add to message.
|
||||
mEditor->appendText(chat.mFromName + delimiter, false, link_params);
|
||||
// Add link to avatar's inspector and delimiter to message.
|
||||
mEditor->appendText(link_params.link_href, false, style_params);
|
||||
mEditor->appendText(delimiter, false, style_params);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3989,6 +3989,11 @@ std::string LLObjectBridge::getLabelSuffix() const
|
|||
{
|
||||
if (get_is_item_worn(mUUID))
|
||||
{
|
||||
if (!isAgentAvatarValid())
|
||||
{
|
||||
return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
|
||||
}
|
||||
|
||||
std::string attachment_point_name = gAgentAvatarp->getAttachedPointName(mUUID);
|
||||
|
||||
// e.g. "(worn on ...)" / "(attached to ...)"
|
||||
|
|
|
|||
|
|
@ -403,6 +403,12 @@ void LLOutfitsList::onOpen(const LLSD& /*info*/)
|
|||
|
||||
mIsInitialized = true;
|
||||
}
|
||||
|
||||
LLAccordionCtrlTab* selected_tab = mAccordion->getSelectedTab();
|
||||
if (!selected_tab) return;
|
||||
|
||||
// Pass focus to the selected outfit tab.
|
||||
selected_tab->showAndFocusHeader();
|
||||
}
|
||||
|
||||
void LLOutfitsList::refreshList(const LLUUID& category_id)
|
||||
|
|
|
|||
|
|
@ -46,20 +46,12 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
|
|||
if (mMap.find(source) == mMap.end())
|
||||
{
|
||||
LLStyle::Params style_params;
|
||||
if (source != LLUUID::null && source != gAgent.getID() )
|
||||
if (source != LLUUID::null)
|
||||
{
|
||||
style_params.color.control = "HTMLLinkColor";
|
||||
style_params.readonly_color.control = "HTMLLinkColor";
|
||||
style_params.link_href =
|
||||
LLSLURL("agent", source, "inspect").getSLURLString();
|
||||
style_params.link_href = LLSLURL("agent", source, "inspect").getSLURLString();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Make the resident's own name white and don't make the name clickable.
|
||||
style_params.color = LLColor4::white;
|
||||
style_params.readonly_color = LLColor4::white;
|
||||
}
|
||||
|
||||
mMap[source] = style_params;
|
||||
}
|
||||
return mMap[source];
|
||||
|
|
|
|||
|
|
@ -5950,7 +5950,8 @@ void LLObjectAttachToAvatar::confirmReplaceAttachment(S32 option, LLViewerJointA
|
|||
delta = delta * 0.5f;
|
||||
walkToSpot -= delta;
|
||||
|
||||
CallbackData* user_data = new CallbackData(attachment_point, mReplace); // *TODO: leak if the callback isn't called?
|
||||
// The callback will be called even if avatar fails to get close enough to the object, so we won't get a memory leak.
|
||||
CallbackData* user_data = new CallbackData(attachment_point, mReplace);
|
||||
gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(walkToSpot), "Attach", NULL, onNearAttachObject, user_data, stop_distance);
|
||||
gAgentCamera.clearFocusObject();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5641,6 +5641,15 @@ BOOL LLVOAvatar::canAttachMoreObjects() const
|
|||
return (getNumAttachments() < MAX_AGENT_ATTACHMENTS);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// canAttachMoreObjects()
|
||||
// Returns true if we can attach <n> more objects.
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL LLVOAvatar::canAttachMoreObjects(U32 n) const
|
||||
{
|
||||
return (getNumAttachments() + n) <= MAX_AGENT_ATTACHMENTS;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// lazyAttach()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -687,6 +687,7 @@ public:
|
|||
void rebuildHUD();
|
||||
void resetHUDAttachments();
|
||||
BOOL canAttachMoreObjects() const;
|
||||
BOOL canAttachMoreObjects(U32 n) const;
|
||||
protected:
|
||||
U32 getNumAttachments() const; // O(N), not O(1)
|
||||
|
||||
|
|
|
|||
|
|
@ -869,7 +869,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
|
|||
setMenuItemVisible(menu, "wear_wear", n_already_worn == 0 && n_worn == 0 && can_be_worn);
|
||||
setMenuItemEnabled(menu, "wear_wear", n_already_worn == 0 && n_worn == 0);
|
||||
setMenuItemVisible(menu, "wear_add", wear_add_visible);
|
||||
setMenuItemEnabled(menu, "wear_add", n_items == 1 && canAddWearable(ids.front()));
|
||||
setMenuItemEnabled(menu, "wear_add", canAddWearables(ids));
|
||||
setMenuItemVisible(menu, "wear_replace", n_worn == 0 && n_already_worn != 0 && can_be_worn);
|
||||
//visible only when one item selected and this item is worn
|
||||
setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);
|
||||
|
|
@ -978,31 +978,61 @@ void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)
|
|||
LLAgentWearables::createWearable(item->getWearableType(), true);
|
||||
}
|
||||
|
||||
// Can we wear another wearable of the given item's wearable type?
|
||||
// Returns true if all the given objects and clothes can be added.
|
||||
// static
|
||||
bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id)
|
||||
bool LLWearableItemsList::ContextMenu::canAddWearables(const uuid_vec_t& item_ids)
|
||||
{
|
||||
// TODO: investigate wearables may not be loaded at this point EXT-8231
|
||||
|
||||
LLViewerInventoryItem* item = gInventory.getItem(item_id);
|
||||
if (!item)
|
||||
U32 n_objects = 0;
|
||||
boost::unordered_map<LLWearableType::EType, U32> clothes_by_type;
|
||||
|
||||
// Count given clothes (by wearable type) and objects.
|
||||
for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it)
|
||||
{
|
||||
LLViewerInventoryItem* item = gInventory.getItem(*it);
|
||||
if (!item)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (item->getType() == LLAssetType::AT_OBJECT)
|
||||
{
|
||||
++n_objects;
|
||||
}
|
||||
else if (item->getType() == LLAssetType::AT_CLOTHING)
|
||||
{
|
||||
++clothes_by_type[item->getWearableType()];
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "Unexpected wearable type" << llendl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check whether we can add all the objects.
|
||||
if (!isAgentAvatarValid() || !gAgentAvatarp->canAttachMoreObjects(n_objects))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (item->getType() == LLAssetType::AT_OBJECT)
|
||||
// Check whether we can add all the clothes.
|
||||
boost::unordered_map<LLWearableType::EType, U32>::const_iterator m_it;
|
||||
for (m_it = clothes_by_type.begin(); m_it != clothes_by_type.end(); ++m_it)
|
||||
{
|
||||
// *TODO: is this the right check?
|
||||
return isAgentAvatarValid() && gAgentAvatarp->canAttachMoreObjects();
|
||||
LLWearableType::EType w_type = m_it->first;
|
||||
U32 n_clothes = m_it->second;
|
||||
|
||||
U32 wearable_count = gAgentWearables.getWearableCount(w_type);
|
||||
if ((wearable_count + n_clothes) > LLAgentWearables::MAX_CLOTHING_PER_TYPE)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (item->getType() != LLAssetType::AT_CLOTHING)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
U32 wearable_count = gAgentWearables.getWearableCount(item->getWearableType());
|
||||
return wearable_count < LLAgentWearables::MAX_CLOTHING_PER_TYPE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// EOF
|
||||
|
|
|
|||
|
|
@ -431,7 +431,7 @@ public:
|
|||
static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);
|
||||
static void updateMask(U32& mask, LLAssetType::EType at);
|
||||
static void createNewWearable(const LLUUID& item_id);
|
||||
static bool canAddWearable(const LLUUID& item_id);
|
||||
static bool canAddWearables(const uuid_vec_t& item_ids);
|
||||
|
||||
LLWearableItemsList* mParent;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
layout="topleft"
|
||||
name="Mockup Tab"
|
||||
selection_enabled="true"
|
||||
tab_stop="false"
|
||||
title="Mockup Tab"
|
||||
translate="false"
|
||||
width="0">
|
||||
|
|
|
|||
Loading…
Reference in New Issue