FIRE-5096: Expand avatar search results by adding context menus with common avatar actions

Ansariel 2014-09-18 15:22:49 +02:00
parent 46cf172da9
commit 9008f2d051
32 changed files with 656 additions and 78 deletions

View File

@ -135,6 +135,8 @@ set(viewer_SOURCE_FILES
fsareasearch.cpp
fsareasearchlistctrl.cpp
fsareasearchmenu.cpp
fsavatarsearchlistctrl.cpp
fsavatarsearchmenu.cpp
fsblocklistctrl.cpp
fsblocklistmenu.cpp
fschathistory.cpp
@ -844,6 +846,8 @@ set(viewer_HEADER_FILES
fsareasearch.h
fsareasearchlistctrl.h
fsareasearchmenu.h
fsavatarsearchlistctrl.h
fsavatarsearchmenu.h
fsblocklistctrl.h
fsblocklistmenu.h
fschathistory.h

View File

@ -0,0 +1,69 @@
/**
* @file fsavatarsearchlistctrl.cpp
* @brief A avatar search-specific implementation of scrolllist
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2014 Ansariel Hiller
*
* 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 Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "fsavatarsearchlistctrl.h"
#include "llscrolllistitem.h"
static LLDefaultChildRegistry::Register<FSAvatarSearchListCtrl> r("fs_avatar_search_list");
FSAvatarSearchListCtrl::FSAvatarSearchListCtrl(const Params& p)
: FSScrollListCtrl(p)
{
}
BOOL FSAvatarSearchListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
if (mContextMenu)
{
std::vector<LLScrollListItem*> selected_items = getAllSelected();
if (selected_items.size() > 1)
{
uuid_vec_t selected_uuids;
for (std::vector<LLScrollListItem*>::iterator it = selected_items.begin(); it != selected_items.end(); ++it)
{
selected_uuids.push_back((*it)->getUUID());
}
mContextMenu->show(this, selected_uuids, x, y);
}
else
{
LLScrollListItem* hit_item = hitItem(x, y);
if (hit_item)
{
LLUUID val = hit_item->getValue();
selectByID(val);
uuid_vec_t selected_uuids;
selected_uuids.push_back(val);
mContextMenu->show(this, selected_uuids, x, y);
}
}
}
return handled;
}

View File

@ -0,0 +1,52 @@
/**
* @file fsavatarsearchlistctrl.h
* @brief A avatar search-specific implementation of scrolllist
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2014 Ansariel Hiller
*
* 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 Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#ifndef FS_AVATARSEARCHLISTCTRL_H
#define FS_AVATARSEARCHLISTCTRL_H
#include "fsscrolllistctrl.h"
class FSAvatarSearchListCtrl
: public FSScrollListCtrl, public LLInstanceTracker<FSAvatarSearchListCtrl>
{
public:
struct Params : public LLInitParam::Block<Params, FSScrollListCtrl::Params>
{
Params()
{}
};
BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
protected:
FSAvatarSearchListCtrl(const Params&);
virtual ~FSAvatarSearchListCtrl() {}
friend class LLUICtrlFactory;
};
#endif // FS_AVATARSEARCHLISTCTRL_H

View File

@ -0,0 +1,201 @@
/**
* @file fsavatarsearchmenu.cpp
* @brief Menu used by the avatar picker
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2014 Ansariel Hiller
*
* 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 Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "fsavatarsearchmenu.h"
#include "fsradar.h"
#include "llagent.h"
#include "llavataractions.h"
#include "llcallingcard.h"
#include "llfloaterreg.h"
#include "lluictrl.h"
#include "llviewermenu.h"
#include "rlvhandler.h"
FSAvatarSearchMenu gFSAvatarSearchMenu;
LLContextMenu* FSAvatarSearchMenu::createMenu()
{
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
if (mUUIDs.size() == 1)
{
// Set up for one person selected menu
const LLUUID& id = mUUIDs.front();
registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id));
registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id));
registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendDialog, id));
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
registrar.add("Avatar.OfferTeleport", boost::bind(&FSAvatarSearchMenu::offerTeleport, this));
registrar.add("Avatar.TeleportRequest", boost::bind(&LLAvatarActions::teleportRequest, id));
registrar.add("Avatar.GroupInvite", boost::bind(&LLAvatarActions::inviteToGroup, id));
registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id));
registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id));
registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id));
enable_registrar.add("Avatar.EnableItem", boost::bind(&FSAvatarSearchMenu::onContextMenuItemEnable, this, _2));
enable_registrar.add("Avatar.CheckItem", boost::bind(&FSAvatarSearchMenu::onContextMenuItemCheck, this, _2));
// create the context menu from the XUI
return createFromFile("menu_fs_avatar_search.xml");
}
else
{
// Set up for multi-selected People
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs, LLUUID::null));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs, LLUUID::null));
registrar.add("Avatar.OfferTeleport", boost::bind(&FSAvatarSearchMenu::offerTeleport, this));
registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
registrar.add("Avatar.AddToContactSet", boost::bind(&FSAvatarSearchMenu::addToContactSet, this));
enable_registrar.add("Avatar.EnableItem", boost::bind(&FSAvatarSearchMenu::onContextMenuItemEnable, this, _2));
// create the context menu from the XUI
return createFromFile("menu_fs_avatar_search_multiselect.xml");
}
}
bool FSAvatarSearchMenu::onContextMenuItemEnable(const LLSD& userdata)
{
std::string item = userdata.asString();
if (item == std::string("can_block"))
{
const LLUUID& id = mUUIDs.front();
return LLAvatarActions::canBlock(id);
}
else if (item == std::string("can_add"))
{
// We can add friends if:
// - there are selected people
// - and there are no friends among selection yet.
//EXT-7389 - disable for more than 1
if(mUUIDs.size() > 1)
{
return false;
}
bool result = (mUUIDs.size() > 0);
uuid_vec_t::const_iterator
id = mUUIDs.begin(),
uuids_end = mUUIDs.end();
for (;id != uuids_end; ++id)
{
if ( LLAvatarActions::isFriend(*id) )
{
result = false;
break;
}
}
return result;
}
else if (item == std::string("can_delete"))
{
// We can remove friends if:
// - there are selected people
// - and there are only friends among selection.
bool result = (mUUIDs.size() > 0);
uuid_vec_t::const_iterator
id = mUUIDs.begin(),
uuids_end = mUUIDs.end();
for (;id != uuids_end; ++id)
{
if ( !LLAvatarActions::isFriend(*id) )
{
result = false;
break;
}
}
return result;
}
else if (item == std::string("can_call"))
{
return LLAvatarActions::canCall();
}
else if (item == std::string("can_show_on_map"))
{
const LLUUID& id = mUUIDs.front();
return (LLAvatarTracker::instance().isBuddyOnline(id) && is_agent_mappable(id))
|| gAgent.isGodlike();
}
else if(item == std::string("can_offer_teleport"))
{
return LLAvatarActions::canOfferTeleport(mUUIDs);
}
else if(item == std::string("can_request_teleport"))
{
if (mUUIDs.size() == 1)
{
return LLAvatarActions::canRequestTeleport(mUUIDs.front());
}
return false;
}
else if (item == std::string("can_open_inventory"))
{
return (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWINV));
}
return false;
}
bool FSAvatarSearchMenu::onContextMenuItemCheck(const LLSD& userdata)
{
std::string item = userdata.asString();
const LLUUID& id = mUUIDs.front();
if (item == std::string("is_blocked"))
{
return LLAvatarActions::isBlocked(id);
}
return false;
}
void FSAvatarSearchMenu::offerTeleport()
{
LLAvatarActions::offerTeleport(mUUIDs);
}
void FSAvatarSearchMenu::addToContactSet()
{
LLAvatarActions::addToContactSet(mUUIDs);
}

View File

@ -0,0 +1,47 @@
/**
* @file fsavatarsearchmenu.h
* @brief Menu used by the avatar picker
*
* $LicenseInfo:firstyear=2014&license=viewerlgpl$
* Phoenix Firestorm Viewer Source Code
* Copyright (c) 2014 Ansariel Hiller
*
* 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 Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#ifndef FS_AVATARSEARCHMENU_H
#define FS_AVATARSEARCHMENU_H
#include "lllistcontextmenu.h"
class FSAvatarSearchMenu : public LLListContextMenu
{
public:
/*virtual*/ LLContextMenu* createMenu();
private:
bool onContextMenuItemEnable(const LLSD& userdata);
bool onContextMenuItemCheck(const LLSD& userdata);
void offerTeleport();
void addToContactSet();
};
extern FSAvatarSearchMenu gFSAvatarSearchMenu;
#endif // FS_AVATARSEARCHMENU_H

View File

@ -28,6 +28,8 @@
#include "llviewerprecompiledheaders.h"
#include "fsfloatersearch.h"
#include "fsavatarsearchlistctrl.h"
#include "fsavatarsearchmenu.h"
#include "lfsimfeaturehandler.h"
#include "llagent.h"
#include "llavatarname.h"
@ -734,7 +736,7 @@ FSPanelSearchPeople::~FSPanelSearchPeople()
BOOL FSPanelSearchPeople::postBuild()
{
mSearchComboBox = findChild<LLSearchComboBox>("people_edit");
mSearchResults = findChild<LLScrollListCtrl>("search_results_people");
mSearchResults = findChild<FSAvatarSearchListCtrl>("search_results_people");
if (mSearchComboBox)
{
mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchPeople::onBtnFind, this));
@ -745,6 +747,7 @@ BOOL FSPanelSearchPeople::postBuild()
mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchPeople::onSelectItem, this));
mSearchResults->setEnabled(FALSE);
mSearchResults->setCommentText(LLTrans::getString("no_results"));
mSearchResults->setContextMenu(&gFSAvatarSearchMenu);
}
childSetAction("people_next", boost::bind(&FSPanelSearchPeople::onBtnNext, this));

View File

@ -48,7 +48,7 @@ class LLGroupMgrObserver;
class LLSearchEditor;
class LLSearchComboBox;
class FSFloaterSearch;
class FSAvatarSearchListCtrl;
class FSPanelProfile;
struct SearchQuery : public LLInitParam::Block<SearchQuery>
@ -106,9 +106,9 @@ private:
LLSD mResultsContent;
LLUUID mQueryID;
FSFloaterSearch* mParent;
LLSearchComboBox* mSearchComboBox;
LLScrollListCtrl* mSearchResults;
FSFloaterSearch* mParent;
LLSearchComboBox* mSearchComboBox;
FSAvatarSearchListCtrl* mSearchResults;
};
class FSPanelSearchGroups : public FSSearchPanelBase

View File

@ -54,6 +54,7 @@ public:
protected:
FSScrollListCtrl(const Params&);
virtual ~FSScrollListCtrl() {};
friend class LLUICtrlFactory;
LLListContextMenu* mContextMenu;

View File

@ -59,6 +59,9 @@
//#include "llsdserialize.h"
#include "fsavatarsearchlistctrl.h"
#include "fsavatarsearchmenu.h"
//put it back as a member once the legacy path is out?
static std::map<LLUUID, LLAvatarName> sAvatarNameMap;
@ -129,16 +132,28 @@ BOOL LLFloaterAvatarPicker::postBuild()
childSetAction("Refresh", boost::bind(&LLFloaterAvatarPicker::onBtnRefresh, this));
getChild<LLUICtrl>("near_me_range")->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onRangeAdjust, this));
LLScrollListCtrl* searchresults = getChild<LLScrollListCtrl>("SearchResults");
// <FS:Ansariel> FIRE-5096: Add context menu for result lists
//LLScrollListCtrl* searchresults = getChild<LLScrollListCtrl>("SearchResults");
FSAvatarSearchListCtrl* searchresults = getChild<FSAvatarSearchListCtrl>("SearchResults");
searchresults->setContextMenu(&gFSAvatarSearchMenu);
// </FS:Ansariel>
searchresults->setDoubleClickCallback( boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
searchresults->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onList, this));
getChildView("SearchResults")->setEnabled(FALSE);
LLScrollListCtrl* nearme = getChild<LLScrollListCtrl>("NearMe");
// <FS:Ansariel> FIRE-5096: Add context menu for result lists
//LLScrollListCtrl* nearme = getChild<LLScrollListCtrl>("NearMe");
FSAvatarSearchListCtrl* nearme = getChild<FSAvatarSearchListCtrl>("NearMe");
nearme->setContextMenu(&gFSAvatarSearchMenu);
// </FS:Ansariel>
nearme->setDoubleClickCallback(boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
nearme->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onList, this));
LLScrollListCtrl* friends = getChild<LLScrollListCtrl>("Friends");
// <FS:Ansariel> FIRE-5096: Add context menu for result lists
//LLScrollListCtrl* friends = getChild<LLScrollListCtrl>("Friends");
FSAvatarSearchListCtrl* friends = getChild<FSAvatarSearchListCtrl>("Friends");
friends->setContextMenu(&gFSAvatarSearchMenu);
// </FS:Ansariel>
friends->setDoubleClickCallback(boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
getChild<LLUICtrl>("Friends")->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onList, this));
@ -165,7 +180,8 @@ BOOL LLFloaterAvatarPicker::postBuild()
childSetAction("FindUUID", boost::bind(&LLFloaterAvatarPicker::onBtnFindUUID, this));
getChildView("FindUUID")->setEnabled(FALSE);
LLScrollListCtrl* searchresultsuuid = getChild<LLScrollListCtrl>("SearchResultsUUID");
FSAvatarSearchListCtrl* searchresultsuuid = getChild<FSAvatarSearchListCtrl>("SearchResultsUUID");
searchresultsuuid->setContextMenu(&gFSAvatarSearchMenu);
searchresultsuuid->setDoubleClickCallback( boost::bind(&LLFloaterAvatarPicker::onBtnSelect, this));
searchresultsuuid->setCommitCallback(boost::bind(&LLFloaterAvatarPicker::onList, this));
searchresultsuuid->setEnabled(FALSE);

View File

@ -24,10 +24,10 @@
Indtast en del af beboerens navn:
</text>
<button label="Find" label_selected="Find" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Navn" name="name"/>
<columns label="Brugernavn" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Venner" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -43,10 +43,10 @@
meter
</text>
<button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh"/>
<scroll_list name="NearMe">
<fs_avatar_search_list name="NearMe">
<columns label="Navn" name="name"/>
<columns label="Brugernavn" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>

View File

@ -24,10 +24,10 @@
Geben Sie einen Teil des Namens einer Person ein:
</text>
<button label="Los" label_selected="Los" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Name" name="name"/>
<columns label="Benutzername" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Freunde" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -43,20 +43,20 @@
Meter
</text>
<button follows="top|left" height="28" image_overlay="Refresh_Off" layout="topleft" left_pad="0" name="Refresh" width="28"/>
<scroll_list border="false" follows="all" height="100" layout="topleft" left="0" name="NearMe" sort_column="0" top="50" width="132">
<fs_avatar_search_list border="false" follows="all" height="100" layout="topleft" left="0" name="NearMe" sort_column="0" top="50" width="132">
<columns label="Name" name="name"/>
<columns label="Benutzername" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Suchen per UUID" name="SearchPanelUUID">
<text name="SearchByUUIDLabel">
Geben Sie die UUID einer Person ein:
</text>
<button label="Los" label_selected="Los" name="FindUUID"/>
<scroll_list name="SearchResultsUUID">
<fs_avatar_search_list name="SearchResultsUUID">
<columns label="Name" name="nameUUID"/>
<columns label="Benutzername" name="usernameUUID"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Avatar Context Menu">
<menu_item_call label="Profil anzeigen" name="View Profile"/>
<menu_item_call label="Freund hinzufügen" name="Add Friend"/>
<menu_item_call label="Zu Kontakt-Set hinzufügen..." name="Add to Set"/>
<menu_item_call label="Freund entfernen" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Teilen" name="Share"/>
<menu_item_call label="Bezahlen" name="Pay"/>
<menu_item_call label="Teleport anbieten" name="teleport"/>
<menu_item_call label="Teleport anfordern" name="request_teleport"/>
<menu_item_call label="Gruppeneinladung schicken" name="GroupInvite"/>
<menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/>
</context_menu>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="Zu Kontakt-Set hinzufügen..." name="Add to Set"/>
<menu_item_call label="Freunde entfernen" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Teleport anbieten" name="teleport"/>
</context_menu>

View File

@ -7,10 +7,10 @@
</panel>
<!-- Search Pane -->
<panel name="panel_ls_scrolllist">
<scroll_list name="search_results_people">
<panel_fs_search_legacy_people name="search_results_people">
<columns label="" name="icon"/>
<columns label="Name" name="username"/>
</scroll_list>
</panel_fs_search_legacy_people>
<button label="Zurück" name="people_back"/>
<button label="Vor" name="people_next"/>
</panel>

View File

@ -84,7 +84,7 @@
left_pad="5"
name="Find"
width="45" />
<scroll_list
<fs_avatar_search_list
draw_heading="true"
follows="all"
height="98"
@ -101,7 +101,7 @@
label="Username"
name="username"
width="150" />
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel
height="150"
@ -136,7 +136,7 @@
<button.commit_callback
function="Refresh.FriendList"/>
</button>
<scroll_list
<fs_avatar_search_list
follows="all"
height="120"
layout="topleft"
@ -202,7 +202,7 @@
width="28"
name="Refresh"
image_overlay="Refresh_Off" />
<scroll_list
<fs_avatar_search_list
draw_heading="true"
follows="all"
height="100"
@ -220,7 +220,7 @@
label="Username"
name="username"
width="150" />
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel
@ -263,7 +263,7 @@
left_pad="5"
name="FindUUID"
width="45" />
<scroll_list
<fs_avatar_search_list
draw_heading="true"
follows="all"
height="98"
@ -280,7 +280,7 @@
label="Username"
name="usernameUUID"
width="150" />
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<context_menu
layout="topleft"
name="Avatar Context Menu">
<menu_item_call
label="View Profile"
layout="topleft"
name="View Profile">
<menu_item_call.on_click
function="Avatar.Profile" />
</menu_item_call>
<menu_item_call
label="Add Friend"
layout="topleft"
name="Add Friend">
<menu_item_call.on_click
function="Avatar.AddFriend" />
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_add" />
</menu_item_call>
<menu_item_call
label="Add to Set"
layout="topleft"
name="Add to Set">
<menu_item_call.on_click
function="Avatar.AddToContactSet" />
</menu_item_call>
<menu_item_call
label="Remove Friend"
layout="topleft"
name="Remove Friend">
<menu_item_call.on_click
function="Avatar.RemoveFriend" />
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_delete" />
</menu_item_call>
<menu_item_call
label="IM"
layout="topleft"
name="IM">
<menu_item_call.on_click
function="Avatar.IM" />
</menu_item_call>
<menu_item_call
label="Call"
layout="topleft"
name="Call">
<menu_item_call.on_click
function="Avatar.Call" />
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_call" />
</menu_item_call>
<menu_item_call
label="Share"
layout="topleft"
name="Share">
<menu_item_call.on_click
function="Avatar.Share" />
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_open_inventory" />
</menu_item_call>
<menu_item_call
label="Pay"
layout="topleft"
name="Pay">
<menu_item_call.on_click
function="Avatar.Pay" />
</menu_item_call>
<menu_item_call
label="Offer Teleport"
name="teleport">
<menu_item_call.on_click
function="Avatar.OfferTeleport"/>
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_offer_teleport"/>
</menu_item_call>
<menu_item_call
label="Request Teleport"
name="request_teleport">
<menu_item_call.on_click
function="Avatar.TeleportRequest"/>
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_request_teleport"/>
</menu_item_call>
<menu_item_call
label="Invite To Group"
name="GroupInvite">
<menu_item_call.on_click
function="Avatar.GroupInvite" />
</menu_item_call>
<menu_item_separator />
<menu_item_check
label="Block/Unblock"
layout="topleft"
name="Block/Unblock">
<menu_item_check.on_click
function="Avatar.BlockUnblock" />
<menu_item_check.on_check
function="Avatar.CheckItem"
parameter="is_blocked" />
<menu_item_check.on_enable
function="Avatar.EnableItem"
parameter="can_block" />
</menu_item_check>
</context_menu>

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<context_menu
layout="topleft"
name="Multi-Selected People Context Menu">
<menu_item_call
label="Add to Set"
layout="topleft"
name="Add to Set">
<menu_item_call.on_click
function="Avatar.AddToContactSet" />
</menu_item_call>
<menu_item_call
label="Remove Friends"
layout="topleft"
name="Remove Friend">
<menu_item_call.on_click
function="Avatar.RemoveFriend" />
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_delete" />
</menu_item_call>
<menu_item_call
label="IM"
layout="topleft"
name="IM">
<on_click
function="Avatar.IM" />
</menu_item_call>
<menu_item_call
enabled="false"
label="Call"
layout="topleft"
name="Call">
<on_click
function="Avatar.Call" />
<on_enable
function="Avatar.EnableItem"
parameter="can_call" />
</menu_item_call>
<menu_item_call
label="Offer Teleport"
name="teleport">
<menu_item_call.on_click
function="Avatar.OfferTeleport"/>
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_offer_teleport"/>
</menu_item_call>
</context_menu>

View File

@ -49,7 +49,7 @@
width="410"
top_pad="1"
name="panel_ls_scrolllist">
<scroll_list
<fs_avatar_search_list
draw_heading="true"
follows="all"
height="485"
@ -66,7 +66,7 @@
label="Name"
name="username"
relwidth="1" />
</scroll_list>
</fs_avatar_search_list>
<button
layout="topleft"
follows="left|bottom"

View File

@ -24,10 +24,10 @@
Escribe parte del nombre del residente:
</text>
<button label="Busca" label_selected="Busca" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Nombre" name="name"/>
<columns label="Nombre de usuario" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Amigos" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -43,10 +43,10 @@
Metros
</text>
<button font="SansSerifSmall" label="Actualizar la lista" label_selected="Actualizar la lista" left_delta="1" name="Refresh" width="115"/>
<scroll_list bottom_delta="-169" height="159" name="NearMe">
<fs_avatar_search_list bottom_delta="-169" height="159" name="NearMe">
<columns label="Nombre" name="name"/>
<columns label="Nombre de usuario" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="Aceptar" label_selected="Aceptar" name="ok_btn"/>

View File

@ -6,9 +6,9 @@
</text>
</panel>
<panel name="panel_ls_scrolllist">
<scroll_list name="search_results_people">
<panel_fs_search_legacy_people name="search_results_people">
<columns label="Nombre" name="username"/>
</scroll_list>
</panel_fs_search_legacy_people>
<button label="Anterior" name="people_back"/>
<button label="Siguiente" name="people_next"/>
</panel>

View File

@ -24,10 +24,10 @@
Saisissez une partie du nom du résident :
</text>
<button label="OK" label_selected="OK" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Nom" name="name"/>
<columns label="Nom d&apos;utilisateur" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Amis" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -43,10 +43,10 @@
mètres
</text>
<button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/>
<scroll_list bottom_delta="-169" height="159" name="NearMe">
<fs_avatar_search_list bottom_delta="-169" height="159" name="NearMe">
<columns label="Nom" name="name"/>
<columns label="Nom d&apos;utilisateur" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>

View File

@ -24,10 +24,10 @@
Comincia a digitare il nome della persona:
</text>
<button label="Vai" label_selected="Vai" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Nome" name="name"/>
<columns label="Nome utente" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Amici" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -43,10 +43,10 @@
Metri
</text>
<button font="SansSerifSmall" label="Aggiorna la lista" label_selected="Aggiorna l&apos;elenco" left_delta="6" name="Refresh" width="110"/>
<scroll_list bottom_delta="-169" height="159" name="NearMe">
<fs_avatar_search_list bottom_delta="-169" height="159" name="NearMe">
<columns label="Nome" name="name"/>
<columns label="Nome utente" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>

View File

@ -24,10 +24,10 @@
名前の一部を入力:
</text>
<button label="検索" label_selected="検索" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="名前" name="name"/>
<columns label="ユーザー名" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="フレンド" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -43,10 +43,10 @@
メートル
</text>
<button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
<scroll_list name="NearMe">
<fs_avatar_search_list name="NearMe">
<columns label="名前" name="name"/>
<columns label="ユーザー名" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>

View File

@ -10,10 +10,10 @@
<!-- Search Pane -->
<panel name="panel_ls_scrolllist">
<scroll_list name="search_results_people">
<panel_fs_search_legacy_people name="search_results_people">
<columns label="" name="icon" />
<columns label="名前" name="username" />
</scroll_list>
</panel_fs_search_legacy_people>
<button label="戻る" name="people_back" />
<button label="次へ" name="people_next" />
</panel>

View File

@ -24,10 +24,10 @@
Wpisz fragment imienia:
</text>
<button label="Szukaj" label_selected="Szukaj" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Imię" name="name"/>
<columns label="Nazwa użytkownika" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Znajomi" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -42,20 +42,20 @@
<text name="meters">
Metry
</text>
<scroll_list name="NearMe">
<fs_avatar_search_list name="NearMe">
<columns label="Imię" name="name"/>
<columns label="Nazwa użytkownika" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Szukaj po UUID" name="SearchPanelUUID">
<text name="SearchByUUIDLabel">
Wpisz UUID osoby:
</text>
<button label="Szukaj" label_selected="Szukaj" name="FindUUID" />
<scroll_list name="SearchResultsUUID">
<fs_avatar_search_list name="SearchResultsUUID">
<columns label="Imię" name="nameUUID" />
<columns label="Nazwa użytkownika" name="usernameUUID" />
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>

View File

@ -6,9 +6,9 @@
</text>
</panel>
<panel name="panel_ls_scrolllist">
<scroll_list name="search_results_people">
<panel_fs_search_legacy_people name="search_results_people">
<columns label="Imię" name="username" />
</scroll_list>
</panel_fs_search_legacy_people>
<button label="Wstecz" name="people_back" />
<button label="Dalej" name="people_next" />
</panel>

View File

@ -24,10 +24,10 @@
Digite parte do nome de alguém:
</text>
<button label="OK" label_selected="OK" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Nome" name="name"/>
<columns label="Nome de usuário" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Amigos" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -43,10 +43,10 @@
Metros
</text>
<button font="SansSerifSmall" label="Atualizar Lista" label_selected="Atualizar Lista" left_delta="1" name="Refresh" width="115"/>
<scroll_list bottom_delta="-169" height="159" name="NearMe">
<fs_avatar_search_list bottom_delta="-169" height="159" name="NearMe">
<columns label="Nome" name="name"/>
<columns label="Nome de usuário" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>

View File

@ -24,10 +24,10 @@
Наберите часть имени жителя:
</text>
<button label="Перейти" label_selected="Перейти" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Название" name="name"/>
<columns label="Имя пользователя" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Друзья" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -42,10 +42,10 @@
<text name="meters">
Метров
</text>
<scroll_list name="NearMe">
<fs_avatar_search_list name="NearMe">
<columns label="Название" name="name"/>
<columns label="Имя пользователя" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="ОК" label_selected="ОК" name="ok_btn"/>

View File

@ -24,10 +24,10 @@
Bir kişinin adının bir kısmını yazın:
</text>
<button label="Git" label_selected="Git" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="Ad" name="name"/>
<columns label="Kullanıcı Adı" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="Arkadaşlar" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -42,10 +42,10 @@
<text name="meters">
Metre
</text>
<scroll_list name="NearMe">
<fs_avatar_search_list name="NearMe">
<columns label="Ad" name="name"/>
<columns label="Kullanıcı Adı" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="Tamam" label_selected="Tamam" name="ok_btn"/>

View File

@ -24,10 +24,10 @@
鍵入人名的一部分:
</text>
<button label="前往" label_selected="前往" name="Find"/>
<scroll_list name="SearchResults">
<fs_avatar_search_list name="SearchResults">
<columns label="名稱" name="name"/>
<columns label="使用者名稱" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
<panel label="朋友" name="FriendsPanel">
<text name="InstructSelectFriend">
@ -42,10 +42,10 @@
<text name="meters">
公尺
</text>
<scroll_list name="NearMe">
<fs_avatar_search_list name="NearMe">
<columns label="名稱" name="name"/>
<columns label="使用者名稱" name="username"/>
</scroll_list>
</fs_avatar_search_list>
</panel>
</tab_container>
<button label="確定" label_selected="確定" name="ok_btn"/>

View File

@ -54,7 +54,7 @@
layout="topleft"
border="true"
>
<scroll_list
<panel_fs_search_legacy_people
name="search_results_people"
top="0"
left="0"
@ -74,7 +74,7 @@
label="Name"
relwidth="1"
/>
</scroll_list>
</panel_fs_search_legacy_people>
<button
name="people_back"
label="Back"

View File

@ -6,9 +6,9 @@
</text>
</panel>
<panel name="panel_ls_scrolllist">
<scroll_list name="search_results_people">
<panel_fs_search_legacy_people name="search_results_people">
<columns label="Imię" name="username" />
</scroll_list>
</panel_fs_search_legacy_people>
<button label="Wstecz" name="people_back" />
<button label="Dalej" name="people_next" />
</panel>