WIP: First pass at new contacts list panel with inv based sets

Known issues:
Cannot remove or rename created sets
Cannot add/remove/move contacts in sets via UI, must be done thru inv by copying calling cards
Newly created contact sets do not appear in UI till something causes the list to refresh (friend status change, add/remove friend, add/remove contact in to any set, or relog)
Some view settings are not stored: show offline (default enabled at login), set open states (default open at login)
Sorting many not update on displayname loading or on change
Padding between lines is huge still even with avatar icons turned off (bug with the avatar list control)
Cannot keyboard type-to contact by typing first few leters of name (viewer2 bug with all list controls, regression from viewer1)
Very, very large friend lists (500+ maybe) might cause slow downs when panel is in view and friend online statuses are changing fequently.
Kadah_Coba 2011-09-05 15:15:25 -07:00
parent e013a215e3
commit c0a8ee6f0e
17 changed files with 2625 additions and 16 deletions

View File

@ -85,6 +85,7 @@ set(viewer_SOURCE_FILES
chatbar_as_cmdline.cpp
kcwlinterface.cpp
floatermedialists.cpp
fscontactlist.cpp
fscontactsfloater.cpp
fsareasearch.cpp
fsdata.cpp
@ -686,6 +687,7 @@ set(viewer_HEADER_FILES
chatbar_as_cmdline.h
kcwlinterface.h
floatermedialists.h
fscontactlist.h
fscontactsfloater.h
fsradarlistctrl.h
fsareasearch.h

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,222 @@
/**
* @file fscontactlist.h
* @brief Firestorm contacts list control
*
* $LicenseInfo:firstyear=2011&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (C) 2011, The Phoenix Viewer Project, 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
*
* The Phoenix Viewer Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* $/LicenseInfo$
*/
#ifndef FS_FSCONTACTLIST_H
#define FS_FSCONTACTLIST_H
#include "llpanel.h"
#include "llcallingcard.h" // for avatar tracker
#include "llvoiceclient.h"
#include "llavatarnamecache.h"
// class FSContactListSet;
class LLAvatarList;
class LLAvatarName;
class LLAccordionCtrl;
class LLAccordionCtrlTab;
// class LLFilterEditor;
class LLMenuButton;
class LLToggleableMenu;
class LLMenuGL;
class LLTextBox;
typedef enum e_sort_oder
{
E_SORT_BY_NAME = 0,
E_SORT_BY_USERNAME = 1,
E_SORT_BY_STATUS = 2,
E_SORT_BY_STATUSUSERNAME = 3
} ESortOrder;
/// convenience class for holding keyframes mapped to sliders
class FSContactSet : public LLPanel
{
LOG_CLASS(FSContactSet);
public:
// FSContactSet(const Params& p = LLPanel::Params());
FSContactSet();
virtual ~FSContactSet();
/*virtual*/ BOOL postBuild();
void update( const uuid_vec_t& buddies_uuids );
void update();
LLAvatarList* getList() { return mAvatarList; }
void setTab(LLAccordionCtrlTab* tab);
LLAccordionCtrlTab* getTab() { return mTab; }
void setName(std::string name);
void setHandleFriendsAll( bool handel_all ) { mHandleFriendsAll = handel_all; }
void setSortOrder( ESortOrder order );
protected:
friend class LLUICtrlFactory;
void onViewOptionChecked(LLSD::String param);
bool isViewOptionChecked(LLSD::String param);
bool isViewOptionEnabled(LLSD::String param);
void forceUpdate();
LLAccordionCtrlTab* mTab;
LLAvatarList* mAvatarList;
LLMenuButton* mViewOptionMenuButton;
LLToggleableMenu* mViewOptionMenu;
LLTextBox* mInfoTextLabel;
bool mShowOffline;
bool mHandleFriendsAll;
LLUUID mFriendSubFolderID;
std::string mName;
// this contains all friends for this set
uuid_vec_t mFriendsIDs;
};
class FSContactList : public LLPanel, public LLVoiceClientStatusObserver
{
LOG_CLASS(FSContactList);
public:
FSContactList(const Params& p = LLPanel::Params());
virtual ~FSContactList();
/*virtual*/ BOOL postBuild();
bool isFriendsLoaded() { return mIsFriendsLoaded; }
private:
typedef std::map<LLUUID, FSContactSet*> contact_set_map_t;
contact_set_map_t mContactSets;
void onCreateContactSet();
static void onContactSetCreate(const LLSD& notification, const LLSD& response);
FSContactSet* addContactSet(const LLUUID& sub_folder_ID, const std::string& set_name);
FSContactSet* getConstactSet(const LLUUID& sub_folder_ID);
FSContactSet* getOrCreateConstactSet(const LLUUID& sub_folder_ID);
FSContactSet* mAllFriendList;
public:
// Implements LLVoiceClientStatusObserver::onChange() to enable call buttons
// when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
// internals
class Updater;
private:
// methods indirectly called by the updaters
// void updateFriendListHelpText();
void updateFriendList();
void forceUpdate();
bool isItemsFreeOfFriends(const uuid_vec_t& uuids);
void updateButtons();
LLUUID getCurrentItemID() const;
void getCurrentItemIDs(uuid_vec_t& selected_uuids) const;
void buttonSetEnabled(const std::string& btn_name, bool enabled);
void buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb);
void onViewOptionChecked(LLSD::String param);
bool isViewOptionChecked(LLSD::String param);
// bool isViewOptionEnabled(LLSD::String param);
void setSortOrder(ESortOrder order, bool save = true);
private:
// UI callbacks
// void onFilterEdit(const std::string& search_string);
void onViewProfileButtonClicked();
void onAddFriendWizButtonClicked();
void onGlobalVisToggleButtonClicked();
void onDeleteFriendButtonClicked();
void onImButtonClicked();
void onCallButtonClicked();
void onTeleportButtonClicked();
void onShareButtonClicked();
void onAvatarListDoubleClicked(LLUICtrl* ctrl);
void onAvatarListCommitted(LLAvatarList* list);
void showPermissions(bool visible);
// misc callbacks
static void onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names);
// void onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list);
// void showAccordion(const std::string name, bool show);
// void showFriendsAccordionsIfNeeded();
// void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param);
// void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed);
// void setAccordionCollapsedByUser(const std::string& name, bool collapsed);
// bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
// bool isAccordionCollapsedByUser(const std::string& name);
void onFriendsLoaded();
LLHandle<LLView> mFriendsViewSortMenuHandle;
Updater* mFriendListUpdater;
Updater* mButtonsUpdater;
LLMenuButton* mFriendsGearButton;
std::string mFilterSubString;
std::string mFilterSubStringOrig;
LLMenuButton* mViewOptionMenuButton;
LLToggleableMenu* mViewOptionMenu;
LLAccordionCtrl* mAccordion;
bool mIsFriendsLoaded;
};
#endif // FS_FSCONTACTLIST_H

View File

@ -1,6 +1,6 @@
/**
* @file
* @brief
* @file fscontactsfloater.cpp
* @brief Firestorm contacts floater
*
* $LicenseInfo:firstyear=2011&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
@ -36,6 +36,11 @@
#include "llfloater.h"
#include "lltabcontainer.h"
// #include "llaccordionctrl.h"
// #include "llaccordionctrltab.h"
// #include "llflatlistview.h"
#include "fscontactlist.h"
#include "llavataractions.h"
#include "llavatarlist.h"
#include "llavatarlistitem.h"
@ -81,6 +86,7 @@ protected:
FSFloaterContacts* mFloater;
};
//
// FSFloaterContacts
//
@ -90,6 +96,8 @@ FSFloaterContacts::FSFloaterContacts(const LLSD& seed)
mTabContainer(NULL),
mObserver(NULL),
mFriendsList(NULL),
mContactsList(NULL),
// mFriendsListAccordion(NULL),
mGroupList(NULL),
mAllowRightsChange(TRUE),
mNumRightsChanged(0),
@ -113,6 +121,9 @@ BOOL FSFloaterContacts::postBuild()
{
mTabContainer = getChild<LLTabContainer>("friends_and_groups");
mFriendsTab = getChild<LLPanel>(FRIENDS_TAB_NAME);
//KC - incomplete
mContactsList = mFriendsTab->findChild<FSContactList>("contacts_lists_panel");
mFriendsList = mFriendsTab->getChild<LLScrollListCtrl>("friend_list");
mFriendsList->setMaxSelectable(MAX_FRIEND_SELECT);

View File

@ -1,6 +1,6 @@
/**
* @file fscontactsfloater.h
* @brief
* @brief Firestorm contacts floater
*
* $LicenseInfo:firstyear=2011&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
@ -44,6 +44,7 @@ class LLGroupList;
class LLRelationship;
class LLPanel;
class LLTabContainer;
class FSContactList;
class FSFloaterContacts : public LLFloater
{
@ -131,6 +132,9 @@ private:
void updateButtons();
LLTabContainer* mTabContainer;
FSContactList* mContactsList;
// FSContactList* mFriendsListAccordion;
LLFriendObserver* mObserver;
BOOL mAllowRightsChange;

View File

@ -125,6 +125,29 @@ bool LLFindAgentCallingCard::operator()(LLInventoryCategory* cat, LLInventoryIte
return mIsAgentCallingCardFound;
}
/**
* Class LLFindAgentCallingCard
*
* An inventory collector functor for checking that agent's own calling card
* exists within the Calling Cards category and its sub-folders.
*/
class LLFindFriendCallingCard : public LLInventoryCollectFunctor
{
public:
LLFindFriendCallingCard() {}
virtual ~LLFindFriendCallingCard() {}
virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
};
bool LLFindFriendCallingCard::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
if (item && item->getType() == LLAssetType::AT_CALLINGCARD && item->getCreatorUUID() != gAgentID)
{
return true;
}
return false;
}
/**
* Class for fetching initial friend cards data
*
@ -322,6 +345,125 @@ void LLFriendCardsManager::syncFriendCardsFolders()
}
const LLUUID& LLFriendCardsManager::findFriendSubfolderUUID(const std::string& nonLocalizedName) const
{
LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
return findChildFolderUUID(friendFolderUUID, nonLocalizedName);
}
//Unused ast this time
#if 0
void LLFriendCardsManager::getOrCreateFriendSubfolder(LLUUID& sub_folder_ID, const std::string& nonLocalizedName, callback_t cb)
{
sub_folder_ID = findFriendSubfolderUUID(nonLocalizedName);
if (!sub_folder_ID.notNull())
{
LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
if (!gInventory.isCategoryComplete(friends_folder_ID))
{
LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID);
std::string cat_name = cat ? cat->getName() : "unknown";
llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
}
sub_folder_ID = gInventory.createNewCategory(friends_folder_ID,
LLFolderType::FT_CALLINGCARD, nonLocalizedName);
}
if (sub_folder_ID.notNull())
{
fetchAndCheckFolderDescendents(sub_folder_ID, cb);
}
}
#endif
void LLFriendCardsManager::createFriendSubfolder(const std::string& nonLocalizedName)
{
LLUUID sub_folder_ID = findFriendSubfolderUUID(nonLocalizedName);
if (!sub_folder_ID.notNull())
{
LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
if (!gInventory.isCategoryComplete(friends_folder_ID))
{
LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID);
std::string cat_name = cat ? cat->getName() : "unknown";
llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
}
sub_folder_ID = gInventory.createNewCategory(friends_folder_ID,
LLFolderType::FT_CALLINGCARD, nonLocalizedName);
}
}
boost::signals2::connection LLFriendCardsManager::setFriendsDirLoadedCallback(const friends_loaded_signal_t::slot_type& cb)
{
return mFriendsLoadedSignal.connect(cb);
}
//Unused at this time
#if 0
void LLFriendCardsManager::collectFriendSet(const LLUUID& sub_folder_ID, uuid_vec_t buddyUUIDs) const
{
LLInventoryModel::item_array_t* items;
LLInventoryModel::cat_array_t* fakeCatsArg;
LLInventoryModel::item_array_t::const_iterator itBuddy; // to iterate Buddies in each List
gInventory.getDirectDescendentsOf(sub_folder_ID, fakeCatsArg, items);
for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy)
{
buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
}
}
#endif
void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
{
folderBuddiesMap.clear();
LLInventoryModel::cat_array_t* listFolders;
LLInventoryModel::item_array_t* fakeItems;
// get folders in the Friend folder. Items should be NULL due to Cards should be in lists.
gInventory.getDirectDescendentsOf(findFriendFolderUUIDImpl(), listFolders, fakeItems);
if (NULL == listFolders)
return;
LLInventoryModel::cat_array_t::const_iterator itCats; // to iterate Friend Lists (categories)
LLInventoryModel::item_array_t::const_iterator itBuddy; // to iterate Buddies in each List
for (itCats = listFolders->begin(); itCats != listFolders->end(); ++itCats)
{
// Everything but Friends/All content will collected here
// Friends/All will be handled by LLAvatarTracker
if ((*itCats)->getUUID() == findFriendAllSubfolderUUIDImpl())
continue;
//NOTE* getDirectDescendentsOf is not used here as it was not returning all items most of the time.
LLInventoryModel::cat_array_t fakeCatsArg;
LLInventoryModel::item_array_t items;
LLFindFriendCallingCard collector;
gInventory.collectDescendentsIf((*itCats)->getUUID(), fakeCatsArg, items, LLInventoryModel::EXCLUDE_TRASH, collector);
uuid_vec_t buddyUUIDs;
for (itBuddy = items.begin(); itBuddy != items.end(); ++itBuddy)
{
buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
}
folderBuddiesMap.insert(make_pair((*itCats)->getUUID(), buddyUUIDs));
}
}
/************************************************************************/
/* Private Methods */
/************************************************************************/
@ -513,6 +655,10 @@ void LLFriendCardsManager::syncFriendsFolder()
const LLUUID& buddy_id = (*buddy_it).first;
addFriendCardToInventory(buddy_id);
}
mFriendsLoadedSignal();
// This is a single-shot signal. Forget callbacks to save resources.
mFriendsLoadedSignal.disconnect_all_slots();
}
class CreateFriendCardCallback : public LLInventoryCallback

View File

@ -27,6 +27,7 @@
#ifndef LL_LLFRIENDCARD_H
#define LL_LLFRIENDCARD_H
#include <boost/signals2.hpp>
#include "llcallingcard.h"
#include "llinventorymodel.h" // for LLInventoryModel::item_array_t
@ -44,6 +45,8 @@ class LLFriendCardsManager
public:
typedef std::map<LLUUID, uuid_vec_t > folderid_buddies_map_t;
typedef boost::function<void()> callback_t;
typedef boost::signals2::signal<void()> friends_loaded_signal_t;
// LLFriendObserver implementation
void changed(U32 mask)
@ -78,9 +81,29 @@ public:
* (creates them otherwise) and fetches their contents to synchronize with Agent's Friends List.
*/
void syncFriendCardsFolders();
const LLUUID& findFriendSubfolderUUID(const std::string& nonLocalizedName) const;
// void getOrCreateFriendSubfolder(LLUUID& sub_folder_ID, const std::string& nonLocalizedName, callback_t cb);
void createFriendSubfolder(const std::string& nonLocalizedName);
boost::signals2::connection setFriendsDirLoadedCallback(const friends_loaded_signal_t::slot_type& cb);
//void collectFriendSet(const LLUUID& sub_folder_ID, uuid_vec_t buddyUUIDs) const;
/*!
* \brief
* Collects folders' IDs with the buddies' IDs in the Inventory Calling Card/Friends folder.
*
* \param folderBuddiesMap
* map into collected data will be put. It will be cleared before adding new data.
*
* Each item in the out map is a pair where first is an LLViewerInventoryCategory UUID,
* second is a vector with UUID of Avatars from this folder.
*
* NOTE* Friends/All is excluded in folderBuddiesMap, LLAvatarTracker should be used instead
*/
void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
private:
typedef boost::function<void()> callback_t;
LLFriendCardsManager();
~LLFriendCardsManager();
@ -144,6 +167,8 @@ private:
typedef std::set<LLUUID> avatar_uuid_set_t;
avatar_uuid_set_t mBuddyIDSet;
friends_loaded_signal_t mFriendsLoadedSignal;
};
#endif // LL_LLFRIENDCARD_H

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- *NOTE: this xml is intended to be used inside panel_contact_list.xml for each contact set-->
<!-- All accordion tabs in the Friends/Contacts list panel will be created from this one at runtime-->
<!-- Non of string values of controls below are visible to user. They are not need to be translated. -->
<accordion_tab
height="80"
width="0"
follows="all"
layout="topleft"
name="contact_tab"
selection_enabled="true"
tab_stop="false"
title="Mockup Tab"
translate="false">
<!--
<flat_list_view
allow_select="true"
item_pad="3"
follows="all"
multi_select="true"
keep_selection_visible_on_reshape="true"
name="contact_set_list"
translate="false"
standalone="false">
<flat_list_view.no_items_text
value="No contacts to show" />
</flat_list_view>
<string
name="no_friends"
value="No friends" />
-->
<!-- <panel
follows="all"
layout="topleft"
name="contact_list_set"
filename="panel_contact_list_set.xml" /> -->
</accordion_tab>

View File

@ -25,21 +25,21 @@
name="no_groups_msg"
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
<tab_container
top="1"
bottom="-1"
left="1"
right="-1"
follows="all"
height="390"
layout="topleft"
left="4"
name="friends_and_groups"
tab_position="top"
tab_width="80"
tab_max_width = "80"
tab_max_width = "120"
tab_height="20"
use_custom_icon_ctrl="false"
tab_icon_ctrl_pad="2"
halign="left"
use_ellipses="true"
top="0"
width="393">
use_ellipses="true">
<first_tab
tab_bottom_image_flash="Toolbar_Left_Flash"/>
<middle_tab
@ -47,6 +47,14 @@
<last_tab
tab_bottom_image_flash="Toolbar_Right_Flash"/>
<panel
bottom="0"
filename="panel_fs_contacts_lists.xml"
label="Friends &amp; Contacts"
left="0"
right="-1"
name="contacts_lists_panel" />
<panel
bottom="0"
filename="panel_fs_contacts_friends.xml"

View File

@ -148,7 +148,7 @@
/>
<font_size name="Large"
comment="Size of large font (points, or 1/72 of an inch)"
size="12.0"
size="11.0"
/>
<font_size name="Medium"
comment="Size of medium font (points, or 1/72 of an inch)"

View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu
bottom="806"
layout="topleft"
left="0"
mouse_opaque="false"
name="menu_contact_list_sort_gear"
visible="false">
<menu_item_check
label="Sort By Status &amp; Display Name"
layout="topleft"
name="sortby_name">
<on_click
function="ContactList.ViewOption.Action"
parameter="sortby_statusname" />
<on_check
function="ContactList.ViewOption.Check"
parameter="sortby_statusname" />
</menu_item_check>
<menu_item_check
label="Sort By Status &amp; User Name"
layout="topleft"
name="sortby_statususername">
<on_click
function="ContactList.ViewOption.Action"
parameter="sortby_statususername" />
<on_check
function="ContactList.ViewOption.Check"
parameter="sortby_statususername" />
</menu_item_check>
<menu_item_check
label="Sort By Display Name"
layout="topleft"
name="sortby_name">
<on_click
function="ContactList.ViewOption.Action"
parameter="sortby_name" />
<on_check
function="ContactList.ViewOption.Check"
parameter="sortby_name" />
</menu_item_check>
<menu_item_check
label="Sort By User Name"
layout="topleft"
name="sortby_username">
<on_click
function="ContactList.ViewOption.Action"
parameter="sortby_username" />
<on_check
function="ContactList.ViewOption.Check"
parameter="sortby_username" />
</menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_check name="view_icons" label="View People Icons">
<menu_item_check.on_click
function="ContactList.ViewOption.Action"
parameter="view_icons" />
<menu_item_check.on_check
function="CheckControl"
parameter="FriendsListShowIcons" />
</menu_item_check>
<menu_item_check name="view_permissions" label="View Permissions Granted">
<menu_item_check.on_click
function="ContactList.ViewOption.Action"
parameter="view_permissions" />
<menu_item_check.on_check
function="CheckControl"
parameter="FriendsListShowPermissions" />
</menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
<menu_item_call.on_click
function="SideTray.ShowPanel"
parameter="panel_block_list_sidetray" />
</menu_item_call>
<menu_item_separator layout="topleft" />
<menu_item_call name="create_set" label="Create New Contact Set">
<menu_item_call.on_click
function="ContactList.CreateSet.Action" />
<menu_item_call.on_enable
function="ContactList.CreateSet.Enabled" />
</menu_item_call>
</toggleable_menu>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu
bottom="806"
layout="topleft"
left="0"
mouse_opaque="false"
name="menu_contact_set_gear"
visible="false">
<menu_item_check
label="Show Offline"
layout="topleft"
name="show_offline">
<on_click
function="ContactSet.ViewOption.Action"
parameter="show_offline" />
<on_check
function="ContactSet.ViewOption.Check"
parameter="show_offline" />
<on_enable
function="ContactSet.ViewOption.Enabled"
parameter="show_offline" />
</menu_item_check>
</toggleable_menu>

View File

@ -8339,6 +8339,25 @@ Could not add [GRID] to the grid list.
You may remove this name by right clicking the name and choosing Remove Alias.
</notification>
<notification
icon="alertmodal.tga"
label="Create Contact Set"
name="CreateContactSet"
type="alertmodal">
New contact set name:
<tag>confirm</tag>
<form name="form">
<input name="new_name" type="text" width="300" />
<button
default="true"
index="0"
name="OK"
text="OK"/>
<button
index="1"
name="Cancel"
text="Cancel"/>
</form>
</notification>
</notifications>

View File

@ -0,0 +1,372 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
width="550"
height="600"
follows="all"
layout="topleft"
name="contact_list" >
<!--
<layout_stack
top="3"
left="4"
right="-4"
height="20"
follows="top|left|right"
layout="topleft"
enabled="true"
mouse_opaque="true"
name="stack"
orientation="horizontal">
<layout_panel
name="panel_zoom"
can_resize="false"
auto_resize="false"
user_resize="false"
layout="topleft"
height="20"
width="16">
<button
top="0"
left="0"
height="16"
width="16"
follows="top|left"
layout="topleft"
name="icon_online_status"
tool_tip="Online status"
hover_glow_amount="0.15"
image_unselected="Contacts_Online_Status_Button" />
</layout_panel>
<layout_panel
name="panel_rotate"
user_resize="false"
layout="topleft"
height="20"
width="20" >
<button
top="0"
height="18"
follows="top|left|right"
layout="topleft"
label="Username"
name="sort_user_name"
tool_tip="Offer friendship to a resident" />
</layout_panel>
<layout_panel
name="panel_rotate"
user_resize="false"
layout="topleft"
height="20"
width="30" >
<button
top="0"
height="18"
follows="top|left|right"
layout="topleft"
label="Display Name"
name="sort_display_name"
tool_tip="Offer friendship to a resident" />
</layout_panel>
<layout_panel
name="panel_zoom"
can_resize="false"
auto_resize="false"
user_resize="false"
layout="topleft"
height="20"
width="98">
<button
top="0"
right="-80"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_visible_online"
tool_tip="Friend can see when you&apos;re online"
hover_glow_amount="0.15"
image_unselected="Permission_Visible_Online_Mine_Button" />
<button
top="0"
right="-60"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_visible_map"
tool_tip="Friend can locate you on the map"
hover_glow_amount="0.15"
image_unselected="Permission_Visible_Map_Mine_Button" />
<button
top="0"
right="-40"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_edit_mine"
tool_tip="Friend can edit, delete or take objects"
hover_glow_amount="0.15"
image_unselected="Permission_Edit_Objects_Mine_Button" />
<button
top="0"
right="-20"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_visible_map_theirs"
tool_tip="You can locate them on the map"
hover_glow_amount="0.15"
image_unselected="Permission_Visible_Map_Theirs_Button" />
<button
top="0"
right="-1"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_edit_theirs"
tool_tip="You can edit this friend&apos;s objects"
hover_glow_amount="0.15"
image_unselected="Permission_Edit_Objects_Theirs_Button" />
<menu_button
top="1"
right="-2"
height="18"
width="25"
follows="top|right"
layout="topleft"
image_hover_unselected="Toolbar_Left_Over"
image_overlay="OptionsMenu_Off"
image_selected="Toolbar_Left_Selected"
image_unselected="Toolbar_Left_Off"
name="sort_options_gear_btn"
tool_tip="Sort Options" />
</layout_panel>
</layout_stack>
-->
<panel
top="0"
left="1"
right="-1"
bottom="-28"
follows="all"
layout="topleft"
name="contact_list_wrap"
bevel_style="in"
border="true" >
<accordion
top="0"
left="0"
right="-1"
bottom="-1"
follows="all"
layout="topleft"
name="accordion_list"
no_matched_tabs_text.value="Overridden text" >
<!-- <accordion_tab
height="80"
follows="all"
layout="topleft"
name="contact_tab_all"
selection_enabled="true"
tab_stop="false"
title="All"
translate="false">
<panel
follows="all"
layout="topleft"
name="contact_list_set_all"
filename="panel_contact_list_set.xml" />
</accordion_tab> -->
<!--
<accordion_tab
follows="all"
height="60"
layout="topleft"
name="contact_tab_online"
selection_enabled="true"
tab_stop="false"
title="Online"
translate="false"
width="0">
<contact_list_set
follows="all"
name="contact_list_set_online" />
</accordion_tab>
-->
</accordion>
</panel>
<panel
bottom="-1"
left="3"
right="-3"
height="24"
background_visible="true"
follows="left|right|bottom"
label="button_bar"
layout="topleft"
name="button_bar">
<menu_button
top="0"
left="0"
height="23"
width="31"
follows="bottom|left"
layout="topleft"
tool_tip="Show additional options"
image_hover_unselected="Toolbar_Left_Over"
image_overlay="OptionsMenu_Off"
image_selected="Toolbar_Left_Selected"
image_unselected="Toolbar_Left_Off"
name="sort_options_gear_btn" />
<button
top="0"
left_pad="2"
height="23"
width="31"
follows="bottom|left"
layout="topleft"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="AddItem_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
name="add_btn"
tool_tip="Offer friendship to a Resident" />
<button
top="0"
left_pad="2"
height="23"
width="67"
follows="bottom|left"
label="Profile"
layout="topleft"
name="view_profile_btn"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
tool_tip="Show picture, groups, and other Residents information" />
<button
top="0"
left_pad="2"
width="40"
height="23"
follows="bottom|left"
label="IM"
layout="topleft"
name="im_btn"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
tool_tip="Open instant message session" />
<button
top="0"
left_pad="2"
height="23"
width="51"
follows="bottom|left"
label="Call"
layout="topleft"
name="call_btn"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
tool_tip="Call this Resident" />
<button
top="0"
left_pad="2"
height="23"
width="65"
follows="bottom|left"
label="Share"
layout="topleft"
name="share_btn"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
tool_tip="Share an inventory item" />
<button
top="0"
left_pad="2"
height="23"
width="76"
follows="bottom|left"
label="Teleport"
layout="topleft"
name="teleport_btn"
image_hover_unselected="Toolbar_Middle_Over"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
tool_tip="Offer teleport" />
<dnd_button
top="0"
left_pad="2"
height="23"
width="31"
follows="bottom|left"
image_hover_unselected="Toolbar_Right_Over"
image_overlay="TrashItem_Off"
image_selected="Toolbar_Right_Selected"
image_unselected="Toolbar_Right_Off"
layout="topleft"
name="del_btn"
tool_tip="Remove selected person from your Friends list"/>
<button
top="0"
left_pad="2"
height="23"
width="31"
follows="bottom|left"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="Permission_Visible_Online"
image_pressed="PushButton_Press"
image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
control_name="GlobalOnlineStatusToggle"
is_toggle="true"
layout="topleft"
name="GlobalOnlineStatusToggle"
tool_tip="Toggle Global Visibility" />
<icon
top="0"
left_pad="2"
right="-1"
height="23"
follows="bottom|left|right"
layout="topleft"
image_name="Toolbar_Middle_Off"
name="dummy_icon" />
</panel>
</panel>

View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
layout="topleft"
class="contact_set"
name="contact_list_set"
bevel_style="in"
border="true" >
<string
name="no_friends_online"
value="No friends online" />
<string
name="no_friends"
value="No friends to show or loading..." />
<string
name="no_friends_msg">
Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend.
Looking for people to hang out with? Use the search box to find topics or content you might be interested in, then visit those places to meet people with similar interests.
</string>
<string
name="no_filtered_friends_msg">
Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search].
</string>
<string
name="showing_offline"
value="Showing All" />
<string
name="hiding_offline"
value="Offline Contacts Hidden" />
<!--<button
top="-15"
right="-5"
height="20"
width="80"
follows="top|right"
layout="topleft"
name="hide_offline_button"
tool_tip="Online status"
label="Hide Offline" />-->
<text
top="2"
left="3"
right="-35"
height="18"
follows="top|left|right"
layout="topleft"
type="string"
halign="right"
length="1"
name="list_info_text">
Test info line. Unused at this time.
</text>
<menu_button
top="1"
right="-2"
height="18"
width="25"
follows="top|right"
layout="topleft"
image_hover_unselected="Toolbar_Left_Over"
image_overlay="OptionsMenu_Off"
image_selected="Toolbar_Left_Selected"
image_unselected="Toolbar_Left_Off"
name="options_gear_btn"
tool_tip="Options" />
<avatar_list
top="20"
left="0"
follows="all"
layout="topleft"
name="avatar_list"
allow_select="true"
multi_select="true"
show_permissions_granted="true"
magical_hacky_height_padding="20" />
</panel>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
height="300"
width="550"
height="600"
layout="topleft"
mouse_opaque="true"
name="friends"
width="350">
follows="all">
<!--
<view_border
top="-9"
@ -25,11 +26,230 @@
top="-10"
width="240" />
-->
<!--
<contact_list
top="5"
left="4"
right="-95"
bottom="-69"
follows="all"
name="contact_list" />
-->
<!-- <panel
top="5"
left="4"
right="-95"
bottom="-69"
follows="all"
layout="topleft"
class="contact_list"
filename="panel_contact_list.xml"
name="contacts_lists" /> -->
<!--
<panel
top="5"
left="4"
right="-95"
bottom="-69"
follows="all"
bevel_style="in"
bg_alpha_color="Transparent"
bg_opaque_color="Black_25"
border="true"
layout="topleft"
name="vlt_panel">
<layout_stack
top="3"
left="4"
right="-4"
height="20"
follows="top|left|right"
enabled="true"
mouse_opaque="true"
name="stack"
orientation="horizontal">
<layout_panel
name="panel_zoom"
can_resize="false"
auto_resize="false"
user_resize="false"
height="20"
width="16">
<button
top="0"
left="0"
height="16"
width="16"
follows="top|left"
layout="topleft"
name="icon_online_status"
tool_tip="Online status"
hover_glow_amount="0.15"
image_unselected="Contacts_Online_Status_Button" />
</layout_panel>
<layout_panel
name="panel_rotate"
user_resize="false"
height="20"
width="20" >
<button
top="0"
height="18"
follows="top|left|right"
layout="topleft"
label="Username"
name="user_name"
tool_tip="Offer friendship to a resident" />
</layout_panel>
<layout_panel
name="panel_rotate"
user_resize="false"
height="20"
width="30" >
<button
top="0"
height="18"
follows="top|left|right"
layout="topleft"
label="Display Name"
name="full_name"
tool_tip="Offer friendship to a resident" />
</layout_panel>
<layout_panel
name="panel_zoom"
can_resize="false"
auto_resize="false"
user_resize="false"
height="20"
width="98">
<button
top="0"
right="-80"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_visible_online"
tool_tip="Friend can see when you&apos;re online"
hover_glow_amount="0.15"
image_unselected="Permission_Visible_Online_Mine_Button" />
<button
top="0"
right="-60"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_visible_map"
tool_tip="Friend can locate you on the map"
hover_glow_amount="0.15"
image_unselected="Permission_Visible_Map_Mine_Button" />
<button
top="0"
right="-40"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_edit_mine"
tool_tip="Friend can edit, delete or take objects"
hover_glow_amount="0.15"
image_unselected="Permission_Edit_Objects_Mine_Button" />
<button
top="0"
right="-20"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_visible_map_theirs"
tool_tip="You can locate them on the map"
hover_glow_amount="0.15"
image_unselected="Permission_Visible_Map_Theirs_Button" />
<button
top="0"
right="-1"
height="16"
width="16"
follows="top|right"
layout="topleft"
name="icon_edit_theirs"
tool_tip="You can edit this friend&apos;s objects"
hover_glow_amount="0.15"
image_unselected="Permission_Edit_Objects_Theirs_Button" />
</layout_panel>
</layout_stack>
<panel
top="22"
left="2"
right="-1"
bottom="-1"
follows="all"
layout="topleft"
name="vlt_panel">
<contact_list
top="0"
left="0"
right="-1"
bottom="-1"
follows="all"
layout="topleft"
name="friends_accordion"
no_matched_tabs_text.value="Overridden text" >
<accordion_tab
follows="all"
height="60"
layout="topleft"
name="contact_tab_all"
selection_enabled="true"
tab_stop="false"
title="All"
translate="false"
width="0">
<contact_list_set
follows="all"
name="contact_list_set_all" />
</accordion_tab>
<accordion_tab
follows="all"
height="60"
layout="topleft"
name="contact_tab_online"
selection_enabled="true"
tab_stop="false"
title="Online"
translate="false"
width="0">
<contact_list_set
follows="all"
name="contact_list_set_online" />
</accordion_tab>
</contact_list>
</panel>
</panel>
-->
<scroll_list
top="5"
left="4"
right="-100"
top="10"
bottom="-10"
bottom="-5"
follows="all"
layout="topleft"
column_padding="0"
@ -82,6 +302,9 @@
name="friend_last_update_generation"
width="0" />
</scroll_list>
<button
top="10"
follows="top|right"

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
width="550"
height="600"
layout="topleft"
mouse_opaque="true"
name="contacts"
follows="all">
<panel
top="5"
left="4"
right="-4"
bottom="-2"
follows="all"
layout="topleft"
class="contact_list"
filename="panel_contact_list.xml"
name="contacts_lists" />
</panel>