CHUI-280 : WIP : Implement update of LLConversationModel in LLParticipantList
parent
99e0c35c40
commit
c4638d1dca
|
|
@ -262,6 +262,15 @@ public:
|
|||
child->setParent(NULL);
|
||||
dirtyFilter();
|
||||
}
|
||||
|
||||
virtual void clearChildren()
|
||||
{
|
||||
// As this is cleaning the whole list of children wholesale, we do need to delete the pointed objects
|
||||
// This is different and not equivalent to calling removeChild() on each child
|
||||
std::for_each(mChildren.begin(), mChildren.end(), DeletePointer());
|
||||
mChildren.clear();
|
||||
dirtyFilter();
|
||||
}
|
||||
|
||||
void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -88,7 +88,8 @@ bool LLConversationSort::operator()(const LLConversationItem* const& a, const LL
|
|||
//
|
||||
|
||||
LLConversationItemSession::LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
|
||||
LLConversationItem(display_name,uuid,root_view_model)
|
||||
LLConversationItem(display_name,uuid,root_view_model),
|
||||
mIsLoaded(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -97,12 +98,54 @@ LLConversationItemSession::LLConversationItemSession(const LLUUID& uuid, LLFolde
|
|||
{
|
||||
}
|
||||
|
||||
void LLConversationItemSession::addParticipant(LLConversationItemParticipant* item)
|
||||
{
|
||||
addChild(item);
|
||||
mIsLoaded = true;
|
||||
}
|
||||
|
||||
void LLConversationItemSession::removeParticipant(LLConversationItemParticipant* item)
|
||||
{
|
||||
removeChild(item);
|
||||
}
|
||||
|
||||
void LLConversationItemSession::clearParticipants()
|
||||
{
|
||||
clearChildren();
|
||||
mIsLoaded = false;
|
||||
}
|
||||
|
||||
LLConversationItemParticipant* LLConversationItemSession::findParticipant(const LLUUID& participant_id)
|
||||
{
|
||||
// This is *not* a general tree parsing algorithm. It assumes that a session contains only
|
||||
// items (LLConversationItemParticipant) that have themselve no children.
|
||||
LLConversationItemParticipant* participant = NULL;
|
||||
child_list_t::iterator iter;
|
||||
for (iter = mChildren.begin(); iter != mChildren.end(); iter++)
|
||||
{
|
||||
participant = dynamic_cast<LLConversationItemParticipant*>(*iter);
|
||||
if (participant->hasSameValue(participant_id))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (iter == mChildren.end() ? NULL : participant);
|
||||
}
|
||||
|
||||
void LLConversationItemSession::setParticipantIsMuted(const LLUUID& participant_id, bool is_muted)
|
||||
{
|
||||
LLConversationItemParticipant* participant = findParticipant(participant_id);
|
||||
participant->setIsMuted(is_muted);
|
||||
}
|
||||
|
||||
//
|
||||
// LLConversationItemParticipant
|
||||
//
|
||||
|
||||
LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
|
||||
LLConversationItem(display_name,uuid,root_view_model)
|
||||
LLConversationItem(display_name,uuid,root_view_model),
|
||||
mIsMuted(false),
|
||||
mIsModerator(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@
|
|||
// Implementation of conversations list
|
||||
|
||||
class LLConversationItem;
|
||||
class LLConversationItemSession;
|
||||
class LLConversationItemParticipant;
|
||||
|
||||
typedef std::map<LLUUID, LLConversationItem*> conversations_items_map;
|
||||
typedef std::map<LLUUID, LLFolderViewItem*> conversations_widgets_map;
|
||||
|
|
@ -100,9 +102,10 @@ public:
|
|||
|
||||
// bool hasSameValues(std::string name, const LLUUID& uuid) { return ((name == mName) && (uuid == mUUID)); }
|
||||
bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); }
|
||||
private:
|
||||
std::string mName;
|
||||
const LLUUID mUUID;
|
||||
|
||||
protected:
|
||||
std::string mName; // Name of the session or the participant
|
||||
LLUUID mUUID; // UUID of the session or the participant
|
||||
};
|
||||
|
||||
class LLConversationItemSession : public LLConversationItem
|
||||
|
|
@ -111,6 +114,19 @@ public:
|
|||
LLConversationItemSession(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
LLConversationItemSession(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
virtual ~LLConversationItemSession() {}
|
||||
|
||||
void setSessionID(const LLUUID& session_id) { mUUID = session_id; }
|
||||
void addParticipant(LLConversationItemParticipant* item);
|
||||
void removeParticipant(LLConversationItemParticipant* item);
|
||||
void clearParticipants();
|
||||
LLConversationItemParticipant* findParticipant(const LLUUID& participant_id);
|
||||
|
||||
void setParticipantIsMuted(const LLUUID& participant_id, bool is_muted);
|
||||
|
||||
bool isLoaded() { return mIsLoaded; }
|
||||
|
||||
private:
|
||||
bool mIsLoaded; // true if at least one participant has been added to the session, false otherwise
|
||||
};
|
||||
|
||||
class LLConversationItemParticipant : public LLConversationItem
|
||||
|
|
@ -119,6 +135,15 @@ public:
|
|||
LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model);
|
||||
virtual ~LLConversationItemParticipant() {}
|
||||
|
||||
bool isMuted() { return mIsMuted; }
|
||||
bool isModerator() {return mIsModerator; }
|
||||
void setIsMuted(bool is_muted) { mIsMuted = is_muted; }
|
||||
void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; }
|
||||
|
||||
private:
|
||||
bool mIsMuted; // default is false
|
||||
bool mIsModerator; // default is false
|
||||
};
|
||||
|
||||
// We don't want to ever filter conversations but we need to declare that class to create a conversation view model.
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
// common includes
|
||||
#include "lltrans.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llavatarnamecache.h"
|
||||
#include "llavatarname.h"
|
||||
#include "llagent.h"
|
||||
|
||||
#include "llimview.h"
|
||||
|
|
@ -226,29 +228,34 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source,
|
|||
mSpeakerMgr->addListener(mSpeakerClearListener, "clear");
|
||||
mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");
|
||||
|
||||
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
|
||||
LL_DEBUGS("SpeakingIndicator") << "Set session for speaking indicators: " << mSpeakerMgr->getSessionID() << LL_ENDL;
|
||||
mAvatarList->setSessionID(mSpeakerMgr->getSessionID());
|
||||
mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1));
|
||||
mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
|
||||
// Set onAvatarListDoubleClicked as default on_return action.
|
||||
mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
|
||||
setSessionID(mSpeakerMgr->getSessionID());
|
||||
|
||||
if (mAvatarList)
|
||||
{
|
||||
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
|
||||
LL_DEBUGS("SpeakingIndicator") << "Set session for speaking indicators: " << mSpeakerMgr->getSessionID() << LL_ENDL;
|
||||
mAvatarList->setSessionID(mSpeakerMgr->getSessionID());
|
||||
mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1));
|
||||
mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
|
||||
// Set onAvatarListDoubleClicked as default on_return action.
|
||||
mAvatarListReturnConnection = mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
|
||||
|
||||
if (use_context_menu)
|
||||
{
|
||||
//mParticipantListMenu = new LLParticipantListMenu(*this);
|
||||
//mAvatarList->setContextMenu(mParticipantListMenu);
|
||||
mAvatarList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
|
||||
}
|
||||
else
|
||||
{
|
||||
mAvatarList->setContextMenu(NULL);
|
||||
}
|
||||
if (use_context_menu)
|
||||
{
|
||||
//mParticipantListMenu = new LLParticipantListMenu(*this);
|
||||
//mAvatarList->setContextMenu(mParticipantListMenu);
|
||||
mAvatarList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
|
||||
}
|
||||
else
|
||||
{
|
||||
mAvatarList->setContextMenu(NULL);
|
||||
}
|
||||
|
||||
if (use_context_menu && can_toggle_icons)
|
||||
{
|
||||
mAvatarList->setShowIcons("ParticipantListShowIcons");
|
||||
mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList));
|
||||
if (use_context_menu && can_toggle_icons)
|
||||
{
|
||||
mAvatarList->setShowIcons("ParticipantListShowIcons");
|
||||
mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList));
|
||||
}
|
||||
}
|
||||
|
||||
//Lets fill avatarList with existing speakers
|
||||
|
|
@ -396,6 +403,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
|
|||
|
||||
if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
|
||||
{
|
||||
setParticipantIsMuted(speakerp->mID, speakerp->mModeratorMutedVoice);
|
||||
update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice);
|
||||
}
|
||||
}
|
||||
|
|
@ -415,31 +423,40 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
|
|||
*/
|
||||
void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id)
|
||||
{
|
||||
LLPanel* item = mAvatarList->getItemByValue(participant_id);
|
||||
|
||||
if (NULL == item)
|
||||
if (mAvatarList)
|
||||
{
|
||||
LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
LLPanel* item = mAvatarList->getItemByValue(participant_id);
|
||||
|
||||
if (typeid(*item) == typeid(LLAvalineListItem))
|
||||
if (NULL == item)
|
||||
{
|
||||
LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeid(*item) == typeid(LLAvalineListItem))
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL;
|
||||
// item representing an Avaline caller has a correct type already.
|
||||
return;
|
||||
}
|
||||
|
||||
LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL;
|
||||
|
||||
// remove UUID from LLAvatarList::mIDs to be able add it again.
|
||||
uuid_vec_t& ids = mAvatarList->getIDs();
|
||||
uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id);
|
||||
ids.erase(pos);
|
||||
|
||||
// remove item directly
|
||||
mAvatarList->removeItem(item);
|
||||
}
|
||||
|
||||
LLConversationItemParticipant* participant = findParticipant(participant_id);
|
||||
if (participant)
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL;
|
||||
// item representing an Avaline caller has a correct type already.
|
||||
return;
|
||||
removeParticipant(participant);
|
||||
}
|
||||
|
||||
LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL;
|
||||
|
||||
// remove UUID from LLAvatarList::mIDs to be able add it again.
|
||||
uuid_vec_t& ids = mAvatarList->getIDs();
|
||||
uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id);
|
||||
ids.erase(pos);
|
||||
|
||||
// remove item directly
|
||||
mAvatarList->removeItem(item);
|
||||
|
||||
// re-add avaline caller with a correct class instance.
|
||||
addAvatarIDExceptAgent(participant_id);
|
||||
}
|
||||
|
|
@ -562,6 +579,7 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event
|
|||
// update UI on confirmation of moderator mutes
|
||||
if (event->getValue().asString() == "voice")
|
||||
{
|
||||
setParticipantIsMuted(speakerp->mID, speakerp->mModeratorMutedVoice);
|
||||
update_speaker_indicator(mAvatarList, speakerp->mID, speakerp->mModeratorMutedVoice);
|
||||
}
|
||||
return true;
|
||||
|
|
@ -601,21 +619,40 @@ void LLParticipantList::sort()
|
|||
void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
|
||||
{
|
||||
if (mExcludeAgent && gAgent.getID() == avatar_id) return;
|
||||
if (mAvatarList->contains(avatar_id)) return;
|
||||
if (mAvatarList && mAvatarList->contains(avatar_id)) return;
|
||||
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(avatar_id);
|
||||
|
||||
LLConversationItemParticipant* participant = NULL;
|
||||
|
||||
if (is_avatar)
|
||||
{
|
||||
mAvatarList->getIDs().push_back(avatar_id);
|
||||
mAvatarList->setDirty();
|
||||
// Create a participant view model instance and add it to the linked list
|
||||
LLAvatarName avatar_name;
|
||||
bool has_name = LLAvatarNameCache::get(avatar_id, &avatar_name);
|
||||
participant = new LLConversationItemParticipant(!has_name ? "Avatar" : avatar_name.mDisplayName , avatar_id, mRootViewModel);
|
||||
if ( mAvatarList)
|
||||
{
|
||||
mAvatarList->getIDs().push_back(avatar_id);
|
||||
mAvatarList->setDirty();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id);
|
||||
mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name);
|
||||
// Create a participant view model instance and add it to the linked list
|
||||
participant = new LLConversationItemParticipant(display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name, avatar_id, mRootViewModel);
|
||||
if ( mAvatarList)
|
||||
{
|
||||
mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name);
|
||||
}
|
||||
mAvalineUpdater->watchAvalineCaller(avatar_id);
|
||||
}
|
||||
|
||||
// *TODO : Merov : need to declare and bind a name update callback on that "participant" instance. See LLAvatarListItem::updateAvatarName() for pattern.
|
||||
// For the moment, we'll get the correct name only if it's already in the name cache (see call to LLAvatarNameCache::get() here above)
|
||||
addParticipant(participant);
|
||||
|
||||
adjustParticipant(avatar_id);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue