summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2010-02-12 13:46:21 -0500
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2010-02-12 13:46:21 -0500
commitdc8a9dc57d41723338a0881a29c5652924977ccf (patch)
tree272cd5624749a1ff720ad9674412060c33978cdb /indra/newview
parent1e76fc2b1f4e735105f2d45d73ea5a92dbad4e05 (diff)
parent6e0ebfe18c431465f6d1bc52e079c7a745419de5 (diff)
merge
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/app_settings/settings.xml33
-rw-r--r--indra/newview/llagent.cpp4
-rw-r--r--indra/newview/llagent.h2
-rw-r--r--indra/newview/llagentui.cpp8
-rw-r--r--indra/newview/llagentwearables.cpp87
-rw-r--r--indra/newview/llagentwearables.h3
-rw-r--r--indra/newview/llappearancemgr.cpp5
-rw-r--r--indra/newview/llcallfloater.cpp5
-rw-r--r--indra/newview/llcallingcard.cpp17
-rw-r--r--indra/newview/llchathistory.cpp50
-rw-r--r--indra/newview/llface.cpp65
-rw-r--r--indra/newview/llface.h7
-rw-r--r--indra/newview/llfavoritesbar.cpp7
-rw-r--r--indra/newview/llfeaturemanager.cpp1
-rw-r--r--indra/newview/llfloatergesture.cpp28
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp22
-rw-r--r--indra/newview/llfloaterpreference.cpp132
-rw-r--r--indra/newview/llfloaterpreference.h3
-rw-r--r--indra/newview/llfloaterproperties.cpp6
-rw-r--r--indra/newview/llfloatertools.cpp4
-rw-r--r--indra/newview/llfloateruipreview.cpp3
-rw-r--r--indra/newview/llfloaterwater.cpp2
-rw-r--r--indra/newview/llfloaterwindlight.cpp2
-rw-r--r--indra/newview/llfolderview.cpp26
-rw-r--r--indra/newview/llfolderview.h5
-rw-r--r--indra/newview/llgroupmgr.cpp9
-rw-r--r--indra/newview/llgroupmgr.h10
-rw-r--r--indra/newview/llimfloater.cpp1
-rw-r--r--indra/newview/llimfloatercontainer.cpp32
-rw-r--r--indra/newview/llimfloatercontainer.h5
-rw-r--r--indra/newview/llimview.cpp33
-rw-r--r--indra/newview/llimview.h2
-rw-r--r--indra/newview/llinventorybridge.cpp5
-rw-r--r--indra/newview/llinventoryfunctions.cpp117
-rw-r--r--indra/newview/llinventorypanel.cpp1
-rw-r--r--indra/newview/llnotificationalerthandler.cpp6
-rw-r--r--indra/newview/llpanelgroupinvite.cpp40
-rw-r--r--indra/newview/llpanelgroupinvite.h4
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp21
-rw-r--r--indra/newview/llpanelimcontrolpanel.h3
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp15
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.cpp2
-rw-r--r--indra/newview/llpanelpicks.cpp11
-rw-r--r--indra/newview/llpanelplaces.cpp3
-rw-r--r--indra/newview/llplacesinventorypanel.cpp1
-rw-r--r--indra/newview/llpreviewscript.cpp4
-rw-r--r--indra/newview/llscriptfloater.cpp113
-rw-r--r--indra/newview/llscriptfloater.h34
-rw-r--r--indra/newview/llsearchcombobox.cpp1
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp9
-rw-r--r--indra/newview/llslurl.cpp13
-rw-r--r--indra/newview/llslurl.h1
-rw-r--r--indra/newview/llstylemap.cpp4
-rw-r--r--indra/newview/lltexturefetch.cpp7
-rw-r--r--indra/newview/lltoastimpanel.cpp37
-rw-r--r--indra/newview/lltoastnotifypanel.cpp9
-rw-r--r--indra/newview/lltoolpie.cpp6
-rw-r--r--indra/newview/llviewermenu.cpp24
-rw-r--r--indra/newview/llviewermenufile.cpp130
-rw-r--r--indra/newview/llviewerobjectlist.h4
-rw-r--r--indra/newview/llviewertexture.cpp45
-rw-r--r--indra/newview/llviewerwindow.cpp2
-rw-r--r--indra/newview/llvoavatar.cpp14
-rw-r--r--indra/newview/llvoicechannel.cpp11
-rw-r--r--indra/newview/llvoicechannel.h4
-rw-r--r--indra/newview/llvovolume.cpp4
-rw-r--r--indra/newview/pipeline.cpp1
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml13
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml28
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml1
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_editor.xml8
81 files changed, 835 insertions, 645 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index db4e0b5afd..d0c2f3cb34 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8456,6 +8456,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowVoiceVisualizersInCalls</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables in-world voice visualizers, voice gestures and lip-sync while in group or P2P calls.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ShowVolumeSettingsPopup</key>
<map>
<key>Comment</key>
@@ -9949,28 +9960,6 @@
<key>Value</key>
<integer>15</integer>
</map>
- <key>UIButtonImageTopPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Top Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
- <key>UIButtonImageBottomPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Bottom Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
<key>UploadBakedTexOld</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 59f61dfdfb..7929946620 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -5027,9 +5027,9 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const
}
}
-BOOL LLAgent::isInGroup(const LLUUID& group_id) const
+BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod /* FALSE */) const
{
- if (isGodlike())
+ if (!ingnore_God_mod && isGodlike())
return true;
S32 count = mGroups.count();
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index beede7fbe3..1573fd7131 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -982,7 +982,7 @@ private:
//--------------------------------------------------------------------
public:
// Checks against all groups in the entire agent group list.
- BOOL isInGroup(const LLUUID& group_id) const;
+ BOOL isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const;
protected:
// Only used for building titles.
BOOL isGroupMember() const { return !mGroupID.isNull(); }
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 7404fe5bc4..72ab9235cf 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -150,11 +150,17 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
sim_access_string.c_str());
break;
case LOCATION_FORMAT_NO_MATURITY:
- case LOCATION_FORMAT_FULL:
buffer = llformat("%s (%d, %d, %d)",
region_name.c_str(),
pos_x, pos_y, pos_z);
break;
+ case LOCATION_FORMAT_FULL:
+ buffer = llformat("%s (%d, %d, %d)%s%s",
+ region_name.c_str(),
+ pos_x, pos_y, pos_z,
+ sim_access_string.empty() ? "" : " - ",
+ sim_access_string.c_str());
+ break;
}
}
else
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 9ff5de29c3..68ee9cd612 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -299,6 +299,10 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
{
gAgentWearables.makeNewOutfitDone(mType, mIndex);
}
+ if (mTodo & CALL_WEARITEM)
+ {
+ LLAppearanceManager::instance().addCOFItemLink(inv_item, true);
+ }
}
void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
@@ -510,7 +514,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
type,
index,
new_wearable,
- addWearableToAgentInventoryCallback::CALL_UPDATE);
+ addWearableToAgentInventoryCallback::CALL_WEARITEM);
LLUUID category_id;
if (save_in_lost_and_found)
{
@@ -1290,25 +1294,29 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
j,
new_wearable,
todo);
- if (isWearableCopyable((EWearableType)type, j))
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
- }
- else
+ llassert(item);
+ if (item)
{
- move_inventory_item(
- gAgent.getID(),
- gAgent.getSessionID(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
+ if (isWearableCopyable((EWearableType)type, j))
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ folder_id,
+ new_name,
+ cb);
+ }
+ else
+ {
+ move_inventory_item(
+ gAgent.getID(),
+ gAgent.getSessionID(),
+ item->getUUID(),
+ folder_id,
+ new_name,
+ cb);
+ }
}
}
}
@@ -1597,31 +1605,32 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
LLWearable* new_wearable = wearables[i];
LLPointer<LLInventoryItem> new_item = items[i];
- const EWearableType type = new_wearable->getType();
- wearables_to_remove[type] = FALSE;
-
- // MULTI_WEARABLE: using 0th
- LLWearable* old_wearable = getWearable(type, 0);
- if (old_wearable)
+ llassert(new_wearable);
+ if (new_wearable)
{
- const LLUUID& old_item_id = getWearableItemID(type, 0);
- if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
- (old_item_id == new_item->getUUID()))
- {
- lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
- continue;
- }
+ const EWearableType type = new_wearable->getType();
+ wearables_to_remove[type] = FALSE;
- // Assumes existing wearables are not dirty.
- if (old_wearable->isDirty())
+ // MULTI_WEARABLE: using 0th
+ LLWearable* old_wearable = getWearable(type, 0);
+ if (old_wearable)
{
- llassert(0);
- continue;
+ const LLUUID& old_item_id = getWearableItemID(type, 0);
+ if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
+ (old_item_id == new_item->getUUID()))
+ {
+ lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
+ continue;
+ }
+
+ // Assumes existing wearables are not dirty.
+ if (old_wearable->isDirty())
+ {
+ llassert(0);
+ continue;
+ }
}
- }
- if (new_wearable)
- {
new_wearable->setItemID(new_item->getUUID());
setWearable(type,0,new_wearable);
}
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index b4f58674af..858540a5f5 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -244,7 +244,8 @@ private:
CALL_UPDATE = 1,
CALL_RECOVERDONE = 2,
CALL_CREATESTANDARDDONE = 4,
- CALL_MAKENEWOUTFITDONE = 8
+ CALL_MAKENEWOUTFITDONE = 8,
+ CALL_WEARITEM = 16
};
// MULTI-WEARABLE: index is an EWearableType - more confusing usage.
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 062e291161..eb4a47664b 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -676,6 +676,11 @@ void LLAppearanceManager::filterWearableItems(
if (!item->isWearableType())
continue;
EWearableType type = item->getWearableType();
+ if(type < 0 || type >= WT_COUNT)
+ {
+ LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL;
+ continue;
+ }
items_by_type[type].push_back(item);
}
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 0aaaa8e705..76e058a1c3 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -304,7 +304,9 @@ void LLCallFloater::updateSession()
updateAgentModeratorState();
//show floater for voice calls & only in CONNECTED to voice channel state
- if (!is_local_chat && LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())
+ if (!is_local_chat &&
+ voice_channel &&
+ LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())
{
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
bool show_me = !(im_floater && im_floater->getVisible());
@@ -333,6 +335,7 @@ void LLCallFloater::refreshParticipantList()
{
mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT);
mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));
+ mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS);
if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
{
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 996139fccc..c3bda26aac 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -63,6 +63,7 @@
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
+#include "llavataractions.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -711,7 +712,21 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
if(notify)
{
// Popup a notify box with online status of this agent
- LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args);
+ LLNotificationPtr notification;
+
+ if (online)
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOnline",
+ args,
+ LLSD().with("respond_on_mousedown", TRUE),
+ boost::bind(&LLAvatarActions::startIM, agent_id));
+ }
+ else
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOffline", args);
+ }
// If there's an open IM session with this agent, send a notification there too.
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 13a5df353d..9368d9cb7c 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -66,6 +66,8 @@ static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
const static std::string NEW_LINE(rawstr_to_utf8("\n"));
+const static U32 LENGTH_OF_TIME_STR = std::string("12:00").length();
+
// support for secondlife:///app/objectim/{UUID}/ SLapps
class LLObjectIMHandler : public LLCommandHandler
{
@@ -257,7 +259,9 @@ public:
mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
- if(chat.mFromID.isNull())
+
+ //*TODO overly defensive thing, source type should be maintained out there
+ if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM)
{
mSourceType = CHAT_SOURCE_SYSTEM;
}
@@ -267,17 +271,13 @@ public:
userName->setReadOnlyColor(style_params.readonly_color());
userName->setColor(style_params.color());
- if(!chat.mFromName.empty())
- {
- userName->setValue(chat.mFromName);
- mFrom = chat.mFromName;
- }
- else
+ userName->setValue(chat.mFromName);
+ if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)
{
- std::string SL = LLTrans::getString("SECOND_LIFE");
- userName->setValue(SL);
+ userName->setValue(LLTrans::getString("SECOND_LIFE"));
}
+
mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;
setTimeField(chat);
@@ -287,20 +287,17 @@ public:
if(mSourceType != CHAT_SOURCE_AGENT)
icon->setDrawTooltip(false);
- if(!chat.mFromID.isNull())
+ switch (mSourceType)
{
- if(mSourceType != CHAT_SOURCE_AGENT)
- icon->setValue(LLSD("OBJECT_Icon"));
- else
+ case CHAT_SOURCE_AGENT:
icon->setValue(chat.mFromID);
-
-
- }
- else if (userName->getValue().asString()==LLTrans::getString("SECOND_LIFE"))
- {
- icon->setValue(LLSD("SL_Logo"));
+ break;
+ case CHAT_SOURCE_OBJECT:
+ icon->setValue(LLSD("OBJECT_Icon"));
+ break;
+ case CHAT_SOURCE_SYSTEM:
+ icon->setValue(LLSD("SL_Logo"));
}
-
}
/*virtual*/ void draw()
@@ -544,6 +541,7 @@ void LLChatHistory::clear()
void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params)
{
bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean();
+
if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())
{
mUnreadChatSources.insert(chat.mFromName);
@@ -609,6 +607,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
style_params.font.style = "ITALIC";
}
+ //*HACK we graying out chat history by graying out messages that contains full date in a time string
+ bool message_from_log = chat.mTimeStr.length() > LENGTH_OF_TIME_STR;
+ if (message_from_log)
+ {
+ style_params.color(LLColor4::grey);
+ style_params.readonly_color(LLColor4::grey);
+ }
+
if (use_plain_text_chat_history)
{
mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
@@ -644,10 +650,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
false, link_params);
}
- else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() )
+ else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
{
LLStyle::Params link_params(style_params);
- link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
+ 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);
}
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index d12fd48ffb..80acc71a41 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -182,6 +182,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mAtlasInfop = NULL ;
mUsingAtlas = FALSE ;
+ mHasMedia = FALSE ;
}
@@ -1327,17 +1328,33 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
return TRUE;
}
+//check if the face has a media
+BOOL LLFace::hasMedia() const
+{
+ if(mHasMedia)
+ {
+ return TRUE ;
+ }
+ if(mTexture.notNull())
+ {
+ return mTexture->hasParcelMedia() ; //if has a parcel media
+ }
+
+ return FALSE ; //no media.
+}
+
const F32 LEAST_IMPORTANCE = 0.05f ;
const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;
F32 LLFace::getTextureVirtualSize()
{
F32 radius;
- F32 cos_angle_to_view_dir;
- mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius);
+ F32 cos_angle_to_view_dir;
+ BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
- if (mPixelArea <= 0)
+ if (mPixelArea < 0.0001f || !in_frustum)
{
+ setVirtualSize(0.f) ;
return 0.f;
}
@@ -1374,23 +1391,48 @@ F32 LLFace::getTextureVirtualSize()
}
}
+ setVirtualSize(face_area) ;
+
return face_area;
}
-F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
+BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
//get area of circle around face
LLVector3 center = getPositionAgent();
- LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
-
+ LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
LLViewerCamera* camera = LLViewerCamera::getInstance();
+
+ F32 size_squared = size.lengthSquared() ;
LLVector3 lookAt = center - camera->getOrigin();
- F32 dist = lookAt.normVec() ;
+ F32 dist = lookAt.normVec() ;
//get area of circle around node
- F32 app_angle = atanf(size.length()/dist);
+ F32 app_angle = atanf(fsqrtf(size_squared) / dist);
radius = app_angle*LLDrawable::sCurPixelAngle;
- F32 face_area = radius*radius * 3.14159f;
+ mPixelArea = radius*radius * 3.14159f;
+ cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+
+ //if has media, check if the face is out of the view frustum.
+ if(hasMedia())
+ {
+ if(!camera->AABBInFrustum(center, size))
+ {
+ mImportanceToCamera = 0.f ;
+ return false ;
+ }
+ if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ else
+ {
+ if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared)
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ }
+ }
if(dist < mBoundingSphereRadius) //camera is very close
{
@@ -1398,12 +1440,11 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
mImportanceToCamera = 1.0f ;
}
else
- {
- cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+ {
mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
}
- return face_area ;
+ return true ;
}
//the projection of the face partially overlaps with the screen
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index e12b64a2f2..67dd97e6f7 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -194,6 +194,9 @@ public:
F32 getTextureVirtualSize() ;
F32 getImportanceToCamera()const {return mImportanceToCamera ;}
+ void setHasMedia(bool has_media) { mHasMedia = has_media ;}
+ BOOL hasMedia() const ;
+
//for atlas
LLTextureAtlasSlot* getAtlasInfo() ;
void setAtlasInUse(BOOL flag);
@@ -208,7 +211,7 @@ public:
private:
F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
- F32 calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
+ BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
public:
static F32 calcImportanceToCamera(F32 to_view_dir, F32 dist);
@@ -262,7 +265,7 @@ private:
//based on the distance from the face to the view point and the angle from the face center to the view direction.
F32 mImportanceToCamera ;
F32 mBoundingSphereRadius ;
-
+ bool mHasMedia ;
//atlas
LLPointer<LLTextureAtlasSlot> mAtlasInfop ;
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 1e8a739d78..bf7c735488 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -1264,8 +1264,11 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn
void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)
{
LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId);
-
- items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ llassert(beforeItem);
+ if (beforeItem)
+ {
+ items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ }
}
// EOF
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index fb724f30e0..fbb90c69f3 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -287,6 +287,7 @@ BOOL LLFeatureManager::loadFeatureTables()
if (!flp)
{
LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
+ return FALSE;
}
S32 available;
F32 recommended;
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index b684e1f985..9c1ac2631d 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -203,12 +203,12 @@ BOOL LLFloaterGesture::postBuild()
gInventory.addObserver(this);
fetchDescendents(folders);
- buildGestureList();
-
- mGestureList->setFocus(TRUE);
-
if (mGestureList)
{
+ buildGestureList();
+
+ mGestureList->setFocus(TRUE);
+
const BOOL ascending = TRUE;
mGestureList->sortByColumn(std::string("name"), ascending);
mGestureList->selectFirstItem();
@@ -223,10 +223,10 @@ BOOL LLFloaterGesture::postBuild()
void LLFloaterGesture::refreshAll()
{
- buildGestureList();
-
if (!mGestureList) return;
+ buildGestureList();
+
if (mSelectedID.isNull())
{
mGestureList->selectFirstItem();
@@ -427,8 +427,13 @@ void LLFloaterGesture::onClickPlay()
BOOL inform_server = TRUE;
BOOL deactivate_similar = FALSE;
LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
- LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
- LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ llassert(item);
+ if (item)
+ {
+ LLGestureManager::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar);
+ LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ }
}
else
{
@@ -510,15 +515,16 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
return;
LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
+ llassert(gesture_dir);
LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);
for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
{
LLInventoryItem* item = gInventory.getItem(*it);
- LLStringUtil::format_map_t string_args;
- string_args["[COPY_NAME]"] = item->getName();
- if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+ if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
{
+ LLStringUtil::format_map_t string_args;
+ string_args["[COPY_NAME]"] = item->getName();
LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << " "<< item->getUUID() << " into "
<< gesture_dir->getName() << " "<< gesture_dir->getUUID() << LL_ENDL;
copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(),
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index 90db8988b2..94b5ebba00 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -112,10 +112,15 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
@@ -124,10 +129,15 @@ void LLNotificationChannelPanel::onClickNotificationReject(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 3c9f7492a2..43111d76f7 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -110,8 +110,6 @@
const F32 MAX_USER_FAR_CLIP = 512.f;
const F32 MIN_USER_FAR_CLIP = 64.f;
-const S32 ASPECT_RATIO_STR_LEN = 100;
-
class LLVoiceSetKeyDialog : public LLModalDialog
{
public:
@@ -283,7 +281,6 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator)
}
// static
std::string LLFloaterPreference::sSkin = "";
-F32 LLFloaterPreference::sAspectRatio = 0.0;
//////////////////////////////////////////////
// LLFloaterPreference
@@ -324,11 +321,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));
- mCommitCallbackRegistrar.add("Pref.AutoDetectAspect", boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));
mCommitCallbackRegistrar.add("Pref.ParcelMediaAutoPlayEnable", boost::bind(&LLFloaterPreference::onCommitParcelMediaAutoPlayEnable, this));
mCommitCallbackRegistrar.add("Pref.MediaEnabled", boost::bind(&LLFloaterPreference::onCommitMediaEnabled, this));
mCommitCallbackRegistrar.add("Pref.MusicEnabled", boost::bind(&LLFloaterPreference::onCommitMusicEnabled, this));
- mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio", boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));
mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
@@ -359,12 +354,7 @@ BOOL LLFloaterPreference::postBuild()
LLFloaterPreference::~LLFloaterPreference()
{
// clean up user data
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
LLComboBox* ctrl_window_size = getChild<LLComboBox>("windowsize combo");
- for (S32 i = 0; i < ctrl_aspect_ratio->getItemCount(); i++)
- {
- ctrl_aspect_ratio->setCurrentByIndex(i);
- }
for (S32 i = 0; i < ctrl_window_size->getItemCount(); i++)
{
ctrl_window_size->setCurrentByIndex(i);
@@ -514,8 +504,6 @@ void LLFloaterPreference::cancel()
LLFloaterReg::hideInstance("pref_voicedevicesettings");
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
-
}
void LLFloaterPreference::onOpen(const LLSD& key)
@@ -968,37 +956,6 @@ void LLFloaterPreference::disableUnavailableSettings()
}
}
-void LLFloaterPreference::onCommitAutoDetectAspect()
-{
- BOOL auto_detect = getChild<LLCheckBoxCtrl>("aspect_auto_detect")->get();
- F32 ratio;
-
- if (auto_detect)
- {
- S32 numerator = 0;
- S32 denominator = 0;
-
- // clear any aspect ratio override
- gViewerWindow->mWindow->setNativeAspectRatio(0.f);
- fractionFromDecimal(gViewerWindow->mWindow->getNativeAspectRatio(), numerator, denominator);
-
- std::string aspect;
- if (numerator != 0)
- {
- aspect = llformat("%d:%d", numerator, denominator);
- }
- else
- {
- aspect = llformat("%.3f", gViewerWindow->mWindow->getNativeAspectRatio());
- }
-
- getChild<LLComboBox>( "aspect_ratio")->setLabel(aspect);
-
- ratio = gViewerWindow->mWindow->getNativeAspectRatio();
- gSavedSettings.setF32("FullScreenAspectRatio", ratio);
- }
-}
-
void LLFloaterPreference::onCommitParcelMediaAutoPlayEnable()
{
BOOL autoplay = getChild<LLCheckBoxCtrl>("autoplay_enabled")->get();
@@ -1266,56 +1223,9 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b
}
}
-void LLFloaterPreference::onKeystrokeAspectRatio()
-{
- getChild<LLCheckBoxCtrl>("aspect_auto_detect")->set(FALSE);
-}
-
void LLFloaterPreference::applyResolution()
{
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
gGL.flush();
- char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/
- if (ctrl_aspect_ratio->getCurrentIndex() == -1)
- {
- // *Can't pass const char* from c_str() into strtok
- strncpy(aspect_ratio_text, ctrl_aspect_ratio->getSimple().c_str(), sizeof(aspect_ratio_text) -1); /*Flawfinder: ignore*/
- aspect_ratio_text[sizeof(aspect_ratio_text) -1] = '\0';
- char *element = strtok(aspect_ratio_text, ":/\\");
- if (!element)
- {
- sAspectRatio = 0.f; // will be clamped later
- }
- else
- {
- LLLocale locale(LLLocale::USER_LOCALE);
- sAspectRatio = (F32)atof(element);
- }
-
- // look for denominator
- element = strtok(NULL, ":/\\");
- if (element)
- {
- LLLocale locale(LLLocale::USER_LOCALE);
-
- F32 denominator = (F32)atof(element);
- if (denominator != 0.f)
- {
- sAspectRatio /= denominator;
- }
- }
- }
- else
- {
- sAspectRatio = (F32)ctrl_aspect_ratio->getValue().asReal();
- }
-
- // presumably, user entered a non-numeric value if aspect_ratio == 0.f
- if (sAspectRatio != 0.f)
- {
- sAspectRatio = llclamp(sAspectRatio, 0.2f, 5.f);
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
- }
// Screen resolution
S32 num_resolutions;
@@ -1393,48 +1303,6 @@ BOOL LLPanelPreference::postBuild()
childSetText("email_address",getString("log_in_to_change") );
// childSetText("busy_response", getString("log_in_to_change"));
}
-
-
- if(hasChild("aspect_ratio"))
- {
- // We used to set up fullscreen resolution and window size
- // controls here, see LLFloaterWindowSize::initWindowSizeControls()
-
- if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
- {
- LLFloaterPreference::sAspectRatio = gViewerWindow->getDisplayAspectRatio();
- }
- else
- {
- LLFloaterPreference::sAspectRatio = gSavedSettings.getF32("FullScreenAspectRatio");
- }
-
- getChild<LLComboBox>("aspect_ratio")->setTextEntryCallback(boost::bind(&LLPanelPreference::setControlFalse, this, LLSD("FullScreenAutoDetectAspectRatio") ));
-
-
- S32 numerator = 0;
- S32 denominator = 0;
- fractionFromDecimal(LLFloaterPreference::sAspectRatio, numerator, denominator);
-
- LLUIString aspect_ratio_text = getString("aspect_ratio_text");
- if (numerator != 0)
- {
- aspect_ratio_text.setArg("[NUM]", llformat("%d", numerator));
- aspect_ratio_text.setArg("[DEN]", llformat("%d", denominator));
- }
- else
- {
- aspect_ratio_text = llformat("%.3f", LLFloaterPreference::sAspectRatio);
- }
-
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
- //mCtrlAspectRatio->setCommitCallback(onSelectAspectRatio, this);
- // add default aspect ratios
- ctrl_aspect_ratio->add(aspect_ratio_text, &LLFloaterPreference::sAspectRatio, ADD_TOP);
- ctrl_aspect_ratio->setCurrentByIndex(0);
-
- refresh();
- }
//////////////////////PanelPrivacy ///////////////////
if (hasChild("media_enabled"))
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 0827c7c2b2..93b39d72bc 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -128,10 +128,8 @@ public:
void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name);
- void onKeystrokeAspectRatio();
// void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
- void onCommitAutoDetectAspect();
void onCommitParcelMediaAutoPlayEnable();
void onCommitMediaEnabled();
void onCommitMusicEnabled();
@@ -142,7 +140,6 @@ public:
void buildPopupLists();
static void refreshSkin(void* data);
static void cleanupBadSetting();
- static F32 sAspectRatio;
private:
static std::string sSkin;
bool mGotPersonalInfo;
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index bde86a4034..5c0593ad29 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -880,7 +880,11 @@ void LLFloaterProperties::dirtyAll()
iter != inst_list.end(); ++iter)
{
LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter);
- floater->dirty();
+ llassert(floater); // else cast failed - wrong type D:
+ if (floater)
+ {
+ floater->dirty();
+ }
}
}
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 4edd09b02c..e2b083a29b 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -666,8 +666,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible );
if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible );
- if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
- if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
// Land buttons
BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 3e804bef9d..f61c86db14 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -362,8 +362,7 @@ BOOL LLFadeEventTimer::tick()
if(NULL == mParent) // no more need to tick, so suicide
{
- delete this;
- return FALSE;
+ return TRUE;
}
// Set up colors
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
index 66a1f6701f..1bbee2625c 100644
--- a/indra/newview/llfloaterwater.cpp
+++ b/indra/newview/llfloaterwater.cpp
@@ -574,12 +574,10 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r
LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");
}
std::string name = combo_box->getSelectedValue().asString();
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
index ea6fda7303..c1b15c578c 100644
--- a/indra/newview/llfloaterwindlight.cpp
+++ b/indra/newview/llfloaterwindlight.cpp
@@ -749,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS
LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
}
std::string name(combo_box->getSelectedValue().asString());
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 57c7ba8e27..8dbdfff635 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -195,7 +195,8 @@ LLFolderView::LLFolderView(const Params& p)
mCallbackRegistrar(NULL),
mParentPanel(p.parent_panel),
mUseEllipses(false),
- mDraggingOverItem(NULL)
+ mDraggingOverItem(NULL),
+ mStatusTextBox(NULL)
{
LLRect rect = p.rect;
LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
@@ -231,6 +232,18 @@ LLFolderView::LLFolderView(const Params& p)
mRenamer = LLUICtrlFactory::create<LLLineEditor> (params);
addChild(mRenamer);
+ // Textbox
+ LLTextBox::Params text_p;
+ LLRect new_r(5, 13-50, 300, 0-50);
+ text_p.name(std::string(p.name));
+ text_p.rect(new_r);
+ text_p.font(getLabelFontForStyle(mLabelStyle));
+ text_p.visible(false);
+ text_p.allow_html(true);
+ mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p);
+ //addChild(mStatusTextBox);
+
+
// make the popup menu available
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (!menu)
@@ -253,6 +266,7 @@ LLFolderView::~LLFolderView( void )
mScrollContainer = NULL;
mRenameItem = NULL;
mRenamer = NULL;
+ mStatusTextBox = NULL;
if( gEditMenuHandler == this )
{
@@ -874,7 +888,7 @@ void LLFolderView::draw()
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
- LLFontGL* font = getLabelFontForStyle(mLabelStyle);
+ //LLFontGL* font = getLabelFontForStyle(mLabelStyle);
// if cursor has moved off of me during drag and drop
// close all auto opened folders
@@ -911,19 +925,23 @@ void LLFolderView::draw()
|| mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)
{
mStatusText.clear();
+ mStatusTextBox->setVisible( FALSE );
}
else
{
if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
{
mStatusText = LLTrans::getString("Searching");
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
else
{
mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage());
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
+ mStatusTextBox->setValue(mStatusText);
+ mStatusTextBox->setVisible( TRUE );
+
}
LLFolderViewFolder::draw();
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 56ebdfcf79..faf6a9cf23 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -62,6 +62,7 @@ class LLLineEditor;
class LLMenuGL;
class LLScrollContainer;
class LLUICtrl;
+class LLTextBox;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewFunctor
@@ -327,7 +328,7 @@ protected:
LLUUID mSelectThisID; // if non null, select this item
- LLPanel* mParentPanel;
+ LLPanel* mParentPanel;
/**
* Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll.
@@ -344,6 +345,8 @@ protected:
public:
static F32 sAutoOpenTime;
+ LLTextBox* mStatusTextBox;
+
};
bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b);
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 4c1019a882..4db75bbd8a 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -677,9 +677,12 @@ void LLGroupMgrGroupData::sendRoleChanges()
break;
}
case RC_UPDATE_ALL:
+ // fall through
case RC_UPDATE_POWERS:
need_power_recalc = true;
+ // fall through
case RC_UPDATE_DATA:
+ // fall through
default:
{
LLGroupRoleData* group_role_data = (*role_it).second;
@@ -762,7 +765,7 @@ void LLGroupMgr::addObserver(LLGroupMgrObserver* observer)
mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
}
-void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer)
+void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
{
if(group_id.notNull() && observer)
{
@@ -792,7 +795,7 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)
}
}
-void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer)
+void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
{
if(group_id.isNull() || !observer)
{
@@ -1364,7 +1367,7 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)
gi->second->mChanged = FALSE;
- // notify LLParticularGroupMgrObserver
+ // notify LLParticularGroupObserver
observer_map_t::iterator obs_it = mParticularObservers.find(group_id);
if(obs_it == mParticularObservers.end())
return;
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 588b4a9034..2c86de8b97 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -53,10 +53,10 @@ protected:
LLUUID mID;
};
-class LLParticularGroupMgrObserver
+class LLParticularGroupObserver
{
public:
- virtual ~LLParticularGroupMgrObserver(){}
+ virtual ~LLParticularGroupObserver(){}
virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0;
};
@@ -313,9 +313,9 @@ public:
~LLGroupMgr();
void addObserver(LLGroupMgrObserver* observer);
- void addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer);
+ void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
void removeObserver(LLGroupMgrObserver* observer);
- void removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer);
+ void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
LLGroupMgrGroupData* getGroupData(const LLUUID& id);
void sendGroupPropertiesRequest(const LLUUID& group_id);
@@ -374,7 +374,7 @@ private:
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
group_map_t mGroups;
- typedef std::set<LLParticularGroupMgrObserver*> observer_set_t;
+ typedef std::set<LLParticularGroupObserver*> observer_set_t;
typedef std::map<LLUUID,observer_set_t> observer_map_t;
observer_map_t mParticularObservers;
};
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 53cdfcc9b2..94b540a7e1 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -271,6 +271,7 @@ BOOL LLIMFloater::postBuild()
mInputEditor->setCommitOnFocusLost( FALSE );
mInputEditor->setRevertOnEsc( FALSE );
mInputEditor->setReplaceNewlinesWithSpaces( FALSE );
+ mInputEditor->setPassDelete( TRUE );
std::string session_name(LLIMModel::instance().getName(mSessionID));
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index ba034609e9..49521b5987 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -93,7 +93,7 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
LLIconCtrl* icon = 0;
- if(gAgent.isInGroup(session_id))
+ if(gAgent.isInGroup(session_id, TRUE))
{
LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();
icon_params.group_id = session_id;
@@ -121,36 +121,6 @@ void LLIMFloaterContainer::onCloseFloater(LLUUID& id)
mSessions.erase(id);
}
-void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type)
-{
- if (APT_PROPERTIES == type)
- {
- LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
- if (avatar_data)
- {
- LLUUID avatar_id = avatar_data->avatar_id;
- LLUUID* cached_avatarId = LLAvatarIconIDCache::getInstance()->get(avatar_id);
- if(cached_avatarId && cached_avatarId->notNull() && avatar_data->image_id != *cached_avatarId)
- {
- LLAvatarIconIDCache::getInstance()->add(avatar_id,avatar_data->image_id);
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, avatar_id), avatar_data->image_id);
- }
- }
- }
-}
-
-void LLIMFloaterContainer::changed(const LLUUID& group_id, LLGroupChange gc)
-{
- if (GC_PROPERTIES == gc)
- {
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
- if (group_data && group_data->mInsigniaID.notNull())
- {
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, group_id), group_data->mInsigniaID);
- }
- }
-}
-
void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)
{
LLUUID session_id = data["from_id"].asUUID();
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index b07ef2d71d..46c0617c01 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -43,7 +43,7 @@
class LLTabContainer;
-class LLIMFloaterContainer : public LLMultiFloater, public LLAvatarPropertiesObserver, public LLParticularGroupMgrObserver
+class LLIMFloaterContainer : public LLMultiFloater
{
public:
LLIMFloaterContainer(const LLSD& seed);
@@ -57,9 +57,6 @@ public:
BOOL select_added_floater,
LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
- void processProperties(void* data, EAvatarProcessorType type);
- void changed(const LLUUID& group_id, LLGroupChange gc);
-
static LLFloater* getCurrentVoiceFloater();
static LLIMFloaterContainer* findInstance();
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 32482a065c..77e3012d26 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -77,6 +77,9 @@ const static std::string IM_FROM_ID("from_id");
const static std::string NO_SESSION("(IM Session Doesn't Exist)");
const static std::string ADHOC_NAME_SUFFIX(" Conference");
+const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other");
+const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent");
+
std::string LLCallDialogManager::sPreviousSessionlName = "";
LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;
std::string LLCallDialogManager::sCurrentSessionlName = "";
@@ -253,12 +256,12 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CALL_STARTED :
message = other_avatar_name + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
break;
case LLVoiceChannel::STATE_CONNECTED :
message = you + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
}
@@ -269,11 +272,11 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CALL_STARTED :
message = you + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
break;
case LLVoiceChannel::STATE_CONNECTED :
message = other_avatar_name + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
}
@@ -288,7 +291,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CONNECTED :
message = you + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
}
@@ -299,7 +302,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
case LLVoiceChannel::STATE_CALL_STARTED :
message = you + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
break;
default:
break;
@@ -1372,7 +1375,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
sSession = session;
- sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3));
+ sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4));
if(sCurrentSessionlName != session->mName)
{
sPreviousSessionlName = sCurrentSessionlName;
@@ -1403,7 +1406,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
-void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
+void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent)
{
LLSD mCallDialogPayload;
LLOutgoingCallDialog* ocd = NULL;
@@ -1423,6 +1426,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
mCallDialogPayload["state"] = new_state;
mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
mCallDialogPayload["session_type"] = sSession->mSessionType;
+ mCallDialogPayload["ended_by_agent"] = ended_by_agent;
switch(new_state)
{
@@ -1618,14 +1622,16 @@ void LLOutgoingCallDialog::show(const LLSD& key)
channel_name = LLTextUtil::formatPhoneNumber(channel_name);
}
childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name);
- childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+ childSetTextArg("nearby_P2P_by_other", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
// skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,
// so no reconnection to nearby chat happens (EXT-4397)
bool voice_works = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string();
childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby);
- childSetTextArg("nearby_P2P", "[RECONNECT_NEARBY]", reconnect_nearby);
+
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ childSetTextArg(nearby_str, "[RECONNECT_NEARBY]", reconnect_nearby);
}
std::string callee_name = mPayload["session_name"].asString();
@@ -1659,6 +1665,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)
{
case LLVoiceChannel::STATE_CALL_STARTED :
getChild<LLTextBox>("calling")->setVisible(true);
+ getChild<LLButton>("Cancel")->setVisible(true);
if(show_oldchannel)
{
getChild<LLTextBox>("leaving")->setVisible(true);
@@ -1680,7 +1687,8 @@ void LLOutgoingCallDialog::show(const LLSD& key)
case LLVoiceChannel::STATE_HUNG_UP :
if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)
{
- getChild<LLTextBox>("nearby_P2P")->setVisible(true);
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ getChild<LLTextBox>(nearby_str)->setVisible(true);
}
else
{
@@ -1699,7 +1707,8 @@ void LLOutgoingCallDialog::hideAllText()
getChild<LLTextBox>("calling")->setVisible(false);
getChild<LLTextBox>("leaving")->setVisible(false);
getChild<LLTextBox>("connecting")->setVisible(false);
- getChild<LLTextBox>("nearby_P2P")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P_by_other")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P_by_agent")->setVisible(false);
getChild<LLTextBox>("nearby")->setVisible(false);
getChild<LLTextBox>("noanswer")->setVisible(false);
}
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 21c7626109..ad6cede727 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -452,7 +452,7 @@ public:
static void initClass();
static void onVoiceChannelChanged(const LLUUID &session_id);
- static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
+ static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent);
protected:
static std::string sPreviousSessionlName;
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index da95eaefca..019a4b22c3 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2434,7 +2434,10 @@ void LLFolderBridge::pasteFromClipboard()
//we have to update inventory locally too
LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
llassert(viitem);
- changeItemParent(model, viitem, parent_id, FALSE);
+ if (viitem)
+ {
+ changeItemParent(model, viitem, parent_id, FALSE);
+ }
}
else
{
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 33623539e9..3553137f53 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -195,6 +195,62 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
}
}
+static void assign_clothing_bodypart_icon(EInventoryIcon &idx, U32 attachment_point)
+{
+ const EWearableType wearable_type = EWearableType(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point);
+ switch(wearable_type)
+ {
+ case WT_SHAPE:
+ idx = BODYPART_SHAPE_ICON_NAME;
+ break;
+ case WT_SKIN:
+ idx = BODYPART_SKIN_ICON_NAME;
+ break;
+ case WT_HAIR:
+ idx = BODYPART_HAIR_ICON_NAME;
+ break;
+ case WT_EYES:
+ idx = BODYPART_EYES_ICON_NAME;
+ break;
+ case WT_SHIRT:
+ idx = CLOTHING_SHIRT_ICON_NAME;
+ break;
+ case WT_PANTS:
+ idx = CLOTHING_PANTS_ICON_NAME;
+ break;
+ case WT_SHOES:
+ idx = CLOTHING_SHOES_ICON_NAME;
+ break;
+ case WT_SOCKS:
+ idx = CLOTHING_SOCKS_ICON_NAME;
+ break;
+ case WT_JACKET:
+ idx = CLOTHING_JACKET_ICON_NAME;
+ break;
+ case WT_GLOVES:
+ idx = CLOTHING_GLOVES_ICON_NAME;
+ break;
+ case WT_UNDERSHIRT:
+ idx = CLOTHING_UNDERSHIRT_ICON_NAME;
+ break;
+ case WT_UNDERPANTS:
+ idx = CLOTHING_UNDERPANTS_ICON_NAME;
+ break;
+ case WT_SKIRT:
+ idx = CLOTHING_SKIRT_ICON_NAME;
+ break;
+ case WT_ALPHA:
+ idx = CLOTHING_ALPHA_ICON_NAME;
+ break;
+ case WT_TATTOO:
+ idx = CLOTHING_TATTOO_ICON_NAME;
+ break;
+ default:
+ break;
+ }
+}
+
+
const std::string& get_item_icon_name(LLAssetType::EType asset_type,
LLInventoryType::EType inventory_type,
U32 attachment_point,
@@ -249,62 +305,11 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type,
break;
case LLAssetType::AT_CLOTHING:
idx = CLOTHING_ICON_NAME;
- case LLAssetType::AT_BODYPART :
- if(LLAssetType::AT_BODYPART == asset_type)
- {
- idx = BODYPART_ICON_NAME;
- }
- switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point)
- {
- case WT_SHAPE:
- idx = BODYPART_SHAPE_ICON_NAME;
- break;
- case WT_SKIN:
- idx = BODYPART_SKIN_ICON_NAME;
- break;
- case WT_HAIR:
- idx = BODYPART_HAIR_ICON_NAME;
- break;
- case WT_EYES:
- idx = BODYPART_EYES_ICON_NAME;
- break;
- case WT_SHIRT:
- idx = CLOTHING_SHIRT_ICON_NAME;
- break;
- case WT_PANTS:
- idx = CLOTHING_PANTS_ICON_NAME;
- break;
- case WT_SHOES:
- idx = CLOTHING_SHOES_ICON_NAME;
- break;
- case WT_SOCKS:
- idx = CLOTHING_SOCKS_ICON_NAME;
- break;
- case WT_JACKET:
- idx = CLOTHING_JACKET_ICON_NAME;
- break;
- case WT_GLOVES:
- idx = CLOTHING_GLOVES_ICON_NAME;
- break;
- case WT_UNDERSHIRT:
- idx = CLOTHING_UNDERSHIRT_ICON_NAME;
- break;
- case WT_UNDERPANTS:
- idx = CLOTHING_UNDERPANTS_ICON_NAME;
- break;
- case WT_SKIRT:
- idx = CLOTHING_SKIRT_ICON_NAME;
- break;
- case WT_ALPHA:
- idx = CLOTHING_ALPHA_ICON_NAME;
- break;
- case WT_TATTOO:
- idx = CLOTHING_TATTOO_ICON_NAME;
- break;
- default:
- // no-op, go with choice above
- break;
- }
+ assign_clothing_bodypart_icon(idx, attachment_point);
+ break;
+ case LLAssetType::AT_BODYPART:
+ idx = BODYPART_ICON_NAME;
+ assign_clothing_bodypart_icon(idx, attachment_point);
break;
case LLAssetType::AT_NOTECARD:
idx = NOTECARD_ICON_NAME;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 467255d1a7..ca9b942629 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -143,6 +143,7 @@ BOOL LLInventoryPanel::postBuild()
addChild(mScroller);
mScroller->addChild(mFolders);
mFolders->setScrollContainer(mScroller);
+ mFolders->addChild(mFolders->mStatusTextBox);
}
// Set up the callbacks from the inventory we're viewing, and then build everything.
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 52de8355e9..60e41b64ac 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -36,6 +36,7 @@
#include "llnotificationhandler.h"
#include "llnotifications.h"
+#include "llprogressview.h"
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
@@ -116,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
p.is_modal = mIsModal;
p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1);
+ // Show alert in middle of progress view (during teleport) (EXT-1093)
+ LLProgressView* progress = gViewerWindow->getProgressView();
+ LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled();
+ mChannel->updatePositionAndSize(rc, rc);
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
channel->addToast(p);
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 06a682c905..05261a65de 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llfloateravatarpicker.h"
#include "llbutton.h"
+#include "llcallingcard.h"
#include "llcombobox.h"
#include "llgroupactions.h"
#include "llgroupmgr.h"
@@ -405,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
{
LLUUID agent_id = agent_ids[i];
LLViewerObject* dest = gObjectList.findObject(agent_id);
+ std::string fullname;
if(dest && dest->isAvatar())
{
- std::string fullname;
- LLSD args;
LLNameValue* nvfirst = dest->getNVPair("FirstName");
LLNameValue* nvlast = dest->getNVPair("LastName");
if(nvfirst && nvlast)
{
- args["FIRST"] = std::string(nvfirst->getString());
- args["LAST"] = std::string(nvlast->getString());
fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());
}
if (!fullname.empty())
@@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
names.push_back("(Unknown)");
}
}
+ else
+ {
+ //looks like user try to invite offline friend
+ //for offline avatar_id gObjectList.findObject() will return null
+ //so we need to do this additional search in avatar tracker, see EXT-4732
+ if (LLAvatarTracker::instance().isBuddy(agent_id))
+ {
+ if (!gCacheName->getFullName(agent_id, fullname))
+ {
+ // actually it should happen, just in case
+ gCacheName->get(LLUUID(agent_id), false, boost::bind(
+ &LLPanelGroupInvite::addUserCallback, this, _1, _2,
+ _3));
+ // for this special case!
+ //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // removed id will be added in callback
+ agent_ids.erase(agent_ids.begin() + i);
+ }
+ else
+ {
+ names.push_back(fullname);
+ }
+ }
+ }
}
mImplementation->addUsers(names, agent_ids);
}
+void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name)
+{
+ std::vector<std::string> names;
+ std::vector<LLUUID> agent_ids;
+ std::string full_name = first_name + " " + last_name;
+ agent_ids.push_back(id);
+ names.push_back(first_name + " " + last_name);
+
+ mImplementation->addUsers(names, agent_ids);
+}
void LLPanelGroupInvite::draw()
{
LLPanel::draw();
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index 37135b488a..b095dd2395 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -43,6 +43,10 @@ public:
~LLPanelGroupInvite();
void addUsers(std::vector<LLUUID>& agent_ids);
+ /**
+ * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers().
+ */
+ void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);
void clear();
void update();
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index cbd6f64a48..8e305a5674 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -224,14 +224,6 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
childSetEnabled("share_btn", FALSE);
childSetEnabled("teleport_btn", FALSE);
childSetEnabled("pay_btn", FALSE);
-
- getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
- getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName);
- }
- else
- {
- // If the participant is an avatar, fetch the currect name
- gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
}
}
@@ -247,19 +239,6 @@ void LLPanelIMControlPanel::changed(U32 mask)
}
}
-void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-{
- if ( id == mAvatarID )
- {
- std::string avatar_name;
- avatar_name.assign(first);
- avatar_name.append(" ");
- avatar_name.append(last);
- getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
- getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
- }
-}
-
LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):
mParticipantList(NULL)
{
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 3ab505a084..ce8fc58e56 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -89,9 +89,6 @@ public:
// LLFriendObserver trigger
virtual void changed(U32 mask);
-protected:
- void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
-
private:
void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 36a542cfa0..cd6c727b5c 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -406,21 +406,24 @@ void LLPanelLandmarkInfo::populateFoldersList()
// Put the "Landmarks" folder first in list.
LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
- const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
- if (!cat)
+ const LLViewerInventoryCategory* lmcat = gInventory.getCategory(landmarks_id);
+ if (!lmcat)
{
llwarns << "Cannot find the landmarks folder" << llendl;
}
- std::string cat_full_name = getFullFolderName(cat);
- mFolderCombo->add(cat_full_name, cat->getUUID());
+ else
+ {
+ std::string cat_full_name = getFullFolderName(lmcat);
+ mFolderCombo->add(cat_full_name, lmcat->getUUID());
+ }
typedef std::vector<folder_pair_t> folder_vec_t;
folder_vec_t folders;
// Sort the folders by their full name.
for (S32 i = 0; i < cats.count(); i++)
{
- cat = cats.get(i);
- cat_full_name = getFullFolderName(cat);
+ const LLViewerInventoryCategory* cat = cats.get(i);
+ std::string cat_full_name = getFullFolderName(cat);
folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
}
sort(folders.begin(), folders.end(), cmp_folders);
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index f601a8d51c..64a265219b 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -206,7 +206,7 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
{
LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
self->mAutoLoop->clear();
- self->mAutoPlay->clear();
+ self->mAutoPlay->setValue(LLSD(TRUE)); // set default value for auto play to true;
self->mAutoScale->clear();
self->mAutoZoom ->clear();
self->mCurrentURL->clear();
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ada65c98a4..8eb0b69491 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -843,10 +843,13 @@ void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel)
{
LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(
mClassifiedsList->getItemByValue(values[n]));
-
- c_item->setClassifiedName(panel->getClassifiedName());
- c_item->setDescription(panel->getDescription());
- c_item->setSnapshotId(panel->getSnapshotId());
+ llassert(c_item);
+ if (c_item)
+ {
+ c_item->setClassifiedName(panel->getClassifiedName());
+ c_item->setDescription(panel->getDescription());
+ c_item->setSnapshotId(panel->getSnapshotId());
+ }
}
}
}
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 17a970cfcf..26b57c003b 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -1048,14 +1048,13 @@ void LLPanelPlaces::updateVerbs()
mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
- mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn);
mSaveBtn->setVisible(isLandmarkEditModeOn);
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
- mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);
if (is_place_info_visible)
{
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index 6c6eb7c719..f1e450a083 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -118,6 +118,7 @@ BOOL LLPlacesInventoryPanel::postBuild()
mScroller->addChild(mFolders);
mFolders->setScrollContainer(mScroller);
+ mFolders->addChild(mFolders->mStatusTextBox);
// cut subitems
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index a8feaf690d..3221745fa3 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -661,7 +661,9 @@ void LLScriptEdCore::onBtnDynamicHelp()
live_help_floater = new LLFloater(LLSD());
LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL);
LLFloater* parent = dynamic_cast<LLFloater*>(getParent());
- parent->addDependentFloater(live_help_floater, TRUE);
+ llassert(parent);
+ if (parent)
+ parent->addDependentFloater(live_help_floater, TRUE);
live_help_floater->childSetCommitCallback("lock_check", onCheckLock, this);
live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor"));
live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, this);
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index a81ec61263..d452ef2228 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -67,6 +67,7 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)
LLScriptFloater::LLScriptFloater(const LLSD& key)
: LLDockableFloater(NULL, true, key)
, mScriptForm(NULL)
+, mSaveFloaterPosition(false)
{
setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));
setOverlapsScreenChannel(true);
@@ -105,27 +106,29 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);
floater->setNotificationId(notification_id);
floater->createForm(notification_id);
- LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE);
- if (floater->getDockControl() == NULL)
+ if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))
{
- LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(notification_id);
- if (chiclet == NULL)
- {
- llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
- }
- else
- {
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
- }
-
- floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, floater, _1)));
+ floater->setSavePosition(true);
+ floater->restorePosition();
+ }
+ else
+ {
+ floater->dockToChiclet(true);
}
+ LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE);
+
return floater;
}
+void LLScriptFloater::setNotificationId(const LLUUID& id)
+{
+ mNotificationId = id;
+ // Lets save object id now while notification exists
+ mObjectId = notification_id_to_object_id(id);
+}
+
void LLScriptFloater::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectRaw();
@@ -162,6 +165,8 @@ void LLScriptFloater::createForm(const LLUUID& notification_id)
void LLScriptFloater::onClose(bool app_quitting)
{
+ savePosition();
+
if(getNotificationId().notNull())
{
LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
@@ -172,6 +177,8 @@ void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
{
LLDockableFloater::setDocked(docked, pop_on_undock);
+ savePosition();
+
hideToastsIfNeeded();
}
@@ -208,6 +215,33 @@ void LLScriptFloater::onMouseDown()
}
}
+void LLScriptFloater::savePosition()
+{
+ if(getSavePosition() && mObjectId.notNull())
+ {
+ LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()};
+ LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi);
+ }
+}
+
+void LLScriptFloater::restorePosition()
+{
+ LLScriptFloaterManager::FloaterPositionInfo fpi;
+ if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi))
+ {
+ dockToChiclet(fpi.mDockState);
+ if(!fpi.mDockState)
+ {
+ // Un-docked floater is opened in 0,0, now move it to saved position
+ translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop);
+ }
+ }
+ else
+ {
+ dockToChiclet(true);
+ }
+}
+
void LLScriptFloater::onFocusLost()
{
if(getNotificationId().notNull())
@@ -225,6 +259,33 @@ void LLScriptFloater::onFocusReceived()
}
}
+void LLScriptFloater::dockToChiclet(bool dock)
+{
+ if (getDockControl() == NULL)
+ {
+ LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
+ if (chiclet == NULL)
+ {
+ llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
+ return;
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ }
+
+ // Stop saving position while we dock floater
+ bool save = getSavePosition();
+ setSavePosition(false);
+
+ setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
+ LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1)), dock);
+
+ // Restore saving
+ setSavePosition(save);
+ }
+}
+
void LLScriptFloater::hideToastsIfNeeded()
{
using namespace LLNotificationsUI;
@@ -326,6 +387,7 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
if(floater)
{
+ floater->savePosition();
floater->setNotificationId(LLUUID::null);
floater->closeFloater();
}
@@ -445,4 +507,27 @@ LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloate
return mNotifications.end();
}
+void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi)
+{
+ if(object_id.notNull())
+ {
+ LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi;
+ }
+ else
+ {
+ llwarns << "Invalid object id" << llendl;
+ }
+}
+
+bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi)
+{
+ floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id);
+ if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it)
+ {
+ fpi = it->second;
+ return true;
+ }
+ return false;
+}
+
// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index f7efff83f9..ec3ec4b540 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -84,16 +84,21 @@ public:
static std::string getObjectName(const LLUUID& notification_id);
- /**
- * Callback for notification toast buttons.
- */
- static void onToastButtonClick(const LLSD&notification, const LLSD&response);
-
typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;
boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
+ struct FloaterPositionInfo
+ {
+ LLRect mRect;
+ bool mDockState;
+ };
+
+ void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi);
+
+ bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi);
+
protected:
typedef std::map<std::string, EObjectType> object_type_map;
@@ -111,6 +116,11 @@ private:
object_signal_t mNewObjectSignal;
object_signal_t mToggleFloaterSignal;
+
+ // <object_id, floater position>
+ typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t;
+
+ floater_position_map_t mFloaterPositions;
};
/**
@@ -141,7 +151,7 @@ public:
const LLUUID& getNotificationId() { return mNotificationId; }
- void setNotificationId(const LLUUID& id) { mNotificationId = id; }
+ void setNotificationId(const LLUUID& id);
/**
* Close notification if script floater is closed.
@@ -158,6 +168,14 @@ public:
*/
/*virtual*/ void setVisible(BOOL visible);
+ bool getSavePosition() { return mSaveFloaterPosition; }
+
+ void setSavePosition(bool save) { mSaveFloaterPosition = save; }
+
+ void savePosition();
+
+ void restorePosition();
+
protected:
/**
@@ -181,9 +199,13 @@ protected:
/*virtual*/ void onFocusReceived();
+ void dockToChiclet(bool dock);
+
private:
LLToastNotifyPanel* mScriptForm;
LLUUID mNotificationId;
+ LLUUID mObjectId;
+ bool mSaveFloaterPosition;
};
#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index 93a70b6471..a130878176 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -78,6 +78,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)
button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
mSearchButton = LLUICtrlFactory::create<LLButton>(button_params);
mTextEntry->addChild(mSearchButton);
+ mTextEntry->setPassDelete(TRUE);
setButtonVisible(p.dropdown_button_visible);
mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2));
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 44348ba429..0275736f6d 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -231,20 +231,23 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
// PERMISSIONS LOOKUP //
////////////////////////
+ llassert(item);
+ if (!item) return;
+
// do not enable the UI for incomplete items.
BOOL is_complete = item->isComplete();
const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType());
const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
const LLPermissions& perm = item->getPermissions();
const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_MANIPULATE);
+ GP_OBJECT_MANIPULATE);
const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_SET_SALE) &&
+ GP_OBJECT_SET_SALE) &&
!cannot_restrict_permissions;
const BOOL is_link = item->getIsLinkType();
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- bool not_in_trash = item && (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
+ bool not_in_trash = (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
// You need permission to modify the object to modify an inventory
// item in it.
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 3343ee88bd..e4773f99c5 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -40,6 +40,12 @@ const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app.";
const std::string LLSLURL::PREFIX_SL = "sl://";
const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://";
const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/";
+
+// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag
+// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this
+// version is required also.
+const std::string LLSLURL::PREFIX_SLURL_WWW = "http://www.slurl.com/secondlife/";
+
const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/";
const std::string LLSLURL::APP_TOKEN = "app/";
@@ -68,7 +74,10 @@ std::string LLSLURL::stripProtocol(const std::string& url)
{
stripped.erase(0, PREFIX_SLURL_OLD.length());
}
-
+ else if (matchPrefix(stripped, PREFIX_SLURL_WWW))
+ {
+ stripped.erase(0, PREFIX_SLURL_WWW.length());
+ }
return stripped;
}
@@ -81,6 +90,7 @@ bool LLSLURL::isSLURL(const std::string& url)
if (matchPrefix(url, PREFIX_SECONDLIFE)) return true;
if (matchPrefix(url, PREFIX_SLURL)) return true;
if (matchPrefix(url, PREFIX_SLURL_OLD)) return true;
+ if (matchPrefix(url, PREFIX_SLURL_WWW)) return true;
return false;
}
@@ -91,6 +101,7 @@ bool LLSLURL::isSLURLCommand(const std::string& url)
if (matchPrefix(url, PREFIX_SL + APP_TOKEN) ||
matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) ||
matchPrefix(url, PREFIX_SLURL + APP_TOKEN) ||
+ matchPrefix(url, PREFIX_SLURL_WWW + APP_TOKEN) ||
matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) )
{
return true;
diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h
index 21b32ce409..6a695e84f3 100644
--- a/indra/newview/llslurl.h
+++ b/indra/newview/llslurl.h
@@ -51,6 +51,7 @@ public:
static const std::string PREFIX_SECONDLIFE;
static const std::string PREFIX_SLURL;
static const std::string PREFIX_SLURL_OLD;
+ static const std::string PREFIX_SLURL_WWW;
static const std::string APP_TOKEN;
diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp
index 2485563cbc..61705c4eb3 100644
--- a/indra/newview/llstylemap.cpp
+++ b/indra/newview/llstylemap.cpp
@@ -49,6 +49,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
if (source != LLUUID::null && source != gAgent.getID() )
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href =
LLSLURL::buildCommand("agent", source, "inspect");
}
@@ -56,6 +57,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
{
// 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;
@@ -75,11 +77,13 @@ const LLStyle::Params &LLStyleMap::lookup(const LLUUID& id, const std::string& l
if (id != LLUUID::null && !link.empty())
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href = link;
}
else
{
style_params.color = LLColor4::white;
+ style_params.readonly_color = LLColor4::white;
}
mMap[id] = style_params;
}
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 4a61130785..6dcf4bc798 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -982,7 +982,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mLoadedDiscard < 0)
{
- llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+ //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+
+ //abort, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
}
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
mRawImage = NULL;
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 7ae2404203..cb43beb819 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -141,32 +141,6 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)
return LLToastPanel::handleToolTip(x, y, mask);
}
-void LLToastIMPanel::showInspector()
-{
- LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
- if(!im_session)
- {
- llwarns << "Invalid IM session" << llendl;
- return;
- }
-
- switch(im_session->mSessionType)
- {
- case LLIMModel::LLIMSession::P2P_SESSION:
- LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID));
- break;
- case LLIMModel::LLIMSession::GROUP_SESSION:
- LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID));
- break;
- case LLIMModel::LLIMSession::ADHOC_SESSION:
- LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID));
- break;
- default:
- llwarns << "Unknown IM session type" << llendl;
- break;
- }
-}
-
void LLToastIMPanel::spawnNameToolTip()
{
// Spawn at right side of the name textbox.
@@ -176,7 +150,7 @@ void LLToastIMPanel::spawnNameToolTip()
LLToolTip::Params params;
params.background_visible(false);
- params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this));
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE));
params.delay_time(0.0f); // spawn instantly on hover
params.image(LLUI::getUIImage("Info_Small"));
params.message("");
@@ -201,7 +175,7 @@ void LLToastIMPanel::spawnGroupIconToolTip()
LLInspector::Params params;
params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
- params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this));
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_group", LLSD().with("group_id", mSessionID), FALSE));
params.delay_time(0.100f);
params.image(LLUI::getUIImage("Info_Small"));
params.message(g_data.mName);
@@ -214,16 +188,15 @@ void LLToastIMPanel::spawnGroupIconToolTip()
void LLToastIMPanel::initIcon()
{
- LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon");
-
mAvatarIcon->setVisible(FALSE);
mGroupIcon->setVisible(FALSE);
- sys_msg_icon->setVisible(FALSE);
mAdhocIcon->setVisible(FALSE);
if(mAvatarName->getValue().asString() == SYSTEM_FROM)
{
- sys_msg_icon->setVisible(TRUE);
+ // "sys_msg_icon" was disabled by Erica in the changeset: 5109 (85181bc92cbe)
+ // and "dummy widget" warnings appeared in log.
+ // It does not make sense to have such image with empty name. Removed for EXT-5057.
}
else
{
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 4d741456c4..980b51337f 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -294,6 +294,15 @@ void LLToastNotifyPanel::adjustPanelForTipNotice()
mControlPanel->setVisible(FALSE);
reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight());
+
+ if (mNotification->getPayload().has("respond_on_mousedown")
+ && mNotification->getPayload()["respond_on_mousedown"] )
+ {
+ mInfoPanel->setMouseDownCallback(
+ boost::bind(&LLNotification::respond,
+ mNotification,
+ mNotification->getResponseTemplate()));
+ }
}
// static
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index bf1e307d71..fdf9e1df2e 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1485,6 +1485,12 @@ BOOL LLToolPie::pickRightMouseDownCallback()
while( object && object->isAttachment())
{
object = (LLViewerObject*)object->getParent();
+ llassert(object);
+ }
+
+ if (!object)
+ {
+ return TRUE; // unexpected, but escape
}
// Object is an avatar, so check for mute by id.
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 8aae90ec3c..b15a9a9e99 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2555,7 +2555,7 @@ void handle_object_inspect()
key["task"] = "task";
LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
}
-
+
/*
// Old floater properties
LLFloaterReg::showInstance("inspect", LLSD());
@@ -5599,8 +5599,6 @@ void handle_buy_currency()
LLFloaterBuyCurrency::buyCurrency();
}
-
-
class LLFloaterVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5644,6 +5642,25 @@ class LLShowSidetrayPanel : public view_listener_t
}
};
+class LLSidetrayPanelVisible : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string panel_name = userdata.asString();
+ // Toggle the panel
+ if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+ }
+};
+
+
bool callback_show_url(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -8028,6 +8045,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
+ view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible");
view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 6bad8843fd..84b270f8cc 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -796,84 +796,88 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
//LLAssetType::EType pref_loc = data->mPreferredLocation;
BOOL is_balance_sufficient = TRUE;
- if(result >= 0)
+ if(data)
{
- LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
-
- if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
- LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
- LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
+ if (result >= 0)
{
- // Charge the user for the upload.
- LLViewerRegion* region = gAgent.getRegion();
-
- if(!(can_afford_transaction(expected_upload_cost)))
- {
- LLFloaterBuyCurrency::buyCurrency(
- llformat(LLTrans::getString("UploadingCosts").c_str(),
- data->mAssetInfo.getName().c_str()),
- expected_upload_cost);
- is_balance_sufficient = FALSE;
- }
- else if(region)
+ LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
+
+ if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
+ LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
+ LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
{
- // Charge user for upload
- gStatusBar->debitBalance(expected_upload_cost);
+ // Charge the user for the upload.
+ LLViewerRegion* region = gAgent.getRegion();
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_MoneyTransferRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_MoneyData);
- msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
- msg->addU8("Flags", 0);
- // we tell the sim how much we were expecting to pay so it
- // can respond to any discrepancy
- msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
- msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
- msg->addStringFast(_PREHASH_Description, NULL);
- msg->sendReliable(region->getHost());
+ if(!(can_afford_transaction(expected_upload_cost)))
+ {
+ LLFloaterBuyCurrency::buyCurrency(
+ llformat(LLTrans::getString("UploadingCosts").c_str(),
+ data->mAssetInfo.getName().c_str()),
+ expected_upload_cost);
+ is_balance_sufficient = FALSE;
+ }
+ else if(region)
+ {
+ // Charge user for upload
+ gStatusBar->debitBalance(expected_upload_cost);
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_MoneyTransferRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_MoneyData);
+ msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
+ msg->addU8("Flags", 0);
+ // we tell the sim how much we were expecting to pay so it
+ // can respond to any discrepancy
+ msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
+ msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
+ msg->addStringFast(_PREHASH_Description, NULL);
+ msg->sendReliable(region->getHost());
+ }
}
- }
- if(is_balance_sufficient)
- {
- // Actually add the upload to inventory
- llinfos << "Adding " << uuid << " to inventory." << llendl;
- const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
- if(folder_id.notNull())
+ if(is_balance_sufficient)
{
- U32 next_owner_perms = data->mNextOwnerPerm;
- if(PERM_NONE == next_owner_perms)
+ // Actually add the upload to inventory
+ llinfos << "Adding " << uuid << " to inventory." << llendl;
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
+ if(folder_id.notNull())
{
- next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ U32 next_owner_perms = data->mNextOwnerPerm;
+ if(PERM_NONE == next_owner_perms)
+ {
+ next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ }
+ create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
+ data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
+ data->mInventoryType, NOT_WEARABLE, next_owner_perms,
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
}
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
- data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
- data->mInventoryType, NOT_WEARABLE, next_owner_perms,
- LLPointer<LLInventoryCallback>(NULL));
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
}
}
- }
- else // if(result >= 0)
- {
- LLSD args;
- args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
- args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotificationsUtil::add("CannotUploadReason", args);
+ else // if(result >= 0)
+ {
+ LLSD args;
+ args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
+ args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
+ LLNotificationsUtil::add("CannotUploadReason", args);
+ }
}
LLUploadDialog::modalUploadFinished();
delete data;
+ data = NULL;
// *NOTE: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index ace5c5038e..2858081dc9 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -233,6 +233,10 @@ public:
extern LLViewerObjectList gObjectList;
// Inlines
+/**
+ * Note:
+ * it will return NULL for offline avatar_id
+ */
inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
{
std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 9893eb5dce..b66f58d853 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1519,12 +1519,12 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
else if (!isJustBound() && mCachedRawImageReady)
{
- if(mBoostLevel < BOOST_HIGH)
- {
- // We haven't rendered this in a while, de-prioritize it
- desired_discard += 2;
- }
- else
+ //if(mBoostLevel < BOOST_HIGH)
+ //{
+ // // We haven't rendered this in a while, de-prioritize it
+ // desired_discard += 2;
+ //}
+ //else
{
// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
desired_discard = cur_discard;
@@ -2342,14 +2342,8 @@ void LLViewerFetchedTexture::setCachedRawImage()
{
--i ;
}
- //if(mForSculpt)
- //{
- // mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ;
- //}
- //else
- {
- mRawImage->scale(w >> i, h >> i) ;
- }
+
+ mRawImage->scale(w >> i, h >> i) ;
}
mCachedRawImage = mRawImage ;
mCachedRawDiscardLevel = mRawDiscardLevel + i ;
@@ -2699,7 +2693,7 @@ void LLViewerLODTexture::processTextureStats()
}
else
{
- if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f)
+ if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f)
{
//if is a big image and not being used recently, nor close to the view point, do not load hi-res data.
mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ;
@@ -2885,12 +2879,11 @@ LLViewerMediaTexture::~LLViewerMediaTexture()
void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)
{
- mGLTexturep = NULL ;
- init(false);
+ llassert(mGLTexturep.notNull()) ;
+
mUseMipMaps = usemipmaps ;
getLastReferencedTimer()->reset() ;
-
- generateGLTexture() ;
+ mGLTexturep->setUseMipMaps(mUseMipMaps) ;
mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ;
}
@@ -2995,6 +2988,10 @@ void LLViewerMediaTexture::initVirtualSize()
void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
{
+ if(facep)
+ {
+ facep->setHasMedia(true) ;
+ }
if(!mIsPlaying)
{
return ; //no need to add the face because the media is not in playing.
@@ -3005,14 +3002,16 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep)
{
- if(!mIsPlaying)
- {
- return ; //no need to remove the face because the media is not in playing.
- }
if(!facep)
{
return ;
}
+ facep->setHasMedia(false) ;
+
+ if(!mIsPlaying)
+ {
+ return ; //no need to remove the face because the media is not in playing.
+ }
mIsPlaying = FALSE ; //set to remove the media from the face.
switchTexture(facep) ;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 4a86e1ca41..b76a2e150f 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2463,6 +2463,8 @@ void LLViewerWindow::updateUI()
{
static std::string last_handle_msg;
+ LLConsole::updateClass();
+
// animate layout stacks so we have up to date rect for world view
LLLayoutStack::updateClass();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index f2f769980b..7a6a48d1b3 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1492,9 +1492,9 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
//-------------------------------------------------------------------------
// parse the file
//-------------------------------------------------------------------------
- BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE );
+ BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE );
- if (!success)
+ if (!parsesuccess)
{
llerrs << "Can't parse skeleton file: " << filename << llendl;
return FALSE;
@@ -1505,11 +1505,13 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if (!root)
{
llerrs << "No root node found in avatar skeleton file: " << filename << llendl;
+ return FALSE;
}
if( !root->hasName( "linden_skeleton" ) )
{
llerrs << "Invalid avatar skeleton file header: " << filename << llendl;
+ return FALSE;
}
std::string version;
@@ -1517,6 +1519,7 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
{
llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl;
+ return FALSE;
}
return TRUE;
@@ -2192,13 +2195,16 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
// store off last frame's root position to be consistent with camera position
LLVector3 root_pos_last = mRoot.getWorldPosition();
BOOL detailed_update = updateCharacter(agent);
- BOOL voice_enabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel();
if (gNoRender)
{
return TRUE;
}
+ static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
+ bool voice_enabled = (visualizers_in_calls || gVoiceClient->inProximalChannel()) &&
+ gVoiceClient->getVoiceEnabled(mID);
+
idleUpdateVoiceVisualizer( voice_enabled );
idleUpdateMisc( detailed_update );
idleUpdateAppearanceAnimation();
@@ -3090,7 +3096,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
if (!visible)
{
- //updateMotions(LLCharacter::HIDDEN_UPDATE);
+ updateMotions(LLCharacter::HIDDEN_UPDATE);
return FALSE;
}
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index bb09a18cc3..dfd67d0c38 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -122,7 +122,8 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess
mState(STATE_NO_CHANNEL_INFO),
mSessionName(session_name),
mCallDirection(OUTGOING_CALL),
- mIgnoreNextSessionLeave(FALSE)
+ mIgnoreNextSessionLeave(FALSE),
+ mCallEndedByAgent(false)
{
mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName;
@@ -412,7 +413,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
EState old_state = mState;
mState = new_state;
if (!mStateChangedCallback.empty())
- mStateChangedCallback(old_state, mState, mCallDirection);
+ mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
}
//static
@@ -779,7 +780,8 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
}
else
{
- // other user hung up
+ // other user hung up, so we didn't end the call
+ mCallEndedByAgent = false;
}
deactivate();
}
@@ -810,6 +812,9 @@ void LLVoiceChannelP2P::activate()
{
if (callStarted()) return;
+ //call will be counted as ended by user unless this variable is changed in handleStatusChange()
+ mCallEndedByAgent = true;
+
LLVoiceChannel::activate();
if (callStarted())
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index cb86671305..941cccacc3 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -58,7 +58,7 @@ public:
OUTGOING_CALL
} EDirection;
- typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction)> state_changed_signal_t;
+ typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t;
// on current channel changed signal
typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
@@ -122,6 +122,8 @@ protected:
std::string mSessionName;
LLSD mNotifyArgs;
LLSD mCallDialogPayload;
+ // true if call was ended by agent
+ bool mCallEndedByAgent;
BOOL mIgnoreNextSessionLeave;
LLHandle<LLPanel> mLoginNotificationHandle;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index bfe38c14ba..fa00396c34 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -679,6 +679,7 @@ void LLVOVolume::updateTextureVirtualSize()
vsize = area;
imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);
face->setPixelArea(area); // treat as full screen
+ face->setVirtualSize(vsize);
}
else
{
@@ -695,8 +696,7 @@ void LLVOVolume::updateTextureVirtualSize()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE);
}
}
-
- face->setVirtualSize(vsize);
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
if (vsize < min_vsize) min_vsize = vsize;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index bd22fc5f2e..dd9634a234 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1355,6 +1355,7 @@ void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep)
if (!drawablep)
{
llerrs << "updateMove called with NULL drawablep" << llendl;
+ return;
}
if (drawablep->isState(LLDrawable::EARLY_MOVE))
{
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 44c9284b36..593bbe4b5e 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -369,7 +369,7 @@ Leyla Linden </text>
layout="topleft"
left_delta="0"
name="Sell with landowners objects in parcel."
- top_pad="-3"
+ top_pad="-2"
width="186">
Objects included in sale
</text>
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index cc9afe4474..2bafd1bdef 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -96,13 +96,24 @@ No Answer. Please try again later.
height="40"
layout="topleft"
left="77"
- name="nearby_P2P"
+ name="nearby_P2P_by_other"
top="27"
width="315"
word_wrap="true">
[VOICE_CHANNEL_NAME] has ended the call. [RECONNECT_NEARBY]
</text>
<text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby_P2P_by_agent"
+ top="27"
+ width="315"
+ word_wrap="true">
+ You have ended the call. [RECONNECT_NEARBY]
+ </text>
+ <text
font="SansSerif"
height="50"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index df6c7bd9cb..07a366da7f 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -55,9 +55,10 @@
</menu_item_call>
<menu_item_check
label="My Inventory"
- layout="topleft"
name="Inventory"
- shortcut="control|shift|I">
+ layout="topleft"
+ shortcut="control|shift|I"
+ visible="false">
<menu_item_check.on_check
function="Floater.Visible"
parameter="inventory" />
@@ -65,24 +66,31 @@
function="Floater.Toggle"
parameter="inventory" />
</menu_item_check>
- <menu_item_call
- label="Show Inventory in Side Tray"
+ <menu_item_check
+ label="My Inventory"
name="ShowSidetrayInventory"
+ layout="topleft"
shortcut="control|I"
- visible="false">
- <menu_item_call.on_click
+ visible="true">
+ <menu_item_check.on_check
+ function="SidetrayPanelVisible"
+ parameter="sidepanel_inventory" />
+ <menu_item_check.on_click
function="ShowSidetrayPanel"
parameter="sidepanel_inventory" />
- </menu_item_call>
- <menu_item_call
+ </menu_item_check>
+ <menu_item_check
label="My Gestures"
layout="topleft"
name="Gestures"
shortcut="control|G">
- <menu_item_call.on_click
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="gestures" />
+ <menu_item_check.on_click
function="Floater.Toggle"
parameter="gestures" />
- </menu_item_call>
+ </menu_item_check>
<menu
label="My Status"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 1f16aea2ef..5f46ad7860 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -159,7 +159,6 @@ Maximum 200 per group daily
left_pad="3"
max_length="511"
name="create_message"
- text_type="ascii"
top_delta="0"
width="220"
word_wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index c7e5b25e06..28c4adf67c 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -11,15 +11,6 @@
name="avatar_icon"
top="-5"
width="105"/>
- <text
- follows="top|left|right"
- font="SansSerifLarge"
- height="19"
- layout="topleft"
- name="avatar_name"
- use_ellipses="true"
- value="Unknown"
- width="110" />
<layout_stack
mouse_opaque="false"
border_size="0"
@@ -30,7 +21,7 @@
left="5"
name="button_stack"
orientation="vertical"
- top_pad="-5"
+ top_pad="5"
width="105">
<layout_panel
mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index a0ad38cf76..34fd3352a3 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -56,16 +56,6 @@
name="adhoc_icon"
top="3"
width="18" />
- <!--<icon
- follows="right"
- height="20"
- image_name=""
- layout="topleft"
- left="3"
- mouse_opaque="true"
- name="sys_msg_icon"
- top="0"
- width="20" />-->
<text
follows="left|right"
font.style="BOLD"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 4030c7184a..c6a4233c9c 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -37,7 +37,7 @@ halign="center"
top_pad="4"
width="305">
<inventory_panel
- border="false"
+ border="false"
follows="all"
height="295"
label="MY INVENTORY"
@@ -48,7 +48,7 @@ halign="center"
top="16"
width="290" />
<inventory_panel
- border="false"
+ border="false"
follows="all"
height="295"
label="RECENT"
@@ -67,7 +67,7 @@ halign="center"
height="30"
layout="bottomleft"
left="0"
- visible="true"
+ visible="true"
name="bottom_panel"
width="330">
<button
@@ -118,7 +118,7 @@ halign="center"
mouse_opaque="false"
name="Inventory Menu"
top="0"
- visible="true"
+ visible="true"
width="290">
<menu
height="101"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 31ea54cf40..446bf0dc6e 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -236,7 +236,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
layout="topleft"
left="0"
name="group_list"
- no_filtered_groups_msg="No groups"
+ no_filtered_groups_msg="[secondlife:///app/search/groups Try fine the group in search?]"
no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]"
top="0"
width="313" />
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 887a89d518..9ef3649d9c 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -24,6 +24,7 @@ bg_opaque_color="DkGray2"
layout="topleft"
left="6"
name="picks_panel_text"
+ wrap="true"
top="10"
width="313"/>
<accordion
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 433dfc17fe..2e81139ef2 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -9,13 +9,22 @@
name="chat"
top="1"
width="517">
- <radio_group
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ width="120"
+ top="10">
+ Font size:
+ </text>
+ <radio_group
height="30"
layout="topleft"
- left="30"
- control_name="ChatFontSize"
+ left="40"
+ control_name="ChatFontSize"
name="chat_font_size"
- top="10"
+ top_pad="0"
width="440">
<radio_item
height="16"
@@ -45,12 +54,24 @@
top_delta="0"
width="125" />
</radio_group>
+
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ top_pad="10"
+ width="120"
+ >
+ Font colors:
+ </text>
+
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="user"
top_pad="10"
width="44" >
@@ -79,7 +100,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="agent"
top_pad="-17"
width="44" >
@@ -110,7 +131,7 @@
height="47"
label_width="60"
layout="topleft"
- left="350"
+ left="360"
name="im"
top_pad="-17"
width="44">
@@ -141,7 +162,7 @@
height="47"
label_width="44"
layout="topleft"
- left="30"
+ left="40"
name="system"
top_pad="40"
width="44" >
@@ -171,7 +192,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="script_error"
top_pad="-17"
width="44">
@@ -201,7 +222,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="350"
+ left="360"
name="objects"
top_pad="-17"
width="44" >
@@ -231,7 +252,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="owner"
top_pad="40"
width="44" >
@@ -261,7 +282,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="links"
top_pad="-17"
width="44" >
@@ -314,6 +335,8 @@
top_pad="5"
width="400" />
<text
+ follows="left|top"
+ layout="topleft"
left="30"
height="20"
width="120"
@@ -321,17 +344,20 @@
Show IMs in:
</text>
<text
- left_pad="6"
- height="20"
- width="100"
- text_color="White_25"
- >
+ follows="left|top"
+ layout="topleft"
+ top_delta="0"
+ left="120"
+ height="20"
+ width="100"
+ text_color="White_25"
+ >
(requires restart)
</text>
<radio_group
height="30"
layout="topleft"
- left="30"
+ left="40"
control_name="ChatWindow"
name="chat_window"
top_pad="0"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index f7e3ede93c..f78d90c434 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -17,6 +17,7 @@
follows="left|bottom"
height="23"
label="Clear History"
+ tool_tip="Clear login image, last location, teleport history, web, and texture cache"
layout="topleft"
left="30"
name="clear_cache"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index a5dc14c69d..39762d57fb 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1805,7 +1805,7 @@ Clears (deletes) the media and all params from the given face.
<string name="LeaveMouselook">Press ESC to return to World View</string>
<!-- inventory -->
- <string name="InventoryNoMatchingItems">No matching items found in inventory.</string>
+ <string name="InventoryNoMatchingItems">[secondlife:///app/search/groups No matching items found in inventory.Try "Search"?]</string>
<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
<string name="InventoryNoTexture">
You do not have a copy of
@@ -2129,7 +2129,7 @@ this texture in your inventory
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
<!-- panel picks -->
- <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string>
+ <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>
<string name="PicksClassifiedsLoadingText">Loading...</string>
<!-- Multi Preview Floater -->
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index 1228f6be3d..0720621f0b 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -16,6 +16,6 @@
image_unselected="Search"
image_selected="Search" />
<clear_button label=""
- image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_unselected="Icon_Close_Toast"
+ image_selected="Icon_Close_Toast" />
</filter_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index 1616e4c3f7..a9a760b3a4 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -15,7 +15,11 @@
height="13"
image_unselected="Search"
image_selected="Search" />
- <clear_button
+ <clear_button
+ bottom="4"
+ height="16"
image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_selected="Icon_Close_Press"
+ pad_right="4"
+ width="16" />
</search_editor>