From e3e656df2a2d1fe355a89a7746ac124096d62280 Mon Sep 17 00:00:00 2001 From: WoLf Date: Mon, 24 Jan 2011 09:12:33 +0100 Subject: [PATCH 01/12] Fixed legacy statusbar icons size and buy land button in navigation bar for default skin. --HG-- branch : Firestorm_2.4.1 --- .../default/textures/legacy/status_health.tga | Bin 2092 -> 1196 bytes .../textures/legacy/status_no_build.tga | Bin 2066 -> 1628 bytes .../default/textures/legacy/status_no_fly.tga | Bin 2092 -> 1628 bytes .../textures/legacy/status_no_push.tga | Bin 2092 -> 1628 bytes .../textures/legacy/status_no_scripts.tga | Bin 2092 -> 1628 bytes .../default/xui/en/widgets/location_input.xml | 3 +-- 6 files changed, 1 insertion(+), 2 deletions(-) diff --git a/indra/newview/skins/default/textures/legacy/status_health.tga b/indra/newview/skins/default/textures/legacy/status_health.tga index 3d5f455fcdd7856579d0e7cb48d4edad7e03e0be..63479a63081fbbe1b138b02cb8bdcc6f71e9e607 100644 GIT binary patch delta 91 zcmZ1@u!fVDfq{tu281T^s!a5CnRwD+vLmC*j0st{58NL7j delta 187 zcmZ3(xkiAOfq{tu1{5aps!R-!nP})TF+g=TGF+gE5FO$dQQbqxwipfDt-VW}k^3x)TGqCv&oRKv{t-o)dj#CeLCK0svknH|78U diff --git a/indra/newview/skins/default/textures/legacy/status_no_build.tga b/indra/newview/skins/default/textures/legacy/status_no_build.tga index 8e471e1851e9cfc3768d649af213afed99b68b6e..c1d69e4de4eb7325603622e66146b5dd2b25b26a 100644 GIT binary patch delta 121 zcmbOvaEFJVfq{tu2E-VICh}WNZeZ^aU{iHQ~y4@OLOWQ>@65QrU_ zfHYIcWLxHl$$Np=mIX)yu`O%Hs zP?}636IC=O*D^(bsH+f4ml@1!1yTkYlkYNTfGAg%7!b9P1uXazLItvdc`I2xCws98 F0RTI5D?R`K diff --git a/indra/newview/skins/default/textures/legacy/status_no_push.tga b/indra/newview/skins/default/textures/legacy/status_no_push.tga index 5ccbfa50f1adfaa3d730bf2654490c01420ba8c7..bc2ecb80980412d7154c4261ba67589cbec1b13e 100644 GIT binary patch literal 1628 zcmds%dr(w$6vyvl@7?!PFK z4#V&msTh2;>+smss7cl~Ol=s!nWBauXew={8K-c7me=Xra%YCAlQ+~0Y8 z@9*AwewQF9!f!f4O*|&@ul^%XqOM-VGReU@O$AHSNx0T7a4#X|LXqvrE6AHj9h;GaA)Q5i7`hVH00PHsAQ5VjE5lnJ^yKZUkbylxXS6;Ko{7HTmy+beV8Bx zy#6Y_fn@|CNA@OPx^tBJ)N)e~ruQRh5B(nWtC0wSAk?YRw}V1e z00hCz2*n$H8iNZYvfW=31Z~9{-W13Z{(`2d-Y|cX;!ojGzK?F6&b+kF3eMuI-jBi!I~AT%k+`4UgI+fLn~7=#$wA` ze~&6^0kLjzE%yC6i*l*>c-NWIIT-XnW45(QA7HK#E6;&aU5@)?W`&{+sOk z5R!Q6kZlwOK8CEMZJ*-WT9~<~2S#qdJ@>oN-&76}CSxha`R9F9Q$DvLx}MiOec1jz zHu1A2$+KHKVE6`%dz|ns&aq`_ND0ROjjkfk_L6hN{T^@%S-yWWiw)ZB?)r)e81zC} z*4`0@rW5?RNAwKVg(ES@qQCX<|F~Er1>wKD9Qj{aa#Bj%uJ{+?ckVF1_-uS)+)CmP Dax7@z literal 2092 zcmd6oe@s(X6vw;iy7u)UWL5lu0pnDV0#c^?PE;@o@sFR^UY6r}sV;OT@WG)k(3X5x^8yR+E6HPN;;@S6*HrXE|=@ORgB%j>- z&OP^hPu@N6KAG%kS-_^q!emnvfu|tGrx2qC`k2T`))1xQWz44oIT+43UJG(SA=nFw zz#1?c@OrQ&hKfRN&E8%8-`7=8dwHppI4$ZtHZK7o!z5wtVx_R+_PB{I3ZM`&yW!sn z5{KFMPj2uI%F2kyDf zNP}NF>5ng($kX^CwOETK`7@(S{W^~Xaov+J^}CP7Furo zyWE>v<&f0z^Dn@c3o?NvVaC)Zx7{}Q`{#{xwfYdvdOos{b>s@&1FREj80rC~Dr;zj zk9#o~n=p2!wrqS-N_)gYb8!JP$#hrCOxS}1(3-i-uv0H2R`c}jBEgD)M_TW_O{ zX-hWnIdcts?pS{!i1|a>Dly-K=R6RMMJMHN`+8H;H?*;_i#9vHrLE3uWI1<*OeZ@i zENc25Bnbsci?ng>-!3)KJ;w>My=&~>;vyk*KN`l9q2=XRIoHTF5203@_pa^3m;K`o1I*TORC{d0sOu5yWR(i z0iPLbt3j|9iNM8^;&rE%?YDWix80z`tb*(CtpY0x^UOVcpVX4Ky`H)oj`@DQSWmBH zyznE|_#N}vjD(3}CPZv~wc+x^*z~N=kWkO;UZ365|LJMEdg_R8t?|X1+t-+Se|FZA z`)C<|hnPOa`XDOJ^m%ANd_PtZ%YD_s57^)Wq@I9=e^BK7Y0o z$u(dUh*`hfaPcSC$CBrKt&}!T+YH|{@Lw4BbCea8L7{v<&b+GO*?k`Tq^s Vt5zFwj9Et0iul}AW2PZN_7}$bbm#y8 diff --git a/indra/newview/skins/default/textures/legacy/status_no_scripts.tga b/indra/newview/skins/default/textures/legacy/status_no_scripts.tga index 52ecdb1b84b33c676cae928ed6ed9bd1f415db21..a0ca0b8896efcdcc66184fbdbd1d11919eefee1f 100644 GIT binary patch delta 91 zcmZ1@aEFJVfq{tu2E-VICi16EG|-t?sx$Fq#AHv#h{-2`*pmrJ1F Date: Mon, 24 Jan 2011 19:53:27 -0500 Subject: [PATCH 02/12] Kadah's V1 - contacts tab, backported from default --HG-- branch : Firestorm_2.4.1 --- FIRESTORM-FEATURETABLE.txt | 2 +- indra/newview/CMakeLists.txt | 2 + indra/newview/fscontactsfloater.cpp | 351 ++++++++++++++++++ indra/newview/fscontactsfloater.h | 91 +++++ indra/newview/llavatarlist.cpp | 5 +- indra/newview/llavatarlistitem.cpp | 3 +- indra/newview/llcallingcard.cpp | 5 +- indra/newview/llimfloatercontainer.cpp | 17 + indra/newview/llpanelpeople.cpp | 14 + indra/newview/llpanelpeople.h | 1 + indra/newview/llviewerfloaterreg.cpp | 2 + .../default/textures/legacy/ff_edit_mine.tga | Bin 0 -> 1068 bytes .../textures/legacy/ff_edit_mine_button.tga | Bin 0 -> 4140 bytes .../textures/legacy/ff_edit_theirs.tga | Bin 0 -> 1068 bytes .../textures/legacy/ff_edit_theirs_button.tga | Bin 0 -> 4140 bytes .../legacy/ff_online_status_button.tga | Bin 0 -> 4140 bytes .../textures/legacy/ff_visible_map.tga | Bin 0 -> 812 bytes .../textures/legacy/ff_visible_map_button.tga | Bin 0 -> 4140 bytes .../legacy/ff_visible_map_button_theirs.tga | Bin 0 -> 3272 bytes .../textures/legacy/ff_visible_map_theirs.tga | Bin 0 -> 698 bytes .../textures/legacy/ff_visible_online.tga | Bin 0 -> 1068 bytes .../legacy/ff_visible_online_button.tga | Bin 0 -> 4140 bytes .../ff_visible_online_button_theirs.tga | Bin 0 -> 2617 bytes .../legacy/ff_visible_online_theirs.tga | Bin 0 -> 872 bytes .../skins/default/textures/textures.xml | 8 + .../default/xui/en/fs_floater_contacts.xml | 66 ++++ .../xui/en/fs_panel_contacts_friends.xml | 73 ++++ .../xui/en/fs_panel_contacts_groups.xml | 76 ++++ .../skins/firestorm/textures/textures.xml | 7 + 29 files changed, 718 insertions(+), 5 deletions(-) create mode 100644 indra/newview/fscontactsfloater.cpp create mode 100644 indra/newview/fscontactsfloater.h create mode 100644 indra/newview/skins/default/textures/legacy/ff_edit_mine.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_edit_mine_button.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_edit_theirs.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_edit_theirs_button.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_online_status_button.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_map.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_map_button.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_map_button_theirs.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_map_theirs.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_online.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_online_button.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_online_button_theirs.tga create mode 100644 indra/newview/skins/default/textures/legacy/ff_visible_online_theirs.tga create mode 100644 indra/newview/skins/default/xui/en/fs_floater_contacts.xml create mode 100644 indra/newview/skins/default/xui/en/fs_panel_contacts_friends.xml create mode 100644 indra/newview/skins/default/xui/en/fs_panel_contacts_groups.xml diff --git a/FIRESTORM-FEATURETABLE.txt b/FIRESTORM-FEATURETABLE.txt index cc36f70eb8..ae01fffcba 100644 --- a/FIRESTORM-FEATURETABLE.txt +++ b/FIRESTORM-FEATURETABLE.txt @@ -41,7 +41,7 @@ Collapsable_Nearbychat LGPL InvFolderType_Icons LGPL Hippos! LGPL V1_MouseCursors LGPL/Creative Commons Attribution-Share Alike 3.0 -V1_Icons Creative Commons Attribution-Share Alike 3.0 +V1_Icons Creative Commons Attribution-Share Alike 3.0 AFK_ExtraControls LGPL IgnoreFinishAnimation BSD/PD Comm_Contacts_Tab LGPL diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 0d8c1afc46..e76465e54e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -70,6 +70,7 @@ include_directories( set(viewer_SOURCE_FILES chatbar_as_cmdline.cpp kcwlinterface.cpp + fscontactsfloater.cpp llagent.cpp llagentaccess.cpp llagentcamera.cpp @@ -613,6 +614,7 @@ set(viewer_HEADER_FILES ViewerInstall.cmake chatbar_as_cmdline.h kcwlinterface.h + fscontactsfloater.h llagent.h llagentaccess.h llagentcamera.h diff --git a/indra/newview/fscontactsfloater.cpp b/indra/newview/fscontactsfloater.cpp new file mode 100644 index 0000000000..8b0106e3ec --- /dev/null +++ b/indra/newview/fscontactsfloater.cpp @@ -0,0 +1,351 @@ +/** + * @file + * @brief + * + * $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$ + */ + + +#include "llviewerprecompiledheaders.h" + +#include "fscontactsfloater.h" + +// libs +#include "llavatarname.h" +#include "llfloaterreg.h" +#include "llfloater.h" +#include "lltabcontainer.h" + +#include "llavataractions.h" +#include "llavatarlist.h" +#include "llavatarlistitem.h" +#include "llcallingcard.h" // for LLAvatarTracker +#include "llfloateravatarpicker.h" +#include "llfriendcard.h" +#include "llgroupactions.h" +#include "llgrouplist.h" +#include "llsidetray.h" + +static const std::string FRIENDS_TAB_NAME = "friends_panel"; +static const std::string GROUP_TAB_NAME = "groups_panel"; + +/** Compares avatar items by online status, then by name */ +class LLAvatarItemStatusComparator : public LLAvatarItemComparator +{ +public: + LLAvatarItemStatusComparator() {}; + +protected: + /** + * @return true if item1 < item2, false otherwise + */ + virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const + { + LLAvatarTracker& at = LLAvatarTracker::instance(); + bool online1 = at.isBuddyOnline(item1->getAvatarId()); + bool online2 = at.isBuddyOnline(item2->getAvatarId()); + + if (online1 == online2) + { + std::string name1 = item1->getAvatarName(); + std::string name2 = item2->getAvatarName(); + + LLStringUtil::toUpper(name1); + LLStringUtil::toUpper(name2); + + return name1 < name2; + } + + return online1 > online2; + } +}; + +static const LLAvatarItemStatusComparator STATUS_COMPARATOR; + + +// +// FSFloaterContacts +// + +FSFloaterContacts::FSFloaterContacts(const LLSD& seed) + : LLFloater(seed), + mTabContainer(NULL), + mFriendList(NULL), + mGroupList(NULL) +{ +} + +FSFloaterContacts::~FSFloaterContacts() +{ +} + +BOOL FSFloaterContacts::postBuild() +{ + mTabContainer = getChild("friends_and_groups"); + + mFriendsTab = getChild(FRIENDS_TAB_NAME); + mFriendList = mFriendsTab->getChild("avatars_all"); + mFriendList->setNoItemsCommentText(getString("no_friends")); + mFriendList->setShowIcons("FriendsListShowIcons"); + mFriendList->showPermissions(TRUE); + mFriendList->setComparator(&STATUS_COMPARATOR); + mFriendList->sort(); + + mFriendList->setItemDoubleClickCallback(boost::bind(&FSFloaterContacts::onAvatarListDoubleClicked, this, _1)); + mFriendList->setReturnCallback(boost::bind(&FSFloaterContacts::onImButtonClicked, this)); + + mFriendsTab->childSetAction("im_btn", boost::bind(&FSFloaterContacts::onImButtonClicked, this)); + mFriendsTab->childSetAction("profile_btn", boost::bind(&FSFloaterContacts::onViewProfileButtonClicked, this)); + mFriendsTab->childSetAction("offer_teleport_btn", boost::bind(&FSFloaterContacts::onTeleportButtonClicked, this)); + mFriendsTab->childSetAction("pay_btn", boost::bind(&FSFloaterContacts::onPayButtonClicked, this)); + + mFriendsTab->childSetAction("remove_btn", boost::bind(&FSFloaterContacts::onDeleteFriendButtonClicked, this)); + mFriendsTab->childSetAction("add_btn", boost::bind(&FSFloaterContacts::onAddFriendWizButtonClicked, this)); + + mGroupsTab = getChild(GROUP_TAB_NAME); + mGroupList = mGroupsTab->getChild("group_list"); + mGroupList->setNoItemsMsg(getString("no_groups_msg")); + mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg")); + + mGroupList->setDoubleClickCallback(boost::bind(&FSFloaterContacts::onGroupChatButtonClicked, this)); + // mGroupList->setCommitCallback(boost::bind(&FSFloaterContacts::updateButtons, this)); + mGroupList->setReturnCallback(boost::bind(&FSFloaterContacts::onGroupChatButtonClicked, this)); + + + mGroupsTab->childSetAction("chat_btn", boost::bind(&FSFloaterContacts::onGroupChatButtonClicked, this)); + mGroupsTab->childSetAction("info_btn", boost::bind(&FSFloaterContacts::onGroupInfoButtonClicked, this)); + mGroupsTab->childSetAction("activate_btn", boost::bind(&FSFloaterContacts::onGroupActivateButtonClicked, this)); + mGroupsTab->childSetAction("leave_btn", boost::bind(&FSFloaterContacts::onGroupLeaveButtonClicked, this)); + mGroupsTab->childSetAction("create_btn", boost::bind(&FSFloaterContacts::onGroupCreateButtonClicked, this)); + mGroupsTab->childSetAction("search_btn", boost::bind(&FSFloaterContacts::onGroupSearchButtonClicked, this)); + + return TRUE; +} + +void FSFloaterContacts::onOpen(const LLSD& key) +{ + if (key.asString() == "friends") + { + childShowTab("friends_and_groups", "friends_panel"); + } + else if (key.asString() == "groups") + { + childShowTab("friends_and_groups", "groups_panel"); + } +} + + +// +// Friend actions +// + +void FSFloaterContacts::onAvatarListDoubleClicked(LLUICtrl* ctrl) +{ + LLAvatarListItem* item = dynamic_cast(ctrl); + if(!item) + { + return; + } + + LLUUID clicked_id = item->getAvatarId(); + +#if 0 // SJB: Useful for testing, but not currently functional or to spec + LLAvatarActions::showProfile(clicked_id); +#else // spec says open IM window + LLAvatarActions::startIM(clicked_id); +#endif +} + +void FSFloaterContacts::onImButtonClicked() +{ + uuid_vec_t selected_uuids; + getCurrentItemIDs(selected_uuids); + if ( selected_uuids.size() == 1 ) + { + // if selected only one person then start up IM + LLAvatarActions::startIM(selected_uuids.at(0)); + } + else if ( selected_uuids.size() > 1 ) + { + // for multiple selection start up friends conference + LLAvatarActions::startConference(selected_uuids); + } +} + +void FSFloaterContacts::onViewProfileButtonClicked() +{ + LLUUID id = getCurrentItemID(); + LLAvatarActions::showProfile(id); +} + +void FSFloaterContacts::onTeleportButtonClicked() +{ + uuid_vec_t selected_uuids; + getCurrentItemIDs(selected_uuids); + LLAvatarActions::offerTeleport(selected_uuids); +} + +void FSFloaterContacts::onPayButtonClicked() +{ + LLUUID id = getCurrentItemID(); + if (id.notNull()) + LLAvatarActions::pay(id); +} + +void FSFloaterContacts::onDeleteFriendButtonClicked() +{ + uuid_vec_t selected_uuids; + getCurrentItemIDs(selected_uuids); + + if (selected_uuids.size() == 1) + { + LLAvatarActions::removeFriendDialog( selected_uuids.front() ); + } + else if (selected_uuids.size() > 1) + { + LLAvatarActions::removeFriendsDialog( selected_uuids ); + } +} + +bool FSFloaterContacts::isItemsFreeOfFriends(const uuid_vec_t& uuids) +{ + const LLAvatarTracker& av_tracker = LLAvatarTracker::instance(); + for ( uuid_vec_t::const_iterator + id = uuids.begin(), + id_end = uuids.end(); + id != id_end; ++id ) + { + if (av_tracker.isBuddy (*id)) + { + return false; + } + } + return true; +} + +void FSFloaterContacts::onAddFriendWizButtonClicked() +{ + // Show add friend wizard. + LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&FSFloaterContacts::onAvatarPicked, _1, _2), FALSE, TRUE); + // Need to disable 'ok' button when friend occurs in selection + if (picker) picker->setOkBtnEnableCb(boost::bind(&FSFloaterContacts::isItemsFreeOfFriends, this, _1)); + LLFloater* root_floater = gFloaterView->getParentFloater(this); + if (root_floater) + { + root_floater->addDependentFloater(picker); + } +} + +// +// Group actions +// + +void FSFloaterContacts::onGroupChatButtonClicked() +{ + LLUUID group_id = getCurrentItemID(); + if (group_id.notNull()) + LLGroupActions::startIM(group_id); +} + +void FSFloaterContacts::onGroupInfoButtonClicked() +{ + LLGroupActions::show(getCurrentItemID()); +} + +void FSFloaterContacts::onGroupActivateButtonClicked() +{ + LLGroupActions::activate(mGroupList->getSelectedUUID()); +} + +void FSFloaterContacts::onGroupLeaveButtonClicked() +{ + LLUUID group_id = getCurrentItemID(); + if (group_id.notNull()) + LLGroupActions::leave(group_id); +} + +void FSFloaterContacts::onGroupCreateButtonClicked() +{ + LLGroupActions::createGroup(); +} + +void FSFloaterContacts::onGroupSearchButtonClicked() +{ + LLGroupActions::search(); +} + + + +std::string FSFloaterContacts::getActiveTabName() const +{ + return mTabContainer->getCurrentPanel()->getName(); +} + +LLUUID FSFloaterContacts::getCurrentItemID() const +{ + std::string cur_tab = getActiveTabName(); + + if (cur_tab == FRIENDS_TAB_NAME) + return mFriendList->getSelectedUUID(); + + if (cur_tab == GROUP_TAB_NAME) + return mGroupList->getSelectedUUID(); + + llassert(0 && "unknown tab selected"); + return LLUUID::null; +} + +void FSFloaterContacts::getCurrentItemIDs(uuid_vec_t& selected_uuids) const +{ + std::string cur_tab = getActiveTabName(); + + if (cur_tab == FRIENDS_TAB_NAME) + mFriendList->getSelectedUUIDs(selected_uuids); + else if (cur_tab == GROUP_TAB_NAME) + mGroupList->getSelectedUUIDs(selected_uuids); + else + llassert(0 && "unknown tab selected"); + +} + + + +// static +void FSFloaterContacts::onAvatarPicked(const uuid_vec_t& ids, const std::vector names) +{ + if (!names.empty() && !ids.empty()) + LLAvatarActions::requestFriendshipDialog(ids[0], names[0].getCompleteName()); +} + + +//static +FSFloaterContacts* FSFloaterContacts::findInstance() +{ + return LLFloaterReg::findTypedInstance("imcontacts"); +} + +FSFloaterContacts* FSFloaterContacts::getInstance() +{ + return LLFloaterReg::getTypedInstance("imcontacts"); +} + +// EOF diff --git a/indra/newview/fscontactsfloater.h b/indra/newview/fscontactsfloater.h new file mode 100644 index 0000000000..b0e2d1e96a --- /dev/null +++ b/indra/newview/fscontactsfloater.h @@ -0,0 +1,91 @@ +/** + * @file fscontactsfloater.h + * @brief + * + * $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 LL_FSCONTACTSFLOATER_H +#define LL_FSCONTACTSFLOATER_H + +#include +#include + +#include "llfloater.h" + +class LLAvatarList; +class LLAvatarName; +class LLGroupList; +class LLPanel; +class LLTabContainer; + +class FSFloaterContacts : public LLFloater +{ +public: + FSFloaterContacts(const LLSD& seed); + virtual ~FSFloaterContacts(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + static FSFloaterContacts* getInstance(); + static FSFloaterContacts* findInstance(); + + LLPanel* mFriendsTab; + LLAvatarList* mFriendList; + LLPanel* mGroupsTab; + LLGroupList* mGroupList; + +private: + std::string getActiveTabName() const; + LLUUID getCurrentItemID() const; + void getCurrentItemIDs(uuid_vec_t& selected_uuids) const; + void onAvatarListDoubleClicked(LLUICtrl* ctrl); + + bool isItemsFreeOfFriends(const uuid_vec_t& uuids); + + // misc callbacks + static void onAvatarPicked(const uuid_vec_t& ids, const std::vector names); + + // friend buttons + void onViewProfileButtonClicked(); + void onImButtonClicked(); + void onTeleportButtonClicked(); + void onPayButtonClicked(); + void onDeleteFriendButtonClicked(); + void onAddFriendWizButtonClicked(); + + // group buttons + void onGroupChatButtonClicked(); + void onGroupInfoButtonClicked(); + void onGroupActivateButtonClicked(); + void onGroupLeaveButtonClicked(); + void onGroupCreateButtonClicked(); + void onGroupSearchButtonClicked(); + + LLTabContainer* mTabContainer; + +}; + + +#endif // LL_FSCONTACTSFLOATER_H diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 9a40df49e8..87f1a873fe 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -293,7 +293,8 @@ void LLAvatarList::refresh() // *NOTE: If you change the UI to show a different string, // be sure to change the filter code below. addNewItem(buddy_id, - av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName, + //av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName, + av_name.getCompleteName(), LLAvatarTracker::instance().isBuddyOnline(buddy_id)); modified = true; nadded++; @@ -319,7 +320,7 @@ void LLAvatarList::refresh() const LLUUID& buddy_id = it->asUUID(); LLAvatarName av_name; have_names &= LLAvatarNameCache::get(buddy_id, &av_name); - if (!findInsensitive(av_name.mDisplayName, mNameFilter)) + if (!findInsensitive(av_name.getCompleteName(), mNameFilter)) { removeItemByUUID(buddy_id); modified = true; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index ca61018243..c61f2af6f2 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -415,7 +415,8 @@ void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name) // setAvatarToolTip(av_name.mUsername); // [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a bool fRlvFilter = (mRlvCheckShowNames) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); - setAvatarName( (!fRlvFilter) ? av_name.mDisplayName : RlvStrings::getAnonym(av_name) ); + //setAvatarName( (!fRlvFilter) ? av_name.mDisplayName : RlvStrings::getAnonym(av_name) ); + setAvatarName( (!fRlvFilter) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name) ); setAvatarToolTip( (!fRlvFilter) ? av_name.mUsername : RlvStrings::getAnonym(av_name) ); // TODO-RLVa: bit of a hack putting this here. Maybe find a better way? mAvatarIcon->setDrawTooltip(!fRlvFilter); diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 3fd4d94588..3616619bc5 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -530,7 +530,10 @@ void LLAvatarTracker::notifyParticularFriendObservers(const LLUUID& buddy_id) observer_set_t& obs = obs_it->second; for (observer_set_t::iterator ob_it = obs.begin(); ob_it != obs.end(); ob_it++) { - (*ob_it)->changed(mModifyMask); + if (*ob_it) + (*ob_it)->changed(mModifyMask); + else + llwarns << "Invalid observer" << llendl; } } diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 413b362e4b..fdb8ea7f80 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -36,6 +36,7 @@ #include "lltransientfloatermgr.h" #include "llnearbychat.h" +#include "fscontactsfloater.h" #include "llfloater.h" // @@ -55,6 +56,9 @@ LLIMFloaterContainer::~LLIMFloaterContainer() BOOL LLIMFloaterContainer::postBuild() { + + addFloater(FSFloaterContacts::getInstance(), TRUE); + LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1)); // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button // mTabContainer will be initialized in LLMultiFloater::addChild() @@ -100,6 +104,19 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp, openFloater(floaterp->getKey()); return; } + + if (floaterp->getName() == "imcontacts") + { + S32 num_locked_tabs = mTabContainer->getNumLockedTabs(); + mTabContainer->unlockTabs(); + // add contacts window as first tab + LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START); + // make sure first two tabs are now locked + mTabContainer->lockTabs(num_locked_tabs + 1); + //gSavedSettings.setBOOL("ContactsTornOff", FALSE); + floaterp->setCanClose(FALSE); + return; + } LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 4c005018d6..6629bf1c2f 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -68,6 +68,7 @@ // [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a) #include "rlvhandler.h" // [/RLVa:KB] +#include "fscontactsfloater.h" #define FRIEND_LIST_UPDATE_TIMEOUT 0.5 #define NEARBY_LIST_UPDATE_INTERVAL 1 @@ -683,6 +684,9 @@ BOOL LLPanelPeople::postBuild() mOnlineFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); mAllFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); + FSFloaterContacts* fs_contacts = FSFloaterContacts::getInstance(); + fs_contacts->mFriendsTab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2)); + return TRUE; } @@ -721,6 +725,8 @@ void LLPanelPeople::updateFriendList() if (!mOnlineFriendList || !mAllFriendList) return; + static FSFloaterContacts* fs_contacts = FSFloaterContacts::getInstance(); + // get all buddies we know about const LLAvatarTracker& av_tracker = LLAvatarTracker::instance(); LLAvatarTracker::buddy_map_t all_buddies; @@ -741,6 +747,12 @@ void LLPanelPeople::updateFriendList() { lldebugs << "Friends Cards were found, count: " << listMap.begin()->second.size() << llendl; all_friendsp = listMap.begin()->second; + if (fs_contacts->mFriendList) + { + uuid_vec_t& contact_friendsp = fs_contacts->mFriendList->getIDs(); + contact_friendsp.clear(); + contact_friendsp = listMap.begin()->second; + } } else { @@ -762,6 +774,8 @@ void LLPanelPeople::updateFriendList() */ mOnlineFriendList->setDirty(true, !mOnlineFriendList->filterHasMatches());// do force update if list do NOT have items mAllFriendList->setDirty(true, !mAllFriendList->filterHasMatches()); + if (fs_contacts->mFriendList) + fs_contacts->mFriendList->setDirty(true, !fs_contacts->mFriendList->filterHasMatches()); //update trash and other buttons according to a selected item updateButtons(); showFriendsAccordionsIfNeeded(); diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 5410d0a0e2..fce9307f65 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -38,6 +38,7 @@ class LLFilterEditor; class LLGroupList; class LLTabContainer; class LLMenuButton; +class LLMenuGL; class LLPanelPeople : public LLPanel diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 0846ae730a..7c27004bd9 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -128,6 +128,7 @@ // [RLVa:KB] - Checked: 2010-03-11 #include "rlvfloaters.h" // [/RLVa:KB] +#include "fscontactsfloater.h" void LLViewerFloaterReg::registerFloaters() { @@ -175,6 +176,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("help_browser", "floater_help_browser.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("imcontacts", "fs_floater_contacts.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("im_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/textures/legacy/ff_edit_mine.tga b/indra/newview/skins/default/textures/legacy/ff_edit_mine.tga new file mode 100644 index 0000000000000000000000000000000000000000..8f0c35b98fafe79c785401dd11617bd113f84395 GIT binary patch literal 1068 zcmb7^Z%7ki9LH~4W(;XEsTRF4B#NU85n0TnGT7#kUgh~Gv}Lpylnc@_7De{L@I{QE zU~DhKD8jwa#(L3F7))nN3JO-e2%%ntt%8HI>kq-~+dU6FaS~}BeEB{6_2z9R{N9$%1zddOK59KX|GalaNeR}i-+%^xGX}22 zaq9dK0)fCS##gLai)%Mi3p~tO$PVXvTTv}k!R2xlWLX}~<#Haz$6~SLf*|CLuY!%6 zwt!T#f&m{eHx7K6#Nfpc^IIvfsde6Sne$1YHPyxk9r#qvvgf6rjEfS!Xk`v_#t z%&{}+6Nd5cZuC-q_D#xQp8#K(x&S;%!ftXAv1BzmaF{-#~fKV_j6vWxOT zZwQ&(6hS(UwRgLgcPHWG|df zry7k$`v_lnDPivIVd}%?|5bHeFH0tq9i);O!V?ziX=9(U|MD<)Jzn`%Ca;NQNjgxS66672^Ls^U0`?F1(ZV$QBVRo9K|q?JjOhx zF(%V7b-XaeBN3DkMNqRM&^*$@aSPUeKF_2`?htjQkcidiSD;?!6d~--RsZRudS6>Q{rR(<$t2MCe?r?GMtd$U}Opvp@tX|({o9h zmM@rd$eXvE`774(##?K6ZPuH_CS?#2orvBXPe^18V*=@x?6qNsKnNT2m71 zzxZ;M8eLQz@9#d$-lJzIscK-?;d;^5v-`+t_Evu(bk^GL5%*ha_mKt;e$vRYHQVs^ z^~b0WYcpRPE^6Sl*_55UL{&o*WgmY<>4}T%7OZ(I))Ho#NKlxOAf1U|p>csB_-b_M zEXkzj&122>gA{EkB|a^igt+)N^VNPqnB&vfyuXG+pMAqepI@O|#PDJ51s1K|h%q*q zFyjQmqZ4>FSWmYn9q8WmahwM}!ysp8{50c9N}a}xnT1SEO=&aV>FH-sj8+Q|w^DrQ z6RYPtD?evvW!>N7&|tkL`MkcQia=d76JxaGPY*}!?T*6Joe8FhR=Kt{=0W4H*J_9{ zMUs=1MQnU3ZZah!{dK(HuB4x{2mOb5@vN&C9wWzC>rAa4$%dj_zP_}RQ?=_@SdfH% zyuUSuWHAS9%$Dtg_$_~@QYv}U-kva#SA_B$zsGT-pJg z6FSeeri08YNI@m{#1bCTF8*kRoX}T1`D|q>f9xrQibYVi0IHUf5hSOlV=qphTqn47 z@au7*T5BAoyH?@m>Vhsfpq=~?nEVv{uqg-j&4u!XP`Mb6uOLI?Mb{oZxKOu6FdK!= zz^zlFJ&g@7ZlrH`0-`@$d!JkD7 zGN`E(J~TH7{x!?_>%vIv2rfHJDtY$S-dkPgi&q-uz#Wp-aax?<3n)l-IHDp zPcdntj$;+;Xlgpi)(uM-=H}Y&{JlphQOn$zX&i&>#eO*T>Os&rPv+#saH^_^?=P0H zuXqVr>1GsO!*J^Bh}ooNYD(1K{s*;TdyMc#|$VduZ}oK7%D ziszVt$#G_8X2vlyJC^G5)o@ef-(1hF>&Mu<{%tYmL#Zk2!>Nz#soY~nMag3vEA1lA zyKu6?p1HYxZRWRJi=^Wz2^JD8dL~4LQIMBJ(aL-#CmDz_#*mR5&e2kPuAb@5&tHz> z#@8y&*4lHR*ny>mqsdIsx0`Q^NAl0#*9UEY8ii~)(mFdOA&SF$yVKMl=eNt5+-aId z)45RY4t+lqb-PRUl2T^mND_81AbGs=6u4mGGYX{fA&Et5v zJ#%LGcUbW}p0yK{k}HpLvddxE>SPH^+5ZPXr8im~WxjiDp*zdwe; zoB-;M*s*_WZ}x8=%FkEwxqJHr{Bik#{E&dZ_Wx2$_xIVBb7_uAb-ws@AF|Uzt)Abw zwiQVa^1q|_()^a@SVq!cdyhhKTvzQWB%?6LPwY31_wsA$e@F3K^GX_T+nBe!-x^<9 zXQW#03`wlCxM-x@ZTXvZT4D{lPLaftVra>4=}%`IOYdJ2UwU79#IpV&V2m_rqO=CB OUN_tls14P~?EVDG3cXJN literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/legacy/ff_edit_theirs.tga b/indra/newview/skins/default/textures/legacy/ff_edit_theirs.tga new file mode 100644 index 0000000000000000000000000000000000000000..005ada2deaa121415d9115313ce1d03d456ee789 GIT binary patch literal 1068 zcmai!ZAep57{||E)JRdc%nAvVVTm{q8LLg5o3uA_x7^gkUW^ulk{~mKD6$WRAN&v$ z#QG3M5khFAK4gW$a#m7Nuq+6nh_Lm7FkdQy+`oGcJD0m*b>Yu*&%Mv@|2*e8mrIC} z@GGC>lj2nx0tJ`Da`U1}mH9g-HxIhaLaQJvHe7g_ADYT%r!G+AMEV!)q z`bCydzQGt1j5Rid!cp9wnEtPZMyF7{r54HB#8wl$cJx#~dIy5AIXzgnp$O`X45<%; z$%5d}-4x&L-geF_Oce{}x~&7l>kBJmReBvxb~S_c{A28R=Jd*Xq9IWTknmkk2_Ohcf9} efs^+`?cJ@P%|-2>_>^OSBLQ+%%rus_+!L% zb7s&eadY!PBI$?4u%{VoGmaN+CopcpWTsAcAuvo!oN*xu8E+D4NJAD9iI;yU?!Lj; zPPAjl(4nLyCv-jg-}vTgAW0uhrqPI}G(fOs;_N2HCrF9ELPKD<7L_iM)cMQFd3PO4 zR~3=D^a){4=b-bOL^TnVQ0ntGnCaf^Jz`97+WY8b2sg->G1Wn8LqwNFU!qC6K7=Y_Pwkt zsUjhB39_&lT-;^2didZa3&GQ5escUm)GS%Gf!%_+??f9_pMOJbOFLDK7tyCKz&jwU z*ZkZiITRLcW9fhYCm=iuKY0XlRSbEBTiAR20tW>9 z@R#3l@bncvsyv256Ni(~u~Xxo>fbp(*@pXcwli?>5E9+(pGEMvWSd<4dDi80^I6lmM=6Nr$?(xmUiJ_#heK zq3S-z?H2l1Niv#g2tQ4uupduaLMRm_E4kKI#>v{XEXq{k>1v0S@X7A^5oF1o zkUF~%q15&%e!VsZTU%!)j-Q0bY)7G|l?>Q%ts8Zs z9-HB2J#_~P$TF(f_(2}VxjGVKHN;1$F+?hRrGI0Ml&P$gk*m!iQ^D@;F&zMd3Tzu6v&S{i1vqgd0U+}_VJcizeO zar@`~-=u$Q{WG*TOFMkH+UnAgi{drr`-r(`_vBi4{H7xVI(#^PVhm^Mhl+ZT&|E); zn#%w0H%fPWlLqF@v^IMZTTkYgh8OPsU4mkwGmZ&(kA}aAhW`x9+02<^Ha6$H9ITjWXP~;Fr1kYIGq>Pz_ zMzqG7bgGkLY>hT((8i!`jhd#l(go z{Xh5fUz9Q{&(ClrzkcnlKSE>OkNXzwt*cotSkYL^@`bf5ThO;yzOarJf>K8=CH7og zwwykN=G2%~V5Q7y#hssry()w9^>H+w@5iJ$3dxj#jM7?mU51z6hZoQE9y>0;zE2>( zrVU9v>CY${&UhJInp2~y#7U*gNkwtK!9S}#md1--WNuUpjWrqkF^Mx+*|C?7lOMD9 zn%MC{k1g7suVT+fu=_)3>pnrt^PQ~N(n*H9lE_pOj$Mic7nQ-KIeUFh9;z@YA3`4p7aO|y1F-9gK;rRD*eCXN{R496w%`{KgpYR+F$I3i zKjlT!`z97#P-rgguSTWoPX7FcWZdhbX}%Cl(=|ojRz-MRPaYzp(nz(|kdR(OYJM$g zt~tbKJBUrmWAbz>DMb}zxoeqfsUgre(um!tT!rg*ik1IX)OHV}Y}2^A@>@$RfFLIt&3>>ZS8>BFYD7-`eTN?pE0|*;BnBak7x9Y_dqzL++VpO_f-f=Ul z@nPPfffOuFB(K`q zt>Mfliz72Vn><%G`PJXTFFmOHP}^XylvvElBCjwPM_mfluMMJEYGVE=Gn3qY`1cRQ z%i9}eGGjJ-;TIUd=+pozj(V~5x}y4Ue=-Xu5kGb+k0vHyDVQd4O~1SU9{#!MSj)1= zu{dxxB{H{rFl+FmP~smNtw=5^gAj)V6g{zpjHdJ9lAQ&_syTO2*HW)Q+#@ zJ(TRKam0^KCOJNt^yyQ2#cwOm#8I6_!IA{(4u#YFnWE^RBE}U&#Hdu7*B|5!>BR$I z!2aukf5Dq_ernHY#zotRnmz=Z^m~i+as8ViWS2*iJasZteh}X){=DKG3R{w>emzur z$1E{7F+lttJ~D})9==HD2RGP$4z{0_d3Y20yz|l*GN-QbaB>;mVG8#FCG~Hj=9oX0 zx#J}dkMxdTa$dYLfyT4`IHd0N3`w+Bir=po^H0y1ZKv*>#T|0iv+=i|!kTSINh@k* z;>&{ z+W&36;y-?W{EzkI|3O0w1k=^2vkET=_olzWFHS;-HihEWSQZ@*Gi*rO zta!-r9V!YcsdCitSW_#1zxpLt#g3On^OP+4Ia9J~n3`QfjAbNAtrGXEiY1qVakod~ zY@Buv`zKv?PbRrmE5%R5QTJ9LPly(9c1bUaCQ<_xBPI-B|DGM3eES_%{rV_TNzwRx zSK%f1w0>J7&o`bAFtmi$6k1#8-F7$qW9&Z94wC(=_kdmWK+&on((qOY4IhaP_`PVj zV~U(-eHb4zf`|vk5H>i9l+^)L{YCD}o~Xa9YfkpBXb7z(w5HJ7;-2`8J)DlN1#Npt z+eE6nBADMD$*NC-434of8;4jFQH4??Z|j}sN5kRa%-cHx_vSH%hA_0mOauWQZTc*UEl-Qk9I(D626Co%l$XWkxv ztwHsC>@jy{^AAl()y>ekPW}uXIyiQA%BTNuQ#AcB#Re zlJp2EN%2fe=v$;D#v8n&MhwS5gk1X)H+en(4Y1C%rPwp_GAuJDP%0LWLmpLM7575z<1%(oprza^Lg3KV`d~i`I8i z<7Tm8=3dXiHJy!7m{Gt(OejZMBwiXw0yRR_TS@(lb^I1-{W{Qyft7*pHYfi}E+FFU zWaH4{77YcN3~?Al{eKgQUqM#i15BR<8#8h<@IM171|qIG>}=|s$XO7#lXnG#LLWS&xfoS z$cCD4EdJfkBr#k>JC<9hQVOC*C5}rij!P$&+aj75NJ0b=>V1vFBZSmrxdbc00az)e z9mnk*$$!{Q_LZYjo4=Sz43BCY7gW8s!k1$2o)k5MSRRow3E^@{%~)=~Xu(GwDsLT> z-nyy2^4FRZCJS^eME!qb@t=VfFMah3L&cn;_<&KI6e{@0N%6IV(lr-_Jw9>=gOu+C zYd!H$hnnvw_cO!ud#cNqc)RP7hPMK=-+F4k2+-afsuUF|1ayf-G*4Zi*kex(sQJ!v zzjJ(lW_o?k@c5eH_BqAzV}S9&FpYp1A@M>n;XEl|S~8B|Iqa(nRc|KwABapPfe{Bx zOaF|-{ul^k177(rnPi1J+CZ!s7#K2lLDA_xcyECP!} zW1?wlXQY`vX4-U|j+xjdlWC{Z&NP#mn!nminxtu(^kHKag?@T|8=2TNDVk}MztJ?H%J@$vJS`-$<9U(NR~Jk6J(OV3@PucMvK&JDCR)$&MP2>M~m7^Z!!Hn#$S=L)q(3+TU1FB3u`T_w8lSJxtfwI6b4|G9P2q z?O|Nx5ly%!@Qh3_Iqc!g;5es;K9Vy3ba^-}_r`{XIn=(_%lIsQb5#jLBW|9bn&OJP zpG%_yd~5Oqlat37pX}r0WG`;f*r^_do;pVFvjg-!GeGb80eZaZm+>w=(@*#LKJWbt z-<@K7$c@7IYs#u_WdwV^oc%&e~qCb!ze13Ro(4o4Gy zz)slyXe@_B^7-G?8I7SM3~Ohs_ZiL%dW2v4U-@0030^wU1Ix|aO1E*bcp=Wx09LzH ztglj$S);~LrA4z&gU=Fwd{?Lma2n8U4MEp#LE906Mx;F$Lg2O#{F(wWw1;u@Tpv#k zP0Y*h9#ib^V`gm>?>+J$ zXErV*&7mQ1`2u`9{L#N4^Y5rpZT4kBkP1_l1#`2ocSd1pl(97u?c*U{pD1y0FZ-|9 zf5k2QOgof5z^(21+-}T*h73Fj;?EF20tQv+U)NxITZic_ExK>`6Hw%jHpM{j1}kAr zc6kQbhj!tA{XY2;e^-WtpB@RhiA+~#a>JDlH5r_UvEvi$gX-sM%miZktB#;)9mcB~ zw7qKlG^W;dhArqWiXA+5cg&|4#f(*JN@_;TNUy+_ESV z?E&ap{n7kVL$I<3w*yhTRj5)_=<-dN+H3@OM}2<25`QQAnaP#-t6#}1L5N92rLI|gouI_$fA6?ck-tc=9TYBvoq&ZwvPBZO~EK-{Ub@ zdZSph)4-x;HS6m1v=^IsYEu{|3qq+XHImR0L|~ha$X%iIo$cfF@V(`~D|7kJnaIy- zQmC%AkW!-~d`A$b!%>(z#kaDz;d?__(rl1=U}T`g%BwjG;i1L+IeQUPTcT(cpCniK zv8>*}z+?}TQak6%|J^6W|6}6+%?|PZT3-8F4qYvAWYwAo-)_Xz5rI+o)?FbiZ3rZ- z!GNbMfm~mct>A;k z^}Os#WS1*c>jp=QR+el*NW4)TA9q* zItLYU7L#^|61qpu+a4>SN^EX3a-bxLUz9B4l4pqilk?l(rPP0SFJxGy{zwc~u8}&J zCQ22h+)*;*C2%7%hBvcq9Di6xVu>Fn$xoU_1NsINdN~(CE??TReE7`<8<(Y~_l^B$ z{1xPU)c-5}rxF`V|MlX?0Jk$1GMj2)c1@(W7R|1XkTHUpRW@c;hBK2E&h6At{+SlU zh1EJTr5{YJ`7G8Guaddn>{@wlOfaIYbZ!S{u(Z}kQ z`N#UHd}nH?n-O<6$47f)kB>4iB9d`Xu6=W`OX^uKKbpGe?QK8Vf6m$8R9Q+(jf+m{ zk(C};*@tfF1-+v(|1^2;PcS%sic@2!cw+PvrxnRu8K01G*fZ(1TUk?CTVdSY|K814 zt}E{V&GIb&4=HOaj5)r-p5xD5|Ds0a{pYK|m$z}gWO@G~;3_S5R^*rE7ZonA%FW;G HT;cOCH1=Iz literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/legacy/ff_visible_map_button_theirs.tga b/indra/newview/skins/default/textures/legacy/ff_visible_map_button_theirs.tga new file mode 100644 index 0000000000000000000000000000000000000000..0e596ef23880943d0b982f97d4b63db9777f637d GIT binary patch literal 3272 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 ASO5S3 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/legacy/ff_visible_online.tga b/indra/newview/skins/default/textures/legacy/ff_visible_online.tga new file mode 100644 index 0000000000000000000000000000000000000000..74e3a4e318faa0df3f26da33eed29bbf5a10f326 GIT binary patch literal 1068 zcmb`HZAep57{{-zB5~o0UW`>Z5C(%}WEiCs8z_#&D!0^LZYzn!ae5V9|?n!NA@Y*!0$og*X{q+LY#=&U4|)kf1Lf_;b&B&j0s6oEI)d zEu!S6qEuA*G60|!Qn_4C(cj-sH#9VaG#X6;g?+63Zyle{cSNC3!2vvrS*n;Xn0Ih@H*I=L@zSP%JO=>?&9L&%*jUm&u6Dp z@SG@UF9NQ;3ex-t3|=sR!>~>yo-BH04&O^Em0F2ovZswMSKE!Xt4e?E->S;C)h?Mm zQL}iqscQN3niVC#osMID{PX_D@v_a3s}SRVHn0UpDoN0MNt_D1opaIuImnmqZj3LI&b>@ejDz& d(7OhAn=cjuh{`~LHv zyJvP)s%|Rx)lVhAyw}&&a3f;N>N;i>PbM~EEZONMGR?{VXb7ip|L^zQ{|tFQ{z`PU zpMR$Ry68ye&Yg?dY$iB3nBKj6D={$f{|%9UQt6={t0r;B2N<&!$f)QO^r=_`~7*&eBQ{%OCFIPk#5<)JZNT7q~DO z4CLkI(a_LU{)Fj4ye0&HC3!|l_g-e$% zDva}I+xSTC``#IS_-1)5XJ3iqjVDJiG5UVe#`dMYNX-{jquEh-7q1#sG)^Bx`$t>g z;(3K3Sb{0oUHL;oLWqirqO!7*<0sk`f5%rX>|3H^|Llk4wd*)iqhWIV!`$wDGdFpu z(1-Z2CbJjo%_`PPD&CsfpQGCs$hkjry#18I5=_DF%KzNlG79qZ2@DKmenpjB!!b@B ze48&{GID5MFkii><&y>DNq@W_H{a9^@9y2vg!)sPJCqF$Up6Frv3=?T9NJbv+u?mw zEL^Iv1XHlP@@L!An3Ow#qM{;(t3%0i<|T<=X4@^iGwne>Z>l5PX(M!Gn8FfF!S2d0#Y(r#sy*^5`@{odg0$X;N9FcpO@!PuHHC)S|=d?4Ur1*+6E6ZlVY)t0yk!n(+hLaIH z1Y5#L(sgQV5szRPHzcEyCT2YO1cK>yi~F_wt_c~;Dt!v8DFw4Z zkG<3RE%NQgc$`ir&Wud#$#GY(#kj+gLaG!`szKuES*2HvU&}A@ofac@s|Bt64C(c9 z?{%817-F8MNYce%NJ=6yG7?kDWme~TUHQd)hrI4Ixd(-Xg$xV~;_jY)a`dE6pT3Mx z4<|vZkt2qYp=$c~>#vN7IROLwak*S1C+e}K8a&q6+26T7_h*MCmD18u1`i&L{LcX| zFE4z3eew7AN3B*X5fBi7pP!#HCgzCG#l^)~Q#`u`+wIqcd;b0D_Wxb?|NWQ$|J=y_ j3-^EBFTO7~IApy_m8egOFhonyak_!V$mrOJL8@N>a(t!v literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/legacy/ff_visible_online_button_theirs.tga b/indra/newview/skins/default/textures/legacy/ff_visible_online_button_theirs.tga new file mode 100644 index 0000000000000000000000000000000000000000..5ed12d6f994e3a96ca254c951380d04d1c07feb4 GIT binary patch literal 2617 zcmbW33sjV48pmhE6y0M$=yr-@Y1_6a>SC-%2MtlVUj}4gW?%+}fnh){0|a@JRSQk@ z;I7=n*0`jCClyOAsjVZo4qH$vtC6giR4f$H)a114y7=4g{a8pX^_*tTH|Lx8{hr_d zdH(O^dlibYilNUWh4i(r+EY`B@}pfftj^0t8RENu)OZ6GNk$z?aVJ`SW%FtQDY8gE zYkwKHPBh!81N~UPemzE`5qEcY@+VH5h@H4I7!0giw~km{B=WOA&*;}9Mhw+z)@yh} zWa5yPXriom1Mbt^aB_6Ol4PZza0At~yQ$q>Pi$ipnZEM#Kt+V9C@6i{=Z_F)31ZA|N;@ zh$T{$EzK=_fBhy`Pd4+_W(~*6{WwwXP5w8V<};?d!k6yqP)<~7xOBLV-V5hxZfPM^ zs#OpKNf2fBJ<`L|QtonDnr$OD%Z65~B_kt)hK2^j=XPHgUvEv|vsausRyc!;TLb8? zi=cnkVy^AfaHf1N|9E*E2mk6#|M5@cn1;q?nITw$DcGX6yT|rE`Q^)(%j2WbXlQF| zlQ9FgZ_&9uoiFoU>8|jhXG<_=tAhF0oBnid@|W&IIrHWszF7GjA0{ejD-Pk-^-FSW zTYEc#CB|H^@0Wk}?)fV^9UL6+_V%Wuqk}tl24u+1YZo{wS$_DnXE?t#glq4F@xh9@ zED3y$xCPHro1@}XnHNnjPvAYhg65So=sWrm4BV6%f+d)O{m2A7JUj>p2%xmIl-`Sd zasvI|c5rO7ny!N1OVz76TNzAl_zR4)ABmk(L4=0`bxBXM$EaYpM!|ullR4M8QHuR9 zy?vKumS76@BNO<``a-fYGjVfsqo|}zN}`9$CqCtyEqYFGaOc~%L+RY;PyE73jI?k^ zTPA&{|4Gjd6K9KO(7Qc?t2;E5S>5rP?n0#RZ1(Tl!w(mZb8xeT56zF!y6kyQw$zYn zHRCzYTV@HSVBep>J==@C3MM4S#gJo5$7G5lG&}-pLM&@7Dh@1rfpf*v_^$Mie4OWEeND7I0vHEa@pR zES#qzI$#c#keQel&m&%~!tDD8w2Nl3z;hM`ZKSk2$Nqn}N;VmIZN;C-uqNDR;BZ~C z?6||t3OYW0oa%BjU$^^nv3rFyDp#ac@G5oN!b!In<&+Zi;aII!td=AabYX+m+a<b zD0L9ps3`pW{4hl8u*T{iiXSiVU$r`NzH>geFXc)Vd;pS!sOZ#D4f}S)k&zU|T-6*F zhXzYm5c51$OrA8E-;N(IUCvCM;)=~?Ll+r=IY#@?5gRK6yFP!K>!*_#=*{F--%_cr zY>s}ukawz0vTZRDYFu4i$ycdVjG8)iD$dT%D3wa2(-7i+US1xiXf5(I`^maspTYBx zY~3g!)!FJy&ygTm?tG`0Y-9B%Go`|=2Lz55fgLT6$-!N1E|Njg>!wk`kyaO)>UESn zB)C8XE5y9K_o)#>xrx|9u?~xdDWXd`)c@02?jg-@3nPY(hLI6bzS=-dV3>Nk-Y+o3 HcZTAB<3OZ_ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/legacy/ff_visible_online_theirs.tga b/indra/newview/skins/default/textures/legacy/ff_visible_online_theirs.tga new file mode 100644 index 0000000000000000000000000000000000000000..ba437149aa0e8a929d7ad5cf89e813202402b79a GIT binary patch literal 872 zcmXw%e@IhN6vwYVH!_P&`em$O18E>6L&GSga-cXC7P_4Mcv=#RHEVwq5iTA*eqT*@GkeA^ZlHA?zxAM)nvuw zL{5~eZUO+Q!6iN#jZ!X`i!LZAaI-3v${&Y2^weU!8W+mpa2%&7DoWFIzuWEhvVOmR zg2Ekova+%~s1UU*0!db@)vi{n{T`3!^WuCMzCJt;-iB=WbUhosIm;k2%>%|zgIbZ2 zB8qd! zOXH^XvOkA+$|IH>N$hlXLaZcn?fk~%qXW)8|AKQ(&u8Qc{8}4r78s zp$MP{n_{!sY7t!?F=T_og@8PA;c$3ON5`Y0%F4>ytjT0*jyIdlciP+A4R}ql5OS~4 f*j9seHDJ{%W+*z8SE4J{9Vpyhny=fRmrniz^z!zf literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 2e1c6c2d65..f0386c0918 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -391,6 +391,14 @@ with the same filename but different name + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/fs_floater_contacts.xml b/indra/newview/skins/default/xui/en/fs_floater_contacts.xml new file mode 100644 index 0000000000..fcbb04b494 --- /dev/null +++ b/indra/newview/skins/default/xui/en/fs_floater_contacts.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/fs_panel_contacts_friends.xml b/indra/newview/skins/default/xui/en/fs_panel_contacts_friends.xml new file mode 100644 index 0000000000..4e3829dbf3 --- /dev/null +++ b/indra/newview/skins/default/xui/en/fs_panel_contacts_friends.xml @@ -0,0 +1,73 @@ + + + +