merge
commit
f5a2929d8f
|
|
@ -506,13 +506,10 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
|
|||
}
|
||||
make_ui_sound("UISndClick");
|
||||
}
|
||||
//Just re-select the item since it is clicked without ctrl or shift
|
||||
else if(!(mask & (MASK_CONTROL | MASK_SHIFT)))
|
||||
{
|
||||
getRoot()->setSelection(this, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If selected, we reserve the decision of deselecting/reselecting to the mouse up moment.
|
||||
// This is necessary so we maintain selection consistent when starting a drag.
|
||||
mSelectPending = TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -739,7 +736,7 @@ void LLFolderViewItem::drawHighlight(const BOOL showContent, const BOOL hasKeybo
|
|||
getRect().getWidth() - 2,
|
||||
0,
|
||||
focusOutlineColor, FALSE);
|
||||
if (showContent)
|
||||
if (showContent && !isFlashing())
|
||||
{
|
||||
gl_rect_2d(FOCUS_LEFT,
|
||||
focus_bottom + 1,
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@ LLConversationItem::LLConversationItem(std::string display_name, const LLUUID& u
|
|||
mNeedsRefresh(true),
|
||||
mConvType(CONV_UNKNOWN),
|
||||
mLastActiveTime(0.0),
|
||||
mDisplayModeratorOptions(false)
|
||||
mDisplayModeratorOptions(false),
|
||||
mAvatarNameCacheConnection()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -58,7 +59,8 @@ LLConversationItem::LLConversationItem(const LLUUID& uuid, LLFolderViewModelInte
|
|||
mNeedsRefresh(true),
|
||||
mConvType(CONV_UNKNOWN),
|
||||
mLastActiveTime(0.0),
|
||||
mDisplayModeratorOptions(false)
|
||||
mDisplayModeratorOptions(false),
|
||||
mAvatarNameCacheConnection()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -69,10 +71,21 @@ LLConversationItem::LLConversationItem(LLFolderViewModelInterface& root_view_mod
|
|||
mNeedsRefresh(true),
|
||||
mConvType(CONV_UNKNOWN),
|
||||
mLastActiveTime(0.0),
|
||||
mDisplayModeratorOptions(false)
|
||||
mDisplayModeratorOptions(false),
|
||||
mAvatarNameCacheConnection()
|
||||
{
|
||||
}
|
||||
|
||||
LLConversationItem::~LLConversationItem()
|
||||
{
|
||||
// Disconnect any previous avatar name cache connection to ensure
|
||||
// that the callback method is not called after destruction
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
void LLConversationItem::postEvent(const std::string& event_type, LLConversationItemSession* session, LLConversationItemParticipant* participant)
|
||||
{
|
||||
LLUUID session_id = (session ? session->getUUID() : LLUUID());
|
||||
|
|
@ -142,6 +155,37 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32
|
|||
}
|
||||
}
|
||||
|
||||
// method does subscription to changes in avatar name cache for current session/participant conversation item.
|
||||
void LLConversationItem::fetchAvatarName(bool isParticipant /*= true*/)
|
||||
{
|
||||
LLUUID item_id = getUUID();
|
||||
|
||||
// item should not be null for participants
|
||||
if (isParticipant)
|
||||
{
|
||||
llassert(item_id.notNull());
|
||||
}
|
||||
|
||||
// disconnect any previous avatar name cache connection
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
|
||||
// exclude nearby chat item
|
||||
if (item_id.notNull())
|
||||
{
|
||||
// for P2P session item, override it as item of called agent
|
||||
if (CONV_SESSION_1_ON_1 == getType())
|
||||
{
|
||||
item_id = LLIMModel::getInstance()->getOtherParticipantID(item_id);
|
||||
}
|
||||
|
||||
// subscribe on avatar name cache changes for participant and session items
|
||||
mAvatarNameCacheConnection = LLAvatarNameCache::get(item_id, boost::bind(&LLConversationItem::onAvatarNameCache, this, _2));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// LLConversationItemSession
|
||||
//
|
||||
|
|
@ -169,11 +213,11 @@ void LLConversationItemSession::addParticipant(LLConversationItemParticipant* pa
|
|||
addChild(participant);
|
||||
mIsLoaded = true;
|
||||
mNeedsRefresh = true;
|
||||
updateParticipantName(participant);
|
||||
updateName(participant);
|
||||
postEvent("add_participant", this, participant);
|
||||
}
|
||||
|
||||
void LLConversationItemSession::updateParticipantName(LLConversationItemParticipant* participant)
|
||||
void LLConversationItemSession::updateName(LLConversationItemParticipant* participant)
|
||||
{
|
||||
EConversationType conversation_type = getType();
|
||||
// We modify the session name only in the case of an ad-hoc session or P2P session, exit otherwise (nothing to do)
|
||||
|
|
@ -181,11 +225,13 @@ void LLConversationItemSession::updateParticipantName(LLConversationItemParticip
|
|||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Avoid changing the default name if no participant present yet
|
||||
if (mChildren.size() == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uuid_vec_t temp_uuids; // uuids vector for building the added participants' names string
|
||||
if (conversation_type == CONV_SESSION_AD_HOC)
|
||||
{
|
||||
|
|
@ -210,12 +256,14 @@ void LLConversationItemSession::updateParticipantName(LLConversationItemParticip
|
|||
}
|
||||
else if (conversation_type == CONV_SESSION_1_ON_1)
|
||||
{
|
||||
// In the case of a P2P conversersation, we need to grab the name of the other participant in the session instance itself
|
||||
// In the case of a P2P conversation, we need to grab the name of the other participant in the session instance itself
|
||||
// as we do not create participants for such a session.
|
||||
LLFloaterIMSession *conversationFloater = LLFloaterIMSession::findInstance(mUUID);
|
||||
LLUUID participantID = conversationFloater->getOtherParticipantUUID();
|
||||
temp_uuids.push_back(participantID);
|
||||
if (gAgentID != participant->getUUID())
|
||||
{
|
||||
temp_uuids.push_back(participant->getUUID());
|
||||
}
|
||||
}
|
||||
|
||||
if (temp_uuids.size() != 0)
|
||||
{
|
||||
std::string new_session_name;
|
||||
|
|
@ -229,7 +277,7 @@ void LLConversationItemSession::removeParticipant(LLConversationItemParticipant*
|
|||
{
|
||||
removeChild(participant);
|
||||
mNeedsRefresh = true;
|
||||
updateParticipantName(participant);
|
||||
updateName(participant);
|
||||
postEvent("remove_participant", this, participant);
|
||||
}
|
||||
|
||||
|
|
@ -393,6 +441,18 @@ void LLConversationItemSession::dumpDebugData(bool dump_children)
|
|||
}
|
||||
}
|
||||
|
||||
// should be invoked only for P2P sessions
|
||||
void LLConversationItemSession::onAvatarNameCache(const LLAvatarName& av_name)
|
||||
{
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
|
||||
renameItem(av_name.getDisplayName());
|
||||
postEvent("update_session", this, NULL);
|
||||
}
|
||||
|
||||
//
|
||||
// LLConversationItemParticipant
|
||||
//
|
||||
|
|
@ -401,8 +461,7 @@ LLConversationItemParticipant::LLConversationItemParticipant(std::string display
|
|||
LLConversationItem(display_name,uuid,root_view_model),
|
||||
mIsMuted(false),
|
||||
mIsModerator(false),
|
||||
mDistToAgent(-1.0),
|
||||
mAvatarNameCacheConnection()
|
||||
mDistToAgent(-1.0)
|
||||
{
|
||||
mDisplayName = display_name;
|
||||
mConvType = CONV_PARTICIPANT;
|
||||
|
|
@ -412,38 +471,12 @@ LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid,
|
|||
LLConversationItem(uuid,root_view_model),
|
||||
mIsMuted(false),
|
||||
mIsModerator(false),
|
||||
mDistToAgent(-1.0),
|
||||
mAvatarNameCacheConnection()
|
||||
mDistToAgent(-1.0)
|
||||
{
|
||||
mConvType = CONV_PARTICIPANT;
|
||||
}
|
||||
|
||||
LLConversationItemParticipant::~LLConversationItemParticipant()
|
||||
{
|
||||
// Disconnect any previous avatar name cache connection to ensure
|
||||
// that the callback method is not called after destruction
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
void LLConversationItemParticipant::fetchAvatarName()
|
||||
{
|
||||
// Request the avatar name from the cache
|
||||
llassert(getUUID().notNull());
|
||||
if (getUUID().notNull())
|
||||
{
|
||||
// Disconnect any previous avatar name cache connection
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
mAvatarNameCacheConnection = LLAvatarNameCache::get(getUUID(), boost::bind(&LLConversationItemParticipant::onAvatarNameCache, this, _2));
|
||||
}
|
||||
}
|
||||
|
||||
void LLConversationItemParticipant::updateAvatarName()
|
||||
void LLConversationItemParticipant::updateName()
|
||||
{
|
||||
llassert(getUUID().notNull());
|
||||
if (getUUID().notNull())
|
||||
|
|
@ -451,29 +484,33 @@ void LLConversationItemParticipant::updateAvatarName()
|
|||
LLAvatarName av_name;
|
||||
if (LLAvatarNameCache::get(getUUID(),&av_name))
|
||||
{
|
||||
updateAvatarName(av_name);
|
||||
updateName(av_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLConversationItemParticipant::onAvatarNameCache(const LLAvatarName& av_name)
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
updateAvatarName(av_name);
|
||||
if (mAvatarNameCacheConnection.connected())
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
}
|
||||
|
||||
updateName(av_name);
|
||||
}
|
||||
|
||||
void LLConversationItemParticipant::updateAvatarName(const LLAvatarName& av_name)
|
||||
void LLConversationItemParticipant::updateName(const LLAvatarName& av_name)
|
||||
{
|
||||
mName = av_name.getUserName();
|
||||
mDisplayName = av_name.getDisplayName();
|
||||
mNeedsRefresh = true;
|
||||
renameItem(mDisplayName);
|
||||
if (mParent != NULL)
|
||||
{
|
||||
LLConversationItemSession* parent_session = dynamic_cast<LLConversationItemSession*>(mParent);
|
||||
if (parent_session != NULL)
|
||||
{
|
||||
parent_session->requestSort();
|
||||
parent_session->updateParticipantName(this);
|
||||
parent_session->updateName(this);
|
||||
postEvent("update_participant", parent_session, this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ public:
|
|||
LLConversationItem(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
LLConversationItem(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
LLConversationItem(LLFolderViewModelInterface& root_view_model);
|
||||
virtual ~LLConversationItem() {}
|
||||
virtual ~LLConversationItem();
|
||||
|
||||
// Stub those things we won't really be using in this conversation context
|
||||
virtual const std::string& getName() const { return mName; }
|
||||
|
|
@ -132,27 +132,31 @@ public:
|
|||
|
||||
void buildParticipantMenuOptions(menuentry_vec_t& items, U32 flags);
|
||||
|
||||
void fetchAvatarName(bool isParticipant = true); // fetch and update the avatar name
|
||||
|
||||
protected:
|
||||
virtual void onAvatarNameCache(const LLAvatarName& av_name) {}
|
||||
|
||||
std::string mName; // Name of the session or the participant
|
||||
LLUUID mUUID; // UUID of the session or the participant
|
||||
EConversationType mConvType; // Type of conversation item
|
||||
bool mNeedsRefresh; // Flag signaling to the view that something changed for this item
|
||||
F64 mLastActiveTime;
|
||||
bool mDisplayModeratorOptions;
|
||||
};
|
||||
boost::signals2::connection mAvatarNameCacheConnection;
|
||||
};
|
||||
|
||||
class LLConversationItemSession : public LLConversationItem
|
||||
{
|
||||
public:
|
||||
LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
LLConversationItemSession(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
virtual ~LLConversationItemSession() {}
|
||||
|
||||
/*virtual*/ bool hasChildren() const;
|
||||
LLPointer<LLUIImage> getIcon() const { return NULL; }
|
||||
void setSessionID(const LLUUID& session_id) { mUUID = session_id; mNeedsRefresh = true; }
|
||||
void addParticipant(LLConversationItemParticipant* participant);
|
||||
void updateParticipantName(LLConversationItemParticipant* participant);
|
||||
void updateName(LLConversationItemParticipant* participant);
|
||||
void removeParticipant(LLConversationItemParticipant* participant);
|
||||
void removeParticipant(const LLUUID& participant_id);
|
||||
void clearParticipants();
|
||||
|
|
@ -172,6 +176,8 @@ public:
|
|||
void dumpDebugData(bool dump_children = false);
|
||||
|
||||
private:
|
||||
/*virtual*/ void onAvatarNameCache(const LLAvatarName& av_name);
|
||||
|
||||
bool mIsLoaded; // true if at least one participant has been added to the session, false otherwise
|
||||
};
|
||||
|
||||
|
|
@ -180,7 +186,6 @@ class LLConversationItemParticipant : public LLConversationItem
|
|||
public:
|
||||
LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
virtual ~LLConversationItemParticipant();
|
||||
|
||||
virtual const std::string& getDisplayName() const { return mDisplayName; }
|
||||
|
||||
|
|
@ -195,8 +200,7 @@ public:
|
|||
|
||||
virtual const bool getDistanceToAgent(F64& dist) const { dist = mDistToAgent; return (dist >= 0.0); }
|
||||
|
||||
void fetchAvatarName(); // fetch and update the avatar name
|
||||
void updateAvatarName(); // get from the cache (do *not* fetch) and update the avatar name
|
||||
void updateName(); // get from the cache (do *not* fetch) and update the avatar name
|
||||
LLConversationItemSession* getParentSession();
|
||||
|
||||
void dumpDebugData();
|
||||
|
|
@ -204,7 +208,7 @@ public:
|
|||
|
||||
private:
|
||||
void onAvatarNameCache(const LLAvatarName& av_name); // callback used by fetchAvatarName
|
||||
void updateAvatarName(const LLAvatarName& av_name);
|
||||
void updateName(const LLAvatarName& av_name);
|
||||
|
||||
bool mIsMuted; // default is false
|
||||
bool mIsModerator; // default is false
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ BOOL LLFloaterIMContainer::postBuild()
|
|||
|
||||
setTabContainer(getChild<LLTabContainer>("im_box_tab_container"));
|
||||
mStubPanel = getChild<LLPanel>("stub_panel");
|
||||
mStubTextBox = getChild<LLTextBox>("stub_textbox_2");
|
||||
mStubTextBox = getChild<LLTextBox>("stub_textbox");
|
||||
mStubTextBox->setURLClickedCallback(boost::bind(&LLFloaterIMContainer::returnFloaterToHost, this));
|
||||
|
||||
mConversationsStack = getChild<LLLayoutStack>("conversations_stack");
|
||||
|
|
@ -380,7 +380,7 @@ void LLFloaterIMContainer::processParticipantsStyleUpdate()
|
|||
{
|
||||
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
|
||||
// Get the avatar name for this participant id from the cache and update the model
|
||||
participant_model->updateAvatarName();
|
||||
participant_model->updateName();
|
||||
// Next participant
|
||||
current_participant_model++;
|
||||
}
|
||||
|
|
@ -1390,7 +1390,7 @@ LLConversationItem* LLFloaterIMContainer::addConversationListItem(const LLUUID&
|
|||
return NULL;
|
||||
}
|
||||
item->renameItem(display_name);
|
||||
item->updateParticipantName(NULL);
|
||||
item->updateName(NULL);
|
||||
|
||||
mConversationsItems[uuid] = item;
|
||||
|
||||
|
|
@ -1419,6 +1419,11 @@ LLConversationItem* LLFloaterIMContainer::addConversationListItem(const LLUUID&
|
|||
}
|
||||
}
|
||||
|
||||
if (uuid.notNull() && im_sessionp->isP2PSessionType())
|
||||
{
|
||||
item->fetchAvatarName(false);
|
||||
}
|
||||
|
||||
// Do that too for the conversation dialog
|
||||
LLFloaterIMSessionTab *conversation_floater = (uuid.isNull() ? (LLFloaterIMSessionTab*)(LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")) : (LLFloaterIMSessionTab*)(LLFloaterIMSession::findInstance(uuid)));
|
||||
if (conversation_floater)
|
||||
|
|
|
|||
|
|
@ -129,11 +129,7 @@ void process_dnd_im(const LLSD& notification)
|
|||
false); //will need slight refactor to retrieve whether offline message or not (assume online for now)
|
||||
}
|
||||
|
||||
//For now always flash conversation line item
|
||||
LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
|
||||
im_box->flashConversationItemWidget(sessionID, true);
|
||||
|
||||
//And flash toolbar button
|
||||
//Flash toolbar button for now, eventually the user's preference will be taken into account
|
||||
gToolBarView->flashCommand(LLCommandId("chat"), true);
|
||||
}
|
||||
|
||||
|
|
@ -225,12 +221,18 @@ void on_new_message(const LLSD& msg)
|
|||
//User is not focused on conversation containing the message
|
||||
if(session_floater_not_focused)
|
||||
{
|
||||
im_box->flashConversationItemWidget(session_id, true);
|
||||
|
||||
if(!LLMuteList::getInstance()->isMuted(participant_id))
|
||||
{
|
||||
im_box->flashConversationItemWidget(session_id, true);
|
||||
}
|
||||
//The conversation floater isn't focused/open
|
||||
if(conversation_floater_not_focused)
|
||||
{
|
||||
gToolBarView->flashCommand(LLCommandId("chat"), true);
|
||||
if(!LLMuteList::getInstance()->isMuted(participant_id)
|
||||
&& !gAgent.isDoNotDisturb())
|
||||
{
|
||||
gToolBarView->flashCommand(LLCommandId("chat"), true);
|
||||
}
|
||||
|
||||
//Show IM toasts (upper right toasts)
|
||||
// Skip toasting for system messages and for nearby chat
|
||||
|
|
|
|||
|
|
@ -2869,23 +2869,6 @@ void LLViewerObject::updateInventory(
|
|||
U8 key,
|
||||
bool is_new)
|
||||
{
|
||||
LLMemType mt(LLMemType::MTYPE_OBJECT);
|
||||
|
||||
std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin();
|
||||
std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end();
|
||||
|
||||
bool is_fetching = std::find(begin, end, item->getAssetUUID()) != end;
|
||||
bool is_fetched = getInventoryItemByAsset(item->getAssetUUID()) != NULL;
|
||||
|
||||
if (is_fetched || is_fetching)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
mPendingInventoryItemsIDs.push_back(item->getAssetUUID());
|
||||
}
|
||||
|
||||
// This slices the object into what we're concerned about on the
|
||||
// viewer. The simulator will take the permissions and transfer
|
||||
// ownership.
|
||||
|
|
|
|||
|
|
@ -161,32 +161,18 @@
|
|||
<text
|
||||
type="string"
|
||||
clip_partial="false"
|
||||
follows="left|top"
|
||||
follows="left|top|right"
|
||||
layout="topleft"
|
||||
left="20"
|
||||
right="-20"
|
||||
name="stub_textbox_1"
|
||||
top="30"
|
||||
height="20"
|
||||
valign="center"
|
||||
wrap="true">
|
||||
This conversation is in a separate window.
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
clip_partial="false"
|
||||
follows="left|top"
|
||||
layout="topleft"
|
||||
left="20"
|
||||
right="-20"
|
||||
name="stub_textbox_2"
|
||||
top="60"
|
||||
height="20"
|
||||
left="15"
|
||||
right="-15"
|
||||
name="stub_textbox"
|
||||
top="25"
|
||||
height="40"
|
||||
valign="center"
|
||||
parse_urls="true"
|
||||
wrap="true">
|
||||
[secondlife:/// Bring it back.]
|
||||
</text>
|
||||
This conversation is in a separate window. [secondlife:/// Bring it back.]
|
||||
</text>
|
||||
</panel>
|
||||
</panel_container>
|
||||
</layout_panel>
|
||||
|
|
|
|||
Loading…
Reference in New Issue