summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llui/llfloaterreg.cpp2
-rw-r--r--indra/llui/llfloaterreg.h24
-rwxr-xr-xindra/newview/llconversationview.cpp3
-rw-r--r--indra/newview/llimconversation.cpp13
-rw-r--r--indra/newview/llimconversation.h3
-rwxr-xr-xindra/newview/llimfloatercontainer.cpp26
-rw-r--r--indra/newview/llimfloatercontainer.h4
-rw-r--r--indra/newview/llnearbychat.cpp4
-rw-r--r--indra/newview/skins/default/xui/en/floater_conversation_log.xml2
9 files changed, 58 insertions, 23 deletions
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 9115eb7174..920525448c 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -318,7 +318,7 @@ void LLFloaterReg::showInitialVisibleInstances()
BOOL isvis = LLFloater::getControlGroup()->getBOOL(controlname);
if (isvis)
{
- showInstance(name, LLSD()); // keyed floaters shouldn't set save_vis to true
+ showInstance(name, LLSD(LLUUID())); // keyed floaters shouldn't set save_vis to true
}
}
}
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index a1e1f8a988..7924b2a7b8 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -90,23 +90,23 @@ public:
static LLFloater* getLastFloaterCascading();
// Find / get (create) / remove / destroy
- static LLFloater* findInstance(const std::string& name, const LLSD& key = LLSD());
- static LLFloater* getInstance(const std::string& name, const LLSD& key = LLSD());
- static LLFloater* removeInstance(const std::string& name, const LLSD& key = LLSD());
- static bool destroyInstance(const std::string& name, const LLSD& key = LLSD());
+ static LLFloater* findInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()));
+ static LLFloater* getInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()));
+ static LLFloater* removeInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()));
+ static bool destroyInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()));
// Iterators
static const_instance_list_t& getFloaterList(const std::string& name);
// Visibility Management
// return NULL if instance not found or can't create instance (no builder)
- static LLFloater* showInstance(const std::string& name, const LLSD& key = LLSD(), BOOL focus = FALSE);
+ static LLFloater* showInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()), BOOL focus = FALSE);
// Close a floater (may destroy or set invisible)
// return false if can't find instance
- static bool hideInstance(const std::string& name, const LLSD& key = LLSD());
+ static bool hideInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()));
// return true if instance is visible:
- static bool toggleInstance(const std::string& name, const LLSD& key = LLSD());
- static bool instanceVisible(const std::string& name, const LLSD& key = LLSD());
+ static bool toggleInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()));
+ static bool instanceVisible(const std::string& name, const LLSD& key = LLSD(LLUUID()));
static void showInitialVisibleInstances();
static void hideVisibleInstances(const std::set<std::string>& exceptions = std::set<std::string>());
@@ -126,23 +126,23 @@ public:
static void registerControlVariables();
// Callback wrappers
- static void toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD());
+ static void toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD& key = LLSD(LLUUID()));
// Typed find / get / show
template <class T>
- static T* findTypedInstance(const std::string& name, const LLSD& key = LLSD())
+ static T* findTypedInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()))
{
return dynamic_cast<T*>(findInstance(name, key));
}
template <class T>
- static T* getTypedInstance(const std::string& name, const LLSD& key = LLSD())
+ static T* getTypedInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()))
{
return dynamic_cast<T*>(getInstance(name, key));
}
template <class T>
- static T* showTypedInstance(const std::string& name, const LLSD& key = LLSD(), BOOL focus = FALSE)
+ static T* showTypedInstance(const std::string& name, const LLSD& key = LLSD(LLUUID()), BOOL focus = FALSE)
{
return dynamic_cast<T*>(showInstance(name, key, focus));
}
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 208a89cc8d..d5d4fc13da 100755
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -239,7 +239,6 @@ S32 LLConversationViewSession::arrange(S32* width, S32* height)
void LLConversationViewSession::selectItem()
{
- LLFolderViewItem::selectItem();
LLConversationItem* item = dynamic_cast<LLConversationItem*>(mViewModelItem);
LLFloater* session_floater = LLIMConversation::getConversation(item->getUUID());
@@ -255,6 +254,8 @@ void LLConversationViewSession::selectItem()
// Set the focus on the selected floater
session_floater->setFocus(TRUE);
+
+ LLFolderViewItem::selectItem();
}
void LLConversationViewSession::setVisibleIfDetached(BOOL visible)
diff --git a/indra/newview/llimconversation.cpp b/indra/newview/llimconversation.cpp
index 216c5bbd70..a2efe63546 100644
--- a/indra/newview/llimconversation.cpp
+++ b/indra/newview/llimconversation.cpp
@@ -215,11 +215,21 @@ void LLIMConversation::onFocusReceived()
}
LLTransientDockableFloater::onFocusReceived();
+
+ mHasFocus = mHaveFocus;
+ mHaveFocus = true;
+
+ if (! mHasFocus)
+ {
+ LLIMFloaterContainer* container = LLIMFloaterContainer::getInstance();
+ container->setConvItemSelect(mSessionID);
+ }
}
void LLIMConversation::onFocusLost()
{
setBackgroundOpaque(false);
+ mHaveFocus = false;
LLTransientDockableFloater::onFocusLost();
}
@@ -371,6 +381,9 @@ void LLIMConversation::hideAllStandardButtons()
void LLIMConversation::updateHeaderAndToolbar()
{
+ // prevent start conversation before its container
+ LLIMFloaterContainer::getInstance();
+
bool is_torn_off = !getHost();
if (!is_torn_off)
{
diff --git a/indra/newview/llimconversation.h b/indra/newview/llimconversation.h
index 41a76c206e..e09ba79a6a 100644
--- a/indra/newview/llimconversation.h
+++ b/indra/newview/llimconversation.h
@@ -139,6 +139,9 @@ private:
void reshapeChatHistory();
LLTimer* mRefreshTimer; ///< Defines the rate at which refresh() is called.
+
+ bool mHasFocus;
+ bool mHaveFocus;
};
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index e039702683..5aaf176aca 100755
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -183,9 +183,9 @@ void LLIMFloaterContainer::onOpen(const LLSD& key)
}
// virtual
-void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point)
+void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point)
{
if(!floaterp) return;
@@ -427,7 +427,10 @@ void LLIMFloaterContainer::setVisible(BOOL visible)
for (;widget_it != mConversationsWidgets.end(); ++widget_it)
{
LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(widget_it->second);
- widget->setVisibleIfDetached(visible);
+ if (widget)
+ {
+ widget->setVisibleIfDetached(visible);
+ }
}
// Now, do the normal multifloater show/hide
@@ -608,6 +611,16 @@ void LLIMFloaterContainer::repositioningWidgets()
}
}
+void LLIMFloaterContainer::setConvItemSelect(LLUUID& session_id)
+{
+ LLFolderViewItem* widget = mConversationsWidgets[session_id];
+ if (widget && mSelectedSession != session_id)
+ {
+ mSelectedSession = session_id;
+ (widget->getRoot())->setSelection(widget, FALSE, FALSE);
+ }
+}
+
void LLIMFloaterContainer::addConversationListItem(const LLUUID& uuid)
{
bool is_nearby_chat = uuid.isNull();
@@ -675,7 +688,10 @@ void LLIMFloaterContainer::removeConversationListItem(const LLUUID& uuid, bool c
if (widget_it != mConversationsWidgets.end())
{
LLFolderViewItem* widget = widget_it->second;
- widget->destroyView();
+ if (widget)
+ {
+ widget->destroyView();
+ }
}
// Suppress the conversation items and widgets from their respective maps
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 324adfcc11..f6048bed37 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -62,7 +62,7 @@ public:
/*virtual*/ void addFloater(LLFloater* floaterp,
BOOL select_added_floater,
LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
-
+ void setConvItemSelect(LLUUID& session_id);
/*virtual*/ void tabClose();
static LLFloater* getCurrentVoiceFloater();
@@ -114,6 +114,8 @@ private:
bool mInitialized;
+ LLUUID mSelectedSession;
+
// Conversation list implementation
public:
void removeConversationListItem(const LLUUID& uuid, bool change_focus = true);
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index ddd271e23f..a803b35aa8 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -108,7 +108,7 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
LLNearbyChat::LLNearbyChat(const LLSD& llsd)
-: LLIMConversation(LLSD()),
+: LLIMConversation(llsd.asUUID()),
//mOutputMonitor(NULL),
mSpeakerMgr(NULL),
mExpandedHeight(COLLAPSED_HEIGHT + EXPANDED_HEIGHT)
@@ -116,7 +116,7 @@ LLNearbyChat::LLNearbyChat(const LLSD& llsd)
mIsP2PChat = false;
mIsNearbyChat = true;
setIsChrome(TRUE);
- mKey = LLSD();
+ mKey = LLSD(LLUUID());
mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
mSessionID = LLUUID();
setName("nearby_chat");
diff --git a/indra/newview/skins/default/xui/en/floater_conversation_log.xml b/indra/newview/skins/default/xui/en/floater_conversation_log.xml
index df78bbccec..12d17e6b37 100644
--- a/indra/newview/skins/default/xui/en/floater_conversation_log.xml
+++ b/indra/newview/skins/default/xui/en/floater_conversation_log.xml
@@ -15,7 +15,7 @@
width="450">
<string name="logging_calls_disabled">
- Conversations are not being logged. To log conversations in the future, select "Save IM logs in my computer" under Preferences > Privacy.
+ Conversations are not being logged. To log conversations in the future, select "Save IM logs on my computer" under Preferences > Privacy.
</string>
<panel