merge from PE's viewer-trunk

master
Tofu Linden 2010-04-15 10:23:13 +01:00
commit 9f0f610682
24 changed files with 568 additions and 184 deletions

View File

@ -4,13 +4,14 @@
<key>AFKTimeout</key>
<map>
<key>Comment</key>
<string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never)</string>
<string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
Valid values are: 0, 120, 300, 600, 1800</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<real>0</real>
<real>300</real>
</map>
<key>AdvanceSnapshot</key>
<map>

View File

@ -32,13 +32,18 @@
#include "llviewerprecompiledheaders.h"
// common
#include "lltrans.h"
#include "llavatarlist.h"
#include "llagentdata.h" // for comparator
// newview
#include "llavatariconctrl.h"
#include "llcallingcard.h" // for LLAvatarTracker
#include "llcachename.h"
#include "llrecentpeople.h"
#include "lltextutil.h"
#include "lluuid.h"
#include "llvoiceclient.h"
#include "llviewercontrol.h" // for gSavedSettings
@ -193,6 +198,18 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)
}
}
void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name)
{
LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL;
LLAvalineListItem* item = new LLAvalineListItem;
item->setAvatarId(item_id, session_id, true, false);
item->setName(item_name);
addItem(item, item_id);
mIDs.push_back(item_id);
sort();
}
//////////////////////////////////////////////////////////////////////////
// PROTECTED SECTION
//////////////////////////////////////////////////////////////////////////
@ -471,3 +488,61 @@ bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_
}
return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);
}
/************************************************************************/
/* class LLAvalineListItem */
/************************************************************************/
LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false)
, mIsHideNumber(hide_number)
{
// should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called.
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml");
}
BOOL LLAvalineListItem::postBuild()
{
BOOL rv = LLAvatarListItem::postBuild();
if (rv)
{
setOnline(true);
showLastInteractionTime(false);
setShowProfileBtn(false);
setShowInfoBtn(false);
mAvatarIcon->setValue("Avaline_Icon");
mAvatarIcon->setToolTip(std::string(""));
}
return rv;
}
// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number
void LLAvalineListItem::setName(const std::string& name)
{
if (mIsHideNumber)
{
static U32 order = 0;
typedef std::map<LLUUID, U32> avaline_callers_nums_t;
static avaline_callers_nums_t mAvalineCallersNums;
llassert(getAvatarId() != LLUUID::null);
const LLUUID &uuid = getAvatarId();
if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end())
{
mAvalineCallersNums[uuid] = ++order;
LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL;
}
LLStringUtil::format_map_t args;
args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]);
std::string hidden_name = LLTrans::getString("AvalineCaller", args);
LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL;
LLAvatarListItem::setName(hidden_name);
}
else
{
const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
LLAvatarListItem::setName(formatted_phone);
}
}

View File

@ -96,6 +96,8 @@ public:
virtual S32 notifyParent(const LLSD& info);
void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);
protected:
void refresh();
@ -175,4 +177,27 @@ protected:
virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
};
/**
* Represents Avaline caller in Avatar list in Voice Control Panel and group chats.
*/
class LLAvalineListItem : public LLAvatarListItem
{
public:
/**
* Constructor
*
* @param hide_number - flag indicating if number should be hidden.
* In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc.
*/
LLAvalineListItem(bool hide_number = true);
/*virtual*/ BOOL postBuild();
/*virtual*/ void setName(const std::string& name);
private:
bool mIsHideNumber;
};
#endif // LL_LLAVATARLIST_H

View File

@ -212,21 +212,25 @@ void LLAvatarListItem::setState(EItemState item_style)
mAvatarIcon->setColor(item_icon_color_map[item_style]);
}
void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes)
void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes/* = false*/, bool is_resident/* = true*/)
{
if (mAvatarId.notNull())
LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarId, this);
mAvatarId = id;
mAvatarIcon->setValue(id);
mSpeakingIndicator->setSpeakerId(id, session_id);
// We'll be notified on avatar online status changes
if (!ignore_status_changes && mAvatarId.notNull())
LLAvatarTracker::instance().addParticularFriendObserver(mAvatarId, this);
// Set avatar name.
gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3));
if (is_resident)
{
mAvatarIcon->setValue(id);
// Set avatar name.
gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3));
}
}
void LLAvatarListItem::showLastInteractionTime(bool show)

View File

@ -100,7 +100,7 @@ public:
void setName(const std::string& name);
void setHighlight(const std::string& highlight);
void setState(EItemState item_style);
void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false);
void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false, bool is_resident = true);
void setLastInteractionTime(U32 secs_since);
//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
void setShowProfileBtn(bool show);

View File

@ -451,8 +451,8 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
LLFloaterAvatarPicker* floater = LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
// these are not results from our last request
if (query_id != floater->mQueryID)
// floater is closed or these are not results from our last request
if (NULL == floater || query_id != floater->mQueryID)
{
return;
}

View File

@ -113,7 +113,6 @@ BOOL LLFloaterEvent::postBuild()
mTBDuration = getChild<LLTextBox>("event_duration");
mTBDesc = getChild<LLExpandableTextBox>("event_desc");
mTBDesc->setEnabled(FALSE);
mTBRunBy = getChild<LLTextBox>("event_runby");
mTBLocation = getChild<LLTextBox>("event_location");

View File

@ -499,8 +499,8 @@ void LLIMFloater::setVisible(BOOL visible)
{
//only if floater was construced and initialized from xml
updateMessages();
//prevent steal focus when IM opened in multitab mode
if (!isChatMultiTab())
//prevent stealing focus when opening a background IM tab (EXT-5387, checking focus for EXT-6781)
if (!isChatMultiTab() || hasFocus())
{
mInputEditor->setFocus(TRUE);
}

View File

@ -200,7 +200,8 @@ void LLFloaterMove::setFlyingMode(BOOL fly)
if (instance)
{
instance->setFlyingModeImpl(fly);
instance->showModeButtons(!fly);
BOOL is_sitting = isAgentAvatarValid() && gAgentAvatarp->isSitting();
instance->showModeButtons(!fly && !is_sitting);
}
if (fly)
{

View File

@ -50,6 +50,145 @@
static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR;
// See EXT-4301.
/**
* class LLAvalineUpdater - observe the list of voice participants in session and check
* presence of Avaline Callers among them.
*
* LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation:
* - whether Avaline caller presence among participants;
* - whether watched Avaline caller still exists in voice channel.
* Both validations have callbacks which will notify subscriber if any of event occur.
*
* @see findAvalineCaller()
* @see checkIfAvalineCallersExist()
*/
class LLAvalineUpdater : public LLVoiceClientParticipantObserver
{
public:
typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t;
LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb)
: mAvalineFoundCallback(found_cb)
, mAvalineRemovedCallback(removed_cb)
{
LLVoiceClient::getInstance()->addObserver(this);
}
~LLAvalineUpdater()
{
if (LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->removeObserver(this);
}
}
/**
* Adds UUID of Avaline caller to watch.
*
* @see checkIfAvalineCallersExist().
*/
void watchAvalineCaller(const LLUUID& avaline_caller_id)
{
mAvalineCallers.insert(avaline_caller_id);
}
void onChange()
{
uuid_set_t participant_uuids;
LLVoiceClient::getInstance()->getParticipantsUUIDSet(participant_uuids);
// check whether Avaline caller exists among voice participants
// and notify Participant List
findAvalineCaller(participant_uuids);
// check whether watched Avaline callers still present among voice participant
// and remove if absents.
checkIfAvalineCallersExist(participant_uuids);
}
private:
typedef std::set<LLUUID> uuid_set_t;
/**
* Finds Avaline callers among voice participants and calls mAvalineFoundCallback.
*
* When Avatar is in group call with Avaline caller and then ends call Avaline caller stays
* in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again
* Avaline caller is added to voice channel AFTER Avatar is connected to group call.
* But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information
* if a speaker is Avaline caller.
*
* In this case this speaker is created as avatar and will be recreated when it appears in
* Avatar's Voice session.
*
* @see LLParticipantList::onAvalineCallerFound()
*/
void findAvalineCaller(const uuid_set_t& participant_uuids)
{
uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end();
for(; it != it_end; ++it)
{
const LLUUID& participant_id = *it;
if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id))
{
LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL;
if (mAvalineFoundCallback)
{
mAvalineFoundCallback(participant_id);
}
}
}
}
/**
* Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback.
*
* The problem is when Avaline caller ends a call it is removed from Voice Client session but
* still exists in LLSpeakerMgr. Server does not send such information.
* This method implements a HUCK to notify subscribers that watched Avaline callers by class
* are not anymore in the call.
*
* @see LLParticipantList::onAvalineCallerRemoved()
*/
void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids)
{
uuid_set_t::iterator it = mAvalineCallers.begin();
uuid_set_t::const_iterator participants_it_end = participant_uuids.end();
while (it != mAvalineCallers.end())
{
const LLUUID participant_id = *it;
LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL;
bool not_found = participant_uuids.find(participant_id) == participants_it_end;
if (not_found)
{
LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL;
// notify Participant List
if (mAvalineRemovedCallback)
{
mAvalineRemovedCallback(participant_id);
}
// remove from the watch list
mAvalineCallers.erase(it++);
}
else
{
++it;
}
}
}
process_avaline_callback_t mAvalineFoundCallback;
process_avaline_callback_t mAvalineRemovedCallback;
uuid_set_t mAvalineCallers;
};
LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/,
bool exclude_agent /*= true*/, bool can_toggle_icons /*= true*/):
mSpeakerMgr(data_source),
@ -59,6 +198,9 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
, mExcludeAgent(exclude_agent)
, mValidateSpeakerCallback(NULL)
{
mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1),
boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1));
mSpeakerAddListener = new SpeakerAddListener(*this);
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
mSpeakerClearListener = new SpeakerClearListener(*this);
@ -137,6 +279,9 @@ LLParticipantList::~LLParticipantList()
}
mAvatarList->setContextMenu(NULL);
mAvatarList->setComparator(NULL);
delete mAvalineUpdater;
}
void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
@ -210,6 +355,55 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
}
}
/*
Seems this method is not necessary after onAvalineCallerRemoved was implemented;
It does nothing because list item is always created with correct class type for Avaline caller.
For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client
session.
This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call.
Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself.
Asked in EXT-4301.
*/
void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id)
{
LLPanel* item = mAvatarList->getItemByValue(participant_id);
if (NULL == item)
{
LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL;
return;
}
if (typeid(*item) == typeid(LLAvalineListItem))
{
LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL;
// item representing an Avaline caller has a correct type already.
return;
}
LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL;
// remove UUID from LLAvatarList::mIDs to be able add it again.
uuid_vec_t& ids = mAvatarList->getIDs();
uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id);
ids.erase(pos);
// remove item directly
mAvatarList->removeItem(item);
// re-add avaline caller with a correct class instance.
addAvatarIDExceptAgent(participant_id);
}
void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id)
{
LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL;
mSpeakerMgr->removeAvalineSpeaker(participant_id);
}
void LLParticipantList::setSortOrder(EParticipantSortOrder order)
{
if ( mSortOrder != order )
@ -355,8 +549,20 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
if (mExcludeAgent && gAgent.getID() == avatar_id) return;
if (mAvatarList->contains(avatar_id)) return;
mAvatarList->getIDs().push_back(avatar_id);
mAvatarList->setDirty();
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(avatar_id);
if (is_avatar)
{
mAvatarList->getIDs().push_back(avatar_id);
mAvatarList->setDirty();
}
else
{
LLVoiceClient::participantState *participant = LLVoiceClient::getInstance()->findParticipantByID(avatar_id);
mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), participant ? participant->mAccountName : LLTrans::getString("AvatarNameWaiting"));
mAvalineUpdater->watchAvalineCaller(avatar_id);
}
adjustParticipant(avatar_id);
}

View File

@ -38,6 +38,7 @@
class LLSpeakerMgr;
class LLAvatarList;
class LLUICtrl;
class LLAvalineUpdater;
class LLParticipantList
{
@ -235,6 +236,9 @@ class LLParticipantList
void onAvatarListDoubleClicked(LLUICtrl* ctrl);
void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
void onAvalineCallerFound(const LLUUID& participant_id);
void onAvalineCallerRemoved(const LLUUID& participant_id);
/**
* Adjusts passed participant to work properly.
*
@ -272,4 +276,5 @@ class LLParticipantList
LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers;
validate_speaker_callback_t mValidateSpeakerCallback;
LLAvalineUpdater* mAvalineUpdater;
};

View File

@ -234,6 +234,14 @@ public:
LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; }
const LLUUID getSessionID();
/**
* Removes avaline speaker.
*
* This is a HACK due to server does not send information that Avaline caller ends call.
* It can be removed when server is updated. See EXT-4301 for details
*/
bool removeAvalineSpeaker(const LLUUID& speaker_id) { return removeSpeaker(speaker_id); }
protected:
virtual void updateSpeakerList();
void setSpeakerNotInChannel(LLSpeaker* speackerp);

View File

@ -32,6 +32,7 @@
#include "llviewerprecompiledheaders.h"
#include "llviewermessage.h"
#include "boost/lexical_cast.hpp"
#include "llanimationstates.h"
#include "llaudioengine.h"
@ -1856,6 +1857,53 @@ protected:
}
};
static void parse_lure_bucket(const std::string& bucket,
U64& region_handle,
LLVector3& pos,
LLVector3& look_at,
U8& region_access)
{
// tokenize the bucket
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
tokenizer tokens(bucket, sep);
tokenizer::iterator iter = tokens.begin();
S32 gx = boost::lexical_cast<S32>((*(iter)).c_str());
S32 gy = boost::lexical_cast<S32>((*(++iter)).c_str());
S32 rx = boost::lexical_cast<S32>((*(++iter)).c_str());
S32 ry = boost::lexical_cast<S32>((*(++iter)).c_str());
S32 rz = boost::lexical_cast<S32>((*(++iter)).c_str());
S32 lx = boost::lexical_cast<S32>((*(++iter)).c_str());
S32 ly = boost::lexical_cast<S32>((*(++iter)).c_str());
S32 lz = boost::lexical_cast<S32>((*(++iter)).c_str());
// Grab region access
region_access = SIM_ACCESS_MIN;
if (++iter != tokens.end())
{
std::string access_str((*iter).c_str());
LLStringUtil::trim(access_str);
if ( access_str == "A" )
{
region_access = SIM_ACCESS_ADULT;
}
else if ( access_str == "M" )
{
region_access = SIM_ACCESS_MATURE;
}
else if ( access_str == "PG" )
{
region_access = SIM_ACCESS_PG;
}
}
pos.setVec((F32)rx, (F32)ry, (F32)rz);
look_at.setVec((F32)lx, (F32)ly, (F32)lz);
region_handle = to_region_handle(gx, gy);
}
void process_improved_im(LLMessageSystem *msg, void **user_data)
{
if (gNoRender)
@ -2487,10 +2535,19 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
LLVector3 pos, look_at;
U64 region_handle;
U8 region_access;
std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);
parse_lure_bucket(region_info, region_handle, pos, look_at, region_access);
std::string region_access_str = LLViewerRegion::accessToString(region_access);
LLSD args;
// *TODO: Translate -> [FIRST] [LAST] (maybe)
args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about");
args["MESSAGE"] = message;
args["MATURITY"] = region_access_str;
LLSD payload;
payload["from_id"] = from_id;
payload["lure_id"] = session_id;

View File

@ -6,7 +6,7 @@
name="Joystick"
help_topic="joystick"
title="JOYSTICK CONFIGURATION"
width="550">
width="569">
<floater.string
name="NoDevice">
no device detected
@ -148,7 +148,7 @@
halign="right"
height="10"
layout="topleft"
left="12"
left="37"
mouse_opaque="false"
name="Control Modes:"
top="110"
@ -161,7 +161,7 @@
halign="center"
label="Avatar"
layout="topleft"
left="125"
left="150"
name="JoystickAvatarEnabled"
width="60" />
<check_box
@ -170,7 +170,7 @@
halign="center"
label="Build"
layout="topleft"
left="194"
left="219"
name="JoystickBuildEnabled"
width="60" />
<check_box
@ -179,14 +179,14 @@
halign="center"
label="Flycam"
layout="topleft"
left="262"
left="289"
name="JoystickFlycamEnabled"
width="60" />
<stat_view
height="250"
label="Joystick Monitor"
layout="topleft"
left="340"
left="359"
name="axis_view"
show_label="true"
top="142"
@ -250,9 +250,9 @@
bottom="144"
halign="right"
layout="topleft"
left="20"
left="3"
name="XScale"
width="94">
width="140">
X Scale
</text>
<spinner
@ -261,7 +261,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="125"
left="150"
max_val="50"
min_val="-50"
name="AvatarAxisScale1"
@ -272,7 +272,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="195"
left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale1"
@ -283,7 +283,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="265"
left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale1"
@ -294,9 +294,9 @@
bottom="164"
halign="right"
layout="topleft"
left="20"
left="3"
name="YScale"
width="94">
width="140">
Y Scale
</text>
<spinner
@ -305,7 +305,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="125"
left="150"
max_val="50"
min_val="-50"
name="AvatarAxisScale2"
@ -316,7 +316,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="195"
left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale2"
@ -327,7 +327,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="265"
left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale2"
@ -338,9 +338,9 @@
bottom="184"
halign="right"
layout="topleft"
left="20"
left="3"
name="ZScale"
width="94">
width="140">
Z Scale
</text>
<spinner
@ -349,7 +349,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="125"
left="150"
max_val="50"
min_val="-50"
name="AvatarAxisScale0"
@ -360,7 +360,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="195"
left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale0"
@ -371,7 +371,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="265"
left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale0"
@ -382,9 +382,9 @@
bottom="204"
halign="right"
layout="topleft"
left="20"
left="3"
name="PitchScale"
width="94">
width="140">
Pitch Scale
</text>
<spinner
@ -393,7 +393,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="125"
left="150"
max_val="1024"
min_val="-1024"
name="AvatarAxisScale4"
@ -404,7 +404,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="195"
left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale4"
@ -415,7 +415,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="265"
left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale4"
@ -426,9 +426,9 @@
bottom="224"
halign="right"
layout="topleft"
left="20"
left="3"
name="YawScale"
width="94">
width="140">
Yaw Scale
</text>
<spinner
@ -437,7 +437,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="125"
left="150"
max_val="1024"
min_val="-1024"
name="AvatarAxisScale5"
@ -448,7 +448,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="195"
left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale5"
@ -459,7 +459,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="265"
left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale5"
@ -470,9 +470,9 @@
bottom="244"
halign="right"
layout="topleft"
left="20"
left="3"
name="RollScale"
width="94">
width="140">
Roll Scale
</text>
<spinner
@ -481,7 +481,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="195"
left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale3"
@ -492,7 +492,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="265"
left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale3"
@ -503,9 +503,9 @@
bottom="274"
halign="right"
layout="topleft"
left="20"
left="3"
name="XDeadZone"
width="94">
width="140">
X Dead Zone
</text>
<spinner
@ -515,7 +515,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="125"
left="150"
name="AvatarAxisDeadZone1"
width="56" />
<spinner
@ -525,7 +525,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="195"
left="220"
name="BuildAxisDeadZone1"
width="56" />
<spinner
@ -535,7 +535,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="265"
left="290"
name="FlycamAxisDeadZone1"
width="56" />
<text
@ -544,9 +544,9 @@
bottom="294"
halign="right"
layout="topleft"
left="20"
left="3"
name="YDeadZone"
width="94">
width="140">
Y Dead Zone
</text>
<spinner
@ -556,7 +556,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="125"
left="150"
name="AvatarAxisDeadZone2"
width="56" />
<spinner
@ -566,7 +566,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="195"
left="220"
name="BuildAxisDeadZone2"
width="56" />
<spinner
@ -576,7 +576,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="265"
left="290"
name="FlycamAxisDeadZone2"
width="56" />
<text
@ -585,9 +585,9 @@
bottom="314"
halign="right"
layout="topleft"
left="20"
left="3"
name="ZDeadZone"
width="94">
width="140">
Z Dead Zone
</text>
<spinner
@ -597,7 +597,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="125"
left="150"
name="AvatarAxisDeadZone0"
width="56" />
<spinner
@ -607,7 +607,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="195"
left="220"
name="BuildAxisDeadZone0"
width="56" />
<spinner
@ -617,7 +617,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="265"
left="290"
name="FlycamAxisDeadZone0"
width="56" />
<text
@ -626,9 +626,9 @@
bottom="334"
halign="right"
layout="topleft"
left="20"
left="2"
name="PitchDeadZone"
width="94">
width="140">
Pitch Dead Zone
</text>
<spinner
@ -638,7 +638,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="125"
left="150"
name="AvatarAxisDeadZone4"
width="56" />
<spinner
@ -648,7 +648,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="195"
left="220"
name="BuildAxisDeadZone4"
width="56" />
<spinner
@ -658,7 +658,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="265"
left="290"
name="FlycamAxisDeadZone4"
width="56" />
<text
@ -667,9 +667,9 @@
bottom="354"
halign="right"
layout="topleft"
left="20"
left="3"
name="YawDeadZone"
width="94">
width="140">
Yaw Dead Zone
</text>
<spinner
@ -679,7 +679,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="125"
left="150"
name="AvatarAxisDeadZone5"
width="56" />
<spinner
@ -689,7 +689,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="195"
left="220"
name="BuildAxisDeadZone5"
width="56" />
<spinner
@ -699,7 +699,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="265"
left="290"
name="FlycamAxisDeadZone5"
width="56" />
<text
@ -708,9 +708,9 @@
bottom="374"
halign="right"
layout="topleft"
left="20"
left="3"
name="RollDeadZone"
width="94">
width="140">
Roll Dead Zone
</text>
<spinner
@ -720,7 +720,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="195"
left="220"
name="BuildAxisDeadZone3"
width="56" />
<spinner
@ -730,7 +730,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="265"
left="290"
name="FlycamAxisDeadZone3"
width="56" />
<text
@ -739,9 +739,9 @@
bottom="402"
halign="right"
layout="topleft"
left="20"
left="3"
name="Feathering"
width="94">
width="140">
Feathering
</text>
<slider
@ -752,7 +752,7 @@
increment="1"
initial_value="0.7"
layout="topleft"
left="116"
left="141"
max_val="32"
min_val="1"
name="AvatarFeathering"
@ -795,9 +795,9 @@
bottom="430"
halign="right"
layout="topleft"
left="20"
left="3"
name="ZoomScale2"
width="94">
width="140">
Zoom Scale
</text>
<spinner
@ -806,7 +806,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
left="265"
left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale6"
@ -817,9 +817,9 @@
bottom="450"
halign="right"
layout="topleft"
left="20"
left="3"
name="ZoomDeadZone"
width="96">
width="140">
Zoom Dead Zone
</text>
<spinner
@ -829,7 +829,7 @@
increment="0.01"
label_width="0"
layout="topleft"
left="265"
left="290"
name="FlycamAxisDeadZone6"
width="56" />
<button
@ -837,10 +837,10 @@
height="22"
label="SpaceNavigator Defaults"
layout="topleft"
left="340"
left="359"
name="SpaceNavigatorDefaults"
top="429"
width="184" />
width="200" />
<button
follows="right|bottom"
height="20"
@ -850,7 +850,7 @@
left_delta="0"
name="ok_btn"
top_pad="9"
width="90" />
width="98" />
<button
follows="right|bottom"
height="20"
@ -860,5 +860,5 @@
left_pad="4"
name="cancel_btn"
top_delta="0"
width="90" />
width="98" />
</floater>

View File

@ -5165,7 +5165,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
type="offer">
[NAME_SLURL] has offered to teleport you to their location:
[MESSAGE]
[MESSAGE], ([MATURITY])
<form name="form">
<button
index="0"

View File

@ -119,7 +119,7 @@
commit_on_focus_lost="false"
follows="right|top"
halign="right"
height="22"
height="23"
label="Search"
layout="topleft"
right="-10"

View File

@ -321,6 +321,7 @@
follows="all"
height="223"
layout="topleft"
single_expansion="true"
left="0"
name="advanced_info_accordion"
top_pad="10"

View File

@ -148,6 +148,8 @@
<!-- Group name: text shown for LLUUID::null -->
<string name="GroupNameNone">(none)</string>
<string name="AvalineCaller">Avaline Caller [ORDER]</string>
<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
<string name="AssetErrorNone">No error</string>
<string name="AssetErrorRequestFailed">Asset request: failed</string>

View File

@ -16,7 +16,7 @@
Modos de control:
</text>
<check_box label="Avatar" name="JoystickAvatarEnabled"/>
<check_box label="Construir" left="192" name="JoystickBuildEnabled"/>
<check_box label="Construir" name="JoystickBuildEnabled"/>
<check_box label="Flycam" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala: X
@ -27,7 +27,7 @@
<text name="ZScale">
Escala: Z
</text>
<text left="3" name="PitchScale" width="115">
<text name="PitchScale">
Escala: arriba/abajo
</text>
<text name="YawScale">
@ -45,10 +45,10 @@
<text name="ZDeadZone">
Zona muerta Z
</text>
<text left="3" name="PitchDeadZone" width="115">
<text name="PitchDeadZone">
Zona muerta arri./aba.
</text>
<text left="3" name="YawDeadZone" width="115">
<text name="YawDeadZone">
Zona muerta izq./der.
</text>
<text name="RollDeadZone">
@ -63,7 +63,7 @@
<text name="ZoomDeadZone">
Zona muerta zoom
</text>
<button font="SansSerifSmall" label="Por defecto del SpaceNavigator" left="330" name="SpaceNavigatorDefaults" width="210"/>
<button font="SansSerifSmall" label="Por defecto del SpaceNavigator" name="SpaceNavigatorDefaults"/>
<button label="OK" label_selected="OK" left="330" name="ok_btn"/>
<button label="Cancelar" label_selected="Cancelar" left_delta="120" name="cancel_btn"/>
<stat_view label="Monitor del joystick" name="axis_view">

View File

@ -26,7 +26,7 @@
<text name="ZScale">
Échelle des Z
</text>
<text left="9" name="PitchScale" width="104">
<text name="PitchScale">
Échelle du tangage
</text>
<text name="YawScale">
@ -44,13 +44,13 @@
<text name="ZDeadZone">
Zone neutre Z
</text>
<text left="4" name="PitchDeadZone" width="116">
<text name="PitchDeadZone">
Zone neutre tangage
</text>
<text name="YawDeadZone" left="10" width="104">
<text name="YawDeadZone">
Zone neutre lacet
</text>
<text name="RollDeadZone" left="10" width="104">
<text name="RollDeadZone">
Zone neutre roulis
</text>
<text name="Feathering">
@ -59,7 +59,7 @@
<text name="ZoomScale2">
Échelle du zoom
</text>
<text left="6" name="ZoomDeadZone" width="120">
<text name="ZoomDeadZone">
Zone neutre du zoom
</text>
<button label="Options par défaut du joystick" name="SpaceNavigatorDefaults"/>

View File

@ -16,7 +16,7 @@
Modalità di controllo:
</text>
<check_box label="Avatar" name="JoystickAvatarEnabled"/>
<check_box label="Costruire" left="192" name="JoystickBuildEnabled"/>
<check_box label="Costruire" name="JoystickBuildEnabled"/>
<check_box label="Camera dall&apos;alto" name="JoystickFlycamEnabled"/>
<text name="XScale">
Regolazione X
@ -27,13 +27,13 @@
<text name="ZScale">
Regolazione Z
</text>
<text left="3" name="PitchScale" width="112">
<text name="PitchScale">
Regolazione: Pitch
</text>
<text left="3" name="YawScale" width="112">
<text name="YawScale">
Regolazione: Yaw
</text>
<text left="3" name="RollScale" width="112">
<text name="RollScale">
Regolazione: Roll
</text>
<text name="XDeadZone">
@ -45,22 +45,22 @@
<text name="ZDeadZone">
Angolo morto Z
</text>
<text left="3" name="PitchDeadZone" width="112">
<text name="PitchDeadZone">
Angolo morto: Pitch
</text>
<text left="3" name="YawDeadZone" width="112">
<text name="YawDeadZone">
Angolo morto: Yaw
</text>
<text left="3" name="RollDeadZone" width="112">
<text name="RollDeadZone">
Angolo morto: Roll
</text>
<text name="Feathering">
Smussamento
</text>
<text left="6" name="ZoomScale2" width="135">
<text name="ZoomScale2">
Regolazione dello zoom
</text>
<text left="6" name="ZoomDeadZone" width="135">
<text name="ZoomDeadZone" width="140">
Angolo morto dello zoom
</text>
<button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/>

View File

@ -45,7 +45,7 @@
<text name="ZDeadZone">
Z dode zone
</text>
<text name="PitchDeadZone" left="4" width="110">
<text name="PitchDeadZone">
Stampen dode zone
</text>
<text name="YawDeadZone">

View File

@ -1,108 +1,108 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="KONFIGURACJA JOYSTICKA" width="590">
<floater name="Joystick" title="KONFIGURACJA JOYSTICKA">
<check_box label="Aktywuj Joystick:" name="enable_joystick"/>
<text left="130" name="joystick_type" width="360"/>
<spinner label="Kalibracja Osi X" label_width="130" left="20" name="JoystickAxis1" width="170"/>
<spinner label="Kalibracja Osi Y" label_width="130" left="210" name="JoystickAxis2" width="170"/>
<spinner label="Kalibracja Osi Z" label_width="130" left="400" name="JoystickAxis0" width="170"/>
<spinner label="Kalibracja Osi Z" label_width="100" left="400" name="JoystickAxis0" width="140"/>
<spinner label="Kalibracja wznoszenia" label_width="130" left="20" name="JoystickAxis4" width="170"/>
<spinner label="Kalibracja wychylania" label_width="130" left="210" name="JoystickAxis5" width="170"/>
<spinner label="Kalibracja obrotu" label_width="130" left="400" name="JoystickAxis3" width="170"/>
<spinner label="Kalibracja obrotu" label_width="100" left="400" name="JoystickAxis3" width="140"/>
<spinner label="Kalibracja powiększania" label_width="130" name="JoystickAxis6" width="170"/>
<check_box label="Bezpośrednie" left="205" name="ZoomDirect"/>
<check_box label="Kursor 3D" left="340" name="Cursor3D"/>
<check_box label="Automatyczne" left="450" name="AutoLeveling"/>
<text left="22" name="Control Modes:">
<text name="Control Modes:">
Kontroluj:
</text>
<check_box label="Awatara" left="130" name="JoystickAvatarEnabled" width="90"/>
<check_box label="Budowanie" left="205" name="JoystickBuildEnabled" width="90"/>
<check_box label="Kamerę podczas latania" left="282" name="JoystickFlycamEnabled" width="90"/>
<text name="XScale" width="104">
<check_box label="Awatara" name="JoystickAvatarEnabled" width="90"/>
<check_box label="Budowanie" name="JoystickBuildEnabled" width="90"/>
<check_box label="Kamerę podczas latania" left="300" name="JoystickFlycamEnabled" width="90"/>
<text name="XScale">
Skala X
</text>
<spinner left="133" name="AvatarAxisScale1"/>
<spinner left="208" name="BuildAxisScale1"/>
<spinner left="283" name="FlycamAxisScale1"/>
<text name="YScale" width="104">
<spinner name="AvatarAxisScale1"/>
<spinner name="BuildAxisScale1"/>
<spinner left="300" name="FlycamAxisScale1"/>
<text name="YScale">
Skala Y
</text>
<spinner left="133" name="AvatarAxisScale2"/>
<spinner left="208" name="BuildAxisScale2"/>
<spinner left="283" name="FlycamAxisScale2"/>
<text name="ZScale" width="104">
<spinner name="AvatarAxisScale2"/>
<spinner name="BuildAxisScale2"/>
<spinner left="300" name="FlycamAxisScale2"/>
<text name="ZScale">
Skala Z
</text>
<spinner left="133" name="AvatarAxisScale0"/>
<spinner left="208" name="BuildAxisScale0"/>
<spinner left="283" name="FlycamAxisScale0"/>
<text name="PitchScale" width="104">
<spinner name="AvatarAxisScale0"/>
<spinner name="BuildAxisScale0"/>
<spinner left="300" name="FlycamAxisScale0"/>
<text name="PitchScale">
Skala wznoszenia
</text>
<spinner left="133" name="AvatarAxisScale4"/>
<spinner left="208" name="BuildAxisScale4"/>
<spinner left="283" name="FlycamAxisScale4"/>
<text name="YawScale" width="104">
<spinner name="AvatarAxisScale4"/>
<spinner name="BuildAxisScale4"/>
<spinner left="300" name="FlycamAxisScale4"/>
<text name="YawScale">
Skala odchylania
</text>
<spinner left="133" name="AvatarAxisScale5"/>
<spinner left="208" name="BuildAxisScale5"/>
<spinner left="283" name="FlycamAxisScale5"/>
<text name="RollScale" width="104">
<spinner name="AvatarAxisScale5"/>
<spinner name="BuildAxisScale5"/>
<spinner left="300" name="FlycamAxisScale5"/>
<text name="RollScale">
Skala obrotu
</text>
<spinner left="208" name="BuildAxisScale3"/>
<spinner left="283" name="FlycamAxisScale3"/>
<text name="XDeadZone" width="104">
<spinner name="BuildAxisScale3"/>
<spinner left="300" name="FlycamAxisScale3"/>
<text name="XDeadZone">
Tolerancja osi X
</text>
<spinner left="133" name="AvatarAxisDeadZone1"/>
<spinner left="208" name="BuildAxisDeadZone1"/>
<spinner left="283" name="FlycamAxisDeadZone1"/>
<text name="YDeadZone" width="104">
<spinner name="AvatarAxisDeadZone1"/>
<spinner name="BuildAxisDeadZone1"/>
<spinner left="300" name="FlycamAxisDeadZone1"/>
<text name="YDeadZone">
Tolerancja osi Y
</text>
<spinner left="133" name="AvatarAxisDeadZone2"/>
<spinner left="208" name="BuildAxisDeadZone2"/>
<spinner left="283" name="FlycamAxisDeadZone2"/>
<text name="ZDeadZone" width="104">
<spinner name="AvatarAxisDeadZone2"/>
<spinner name="BuildAxisDeadZone2"/>
<spinner left="300" name="FlycamAxisDeadZone2"/>
<text name="ZDeadZone">
Tolerancja osi Z
</text>
<spinner left="133" name="AvatarAxisDeadZone0"/>
<spinner left="208" name="BuildAxisDeadZone0"/>
<spinner left="283" name="FlycamAxisDeadZone0"/>
<text name="PitchDeadZone" width="104">
<spinner name="AvatarAxisDeadZone0"/>
<spinner name="BuildAxisDeadZone0"/>
<spinner left="300" name="FlycamAxisDeadZone0"/>
<text name="PitchDeadZone">
Tolerancja wznoszenia
</text>
<spinner left="133" name="AvatarAxisDeadZone4"/>
<spinner left="208" name="BuildAxisDeadZone4"/>
<spinner left="283" name="FlycamAxisDeadZone4"/>
<text name="YawDeadZone" width="104">
<spinner name="AvatarAxisDeadZone4"/>
<spinner name="BuildAxisDeadZone4"/>
<spinner left="300" name="FlycamAxisDeadZone4"/>
<text name="YawDeadZone">
Tolerancja odchylania
</text>
<spinner left="133" name="AvatarAxisDeadZone5"/>
<spinner left="208" name="BuildAxisDeadZone5"/>
<spinner left="283" name="FlycamAxisDeadZone5"/>
<text name="RollDeadZone" width="104">
<spinner name="AvatarAxisDeadZone5"/>
<spinner name="BuildAxisDeadZone5"/>
<spinner left="300" name="FlycamAxisDeadZone5"/>
<text name="RollDeadZone">
Tolerancja obrotu
</text>
<spinner left="208" name="BuildAxisDeadZone3"/>
<spinner left="283" name="FlycamAxisDeadZone3"/>
<text name="Feathering" width="104">
<spinner name="BuildAxisDeadZone3"/>
<spinner left="300" name="FlycamAxisDeadZone3"/>
<text name="Feathering">
Przenikanie
</text>
<slider label="" left="125" name="AvatarFeathering"/>
<slider label="" left="200" name="BuildFeathering"/>
<slider label="" left="275" name="FlycamFeathering"/>
<text name="ZoomScale2" width="104">
<slider label="" name="AvatarFeathering"/>
<slider label="" name="BuildFeathering"/>
<slider label="" left_delta="81" name="FlycamFeathering"/>
<text name="ZoomScale2">
Skala powiększania
</text>
<spinner label="" left="283" name="FlycamAxisScale6"/>
<text name="ZoomDeadZone" width="104">
<spinner label="" left="300" name="FlycamAxisScale6"/>
<text name="ZoomDeadZone">
Tolerancja powiększania
</text>
<spinner label="" left="283" name="FlycamAxisDeadZone6"/>
<button label="Ustawienia domyślne" left="366" name="SpaceNavigatorDefaults"/>
<spinner label="" left="300" name="FlycamAxisDeadZone6"/>
<button label="Ustawienia domyślne" name="SpaceNavigatorDefaults"/>
<button label="OK" label_selected="OK" left="366" name="ok_btn"/>
<button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
<stat_view label="Monitor Joysticka" name="axis_view">

View File

@ -16,7 +16,7 @@
Modos de Controle:
</text>
<check_box label="Avatar" name="JoystickAvatarEnabled"/>
<check_box label="Construir" left="192" name="JoystickBuildEnabled"/>
<check_box label="Construir" name="JoystickBuildEnabled"/>
<check_box label="Camera aérea" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala X
@ -27,13 +27,13 @@
<text name="ZScale">
Escala Z
</text>
<text left="3" name="PitchScale" width="115">
<text name="PitchScale">
Escala de Elevação
</text>
<text left="3" name="YawScale" width="115">
<text name="YawScale">
Escala da Guinada
</text>
<text left="3" name="RollScale" width="115">
<text name="RollScale">
Escala de Rolagem
</text>
<text name="XDeadZone">
@ -45,13 +45,13 @@
<text name="ZDeadZone">
Zona Morta Z
</text>
<text left="3" name="PitchDeadZone" width="115">
<text name="PitchDeadZone">
Zona Morta: Elevação
</text>
<text left="3" name="YawDeadZone" width="115">
<text name="YawDeadZone">
Zona Morta: Guinada
</text>
<text left="3" name="RollDeadZone" width="115">
<text name="RollDeadZone">
Zona Morta: Rolagem
</text>
<text name="Feathering">
@ -60,7 +60,7 @@
<text name="ZoomScale2">
Escala de Zoom
</text>
<text left="4" name="ZoomDeadZone" width="110">
<text name="ZoomDeadZone">
Zona Morta de Zoom
</text>
<button font="SansSerifSmall" label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults"/>