summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/app_settings/settings.xml11
-rwxr-xr-xindra/newview/llavataractions.cpp4
-rw-r--r--indra/newview/llavataractions.h4
-rw-r--r--indra/newview/llblocklist.cpp22
-rw-r--r--indra/newview/llchathistory.cpp47
-rw-r--r--indra/newview/llimconversation.cpp12
-rw-r--r--indra/newview/llimconversation.h2
-rw-r--r--indra/newview/llimfloater.cpp137
-rw-r--r--indra/newview/llimfloater.h2
-rw-r--r--indra/newview/llimfloatercontainer.cpp23
-rw-r--r--indra/newview/llimfloatercontainer.h2
-rw-r--r--indra/newview/llimview.cpp3
-rw-r--r--indra/newview/llnearbychat.cpp64
-rw-r--r--indra/newview/llnearbychat.h2
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp2
-rwxr-xr-xindra/newview/llviewermessage.cpp27
16 files changed, 231 insertions, 133 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4a586b02af..da3ff2d1ee 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1639,6 +1639,17 @@
<key>Value</key>
<string />
</map>
+ <key>NearbyChatIsNotTornOff</key>
+ <map>
+ <key>Comment</key>
+ <string>saving torn-off state of the nearby chat between sessions</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>CloseChatOnReturn</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index fb32bcbd60..6babdc1f44 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -235,7 +235,7 @@ void LLAvatarActions::startCall(const LLUUID& id)
}
// static
-void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids)
+void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids, const LLUUID& floater_id)
{
if (ids.size() == 0)
{
@@ -252,7 +252,7 @@ void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids)
// create the new ad hoc voice session
const std::string title = LLTrans::getString("conference-title");
LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
- ids[0], id_array, true);
+ ids[0], id_array, true, floater_id);
if (session_id == LLUUID::null)
{
return;
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 46830eb22c..259e87c336 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -82,9 +82,9 @@ public:
static void startCall(const LLUUID& id);
/**
- * Start an ad-hoc conference voice call with multiple users
+ * Start an ad-hoc conference voice call with multiple users in a specific IM floater.
*/
- static void startAdhocCall(const uuid_vec_t& ids);
+ static void startAdhocCall(const uuid_vec_t& ids, const LLUUID& floater_id = LLUUID::null);
/**
* Start conference chat with the given avatars in a specific IM floater.
diff --git a/indra/newview/llblocklist.cpp b/indra/newview/llblocklist.cpp
index cb68f677eb..066cb71677 100644
--- a/indra/newview/llblocklist.cpp
+++ b/indra/newview/llblocklist.cpp
@@ -195,7 +195,13 @@ bool LLBlockList::isActionEnabled(const LLSD& userdata)
const std::string command_name = userdata.asString();
- if ("unblock_item" == command_name || "profile_item" == command_name)
+ if ("profile_item" == command_name)
+ {
+ LLBlockedListItem* item = getBlockedItem();
+ action_enabled = item && (LLMute::AGENT == item->getType());
+ }
+
+ if ("unblock_item" == command_name)
{
action_enabled = getSelectedItem() != NULL;
}
@@ -227,10 +233,6 @@ void LLBlockList::onCustomAction(const LLSD& userdata)
LLAvatarActions::showProfile(item->getUUID());
break;
- case LLMute::OBJECT:
- LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", item->getUUID()));
- break;
-
default:
break;
}
@@ -267,9 +269,15 @@ bool LLBlockListNameTypeComparator::doCompare(const LLBlockedListItem* blocked_i
LLMute::EType type1 = blocked_item1->getType();
LLMute::EType type2 = blocked_item2->getType();
- if (type1 != type2)
+ // if mute type is LLMute::BY_NAME or LLMute::OBJECT it means that this mute is an object
+ bool both_mutes_are_objects = (LLMute::OBJECT == type1 || LLMute::BY_NAME == type1) && (LLMute::OBJECT == type2 || LLMute::BY_NAME == type2);
+
+ // mute types may be different, but since both LLMute::BY_NAME and LLMute::OBJECT types represent objects
+ // it's needed to perform additional checking of both_mutes_are_objects variable
+ if (type1 != type2 && !both_mutes_are_objects)
{
- return type1 > type2;
+ // objects in block list go first, so return true if mute type is not an avatar
+ return LLMute::AGENT != type1;
}
return NAME_COMPARATOR.compare(blocked_item1, blocked_item2);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index dcd6d25888..80be753d9e 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -734,17 +734,23 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+ LLColor4 name_color(txt_color);
+
LLViewerChat::getChatColor(chat,txt_color);
LLFontGL* fontp = LLViewerChat::getChatFont();
std::string font_name = LLFontGL::nameFromFont(fontp);
std::string font_size = LLFontGL::sizeFromFont(fontp);
- LLStyle::Params style_params;
- style_params.color(txt_color);
- style_params.readonly_color(txt_color);
- style_params.font.name(font_name);
- style_params.font.size(font_size);
- style_params.font.style(input_append_params.font.style);
+ LLStyle::Params body_message_params;
+ body_message_params.color(txt_color);
+ body_message_params.readonly_color(txt_color);
+ body_message_params.font.name(font_name);
+ body_message_params.font.size(font_size);
+ body_message_params.font.style(input_append_params.font.style);
+
+ LLStyle::Params name_params(body_message_params);
+ name_params.color(name_color);
+ name_params.readonly_color(name_color);
std::string prefix = chat.mText.substr(0, 4);
@@ -767,7 +773,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if (irc_me || chat.mChatStyle == CHAT_STYLE_IRC)
{
delimiter = LLStringUtil::null;
- style_params.font.style = "ITALIC";
+ name_params.font.style = "ITALIC";
}
bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY;
@@ -775,18 +781,20 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if (message_from_log)
{
txt_color = LLColor4::grey;
- style_params.color(txt_color);
- style_params.readonly_color(txt_color);
+ body_message_params.color(txt_color);
+ body_message_params.readonly_color(txt_color);
+ name_params.color(txt_color);
+ name_params.readonly_color(txt_color);
}
bool prependNewLineState = mEditor->getText().size() != 0;
- // show timestamps and names in the compact mode
+ // compact mode: show a timestamp and name
if (use_plain_text_chat_history)
{
square_brackets = chat.mFromName == SYSTEM_FROM;
- LLStyle::Params timestamp_style(style_params);
+ LLStyle::Params timestamp_style(body_message_params);
// out of the timestamp
if (args["show_time"].asBoolean())
@@ -804,7 +812,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
// out the opening square bracket (if need)
if (square_brackets)
{
- mEditor->appendText("[", prependNewLineState, style_params);
+ mEditor->appendText("[", prependNewLineState, body_message_params);
prependNewLineState = false;
}
@@ -819,7 +827,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
// set the link for the object name to be the objectim SLapp
// (don't let object names with hyperlinks override our objectim Url)
- LLStyle::Params link_params(style_params);
+ LLStyle::Params link_params(body_message_params);
LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
link_params.color = link_color;
link_params.readonly_color = link_color;
@@ -831,7 +839,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
{
- LLStyle::Params link_params(style_params);
+ LLStyle::Params link_params(body_message_params);
link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
if (from_me)
@@ -852,7 +860,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
else
{
mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
- prependNewLineState, style_params);
+ prependNewLineState, body_message_params);
prependNewLineState = false;
}
}
@@ -880,7 +888,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
}
else
{
- view = getHeader(chat, style_params, args);
+ view = getHeader(chat, name_params, args);
if (mEditor->getText().size() == 0)
p.top_pad = 0;
else
@@ -909,6 +917,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mIsLastMessageFromLog = message_from_log;
}
+ // body of the message processing
+
+ // notify processing
if (chat.mNotifId.notNull())
{
LLNotificationPtr notification = LLNotificationsUtil::find(chat.mNotifId);
@@ -932,6 +943,8 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mEditor->appendWidget(params, "\n", false);
}
}
+
+ // usual messages showing
else
{
std::string message = irc_me ? chat.mText.substr(3) : chat.mText;
@@ -959,7 +972,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
message += "]";
}
- mEditor->appendText(message, prependNewLineState, style_params);
+ mEditor->appendText(message, prependNewLineState, body_message_params);
prependNewLineState = false;
}
diff --git a/indra/newview/llimconversation.cpp b/indra/newview/llimconversation.cpp
index acdd7ba46a..3c6c5c3898 100644
--- a/indra/newview/llimconversation.cpp
+++ b/indra/newview/llimconversation.cpp
@@ -55,12 +55,6 @@ LLIMConversation::LLIMConversation(const LLUUID& session_id)
{
mCommitCallbackRegistrar.add("IMSession.Menu.Action",
boost::bind(&LLIMConversation::onIMSessionMenuItemClicked, this, _2));
-// mCommitCallbackRegistrar.add("IMSession.ExpCollapseBtn.Click",
-// boost::bind(&LLIMConversation::onSlide, this));
-// mCommitCallbackRegistrar.add("IMSession.CloseBtn.Click",
-// boost::bind(&LLFloater::onClickClose, this));
- mCommitCallbackRegistrar.add("IMSession.TearOffBtn.Click",
- boost::bind(&LLIMConversation::onTearOffClicked, this));
mEnableCallbackRegistrar.add("IMSession.Menu.CompactExpandedModes.CheckItem",
boost::bind(&LLIMConversation::onIMCompactExpandedMenuItemCheck, this, _2));
mEnableCallbackRegistrar.add("IMSession.Menu.ShowModes.CheckItem",
@@ -254,9 +248,7 @@ void LLIMConversation::updateHeaderAndToolbar()
if (mDragHandle)
{
mDragHandle->setTitleVisible(!is_hosted);
- setCanDrag(!is_hosted);
}
- setCanResize(!is_hosted);
// The button (>>) should be disabled for torn off P2P conversations.
mExpandCollapseBtn->setEnabled(is_hosted || !mIsP2PChat);
@@ -349,8 +341,6 @@ void LLIMConversation::onOpen(const LLSD& key)
host_floater->collapseMessagesPane(false);
}
- setCanResize(TRUE);
-
updateHeaderAndToolbar();
}
@@ -370,7 +360,7 @@ void LLIMConversation::onClose(bool app_quitting)
void LLIMConversation::onTearOffClicked()
{
- onClickTearOff(this);
+ LLFloater::onClickTearOff(this);
updateHeaderAndToolbar();
}
diff --git a/indra/newview/llimconversation.h b/indra/newview/llimconversation.h
index 50663137ac..682779a44b 100644
--- a/indra/newview/llimconversation.h
+++ b/indra/newview/llimconversation.h
@@ -78,7 +78,7 @@ protected:
bool onIMShowModesMenuItemCheck(const LLSD& userdata);
bool onIMShowModesMenuItemEnable(const LLSD& userdata);
static void onSlide(LLIMConversation *self);
- void onTearOffClicked();
+ virtual void onTearOffClicked();
// refresh a visual state of the Call button
void updateCallBtnState(bool callIsActive);
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 9d3c0f98ce..a506f0f9f3 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -322,7 +322,7 @@ BOOL LLIMFloater::postBuild()
void LLIMFloater::onAddButtonClicked()
{
- LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::onAvatarPicked, this, _1, _2), TRUE, TRUE);
+ LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::addSessionParticipants, this, _1), TRUE, TRUE);
if (!picker)
{
return;
@@ -337,55 +337,94 @@ void LLIMFloater::onAddButtonClicked()
}
}
-void LLIMFloater::onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names)
+bool LLIMFloater::canAddSelectedToChat(const uuid_vec_t& uuids)
{
- if (mIsP2PChat)
- {
- mStartConferenceInSameFloater = true;
- onClose(false);
+ if (!mSession
+ || mDialog == IM_SESSION_GROUP_START
+ || mDialog == IM_SESSION_INVITE && gAgent.isInGroup(mSessionID))
+ {
+ return false;
+ }
- uuid_vec_t temp_ids;
- temp_ids.push_back(mOtherParticipantUUID);
- temp_ids.insert(temp_ids.end(), ids.begin(), ids.end());
+ if (mIsP2PChat)
+ {
+ // For a P2P session just check if we are not adding the other participant.
- LLAvatarActions::startConference(temp_ids, mSessionID);
- }
- else
- {
- inviteToSession(ids);
- }
+ for (uuid_vec_t::const_iterator id = uuids.begin();
+ id != uuids.end(); ++id)
+ {
+ if (*id == mOtherParticipantUUID)
+ {
+ return false;
+ }
+ }
+ }
+ else
+ {
+ // For a conference session we need to check against the list from LLSpeakerMgr,
+ // because this list may change when participants join or leave the session.
+
+ LLSpeakerMgr::speaker_list_t speaker_list;
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
+ if (speaker_mgr)
+ {
+ speaker_mgr->getSpeakerList(&speaker_list, true);
+ }
+
+ for (uuid_vec_t::const_iterator id = uuids.begin();
+ id != uuids.end(); ++id)
+ {
+ for (LLSpeakerMgr::speaker_list_t::const_iterator it = speaker_list.begin();
+ it != speaker_list.end(); ++it)
+ {
+ const LLPointer<LLSpeaker>& speaker = *it;
+ if (*id == speaker->mID)
+ {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
}
-bool LLIMFloater::canAddSelectedToChat(const uuid_vec_t& uuids)
+void LLIMFloater::addSessionParticipants(const uuid_vec_t& uuids)
{
- if (!mSession
- || mDialog == IM_SESSION_GROUP_START
- || mDialog == IM_SESSION_INVITE && gAgent.isInGroup(mSessionID))
- {
- return false;
- }
+ if (mIsP2PChat)
+ {
+ mStartConferenceInSameFloater = true;
- for (uuid_vec_t::const_iterator id = uuids.begin();
- id != uuids.end(); ++id)
- {
- // Skip this check for ad hoc conferences,
- // conference participants should be listed in mSession->mInitialTargetIDs.
- if (mIsP2PChat && *id == mOtherParticipantUUID)
- {
- return false;
- }
-
- for (uuid_vec_t::const_iterator target_id = mSession->mInitialTargetIDs.begin();
- target_id != mSession->mInitialTargetIDs.end(); ++target_id)
- {
- if (*id == *target_id)
- {
- return false;
- }
- }
- }
+ uuid_vec_t temp_ids;
+
+ // Add the initial participant of a P2P session
+ temp_ids.push_back(mOtherParticipantUUID);
+ temp_ids.insert(temp_ids.end(), uuids.begin(), uuids.end());
+
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+ // first check whether this is a voice session
+ bool is_voice_call = voice_channel != NULL && voice_channel->isActive();
- return true;
+ // then we can close the current session
+ gIMMgr->leaveSession(mSessionID);
+ LLIMConversation::onClose(false);
+
+ // Start a new ad hoc voice call if we invite new participants to a P2P call,
+ // or start a text chat otherwise.
+ if (is_voice_call)
+ {
+ LLAvatarActions::startAdhocCall(temp_ids, mSessionID);
+ }
+ else
+ {
+ LLAvatarActions::startConference(temp_ids, mSessionID);
+ }
+ }
+ else
+ {
+ inviteToSession(uuids);
+ }
}
void LLIMFloater::boundVoiceChannel()
@@ -1096,19 +1135,7 @@ bool LLIMFloater::dropPerson(LLUUID* person_id, bool drop)
res = canAddSelectedToChat(ids);
if(res && drop)
{
- if (mIsP2PChat)
- {
- mStartConferenceInSameFloater = true;
- onClose(false);
-
- ids.push_back(mOtherParticipantUUID);
-
- LLAvatarActions::startConference(ids, mSessionID);
- }
- else
- {
- inviteToSession(ids);
- }
+ addSessionParticipants(ids);
}
}
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 23f9e75e21..2e8fc84746 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -152,7 +152,7 @@ private:
static void onInputEditorKeystroke(LLTextEditor* caller, void* userdata);
void setTyping(bool typing);
void onAddButtonClicked();
- void onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names);
+ void addSessionParticipants(const uuid_vec_t& uuids);
bool canAddSelectedToChat(const uuid_vec_t& uuids);
void onCallButtonClicked();
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index d343c8be24..e9144a4969 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -37,6 +37,7 @@
#include "llagent.h"
#include "llavataractions.h"
#include "llavatariconctrl.h"
+#include "llavatarnamecache.h"
#include "llgroupiconctrl.h"
#include "llfloateravatarpicker.h"
#include "llimview.h"
@@ -74,8 +75,15 @@ LLIMFloaterContainer::~LLIMFloaterContainer()
void LLIMFloaterContainer::sessionVoiceOrIMStarted(const LLUUID& session_id)
{
- LLIMFloater::show(session_id);
-};
+ LLIMFloater::show(session_id);
+}
+
+void LLIMFloaterContainer::sessionRemoved(const LLUUID& session_id)
+{
+ LLIMFloater* floaterp = LLIMFloater::findInstance(session_id);
+ LLFloater::onClickClose(floaterp);
+ removeConversationListItem(floaterp);
+}
BOOL LLIMFloaterContainer::postBuild()
{
@@ -110,6 +118,8 @@ BOOL LLIMFloaterContainer::postBuild()
collapseMessagesPane(gSavedPerAccountSettings.getBOOL("ConversationsMessagePaneCollapsed"));
collapseConversationsPane(gSavedPerAccountSettings.getBOOL("ConversationsListPaneCollapsed"));
+ LLAvatarNameCache::addUseDisplayNamesCallback(
+ boost::bind(&LLIMConversation::processChatHistoryStyleUpdate));
return TRUE;
}
@@ -306,9 +316,8 @@ void LLIMFloaterContainer::setVisible(BOOL visible)
if (visible)
{
// Make sure we have the Nearby Chat present when showing the conversation container
- LLUUID nearbychat_uuid = LLUUID::null; // Hacky but true: the session id for nearby chat is always null
- LLFloater* floaterp = findConversationItem(nearbychat_uuid);
- if (floaterp == NULL)
+ LLFloater* nearby_chat = LLFloaterReg::findInstance("chat_bar");
+ if (nearby_chat == NULL)
{
// If not found, force the creation of the nearby chat conversation panel
// *TODO: find a way to move this to XML as a default panel or something like that
@@ -540,10 +549,6 @@ LLConversationItem::LLConversationItem(std::string name, const LLUUID& uuid, LLF
mFloater(floaterp),
mContainer(containerp)
{
- // Hack: the nearby chat has no name so we catch that case and impose one
- // Of course, we won't be doing this in the final code
- if (name == "")
- mName = "Nearby Chat";
}
LLConversationItem::LLConversationItem() :
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 8f0ec27905..0d988b5b73 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -238,7 +238,7 @@ public:
// LLIMSessionObserver observe triggers
/*virtual*/ void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) {};
/*virtual*/ void sessionVoiceOrIMStarted(const LLUUID& session_id);
- /*virtual*/ void sessionRemoved(const LLUUID& session_id) {};
+ /*virtual*/ void sessionRemoved(const LLUUID& session_id);
/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) {};
private:
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 79018ec366..cdbb7c7cca 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -2583,7 +2583,6 @@ LLUUID LLIMMgr::addSession(
LLDynamicArray<LLUUID> ids;
ids.put(other_participant_id);
LLUUID session_id = addSession(name, dialog, other_participant_id, ids, voice);
- notifyObserverSessionVoiceOrIMStarted(session_id);
return session_id;
}
@@ -2653,6 +2652,8 @@ LLUUID LLIMMgr::addSession(
noteMutedUsers(session_id, ids);
}
+ notifyObserverSessionVoiceOrIMStarted(session_id);
+
return session_id;
}
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index a81d6b4025..384762549a 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -158,6 +158,10 @@ BOOL LLNearbyChat::postBuild()
enableResizeCtrls(true, true, false);
+ // title must be defined BEFORE call addToHost() because
+ // it is used for show the item's name in the conversations list
+ setTitle(getString("NearbyChatTitle"));
+
addToHost();
//for menu
@@ -182,7 +186,6 @@ BOOL LLNearbyChat::postBuild()
loadHistory();
}
- setTitle(getString("NearbyChatTitle"));
return LLIMConversation::postBuild();
}
@@ -342,15 +345,36 @@ void LLNearbyChat::enableDisableCallBtn()
getChildView("voice_call_btn")->setEnabled(false /*btn_enabled*/);
}
+void LLNearbyChat::onTearOffClicked()
+{
+ LLIMConversation::onTearOffClicked();
+
+ LLIMFloaterContainer* im_box = LLIMFloaterContainer::getInstance();
+
+ // see CHUI-170: Save torn-off state of the nearby chat between sessions
+ BOOL in_the_multifloater = (getHost() == im_box);
+ gSavedSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater);
+}
+
void LLNearbyChat::addToHost()
{
- if (LLIMConversation::isChatMultiTab())
+ if ( LLIMConversation::isChatMultiTab())
{
LLIMFloaterContainer* im_box = LLIMFloaterContainer::getInstance();
-
if (im_box)
{
- im_box->addFloater(this, FALSE, LLTabContainer::END);
+ if (gSavedSettings.getBOOL("NearbyChatIsNotTornOff"))
+ {
+ im_box->addFloater(this, TRUE, LLTabContainer::END);
+ }
+ else
+ {
+ // setting of the "potential" host: this sequence sets
+ // LLFloater::mHostHandle = NULL (a current host), but
+ // LLFloater::mLastHostHandle = im_box (a "future" host)
+ setHost(im_box);
+ setHost(NULL);
+ }
}
}
}
@@ -364,20 +388,18 @@ void LLNearbyChat::onOpen(const LLSD& key)
bool LLNearbyChat::applyRectControl()
{
- bool rect_controlled = LLFloater::applyRectControl();
+ bool is_torn_off = getHost() == NULL;
-/* if (!mNearbyChat->getVisible())
+ // Resize is limited to torn off floaters.
+ // A hosted floater is not resizable.
+ if (is_torn_off)
{
- reshape(getRect().getWidth(), getMinHeight());
- enableResizeCtrls(true, true, false);
- }
- else
- {*/
enableResizeCtrls(true);
- setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
-// }
+ }
- return rect_controlled;
+ setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
+
+ return LLFloater::applyRectControl();
}
void LLNearbyChat::onChatFontChange(LLFontGL* fontp)
@@ -408,9 +430,17 @@ void LLNearbyChat::showHistory()
{
openFloater();
setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
- reshape(getRect().getWidth(), mExpandedHeight);
- enableResizeCtrls(true);
- storeRectControl();
+
+ bool is_torn_off = getHost() == NULL;
+
+ // Reshape and enable resize controls only if it's a torn off floater.
+ // Otherwise all the size changes should be handled by LLIMFloaterContainer.
+ if (is_torn_off)
+ {
+ reshape(getRect().getWidth(), mExpandedHeight);
+ enableResizeCtrls(true);
+ storeRectControl();
+ }
}
std::string LLNearbyChat::getCurrentChat()
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 61404df942..90feb71488 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -101,6 +101,8 @@ protected:
void onToggleNearbyChatPanel();
+ /*virtual*/ void onTearOffClicked();
+
static LLWString stripChannelNumber(const LLWString &mesg, S32* channel);
EChatType processChatTypeTriggers(EChatType type, std::string &str);
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index ac2109dda4..c9eebe24d3 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -82,7 +82,7 @@ LLContextMenu* NearbyMenu::createMenu()
// registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs, LLUUID::null));
- registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
+ registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs, LLUUID::null));
registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
// registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index b0e36d756d..03c113ecb3 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1495,7 +1495,6 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
}
LLNotificationPtr notification_ptr = LLNotifications::instance().find(notification["id"].asUUID());
- llassert(notification_ptr != NULL);
// For muting, we need to add the mute, then decline the offer.
// This must be done here because:
@@ -1518,7 +1517,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
bool busy = gAgent.getBusy();
- LLNotificationFormPtr modified_form(new LLNotificationForm(*notification_ptr->getForm()));
+ LLNotificationFormPtr modified_form(notification_ptr ? new LLNotificationForm(*notification_ptr->getForm()) : new LLNotificationForm());
switch(button)
{
@@ -1564,7 +1563,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
break;
}
- modified_form->setElementEnabled("Show", false);
+ if (modified_form != NULL)
+ {
+ modified_form->setElementEnabled("Show", false);
+ }
break;
// end switch (mIM)
@@ -1581,7 +1583,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
break;
case IOR_MUTE:
- modified_form->setElementEnabled("Mute", false);
+ if (modified_form != NULL)
+ {
+ modified_form->setElementEnabled("Mute", false);
+ }
// MUTE falls through to decline
case IOR_DECLINE:
{
@@ -1618,8 +1623,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
busy_message(gMessageSystem, mFromID);
}
- modified_form->setElementEnabled("Show", false);
- modified_form->setElementEnabled("Discard", false);
+ if (modified_form != NULL)
+ {
+ modified_form->setElementEnabled("Show", false);
+ modified_form->setElementEnabled("Discard", false);
+ }
break;
}
@@ -1641,8 +1649,11 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
delete this;
}
- notification_ptr->updateForm(modified_form);
- notification_ptr->repost();
+ if (notification_ptr != NULL)
+ {
+ notification_ptr->updateForm(modified_form);
+ notification_ptr->repost();
+ }
return false;
}