meow-7.2.2
Cho 2013-02-25 18:11:51 +00:00
commit cbbf1504f0
15 changed files with 190 additions and 42 deletions

View File

@ -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)

View File

@ -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

View File

@ -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();
}
}
}

View File

@ -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 ========================================================================================

View File

@ -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();

View File

@ -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_ */

View File

@ -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)
{

View File

@ -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);

View File

@ -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()
{

View File

@ -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);

View File

@ -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>"

View File

@ -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);

View File

@ -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)
{

View File

@ -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;

View File

@ -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