summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGilbert Gonzales <gilbert@lindenlab.com>2013-04-22 18:08:36 -0700
committerGilbert Gonzales <gilbert@lindenlab.com>2013-04-22 18:08:36 -0700
commita505c3734a4a3f644500558030b4496d3cb5a5b5 (patch)
tree50bbd639d59afd514fa53bbf67fad644bacfed75
parent0eb2248f55c835e51705c4dc026e177f3930c5db (diff)
ACME 162: Implemented a foundation model for the facebook connect folder view.
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/llconversationmodel.cpp1
-rw-r--r--indra/newview/llpanelpeople.cpp80
-rw-r--r--indra/newview/llpanelpeople.h16
-rw-r--r--indra/newview/llpersonfolderview.cpp126
-rw-r--r--indra/newview/llpersonfolderview.h93
-rw-r--r--indra/newview/llpersonmodelcommon.cpp158
-rw-r--r--indra/newview/llpersonmodelcommon.h132
-rw-r--r--indra/newview/skins/default/xui/en/widgets/person_folder_view.xml13
9 files changed, 577 insertions, 46 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 02ab1c9ff1..84e8811ce8 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -452,6 +452,8 @@ set(viewer_SOURCE_FILES
llpathfindingobjectlist.cpp
llpathfindingpathtool.cpp
llpersistentnotificationstorage.cpp
+ llpersonmodelcommon.cpp
+ llpersonfolderview.cpp
llphysicsmotion.cpp
llphysicsshapebuilderutil.cpp
llplacesinventorybridge.cpp
@@ -1029,6 +1031,8 @@ set(viewer_HEADER_FILES
llpathfindingobjectlist.h
llpathfindingpathtool.h
llpersistentnotificationstorage.h
+ llpersonmodelcommon.h
+ llpersonfolderview.h
llphysicsmotion.h
llphysicsshapebuilderutil.h
llplacesinventorybridge.h
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index ed434d82d5..c74ce24872 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -95,7 +95,6 @@ void LLConversationItem::postEvent(const std::string& event_type, LLConversation
LLUUID participant_id = (participant ? participant->getUUID() : LLUUID());
LLSD event(LLSDMap("type", event_type)("session_uuid", session_id)("participant_uuid", participant_id));
LLEventPumps::instance().obtain("ConversationsEvents").post(event);
- LLEventPumps::instance().obtain("ConversationsEventsTwo").post(event);
}
// Virtual action callbacks
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 34d565bbaa..d2d1e602be 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -63,6 +63,8 @@
#include "llnetmap.h"
#include "llpanelpeoplemenus.h"
#include "llparticipantlist.h"
+#include "llpersonmodelcommon.h"
+#include "llpersonfolderview.h"
#include "llsidetraypanelcontainer.h"
#include "llrecentpeople.h"
#include "llviewercontrol.h" // for gSavedSettings
@@ -696,7 +698,6 @@ BOOL LLPanelPeople::postBuild()
LLConversationItem* base_item = new LLConversationItem(mConversationViewModel);
LLFolderView::Params folder_view_params(LLUICtrlFactory::getDefaultParams<LLFolderView>());
- folder_view_params.rect.left(0).right(0).top(0).bottom(0);
folder_view_params.parent_panel = friends_tab;
folder_view_params.listener = base_item;
folder_view_params.view_model = &mConversationViewModel;
@@ -709,7 +710,9 @@ BOOL LLPanelPeople::postBuild()
//Create scroller
LLRect scroller_view_rect = socialtwo_tab->getRect();
- //scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ scroller_view_rect.mTop -= 4;
+ scroller_view_rect.mRight -=6;
+ scroller_view_rect.mLeft += 2;
LLScrollContainer::Params scroller_params(LLUICtrlFactory::getDefaultParams<LLFolderViewScrollContainer>());
scroller_params.rect(scroller_view_rect);
@@ -722,21 +725,18 @@ BOOL LLPanelPeople::postBuild()
//Create a session
//LLSpeakerMgr* speaker_manager = (LLSpeakerMgr*)LLLocalSpeakerMgr::getInstance();
- LLConversationItemSession* item = new LLConversationItemSession(LLUUID(NULL), mConversationViewModel);
- item->renameItem("Facebook Friends");
- LLConversationViewSession::Params params;
-
+ LLPersonFolderModel* item = new LLPersonFolderModel("Facebook Friends", mConversationViewModel);
+ LLPersonFolderView::Params params;
params.name = item->getDisplayName();
params.root = mConversationsRoot;
params.listener = item;
params.tool_tip = params.name;
- params.container = LLFloaterIMContainer::getInstance();
- LLConversationViewSession * widget = LLUICtrlFactory::create<LLConversationViewSession>(params);
+ LLPersonFolderView * widget = LLUICtrlFactory::create<LLPersonFolderView>(params);
widget->addToFolder(mConversationsRoot);
- mConversationsItems[LLUUID(NULL)] = item;
- mConversationsWidgits[LLUUID(NULL)] = widget;
-
+ mPersonFolderModelMap[item->getID()] = item;
+ mPersonFolderViewMap[item->getID()] = widget;
+
gIdleCallbacks.addFunction(idle, this);
//===Test END========================================================================
@@ -1656,28 +1656,32 @@ bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name)
bool LLPanelPeople::onConversationModelEvent(const LLSD& event)
{
std::string type = event.get("type").asString();
- LLUUID session_id = event.get("session_uuid").asUUID();
- LLUUID participant_id = event.get("participant_uuid").asUUID();
+ LLUUID folder_id = event.get("folder_id").asUUID();
+ LLUUID person_id = event.get("person_id").asUUID();
if(type == "add_participant")
{
- LLConversationItemSession * session_model = dynamic_cast<LLConversationItemSession *>(mConversationsItems[session_id]);
- LLConversationViewSession * session_view = dynamic_cast<LLConversationViewSession *>(mConversationsWidgits[session_id]);
- LLConversationItemParticipant * participant_model = session_model->findParticipant(participant_id);
-
- if(participant_model)
+ LLPersonFolderModel * person_folder_model = dynamic_cast<LLPersonFolderModel *>(mPersonFolderModelMap[folder_id]);
+ LLPersonFolderView * person_folder_view = dynamic_cast<LLPersonFolderView *>(mPersonFolderViewMap[person_id]);
+
+ if(person_folder_model)
{
- LLConversationViewParticipant * participant_view = createConversationViewParticipant(participant_model);
- participant_view->addToFolder(session_view);
+ LLPersonModel * person_model = person_folder_model->findParticipant(person_id);
+
+ if(person_model)
+ {
+ LLPersonView * participant_view = createConversationViewParticipant(person_model);
+ participant_view->addToFolder(person_folder_view);
+ }
}
}
return false;
}
-LLConversationViewParticipant * LLPanelPeople::createConversationViewParticipant(LLConversationItem * item)
+LLPersonView * LLPanelPeople::createConversationViewParticipant(LLPersonModel * item)
{
- LLConversationViewParticipant::Params params;
+ LLPersonView::Params params;
LLRect panel_rect = getChild<LLPanel>(FBCTESTTWO_TAB_NAME)->getRect();
params.name = item->getDisplayName();
@@ -1687,10 +1691,9 @@ LLConversationViewParticipant * LLPanelPeople::createConversationViewParticipant
//24 is the the current hight of an item (itemHeight) loaded from conversation_view_participant.xml.
params.rect = LLRect (0, 24, panel_rect.getWidth(), 0);
params.tool_tip = params.name;
- params.participant_id = item->getUUID();
params.folder_indentation = 2;
- return LLUICtrlFactory::create<LLConversationViewParticipant>(params);
+ return LLUICtrlFactory::create<LLPersonView>(params);
}
void LLPanelPeople::openFacebookWeb(LLFloaterWebContent::Params& p)
@@ -1718,11 +1721,11 @@ void LLPanelPeople::showFacebookFriends(const LLSD& friends)
mFacebookFriends->addNewItem(agent_id, name, false);
//Add to folder view
- LLConversationItemSession * session_model = dynamic_cast<LLConversationItemSession *>(mConversationsItems[LLUUID(NULL)]);
- if(session_model)
- {
- addParticipantToModel(session_model, agent_id, name);
- }
+ //LLConversationItemSession * session_model = dynamic_cast<LLConversationItemSession *>(mConversationsItems[LLUUID(NULL)]);
+ //if(session_model)
+ //{
+ // addParticipantToModel(session_model, agent_id, name);
+ //}
}
}
@@ -1730,22 +1733,17 @@ void LLPanelPeople::addTestParticipant()
{
for(int i = 0; i < 300; ++i)
{
- LLConversationItemSession * session_model = dynamic_cast<LLConversationItemSession *>(mConversationsItems[LLUUID(NULL)]);
- addParticipantToModel(session_model, LLUUID().generateNewID(), "Test");
- }
+ LLPersonFolderModel * person_folder_model = dynamic_cast<LLPersonFolderModel *>(mPersonFolderModelMap.begin()->second);
+ addParticipantToModel(person_folder_model, LLUUID().generateNewID(), "EastBayGuy");
}
+}
-void LLPanelPeople::addParticipantToModel(LLConversationItemSession * session_model, const LLUUID& agent_id, const std::string& name)
+void LLPanelPeople::addParticipantToModel(LLPersonFolderModel * person_folder_model, const LLUUID& agent_id, const std::string& name)
{
- LLConversationItemParticipant* participant = NULL;
-
- // Create a participant model
- LLAvatarName avatar_name;
- bool has_name = LLAvatarNameCache::get(agent_id, &avatar_name);
- std::string avatar_name_string = has_name ? name + " (" + avatar_name.getDisplayName() + ")" : name;
+ LLPersonModel* person_model = NULL;
- participant = new LLConversationItemParticipant(avatar_name_string , agent_id, mConversationViewModel);
- session_model->addParticipant(participant);
+ person_model = new LLPersonModel(name, mConversationViewModel);
+ person_folder_model->addParticipant(person_model);
}
void LLPanelPeople::hideFacebookFriends()
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index b4582d9a3e..935171df2b 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -45,6 +45,14 @@ class LLMenuButton;
class LLTabContainer;
class LLFolderView;
+class LLPersonFolderModel;
+class LLPersonFolderView;
+class LLPersonView;
+class LLPersonModel;
+
+typedef std::map<LLUUID, LLPersonFolderModel *> person_folder_model_map;
+typedef std::map<LLUUID, LLPersonFolderView *> person_folder_view_map;
+
class LLPanelPeople
: public LLPanel
, public LLVoiceClientStatusObserver
@@ -66,7 +74,7 @@ public:
void openFacebookWeb(LLFloaterWebContent::Params& p);
void showFacebookFriends(const LLSD& friends);
void addTestParticipant();
- void addParticipantToModel(LLConversationItemSession * session_model, const LLUUID& agent_id, const std::string& name);
+ void addParticipantToModel(LLPersonFolderModel * session_model, const LLUUID& agent_id, const std::string& name);
void hideFacebookFriends();
void loadFacebookFriends();
void tryToReconnectToFacebook();
@@ -157,7 +165,7 @@ private:
bool isAccordionCollapsedByUser(const std::string& name);
bool onConversationModelEvent(const LLSD& event);
- LLConversationViewParticipant * createConversationViewParticipant(LLConversationItem * item);
+ LLPersonView * createConversationViewParticipant(LLPersonModel * item);
LLTabContainer* mTabContainer;
LLAvatarList* mOnlineFriendList;
@@ -181,8 +189,8 @@ private:
LLMenuButton* mFBCGearButton;
LLHandle< LLFloater > mPicker;
- conversations_items_map mConversationsItems;
- conversations_widgets_map mConversationsWidgits;
+ person_folder_model_map mPersonFolderModelMap;
+ person_folder_view_map mPersonFolderViewMap;
LLConversationViewModel mConversationViewModel;
LLFolderView* mConversationsRoot;
LLEventStream mConversationsEventStream;
diff --git a/indra/newview/llpersonfolderview.cpp b/indra/newview/llpersonfolderview.cpp
new file mode 100644
index 0000000000..e1f1cbb1fa
--- /dev/null
+++ b/indra/newview/llpersonfolderview.cpp
@@ -0,0 +1,126 @@
+/**
+* @file llpersonfolderview.cpp
+* @brief Implementation of llpersonfolderview
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpersonfolderview.h"
+
+static LLDefaultChildRegistry::Register<LLPersonFolderView> r_person_folder_view("person_folder_view");
+
+const LLColor4U DEFAULT_WHITE(255, 255, 255);
+
+LLPersonFolderView::Params::Params()
+{}
+
+LLPersonFolderView::LLPersonFolderView(const LLPersonFolderView::Params& p) :
+LLFolderViewFolder(p)
+{
+
+}
+
+S32 LLPersonFolderView::getLabelXPos()
+{
+ return getIndentation() + mArrowSize + 15;//Should be a .xml variable but causes crash;
+}
+
+LLPersonFolderView::~LLPersonFolderView()
+{
+
+}
+
+void LLPersonFolderView::draw()
+{
+ static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ static const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+
+ static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
+ static LLUIColor sFlashBgColor = LLUIColorTable::instance().getColor("MenuItemFlashBgColor", DEFAULT_WHITE);
+ static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
+ static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("DkGray", DEFAULT_WHITE);
+
+ const LLFontGL * font = LLFontGL::getFontSansSerif();
+ F32 text_left = (F32)getLabelXPos();
+ F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad;
+ LLColor4 color = sFgColor;
+ F32 right_x = 0;
+
+ drawHighlight(false, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
+
+ updateLabelRotation();
+ drawOpenFolderArrow(default_params, sFgColor);
+
+ drawLabel(font, text_left, y, color, right_x);
+
+ LLView::draw();
+}
+
+//
+// LLPersonFolderModel
+//
+
+
+LLPersonView::Params::Params()
+{}
+
+LLPersonView::LLPersonView(const LLPersonView::Params& p) :
+LLFolderViewItem(p)
+{
+
+}
+
+S32 LLPersonView::getLabelXPos()
+{
+ return getIndentation();
+}
+
+void LLPersonView::addToFolder(LLFolderViewFolder * person_folder_view)
+{
+ LLFolderViewItem::addToFolder(person_folder_view);
+ //Added item to folder, could change folder's mHasVisibleChildren flag so call arrange
+ person_folder_view->requestArrange();
+}
+
+LLPersonView::~LLPersonView()
+{
+
+}
+
+void LLPersonView::draw()
+{
+ static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
+
+ const LLFontGL * font = LLFontGL::getFontSansSerifSmall();
+ F32 text_left = (F32)getLabelXPos();
+ F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad;
+ LLColor4 color = color = mIsSelected ? sHighlightFgColor : sFgColor;
+ F32 right_x = 0;
+
+ drawLabel(font, text_left, y, color, right_x);
+
+ LLView::draw();
+}
diff --git a/indra/newview/llpersonfolderview.h b/indra/newview/llpersonfolderview.h
new file mode 100644
index 0000000000..de032ac674
--- /dev/null
+++ b/indra/newview/llpersonfolderview.h
@@ -0,0 +1,93 @@
+/**
+* @file llpersonfolderview.h
+* @brief Header file for llpersonfolderview
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLPERSONFOLDERVIEW_H
+#define LL_LLPERSONFOLDERVIEW_H
+
+#include "llavatariconctrl.h"
+#include "llfolderviewitem.h"
+
+class LLPersonFolderView : public LLFolderViewFolder
+{
+
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
+ {
+ Params();
+ };
+
+ LLPersonFolderView(const LLPersonFolderView::Params& p);
+ virtual ~LLPersonFolderView();
+
+ S32 getLabelXPos();
+
+
+protected:
+ void draw();
+
+private:
+};
+
+class LLPersonView : public LLFolderViewItem
+{
+
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params>
+ {
+ Params();
+ };
+
+ LLPersonView(const LLPersonView::Params& p);
+ virtual ~LLPersonView();
+
+ S32 getLabelXPos();
+ void addToFolder(LLFolderViewFolder * person_folder_view);
+
+protected:
+ void draw();
+
+private:
+
+ LLAvatarIconCtrl* mAvatarIcon;
+ LLButton * mInfoBtn;
+
+ typedef enum e_avatar_item_child {
+ ALIC_SPEAKER_INDICATOR,
+ ALIC_INFO_BUTTON,
+ ALIC_COUNT,
+ } EAvatarListItemChildIndex;
+
+ static bool sStaticInitialized; // this variable is introduced to improve code readability
+ static S32 sChildrenWidths[ALIC_COUNT];
+ //static void initChildrenWidths(LLConversationViewParticipant* self);
+ //void updateChildren();
+ //LLView* getItemChildView(EAvatarListItemChildIndex child_view_index);
+};
+
+#endif // LL_LLPERSONFOLDERVIEW_H
+
diff --git a/indra/newview/llpersonmodelcommon.cpp b/indra/newview/llpersonmodelcommon.cpp
new file mode 100644
index 0000000000..62208b98c9
--- /dev/null
+++ b/indra/newview/llpersonmodelcommon.cpp
@@ -0,0 +1,158 @@
+/**
+* @file llavatarfolder.cpp
+* @brief Implementation of llavatarfolder
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpersonmodelcommon.h"
+
+#include "llevents.h"
+#include "llsdutil.h"
+
+//
+// LLPersonModelCommon
+//
+
+LLPersonModelCommon::LLPersonModelCommon(std::string display_name, LLFolderViewModelInterface& root_view_model) :
+LLFolderViewModelItemCommon(root_view_model),
+ mName(display_name)
+{
+}
+
+LLPersonModelCommon::LLPersonModelCommon(LLFolderViewModelInterface& root_view_model) :
+LLFolderViewModelItemCommon(root_view_model),
+ mName(""),
+ mID(LLUUID().generateNewID())
+{
+}
+
+LLPersonModelCommon::~LLPersonModelCommon()
+{
+
+}
+
+void LLPersonModelCommon::postEvent(const std::string& event_type, LLPersonFolderModel* folder, LLPersonModel* person)
+{
+ LLUUID folder_id = folder->getID();
+ LLUUID person_id = person->getID();
+ LLSD event(LLSDMap("type", event_type)("folder_id", folder_id)("person_id", person_id));
+ LLEventPumps::instance().obtain("ConversationsEventsTwo").post(event);
+}
+
+// Virtual action callbacks
+void LLPersonModelCommon::performAction(LLInventoryModel* model, std::string action)
+{
+}
+
+void LLPersonModelCommon::openItem( void )
+{
+}
+
+void LLPersonModelCommon::closeItem( void )
+{
+}
+
+void LLPersonModelCommon::previewItem( void )
+{
+}
+
+void LLPersonModelCommon::showProperties(void)
+{
+}
+
+//
+// LLPersonFolderModel
+//
+
+LLPersonFolderModel::LLPersonFolderModel(std::string display_name, LLFolderViewModelInterface& root_view_model) :
+LLPersonModelCommon(display_name,root_view_model)
+{
+
+}
+
+LLPersonFolderModel::LLPersonFolderModel(LLFolderViewModelInterface& root_view_model) :
+LLPersonModelCommon(root_view_model)
+{
+
+}
+
+void LLPersonFolderModel::addParticipant(LLPersonModel* participant)
+{
+ addChild(participant);
+ postEvent("add_participant", this, participant);
+}
+
+void LLPersonFolderModel::removeParticipant(LLPersonModel* participant)
+{
+ removeChild(participant);
+ postEvent("remove_participant", this, participant);
+}
+
+void LLPersonFolderModel::removeParticipant(const LLUUID& participant_id)
+{
+ LLPersonModel* participant = findParticipant(participant_id);
+ if (participant)
+ {
+ removeParticipant(participant);
+ }
+}
+
+void LLPersonFolderModel::clearParticipants()
+{
+ clearChildren();
+}
+
+LLPersonModel* LLPersonFolderModel::findParticipant(const LLUUID& person_id)
+{
+ LLPersonModel * person_model = NULL;
+ child_list_t::iterator iter;
+
+ for(iter = mChildren.begin(); iter != mChildren.end(); ++iter)
+ {
+ person_model = static_cast<LLPersonModel *>(*iter);
+
+ if(person_model->getID() == person_id)
+ {
+ break;
+ }
+ }
+
+ return iter == mChildren.end() ? NULL : person_model;
+}
+
+//
+// LLConversationItemParticipant
+//
+
+LLPersonModel::LLPersonModel(std::string display_name, LLFolderViewModelInterface& root_view_model) :
+LLPersonModelCommon(display_name,root_view_model)
+{
+}
+
+LLPersonModel::LLPersonModel(LLFolderViewModelInterface& root_view_model) :
+LLPersonModelCommon(root_view_model)
+{
+}
diff --git a/indra/newview/llpersonmodelcommon.h b/indra/newview/llpersonmodelcommon.h
new file mode 100644
index 0000000000..76ea139479
--- /dev/null
+++ b/indra/newview/llpersonmodelcommon.h
@@ -0,0 +1,132 @@
+/**
+* @file llavatarfolder.h
+* @brief Header file for llavatarfolder
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLPERSONMODELCOMMON_H
+#define LL_LLPERSONMODELCOMMON_H
+
+#include "../llui/llfolderviewitem.h"
+#include "../llui/llfolderviewmodel.h"
+
+class LLPersonFolderModel;
+class LLPersonModel;
+
+// Conversation items: we hold a list of those and create an LLFolderViewItem widget for each
+// that we tuck into the mConversationsListPanel.
+class LLPersonModelCommon : public LLFolderViewModelItemCommon
+{
+public:
+
+ LLPersonModelCommon(std::string name, LLFolderViewModelInterface& root_view_model);
+ LLPersonModelCommon(LLFolderViewModelInterface& root_view_model);
+ virtual ~LLPersonModelCommon();
+
+ // Stub those things we won't really be using in this conversation context
+ virtual const std::string& getName() const { return mName; }
+ virtual const std::string& getDisplayName() const { return mName; }
+ virtual const std::string& getSearchableName() const { return mName; }
+ virtual LLPointer<LLUIImage> getIcon() const { return NULL; }
+ virtual LLPointer<LLUIImage> getOpenIcon() const { return getIcon(); }
+ virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
+ virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
+ virtual BOOL isItemRenameable() const { return TRUE; }
+ virtual BOOL renameItem(const std::string& new_name) { mName = new_name; return TRUE; }
+ virtual BOOL isItemMovable( void ) const { return FALSE; }
+ virtual BOOL isItemRemovable( void ) const { return FALSE; }
+ virtual BOOL isItemInTrash( void) const { return FALSE; }
+ virtual BOOL removeItem() { return FALSE; }
+ virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) { }
+ virtual void move( LLFolderViewModelItem* parent_listener ) { }
+ virtual BOOL isItemCopyable() const { return FALSE; }
+ virtual BOOL copyToClipboard() const { return FALSE; }
+ virtual BOOL cutToClipboard() const { return FALSE; }
+ virtual BOOL isClipboardPasteable() const { return FALSE; }
+ virtual void pasteFromClipboard() { }
+ virtual void pasteLinkFromClipboard() { }
+ virtual void buildContextMenu(LLMenuGL& menu, U32 flags) { }
+ virtual BOOL isUpToDate() const { return TRUE; }
+ virtual bool hasChildren() const { return FALSE; }
+
+ virtual bool potentiallyVisible() { return true; }
+ virtual bool filter( LLFolderViewFilter& filter) { return false; }
+ virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; }
+ virtual void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) { }
+ virtual bool passedFilter(S32 filter_generation = -1) { return true; }
+
+ // The action callbacks
+ virtual void performAction(LLInventoryModel* model, std::string action);
+ virtual void openItem( void );
+ virtual void closeItem( void );
+ virtual void previewItem( void );
+ virtual void selectItem(void) { }
+ virtual void showProperties(void);
+
+ // This method will be called to determine if a drop can be
+ // performed, and will set drop to TRUE if a drop is
+ // requested.
+ // Returns TRUE if a drop is possible/happened, FALSE otherwise.
+ virtual BOOL dragOrDrop(MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ std::string& tooltip_msg) { return FALSE; }
+
+ const LLUUID& getID() {return mID;}
+ void postEvent(const std::string& event_type, LLPersonFolderModel* session, LLPersonModel* participant);
+
+protected:
+
+ std::string mName; // Name of the session or the participant
+ LLUUID mID;
+};
+
+class LLPersonFolderModel : public LLPersonModelCommon
+{
+public:
+ LLPersonFolderModel(std::string display_name, LLFolderViewModelInterface& root_view_model);
+ LLPersonFolderModel(LLFolderViewModelInterface& root_view_model);
+
+ LLPointer<LLUIImage> getIcon() const { return NULL; }
+ void addParticipant(LLPersonModel* participant);
+ void removeParticipant(LLPersonModel* participant);
+ void removeParticipant(const LLUUID& participant_id);
+ void clearParticipants();
+ LLPersonModel* findParticipant(const LLUUID& person_id);
+
+private:
+};
+
+class LLPersonModel : public LLPersonModelCommon
+{
+public:
+ LLPersonModel(std::string display_name, LLFolderViewModelInterface& root_view_model);
+ LLPersonModel(LLFolderViewModelInterface& root_view_model);
+
+private:
+
+};
+
+
+#endif // LL_LLPERSONMODELCOMMON_H
+
diff --git a/indra/newview/skins/default/xui/en/widgets/person_folder_view.xml b/indra/newview/skins/default/xui/en/widgets/person_folder_view.xml
new file mode 100644
index 0000000000..bf22230ff9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/person_folder_view.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<conversation_view_session
+ folder_arrow_image="Folder_Arrow"
+ folder_indentation="4"
+ item_height="20"
+ item_top_pad="0"
+ mouse_opaque="true"
+ follows="left|top|right"
+ text_pad="4"
+ text_pad_left="4"
+ text_pad_right="4"
+ arrow_size="11"
+ max_folder_item_overlap="2"/>