summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llmessage/llinstantmessage.cpp208
-rw-r--r--indra/llmessage/llinstantmessage.h53
-rw-r--r--indra/llui/llcombobox.cpp8
-rw-r--r--indra/llui/llcombobox.h1
-rw-r--r--indra/llui/lllineeditor.cpp5
-rw-r--r--indra/llui/lllineeditor.h2
-rw-r--r--indra/llui/lltexteditor.cpp4
-rw-r--r--indra/llwindow/llwindowmacosx.cpp2
-rw-r--r--indra/media_plugins/cef/media_plugin_cef.cpp5
-rw-r--r--indra/newview/app_settings/settings.xml2
-rw-r--r--indra/newview/cursors_mac/UI_CURSOR_PIPETTE.tifbin0 -> 326 bytes
-rw-r--r--indra/newview/llagent.cpp2
-rw-r--r--indra/newview/llfloaterimsession.cpp25
-rw-r--r--indra/newview/llfloaterimsession.h8
-rw-r--r--indra/newview/llfloaterreporter.cpp79
-rw-r--r--indra/newview/llfloaterreporter.h1
-rw-r--r--indra/newview/llfloatersnapshot.cpp2
-rw-r--r--indra/newview/llimprocessing.cpp36
-rw-r--r--indra/newview/llimview.cpp14
-rw-r--r--indra/newview/llimview.h6
-rw-r--r--indra/newview/llinventorymodel.cpp31
-rw-r--r--indra/newview/llpanelgrouproles.cpp47
-rw-r--r--indra/newview/llpanelgrouproles.h6
-rw-r--r--indra/newview/llpanellogin.cpp1
-rw-r--r--indra/newview/lltexturefetch.cpp2
-rw-r--r--indra/newview/lltoastimpanel.cpp21
-rw-r--r--indra/newview/lltoolfocus.cpp2
-rw-r--r--indra/newview/lltoolselect.cpp2
-rw-r--r--indra/newview/llviewerregion.cpp1
-rw-r--r--indra/newview/llviewerthrottle.cpp2
-rw-r--r--indra/newview/llvoicevivox.cpp4
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_report_abuse.xml1
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml74
-rw-r--r--indra/newview/skins/default/xui/en/role_actions.xml20
-rw-r--r--indra/newview/tests/lldateutil_test.cpp2
-rw-r--r--indra/newview/tests/llslurl_test.cpp4
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp4
-rw-r--r--indra/newview/tests/llworldmap_test.cpp2
40 files changed, 317 insertions, 375 deletions
diff --git a/indra/llmessage/llinstantmessage.cpp b/indra/llmessage/llinstantmessage.cpp
index b7f3e6e4f7..dd5a655d7e 100644
--- a/indra/llmessage/llinstantmessage.cpp
+++ b/indra/llmessage/llinstantmessage.cpp
@@ -51,98 +51,6 @@ const std::string INTERACTIVE_SYSTEM_FROM("F387446C-37C4-45f2-A438-D99CBDBB563B"
const S32 IM_TTL = 1;
-/**
- * LLIMInfo
- */
-LLIMInfo::LLIMInfo() :
- mFromGroup(FALSE),
- mParentEstateID(0),
- mOffline(0),
- mViewerThinksToIsOnline(false),
- mIMType(IM_NOTHING_SPECIAL),
- mTimeStamp(0),
- mTTL(IM_TTL)
-{
-}
-
-LLIMInfo::LLIMInfo(
- const LLUUID& from_id,
- BOOL from_group,
- const LLUUID& to_id,
- EInstantMessage im_type,
- const std::string& name,
- const std::string& message,
- const LLUUID& id,
- U32 parent_estate_id,
- const LLUUID& region_id,
- const LLVector3& position,
- LLSD data,
- U8 offline,
- U32 timestamp,
- S32 ttl) :
- mFromID(from_id),
- mFromGroup(from_group),
- mToID(to_id),
- mParentEstateID(0),
- mRegionID(region_id),
- mPosition(position),
- mOffline(offline),
- mViewerThinksToIsOnline(false),
- mIMType(im_type),
- mID(id),
- mTimeStamp(timestamp),
- mName(name),
- mMessage(message),
- mData(data),
- mTTL(ttl)
-{
-}
-
-LLIMInfo::LLIMInfo(LLMessageSystem* msg, S32 ttl) :
- mViewerThinksToIsOnline(false),
- mTTL(ttl)
-{
- unpackMessageBlock(msg);
-}
-
-LLIMInfo::~LLIMInfo()
-{
-}
-
-void LLIMInfo::packInstantMessage(LLMessageSystem* msg) const
-{
- LL_DEBUGS() << "LLIMInfo::packInstantMessage()" << LL_ENDL;
- msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
- packMessageBlock(msg);
-}
-
-void LLIMInfo::packMessageBlock(LLMessageSystem* msg) const
-{
- // Construct binary bucket
- std::vector<U8> bucket;
- if (mData.has("binary_bucket"))
- {
- bucket = mData["binary_bucket"].asBinary();
- }
- pack_instant_message_block(
- msg,
- mFromID,
- mFromGroup,
- LLUUID::null,
- mToID,
- mName,
- mMessage,
- mOffline,
- mIMType,
- mID,
- mParentEstateID,
- mRegionID,
- mPosition,
- mTimeStamp,
- &bucket[0],
- bucket.size());
-}
-
void pack_instant_message(
LLMessageSystem* msg,
const LLUUID& from_id,
@@ -253,120 +161,4 @@ void pack_instant_message_block(
msg->addBinaryDataFast(_PREHASH_BinaryBucket, bb, binary_bucket_size);
}
-void LLIMInfo::unpackMessageBlock(LLMessageSystem* msg)
-{
- msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, mFromID);
- msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, mFromGroup);
- msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, mToID);
- msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_ParentEstateID, mParentEstateID);
- msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_RegionID, mRegionID);
- msg->getVector3Fast(_PREHASH_MessageBlock, _PREHASH_Position, mPosition);
- msg->getU8Fast(_PREHASH_MessageBlock, _PREHASH_Offline, mOffline);
- U8 dialog;
- msg->getU8Fast(_PREHASH_MessageBlock, _PREHASH_Dialog, dialog);
- mIMType = (EInstantMessage) dialog;
- msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ID, mID);
- msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_Timestamp, mTimeStamp);
- msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_FromAgentName, mName);
-
- msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_Message, mMessage);
-
- S32 binary_bucket_size = llmin(
- MTUBYTES,
- msg->getSizeFast(
- _PREHASH_MessageBlock,
- _PREHASH_BinaryBucket));
- if(binary_bucket_size > 0)
- {
- std::vector<U8> bucket;
- bucket.resize(binary_bucket_size);
-
- msg->getBinaryDataFast(
- _PREHASH_MessageBlock,
- _PREHASH_BinaryBucket,
- &bucket[0],
- 0,
- 0,
- binary_bucket_size);
- mData["binary_bucket"] = bucket;
- }
- else
- {
- mData.clear();
- }
-}
-
-LLSD im_info_to_llsd(LLPointer<LLIMInfo> im_info)
-{
- LLSD param_version;
- param_version["version"] = 1;
- LLSD param_message;
- param_message["from_id"] = im_info->mFromID;
- param_message["from_group"] = im_info->mFromGroup;
- param_message["to_id"] = im_info->mToID;
- param_message["from_name"] = im_info->mName;
- param_message["message"] = im_info->mMessage;
- param_message["type"] = (S32)im_info->mIMType;
- param_message["id"] = im_info->mID;
- param_message["timestamp"] = (S32)im_info->mTimeStamp;
- param_message["offline"] = (S32)im_info->mOffline;
- param_message["parent_estate_id"] = (S32)im_info->mParentEstateID;
- param_message["region_id"] = im_info->mRegionID;
- param_message["position"] = ll_sd_from_vector3(im_info->mPosition);
- param_message["data"] = im_info->mData;
- param_message["ttl"] = im_info->mTTL;
-
- LLSD param_agent;
- param_agent["agent_id"] = im_info->mFromID;
-
- LLSD params;
- params["version_params"] = param_version;
- params["message_params"] = param_message;
- params["agent_params"] = param_agent;
-
- return params;
-}
-
-LLPointer<LLIMInfo> llsd_to_im_info(const LLSD& im_info_sd)
-{
- LLSD param_message = im_info_sd["message_params"];
- LLSD param_agent = im_info_sd["agent_params"];
-
- LLPointer<LLIMInfo> im_info = new LLIMInfo(
- param_message["from_id"].asUUID(),
- param_message["from_group"].asBoolean(),
- param_message["to_id"].asUUID(),
- (EInstantMessage) param_message["type"].asInteger(),
- param_message["from_name"].asString(),
- param_message["message"].asString(),
- param_message["id"].asUUID(),
- (U32) param_message["parent_estate_id"].asInteger(),
- param_message["region_id"].asUUID(),
- ll_vector3_from_sd(param_message["position"]),
- param_message["data"],
- (U8) param_message["offline"].asInteger(),
- (U32) param_message["timestamp"].asInteger(),
- param_message["ttl"].asInteger());
-
- return im_info;
-}
-
-LLPointer<LLIMInfo> LLIMInfo::clone()
-{
- return new LLIMInfo(
- mFromID,
- mFromGroup,
- mToID,
- mIMType,
- mName,
- mMessage,
- mID,
- mParentEstateID,
- mRegionID,
- mPosition,
- mData,
- mOffline,
- mTimeStamp,
- mTTL);
-}
diff --git a/indra/llmessage/llinstantmessage.h b/indra/llmessage/llinstantmessage.h
index f7118f8ccf..55cda15405 100644
--- a/indra/llmessage/llinstantmessage.h
+++ b/indra/llmessage/llinstantmessage.h
@@ -177,59 +177,6 @@ extern const std::string INTERACTIVE_SYSTEM_FROM;
// Number of retry attempts on sending the im.
extern const S32 IM_TTL;
-
-class LLIMInfo : public LLRefCount
-{
-protected:
- LLIMInfo();
- ~LLIMInfo();
-
-public:
- LLIMInfo(LLMessageSystem* msg,
- S32 ttl = IM_TTL);
-
- LLIMInfo(
- const LLUUID& from_id,
- BOOL from_group,
- const LLUUID& to_id,
- EInstantMessage im_type,
- const std::string& name,
- const std::string& message,
- const LLUUID& id,
- U32 parent_estate_id,
- const LLUUID& region_id,
- const LLVector3& position,
- LLSD data,
- U8 offline,
- U32 timestamp,
- S32 ttl = IM_TTL);
-
- void packInstantMessage(LLMessageSystem* msg) const;
- void packMessageBlock(LLMessageSystem* msg) const;
- void unpackMessageBlock(LLMessageSystem* msg);
- LLPointer<LLIMInfo> clone();
-public:
- LLUUID mFromID;
- BOOL mFromGroup;
- LLUUID mToID;
- U32 mParentEstateID;
- LLUUID mRegionID;
- LLVector3 mPosition;
- U8 mOffline;
- bool mViewerThinksToIsOnline;
- EInstantMessage mIMType;
- LLUUID mID;
- U32 mTimeStamp;
- std::string mName;
- std::string mMessage;
- LLSD mData;
-
- S32 mTTL;
-};
-
-LLPointer<LLIMInfo> llsd_to_im_info(const LLSD& im_info_sd);
-LLSD im_info_to_llsd(LLPointer<LLIMInfo> im_info);
-
void pack_instant_message(
LLMessageSystem* msgsystem,
const LLUUID& from_id,
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 559895da1a..00a933a0bb 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -845,6 +845,14 @@ void LLComboBox::setTextEntry(const LLStringExplicit& text)
}
}
+void LLComboBox::setKeystrokeOnEsc(BOOL enable)
+{
+ if (mTextEntry)
+ {
+ mTextEntry->setKeystrokeOnEsc(enable);
+ }
+}
+
void LLComboBox::onTextEntry(LLLineEditor* line_editor)
{
if (mTextEntryCallback != NULL)
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index c9b1212b70..7d38c051a5 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -126,6 +126,7 @@ public:
virtual LLSD getValue() const;
void setTextEntry(const LLStringExplicit& text);
+ void setKeystrokeOnEsc(BOOL enable);
LLScrollListItem* add(const std::string& name, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE); // add item "name" to menu
LLScrollListItem* add(const std::string& name, const LLUUID& id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE);
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index bd6b00d38b..cfab6b7fc8 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -125,6 +125,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mTextLeftEdge(0), // computed in updateTextPadding() below
mTextRightEdge(0), // computed in updateTextPadding() below
mCommitOnFocusLost( p.commit_on_focus_lost ),
+ mKeystrokeOnEsc(FALSE),
mRevertOnEsc( p.revert_on_esc ),
mKeystrokeCallback( p.keystroke_callback() ),
mIsSelecting( FALSE ),
@@ -1494,6 +1495,10 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
{
setText(mPrevText);
// Note, don't set handled, still want to loose focus (won't commit becase text is now unchanged)
+ if (mKeystrokeOnEsc)
+ {
+ onKeystroke();
+ }
}
break;
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 88468503df..287837a15c 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -214,6 +214,7 @@ public:
void setCommitOnFocusLost( BOOL b ) { mCommitOnFocusLost = b; }
void setRevertOnEsc( BOOL b ) { mRevertOnEsc = b; }
+ void setKeystrokeOnEsc(BOOL b) { mKeystrokeOnEsc = b; }
void setCursorColor(const LLColor4& c) { mCursorColor = c; }
const LLColor4& getCursorColor() const { return mCursorColor.get(); }
@@ -338,6 +339,7 @@ protected:
BOOL mCommitOnFocusLost;
BOOL mRevertOnEsc;
+ BOOL mKeystrokeOnEsc;
keystroke_callback_t mKeystrokeCallback;
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 1a49b94c23..134b76c720 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -2493,11 +2493,11 @@ void LLTextEditor::updateLinkSegments()
}
}
}
-
+
// if the link's label (what the user can edit) is a valid Url,
// then update the link's HREF to be the same as the label text.
// This lets users edit Urls in-place.
- if (LLUrlRegistry::instance().hasUrl(url_label))
+ if (acceptsTextInput() && LLUrlRegistry::instance().hasUrl(url_label))
{
std::string new_url = wstring_to_utf8str(url_label);
LLStringUtil::trim(new_url);
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 5f35a0f0f9..843294c239 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -1515,6 +1515,7 @@ void LLWindowMacOSX::updateCursor()
case UI_CURSOR_NOLOCKED:
case UI_CURSOR_ARROWLOCKED:
case UI_CURSOR_GRABLOCKED:
+ case UI_CURSOR_PIPETTE:
case UI_CURSOR_TOOLTRANSLATE:
case UI_CURSOR_TOOLROTATE:
case UI_CURSOR_TOOLSCALE:
@@ -1565,6 +1566,7 @@ void LLWindowMacOSX::initCursors()
initPixmapCursor(UI_CURSOR_NOLOCKED, 8, 8);
initPixmapCursor(UI_CURSOR_ARROWLOCKED, 1, 1);
initPixmapCursor(UI_CURSOR_GRABLOCKED, 2, 14);
+ initPixmapCursor(UI_CURSOR_PIPETTE, 3, 29);
initPixmapCursor(UI_CURSOR_TOOLTRANSLATE, 1, 1);
initPixmapCursor(UI_CURSOR_TOOLROTATE, 1, 1);
initPixmapCursor(UI_CURSOR_TOOLSCALE, 1, 1);
diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp
index 2ac43accc5..2bd5526a86 100644
--- a/indra/media_plugins/cef/media_plugin_cef.cpp
+++ b/indra/media_plugins/cef/media_plugin_cef.cpp
@@ -810,8 +810,9 @@ void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_dat
bool event_isrepeat = native_key_data["event_isrepeat"].asBoolean();
// adding new code below in unicodeInput means we don't send ascii chars
- // here too or we get double key presses on a mac.
- if (((unsigned char)event_chars < 0x10 || (unsigned char)event_chars >= 0x7f ))
+ // here too or we get double key presses on a mac.
+ bool esc_key = (event_umodchars == 27);
+ if (esc_key || ((unsigned char)event_chars < 0x10 || (unsigned char)event_chars >= 0x7f ))
{
mCEFLib->nativeKeyboardEventOSX(key_event, event_modifiers,
event_keycode, event_chars,
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index bbd7f65383..45e2fc9bf0 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -12339,7 +12339,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>500.0</real>
+ <real>3000.0</real>
</map>
<key>UpdaterMaximumBandwidth</key>
<map>
diff --git a/indra/newview/cursors_mac/UI_CURSOR_PIPETTE.tif b/indra/newview/cursors_mac/UI_CURSOR_PIPETTE.tif
new file mode 100644
index 0000000000..b4780967f9
--- /dev/null
+++ b/indra/newview/cursors_mac/UI_CURSOR_PIPETTE.tif
Binary files differ
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2243cbdf5a..901294d6b4 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -1580,6 +1580,8 @@ void LLAgent::setAutoPilotTargetGlobal(const LLVector3d &target_global)
LLViewerObject *obj;
LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
+ // Note: this might malfunction for sitting agent, since pelvis stays same, but agent's position becomes lower
+ // But for autopilot to work we assume that agent is standing and ready to go.
F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
// clamp z value of target to minimum height above ground
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index 6623ce0f80..a4ab1af9a8 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -82,8 +82,7 @@ LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id)
mPositioned(false),
mSessionInitialized(false),
mMeTypingTimer(),
- mOtherTypingTimer(),
- mImInfo()
+ mOtherTypingTimer()
{
mIsNearbyChat = false;
@@ -125,7 +124,7 @@ void LLFloaterIMSession::refresh()
if (mOtherTyping && mOtherTypingTimer.getElapsedTimeF32() > OTHER_TYPING_TIMEOUT)
{
LL_DEBUGS("TypingMsgs") << "Received: is typing cleared due to timeout" << LL_ENDL;
- removeTypingIndicator(mImInfo);
+ removeTypingIndicator(mImFromId);
mOtherTyping = false;
}
@@ -1006,19 +1005,19 @@ void LLFloaterIMSession::setTyping(bool typing)
}
}
-void LLFloaterIMSession::processIMTyping(const LLIMInfo* im_info, BOOL typing)
+void LLFloaterIMSession::processIMTyping(const LLUUID& from_id, BOOL typing)
{
LL_DEBUGS("TypingMsgs") << "typing=" << typing << LL_ENDL;
if ( typing )
{
// other user started typing
- addTypingIndicator(im_info);
+ addTypingIndicator(from_id);
mOtherTypingTimer.reset();
}
else
{
// other user stopped typing
- removeTypingIndicator(im_info);
+ removeTypingIndicator(from_id);
}
}
@@ -1218,7 +1217,7 @@ BOOL LLFloaterIMSession::inviteToSession(const uuid_vec_t& ids)
return is_region_exist;
}
-void LLFloaterIMSession::addTypingIndicator(const LLIMInfo* im_info)
+void LLFloaterIMSession::addTypingIndicator(const LLUUID& from_id)
{
/* Operation of "<name> is typing" state machine:
Not Typing state:
@@ -1248,35 +1247,35 @@ Note: OTHER_TYPING_TIMEOUT must be > ME_TYPING_TIMEOUT for proper operation of t
*/
// We may have lost a "stop-typing" packet, don't add it twice
- if (im_info && !mOtherTyping)
+ if (from_id.notNull() && !mOtherTyping)
{
mOtherTyping = true;
mOtherTypingTimer.reset();
// Save im_info so that removeTypingIndicator can be properly called because a timeout has occurred
- mImInfo = im_info;
+ mImFromId = from_id;
// Update speaker
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if ( speaker_mgr )
{
- speaker_mgr->setSpeakerTyping(im_info->mFromID, TRUE);
+ speaker_mgr->setSpeakerTyping(from_id, TRUE);
}
}
}
-void LLFloaterIMSession::removeTypingIndicator(const LLIMInfo* im_info)
+void LLFloaterIMSession::removeTypingIndicator(const LLUUID& from_id)
{
if (mOtherTyping)
{
mOtherTyping = false;
- if (im_info)
+ if (from_id.notNull())
{
// Update speaker
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
- speaker_mgr->setSpeakerTyping(im_info->mFromID, FALSE);
+ speaker_mgr->setSpeakerTyping(from_id, FALSE);
}
}
}
diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h
index 0f7164a585..28464fc14b 100644
--- a/indra/newview/llfloaterimsession.h
+++ b/indra/newview/llfloaterimsession.h
@@ -122,7 +122,7 @@ public:
const LLVoiceChannel::EState& old_state,
const LLVoiceChannel::EState& new_state);
- void processIMTyping(const LLIMInfo* im_info, BOOL typing);
+ void processIMTyping(const LLUUID& from_id, BOOL typing);
void processAgentListUpdates(const LLSD& body);
void processSessionUpdate(const LLSD& session_update);
@@ -165,10 +165,10 @@ private:
void boundVoiceChannel();
// Add the "User is typing..." indicator.
- void addTypingIndicator(const LLIMInfo* im_info);
+ void addTypingIndicator(const LLUUID& from_id);
// Remove the "User is typing..." indicator.
- void removeTypingIndicator(const LLIMInfo* im_info = NULL);
+ void removeTypingIndicator(const LLUUID& from_id = LLUUID::null);
static void closeHiddenIMToasts();
@@ -199,7 +199,7 @@ private:
// connection to voice channel state change signal
boost::signals2::connection mVoiceChannelStateChangeConnection;
- const LLIMInfo* mImInfo;
+ LLUUID mImFromId;
};
#endif // LL_FLOATERIMSESSION_H
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index a320bcc6fc..d94bf3f651 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -214,10 +214,30 @@ BOOL LLFloaterReporter::postBuild()
std::string reporter = LLSLURL("agent", gAgent.getID(), "inspect").getSLURLString();
getChild<LLUICtrl>("reporter_field")->setValue(reporter);
+ // request categories
+ if (gAgent.getRegion()
+ && gAgent.getRegion()->capabilitiesReceived())
+ {
+ std::string cap_url = gAgent.getRegionCapability("AbuseCategories");
+
+ if (!cap_url.empty())
+ {
+ std::string lang = gSavedSettings.getString("Language");
+ if (lang != "default" && !lang.empty())
+ {
+ cap_url += "?lc=";
+ cap_url += lang;
+ }
+ LLCoros::instance().launch("LLFloaterReporter::requestAbuseCategoriesCoro",
+ boost::bind(LLFloaterReporter::requestAbuseCategoriesCoro, cap_url, this->getHandle()));
+ }
+ }
+
center();
return TRUE;
}
+
// virtual
LLFloaterReporter::~LLFloaterReporter()
{
@@ -402,6 +422,65 @@ void LLFloaterReporter::onAvatarNameCache(const LLUUID& avatar_id, const LLAvata
}
}
+void LLFloaterReporter::requestAbuseCategoriesCoro(std::string url, LLHandle<LLFloater> handle)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestAbuseCategoriesCoro", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+
+ LLSD result = httpAdapter->getAndSuspend(httpRequest, url);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ if (!status || !result.has("categories")) // success = httpResults["success"].asBoolean();
+ {
+ LL_WARNS() << "Error requesting Abuse Categories from capability: " << url << LL_ENDL;
+ return;
+ }
+
+ if (handle.isDead())
+ {
+ // nothing to do
+ return;
+ }
+
+ LLFloater* floater = handle.get();
+ LLComboBox* combo = floater->getChild<LLComboBox>("category_combo");
+ if (!combo)
+ {
+ LL_WARNS() << "categories category_combo not found!" << LL_ENDL;
+ return;
+ }
+
+ //get selection (in case capability took a while)
+ S32 selection = combo->getCurrentIndex();
+
+ // Combobox should have a "Select category" element;
+ // This is a bit of workaround since there is no proper and simple way to save array of
+ // localizable strings in xml along with data (value). For now combobox is initialized along
+ // with placeholders, and first element is "Select category" which we want to keep, so remove
+ // everything but first element.
+ // Todo: once sim with capability fully releases, just remove this string and all unnecessary
+ // items from combobox since they will be obsolete (or depending on situation remake this to
+ // something better, for example move "Select category" to separate string)
+ while (combo->remove(1));
+
+ LLSD contents = result["categories"];
+
+ LLSD::array_iterator i = contents.beginArray();
+ LLSD::array_iterator iEnd = contents.endArray();
+ for (; i != iEnd; ++i)
+ {
+ const LLSD &message_data(*i);
+ std::string label = message_data["description_localized"];
+ combo->add(label, message_data["category"]);
+ }
+
+ //restore selection
+ combo->selectNthItem(selection);
+}
// static
void LLFloaterReporter::onClickSend(void *userdata)
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index d9ecb9f4ea..c678df7155 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -129,6 +129,7 @@ private:
void setFromAvatarID(const LLUUID& avatar_id);
void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name);
+ static void requestAbuseCategoriesCoro(std::string url, LLHandle<LLFloater> handle);
static void finishedARPost(const LLSD &);
private:
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 25e3d74ebc..156b2ba7b1 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -1100,6 +1100,7 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
if(preview)
{
LL_DEBUGS() << "opened, updating snapshot" << LL_ENDL;
+ preview->setAllowFullScreenPreview(TRUE);
preview->updateSnapshot(TRUE);
}
focusFirstItem(FALSE);
@@ -1129,6 +1130,7 @@ void LLFloaterSnapshotBase::onClose(bool app_quitting)
LLSnapshotLivePreview* previewp = getPreviewView();
if (previewp)
{
+ previewp->setAllowFullScreenPreview(FALSE);
previewp->setVisible(FALSE);
previewp->setEnabled(FALSE);
}
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index db1bc56fc5..491671c46f 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -593,45 +593,13 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
case IM_TYPING_START:
{
- std::vector<U8> bucket(binary_bucket[0], binary_bucket_size);
- LLSD data;
- data["binary_bucket"] = bucket;
- LLPointer<LLIMInfo> im_info = new LLIMInfo(from_id,
- from_group,
- to_id,
- dialog,
- agentName,
- message,
- session_id,
- parent_estate_id,
- region_id,
- position,
- data,
- offline,
- timestamp);
- gIMMgr->processIMTypingStart(im_info);
+ gIMMgr->processIMTypingStart(from_id, dialog);
}
break;
case IM_TYPING_STOP:
{
- std::vector<U8> bucket(binary_bucket[0], binary_bucket_size);
- LLSD data;
- data["binary_bucket"] = bucket;
- LLPointer<LLIMInfo> im_info = new LLIMInfo(from_id,
- from_group,
- to_id,
- dialog,
- agentName,
- message,
- session_id,
- parent_estate_id,
- region_id,
- position,
- data,
- offline,
- timestamp);
- gIMMgr->processIMTypingStop(im_info);
+ gIMMgr->processIMTypingStop(from_id, dialog);
}
break;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index d62b6300cb..0f5d514660 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -3432,23 +3432,23 @@ void LLIMMgr::noteMutedUsers(const LLUUID& session_id,
}
}
-void LLIMMgr::processIMTypingStart(const LLIMInfo* im_info)
+void LLIMMgr::processIMTypingStart(const LLUUID& from_id, const EInstantMessage im_type)
{
- processIMTypingCore(im_info, TRUE);
+ processIMTypingCore(from_id, im_type, TRUE);
}
-void LLIMMgr::processIMTypingStop(const LLIMInfo* im_info)
+void LLIMMgr::processIMTypingStop(const LLUUID& from_id, const EInstantMessage im_type)
{
- processIMTypingCore(im_info, FALSE);
+ processIMTypingCore(from_id, im_type, FALSE);
}
-void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
+void LLIMMgr::processIMTypingCore(const LLUUID& from_id, const EInstantMessage im_type, BOOL typing)
{
- LLUUID session_id = computeSessionID(im_info->mIMType, im_info->mFromID);
+ LLUUID session_id = computeSessionID(im_type, from_id);
LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
if ( im_floater )
{
- im_floater->processIMTyping(im_info, typing);
+ im_floater->processIMTyping(from_id, typing);
}
}
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index e3851a56e0..81d3ffa1a6 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -391,8 +391,8 @@ public:
const std::string& session_handle = LLStringUtil::null,
const std::string& session_uri = LLStringUtil::null);
- void processIMTypingStart(const LLIMInfo* im_info);
- void processIMTypingStop(const LLIMInfo* im_info);
+ void processIMTypingStart(const LLUUID& from_id, const EInstantMessage im_type);
+ void processIMTypingStop(const LLUUID& from_id, const EInstantMessage im_type);
// automatically start a call once the session has initialized
void autoStartCallOnStartup(const LLUUID& session_id);
@@ -471,7 +471,7 @@ private:
void noteOfflineUsers(const LLUUID& session_id, const std::vector<LLUUID>& ids);
void noteMutedUsers(const LLUUID& session_id, const std::vector<LLUUID>& ids);
- void processIMTypingCore(const LLIMInfo* im_info, BOOL typing);
+ void processIMTypingCore(const LLUUID& from_id, const EInstantMessage im_type, BOOL typing);
static void onInviteNameLookup(LLSD payload, const LLUUID& id, const LLAvatarName& name);
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 556af93963..76bf87cfe5 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -925,7 +925,20 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask)
new_item = old_item;
LLUUID old_parent_id = old_item->getParentUUID();
LLUUID new_parent_id = item->getParentUUID();
-
+ bool update_parent_on_server = false;
+
+ if (new_parent_id.isNull())
+ {
+ // item with null parent will end in random location and then in Lost&Found,
+ // either move to default folder as if it is new item or don't move at all
+ LL_WARNS(LOG_INV) << "Update attempts to reparent item " << item->getUUID()
+ << " to null folder. Moving to Lost&Found. Old item name: " << old_item->getName()
+ << ". New name: " << item->getName()
+ << "." << LL_ENDL;
+ new_parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+ update_parent_on_server = true;
+ }
+
if(old_parent_id != new_parent_id)
{
// need to update the parent-child tree
@@ -938,6 +951,11 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask)
item_array = get_ptr_in_map(mParentChildItemTree, new_parent_id);
if(item_array)
{
+ if (update_parent_on_server)
+ {
+ LLInventoryModel::LLCategoryUpdate update(new_parent_id, 1);
+ gInventory.accountForUpdate(update);
+ }
item_array->push_back(old_item);
}
mask |= LLInventoryObserver::STRUCTURE;
@@ -947,6 +965,12 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask)
mask |= LLInventoryObserver::LABEL;
}
old_item->copyViewerItem(item);
+ if (update_parent_on_server)
+ {
+ // Parent id at server is null, so update server even if item already is in the same folder
+ old_item->setParent(new_parent_id);
+ new_item->updateParentOnServer(FALSE);
+ }
mask |= LLInventoryObserver::INTERNAL;
}
else
@@ -2820,7 +2844,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, U32
item_array_t items;
update_map_t update;
S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
- LLUUID folder_id;
// Does this loop ever execute more than once?
for(S32 i = 0; i < count; ++i)
{
@@ -2847,10 +2870,6 @@ bool LLInventoryModel::messageUpdateCore(LLMessageSystem* msg, bool account, U32
{
++update[titem->getParentUUID()];
}
- if (folder_id.isNull())
- {
- folder_id = titem->getParentUUID();
- }
}
if(account)
{
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 66a0a1d4ad..5ee272749c 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -821,8 +821,12 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
mMembersList = parent->getChild<LLNameListCtrl>("member_list", recurse);
mAssignedRolesList = parent->getChild<LLScrollListCtrl>("member_assigned_roles", recurse);
mAllowedActionsList = parent->getChild<LLScrollListCtrl>("member_allowed_actions", recurse);
+ mActionDescription = parent->getChild<LLTextEditor>("member_action_description", recurse);
- if (!mMembersList || !mAssignedRolesList || !mAllowedActionsList) return FALSE;
+ if (!mMembersList || !mAssignedRolesList || !mAllowedActionsList || !mActionDescription) return FALSE;
+
+ mAllowedActionsList->setCommitOnSelectionChange(TRUE);
+ mAllowedActionsList->setCommitCallback(boost::bind(&LLPanelGroupMembersSubTab::updateActionDescription, this));
// We want to be notified whenever a member is selected.
mMembersList->setCommitOnSelectionChange(TRUE);
@@ -889,6 +893,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
mAssignedRolesList->deleteAllItems();
mAllowedActionsList->deleteAllItems();
+ mActionDescription->clear();
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap)
@@ -1386,6 +1391,7 @@ void LLPanelGroupMembersSubTab::activate()
update(GC_MEMBER_DATA);
}
}
+ mActionDescription->clear();
}
void LLPanelGroupMembersSubTab::deactivate()
@@ -1894,6 +1900,23 @@ bool LLPanelGroupMembersSubTab::handleBanCallback(const LLSD& notification, cons
return false;
}
+void LLPanelGroupMembersSubTab::updateActionDescription()
+{
+ mActionDescription->setText(std::string());
+ LLScrollListItem* action_item = mAllowedActionsList->getFirstSelected();
+ if (!action_item || !mAllowedActionsList->getCanSelect())
+ {
+ return;
+ }
+
+ LLRoleAction* rap = (LLRoleAction*)action_item->getUserdata();
+ if (rap)
+ {
+ std::string desc = rap->mLongDescription.empty() ? rap->mDescription : rap->mLongDescription;
+ mActionDescription->setText(desc);
+ }
+}
+
void LLPanelGroupMembersSubTab::handleBanMember()
{
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
@@ -1964,6 +1987,7 @@ BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
mRolesList = parent->getChild<LLScrollListCtrl>("role_list", recurse);
mAssignedMembersList = parent->getChild<LLNameListCtrl>("role_assigned_members", recurse);
mAllowedActionsList = parent->getChild<LLScrollListCtrl>("role_allowed_actions", recurse);
+ mActionDescription = parent->getChild<LLTextEditor>("role_action_description", recurse);
mRoleName = parent->getChild<LLLineEditor>("role_name", recurse);
mRoleTitle = parent->getChild<LLLineEditor>("role_title", recurse);
@@ -1971,7 +1995,7 @@ BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
mMemberVisibleCheck = parent->getChild<LLCheckBoxCtrl>("role_visible_in_list", recurse);
- if (!mRolesList || !mAssignedMembersList || !mAllowedActionsList
+ if (!mRolesList || !mAssignedMembersList || !mAllowedActionsList || !mActionDescription
|| !mRoleName || !mRoleTitle || !mRoleDescription || !mMemberVisibleCheck)
{
LL_WARNS() << "ARG! element not found." << LL_ENDL;
@@ -2004,6 +2028,7 @@ BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
mMemberVisibleCheck->setCommitCallback(onMemberVisibilityChange, this);
mAllowedActionsList->setCommitOnSelectionChange(TRUE);
+ mAllowedActionsList->setCommitCallback(boost::bind(&LLPanelGroupRolesSubTab::updateActionDescription, this));
mRoleName->setCommitOnFocusLost(TRUE);
mRoleName->setKeystrokeCallback(onPropertiesKey, this);
@@ -2023,6 +2048,7 @@ void LLPanelGroupRolesSubTab::activate()
{
LLPanelGroupSubTab::activate();
+ mActionDescription->clear();
mRolesList->deselectAllItems();
mAssignedMembersList->deleteAllItems();
mAllowedActionsList->deleteAllItems();
@@ -2707,6 +2733,23 @@ void LLPanelGroupRolesSubTab::saveRoleChanges(bool select_saved_role)
}
}
+void LLPanelGroupRolesSubTab::updateActionDescription()
+{
+ mActionDescription->setText(std::string());
+ LLScrollListItem* action_item = mAllowedActionsList->getFirstSelected();
+ if (!action_item || !mAllowedActionsList->getCanSelect())
+ {
+ return;
+ }
+
+ LLRoleAction* rap = (LLRoleAction*)action_item->getUserdata();
+ if (rap)
+ {
+ std::string desc = rap->mLongDescription.empty() ? rap->mDescription : rap->mLongDescription;
+ mActionDescription->setText(desc);
+ }
+}
+
void LLPanelGroupRolesSubTab::setGroupID(const LLUUID& id)
{
if(mRolesList) mRolesList->deleteAllItems();
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 1d1d69e0ae..99ee310dd6 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -182,6 +182,7 @@ public:
bool handleBanCallback(const LLSD& notification, const LLSD& response);
void confirmBanMembers();
+ void updateActionDescription();
void applyMemberChanges();
bool addOwnerCB(const LLSD& notification, const LLSD& response);
@@ -222,6 +223,8 @@ protected:
BOOL mPendingMemberUpdate;
BOOL mHasMatch;
+ LLTextEditor* mActionDescription;
+
member_role_changes_map_t mMemberRoleChangeData;
U32 mNumOwnerAdditions;
@@ -269,6 +272,8 @@ public:
static void onDeleteRole(void*);
void handleDeleteRole();
+ void updateActionDescription();
+
void saveRoleChanges(bool select_saved_role);
virtual void setGroupID(const LLUUID& id);
@@ -282,6 +287,7 @@ protected:
LLScrollListCtrl* mRolesList;
LLNameListCtrl* mAssignedMembersList;
LLScrollListCtrl* mAllowedActionsList;
+ LLTextEditor* mActionDescription;
LLLineEditor* mRoleName;
LLLineEditor* mRoleTitle;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index c876c1c149..5f26821c4f 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -284,6 +284,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
username_combo->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
// STEAM-14: When user presses Enter with this field in focus, initiate login
username_combo->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, this));
+ username_combo->setKeystrokeOnEsc(TRUE);
}
void LLPanelLogin::addFavoritesToStartLocation()
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 6fd90e4935..1f69939c46 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -3082,7 +3082,7 @@ void LLTextureFetch::commonUpdate()
//virtual
S32 LLTextureFetch::update(F32 max_time_ms)
{
- static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS", 500.0);
+ static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS", 3000.0);
{
mNetworkQueueMutex.lock(); // +Mfnq
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 39adfb3431..c4c4b13a2f 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -65,14 +65,9 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(p.session_id);
mIsGroupMsg = (im_session && im_session->mSessionType == LLIMModel::LLIMSession::GROUP_SESSION);
- if(mIsGroupMsg)
- {
- mAvatarName->setValue(im_session->mName);
- LLAvatarName avatar_name;
- LLAvatarNameCache::get(p.avatar_id, &avatar_name);
- p.message = "[From " + avatar_name.getDisplayName() + "]\n" + p.message;
- }
-
+ std::string title = mIsGroupMsg ? im_session->mName : p.from;
+ mAvatarName->setValue(title);
+
//Handle IRC styled /me messages.
std::string prefix = p.message.substr(0, 4);
if (prefix == "/me " || prefix == "/me'")
@@ -88,14 +83,16 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
}
else
{
+ if (mIsGroupMsg)
+ {
+ LLAvatarName avatar_name;
+ LLAvatarNameCache::get(p.avatar_id, &avatar_name);
+ p.message = "[From " + avatar_name.getDisplayName() + "]\n" + p.message;
+ }
style_params.font.style = "NORMAL";
mMessage->setText(p.message, style_params);
}
- if(!mIsGroupMsg)
- {
- mAvatarName->setValue(p.from);
- }
mTime->setValue(p.time);
mSessionID = p.session_id;
mAvatarID = p.avatar_id;
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index caa055e5e0..596951fdfb 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -222,8 +222,10 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)
gAgentCamera.setFocusGlobal(pick_info);
}
+ BOOL zoom_tool = gCameraBtnZoom && (LLToolMgr::getInstance()->getBaseTool() == LLToolCamera::getInstance());
if (!(pick_info.mKeyMask & MASK_ALT) &&
!LLFloaterCamera::inFreeCameraMode() &&
+ !zoom_tool &&
gAgentCamera.cameraThirdPerson() &&
gViewerWindow->getLeftMouseDown() &&
!gSavedSettings.getBOOL("FreezeTime") &&
diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp
index 1fcc9a0711..0ff05479f1 100644
--- a/indra/newview/lltoolselect.cpp
+++ b/indra/newview/lltoolselect.cpp
@@ -194,7 +194,7 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
{
LLQuaternion target_rot;
target_rot.shortestArc(LLVector3::x_axis, selection_dir);
- gAgent.startAutoPilotGlobal(gAgent.getPositionGlobal(), "", &target_rot, NULL, NULL, 1.f, SELECTION_ROTATION_TRESHOLD);
+ gAgent.startAutoPilotGlobal(gAgent.getPositionGlobal(), "", &target_rot, NULL, NULL, llmax(1.f, gAgentAvatarp->getPelvisToFoot()), SELECTION_ROTATION_TRESHOLD);
}
}
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index eea382aac1..52dc3fbb69 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -2816,6 +2816,7 @@ void LLViewerRegion::unpackRegionHandshake()
void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
{
+ capabilityNames.append("AbuseCategories");
capabilityNames.append("AgentPreferences");
capabilityNames.append("AgentState");
capabilityNames.append("AttachmentResources");
diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp
index 22de7e150b..2729253d18 100644
--- a/indra/newview/llviewerthrottle.cpp
+++ b/indra/newview/llviewerthrottle.cpp
@@ -46,7 +46,7 @@ const F32 MAX_FRACTIONAL = 1.5f;
const F32 MIN_FRACTIONAL = 0.2f;
const F32 MIN_BANDWIDTH = 50.f;
-const F32 MAX_BANDWIDTH = 3000.f;
+const F32 MAX_BANDWIDTH = 6000.f;
const F32 STEP_FRACTIONAL = 0.1f;
const LLUnit<F32, LLUnits::Percent> TIGHTEN_THROTTLE_THRESHOLD(3.0f); // packet loss % per s
const LLUnit<F32, LLUnits::Percent> EASE_THROTTLE_THRESHOLD(0.5f); // packet loss % per s
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 838de48308..da4b6a5008 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -3997,13 +3997,13 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
{
// Other end started typing
// TODO: The proper way to add a typing notification seems to be LLIMMgr::processIMTypingStart().
- // It requires an LLIMInfo for the message, which we don't have here.
+ // It requires some info for the message, which we don't have here.
}
else if (!stricmp(notificationType.c_str(), "NotTyping"))
{
// Other end stopped typing
// TODO: The proper way to remove a typing notification seems to be LLIMMgr::processIMTypingStop().
- // It requires an LLIMInfo for the message, which we don't have here.
+ // It requires some info for the message, which we don't have here.
}
else
{
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
index c6b91a8b2f..1425d16cf1 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
@@ -509,6 +509,7 @@
label_width="185"
layout="topleft"
left="420"
+ min_val="1"
max_val="2"
name="ObjectMeshDetail"
show_text="false"
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index 225266af86..8fa5b49573 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -188,6 +188,7 @@
tool_tip="Category -- select the category that best describes this report"
top_pad="5"
width="313">
+ <!-- Values can be populated from capability -->
<combo_box.item
label="Select category"
name="Select_category"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 6aa6653f42..73b7671824 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -11031,7 +11031,7 @@ An internal error prevented us from properly updating your viewer. The L$ balan
name="LargePrimAgentIntersect"
type="notify">
<tag>fail</tag>
-Cannot create large prims that intersect other players. Please re-try when other players have moved.
+Cannot create large prims that intersect other residents. Please re-try when other residents have moved.
</notification>
<notification
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index dac4371a38..714d4166c0 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- height="680"
+ height="750"
label="Members &amp; Roles"
layout="topleft"
left="0"
@@ -284,8 +284,7 @@ clicking on their names.
width="20" />
<scroll_list.columns
label=""
- name="action"
- width="270" />
+ name="action" />
</scroll_list>
</panel>
<panel
@@ -451,7 +450,39 @@ clicking on their names.
</scroll_list>
</panel>
<panel
- height="550"
+ height="90"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
+ layout="topleft"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
+ name="members_header"
+ top_pad="3"
+ visible="false">
+ <text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
+ type="string"
+ enabled="false"
+ halign="left"
+ layout="topleft"
+ top_pad="0"
+ follows="left|top|right"
+ left="0"
+ right="-1"
+ height="90"
+ max_length="512"
+ name="member_action_description"
+ word_wrap="true">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ </panel>
+ <panel
+ height="460"
background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
@@ -599,11 +630,42 @@ clicking on their names.
width="20" />
<scroll_list.columns
label=""
- name="action"
- width="270" />
+ name="action" />
</scroll_list>
</panel>
<panel
+ height="90"
+ background_visible="false"
+ bg_alpha_color="FloaterUnfocusBorderColor"
+ layout="topleft"
+ follows="top|left|right"
+ left="0"
+ right="-1"
+ width="313"
+ mouse_opaque="false"
+ name="roles_header"
+ top_pad="3"
+ visible="false">
+ <text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
+ type="string"
+ enabled="false"
+ halign="left"
+ layout="topleft"
+ top_pad="0"
+ follows="left|top|right"
+ left="0"
+ right="-1"
+ height="90"
+ max_length="512"
+ name="role_action_description"
+ word_wrap="true">
+ This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
+ </text_editor>
+ </panel>
+ <panel
height="424"
background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index 8d058b0b53..f79d752fdb 100644
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -4,10 +4,10 @@
description="These Abilities include powers to add and remove group Members, and allow new Members to join without an invitation."
name="Membership">
<action description="Invite People to this Group"
- longdescription="Invite People to this Group using the &apos;Invite&apos; button in the Roles section &gt; Members tab."
+ longdescription="Invite People to this Group using the &apos;Invite&apos; button in the Roles &amp; Members section &gt; Members tab."
name="member invite" value="1" />
- <action description="Eject Members from this Group"
- longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability."
+ <action description="Eject Members belonging to the 'Everyone' role from this Group"
+ longdescription="Eject Members from this Group using the &apos;Eject&apos; button in the Roles &amp; Members section &gt; Members tab. An Owner can eject anyone except another Owner. If you&apos;re not an Owner, a Member can be ejected from a group if, and only if, they&apos;re only in the Everyone Role, and NO other Roles. To remove Members from Roles, you need to have the &apos;Remove Members from Roles&apos; Ability."
name="member eject" value="2" />
<action description="Manage ban list"
longdescription="Allows the group member to ban / un-ban Residents from this group."
@@ -21,25 +21,25 @@
description="These Abilities include powers to add, remove, and change group Roles, add and remove Members in Roles, and assign Abilities to Roles."
name="Roles">
<action description="Create new Roles"
- longdescription="Create new Roles in the Roles section &gt; Roles tab."
+ longdescription="Create new Roles in the Roles &amp; Members section &gt; Roles tab."
name="role create" value="4" />
<action description="Delete Roles"
- longdescription="Delete Roles in the Roles section &gt; Roles tab."
+ longdescription="Delete Roles in the Roles &amp; Members section &gt; Roles tab."
name="role delete" value="5" />
<action description="Change Role names, titles, descriptions, and whether Role members are publicly revealed"
- longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles section &gt; Roles tab after selecting a Role."
+ longdescription="Change Role names, titles, descriptions, and whether Role members are publicly revealed. This is done at the bottom of the the Roles &amp; Members section &gt; Roles tab after selecting a Role."
name="role properties" value="6" />
<action description="Assign Members to Assigner&apos;s Roles"
- longdescription="Assign Members to Roles in the list of Assigned Roles (Roles section &gt; Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in."
+ longdescription="Assign Members to Roles in the list of Assigned Roles (Roles &amp; Members section &gt; Members tab). A Member with this Ability can only add Members to a Role that the assigner is already in."
name="role assign member limited" value="7" />
<action description="Assign Members to Any Role"
- longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles section &gt; Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
+ longdescription="Assign Members to Any Role in the list of Assigned Roles (Roles &amp; Members section &gt; Members tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--to Roles that have more powers than they currently have, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
name="role assign member" value="8" />
<action description="Remove Members from Roles"
- longdescription="Remove Members from Roles in the list of Assigned Roles (Roles section &gt; Members tab). Owners can&apos;t be removed."
+ longdescription="Remove Members from Roles in the list of Assigned Roles (Roles &amp; Members section &gt; Members tab). Owners can&apos;t be removed."
name="role remove member" value="9" />
<action description="Assign and Remove Abilities in Roles"
- longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles section &gt; Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
+ longdescription="Assign and Remove Abilities for each Role in the list of Allowed Abilities (Roles &amp; Members section &gt; Roles tab). *WARNING* Any Member in a Role with this Ability can assign themselves--and any other non-Owner Member--all Abilities, potentially elevating themselves to near-Owner power. Be sure you know what you&apos;re doing before assigning this Ability."
name="role change actions" value="10" />
</action_set>
<action_set
diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp
index 47353962e1..62158d8f66 100644
--- a/indra/newview/tests/lldateutil_test.cpp
+++ b/indra/newview/tests/lldateutil_test.cpp
@@ -45,7 +45,7 @@ std::map< std::string, std::string > gString;
typedef std::pair< std::string, int > count_string_t;
std::map< count_string_t, std::string > gCountString;
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args)
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
{
std::string text = gString[xml_desc];
LLStringUtil::format(text, args);
diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp
index 4694f657b6..eabf922875 100644
--- a/indra/newview/tests/llslurl_test.cpp
+++ b/indra/newview/tests/llslurl_test.cpp
@@ -46,10 +46,10 @@ static const char * const TEST_FILENAME("llslurl_test.xml");
class LLTrans
{
public:
- static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+ static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string = false);
};
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args)
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
{
return std::string();
}
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
index e68da14fe9..3dd327591e 100644
--- a/indra/newview/tests/llviewernetwork_test.cpp
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -45,10 +45,10 @@ static const char * const TEST_FILENAME("llviewernetwork_test.xml");
class LLTrans
{
public:
- static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+ static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string = false);
};
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args)
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string)
{
std::string grid_label = std::string();
if(xml_desc == "AgniGridLabel")
diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp
index 84194adb5d..f1dd8acccf 100644
--- a/indra/newview/tests/llworldmap_test.cpp
+++ b/indra/newview/tests/llworldmap_test.cpp
@@ -66,7 +66,7 @@ void LLWorldMipmap::equalizeBoostLevels() { }
LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) { return NULL; }
// Stub other stuff
-std::string LLTrans::getString(const std::string &, const LLStringUtil::format_map_t& ) { return std::string("test_trans"); }
+std::string LLTrans::getString(const std::string &, const LLStringUtil::format_map_t&, bool def_string) { return std::string("test_trans"); }
void LLUIString::updateResult() const { }
void LLUIString::setArg(const std::string& , const std::string& ) { }
void LLUIString::assign(const std::string& ) { }