diff options
Diffstat (limited to 'indra')
63 files changed, 466 insertions, 433 deletions
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index 6bbaad9cef..290206ee22 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -181,6 +181,8 @@ LLVorbisDecodeState::LLVorbisDecodeState(const LLUUID &uuid, const std::string & mFileHandle = LLLFSThread::nullHandle(); #endif // No default value for mVF, it's an ogg structure? + // Hey, let's zero it anyway, for predictability. + memset(&mVF, 0, sizeof(mVF)); } LLVorbisDecodeState::~LLVorbisDecodeState() diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp index 21ea4b2e7c..487ed6451f 100644 --- a/indra/llmath/llcamera.cpp +++ b/indra/llmath/llcamera.cpp @@ -45,7 +45,8 @@ LLCamera::LLCamera() : mNearPlane(DEFAULT_NEAR_PLANE), mFarPlane(DEFAULT_FAR_PLANE), mFixedDistance(-1.f), - mPlaneCount(6) + mPlaneCount(6), + mFrustumCornerDist(0.f) { calculateFrustumPlanes(); } @@ -55,7 +56,8 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p LLCoordFrame(), mViewHeightInPixels(view_height_in_pixels), mFixedDistance(-1.f), - mPlaneCount(6) + mPlaneCount(6), + mFrustumCornerDist(0.f) { mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO); mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE); @@ -648,7 +650,6 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx) void LLCamera::calcAgentFrustumPlanes(LLVector3* frust) { - for (int i = 0; i < 8; i++) { mAgentFrustum[i] = frust[i]; diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp index 7332f5c954..8f36d516d7 100644 --- a/indra/llmessage/lltransfersourceasset.cpp +++ b/indra/llmessage/lltransfersourceasset.cpp @@ -226,7 +226,10 @@ void LLTransferSourceAsset::responderCallback(LLVFS *vfs, const LLUUID& uuid, LL -LLTransferSourceParamsAsset::LLTransferSourceParamsAsset() : LLTransferSourceParams(LLTST_ASSET) +LLTransferSourceParamsAsset::LLTransferSourceParamsAsset() + : LLTransferSourceParams(LLTST_ASSET), + + mAssetType(LLAssetType::AT_NONE) { } diff --git a/indra/llmessage/lltransfertargetvfile.h b/indra/llmessage/lltransfertargetvfile.h index 8c2bc7e8bb..cd18d8ce3f 100644 --- a/indra/llmessage/lltransfertargetvfile.h +++ b/indra/llmessage/lltransfertargetvfile.h @@ -68,7 +68,6 @@ protected: LLTTVFCompleteCallback mCompleteCallback; void* mUserDatap; S32 mErrCode; - LLVFSThread::handle_t mHandle; }; diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp index 08a96b4e31..036714e5cb 100644 --- a/indra/llrender/llcubemap.cpp +++ b/indra/llrender/llcubemap.cpp @@ -63,6 +63,12 @@ LLCubeMap::LLCubeMap() mTextureCoordStage(0), mMatrixStage(0) { + mTargets[0] = GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB; + mTargets[1] = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB; + mTargets[2] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB; + mTargets[3] = GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB; + mTargets[4] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB; + mTargets[5] = GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB; } LLCubeMap::~LLCubeMap() @@ -75,13 +81,6 @@ void LLCubeMap::initGL() if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) { - mTargets[0] = GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB; - mTargets[1] = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB; - mTargets[2] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB; - mTargets[3] = GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB; - mTargets[4] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB; - mTargets[5] = GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB; - // Not initialized, do stuff. if (mImages[0].isNull()) { diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 187a9a984e..a3f7a946ec 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -332,6 +332,8 @@ LLGLManager::LLGLManager() : mHasFragmentShader(FALSE), mHasOcclusionQuery(FALSE), mHasPointParameters(FALSE), + mHasDrawBuffers(FALSE), + mHasTextureRectangle(FALSE), mHasAnisotropic(FALSE), mHasARBEnvCombine(FALSE), @@ -671,7 +673,7 @@ void LLGLManager::initExtensions() llinfos << "initExtensions() checking shell variables to adjust features..." << llendl; // Our extension support for the Linux Client is very young with some // potential driver gotchas, so offer a semi-secret way to turn it off. - if (getenv("LL_GL_NOEXT")) /* Flawfinder: ignore */ + if (getenv("LL_GL_NOEXT")) { //mHasMultitexture = FALSE; // NEEDED! mHasARBEnvCombine = FALSE; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 830617063b..ca92cb6580 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -70,7 +70,7 @@ hasGamma(false), hasLighting(false), calculatesAtmospherics(false) // LLGLSL Shader implementation //=============================== LLGLSLShader::LLGLSLShader() -: mProgramObject(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT) + : mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE) { } diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp index 7f4be6a866..bc7f30cdef 100644 --- a/indra/llrender/llpostprocess.cpp +++ b/indra/llrender/llpostprocess.cpp @@ -59,6 +59,8 @@ LLPostProcess::LLPostProcess(void) : mSceneRenderTexture = NULL ; mNoiseTexture = NULL ; mTempBloomTexture = NULL ; + + noiseTextureScale = 1.0f; /* Do nothing. Needs to be updated to use our current shader system, and to work with the move into llrender. std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", XML_FILENAME)); diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index f97d81126e..595b8577ff 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -733,8 +733,11 @@ void LLTexUnit::debugTextureUnit(void) LLRender::LLRender() -: mDirty(false), mCount(0), mMode(LLRender::TRIANGLES), - mMaxAnisotropy(0.f) + : mDirty(false), + mCount(0), + mMode(LLRender::TRIANGLES), + mCurrTextureUnitIndex(0), + mMaxAnisotropy(0.f) { mBuffer = new LLVertexBuffer(immediate_mask, 0); mBuffer->allocateBuffer(4096, 0, TRUE); diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index ecfe845b34..bf5eda21eb 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -215,14 +215,18 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask) void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const { + llassert(mRequestedNumVerts >= 0); + if (start >= (U32) mRequestedNumVerts || - end >= (U32) mRequestedNumVerts) + end >= (U32) mRequestedNumVerts) { llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "]" << llendl; } + llassert(mRequestedNumIndices >= 0); + if (indices_offset >= (U32) mRequestedNumIndices || - indices_offset + count > (U32) mRequestedNumIndices) + indices_offset + count > (U32) mRequestedNumIndices) { llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl; } @@ -251,8 +255,9 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const { + llassert(mRequestedNumIndices >= 0); if (indices_offset >= (U32) mRequestedNumIndices || - indices_offset + count > (U32) mRequestedNumIndices) + indices_offset + count > (U32) mRequestedNumIndices) { llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl; } @@ -281,8 +286,9 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const { + llassert(mRequestedNumVerts >= 0); if (first >= (U32) mRequestedNumVerts || - first + count > (U32) mRequestedNumVerts) + first + count > (U32) mRequestedNumVerts) { llerrs << "Bad vertex buffer draw range: [" << first << ", " << first+count << "]" << llendl; } @@ -354,7 +360,14 @@ void LLVertexBuffer::clientCopy(F64 max_time) LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) : LLRefCount(), - mNumVerts(0), mNumIndices(0), mUsage(usage), mGLBuffer(0), mGLIndices(0), + + mNumVerts(0), + mNumIndices(0), + mRequestedNumVerts(-1), + mRequestedNumIndices(-1), + mUsage(usage), + mGLBuffer(0), + mGLIndices(0), mMappedData(NULL), mMappedIndexData(NULL), mLocked(FALSE), mFinal(FALSE), @@ -600,6 +613,8 @@ void LLVertexBuffer::updateNumVerts(S32 nverts) { LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_VERTS); + llassert(nverts >= 0); + if (nverts >= 65535) { llwarns << "Vertex buffer overflow!" << llendl; @@ -628,6 +643,9 @@ void LLVertexBuffer::updateNumVerts(S32 nverts) void LLVertexBuffer::updateNumIndices(S32 nindices) { LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_INDICES); + + llassert(nindices >= 0); + mRequestedNumIndices = nindices; if (!mDynamicSize) { @@ -668,6 +686,9 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create) void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { + llassert(newnverts >= 0); + llassert(newnindices >= 0); + mRequestedNumVerts = newnverts; mRequestedNumIndices = newnindices; diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index d55e0f4043..8d993b71d7 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -371,7 +371,7 @@ private: // this is just for making it easy to look things up in a set organized by UUID -- DON'T USE IT // for anything real! - LLNotification(LLUUID uuid) : mId(uuid), mCancelled(false), mRespondedTo(false), mIgnored(false), mTemporaryResponder(false) {} + LLNotification(LLUUID uuid) : mId(uuid), mCancelled(false), mRespondedTo(false), mIgnored(false), mPriority(NOTIFICATION_PRIORITY_UNSPECIFIED), mTemporaryResponder(false) {} void cancel(); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index b977e50bc1..75ca6d8895 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -185,7 +185,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mWriteableBgColor(p.bg_writeable_color), mReadOnlyBgColor(p.bg_readonly_color), mFocusBgColor(p.bg_focus_color), - mReflowNeeded(FALSE), + mReflowIndex(S32_MAX), mCursorPos( 0 ), mScrollNeeded(FALSE), mDesiredXPixel(-1), @@ -660,7 +660,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s } onValueChange(pos, pos + insert_len); - needsReflow(); + needsReflow(pos); return insert_len; } @@ -720,7 +720,7 @@ S32 LLTextBase::removeStringNoUndo(S32 pos, S32 length) createDefaultSegment(); onValueChange(pos, pos); - needsReflow(); + needsReflow(pos); return -length; // This will be wrong if someone calls removeStringNoUndo with an excessive length } @@ -736,7 +736,7 @@ S32 LLTextBase::overwriteCharNoUndo(S32 pos, llwchar wc) getViewModel()->setDisplay(text); onValueChange(pos, pos + 1); - needsReflow(); + needsReflow(pos); return 1; } @@ -762,15 +762,18 @@ void LLTextBase::insertSegment(LLTextSegmentPtr segment_to_insert) } segment_set_t::iterator cur_seg_iter = getSegIterContaining(segment_to_insert->getStart()); + S32 reflow_start_index = 0; if (cur_seg_iter == mSegments.end()) { mSegments.insert(segment_to_insert); segment_to_insert->linkToDocument(this); + reflow_start_index = segment_to_insert->getStart(); } else { LLTextSegmentPtr cur_segmentp = *cur_seg_iter; + reflow_start_index = cur_segmentp->getStart(); if (cur_segmentp->getStart() < segment_to_insert->getStart()) { S32 old_segment_end = cur_segmentp->getEnd(); @@ -829,7 +832,7 @@ void LLTextBase::insertSegment(LLTextSegmentPtr segment_to_insert) } // layout potentially changed - needsReflow(); + needsReflow(reflow_start_index); } BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask) @@ -1084,15 +1087,16 @@ S32 LLTextBase::getLeftOffset(S32 width) static LLFastTimer::DeclareTimer FTM_TEXT_REFLOW ("Text Reflow"); -void LLTextBase::reflow(S32 start_index) +void LLTextBase::reflow() { LLFastTimer ft(FTM_TEXT_REFLOW); updateSegments(); - while(mReflowNeeded) + while(mReflowIndex < S32_MAX) { - mReflowNeeded = false; + S32 start_index = mReflowIndex; + mReflowIndex = S32_MAX; // shrink document to minimum size (visible portion of text widget) // to force inlined widgets with follows set to shrink @@ -1619,6 +1623,12 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c } } +void LLTextBase::needsReflow(S32 index) +{ + lldebugs << "reflow on object " << (void*)this << " index = " << mReflowIndex << ", new index = " << index << llendl; + mReflowIndex = llmin(mReflowIndex, index); +} + void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepend_newline, S32 highlight_part, const LLStyle::Params& style_params) { if (new_text.empty()) return; @@ -2260,7 +2270,7 @@ LLNormalTextSegment::LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 e LLUIImagePtr image = mStyle->getImage(); if (image.notNull()) { - mImageLoadedConnection = image->addLoadedCallback(boost::bind(&LLTextBase::needsReflow, &mEditor)); + mImageLoadedConnection = image->addLoadedCallback(boost::bind(&LLTextBase::needsReflow, &mEditor, start)); } } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index ed2f239476..3dda6f4cc8 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -150,7 +150,7 @@ public: void appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params = LLStyle::Params()); // force reflow of text - void needsReflow() { mReflowNeeded = TRUE; } + void needsReflow(S32 index = 0); S32 getLength() const { return getWText().length(); } S32 getLineCount() const { return mLineInfoList.size(); } @@ -292,7 +292,7 @@ protected: S32 getFirstVisibleLine() const; std::pair<S32, S32> getVisibleLines(bool fully_visible = false); S32 getLeftOffset(S32 width); - void reflow(S32 start_index = 0); + void reflow(); // cursor void updateCursorXPos(); @@ -362,7 +362,7 @@ protected: class LLScrollContainer* mScroller; // transient state - bool mReflowNeeded; // need to reflow text because of change to text contents or display region + S32 mReflowIndex; // index at which to start reflow. S32_MAX indicates no reflow needed. bool mScrollNeeded; // need to change scroll region because of change to cursor position S32 mScrollIndex; // index of first character to keep visible in scroll region diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index e76fee9f17..62aeb50011 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1285,8 +1285,6 @@ void LLTextEditor::cut() gClipboard.copyFromSubstring( getWText(), left_pos, length, mSourceID ); deleteSelection( FALSE ); - needsReflow(); - onKeyStroke(); } @@ -1391,8 +1389,6 @@ void LLTextEditor::pasteHelper(bool is_primary) setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE, LLTextSegmentPtr())); deselect(); - needsReflow(); - onKeyStroke(); } @@ -1787,8 +1783,6 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask ) if(text_may_have_changed) { - needsReflow(); - onKeyStroke(); } needsScroll(); @@ -1831,8 +1825,6 @@ BOOL LLTextEditor::handleUnicodeCharHere(llwchar uni_char) // Most keystrokes will make the selection box go away, but not all will. deselect(); - needsReflow(); - onKeyStroke(); } @@ -1891,8 +1883,6 @@ void LLTextEditor::doDelete() } onKeyStroke(); - - needsReflow(); } //---------------------------------------------------------------------------- @@ -1935,8 +1925,6 @@ void LLTextEditor::undo() setCursorPos(pos); - needsReflow(); - onKeyStroke(); } @@ -1979,8 +1967,6 @@ void LLTextEditor::redo() setCursorPos(pos); - needsReflow(); - onKeyStroke(); } @@ -2339,8 +2325,6 @@ void LLTextEditor::insertText(const std::string &new_text) setCursorPos(mCursorPos + insert( mCursorPos, utf8str_to_wstring(new_text), FALSE, LLTextSegmentPtr() )); - needsReflow(); - setEnabled( enabled ); } @@ -2363,8 +2347,6 @@ void LLTextEditor::appendWidget(const LLInlineViewSegment::Params& params, const LLTextSegmentPtr segment = new LLInlineViewSegment(params, old_length, old_length + widget_wide_text.size()); insert(getLength(), widget_wide_text, FALSE, segment); - needsReflow(); - // Set the cursor and scroll position if( selection_start != selection_end ) { @@ -2389,52 +2371,6 @@ void LLTextEditor::appendWidget(const LLInlineViewSegment::Params& params, const } } - -void LLTextEditor::replaceUrlLabel(const std::string &url, - const std::string &label) -{ - // get the full (wide) text for the editor so we can change it - LLWString text = getWText(); - LLWString wlabel = utf8str_to_wstring(label); - bool modified = false; - S32 seg_start = 0; - - // iterate through each segment looking for ones styled as links - segment_set_t::iterator it; - for (it = mSegments.begin(); it != mSegments.end(); ++it) - { - LLTextSegment *seg = *it; - LLStyleConstSP style = seg->getStyle(); - - // update segment start/end length in case we replaced text earlier - S32 seg_length = seg->getEnd() - seg->getStart(); - seg->setStart(seg_start); - seg->setEnd(seg_start + seg_length); - - // if we find a link with our Url, then replace the label - if (style->isLink() && style->getLinkHREF() == url) - { - S32 start = seg->getStart(); - S32 end = seg->getEnd(); - text = text.substr(0, start) + wlabel + text.substr(end, text.size() - end + 1); - seg->setEnd(start + wlabel.size()); - modified = true; - } - - // work out the character offset for the next segment - seg_start = seg->getEnd(); - } - - // update the editor with the new (wide) text string - if (modified) - { - getViewModel()->setDisplay(text); - deselect(); - setCursorPos(mCursorPos); - needsReflow(); - } -} - void LLTextEditor::removeTextFromEnd(S32 num_chars) { if (num_chars <= 0) return; @@ -2446,7 +2382,6 @@ void LLTextEditor::removeTextFromEnd(S32 num_chars) mSelectionStart = llclamp(mSelectionStart, 0, len); mSelectionEnd = llclamp(mSelectionEnd, 0, len); - needsReflow(); needsScroll(); } @@ -2505,8 +2440,6 @@ BOOL LLTextEditor::tryToRevertToPristineState() i--; } } - - needsReflow(); } return isPristine(); // TRUE => success @@ -2574,7 +2507,7 @@ void LLTextEditor::updateLinkSegments() // then update the link's HREF to be the same as the label text. // This lets users edit Urls in-place. LLStyleConstSP style = segment->getStyle(); - LLStyle* new_style = new LLStyle(*style); + LLStyleSP new_style(new LLStyle(*style)); LLWString url_label = wtext.substr(segment->getStart(), segment->getEnd()-segment->getStart()); if (LLUrlRegistry::instance().hasUrl(url_label)) { @@ -2681,7 +2614,6 @@ BOOL LLTextEditor::importBuffer(const char* buffer, S32 length ) startOfDoc(); deselect(); - needsReflow(); return success; } @@ -2785,7 +2717,6 @@ void LLTextEditor::updatePreedit(const LLWString &preedit_string, mPreeditStandouts = preedit_standouts; - needsReflow(); setCursorPos(insert_preedit_at + caret_position); // Update of the preedit should be caused by some key strokes. diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 043dda8fa6..a136f9ccce 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -149,7 +149,6 @@ public: void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE); BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE); void replaceTextAll(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive); - void replaceUrlLabel(const std::string &url, const std::string &label); // Undo/redo stack void blockUndo(); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index b20de914a0..92b7816bdd 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -232,7 +232,7 @@ std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const LLUrlEntrySLURL::LLUrlEntrySLURL() { // see http://slurl.com/about.php for details on the SLURL format - mPattern = boost::regex("http://slurl.com/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", + mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_slurl.xml"; mTooltip = LLTrans::getString("TooltipSLURL"); diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 42d680ade6..3c24b4ed22 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -608,6 +608,9 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_ mLastMouseX = 0; mLastMouseY = 0; mFirstFocus = true; + mBackgroundR = 0.0f; + mBackgroundG = 0.0f; + mBackgroundB = 0.0f; } MediaPluginWebKit::~MediaPluginWebKit() diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 62197406b6..793d7b6207 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7802,7 +7802,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ShowCrosshairs</key> <map> diff --git a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/firstlook-dmg/_DS_Store +++ b/indra/newview/installers/darwin/firstlook-dmg/_DS_Store diff --git a/indra/newview/installers/darwin/fix_application_icon_position.sh b/indra/newview/installers/darwin/fix_application_icon_position.sh index a0b72a89f2..c6b92589db 100644 --- a/indra/newview/installers/darwin/fix_application_icon_position.sh +++ b/indra/newview/installers/darwin/fix_application_icon_position.sh @@ -4,11 +4,14 @@ cp -r ./../../../build-darwin-i386/newview/*.dmg ~/Desktop/TempBuild.dmg hdid ~/Desktop/TempBuild.dmg open -a finder /Volumes/Second\ Life\ Installer osascript dmg-cleanup.applescript -cp /Volumes/Second\ Life\ Installer/.DS_Store ~/Desktop/_DS_Store -chflags nohidden ~/Desktop/_DS_Store -cp ~/Desktop/_DS_Store ./firstlook-dmg/_DS_Store -cp ~/Desktop/_DS_Store ./publicnightly-dmg/_DS_Store -cp ~/Desktop/_DS_Store ./release-dmg/_DS_Store -cp ~/Desktop/_DS_Store ./releasecandidate-dmg/_DS_Store umount /Volumes/Second\ Life\ Installer/ -rm ~/Desktop/_DS_Store ~/Desktop/TempBuild.dmg +hdid ~/Desktop/TempBuild.dmg +open -a finder /Volumes/Second\ Life\ Installer +#cp /Volumes/Second\ Life\ Installer/.DS_Store ~/Desktop/_DS_Store +#chflags nohidden ~/Desktop/_DS_Store +#cp ~/Desktop/_DS_Store ./firstlook-dmg/_DS_Store +#cp ~/Desktop/_DS_Store ./publicnightly-dmg/_DS_Store +#cp ~/Desktop/_DS_Store ./release-dmg/_DS_Store +#cp ~/Desktop/_DS_Store ./releasecandidate-dmg/_DS_Store +#umount /Volumes/Second\ Life\ Installer/ +#rm ~/Desktop/_DS_Store ~/Desktop/TempBuild.dmg diff --git a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store +++ b/indra/newview/installers/darwin/publicnightly-dmg/_DS_Store diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/release-dmg/_DS_Store +++ b/indra/newview/installers/darwin/release-dmg/_DS_Store diff --git a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store Binary files differindex 9d9fd897e7..495ec37f53 100644 --- a/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store +++ b/indra/newview/installers/darwin/releasecandidate-dmg/_DS_Store diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index b0ff3a5626..41f2ff29e6 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -2300,7 +2300,7 @@ public: virtual ~LLLibraryOutfitsCopyDone() { - if (mLibraryOutfitsFetcher) + if (!LLApp::isExiting() && mLibraryOutfitsFetcher) { gInventory.addObserver(mLibraryOutfitsFetcher); mLibraryOutfitsFetcher->done(); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 5088c65122..585d42f66d 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -279,7 +279,10 @@ public: virtual ~LLUpdateAppearanceOnDestroy() { - LLAppearanceManager::instance().updateAppearanceFromCOF(); + if (!LLApp::isExiting()) + { + LLAppearanceManager::instance().updateAppearanceFromCOF(); + } } /* virtual */ void fire(const LLUUID& inv_item) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index a2d594cfa2..0102e9488e 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -474,6 +474,7 @@ void LLBottomTray::onContextMenuItemClicked(const LLSD& userdata) else if (item == "paste") { edit_box->paste(); + edit_box->setFocus(TRUE); } else if (item == "delete") { diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 7c22ac9e36..1dc0e8c0a7 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -53,8 +53,11 @@ #include "llagent.h" #include "llnotificationsutil.h" #include "lltoastnotifypanel.h" +#include "lltooltip.h" #include "llviewerregion.h" +#include "llviewertexteditor.h" #include "llworld.h" +#include "lluiconstants.h" #include "llsidetray.h"//for blocked objects panel @@ -110,6 +113,34 @@ public: return LLPanel::handleMouseUp(x,y,mask); } + //*TODO remake it using mouse enter/leave and static LLHandle<LLIconCtrl> to add/remove as a child + BOOL handleToolTip(S32 x, S32 y, MASK mask) + { + LLViewerTextEditor* name = getChild<LLViewerTextEditor>("user_name"); + if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom) + { + + // Spawn at right side of the name textbox. + LLRect sticky_rect = name->calcScreenRect(); + S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3); + + LLToolTip::Params params; + params.background_visible(false); + params.click_callback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, 0, 0, 0)); + params.delay_time(0.0f); // spawn instantly on hover + params.image(LLUI::getUIImage("Info_Small")); + params.message(""); + params.padding(0); + params.pos(LLCoordGL(icon_x, sticky_rect.mTop - 2)); + params.sticky_rect(sticky_rect); + + LLToolTipMgr::getInstance()->show(params); + return TRUE; + } + + return LLPanel::handleToolTip(x, y, mask); + } + void onObjectIconContextMenuItemClicked(const LLSD& userdata) { std::string level = userdata.asString(); @@ -671,8 +702,36 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL { LLToastNotifyPanel* notify_box = new LLToastNotifyPanel( notification); + //we can't set follows in xml since it broke toasts behavior notify_box->setFollowsLeft(); notify_box->setFollowsRight(); + notify_box->setFollowsTop(); + + LLButton* accept_button = notify_box->getChild<LLButton> ("Accept", + TRUE); + if (accept_button != NULL) + { + accept_button->setFollowsNone(); + accept_button->setOrigin(2*HPAD, accept_button->getRect().mBottom); + } + + LLButton* decline_button = notify_box->getChild<LLButton> ( + "Decline", TRUE); + if (accept_button != NULL && decline_button != NULL) + { + decline_button->setFollowsNone(); + decline_button->setOrigin(4*HPAD + + accept_button->getRect().getWidth(), + decline_button->getRect().mBottom); + } + + LLTextEditor* text_editor = notify_box->getChild<LLTextEditor>("text_editor_box", TRUE); + S32 text_heigth = 0; + if(text_editor != NULL) + { + text_heigth = text_editor->getTextBoundingRect().getHeight(); + } + //Prepare the rect for the view LLRect target_rect = mEditor->getDocumentView()->getRect(); // squeeze down the widget by subtracting padding off left and right @@ -682,6 +741,15 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL notify_box->getRect().getHeight()); notify_box->setOrigin(target_rect.mLeft, notify_box->getRect().mBottom); + if (text_editor != NULL) + { + S32 text_heigth_delta = + text_editor->getTextBoundingRect().getHeight() + - text_heigth; + notify_box->reshape(target_rect.getWidth(), + notify_box->getRect().getHeight() + text_heigth_delta); + } + LLInlineViewSegment::Params params; params.view = notify_box; params.left_pad = mLeftWidgetPad; diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index f5bb777419..a5b62439f4 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -370,7 +370,8 @@ struct LLFavoritesSort LLFavoritesBarCtrl::Params::Params() : image_drag_indication("image_drag_indication"), - chevron_button("chevron_button") + chevron_button("chevron_button"), + label("label") { } @@ -401,6 +402,10 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p) chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this)); mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params); addChild(mChevronButton); + + LLTextBox::Params label_param(p.label); + mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param); + addChild(mBarLabel); } LLFavoritesBarCtrl::~LLFavoritesBarCtrl() diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 40dd551eef..2c6d8d1580 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -35,6 +35,7 @@ #include "llbutton.h" #include "lluictrl.h" +#include "lltextbox.h" #include "llinventoryobserver.h" #include "llinventorymodel.h" @@ -46,6 +47,7 @@ public: { Optional<LLUIImage*> image_drag_indication; Optional<LLButton::Params> chevron_button; + Optional<LLTextBox::Params> label; Params(); }; @@ -139,6 +141,7 @@ private: LLUICtrl* mLandingTab; LLUICtrl* mLastTab; LLButton* mChevronButton; + LLTextBox* mBarLabel; LLUUID mDragItemId; BOOL mStartDrag; diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 60f150bd96..904655cdc8 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -86,38 +86,40 @@ const F32 BASE_ANIM_TIME_OFFSET = 5.f; std::string STATUS[] = { - "E_ST_OK", - "E_ST_EOF", - "E_ST_NO_CONSTRAINT", - "E_ST_NO_FILE", -"E_ST_NO_HIER", -"E_ST_NO_JOINT", -"E_ST_NO_NAME", -"E_ST_NO_OFFSET", -"E_ST_NO_CHANNELS", -"E_ST_NO_ROTATION", -"E_ST_NO_AXIS", -"E_ST_NO_MOTION", -"E_ST_NO_FRAMES", -"E_ST_NO_FRAME_TIME", -"E_ST_NO_POS", -"E_ST_NO_ROT", -"E_ST_NO_XLT_FILE", -"E_ST_NO_XLT_HEADER", -"E_ST_NO_XLT_NAME", -"E_ST_NO_XLT_IGNORE", -"E_ST_NO_XLT_RELATIVE", -"E_ST_NO_XLT_OUTNAME", -"E_ST_NO_XLT_MATRIX", -"E_ST_NO_XLT_MERGECHILD", -"E_ST_NO_XLT_MERGEPARENT", -"E_ST_NO_XLT_PRIORITY", -"E_ST_NO_XLT_LOOP", -"E_ST_NO_XLT_EASEIN", -"E_ST_NO_XLT_EASEOUT", -"E_ST_NO_XLT_HAND", -"E_ST_NO_XLT_EMOTE", + "E_ST_OK", + "E_ST_EOF", + "E_ST_NO_CONSTRAINT", + "E_ST_NO_FILE", + "E_ST_NO_HIER", + "E_ST_NO_JOINT", + "E_ST_NO_NAME", + "E_ST_NO_OFFSET", + "E_ST_NO_CHANNELS", + "E_ST_NO_ROTATION", + "E_ST_NO_AXIS", + "E_ST_NO_MOTION", + "E_ST_NO_FRAMES", + "E_ST_NO_FRAME_TIME", + "E_ST_NO_POS", + "E_ST_NO_ROT", + "E_ST_NO_XLT_FILE", + "E_ST_NO_XLT_HEADER", + "E_ST_NO_XLT_NAME", + "E_ST_NO_XLT_IGNORE", + "E_ST_NO_XLT_RELATIVE", + "E_ST_NO_XLT_OUTNAME", + "E_ST_NO_XLT_MATRIX", + "E_ST_NO_XLT_MERGECHILD", + "E_ST_NO_XLT_MERGEPARENT", + "E_ST_NO_XLT_PRIORITY", + "E_ST_NO_XLT_LOOP", + "E_ST_NO_XLT_EASEIN", + "E_ST_NO_XLT_EASEOUT", + "E_ST_NO_XLT_HAND", + "E_ST_NO_XLT_EMOTE", + "E_ST_BAD_ROOT" }; + //----------------------------------------------------------------------------- // LLFloaterAnimPreview() //----------------------------------------------------------------------------- diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index e01709aa3a..1ed1113f4d 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -72,6 +72,8 @@ public: static const LLGroupComparator GROUP_COMPARATOR; LLGroupList::Params::Params() +: no_groups_msg("no_groups_msg") +, no_filtered_groups_msg("no_filtered_groups_msg") { } @@ -79,15 +81,14 @@ LLGroupList::Params::Params() LLGroupList::LLGroupList(const Params& p) : LLFlatListView(p) , mDirty(true) // to force initial update + , mNoFilteredGroupsMsg(p.no_filtered_groups_msg) + , mNoGroupsMsg(p.no_groups_msg) { // Listen for agent group changes. gAgent.addListener(this, "new group"); mShowIcons = gSavedSettings.getBOOL("GroupListShowIcons"); setCommitOnSelectionChange(true); - // TODO: implement context menu - // display a context menu appropriate for a list of group names -// setContextMenu(LLScrollListCtrl::MENU_GROUP); // Set default sort order. setComparator(&GROUP_COMPARATOR); @@ -158,6 +159,18 @@ void LLGroupList::refresh() LLUUID id; bool have_filter = !mNameFilter.empty(); + // set no items message depend on filter state & total count of groups + if (have_filter) + { + // groups were filtered + setNoItemsCommentText(mNoFilteredGroupsMsg); + } + else if (0 == count) + { + // user is not a member of any group + setNoItemsCommentText(mNoGroupsMsg); + } + clear(); for(S32 i = 0; i < count; ++i) @@ -173,7 +186,8 @@ void LLGroupList::refresh() sort(); // Add "none" to list at top if filter not set (what's the point of filtering "none"?). - if (!have_filter) + // but only if some real groups exists. EXT-4838 + if (!have_filter && count > 0) { std::string loc_none = LLTrans::getString("GroupsNone"); addNewItem(LLUUID::null, loc_none, LLUUID::null, ADD_TOP); diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h index f7afe0c0b2..f3ac676edd 100644 --- a/indra/newview/llgrouplist.h +++ b/indra/newview/llgrouplist.h @@ -53,6 +53,15 @@ class LLGroupList: public LLFlatListView, public LLOldEvents::LLSimpleListener public: struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> { + /** + * Contains a message for empty list when user is not a member of any group + */ + Optional<std::string> no_groups_msg; + + /** + * Contains a message for empty list when all groups don't match passed filter + */ + Optional<std::string> no_filtered_groups_msg; Params(); }; @@ -80,6 +89,8 @@ private: bool mShowIcons; bool mDirty; std::string mNameFilter; + std::string mNoFilteredGroupsMsg; + std::string mNoGroupsMsg; }; class LLButton; diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 8bd0e520c3..72a52ba13b 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1714,6 +1714,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, for (std::vector<LLUUID>::iterator it = member_ids.begin(); it != member_ids.end(); ++it) { + LLUUID& ejected_member_id = (*it); + // Can't use 'eject' to leave a group. if ((*it) == gAgent.getID()) continue; @@ -1734,7 +1736,7 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, } msg->nextBlock("EjectData"); - msg->addUUID("EjecteeID",(*it)); + msg->addUUID("EjecteeID",ejected_member_id); if (msg->isSendFull()) { @@ -1746,13 +1748,15 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, for (LLGroupMemberData::role_list_t::iterator rit = (*mit).second->roleBegin(); rit != (*mit).second->roleEnd(); ++rit) { - if ((*rit).first.notNull()) + if ((*rit).first.notNull() && (*rit).second!=0) { - (*rit).second->removeMember(*it); + (*rit).second->removeMember(ejected_member_id); } } - delete (*mit).second; + group_datap->mMembers.erase(*it); + + delete (*mit).second; } } diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 4a18c8640f..1eac90371d 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -515,7 +515,7 @@ BOOL LLIMFloater::getVisible() if(isChatMultiTab()) { LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance(); - // Tabbed IM window is "visible" when we minimize it. + // getVisible() returns TRUE when Tabbed IM window is minimized. return !im_container->isMinimized() && im_container->getVisible(); } else @@ -572,6 +572,12 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id) setKey(im_session_id); mControlPanel->setSessionId(im_session_id); } + + // updating "Call" button from group control panel here to enable it without placing into draw() (EXT-4796) + if(gAgent.isInGroup(im_session_id)) + { + mControlPanel->updateCallButton(); + } //*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index db6b2041f8..0c64c2b032 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1709,6 +1709,8 @@ BOOL LLOutgoingCallDialog::postBuild() childSetAction("Cancel", onCancel, this); + setCanDrag(FALSE); + return success; } @@ -1808,6 +1810,8 @@ BOOL LLIncomingCallDialog::postBuild() mLifetimeTimer.stop(); } + setCanDrag(FALSE); + return TRUE; } @@ -2985,48 +2989,6 @@ public: } }; -LLCallInfoDialog::LLCallInfoDialog(const LLSD& payload) : LLCallDialog(payload) -{ -} - -BOOL LLCallInfoDialog::postBuild() -{ - // init notification's lifetime - std::istringstream ss( getString("lifetime") ); - if (!(ss >> mLifetime)) - { - mLifetime = DEFAULT_LIFETIME; - } - return LLCallDialog::postBuild(); -} - -void LLCallInfoDialog::onOpen(const LLSD& key) -{ - if(key.has("msg")) - { - std::string msg = key["msg"]; - getChild<LLTextBox>("msg")->setValue(msg); - } - - mLifetimeTimer.start(); -} - -void LLCallInfoDialog::show(const std::string& status_name, const LLSD& args) -{ - LLUIString message = LLTrans::getString(status_name); - message.setArgs(args); - - LLSD payload; - payload["msg"] = message; - LLFloater* inst = LLFloaterReg::findInstance("call_info"); - - // avoid recreate instance with the same message - if (inst == NULL || message.getString() != inst->getChild<LLTextBox>("msg")->getValue()) - { - LLFloaterReg::showInstance("call_info", payload); - } -} - LLHTTPRegistration<LLViewerChatterBoxSessionStartReply> gHTTPRegistrationMessageChatterboxsessionstartreply( "/message/ChatterBoxSessionStartReply"); diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index b573490fa3..1c7aaa3f1b 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -530,16 +530,6 @@ private: void hideAllText(); }; -class LLCallInfoDialog : public LLCallDialog -{ -public: - LLCallInfoDialog(const LLSD& payload); - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - - static void show(const std::string& status_name, const LLSD& args); -}; - // Globals extern LLIMMgr *gIMMgr; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index bdf1ebddac..7ec976604a 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -142,105 +142,6 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item) return rv; } -/* -This namespace contains a functionality to remove LM prefixes were used to store sort order of -Favorite Landmarks in landmarks' names. -Once being in Favorites folder LM inventory Item has such prefix. -Due to another solution is implemented in EXT-3985 these prefixes should be removed. - -*NOTE: It will be unnecessary after the first successful session in viewer 2.0. -Can be removed before public release. - -Implementation details: -At the first run with this patch it patches all cached landmarks: removes LM sort prefixes and -updates them on the viewer and server sides. -Also it calls fetching agent's inventory to process not yet loaded landmarks too. -If fetching is successfully done it will store special per-agent empty file-marker -in the user temporary folder (where cached inventory is loaded) while caching agent's inventory. -After that in will not affect the viewer until cached marker is removed. -*/ -namespace LMSortPrefix -{ - bool cleanup_done = false; - const std::string getMarkerPath() - { - std::string path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, gAgentID.asString())); - std::string marker_filename = llformat("%s-lm_prefix_marker", path.c_str()); - - return marker_filename; - } - bool wasClean() - { - static bool was_clean = false; - static bool already_init = false; - if (already_init) return was_clean; - - already_init = true; - std::string path_to_marker = getMarkerPath(); - was_clean = LLFile::isfile(path_to_marker); - - return was_clean; - } - - void setLandmarksWereCleaned() - { - if (cleanup_done) - { - std::string path_to_marker = getMarkerPath(); - LLFILE* file = LLFile::fopen(path_to_marker, "w"); - if(!file) - { - llwarns << "unable to save marker that LM prefixes were removed: " << path_to_marker << llendl; - return; - } - - fclose(file); - } - } - - void removePrefix(LLPointer<LLViewerInventoryItem> inv_item) - { - if (wasClean()) - { - LL_INFOS_ONCE("") << "Inventory was cleaned for this avatar. Patch can be removed." << LL_ENDL; - return; - } - - if (LLInventoryType::IT_LANDMARK != inv_item->getInventoryType()) return; - - std::string old_name = inv_item->getName(); - - S32 sort_field = -1; - std::string display_name; - BOOL exists = LLViewerInventoryItem::extractSortFieldAndDisplayName(old_name, &sort_field, &display_name); - if (exists && sort_field != -1) - { - llinfos << "Removing Landmark sort field and separator for: " << old_name << " | " << inv_item->getUUID() << llendl; - LLUUID parent_uuid = inv_item->getParentUUID(); - if (gInventory.getCategory(parent_uuid)) - { - llinfos << "parent folder is: " << gInventory.getCategory(parent_uuid)->getName() << llendl; - } - - - // mark item completed to avoid error while copying and updating server - inv_item->setComplete(TRUE); - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item.get()); - new_item->rename(display_name); - gInventory.updateItem(new_item); - new_item->updateServer(FALSE); - - gInventory.notifyObservers(); - } - } - - void completeCleanup() - { - // background fetch is completed. can save marker - cleanup_done = true; - } -} - ///---------------------------------------------------------------------------- /// Class LLInventoryModel ///---------------------------------------------------------------------------- @@ -317,7 +218,10 @@ BOOL LLInventoryModel::isObjectDescendentOf(const LLUUID& obj_id, const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(const LLUUID& obj_id) const { const LLInventoryObject* obj = getObject(obj_id); - const LLUUID& parent_id = obj->getParentUUID(); + + // Search up the parent chain until we get to root or an acceptable folder. + // This assumes there are no cycles in the tree else we'll get a hang. + LLUUID parent_id = obj->getParentUUID(); while (!parent_id.isNull()) { const LLViewerInventoryCategory *cat = getCategory(parent_id); @@ -329,6 +233,7 @@ const LLViewerInventoryCategory *LLInventoryModel::getFirstNondefaultParent(cons { return cat; } + parent_id = cat->getParentUUID(); } return NULL; } @@ -1835,8 +1740,6 @@ void LLInventoryModel::stopBackgroundFetch() gIdleCallbacks.deleteFunction(&LLInventoryModel::backgroundFetch, NULL); sBulkFetchCount=0; sMinTimeBetweenFetches=0.0f; - - LMSortPrefix::completeCleanup(); } } @@ -1983,13 +1886,6 @@ void LLInventoryModel::cache( const LLUUID& parent_folder_id, const LLUUID& agent_id) { - if (getRootFolderID() == parent_folder_id) - { - // *TODO: mantipov: can be removed before public release, EXT-3985 - //save marker to avoid fetching inventory on future sessions - LMSortPrefix::setLandmarksWereCleaned(); - } - lldebugs << "Caching " << parent_folder_id << " for " << agent_id << llendl; LLViewerInventoryCategory* root_cat = getCategory(parent_folder_id); @@ -2800,28 +2696,6 @@ void LLInventoryModel::buildParentChildMap() // The inv tree is built. mIsAgentInvUsable = true; - {// *TODO: mantipov: can be removed before public release, EXT-3985 - /* - *HACK: mantipov: to cleanup landmarks were marked with sort index prefix in name. - Is necessary to be called once per account after EXT-3985 is implemented. - So, let fetch agent's inventory, processing will be done in processInventoryDescendents() - Should be removed before public release. - */ - if (!LMSortPrefix::wasClean()) - { - cat_array_t cats; - item_array_t items; - collectDescendents(agent_inv_root_id, cats, items, INCLUDE_TRASH); - - for (item_array_t::const_iterator it= items.begin(); it != items.end(); ++it) - { - LMSortPrefix::removePrefix(*it); - } - - gInventory.startBackgroundFetch(agent_inv_root_id); - } - } - llinfos << "Inventory initialized, notifying observers" << llendl; addChangedMask(LLInventoryObserver::ALL, LLUUID::null); notifyObservers(); @@ -3587,10 +3461,6 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**) continue; } gInventory.updateItem(titem); - - {// *TODO: mantipov: can be removed before public release, EXT-3985 - LMSortPrefix::removePrefix(titem); - } } // set version and descendentcount according to message. diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index ff1e43b526..d491583b56 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -280,8 +280,6 @@ void LLPanelGroupControlPanel::draw() // Need to resort the participant list if it's in sort by recent speaker order. if (mParticipantList) mParticipantList->updateRecentSpeakersOrder(); - //* TODO: find better way to properly enable call button for group and remove this call from draw() - updateCallButton(); LLPanelChatControlPanel::draw(); } diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 0f0fb4b94e..ea66ef7d2c 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -198,6 +198,10 @@ void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_d { fillCommonData(avatar_data); + // 'Home page' was hidden in LLPanelAvatarProfile::fillCommonData() to fix EXT-4734 + // Show 'Home page' in Edit My Profile (EXT-4873) + childSetVisible("homepage_edit", true); + fillPartnerData(avatar_data); fillAccountStatus(avatar_data); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index b01cdcc832..423ee61e25 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -516,7 +516,6 @@ BOOL LLPanelPeople::postBuild() mRecentList->setShowIcons("RecentListShowIcons"); mGroupList = getChild<LLGroupList>("group_list"); - mGroupList->setNoItemsCommentText(getString("no_groups")); mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); @@ -668,6 +667,11 @@ void LLPanelPeople::updateFriendList() lldebugs << "Friends Cards were not found" << llendl; } + // show special help text for just created account to help found friends. EXT-4836 + static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg"); + no_friends_text->setVisible(all_friendsp.size() == 0); + + LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); for (; buddy_it != all_buddies.end(); ++buddy_it) { diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 43e0f9a88c..90c8f2551f 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -940,6 +940,9 @@ bool LLTeleportHistoryPanel::onClearTeleportHistoryDialog(const LLSD& notificati if (0 == option) { + // order does matter, call this first or teleport history will contain one record(current location) + LLTeleportHistory::getInstance()->purgeItems(); + LLTeleportHistoryStorage *th = LLTeleportHistoryStorage::getInstance(); th->purgeItems(); th->save(); diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 7b923f4b0b..3fd5309947 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -176,7 +176,7 @@ void LLSidepanelInventory::onPlayButtonClicked() performActionOnSelection("play"); break; default: - performActionOnSelection("activate"); + performActionOnSelection("open"); break; } } diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 37e268ad34..3343ee88bd 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -39,7 +39,8 @@ const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app."; const std::string LLSLURL::PREFIX_SL = "sl://"; const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://"; -const std::string LLSLURL::PREFIX_SLURL = "http://slurl.com/secondlife/"; +const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/"; +const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/"; const std::string LLSLURL::APP_TOKEN = "app/"; @@ -63,6 +64,11 @@ std::string LLSLURL::stripProtocol(const std::string& url) { stripped.erase(0, PREFIX_SLURL.length()); } + else if (matchPrefix(stripped, PREFIX_SLURL_OLD)) + { + stripped.erase(0, PREFIX_SLURL_OLD.length()); + } + return stripped; } @@ -74,6 +80,7 @@ bool LLSLURL::isSLURL(const std::string& url) if (matchPrefix(url, PREFIX_SL)) return true; if (matchPrefix(url, PREFIX_SECONDLIFE)) return true; if (matchPrefix(url, PREFIX_SLURL)) return true; + if (matchPrefix(url, PREFIX_SLURL_OLD)) return true; return false; } @@ -83,7 +90,8 @@ bool LLSLURL::isSLURLCommand(const std::string& url) { if (matchPrefix(url, PREFIX_SL + APP_TOKEN) || matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) || - matchPrefix(url, PREFIX_SLURL + APP_TOKEN) ) + matchPrefix(url, PREFIX_SLURL + APP_TOKEN) || + matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) ) { return true; } diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h index 05b0143e72..21b32ce409 100644 --- a/indra/newview/llslurl.h +++ b/indra/newview/llslurl.h @@ -50,6 +50,7 @@ public: static const std::string PREFIX_SL; static const std::string PREFIX_SECONDLIFE; static const std::string PREFIX_SLURL; + static const std::string PREFIX_SLURL_OLD; static const std::string APP_TOKEN; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 522adc05ce..b5cd5b73ce 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1859,21 +1859,6 @@ bool idle_startup() LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender ); } - - // We now have an inventory skeleton, so if this is a user's first - // login, we can start setting up their clothing and avatar - // appearance. This helps to avoid the generic "Ruth" avatar in - // the orientation island tutorial experience. JC - if (gAgent.isFirstLogin() - && !sInitialOutfit.empty() // registration set up an outfit - && !sInitialOutfitGender.empty() // and a gender - && gAgent.getAvatarObject() // can't wear clothes without object - && !gAgent.isGenderChosen() ) // nothing already loading - { - // Start loading the wearables, textures, gestures - LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender ); - } - // wait precache-delay and for agent's avatar or a lot longer. if(((timeout_frac > 1.f) && gAgent.getAvatarObject()) || (timeout_frac > 3.f)) @@ -2536,6 +2521,11 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response) void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, const std::string& gender_name ) { + // Not going through the processAgentInitialWearables path, so need to set this here. + LLAppearanceManager::instance().setAttachmentInvLinkEnable(true); + // Initiate creation of COF, since we're also bypassing that. + gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + S32 gender = 0; std::string gestures; if (gender_name == "male") @@ -2554,7 +2544,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; LLNameCategoryCollector has_name(outfit_folder_name); - gInventory.collectDescendentsIf(LLUUID::null, + gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(), cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, @@ -2565,7 +2555,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name, } else { - LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name); + LLInventoryCategory* cat = cat_array.get(0); + bool do_copy = true; + bool do_append = false; + LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append); } LLAppearanceManager::instance().wearOutfitByName(gestures); LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER); diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index ce00dec802..dcc85392f7 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -173,6 +173,8 @@ void LLTeleportHistory::purgeItems() // reset the count mRequestedItem = -1; mCurrentItem = 0; + + onHistoryChanged(); } // static diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index a436dc0546..7ae2404203 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -37,6 +37,7 @@ #include "llfloaterreg.h" #include "llgroupactions.h" #include "llgroupiconctrl.h" +#include "llimview.h" #include "llnotifications.h" #include "llinstantmessage.h" #include "lltooltip.h" @@ -52,9 +53,9 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_instant_message.xml"); - LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); mGroupIcon = getChild<LLGroupIconCtrl>("group_icon"); mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon"); + mAdhocIcon = getChild<LLAvatarIconCtrl>("adhoc_icon"); mAvatarName = getChild<LLTextBox>("user_name"); mTime = getChild<LLTextBox>("time_box"); mMessage = getChild<LLTextBox>("message"); @@ -90,27 +91,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif mAvatarID = p.avatar_id; mNotification = p.notification; - mAvatarIcon->setVisible(FALSE); - mGroupIcon->setVisible(FALSE); - sys_msg_icon->setVisible(FALSE); - - if(p.from == SYSTEM_FROM) - { - sys_msg_icon->setVisible(TRUE); - } - else - { - if(LLGroupActions::isInGroup(mSessionID)) - { - mGroupIcon->setVisible(TRUE); - mGroupIcon->setValue(p.session_id); - } - else - { - mAvatarIcon->setVisible(TRUE); - mAvatarIcon->setValue(p.avatar_id); - } - } + initIcon(); S32 maxLinesCount; std::istringstream ss( getString("message_max_lines_count") ); @@ -162,13 +143,27 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask) void LLToastIMPanel::showInspector() { - if(LLGroupActions::isInGroup(mSessionID)) + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID); + if(!im_session) { - LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); + llwarns << "Invalid IM session" << llendl; + return; } - else + + switch(im_session->mSessionType) { + case LLIMModel::LLIMSession::P2P_SESSION: LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); + break; + case LLIMModel::LLIMSession::GROUP_SESSION: + LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); + break; + case LLIMModel::LLIMSession::ADHOC_SESSION: + LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID)); + break; + default: + llwarns << "Unknown IM session type" << llendl; + break; } } @@ -217,4 +212,48 @@ void LLToastIMPanel::spawnGroupIconToolTip() LLToolTipMgr::getInstance()->show(params); } +void LLToastIMPanel::initIcon() +{ + LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); + + mAvatarIcon->setVisible(FALSE); + mGroupIcon->setVisible(FALSE); + sys_msg_icon->setVisible(FALSE); + mAdhocIcon->setVisible(FALSE); + + if(mAvatarName->getValue().asString() == SYSTEM_FROM) + { + sys_msg_icon->setVisible(TRUE); + } + else + { + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID); + if(!im_session) + { + llwarns << "Invalid IM session" << llendl; + return; + } + + switch(im_session->mSessionType) + { + case LLIMModel::LLIMSession::P2P_SESSION: + mAvatarIcon->setVisible(TRUE); + mAvatarIcon->setValue(mAvatarID); + break; + case LLIMModel::LLIMSession::GROUP_SESSION: + mGroupIcon->setVisible(TRUE); + mGroupIcon->setValue(mSessionID); + break; + case LLIMModel::LLIMSession::ADHOC_SESSION: + mAdhocIcon->setVisible(TRUE); + mAdhocIcon->setValue(im_session->mOtherParticipantID); + mAdhocIcon->setToolTip(im_session->mName); + break; + default: + llwarns << "Unknown IM session type" << llendl; + break; + } + } +} + // EOF diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h index 444c0af144..cf4ad80637 100644 --- a/indra/newview/lltoastimpanel.h +++ b/indra/newview/lltoastimpanel.h @@ -66,6 +66,8 @@ private: void spawnNameToolTip(); void spawnGroupIconToolTip(); + void initIcon(); + static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT; LLNotificationPtr mNotification; @@ -73,6 +75,7 @@ private: LLUUID mAvatarID; LLAvatarIconCtrl* mAvatarIcon; LLGroupIconCtrl* mGroupIcon; + LLAvatarIconCtrl* mAdhocIcon; LLTextBox* mAvatarName; LLTextBox* mTime; LLTextBox* mMessage; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 658d1c9ddd..29114c33c5 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -200,7 +200,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>); LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>); - LLFloaterReg::add("call_info", "floater_call_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallInfoDialog>); LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>); LLFloaterPayUtil::registerFloater(); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index adbe28e9a7..143d95d27e 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1478,6 +1478,11 @@ void inventory_offer_handler(LLOfferInfo* info) // Strip any SLURL from the message display. (DEV-2754) std::string msg = info->mDesc; int indx = msg.find(" ( http://slurl.com/secondlife/"); + if(indx == std::string::npos) + { + // try to find new slurl host + indx = msg.find(" ( http://maps.secondlife.com/secondlife/"); + } if(indx >= 0) { LLStringUtil::truncate(msg, indx); @@ -2181,6 +2186,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) chat.mFromID = from_id ^ gAgent.getSessionID(); } + if(SYSTEM_FROM == name) + { + // System's UUID is NULL (fixes EXT-4766) + chat.mFromID = from_id = LLUUID::null; + } + LLSD query_string; query_string["owner"] = from_id; query_string["slurl"] = location; diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 7ec650629d..a075a706e1 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1597,14 +1597,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use instance->mTeleportInProgress = FALSE; instance->mTeleportFinishedSignal(gAgent.getPositionGlobal()); } - - // HACK: This makes agents drop from the sky if they enter a parcel - // which is set to no fly. - BOOL was_flying = gAgent.getFlying(); - if (was_flying && !parcel->getAllowFly()) - { - gAgent.setFlying(gAgent.canFly()); - } } } diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 9d49fb69d6..bb09a18cc3 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -389,13 +389,16 @@ void LLVoiceChannel::setState(EState state) switch(state) { case STATE_RINGING: - LLCallInfoDialog::show("ringing", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("ringing", mNotifyArgs); break; case STATE_CONNECTED: - LLCallInfoDialog::show("connected", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("connected", mNotifyArgs); break; case STATE_HUNG_UP: - LLCallInfoDialog::show("hang_up", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("hang_up", mNotifyArgs); break; default: break; @@ -635,7 +638,8 @@ void LLVoiceChannelGroup::setState(EState state) case STATE_RINGING: if ( !mIsRetrying ) { - LLCallInfoDialog::show("ringing", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("ringing", mNotifyArgs); } doSetState(state); @@ -701,7 +705,8 @@ void LLVoiceChannelProximal::handleStatusChange(EStatusType status) //skip showing "Voice not available at your current location" when agent voice is disabled (EXT-4749) if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()) { - LLCallInfoDialog::show("unavailable", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("unavailable", mNotifyArgs); } return; default: @@ -901,7 +906,8 @@ void LLVoiceChannelP2P::setState(EState state) // so provide a special purpose message here if (mReceivedCall && state == STATE_RINGING) { - LLCallInfoDialog::show("answering", mNotifyArgs); + //TODO: remove or redirect this call status notification +// LLCallInfoDialog::show("answering", mNotifyArgs); doSetState(state); return; } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 73e1b312fa..b6e7e73b9d 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -5980,8 +5980,10 @@ bool LLVoiceClient::voiceEnabled() return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice"); } +//AD *TODO: investigate possible merge of voiceWorking() and voiceEnabled() into one non-static method bool LLVoiceClient::voiceWorking() { + //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758) return (stateLoggedIn <= mState) && (mState <= stateSessionTerminated); } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 8f668dff19..a96cf18e27 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -192,6 +192,7 @@ static void updatePosition(void); void setVoiceEnabled(bool enabled); static bool voiceEnabled(); // Checks is voice working judging from mState + // Returns true if vivox has successfully logged in and is not in error state bool voiceWorking(); void setUsePTT(bool usePTT); void setPTTIsToggle(bool PTTIsToggle); diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml index 4f4288b654..1ffedde29b 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -147,7 +147,11 @@ Maximum animation length is [MAX_LENGTH] seconds. name="E_ST_NO_XLT_EMOTE"> Cannot read emote name. </floater.string> - <text + <floater.string + name="E_ST_BAD_ROOT"> + Incorrect root joint name, use "hip". + </floater.string> + <text type="string" length="1" bottom="42" diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index 703a02d995..961bd6b5e4 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -178,8 +178,8 @@ follows="top|left" height="16" halign="right" - left="150" - width="170" + left="140" + width="180" layout="topleft" name="buy_action"> [NAME] L$ [PRICE] diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 9aaa660574..d2e5473157 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -12,7 +12,7 @@ can_minimize="true" can_close="true" visible="false" - width="440" + width="360" can_resize="true" min_width="250" min_height="190"> @@ -20,7 +20,7 @@ animate="false" follows="all" height="320" - width="440" + width="360" layout="topleft" orientation="horizontal" name="im_panels" @@ -38,7 +38,7 @@ left="0" top="0" height="200" - width="325" + width="245" user_resize="true"> <button height="20" @@ -65,7 +65,7 @@ parse_highlights="true" allow_html="true" left="1" - width="320"> + width="240"> </chat_history> <line_editor bottom="0" @@ -75,7 +75,7 @@ label="To" layout="bottomleft" name="chat_editor" - width="320"> + width="240"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 39c4923f12..89d632c4c6 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -21,19 +21,20 @@ width="18" /> <text_editor allow_scroll="false" - v_pad = "0" + v_pad = "7" read_only = "true" follows="left|right" font.style="BOLD" - height="12" + height="24" layout="topleft" left_pad="5" right="-120" name="user_name" text_color="white" bg_readonly_color="black" - top="8" + top="0" use_ellipses="true" + valign="bottom" value="Ericag Vader" /> <text font="SansSerifSmall" 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 f19057cae3..25a0213bde 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -495,6 +495,10 @@ things in this group. There's a broad variety of Abilities. width="300"> <scroll_list.columns label="" + name="icon" + width="2" /> + <scroll_list.columns + label="" name="checkbox" width="20" /> <scroll_list.columns diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 9279d1e686..c7e5b25e06 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -93,6 +93,7 @@ height="23" label="Teleport" name="teleport_btn" + tool_tip = "Offer to teleport this person" width="100" /> </layout_panel> <layout_panel @@ -119,6 +120,23 @@ layout="topleft" min_height="25" width="100" + name="share_btn_panel" + user_resize="false"> + <button + auto_resize="true" + follows="left|top|right" + height="23" + label="Pay" + name="pay_btn" + width="100" /> + </layout_panel> + <layout_panel + auto_resize="false" + follows="top|left|right" + height="25" + layout="topleft" + min_height="25" + width="100" name="call_btn_panel" user_resize="false"> <button diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index 5a1bc32db0..a0ad38cf76 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -45,6 +45,17 @@ name="group_icon" top="3" width="18" /> + <avatar_icon + color="Green" + follows="right" + height="18" + image_name="Generic_Person" + layout="topleft" + left="3" + mouse_opaque="false" + name="adhoc_icon" + top="3" + width="18" /> <!--<icon follows="right" height="20" diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 02eddc9212..b2ed51abf3 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -141,12 +141,25 @@ font="SansSerifSmall" height="15" layout="topleft" - left="102" + left="0" name="favorite" image_drag_indication="Accordion_ArrowOpened_Off" bottom="55" tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" width="590"> + <label + follows="left|top" + font.style="BOLD" + height="15" + layout="topleft" + left="10" + name="favorites_bar_label" + text_color="LtGray" + tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" + top="12" + width="102"> + Favorites Bar + </label> <chevron_button name=">>" image_unselected="TabIcon_Close_Off" image_selected="TabIcon_Close_Off" @@ -157,15 +170,4 @@ top="15" height="15"/> </favorites_bar> - <text - follows="left|top" - font.style="BOLD" - height="15" - layout="topleft" - left="10" - top_pad="-12" - name="favorites_bar_label" - text_color="LtGray" - tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" - width="102">Favorites Bar</text> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index ac98bb9bd9..3b5add33a8 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -24,9 +24,6 @@ background_visible="true" name="no_friends" value="No friends" /> <string - name="no_groups" - value="No groups" /> - <string name="people_filter_label" value="Filter People" /> <string @@ -163,6 +160,17 @@ background_visible="true" width="313" /> </accordion_tab> </accordion> + <text + follows="all" + height="450" + left="10" + name="no_friends_msg" + top="10" + width="293" + wrap="true"> + To add friends try [secondlife:///app/search/people global search] or click on a user to add them as a friend. +If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map]. + </text> <panel follows="left|right|bottom" height="30" @@ -226,6 +234,8 @@ background_visible="true" layout="topleft" left="0" name="group_list" + no_filtered_groups_msg="No groups" + no_groups_msg="[secondlife:///app/search/groups Trying searching for some groups to join.]" top="0" width="313" /> <panel |