FIRE-596: Make the radar a standalone floater

master
Ansariel 2013-04-16 12:08:35 +02:00
parent aa0d4f442f
commit fda3891887
42 changed files with 3851 additions and 1589 deletions

View File

@ -135,6 +135,7 @@ set(viewer_SOURCE_FILES
fsfloaterplacedetails.cpp
fsfloaterposestand.cpp
fsfloaterprofile.cpp
fsfloaterradar.cpp
fsfloatersearch.cpp
fsfloaterteleporthistory.cpp
fsfloatervoicecontrols.cpp
@ -157,7 +158,9 @@ set(viewer_SOURCE_FILES
fspanelprofile.cpp
fspanelprofileclassifieds.cpp
fspose.cpp
fsradar.cpp
fsradarlistctrl.cpp
fsradarmenu.cpp
fsslurlcommand.cpp
fswsassetblacklist.cpp
groupchatlistener.cpp
@ -796,6 +799,7 @@ set(viewer_HEADER_FILES
fsfloaterplacedetails.h
fsfloaterposestand.h
fsfloaterprofile.h
fsfloaterradar.h
fsfloatersearch.h
fsfloaterteleporthistory.h
fsfloatervoicecontrols.h
@ -819,7 +823,9 @@ set(viewer_HEADER_FILES
fspanelprofile.h
fspanelprofileclassifieds.h
fspose.h
fsradar.h
fsradarlistctrl.h
fsradarmenu.h
fsslurl.h
fsslurlcommand.h
fswsassetblacklist.h

View File

@ -465,4 +465,14 @@
tooltip_ref="Command_Snapshot_To_Disk_Tooltip"
execute_function="File.TakeSnapshotToDisk"
/>
<command name="radar"
available_in_toybox="true"
icon="radar"
label_ref="Command_Radar_Label"
tooltip_ref="Command_Radar_Tooltip"
execute_function="Floater.Toggle"
execute_parameters="fs_radar"
is_running_function="Floater.IsOpen"
is_running_parameters="fs_radar"
/>
</commands>

View File

@ -35,6 +35,7 @@
#include "aoengine.h"
#include "fscommon.h"
#include "fsradar.h"
#include "llagent.h"
#include "llagentcamera.h"
#include "llavatarlist.h"
@ -47,7 +48,6 @@
#include "llfloatersidepanelcontainer.h"
#include "llinventorymodel.h"
#include "llnotificationmanager.h"
#include "llpanelpeople.h"
#include "llparcel.h"
#include "lltooldraganddrop.h"
#include "lltrans.h"
@ -1169,11 +1169,11 @@ LLUUID cmdline_partial_name2key(std::string partial_name)
std::string av_name;
LLStringUtil::toLower(partial_name);
LLPanelPeople* panel_people = getPeoplePanel();
if (panel_people)
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
std::vector<LLPanel*> items;
LLAvatarList* nearbyList = panel_people->getNearbyList();
LLAvatarList* nearbyList = radar->getNearbyList();
nearbyList->getItems(items);
for (std::vector<LLPanel*>::const_iterator itItem = items.begin(); itItem != items.end(); ++itItem)
@ -1195,10 +1195,10 @@ LLUUID cmdline_partial_name2key(std::string partial_name)
void cmdline_tp2name(std::string target)
{
LLUUID avkey = cmdline_partial_name2key(target);
LLPanelPeople* panel_people = getPeoplePanel();
if (avkey.notNull() && panel_people)
FSRadar* radar = FSRadar::getInstance();
if (avkey.notNull() && radar)
{
LLAvatarListItem* avatar_list_item = panel_people->getNearbyList()->getAvatarListItem(avkey);
LLAvatarListItem* avatar_list_item = radar->getNearbyList()->getAvatarListItem(avkey);
if (avatar_list_item)
{
LLVector3d pos = avatar_list_item->getPosition();

View File

@ -0,0 +1,473 @@
/**
* @file fsfloaterradar.cpp
* @brief Firestorm radar floater implementation
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Copyright (c) 2013 Ansariel Hiller @ Second Life
*
* 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 "fsfloaterradar.h"
// libs
#include "llfloaterreg.h"
#include "lllayoutstack.h"
#include "llmenugl.h"
#include "llnotificationsutil.h"
#include "lleventtimer.h"
#include "llfiltereditor.h"
#include "lluictrlfactory.h"
#include "llmenubutton.h"
#include "lltoggleablemenu.h"
// newview
#include "fsradarmenu.h"
#include "llavataractions.h"
#include "llfloatersidepanelcontainer.h"
#include "llnetmap.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewermenu.h" // for gMenuHolder
#include "llvoiceclient.h"
#include "rlvhandler.h"
/**
* Update buttons on changes in our friend relations (STORM-557).
*/
class FSButtonsUpdater : public FSRadar::Updater, public LLFriendObserver
{
public:
FSButtonsUpdater(callback_t cb)
: FSRadar::Updater(cb)
{
LLAvatarTracker::instance().addObserver(this);
}
~FSButtonsUpdater()
{
LLAvatarTracker::instance().removeObserver(this);
}
/*virtual*/ void changed(U32 mask)
{
(void) mask;
update();
}
};
//=============================================================================
FSFloaterRadar::FSFloaterRadar(const LLSD& key)
: LLFloater(key),
mFilterSubString(LLStringUtil::null),
mFilterSubStringOrig(LLStringUtil::null),
mFilterEditor(NULL),
mRadarGearButton(NULL),
mMiniMap(NULL),
mRadarList(NULL)
{
mButtonsUpdater = new FSButtonsUpdater(boost::bind(&FSFloaterRadar::updateButtons, this));
mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&FSFloaterRadar::onAddFriendButtonClicked, this));
}
FSFloaterRadar::~FSFloaterRadar()
{
mUpdateSignalConnection.disconnect();
delete mButtonsUpdater;
if(LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->removeObserver(this);
}
if (mRadarGearMenuHandle.get()) mRadarGearMenuHandle.get()->die();
}
BOOL FSFloaterRadar::postBuild()
{
mFilterEditor = getChild<LLFilterEditor>("filter_input");
mFilterEditor->setCommitCallback(boost::bind(&FSFloaterRadar::onFilterEdit, this, _2));
// AO: radarlist takes over for nearbylist for presentation.
mRadarList = getChild<FSRadarListCtrl>("radar_list");
mRadarList->sortByColumn("range", TRUE); // sort by range
mRadarList->setFilterColumn(0);
mRadarList->setContextMenu(&FSFloaterRadarMenu::gFSRadarMenu);
mRadarList->setDoubleClickCallback(boost::bind(&FSFloaterRadar::onRadarListDoubleClicked, this));
mRadarList->setCommitCallback(boost::bind(&FSFloaterRadar::onRadarListCommitted, this));
mMiniMap = getChild<LLNetMap>("Net Map");
buttonSetAction("view_profile_btn", boost::bind(&FSFloaterRadar::onViewProfileButtonClicked, this));
buttonSetAction("im_btn", boost::bind(&FSFloaterRadar::onImButtonClicked, this));
buttonSetAction("call_btn", boost::bind(&FSFloaterRadar::onCallButtonClicked, this));
buttonSetAction("teleport_btn", boost::bind(&FSFloaterRadar::onTeleportButtonClicked, this));
buttonSetAction("share_btn", boost::bind(&FSFloaterRadar::onShareButtonClicked, this));
// Create menus.
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
registrar.add("Radar.Gear.Action", boost::bind(&FSFloaterRadar::onGearMenuItemClicked, this, _2));
registrar.add("Radar.NameFmt", boost::bind(&FSRadar::onRadarNameFmtClicked, _2));
registrar.add("Radar.ReportTo", boost::bind(&FSRadar::onRadarReportToClicked, _2));
enable_registrar.add("Radar.NameFmtCheck", boost::bind(&FSRadar::radarNameFmtCheck, _2));
enable_registrar.add("Radar.ReportToCheck", boost::bind(&FSRadar::radarReportToCheck, _2));
mRadarGearButton = getChild<LLMenuButton>("nearby_view_sort_btn");
LLToggleableMenu* radar_gear = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_fs_radar_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (radar_gear)
{
mRadarGearMenuHandle = radar_gear->getHandle();
mRadarGearButton->setMenu(radar_gear);
}
LLVoiceClient::getInstance()->addObserver(this);
// Register for radar updates
mUpdateSignalConnection = FSRadar::getInstance()->setUpdateCallback(boost::bind(&FSFloaterRadar::updateNearby, this, _1, _2));
// call this method in case some list is empty and buttons can be in inconsistent state
updateButtons();
return TRUE;
}
// virtual
void FSFloaterRadar::onOpen(const LLSD& key)
{
// Fill radar with most recent data so we don't have a blank window until next radar update
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
std::vector<LLSD> entries;
LLSD stats;
radar->getCurrentData(entries, stats);
updateNearby(entries, stats);
}
LLFloater::onOpen(key);
}
// virtual
void FSFloaterRadar::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
if (status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
{
return;
}
updateButtons();
}
void FSFloaterRadar::buttonSetEnabled(const std::string& btn_name, bool enabled)
{
// To make sure we're referencing the right widget (a child of the button bar).
LLButton* button = getChild<LLView>("button_bar")->getChild<LLButton>(btn_name);
button->setEnabled(enabled);
}
void FSFloaterRadar::buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb)
{
// To make sure we're referencing the right widget (a child of the button bar).
LLButton* button = getChild<LLView>("button_bar")->getChild<LLButton>(btn_name);
button->setClickedCallback(cb);
}
void FSFloaterRadar::updateButtons()
{
LLUUID selected_id;
uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
bool item_selected = (selected_uuids.size() == 1);
bool multiple_selected = (selected_uuids.size() >= 1);
// Check whether selected avatar is our friend.
bool is_friend = true;
if (item_selected)
{
selected_id = selected_uuids.front();
is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;
}
getChildView("add_friend_btn_nearby")->setEnabled(!is_friend && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
bool enable_calls = LLVoiceClient::getInstance()->isVoiceWorking() && LLVoiceClient::getInstance()->voiceEnabled();
// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a) | Modified: RLVa-1.2.0d
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
item_selected = multiple_selected = false;
}
// [/RLBa:KB]
buttonSetEnabled("view_profile_btn",item_selected);
buttonSetEnabled("share_btn", item_selected);
buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection
buttonSetEnabled("call_btn", multiple_selected && enable_calls);
buttonSetEnabled("teleport_btn", multiple_selected /* && LLAvatarActions::canOfferTeleport(selected_uuids) */ ); // LO - Dont block the TP button at all.
}
LLUUID FSFloaterRadar::getCurrentItemID() const
{
LLScrollListItem* item = mRadarList->getFirstSelected();
if (item)
{
return item->getColumn(mRadarList->getColumn("uuid")->mIndex)->getValue().asUUID();
}
return LLUUID::null;
}
void FSFloaterRadar::getCurrentItemIDs(uuid_vec_t& selected_uuids) const
{
for (size_t i = 0; i < mRadarList->getAllSelected().size(); ++i)
{
selected_uuids.push_back(mRadarList->getAllSelected().at(i)->getColumn(mRadarList->getColumn("uuid")->mIndex)->getValue().asUUID());
}
}
void FSFloaterRadar::onFilterEdit(const std::string& search_string)
{
mFilterSubStringOrig = search_string;
LLStringUtil::trimHead(mFilterSubStringOrig);
// Searches are case-insensitive
std::string search_upper = mFilterSubStringOrig;
LLStringUtil::toUpper(search_upper);
if (mFilterSubString == search_upper)
{
return;
}
mFilterSubString = search_upper;
// Apply new filter.
mRadarList->setFilterString(mFilterSubStringOrig);
}
void FSFloaterRadar::onRadarListDoubleClicked()
{
LLScrollListItem* item = mRadarList->getFirstSelected();
if (!item)
{
return;
}
LLUUID clicked_id = item->getColumn(mRadarList->getColumn("uuid")->mIndex)->getValue().asUUID();
std::string name = item->getColumn(mRadarList->getColumn("name")->mIndex)->getValue().asString();
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
radar->zoomAvatar(clicked_id, name);
}
}
void FSFloaterRadar::onRadarListCommitted()
{
uuid_vec_t selected_uuids;
LLUUID sVal = mRadarList->getSelectedValue().asUUID();
if (sVal.notNull())
{
selected_uuids.push_back(sVal);
mMiniMap->setSelected(selected_uuids);
}
updateButtons();
}
void FSFloaterRadar::onViewProfileButtonClicked()
{
LLUUID id = getCurrentItemID();
LLAvatarActions::showProfile(id);
}
void FSFloaterRadar::onAddFriendButtonClicked()
{
LLUUID id = getCurrentItemID();
if (id.notNull())
{
LLAvatarActions::requestFriendshipDialog(id);
}
}
void FSFloaterRadar::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 FSFloaterRadar::onCallButtonClicked()
{
uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
if (selected_uuids.size() == 1)
{
// initiate a P2P voice chat with the selected user
LLAvatarActions::startCall(getCurrentItemID());
}
else if (selected_uuids.size() > 1)
{
// initiate an ad-hoc voice chat with multiple users
LLAvatarActions::startAdhocCall(selected_uuids);
}
}
void FSFloaterRadar::onTeleportButtonClicked()
{
uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
LLAvatarActions::offerTeleport(LLAvatarActions::canOfferTeleport(selected_uuids));
}
void FSFloaterRadar::onShareButtonClicked()
{
LLAvatarActions::share(getCurrentItemID());
}
void FSFloaterRadar::onGearMenuItemClicked(const LLSD& userdata)
{
std::string chosen_item = userdata.asString();
if (chosen_item == "panel_block_list_sidetray")
{
if (gSavedSettings.getBOOL("FSUseStandaloneBlocklistFloater"))
{
LLFloaterReg::showInstance("fs_blocklist", LLSD());
}
else
{
LLFloaterSidePanelContainer::showPanel("people", "panel_block_list_sidetray", LLSD());
}
}
}
void FSFloaterRadar::updateNearby(const std::vector<LLSD>& entries, const LLSD& stats)
{
if (!getVisible())
{
return;
}
if (!mRadarList)
{
return;
}
// Store current selection and scroll position
static S32 uuidColumnIndex = mRadarList->getColumn("uuid")->mIndex;
std::vector<LLScrollListItem*> selected_items = mRadarList->getAllSelected();
uuid_vec_t selected_ids;
for (size_t i = 0; i < selected_items.size(); i++)
{
selected_ids.push_back(selected_items.at(i)->getColumn(uuidColumnIndex)->getValue().asUUID());
}
S32 lastScroll = mRadarList->getScrollPos();
// Update list
mRadarList->clearRows();
const std::vector<LLSD>::const_iterator it_end = entries.end();
for (std::vector<LLSD>::const_iterator it = entries.begin(); it != it_end; ++it)
{
LLSD entry = (*it)["entry"];
LLSD options = (*it)["options"];
LLSD row_data;
row_data["value"] = entry["id"];
row_data["columns"][0]["column"] = "name";
row_data["columns"][0]["value"] = entry["name"];
row_data["columns"][1]["column"] = "voice_level";
row_data["columns"][1]["type"] = "icon";
row_data["columns"][1]["value"] = ""; // Need to set it after the row has been created because it's to big for the row
row_data["columns"][2]["column"] = "in_region";
row_data["columns"][2]["type"] = "icon";
row_data["columns"][2]["value"] = (entry["in_region"].asBoolean() ? "avatar_in_region" : "");
row_data["columns"][3]["column"] = "flags";
row_data["columns"][3]["value"] = entry["flags"];
row_data["columns"][4]["column"] = "age";
row_data["columns"][4]["value"] = entry["age"];
row_data["columns"][5]["column"] = "seen";
row_data["columns"][5]["value"] = entry["seen"];
row_data["columns"][6]["column"] = "range";
row_data["columns"][6]["value"] = entry["range"];
row_data["columns"][7]["column"] = "uuid"; // invisible column for referencing av-key the row belongs to
row_data["columns"][7]["value"] = entry["id"];
LLScrollListItem* row = mRadarList->addElement(row_data);
static S32 rangeColumnIndex = mRadarList->getColumn("range")->mIndex;
static S32 nameColumnIndex = mRadarList->getColumn("name")->mIndex;
static S32 voiceLevelColumnIndex = mRadarList->getColumn("voice_level")->mIndex;
LLScrollListText* radarRangeCell = (LLScrollListText*)row->getColumn(rangeColumnIndex);
radarRangeCell->setColor(LLColor4(options["range_color"]));
radarRangeCell->setFontStyle(options["range_style"].asInteger());
LLScrollListText* radarNameCell = (LLScrollListText*)row->getColumn(nameColumnIndex);
radarNameCell->setFontStyle(options["name_style"].asInteger());
if (options.has("name_color"))
{
radarNameCell->setColor(LLColor4(options["name_color"]));
}
LLScrollListText* voiceLevelCell = (LLScrollListText*)row->getColumn(voiceLevelColumnIndex);
if (entry.has("voice_level_icon"))
{
voiceLevelCell->setValue(entry["voice_level_icon"].asString());
}
}
LLStringUtil::format_map_t name_count_args;
name_count_args["[TOTAL]"] = stats["total"].asString();
name_count_args["[IN_REGION]"] = stats["region"].asString();
name_count_args["[IN_CHAT_RANGE]"] = stats["chatrange"].asString();
LLScrollListColumn* column = mRadarList->getColumn("name");
column->mHeader->setLabel(getString("avatar_name_count", name_count_args));
column->mHeader->setToolTipArgs(name_count_args);
// Restore scroll position
mRadarList->setScrollPos(lastScroll);
// Restore selection list
if (!selected_ids.empty())
{
mRadarList->selectMultiple(selected_ids);
}
updateButtons();
}

View File

@ -0,0 +1,98 @@
/**
* @file fsfloaterradar.h
* @brief Firestorm radar floater implementation
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Copyright (c) 2013 Ansariel Hiller @ Second Life
*
* 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_FLOATERRADAR_H
#define FS_FLOATERRADAR_H
#include "llfloater.h"
#include "fsradar.h"
#include "fsradarlistctrl.h"
#include "llcallingcard.h" // for avatar tracker
#include "llvoiceclient.h"
class LLFilterEditor;
class LLMenuButton;
class FSFloaterRadar
: public LLFloater
, public LLVoiceClientStatusObserver
{
LOG_CLASS(FSFloaterRadar);
public:
FSFloaterRadar(const LLSD &);
virtual ~FSFloaterRadar();
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
// Implements LLVoiceClientStatusObserver::onChange() to enable call buttons
// when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
static void onRadarNameFmtClicked(const LLSD& userdata);
static bool radarNameFmtCheck(const LLSD& userdata);
static void onRadarReportToClicked(const LLSD& userdata);
static bool radarReportToCheck(const LLSD& userdata);
void updateNearby(const std::vector<LLSD>& entries, const LLSD& stats);
private:
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);
// UI callbacks
void onFilterEdit(const std::string& search_string);
void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
void onImButtonClicked();
void onCallButtonClicked();
void onTeleportButtonClicked();
void onShareButtonClicked();
void onRadarListCommitted();
void onRadarListDoubleClicked();
void onGearMenuItemClicked(const LLSD& userdata);
LLFilterEditor* mFilterEditor;
FSRadarListCtrl* mRadarList;
LLNetMap* mMiniMap;
LLHandle<LLView> mRadarGearMenuHandle;
FSRadar::Updater* mButtonsUpdater;
LLMenuButton* mRadarGearButton;
std::string mFilterSubString;
std::string mFilterSubStringOrig;
boost::signals2::connection mUpdateSignalConnection;
};
#endif // FS_FLOATERRADAR_H

View File

@ -33,7 +33,7 @@
#include "fslslbridge.h"
#include <string>
#include <boost/tokenizer.hpp> // for radar
#include "llpanelpeople.h"
#include "fsradar.h"
#include "llavatarlist.h"
#include "llavatarlistitem.h"
@ -93,10 +93,10 @@ FSLSLBridgeRequestRadarPosResponder::FSLSLBridgeRequestRadarPosResponder()
}
void FSLSLBridgeRequestRadarPosResponder::result(const LLSD& content)
{
LLPanelPeople* panel_people = getPeoplePanel();
if (panel_people)
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
LLAvatarList* nearbyList = panel_people->getNearbyList();
LLAvatarList* nearbyList = radar->getNearbyList();
std::string strContent = content.asString();
//llinfos << "Got info: " << strContent << llendl;

1053
indra/newview/fsradar.cpp Normal file

File diff suppressed because it is too large Load Diff

143
indra/newview/fsradar.h Normal file
View File

@ -0,0 +1,143 @@
/**
* @file fsradar.h
* @brief Firestorm radar implementation
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Copyright (c) 2013 Ansariel Hiller @ Second Life
*
* 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_RADAR_H
#define FS_RADAR_H
#include "llsingleton.h"
class LLAvatarList;
class LLAvatarName;
const U32 FSRADAR_MAX_AVATARS_PER_ALERT = 6; // maximum number of UUIDs we can cram into a single channel radar alert message
const U32 FSRADAR_COARSE_OFFSET_INTERVAL = 7; // seconds after which we query the bridge for a coarse location adjustment
const U32 FSRADAR_MAX_OFFSET_REQUESTS = 60; // 2048 / UUID size, leaving overhead space
const U32 FSRADAR_CHAT_MIN_SPACING = 6; // minimum delay between radar chat messages
const U32 FSRADAR_NAMEFORMAT_DISPLAYNAME = 0;
const U32 FSRADAR_NAMEFORMAT_USERNAME = 1;
const U32 FSRADAR_NAMEFORMAT_DISPLAYNAME_USERNAME = 2;
const U32 FSRADAR_NAMEFORMAT_USERNAME_DISPLAYNAME = 3;
class FSRadar
: public LLSingleton<FSRadar>
{
LOG_CLASS(FSRadar);
friend class LLSingleton<FSRadar>;
public:
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
LLAvatarList* getNearbyList() { return mNearbyList; }
// [/RLVa:KB]
void startTracking(const LLUUID& avatar_id);
void zoomAvatar(const LLUUID& avatar_id, const std::string& name);
void teleportToAvatar(const LLUUID& targetAv);
void requestRadarChannelAlertSync();
static void onRadarNameFmtClicked(const LLSD& userdata);
static bool radarNameFmtCheck(const LLSD& userdata);
static void onRadarReportToClicked(const LLSD& userdata);
static bool radarReportToCheck(const LLSD& userdata);
void getCurrentData(std::vector<LLSD>& entries, LLSD& stats) const { entries = mRadarEntriesData; stats = mAvatarStats; }
// internals
class Updater
{
public:
typedef boost::function<void()> callback_t;
Updater(callback_t cb)
: mCallback(cb)
{ }
virtual ~Updater()
{ }
protected:
void update()
{
mCallback();
}
callback_t mCallback;
};
typedef boost::signals2::signal<void(const std::vector<LLSD>& entries, const LLSD& stats)> radar_update_callback_t;
boost::signals2::connection setUpdateCallback(const radar_update_callback_t::slot_type& cb)
{
return mUpdateSignal.connect(cb);
}
private:
FSRadar();
virtual ~FSRadar();
void updateRadarList();
void updateTracking();
void checkTracking();
std::string getRadarName(const LLUUID& avId);
std::string getRadarName(const LLAvatarName& avName);
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, const std::string& postMsg);
LLAvatarList* mNearbyList;
Updater* mRadarListUpdater;
struct radarFields
{
std::string avName;
F32 lastDistance;
LLVector3d lastGlobalPos;
LLUUID lastRegion;
time_t firstSeen;
S32 lastStatus;
U32 ZOffset;
time_t lastZOffsetTime;
};
std::multimap < LLUUID, radarFields > lastRadarSweep;
std::vector <LLUUID> mRadarEnterAlerts;
std::vector <LLUUID> mRadarLeaveAlerts;
std::vector <LLUUID> mRadarOffsetRequests;
std::vector <LLSD> mRadarEntriesData;
S32 mRadarFrameCount;
bool mRadarAlertRequest;
F32 mRadarLastRequestTime;
U32 mRadarLastBulkOffsetRequestTime;
LLUUID mTrackedAvatarId;
LLSD mAvatarStats;
radar_update_callback_t mUpdateSignal;
};
#endif // FS_RADAR_H

View File

@ -0,0 +1,250 @@
/**
* @file fsradarmenu.cpp
* @brief Menu used by Firestorm radar
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (c) 2013 Ansariel Hiller @ Second Life
*
* 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"
// libs
#include "llmenugl.h"
#include "lluictrlfactory.h"
#include "fsradarmenu.h"
// newview
#include "fsradar.h"
#include "llagent.h"
#include "llagentdata.h" // for gAgentID
#include "llavataractions.h"
#include "llcallingcard.h" // for LLAvatarTracker
#include "llviewermenu.h" // for gMenuHolder
namespace FSFloaterRadarMenu
{
FSRadarMenu gFSRadarMenu;
//== NearbyMenu ===============================================================
LLContextMenu* FSRadarMenu::createMenu()
{
// set up the callbacks for all of the avatar menu items
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(&FSRadarMenu::offerTeleport, this));
registrar.add("Avatar.GroupInvite", boost::bind(&LLAvatarActions::inviteToGroup, id));
registrar.add("Avatar.getScriptInfo", boost::bind(&LLAvatarActions::getScriptInfo, id));
registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::showOnMap, 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));
registrar.add("Avatar.ZoomIn", boost::bind(&LLAvatarActions::zoomIn, id));
registrar.add("Avatar.Report", boost::bind(&LLAvatarActions::report, id));
registrar.add("Avatar.Eject", boost::bind(&LLAvatarActions::landEject, id));
registrar.add("Avatar.Freeze", boost::bind(&LLAvatarActions::landFreeze, id));
registrar.add("Avatar.Kick", boost::bind(&LLAvatarActions::estateKick, id));
registrar.add("Avatar.TeleportHome", boost::bind(&LLAvatarActions::estateTeleportHome, id));
registrar.add("Avatar.EstateBan", boost::bind(&LLAvatarActions::estateBan, id));
registrar.add("Avatar.Derender", boost::bind(&LLAvatarActions::derender, id, false));
registrar.add("Avatar.DerenderPermanent", boost::bind(&LLAvatarActions::derender, id, true));
registrar.add("Nearby.People.TeleportToAvatar", boost::bind(&FSRadarMenu::teleportToAvatar, this));
registrar.add("Nearby.People.TrackAvatar", boost::bind(&FSRadarMenu::onTrackAvatarMenuItemClick, this));
enable_registrar.add("Avatar.EnableItem", boost::bind(&FSRadarMenu::enableContextMenuItem, this, _2));
enable_registrar.add("Avatar.CheckItem", boost::bind(&FSRadarMenu::checkContextMenuItem, this, _2));
enable_registrar.add("Avatar.VisibleZoomIn", boost::bind(&LLAvatarActions::canZoomIn, id));
enable_registrar.add("Avatar.VisibleFreezeEject", boost::bind(&LLAvatarActions::canLandFreezeOrEject, id));
enable_registrar.add("Avatar.VisibleKickTeleportHome", boost::bind(&LLAvatarActions::canEstateKickOrTeleportHome, id));
// create the context menu from the XUI
return createFromFile("menu_fs_radar.xml");
}
else
{
// Set up for multi-selected People
// registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
registrar.add("Avatar.OfferTeleport", boost::bind(&FSRadarMenu::offerTeleport, this));
registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
// registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
// registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
registrar.add("Avatar.Eject", boost::bind(&LLAvatarActions::landEjectMultiple, mUUIDs));
registrar.add("Avatar.Freeze", boost::bind(&LLAvatarActions::landFreezeMultiple, mUUIDs));
registrar.add("Avatar.Kick", boost::bind(&LLAvatarActions::estateKickMultiple, mUUIDs));
registrar.add("Avatar.TeleportHome", boost::bind(&LLAvatarActions::estateTeleportHomeMultiple, mUUIDs));
registrar.add("Avatar.EstateBan", boost::bind(&LLAvatarActions::estateBanMultiple, mUUIDs));
registrar.add("Avatar.Derender", boost::bind(&LLAvatarActions::derenderMultiple, mUUIDs, false));
registrar.add("Avatar.DerenderPermanent", boost::bind(&LLAvatarActions::derenderMultiple, mUUIDs, true));
enable_registrar.add("Avatar.EnableItem", boost::bind(&FSRadarMenu::enableContextMenuItem, this, _2));
enable_registrar.add("Avatar.VisibleFreezeEject", boost::bind(&LLAvatarActions::canLandFreezeOrEjectMultiple, mUUIDs, false));
enable_registrar.add("Avatar.VisibleKickTeleportHome", boost::bind(&LLAvatarActions::canEstateKickOrTeleportHomeMultiple, mUUIDs, false));
// create the context menu from the XUI
return createFromFile("menu_fs_radar_multiselect.xml");
}
}
bool FSRadarMenu::enableContextMenuItem(const LLSD& userdata)
{
std::string item = userdata.asString();
// Note: can_block and can_delete is used only for one person selected menu
// so we don't need to go over all uuids.
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();
}
// <FS> Prevent teleport button from being disabled when someone on your
// friends list logs out but is still in the region and you have
// multiple people selected.
//else if(item == std::string("can_offer_teleport"))
//{
// return LLAvatarActions::canOfferTeleport(mUUIDs);
//}
// </FS>
return false;
}
bool FSRadarMenu::checkContextMenuItem(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 FSRadarMenu::offerTeleport()
{
// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
// so we have to use a wrapper.
LLAvatarActions::offerTeleport(mUUIDs);
}
void FSRadarMenu::teleportToAvatar()
// AO: wrapper for functionality managed by LLPanelPeople, because it manages the nearby avatar list.
// Will only work for avatars within radar range.
{
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
radar->teleportToAvatar(mUUIDs.front());
}
}
// Ansariel: Avatar tracking feature
void FSRadarMenu::onTrackAvatarMenuItemClick()
{
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
radar->startTracking(mUUIDs.front());
}
}
} // namespace FSFloaterRadarMenu

View File

@ -0,0 +1,55 @@
/**
* @file fsradarmenu.h
* @brief Menu used by Firestorm radar
*
* $LicenseInfo:firstyear=2013&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (c) 2013 Ansariel Hiller @ Second Life
*
* 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_RADARMENU_H
#define FS_RADARMENU_H
#include "lllistcontextmenu.h"
namespace FSFloaterRadarMenu
{
/**
* Menu used in the nearby people list.
*/
class FSRadarMenu : public LLListContextMenu
{
public:
/*virtual*/ LLContextMenu* createMenu();
private:
bool enableContextMenuItem(const LLSD& userdata);
bool checkContextMenuItem(const LLSD& userdata);
void offerTeleport();
void teleportToAvatar();
void onTrackAvatarMenuItemClick();
};
extern FSRadarMenu gFSRadarMenu;
} // namespace FSFloaterRadarMenu
#endif // FS_RADARMENU_H

View File

@ -28,22 +28,21 @@
#include "fsslurlcommand.h"
#include "fscommon.h"
#include "fsradar.h"
#include "llagent.h"
#include "llavataractions.h"
#include "llavatarlist.h"
#include "llavatarlistitem.h"
#include "llcommandhandler.h"
#include "llfloatersidepanelcontainer.h"
#include "llnotificationsutil.h"
#include "llpanelpeople.h"
LLAvatarListItem* getAvatarListItem(const LLUUID& avatar_id)
{
LLPanelPeople* panel_people = getPeoplePanel();
if (panel_people)
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
return panel_people->getNearbyList()->getAvatarListItem(avatar_id);
return radar->getNearbyList()->getAvatarListItem(avatar_id);
}
return NULL;
@ -118,11 +117,11 @@ public:
{
if (gAgentID != target_id)
{
LLPanelPeople* panel_people = getPeoplePanel();
FSRadar* radar = FSRadar::getInstance();
LLAvatarListItem* avatar_list_item = getAvatarListItem(target_id);
if (avatar_list_item && panel_people)
if (avatar_list_item && radar)
{
panel_people->startTracking(target_id);
radar->startTracking(target_id);
return true;
}

View File

@ -77,17 +77,13 @@
// [RLVa:KB] - Checked: 2010-04-19 (RLVa-1.2.0f)
#include "rlvhandler.h"
// [/RLVa:KB]
#include "lltrans.h"
#include "llmutelist.h"
// Ansariel: For accessing the radar data
#include "llavatarlist.h"
#include "llavatarlistitem.h"
#include "llpanelpeople.h"
#include "llfloatersidepanelcontainer.h"
#include "fsradar.h"
#include "lggcontactsets.h"
#include "llavataractions.h"
#include "fscommon.h"
static LLDefaultChildRegistry::Register<LLNetMap> r1("net_map");
@ -1018,10 +1014,10 @@ BOOL LLNetMap::handleToolTipAgent(const LLUUID& avatar_id)
// aka radar when above 1020m.
if (isHigher1020mBug)
{
LLPanelPeople* panel_people = getPeoplePanel();
if (panel_people)
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
LLAvatarListItem* avatar_list_item = panel_people->getNearbyList()->getAvatarListItem(avatar_id);
LLAvatarListItem* avatar_list_item = radar->getNearbyList()->getAvatarListItem(avatar_id);
if (avatar_list_item)
{
F32 radar_distance = avatar_list_item->getRange();
@ -1710,10 +1706,10 @@ void LLNetMap::startTracking()
{
if (mClosestAgentRightClick.notNull())
{
LLPanelPeople* panel_people = getPeoplePanel();
if (panel_people != NULL)
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
panel_people->startTracking(mClosestAgentRightClick);
radar->startTracking(mClosestAgentRightClick);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -31,29 +31,17 @@
#include "llcallingcard.h" // for avatar tracker
#include "llvoiceclient.h"
#include "llavatarnamecache.h"
#include "llscrolllistctrl.h"
#include "fsradarlistctrl.h"
#include <map>
#include <time.h>
class LLAvatarList;
class LLAvatarName;
class LLFilterEditor;
class LLGroupList;
class LLTabContainer;
class LLMenuButton;
class LLTabContainer;
// Firestorm declarations
class LLMenuGL;
const U32 MAX_AVATARS_PER_ALERT = 6; // maximum number of UUIDs we can cram into a single channel radar alert message
const U32 COARSE_OFFSET_INTERVAL = 7; // seconds after which we query the bridge for a coarse location adjustment
const U32 MAX_OFFSET_REQUESTS = 60; // 2048 / UUID size, leaving overhead space
const U32 NAMEFORMAT_DISPLAYNAME = 0;
const U32 RADAR_CHAT_MIN_SPACING = 6; //minimum delay between radar chat messages
const U32 NAMEFORMAT_USERNAME = 1;
const U32 NAMEFORMAT_DISPLAYNAME_USERNAME = 2;
const U32 NAMEFORMAT_USERNAME_DISPLAYNAME = 3;
class FSRadarListCtrl;
class LLPanelPeople
: public LLPanel
@ -67,17 +55,17 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ bool notifyChildren(const LLSD& info);
void teleportToAvatar(LLUUID targetAv);
void requestRadarChannelAlertSync();
// Implements LLVoiceClientStatusObserver::onChange() to enable call buttons
// when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
LLAvatarList* getNearbyList() { return mNearbyList; }
// Externalized to FSRadar
//LLAvatarList* getNearbyList() { return mNearbyList; }
// [/RLVa:KB]
void startTracking(const LLUUID& avatar_id);
// <FS:Ansariel> Firestorm radar
void updateNearby(const std::vector<LLSD>& entries, const LLSD& stats);
// internals
class Updater;
@ -97,10 +85,7 @@ private:
void updateFriendList();
void updateNearbyList();
void updateRecentList();
void updateNearbyRange();
void updateTracking();
void checkTracking();
bool isItemsFreeOfFriends(const uuid_vec_t& uuids);
void updateButtons();
@ -112,10 +97,6 @@ private:
void buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb);
void showGroupMenu(LLMenuGL* menu);
void setSortOrder(LLAvatarList* list, ESortOrder order, bool save = true);
void handleLimitRadarByRange(const LLSD& newalue);
std::string getRadarName(LLUUID avId);
std::string getRadarName(LLAvatarName avName);
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name,std::string postMsg);
// UI callbacks
void onFilterEdit(const std::string& search_string);
@ -123,7 +104,6 @@ private:
void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
void onAddFriendWizButtonClicked();
void onGlobalVisToggleButtonClicked();
void onDeleteFriendButtonClicked();
void onGroupInfoButtonClicked();
void onChatButtonClicked();
@ -134,14 +114,8 @@ private:
void onShareButtonClicked();
void onMoreButtonClicked();
void onActivateButtonClicked();
void onRecentViewSortButtonClicked();
void onNearbyViewSortButtonClicked();
void onFriendsViewSortButtonClicked();
void onGroupsViewSortButtonClicked();
void onAvatarListDoubleClicked(LLUICtrl* ctrl);
void onNearbyListDoubleClicked(LLUICtrl* ctrl);
void onAvatarListCommitted(LLAvatarList* list);
void onRadarListDoubleClicked();
void onGroupPlusButtonClicked();
void onGroupMinusButtonClicked();
void onGroupPlusMenuItemClicked(const LLSD& userdata);
@ -150,10 +124,6 @@ private:
void onNearbyViewSortMenuItemClicked(const LLSD& userdata);
void onGroupsViewSortMenuItemClicked(const LLSD& userdata);
void onRecentViewSortMenuItemClicked(const LLSD& userdata);
void onRadarNameFmtClicked(const LLSD& userdata);
bool radarNameFmtCheck(const LLSD& userdata);
void onRadarReportToClicked(const LLSD& userdata); // <FS:CR> Milkshake-style Radar Alerts
bool radarReportToCheck(const LLSD& userdata); // <FS:CR> Milkshake-style Radar Alerts
//returns false only if group is "none"
bool isRealGroup();
@ -177,14 +147,21 @@ private:
bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
bool isAccordionCollapsedByUser(const std::string& name);
// <FS:Ansariel> Firestorm callback handler
void onRadarListDoubleClicked();
void onGlobalVisToggleButtonClicked();
// </FS:Ansariel> Firestorm callback handler
LLFilterEditor* mFilterEditor;
LLTabContainer* mTabContainer;
LLAvatarList* mOnlineFriendList;
LLAvatarList* mAllFriendList;
LLAvatarList* mNearbyList;
// <FS:Ansariel> Firestorm radar
FSRadarListCtrl* mRadarList;
// </FS:Ansariel> Firestorm radar
LLAvatarList* mRecentList;
LLGroupList* mGroupList;
FSRadarListCtrl* mRadarList;
LLNetMap* mMiniMap;
LLHandle<LLView> mGroupPlusMenuHandle;
@ -194,7 +171,9 @@ private:
LLHandle<LLView> mRecentViewSortMenuHandle;
Updater* mFriendListUpdater;
Updater* mNearbyListUpdater;
// <FS:Ansariel> Firestorm radar
//Updater* mNearbyListUpdater;
// </FS:Ansariel> Firestorm radar
Updater* mRecentListUpdater;
Updater* mButtonsUpdater;
@ -205,34 +184,9 @@ private:
std::string mFilterSubString;
std::string mFilterSubStringOrig;
LLUIColor mChatRangeColor;
LLUIColor mShoutRangeColor;
LLUIColor mFarRangeColor;
struct radarFields
{
std::string avName;
F32 lastDistance;
LLVector3d lastGlobalPos;
LLUUID lastRegion;
time_t firstSeen;
S32 lastStatus;
U32 ZOffset;
time_t lastZOffsetTime;
};
std::multimap < LLUUID, radarFields > lastRadarSweep;
std::vector <LLUUID> mRadarEnterAlerts;
std::vector <LLUUID> mRadarLeaveAlerts;
std::vector <LLUUID> mRadarOffsetRequests;
S32 mRadarFrameCount;
bool mRadarAlertRequest;
F32 mRadarLastRequestTime;
U32 mRadarLastBulkOffsetRequestTime;
LLUUID mTrackedAvatarId;
// <FS:Ansariel> Firestorm radar
boost::signals2::connection mNearbyUpdateSignalConnection;
};
#endif //LL_LLPANELPEOPLE_H

View File

@ -38,9 +38,6 @@
#include "llavataractions.h"
#include "llcallingcard.h" // for LLAvatarTracker
#include "llviewermenu.h" // for gMenuHolder
#include "llpanelpeople.h"
#include "fscommon.h"
namespace LLPanelPeopleMenus
{
@ -66,35 +63,13 @@ LLContextMenu* NearbyMenu::createMenu()
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
registrar.add("Avatar.GroupInvite", boost::bind(&LLAvatarActions::inviteToGroup, id));
registrar.add("Avatar.getScriptInfo", boost::bind(&LLAvatarActions::getScriptInfo, id));
registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::showOnMap, 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));
// [SL:KB] - Patch: UI-SidepanelPeople | Checked: 2010-12-03 (Catznip-2.4.0g) | Modified: Catznip-2.4.0g
registrar.add("Avatar.ZoomIn", boost::bind(&LLAvatarActions::zoomIn, id));
enable_registrar.add("Avatar.VisibleZoomIn", boost::bind(&LLAvatarActions::canZoomIn, id));
registrar.add("Avatar.Report", boost::bind(&LLAvatarActions::report, id));
registrar.add("Avatar.Eject", boost::bind(&LLAvatarActions::landEject, id));
registrar.add("Avatar.Freeze", boost::bind(&LLAvatarActions::landFreeze, id));
enable_registrar.add("Avatar.VisibleFreezeEject", boost::bind(&LLAvatarActions::canLandFreezeOrEject, id));
registrar.add("Avatar.Kick", boost::bind(&LLAvatarActions::estateKick, id));
registrar.add("Avatar.TeleportHome", boost::bind(&LLAvatarActions::estateTeleportHome, id));
enable_registrar.add("Avatar.VisibleKickTeleportHome", boost::bind(&LLAvatarActions::canEstateKickOrTeleportHome, id));
// [/SL:KB]
// <FS:Ansariel> Estate ban user
registrar.add("Avatar.EstateBan", boost::bind(&LLAvatarActions::estateBan, id));
// <FS:Ansariel> Derender
registrar.add("Avatar.Derender", boost::bind(&LLAvatarActions::derender, id, false));
registrar.add("Avatar.DerenderPermanent", boost::bind(&LLAvatarActions::derender, id, true));
// </FS:Ansariel> Derender
registrar.add("Nearby.People.TeleportToAvatar", boost::bind(&NearbyMenu::teleportToAvatar, this));
registrar.add("Nearby.People.TrackAvatar", boost::bind(&NearbyMenu::onTrackAvatarMenuItemClick, this));
// <FS:Ansariel> Firestorm additions
registrar.add("Avatar.GroupInvite", boost::bind(&LLAvatarActions::inviteToGroup, id));
registrar.add("Avatar.ZoomIn", boost::bind(&LLAvatarActions::zoomIn, id));
enable_registrar.add("Avatar.VisibleZoomIn", boost::bind(&LLAvatarActions::canZoomIn, id));
enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
enable_registrar.add("Avatar.CheckItem", boost::bind(&NearbyMenu::checkContextMenuItem, this, _2));
@ -113,21 +88,7 @@ LLContextMenu* NearbyMenu::createMenu()
// registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
// registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
// [SL:KB] - Patch: UI-SidepanelPeople | Checked: 2010-11-05 (Catznip-2.4.0g) | Added: Catznip-2.4.0g
registrar.add("Avatar.Eject", boost::bind(&LLAvatarActions::landEjectMultiple, mUUIDs));
registrar.add("Avatar.Freeze", boost::bind(&LLAvatarActions::landFreezeMultiple, mUUIDs));
enable_registrar.add("Avatar.VisibleFreezeEject", boost::bind(&LLAvatarActions::canLandFreezeOrEjectMultiple, mUUIDs, false));
registrar.add("Avatar.Kick", boost::bind(&LLAvatarActions::estateKickMultiple, mUUIDs));
registrar.add("Avatar.TeleportHome", boost::bind(&LLAvatarActions::estateTeleportHomeMultiple, mUUIDs));
enable_registrar.add("Avatar.VisibleKickTeleportHome", boost::bind(&LLAvatarActions::canEstateKickOrTeleportHomeMultiple, mUUIDs, false));
// [/SL:KB]
// <FS:Ansariel> Estate ban user
registrar.add("Avatar.EstateBan", boost::bind(&LLAvatarActions::estateBanMultiple, mUUIDs));
// <FS:Ansariel> Derender
registrar.add("Avatar.Derender", boost::bind(&LLAvatarActions::derenderMultiple, mUUIDs, false));
registrar.add("Avatar.DerenderPermanent", boost::bind(&LLAvatarActions::derenderMultiple, mUUIDs, true));
// </FS:Ansariel> Derender
// create the context menu from the XUI
return createFromFile("menu_people_nearby_multiselect.xml");
}
@ -238,26 +199,5 @@ void NearbyMenu::offerTeleport()
// so we have to use a wrapper.
LLAvatarActions::offerTeleport(mUUIDs);
}
void NearbyMenu::teleportToAvatar()
// AO: wrapper for functionality managed by LLPanelPeople, because it manages the nearby avatar list.
// Will only work for avatars within radar range.
{
LLPanelPeople* peoplePanel = getPeoplePanel();
if (peoplePanel)
{
peoplePanel->teleportToAvatar(mUUIDs.front());
}
}
// Ansariel: Avatar tracking feature
void NearbyMenu::onTrackAvatarMenuItemClick()
{
LLPanelPeople* peoplePanel = getPeoplePanel();
if (peoplePanel)
{
peoplePanel->startTracking(mUUIDs.front());
}
}
} // namespace LLPanelPeopleMenus

View File

@ -43,8 +43,6 @@ private:
bool enableContextMenuItem(const LLSD& userdata);
bool checkContextMenuItem(const LLSD& userdata);
void offerTeleport();
void teleportToAvatar();
void onTrackAvatarMenuItemClick();
};
extern NearbyMenu gNearbyMenu;

View File

@ -219,6 +219,7 @@
#include "fsdata.h"
#include "fsfloatersearch.h"
#include "fslslbridge.h"
#include "fsradar.h"
#include "fswsassetblacklist.h"
#include "llfloatersearch.h"
#include "llfloatersidepanelcontainer.h"
@ -1680,12 +1681,15 @@ LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim, first_sim_size_x,
llinfos << "Constructed " << pContacts->getTitle() << llendl;
// </FS:ND>
// <FS:Ansariel> FIRE-8560/FIRE-8592: We neet to create the instance of the people
// floater for the radar functions and the V2 friendlist here.
// <FS:Ansariel> FIRE-8560/FIRE-8592: We neet to create the instance of the radar
// for the radar functions and the V2 friendlist here.
// This is because of the standalone group panels that will
// prevent doing this at login when receiving the agent group
// data update.
LLFloaterSidePanelContainer::getPanel("people", "panel_people");
FSRadar::instance();
llinfos << "Radar initialized" << llendl;
// </FS:Ansariel>
//gCacheName is required for nearby chat history loading
//so I just moved nearby history loading a few states further

View File

@ -162,6 +162,7 @@
#include "fsfloaterplacedetails.h"
#include "fsfloaterposestand.h"
#include "fsfloaterprofile.h"
#include "fsfloaterradar.h"
#include "fsfloatersearch.h"
#include "fsfloaterteleporthistory.h"
#include "fsfloatervolumecontrols.h"
@ -395,6 +396,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("fs_import", "floater_fs_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterImport>);
LLFloaterReg::add("fs_posestand", "floater_fs_posestand.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterPoseStand>);
LLFloaterReg::add("fs_placedetails", "floater_fs_placedetails.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterPlaceDetails>);
LLFloaterReg::add("fs_radar", "floater_fs_radar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterRadar>);
LLFloaterReg::add("fs_teleporthistory", "floater_fs_teleporthistory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterTeleportHistory>);
LLFloaterReg::add("fs_volume_controls", "floater_fs_volume_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterVolumeControls>);
LLFloaterReg::add("group_titles", "floater_fs_group_titles.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSGroupTitles>);

View File

@ -153,6 +153,7 @@ const static boost::regex NEWLINES("\\n{1}");
#include "tea.h" // <FS:AW opensim currency support>
#include "fscommon.h"
#include "fslightshare.h" // <FS:CR> FIRE-5118 - Lightshare support
#include "fsradar.h"
#if LL_MSVC
// disable boost::lexical_cast warning
@ -5591,10 +5592,10 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
// sound assets as a request for a full radar update to a channel
if ((owner_id == gAgent.getID()) && (sound_id.asString() == gSavedSettings.getString("RadarLegacyChannelAlertRefreshUUID")))
{
LLPanelPeople* pPeoplePanel = getPeoplePanel();
if (pPeoplePanel)
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
pPeoplePanel->requestRadarChannelAlertSync();
radar->requestRadarChannelAlertSync();
}
return;
}

View File

@ -47,6 +47,8 @@
#include "rlvhandler.h"
#include "rlvextensions.h"
#include "fsradar.h"
// ============================================================================
// Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
@ -364,10 +366,16 @@ void RlvUIEnabler::onToggleShowNames(bool fQuitting)
bool fEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
// Refresh the nearby people list
LLPanelPeople* pPeoplePanel = LLFloaterSidePanelContainer::getPanel<LLPanelPeople>("people", "panel_people");
RLV_ASSERT( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) );
if ( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) )
pPeoplePanel->getNearbyList()->updateAvatarNames();
// <FS:Ansariel> [Standalone radar]
//LLPanelPeople* pPeoplePanel = LLFloaterSidePanelContainer::getPanel<LLPanelPeople>("people", "panel_people");
//RLV_ASSERT( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) );
//if ( (pPeoplePanel) && (pPeoplePanel->getNearbyList()) )
// pPeoplePanel->getNearbyList()->updateAvatarNames();
FSRadar* pRadar = FSRadar::getInstance();
RLV_ASSERT( (pRadar) && (pRadar->getNearbyList()) );
if ( (pRadar) && (pRadar->getNearbyList()) )
pRadar->getNearbyList()->updateAvatarNames();
// </FS:Ansariel> [Standalone radar]
// Refresh the speaker list
// <FS:Ansariel> [FS communication UI]

View File

@ -0,0 +1,342 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
name="radar"
help_topic="fs_radar"
title="Radar"
width="333"
height="415"
min_width="250"
min_height="150"
save_rect="true"
save_visibility="true"
can_resize="true"
can_minimize="true"
can_close="true">
<string
name="no_one_near"
value="No one nearby. 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
name="MiniMapToolTipMsg"
value="[REGION] (Double-click to open Map, shift-drag to pan)"/>
<string
name="AltMiniMapToolTipMsg"
value="[REGION] (Double-click to teleport, shift-drag to pan)"/>
<string
name="avatar_name_count"
value="Name [[TOTAL]/[IN_REGION]/[IN_CHAT_RANGE]]"/>
<filter_editor
follows="left|top|right"
height="23"
layout="topleft"
left="9"
label="Filter People"
max_length_chars="300"
name="filter_input"
text_pad_left="4"
top="3"
width="314"/>
<panel
background_opaque="false"
background_visible="false"
follows="all"
height="383"
label="Nearby"
layout="topleft"
left="3"
help_topic="people_nearby_tab"
name="nearby_panel"
top_pad="3"
width="326">
<layout_stack
orientation="vertical"
clip="true"
follows="all"
layout="topleft"
top="0"
left="0"
height="356"
width="326"
mouse_opaque="false"
name="radar_ls"
auto_resize="false"
user_resize="true">
<layout_panel
layout="topleft"
top="0"
left="3"
height="140"
width="326"
min_dim="140"
follows="top"
mouse_opaque="false"
visibility_control="ShowRadarMinimap"
name="minimaplayout"
auto_resize="false"
user_resize="true">
<net_map
bg_color="NetMapBackgroundColor"
visibility_control="ShowRadarMinimap"
follows="all"
layout="topleft"
left="3"
mouse_opaque="false"
name="Net Map"
width="326"
height="140"
top="0"/>
</layout_panel>
<layout_panel
layout="topleft"
top="0"
left="0"
height="216"
width="326"
mouse_opaque="false"
follows="all"
name="radarlayout">
<radar_list
draw_heading="true"
follows="all"
height="216"
layout="topleft"
left="0"
top_pad="0"
sort_column="0"
sort_ascending="true"
name="radar_list"
draw_stripes="true"
multi_select="true"
width="326">
<radar_list.columns
label="Name"
name="name"
tool_tip="[TOTAL] avatars, [IN_REGION] in the same region, [IN_CHAT_RANGE] in chat range"
relative_width="0.37"/>
<radar_list.columns
label=""
name="voice_level"
tool_tip="Is talking on voice"
relative_width="0.07"/>
<radar_list.columns
label=""
name="in_region"
tool_tip="Is in the same region"
relative_width="0.03"/>
<radar_list.columns
label=""
name="flags"
tool_tip="Has payment info on file"
relative_width="0.03"/>
<radar_list.columns
label="Age"
name="age"
relative_width="0.1"/>
<radar_list.columns
label="Seen"
name="seen"
relative_width="0.15"/>
<radar_list.columns
label="Range"
name="range"
relative_width="0.15"/>
<radar_list.columns
label="av_id"
name="uuid"
relative_width="0"/>
</radar_list>
</layout_panel>
</layout_stack>
<!-- Buttons -->
<panel
background_visible="false"
follows="left|right|bottom"
height="27"
label="bottom_panel"
layout="topleft"
left="0"
name="bottom_panel_nearby"
top_pad="0"
width="331">
<menu_button
follows="bottom|left"
height="25"
image_hover_unselected="Toolbar_Left_Over"
image_overlay="OptionsMenu_Off"
image_selected="Toolbar_Left_Selected"
image_unselected="Toolbar_Left_Off"
layout="topleft"
left="0"
name="nearby_view_sort_btn"
tool_tip="Options"
top="1"
width="31"/>
<button
follows="bottom|left"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="AddItem_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
left_pad="1"
name="add_friend_btn_nearby"
tool_tip="Add selected Resident to your friends List"
width="31">
<commit_callback
function="People.addFriend"/>
</button>
<icon
follows="bottom|left|right"
height="25"
image_name="Toolbar_Right_Off"
layout="topleft"
left_pad="1"
name="nearby_dummy_icon"
width="262"/>
<slider
visibility_control="LimitRadarByRange"
control_name="NearMeRange"
decimal_digits="0"
follows="bottom|left"
height="16"
increment="2"
initial_value="96"
label="Range(m):"
label_width="70"
layout="topleft"
max_val="4096"
min_val="20"
name="NearMeRange"
visible="True"
left_delta="10"
top_delta="6"
width="220"/>
</panel>
</panel>
<!-- END NEARBY TAB -->
<panel
visible="false"
follows="bottom|left|right"
height="23"
layout="topleft"
left="3"
top_pad="1"
name="button_bar"
width="326">
<layout_stack
follows="bottom|left|right"
height="23"
layout="topleft"
name="bottom_bar_ls"
orientation="horizontal"
top_pad="0"
width="326">
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
name="view_profile_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
height="23"
label="Profile"
layout="topleft"
left="1"
name="view_profile_btn"
tool_tip="Show picture, groups, and other Residents information"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="1"
name="im_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="IM"
layout="topleft"
name="im_btn"
tool_tip="Open instant message session"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="Call"
layout="topleft"
name="call_btn"
tool_tip="Call this Resident"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="share_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="Share"
layout="topleft"
name="share_btn"
tool_tip="Share an inventory item"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="tp_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="Teleport"
layout="topleft"
name="teleport_btn"
tool_tip="Offer teleport"
top="0"
width="71"/>
</layout_panel>
</layout_stack>
</panel>
</floater>

View File

@ -14,30 +14,6 @@
<string
name="high_server_load"
value="Due to server load, mass toggling visibility can take a while to become effective. Please be patient."/>
<string
name="camera_no_focus"
value="The camera cannot focus user [AVATARNAME] because they are outside your draw distance."/>
<string
name="entering_draw_distance"
value="entered draw distance ([DISTANCE] m)."/>
<string
name="leaving_draw_distance"
value="left draw distance."/>
<string
name="entering_chat_range"
value="entered chat range ([DISTANCE] m)."/>
<string
name="leaving_chat_range"
value="left chat range."/>
<string
name="entering_region"
value="entered the region."/>
<string
name="entering_region_distance"
value="entered the region ([DISTANCE] m)."/>
<string
name="leaving_region"
value="left the region."/>
<string
name="no_recent_people"
value="No recent people. 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." />
@ -146,7 +122,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
top="0" left="3"
height="140"
width="326"
max_height="140"
min_dim="140"
follows="top"
mouse_opaque="false"
visibility_control="ShowRadarMinimap"
@ -282,6 +258,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
name="nearby_dummy_icon"
width="257" />
<slider
visibility_control="LimitRadarByRange"
control_name="NearMeRange"
decimal_digits="0"
follows="bottom|left"

View File

@ -722,6 +722,7 @@ with the same filename but different name
<texture name="teleport_history" file_name="toolbar_icons/teleporthistory.png" preload="true" />
<texture name="pose_stand" file_name="toolbar_icons/posestand.png" preload="true" />
<texture name="Command_Snapshot_2_Disk_Icon" file_name="toolbar_icons/snapshot_to_disk.png" preload="true" />
<texture name="radar" file_name="toolbar_icons/radar.png" preload="true" />
<texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="radar" title="Radar">
<string
name="MiniMapToolTipMsg"
value="[REGION] (Doppelklicken, um Karte zu öffnen; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
<string
name="AltMiniMapToolTipMsg"
value="[REGION] (Doppelklicken, um zu teleportieren; Umschalttaste gedrückt halten und ziehen, um zu schwenken)"/>
<string
name="avatar_name_count"
value="Name [[TOTAL]/[IN_REGION]/[IN_CHAT_RANGE]]"/>
<filter_editor label="Nach Leuten filtern" name="filter_input"/>
<panel label="In der Nähe" name="nearby_panel">
<layout_stack name="radar_ls">
<layout_panel name="radarlayout">
<radar_list name="radar_list">
<radar_list.columns label="Name" tool_tip="[TOTAL] Avatare, [IN_REGION] in derselben Region, [IN_CHAT_RANGE] in Chat-Reichweite" name="name"/>
<radar_list.columns label="" tool_tip="Spricht via Voice" name="voice_level"/>
<radar_list.columns label="" tool_tip="Ist in derselben Region" name="in_region"/>
<radar_list.columns label="" tool_tip="Hat Zahlungsinformationen hinterlegt" name="flags"/>
<radar_list.columns label="Alt." name="age"/>
<radar_list.columns label="Zeit" name="seen"/>
<radar_list.columns label="Dist." name="range"/>
</radar_list>
</layout_panel>
</layout_stack>
<panel label="bottom_panel" name="bottom_panel_nearby">
<menu_button name="nearby_view_sort_btn" tool_tip="Optionen"/>
<button name="add_friend_btn_nearby" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
<slider label="Distanz (m):" name="NearMeRange"/>
</panel>
</panel>
<panel name="button_bar">
<layout_stack name="bottom_bar_ls">
<layout_panel name="view_profile_btn_lp" width="60">
<button label="Profil" name="view_profile_btn" width="59" tool_tip="Bilder, Gruppen und andere Einwohner-Informationen anzeigen"/>
</layout_panel>
<layout_panel name="im_btn_lp">
<button label="IM" name="im_btn" tool_tip="IM-Sitzung öffnen"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Anrufen" name="call_btn" tool_tip="Diesen Einwohner anrufen"/>
</layout_panel>
<layout_panel name="share_btn_lp">
<button label="Freigeben" name="share_btn" tool_tip="Inventarobjekt freigeben"/>
</layout_panel>
<layout_panel name="tp_btn_lp" width="85">
<button label="Teleportieren" name="teleport_btn" width="84" tool_tip="Teleport anbieten"/>
</layout_panel>
</layout_stack>
</panel>
</floater>

View File

@ -0,0 +1,26 @@
<?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="Freund entfernen" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Karte" name="Map"/>
<menu_item_call label="Verfolgen" name="Track"/>
<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="Teleportiere zu Avatar" name="teleport_to"/>
<menu_item_call label="Heranzoomen" name="zoom_in"/>
<menu_item_call label="Gruppeneinladung schicken" name="GroupInvite"/>
<menu_item_call label="Skript-Info anzeigen" name="ScriptInfo"/>
<menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/>
<menu_item_call label="Missbrauch melden" name="report"/>
<menu_item_call label="Einfrieren" name="freeze"/>
<menu_item_call label="Parzelle: Entfernen" name="eject"/>
<menu_item_call label="Estate: Hinauswerfen" name="kick"/>
<menu_item_call label="Estate: Teleport nach Hause" name="teleport_home"/>
<menu_item_call label="Estate: Verbannen" name="estate_ban"/>
<menu_item_call label="Nicht anzeigen" name="derender"/>
<menu_item_call label="Nicht anzeigen + Blacklist" name="derender_permanent"/>
</context_menu>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_group_plus">
<menu_item_check label="Karte oberhalb Radar anzeigen" name="ShowRadarMinimap"/>
<menu_item_check label="Anzeige auf definierten Radius beschränken" name="LimitRadarByRange"/>
<context_menu label="Radar-Namensformat" name="radarNameFormat">
<menu_item_check label="Anzeigename" name="radarFmtDN"/>
<menu_item_check label="Benutzername" name="radarFmtUN"/>
<menu_item_check label="Anzeigename (Benutzername)" name="radarFmtDNUN"/>
<menu_item_check label="Benutzername (Anzeigename)" name="radarFmtUNDN"/>
</context_menu>
<context_menu label="Melden via" name="report_to_menu">
<menu_item_check label="Chat in der Nähe" name="radar_nearby_chat"/>
<menu_item_check label="Benachrichtigungs-Toasts" name="radar_nearby_chat"/>
</context_menu>
<menu_item_check label="Chat-Reichweite auf Karte anzeigen" name="MiniMapChatRing"/>
<menu_item_check label="Betreten der Draw Distance melden" name="RadarReportDrawRangeEnter"/>
<menu_item_check label="Verlassen der Draw Distance melden" name="RadarReportDrawRangeLeave"/>
<menu_item_check label="Betreten der Chat-Reichweite melden" name="RadarReportChatRangeEnter"/>
<menu_item_check label="Verlassen der Chat-Reichweite melden" name="RadarReportChatRangeLeave"/>
<menu_item_check label="Betreten der Region melden" name="RadarReportSimRangeEnter"/>
<menu_item_check label="Verlassen der Region melden" name="RadarReportSimRangeLeave"/>
<menu_item_check label="Eintrittsmeldungen an Skripte senden" name="RadarEnterChannelAlert"/>
<menu_item_check label="Austrittsmeldungen an Skripte senden" name="RadarLeaveChannelAlert"/>
<menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
</toggleable_menu>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="Freunde hinzufügen" name="Add Friends"/>
<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="Teilen" name="Share"/>
<menu_item_call label="Bezahlen" name="Pay"/>
<menu_item_call label="Teleport anbieten" name="teleport"/>
<menu_item_call label="Einfrieren" name="freeze"/>
<menu_item_call label="Parzelle: Entfernen" name="eject"/>
<menu_item_call label="Estate: Hinauswerfen" name="kick"/>
<menu_item_call label="Estate: Teleport nach Hause" name="teleport_home"/>
<menu_item_call label="Estate: Verbannen" name="estate_ban"/>
<menu_item_call label="Nicht anzeigen" name="derender"/>
<menu_item_call label="Nicht anzeigen + Blacklist" name="derender_permanent"/>
</context_menu>

View File

@ -6,21 +6,9 @@
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Karte" name="Map"/>
<menu_item_call label="Verfolgen" name="Track"/>
<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="Teleportiere zu Avatar" name="teleport_to"/>
<menu_item_call label="Heranzoomen" name="zoom_in"/>
<menu_item_call label="Gruppeneinladung schicken" name="GroupInvite"/>
<menu_item_call label="Skript-Info anzeigen" name="ScriptInfo"/>
<menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/>
<menu_item_call label="Missbrauch melden" name="report"/>
<menu_item_call label="Einfrieren" name="freeze"/>
<menu_item_call label="Parzelle: Entfernen" name="eject"/>
<menu_item_call label="Estate: Hinauswerfen" name="kick"/>
<menu_item_call label="Estate: Teleport nach Hause" name="teleport_home"/>
<menu_item_call label="Estate: Verbannen" name="estate_ban"/>
<menu_item_call label="Nicht anzeigen" name="derender"/>
<menu_item_call label="Nicht anzeigen + Blacklist" name="derender_permanent"/>
<menu_item_call label="Teleport anbieten" name="teleport"/>
<menu_item_call label="Gruppeneinladung schicken" name="GroupInvite"/>
</context_menu>

View File

@ -7,11 +7,4 @@
<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="Einfrieren" name="freeze"/>
<menu_item_call label="Parzelle: Entfernen" name="eject"/>
<menu_item_call label="Estate: Hinauswerfen" name="kick"/>
<menu_item_call label="Estate: Teleport nach Hause" name="teleport_home"/>
<menu_item_call label="Estate: Verbannen" name="estate_ban"/>
<menu_item_call label="Nicht anzeigen" name="derender"/>
<menu_item_call label="Nicht anzeigen + Blacklist" name="derender_permanent"/>
</context_menu>

View File

@ -76,6 +76,7 @@
<menu label="Welt" name="World">
<menu_item_call label="Animationen synchronisieren" name="Resync Animations"/>
<menu_item_call label="Avatare in der Nähe" name="Active Speakers"/>
<menu_item_check label="Radar" name="Radar"/>
<menu_item_call label="Teleport-Liste" name="Teleport History"/>
<menu_item_check label="Orte" name="Places"/>
<menu_item_check label="Minikarte" name="Mini-Map"/>

View File

@ -5113,6 +5113,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Snapshot_To_Disk_Label">
Foto auf Datenträger
</string>
<string name="Command_Radar_Label">
Radar
</string>
<string name="Command_AboutLand_Tooltip">
Informationen zu dem von Ihnen besuchten Land
</string>
@ -5248,6 +5251,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Snapshot_To_Disk_Tooltip">
Macht ein Foto und speichert es auf der Festplatte
</string>
<string name="Command_Radar_Tooltip">
Öffnet das Radar für Avatare in der Nähe
</string>
<string name="Toolbar_Bottom_Tooltip">
gegenwärtig in der unteren Symbolleiste
</string>
@ -5648,4 +5654,31 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="GroupChatMuteNotice">
Ignoriere Gruppenchat von [NAME].
</string>
<!-- <FS:Ansariel> Radar notifications -->
<string name="camera_no_focus">
Die Kamera kann nicht auf [AVATARNAME] fokussiert werden, da er/sie sich außerhalb der Draw Distance befindet.
</string>
<string name="entering_draw_distance">
kommt in Draw Distance ([DISTANCE] m).
</string>
<string name="leaving_draw_distance">
hat die Draw Distance verlassen.
</string>
<string name="entering_chat_range">
kommt in Chat-Reichweite ([DISTANCE] m).
</string>
<string name="leaving_chat_range">
hat die Chat-Reichweite verlassen.
</string>
<string nane="entering_region">
hat die Region betreten.
</string>
<string name="entering_region_distance">
hat die Region betreten ([DISTANCE] m).
</string>
<string name="leaving_region">
hat die Region verlassen.
</string>
</strings>

View File

@ -0,0 +1,341 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
name="radar"
help_topic="fs_radar"
title="Radar"
width="333"
height="440"
min_width="250"
min_height="150"
save_rect="true"
save_visibility="true"
can_resize="true"
can_minimize="true"
can_close="true">
<string
name="no_one_near"
value="No one nearby. 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
name="MiniMapToolTipMsg"
value="[REGION] (Double-click to open Map, shift-drag to pan)"/>
<string
name="AltMiniMapToolTipMsg"
value="[REGION] (Double-click to teleport, shift-drag to pan)"/>
<string
name="avatar_name_count"
value="Name [[TOTAL]/[IN_REGION]/[IN_CHAT_RANGE]]"/>
<filter_editor
follows="left|top|right"
height="23"
layout="topleft"
left="9"
label="Filter People"
max_length_chars="300"
name="filter_input"
text_pad_left="10"
top="3"
width="314"/>
<panel
background_opaque="false"
background_visible="false"
follows="all"
height="383"
label="Nearby"
layout="topleft"
left="3"
help_topic="people_nearby_tab"
name="nearby_panel"
top_pad="3"
width="326">
<layout_stack
orientation="vertical"
clip="true"
follows="all"
layout="topleft"
top="0"
left="0"
height="356"
width="326"
mouse_opaque="false"
name="radar_ls"
auto_resize="false"
user_resize="true">
<layout_panel
layout="topleft"
top="0"
left="3"
height="140"
width="326"
min_dim="140"
follows="top"
mouse_opaque="false"
visibility_control="ShowRadarMinimap"
name="minimaplayout"
auto_resize="false"
user_resize="true">
<net_map
bg_color="NetMapBackgroundColor"
visibility_control="ShowRadarMinimap"
follows="all"
layout="topleft"
left="3"
mouse_opaque="false"
name="Net Map"
width="326"
height="140"
top="0"/>
</layout_panel>
<layout_panel
layout="topleft"
top="0"
left="0"
height="216"
width="326"
mouse_opaque="false"
follows="all"
name="radarlayout">
<radar_list
draw_heading="true"
follows="all"
height="216"
layout="topleft"
left="0"
top_pad="0"
sort_column="0"
sort_ascending="true"
name="radar_list"
draw_stripes="true"
multi_select="true"
width="326">
<radar_list.columns
label="Name"
name="name"
tool_tip="[TOTAL] avatars, [IN_REGION] in the same region, [IN_CHAT_RANGE] in chat range"
relative_width="0.37"/>
<radar_list.columns
label=""
name="voice_level"
tool_tip="Is talking on voice"
relative_width="0.07"/>
<radar_list.columns
label=""
name="in_region"
tool_tip="Is in the same region"
relative_width="0.03"/>
<radar_list.columns
label=""
name="flags"
tool_tip="Has payment info on file"
relative_width="0.03"/>
<radar_list.columns
label="Age"
name="age"
relative_width="0.1"/>
<radar_list.columns
label="Seen"
name="seen"
relative_width="0.15"/>
<radar_list.columns
label="Range"
name="range"
relative_width="0.15"/>
<radar_list.columns
label="av_id"
name="uuid"
relative_width="0"/>
</radar_list>
</layout_panel>
</layout_stack>
<!-- Buttons -->
<panel
background_visible="false"
follows="left|right|bottom"
height="27"
label="bottom_panel"
layout="topleft"
left="0"
name="bottom_panel_nearby"
top_pad="0"
width="331">
<menu_button
follows="bottom|left"
height="25"
image_hover_unselected="Toolbar_Left_Over"
image_overlay="OptionsMenu_Off"
image_selected="Toolbar_Left_Selected"
image_unselected="Toolbar_Left_Off"
layout="topleft"
left="0"
name="nearby_view_sort_btn"
tool_tip="Options"
top="1"
width="31"/>
<button
follows="bottom|left"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="AddItem_Off"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
layout="topleft"
left_pad="1"
name="add_friend_btn_nearby"
tool_tip="Add selected Resident to your friends List"
width="31">
<commit_callback
function="People.addFriend"/>
</button>
<icon
follows="bottom|left|right"
height="25"
image_name="Toolbar_Right_Off"
layout="topleft"
left_pad="1"
name="nearby_dummy_icon"
width="262"/>
<slider
visibility_control="LimitRadarByRange"
control_name="NearMeRange"
decimal_digits="0"
follows="bottom|left"
height="16"
increment="2"
initial_value="96"
label="Range(m):"
label_width="70"
layout="topleft"
max_val="4096"
min_val="20"
name="NearMeRange"
visible="True"
left_delta="10"
top_delta="6"
width="220"/>
</panel>
</panel>
<!-- END NEARBY TAB -->
<panel
follows="bottom|left|right"
height="23"
layout="topleft"
left="3"
top_pad="1"
name="button_bar"
width="326">
<layout_stack
follows="bottom|left|right"
height="23"
layout="topleft"
name="bottom_bar_ls"
orientation="horizontal"
top_pad="0"
width="326">
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
name="view_profile_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
height="23"
label="Profile"
layout="topleft"
left="1"
name="view_profile_btn"
tool_tip="Show picture, groups, and other Residents information"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="1"
name="im_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="IM"
layout="topleft"
name="im_btn"
tool_tip="Open instant message session"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="Call"
layout="topleft"
name="call_btn"
tool_tip="Call this Resident"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="share_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="Share"
layout="topleft"
name="share_btn"
tool_tip="Share an inventory item"
top="0"
width="71"/>
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="tp_btn_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
follows="bottom|left|right"
left="1"
height="23"
label="Teleport"
layout="topleft"
name="teleport_btn"
tool_tip="Offer teleport"
top="0"
width="71"/>
</layout_panel>
</layout_stack>
</panel>
</floater>

View File

@ -0,0 +1,187 @@
<?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="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="Map"
layout="topleft"
name="Map">
<menu_item_call.on_click
function="Avatar.ShowOnMap" />
<menu_item_call.on_enable
function="Avatar.EnableItem"
parameter="can_show_on_map" />
</menu_item_call>
<menu_item_call
label="Track"
layout="topleft"
name="Track">
<menu_item_call.on_click
function="Nearby.People.TrackAvatar" />
</menu_item_call>
<menu_item_call
label="Share"
layout="topleft"
name="Share">
<menu_item_call.on_click
function="Avatar.Share" />
</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>
<menu_item_call
label="Teleport To"
name="teleport_to">
<menu_item_call.on_click
function="Nearby.People.TeleportToAvatar"/>
</menu_item_call>
<menu_item_call
label="Zoom In"
name="zoom_in">
<menu_item_call.on_click
function="Avatar.ZoomIn"/>
<menu_item_call.on_visible
function="Avatar.VisibleZoomIn"/>
</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_call
label="Get Script Info"
name="ScriptInfo">
<menu_item_call.on_click
function="Avatar.getScriptInfo" />
</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>
<menu_item_call
label="Report"
name="report">
<menu_item_call.on_click
function="Avatar.Report"/>
</menu_item_call>
<menu_item_call
label="Freeze"
name="freeze">
<menu_item_call.on_click
function="Avatar.Freeze"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Parcel Eject"
name="eject">
<menu_item_call.on_click
function="Avatar.Eject"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Estate Kick"
name="kick">
<menu_item_call.on_click
function="Avatar.Kick"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Teleport Home"
name="teleport_home">
<menu_item_call.on_click
function="Avatar.TeleportHome"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Ban"
name="estate_ban">
<menu_item_call.on_click
function="Avatar.EstateBan"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Derender"
name="derender">
<menu_item_call.on_click
function="Avatar.Derender"/>
</menu_item_call>
<menu_item_call
label="Derender + Blacklist"
name="derender_permanent">
<menu_item_call.on_click
function="Avatar.DerenderPermanent"/>
</menu_item_call>
</context_menu>

View File

@ -0,0 +1,202 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu
name="menu_group_plus"
left="0" bottom="0" visible="false"
mouse_opaque="false">
<menu_item_check
label="Show Minimap above Radar"
name="ShowRadarMinimap">
<menu_item_check.on_check
control="ShowRadarMinimap" />
<menu_item_check.on_click
function="ToggleControl"
parameter="ShowRadarMinimap" />
<menu_item_check.on_enable
function="RLV.EnableIfNot"
parameter="showminimap" />
</menu_item_check>
<menu_item_check
label="Limit Results to specific Radius"
name="LimitRadarByRange">
<menu_item_check.on_check
control="LimitRadarByRange" />
<menu_item_check.on_click
function="ToggleControl"
parameter="LimitRadarByRange" />
</menu_item_check>
<context_menu
label="Radar Name Format"
name="radarNameFormat">
<menu_item_check
label="Display Name"
name="radarFmtDN"
enabled_control="UseDisplayNames">
<menu_item_check.on_check
function="Radar.NameFmtCheck"
parameter="DN"/>
<menu_item_check.on_click
function="Radar.NameFmt"
parameter="DN"/>
</menu_item_check>
<menu_item_check
label="Username"
name="radarFmtUN">
<menu_item_check.on_check
function="Radar.NameFmtCheck"
parameter="UN"/>
<menu_item_check.on_click
function="Radar.NameFmt"
parameter="UN"/>
</menu_item_check>
<menu_item_check
label="Display Name (Username)"
name="radarFmtDNUN"
enabled_control="UseDisplayNames">
<menu_item_check.on_check
function="Radar.NameFmtCheck"
parameter="DNUN"/>
<menu_item_check.on_click
function="Radar.NameFmt"
parameter="DNUN"/>
</menu_item_check>
<menu_item_check
label="Username (Display Name)"
name="radarFmtUNDN"
enabled_control="UseDisplayNames">
<menu_item_check.on_check
function="Radar.NameFmtCheck"
parameter="UNDN"/>
<menu_item_check.on_click
function="Radar.NameFmt"
parameter="UNDN"/>
</menu_item_check>
</context_menu>
<menu_item_separator layout="topleft" />
<context_menu
label="Report To"
name="report_to_menu">
<menu_item_check
label="Nearby Chat"
name="radar_nearby_chat">
<menu_item_check.on_check
function="Radar.ReportToCheck"
parameter="radar_nearby_chat" />
<menu_item_check.on_click
function="Radar.ReportTo"
parameter="radar_nearby_chat" />
</menu_item_check>
<menu_item_check
label="Notification Toasts"
name="radar_nearby_chat">
<menu_item_check.on_check
function="Radar.ReportToCheck"
parameter="radar_toasts" />
<menu_item_check.on_click
function="Radar.ReportTo"
parameter="radar_toasts" />
</menu_item_check>
</context_menu>
<menu_item_check
label="Local chat distance ring in Minimap"
name="MiniMapChatRing">
<menu_item_check.on_check
control="MiniMapChatRing" />
<menu_item_check.on_click
function="ToggleControl"
parameter="MiniMapChatRing" />
</menu_item_check>
<menu_item_check
label="Report Entering Draw Range"
name="RadarReportDrawRangeEnter">
<menu_item_check.on_check
control="RadarReportDrawRangeEnter" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarReportDrawRangeEnter" />
</menu_item_check>
<menu_item_check
label="Report Leaving Draw Range"
name="RadarReportDrawRangeLeave">
<menu_item_check.on_check
control="RadarReportDrawRangeLeave" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarReportDrawRangeLeave" />
</menu_item_check>
<menu_item_check
label="Report Entering Chat Range"
name="RadarReportChatRangeEnter">
<menu_item_check.on_check
control="RadarReportChatRangeEnter" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarReportChatRangeEnter" />
</menu_item_check>
<menu_item_check
label="Report Leaving Chat Range"
name="RadarReportChatRangeLeave">
<menu_item_check.on_check
control="RadarReportChatRangeLeave" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarReportChatRangeLeave" />
</menu_item_check>
<menu_item_check
label="Report Entering your Region"
name="RadarReportSimRangeEnter">
<menu_item_check.on_check
control="RadarReportSimRangeEnter" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarReportSimRangeEnter" />
</menu_item_check>
<menu_item_check
label="Report Leaving your Region"
name="RadarReportSimRangeLeave">
<menu_item_check.on_check
control="RadarReportSimRangeLeave" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarReportSimRangeLeave" />
</menu_item_check>
<menu_item_check
label="Report Enter Alerts to Scripts"
name="RadarEnterChannelAlert">
<menu_item_check.on_check
control="RadarEnterChannelAlert" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarEnterChannelAlert" />
</menu_item_check>
<menu_item_check
label="Report Exit Alerts to Scripts"
name="RadarLeaveChannelAlert">
<menu_item_check.on_check
control="RadarLeaveChannelAlert" />
<menu_item_check.on_click
function="ToggleControl"
parameter="RadarLeaveChannelAlert" />
<menu_item_check.on_enable
function="RLV.EnableIfNot"
parameter="showminimap" />
</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="Radar.Gear.Action" userdata="panel_block_list_sidetray" />
</menu_item_call>
</toggleable_menu>

View File

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<context_menu
layout="topleft"
name="Multi-Selected People Context Menu">
<menu_item_call
enabled="false"
label="Add Friends"
layout="topleft"
name="Add Friends">
<on_click
function="Avatar.AddFriends" />
<on_enable
function="Avatar.EnableItem"
parameter="can_add" />
</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
enabled="false"
label="Share"
layout="topleft"
name="Share">
<on_click
function="Avatar.Share" />
</menu_item_call>
<menu_item_call
enabled="false"
label="Pay"
layout="topleft"
name="Pay">
<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>
<menu_item_separator />
<menu_item_call
label="Freeze"
name="freeze">
<menu_item_call.on_click
function="Avatar.Freeze"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Parcel Eject"
name="eject">
<menu_item_call.on_click
function="Avatar.Eject"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Estate Kick"
name="kick">
<menu_item_call.on_click
function="Avatar.Kick"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Teleport Home"
name="teleport_home">
<menu_item_call.on_click
function="Avatar.TeleportHome"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Ban"
name="estate_ban">
<menu_item_call.on_click
function="Avatar.EstateBan"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Derender"
name="derender">
<menu_item_call.on_click
function="Avatar.Derender"/>
</menu_item_call>
<menu_item_call
label="Derender + Blacklist"
name="derender_permanent">
<menu_item_call.on_click
function="Avatar.DerenderPermanent"/>
</menu_item_call>
</context_menu>

View File

@ -56,13 +56,6 @@
function="Avatar.EnableItem"
parameter="can_show_on_map" />
</menu_item_call>
<menu_item_call
label="Track"
layout="topleft"
name="Track">
<menu_item_call.on_click
function="Nearby.People.TrackAvatar" />
</menu_item_call>
<menu_item_call
label="Share"
layout="topleft"
@ -77,42 +70,6 @@
<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>
<menu_item_call
label="Teleport To"
name="teleport_to">
<menu_item_call.on_click
function="Nearby.People.TeleportToAvatar"/>
</menu_item_call>
<menu_item_call
label="Zoom In"
name="zoom_in">
<menu_item_call.on_click
function="Avatar.ZoomIn"/>
<menu_item_call.on_visible
function="Avatar.VisibleZoomIn"/>
</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_call
label="Get Script Info"
name="ScriptInfo">
<menu_item_call.on_click
function="Avatar.getScriptInfo" />
</menu_item_call>
<menu_item_separator />
<menu_item_check
label="Block/Unblock"
layout="topleft"
@ -126,62 +83,16 @@
function="Avatar.EnableItem"
parameter="can_block" />
</menu_item_check>
<menu_item_call
label="Report"
name="report">
<menu_item_call.on_click
function="Avatar.Report"/>
</menu_item_call>
<menu_item_call
label="Freeze"
name="freeze">
<menu_item_call.on_click
function="Avatar.Freeze"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Parcel Eject"
name="eject">
<menu_item_call.on_click
function="Avatar.Eject"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Estate Kick"
name="kick">
<menu_item_call.on_click
function="Avatar.Kick"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Teleport Home"
name="teleport_home">
<menu_item_call.on_click
function="Avatar.TeleportHome"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Ban"
name="estate_ban">
<menu_item_call.on_click
function="Avatar.EstateBan"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Derender"
name="derender">
<menu_item_call.on_click
function="Avatar.Derender"/>
</menu_item_call>
<menu_item_call
label="Derender + Blacklist"
name="derender_permanent">
<menu_item_call.on_click
function="Avatar.DerenderPermanent"/>
</menu_item_call>
<menu_item_call
label="Offer Teleport"
name="teleport">
<menu_item_call.on_click
function="Avatar.OfferTeleport"/>
</menu_item_call>
<menu_item_call
label="Invite To Group"
name="GroupInvite">
<menu_item_call.on_click
function="Avatar.GroupInvite" />
</menu_item_call>
</context_menu>

View File

@ -63,59 +63,4 @@
<menu_item_call.on_click
function="Avatar.OfferTeleport"/>
</menu_item_call>
<menu_item_separator />
<menu_item_call
label="Freeze"
name="freeze">
<menu_item_call.on_click
function="Avatar.Freeze"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Parcel Eject"
name="eject">
<menu_item_call.on_click
function="Avatar.Eject"/>
<menu_item_call.on_visible
function="Avatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Estate Kick"
name="kick">
<menu_item_call.on_click
function="Avatar.Kick"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Teleport Home"
name="teleport_home">
<menu_item_call.on_click
function="Avatar.TeleportHome"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Estate Ban"
name="estate_ban">
<menu_item_call.on_click
function="Avatar.EstateBan"/>
<menu_item_call.on_visible
function="Avatar.VisibleKickTeleportHome"/>
</menu_item_call>
<menu_item_call
label="Derender"
name="derender">
<menu_item_call.on_click
function="Avatar.Derender"/>
</menu_item_call>
<menu_item_call
label="Derender + Blacklist"
name="derender_permanent">
<menu_item_call.on_click
function="Avatar.DerenderPermanent"/>
</menu_item_call>
</context_menu>

View File

@ -638,6 +638,17 @@
parameter="nearby_panel" />
</menu_item_call>
<menu_item_check
label="Radar"
name="Radar">
<menu_item_check.on_check
function="Floater.Visible"
parameter="fs_radar" />
<menu_item_check.on_click
function="Floater.Toggle"
parameter="fs_radar" />
</menu_item_check>
<menu_item_call
label="Teleport History"
name="Teleport History"

View File

@ -14,30 +14,6 @@
<string
name="high_server_load"
value="Due to server load, mass toggling visibility can take a while to become effective. Please be patient."/>
<string
name="camera_no_focus"
value="The camera cannot focus user [AVATARNAME] because they are outside your draw distance."/>
<string
name="entering_draw_distance"
value="entered draw distance ([DISTANCE] m)."/>
<string
name="leaving_draw_distance"
value="left draw distance."/>
<string
name="entering_chat_range"
value="entered chat range ([DISTANCE] m)."/>
<string
name="leaving_chat_range"
value="left chat range."/>
<string
name="entering_region"
value="entered the region."/>
<string
name="entering_region_distance"
value="entered the region ([DISTANCE] m)."/>
<string
name="leaving_region"
value="left the region."/>
<string
name="no_recent_people"
value="No recent people. 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." />
@ -146,7 +122,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
top="0" left="3"
height="140"
width="326"
max_height="140"
min_dim="140"
follows="top"
mouse_opaque="false"
visibility_control="ShowRadarMinimap"
@ -282,6 +258,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
name="nearby_dummy_icon"
width="257" />
<slider
visibility_control="LimitRadarByRange"
control_name="NearMeRange"
decimal_digits="0"
follows="bottom|left"

View File

@ -4863,6 +4863,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Teleport_History_Label">Teleport History</string>
<string name="Command_Pose_Stand_Label">Pose Stand</string>
<string name="Command_Snapshot_To_Disk_Label">Snapshot to Disk</string>
<string name="Command_Radar_Label">Radar</string>
<string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
@ -4910,6 +4911,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Teleport_History_Tooltip">Opens Teleport History</string>
<string name="Command_Pose_Stand_Tooltip">Avatar pose stand for adjusting attachments</string>
<string name="Command_Snapshot_To_Disk_Tooltip">Takes a quick snapshot and saves it to harddisk</string>
<string name="Command_Radar_Tooltip">Opens the radar for nearby avatars</string>
<string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>
<string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string>
@ -5082,4 +5084,14 @@ Try enclosing path to the editor with double quotes.
<string name="QP_WL_None">None</string>
<string name="GroupChatMuteNotice">Muting group chat from [NAME].</string>
<!-- <FS:Ansariel> Radar notifications -->
<string name="camera_no_focus">The camera cannot focus user [AVATARNAME] because they are outside your draw distance.</string>
<string name="entering_draw_distance">entered draw distance ([DISTANCE] m).</string>
<string name="leaving_draw_distance">left draw distance.</string>
<string name="entering_chat_range">entered chat range ([DISTANCE] m).</string>
<string name="leaving_chat_range">left chat range.</string>
<string name="entering_region">entered the region.</string>
<string name="entering_region_distance">entered the region ([DISTANCE] m).</string>
<string name="leaving_region">left the region.</string>
</strings>

View File

@ -14,30 +14,6 @@
<string
name="high_server_load"
value="Due to server load, mass toggling visibility can take a while to become effective. Please be patient."/>
<string
name="camera_no_focus"
value="The camera cannot focus user [AVATARNAME] because they are outside your draw distance."/>
<string
name="entering_draw_distance"
value="entered draw distance ([DISTANCE] m)."/>
<string
name="leaving_draw_distance"
value="left draw distance."/>
<string
name="entering_chat_range"
value="entered chat range ([DISTANCE] m)."/>
<string
name="leaving_chat_range"
value="left chat range."/>
<string
name="entering_region"
value="entered the region."/>
<string
name="entering_region_distance"
value="entered the region ([DISTANCE] m)."/>
<string
name="leaving_region"
value="left the region."/>
<string
name="no_recent_people"
value="No recent people. 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." />
@ -146,7 +122,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
top="0" left="3"
height="140"
width="326"
max_height="140"
min_dim="140"
follows="top"
mouse_opaque="false"
visibility_control="ShowRadarMinimap"
@ -282,6 +258,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
name="nearby_dummy_icon"
width="257" />
<slider
visibility_control="LimitRadarByRange"
control_name="NearMeRange"
decimal_digits="0"
follows="bottom|left"

View File

@ -13,30 +13,6 @@
<string
name="high_server_load"
value="Due to server load, mass toggling visibility can take a while to become effective. Please be patient."/>
<string
name="camera_no_focus"
value="The camera cannot focus user [AVATARNAME] because they are outside your draw distance."/>
<string
name="entering_draw_distance"
value="entered draw distance ([DISTANCE] m)."/>
<string
name="leaving_draw_distance"
value="left draw distance."/>
<string
name="entering_chat_range"
value="entered chat range ([DISTANCE] m)."/>
<string
name="leaving_chat_range"
value="left chat range."/>
<string
name="entering_region"
value="entered the region."/>
<string
name="entering_region_distance"
value="entered the region ([DISTANCE] m)."/>
<string
name="leaving_region"
value="left the region."/>
<string
name="no_recent_people"
value="No recent people. 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." />
@ -160,6 +136,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
height="140"
width="313"
follows="all"
min_dim="140"
mouse_opaque="false"
visibility_control="ShowRadarMinimap"
name="minimaplayout"
@ -362,6 +339,7 @@ Looking for people to hang out with? Use the search box to find topics or conten
layout="topleft"
follows="left|top" />
<slider
visibility_control="LimitRadarByRange"
enabled_control="LimitRadarByRange"
control_name="NearMeRange"
decimal_digits="0"