merging
commit
cbbf1504f0
|
|
@ -812,6 +812,20 @@ void LLFloater::closeFloater(bool app_quitting)
|
|||
}
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
void LLFloater::closeHostedFloater()
|
||||
{
|
||||
// When toggling *visibility*, close the host instead of the floater when hosted
|
||||
if (getHost())
|
||||
{
|
||||
getHost()->closeFloater();
|
||||
}
|
||||
else
|
||||
{
|
||||
closeFloater();
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
void LLFloater::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
{
|
||||
|
|
@ -1609,8 +1623,17 @@ void LLFloater::bringToFront( S32 x, S32 y )
|
|||
// virtual
|
||||
void LLFloater::setVisibleAndFrontmost(BOOL take_focus)
|
||||
{
|
||||
setVisible(TRUE);
|
||||
setFrontmost(take_focus);
|
||||
LLMultiFloater* hostp = getHost();
|
||||
if (hostp)
|
||||
{
|
||||
hostp->setVisible(TRUE);
|
||||
hostp->setFrontmost(take_focus);
|
||||
}
|
||||
else
|
||||
{
|
||||
setVisible(TRUE);
|
||||
setFrontmost(take_focus);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloater::setFrontmost(BOOL take_focus)
|
||||
|
|
|
|||
|
|
@ -226,6 +226,9 @@ public:
|
|||
// If allowed, close the floater cleanly, releasing focus.
|
||||
virtual void closeFloater(bool app_quitting = false);
|
||||
|
||||
// Close the floater or its host. Use when hidding or toggling a floater instance.
|
||||
virtual void closeHostedFloater();
|
||||
|
||||
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
|
||||
|
||||
// Release keyboard and mouse focus
|
||||
|
|
|
|||
|
|
@ -264,17 +264,9 @@ bool LLFloaterReg::hideInstance(const std::string& name, const LLSD& key)
|
|||
LLFloater* instance = findInstance(name, key);
|
||||
if (instance)
|
||||
{
|
||||
// When toggling *visibility*, close the host instead of the floater when hosted
|
||||
if (instance->getHost())
|
||||
instance->getHost()->closeFloater();
|
||||
else
|
||||
instance->closeFloater();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
instance->closeHostedFloater();
|
||||
}
|
||||
return (instance != NULL);
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
@ -284,11 +276,7 @@ bool LLFloaterReg::toggleInstance(const std::string& name, const LLSD& key)
|
|||
LLFloater* instance = findInstance(name, key);
|
||||
if (LLFloater::isShown(instance))
|
||||
{
|
||||
// When toggling *visibility*, close the host instead of the floater when hosted
|
||||
if (instance->getHost())
|
||||
instance->getHost()->closeFloater();
|
||||
else
|
||||
instance->closeFloater();
|
||||
instance->closeHostedFloater();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
|
@ -481,31 +469,58 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD&
|
|||
// * Also, if it is not on top, bring it forward when focus is given.
|
||||
// * Else the target floater is open, close it.
|
||||
//
|
||||
|
||||
std::string name = sdname.asString();
|
||||
LLFloater* instance = getInstance(name, key);
|
||||
|
||||
|
||||
if (!instance)
|
||||
{
|
||||
lldebugs << "Unable to get instance of floater '" << name << "'" << llendl;
|
||||
return;
|
||||
}
|
||||
else if (instance->isMinimized())
|
||||
|
||||
// If hosted, we need to take that into account
|
||||
LLFloater* host = instance->getHost();
|
||||
|
||||
if (host)
|
||||
{
|
||||
instance->setMinimized(FALSE);
|
||||
instance->setVisibleAndFrontmost();
|
||||
}
|
||||
else if (!instance->isShown())
|
||||
{
|
||||
instance->openFloater(key);
|
||||
instance->setVisibleAndFrontmost();
|
||||
}
|
||||
else if (!instance->isFrontmost())
|
||||
{
|
||||
instance->setVisibleAndFrontmost();
|
||||
if (host->isMinimized() || !host->isShown() || !host->isFrontmost())
|
||||
{
|
||||
host->setMinimized(FALSE);
|
||||
instance->openFloater(key);
|
||||
instance->setVisibleAndFrontmost();
|
||||
}
|
||||
else if (!instance->getVisible())
|
||||
{
|
||||
instance->openFloater(key);
|
||||
instance->setVisibleAndFrontmost();
|
||||
instance->setFocus(TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
instance->closeHostedFloater();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
instance->closeFloater();
|
||||
if (instance->isMinimized())
|
||||
{
|
||||
instance->setMinimized(FALSE);
|
||||
instance->setVisibleAndFrontmost();
|
||||
}
|
||||
else if (!instance->isShown())
|
||||
{
|
||||
instance->openFloater(key);
|
||||
instance->setVisibleAndFrontmost();
|
||||
}
|
||||
else if (!instance->isFrontmost())
|
||||
{
|
||||
instance->setVisibleAndFrontmost();
|
||||
}
|
||||
else
|
||||
{
|
||||
instance->closeHostedFloater();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
#include "llcallingcard.h" // for LLAvatarTracker
|
||||
#include "llconversationlog.h"
|
||||
#include "llfloateravatarpicker.h" // for LLFloaterAvatarPicker
|
||||
#include "llfloaterconversationpreview.h"
|
||||
#include "llfloatergroupinvite.h"
|
||||
#include "llfloatergroups.h"
|
||||
#include "llfloaterreg.h"
|
||||
|
|
@ -926,9 +927,20 @@ void LLAvatarActions::viewChatHistory(const LLUUID& id)
|
|||
if (iter->getParticipantID() == id)
|
||||
{
|
||||
LLFloaterReg::showInstance("preview_conversation", iter->getSessionID(), true);
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (LLLogChat::isTranscriptExist(id))
|
||||
{
|
||||
LLAvatarName avatar_name;
|
||||
LLSD extended_id(id);
|
||||
|
||||
LLAvatarNameCache::get(id, &avatar_name);
|
||||
extended_id[LL_FCP_COMPLETE_NAME] = avatar_name.getCompleteName();
|
||||
extended_id[LL_FCP_ACCOUNT_NAME] = avatar_name.getAccountName();
|
||||
LLFloaterReg::showInstance("preview_conversation", extended_id, true);
|
||||
}
|
||||
}
|
||||
|
||||
//== private methods ========================================================================================
|
||||
|
|
|
|||
|
|
@ -33,13 +33,19 @@
|
|||
#include "llspinctrl.h"
|
||||
#include "lltrans.h"
|
||||
|
||||
const std::string LL_FCP_COMPLETE_NAME("complete_name");
|
||||
const std::string LL_FCP_ACCOUNT_NAME("user_name");
|
||||
|
||||
LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_id)
|
||||
: LLFloater(session_id),
|
||||
mChatHistory(NULL),
|
||||
mSessionID(session_id.asUUID()),
|
||||
mCurrentPage(0),
|
||||
mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize"))
|
||||
{}
|
||||
mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")),
|
||||
mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),
|
||||
mCompleteName(session_id[LL_FCP_COMPLETE_NAME])
|
||||
{
|
||||
}
|
||||
|
||||
BOOL LLFloaterConversationPreview::postBuild()
|
||||
{
|
||||
|
|
@ -49,7 +55,12 @@ BOOL LLFloaterConversationPreview::postBuild()
|
|||
std::string name;
|
||||
std::string file;
|
||||
|
||||
if (mSessionID != LLUUID::null && conv)
|
||||
if (mAccountName != "")
|
||||
{
|
||||
name = mCompleteName;
|
||||
file = mAccountName;
|
||||
}
|
||||
else if (mSessionID != LLUUID::null && conv)
|
||||
{
|
||||
name = conv->getConversationName();
|
||||
file = conv->getHistoryFileName();
|
||||
|
|
|
|||
|
|
@ -29,6 +29,9 @@
|
|||
#include "llchathistory.h"
|
||||
#include "llfloater.h"
|
||||
|
||||
extern const std::string LL_FCP_COMPLETE_NAME; //"complete_name"
|
||||
extern const std::string LL_FCP_ACCOUNT_NAME; //"user_name"
|
||||
|
||||
class LLSpinCtrl;
|
||||
|
||||
class LLFloaterConversationPreview : public LLFloater
|
||||
|
|
@ -54,6 +57,8 @@ private:
|
|||
int mPageSize;
|
||||
|
||||
std::list<LLSD> mMessages;
|
||||
std::string mAccountName;
|
||||
std::string mCompleteName;
|
||||
};
|
||||
|
||||
#endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
|
||||
|
|
|
|||
|
|
@ -1337,6 +1337,30 @@ void LLFloaterIMContainer::selectConversation(const LLUUID& session_id)
|
|||
selectConversationPair(session_id, true);
|
||||
}
|
||||
|
||||
// Select the conversation *after* (or before if none after) the passed uuid conversation
|
||||
// Used to change the selection on key hits
|
||||
void LLFloaterIMContainer::selectNextConversation(const LLUUID& uuid)
|
||||
{
|
||||
LLFolderViewItem* new_selection = NULL;
|
||||
LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,uuid);
|
||||
if (widget)
|
||||
{
|
||||
new_selection = mConversationsRoot->getNextFromChild(widget, FALSE);
|
||||
if (!new_selection)
|
||||
{
|
||||
new_selection = mConversationsRoot->getPreviousFromChild(widget, FALSE);
|
||||
}
|
||||
}
|
||||
if (new_selection)
|
||||
{
|
||||
LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(new_selection->getViewModelItem());
|
||||
if (vmi)
|
||||
{
|
||||
selectConversationPair(vmi->getUUID(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Synchronous select the conversation item and the conversation floater
|
||||
BOOL LLFloaterIMContainer::selectConversationPair(const LLUUID& session_id, bool select_widget)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ public:
|
|||
void returnFloaterToHost();
|
||||
void showConversation(const LLUUID& session_id);
|
||||
void selectConversation(const LLUUID& session_id);
|
||||
void selectNextConversation(const LLUUID& session_id);
|
||||
BOOL selectConversationPair(const LLUUID& session_id, bool select_widget);
|
||||
void clearAllFlashStates();
|
||||
|
||||
|
|
@ -187,6 +188,7 @@ public:
|
|||
void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes);
|
||||
bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget);
|
||||
boost::signals2::connection mMicroChangedSignal;
|
||||
S32 getConversationListItemSize() { return mConversationsWidgets.size(); }
|
||||
|
||||
private:
|
||||
LLConversationViewSession* createConversationItemWidget(LLConversationItem* item);
|
||||
|
|
|
|||
|
|
@ -135,6 +135,25 @@ BOOL LLFloaterIMNearbyChat::postBuild()
|
|||
return result;
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLFloaterIMNearbyChat::closeHostedFloater()
|
||||
{
|
||||
// Should check how many conversations are ongoing. Close all if 1 only (the Nearby Chat), select next one otherwise
|
||||
LLFloaterIMContainer* floater_container = LLFloaterIMContainer::getInstance();
|
||||
if (floater_container->getConversationListItemSize() == 1)
|
||||
{
|
||||
floater_container->closeFloater();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!getHost())
|
||||
{
|
||||
setVisible(FALSE);
|
||||
}
|
||||
floater_container->selectNextConversation(LLUUID());
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLFloaterIMNearbyChat::refresh()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ public:
|
|||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
/*virtual*/ void onClose(bool app_quitting);
|
||||
/*virtual*/ void setVisible(BOOL visible);
|
||||
/*virtual*/ void closeHostedFloater();
|
||||
|
||||
void loadHistory();
|
||||
void reloadMessages(bool clean_messages = false);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "llagent.h"
|
||||
#include "llagentui.h"
|
||||
#include "llavatarnamecache.h"
|
||||
#include "lllogchat.h"
|
||||
#include "lltrans.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
|
@ -540,6 +541,31 @@ void LLLogChat::deleteTranscripts()
|
|||
LLFloaterIMSessionTab::processChatHistoryStyleUpdate(true);
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id)
|
||||
{
|
||||
std::vector<std::string> list_of_transcriptions;
|
||||
LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
|
||||
|
||||
if (list_of_transcriptions.size() > 0)
|
||||
{
|
||||
LLAvatarName avatar_name;
|
||||
LLAvatarNameCache::get(avatar_id, &avatar_name);
|
||||
std::string avatar_user_name = avatar_name.getAccountName();
|
||||
std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
|
||||
|
||||
BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
|
||||
{
|
||||
if (std::string::npos != transcript_file_name.find(avatar_user_name))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//*TODO mark object's names in a special way so that they will be distinguishable form avatar name
|
||||
//which are more strict by its nature (only firstname and secondname)
|
||||
//Example, an object's name can be written like "Object <actual_object's_name>"
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ public:
|
|||
static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb);
|
||||
|
||||
static void deleteTranscripts();
|
||||
static bool isTranscriptExist(const LLUUID& avatar_id);
|
||||
|
||||
private:
|
||||
static std::string cleanFileName(std::string filename);
|
||||
|
|
|
|||
|
|
@ -812,19 +812,20 @@ void LLPanelPeople::updateButtons()
|
|||
else
|
||||
{
|
||||
bool is_friend = true;
|
||||
|
||||
bool is_self = false;
|
||||
// Check whether selected avatar is our friend.
|
||||
if (item_selected)
|
||||
{
|
||||
selected_id = selected_uuids.front();
|
||||
is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;
|
||||
is_self = gAgent.getID() == selected_id;
|
||||
}
|
||||
|
||||
LLPanel* cur_panel = mTabContainer->getCurrentPanel();
|
||||
if (cur_panel)
|
||||
{
|
||||
if (cur_panel->hasChild("add_friend_btn", TRUE))
|
||||
cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend);
|
||||
cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self);
|
||||
|
||||
if (friends_tab_active)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "llagentdata.h" // for gAgentID
|
||||
#include "llavataractions.h"
|
||||
#include "llcallingcard.h" // for LLAvatarTracker
|
||||
#include "lllogchat.h"
|
||||
#include "llviewermenu.h" // for gMenuHolder
|
||||
|
||||
namespace LLPanelPeopleMenus
|
||||
|
|
@ -180,7 +181,11 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
|
|||
{
|
||||
return LLAvatarActions::canOfferTeleport(mUUIDs);
|
||||
}
|
||||
else if (item == std::string("can_im") || item == std::string("can_callog") || item == std::string("can_invite") ||
|
||||
else if (item == std::string("can_callog"))
|
||||
{
|
||||
return LLLogChat::isTranscriptExist(mUUIDs.front());
|
||||
}
|
||||
else if (item == std::string("can_im") || item == std::string("can_invite") ||
|
||||
item == std::string("can_share") || item == std::string("can_pay"))
|
||||
{
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -183,8 +183,7 @@
|
|||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Toolbar buttons..."
|
||||
name="Toolbars"
|
||||
shortcut="control|T">
|
||||
name="Toolbars">
|
||||
<menu_item_call.on_click
|
||||
function="Floater.Toggle"
|
||||
parameter="toybox" />
|
||||
|
|
@ -223,7 +222,8 @@
|
|||
tear_off="true">
|
||||
<menu_item_check
|
||||
label="Conversations..."
|
||||
name="Conversations">
|
||||
name="Conversations"
|
||||
shortcut="control|T">
|
||||
<menu_item_check.on_check
|
||||
function="Floater.IsOpen"
|
||||
parameter="im_container" />
|
||||
|
|
@ -240,7 +240,7 @@
|
|||
function="Floater.Visible"
|
||||
parameter="nearby_chat" />
|
||||
<menu_item_check.on_click
|
||||
function="Floater.Toggle"
|
||||
function="Floater.ToggleOrBringToFront"
|
||||
parameter="nearby_chat" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
|
|
|
|||
Loading…
Reference in New Issue