diff options
337 files changed, 5461 insertions, 3492 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 1f578eec5f..592e9fc901 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -171,8 +171,8 @@ if (LINUX) if (NOT STANDALONE) # this stops us requiring a really recent glibc at runtime add_definitions(-fno-stack-protector) - # linking can be so slow - give us a chance to figure out why - set(CMAKE_CXX_LINK_FLAGS "-Wl,--stats,--no-keep-memory") + # linking can be very memory-hungry, especially the final viewer link + set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory") endif (NOT STANDALONE) endif (VIEWER) 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/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp index fae0a66873..6d8d81e114 100644 --- a/indra/llcommon/llfasttimer_class.cpp +++ b/indra/llcommon/llfasttimer_class.cpp @@ -114,7 +114,11 @@ static timer_tree_dfs_iterator_t end_timer_tree() class NamedTimerFactory : public LLSingleton<NamedTimerFactory> { public: - NamedTimerFactory() + NamedTimerFactory() + : mActiveTimerRoot(NULL), + mTimerRoot(NULL), + mAppTimer(NULL), + mRootFrameState(NULL) {} /*virtual */ void initSingleton() diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp index ef3e8dbc94..21e165ebc9 100644 --- a/indra/llcommon/lltimer.cpp +++ b/indra/llcommon/lltimer.cpp @@ -565,19 +565,23 @@ LLEventTimer::LLEventTimer(F32 period) : mEventTimer() { mPeriod = period; + mBusy = false; } LLEventTimer::LLEventTimer(const LLDate& time) : mEventTimer() { mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch()); + mBusy = false; } LLEventTimer::~LLEventTimer() { + llassert(!mBusy); // this LLEventTimer was destroyed from within its own tick() function - bad. if you want tick() to cause destruction of its own timer, make it return true. } +//static void LLEventTimer::updateClass() { std::list<LLEventTimer*> completed_timers; @@ -587,10 +591,12 @@ void LLEventTimer::updateClass() F32 et = timer.mEventTimer.getElapsedTimeF32(); if (timer.mEventTimer.getStarted() && et > timer.mPeriod) { timer.mEventTimer.reset(); + timer.mBusy = true; if ( timer.tick() ) { completed_timers.push_back( &timer ); } + timer.mBusy = false; } } diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h index d009c0f5f7..4d995d5bba 100644 --- a/indra/llcommon/lltimer.h +++ b/indra/llcommon/lltimer.h @@ -188,6 +188,7 @@ public: protected: LLTimer mEventTimer; F32 mPeriod; + bool mBusy; }; U64 LL_COMMON_API totalTime(); // Returns current system time in microseconds diff --git a/indra/llcommon/lltreeiterators.h b/indra/llcommon/lltreeiterators.h index c946566e84..cb1304c54e 100644 --- a/indra/llcommon/lltreeiterators.h +++ b/indra/llcommon/lltreeiterators.h @@ -343,20 +343,20 @@ public: /// Instantiate an LLTreeDFSIter to start a depth-first walk. Pass /// functors to extract the 'child begin' and 'child end' iterators from /// each node. - LLTreeDFSIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc): - mBeginFunc(beginfunc), - mEndFunc(endfunc), - mSkipChildren(false) + LLTreeDFSIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc) + : mBeginFunc(beginfunc), + mEndFunc(endfunc), + mSkipChildren(false) { // Only push back this node if it's non-NULL! if (node) mPending.push_back(node); } /// Instantiate an LLTreeDFSIter to mark the end of the walk - LLTreeDFSIter() {} + LLTreeDFSIter() : mSkipChildren(false) {} - /// flags iterator logic to skip traversing children of current node on next increment - void skipDescendants(bool skip = true) { mSkipChildren = skip; } + /// flags iterator logic to skip traversing children of current node on next increment + void skipDescendants(bool skip = true) { mSkipChildren = skip; } private: /// leverage boost::iterator_facade @@ -405,8 +405,8 @@ private: func_type mBeginFunc; /// functor to extract end() child iterator func_type mEndFunc; - /// flag which controls traversal of children (skip children of current node if true) - bool mSkipChildren; + /// flag which controls traversal of children (skip children of current node if true) + bool mSkipChildren; }; /** @@ -451,21 +451,21 @@ public: /// Instantiate an LLTreeDFSPostIter to start a depth-first walk. Pass /// functors to extract the 'child begin' and 'child end' iterators from /// each node. - LLTreeDFSPostIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc): - mBeginFunc(beginfunc), - mEndFunc(endfunc), - mSkipAncestors(false) - { + LLTreeDFSPostIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc) + : mBeginFunc(beginfunc), + mEndFunc(endfunc), + mSkipAncestors(false) + { if (! node) return; mPending.push_back(typename list_type::value_type(node, false)); makeCurrent(); } /// Instantiate an LLTreeDFSPostIter to mark the end of the walk - LLTreeDFSPostIter() {} + LLTreeDFSPostIter() : mSkipAncestors(false) {} - /// flags iterator logic to skip traversing ancestors of current node on next increment - void skipAncestors(bool skip = true) { mSkipAncestors = skip; } + /// flags iterator logic to skip traversing ancestors of current node on next increment + void skipAncestors(bool skip = true) { mSkipAncestors = skip; } private: /// leverage boost::iterator_facade diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp index 82c736266d..1b0e03cb2a 100644 --- a/indra/llcommon/llworkerthread.cpp +++ b/indra/llcommon/llworkerthread.cpp @@ -188,6 +188,7 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na : mWorkerThread(workerthread), mWorkerClassName(name), mRequestHandle(LLWorkerThread::nullHandle()), + mRequestPriority(LLWorkerThread::PRIORITY_NORMAL), mMutex(NULL), mWorkFlags(0) { diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index e71429b18d..3af31da083 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -97,7 +97,8 @@ void info_callback(const char* msg, void*) } -LLImageJ2COJ::LLImageJ2COJ() : LLImageJ2CImpl() +LLImageJ2COJ::LLImageJ2COJ() + : LLImageJ2CImpl() { } diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 73cb074f1f..8255d5225f 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -51,9 +51,6 @@ protected: // Divide a by b to the power of 2 and round upwards. return (a + (1 << b) - 1) >> b; } - - // Temporary variables for in-progress decodes... - LLImageRaw *mRawImagep; }; #endif 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/llpacketbuffer.cpp b/indra/llmessage/llpacketbuffer.cpp index 027d35cf89..441e8ddd27 100644 --- a/indra/llmessage/llpacketbuffer.cpp +++ b/indra/llmessage/llpacketbuffer.cpp @@ -42,11 +42,14 @@ LLPacketBuffer::LLPacketBuffer(const LLHost &host, const char *datap, const S32 size) : mHost(host) { + mSize = 0; + mData[0] = '!'; + if (size > NET_BUFFER_SIZE) { llerrs << "Sending packet > " << NET_BUFFER_SIZE << " of size " << size << llendl; } - else // we previously relied on llerrs being fatal to not get here... + else { if (datap != NULL) { diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp index 0a71ad95f2..d64b666ede 100644 --- a/indra/llmessage/lltransfermanager.cpp +++ b/indra/llmessage/lltransfermanager.cpp @@ -1196,6 +1196,7 @@ LLTransferTarget::LLTransferTarget( mType(type), mSourceType(source_type), mID(transfer_id), + mChannelp(NULL), mGotInfo(FALSE), mSize(0), mLastPacketID(-1) 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/lltransfertargetfile.h b/indra/llmessage/lltransfertargetfile.h index 18b9b52062..92fb8f807c 100644 --- a/indra/llmessage/lltransfertargetfile.h +++ b/indra/llmessage/lltransfertargetfile.h @@ -40,7 +40,12 @@ typedef void (*LLTTFCompleteCallback)(const LLTSCode status, void *user_data); class LLTransferTargetParamsFile : public LLTransferTargetParams { public: - LLTransferTargetParamsFile() : LLTransferTargetParams(LLTTT_FILE) {} + LLTransferTargetParamsFile() + : LLTransferTargetParams(LLTTT_FILE), + + mCompleteCallback(NULL), + mUserData(NULL) + {} void setFilename(const std::string& filename) { mFilename = filename; } void setCallback(LLTTFCompleteCallback cb, void *user_data) { mCompleteCallback = cb; mUserData = user_data; } 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/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 3d2eaed5c5..91c796a9e6 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -104,6 +104,8 @@ void LLPluginClassMedia::reset() mSetMediaHeight = -1; mRequestedMediaWidth = 0; mRequestedMediaHeight = 0; + mRequestedTextureWidth = 0; + mRequestedTextureHeight = 0; mFullMediaWidth = 0; mFullMediaHeight = 0; mTextureWidth = 0; diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp index 11c924cadf..0f3254d78d 100644 --- a/indra/llplugin/llpluginprocesschild.cpp +++ b/indra/llplugin/llpluginprocesschild.cpp @@ -43,6 +43,7 @@ static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f; // Each call to idle will LLPluginProcessChild::LLPluginProcessChild() { + mState = STATE_UNINITIALIZED; mInstance = NULL; mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP); mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h index 1cfd9dcaf9..58f8935ed1 100644 --- a/indra/llplugin/llpluginprocesschild.h +++ b/indra/llplugin/llpluginprocesschild.h @@ -89,8 +89,9 @@ private: STATE_ERROR, // generic bailout state STATE_DONE // state machine will sit in this state after either error or normal termination. }; - EState mState; void setState(EState state); + + EState mState; LLHost mLauncherHost; LLSocket::ptr_t mSocket; diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 49f9783824..efd5df687e 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -50,6 +50,8 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner) mOwner = owner; mBoundPort = 0; mState = STATE_UNINITIALIZED; + mSleepTime = 0.0; + mCPUUsage = 0.0; mDisableTimeout = false; mDebug = false; diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp index 277e370ca4..88cd96ebe4 100644 --- a/indra/llprimitive/tests/llmediaentry_test.cpp +++ b/indra/llprimitive/tests/llmediaentry_test.cpp @@ -157,14 +157,9 @@ namespace namespace tut { - bool llsd_equals(const LLSD& a, const LLSD& b) { - // cheesy, brute force, but it works - return std::string(ll_pretty_print_sd(a)) == std::string(ll_pretty_print_sd(b)); - } - void ensure_llsd_equals(const std::string& msg, const LLSD& expected, const LLSD& actual) { - if (!tut::llsd_equals(expected, actual)) + if (!llsd_equals(expected, actual)) { std::string message = msg; message += ": actual: "; 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/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 1de1d6ded4..b6a6b448ee 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -601,14 +601,20 @@ S32 LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_ { llwchar wch = wchars[i]; - F32 char_width = mFontFreetype->getXAdvance(wch); + const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch); + + // last character uses character width, since the whole character needs to be visible + // other characters just use advance + F32 width = (i == start) + ? (F32)(fgi->mWidth + fgi->mXBearing) // use actual width for last character + : fgi->mXAdvance; // use advance for all other characters - if( scaled_max_pixels < (total_width + char_width) ) + if( scaled_max_pixels < (total_width + width) ) { break; } - total_width += char_width; + total_width += width; drawable_chars++; if( max_chars >= 0 && drawable_chars >= max_chars ) @@ -626,7 +632,17 @@ S32 LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_ total_width = llround(total_width); } - return start_pos - drawable_chars; + if (drawable_chars == 0) + { + return start_pos; // just draw last character + } + else + { + // if only 1 character is drawable, we want to return start_pos as the first character to draw + // if 2 are drawable, return start_pos and character before start_pos, etc. + return start_pos + 1 - drawable_chars; + } + } S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 target_x, F32 max_pixels, S32 max_chars, BOOL round) const 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/CMakeLists.txt b/indra/llui/CMakeLists.txt index ce068618e2..853f6f173d 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -90,6 +90,7 @@ set(llui_SOURCE_FILES lltextbox.cpp lltexteditor.cpp lltextparser.cpp + lltextvalidate.cpp lltransutil.cpp lltoggleablemenu.cpp lltooltip.cpp @@ -182,6 +183,7 @@ set(llui_HEADER_FILES lltextbox.h lltexteditor.h lltextparser.h + lltextvalidate.h lltoggleablemenu.h lltooltip.h lltransutil.h diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 4944ed4fe7..14b77925f2 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -771,12 +771,7 @@ void LLButton::draw() center_x++; } - S32 text_width_delta = overlay_width + 1; - // if image paddings set, they should participate in scaling process - S32 image_size_delta = mImageOverlayTopPad + mImageOverlayBottomPad; - overlay_width = overlay_width - image_size_delta; - overlay_height = overlay_height - image_size_delta; - + center_y += (mImageOverlayBottomPad - mImageOverlayTopPad); // fade out overlay images on disabled buttons LLColor4 overlay_color = mImageOverlayColor.get(); if (!enabled) @@ -788,10 +783,9 @@ void LLButton::draw() switch(mImageOverlayAlignment) { case LLFontGL::LEFT: - text_left += overlay_width + mImageOverlayRightPad + 1; - text_width -= text_width_delta; + text_left += overlay_width + 1; mImageOverlay->draw( - mLeftHPad, + mImageOverlayLeftPad, center_y - (overlay_height / 2), overlay_width, overlay_height, @@ -806,10 +800,9 @@ void LLButton::draw() overlay_color); break; case LLFontGL::RIGHT: - text_right -= overlay_width + mImageOverlayLeftPad+ 1; - text_width -= text_width_delta; + text_right -= overlay_width + 1; mImageOverlay->draw( - getRect().getWidth() - mRightHPad - overlay_width, + getRect().getWidth() - mImageOverlayRightPad - overlay_width, center_y - (overlay_height / 2), overlay_width, overlay_height, diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 92993650a7..2481249f91 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -42,8 +42,6 @@ static const LLDefaultChildRegistry::Register<LLFlatListView> flat_list_view("fl const LLSD SELECTED_EVENT = LLSD().with("selected", true); const LLSD UNSELECTED_EVENT = LLSD().with("selected", false); -static const std::string COMMENT_TEXTBOX = "comment_text"; - //forward declaration bool llsds_are_equal(const LLSD& llsd_1, const LLSD& llsd_2); @@ -51,7 +49,8 @@ LLFlatListView::Params::Params() : item_pad("item_pad"), allow_select("allow_select"), multi_select("multi_select"), - keep_one_selected("keep_one_selected") + keep_one_selected("keep_one_selected"), + no_items_text("no_items_text") {}; void LLFlatListView::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */) @@ -295,19 +294,6 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/) void LLFlatListView::setNoItemsCommentText(const std::string& comment_text) { - if (NULL == mNoItemsCommentTextbox) - { - LLRect comment_rect = getRect(); - comment_rect.setOriginAndSize(0, 0, comment_rect.getWidth(), comment_rect.getHeight()); - comment_rect.stretch(-getBorderWidth()); - LLTextBox::Params text_p; - text_p.name(COMMENT_TEXTBOX); - text_p.border_visible(false); - text_p.rect(comment_rect); - text_p.follows.flags(FOLLOWS_ALL); - mNoItemsCommentTextbox = LLUICtrlFactory::create<LLTextBox>(text_p, this); - } - mNoItemsCommentTextbox->setValue(comment_text); } @@ -361,7 +347,6 @@ bool LLFlatListView::updateValue(const LLSD& old_value, const LLSD& new_value) // PROTECTED STUFF ////////////////////////////////////////////////////////////////////////// - LLFlatListView::LLFlatListView(const LLFlatListView::Params& p) : LLScrollContainer(p) , mItemComparator(NULL) @@ -398,6 +383,25 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p) params.bevel_style(LLViewBorder::BEVEL_IN); mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params); mItemsPanel->addChild( mSelectedItemsBorder ); + + { + // create textbox for "No Items" comment text + LLTextBox::Params text_p = p.no_items_text; + if (!text_p.rect.isProvided()) + { + LLRect comment_rect = getRect(); + comment_rect.setOriginAndSize(0, 0, comment_rect.getWidth(), comment_rect.getHeight()); + comment_rect.stretch(-getBorderWidth()); + text_p.rect(comment_rect); + } + text_p.border_visible(false); + + if (!text_p.follows.isProvided()) + { + text_p.follows.flags(FOLLOWS_ALL); + } + mNoItemsCommentTextbox = LLUICtrlFactory::create<LLTextBox>(text_p, this); + } }; // virtual @@ -861,7 +865,11 @@ void LLFlatListView::notifyParentItemsRectChanged() // take into account comment text height if exists if (mNoItemsCommentTextbox && mNoItemsCommentTextbox->getVisible()) { + // top text padding inside the textbox is included into the height comment_height = mNoItemsCommentTextbox->getTextPixelHeight(); + + // take into account a distance from parent's top border to textbox's top + comment_height += getRect().getHeight() - mNoItemsCommentTextbox->getRect().mTop; } LLRect req_rect = getItemsRect(); @@ -892,6 +900,10 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const { if (visible) { +/* +// *NOTE: MA 2010-02-04 +// Deprecated after params of the comment text box were moved into widget (flat_list_view.xml) +// can be removed later if nothing happened. // We have to update child rect here because of issues with rect after reshaping while creating LLTextbox // It is possible to have invalid LLRect if Flat List is in LLAccordionTab LLRect comment_rect = getLocalRect(); @@ -903,6 +915,7 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const LLViewBorder* scroll_border = getChild<LLViewBorder>("scroll border"); comment_rect.stretch(-scroll_border->getBorderWidth()); mNoItemsCommentTextbox->setRect(comment_rect); +*/ } mNoItemsCommentTextbox->setVisible(visible); } diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index 949a731507..92cb40332e 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -35,8 +35,8 @@ #include "llpanel.h" #include "llscrollcontainer.h" +#include "lltextbox.h" -class LLTextBox; /** * LLFlatListView represents a flat list ui control that operates on items in a form of LLPanel's. @@ -108,6 +108,9 @@ public: /** padding between items */ Optional<U32> item_pad; + /** textbox with info message when list is empty*/ + Optional<LLTextBox::Params> no_items_text; + Params(); }; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index eb2b4f7705..483a394bbd 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -55,6 +55,7 @@ #include "llui.h" #include "lluictrlfactory.h" #include "llclipboard.h" +#include "llmenugl.h" // // Imported globals @@ -82,19 +83,6 @@ template class LLLineEditor* LLView::getChild<class LLLineEditor>( // Member functions // -void LLLineEditor::PrevalidateNamedFuncs::declareValues() -{ - declare("ascii", LLLineEditor::prevalidateASCII); - declare("float", LLLineEditor::prevalidateFloat); - declare("int", LLLineEditor::prevalidateInt); - declare("positive_s32", LLLineEditor::prevalidatePositiveS32); - declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32); - declare("alpha_num", LLLineEditor::prevalidateAlphaNum); - declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace); - declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe); - declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace); -} - LLLineEditor::Params::Params() : max_length_bytes("max_length", 254), keystroke_callback("keystroke_callback"), @@ -164,7 +152,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) mTentativeFgColor(p.text_tentative_color()), mHighlightColor(p.highlight_color()), mPreeditBgColor(p.preedit_bg_color()), - mGLFont(p.font) + mGLFont(p.font), + mContextMenuHandle() { llassert( mMaxLengthBytes > 0 ); @@ -191,6 +180,12 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) setCursor(mText.length()); setPrevalidate(p.prevalidate_callback()); + + LLContextMenu* menu = LLUICtrlFactory::instance().createFromFile<LLContextMenu> + ("menu_text_editor.xml", + LLMenuGL::sMenuContainer, + LLMenuHolderGL::child_registry_t::instance()); + setContextMenu(menu); } LLLineEditor::~LLLineEditor() @@ -422,12 +417,16 @@ void LLLineEditor::setCursor( S32 pos ) S32 old_cursor_pos = getCursor(); mCursorPos = llclamp( pos, 0, mText.length()); + // position of end of next character after cursor S32 pixels_after_scroll = findPixelNearestPos(); if( pixels_after_scroll > mTextRightEdge ) { S32 width_chars_to_left = mGLFont->getWidth(mText.getWString().c_str(), 0, mScrollHPos); S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mTextRightEdge - mTextLeftEdge + width_chars_to_left))); - S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mTextRightEdge - mTextLeftEdge), mText.length(), getCursor()); + // character immediately to left of cursor should be last one visible (SCROLL_INCREMENT_ADD will scroll in more characters) + // or first character if cursor is at beginning + S32 new_last_visible_char = llmax(0, getCursor() - 1); + S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mTextRightEdge - mTextLeftEdge), mText.length(), new_last_visible_char); if (old_cursor_pos == last_visible_char) { mScrollHPos = llmin(mText.length(), llmax(min_scroll, mScrollHPos + SCROLL_INCREMENT_ADD)); @@ -663,6 +662,16 @@ BOOL LLLineEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask) return TRUE; } +BOOL LLLineEditor::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + setFocus(TRUE); + if (!LLUICtrl::handleRightMouseDown(x, y, mask)) + { + showContextMenu(x, y); + } + return TRUE; +} + BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; @@ -1962,51 +1971,12 @@ void LLLineEditor::setRect(const LLRect& rect) } } -void LLLineEditor::setPrevalidate(LLLinePrevalidateFunc func) +void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func) { mPrevalidateFunc = func; updateAllowingLanguageInput(); } -// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position. -// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for -// the simple reasons that intermediate states may be invalid even if the final result is valid. -// -// static -BOOL LLLineEditor::prevalidateFloat(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL success = TRUE; - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - if( 0 < len ) - { - // May be a comma or period, depending on the locale - llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint(); - - S32 i = 0; - - // First character can be a negative sign - if( '-' == trimmed[0] ) - { - i++; - } - - for( ; i < len; i++ ) - { - if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) ) - { - success = FALSE; - break; - } - } - } - - return success; -} - // static BOOL LLLineEditor::postvalidateFloat(const std::string &str) { @@ -2066,223 +2036,6 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str) return success; } -// Limits what characters can be used to [1234567890-] with [-] only valid in the first position. -// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for -// the simple reasons that intermediate states may be invalid even if the final result is valid. -// -// static -BOOL LLLineEditor::prevalidateInt(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL success = TRUE; - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - if( 0 < len ) - { - S32 i = 0; - - // First character can be a negative sign - if( '-' == trimmed[0] ) - { - i++; - } - - for( ; i < len; i++ ) - { - if( !LLStringOps::isDigit( trimmed[i] ) ) - { - success = FALSE; - break; - } - } - } - - return success; -} - -// static -BOOL LLLineEditor::prevalidatePositiveS32(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - BOOL success = TRUE; - if(0 < len) - { - if(('-' == trimmed[0]) || ('0' == trimmed[0])) - { - success = FALSE; - } - S32 i = 0; - while(success && (i < len)) - { - if(!LLStringOps::isDigit(trimmed[i++])) - { - success = FALSE; - } - } - } - if (success) - { - S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); - if (val <= 0) - { - success = FALSE; - } - } - return success; -} - -BOOL LLLineEditor::prevalidateNonNegativeS32(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - LLWString trimmed = str; - LLWStringUtil::trim(trimmed); - S32 len = trimmed.length(); - BOOL success = TRUE; - if(0 < len) - { - if('-' == trimmed[0]) - { - success = FALSE; - } - S32 i = 0; - while(success && (i < len)) - { - if(!LLStringOps::isDigit(trimmed[i++])) - { - success = FALSE; - } - } - } - if (success) - { - S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); - if (val < 0) - { - success = FALSE; - } - } - return success; -} - -BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - if( !LLStringOps::isAlnum((char)str[len]) ) - { - rv = FALSE; - break; - } - } - return rv; -} - -// static -BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str) -{ - LLLocale locale(LLLocale::USER_LOCALE); - - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len]))) - { - rv = FALSE; - break; - } - } - return rv; -} - -// Used for most names of things stored on the server, due to old file-formats -// that used the pipe (|) for multiline text storage. Examples include -// inventory item names, parcel names, object names, etc. -// static -BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str) -{ - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - llwchar wc = str[len]; - if (wc < 0x20 - || wc > 0x7f - || wc == '|') - { - rv = FALSE; - break; - } - if(!(wc == ' ' - || LLStringOps::isAlnum((char)wc) - || LLStringOps::isPunct((char)wc) ) ) - { - rv = FALSE; - break; - } - } - return rv; -} - - -// Used for avatar names -// static -BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str) -{ - BOOL rv = TRUE; - S32 len = str.length(); - if(len == 0) return rv; - while(len--) - { - llwchar wc = str[len]; - if (wc < 0x20 - || wc > 0x7f - || LLStringOps::isSpace(wc)) - { - rv = FALSE; - break; - } - if( !(LLStringOps::isAlnum((char)str[len]) || - LLStringOps::isPunct((char)str[len]) ) ) - { - rv = FALSE; - break; - } - } - return rv; -} - - -// static -BOOL LLLineEditor::prevalidateASCII(const LLWString &str) -{ - BOOL rv = TRUE; - S32 len = str.length(); - while(len--) - { - if (str[len] < 0x20 || str[len] > 0x7f) - { - rv = FALSE; - break; - } - } - return rv; -} - void LLLineEditor::onMouseCaptureLost() { endSelection(); @@ -2560,3 +2313,25 @@ LLWString LLLineEditor::getConvertedText() const } return text; } + +void LLLineEditor::showContextMenu(S32 x, S32 y) +{ + LLContextMenu* menu = static_cast<LLContextMenu*>(mContextMenuHandle.get()); + + if (menu) + { + gEditMenuHandler = this; + + S32 screen_x, screen_y; + localPointToScreen(x, y, &screen_x, &screen_y); + menu->show(screen_x, screen_y); + } +} + +void LLLineEditor::setContextMenu(LLContextMenu* new_context_menu) +{ + if (new_context_menu) + mContextMenuHandle = new_context_menu->getHandle(); + else + mContextMenuHandle.markDead(); +} diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 49e9539b16..b62138426b 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -51,26 +51,18 @@ #include "llviewborder.h" #include "llpreeditor.h" -#include <boost/function.hpp> +#include "lltextvalidate.h" class LLFontGL; class LLLineEditorRollback; class LLButton; - -typedef boost::function<BOOL (const LLWString &wstr)> LLLinePrevalidateFunc; +class LLContextMenu; class LLLineEditor : public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor { public: - struct PrevalidateNamedFuncs - : public LLInitParam::TypeValuesHelper<LLLinePrevalidateFunc, PrevalidateNamedFuncs> - - { - static void declareValues(); - }; - typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t; struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> @@ -80,7 +72,7 @@ public: Optional<keystroke_callback_t> keystroke_callback; - Optional<LLLinePrevalidateFunc, PrevalidateNamedFuncs> prevalidate_callback; + Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback; Optional<LLViewBorder::Params> border; @@ -113,6 +105,7 @@ protected: LLLineEditor(const Params&); friend class LLUICtrlFactory; friend class LLFloaterEditUI; + void showContextMenu(S32 x, S32 y); public: virtual ~LLLineEditor(); @@ -122,6 +115,7 @@ public: /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask); /*virtual*/ BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask); + /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask ); /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char); /*virtual*/ void onMouseCaptureLost(); @@ -204,6 +198,8 @@ public: const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); } const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); } + const LLFontGL* getFont() const { return mGLFont; } + void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; } void setIgnoreTab(BOOL b) { mIgnoreTab = b; } void setPassDelete(BOOL b) { mPassDelete = b; } @@ -231,17 +227,7 @@ public: void setTextPadding(S32 left, S32 right); // Prevalidation controls which keystrokes can affect the editor - void setPrevalidate( LLLinePrevalidateFunc func ); - static BOOL prevalidateFloat(const LLWString &str ); - static BOOL prevalidateInt(const LLWString &str ); - static BOOL prevalidatePositiveS32(const LLWString &str); - static BOOL prevalidateNonNegativeS32(const LLWString &str); - static BOOL prevalidateAlphaNum(const LLWString &str ); - static BOOL prevalidateAlphaNumSpace(const LLWString &str ); - static BOOL prevalidateASCIIPrintableNoPipe(const LLWString &str); - static BOOL prevalidateASCIIPrintableNoSpace(const LLWString &str); - static BOOL prevalidateASCII(const LLWString &str); - + void setPrevalidate( LLTextValidate::validate_func_t func ); static BOOL postvalidateFloat(const std::string &str); // line history support: @@ -249,7 +235,9 @@ public: void updateHistory(); // stores current line in history void setReplaceNewlinesWithSpaces(BOOL replace); - + + void setContextMenu(LLContextMenu* new_context_menu); + private: // private helper methods @@ -319,7 +307,7 @@ protected: S32 mLastSelectionStart; S32 mLastSelectionEnd; - LLLinePrevalidateFunc mPrevalidateFunc; + LLTextValidate::validate_func_t mPrevalidateFunc; LLFrameTimer mKeystrokeTimer; LLTimer mTripleClickTimer; @@ -348,6 +336,8 @@ protected: std::vector<S32> mPreeditPositions; LLPreeditor::standouts_t mPreeditStandouts; + LLHandle<LLView> mContextMenuHandle; + private: // Instances that by default point to the statics but can be overidden in XML. LLPointer<LLUIImage> mBgImage; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 7fa9a88059..d18abbfb2f 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3941,7 +3941,6 @@ BOOL LLContextMenu::appendContextSubMenu(LLContextMenu *menu) item = LLUICtrlFactory::create<LLContextMenuBranch>(p); LLMenuGL::sMenuContainer->addChild(item->getBranch()); - item->setFont( LLFontGL::getFontSansSerif() ); return append( item ); } diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index f4434a0f78..cb81c39103 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -138,7 +138,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p) params.font(p.font); params.max_length_bytes(MAX_STRING_LENGTH); params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit); - params.prevalidate_callback(&LLLineEditor::prevalidateFloat); + params.prevalidate_callback(&LLTextValidate::validateFloat); params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM); mEditor = LLUICtrlFactory::create<LLLineEditor> (params); mEditor->setFocusReceivedCallback( boost::bind(LLMultiSliderCtrl::onEditorGainFocus, _1, this) ); 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/llpanel.cpp b/indra/llui/llpanel.cpp index 7f23fe2671..7b406e090a 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -936,7 +936,7 @@ LLPanel *LLPanel::childGetVisiblePanelWithHelp() return ::childGetVisiblePanelWithHelp(this); } -void LLPanel::childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) ) +void LLPanel::childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) ) { LLLineEditor* child = findChild<LLLineEditor>(id); if (child) diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index 6de83fe3a7..4e53fd7ea3 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -226,7 +226,7 @@ public: std::string childGetText(const std::string& id) const { return childGetValue(id).asString(); } // LLLineEditor - void childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) ); + void childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) ); // LLButton void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL); diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp index 01c274bb4e..80ee5d0984 100644 --- a/indra/llui/llsliderctrl.cpp +++ b/indra/llui/llsliderctrl.cpp @@ -141,7 +141,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p) line_p.rect.setIfNotProvided(text_rect); line_p.font.setIfNotProvided(p.font); line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit); - line_p.prevalidate_callback(&LLLineEditor::prevalidateFloat); + line_p.prevalidate_callback(&LLTextValidate::validateFloat); mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p); mEditor->setFocusReceivedCallback( boost::bind(&LLSliderCtrl::onEditorGainFocus, _1, this )); diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 28f3788817..491cd7b6f3 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -127,7 +127,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p) } params.max_length_bytes(MAX_STRING_LENGTH); params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2))); - params.prevalidate_callback(&LLLineEditor::prevalidateFloat); + params.prevalidate_callback(&LLTextValidate::validateFloat); params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM); mEditor = LLUICtrlFactory::create<LLLineEditor> (params); mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this )); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 6be76605fd..19408989a5 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -35,7 +35,6 @@ #include "lltabcontainer.h" #include "llfocusmgr.h" -#include "llbutton.h" #include "lllocalcliprect.h" #include "llrect.h" #include "llresizehandle.h" @@ -96,6 +95,90 @@ public: //---------------------------------------------------------------------------- +//============================================================================ +/* + * @file lltabcontainer.cpp + * @brief class implements LLButton with LLIconCtrl on it + */ +class LLCustomButtonIconCtrl : public LLButton +{ +public: + struct Params + : public LLInitParam::Block<Params, LLButton::Params> + { + // LEFT, RIGHT, TOP, BOTTOM paddings of LLIconCtrl in this class has same value + Optional<S32> icon_ctrl_pad; + + Params(): + icon_ctrl_pad("icon_ctrl_pad", 1) + {} + }; + +protected: + friend class LLUICtrlFactory; + LLCustomButtonIconCtrl(const Params& p): + LLButton(p), + mIcon(NULL), + mIconCtrlPad(p.icon_ctrl_pad) + {} + +public: + + void updateLayout() + { + LLRect button_rect = getRect(); + LLRect icon_rect = mIcon->getRect(); + + S32 icon_size = button_rect.getHeight() - 2*mIconCtrlPad; + + switch(mIconAlignment) + { + case LLFontGL::LEFT: + icon_rect.setLeftTopAndSize(button_rect.mLeft + mIconCtrlPad, button_rect.mTop - mIconCtrlPad, + icon_size, icon_size); + setLeftHPad(icon_size + mIconCtrlPad * 2); + break; + case LLFontGL::HCENTER: + icon_rect.setLeftTopAndSize(button_rect.mRight - (button_rect.getWidth() + mIconCtrlPad - icon_size)/2, button_rect.mTop - mIconCtrlPad, + icon_size, icon_size); + setRightHPad(icon_size + mIconCtrlPad * 2); + break; + case LLFontGL::RIGHT: + icon_rect.setLeftTopAndSize(button_rect.mRight - mIconCtrlPad - icon_size, button_rect.mTop - mIconCtrlPad, + icon_size, icon_size); + setRightHPad(icon_size + mIconCtrlPad * 2); + break; + default: + break; + } + mIcon->setRect(icon_rect); + } + + void setIcon(LLIconCtrl* icon, LLFontGL::HAlign alignment = LLFontGL::LEFT) + { + if(icon) + { + if(mIcon) + { + removeChild(mIcon); + mIcon->die(); + } + mIcon = icon; + mIconAlignment = alignment; + + addChild(mIcon); + updateLayout(); + } + } + + +private: + LLIconCtrl* mIcon; + LLFontGL::HAlign mIconAlignment; + S32 mIconCtrlPad; +}; +//============================================================================ + struct LLPlaceHolderPanel : public LLPanel { // create dummy param block to register with "placeholder" nane @@ -127,7 +210,9 @@ LLTabContainer::Params::Params() tab_padding_right("tab_padding_right"), first_tab("first_tab"), middle_tab("middle_tab"), - last_tab("last_tab") + last_tab("last_tab"), + use_custom_icon_ctrl("use_custom_icon_ctrl", false), + tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0) { name(std::string("tab_container")); mouse_opaque = false; @@ -162,7 +247,9 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) mFont(p.font), mFirstTabParams(p.first_tab), mMiddleTabParams(p.middle_tab), - mLastTabParams(p.last_tab) + mLastTabParams(p.last_tab), + mCustomIconCtrlUsed(p.use_custom_icon_ctrl), + mTabIconCtrlPad(p.tab_icon_ctrl_pad) { static LLUICachedControl<S32> tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0); @@ -905,6 +992,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) LLTextBox* textbox = NULL; LLButton* btn = NULL; + LLCustomButtonIconCtrl::Params custom_btn_params; + { + custom_btn_params.icon_ctrl_pad(mTabIconCtrlPad); + } + LLButton::Params normal_btn_params; if (placeholder) { @@ -924,7 +1016,9 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) { if (mIsVertical) { - LLButton::Params p; + LLButton::Params& p = (mCustomIconCtrlUsed)? + custom_btn_params:normal_btn_params; + p.name(std::string("vert tab button")); p.rect(btn_rect); p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT); @@ -942,11 +1036,22 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) { p.pad_left(indent); } - btn = LLUICtrlFactory::create<LLButton>(p); + + + if(mCustomIconCtrlUsed) + { + btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params); + + } + else + { + btn = LLUICtrlFactory::create<LLButton>(p); + } } else { - LLButton::Params p; + LLButton::Params& p = (mCustomIconCtrlUsed)? + custom_btn_params:normal_btn_params; p.name(std::string(child->getName()) + " tab"); p.rect(btn_rect); p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child)); @@ -980,7 +1085,14 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM; } -++ btn = LLUICtrlFactory::create<LLButton>(p); + if(mCustomIconCtrlUsed) + { + btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params); + } + else + { + btn = LLUICtrlFactory::create<LLButton>(p); + } } } @@ -1484,7 +1596,7 @@ void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const L if( tuple ) { tuple->mButton->setImageOverlay(image_name, LLFontGL::LEFT, color); - reshape_tuple(tuple); + reshapeTuple(tuple); } } @@ -1494,11 +1606,26 @@ void LLTabContainer::setTabImage(LLPanel* child, const LLUUID& image_id, const L if( tuple ) { tuple->mButton->setImageOverlay(image_id, LLFontGL::LEFT, color); - reshape_tuple(tuple); + reshapeTuple(tuple); + } +} + +void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon) +{ + LLTabTuple* tuple = getTabByPanel(child); + LLCustomButtonIconCtrl* button; + + if(tuple) + { + button = dynamic_cast<LLCustomButtonIconCtrl*>(tuple->mButton); + if(button) + { + button->setIcon(icon); + } } } -void LLTabContainer::reshape_tuple(LLTabTuple* tuple) +void LLTabContainer::reshapeTuple(LLTabTuple* tuple) { static LLUICachedControl<S32> tab_padding ("UITabPadding", 0); static LLUICachedControl<S32> image_left_padding ("UIButtonImageLeftPadding", 4); diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 2a55877d3c..4b5d45fb73 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -36,6 +36,8 @@ #include "llpanel.h" #include "lltextbox.h" #include "llframetimer.h" +#include "lliconctrl.h" +#include "llbutton.h" class LLTabTuple; @@ -90,6 +92,16 @@ public: middle_tab, last_tab; + /** + * Use LLCustomButtonIconCtrl or LLButton in LLTabTuple + */ + Optional<bool> use_custom_icon_ctrl; + + /** + * Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true) + */ + Optional<S32> tab_icon_ctrl_pad; + Params(); }; @@ -173,6 +185,7 @@ public: void setTabPanelFlashing(LLPanel* child, BOOL state); void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white); void setTabImage(LLPanel* child, const LLUUID& img_id, const LLColor4& color = LLColor4::white); + void setTabImage(LLPanel* child, LLIconCtrl* icon); void setTitle( const std::string& title ); const std::string getPanelTitle(S32 index); @@ -228,7 +241,7 @@ private: // updates tab button images given the tuple, tab position and the corresponding params void update_images(LLTabTuple* tuple, TabParams params, LLTabContainer::TabPosition pos); - void reshape_tuple(LLTabTuple* tuple); + void reshapeTuple(LLTabTuple* tuple); // Variables @@ -278,6 +291,9 @@ private: TabParams mFirstTabParams; TabParams mMiddleTabParams; TabParams mLastTabParams; + + bool mCustomIconCtrlUsed; + S32 mTabIconCtrlPad; }; #endif // LL_TABCONTAINER_H diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index b977e50bc1..a83cc19d36 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 @@ -1133,6 +1137,7 @@ void LLTextBase::reflow(S32 start_index) line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare()); line_start_index = iter->mDocIndexStart; line_count = iter->mLineNum; + cur_top = iter->mRect.mTop; getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset); mLineInfoList.erase(iter, mLineInfoList.end()); } @@ -1619,6 +1624,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 +2271,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)); } } @@ -2323,8 +2334,6 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % alpha; - font = mStyle->getFont(); - if( selection_start > seg_start ) { // Draw normally 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..ad9f066539 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -237,13 +237,17 @@ private: /////////////////////////////////////////////////////////////////// LLTextEditor::Params::Params() : default_text("default_text"), + prevalidate_callback("prevalidate_callback"), embedded_items("embedded_items", false), ignore_tab("ignore_tab", true), handle_edit_keys_directly("handle_edit_keys_directly", false), show_line_numbers("show_line_numbers", false), default_color("default_color"), - commit_on_focus_lost("commit_on_focus_lost", false) -{} + commit_on_focus_lost("commit_on_focus_lost", false), + show_context_menu("show_context_menu") +{ + addSynonym(prevalidate_callback, "text_type"); +} LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) : LLTextBase(p), @@ -258,7 +262,9 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) : mMouseDownX(0), mMouseDownY(0), mTabsToNextField(p.ignore_tab), - mContextMenu(NULL) + mPrevalidateFunc(p.prevalidate_callback()), + mContextMenu(NULL), + mShowContextMenu(p.show_context_menu) { mDefaultFont = p.font; @@ -318,6 +324,17 @@ LLTextEditor::~LLTextEditor() void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params) { + // validate incoming text if necessary + if (mPrevalidateFunc) + { + LLWString test_text = utf8str_to_wstring(utf8str); + if (!mPrevalidateFunc(test_text)) + { + // not valid text, nothing to do + return; + } + } + blockUndo(); deselect(); @@ -720,7 +737,10 @@ BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask) } if (!LLTextBase::handleRightMouseDown(x, y, mask)) { - showContextMenu(x, y); + if(getChowContextMenu()) + { + showContextMenu(x, y); + } } return TRUE; } @@ -906,6 +926,21 @@ S32 LLTextEditor::execute( TextCmd* cmd ) // Push the new command is now on the top (front) of the undo stack. mUndoStack.push_front(cmd); mLastCmd = cmd; + + bool need_to_rollback = mPrevalidateFunc + && !mPrevalidateFunc(getViewModel()->getDisplay()); + if (need_to_rollback) + { + // get rid of this last command and clean up undo stack + undo(); + + // remove any evidence of this command from redo history + mUndoStack.pop_front(); + delete cmd; + + // failure, nothing changed + delta = 0; + } } else { @@ -1029,7 +1064,21 @@ S32 LLTextEditor::addChar(S32 pos, llwchar wc) if (mLastCmd && mLastCmd->canExtend(pos)) { S32 delta = 0; + if (mPrevalidateFunc) + { + // get a copy of current text contents + LLWString test_string(getViewModel()->getDisplay()); + + // modify text contents as if this addChar succeeded + llassert(pos <= (S32)test_string.size()); + test_string.insert(pos, 1, wc); + if (!mPrevalidateFunc( test_string)) + { + return 0; + } + } mLastCmd->extendAndExecute(this, pos, wc, &delta); + return delta; } else @@ -1285,8 +1334,6 @@ void LLTextEditor::cut() gClipboard.copyFromSubstring( getWText(), left_pos, length, mSourceID ); deleteSelection( FALSE ); - needsReflow(); - onKeyStroke(); } @@ -1391,8 +1438,6 @@ void LLTextEditor::pasteHelper(bool is_primary) setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE, LLTextSegmentPtr())); deselect(); - needsReflow(); - onKeyStroke(); } @@ -1787,8 +1832,6 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask ) if(text_may_have_changed) { - needsReflow(); - onKeyStroke(); } needsScroll(); @@ -1831,8 +1874,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 +1932,6 @@ void LLTextEditor::doDelete() } onKeyStroke(); - - needsReflow(); } //---------------------------------------------------------------------------- @@ -1935,8 +1974,6 @@ void LLTextEditor::undo() setCursorPos(pos); - needsReflow(); - onKeyStroke(); } @@ -1979,8 +2016,6 @@ void LLTextEditor::redo() setCursorPos(pos); - needsReflow(); - onKeyStroke(); } @@ -2339,8 +2374,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 +2396,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 +2420,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 +2431,6 @@ void LLTextEditor::removeTextFromEnd(S32 num_chars) mSelectionStart = llclamp(mSelectionStart, 0, len); mSelectionEnd = llclamp(mSelectionEnd, 0, len); - needsReflow(); needsScroll(); } @@ -2505,8 +2489,6 @@ BOOL LLTextEditor::tryToRevertToPristineState() i--; } } - - needsReflow(); } return isPristine(); // TRUE => success @@ -2574,7 +2556,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 +2663,6 @@ BOOL LLTextEditor::importBuffer(const char* buffer, S32 length ) startOfDoc(); deselect(); - needsReflow(); return success; } @@ -2785,7 +2766,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..00c6a8b68a 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -44,6 +44,7 @@ #include "lldarray.h" #include "llviewborder.h" // for params #include "lltextbase.h" +#include "lltextvalidate.h" #include "llpreeditor.h" #include "llcontrol.h" @@ -63,12 +64,14 @@ public: struct Params : public LLInitParam::Block<Params, LLTextBase::Params> { Optional<std::string> default_text; + Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback; Optional<bool> embedded_items, ignore_tab, handle_edit_keys_directly, show_line_numbers, - commit_on_focus_lost; + commit_on_focus_lost, + show_context_menu; //colors Optional<LLUIColor> default_color; @@ -149,7 +152,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(); @@ -201,6 +203,9 @@ public: const LLTextSegmentPtr getPreviousSegment() const; void getSelectedSegments(segment_vec_t& segments) const; + void setShowContextMenu(bool show) { mShowContextMenu = show; } + bool getChowContextMenu() const { return mShowContextMenu; } + protected: void showContextMenu(S32 x, S32 y); void drawPreeditMarker(); @@ -320,6 +325,7 @@ private: BOOL mTakesFocus; BOOL mAllowEmbeddedItems; + bool mShowContextMenu; LLUUID mSourceID; @@ -330,6 +336,7 @@ private: LLCoordGL mLastIMEPosition; // Last position of the IME editor keystroke_signal_t mKeystrokeSignal; + LLTextValidate::validate_func_t mPrevalidateFunc; LLContextMenu* mContextMenu; }; // end class LLTextEditor diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp new file mode 100644 index 0000000000..8b6bc5bd7d --- /dev/null +++ b/indra/llui/lltextvalidate.cpp @@ -0,0 +1,302 @@ +/** + * @file lltextvalidate.cpp + * @brief Text validation helper functions + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Text editor widget to let users enter a single line. + +#include "linden_common.h" + +#include "lltextvalidate.h" +#include "llresmgr.h" // for LLLocale + +namespace LLTextValidate +{ + void ValidateTextNamedFuncs::declareValues() + { + declare("ascii", validateASCII); + declare("float", validateFloat); + declare("int", validateInt); + declare("positive_s32", validatePositiveS32); + declare("non_negative_s32", validateNonNegativeS32); + declare("alpha_num", validateAlphaNum); + declare("alpha_num_space", validateAlphaNumSpace); + declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe); + declare("ascii_printable_no_space", validateASCIIPrintableNoSpace); + } + + // Limits what characters can be used to [1234567890.-] with [-] only valid in the first position. + // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for + // the simple reasons that intermediate states may be invalid even if the final result is valid. + // + bool validateFloat(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool success = TRUE; + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + if( 0 < len ) + { + // May be a comma or period, depending on the locale + llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint(); + + S32 i = 0; + + // First character can be a negative sign + if( '-' == trimmed[0] ) + { + i++; + } + + for( ; i < len; i++ ) + { + if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) ) + { + success = FALSE; + break; + } + } + } + + return success; + } + + // Limits what characters can be used to [1234567890-] with [-] only valid in the first position. + // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for + // the simple reasons that intermediate states may be invalid even if the final result is valid. + // + bool validateInt(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool success = TRUE; + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + if( 0 < len ) + { + S32 i = 0; + + // First character can be a negative sign + if( '-' == trimmed[0] ) + { + i++; + } + + for( ; i < len; i++ ) + { + if( !LLStringOps::isDigit( trimmed[i] ) ) + { + success = FALSE; + break; + } + } + } + + return success; + } + + bool validatePositiveS32(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + bool success = TRUE; + if(0 < len) + { + if(('-' == trimmed[0]) || ('0' == trimmed[0])) + { + success = FALSE; + } + S32 i = 0; + while(success && (i < len)) + { + if(!LLStringOps::isDigit(trimmed[i++])) + { + success = FALSE; + } + } + } + if (success) + { + S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); + if (val <= 0) + { + success = FALSE; + } + } + return success; + } + + bool validateNonNegativeS32(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + LLWString trimmed = str; + LLWStringUtil::trim(trimmed); + S32 len = trimmed.length(); + bool success = TRUE; + if(0 < len) + { + if('-' == trimmed[0]) + { + success = FALSE; + } + S32 i = 0; + while(success && (i < len)) + { + if(!LLStringOps::isDigit(trimmed[i++])) + { + success = FALSE; + } + } + } + if (success) + { + S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10); + if (val < 0) + { + success = FALSE; + } + } + return success; + } + + bool validateAlphaNum(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + if( !LLStringOps::isAlnum((char)str[len]) ) + { + rv = FALSE; + break; + } + } + return rv; + } + + bool validateAlphaNumSpace(const LLWString &str) + { + LLLocale locale(LLLocale::USER_LOCALE); + + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len]))) + { + rv = FALSE; + break; + } + } + return rv; + } + + // Used for most names of things stored on the server, due to old file-formats + // that used the pipe (|) for multiline text storage. Examples include + // inventory item names, parcel names, object names, etc. + bool validateASCIIPrintableNoPipe(const LLWString &str) + { + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + llwchar wc = str[len]; + if (wc < 0x20 + || wc > 0x7f + || wc == '|') + { + rv = FALSE; + break; + } + if(!(wc == ' ' + || LLStringOps::isAlnum((char)wc) + || LLStringOps::isPunct((char)wc) ) ) + { + rv = FALSE; + break; + } + } + return rv; + } + + + // Used for avatar names + bool validateASCIIPrintableNoSpace(const LLWString &str) + { + bool rv = TRUE; + S32 len = str.length(); + if(len == 0) return rv; + while(len--) + { + llwchar wc = str[len]; + if (wc < 0x20 + || wc > 0x7f + || LLStringOps::isSpace(wc)) + { + rv = FALSE; + break; + } + if( !(LLStringOps::isAlnum((char)str[len]) || + LLStringOps::isPunct((char)str[len]) ) ) + { + rv = FALSE; + break; + } + } + return rv; + } + + bool validateASCII(const LLWString &str) + { + bool rv = TRUE; + S32 len = str.length(); + while(len--) + { + if (str[len] < 0x20 || str[len] > 0x7f) + { + rv = FALSE; + break; + } + } + return rv; + } +} diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h new file mode 100644 index 0000000000..ffb4e85e7c --- /dev/null +++ b/indra/llui/lltextvalidate.h @@ -0,0 +1,63 @@ +/** + * @file lltextbase.h + * @author Martin Reddy + * @brief The base class of text box/editor, providing Url handling support + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTVALIDATE_H +#define LL_LLTEXTVALIDATE_H + +#include "llstring.h" +#include "llinitparam.h" +#include <boost/function.hpp> + +namespace LLTextValidate +{ + typedef boost::function<BOOL (const LLWString &wstr)> validate_func_t; + + struct ValidateTextNamedFuncs + : public LLInitParam::TypeValuesHelper<validate_func_t, ValidateTextNamedFuncs> + { + static void declareValues(); + }; + + bool validateFloat(const LLWString &str ); + bool validateInt(const LLWString &str ); + bool validatePositiveS32(const LLWString &str); + bool validateNonNegativeS32(const LLWString &str); + bool validateAlphaNum(const LLWString &str ); + bool validateAlphaNumSpace(const LLWString &str ); + bool validateASCIIPrintableNoPipe(const LLWString &str); + bool validateASCIIPrintableNoSpace(const LLWString &str); + bool validateASCII(const LLWString &str); +} + + +#endif diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 7978b6a583..c0811c56c3 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -129,7 +129,8 @@ private: class LLInspector : public LLToolTip { public: - struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {}; + struct Params : public LLInitParam::Block<Params, LLToolTip::Params> + {}; }; class LLToolTipMgr : public LLSingleton<LLToolTipMgr> 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/llvfs/llpidlock.cpp b/indra/llvfs/llpidlock.cpp index 95e3692e10..28cee29405 100755 --- a/indra/llvfs/llpidlock.cpp +++ b/indra/llvfs/llpidlock.cpp @@ -68,8 +68,12 @@ class LLPidLockFile { public: LLPidLockFile( ) : - mSaving(FALSE), mWaiting(FALSE), - mClean(TRUE), mPID(getpid()) + mAutosave(false), + mSaving(false), + mWaiting(false), + mPID(getpid()), + mNameTable(NULL), + mClean(true) { mLockName = gDirUtilp->getTempDir() + gDirUtilp->getDirDelimiter() + "savelock"; } diff --git a/indra/llvfs/llvfile.h b/indra/llvfs/llvfile.h index 5f69a41040..c3bca8c737 100644 --- a/indra/llvfs/llvfile.h +++ b/indra/llvfs/llvfile.h @@ -88,7 +88,6 @@ protected: S32 mMode; LLVFS *mVFS; F32 mPriority; - BOOL mOnReadQueue; S32 mBytesRead; LLVFSThread::handle_t mHandle; diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index bfdf1147a1..f9c3694459 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -1617,7 +1617,7 @@ void LLWindowSDL::processMiscNativeEvents() pump_timer.setTimerExpirySec(1.0f / 15.0f); do { // Always do at least one non-blocking pump - gtk_main_iteration_do(0); + gtk_main_iteration_do(FALSE); } while (gtk_events_pending() && !pump_timer.hasExpired()); diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp index 07cc612a0a..e4f6482fae 100644 --- a/indra/llxml/llxmlnode.cpp +++ b/indra/llxml/llxmlnode.cpp @@ -131,6 +131,8 @@ LLXMLNode::LLXMLNode(const LLXMLNode& rhs) : mPrecision(rhs.mPrecision), mType(rhs.mType), mEncoding(rhs.mEncoding), + mLineNumber(0), + mParser(NULL), mParent(NULL), mChildren(NULL), mAttributes(), diff --git a/indra/llxml/llxmltree.cpp b/indra/llxml/llxmltree.cpp index 1bce5d29f7..bc2690deff 100644 --- a/indra/llxml/llxmltree.cpp +++ b/indra/llxml/llxmltree.cpp @@ -510,7 +510,8 @@ LLXmlTreeParser::LLXmlTreeParser(LLXmlTree* tree) : mTree(tree), mRoot( NULL ), mCurrent( NULL ), - mDump( FALSE ) + mDump( FALSE ), + mKeepContents(FALSE) { } diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index dbc44c8334..e230fcc280 100644 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -724,8 +724,8 @@ private: return false; // allocate some space and grab it - UInt8* item_data = new UInt8( size + 1 ); - memset( item_data, 0, ( size + 1 ) * sizeof( UInt8* ) ); + UInt8* item_data = new UInt8[ size + 1 ]; + memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) ); result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL ); if ( noErr != result ) { diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt index 5bccd589d8..4512c22b5d 100644 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -9,6 +9,7 @@ include(LLPlugin) include(LLMath) include(LLRender) include(LLWindow) +include(UI) include(Linking) include(PluginAPI) include(MediaPluginBase) @@ -38,7 +39,7 @@ add_library(media_plugin_webkit ${media_plugin_webkit_SOURCE_FILES} ) -target_link_libraries(media_plugin_webkit +set(media_plugin_webkit_LINK_LIBRARIES ${LLPLUGIN_LIBRARIES} ${MEDIA_PLUGIN_BASE_LIBRARIES} ${LLCOMMON_LIBRARIES} @@ -46,6 +47,14 @@ target_link_libraries(media_plugin_webkit ${PLUGIN_API_WINDOWS_LIBRARIES} ) +if (LINUX) + list(APPEND media_plugin_webkit_LINK_LIBRARIES + ${UI_LIBRARIES} # for glib/GTK + ) +endif (LINUX) + +target_link_libraries(media_plugin_webkit ${media_plugin_webkit_LINK_LIBRARIES}) + add_dependencies(media_plugin_webkit ${LLPLUGIN_LIBRARIES} ${MEDIA_PLUGIN_BASE_LIBRARIES} @@ -79,4 +88,5 @@ if (DARWIN) DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ) -endif (DARWIN)
\ No newline at end of file +endif (DARWIN) + diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 42d680ade6..b607d2f66a 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -43,15 +43,21 @@ #include "llpluginmessageclasses.h" #include "media_plugin_base.h" +#if LL_LINUX +extern "C" { +# include <glib.h> +} +#endif // LL_LINUX + #if LL_WINDOWS -#include <direct.h> +# include <direct.h> #else -#include <unistd.h> -#include <stdlib.h> +# include <unistd.h> +# include <stdlib.h> #endif #if LL_WINDOWS - // *NOTE:Mani - This captures the module handle fo rthe dll. This is used below + // *NOTE:Mani - This captures the module handle for the dll. This is used below // to get the path to this dll for webkit initialization. // I don't know how/if this can be done with apr... namespace { HMODULE gModuleHandle;}; @@ -112,6 +118,16 @@ private: // void update(int milliseconds) { +#if LL_LINUX + // pump glib generously, as Linux browser plugins are on the + // glib main loop, even if the browser itself isn't - ugh + //*TODO: shouldn't this be transparent if Qt was compiled with + // glib mainloop integration? investigate. + GMainContext *mainc = g_main_context_default(); + while(g_main_context_iteration(mainc, FALSE)); +#endif // LL_LINUX + + // pump qt LLQtWebKit::getInstance()->pump( milliseconds ); checkEditState(); @@ -608,6 +624,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..923ba44906 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> @@ -8399,7 +8399,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>ShowTangentBasis</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..7cbd7e46a9 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -761,6 +761,8 @@ void LLAgentWearables::wearableUpdated(LLWearable *wearable) wearable->refreshName(); wearable->setLabelUpdated(); + wearable->pullCrossWearableValues(); + // Hack pt 2. If the wearable we just loaded has definition version 24, // then force a re-save of this wearable after slamming the version number to 22. // This number was incorrectly incremented for internal builds before release, and @@ -927,13 +929,6 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs if (mInitialWearablesUpdateReceived) return; mInitialWearablesUpdateReceived = true; - - // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) - // then auto-populate outfits from the library into the My Outfits folder. - if (LLInventoryModel::getIsFirstTimeInViewer2() || gSavedSettings.getBOOL("MyOutfitsAutofill")) - { - gAgentWearables.populateMyOutfitsFolder(); - } LLUUID agent_id; gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); @@ -2300,7 +2295,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..326fc41c1e 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) @@ -318,7 +321,7 @@ public: ~LLWearableHoldingPattern(); bool pollCompletion(); - bool isDone(); + bool isFetchCompleted(); bool isTimedOut(); typedef std::list<LLFoundData> found_list_t; @@ -327,10 +330,12 @@ public: LLInventoryModel::item_array_t mGestItems; S32 mResolved; LLTimer mWaitTime; + bool mFired; }; LLWearableHoldingPattern::LLWearableHoldingPattern(): - mResolved(0) + mResolved(0), + mFired(false) { } @@ -338,31 +343,34 @@ LLWearableHoldingPattern::~LLWearableHoldingPattern() { } -bool LLWearableHoldingPattern::isDone() +bool LLWearableHoldingPattern::isFetchCompleted() { - if (mResolved >= (S32)mFoundList.size()) - return true; // have everything we were waiting for - else if (isTimedOut()) - { - llwarns << "Exceeded max wait time, updating appearance based on what has arrived" << llendl; - return true; - } - return false; - + return (mResolved >= (S32)mFoundList.size()); // have everything we were waiting for? } bool LLWearableHoldingPattern::isTimedOut() { - static F32 max_wait_time = 15.0; // give up if wearable fetches haven't completed in max_wait_time seconds. + static F32 max_wait_time = 20.0; // give up if wearable fetches haven't completed in max_wait_time seconds. return mWaitTime.getElapsedTimeF32() > max_wait_time; } bool LLWearableHoldingPattern::pollCompletion() { - bool done = isDone(); - llinfos << "polling, done status: " << done << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; + bool completed = isFetchCompleted(); + bool timed_out = isTimedOut(); + bool done = completed || timed_out; + + llinfos << "polling, done status: " << completed << " timed out? " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl; + if (done) { + mFired = true; + + if (timed_out) + { + llwarns << "Exceeded max wait time for wearables, updating appearance based on what has arrived" << llendl; + } + // Activate all gestures in this folder if (mGestItems.count() > 0) { @@ -394,7 +402,11 @@ bool LLWearableHoldingPattern::pollCompletion() LLAgentWearables::userUpdateAttachments(mObjItems); } - delete this; + if (completed) + { + // Only safe to delete if all wearable callbacks completed. + delete this; + } } return done; } @@ -429,7 +441,11 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items) static void onWearableAssetFetch(LLWearable* wearable, void* data) { LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; - + if (holder->mFired) + { + llwarns << "called after holder fired" << llendl; + } + if(wearable) { for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); @@ -1337,6 +1353,11 @@ BOOL LLAppearanceManager::getIsInCOF(const LLUUID& obj_id) const BOOL LLAppearanceManager::getIsProtectedCOFItem(const LLUUID& obj_id) const { if (!getIsInCOF(obj_id)) return FALSE; + + // For now, don't allow direct deletion from the COF. Instead, force users + // to choose "Detach" or "Take Off". + return TRUE; + /* const LLInventoryObject *obj = gInventory.getObject(obj_id); if (!obj) return FALSE; @@ -1347,4 +1368,5 @@ BOOL LLAppearanceManager::getIsProtectedCOFItem(const LLUUID& obj_id) const if (obj->getActualType() == LLAssetType::AT_LINK_FOLDER) return TRUE; return FALSE; + */ } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 2d694eefd3..a3720769a1 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1353,9 +1353,6 @@ bool LLAppViewer::cleanup() llinfos << "Cache files removed" << llendflush; - - cleanup_menus(); - // Wait for any pending VFS IO while (1) { @@ -2365,9 +2362,6 @@ bool LLAppViewer::initWindow() // store setting in a global for easy access and modification gNoRender = gSavedSettings.getBOOL("DisableRendering"); - // Hide the splash screen - LLSplashScreen::hide(); - // always start windowed BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth"); gViewerWindow = new LLViewerWindow(gWindowTitle, diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 7eed2e7b9a..bd987eac77 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -612,3 +612,13 @@ bool LLAvatarActions::isBlocked(const LLUUID& id) gCacheName->getFullName(id, name); return LLMuteList::getInstance()->isMuted(id, name); } + +// static +bool LLAvatarActions::canBlock(const LLUUID& id) +{ + std::string firstname, lastname; + gCacheName->getName(id, firstname, lastname); + bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden"); + bool is_self = id == gAgentID; + return !is_self && !is_linden; +} diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index c751661acf..16a58718a2 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -124,6 +124,11 @@ public: static bool isBlocked(const LLUUID& id); /** + * @return true if you can block the avatar + */ + static bool canBlock(const LLUUID& id); + + /** * Return true if the avatar is in a P2P voice call with a given user */ /* AD *TODO: Is this function needed any more? diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index a2d594cfa2..93b708f299 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -80,6 +80,14 @@ public: { mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); mGesturePanel = getChild<LLPanel>("gesture_panel"); + + // Hide "show_nearby_chat" button + LLLineEditor* chat_box = mNearbyChatBar->getChatBox(); + LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat"); + S32 delta_width = show_btn->getRect().getWidth(); + show_btn->setVisible(FALSE); + chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight()); + return TRUE; } @@ -280,7 +288,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b break; } - mSpeakBtn->setEnabled(enable); + // We have to enable/disable right and left parts of speak button separately (EXT-4648) + mSpeakBtn->setSpeakBtnEnabled(enable); + // skipped to avoid button blinking + if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL) + { + mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()); + } } void LLBottomTray::onMouselookModeOut() @@ -410,9 +424,10 @@ BOOL LLBottomTray::postBuild() mSpeakPanel = getChild<LLPanel>("speak_panel"); mSpeakBtn = getChild<LLSpeakButton>("talk"); - // Speak button should be initially disabled because + // Both parts of speak button should be initially disabled because // it takes some time between logging in to world and connecting to voice channel. - mSpeakBtn->setEnabled(FALSE); + mSpeakBtn->setSpeakBtnEnabled(false); + mSpeakBtn->setFlyoutBtnEnabled(false); // Localization tool doesn't understand custom buttons like <talk_button> mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") ); @@ -426,6 +441,8 @@ BOOL LLBottomTray::postBuild() mObjectDefaultWidthMap[RS_BUTTON_CAMERA] = mCamPanel->getRect().getWidth(); mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth(); + mNearbyChatBar->getChatBox()->setContextMenu(NULL); + return TRUE; } @@ -474,6 +491,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/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index f62fd44bc0..d405c1bbc1 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -52,6 +52,7 @@ #include "lltransientfloatermgr.h" #include "llviewerwindow.h" #include "llvoicechannel.h" +#include "llviewerparcelmgr.h" static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids); void reshape_floater(LLCallFloater* floater, S32 delta_height); @@ -677,7 +678,8 @@ void LLCallFloater::resetVoiceRemoveTimers() void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id) { - mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id); + bool delete_it = true; + mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id, delete_it); } bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id) @@ -719,7 +721,15 @@ void LLCallFloater::connectToChannel(LLVoiceChannel* channel) void LLCallFloater::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) { - updateState(new_state); + // check is voice operational and if it doesn't work hide VCP (EXT-4397) + if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking()) + { + updateState(new_state); + } + else + { + closeFloater(); + } } void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state) @@ -731,11 +741,11 @@ void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state) } else { - reset(); + reset(new_state); } } -void LLCallFloater::reset() +void LLCallFloater::reset(const LLVoiceChannel::EState& new_state) { // lets forget states from the previous session // for timers... @@ -748,8 +758,26 @@ void LLCallFloater::reset() mParticipants = NULL; mAvatarList->clear(); - // update floater to show Loading while waiting for data. - mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + // These ifs were added instead of simply showing "loading" to make VCP work correctly in parcels + // with disabled voice (EXT-4648 and EXT-4649) + if (!LLViewerParcelMgr::getInstance()->allowAgentVoice() && LLVoiceChannel::STATE_HUNG_UP == new_state) + { + // hides "Leave Call" when call is ended in parcel with disabled voice- hiding usually happens in + // updateSession() which won't be called here because connect to nearby voice never happens + childSetVisible("leave_call_btn_panel", false); + // setting title to nearby chat an "no one near..." text- because in region with disabled + // voice we won't have chance to really connect to nearby, so VCP is changed here manually + setTitle(getString("title_nearby")); + mAvatarList->setNoItemsCommentText(getString("no_one_near")); + } + // "loading" is shown only when state is "ringing" to avoid showing it in nearby chat vcp + // of parcels with disabled voice all the time- "no_one_near" is now shown there (EXT-4648) + else if (new_state == LLVoiceChannel::STATE_RINGING) + { + // update floater to show Loading while waiting for data. + mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + } + mAvatarList->setVisible(TRUE); mNonAvatarCaller->setVisible(FALSE); diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 766191379b..dac4390fa7 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -220,7 +220,7 @@ private: * * Clears all data from the latest voice session. */ - void reset(); + void reset(const LLVoiceChannel::EState& new_state); private: speaker_state_map_t mSpeakerStateMap; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 7c22ac9e36..3aea70d1b4 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(); @@ -231,7 +262,7 @@ public: mSourceType = CHAT_SOURCE_SYSTEM; } - LLTextEditor* userName = getChild<LLTextEditor>("user_name"); + LLTextBox* userName = getChild<LLTextBox>("user_name"); userName->setReadOnlyColor(style_params.readonly_color()); userName->setColor(style_params.color()); @@ -269,7 +300,7 @@ public: /*virtual*/ void draw() { - LLTextEditor* user_name = getChild<LLTextEditor>("user_name"); + LLTextBox* user_name = getChild<LLTextBox>("user_name"); LLTextBox* time_box = getChild<LLTextBox>("time_box"); LLRect user_name_rect = user_name->getRect(); @@ -554,9 +585,16 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL bool irc_me = prefix == "/me " || prefix == "/me'"; // Delimiter after a name in header copy/past and in plain text mode - std::string delimiter = (chat.mChatType != CHAT_TYPE_SHOUT && chat.mChatType != CHAT_TYPE_WHISPER) - ? ": " - : " "; + std::string delimiter = ": "; + std::string shout = LLTrans::getString("shout"); + std::string whisper = LLTrans::getString("whisper"); + if (chat.mChatType == CHAT_TYPE_SHOUT || + chat.mChatType == CHAT_TYPE_WHISPER || + chat.mText.compare(0, shout.length(), shout) == 0 || + chat.mText.compare(0, whisper.length(), whisper) == 0) + { + delimiter = " "; + } // Don't add any delimiter after name in irc styled messages if (irc_me || chat.mChatStyle == CHAT_STYLE_IRC) @@ -671,8 +709,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 +748,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/llchiclet.cpp b/indra/newview/llchiclet.cpp index f646bcccb5..18bd7b725f 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -545,6 +545,7 @@ void LLIMChiclet::toggleSpeakerControl() } setRequiredWidth(); + mSpeakerCtrl->setSpeakerId(LLUUID::null); mSpeakerCtrl->setVisible(getShowSpeaker()); } @@ -954,7 +955,10 @@ LLIMGroupChiclet::~LLIMGroupChiclet() void LLIMGroupChiclet::draw() { - switchToCurrentSpeaker(); + if(getShowSpeaker()) + { + switchToCurrentSpeaker(); + } LLIMChiclet::draw(); } diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 00c05445e1..be6c15eab4 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -426,7 +426,7 @@ void LLCurrencyUIManager::Impl::prepare() LLLineEditor* lindenAmount = mPanel.getChild<LLLineEditor>("currency_amt"); if (lindenAmount) { - lindenAmount->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32); + lindenAmount->setPrevalidate(LLTextValidate::validateNonNegativeS32); lindenAmount->setKeystrokeCallback(onCurrencyKey, this); } } diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 5a10b688da..651dabff9e 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -44,7 +44,6 @@ #include "llquaternion.h" #include "xform.h" #include "llmemtype.h" -#include "llprimitive.h" #include "lldarray.h" #include "llviewerobject.h" #include "llrect.h" diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp index 3961afe9af..8ebfa471f3 100644 --- a/indra/newview/lldriverparam.cpp +++ b/indra/newview/lldriverparam.cpp @@ -39,6 +39,7 @@ #include "llvoavatarself.h" #include "llagent.h" #include "llwearable.h" +#include "llagentwearables.h" //----------------------------------------------------------------------------- // LLDriverParamInfo @@ -528,6 +529,38 @@ void LLDriverParam::resetDrivenParams() mDriven.reserve(getInfo()->mDrivenInfoList.size()); } +void LLDriverParam::updateCrossDrivenParams(EWearableType driven_type) +{ + bool needs_update = (getWearableType()==driven_type); + + // if the driver has a driven entry for the passed-in wearable type, we need to refresh the value + for( entry_list_t::iterator iter = mDriven.begin(); iter != mDriven.end(); iter++ ) + { + LLDrivenEntry* driven = &(*iter); + if (driven && driven->mParam && driven->mParam->getCrossWearable() && driven->mParam->getWearableType() == driven_type) + { + needs_update = true; + } + } + + + if (needs_update) + { + EWearableType driver_type = (EWearableType)getWearableType(); + + // If we've gotten here, we've added a new wearable of type "type" + // Thus this wearable needs to get updates from the driver wearable. + // The call to setVisualParamWeight seems redundant, but is necessary + // as the number of driven wearables has changed since the last update. -Nyx + LLWearable *wearable = gAgentWearables.getTopWearable(driver_type); + if (wearable) + { + wearable->setVisualParamWeight(mID, wearable->getVisualParamWeight(mID), false); + } + } +} + + //----------------------------------------------------------------------------- // getDrivenWeight() //----------------------------------------------------------------------------- diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h index 4e2daf5ba7..e963a2d55a 100644 --- a/indra/newview/lldriverparam.h +++ b/indra/newview/lldriverparam.h @@ -34,6 +34,7 @@ #define LL_LLDRIVERPARAM_H #include "llviewervisualparam.h" +#include "llwearabledictionary.h" class LLVOAvatar; class LLWearable; @@ -93,6 +94,7 @@ public: void setWearable(LLWearable *wearablep); void setAvatar(LLVOAvatar *avatarp); + void updateCrossDrivenParams(EWearableType driven_type); /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const; @@ -112,6 +114,7 @@ public: /*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh); /*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh); /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh); + protected: F32 getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight); void setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake); diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index f5bb777419..1e8a739d78 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -34,7 +34,6 @@ #include "llfavoritesbar.h" -#include "llbutton.h" #include "llfloaterreg.h" #include "llfocusmgr.h" #include "llinventory.h" @@ -48,7 +47,6 @@ #include "llclipboard.h" #include "llinventoryclipboard.h" #include "llinventorybridge.h" -#include "llinventorymodel.h" #include "llfloaterworldmap.h" #include "lllandmarkactions.h" #include "llnotificationsutil.h" @@ -300,6 +298,20 @@ public: return TRUE; } + void setVisible(BOOL b) + { + // Overflow menu shouldn't hide when it still has focus. See EXT-4217. + if (!b && hasFocus()) + return; + LLToggleableMenu::setVisible(b); + setFocus(b); + } + + void onFocusLost() + { + setVisible(FALSE); + } + protected: LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p): LLToggleableMenu(p) @@ -370,7 +382,8 @@ struct LLFavoritesSort LLFavoritesBarCtrl::Params::Params() : image_drag_indication("image_drag_indication"), - chevron_button("chevron_button") + chevron_button("chevron_button"), + label("label") { } @@ -401,6 +414,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() @@ -625,8 +642,8 @@ void LLFavoritesBarCtrl::draw() if (mShowDragMarker) { - S32 w = mImageDragIndication->getWidth() / 2; - S32 h = mImageDragIndication->getHeight() / 2; + S32 w = mImageDragIndication->getWidth(); + S32 h = mImageDragIndication->getHeight(); if (mLandingTab) { @@ -669,7 +686,14 @@ void LLFavoritesBarCtrl::updateButtons() { return; } - + if(mItems.empty()) + { + mBarLabel->setVisible(TRUE); + } + else + { + mBarLabel->setVisible(FALSE); + } const child_list_t* childs = getChildList(); child_list_const_iter_t child_it = childs->begin(); int first_changed_item_index = 0; @@ -715,14 +739,22 @@ void LLFavoritesBarCtrl::updateButtons() } } // we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning + // keep in mind that we are cutting all buttons in space between the last visible child of favbar and ChevronButton if (mChevronButton->getParent() == this) { removeChild(mChevronButton); } int last_right_edge = 0; + //calculate new buttons offset if (getChildList()->size() > 0) { - last_right_edge = getChildList()->back()->getRect().mRight; + //find last visible child to get the rightest button offset + child_list_const_reverse_iter_t last_visible_it = std::find_if(childs->rbegin(), childs->rend(), + std::mem_fun(&LLView::getVisible)); + if(last_visible_it != childs->rend()) + { + last_right_edge = (*last_visible_it)->getRect().mRight; + } } //last_right_edge is saving coordinates LLButton* last_new_button = NULL; @@ -759,6 +791,15 @@ void LLFavoritesBarCtrl::updateButtons() mChevronButton->setRect(rect); mChevronButton->setVisible(TRUE); } + // Update overflow menu + LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get()); + if (overflow_menu && overflow_menu->getVisible()) + { + overflow_menu->setFocus(FALSE); + overflow_menu->setVisible(FALSE); + if (mUpdateDropDownItems) + showDropDownMenu(); + } } else { @@ -874,6 +915,8 @@ void LLFavoritesBarCtrl::showDropDownMenu() if (menu) { + // Release focus to allow changing of visibility. + menu->setFocus(FALSE); if (!menu->toggleVisibility()) return; 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..5ec58c8dd6 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/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 9496e94780..ecb6254f8a 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -65,7 +65,7 @@ public: LLPanelCameraZoom(); /* virtual */ BOOL postBuild(); - /* virtual */ void onOpen(const LLSD& key); + /* virtual */ void draw(); protected: void onZoomPlusHeldDown(); @@ -73,7 +73,6 @@ protected: void onSliderValueChanged(); private: - F32 mSavedSliderVal; LLButton* mPlusBtn; LLButton* mMinusBtn; LLSlider* mSlider; @@ -88,8 +87,7 @@ static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camer LLPanelCameraZoom::LLPanelCameraZoom() : mPlusBtn( NULL ), mMinusBtn( NULL ), - mSlider( NULL ), - mSavedSliderVal(0.f) + mSlider( NULL ) { mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); @@ -101,16 +99,13 @@ BOOL LLPanelCameraZoom::postBuild() mPlusBtn = getChild <LLButton> ("zoom_plus_btn"); mMinusBtn = getChild <LLButton> ("zoom_minus_btn"); mSlider = getChild <LLSlider> ("zoom_slider"); - mSlider->setMinValue(.0f); - mSlider->setMaxValue(8.f); return LLPanel::postBuild(); } -void LLPanelCameraZoom::onOpen(const LLSD& key) +void LLPanelCameraZoom::draw() { - LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal(); - mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current - mSlider->setValue( mSavedSliderVal ); + mSlider->setValue(gAgent.getCameraZoomFraction()); + LLPanel::draw(); } void LLPanelCameraZoom::onZoomPlusHeldDown() @@ -135,13 +130,8 @@ void LLPanelCameraZoom::onZoomMinusHeldDown() void LLPanelCameraZoom::onSliderValueChanged() { - F32 val = mSlider->getValueF32(); - F32 rate = val - mSavedSliderVal; - - gAgent.unlockView(); - gAgent.cameraOrbitIn(rate); - - mSavedSliderVal = val; + F32 zoom_level = mSlider->getValueF32(); + gAgent.setCameraZoomFraction(zoom_level); } void activate_camera_tool() diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 73b79d8e13..b65457c4eb 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -586,7 +586,7 @@ void LLFloaterColorPicker::draw() gl_triangle_2d ( startX, startY, startX + mLumMarkerSize, startY - mLumMarkerSize, startX + mLumMarkerSize, startY + mLumMarkerSize, - LLColor4 ( 0.0f, 0.0f, 0.0f, 1.0f ), TRUE ); + LLColor4 ( 0.75f, 0.75f, 0.75f, 1.0f ), TRUE ); // draw luminance slider outline gl_rect_2d ( mLumRegionLeft, diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index c2b0bd18fa..5294f09e64 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -414,17 +414,17 @@ LLPanelRegionTools::LLPanelRegionTools() BOOL LLPanelRegionTools::postBuild() { getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this); - childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe); - childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32); - childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("region name", &LLTextValidate::validateASCIIPrintableNoPipe); + childSetPrevalidate("estate", &LLTextValidate::validatePositiveS32); + childSetPrevalidate("parentestate", &LLTextValidate::validatePositiveS32); childDisable("parentestate"); - childSetPrevalidate("gridposx", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("gridposx", &LLTextValidate::validatePositiveS32); childDisable("gridposx"); - childSetPrevalidate("gridposy", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("gridposy", &LLTextValidate::validatePositiveS32); childDisable("gridposy"); - childSetPrevalidate("redirectx", &LLLineEditor::prevalidatePositiveS32); - childSetPrevalidate("redirecty", &LLLineEditor::prevalidatePositiveS32); + childSetPrevalidate("redirectx", &LLTextValidate::validatePositiveS32); + childSetPrevalidate("redirecty", &LLTextValidate::validatePositiveS32); return TRUE; } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 8cd63deebe..26c6db9652 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -353,7 +353,7 @@ BOOL LLPanelLandGeneral::postBuild() { mEditName = getChild<LLLineEditor>("Name"); mEditName->setCommitCallback(onCommitAny, this); - childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Name", LLTextValidate::validateASCIIPrintableNoPipe); mEditDesc = getChild<LLTextEditor>("Description"); mEditDesc->setCommitOnFocusLost(TRUE); @@ -1111,7 +1111,7 @@ BOOL LLPanelLandObjects::postBuild() mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this)); mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this); - childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32); + childSetPrevalidate("clean other time", LLTextValidate::validateNonNegativeS32); mBtnRefresh = getChild<LLButton>("Refresh List"); mBtnRefresh->setClickedCallback(onClickRefresh, this); diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index 976af121ae..7388f7ea3f 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -149,13 +149,14 @@ void LLFloaterMediaSettings::apply() { LLSD settings; sInstance->mPanelMediaSettingsGeneral->preApply(); - sInstance->mPanelMediaSettingsGeneral->getValues( settings ); + sInstance->mPanelMediaSettingsGeneral->getValues( settings, false ); sInstance->mPanelMediaSettingsSecurity->preApply(); - sInstance->mPanelMediaSettingsSecurity->getValues( settings ); + sInstance->mPanelMediaSettingsSecurity->getValues( settings, false ); sInstance->mPanelMediaSettingsPermissions->preApply(); - sInstance->mPanelMediaSettingsPermissions->getValues( settings ); - LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA ); - LLSelectMgr::getInstance()->selectionSetMediaData(settings); + sInstance->mPanelMediaSettingsPermissions->getValues( settings, false ); + + LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA, settings ); + sInstance->mPanelMediaSettingsGeneral->postApply(); sInstance->mPanelMediaSettingsSecurity->postApply(); sInstance->mPanelMediaSettingsPermissions->postApply(); @@ -176,6 +177,8 @@ void LLFloaterMediaSettings::onClose(bool app_quitting) //static void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editable ) { + if (sInstance->hasFocus()) return; + sInstance->clearValues(editable); // update all panels with values from simulator sInstance->mPanelMediaSettingsGeneral-> diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 810761e034..159ce41b79 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild() if (NameEditor) { NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN); - NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); + NameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); } y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f); @@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild() if (DescEditor) { DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN); - DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe); + DescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); } y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f); diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 00959322e5..51364594e4 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -204,7 +204,7 @@ BOOL LLFloaterPay::postBuild() getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this); childSetText("amount", last_amount); - childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32); + childSetPrevalidate("amount", LLTextValidate::validateNonNegativeS32); info = new LLGiveMoneyInfo(this, 0); mCallbackData.push_back(info); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ef444c8ba4..9d9fbacee3 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -571,6 +571,16 @@ void LLFloaterPreference::setHardwareDefaults() { LLFeatureManager::getInstance()->applyRecommendedSettings(); refreshEnabledGraphics(); + LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); + child_list_t::const_iterator iter = tabcontainer->getChildList()->begin(); + child_list_t::const_iterator end = tabcontainer->getChildList()->end(); + for ( ; iter != end; ++iter) + { + LLView* view = *iter; + LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view); + if (panel) + panel->setHardwareDefaults(); + } } //virtual @@ -1525,3 +1535,93 @@ void LLPanelPreference::setControlFalse(const LLSD& user_data) if (control) control->set(LLSD(FALSE)); } + +static LLRegisterPanelClassWrapper<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); + +BOOL LLPanelPreferenceGraphics::postBuild() +{ + return LLPanelPreference::postBuild(); +} +void LLPanelPreferenceGraphics::draw() +{ + LLPanelPreference::draw(); + + LLButton* button_apply = findChild<LLButton>("Apply"); + + if(button_apply && button_apply->getVisible()) + { + bool enable = hasDirtyChilds(); + + button_apply->setEnabled(enable); + + } +} +bool LLPanelPreferenceGraphics::hasDirtyChilds() +{ + std::list<LLView*> view_stack; + view_stack.push_back(this); + while(!view_stack.empty()) + { + // Process view on top of the stack + LLView* curview = view_stack.front(); + view_stack.pop_front(); + + LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); + if (ctrl) + { + if(ctrl->isDirty()) + return true; + } + // Push children onto the end of the work stack + for (child_list_t::const_iterator iter = curview->getChildList()->begin(); + iter != curview->getChildList()->end(); ++iter) + { + view_stack.push_back(*iter); + } + } + return false; +} + +void LLPanelPreferenceGraphics::resetDirtyChilds() +{ + std::list<LLView*> view_stack; + view_stack.push_back(this); + while(!view_stack.empty()) + { + // Process view on top of the stack + LLView* curview = view_stack.front(); + view_stack.pop_front(); + + LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); + if (ctrl) + { + ctrl->resetDirty(); + } + // Push children onto the end of the work stack + for (child_list_t::const_iterator iter = curview->getChildList()->begin(); + iter != curview->getChildList()->end(); ++iter) + { + view_stack.push_back(*iter); + } + } +} +void LLPanelPreferenceGraphics::apply() +{ + resetDirtyChilds(); + LLPanelPreference::apply(); +} +void LLPanelPreferenceGraphics::cancel() +{ + resetDirtyChilds(); + LLPanelPreference::cancel(); +} +void LLPanelPreferenceGraphics::saveSettings() +{ + resetDirtyChilds(); + LLPanelPreference::saveSettings(); +} +void LLPanelPreferenceGraphics::setHardwareDefaults() +{ + resetDirtyChilds(); + LLPanelPreference::setHardwareDefaults(); +} diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 8778d76a5a..0827c7c2b2 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -161,6 +161,7 @@ public: virtual void apply(); virtual void cancel(); void setControlFalse(const LLSD& user_data); + virtual void setHardwareDefaults(){}; // This function squirrels away the current values of the controls so that // cancel() can restore them. @@ -177,4 +178,19 @@ private: string_color_map_t mSavedColors; }; +class LLPanelPreferenceGraphics : public LLPanelPreference +{ +public: + BOOL postBuild(); + void draw(); + void apply(); + void cancel(); + void saveSettings(); + void setHardwareDefaults(); +protected: + bool hasDirtyChilds(); + void resetDirtyChilds(); + +}; + #endif // LL_LLPREFERENCEFLOATER_H diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index ff9002787c..bde86a4034 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -130,9 +130,9 @@ BOOL LLFloaterProperties::postBuild() { // build the UI // item name & description - childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this)); - childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this)); // Creator information getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this)); diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index e2b0c4b66f..9895665026 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -163,7 +163,7 @@ BOOL LLFloaterSellLandUI::postBuild() { childSetCommitCallback("sell_to", onChangeValue, this); childSetCommitCallback("price", onChangeValue, this); - childSetPrevalidate("price", LLLineEditor::prevalidateNonNegativeS32); + childSetPrevalidate("price", LLTextValidate::validateNonNegativeS32); childSetCommitCallback("sell_objects", onChangeValue, this); childSetAction("sell_to_select_agent", boost::bind( &LLFloaterSellLandUI::doSelectAgent, this)); childSetAction("cancel_btn", doCancel, this); @@ -268,7 +268,7 @@ void LLFloaterSellLandUI::refreshUI() std::string price_str = childGetValue("price").asString(); bool valid_price = false; - valid_price = (price_str != "") && LLLineEditor::prevalidateNonNegativeS32(utf8str_to_wstring(price_str)); + valid_price = (price_str != "") && LLTextValidate::validateNonNegativeS32(utf8str_to_wstring(price_str)); if (valid_price && mParcelActualArea > 0) { diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index b6e9fb3f6c..a0031f0193 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -2084,10 +2084,6 @@ void LLFloaterSnapshot::draw() S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ; S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ; - if (! gSavedSettings.getBOOL("AdvanceSnapshot")) - { - offset_y += getUIWinHeightShort() - getUIWinHeightLong(); - } glMatrixMode(GL_MODELVIEW); gl_draw_scaled_image(offset_x, offset_y, diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 241497aeaf..4edd09b02c 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1321,7 +1321,7 @@ bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& re switch( option ) { case 0: // "Yes" - LLSelectMgr::getInstance()->selectionSetMedia( 0 ); + LLSelectMgr::getInstance()->selectionSetMedia( 0, LLSD() ); if(LLFloaterReg::instanceVisible("media_settings")) { LLFloaterReg::hideInstance("media_settings"); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index c6135d3bc3..57c7ba8e27 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -225,7 +225,7 @@ LLFolderView::LLFolderView(const Params& p) params.font(getLabelFontForStyle(LLFontGL::NORMAL)); params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN); params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2)); - params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe); + params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe); params.commit_on_focus_lost(true); params.visible(false); mRenamer = LLUICtrlFactory::create<LLLineEditor> (params); @@ -1272,8 +1272,7 @@ BOOL LLFolderView::canCut() const const LLFolderViewItem* item = *selected_it; const LLFolderViewEventListener* listener = item->getListener(); - // *WARKAROUND: it is too many places where the "isItemRemovable" method should be changed with "const" modifier - if (!listener || !(const_cast<LLFolderViewEventListener*>(listener))->isItemRemovable()) + if (!listener || !listener->isItemRemovable()) { return FALSE; } diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index d6c4459e6f..12e100caf4 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -73,7 +73,8 @@ public: virtual BOOL isItemRenameable() const = 0; virtual BOOL renameItem(const std::string& new_name) = 0; virtual BOOL isItemMovable( void ) const = 0; // Can be moved to another folder - virtual BOOL isItemRemovable( void ) = 0; // Can be destroyed + virtual BOOL isItemRemovable( void ) const = 0; // Can be destroyed + virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make into pure virtual. virtual BOOL removeItem() = 0; virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) = 0; virtual void move( LLFolderViewEventListener* parent_listener ) = 0; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index b05eb84e52..f154de39c9 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -2540,13 +2540,11 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde { static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - static const LLUUID& landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID(); LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID(); - if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id) || - (a_uuid == landmarks_folder_id && b_uuid == landmarks_folder_id)) + if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)) { // *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem // or to LLInvFVBridge diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index 3653371d76..00e2365ffd 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -161,12 +161,17 @@ void LLGroupActions::join(const LLUUID& group_id) S32 cost = gdatap->mMembershipFee; LLSD args; args["COST"] = llformat("%d", cost); + args["NAME"] = gdatap->mName; LLSD payload; payload["group_id"] = group_id; if (can_afford_transaction(cost)) { - LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup); + if(cost > 0) + LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup); + else + LLNotificationsUtil::add("JoinGroupNoCost", args, payload, onJoinGroup); + } else { 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..4c1019a882 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1708,12 +1708,18 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, bool start_message = true; LLMessageSystem* msg = gMessageSystem; + + LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id); if (!group_datap) return; for (std::vector<LLUUID>::iterator it = member_ids.begin(); it != member_ids.end(); ++it) { + LLUUID& ejected_member_id = (*it); + + llwarns << "LLGroupMgr::sendGroupMemberEjects -- ejecting member" << ejected_member_id << llendl; + // Can't use 'eject' to leave a group. if ((*it) == gAgent.getID()) continue; @@ -1734,7 +1740,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 +1752,18 @@ 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); + + llwarns << "LLGroupMgr::sendGroupMemberEjects - removing member from role " << llendl; } } - delete (*mit).second; + group_datap->mMembers.erase(*it); + + llwarns << "LLGroupMgr::sendGroupMemberEjects - deleting memnber data " << llendl; + delete (*mit).second; } } @@ -1760,6 +1771,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id, { gAgent.sendReliableMessage(); } + + llwarns << "LLGroupMgr::sendGroupMemberEjects - done " << llendl; } void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 4a18c8640f..34ab541a8e 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -515,8 +515,11 @@ BOOL LLIMFloater::getVisible() if(isChatMultiTab()) { LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance(); - // Tabbed IM window is "visible" when we minimize it. - return !im_container->isMinimized() && im_container->getVisible(); + + // Treat inactive floater as invisible. + bool is_active = im_container->getActiveFloater() == this; + // getVisible() returns TRUE when Tabbed IM window is minimized. + return is_active && !im_container->isMinimized() && im_container->getVisible(); } else { @@ -572,6 +575,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/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 22eb9a51d2..ba034609e9 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -37,6 +37,7 @@ #include "llfloaterreg.h" #include "llimview.h" #include "llavatariconctrl.h" +#include "llgroupiconctrl.h" #include "llagent.h" // @@ -90,43 +91,34 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp, LLUUID session_id = floaterp->getKey(); + LLIconCtrl* icon = 0; + if(gAgent.isInGroup(session_id)) { + LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>(); + icon_params.group_id = session_id; + icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params); + mSessions[session_id] = floaterp; - LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(session_id); - LLGroupMgr* gm = LLGroupMgr::getInstance(); - gm->addObserver(session_id, this); floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); - - if (group_data && group_data->mInsigniaID.notNull()) - { - mTabContainer->setTabImage(get_ptr_in_map(mSessions, session_id), group_data->mInsigniaID); - } - else - { - mTabContainer->setTabImage(floaterp, "Generic_Group"); - gm->sendGroupPropertiesRequest(session_id); - } } else { LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id); - LLAvatarPropertiesProcessor& app = LLAvatarPropertiesProcessor::instance(); - app.addObserver(avatar_id, this); - floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id)); - mSessions[avatar_id] = floaterp; - LLUUID* icon_id_ptr = LLAvatarIconIDCache::getInstance()->get(avatar_id); - if(icon_id_ptr && icon_id_ptr->notNull()) - { - mTabContainer->setTabImage(floaterp, *icon_id_ptr); - } - else - { - mTabContainer->setTabImage(floaterp, "Generic_Person"); - app.sendAvatarPropertiesRequest(avatar_id); - } + LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>(); + icon_params.avatar_id = avatar_id; + icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params); + + mSessions[avatar_id] = floaterp; + floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id)); } + mTabContainer->setTabImage(floaterp, icon); +} + +void LLIMFloaterContainer::onCloseFloater(LLUUID& id) +{ + mSessions.erase(id); } void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type) @@ -159,13 +151,6 @@ void LLIMFloaterContainer::changed(const LLUUID& group_id, LLGroupChange gc) } } -void LLIMFloaterContainer::onCloseFloater(LLUUID id) -{ - LLAvatarPropertiesProcessor::instance().removeObserver(id, this); - LLGroupMgr::instance().removeObserver(id, this); - -} - void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data) { LLUUID session_id = data["from_id"].asUUID(); diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index bc06f0cbd3..b07ef2d71d 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -51,6 +51,7 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); + void onCloseFloater(LLUUID& id); /*virtual*/ void addFloater(LLFloater* floaterp, BOOL select_added_floater, @@ -69,7 +70,6 @@ private: typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t; avatarID_panel_map_t mSessions; - void onCloseFloater(LLUUID avatar_id); void onNewMessageReceived(const LLSD& data); }; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index db6b2041f8..b6032f4dfa 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1610,6 +1610,13 @@ void LLOutgoingCallDialog::show(const LLSD& key) } childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name); childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString()); + + // skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice, + // so no reconnection to nearby chat happens (EXT-4397) + bool voice_works = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking(); + std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string(); + childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby); + childSetTextArg("nearby_P2P", "[RECONNECT_NEARBY]", reconnect_nearby); } std::string callee_name = mPayload["session_name"].asString(); @@ -1709,6 +1716,8 @@ BOOL LLOutgoingCallDialog::postBuild() childSetAction("Cancel", onCancel, this); + setCanDrag(FALSE); + return success; } @@ -1808,6 +1817,8 @@ BOOL LLIncomingCallDialog::postBuild() mLifetimeTimer.stop(); } + setCanDrag(FALSE); + return TRUE; } @@ -2985,48 +2996,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/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index 1a5795a2ae..91cbbbf430 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -51,6 +51,7 @@ #include "llmenubutton.h" #include "llresmgr.h" // getMonetaryString #include "llsafehandle.h" +#include "llsidetray.h" #include "lltextbox.h" // for description truncation #include "lltrans.h" #include "llui.h" // positionViewNearMouse() @@ -643,8 +644,9 @@ void LLInspectObject::onClickOpen() void LLInspectObject::onClickMoreInfo() { - // *TODO: Show object info side panel, once that is implemented. - LLNotificationsUtil::add("ClickUnimplemented"); + LLSD key; + key["task"] = "task"; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); closeFloater(); } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index f68550d8fd..c024304f26 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -174,17 +174,21 @@ time_t LLInvFVBridge::getCreationDate() const } // Can be destroyed (or moved to trash) -BOOL LLInvFVBridge::isItemRemovable() +BOOL LLInvFVBridge::isItemRemovable() const { const LLInventoryModel* model = getInventoryModel(); if(!model) { return FALSE; } + + // Can't delete an item that's in the library. if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) { return FALSE; } + + // Disable delete from COF folder; have users explicitly choose "detach/take off". if (LLAppearanceManager::instance().getIsProtectedCOFItem(mUUID)) { return FALSE; @@ -461,11 +465,15 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const } void hide_context_entries(LLMenuGL& menu, - const std::vector<std::string> &entries_to_show, - const std::vector<std::string> &disabled_entries) + const menuentry_vec_t &entries_to_show, + const menuentry_vec_t &disabled_entries) { const LLView::child_list_t *list = menu.getChildList(); + // For removing double separators or leading separator. Start at true so that + // if the first element is a separator, it will not be shown. + BOOL is_previous_entry_separator = TRUE; + LLView::child_list_t::const_iterator itor; for (itor = list->begin(); itor != list->end(); ++itor) { @@ -480,7 +488,7 @@ void hide_context_entries(LLMenuGL& menu, bool found = false; - std::vector<std::string>::const_iterator itor2; + menuentry_vec_t::const_iterator itor2; for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) { if (*itor2 == name) @@ -488,6 +496,17 @@ void hide_context_entries(LLMenuGL& menu, found = true; } } + + // Don't allow multiple separators in a row (e.g. such as if there are no items + // between two separators). + if (found) + { + const BOOL is_entry_separator = (dynamic_cast<LLMenuItemSeparatorGL *>(*itor) != NULL); + if (is_entry_separator && is_previous_entry_separator) + found = false; + is_previous_entry_separator = is_entry_separator; + } + if (!found) { (*itor)->setVisible(FALSE); @@ -508,8 +527,8 @@ void hide_context_entries(LLMenuGL& menu, // Helper for commonly-used entries void LLInvFVBridge::getClipboardEntries(bool show_asset_id, - std::vector<std::string> &items, - std::vector<std::string> &disabled_items, U32 flags) + menuentry_vec_t &items, + menuentry_vec_t &disabled_items, U32 flags) { const LLInventoryObject *obj = getInventoryObject(); @@ -565,8 +584,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, } } - items.push_back(std::string("Paste")); - if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) + // Don't allow items to be pasted directly into the COF. + if (!isCOFFolder()) + { + items.push_back(std::string("Paste")); + } + if (!isClipboardPasteable() || ((flags & FIRST_SELECTED_ITEM) == 0)) { disabled_items.push_back(std::string("Paste")); } @@ -582,16 +605,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, items.push_back(std::string("Paste Separator")); - if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID)) - { - items.push_back(std::string("Remove Link")); - } - - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } + addDeleteContextMenuOptions(items, disabled_items); // If multiple items are selected, disable properties (if it exists). if ((flags & FIRST_SELECTED_ITEM) == 0) @@ -603,16 +617,11 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) + menuentry_vec_t items; + menuentry_vec_t disabled_items; + if(isItemInTrash()) { - items.push_back(std::string("PurgeItem")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("PurgeItem")); - } - items.push_back(std::string("RestoreItem")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -624,6 +633,53 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) hide_context_entries(menu, items, disabled_items); } +void LLInvFVBridge::addTrashContextMenuOptions(menuentry_vec_t &items, + menuentry_vec_t &disabled_items) +{ + const LLInventoryObject *obj = getInventoryObject(); + if (obj && obj->getIsLinkType()) + { + items.push_back(std::string("Find Original")); + if (isLinkedObjectMissing()) + { + disabled_items.push_back(std::string("Find Original")); + } + } + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + items.push_back(std::string("Restore Item")); +} + +void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items, + menuentry_vec_t &disabled_items) +{ + // Don't allow delete as a direct option from COF folder. + if (isCOFFolder()) + { + return; + } + + const LLInventoryObject *obj = getInventoryObject(); + + // "Remove link" and "Delete" are the same operation. + if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID)) + { + items.push_back(std::string("Remove Link")); + } + else + { + items.push_back(std::string("Delete")); + } + + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } +} + // *TODO: remove this BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const { @@ -670,7 +726,7 @@ LLInventoryModel* LLInvFVBridge::getInventoryModel() const return panel ? panel->getModel() : NULL; } -BOOL LLInvFVBridge::isInTrash() const +BOOL LLInvFVBridge::isItemInTrash() const { LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; @@ -680,7 +736,7 @@ BOOL LLInvFVBridge::isInTrash() const BOOL LLInvFVBridge::isLinkedObjectInTrash() const { - if (isInTrash()) return TRUE; + if (isItemInTrash()) return TRUE; const LLInventoryObject *obj = getInventoryObject(); if (obj && obj->getIsLinkType()) @@ -1412,7 +1468,7 @@ public: }; // Can be destroyed (or moved to trash) -BOOL LLFolderBridge::isItemRemovable() +BOOL LLFolderBridge::isItemRemovable() const { LLInventoryModel* model = getInventoryModel(); if(!model) @@ -2439,7 +2495,7 @@ void LLFolderBridge::staticFolderOptionsMenu() void LLFolderBridge::folderOptionsMenu() { - std::vector<std::string> disabled_items; + menuentry_vec_t disabled_items; LLInventoryModel* model = getInventoryModel(); if(!model) return; @@ -2457,7 +2513,7 @@ void LLFolderBridge::folderOptionsMenu() if (is_sidepanel) { mItems.push_back("Rename"); - mItems.push_back("Delete"); + addDeleteContextMenuOptions(mItems, disabled_items); } // Only enable calling-card related options for non-system folders. @@ -2572,7 +2628,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; -// std::vector<std::string> disabled_items; +// menuentry_vec_t disabled_items; LLInventoryModel* model = getInventoryModel(); if(!model) return; const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); @@ -2589,17 +2645,11 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // This is the trash. mItems.push_back(std::string("Empty Trash")); } - else if(model->isObjectDescendentOf(mUUID, trash_id)) + else if(isItemInTrash()) { // This is a folder in the trash. mItems.clear(); // clear any items that used to exist - mItems.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - mDisabledItems.push_back(std::string("Purge Item")); - } - - mItems.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(mItems, mDisabledItems); } else if(isAgentInventory()) // do not allow creating in library { @@ -2617,24 +2667,27 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mItems.push_back(std::string("New Gesture")); mItems.push_back(std::string("New Clothes")); mItems.push_back(std::string("New Body Parts")); - mItems.push_back(std::string("Change Type")); - LLViewerInventoryCategory *cat = getCategory(); + // Changing folder types is just a debug feature; this is fairly unsupported + // and can lead to unexpected behavior if enabled. +#if !LL_RELEASE_FOR_DOWNLOAD + mItems.push_back(std::string("Change Type")); + const LLViewerInventoryCategory *cat = getCategory(); if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { mDisabledItems.push_back(std::string("Change Type")); } - +#endif getClipboardEntries(false, mItems, mDisabledItems, flags); } else { // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT) + if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT)) { mItems.push_back(std::string("Rename")); - mItems.push_back(std::string("Delete")); + addDeleteContextMenuOptions(mItems, mDisabledItems); // EXT-4030: disallow deletion of currently worn outfit const LLViewerInventoryItem *base_outfit_link = LLAppearanceManager::instance().getBaseOutfitLink(); if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory())) @@ -3203,17 +3256,11 @@ bool LLTextureBridge::canSaveTexture(void) void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) + menuentry_vec_t items; + menuentry_vec_t disabled_items; + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -3296,18 +3343,12 @@ void LLSoundBridge::openSoundPreview(void* which) void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { lldebugs << "LLSoundBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; + menuentry_vec_t items; + menuentry_vec_t disabled_items; - if(isInTrash()) + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -3344,19 +3385,13 @@ LLUIImagePtr LLLandmarkBridge::getIcon() const void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { - std::vector<std::string> items; - std::vector<std::string> disabled_items; + menuentry_vec_t items; + menuentry_vec_t disabled_items; lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; - if(isInTrash()) + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -3570,18 +3605,12 @@ void LLCallingCardBridge::openItem() void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; + menuentry_vec_t items; + menuentry_vec_t disabled_items; - if(isInTrash()) + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -3836,17 +3865,11 @@ BOOL LLGestureBridge::removeItem() void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) + menuentry_vec_t items; + menuentry_vec_t disabled_items; + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -3898,19 +3921,13 @@ LLUIImagePtr LLAnimationBridge::getIcon() const void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { - std::vector<std::string> items; - std::vector<std::string> disabled_items; + menuentry_vec_t items; + menuentry_vec_t disabled_items; lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; - if(isInTrash()) + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -4179,17 +4196,11 @@ static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("Rep void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) + menuentry_vec_t items; + menuentry_vec_t disabled_items; + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { @@ -4215,9 +4226,10 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) if( get_is_item_worn( mUUID ) ) { + items.push_back(std::string("Attach Separator")); items.push_back(std::string("Detach From Yourself")); } - else if (!isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing()) + else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing()) { items.push_back(std::string("Attach Separator")); items.push_back(std::string("Object Wear")); @@ -4555,7 +4567,7 @@ void LLWearableBridge::openItem() LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); } /* - if( isInTrash() ) + if( isItemInTrash() ) { LLNotificationsUtil::add("CannotWearTrash"); } @@ -4595,17 +4607,11 @@ void LLWearableBridge::openItem() void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) + menuentry_vec_t items; + menuentry_vec_t disabled_items; + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere @@ -4913,8 +4919,12 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, } // Find and remove this item from the COF. + // FIXME 2.1 - call removeCOFItemLinks in llappearancemgr instead. LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF()); - llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. + if (items.size() != 1) + { + llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl; + } for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); iter != items.end(); ++iter) @@ -4950,7 +4960,10 @@ void LLWearableBridge::removeAllClothesFromAvatar() // Find and remove this item from the COF. LLInventoryModel::item_array_t items = gInventory.collectLinkedItems( item_id, LLAppearanceManager::instance().getCOF()); - llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. + if (items.size() != 1) + { + llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl; + } for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); iter != items.end(); ++iter) @@ -5192,7 +5205,7 @@ void LLLSLTextBridgeAction::doIt() } -BOOL LLWearableBridgeAction::isInTrash() const +BOOL LLWearableBridgeAction::isItemInTrash() const { if(!mModel) return FALSE; const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); @@ -5240,7 +5253,7 @@ void LLWearableBridgeAction::wearOnAvatar() //virtual void LLWearableBridgeAction::doIt() { - if(isInTrash()) + if(isItemInTrash()) { LLNotificationsUtil::add("CannotWearTrash"); } @@ -5299,30 +5312,20 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { // *TODO: Translate lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; + menuentry_vec_t items; + menuentry_vec_t disabled_items; items.push_back(std::string("Find Original")); disabled_items.push_back(std::string("Find Original")); - if(isInTrash()) + if(isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { items.push_back(std::string("Properties")); - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } + addDeleteContextMenuOptions(items, disabled_items); } hide_context_entries(menu, items, disabled_items); } @@ -5353,27 +5356,17 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { // *TODO: Translate lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; + menuentry_vec_t items; + menuentry_vec_t disabled_items; - if(isInTrash()) + if (isItemInTrash()) { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); + addTrashContextMenuOptions(items, disabled_items); } else { items.push_back(std::string("Find Original")); - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } + addDeleteContextMenuOptions(items, disabled_items); } hide_context_entries(menu, items, disabled_items); } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 6fffec96a0..32504091cb 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -107,13 +107,15 @@ struct LLAttachmentRezAction S32 mAttachPt; }; +typedef std::vector<std::string> menuentry_vec_t; + const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type); void hide_context_entries(LLMenuGL& menu, - const std::vector<std::string> &entries_to_show, - const std::vector<std::string> &disabled_entries); + const menuentry_vec_t &entries_to_show, + const menuentry_vec_t &disabled_entries); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInvFVBridge (& it's derived classes) +// Class LLInvFVBridge (& its derived classes) // // Short for Inventory-Folder-View-Bridge. This is an // implementation class to be able to view inventory items. @@ -158,8 +160,10 @@ public: virtual void showProperties(); virtual BOOL isItemRenameable() const { return TRUE; } //virtual BOOL renameItem(const std::string& new_name) {} - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual BOOL isItemMovable() const; + virtual BOOL isItemInTrash() const; + //virtual BOOL removeItem() = 0; virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); virtual void move(LLFolderViewEventListener* new_parent_bridge) {} @@ -170,8 +174,8 @@ public: virtual BOOL isClipboardPasteableAsLink() const; virtual void pasteFromClipboard() {} virtual void pasteLinkFromClipboard() {} - void getClipboardEntries(bool show_asset_id, std::vector<std::string> &items, - std::vector<std::string> &disabled_items, U32 flags); + void getClipboardEntries(bool show_asset_id, menuentry_vec_t &items, + menuentry_vec_t &disabled_items, U32 flags); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; virtual BOOL dragOrDrop(MASK mask, BOOL drop, @@ -185,13 +189,21 @@ public: // Allow context menus to be customized for side panel. bool isInOutfitsSidePanel() const; + //-------------------------------------------------------------------- + // Convenience functions for adding various common menu options. + //-------------------------------------------------------------------- +protected: + virtual void addTrashContextMenuOptions(menuentry_vec_t &items, + menuentry_vec_t &disabled_items); + virtual void addDeleteContextMenuOptions(menuentry_vec_t &items, + menuentry_vec_t &disabled_items); + protected: LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid); LLInventoryObject* getInventoryObject() const; LLInventoryModel* getInventoryModel() const; - BOOL isInTrash() const; BOOL isLinkedObjectInTrash() const; // Is this obj or its baseobj in the trash? BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory? @@ -306,7 +318,7 @@ public: EDragAndDropType cargo_type, void* cargo_data); - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual BOOL isItemMovable() const ; virtual BOOL isUpToDate() const; virtual BOOL isItemCopyable() const; @@ -359,8 +371,8 @@ private: BOOL mCallingCards; BOOL mWearables; LLMenuGL* mMenu; - std::vector<std::string> mItems; - std::vector<std::string> mDisabledItems; + menuentry_vec_t mItems; + menuentry_vec_t mDisabledItems; }; // DEPRECATED @@ -786,7 +798,7 @@ protected: LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - BOOL isInTrash() const; + BOOL isItemInTrash() const; // return true if the item is in agent inventory. if false, it // must be lost or in the inventory library. BOOL isAgentInventory() const; @@ -814,7 +826,7 @@ void teleport_via_landmark(const LLUUID& asset_id); // Utility function to hide all entries except those in the list void hide_context_entries(LLMenuGL& menu, - const std::vector<std::string> &entries_to_show, - const std::vector<std::string> &disabled_entries); + const menuentry_vec_t &entries_to_show, + const menuentry_vec_t &disabled_entries); #endif // LL_LLINVENTORYBRIDGE_H 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/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 12a2c370d2..a6d63e58f5 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -432,7 +432,26 @@ void LLInventoryPanel::initializeViews() rebuildViewsFor(mStartFolderID); mViewsInitialized = true; + openStartFolderOrMyInventory(); + + // Special case for new user login + if (gAgent.isFirstLogin()) + { + // Auto open the user's library + LLFolderViewFolder* lib_folder = mFolders->getFolderByID(gInventory.getLibraryRootFolderID()); + if (lib_folder) + { + lib_folder->setOpen(TRUE); + } + + // Auto close the user's my inventory folder + LLFolderViewFolder* my_inv_folder = mFolders->getFolderByID(gInventory.getRootFolderID()); + if (my_inv_folder) + { + my_inv_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN); + } + } } void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 4f40a0a532..ff713d74ad 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -176,7 +176,9 @@ private: static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input"); LLLocationInputCtrl::Params::Params() -: add_landmark_image_enabled("add_landmark_image_enabled"), +: icon_maturity_general("icon_maturity_general"), + icon_maturity_adult("icon_maturity_adult"), + add_landmark_image_enabled("add_landmark_image_enabled"), add_landmark_image_disabled("add_landmark_image_disabled"), add_landmark_image_hover("add_landmark_image_hover"), add_landmark_image_selected("add_landmark_image_selected"), @@ -185,6 +187,7 @@ LLLocationInputCtrl::Params::Params() add_landmark_button("add_landmark_button"), for_sale_button("for_sale_button"), info_button("info_button"), + maturity_icon("maturity_icon"), voice_icon("voice_icon"), fly_icon("fly_icon"), push_icon("push_icon"), @@ -204,7 +207,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mForSaleBtn(NULL), mInfoBtn(NULL), mLandmarkImageOn(NULL), - mLandmarkImageOff(NULL) + mLandmarkImageOff(NULL), + mIconMaturityGeneral(NULL), + mIconMaturityAdult(NULL) { // Lets replace default LLLineEditor with LLLocationLineEditor // to make needed escaping while copying and cutting url @@ -227,6 +232,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) params.commit_on_focus_lost(false); params.follows.flags(FOLLOWS_ALL); mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params); + mTextEntry->setContextMenu(NULL); addChild(mTextEntry); // LLLineEditor is replaced with LLLocationLineEditor @@ -263,7 +269,20 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params); enableAddLandmarkButton(true); addChild(mAddLandmarkBtn); - + + if (p.icon_maturity_general()) + { + mIconMaturityGeneral = p.icon_maturity_general; + } + if (p.icon_maturity_adult()) + { + mIconMaturityAdult = p.icon_maturity_adult; + } + + LLIconCtrl::Params maturity_icon = p.maturity_icon; + mMaturityIcon = LLUICtrlFactory::create<LLIconCtrl>(maturity_icon); + addChild(mMaturityIcon); + LLButton::Params for_sale_button = p.for_sale_button; for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip"); for_sale_button.click_callback.function( @@ -521,6 +540,25 @@ void LLLocationInputCtrl::draw() LLComboBox::draw(); } +void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLComboBox::reshape(width, height, called_from_parent); + + // Setting cursor to 0 to show the left edge of the text. See EXT-4967. + mTextEntry->setCursor(0); + if (mTextEntry->hasSelection()) + { + // Deselecting because selection position is changed together with + // cursor position change. + mTextEntry->deselect(); + } + + if (isHumanReadableLocationVisible) + { + positionMaturityIcon(); + } +} + void LLLocationInputCtrl::onInfoButtonClicked() { LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent")); @@ -671,6 +709,34 @@ void LLLocationInputCtrl::refreshLocation() // store human-readable location to compare it in changeLocationPresentation() mHumanReadableLocation = location_name; setText(location_name); + isHumanReadableLocationVisible = true; + + // Updating maturity rating icon. + LLViewerRegion* region = gAgent.getRegion(); + if (!region) + return; + + U8 sim_access = region->getSimAccess(); + switch(sim_access) + { + case SIM_ACCESS_PG: + mMaturityIcon->setValue(mIconMaturityGeneral->getName()); + mMaturityIcon->setVisible(TRUE); + break; + + case SIM_ACCESS_ADULT: + mMaturityIcon->setValue(mIconMaturityAdult->getName()); + mMaturityIcon->setVisible(TRUE); + break; + + default: + mMaturityIcon->setVisible(FALSE); + } + + if (mMaturityIcon->getVisible()) + { + positionMaturityIcon(); + } } // returns new right edge @@ -691,7 +757,7 @@ void LLLocationInputCtrl::refreshParcelIcons() { // Our "cursor" moving right to left S32 x = mAddLandmarkBtn->getRect().mLeft; - + static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false); if (show_properties) { @@ -761,7 +827,7 @@ void LLLocationInputCtrl::refreshParcelIcons() } mDamageText->setVisible(false); } - + S32 left_pad, right_pad; mTextEntry->getTextPadding(&left_pad, &right_pad); right_pad = mTextEntry->getRect().mRight - x; @@ -784,6 +850,25 @@ void LLLocationInputCtrl::refreshHealth() } } +void LLLocationInputCtrl::positionMaturityIcon() +{ + const LLFontGL* font = mTextEntry->getFont(); + if (!font) + return; + + S32 left_pad, right_pad; + mTextEntry->getTextPadding(&left_pad, &right_pad); + + // Calculate the right edge of rendered text + a whitespace. + left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" "); + + LLRect rect = mMaturityIcon->getRect(); + mMaturityIcon->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight())); + + // Hide icon if it text area is not width enough to display it, show otherwise. + mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad); +} + void LLLocationInputCtrl::rebuildLocationHistory(std::string filter) { LLLocationHistory::location_list_t filtered_items; @@ -884,16 +969,23 @@ void LLLocationInputCtrl::updateWidgetlayout() void LLLocationInputCtrl::changeLocationPresentation() { - //change location presentation only if user does not select/past anything and - //human-readable region name is being displayed + if (!mTextEntry) + return; + + //change location presentation only if user does not select/paste anything and + //human-readable region name is being displayed std::string text = mTextEntry->getText(); LLStringUtil::trim(text); - if(mTextEntry && !mTextEntry->hasSelection() && text == mHumanReadableLocation ) + if(!mTextEntry->hasSelection() && text == mHumanReadableLocation) { //needs unescaped one mTextEntry->setText(LLAgentUI::buildSLURL(false)); mTextEntry->selectAll(); - } + + mMaturityIcon->setVisible(FALSE); + + isHumanReadableLocationVisible = false; + } } void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata) diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index a830b33f6f..caa62daa1b 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -63,7 +63,9 @@ public: struct Params : public LLInitParam::Block<Params, LLComboBox::Params> { - Optional<LLUIImage*> add_landmark_image_enabled, + Optional<LLUIImage*> icon_maturity_general, + icon_maturity_adult, + add_landmark_image_enabled, add_landmark_image_disabled, add_landmark_image_hover, add_landmark_image_selected; @@ -72,7 +74,8 @@ public: Optional<LLButton::Params> add_landmark_button, for_sale_button, info_button; - Optional<LLIconCtrl::Params> voice_icon, + Optional<LLIconCtrl::Params> maturity_icon, + voice_icon, fly_icon, push_icon, build_icon, @@ -89,6 +92,7 @@ public: /*virtual*/ void onFocusReceived(); /*virtual*/ void onFocusLost(); /*virtual*/ void draw(); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); //======================================================================== // LLUICtrl interface @@ -131,6 +135,7 @@ private: void refreshParcelIcons(); // Refresh the value in the health percentage text field void refreshHealth(); + void positionMaturityIcon(); void rebuildLocationHistory(std::string filter = ""); bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter); @@ -160,7 +165,8 @@ private: LLButton* mInfoBtn; S32 mIconHPad; // pad between all icons S32 mAddLandmarkHPad; // pad to left of landmark star - + + LLIconCtrl* mMaturityIcon; LLIconCtrl* mParcelIcon[ICON_COUNT]; LLTextBox* mDamageText; @@ -172,11 +178,14 @@ private: boost::signals2::connection mLocationHistoryConnection; LLUIImage* mLandmarkImageOn; LLUIImage* mLandmarkImageOff; + LLUIImage* mIconMaturityGeneral; + LLUIImage* mIconMaturityAdult; std::string mAddLandmarkTooltip; std::string mEditLandmarkTooltip; // this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location std::string mHumanReadableLocation; + bool isHumanReadableLocationVisible; }; #endif diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index d464862eed..3c34d26692 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -542,9 +542,9 @@ void LLMediaCtrl::navigateToLocalPage( const std::string& subdir, const std::str if (! gDirUtilp->fileExists(expanded_filename)) { - if (language != "en-us") + if (language != "en") { - expanded_filename = gDirUtilp->findSkinnedFilename("html", "en-us", filename); + expanded_filename = gDirUtilp->findSkinnedFilename("html", "en", filename); if (! gDirUtilp->fileExists(expanded_filename)) { llwarns << "File " << subdir << delim << filename_in << "not found" << llendl; diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 8c875c9b63..d579058c32 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -152,6 +152,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) if (avatar_id.notNull()) { // ...valid avatar id + LLScrollListCell* hit_cell = hit_item->getColumn(column_index); if (hit_cell) { @@ -162,8 +163,8 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) localRectToScreen(cell_rect, &sticky_rect); // Spawn at right side of cell - LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop + (sticky_rect.getHeight()-16)/2 ); LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); + LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); // Should we show a group or an avatar inspector? bool is_group = hit_item->getValue()["is_group"].asBoolean(); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 59708fcfb5..46cab0d868 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -185,43 +185,46 @@ void LLTeleportHistoryMenuItem::onMouseLeave(S32 x, S32 y, MASK mask) static LLDefaultChildRegistry::Register<LLPullButton> menu_button("pull_button"); -LLPullButton::LLPullButton(const LLPullButton::Params& params): - LLButton(params) - , mClickDraggingSignal(NULL) +LLPullButton::LLPullButton(const LLPullButton::Params& params) : + LLButton(params) { setDirectionFromName(params.direction); } -boost::signals2::connection LLPullButton::setClickDraggingCallback( const commit_signal_t::slot_type& cb ) -{ - if (!mClickDraggingSignal) mClickDraggingSignal = new commit_signal_t(); - return mClickDraggingSignal->connect(cb); +boost::signals2::connection LLPullButton::setClickDraggingCallback(const commit_signal_t::slot_type& cb) +{ + return mClickDraggingSignal.connect(cb); } /*virtual*/ void LLPullButton::onMouseLeave(S32 x, S32 y, MASK mask) { LLButton::onMouseLeave(x, y, mask); - - if(mMouseDownTimer.getStarted() ) + + if (mMouseDownTimer.getStarted()) //an user have done a mouse down, if the timer started. see LLButton::handleMouseDown for details { - const LLVector2 cursor_direction = LLVector2(F32(x),F32(y)) - mLastMouseDown; - if( angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4 - { - if(mClickDraggingSignal) - { - (*mClickDraggingSignal)(this, LLSD()); - } - } + const LLVector2 cursor_direction = LLVector2(F32(x), F32(y)) - mLastMouseDown; + /* For now cursor_direction points to the direction of mouse movement + * Need to decide whether should we fire a signal. + * We fire if angle between mDraggingDirection and cursor_direction is less that 45 degree + * Note: + * 0.5 * F_PI_BY_TWO equals to PI/4 radian that equals to angle of 45 degrees + */ + if (angle_between(mDraggingDirection, cursor_direction) < 0.5 * F_PI_BY_TWO)//call if angle < pi/4 + { + mClickDraggingSignal(this, LLSD()); + } } } /*virtual*/ BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLButton::handleMouseDown(x, y, mask); + if (handled) { - BOOL handled = LLButton::handleMouseDown(x,y, mask); - if(handled) - { + //if mouse down was handled by button, + //capture mouse position to calculate the direction of mouse move after mouseLeave event mLastMouseDown.set(F32(x), F32(y)); } return handled; @@ -230,27 +233,31 @@ BOOL LLPullButton::handleMouseDown(S32 x, S32 y, MASK mask) /*virtual*/ BOOL LLPullButton::handleMouseUp(S32 x, S32 y, MASK mask) { + // reset data to get ready for next circle mLastMouseDown.clear(); return LLButton::handleMouseUp(x, y, mask); } - +/** + * this function is setting up dragging direction vector. + * Last one is just unit vector. It points to direction of mouse drag that we need to handle + */ void LLPullButton::setDirectionFromName(const std::string& name) { if (name == "left") { - mDraggingDirection.set(F32(-1), F32(0)); + mDraggingDirection.set(F32(-1), F32(0)); } else if (name == "right") { - mDraggingDirection.set(F32(0), F32(1)); + mDraggingDirection.set(F32(0), F32(1)); } else if (name == "down") { - mDraggingDirection.set(F32(0), F32(-1)); + mDraggingDirection.set(F32(0), F32(-1)); } else if (name == "up") { - mDraggingDirection.set(F32(0), F32(1)); + mDraggingDirection.set(F32(0), F32(1)); } } diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 9d0abc7a3a..b512f2a79c 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -44,46 +44,41 @@ class LLSearchComboBox; /** * This button is able to handle click-dragging mouse event. * It has appropriated signal for this event. - * Dragging direction can be set from xml by attribute called 'direction' + * Dragging direction can be set from xml attribute called 'direction' * * *TODO: move to llui? */ -class LLPullButton : public LLButton +class LLPullButton: public LLButton { LOG_CLASS(LLPullButton); - + public: - - struct Params : public LLInitParam::Block<Params, LLButton::Params> + struct Params: public LLInitParam::Block<Params, LLButton::Params> { - Optional<std::string> direction; // left, right, down, up - - Params() - : direction("direction","down") - {} + Optional<std::string> direction; // left, right, down, up + + Params() + : direction("direction", "down") + { + } }; /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); - + /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); - + /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); - boost::signals2::connection setClickDraggingCallback( const commit_signal_t::slot_type& cb ); - - /* virtual*/ ~LLPullButton() - { - delete mClickDraggingSignal; - } - + boost::signals2::connection setClickDraggingCallback(const commit_signal_t::slot_type& cb); + protected: friend class LLUICtrlFactory; // convert string name into direction vector void setDirectionFromName(const std::string& name); LLPullButton(const LLPullButton::Params& params); - - commit_signal_t* mClickDraggingSignal; + + commit_signal_t mClickDraggingSignal; LLVector2 mLastMouseDown; LLVector2 mDraggingDirection; }; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 6de47fccd2..8fc11d3929 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -200,18 +200,16 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args) mMessageArchive.push_back(chat); if(mMessageArchive.size()>200) mMessageArchive.erase(mMessageArchive.begin()); + } - if (gSavedPerAccountSettings.getBOOL("LogChat")) - { - if (chat.mChatType != CHAT_TYPE_WHISPER && chat.mChatType != CHAT_TYPE_SHOUT) - { - LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText); - } - else - { - LLLogChat::saveHistory("chat", "", chat.mFromID, chat.mFromName + " " + chat.mText); - } - } + if (args["do_not_log"].asBoolean()) + { + return; + } + + if (gSavedPerAccountSettings.getBOOL("LogChat")) + { + LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText); } } @@ -282,6 +280,9 @@ void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue) void LLNearbyChat::loadHistory() { + LLSD do_not_log; + do_not_log["do_not_log"] = true; + std::list<LLSD> history; LLLogChat::loadAllHistory("chat", history); @@ -302,7 +303,7 @@ void LLNearbyChat::loadHistory() chat.mFromID = from_id; chat.mText = msg[IM_TEXT].asString(); chat.mTimeStr = msg[IM_TIME].asString(); - addMessage(chat); + addMessage(chat, true, do_not_log); it++; } diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index c08ca30bab..29e3c66684 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -274,6 +274,13 @@ void LLNearbyChatScreenChannel::showToastsBottom() toast->setRect(toast_rect); toast->setIsHidden(false); toast->setVisible(TRUE); + + if(!toast->hasFocus()) + { + // Fixing Z-order of toasts (EXT-4862) + // Next toast will be positioned under this one. + gFloaterView->sendChildToBack(toast); + } bottom = toast->getRect().mTop; } @@ -338,8 +345,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) // tmp_chat.mFromName = tmp_chat.mFromID.asString(); } nearby_chat->addMessage(chat_msg, true, args); - if(nearby_chat->getVisible()) - return;//no need in toast if chat is visible + if( nearby_chat->getVisible() + || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT + && gSavedSettings.getBOOL("UseChatBubbles") ) ) + return;//no need in toast if chat is visible or if bubble chat is enabled // Handle irc styled messages for toast panel if (tmp_chat.mChatStyle == CHAT_STYLE_IRC) diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index 388fdeea7a..9857e37bc3 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -249,6 +249,11 @@ void LLOutputMonitorCtrl::draw() void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id) { + if (speaker_id.isNull() && mSpeakerId.notNull()) + { + LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this); + } + if (speaker_id.isNull() || speaker_id == mSpeakerId) return; if (mSpeakerId.notNull()) @@ -256,6 +261,7 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id) // Unregister previous registration to avoid crash. EXT-4782. LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this); } + mSpeakerId = speaker_id; LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this); diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 48dd5513bd..d7c558d188 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -196,10 +196,9 @@ void LLPanelAvatarNotes::fillRightsData() childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE); childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE); - childSetEnabled("status_check",TRUE); - childSetEnabled("map_check",TRUE); - childSetEnabled("objects_check",TRUE); } + + enableCheckboxes(NULL != relation); } void LLPanelAvatarNotes::onCommitNotes() @@ -250,6 +249,17 @@ void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights) void LLPanelAvatarNotes::onCommitRights() { + const LLRelationship* buddy_relationship = + LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); + + if (NULL == buddy_relationship) + { + // Lets have a warning log message instead of having a crash. EXT-4947. + llwarns << "Trying to modify rights for non-friend avatar. Skipped." << llendl; + return; + } + + S32 rights = 0; if(childGetValue("status_check").asBoolean()) @@ -259,8 +269,6 @@ void LLPanelAvatarNotes::onCommitRights() if(childGetValue("objects_check").asBoolean()) rights |= LLRelationship::GRANT_MODIFY_OBJECTS; - const LLRelationship* buddy_relationship = - LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); bool allow_modify_objects = childGetValue("objects_check").asBoolean(); // if modify objects checkbox clicked @@ -304,9 +312,7 @@ void LLPanelAvatarNotes::resetControls() //Disable "Add Friend" button for friends. childSetEnabled("add_friend", TRUE); - childSetEnabled("status_check",FALSE); - childSetEnabled("map_check",FALSE); - childSetEnabled("objects_check",FALSE); + enableCheckboxes(false); } void LLPanelAvatarNotes::onAddFriendButtonClick() @@ -334,6 +340,13 @@ void LLPanelAvatarNotes::onShareButtonClick() //*TODO not implemented. } +void LLPanelAvatarNotes::enableCheckboxes(bool enable) +{ + childSetEnabled("status_check", enable); + childSetEnabled("map_check", enable); + childSetEnabled("objects_check", enable); +} + LLPanelAvatarNotes::~LLPanelAvatarNotes() { if(getAvatarId().notNull()) @@ -348,6 +361,9 @@ LLPanelAvatarNotes::~LLPanelAvatarNotes() void LLPanelAvatarNotes::changed(U32 mask) { childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId())); + + // update rights to avoid have checkboxes enabled when friendship is terminated. EXT-4947. + fillRightsData(); } // virtual @@ -483,6 +499,7 @@ BOOL LLPanelAvatarProfile::postBuild() LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this)); registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this)); + registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this)); registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this)); registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this)); registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this)); @@ -490,6 +507,8 @@ BOOL LLPanelAvatarProfile::postBuild() LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable; enable.add("Profile.EnableGod", boost::bind(&enable_god)); + enable.add("Profile.CheckItem", boost::bind(&LLPanelAvatarProfile::checkOverflowMenuItem, this, _2)); + enable.add("Profile.EnableItem", boost::bind(&LLPanelAvatarProfile::enableOverflowMenuItem, this, _2)); mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -666,6 +685,26 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data) childSetValue("acc_status_text", caption_text); } +bool LLPanelAvatarProfile::checkOverflowMenuItem(const LLSD& param) +{ + std::string item = param.asString(); + + if (item == "is_blocked") + return LLAvatarActions::isBlocked(getAvatarId()); + + return false; +} + +bool LLPanelAvatarProfile::enableOverflowMenuItem(const LLSD& param) +{ + std::string item = param.asString(); + + if (item == "can_block") + return LLAvatarActions::canBlock(getAvatarId()); + + return false; +} + void LLPanelAvatarProfile::pay() { LLAvatarActions::pay(getAvatarId()); @@ -676,6 +715,11 @@ void LLPanelAvatarProfile::share() LLAvatarActions::share(getAvatarId()); } +void LLPanelAvatarProfile::toggleBlock() +{ + LLAvatarActions::toggleBlock(getAvatarId()); +} + void LLPanelAvatarProfile::kick() { LLAvatarActions::kick(getAvatarId()); diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index ce59f1e93d..52b4255e34 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -192,12 +192,18 @@ protected: */ void share(); + /** + * Add/remove resident to/from your block list. + */ + void toggleBlock(); + void kick(); void freeze(); void unfreeze(); void csr(); - + bool checkOverflowMenuItem(const LLSD& param); + bool enableOverflowMenuItem(const LLSD& param); bool enableGod(); @@ -253,8 +259,8 @@ private: }; /** -* Panel for displaying Avatar's notes and modifying friend's rights. -*/ + * Panel for displaying Avatar's notes and modifying friend's rights. + */ class LLPanelAvatarNotes : public LLPanelProfileTab , public LLFriendObserver @@ -305,6 +311,7 @@ protected: void onCallButtonClick(); void onTeleportButtonClick(); void onShareButtonClick(); + void enableCheckboxes(bool enable); }; #endif // LL_LLPANELAVATAR_H diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 1e46827c1a..8ca044f72b 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -242,7 +242,7 @@ BOOL LLPanelClassified::postBuild() mNameEditor->setCommitOnFocusLost(TRUE); mNameEditor->setFocusReceivedCallback(boost::bind(focusReceived, _1, this)); mNameEditor->setCommitCallback(onCommitAny, this); - mNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII ); + mNameEditor->setPrevalidate( LLTextValidate::validateASCII ); mDescEditor = getChild<LLTextEditor>("desc_editor"); mDescEditor->setCommitOnFocusLost(TRUE); @@ -1072,7 +1072,7 @@ BOOL LLFloaterPriceForListing::postBuild() LLLineEditor* edit = getChild<LLLineEditor>("price_edit"); if (edit) { - edit->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32); + edit->setPrevalidate(LLTextValidate::validateNonNegativeS32); std::string min_price = llformat("%d", MINIMUM_PRICE_FOR_LISTING); edit->setText(min_price); edit->selectAll(); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 51fc670d87..3b303eed0f 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -214,7 +214,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group) } mFounderName = panel_group->getChild<LLNameBox>("founder_name"); mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); - mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII ); + mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII ); } // static diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index ff1e43b526..cbd6f64a48 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -81,11 +81,15 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E void LLPanelChatControlPanel::updateCallButton() { - // hide/show call button bool voice_enabled = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking(); LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId); - if (!session) return; + + if (!session) + { + childSetEnabled("call_btn", false); + return; + } bool session_initialized = session->mSessionInitialized; bool callback_enabled = session->mCallBackEnabled; @@ -280,8 +284,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/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 47feef496a..7c1b0f6234 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -171,8 +171,6 @@ BOOL LLLandmarksPanel::postBuild() initLandmarksInventoryPanel(); initMyInventoryPanel(); initLibraryInventoryPanel(); - getChild<LLAccordionCtrlTab>("tab_favorites")->setDisplayChildren(true); - getChild<LLAccordionCtrlTab>("tab_landmarks")->setDisplayChildren(true); return TRUE; } @@ -462,7 +460,7 @@ void LLLandmarksPanel::initFavoritesInventoryPanel() initLandmarksPanel(mFavoritesInventoryPanel); mFavoritesInventoryPanel->getFilter()->setEmptyLookupMessage("FavoritesNoMatchingItems"); - initAccordion("tab_favorites", mFavoritesInventoryPanel); + initAccordion("tab_favorites", mFavoritesInventoryPanel, true); } void LLLandmarksPanel::initLandmarksInventoryPanel() @@ -481,7 +479,7 @@ void LLLandmarksPanel::initLandmarksInventoryPanel() // subscribe to have auto-rename functionality while creating New Folder mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2)); - initAccordion("tab_landmarks", mLandmarksInventoryPanel); + initAccordion("tab_landmarks", mLandmarksInventoryPanel, true); } void LLLandmarksPanel::initMyInventoryPanel() @@ -490,7 +488,7 @@ void LLLandmarksPanel::initMyInventoryPanel() initLandmarksPanel(mMyInventoryPanel); - initAccordion("tab_inventory", mMyInventoryPanel); + initAccordion("tab_inventory", mMyInventoryPanel, false); } void LLLandmarksPanel::initLibraryInventoryPanel() @@ -499,7 +497,15 @@ void LLLandmarksPanel::initLibraryInventoryPanel() initLandmarksPanel(mLibraryInventoryPanel); - initAccordion("tab_library", mLibraryInventoryPanel); + // We want to fetch only "Landmarks" category from the library. + const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true); + if (landmarks_cat.notNull()) + { + gInventory.startBackgroundFetch(landmarks_cat); + } + + // Expanding "Library" tab for new users who have no landmarks in "My Inventory". + initAccordion("tab_library", mLibraryInventoryPanel, true); } void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list) @@ -526,14 +532,14 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list inventory_list->saveFolderState(); } -void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list) +void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab) { LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name); mAccordionTabs.push_back(accordion_tab); accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list)); - accordion_tab->setDisplayChildren(false); + accordion_tab->setDisplayChildren(expand_tab); } void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list) diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 96b790844c..cbbd10ac26 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -110,7 +110,7 @@ private: void initMyInventoryPanel(); void initLibraryInventoryPanel(); void initLandmarksPanel(LLPlacesInventoryPanel* inventory_list); - void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list); + void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab); void onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list); void deselectOtherThan(const LLPlacesInventoryPanel* inventory_list); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index af9e791223..43f4024bac 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -213,8 +213,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, } #if !USE_VIEWER_AUTH - childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); - childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace); + childSetPrevalidate("first_name_edit", LLTextValidate::validateASCIIPrintableNoSpace); + childSetPrevalidate("last_name_edit", LLTextValidate::validateASCIIPrintableNoSpace); childSetCommitCallback("password_edit", mungePassword, this); getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); @@ -675,8 +675,7 @@ void LLPanelLogin::refreshLocation( bool force_visible ) { // Don't show on first run after install // Otherwise ShowStartLocation defaults to true. - show_start = gSavedSettings.getBOOL("ShowStartLocation") - && !gSavedSettings.getBOOL("FirstRunThisInstall"); + show_start = gSavedSettings.getBOOL("ShowStartLocation"); } sInstance->childSetVisible("start_location_combo", show_start); @@ -846,8 +845,7 @@ void LLPanelLogin::loadLoginPage() { oStr << "&auto_login=TRUE"; } - if (gSavedSettings.getBOOL("ShowStartLocation") - && !gSavedSettings.getBOOL("FirstRunThisInstall")) + if (gSavedSettings.getBOOL("ShowStartLocation")) { oStr << "&show_start_location=TRUE"; } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index a5a61f0c7b..1895993a8e 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1071,7 +1071,11 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) { const LLUUID &item_id = (*iter); LLFolderViewItem *item = folder->getItemByID(item_id); - can_delete &= item->getListener()->isItemRemovable(); + const LLFolderViewEventListener *listener = item->getListener(); + llassert(listener); + if (!listener) return FALSE; + can_delete &= listener->isItemRemovable(); + can_delete &= !listener->isItemInTrash(); } return can_delete; } diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 0f0fb4b94e..a68552a91e 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -69,6 +69,20 @@ BOOL LLPanelMe::postBuild() void LLPanelMe::onOpen(const LLSD& key) { LLPanelProfile::onOpen(key); + + if(key.isUndefined() || key.has("edit_my_profile")) + { + // Open Edit My Profile panel by default (through Side Tray -> My Profile) (EXT-4823) + buildEditPanel(); + openPanel(mEditPanel, getAvatarId()); + } + else if(mEditPanel) + { + // When opening Me Panel through Side Tray LLPanelMe::onOpen() is called twice. + // First time key can be undefined and second time - key may contain some data. + // Lets close Edit Panel if key does contain some data on second call. + closePanel(mEditPanel); + } } bool LLPanelMe::notifyChildren(const LLSD& info) @@ -198,6 +212,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/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index f574f55beb..f601a8d51c 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -250,18 +250,18 @@ bool LLPanelMediaSettingsGeneral::isMultiple() //////////////////////////////////////////////////////////////////////////////// // static -void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings ,bool editable) +void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& _media_settings, bool editable) { LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata; self->mMediaEditable = editable; + LLSD media_settings = _media_settings; + if ( LLPanelMediaSettingsGeneral::isMultiple() ) { - self->clearValues(self, self->mMediaEditable); - // only show multiple - self->mHomeURL->setText(LLTrans::getString("Multiple Media")); - self->mCurrentURL->setText(LLTrans::getString("Multiple Media")); - return; + // *HACK: "edit" the incoming media_settings + media_settings[LLMediaEntry::CURRENT_URL_KEY] = LLTrans::getString("Multiple Media"); + media_settings[LLMediaEntry::HOME_URL_KEY] = LLTrans::getString("Multiple Media"); } std::string base_key( "" ); @@ -286,7 +286,7 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_ { LLMediaEntry::WIDTH_PIXELS_KEY, self->mWidthPixels, "LLSpinCtrl" }, { "", NULL , "" } }; - + for( int i = 0; data_set[ i ].key_name.length() > 0; ++i ) { base_key = std::string( data_set[ i ].key_name ); @@ -405,20 +405,21 @@ void LLPanelMediaSettingsGeneral::preApply() //////////////////////////////////////////////////////////////////////////////// // -void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in ) +void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in, bool include_tentative ) { - fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue(); - fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue(); - fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue(); - fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue(); + if (include_tentative || !mAutoLoop->getTentative()) fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue(); + if (include_tentative || !mAutoPlay->getTentative()) fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue(); + if (include_tentative || !mAutoScale->getTentative()) fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue(); + if (include_tentative || !mAutoZoom->getTentative()) fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue(); //Don't fill in current URL: this is only supposed to get changed via navigate - // fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue(); - fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue(); + // if (include_tentative || !mCurrentURL->getTentative()) fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue(); + if (include_tentative || !mHeightPixels->getTentative()) fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue(); // Don't fill in the home URL if it is the special "Multiple Media" string! - if (LLTrans::getString("Multiple Media") != mHomeURL->getValue()) - fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue(); - fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue(); - fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue(); + if ((include_tentative || !mHomeURL->getTentative()) + && LLTrans::getString("Multiple Media") != mHomeURL->getValue()) + fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue(); + if (include_tentative || !mFirstClick->getTentative()) fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue(); + if (include_tentative || !mWidthPixels->getTentative()) fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue(); } //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h index 5f90321362..a3f0990f35 100644 --- a/indra/newview/llpanelmediasettingsgeneral.h +++ b/indra/newview/llpanelmediasettingsgeneral.h @@ -54,7 +54,8 @@ public: // Hook that the floater calls before applying changes from the panel void preApply(); // Function that asks the panel to fill in values associated with the panel - void getValues(LLSD &fill_me_in); + // 'include_tentative' means fill in tentative values as well, otherwise do not + void getValues(LLSD &fill_me_in, bool include_tentative = true); // Hook that the floater calls after applying changes to the panel void postApply(); diff --git a/indra/newview/llpanelmediasettingspermissions.cpp b/indra/newview/llpanelmediasettingspermissions.cpp index a23aed2e98..e5caaaaffc 100644 --- a/indra/newview/llpanelmediasettingspermissions.cpp +++ b/indra/newview/llpanelmediasettingspermissions.cpp @@ -149,27 +149,6 @@ void LLPanelMediaSettingsPermissions::clearValues( void* userdata, bool editable void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& media_settings , bool editable) { LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata; - - if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo ) - { - if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) - { - self->clearValues(self, editable); - // only show multiple - return; - } - - } - else - { - if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) - { - self->clearValues(self, editable); - // only show multiple - return; - } - - } std::string base_key( "" ); std::string tentative_key( "" ); @@ -215,7 +194,29 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() ); }; }; - + + // *NOTE: If any of a particular flavor is tentative, we have to disable + // them all because of an architectural issue: namely that we represent + // these as a bit field, and we can't selectively apply only one bit to all selected + // faces if they don't match. Also see the *NOTE below. + if ( self->mPermsOwnerInteract->getTentative() || + self->mPermsGroupInteract->getTentative() || + self->mPermsWorldInteract->getTentative()) + { + self->mPermsOwnerInteract->setEnabled(false); + self->mPermsGroupInteract->setEnabled(false); + self->mPermsWorldInteract->setEnabled(false); + } + if ( self->mPermsOwnerControl->getTentative() || + self->mPermsGroupControl->getTentative() || + self->mPermsWorldControl->getTentative()) + { + self->mPermsOwnerControl->setEnabled(false); + self->mPermsGroupControl->setEnabled(false); + self->mPermsWorldControl->setEnabled(false); + } + + self->childSetEnabled("media_perms_label_owner", editable ); self->childSetText("media_perms_label_owner", LLTrans::getString("Media Perms Owner") ); self->childSetEnabled("media_perms_label_group", editable ); @@ -233,29 +234,47 @@ void LLPanelMediaSettingsPermissions::preApply() //////////////////////////////////////////////////////////////////////////////// // -void LLPanelMediaSettingsPermissions::getValues( LLSD &fill_me_in ) +void LLPanelMediaSettingsPermissions::getValues( LLSD &fill_me_in, bool include_tentative ) { // moved over from the 'General settings' tab - fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex(); - - // *NOTE: For some reason, gcc does not like these symbol references in the - // expressions below (inside the static_casts). I have NO idea why :(. - // For some reason, assigning them to const temp vars here fixes the link - // error. Bizarre. - const U8 none = LLMediaEntry::PERM_NONE; - const U8 owner = LLMediaEntry::PERM_OWNER; - const U8 group = LLMediaEntry::PERM_GROUP; - const U8 anyone = LLMediaEntry::PERM_ANYONE; - const LLSD::Integer control = static_cast<LLSD::Integer>( + if (include_tentative || !mControls->getTentative()) fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex(); + + // *NOTE: For some reason, gcc does not like these symbol references in the + // expressions below (inside the static_casts). I have NO idea why :(. + // For some reason, assigning them to const temp vars here fixes the link + // error. Bizarre. + const U8 none = LLMediaEntry::PERM_NONE; + const U8 owner = LLMediaEntry::PERM_OWNER; + const U8 group = LLMediaEntry::PERM_GROUP; + const U8 anyone = LLMediaEntry::PERM_ANYONE; + const LLSD::Integer control = static_cast<LLSD::Integer>( (mPermsOwnerControl->getValue() ? owner : none ) | (mPermsGroupControl->getValue() ? group: none ) | (mPermsWorldControl->getValue() ? anyone : none )); - const LLSD::Integer interact = static_cast<LLSD::Integer>( - (mPermsOwnerInteract->getValue() ? owner: none ) | + const LLSD::Integer interact = static_cast<LLSD::Integer>( + (mPermsOwnerInteract->getValue() ? owner: none ) | (mPermsGroupInteract->getValue() ? group : none ) | (mPermsWorldInteract->getValue() ? anyone : none )); - fill_me_in[LLMediaEntry::PERMS_CONTROL_KEY] = control; - fill_me_in[LLMediaEntry::PERMS_INTERACT_KEY] = interact; + + // *TODO: This will fill in the values of all permissions values, even if + // one or more is tentative. This is not quite the user expectation...what + // it should do is only change the bit that was made "untentative", but in + // a multiple-selection situation, this isn't possible given the architecture + // for how settings are applied. + if (include_tentative || + !mPermsOwnerControl->getTentative() || + !mPermsGroupControl->getTentative() || + !mPermsWorldControl->getTentative()) + { + fill_me_in[LLMediaEntry::PERMS_CONTROL_KEY] = control; + } + if (include_tentative || + !mPermsOwnerInteract->getTentative() || + !mPermsGroupInteract->getTentative() || + !mPermsWorldInteract->getTentative()) + { + fill_me_in[LLMediaEntry::PERMS_INTERACT_KEY] = interact; + } } diff --git a/indra/newview/llpanelmediasettingspermissions.h b/indra/newview/llpanelmediasettingspermissions.h index bd0c3b8ab5..858544605c 100644 --- a/indra/newview/llpanelmediasettingspermissions.h +++ b/indra/newview/llpanelmediasettingspermissions.h @@ -57,7 +57,8 @@ public: // Hook that the floater calls before applying changes from the panel void preApply(); // Function that asks the panel to fill in values associated with the panel - void getValues(LLSD &fill_me_in); + // 'include_tentative' means fill in tentative values as well, otherwise do not + void getValues(LLSD &fill_me_in, bool include_tentative = true); // Hook that the floater calls after applying changes to the panel void postApply(); diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index 81842e3851..1b1346c41a 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -94,27 +94,6 @@ void LLPanelMediaSettingsSecurity::draw() void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable) { LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; - - if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo ) - { - if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) - { - self->clearValues(self, editable); - // only show multiple - return; - } - - } - else - { - if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) - { - self->clearValues(self, editable); - // only show multiple - return; - } - - } std::string base_key( "" ); std::string tentative_key( "" ); @@ -136,6 +115,8 @@ void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media base_key = std::string( data_set[ i ].key_name ); tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ); + bool enabled_overridden = false; + // TODO: CP - I bet there is a better way to do this using Boost if ( media_settings[ base_key ].isDefined() ) { @@ -150,20 +131,31 @@ void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media // get control LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr ); list->deleteAllItems(); - + // points to list of white list URLs LLSD url_list = media_settings[ base_key ]; - - // iterate over them and add to scroll list - LLSD::array_iterator iter = url_list.beginArray(); - while( iter != url_list.endArray() ) + + // better be the whitelist + llassert(data_set[ i ].ctrl_ptr == self->mWhiteListList); + + // If tentative, don't add entries + if (media_settings[ tentative_key ].asBoolean()) { - std::string entry = *iter; - self->addWhiteListEntry( entry ); - ++iter; - }; + self->mWhiteListList->setEnabled(false); + enabled_overridden = true; + } + else { + // iterate over them and add to scroll list + LLSD::array_iterator iter = url_list.beginArray(); + while( iter != url_list.endArray() ) + { + std::string entry = *iter; + self->addWhiteListEntry( entry ); + ++iter; + } + } }; - data_set[ i ].ctrl_ptr->setEnabled(editable); + if ( ! enabled_overridden) data_set[ i ].ctrl_ptr->setEnabled(editable); data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() ); }; }; @@ -192,25 +184,29 @@ void LLPanelMediaSettingsSecurity::preApply() //////////////////////////////////////////////////////////////////////////////// // -void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) +void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in, bool include_tentative ) { - fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue(); - - // iterate over white list and extract items - std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData(); - std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin(); - - // *NOTE: need actually set the key to be an emptyArray(), or the merge - // we do with this LLSD will think there's nothing to change. - fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); - while( iter != whitelist_items.end() ) - { - LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN ); - std::string whitelist_url = cell->getValue().asString(); - - fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( whitelist_url ); - ++iter; - }; + if (include_tentative || !mEnableWhiteList->getTentative()) + fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue(); + + if (include_tentative || !mWhiteListList->getTentative()) + { + // iterate over white list and extract items + std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData(); + std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin(); + + // *NOTE: need actually set the key to be an emptyArray(), or the merge + // we do with this LLSD will think there's nothing to change. + fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); + while( iter != whitelist_items.end() ) + { + LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN ); + std::string whitelist_url = cell->getValue().asString(); + + fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( whitelist_url ); + ++iter; + }; + } } //////////////////////////////////////////////////////////////////////////////// @@ -247,6 +243,10 @@ const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& // white list list box widget and build a list to test against. bool LLPanelMediaSettingsSecurity::urlPassesWhiteList( const std::string& test_url ) { + // If the whitlelist list is tentative, it means we have multiple settings. + // In that case, we have no choice but to return true + if ( mWhiteListList->getTentative() ) return true; + // the checkUrlAgainstWhitelist(..) function works on a vector // of strings for the white list entries - in this panel, the white list // is stored in the widgets themselves so we need to build something compatible. @@ -330,7 +330,7 @@ void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry ) // always add in the entry itself row[ "columns" ][ ENTRY_COLUMN ][ "type" ] = "text"; row[ "columns" ][ ENTRY_COLUMN ][ "value" ] = entry; - + // add to the white list scroll box mWhiteListList->addElement( row ); }; diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h index 66ccb23f46..94f2fdc89c 100644 --- a/indra/newview/llpanelmediasettingssecurity.h +++ b/indra/newview/llpanelmediasettingssecurity.h @@ -53,11 +53,12 @@ public: // Hook that the floater calls before applying changes from the panel void preApply(); // Function that asks the panel to fill in values associated with the panel - void getValues(LLSD &fill_me_in); + // 'include_tentative' means fill in tentative values as well, otherwise do not + void getValues(LLSD &fill_me_in, bool include_tentative = true); // Hook that the floater calls after applying changes to the panel void postApply(); - static void initValues( void* userdata, const LLSD& media_settings,bool editable ); + static void initValues( void* userdata, const LLSD& media_settings, bool editable); static void clearValues( void* userdata, bool editable); void addWhiteListEntry( const std::string& url ); void setParent( LLFloaterMediaSettings* parent ); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 5c5c35141e..e8ae006968 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -117,7 +117,7 @@ public: virtual BOOL isItemRenameable() const; virtual BOOL renameItem(const std::string& new_name); virtual BOOL isItemMovable() const; - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual BOOL removeItem(); virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); virtual void move(LLFolderViewEventListener* parent_listener); @@ -412,9 +412,9 @@ BOOL LLTaskInvFVBridge::isItemMovable() const return TRUE; } -BOOL LLTaskInvFVBridge::isItemRemovable() +BOOL LLTaskInvFVBridge::isItemRemovable() const { - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); if(object && (object->permModify() || object->permYouOwner())) { @@ -710,7 +710,7 @@ public: virtual BOOL isItemRenameable() const; // virtual BOOL isItemCopyable() const { return FALSE; } virtual BOOL renameItem(const std::string& new_name); - virtual BOOL isItemRemovable(); + virtual BOOL isItemRemovable() const; virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual BOOL hasChildren() const; virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; @@ -742,7 +742,7 @@ BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name) return FALSE; } -BOOL LLTaskCategoryBridge::isItemRemovable() +BOOL LLTaskCategoryBridge::isItemRemovable() const { return FALSE; } diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index cf903958ee..c2f2d32142 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -159,6 +159,27 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key) // Make sure we know which tab is selected, update the filter, // and update verbs. onTabChange(); + + // Auto open the first outfit newly created so new users can see sample outfit contents + static bool should_open_outfit = true; + if (should_open_outfit && gAgent.isFirstLogin()) + { + LLInventoryPanel* outfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME); + if (outfits_panel) + { + LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + LLFolderViewFolder* my_outfits_folder = outfits_panel->getRootFolder()->getFolderByID(my_outfits_id); + if (my_outfits_folder) + { + LLFolderViewFolder* first_outfit = dynamic_cast<LLFolderViewFolder*>(my_outfits_folder->getFirstChild()); + if (first_outfit) + { + first_outfit->setOpen(TRUE); + } + } + } + } + should_open_outfit = false; } void LLPanelOutfitsInventory::updateVerbs() 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/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 470cfca8fe..7e184c78a8 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -164,11 +164,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata) if (item == std::string("can_block")) { const LLUUID& id = mUUIDs.front(); - std::string firstname, lastname; - gCacheName->getName(id, firstname, lastname); - bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden"); - bool is_self = id == gAgentID; - return !is_self && !is_linden; + return LLAvatarActions::canBlock(id); } else if (item == std::string("can_add")) { diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 8b8b1bed37..01b6e8ffad 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -142,9 +142,9 @@ LLPanelPermissions::LLPanelPermissions() : BOOL LLPanelPermissions::postBuild() { childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this); - childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe); childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this); - childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this)); diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index c73ade53c8..b5d85dfd4b 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -197,11 +197,7 @@ void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key) } else { - panel->setVisible(FALSE); - if (panel->getParent() == this) - { - removeChild(panel); - } + closePanel(panel); getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId()); } @@ -248,6 +244,16 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params) panel->setRect(new_rect); } +void LLPanelProfile::closePanel(LLPanel* panel) +{ + panel->setVisible(FALSE); + + if (panel->getParent() == this) + { + removeChild(panel); + } +} + S32 LLPanelProfile::notifyParent(const LLSD& info) { std::string action = info["action"]; diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index bcf4bdd0ec..f1aa3f10f8 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -55,6 +55,8 @@ public: virtual void openPanel(LLPanel* panel, const LLSD& params); + virtual void closePanel(LLPanel* panel); + S32 notifyParent(const LLSD& info); protected: 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/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index ad47e351ee..1c4004c37a 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -584,7 +584,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& { std::string item = userdata.asString(); if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item - || "can_pay" == item || "can_add" == item) + || "can_pay" == item) { return mUUIDs.front() != gAgentID; } @@ -619,7 +619,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& for (;id != uuids_end; ++id) { - if ( LLAvatarActions::isFriend(*id) ) + if ( *id == gAgentID || LLAvatarActions::isFriend(*id) ) { result = false; break; diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index 83443687c9..4fe69f295c 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -66,7 +66,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) std::vector<std::string> items; std::vector<std::string> disabled_items; - if(isInTrash()) + if(isItemInTrash()) { items.push_back(std::string("Purge Item")); if (!isItemRemovable()) diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp index 8edeebaeeb..6c6eb7c719 100644 --- a/indra/newview/llplacesinventorypanel.cpp +++ b/indra/newview/llplacesinventorypanel.cpp @@ -174,6 +174,15 @@ S32 LLPlacesInventoryPanel::notify(const LLSD& info) // PUBLIC METHODS ////////////////////////////////////////////////////////////////////////// +LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p) +: LLFolderView(p) +{ + // we do not need auto select functionality in places landmarks, so override default behavior. + // this disables applying of the LLSelectFirstFilteredItem in LLFolderView::doIdle. + // Fixed issues: EXT-1631, EXT-4994. + mAutoSelectOverride = TRUE; +} + BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask) { // let children to change selection first diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h index 86937e7c7f..04c6758eae 100644 --- a/indra/newview/llplacesinventorypanel.h +++ b/indra/newview/llplacesinventorypanel.h @@ -67,7 +67,7 @@ private: class LLPlacesFolderView : public LLFolderView { public: - LLPlacesFolderView(const LLFolderView::Params& p) : LLFolderView(p) {}; + LLPlacesFolderView(const LLFolderView::Params& p); /** * Handles right mouse down * diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 3b9f7f9882..551e247d8c 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -74,7 +74,7 @@ public: /*virtual*/ BOOL postBuild(); - void setObjectID(const LLUUID& object_id); + virtual void setObjectID(const LLUUID& object_id); void setItem( LLInventoryItem* item ); void setAssetId(const LLUUID& asset_id); diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index 92bd4dc62b..0cc747f789 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild() childSetAction("Anim audition btn",auditionAnim, this); childSetCommitCallback("desc", LLPreview::onText, this); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 53e351e66e..57a8ca3d12 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -472,7 +472,7 @@ BOOL LLPreviewGesture::postBuild() edit = getChild<LLLineEditor>("wait_time_editor"); edit->setEnabled(FALSE); edit->setVisible(FALSE); - edit->setPrevalidate(LLLineEditor::prevalidateFloat); + edit->setPrevalidate(LLTextValidate::validateFloat); // edit->setKeystrokeCallback(onKeystrokeCommit, this); edit->setCommitOnFocusLost(TRUE); edit->setCommitCallback(onCommitWaitTime, this); @@ -504,10 +504,10 @@ BOOL LLPreviewGesture::postBuild() if (item) { childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); childSetText("name", item->getName()); - childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("name", &LLTextValidate::validateASCIIPrintableNoPipe); } return LLPreview::postBuild(); diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index cc70360528..ee8e3f1db6 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -95,7 +95,7 @@ BOOL LLPreviewNotecard::postBuild() childSetCommitCallback("desc", LLPreview::onText, this); if (item) childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 7bcbe334ff..a8feaf690d 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -955,7 +955,7 @@ BOOL LLPreviewLSL::postBuild() childSetCommitCallback("desc", LLPreview::onText, this); childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index d7fd252fb6..44b828854b 100644 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -75,7 +75,7 @@ BOOL LLPreviewSound::postBuild() button->setSoundFlags(LLView::SILENT); childSetCommitCallback("desc", LLPreview::onText, this); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); return LLPreview::postBuild(); } diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 028807a6bd..0ed6bea74f 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -74,22 +74,10 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mLastHeight(0), mLastWidth(0), mAspectRatio(0.f), - mPreviewToSave(FALSE) + mPreviewToSave(FALSE), + mImage(NULL) { - const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); - if(item) - { - mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); - mImageID = item->getAssetUUID(); - mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); - } - else // not an item, assume it's an asset id - { - mImageID = mItemUUID; - mCopyToInv = TRUE; - mIsCopyable = TRUE; - } - + updateImageID(); if (key.has("save_as")) { mPreviewToSave = TRUE; @@ -97,7 +85,6 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_texture.xml", FALSE); } - LLPreviewTexture::~LLPreviewTexture() { if( mLoadingFullImage ) @@ -139,7 +126,7 @@ BOOL LLPreviewTexture::postBuild() { childSetCommitCallback("desc", LLPreview::onText, this); childSetText("desc", item->getDescription()); - childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe); } } @@ -493,3 +480,42 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() } return mAssetStatus; } + +void LLPreviewTexture::updateImageID() +{ + const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); + if(item) + { + mImageID = item->getAssetUUID(); + mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); + mCopyToInv = FALSE; + mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); + } + else // not an item, assume it's an asset id + { + mImageID = mItemUUID; + mShowKeepDiscard = FALSE; + mCopyToInv = TRUE; + mIsCopyable = TRUE; + } + +} + +/* virtual */ +void LLPreviewTexture::setObjectID(const LLUUID& object_id) +{ + mObjectUUID = object_id; + + const LLUUID old_image_id = mImageID; + + // Update what image we're pointing to, such as if we just specified the mObjectID + // that this mItemID is part of. + updateImageID(); + + // If the imageID has changed, start over and reload the new image. + if (mImageID != old_image_id) + { + mAssetStatus = PREVIEW_ASSET_UNLOADED; + loadAsset(); + } +} diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 980aecee6d..7cd2adad56 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -69,6 +69,8 @@ public: void openToSave(); static void onSaveAsBtn(void* data); + + /*virtual*/ void setObjectID(const LLUUID& object_id); protected: void init(); /* virtual */ BOOL postBuild(); @@ -76,6 +78,7 @@ protected: static void onAspectRatioCommit(LLUICtrl*,void* userdata); private: + void updateImageID(); // set what image is being uploaded. void updateDimensions(); LLUUID mImageID; LLPointer<LLViewerFetchedTexture> mImage; diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 8f36c0e88a..7c2e7e3319 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -533,9 +533,13 @@ void LLScreenChannel::showToastsBottom() // HACK // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts (*it).toast->setVisible(TRUE); - // Show toast behind floaters. (EXT-3089) - gFloaterView->sendChildToBack((*it).toast); } + if(!(*it).toast->hasFocus()) + { + // Fixing Z-order of toasts (EXT-4862) + // Next toast will be positioned under this one. + gFloaterView->sendChildToBack((*it).toast); + } } if(it != mToastList.rend()) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index bf08756051..9540894646 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -41,6 +41,7 @@ #include "lldbstrings.h" #include "lleconomy.h" #include "llgl.h" +#include "llmediaentry.h" #include "llrender.h" #include "llnotifications.h" #include "llpermissions.h" @@ -1739,70 +1740,70 @@ void LLSelectMgr::selectionSetFullbright(U8 fullbright) getSelection()->applyToObjects(&sendfunc); } -void LLSelectMgr::selectionSetMedia(U8 media_type) -{ - - struct f : public LLSelectedTEFunctor - { - U8 mMediaFlags; - f(const U8& t) : mMediaFlags(t) {} - bool apply(LLViewerObject* object, S32 te) - { - if (object->permModify()) - { - // update viewer has media - object->setTEMediaFlags(te, mMediaFlags); - } - return true; - } - } setfunc(media_type); - getSelection()->applyToTEs(&setfunc); - struct f2 : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - if (object->permModify()) - { - object->sendTEUpdate(); - } - return true; - } - } func2; - mSelectedObjects->applyToObjects( &func2 ); -} - // This function expects media_data to be a map containing relevant // media data name/value pairs (e.g. home_url, etc.) -void LLSelectMgr::selectionSetMediaData(const LLSD &media_data) -{ - +void LLSelectMgr::selectionSetMedia(U8 media_type, const LLSD &media_data) +{ struct f : public LLSelectedTEFunctor { + U8 mMediaFlags; const LLSD &mMediaData; - f(const LLSD& t) : mMediaData(t) {} + f(const U8& t, const LLSD& d) : mMediaFlags(t), mMediaData(d) {} bool apply(LLViewerObject* object, S32 te) { if (object->permModify()) { - LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object); - if (NULL != vo) - { - vo->syncMediaData(te, mMediaData, true/*merge*/, true/*ignore_agent*/); - } + // If we are adding media, then check the current state of the + // media data on this face. + // - If it does not have media, AND we are NOT setting the HOME URL, then do NOT add media to this + // face. + // - If it does not have media, and we ARE setting the HOME URL, add media to this face. + // - If it does already have media, add/update media to/on this face + // If we are removing media, just do it (ignore the passed-in LLSD). + if (mMediaFlags & LLTextureEntry::MF_HAS_MEDIA) + { + llassert(mMediaData.isMap()); + const LLTextureEntry *texture_entry = object->getTE(te); + if (!mMediaData.isMap() || + (NULL != texture_entry) && !texture_entry->hasMedia() && !mMediaData.has(LLMediaEntry::HOME_URL_KEY)) + { + // skip adding/updating media + } + else { + // Add/update media + object->setTEMediaFlags(te, mMediaFlags); + LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object); + llassert(NULL != vo); + if (NULL != vo) + { + vo->syncMediaData(te, mMediaData, true/*merge*/, true/*ignore_agent*/); + } + } + } + else + { + // delete media (or just set the flags) + object->setTEMediaFlags(te, mMediaFlags); + } } return true; } - } setfunc(media_data); + } setfunc(media_type, media_data); getSelection()->applyToTEs(&setfunc); - + struct f2 : public LLSelectedObjectFunctor { virtual bool apply(LLViewerObject* object) { if (object->permModify()) { - LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object); - if (NULL != vo) + object->sendTEUpdate(); + LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object); + llassert(NULL != vo); + // It's okay to skip this object if hasMedia() is false... + // the sendTEUpdate() above would remove all media data if it were + // there. + if (NULL != vo && vo->hasMedia()) { // Send updated media data FOR THE ENTIRE OBJECT vo->sendMediaDataUpdate(); @@ -1811,11 +1812,9 @@ void LLSelectMgr::selectionSetMediaData(const LLSD &media_data) return true; } } func2; - getSelection()->applyToObjects(&func2); + mSelectedObjects->applyToObjects( &func2 ); } - - void LLSelectMgr::selectionSetGlow(F32 glow) { struct f1 : public LLSelectedTEFunctor diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index f8ecfd0674..00474827ca 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -502,8 +502,7 @@ public: void selectionSetTexGen( U8 texgen ); void selectionSetShiny( U8 shiny ); void selectionSetFullbright( U8 fullbright ); - void selectionSetMedia( U8 media_type ); - void selectionSetMediaData(const LLSD &media_data); // NOTE: modifies media_data!!! + void selectionSetMedia( U8 media_type, const LLSD &media_data ); void selectionSetClickAction(U8 action); void selectionSetIncludeInSearch(bool include_in_search); void selectionSetGlow(const F32 glow); 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/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 94fe95d215..44348ba429 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -109,9 +109,9 @@ BOOL LLSidepanelItemInfo::postBuild() { LLSidepanelInventorySubpanel::postBuild(); - childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); - childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); // Creator information getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this)); diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 0b8f66c5f3..0630981d7e 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -104,9 +104,9 @@ BOOL LLSidepanelTaskInfo::postBuild() mLabelGroupName = getChild<LLNameBox>("Group Name Proxy"); childSetCommitCallback("Object Name", LLSidepanelTaskInfo::onCommitName,this); - childSetPrevalidate("Object Name", LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Name", LLTextValidate::validateASCIIPrintableNoPipe); childSetCommitCallback("Object Description", LLSidepanelTaskInfo::onCommitDesc,this); - childSetPrevalidate("Object Description", LLLineEditor::prevalidateASCIIPrintableNoPipe); + childSetPrevalidate("Object Description", LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this)); childSetCommitCallback("checkbox share with group", &LLSidepanelTaskInfo::onCommitGroupShare,this); childSetAction("button deed", &LLSidepanelTaskInfo::onClickDeedToGroup,this); 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/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 8f2c877c7a..c5c311ed33 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -66,6 +66,16 @@ void LLSpeakButton::draw() mOutputMonitor->setIsMuted(!voiceenabled); LLUICtrl::draw(); } +void LLSpeakButton::setSpeakBtnEnabled(bool enabled) +{ + LLButton* speak_btn = getChild<LLButton>("speak_btn"); + speak_btn->setEnabled(enabled); +} +void LLSpeakButton::setFlyoutBtnEnabled(bool enabled) +{ + LLButton* show_btn = getChild<LLButton>("speak_flyout_btn"); + show_btn->setEnabled(enabled); +} LLSpeakButton::LLSpeakButton(const Params& p) : LLUICtrl(p) diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index 6660b50240..85c97f1a2c 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -61,6 +61,10 @@ public: /*virtual*/ ~LLSpeakButton(); /*virtual*/ void draw(); + + // methods for enabling/disabling right and left parts of speak button separately(EXT-4648) + void setSpeakBtnEnabled(bool enabled); + void setFlyoutBtnEnabled(bool enabled); // *HACK: Need to put tooltips in a translatable location, // the panel that contains this button. diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 6f9a1ccdbe..786fa24e65 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -205,7 +205,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id) } } -void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id) +void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, bool delete_it) { if (mActionTimersMap.size() == 0) return; @@ -213,7 +213,10 @@ void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id) if (it_speaker != mActionTimersMap.end()) { - delete it_speaker->second; + if (delete_it) + { + delete it_speaker->second; + } mActionTimersMap.erase(it_speaker); } } @@ -230,16 +233,15 @@ void LLSpeakersDelayActionsStorage::removeAllTimers() bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id) { - unsetActionTimer(speaker_id); + bool delete_it = false; // we're *in* this timer, return true to delete it, don't manually delete it + unsetActionTimer(speaker_id, delete_it); if (mActionCallback) { mActionCallback(speaker_id); } - // do not return true to avoid deleting of an timer twice: - // in LLSpeakersDelayActionsStorage::unsetActionTimer() & LLEventTimer::updateClass() - return false; + return true; } @@ -291,7 +293,8 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin } } - mSpeakerDelayRemover->unsetActionTimer(speakerp->mID); + bool delete_it = true; + mSpeakerDelayRemover->unsetActionTimer(speakerp->mID, delete_it); return speakerp; } diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index 63237204c8..ddc3632f07 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -176,11 +176,11 @@ public: void setActionTimer(const LLUUID& speaker_id); /** - * Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and deletes it. + * Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and optionally deletes it. * * @see onTimerActionCallback() */ - void unsetActionTimer(const LLUUID& speaker_id); + void unsetActionTimer(const LLUUID& speaker_id, bool delete_it); void removeAllTimers(); private: diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 522adc05ce..7f002db364 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -800,6 +800,9 @@ bool idle_startup() gLoginMenuBarView->setVisible( TRUE ); gLoginMenuBarView->setEnabled( TRUE ); + // Hide the splash screen + LLSplashScreen::hide(); + // Push our window frontmost gViewerWindow->getWindow()->show(); display_startup(); @@ -1700,6 +1703,10 @@ bool idle_startup() << " kbps" << LL_ENDL; gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f); } + + // Set the show start location to true, now that the user has logged + // on with this install. + gSavedSettings.setBOOL("ShowStartLocation", TRUE); } // We're successfully logged in. @@ -1859,21 +1866,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)) @@ -1893,6 +1885,17 @@ bool idle_startup() LLViewerShaderMgr::instance()->setShaders(); } } + + // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) + // then auto-populate outfits from the library into the My Outfits folder. + static bool check_populate_my_outfits = true; + if (check_populate_my_outfits && + (LLInventoryModel::getIsFirstTimeInViewer2() + || gSavedSettings.getBOOL("MyOutfitsAutofill"))) + { + gAgentWearables.populateMyOutfitsFolder(); + } + check_populate_my_outfits = false; return TRUE; } @@ -2536,6 +2539,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 +2562,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 +2573,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/lltoolplacer.h b/indra/newview/lltoolplacer.h index b7422380d4..df07f1854c 100644 --- a/indra/newview/lltoolplacer.h +++ b/indra/newview/lltoolplacer.h @@ -33,7 +33,6 @@ #ifndef LL_TOOLPLACER_H #define LL_TOOLPLACER_H -#include "llprimitive.h" #include "llpanel.h" #include "lltool.h" 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/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f7f30a5136..a83baf7f9a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -603,6 +603,10 @@ class LLAdvancedToggleHUDInfo : public view_listener_t { gDisplayFOV = !(gDisplayFOV); } + else if ("badge" == info_type) + { + gDisplayBadge = !(gDisplayBadge); + } return true; } }; @@ -625,6 +629,10 @@ class LLAdvancedCheckHUDInfo : public view_listener_t { new_value = gDisplayFOV; } + else if ("badge" == info_type) + { + new_value = gDisplayBadge; + } return new_value; } }; @@ -7179,25 +7187,7 @@ void handle_buy_currency_test(void*) LLStringUtil::format_map_t replace; replace["[AGENT_ID]"] = gAgent.getID().asString(); replace["[SESSION_ID]"] = gAgent.getSecureSessionID().asString(); - - // *TODO: Replace with call to LLUI::getLanguage() after windows-setup - // branch merges in. JC - std::string language = "en"; - language = gSavedSettings.getString("Language"); - if (language.empty() || language == "default") - { - language = gSavedSettings.getString("InstallLanguage"); - } - if (language.empty() || language == "default") - { - language = gSavedSettings.getString("SystemLanguage"); - } - if (language.empty() || language == "default") - { - language = "en"; - } - - replace["[LANGUAGE]"] = language; + replace["[LANGUAGE]"] = LLUI::getLanguage(); LLStringUtil::format(url, replace); llinfos << "buy currency url " << url << llendl; 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/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 886f1d9ef5..d0afa9d9de 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4019,9 +4019,14 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const { LLVector3 position_agent; LLQuaternion rot; + LLViewerObject* avatar_parent = NULL; LLViewerObject* root_edit = (LLViewerObject*)getRootEdit(); - LLViewerObject* avatar_parent = (LLViewerObject*)root_edit->getParent(); - if (avatar_parent && avatar_parent->isAvatar() && root_edit->mDrawable.notNull()) + if (root_edit) + { + avatar_parent = (LLViewerObject*)root_edit->getParent(); + } + + if (avatar_parent && avatar_parent->isAvatar() && root_edit && root_edit->mDrawable.notNull()) { LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent(); position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition(); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index cac233f694..07c8867e26 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/llviewervisualparam.h b/indra/newview/llviewervisualparam.h index 3550a46fbf..1a3975eb99 100644 --- a/indra/newview/llviewervisualparam.h +++ b/indra/newview/llviewervisualparam.h @@ -111,6 +111,7 @@ public: F32 getSimpleMax() const { return getInfo()->mSimpleMax; } BOOL getCrossWearable() const { return getInfo()->mCrossWearable; } + }; #endif // LL_LLViewerVisualParam_H diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index fdc6675db1..4a86e1ca41 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -233,6 +233,7 @@ S32 gDebugRaycastFaceHit; BOOL gDisplayWindInfo = FALSE; BOOL gDisplayCameraPos = FALSE; BOOL gDisplayFOV = FALSE; +BOOL gDisplayBadge = FALSE; S32 CHAT_BAR_HEIGHT = 28; S32 OVERLAY_BAR_HEIGHT = 20; @@ -422,6 +423,11 @@ public: addText(xpos, ypos, llformat("FOV: %2.1f deg", RAD_TO_DEG * LLViewerCamera::getInstance()->getView())); ypos += y_inc; } + if (gDisplayBadge) + { + addText(xpos, ypos+(y_inc/2), llformat("Hippos!", RAD_TO_DEG * LLViewerCamera::getInstance()->getView())); + ypos += y_inc * 2; + } /*if (LLViewerJoystick::getInstance()->getOverrideCamera()) { @@ -1720,7 +1726,11 @@ void LLViewerWindow::shutdownViews() // destroy the nav bar, not currently part of gViewerWindow // *TODO: Make LLNavigationBar part of gViewerWindow delete LLNavigationBar::getInstance(); - + + // destroy menus after instantiating navbar above, as it needs + // access to gMenuHolder + cleanup_menus(); + // Delete all child views. delete mRootView; mRootView = NULL; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 98d2958d9a..bfce65f2ba 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -506,5 +506,6 @@ extern S32 CHAT_BAR_HEIGHT; extern BOOL gDisplayCameraPos; extern BOOL gDisplayWindInfo; extern BOOL gDisplayFOV; +extern BOOL gDisplayBadge; #endif diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index a5815df20a..b5f0ec7176 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -565,7 +565,7 @@ public: void updateMeshData(); protected: void releaseMeshData(); - /*virtual*/ void restoreMeshData(); + virtual void restoreMeshData(); private: BOOL mDirtyMesh; BOOL mMeshTexturesDirty; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index ecd6b05ded..13e28b246a 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -510,8 +510,12 @@ BOOL LLVOAvatarSelf::buildMenus() LLVOAvatarSelf::~LLVOAvatarSelf() { - gAgent.setAvatarObject(NULL); - gAgentWearables.setAvatarObject(NULL); + // gAgents pointer might have been set to a different Avatar Self, don't get rid of it if so. + if (gAgent.getAvatarObject() == this) + { + gAgent.setAvatarObject(NULL); + gAgentWearables.setAvatarObject(NULL); + } delete mScreenp; mScreenp = NULL; } @@ -1966,6 +1970,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug) // Don't know if this is needed updateMeshTextures(); + } //----------------------------------------------------------------------------- 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..f3bfc2e86c 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -1107,16 +1107,17 @@ public: * Sets internal voluem level for specified user. * * @param[in] speaker_id - LLUUID of user to store volume level for - * @param[in] volume - internal volume level to be stored for user. + * @param[in] volume - external (vivox) volume level to be stored for user. */ - void storeSpeakerVolume(const LLUUID& speaker_id, S32 volume); + void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume); /** - * Gets stored internal volume level for specified speaker. + * Gets stored external (vivox) volume level for specified speaker and + * transforms it into internal (viewer) level. * * If specified user is not found default level will be returned. It is equivalent of * external level 0.5 from the 0.0..1.0 range. - * Default internal level is calculated as: internal = 400 * external^2 + * Internal level is calculated as: internal = 400 * external^2 * Maps 0.0 to 1.0 to internal values 0-400 with default 0.5 == 100 * * @param[in] speaker_id - LLUUID of user to get his volume level @@ -1133,7 +1134,7 @@ private: void load(); void save(); - typedef std::map<LLUUID, S32> speaker_data_map_t; + typedef std::map<LLUUID, F32> speaker_data_map_t; speaker_data_map_t mSpeakersData; }; @@ -1149,7 +1150,7 @@ LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage() save(); } -void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, S32 volume) +void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume) { mSpeakersData[speaker_id] = volume; } @@ -1163,7 +1164,10 @@ S32 LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id) if (it != mSpeakersData.end()) { - ret_val = it->second; + F32 f_val = it->second; + // volume can amplify by as much as 4x! + S32 ivol = (S32)(400.f * f_val * f_val); + ret_val = llclamp(ivol, 0, 400); } return ret_val; } @@ -1184,7 +1188,7 @@ void LLSpeakerVolumeStorage::load() for (LLSD::map_const_iterator iter = settings_llsd.beginMap(); iter != settings_llsd.endMap(); ++iter) { - mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (S32)iter->second.asInteger())); + mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal())); } } @@ -5980,8 +5984,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); } @@ -6286,14 +6292,14 @@ void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume) participantState *participant = findParticipantByID(id); if (participant) { + // store this volume setting for future sessions + LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume); + // volume can amplify by as much as 4x! S32 ivol = (S32)(400.f * volume * volume); participant->mUserVolume = llclamp(ivol, 0, 400); participant->mVolumeDirty = TRUE; mAudioSession->mVolumeDirty = TRUE; - - // store this volume setting for future sessions - LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, participant->mUserVolume); } } } 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/llwearable.cpp b/indra/newview/llwearable.cpp index d093031bea..acfbc23f62 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -625,7 +625,9 @@ void LLWearable::writeToAvatar() // Pull params for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() ) { - if( (((LLViewerVisualParam*)param)->getWearableType() == mType) ) + // cross-wearable parameters are not authoritative, as they are driven by a different wearable. So don't copy the values to the + // avatar object if cross wearable. Cross wearable params get their values from the avatar, they shouldn't write the other way. + if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (!((LLViewerVisualParam*)param)->getCrossWearable()) ) { S32 param_id = param->getID(); F32 weight = getVisualParamWeight(param_id); @@ -1085,6 +1087,26 @@ void LLWearable::destroyTextures() mSavedTEMap.clear(); } +void LLWearable::pullCrossWearableValues() +{ + // scan through all of the avatar's visual parameters + LLVOAvatar* avatar = gAgent.getAvatarObject(); + for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam(); + param; + param = (LLViewerVisualParam*) avatar->getNextVisualParam()) + { + if( param ) + { + LLDriverParam *driver_param = dynamic_cast<LLDriverParam*>(param); + if(driver_param) + { + // parameter is a driver parameter, have it update its + driver_param->updateCrossDrivenParams(getType()); + } + } + } +} + void LLWearable::setLabelUpdated() const { diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index dae983bcf3..7bd5305079 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -128,6 +128,7 @@ public: void revertValues(); void saveValues(); + void pullCrossWearableValues(); BOOL isOnTop() const; @@ -145,7 +146,7 @@ private: void createLayers(S32 te); void createVisualParams(); void syncImages(te_map_t &src, te_map_t &dst); - void destroyTextures(); + void destroyTextures(); static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml. S32 mDefinitionVersion; // Depends on the state of the avatar_lad.xml when this asset was created. diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 7866f735c5..100ec0bb69 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -145,11 +145,20 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, substitution["VERSION_PATCH"] = LLVersionInfo::getPatch(); substitution["VERSION_BUILD"] = LLVersionInfo::getBuild(); substitution["CHANNEL"] = LLVersionInfo::getChannel(); - substitution["LANGUAGE"] = LLUI::getLanguage(); substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel(); substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); substitution["SESSION_ID"] = gAgent.getSessionID(); + // work out the current language + std::string lang = LLUI::getLanguage(); + if (lang == "en-us") + { + // *HACK: the correct fix is to change English.lproj/language.txt, + // but we're late in the release cycle and this is a less risky fix + lang = "en"; + } + substitution["LANGUAGE"] = lang; + // find the region ID LLUUID region_id; LLViewerRegion *region = gAgent.getRegion(); @@ -159,14 +168,14 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, } substitution["REGION_ID"] = region_id; - // find the parcel ID - LLUUID parcel_id; + // find the parcel local ID + S32 parcel_id = 0; LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); if (parcel) { - parcel_id = parcel->getID(); + parcel_id = parcel->getLocalID(); } - substitution["PARCEL_ID"] = parcel_id; + substitution["PARCEL_ID"] = llformat("%d", parcel_id); // expand all of the substitution strings and escape the url std::string expanded_url = url; diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index ec196245a1..ca579616d8 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -290,7 +290,7 @@ reference="Black" /> <color name="ContextSilhouetteColor" - value="0.94 0.61 0 1" /> + reference="EmphasisColor" /> <color name="DefaultHighlightDark" reference="White_10" /> @@ -602,7 +602,7 @@ value="0.39 0.39 0.39 1" /> <color name="ScriptErrorColor" - value="Red" /> + reference="Red" /> <color name="ScrollBGStripeColor" reference="Transparent" /> diff --git a/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png Binary files differindex 6343ddf035..e8fe243dc7 100644 --- a/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png +++ b/indra/newview/skins/default/textures/bottomtray/Unread_Chiclet.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index ea66897b35..309c2a5f30 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -143,12 +143,12 @@ with the same filename but different name <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" /> - <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> + <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" /> <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" /> @@ -265,8 +265,8 @@ with the same filename but different name <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/> <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/> - <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" /> - <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" /> + <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" /> + <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" /> <texture name="Lock" file_name="icons/Lock.png" preload="false" /> <texture name="Lock2" file_name="navbar/Lock.png" preload="false" /> @@ -368,7 +368,7 @@ with the same filename but different name <texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" /> <texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" /> - <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" /> + <texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" /> <texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" /> <texture name="Parcel_Evry_Dark" file_name="icons/Parcel_Evry_Dark.png" preload="false" /> <texture name="Parcel_Exp_Dark" file_name="icons/Parcel_Exp_Dark.png" preload="false" /> @@ -376,6 +376,7 @@ with the same filename but different name <texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" /> <texture name="Parcel_ForSale_Dark" file_name="icons/Parcel_ForSale_Dark.png" preload="false" /> <texture name="Parcel_ForSaleNo_Dark" file_name="icons/Parcel_ForSaleNo_Dark.png" preload="false" /> + <texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" /> <texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" /> <texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" /> <texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml index cb5d618dde..b4af427538 100644 --- a/indra/newview/skins/default/xui/da/floater_about_land.xml +++ b/indra/newview/skins/default/xui/da/floater_about_land.xml @@ -1,7 +1,59 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floaterland" title="OM LAND"> + <floater.string name="Minutes"> + [MINUTES] minutter + </floater.string> + <floater.string name="Minute"> + minut + </floater.string> + <floater.string name="Seconds"> + [SECONDS] sekunder + </floater.string> + <floater.string name="Remaining"> + mangler + </floater.string> <tab_container name="landtab"> - <panel label="Generelt" name="land_general_panel"> + <panel label="GENERELT" name="land_general_panel"> + <panel.string name="new users only"> + Kun nye brugere + </panel.string> + <panel.string name="anyone"> + Alle + </panel.string> + <panel.string name="area_text"> + Størrelse + </panel.string> + <panel.string name="area_size_text"> + [AREA] m² + </panel.string> + <panel.string name="auction_id_text"> + Auktion nr: [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Du skal godkende dit køb for at kunne æmdre på dette land. + </panel.string> + <panel.string name="group_owned_text"> + (Gruppe ejet) + </panel.string> + <panel.string name="profile_text"> + Profil... + </panel.string> + <panel.string name="info_text"> + Info... + </panel.string> + <panel.string name="public_text"> + (offentlig) + </panel.string> + <panel.string name="none_text"> + (ingen) + </panel.string> + <panel.string name="sale_pending_text"> + (Salg i gang) + </panel.string> + <panel.string name="no_selection_text"> + Pacel ikke valgt. +Gå til 'Verden' > 'Om land' eller vælg en anden parcel for at se detaljer. + </panel.string> <text name="Name:"> Navn: </text> @@ -26,7 +78,6 @@ <text name="OwnerText"> Leyla Linden </text> - <button label="Profil..." label_selected="Profil..." name="Profile..."/> <text name="Group:"> Gruppe: </text> @@ -78,54 +129,23 @@ <button label="Efterlad land..." label_selected="Efterlad land..." name="Abandon Land..."/> <button label="Kræv tilbage..." label_selected="Kræv tilbage..." name="Reclaim Land..."/> <button label="Linden salg..." label_selected="Linden salg..." name="Linden Sale..." tool_tip="Land skal være ejet, indholdsrating sat og ikke allerede på auktion."/> - <panel.string name="new users only"> - Kun nye brugere - </panel.string> - <panel.string name="anyone"> - Alle - </panel.string> - <panel.string name="area_text"> - Størrelse - </panel.string> - <panel.string name="area_size_text"> - [AREA] m² - </panel.string> - <panel.string name="auction_id_text"> - Auktion nr: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Du skal godkende dit køb for at kunne æmdre på dette land. - </panel.string> - <panel.string name="group_owned_text"> - (Gruppe ejet) - </panel.string> - <panel.string name="profile_text"> - Profil... - </panel.string> - <panel.string name="info_text"> - Info... - </panel.string> - <panel.string name="public_text"> - (offentlig) + </panel> + <panel label="REGLER" name="land_covenant_panel"> + <panel.string name="can_resell"> + Købt land i denne region må sælges videre </panel.string> - <panel.string name="none_text"> - (ingen) + <panel.string name="can_not_resell"> + Købt land i denne region må ikke sælges videre </panel.string> - <panel.string name="sale_pending_text"> - (Salg i gang) + <panel.string name="can_change"> + Købt jord i denne region må gerne samles eller opdeles. </panel.string> - <panel.string name="no_selection_text"> - Pacel ikke valgt. -Gå til 'Verden' > 'Om land' eller vælg en anden parcel for at se detaljer. + <panel.string name="can_not_change"> + Købt jord i denne region må íkke samles eller opdeles. </panel.string> - </panel> - <panel label="Regler" name="land_covenant_panel"> <text name="estate_section_lbl"> Estate: </text> - <text name="estate_name_lbl"> - Navn: - </text> <text name="estate_name_text"> Hovedland </text> @@ -144,9 +164,6 @@ Gå til 'Verden' > 'Om land' eller vælg en anden parcel <text name="region_section_lbl"> Region: </text> - <text name="region_name_lbl"> - Navn: - </text> <text name="region_name_text"> leyla </text> @@ -174,35 +191,23 @@ Gå til 'Verden' > 'Om land' eller vælg en anden parcel <text name="changeable_clause"> Land i denne region må ikke samles/opdeles. </text> - <panel.string name="can_resell"> - Købt land i denne region må sælges videre - </panel.string> - <panel.string name="can_not_resell"> - Købt land i denne region må ikke sælges videre - </panel.string> - <panel.string name="can_change"> - Købt jord i denne region må gerne samles eller opdeles. + </panel> + <panel label="OBJEKTER" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] ud af [MAX] ([AVAILABLE] ledige) </panel.string> - <panel.string name="can_not_change"> - Købt jord i denne region må íkke samles eller opdeles. + <panel.string name="objects_deleted_text"> + [COUNT] ud af [MAX] ([DELETED] bliver slettet) </panel.string> - </panel> - <panel label="Objekter" name="land_objects_panel"> <text name="parcel_object_bonus"> Region objekt bonus faktor: [BONUS] </text> <text name="Simulator primitive usage:"> - Prims brugt i denne Sim: + Prim forbrug: </text> <text name="objects_available"> [COUNT] ud af [MAX] ([AVAILABLE] ledige) </text> - <panel.string name="objects_available_text"> - [COUNT] ud af [MAX] ([AVAILABLE] ledige) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] ud af [MAX] ([DELETED] bliver slettet) - </panel.string> <text name="Primitives parcel supports:"> Prims til rådighed: </text> @@ -251,33 +256,63 @@ Gå til 'Verden' > 'Om land' eller vælg en anden parcel <text name="Object Owners:"> Objekt ejere: </text> - <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh List"/> + <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh List" tool_tip="Refresh Object List"/> <button label="Returnér objekter..." label_selected="Returnér objekter..." name="Return objects..."/> <name_list name="owner list"> - <column label="Type" name="type"/> - <column label="Navn" name="name"/> - <column label="Antal" name="count"/> - <column label="Nyeste" name="mostrecent"/> + <name_list.columns label="Type" name="type"/> + <name_list.columns label="Navn" name="name"/> + <name_list.columns label="Antal" name="count"/> + <name_list.columns label="Nyeste" name="mostrecent"/> </name_list> </panel> - <panel label="Indstillinger" name="land_options_panel"> + <panel label="INDSTILLINGER" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + Lad beboere se denne parcel i søgeresultater + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + Denne mulighed er ikke til stede da parcellens område er 128 m² eller mindre. +Kun større parceller kan vises i søgning. + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + Dette valg er lukket da du ikke kan ændre på denne parcels opsætning. + </panel.string> + <panel.string name="mature_check_mature"> + Mature indhold + </panel.string> + <panel.string name="mature_check_adult"> + Adult indhold + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + Din parcel information eller indhold anses for at være 'adult'. + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + Din parcel information eller indhold anses for at være 'adult'. + </panel.string> + <panel.string name="landing_point_none"> + (ingen) + </panel.string> + <panel.string name="push_restrict_text"> + Skub forbudt + </panel.string> + <panel.string name="push_restrict_region_text"> + Skub forbudt (Uanset region indstilling) + </panel.string> <text name="allow_label"> Tillad andre beboere at: </text> <check_box label="Redigere terræn" name="edit land check" tool_tip="Hvis dette er valg, kan enhver redigere dit land. Det er bedst ikke at vælge her, da det altid er muligt for dig som ejer at ændre terræn på dit eget land."/> - <check_box label="Lave landemærker" name="check landmark"/> <check_box label="Flyve" name="check fly" tool_tip="Hvis valgt, kan beboere flyve på dit land. Hvis ikke valgt kan beboere kun flyve ind på dit land og over dit land."/> - <text name="allow_label2" left="194"> + <text left="194" name="allow_label2"> Lave objekter: </text> <check_box label="Alle beboere" name="edit objects check"/> <check_box label="Gruppe" name="edit group objects check"/> - <text name="allow_label3" left="170"> + <text left="170" name="allow_label3"> Anbringe objekter: </text> <check_box label="Alle beboere" name="all object entry check"/> <check_box label="Gruppe" name="group object entry check"/> - <text name="allow_label4" left="200"> + <text left="200" name="allow_label4"> Køre scripts: </text> <check_box label="Alle beboere" name="check other scripts"/> @@ -287,73 +322,37 @@ Gå til 'Verden' > 'Om land' eller vælg en anden parcel </text> <check_box label="Sikker (ingen skade)" name="check safe" tool_tip="Hvis valgt, er det ikke muligt at forårsage skade på andre beboere. Hvis fravalgt er det muligt at få skader (f.eks. ved kamp)."/> <check_box label="Skub forbudt" name="PushRestrictCheck" tool_tip="Forhindrer scripts i at skubbe. Valg af denne mulighed, kan være nyttigt for at forhindre forstyrrende adfærd på dit land."/> - <check_box label="Vis sted i søgning (L$30/uge) i kategorien:" name="ShowDirectoryCheck" tool_tip="Lad dit parcel blive vist i søge resultaterne"/> - <panel.string name="search_enabled_tooltip"> - Lad beboere se denne parcel i søgeresultater - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - Denne mulighed er ikke til stede da parcellens område er 128 m² eller mindre. -Kun større parceller kan vises i søgning. - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - Dette valg er lukket da du ikke kan ændre på denne parcels opsætning. - </panel.string> + <check_box label="Vis sted i søgning (L$30/uge)" name="ShowDirectoryCheck" tool_tip="Lad dit parcel blive vist i søge resultaterne"/> <combo_box name="land category with adult"> - <combo_box.item name="item0" label="Enhver kategori" - /> - <combo_box.item name="item1" label="Linden sted" - /> - <combo_box.item name="item2" label="Adult" - /> - <combo_box.item name="item3" label="Kunst & kultur" - /> - <combo_box.item name="item4" label="Business" - /> - <combo_box.item name="item5" label="Uddannelse" - /> - <combo_box.item name="item6" label="Spil" - /> - <combo_box.item name="item7" label="Afslapning" - /> - <combo_box.item name="item8" label="Nybegynder venligt" - /> - <combo_box.item name="item9" label="Parker & natur" - /> - <combo_box.item name="item10" label="Beboelse" - /> - <combo_box.item name="item11" label="Indkøb" - /> - <combo_box.item name="item12" label="Andet" - /> + <combo_box.item label="Enhver kategori" name="item0"/> + <combo_box.item label="Linden sted" name="item1"/> + <combo_box.item label="Adult" name="item2"/> + <combo_box.item label="Kunst & kultur" name="item3"/> + <combo_box.item label="Business" name="item4"/> + <combo_box.item label="Uddannelse" name="item5"/> + <combo_box.item label="Spil" name="item6"/> + <combo_box.item label="Afslapning" name="item7"/> + <combo_box.item label="Nybegynder venligt" name="item8"/> + <combo_box.item label="Parker & natur" name="item9"/> + <combo_box.item label="Beboelse" name="item10"/> + <combo_box.item label="Indkøb" name="item11"/> + <combo_box.item label="Andet" name="item12"/> </combo_box> <combo_box name="land category"> - <combo_box.item name="item0" label="Enhver kategori" /> - <combo_box.item name="item1" label="Linden sted" /> - <combo_box.item name="item3" label="Kunst & kultur" /> - <combo_box.item name="item4" label="Business" /> - <combo_box.item name="item5" label="Uddannelse" /> - <combo_box.item name="item6" label="Spil" /> - <combo_box.item name="item7" label="Afslapning" /> - <combo_box.item name="item8" label="Nybegynder venligt" /> - <combo_box.item name="item9" label="Parker & natur" /> - <combo_box.item name="item10" label="Beboelse" /> - <combo_box.item name="item11" label="Indkøb" /> - <combo_box.item name="item12" label="Andet" /> + <combo_box.item label="Enhver kategori" name="item0"/> + <combo_box.item label="Linden sted" name="item1"/> + <combo_box.item label="Kunst & kultur" name="item3"/> + <combo_box.item label="Business" name="item4"/> + <combo_box.item label="Uddannelse" name="item5"/> + <combo_box.item label="Spil" name="item6"/> + <combo_box.item label="Afslapning" name="item7"/> + <combo_box.item label="Nybegynder venligt" name="item8"/> + <combo_box.item label="Parker & natur" name="item9"/> + <combo_box.item label="Beboelse" name="item10"/> + <combo_box.item label="Indkøb" name="item11"/> + <combo_box.item label="Andet" name="item12"/> </combo_box> - <button label="?" label_selected="?" name="?"/> <check_box label="Mature indhold" name="MatureCheck" tool_tip=""/> - <panel.string name="mature_check_mature"> - Mature indhold - </panel.string> - <panel.string name="mature_check_adult"> - Adult indhold - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - Din parcel information eller indhold anses for at være 'adult'. - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - Din parcel information eller indhold anses for at være 'adult'. - </panel.string> <text name="Snapshot:"> Foto: </text> @@ -361,40 +360,35 @@ Kun større parceller kan vises i søgning. <text name="landing_point"> Landingspunkt: [LANDING] </text> - <panel.string name="landing_point_none"> - (ingen) - </panel.string> <button label="Vælg" label_selected="Vælg" name="Set" tool_tip="Indstiller landingspunkt, hvor de besøgende ankommer. Sættes til din avatars aktuelle placering i denne parcel."/> <button label="Fjern" label_selected="Fjern" name="Clear" tool_tip="Fjerner oplysning om landingspunkt."/> <text name="Teleport Routing: "> Teleport valg: </text> <combo_box name="landing type" tool_tip="Vælg hvordan du vil håndtere teleporteringer til dit land."> - <combo_box.item name="Blocked" label="Blokeret" /> - <combo_box.item name="LandingPoint" label="Landingspunkt" /> - <combo_box.item name="Anywhere" label="Hvor som helst" /> + <combo_box.item label="Blokeret" name="Blocked"/> + <combo_box.item label="Landingspunkt" name="LandingPoint"/> + <combo_box.item label="Hvor som helst" name="Anywhere"/> </combo_box> - <panel.string name="push_restrict_text"> - Skub forbudt - </panel.string> - <panel.string name="push_restrict_region_text"> - Skub forbudt (Uanset region indstilling) - </panel.string> </panel> - <panel label="Medier" name="land_media_panel"> - <text name="with media:" left="4"> + <panel label="MEDIA" name="land_media_panel"> + <text left="4" name="with media:"> Medie type: </text> <combo_box name="media type" tool_tip="Specificer om URL-adressen er til en film, hjemmeside eller et andet medie."/> - <text name="at URL:" left="4"> + <text left="4" name="at URL:"> Medie URL: </text> <button label="Vælg..." label_selected="Vælg..." name="set_media_url"/> - <text name="Description:" left="4"> + <text name="CurrentURL:"> + Nuværende side: + </text> + <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/> + <text left="4" name="Description:"> Beskrivelse: </text> <line_editor name="url_description" tool_tip="Tekst vist ved siden af Afspil/Hent knappen"/> - <text name="Media texture:" left="4"> + <text left="4" name="Media texture:"> Erstat tekstur: </text> <texture_picker label="" name="media texture" tool_tip="Klik for at vælge billede"/> @@ -402,13 +396,7 @@ Kun større parceller kan vises i søgning. (Objekter der har denne tekstur vil vise filmen eller web-siden, efter du klikker på play knappen.) </text> - <text name="Options:"> - Medie valg: - </text> <check_box label="Auto skalér" name="media_auto_scale" tool_tip="Vælg denne mulighed for at skalere indholdet for dette parcel automatisk. Det kan være lidt langsommere og have lavere kvalitet, men ingen anden tekstur skalering eller tilpasning vil være nødvendigt."/> - <check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/> - <check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/> - <check_box label="Skjul musik URL" name="hide_music_url" tool_tip="Klik her for at skjule musik adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/> <text name="media_size" tool_tip="Størrelse for rendering af Web medie, benyt 0 for standard." width="105"> Medie Størrelse: </text> @@ -417,56 +405,42 @@ web-siden, efter du klikker på play knappen.) <text name="pixels"> pixels </text> - <text name="MusicURL:"> - Musik URL: - </text> - <text name="Sound:"> - Lyd: - </text> - <check_box label="Begræns lyde fra bevægelser og objekter til denne parcel" name="check sound local"/> - <button label="?" label_selected="?" name="?" left="400"/> - <text name="Voice settings:"> - Stemme: + <text name="Options:"> + Medie valg: </text> - <radio_group name="parcel_voice_channel"> - <radio_item name="Estate" label="Brug Estate kanalen" /> - <radio_item name="Private" label="Brug en privat kanal" /> - <radio_item name="Disabled" label="Slå stemme chat fra på denne parcel" /> - </radio_group> + <check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/> + </panel> + <panel label="LYD" name="land_audio_panel"> + <check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/> + <check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/> </panel> - <panel label="Adgang" name="land_access_panel"> + <panel label="ADGANG" name="land_access_panel"> + <panel.string name="access_estate_defined"> + (Defineret via estate) + </panel.string> + <panel.string name="estate_override"> + En eller flere af disse valg er indstillet på estate niveau + </panel.string> <text name="Limit access to this parcel to:"> Adgang til denne parcel </text> - <check_box label="Tillad offentlig adgang" name="public_access"/> + <check_box label="Tillad offentlig adgang [MATURITY]" name="public_access"/> <text name="Only Allow"> - Blokér adgang for: + Blokér adgang for:: </text> - <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab" name="limit_payment" tool_tip="Blokér beboere der ikke har afgivet identifikationsoplysninger."/> - <check_box label="Beboere der ikke er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information."/> - <panel.string name="estate_override"> - En eller flere af disse valg er indstillet på estate niveau - </panel.string> + <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Blokér beboere der ikke har afgivet identifikationsoplysninger."/> + <check_box label="Alders verifikation [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Blokér beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information."/> <check_box label="Tillad adgang til gruppen: [GROUP]" name="GroupCheck" tool_tip="Vælg gruppe under fanen 'generelt'."/> <check_box label="Sælg adgang til:" name="PassCheck" tool_tip="Tillader midlertidig adgang til denne parcel"/> <combo_box name="pass_combo"> - <combo_box.item name="Anyone" label="Alle" /> - <combo_box.item name="Group" label="Gruppe" /> + <combo_box.item label="Alle" name="Anyone"/> + <combo_box.item label="Gruppe" name="Group"/> </combo_box> <spinner label="Pris i L$:" name="PriceSpin"/> <spinner label="Timers adgang:" name="HoursSpin"/> - <text label="Tillad altid" name="AllowedText"> - Altid godkendte beboere - </text> - <name_list name="AccessList" tool_tip="([LISTED] vist, [MAX] max)"/> - <button label="Tilføj..." label_selected="Tilføj..." name="add_allowed"/> - <button label="Fjern" label_selected="Fjern" name="remove_allowed"/> - <text label="Blokér" name="BanCheck"> - Blokerede beboere - </text> - <name_list name="BannedList" tool_tip="([LISTED] vist, [MAX] max)"/> - <button label="Tilføj..." label_selected="Tilføj..." name="add_banned"/> - <button label="Fjern" label_selected="Fjern" name="remove_banned"/> + <panel name="Allowed_layout_panel"> + <name_list name="AccessList" tool_tip="([LISTED] vist, [MAX] maks.)"/> + </panel> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_animation_preview.xml b/indra/newview/skins/default/xui/da/floater_animation_preview.xml index 8cb0eee601..47e02f0704 100644 --- a/indra/newview/skins/default/xui/da/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_animation_preview.xml @@ -1,97 +1,184 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Fejlede at starte bevægelse + </floater.string> + <floater.string name="anim_too_long"> + Animations filen er [LENGTH] sekunder lang. + +Maksimal animations længde er [MAX_LENGTH] sekunder. + </floater.string> + <floater.string name="failed_file_read"> + Kan ikke læse animations fil. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + OK + </floater.string> + <floater.string name="E_ST_EOF"> + Fil afsluttet for tidligt. + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + Kan ikke læse "constraint definition". + </floater.string> + <floater.string name="E_ST_NO_FILE"> + Kan ikke åbne BVH fil. + </floater.string> + <floater.string name="E_ST_NO_HIER"> + Ugyldig header i HIERARCHY. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + Kan ikke finde "ROOT" eller "JOINT". + </floater.string> + <floater.string name="E_ST_NO_NAME"> + Kan ikke finde JOINT navn. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + Kan ikke finde OFFSET. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + Kan ikke finde CHANNELS. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + Kan ikke læse "rotation order". + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + Kan ikke finde rotationsakser. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + Kan ikke finde MOTION. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + Kan ikke læse antal "frames". + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + Kan ikke læse "frame time". + </floater.string> + <floater.string name="E_ST_NO_POS"> + Kan ikke læse positionsværdier. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + Kan ikke læse rotationsværdier. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + kan ikke åbne "translation file". + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Kan ikke læse "translation header. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Kan ikke aflæse "translation" navne. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Kan ikke læse "translation ignore" værdi. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Kan ikke læse "translation relative" værdi. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Kan ikke læse "translation outname" værdi. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Kan ikke læse "translation matrix". + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Kan ikke læse "mergechild" navn. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Kan ikke læse "mergeparent" navn. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + Kan ikke finde prioritetsværdi. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + Kan ikke læse "loop" værdi. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + kan ikke læse "easeIn" værdier. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + Kan ikke læse "easeOut" værdier. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Kan ikke læse "hand morph" værdi. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + kan ikke læse "emote" navn. + </floater.string> <text name="name_label"> Navn: </text> <text name="description_label"> Beskrivelse: </text> - <spinner label="Prioritet" name="priority" - tool_tip="Vælg hvilke andre animationer der har lavere prioritet end denne." /> - <check_box label="Gentag" name="loop_check" tool_tip="Gentager animationen konstant." /> - <spinner left="76" label_width="40" width="105" label="Ind(%)" name="loop_in_point" tool_tip="Sætter punktet hvor gentagelsen genstarter fra."/> - <spinner label="Ud (%)" name="loop_out_point" - tool_tip="Sætter punktet i animationen der afslutter gentagelsen." /> + <spinner label="Prioritet" name="priority" tool_tip="Vælg hvilke andre animationer der "overstyres" af denne"/> + <check_box label="Gentag" name="loop_check" tool_tip="Gentager animationen konstant"/> + <spinner label="Ind(%)" label_width="40" left="76" name="loop_in_point" tool_tip="Sætter punktet hvor gentagelsen genstarter fra" width="105"/> + <spinner label="Ud (%)" name="loop_out_point" tool_tip="Sætter punktet i animationen der afslutter gentagelsen"/> <text name="hand_label"> Hånd posering </text> - <combo_box label="" name="hand_pose_combo" - tool_tip="Kontrollerer hvad hænderne går i løbet af animationen." width="140"> - <combo_box.item name="Spread" label="Spredt" /> - <combo_box.item name="Relaxed" label="Afslappet" /> - <combo_box.item name="PointBoth" label="Peg begge" /> - <combo_box.item name="Fist" label="Knytnæver" /> - <combo_box.item name="RelaxedLeft" label="Afslappet venstre" /> - <combo_box.item name="PointLeft" label="Peg venstre" /> - <combo_box.item name="FistLeft" label="Knytnæve venstre" /> - <combo_box.item name="RelaxedRight" label="Afslappet højre" /> - <combo_box.item name="PointRight" label="Peg højre" /> - <combo_box.item name="FistRight" label="Knytnæve højre" /> - <combo_box.item name="SaluteRight" label="Honnør højre" /> - <combo_box.item name="Typing" label="Skriver" /> - <combo_box.item name="PeaceRight" label="Fredstegn højre" /> + <combo_box label="" name="hand_pose_combo" tool_tip="Kontrollerer hvad hænderne går i løbet af animationen" width="140"> + <combo_box.item label="Spredt" name="Spread"/> + <combo_box.item label="Afslappet" name="Relaxed"/> + <combo_box.item label="Peg begge" name="PointBoth"/> + <combo_box.item label="Knytnæver" name="Fist"/> + <combo_box.item label="Afslappet venstre" name="RelaxedLeft"/> + <combo_box.item label="Peg venstre" name="PointLeft"/> + <combo_box.item label="Knytnæve venstre" name="FistLeft"/> + <combo_box.item label="Afslappet højre" name="RelaxedRight"/> + <combo_box.item label="peg højre" name="PointRight"/> + <combo_box.item label="knytnæve højre" name="FistRight"/> + <combo_box.item label="Honnør højre" name="SaluteRight"/> + <combo_box.item label="Skrivende" name="Typing"/> + <combo_box.item label="Fredstegn højre" name="PeaceRight"/> </combo_box> <text name="emote_label"> Ansigtsudtryk </text> - <combo_box label="" name="emote_combo" - tool_tip="Angiver hvad ansigtet gør under animationen" width="140"> - <combo_box.item name="[None]" label="Intet]" /> - <combo_box.item name="Aaaaah" label="Aaaaah" /> - <combo_box.item name="Afraid" label="Bange" /> - <combo_box.item name="Angry" label="Vred" /> - <combo_box.item name="BigSmile" label="Stort smil" /> - <combo_box.item name="Bored" label="Keder sig" /> - <combo_box.item name="Cry" label="Græder" /> - <combo_box.item name="Disdain" label="Forarget" /> - <combo_box.item name="Embarrassed" label="Flov" /> - <combo_box.item name="Frown" label="Skuler" /> - <combo_box.item name="Kiss" label="Kysser" /> - <combo_box.item name="Laugh" label="Griner" /> - <combo_box.item name="Plllppt" label="Plllppt" /> - <combo_box.item name="Repulsed" label="Frastødt" /> - <combo_box.item name="Sad" label="Ked af det" /> - <combo_box.item name="Shrug" label="Skuldertræk" /> - <combo_box.item name="Smile" label="Smiler" /> - <combo_box.item name="Surprise" label="Overrasket" /> - <combo_box.item name="Wink" label="Blinker" /> - <combo_box.item name="Worry" label="Bekymret" /> + <combo_box label="" name="emote_combo" tool_tip="Angiver hvad ansigtet gør under animationen" width="140"> + <combo_box.item label="(Intet)" name="[None]"/> + <combo_box.item label="Aaaaah" name="Aaaaah"/> + <combo_box.item label="Bange" name="Afraid"/> + <combo_box.item label="Vred" name="Angry"/> + <combo_box.item label="Stort smil" name="BigSmile"/> + <combo_box.item label="Keder sig" name="Bored"/> + <combo_box.item label="Græder" name="Cry"/> + <combo_box.item label="Forarget" name="Disdain"/> + <combo_box.item label="Flov" name="Embarrassed"/> + <combo_box.item label="Skuler" name="Frown"/> + <combo_box.item label="Kysser" name="Kiss"/> + <combo_box.item label="Griner" name="Laugh"/> + <combo_box.item label="Plllppt" name="Plllppt"/> + <combo_box.item label="Frastødt" name="Repulsed"/> + <combo_box.item label="Ked af det" name="Sad"/> + <combo_box.item label="Skuldertræk" name="Shrug"/> + <combo_box.item label="Smil" name="Smile"/> + <combo_box.item label="Overrasket" name="Surprise"/> + <combo_box.item label="Blinker" name="Wink"/> + <combo_box.item label="Bekymret" name="Worry"/> </combo_box> <text name="preview_label"> Vis mens </text> - <combo_box label="" name="preview_base_anim" - tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer." width="140"> - <combo_box.item name="Standing" label="Står" /> - <combo_box.item name="Walking" label="Går" /> - <combo_box.item name="Sitting" label="Sidder" /> - <combo_box.item name="Flying" label="Flyver" /> + <combo_box label="" name="preview_base_anim" tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer." width="140"> + <combo_box.item label="Stående" name="Standing"/> + <combo_box.item label="Gående" name="Walking"/> + <combo_box.item label="Sidder" name="Sitting"/> + <combo_box.item label="Flyver" name="Flying"/> </combo_box> - <spinner label="start (sec)" name="ease_in_time" - tool_tip="Tid i sekunder animationen bruger på at komme i gang." /> - <spinner label="Afslut (sec)" name="ease_out_time" - tool_tip="Tid i sekunder animationen bruger på at afslutte." /> - <button label="" name="play_btn" tool_tip="Start/pause din animation." /> - <button label="" name="stop_btn" tool_tip="Stop afspilning af animation" /> - <slider label="" name="playback_slider" /> + <spinner label="start (sec)" name="ease_in_time" tool_tip="Tid (i sekunder) animationen bruger på at komme i gang."/> + <spinner label="Afslut (sec)" name="ease_out_time" tool_tip="Tid (i sekunder) animationen bruger på at afslutte"/> + <button label="" name="play_btn" tool_tip="Start din animation"/> + <button name="pause_btn" tool_tip="Pause din animation"/> + <button label="" name="stop_btn" tool_tip="Stop afspilning af animation"/> + <slider label="" name="playback_slider"/> <text name="bad_animation_text"> Kan ikke læse animations fil. Vi anbefaler BVH filer der er exporteret fra Poser 4. </text> - <button label="Annullér" name="cancel_btn" /> - <button label="Hent (L$[AMOUNT])" name="ok_btn" /> - <string name="failed_to_initialize"> - Fejlede at starte bevægelse - </string> - <string name="anim_too_long"> - Animations filen er [LENGTH] sekunder lang. - -Maksimal animations længde er [MAX_LENGTH] sekunder. - </string> - <string name="failed_file_read"> - Kan ikke læse animations fil. - -[STATUS] - </string> + <button label="Hent (L$[AMOUNT])" name="ok_btn"/> + <button label="Annullér" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml index 27bfa367f6..1111c5e18b 100644 --- a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml @@ -1,30 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="avatar_texture_debug" title="AVATAR TEKSTURER"> - <text name="baked_label"> - Faste teksturer - </text> + <floater.string name="InvalidAvatar"> + UGYLDING AVATAR + </floater.string> <text name="composite_label"> Blandede teksturer </text> - <texture_picker label="Hoved" name="baked_head" /> - <texture_picker label="Makeup" name="head_bodypaint" /> - <texture_picker label="Hår" name="hair" /> - <button label="Drop" label_selected="Dump" name="Dump" /> - <texture_picker label="øjne" name="baked_eyes" /> - <texture_picker label="øje" name="eye_texture" /> - <texture_picker label="Overkrop" name="baked_upper_body" /> - <texture_picker label="Tatovering overkrop" name="upper_bodypaint" /> - <texture_picker label="Undertrøje" name="undershirt" /> - <texture_picker label="Handsker" name="gloves" /> - <texture_picker label="Trøje" name="shirt" /> - <texture_picker label="øvre jakke" name="upper_jacket" /> - <texture_picker label="Underkrop" name="baked_lower_body" /> - <texture_picker label="Tatovering underkrop" name="lower_bodypaint" /> - <texture_picker label="Underbukser" name="underpants" /> - <texture_picker label="Strømper" name="socks" /> - <texture_picker label="Sko" name="shoes" /> - <texture_picker label="Bukser" name="pants" /> - <texture_picker label="Jakke" name="jacket" /> - <texture_picker label="Nederdel" name="baked_skirt" /> - <texture_picker label="Nederdel" name="skirt_texture" /> + <button label="Drop" label_selected="Dump" name="Dump"/> + <texture_picker label="Hår" name="hair_grain"/> + <texture_picker label="Alpha - hår" name="hair_alpha"/> + <texture_picker label="Makeup" name="head_bodypaint"/> + <texture_picker label="Alpha - hoved" name="head_alpha"/> + <texture_picker label="Tatovering hovede" name="head_tattoo"/> + <texture_picker label="Øje" name="eyes_iris"/> + <texture_picker label="Alpha - øjne" name="eyes_alpha"/> + <texture_picker label="Bodypaint - overkrop" name="upper_bodypaint"/> + <texture_picker label="Undertrøje" name="upper_undershirt"/> + <texture_picker label="Handsker" name="upper_gloves"/> + <texture_picker label="Trøje" name="upper_shirt"/> + <texture_picker label="Øvre jakke" name="upper_jacket"/> + <texture_picker label="Alpha - øvre" name="upper_alpha"/> + <texture_picker label="Øvre tatovering" name="upper_tattoo"/> + <texture_picker label="Bodypaint - underkrop" name="lower_bodypaint"/> + <texture_picker label="Undertøj" name="lower_underpants"/> + <texture_picker label="Strømper" name="lower_socks"/> + <texture_picker label="Sko" name="lower_shoes"/> + <texture_picker label="Bukser" name="lower_pants"/> + <texture_picker label="Jakke" name="lower_jacket"/> + <texture_picker label="Alpha - nedre" name="lower_alpha"/> + <texture_picker label="Nedre tatovering" name="lower_tattoo"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml index 18bc7aeb31..d67d859e7b 100644 --- a/indra/newview/skins/default/xui/da/floater_beacons.xml +++ b/indra/newview/skins/default/xui/da/floater_beacons.xml @@ -1,15 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="beacons" title="PEJLELYS"> <panel name="beacons_panel"> - <check_box label="Kun scriptede objekter med "rør"" name="touch_only" /> - <check_box label="Scriptede objekter" name="scripted" /> - <check_box label="Fysiske objekter" name="physical" /> - <check_box label="Lyd kilder" name="sounds" /> - <check_box label="Partikel kilder" name="particles" /> - <check_box label="Rendér highlights" name="highlights" /> - <check_box label="Rendér pejlelys" name="beacons" /> - <text name="beacon_width_label"> - Pejlelys bredde: + <text name="label_show"> + Vis: </text> + <check_box label="Pejlelys" name="beacons"/> + <check_box label="Fremhævninger" name="highlights"/> + <text name="beacon_width_label" tool_tip="Pejlelys bredde"> + Bredde: + </text> + <text name="label_objects"> + For disse objekter: + </text> + <check_box label="Fysisk" name="physical"/> + <check_box label="Scriptet" name="scripted"/> + <check_box label="Kun berøring" name="touch_only"/> + <check_box label="Lydkilder" name="sounds"/> + <check_box label="Partikel kilder" name="particles"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_build_options.xml b/indra/newview/skins/default/xui/da/floater_build_options.xml index 7eb0d4c035..9196f19b78 100644 --- a/indra/newview/skins/default/xui/da/floater_build_options.xml +++ b/indra/newview/skins/default/xui/da/floater_build_options.xml @@ -1,8 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="GITTER INDSTILLINGER"> - <spinner label="Gitter enhed (meter)" name="GridResolution" width="200" label_width="136"/> - <spinner label="Gitter rækkevidde (meter)" name="GridDrawSize" width="200" label_width="136"/> - <check_box label="Aktiver låsning til under-enheder" name="GridSubUnit" /> - <check_box label="Vis 'cross sections'" name="GridCrossSection" /> - <slider label="Gitter synlighed" name="GridOpacity" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="build options floater" title="GITTER VALG"> + <spinner label="Gitter enheder (meter)" label_width="136" name="GridResolution" width="200"/> + <spinner label="Gitter rækkevidde (meter)" label_width="136" name="GridDrawSize" width="200"/> + <check_box label="Aktivér låsning til underenheder" name="GridSubUnit"/> + <check_box label="Vis 'cross-sections'" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Gitter synlighed"> + Uigennemsigtighed: + </text> + <slider label="Gitter synlighed" name="GridOpacity"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_buy_contents.xml b/indra/newview/skins/default/xui/da/floater_buy_contents.xml index 8dccf32304..c2b2ccc244 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_contents.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_buy_contents" title="KØB INDHOLD"> <text name="contains_text"> [NAME] indeholder: @@ -6,9 +6,9 @@ <text name="buy_text"> Køb for L$[AMOUNT] fra [NAME]? </text> - <button label="Annullér" label_selected="Annullér" name="cancel_btn" /> - <button label="Køb" label_selected="Køb" name="buy_btn" /> - <check_box label="Tag tøj på nu" name="wear_check" /> + <button label="Annullér" label_selected="Annullér" name="cancel_btn"/> + <button label="Køb" label_selected="Køb" name="buy_btn"/> + <check_box label="Tag tøj på nu" name="wear_check"/> <string name="no_copy_text"> (kopiér ej) </string> diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml index d1fca8984d..18ee0e0597 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml @@ -1,68 +1,66 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="buy currency" title="KØB VALUTA"> - <text name="info_buying"> - Køber valuta: - </text> - <text name="info_cannot_buy"> - Kan ikke købe nu: - </text> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="buy currency" title="KØB L$"> + <floater.string name="buy_currency"> + Køb L$ [LINDENS] for ca. [LOCALAMOUNT] + </floater.string> <text name="info_need_more"> - Du har ikke penge nok: + Du skal bruge flere L$ </text> - <text name="error_message"> - Noget er gået galt. - </text> - <button label="Gå til hjemmeside" name="error_web" /> <text name="contacting"> Kontakter LindeX... </text> - <text name="buy_action_unknown"> - Køb L$ på LindeX valuta marked + <text name="info_buying"> + Køb L$ </text> - <text name="buy_action"> - [NAME] L$ [PRICE] + <text name="balance_label"> + Jeg har + </text> + <text name="balance_amount"> + L$ [AMT] </text> <text name="currency_action"> - Køb L$ + Jeg ønsker at købe </text> - <line_editor name="currency_amt"> + <text name="currency_label"> + L$ + </text> + <line_editor label="L$" name="currency_amt"> 1234 </line_editor> + <text name="buying_label"> + Til prisen + </text> <text name="currency_est"> - for ca. [LOCALAMOUNT] + ca. [LOCALAMOUNT] </text> <text name="getting_data"> - Henter data... - </text> - <text name="balance_label"> - Du har i øjeblikket - </text> - <text name="balance_amount"> - L$ [AMT] - </text> - <text name="buying_label"> - Du køber + Estimerer... </text> - <text name="buying_amount"> - L$ [AMT] + <text name="buy_action"> + [NAME] L$ [PRICE] </text> <text name="total_label"> - Din balance bliver + Min nye beholdning vil være </text> <text name="total_amount"> L$ [AMT] </text> + <text name="currency_links"> + [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate] + </text> + <text name="exchange_rate_note"> + Indtast beløbet for at se nyeste valutakurs. + </text> <text name="purchase_warning_repurchase"> - Bekræfter at denne handel kun omfatter valuta. -Gentag operationen venligst igen. + Bekræftelse af dette køb medfører kun køb af L$, ikke objektet. </text> <text name="purchase_warning_notenough"> - Du køber ikke nok valuta, tast et større beløb -og prøv igen. + Du køber ikke nok L$. Forøg venligst beløbet. </text> - <button label="Annullér" name="cancel_btn" /> - <button label="Køb" name="buy_btn" /> - <string name="buy_currency"> - Køb L$ [LINDENS] for ca. [LOCALAMOUNT] - </string> + <button label="Køb nu" name="buy_btn"/> + <button label="Annullér" name="cancel_btn"/> + <text name="info_cannot_buy"> + Kan ikke købe + </text> + <button label="Fortsæt til web" name="error_web"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml index 71e6eaa7f7..987ad6585f 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml @@ -59,7 +59,7 @@ <text left_delta="62" name="info_price"> L$ 1500 (L$ 1.1/m²) -sælges med objekter +solgt med objekter </text> <text name="info_action"> Køb af dette land vil: @@ -75,16 +75,16 @@ sælges med objekter Kun premium medlemmer kan eje land. </text> <combo_box name="account_level"> - <combo_box.item name="US$9.95/month,billedmonthly" label="US$9.95/md, månedlig afregning" /> - <combo_box.item name="US$7.50/month,billedquarterly" label="US$7.50/md, kvartalsvis afregning" /> - <combo_box.item name="US$6.00/month,billedannually" label="US$6.00/md, årlig afregning" /> + <combo_box.item label="US$9.95 pr. måned, faktureret månedligt" name="US$9.95/month,billedmonthly"/> + <combo_box.item label="US$7.50 pr. måned, faktureret kvartalsvist" name="US$7.50/month,billedquarterly"/> + <combo_box.item label="US$6.00 pr. måned, faktureret årligt" name="US$6.00/month,billedannually"/> </combo_box> <text name="land_use_action"> Forøg dine månedlige arealanvendelse gebyrer til US $ 40/måned. </text> <text name="land_use_reason"> - You hold 1309 m² of land. -This parcel is 512 m² of land. + Du ejer 1309 m² land. +Denne parcel er på 512 m². </text> <text name="purchase_action"> Betal Joe Resident L$ 4000 dette areal @@ -99,12 +99,12 @@ This parcel is 512 m² of land. 1000 </line_editor> <text name="currency_est"> - for ca. US$ [AMOUNT2] + for ca. [LOCAL_AMOUNT] </text> <text name="currency_balance"> Du har L$2,100. </text> - <check_box label="Fjern [AMOUNT] kvadratmeter af bidrag fra gruppe." name="remove_contribution"/> + <check_box label="Fjern [AMOUNT] m² af bidrag fra gruppe." name="remove_contribution"/> <button label="Køb" name="buy_btn"/> <button label="Annullér" name="cancel_btn"/> <string name="can_resell"> @@ -181,16 +181,16 @@ Prøv at vælge et mindre område. Din konto kan eje jord. </string> <string name="land_holdings"> - Du har [BUYER] m² jord. + Du ejer [BUYER] m² land. </string> <string name="pay_to_for_land"> Betal L$ [AMOUNT] til [SELLER] for dette stykke jord </string> <string name="buy_for_US"> - Køb L$ [AMOUNT] for ca. US$ [AMOUNT2], + Køb L$ [AMOUNT] for ca. [LOCAL_AMOUNT], </string> <string name="parcel_meters"> - Denne parcel er [AMOUNT] m². + Denne parcel er på [AMOUNT] m² </string> <string name="premium_land"> Dette stykke jord er premium, og vil tælle som [AMOUNT] m². @@ -200,7 +200,7 @@ Prøv at vælge et mindre område. </string> <string name="meters_supports_object"> [AMOUNT] m² -kan indeholder [AMOUNT2] objekter +kan indeholde [AMOUNT2] objekter </string> <string name="sold_with_objects"> solgt med objekter diff --git a/indra/newview/skins/default/xui/da/floater_choose_group.xml b/indra/newview/skins/default/xui/da/floater_choose_group.xml index 9f02f281db..1ccda4f1d7 100644 --- a/indra/newview/skins/default/xui/da/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/da/floater_choose_group.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="groups" title="GRUPPER"> <text name="groupdesc"> Vælg en gruppe: </text> - <button label="OK" label_selected="OK" name="OK" /> - <button label="Annullér" label_selected="Annullér" name="Cancel" /> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Annullér" label_selected="Annullér" name="Cancel"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml index b2409f1682..379302ef6a 100644 --- a/indra/newview/skins/default/xui/da/floater_customize.xml +++ b/indra/newview/skins/default/xui/da/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APPEARANCE" width="509"> +<floater name="floater customize" title="UDSEENDE" width="509"> <tab_container name="customize tab container" width="507"> <placeholder label="Krops Dele" name="body_parts_placeholder"/> <panel label="Kropsbygning" name="Shape"> @@ -14,8 +14,8 @@ <button label="Overkrop" label_selected="Overkrop" name="Torso"/> <button label="Ben" label_selected="Ben" name="Legs"/> <radio_group name="sex radio"> - <radio_item name="radio" label="Kvinde" /> - <radio_item name="radio2" label="Mand" /> + <radio_item label="Kvinde" name="radio"/> + <radio_item label="Mand" name="radio2"/> </radio_group> <text name="title"> [DESC] @@ -78,9 +78,9 @@ og bagefter 'tage den på'. <text name="Item Action Label"> Hud: </text> - <texture_picker width="98" label="Tatoveringer hoved" name="Head Tattoos" tool_tip="Klik for at vælge et billede"/> - <texture_picker width="98" label="Tatover. overkrop" name="Upper Tattoos" tool_tip="Klik for at vælge et billede"/> - <texture_picker width="98" label="Tatover. underkrop" name="Lower Tattoos" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Tatoveringer hoved" name="Head Tattoos" tool_tip="Klik for at vælge et billede" width="98"/> + <texture_picker label="Tatover. overkrop" name="Upper Tattoos" tool_tip="Klik for at vælge et billede" width="98"/> + <texture_picker label="Tatover. underkrop" name="Lower Tattoos" tool_tip="Klik for at vælge et billede" width="98"/> <button label="Lav ny hud" label_selected="Lav nyt hud" name="Create New"/> <button label="Gem" label_selected="Gem" name="Save"/> <button label="Gem som..." label_selected="Gem som..." name="Save As"/> @@ -156,7 +156,7 @@ og bagefter 'tage dem på'. <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Annullér" label_selected="Annullér" name="Revert"/> </panel> - <panel label="Tøje" name="clothes_placeholder"/> + <placeholder label="Tøje" name="clothes_placeholder"/> <panel label="Trøje" name="Shirt"> <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> @@ -471,9 +471,81 @@ og bagefter 'tage den på'. <button label="Gem som..." label_selected="Gem som..." name="Save As"/> <button label="Annullér" label_selected="Annullér" name="Revert"/> </panel> + <panel label="Alpha" name="Alpha"> + <text name="title"> + [DESC] + </text> + <text name="title_no_modify"> + [DESC]: kan ikke ændre + </text> + <text name="title_loading"> + [DESC]: indlæser... + </text> + <text name="title_not_worn"> + [DESC]: ikke båret + </text> + <text name="path"> + Placeret i [PATH] + </text> + <text name="not worn instructions"> + Brug en ny "alpha mask" ved at trække en fra din beholding til din avatar. +Alternativt kan du lave en fra bunden og bære denne. + </text> + <text name="no modify instructions"> + Du har ikke rettigheder til at ændre denne. + </text> + <text name="Item Action Label"> + Alpha: + </text> + <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Øvre alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - øjne" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - hår" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/> + <button label="Lav ny "Alpha"" label_selected="Lav ny "Alpha"" name="Create New"/> + <button label="Tag af" label_selected="Tag af" name="Take Off"/> + <button label="Gem" label_selected="Gem" name="Save"/> + <button label="Gem som..." label_selected="Gem som..." name="Save As"/> + <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/> + </panel> + <panel label="Tatovering" name="Tattoo"> + <text name="title"> + [DESC] + </text> + <text name="title_no_modify"> + [DESC]: kan ikke ændre + </text> + <text name="title_loading"> + [DESC]: indlæser... + </text> + <text name="title_not_worn"> + [DESC]: ikke båret + </text> + <text name="path"> + Placeret i [PATH] + </text> + <text name="not worn instructions"> + Brug en ny tatovering ved at trække en fra din beholding til din avatar. +Alternativt kan du lave en fra bunden og bære denne. + </text> + <text name="no modify instructions"> + Du har ikke rettigheder til at ændre denne. + </text> + <text name="Item Action Label"> + Tatovering: + </text> + <texture_picker label="Tatovering - hovede" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/> + <button label="lav ny tatovering" label_selected="Lav ny tatovering" name="Create New"/> + <button label="Tag af" label_selected="Tag af" name="Take Off"/> + <button label="Gem" label_selected="Gem" name="Save"/> + <button label="Gem som..." label_selected="Gem som..." name="Save As"/> + <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/> + </panel> </tab_container> <scroll_container left="212" name="panel_container"/> + <button label="Lav sæt" label_selected="Lav sæt" name="make_outfit_btn"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> - <button label="Opret sæt..." label_selected="Opret sæt..." name="Make Outfit"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_device_settings.xml b/indra/newview/skins/default/xui/da/floater_device_settings.xml index 5e53a697f2..06d431a8f9 100644 --- a/indra/newview/skins/default/xui/da/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/da/floater_device_settings.xml @@ -1,2 +1,2 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_device_settings" title="STEMME CHAT INDSTILLINGER" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_device_settings" title="STEMME CHAT ENHEDSOPSÆTNING"/> diff --git a/indra/newview/skins/default/xui/da/floater_env_settings.xml b/indra/newview/skins/default/xui/da/floater_env_settings.xml index 6c5b6d3b6b..8d9c05500b 100644 --- a/indra/newview/skins/default/xui/da/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/da/floater_env_settings.xml @@ -1,26 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Environment Editor Floater" title="REDIGERING AF OMGIVELSER"> + <floater.string name="timeStr"> + [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc] + </floater.string> <text name="EnvTimeText"> Tid på dagen </text> <text name="EnvTimeText2"> 00:00 </text> - <slider label="" name="EnvTimeSlider" /> + <slider label="" name="EnvTimeSlider"/> <text name="EnvCloudText"> Skydække </text> - <slider label="" name="EnvCloudSlider" /> + <slider label="" name="EnvCloudSlider"/> <text name="EnvWaterColorText"> Farve på vand </text> - <color_swatch label="" name="EnvWaterColor" tool_tip="Klik for at åbne farvevælger" /> + <color_swatch label="" name="EnvWaterColor" tool_tip="Klik for at åbne farvevælger"/> <text name="EnvWaterFogText"> Tåge på vand </text> - <slider label="" name="EnvWaterFogSlider" /> - <button label="Benyt tid fra estate" name="EnvUseEstateTimeButton" /> - <button label="Avanceret himmel" name="EnvAdvancedSkyButton" /> - <button label="Avanceret vand" name="EnvAdvancedWaterButton" /> - <button label="?" name="EnvSettingsHelpButton" /> + <slider label="" name="EnvWaterFogSlider"/> + <button label="Benyt tid fra estate" name="EnvUseEstateTimeButton"/> + <button label="Avanceret himmel" name="EnvAdvancedSkyButton"/> + <button label="Avanceret vand" name="EnvAdvancedWaterButton"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml index fc1231ceef..2b10afe7e3 100644 --- a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml @@ -1,30 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Hardware Settings Floater" title="HARDWARE OPSÆTNING"> <text name="Filtering:"> Filtrering: </text> - <check_box label="Anisotropic filtrering (langsommere når aktiveret)" name="ani" /> + <check_box label="Anisotropic filtrering (langsommere når aktiveret)" name="ani"/> <text name="Antialiasing:"> Antialiasing: </text> <combo_box label="Antialiasing" name="fsaa" width="100"> - <combo_box.item name="FSAADisabled" label="Slået fra"/> - <combo_box.item name="2x" label="2x"/> - <combo_box.item name="4x" label="4x"/> - <combo_box.item name="8x" label="8x"/> - <combo_box.item name="16x" label="16x"/> + <combo_box.item label="Slået fra" name="FSAADisabled"/> + <combo_box.item label="2x" name="2x"/> + <combo_box.item label="4x" name="4x"/> + <combo_box.item label="8x" name="8x"/> + <combo_box.item label="16x" name="16x"/> </combo_box> - <spinner label="Gamma:" name="gamma" /> + <spinner label="Gamma:" name="gamma"/> <text name="(brightness, lower is brighter)"> (Lysstyrke, lavere er lysere, 0=benyt standard) </text> <text name="Enable VBO:"> Aktivér VBO: </text> - <check_box label="Aktivér OpenGL Vertex Buffer objekter" name="vbo" - tool_tip="Aktivér af dette på nyere hardware giver performance forbedring. På ældre hardware kan aktivering medfø nedbrud." /> - <slider label="Tekstur hukommelse (MB):" name="GrapicsCardTextureMemory" - tool_tip="Mængde hukommelse der skal allokeres til teksturer (textures). Standardindstilling er hukommelse på grafikkortet. Reduktion kan medfø bedre ydeevne, men kan samtidig gøre teksturer mere udflydende." /> - <spinner label="Tåge: afstandsforhold:" name="fog" /> - <button label="OK" label_selected="OK" name="OK" /> + <check_box initial_value="true" label="Aktivér OpenGL Vertex Buffer objekter" name="vbo" tool_tip="Aktivér af dette på nyere hardware giver performance forbedring. På ældre hardware kan aktivering medfø nedbrud."/> + <slider label="Tekstur hukommelse (MB):" name="GraphicsCardTextureMemory" tool_tip="Mængde hukommelse der skal allokeres til teksturer (textures). Standardindstilling er hukommelse på grafikkortet. Reduktion kan medfø bedre ydeevne, men kan samtidig gøre teksturer mere udflydende."/> + <spinner label="Tåge: afstandsforhold:" name="fog"/> + <button label="OK" label_selected="OK" name="OK"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_help_browser.xml b/indra/newview/skins/default/xui/da/floater_help_browser.xml new file mode 100644 index 0000000000..fc52796344 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_help_browser.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_help_browser" title="HJÆLP"> + <layout_stack name="stack1"> + <layout_panel name="external_controls"> + <button label="Åben i min web browser" name="open_browser"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_im.xml b/indra/newview/skins/default/xui/da/floater_im.xml index 0b42b78706..519a70d1d9 100644 --- a/indra/newview/skins/default/xui/da/floater_im.xml +++ b/indra/newview/skins/default/xui/da/floater_im.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="im_floater" title="Personlig samtale (IM)"> <string name="only_user_message"> Du er den eneste deltager i denne samtale @@ -10,7 +10,7 @@ Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat. </string> <string name="muted_message"> - Du har blokeret denne beboer. Hvis du starter en samtale vil denne blokering automatisk blive fjernet. + Du har blokeret denne beboer. Hvis du sender besked vil denne blokering fjernes. </string> <string name="generic_request_error"> Kunne ikke etablere forbindelse, prøv igen senere diff --git a/indra/newview/skins/default/xui/da/floater_im_container.xml b/indra/newview/skins/default/xui/da/floater_im_container.xml new file mode 100644 index 0000000000..da6f877f56 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_im_container.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<multi_floater name="floater_im_box" title="Personlige beskeder"/> diff --git a/indra/newview/skins/default/xui/da/floater_image_preview.xml b/indra/newview/skins/default/xui/da/floater_image_preview.xml index 345c9aa6d1..52fd9f80c0 100644 --- a/indra/newview/skins/default/xui/da/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_image_preview.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Image Preview" title=""> <text name="name_label"> Navn: @@ -10,23 +10,23 @@ Se billede som: </text> <combo_box label="Tøj type" name="clothing_type_combo"> - <combo_box.item name="Image" label="Billede"/> - <combo_box.item name="Hair" label="Hår"/> - <combo_box.item name="FemaleHead" label="Kvinde - hoved"/> - <combo_box.item name="FemaleUpperBody" label="Kvinde - overkrop"/> - <combo_box.item name="FemaleLowerBody" label="Kvinde - underkrop"/> - <combo_box.item name="MaleHead" label="Mand - hoved"/> - <combo_box.item name="MaleUpperBody" label="Mand - overkrop"/> - <combo_box.item name="MaleLowerBody" label="Mand - underkrop"/> - <combo_box.item name="Skirt" label="Nederdel"/> - <combo_box.item name="SculptedPrim" label="Sculpted prim"/> + <combo_box.item label="Billede" name="Image"/> + <combo_box.item label="Hår" name="Hair"/> + <combo_box.item label="Kvinde - hoved" name="FemaleHead"/> + <combo_box.item label="Kvinde - overkrop" name="FemaleUpperBody"/> + <combo_box.item label="Kvinde - underkrop" name="FemaleLowerBody"/> + <combo_box.item label="Mand - hoved" name="MaleHead"/> + <combo_box.item label="Mand - overkrop" name="MaleUpperBody"/> + <combo_box.item label="Mand - underkrop" name="MaleLowerBody"/> + <combo_box.item label="Nederdel" name="Skirt"/> + <combo_box.item label="Sculpted Prim" name="SculptedPrim"/> </combo_box> <text name="bad_image_text"> Kunne ikke læse billede. Prøv at gemme billede som en 24 bit Targa fil (.tga). </text> - <check_box label="Benyt komprimering uden tab" name="lossless_check" /> - <button label="Annullér" name="cancel_btn" /> - <button label="Hent (L$[AMOUNT])" name="ok_btn" /> + <check_box label="Benyt komprimering uden tab" name="lossless_check"/> + <button label="Annullér" name="cancel_btn"/> + <button label="Hent (L$[AMOUNT])" name="ok_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_incoming_call.xml b/indra/newview/skins/default/xui/da/floater_incoming_call.xml new file mode 100644 index 0000000000..3a1ef2e47d --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_incoming_call.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="incoming call" title="UKENDT PERSON KALDER OP"> + <floater.string name="localchat"> + Stemme chat nærved + </floater.string> + <floater.string name="anonymous"> + anonym + </floater.string> + <floater.string name="VoiceInviteP2P"> + kalder op. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + har sluttet sig til stemme chat opkald med en konference chat. + </floater.string> + <text name="question"> + Ønsker du at forlade [CURRENT_CHAT] og slutte dig til denne stemme chat? + </text> + <button label="Acceptér" label_selected="Acceptér" name="Accept"/> + <button label="Afvis" label_selected="Afvis" name="Reject"/> + <button label="Start IM" name="Start IM"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_inspect.xml b/indra/newview/skins/default/xui/da/floater_inspect.xml index 0610e9408f..d0dca8863a 100644 --- a/indra/newview/skins/default/xui/da/floater_inspect.xml +++ b/indra/newview/skins/default/xui/da/floater_inspect.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="INSPECÉR OBJEKTER"> +<floater name="inspect" title="UNDERSØG OBJEKT"> + <floater.string name="timeStamp"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </floater.string> <scroll_list name="object_list" tool_tip="Vælg et objekt fra listen for at markere det"> - <column label="Objekt navn" name="object_name"/> - <column label="Objekt ejer" name="owner_name"/> - <column label="Bygget af" name="creator_name"/> - <column label="Lavet den " name="creation_date"/> + <scroll_list.columns label="Objekt navn" name="object_name"/> + <scroll_list.columns label="Objekt ejer" name="owner_name"/> + <scroll_list.columns label="Bygget af" name="creator_name"/> + <scroll_list.columns label="Lavet den " name="creation_date"/> </scroll_list> <button label="Se profil for ejer..." label_selected="" name="button owner" tool_tip="Se profilen for ejeren af det markerede objekt på listen"/> <button label="Se profil for bygger..." label_selected="" name="button creator" tool_tip="Se profilen for den beboer der har bygget det markerede objekt på listen"/> diff --git a/indra/newview/skins/default/xui/da/floater_inventory.xml b/indra/newview/skins/default/xui/da/floater_inventory.xml index 8bfe7164d0..d80051fb84 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory.xml @@ -1,47 +1,16 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Inventory" title="BEHOLDNING"> - <search_editor label="Skriv her for at søge" name="inventory search editor" /> - <tab_container name="inventory filter tabs"> - <inventory_panel label="Alle ting" name="All Items" /> - <inventory_panel label="Nye ting" name="Recent Items" /> - </tab_container> - <menu_bar name="Inventory Menu"> - <menu label="Filer" name="File"> - <menu_item_call label="Åben" name="Open" /> - <menu_item_call label="Nyt vindue" name="New Window" /> - <menu_item_call label="Vis filtre" name="Show Filters" /> - <menu_item_call label="Nulstil filtre" name="Reset Current" /> - <menu_item_call label="Luk alle mapper" name="Close All Folders" /> - <menu_item_call label="Tøm papirkurv" name="Empty Trash" /> - </menu> - <menu label="Opret" name="Create"> - <menu_item_call label="Ny mappe" name="New Folder" /> - <menu_item_call label="Nyt script" name="New Script" /> - <menu_item_call label="Ny note" name="New Note" /> - <menu_item_call label="Ny bevægelse" name="New Gesture" /> - <menu name="New Clothes"> - <menu_item_call label="Ny trøje" name="New Shirt" /> - <menu_item_call label="Nye bukser" name="New Pants" /> - <menu_item_call label="Nye sko" name="New Shoes" /> - <menu_item_call label="Nye strømper" name="New Socks" /> - <menu_item_call label="Ny jakke" name="New Jacket" /> - <menu_item_call label="Ny nederdel" name="New Skirt" /> - <menu_item_call label="Nye handsker" name="New Gloves" /> - <menu_item_call label="Ny undertrøje" name="New Undershirt" /> - <menu_item_call label="Nye underbukser" name="New Underpants" /> - </menu> - <menu name="New Body Parts"> - <menu_item_call label="Ny figur" name="New Shape" /> - <menu_item_call label="Ny hud" name="New Skin" /> - <menu_item_call label="Nyt hår" name="New Hair" /> - <menu_item_call label="Nye øjne" name="New Eyes" /> - </menu> - </menu> - <menu label="Sortér" name="Sort"> - <menu_item_check label="Efter navn" name="By Name" /> - <menu_item_check label="Efter dato" name="By Date" /> - <menu_item_check label="Altid mapper efter navn" name="Folders Always By Name" /> - <menu_item_check label="System-mapper i toppen" name="System Folders To Top" /> - </menu> - </menu_bar> + <floater.string name="Title"> + Beholdning + </floater.string> + <floater.string name="TitleFetching"> + Beholdning (henter [ITEM_COUNT] genstande...) [FILTER] + </floater.string> + <floater.string name="TitleCompleted"> + Beholdning ([ITEM_COUNT] genstande) [FILTER] + </floater.string> + <floater.string name="Fetched"> + Hentet + </floater.string> + <panel label="Beholdningspanel" name="Inventory Panel"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml index fbcf202c54..fa36fab762 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml @@ -1,5 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="item properties" title="EGENSKABER FOR OBJEKT I BEHOLDNING"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="item properties" title="OPLYSNINGER OM BEHOLDNINGSGENSTAND"> + <floater.string name="unknown"> + (ukendt) + </floater.string> + <floater.string name="public"> + (offentlig) + </floater.string> + <floater.string name="you_can"> + Du kan: + </floater.string> + <floater.string name="owner_can"> + Ejer kan: + </floater.string> + <floater.string name="acquiredDate"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </floater.string> <text name="LabelItemNameTitle"> Navn: </text> @@ -12,14 +27,14 @@ <text name="LabelCreatorName"> Nicole Linden </text> - <button label="Profil..." label_selected="" name="BtnCreator" /> + <button label="Profil..." label_selected="" name="BtnCreator"/> <text name="LabelOwnerTitle"> Ejer: </text> <text name="LabelOwnerName"> Thrax Linden </text> - <button label="Profil..." label_selected="" name="BtnOwner" /> + <button label="Profil..." label_selected="" name="BtnOwner"/> <text name="LabelAcquiredTitle"> Erhvervet: </text> @@ -27,55 +42,32 @@ Wed May 24 12:50:46 2006 </text> <text name="OwnerLabel"> - Du kan: - </text> - <check_box label="Redigere" name="CheckOwnerModify" /> - <check_box label="Kopiere" name="CheckOwnerCopy" /> - <check_box label="Sælge/give væk" name="CheckOwnerTransfer" /> - <text name="BaseMaskDebug"> - S: - </text> - <text name="OwnerMaskDebug"> - E: + Dig: </text> - <text name="GroupMaskDebug"> - G: + <check_box label="Redigér" name="CheckOwnerModify"/> + <check_box label="Kopiere" name="CheckOwnerCopy"/> + <check_box label="Sælg" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Enhver: </text> - <text name="EveryoneMaskDebug"> - A: + <check_box label="Kopiér" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Gruppe: </text> - <text name="NextMaskDebug"> - N: - </text> - <check_box label="Del med gruppe" name="CheckShareWithGroup" /> - <check_box label="Tillad alle at kopiere" name="CheckEveryoneCopy" /> + <check_box label="Del" name="CheckShareWithGroup"/> <text name="NextOwnerLabel"> - Næste ejer kan: - </text> - <check_box label="Redigere" name="CheckNextOwnerModify" /> - <check_box label="Kopiere" name="CheckNextOwnerCopy" /> - <check_box label="Sælge/Give væk" name="CheckNextOwnerTransfer" /> - <text name="SaleLabel"> - Markér ting: + Næste ejer: + </text> + <check_box label="Redigér" name="CheckNextOwnerModify"/> + <check_box label="Kopiere" name="CheckNextOwnerCopy"/> + <check_box label="Sælg" name="CheckNextOwnerTransfer"/> + <check_box label="Til salg" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Kopiér" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Pris:" name="Edit Cost"/> + <text name="CurrencySymbol"> + L$ </text> - <check_box label="Til salg" name="CheckPurchase" /> - <radio_group name="RadioSaleType"> - <radio_item name="radio" label="Original" /> - <radio_item name="radio2" label="Kopi" /> - </radio_group> - <text name="TextPrice"> - Pris: L$ - </text> - <string name="unknown"> - (ukendt) - </string> - <string name="public"> - (offentlig) - </string> - <string name="you_can"> - Du kan: - </string> - <string name="owner_can"> - Ejer kan: - </string> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_joystick.xml b/indra/newview/skins/default/xui/da/floater_joystick.xml index 4954b7b619..49e1397e9f 100644 --- a/indra/newview/skins/default/xui/da/floater_joystick.xml +++ b/indra/newview/skins/default/xui/da/floater_joystick.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Joystick" title="JOYSTICK OPSÆTNING"> - <check_box name="enable_joystick" label="Aktiver Joystick:"/> + <check_box label="Aktiver Joystick:" name="enable_joystick"/> <spinner label="X akse mapping" name="JoystickAxis1"/> <spinner label="Y akse mapping" name="JoystickAxis2"/> <spinner label="Z akse mapping" name="JoystickAxis0"/> @@ -14,9 +14,9 @@ <text name="Control Modes:"> Kontrollér: </text> - <check_box name="JoystickAvatarEnabled" label="Avatar"/> - <check_box name="JoystickBuildEnabled" label="Build"/> - <check_box name="JoystickFlycamEnabled" label="Flycam"/> + <check_box label="Avatar" name="JoystickAvatarEnabled"/> + <check_box label="Build" name="JoystickBuildEnabled"/> + <check_box label="Flycam" name="JoystickFlycamEnabled"/> <text name="XScale"> X følsomhed </text> diff --git a/indra/newview/skins/default/xui/da/floater_lagmeter.xml b/indra/newview/skins/default/xui/da/floater_lagmeter.xml index bcf15ea926..149d174c34 100644 --- a/indra/newview/skins/default/xui/da/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/da/floater_lagmeter.xml @@ -1,152 +1,151 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="LAG MÅLER"> - <button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/> - <text name="client"> - Klient: - </text> - <text name="client_text"> - Normal - </text> - <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/> - <text name="network"> - Netværk: - </text> - <text name="network_text"> - Normal - </text> - <button label="" label_selected="" name="server_lagmeter" tool_tip="Status for server lag"/> - <text name="server"> - Server: - </text> - <text name="server_text"> - Normal - </text> - <button label="?" name="server_help"/> - <button label=">>" name="minimize"/> - <string name="max_title_msg"> +<floater name="floater_lagmeter" title="LAG METER"> + <floater.string name="max_title_msg"> Lag måler - </string> - <string name="max_width_px"> + </floater.string> + <floater.string name="max_width_px"> 360 - </string> - <string name="min_title_msg"> + </floater.string> + <floater.string name="min_title_msg"> Lag - </string> - <string name="min_width_px"> + </floater.string> + <floater.string name="min_width_px"> 90 - </string> - <string name="client_text_msg"> + </floater.string> + <floater.string name="client_text_msg"> Klient - </string> - <string name="client_frame_rate_critical_fps"> + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> 10 - </string> - <string name="client_frame_rate_warning_fps"> + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> 15 - </string> - <string name="client_frame_time_window_bg_msg"> + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> Normal, vindue i baggrund - </string> - <string name="client_frame_time_critical_msg"> + </floater.string> + <floater.string name="client_frame_time_critical_msg"> Klients billeder/sek under [CLIENT_FRAME_RATE_CRITICAL] - </string> - <string name="client_frame_time_warning_msg"> + </floater.string> + <floater.string name="client_frame_time_warning_msg"> Klients billeder/sek mellem [CLIENT_FRAME_RATE_CRITICAL] og [CLIENT_FRAME_RATE_WARNING] - </string> - <string name="client_frame_time_normal_msg"> + </floater.string> + <floater.string name="client_frame_time_normal_msg"> Normal - </string> - <string name="client_draw_distance_cause_msg"> + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> Mulig årsag: 'Vis afstand' sat for højt i grafik indstillinger - </string> - <string name="client_texture_loading_cause_msg"> + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> Mulig årsag: Billeder hentes - </string> - <string name="client_texture_memory_cause_msg"> + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> Mulig årsag: For mange billeder i hukommelse - </string> - <string name="client_complex_objects_cause_msg"> + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> Mulig årsag: For mange komplekse objekter i scenariet - </string> - <string name="network_text_msg"> + </floater.string> + <floater.string name="network_text_msg"> Netværk - </string> - <string name="network_packet_loss_critical_pct"> + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> 10 - </string> - <string name="network_packet_loss_warning_pct"> + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> 5 - </string> - <string name="network_packet_loss_critical_msg"> + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> Forbindelsen mister over [NETWORK_PACKET_LOSS_CRITICAL]% pakker - </string> - <string name="network_packet_loss_warning_msg"> + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> Forbindelsen mister [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% pakker - </string> - <string name="network_performance_normal_msg"> + </floater.string> + <floater.string name="network_performance_normal_msg"> Normal - </string> - <string name="network_ping_critical_ms"> + </floater.string> + <floater.string name="network_ping_critical_ms"> 600 - </string> - <string name="network_ping_warning_ms"> + </floater.string> + <floater.string name="network_ping_warning_ms"> 300 - </string> - <string name="network_ping_critical_msg"> + </floater.string> + <floater.string name="network_ping_critical_msg"> Forbindelsens ping tider er over [NETWORK_PING_CRITICAL] ms - </string> - <string name="network_ping_warning_msg"> + </floater.string> + <floater.string name="network_ping_warning_msg"> Forbindelsens ping tider er [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms - </string> - <string name="network_packet_loss_cause_msg"> + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> Muligvis dårlig forbindelse eller 'båndbredde' sat for højt i netværksopsætning. - </string> - <string name="network_ping_cause_msg"> + </floater.string> + <floater.string name="network_ping_cause_msg"> Muligvis dårlig forbindelse eller fil delings program. - </string> - <string name="server_text_msg"> + </floater.string> + <floater.string name="server_text_msg"> Server - </string> - <string name="server_frame_rate_critical_fps"> + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> 20 - </string> - <string name="server_frame_rate_warning_fps"> + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> 30 - </string> - <string name="server_single_process_max_time_ms"> + </floater.string> + <floater.string name="server_single_process_max_time_ms"> 20 - </string> - <string name="server_frame_time_critical_msg"> + </floater.string> + <floater.string name="server_frame_time_critical_msg"> Simulator framerate er under [SERVER_FRAME_RATE_CRITICAL] - </string> - <string name="server_frame_time_warning_msg"> + </floater.string> + <floater.string name="server_frame_time_warning_msg"> Simulator framerate er mellem [SERVER_FRAME_RATE_CRITICAL] og [SERVER_FRAME_RATE_WARNING] - </string> - <string name="server_frame_time_normal_msg"> + </floater.string> + <floater.string name="server_frame_time_normal_msg"> Normal - </string> - <string name="server_physics_cause_msg"> + </floater.string> + <floater.string name="server_physics_cause_msg"> Mulig årsag: For mange fysiske objekter - </string> - <string name="server_scripts_cause_msg"> + </floater.string> + <floater.string name="server_scripts_cause_msg"> Mulig årsag: For mange objekter med script - </string> - <string name="server_net_cause_msg"> + </floater.string> + <floater.string name="server_net_cause_msg"> Mulig årsag: For meget netværks trafik - </string> - <string name="server_agent_cause_msg"> + </floater.string> + <floater.string name="server_agent_cause_msg"> Mulig årsag: For mange avatarer i bevægelse i regionen - </string> - <string name="server_images_cause_msg"> + </floater.string> + <floater.string name="server_images_cause_msg"> Mulig årsag: For mange billed udregninger - </string> - <string name="server_generic_cause_msg"> + </floater.string> + <floater.string name="server_generic_cause_msg"> Mulig årsag: Simulator belastning for stor - </string> - <string name="smaller_label"> + </floater.string> + <floater.string name="smaller_label"> >> - </string> - <string name="bigger_label"> + </floater.string> + <floater.string name="bigger_label"> << - </string> + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/> + <text name="client"> + Klient + </text> + <text name="client_text"> + Normal + </text> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/> + <text name="network"> + Netværk + </text> + <text name="network_text"> + Normal + </text> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Status for server lag"/> + <text name="server"> + Server + </text> + <text name="server_text"> + Normal + </text> + <button label=">>" name="minimize" tool_tip="Ændre størrelse"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml index ebc86c5c73..2b008f133c 100644 --- a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script ed float" title="LSL WIKI"> - <check_box label="Følg markøreren" name="lock_check" /> - <combo_box label="Lås" name="history_combo" left_delta="114" width="70"/> - <button label="Tilbage" name="back_btn" /> - <button label="Frem" name="fwd_btn" /> + <check_box label="Følg markøreren" name="lock_check"/> + <combo_box label="Lås" left_delta="114" name="history_combo" width="70"/> + <button label="Tilbage" name="back_btn"/> + <button label="Frem" name="fwd_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_media_settings.xml b/indra/newview/skins/default/xui/da/floater_media_settings.xml new file mode 100644 index 0000000000..67c122b9d5 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_media_settings.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="media_settings" title="MEDIA INDSTILLINGER"> + <button label="OK" label_selected="OK" name="OK"/> + <button label="Annullér" label_selected="Annullér" name="Cancel"/> + <button label="Anvend" label_selected="Anvend" name="Apply"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml new file mode 100644 index 0000000000..ef4e4cbe7e --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="nearby_chat" title="CHAT NÆRVED"/> diff --git a/indra/newview/skins/default/xui/da/floater_openobject.xml b/indra/newview/skins/default/xui/da/floater_openobject.xml index 5875b7a967..92fdd1e0a6 100644 --- a/indra/newview/skins/default/xui/da/floater_openobject.xml +++ b/indra/newview/skins/default/xui/da/floater_openobject.xml @@ -1,10 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="objectcontents" title="OBJEKT INDHOLD"> <text name="object_name"> [DESC]: </text> - <button label="Kopiér til beholdning" label_selected="Kopiér til beholdning" - name="copy_to_inventory_button" /> - <button label="Kopiér og tag på" label_selected="Kopiér og tag på" - name="copy_and_wear_button" /> + <button label="Kopiér til beholdning" label_selected="Kopiér til beholdning" name="copy_to_inventory_button"/> + <button label="Kopiér og tag på" label_selected="Kopiér og tag på" name="copy_and_wear_button"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_outgoing_call.xml b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml new file mode 100644 index 0000000000..5c98d9855f --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="outgoing call" title="KALDER"> + <floater.string name="localchat"> + Stemme chat nærved + </floater.string> + <floater.string name="anonymous"> + anonym + </floater.string> + <floater.string name="VoiceInviteP2P"> + kalder op. + </floater.string> + <floater.string name="VoiceInviteAdHoc"> + har sluttet sig til stemmechat med en konference chat. + </floater.string> + <text name="connecting"> + Tilslutter til [CALLEE_NAME] + </text> + <text name="calling"> + Kalder [CALLEE_NAME] + </text> + <text name="noanswer"> + Intet svar. Prøv igen senere. + </text> + <text name="leaving"> + Forlader [CURRENT_CHAT]. + </text> + <button label="Annullér" label_selected="Annullér" name="Cancel"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_pay.xml b/indra/newview/skins/default/xui/da/floater_pay.xml index f39cfa4871..b2cdc0bfe7 100644 --- a/indra/newview/skins/default/xui/da/floater_pay.xml +++ b/indra/newview/skins/default/xui/da/floater_pay.xml @@ -1,21 +1,25 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> - <button label="L$1" label_selected="L$1" name="fastpay 1" /> - <button label="L$5" label_selected="L$5" name="fastpay 5" /> - <button label="L$10" label_selected="L$10" name="fastpay 10" /> - <button label="L$20" label_selected="L$20" name="fastpay 20" /> - <button label="Betal" label_selected="Betal" name="pay btn" /> - <button label="Annullér" label_selected="Annullér" name="cancel btn" /> - <text name="payee_label" left="5" width="81"> - Betal beboer: + <string name="payee_group"> + Betal gruppe + </string> + <string name="payee_resident"> + Betal beboer + </string> + <text left="5" name="payee_label" width="81"> + Betal: </text> + <icon name="icon_person" tool_tip="Person"/> <text name="payee_name"> [FIRST] [LAST] </text> - <text name="fastpay text"> - Hurtig betal: - </text> - <text name="amount text" left="4" > - Beløb: + <button label="L$1" label_selected="L$1" name="fastpay 1"/> + <button label="L$5" label_selected="L$5" name="fastpay 5"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> + <button label="L$20" label_selected="L$20" name="fastpay 20"/> + <text left="4" name="amount text"> + eler vælg beløb: </text> + <button label="Betal" label_selected="Betal" name="pay btn"/> + <button label="Annullér" label_selected="Annullér" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_pay_object.xml b/indra/newview/skins/default/xui/da/floater_pay_object.xml index 09e2e3f5d0..f74e097da2 100644 --- a/indra/newview/skins/default/xui/da/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/da/floater_pay_object.xml @@ -1,30 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Give Money" title=""> - <text name="payee_group"> - Betal gruppe: - </text> - <text name="payee_resident"> - Betal beboer: - </text> + <string name="payee_group"> + Betal gruppe + </string> + <string name="payee_resident"> + Betal beboer + </string> + <icon name="icon_person" tool_tip="Person"/> <text name="payee_name"> [FIRST] [LAST] </text> <text name="object_name_label"> Via objekt: </text> + <icon name="icon_object" tool_tip="Objekter"/> <text name="object_name_text"> ... </text> - <text name="fastpay text"> - Hurtig betal: - </text> + <button label="L$1" label_selected="L$1" name="fastpay 1"/> + <button label="L$5" label_selected="L$5" name="fastpay 5"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> + <button label="L$20" label_selected="L$20" name="fastpay 20"/> <text name="amount text"> - Beløb: + Eller vælg beløb: </text> - <button label="L$1" label_selected="L$1" name="fastpay 1" /> - <button label="L$5" label_selected="L$5" name="fastpay 5" /> - <button label="L$10" label_selected="L$10" name="fastpay 10" /> - <button label="L$20" label_selected="L$20" name="fastpay 20" /> - <button label="Betal" label_selected="Betal" name="pay btn" /> - <button label="Annullér" label_selected="Annullér" name="cancel btn" /> + <button label="Betal" label_selected="Betal" name="pay btn"/> + <button label="Annullér" label_selected="Annullér" name="cancel btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_event.xml b/indra/newview/skins/default/xui/da/floater_preview_event.xml index 584085fea0..3e870b58ae 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_event.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="EVENT INFORMATION" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="EVENT INFORMATION"> + <floater.string name="Title"> + Event: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml index 0053cb852f..bfa3c150a9 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml @@ -1,14 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="gesture_preview"> - <string name="stop_txt"> + <floater.string name="step_anim"> + Animation til afspilning: + </floater.string> + <floater.string name="step_sound"> + Lyd til afspilning: + </floater.string> + <floater.string name="step_chat"> + Sig: + </floater.string> + <floater.string name="step_wait"> + Vent: + </floater.string> + <floater.string name="stop_txt"> Stop - </string> - <string name="preview_txt"> + </floater.string> + <floater.string name="preview_txt"> Vis - </string> - <string name="none_text"> + </floater.string> + <floater.string name="none_text"> -- Intet -- - </string> + </floater.string> + <floater.string name="Title"> + Bevægelse: [NAME] + </floater.string> <text name="desc_label"> Beskrivelse: </text> @@ -23,33 +38,27 @@ Genvejstast: </text> <combo_box label="Ingen" name="modifier_combo" width="60"/> - <combo_box label="Ingen" name="key_combo" left_delta="70" width="60"/> + <combo_box label="Ingen" left_delta="70" name="key_combo" width="60"/> <text name="library_label"> Type: </text> + <scroll_list name="library_list"/> + <button label="Tilføj >>" name="add_btn"/> <text name="steps_label"> Trin: </text> - <scroll_list name="library_list"> - Animation -Lyd -Chat -Vent - </scroll_list> - <button label="Tilføj >>" name="add_btn"/> - <button label="Flyt op" name="up_btn"/> - <button label="Flyt ned" name="down_btn"/> + <button label="Op" name="up_btn"/> + <button label="Ned" name="down_btn"/> <button label="Fjern" name="delete_btn"/> - <text name="help_label"> - Alle trin vil ske samtidigt, -medmindre du tilføjer vente trin. - </text> <radio_group name="animation_trigger_type"> - <radio_item name="start" label="Start" /> - <radio_item name="stop" label="Stop" /> + <radio_item label="Start" name="start"/> + <radio_item label="Stop" name="stop"/> </radio_group> <check_box label="Indtil animation er færdig" name="wait_anim_check"/> <check_box label="tid i sekunder" name="wait_time_check"/> + <text name="help_label"> + Alle trin vil ske samtidigt, medmindre du tilføjer vente trin. + </text> <check_box label="Aktiv" name="active_check" tool_tip="Aktive bevægelser kan blive aktiveret ved at skrive deress udløser tekst eller ved at trykke på genvejstaste. Bevægelser vil normalt være inaktive hvis der allerede findes en tilsvarende genvejstaste."/> <button label="Vis" name="preview_btn"/> <button label="Gem" name="save_btn"/> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml new file mode 100644 index 0000000000..9892a92e4c --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="BEVÆGELSE GENVEJ"/> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml new file mode 100644 index 0000000000..4d4cca1d90 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="GENVEJ BEVÆGELSER"> + <text name="trigger_label"> + Chat: + </text> + <text name="key_label"> + Tastatur: + </text> + <combo_box label="Intet" name="modifier_combo"/> + <combo_box label="Intet" name="key_combo"/> + <text name="replace_text" tool_tip="Erstat udløser ord med disse ord. For eksempel uløser "hello" erstat med "hej" vil ændre chat 'Jeg ville bare sige hello' til 'Jeg ville bare sige hej' samtidig med bevægelsen afspilles!"> + Erstat: + </text> + <line_editor name="replace_editor" tool_tip="Erstat udløser ord med disse ord. For eksempel uløser "hello" erstat med "hej" vil ændre chat 'Jeg ville bare sige hello' til 'Jeg ville bare sige hej' samtidig med bevægelsen afspilles!"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml new file mode 100644 index 0000000000..9892a92e4c --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="BEVÆGELSE GENVEJ"/> diff --git a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml index 7258824878..2ebec4462f 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml @@ -1,16 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview notecard" title="NOTE:"> - <button label="Gem" label_selected="Gem" name="Save"/> + <floater.string name="no_object"> + Kunne ikke finde objekt der indeholder denne note. + </floater.string> + <floater.string name="not_allowed"> + Du har ikke rettigheder til at se denne note. + </floater.string> + <floater.string name="Title"> + Note: [NAME] + </floater.string> + <floater.string label="Gem" label_selected="Gem" name="Save"> + Gem + </floater.string> <text name="desc txt"> Beskrivelse: </text> <text_editor name="Notecard Editor"> Indlæser... </text_editor> - <string name="no_object"> - Kunne ikke finde objekt der indeholder denne note. - </string> - <string name="not_allowed"> - Du har ikke tilladelse til at læse denne note. - </string> + <button label="Gem" label_selected="Gem" name="Save"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_texture.xml b/indra/newview/skins/default/xui/da/floater_preview_texture.xml index 250659f249..ab7ddbcc72 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_texture.xml @@ -1,9 +1,44 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="preview_texture"> + <floater.string name="Title"> + Tekstur: [NAME] + </floater.string> + <floater.string name="Copy"> + Kopiér til beholdning + </floater.string> <text name="desc txt"> Beskrivelse: </text> <text name="dimensions"> - Størrelse: [WIDTH] x [HEIGHT] + [WIDTH]px x [HEIGHT]px </text> + <combo_box name="combo_aspect_ratio" tool_tip="Forhåndsvisning med et bestemt billedformat"> + <combo_item name="Unconstrained"> + Ikke låst + </combo_item> + <combo_item name="1:1" tool_tip="Typisk valg til gruppe logo eller "Real world" profil billede"> + 1:1 + </combo_item> + <combo_item name="4:3" tool_tip="Typisk valg til din "Second Life Profil" billede"> + 4:3 + </combo_item> + <combo_item name="10:7" tool_tip="Typisk valg til billeder i annoncer, landemærker og søgninger"> + 10:7 + </combo_item> + <combo_item name="3:2" tool_tip="Typisk valg til "Om land" billede"> + 3:2 + </combo_item> + <combo_item name="16:10"> + 16:10 + </combo_item> + <combo_item name="16:9" tool_tip="Typisk valg til favorit billeder i profil"> + 16:9 + </combo_item> + <combo_item name="2:1"> + 2:1 + </combo_item> + </combo_box> + <button label="OK" name="keep"/> + <button label="Annullér" name="discard"/> + <button label="Gem som" name="save_tex_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/da/floater_script_debug_panel.xml new file mode 100644 index 0000000000..e70a30fa24 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_script_debug_panel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/> diff --git a/indra/newview/skins/default/xui/da/floater_script_preview.xml b/indra/newview/skins/default/xui/da/floater_script_preview.xml index ede277bbd2..1e8d869716 100644 --- a/indra/newview/skins/default/xui/da/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_script_preview.xml @@ -1,5 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview lsl text" title="SCRIPT: ROTATIONS SCRIPT"> + <floater.string name="Title"> + Script: [NAME] + </floater.string> <text name="desc txt"> Beskrivelse: </text> diff --git a/indra/newview/skins/default/xui/da/floater_script_search.xml b/indra/newview/skins/default/xui/da/floater_script_search.xml index 62f311be6e..f1605cac34 100644 --- a/indra/newview/skins/default/xui/da/floater_script_search.xml +++ b/indra/newview/skins/default/xui/da/floater_script_search.xml @@ -1,9 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="script search" title="SCRIPT SØGNING"> - <check_box label="Store/små bogstaver har ingen betydning" name="case_text" /> - <button label="Søg" label_selected="Søg" name="search_btn" /> - <button label="Erstat" label_selected="Erstat" name="replace_btn" /> - <button label="Erstat alle" label_selected="Erstat alle" name="replace_all_btn" /> + <check_box label="Store/små bogstaver har ingen betydning" name="case_text"/> + <button label="Søg" label_selected="Søg" name="search_btn"/> + <button label="Erstat" label_selected="Erstat" name="replace_btn"/> + <button label="Erstat alle" label_selected="Erstat alle" name="replace_all_btn"/> <text name="txt"> Søg </text> diff --git a/indra/newview/skins/default/xui/da/floater_sell_land.xml b/indra/newview/skins/default/xui/da/floater_sell_land.xml index fcbe0abe08..873e6d7995 100644 --- a/indra/newview/skins/default/xui/da/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/da/floater_sell_land.xml @@ -1,62 +1,65 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="sell land" title="SÆLG LAND"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - Parcel: - </text> - <text name="info_parcel"> - PARCEL NAME - </text> - <text name="info_size_label"> - Størrelse: - </text> - <text name="info_size"> - [AREA] m² - </text> - <text name="info_action"> - Sælg denne parcel: - </text> - <text name="price_label"> - Sæt en pris: - </text> - <text name="price_text"> - Vælg en passende pris for jorden. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - (L$[PER_METER] pr. kvadratmeter) - </text> - <text name="sell_to_label"> - Sælg denne jord til: - </text> - <text name="sell_to_text"> - Vælg om du vil sælge til hvem som helst eller en specifik køber. - </text> - <combo_box name="sell_to"> - <combo_box.item name="--selectone--" label="Vælg --" /> - <combo_box.item name="Anyone" label="Alle" /> - <combo_box.item name="Specificuser:" label="Specifik bruger:" /> - </combo_box> - <button label="Vælg..." name="sell_to_select_agent" /> - <text name="sell_objects_label"> - Sælg objekter sammen med jorden? - </text> - <text name="sell_objects_text"> - Dine objekter der kan videregives sælges med jorden. - </text> - <radio_group name="sell_objects"> - <radio_item name="no" label="Nej, behold ejerskab til objekterne" /> - <radio_item name="yes" label="Ja, sælg objekter med jorden" /> - </radio_group> - <button label="Vis objekter" name="show_objects" /> - <text name="nag_message_label"> - HUSK: Alle salg er endegyldige. - </text> - <button label="Sæt land til salg" name="sell_btn" /> - <button label="Annullér" name="cancel_btn" /> - </panel> - </scroll_container> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + Parcel: + </text> + <text name="info_parcel"> + PARCEL + </text> + <text name="info_size_label"> + Størrelse: + </text> + <text name="info_size"> + [AREA] m² + </text> + <text name="info_action"> + For at sælge: + </text> + <text name="price_label"> + 1. Sæt en pris: + </text> + <text name="price_text"> + Vælg en passende pris for jorden. + </text> + <text name="price_ld"> + L$ + </text> + <line_editor name="price"> + 0 + </line_editor> + <text name="price_per_m"> + (L$[PER_METER] pr. m²) + </text> + <text name="sell_to_label"> + 2. Sælg denne parcel til: + </text> + <text name="sell_to_text"> + Vælg om du vil sælge til hvem som helst eller en specifik køber. + </text> + <combo_box name="sell_to"> + <combo_box.item label="- Vælg -" name="--selectone--"/> + <combo_box.item label="Enhver" name="Anyone"/> + <combo_box.item label="Specifik person:" name="Specificuser:"/> + </combo_box> + <button label="Vælg" name="sell_to_select_agent"/> + <text name="sell_objects_label"> + 3. Sælg objekter sammen med jorden? + </text> + <text name="sell_objects_text"> + Objekter der kan vidergives og som tilhører ejer af land på parcel vil skifte ejerskab + </text> + <radio_group name="sell_objects"> + <radio_item label="Nej, behold ejerskab til objekter" name="no"/> + <radio_item label="Ja, sælg objekter med jorden" name="yes"/> + </radio_group> + <button label="Vis objekter" name="show_objects"/> + <text name="nag_message_label"> + HUSK: Alle salg er endegyldige. + </text> + <button label="Sæt land til salg" name="sell_btn"/> + <button label="Annullér" name="cancel_btn"/> + </panel> + </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml index c1429ed3a3..41cf100d94 100644 --- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="settings_debug" title="TEKNISKE INDSTILLINGER"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="settings_debug" title="DEBUG INDSTILLINGER"> <combo_box name="boolean_combo"> - <combo_box.item name="TRUE" label="TRUE (Valgt)" /> - <combo_box.item name="FALSE" label="FALSE (Fravalgt)" /> + <combo_box.item label="SANDT" name="TRUE"/> + <combo_box.item label="FALSK" name="FALSE"/> </combo_box> - <color_swatch label="Farve" name="color_swatch" /> - <spinner label="x" name="val_spinner_1" /> - <spinner label="x" name="val_spinner_2" /> - <spinner label="x" name="val_spinner_3" /> - <spinner label="x" name="val_spinner_4" /> - <button label="Sæt til standard" name="default_btn" /> + <color_swatch label="Farve" name="val_color_swatch"/> + <spinner label="x" name="val_spinner_1"/> + <spinner label="x" name="val_spinner_2"/> + <spinner label="x" name="val_spinner_3"/> + <spinner label="x" name="val_spinner_4"/> + <button label="Sæt til standard" name="default_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_snapshot.xml b/indra/newview/skins/default/xui/da/floater_snapshot.xml index 3eed869db4..5e8c64e21f 100644 --- a/indra/newview/skins/default/xui/da/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/da/floater_snapshot.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="SE FOTO"> +<floater name="Snapshot" title="FOTO FORHÅNDSVINSNING"> <text name="type_label"> Hvor skal foto hen? </text> <radio_group label="Snapshot type" name="snapshot_type_radio"> - <radio_item name="postcard" label="Send via e-mail" /> - <radio_item name="texture" label="Gem i din beholdning (L$[AMOUNT])" /> - <radio_item name="local" label="Gem på din computer" /> + <radio_item label="Send via e-mail" name="postcard"/> + <radio_item label="Gem i din beholdning (L$[AMOUNT])" name="texture"/> + <radio_item label="Gem på din computer" name="local"/> </radio_group> <text name="file_size_label"> Fil størrelse: [SIZE] KB @@ -15,12 +15,12 @@ <button label="Send" name="send_btn"/> <button label="Gem (L$[AMOUNT])" name="upload_btn"/> <flyout_button label="Gem" name="save_btn" tool_tip="Gem billede i på din computer"> - <flyout_button_item name="save_item" label="Gem"/> - <flyout_button_item name="saveas_item" label="Gem som..."/> + <flyout_button_item label="Gem" name="save_item"/> + <flyout_button_item label="Gem som..." name="saveas_item"/> </flyout_button> <button label="Annullér" name="discard_btn"/> - <button label="Mere >>" name="more_btn" tool_tip="Avancerede valg"/> - <button label="<< Mindre" name="less_btn" tool_tip="Avancerede valg"/> + <button label="Mere >>" name="more_btn" tool_tip="Avancerede muligheder"/> + <button label="<< Mindre" name="less_btn" tool_tip="Avancerede muligheder"/> <text name="type_label2"> Størrelse </text> @@ -28,45 +28,45 @@ Format </text> <combo_box label="Opløsning" name="postcard_size_combo"> - <combo_box.item name="CurrentWindow" label="Aktuelle vindue"/> - <combo_box.item name="640x480" label="640x480"/> - <combo_box.item name="800x600" label="800x600"/> - <combo_box.item name="1024x768" label="1024x768"/> - <combo_box.item name="Custom" label="Manuel"/> + <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/> + <combo_box.item label="640x480" name="640x480"/> + <combo_box.item label="800x600" name="800x600"/> + <combo_box.item label="1024x768" name="1024x768"/> + <combo_box.item label="Manuel" name="Custom"/> </combo_box> <combo_box label="Opløsning" name="texture_size_combo"> - <combo_box.item name="CurrentWindow" label="Aktuelle vindue"/> - <combo_box.item name="Small(128x128)" label="Lille (128x128)"/> - <combo_box.item name="Medium(256x256)" label="Medium (256x256)"/> - <combo_box.item name="Large(512x512)" label="Stor (512x512)"/> - <combo_box.item name="Custom" label="Manuel"/> + <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/> + <combo_box.item label="Lille (128x128)" name="Small(128x128)"/> + <combo_box.item label="Medium (256x256)" name="Medium(256x256)"/> + <combo_box.item label="Stor (512x512)" name="Large(512x512)"/> + <combo_box.item label="Manuel" name="Custom"/> </combo_box> <combo_box label="Opløsning" name="local_size_combo"> - <combo_box.item name="CurrentWindow" label="Aktuelle vindue"/> - <combo_box.item name="320x240" label="320x240"/> - <combo_box.item name="640x480" label="640x480"/> - <combo_box.item name="800x600" label="800x600"/> - <combo_box.item name="1024x768" label="1024x768"/> - <combo_box.item name="1280x1024" label="1280x1024"/> - <combo_box.item name="1600x1200" label="1600x1200"/> - <combo_box.item name="Custom" label="Manuelt"/> + <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/> + <combo_box.item label="320x240" name="320x240"/> + <combo_box.item label="640x480" name="640x480"/> + <combo_box.item label="800x600" name="800x600"/> + <combo_box.item label="1024x768" name="1024x768"/> + <combo_box.item label="1280x1024" name="1280x1024"/> + <combo_box.item label="1600x1200" name="1600x1200"/> + <combo_box.item label="Manuelt" name="Custom"/> </combo_box> <combo_box label="Fil-format" name="local_format_combo" width="76"> - <combo_box.item name="PNG" label="PNG"/> - <combo_box.item name="JPEG" label="JPEG"/> - <combo_box.item name="BMP" label="BMP"/> + <combo_box.item label="PNG" name="PNG"/> + <combo_box.item label="JPEG" name="JPEG"/> + <combo_box.item label="BMP" name="BMP"/> </combo_box> - <spinner label="Bredde" name="snapshot_width" label_width="41" width="101"/> - <spinner label="Højde" name="snapshot_height" label_width="32" width="92" left="117"/> + <spinner label="Bredde" label_width="41" name="snapshot_width" width="101"/> + <spinner label="Højde" label_width="32" left="117" name="snapshot_height" width="92"/> <check_box label="Fasthold proportioner" name="keep_aspect_check"/> <slider label="Billed-kvalitet" name="image_quality_slider"/> <text name="layer_type_label"> Benyt: </text> <combo_box label="Billedlag" name="layer_types"> - <combo_box.item name="Colors" label="Farver"/> - <combo_box.item name="Depth" label="Dybde"/> - <combo_box.item name="ObjectMattes" label="Materinger"/> + <combo_box.item label="Farver" name="Colors"/> + <combo_box.item label="Dybde" name="Depth"/> + <combo_box.item label="Materinger" name="ObjectMattes"/> </combo_box> <check_box label="Vis brugerflade på foto" name="ui_check"/> <check_box label="Vis HUD objekter på foto" name="hud_check"/> diff --git a/indra/newview/skins/default/xui/da/floater_sys_well.xml b/indra/newview/skins/default/xui/da/floater_sys_well.xml new file mode 100644 index 0000000000..b5cecf93e9 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_sys_well.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sys_well_window" title="BESKEDER"> + <string name="title_im_well_window"> + IM SESSIONER + </string> + <string name="title_notification_well_window"> + BESKEDER + </string> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_telehub.xml b/indra/newview/skins/default/xui/da/floater_telehub.xml index bf31da9515..5a0e89aa98 100644 --- a/indra/newview/skins/default/xui/da/floater_telehub.xml +++ b/indra/newview/skins/default/xui/da/floater_telehub.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="telehub" title="TELEHUB"> <text name="status_text_connected"> Telehub forbundet til objekt [OBJECT] @@ -12,17 +12,14 @@ <text name="help_text_not_connected"> 230;lg objekt og klik 'Forbind telehub'. </text> - <button label="Forbind telehub" name="connect_btn" /> - <button label="Afslut" name="disconnect_btn" /> + <button label="Forbind telehub" name="connect_btn"/> + <button label="Afslut" name="disconnect_btn"/> <text name="spawn_points_text" width="300"> Ankomst punkter (positioner, ikke objekter): </text> - <button label="Tilføj punkt" name="add_spawn_point_btn" /> - <button label="Fjern punkt" name="remove_spawn_point_btn" /> + <button label="Tilføj punkt" name="add_spawn_point_btn"/> + <button label="Fjern punkt" name="remove_spawn_point_btn"/> <text name="spawn_point_help"> - Vælg objekt og klik på 'Tilføj punkt'for at angive -position. Du kan derefter flytte eller slette -objektet. Positioner er i forhold til telehub center. -Vælg emne i listen for at vise position i verden. + Vælg objekt og klik på 'Tilføj punkt' for at angive position. Du kan derefter flytte eller slette objektet. Positioner er i forhold til telehub center. Vælg emne i listen for at vise position i verden. </text> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_top_objects.xml b/indra/newview/skins/default/xui/da/floater_top_objects.xml index 0cfbe77def..3f19350e30 100644 --- a/indra/newview/skins/default/xui/da/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/da/floater_top_objects.xml @@ -1,33 +1,33 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="top_objects" title="INDLÆSER..."> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="top_objects" title="Top objekter"> <text name="title_text"> Henter... </text> <scroll_list name="objects_list"> - <column label="Point" name="score" /> - <column label="Navn" name="name" /> - <column label="Ejer" name="owner" /> - <column label="Lokation" name="location" /> - <column label="Tid" name="time" /> - <column label="Mono tid" name="mono_time" /> + <column label="Point" name="score"/> + <column label="Navn" name="name"/> + <column label="Ejer" name="owner"/> + <column label="Lokation" name="location"/> + <column label="Tid" name="time"/> + <column label="Mono tid" name="mono_time"/> </scroll_list> <text name="id_text"> Objekt ID: </text> - <button label="Vis pejlelys" name="show_beacon_btn" /> + <button label="Vis pejlelys" name="show_beacon_btn"/> <text name="obj_name_text"> Objekt navn: </text> - <button label="Filter" name="filter_object_btn" /> + <button label="Filter" name="filter_object_btn"/> <text name="owner_name_text"> - Ejers navn: + Ejer: </text> - <button label="Filter" name="filter_owner_btn" /> - <button label="Returnér valgte" name="return_selected_btn" /> - <button label="Returnér alle" name="return_all_btn" /> - <button label="Afbryd valgte" name="disable_selected_btn" /> - <button label="Afbryd alle" name="disable_all_btn" /> - <button label="Genopfrisk" name="refresh_btn" /> + <button label="Filter" name="filter_owner_btn"/> + <button label="Returnér valgte" name="return_selected_btn"/> + <button label="Returnér alle" name="return_all_btn"/> + <button label="Afbryd valgte" name="disable_selected_btn"/> + <button label="Afbryd alle" name="disable_all_btn"/> + <button label="Genopfrisk" name="refresh_btn"/> <string name="top_scripts_title"> Mest krævende scripts </string> diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml index 9a348ca7bf..77906f0f46 100644 --- a/indra/newview/skins/default/xui/da/floater_tos.xml +++ b/indra/newview/skins/default/xui/da/floater_tos.xml @@ -1,11 +1,10 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="modal container" title=""> - <button label="Fortsæt" label_selected="Fortsæt" name="Continue" /> - <button label="Annullér" label_selected="Annullér" name="Cancel" /> - <check_box label="Jeg accepterer vilkårene for brug af tjenesten" name="agree_chk" /> + <button label="Fortsæt" label_selected="Fortsæt" name="Continue"/> + <button label="Annullér" label_selected="Annullér" name="Cancel"/> + <check_box label="Jeg accepterer vilkårene for brug af tjenesten" name="agree_chk"/> <text name="tos_heading"> - Læs venligst de almindelige bestemmelser og vilkår igennem, for at fortsætte til [SECOND_LIFE] -skal du acceptere vilkårene. + Læs venligst de almindelige bestemmelser og vilkår igennem, for at fortsætte til [SECOND LIFE] skal du acceptere vilkårene. </text> <text_editor name="tos_text"> TOS_TEXT diff --git a/indra/newview/skins/default/xui/da/floater_water.xml b/indra/newview/skins/default/xui/da/floater_water.xml index 63880b4a69..103feaa879 100644 --- a/indra/newview/skins/default/xui/da/floater_water.xml +++ b/indra/newview/skins/default/xui/da/floater_water.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Water Floater" title="AVANCERET OPSÆTNING AF VAND"> <text name="KeyFramePresetsText"> Vand opsætninger: </text> - <button label="Ny" label_selected="Ny" name="WaterNewPreset" /> - <button label="Gem" label_selected="Gem" name="WaterSavePreset" /> - <button label="Slet" label_selected="Slet" name="WaterDeletePreset" /> + <button label="Ny" label_selected="Ny" name="WaterNewPreset"/> + <button label="Gem" label_selected="Gem" name="WaterSavePreset"/> + <button label="Slet" label_selected="Slet" name="WaterDeletePreset"/> <tab_container name="Water Tabs"> <panel label="Opsætning" name="Settings"> <text name="BHText"> Vandtåge farve </text> - <button label="?" name="WaterFogColorHelp" /> - <color_swatch label="" name="WaterFogColor" tool_tip="Click to open Color Picker" /> + <button label="?" name="WaterFogColorHelp"/> + <color_swatch label="" name="WaterFogColor" tool_tip="Klik for at åbne farvevælger"/> <text name="WaterFogDensText"> Tåge tæthedskarakteristik </text> - <button label="?" name="WaterFogDensityHelp" /> - <slider label="" name="WaterFogDensity" /> + <button label="?" name="WaterFogDensityHelp"/> + <slider label="" name="WaterFogDensity"/> <text name="WaterUnderWaterFogModText"> Tilretning undervandståge </text> - <button label="?" name="WaterUnderWaterFogModHelp" /> - <slider label="" name="WaterUnderWaterFogMod" /> + <button label="?" name="WaterUnderWaterFogModHelp"/> + <slider label="" name="WaterUnderWaterFogMod"/> <text name="BDensText"> Lille bølge reflektionsskala </text> - <button label="?" name="WaterNormalScaleHelp" /> + <button label="?" name="WaterNormalScaleHelp"/> <text name="BHText2"> 1 </text> @@ -36,65 +36,65 @@ <text name="BHText4"> 3 </text> - <slider label="" name="WaterNormalScaleX" /> - <slider label="" name="WaterNormalScaleY" /> - <slider label="" name="WaterNormalScaleZ" /> + <slider label="" name="WaterNormalScaleX"/> + <slider label="" name="WaterNormalScaleY"/> + <slider label="" name="WaterNormalScaleZ"/> <text name="HDText"> Spredningsskala </text> - <button label="?" name="WaterFresnelScaleHelp" /> - <slider label="" name="WaterFresnelScale" /> + <button label="?" name="WaterFresnelScaleHelp"/> + <slider label="" name="WaterFresnelScale"/> <text name="FresnelOffsetText"> Spredning offset </text> - <button label="?" name="WaterFresnelOffsetHelp" /> - <slider label="" name="WaterFresnelOffset" /> + <button label="?" name="WaterFresnelOffsetHelp"/> + <slider label="" name="WaterFresnelOffset"/> <text name="DensMultText"> Lysbrydning fra oven </text> - <button label="?" name="WaterScaleAboveHelp" /> - <slider label="" name="WaterScaleAbove" /> + <button label="?" name="WaterScaleAboveHelp"/> + <slider label="" name="WaterScaleAbove"/> <text name="WaterScaleBelowText"> Lysbrydning fra neden </text> - <button label="?" name="WaterScaleBelowHelp" /> - <slider label="" name="WaterScaleBelow" /> + <button label="?" name="WaterScaleBelowHelp"/> + <slider label="" name="WaterScaleBelow"/> <text name="MaxAltText"> Udviskning </text> - <button label="?" name="WaterBlurMultiplierHelp" /> - <slider label="" name="WaterBlurMult" /> + <button label="?" name="WaterBlurMultiplierHelp"/> + <slider label="" name="WaterBlurMult"/> </panel> <panel label="Billede" name="Waves"> <text name="BHText"> Retning for store bølger </text> - <button label="?" name="WaterWave1Help" /> + <button label="?" name="WaterWave1Help"/> <text name="WaterWave1DirXText"> X </text> <text name="WaterWave1DirYText"> Y </text> - <slider label="" name="WaterWave1DirX" /> - <slider label="" name="WaterWave1DirY" /> + <slider label="" name="WaterWave1DirX"/> + <slider label="" name="WaterWave1DirY"/> <text name="BHText2"> Retning for små bølger </text> - <button label="?" name="WaterWave2Help" /> + <button label="?" name="WaterWave2Help"/> <text name="WaterWave2DirXText"> X </text> <text name="WaterWave2DirYText"> Y </text> - <slider label="" name="WaterWave2DirX" /> - <slider label="" name="WaterWave2DirY" /> + <slider label="" name="WaterWave2DirX"/> + <slider label="" name="WaterWave2DirY"/> <text name="BHText3"> Tekstur map </text> - <button label="?" name="WaterNormalMapHelp" /> - <texture_picker label="" name="WaterNormalMap" /> + <button label="?" name="WaterNormalMapHelp"/> + <texture_picker label="" name="WaterNormalMap"/> </panel> </tab_container> <string name="WLDefaultWaterNames"> diff --git a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml new file mode 100644 index 0000000000..d2f618579d --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="whitelist_entry"> + <text name="media_label"> + Indtast en URL eller et URL mønster for at tilføje til listen med godkendte domæner + </text> + <line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)"/> + <button label="OK" name="ok_btn"/> + <button label="Annullér" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/inspect_object.xml b/indra/newview/skins/default/xui/da/inspect_object.xml new file mode 100644 index 0000000000..8cbcf6cac8 --- /dev/null +++ b/indra/newview/skins/default/xui/da/inspect_object.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_object"> + <string name="Creator"> + Af [CREATOR] + </string> + <string name="CreatorAndOwner"> + af [CREATOR] +ejer [OWNER] + </string> + <string name="Price"> + L$[AMOUNT] + </string> + <string name="PriceFree"> + Gratis! + </string> + <string name="Touch"> + Berør + </string> + <string name="Sit"> + Sid + </string> + <button label="Køb" name="buy_btn"/> + <button label="Betal" name="pay_btn"/> + <button label="Tag kopi" name="take_free_copy_btn"/> + <button label="Berør" name="touch_btn"/> + <button label="Sid" name="sit_btn"/> + <button label="Åben" name="open_btn"/> + <icon name="secure_browsing" tool_tip="Sikker Browsing"/> + <button label="Mere" name="more_info_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/mime_types_linux.xml b/indra/newview/skins/default/xui/da/mime_types_linux.xml new file mode 100644 index 0000000000..69a0fb23f6 --- /dev/null +++ b/indra/newview/skins/default/xui/da/mime_types_linux.xml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<mimetypes name="default"> + <widgetset name="web"> + <label name="web_label"> + Web indhold + </label> + <tooltip name="web_tooltip"> + Dette sted har ikke noget web indhold + </tooltip> + <playtip name="web_playtip"> + Vis web indhold + </playtip> + </widgetset> + <widgetset name="movie"> + <label name="movie_label"> + Film + </label> + <tooltip name="movie_tooltip"> + Der er en film der kan afspilles her + </tooltip> + <playtip name="movie_playtip"> + Afspil film + </playtip> + </widgetset> + <widgetset name="image"> + <label name="image_label"> + Billede + </label> + <tooltip name="image_tooltip"> + Der er et billede på dette sted + </tooltip> + <playtip name="image_playtip"> + Vis stedets billede + </playtip> + </widgetset> + <widgetset name="audio"> + <label name="audio_label"> + Lyd + </label> + <tooltip name="audio_tooltip"> + Der er lyd på dette sted + </tooltip> + <playtip name="audio_playtip"> + Afspil lyden for dette sted + </playtip> + </widgetset> + <scheme name="rtsp"> + <label name="rtsp_label"> + Realtids streaming + </label> + </scheme> + <mimetype name="blank"> + <label name="blank_label"> + - Ingen - + </label> + </mimetype> + <mimetype name="none/none"> + <label name="none/none_label"> + - Ingen - + </label> + </mimetype> + <mimetype name="audio/*"> + <label name="audio2_label"> + Lyd + </label> + </mimetype> + <mimetype name="video/*"> + <label name="video2_label"> + Video + </label> + </mimetype> + <mimetype name="image/*"> + <label name="image2_label"> + Billede + </label> + </mimetype> + <mimetype name="video/vnd.secondlife.qt.legacy"> + <label name="vnd.secondlife.qt.legacy_label"> + Film (QuickTime) + </label> + </mimetype> + <mimetype name="application/javascript"> + <label name="application/javascript_label"> + Javascript + </label> + </mimetype> + <mimetype name="application/ogg"> + <label name="application/ogg_label"> + Ogg Lyd/Video + </label> + </mimetype> + <mimetype name="application/pdf"> + <label name="application/pdf_label"> + PDF Dokument + </label> + </mimetype> + <mimetype name="application/postscript"> + <label name="application/postscript_label"> + Postscript Dokument + </label> + </mimetype> + <mimetype name="application/rtf"> + <label name="application/rtf_label"> + Rich Text (RTF) + </label> + </mimetype> + <mimetype name="application/smil"> + <label name="application/smil_label"> + Synchronized Multimedia Integration Language (SMIL) + </label> + </mimetype> + <mimetype name="application/xhtml+xml"> + <label name="application/xhtml+xml_label"> + Hjemmeside (XHTML) + </label> + </mimetype> + <mimetype name="application/x-director"> + <label name="application/x-director_label"> + Macromedia Director + </label> + </mimetype> + <mimetype name="audio/mid"> + <label name="audio/mid_label"> + Lyd (MIDI) + </label> + </mimetype> + <mimetype name="audio/mpeg"> + <label name="audio/mpeg_label"> + Lyd (MP3) + </label> + </mimetype> + <mimetype name="audio/x-aiff"> + <label name="audio/x-aiff_label"> + Lyd (AIFF) + </label> + </mimetype> + <mimetype name="audio/x-wav"> + <label name="audio/x-wav_label"> + Lyd (WAV) + </label> + </mimetype> + <mimetype name="image/bmp"> + <label name="image/bmp_label"> + Billede (BMP) + </label> + </mimetype> + <mimetype name="image/gif"> + <label name="image/gif_label"> + Billede (GIF) + </label> + </mimetype> + <mimetype name="image/jpeg"> + <label name="image/jpeg_label"> + Billede (JPEG) + </label> + </mimetype> + <mimetype name="image/png"> + <label name="image/png_label"> + Billede (PNG) + </label> + </mimetype> + <mimetype name="image/svg+xml"> + <label name="image/svg+xml_label"> + Billede (SVG) + </label> + </mimetype> + <mimetype name="image/tiff"> + <label name="image/tiff_label"> + Billede (TIFF) + </label> + </mimetype> + <mimetype name="text/html"> + <label name="text/html_label"> + Hjemmeside + </label> + </mimetype> + <mimetype name="text/plain"> + <label name="text/plain_label"> + Tekst + </label> + </mimetype> + <mimetype name="text/xml"> + <label name="text/xml_label"> + XML + </label> + </mimetype> + <mimetype name="video/mpeg"> + <label name="video/mpeg_label"> + Film (MPEG) + </label> + </mimetype> + <mimetype name="video/mp4"> + <label name="video/mp4_label"> + Film (MP4) + </label> + </mimetype> + <mimetype name="video/quicktime"> + <label name="video/quicktime_label"> + Film (QuickTime) + </label> + </mimetype> + <mimetype name="video/x-ms-asf"> + <label name="video/x-ms-asf_label"> + Film (Windows Media ASF) + </label> + </mimetype> + <mimetype name="video/x-ms-wmv"> + <label name="video/x-ms-wmv_label"> + Film (Windows Media WMV) + </label> + </mimetype> + <mimetype name="video/x-msvideo"> + <label name="video/x-msvideo_label"> + Film (AVI) + </label> + </mimetype> +</mimetypes> diff --git a/indra/newview/skins/default/xui/da/panel_active_object_row.xml b/indra/newview/skins/default/xui/da/panel_active_object_row.xml new file mode 100644 index 0000000000..9c27ea7fe2 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_active_object_row.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_activeim_row"> + <string name="unknown_obj"> + Ukendt objekt + </string> + <text name="object_name"> + Unavngivet objekt + </text> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml new file mode 100644 index 0000000000..ab2e7a6e31 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <panel name="panel_call_buttons"> + <button label="Opkald" name="call_btn"/> + <button label="Forlad samtale" name="end_call_btn"/> + <button label="Stemmekontroller" name="voice_ctrls_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_bottomtray.xml b/indra/newview/skins/default/xui/da/panel_bottomtray.xml new file mode 100644 index 0000000000..2085840bb5 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_bottomtray.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="bottom_tray"> + <string name="SpeakBtnToolTip"> + Slukker/tænder mikrofon + </string> + <string name="VoiceControlBtnToolTip"> + Skjuler/viser stemme kontrol panel + </string> + <layout_stack name="toolbar_stack"> + <layout_panel name="gesture_panel"> + <gesture_combo_box label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/> + </layout_panel> + <layout_panel name="movement_panel"> + <button label="Flyt" name="movement_btn" tool_tip="Vis/skjul bevægelseskontroller"/> + </layout_panel> + <layout_panel name="cam_panel"> + <button label="Vis" name="camera_btn" tool_tip="Vis/Skjul kamerakontroller"/> + </layout_panel> + <layout_panel name="snapshot_panel"> + <button label="" name="snapshots" tool_tip="Tag foto"/> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_alpha.xml b/indra/newview/skins/default/xui/da/panel_edit_alpha.xml new file mode 100644 index 0000000000..3826e8a228 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_alpha.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_alpha_panel"> + <panel name="avatar_alpha_color_panel"> + <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - øvre" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - øje" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Alpha - hår" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_eyes.xml b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml new file mode 100644 index 0000000000..9c0d77c370 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_eyes_panel"> + <panel name="avatar_eye_color_panel"> + <texture_picker label="Iris" name="Iris" tool_tip="Klik for at vælge billede"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="eyes_main_tab" title="Øjne"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml new file mode 100644 index 0000000000..1d3ba061bc --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_gloves_panel"> + <panel name="avatar_gloves_color_panel"> + <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> + <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="gloves_main_tab" title="Handsker"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml new file mode 100644 index 0000000000..4c9973c0bd --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_jacket_panel"> + <panel name="avatar_jacket_color_panel"> + <texture_picker label="Stof foroven" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Stof forneden" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/> + <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="jacket_main_tab" title="Jakke"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_pants.xml b/indra/newview/skins/default/xui/da/panel_edit_pants.xml new file mode 100644 index 0000000000..bcb1450258 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_pants.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_pants_panel"> + <panel name="avatar_pants_color_panel"> + <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et bilede"/> + <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="pants_main_tab" title="Bukser"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_pick.xml b/indra/newview/skins/default/xui/da/panel_edit_pick.xml new file mode 100644 index 0000000000..41db2be5e8 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_pick.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Redigér Pick" name="panel_edit_pick"> + <text name="title"> + Redigér favorit + </text> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <icon label="" name="edit_icon" tool_tip="Klik for at vælge billede"/> + <text name="Name:"> + Titel: + </text> + <text name="description_label"> + Beskrivelse: + </text> + <text name="location_label"> + Lokation: + </text> + <text name="pick_location"> + henter... + </text> + <button label="Sæt til nuværende lokation" name="set_to_curr_location_btn"/> + </panel> + </scroll_container> + <panel label="bottom_panel" name="bottom_panel"> + <button label="Gem [WHAT]" name="save_changes_btn"/> + <button label="Annullér" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml new file mode 100644 index 0000000000..54a0cc01a4 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_shoes_panel"> + <panel name="avatar_shoes_color_panel"> + <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> + <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="shoes_main_tab" title="Sko"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_skin.xml b/indra/newview/skins/default/xui/da/panel_edit_skin.xml new file mode 100644 index 0000000000..46dce354a9 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_skin.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_skin_panel"> + <panel name="avatar_skin_color_panel"> + <texture_picker label="Hoved tatoveringer" name="Head Tattoos" tool_tip="Klik for at vælge et bilede"/> + <texture_picker label="Øvre tatoveringer" name="Upper Tattoos" tool_tip="Klik for at vælge et bilede"/> + <texture_picker label="Nedre tatoveringer" name="Lower Tattoos" tool_tip="Klik for at vælge et bilede"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="skin_color_tab" title="Hudfarve"/> + <accordion_tab name="skin_face_tab" title="Ansigtsdetaljer"/> + <accordion_tab name="skin_makeup_tab" title="Makeup"/> + <accordion_tab name="skin_body_tab" title="Kropsdetaljer"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_socks.xml b/indra/newview/skins/default/xui/da/panel_edit_socks.xml new file mode 100644 index 0000000000..6ef6dad86c --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_socks.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_socks_panel"> + <panel name="avatar_socks_color_panel"> + <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> + <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="socks_main_tab" title="Strømper"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml new file mode 100644 index 0000000000..de52146e29 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_underpants_panel"> + <panel name="avatar_underpants_color_panel"> + <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> + <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="underpants_main_tab" title="Underbukser"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml new file mode 100644 index 0000000000..6c2e1f5833 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="edit_undershirt_panel"> + <panel name="avatar_undershirt_color_panel"> + <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> + <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> + </panel> + <accordion name="wearable_accordion"> + <accordion_tab name="undershirt_main_tab" title="Undertrøje"/> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml new file mode 100644 index 0000000000..12bc120c45 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Kan bæres" name="panel_edit_wearable"> + <string name="edit_shape_title"> + Redigerer kropsbygning + </string> + <string name="edit_skin_title"> + Redigerer hud + </string> + <string name="edit_hair_title"> + Redigerer hår + </string> + <string name="edit_eyes_title"> + Redigerer øjne + </string> + <string name="edit_shirt_title"> + Redigerer trøje + </string> + <string name="edit_pants_title"> + Redigerer bukser + </string> + <string name="edit_shoes_title"> + Redigerer sko + </string> + <string name="edit_socks_title"> + Redigerer strømper + </string> + <string name="edit_jacket_title"> + Redigerer jakke + </string> + <string name="edit_skirt_title"> + Redigerer nederdel + </string> + <string name="edit_gloves_title"> + Redigerer handsker + </string> + <string name="edit_undershirt_title"> + Redigerer undertrøje + </string> + <string name="edit_underpants_title"> + Redigerer underbukser + </string> + <string name="edit_alpha_title"> + Redigerer Alpha maske + </string> + <string name="edit_tattoo_title"> + Redigerer tatovering + </string> + <string name="shape_desc_text"> + Kropsbygning: + </string> + <string name="skin_desc_text"> + Hud: + </string> + <string name="hair_desc_text"> + Hår: + </string> + <string name="eyes_desc_text"> + Øjne: + </string> + <string name="shirt_desc_text"> + Trøje: + </string> + <string name="pants_desc_text"> + Bukser: + </string> + <string name="shoes_desc_text"> + Sko: + </string> + <string name="socks_desc_text"> + Strømper: + </string> + <string name="jacket_desc_text"> + Jakke: + </string> + <string name="skirt_skirt_desc_text"> + Nederdel: + </string> + <string name="gloves_desc_text"> + Handsker: + </string> + <string name="undershirt_desc_text"> + Undertrøje: + </string> + <string name="underpants_desc_text"> + Underbukser: + </string> + <string name="alpha_desc_text"> + Alpha maske: + </string> + <string name="tattoo_desc_text"> + Tatovering: + </string> + <text name="edit_wearable_title" value="Redigerer kropsbygning"/> + <panel label="Trøje" name="wearable_type_panel"> + <text name="description_text" value="Kropsbygning:"/> + </panel> + <panel name="button_panel"> + <button label="Gem som" name="save_as_button"/> + <button label="Vend tilbage" name="revert_button"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_friends.xml b/indra/newview/skins/default/xui/da/panel_friends.xml index 2644b80968..a41eaf20c1 100644 --- a/indra/newview/skins/default/xui/da/panel_friends.xml +++ b/indra/newview/skins/default/xui/da/panel_friends.xml @@ -1,26 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="friends"> <string name="Multiple"> - Flere venner... + Flere venner </string> - <scroll_list name="friend_list" - tool_tip="Hold Shift eller Ctrl nede imens du klikker for at vælge flere venner"> - <column name="icon_online_status" tool_tip="Online status" /> - <column label="Name" name="friend_name" tool_tip="Navn" /> - <column name="icon_visible_online" tool_tip="Venner kan se at du er online" /> - <column name="icon_visible_map" tool_tip="Venner kan finde dig på kortet" /> - <column name="icon_edit_mine" - tool_tip="Venner kan rette i, slette eller tage dine objekter" /> - <column name="icon_edit_theirs" tool_tip="Du kan rette i denne vens objekter" /> + <scroll_list name="friend_list" tool_tip="Hold Shift eller Ctrl nede imens du klikker for at vælge flere venner"> + <column name="icon_online_status" tool_tip="Online status"/> + <column label="Name" name="friend_name" tool_tip="Navn"/> + <column name="icon_visible_online" tool_tip="Venner kan se at du er online"/> + <column name="icon_visible_map" tool_tip="Venner kan finde dig på kortet"/> + <column name="icon_edit_mine" tool_tip="Venner kan rette i, slette eller tage dine objekter"/> + <column name="icon_edit_theirs" tool_tip="Du kan rette i denne vens objekter"/> </scroll_list> - <button label="IM" name="im_btn" tool_tip="Skriv en personlig besked (IM)" /> - <button label="Profil" name="profile_btn" - tool_tip="Vis billede, grupper og anden information" /> - <button label="Teleport..." name="offer_teleport_btn" - tool_tip="Tilbyd denne ven at blive teleporteret til din nuværende position" /> - <button label="Betal..." name="pay_btn" - tool_tip="Giv Linden dollars (L$) til denne ven" /> - <button label="Fjern..." name="remove_btn" - tool_tip="Fjern denne beboer fra din venneliste" /> - <button label="Tilføj..." name="add_btn" tool_tip="Tilbyd venskab til denne beboer" /> + <button label="IM" name="im_btn" tool_tip="Skriv en personlig besked (IM)"/> + <button label="Profil" name="profile_btn" tool_tip="Vis billede, grupper og anden information"/> + <button label="Teleport" name="offer_teleport_btn" tool_tip="Tilbyd denne ven at blive teleporteret til din nuværende position"/> + <button label="Betal" name="pay_btn" tool_tip="Giv Linden dollars (L$) til denne ven"/> + <button label="Fjern" name="remove_btn" tool_tip="Fjern denne beboer fra din venneliste"/> + <button label="Tilføj" name="add_btn" tool_tip="Tilbyd venskab til denne beboer"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml new file mode 100644 index 0000000000..1db2db45af --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <button label="Group Profile" name="group_info_btn"/> + <panel name="panel_call_buttons"> + <button label="Opkaldsgruppe" name="call_btn"/> + <button label="Forlad samtale" name="end_call_btn"/> + <button label="Kontroller for åben stemmechat" name="voice_ctrls_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_general.xml b/indra/newview/skins/default/xui/da/panel_group_general.xml index 4e98ca2bc2..ec957e6094 100644 --- a/indra/newview/skins/default/xui/da/panel_group_general.xml +++ b/indra/newview/skins/default/xui/da/panel_group_general.xml @@ -1,72 +1,35 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Generelt" name="general_tab"> - <string name="help_text"> - Generel-fanen indeholder generel information om denne gruppe, en liste med ejere og synlige medlemmer, generel-gruppeindstillinger og medlemsmuligheder. - -Bevæg din mus over mulighederne for mere hjælp. - </string> - <string name="group_info_unchanged"> - Generel gruppeinformation er ændret. - </string> - <button label="?" label_selected="?" name="help_button"/> - <line_editor label="Indtast nyt gruppenavn her" name="group_name_editor"/> - <text name="group_name"> - Skriv det nye gruppenavn her - </text> - <text name="prepend_founded_by"> - Grundlagt af - </text> - <text name="founder_name" left_delta="70" > - (venter) - </text> - <text name="group_charter_label"> - Gruppens formål - </text> - <texture_picker label="Gruppe distinktioner" name="insignia" tool_tip="Klik for at vælge et billede"/> + <panel.string name="help_text"> + Generelt-fanen indeholder generel information om denne gruppe, en liste med ejere og synlige medlemmer, generel-gruppeindstillinger og medlemsmuligheder. Bevæg din mus over mulighederne for mere hjælp. + </panel.string> + <panel.string name="group_info_unchanged"> + Generel gruppeinformation er ændret + </panel.string> + <panel.string name="incomplete_member_data_str"> + Henter medlemsinformationer + </panel.string> <text_editor name="charter"> Gruppens formål </text_editor> - <button label="Tilmeld (L$0)" label_selected="Tilmeld (L$0)" name="join_button"/> - <button label="Detaljeret visning" label_selected="Detaljeret visning" name="info_button"/> - <text name="text_owners_and_visible_members"> - Ejere & synlige medlemmer - </text> - <text name="text_owners_are_shown_in_bold"> - (Ejere er vist med fed skrift) - </text> <name_list name="visible_members"> - <name_list.columns label="Medlemsnavn" name="name"/> + <name_list.columns label="Medlem" name="name"/> <name_list.columns label="Titel" name="title"/> - <name_list.columns label="Senest på d." name="online"/> </name_list> - <text name="text_group_preferences"> - Gruppeindstillinger + <text name="active_title_label"> + Min titel </text> + <combo_box name="active_title" tool_tip="Angiver den titel der vises i din avatars navnefelt, når denne gruppe er aktiv"/> + <check_box label="Modtag gruppeinformationer" name="receive_notices" tool_tip="Angiver om du vil modtage informationer fra denne gruppe. Fjern markeringen i boksen hvis gruppen spammer dig."/> + <check_box label="Vis gruppen i min profil" name="list_groups_in_profile" tool_tip="Angiver om du vil vise denne gruppe i dine profilinformationer"/> <panel name="preferences_container"> - <check_box label="Vis i søgning" name="show_in_group_list" tool_tip="Lad folk se denne gruppe i søgeresultater."/> <check_box label="Åben tilmelding" name="open_enrollement" tool_tip="Angiver om denne gruppe tillader nye medlemmer at tilmelde sig, uden de er inviteret."/> - <check_box label="Tilmeldingsgebyr:" name="check_enrollment_fee" tool_tip="Angiver om der kræves et gebyr, for at tilmelde sig gruppen."/> - <spinner name="spin_enrollment_fee" tool_tip="Nye medlemmer skal betale dette gebyr for at tilmelde sig gruppen, når Tilmeldingsgebyr er valgt." width="60" left_delta="130"/> + <check_box label="Tilmeldingsgebyr" name="check_enrollment_fee" tool_tip="Angiver om der kræves et gebyr, for at tilmelde sig gruppen"/> + <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Nye medlemmer skal betale dette gebyr for at tilmelde sig gruppen, når "Tilmeldingsgebyr" er valgt." width="60"/> <combo_box name="group_mature_check" tool_tip="Angiver om din gruppes information anses som 'mature'." width="150"> - <combo_box.item name="select_mature" label="- Vælg indholdsrating -"/> - <combo_box.item name="mature" label="Mature indhold"/> - <combo_box.item name="pg" label="PG indhold"/> + <combo_box.item label="PG indhold" name="pg"/> + <combo_box.item label="Mature indhold" name="mature"/> </combo_box> - <panel name="title_container"> - <text name="active_title_label"> - Min aktive titel - </text> - <combo_box name="active_title" tool_tip="Angiver den titel der vises i din avatars navnefelt, når denne gruppe er aktiv."/> - </panel> - <check_box label="Modtag gruppeinformationer" name="receive_notices" tool_tip="Angiver om du vil modtage informationer fra denne gruppe. Fjern markeringen i boksen hvis gruppen spammer dig."/> - <check_box label="Vis gruppen i min profil" name="list_groups_in_profile" tool_tip="Angiver om du vil vise denne gruppe i dine profilinformationer"/> + <check_box initial_value="true" label="Vis i søgning" name="show_in_group_list" tool_tip="Lad folk se denne gruppe i søgeresultater."/> </panel> - <string name="incomplete_member_data_str"> - Henter medlemsinformationer - </string> - <string name="confirm_group_create_str"> - Creating this group will cost L$100. -Er du virkelig, virkelig, VIRKELIG sikker på, at du vil bruge L$100 på at lave denne gruppe? -Du skal være opmærksom på, at hvis ingen andre indmelder sig i denne gruppe indenfor 48 timer, så vil gruppen blive opløst, og gruppens navn vil ikke være tilgængelig i fremtiden. - </string> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml new file mode 100644 index 0000000000..9940ebbd4d --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Gruppe info" name="GroupInfo"> + <panel.string name="default_needs_apply_text"> + Der er ændringer på denne fane der ikke er gemt + </panel.string> + <panel.string name="want_apply_text"> + Ønsker du at gemme disse ændringer? + </panel.string> + <panel.string name="group_join_btn"> + Tilmeld (L$[AMOUNT]) + </panel.string> + <panel.string name="group_join_free"> + Gratis + </panel.string> + <text name="group_name" value="(Henter...)"/> + <line_editor label="Indtast dit nye gruppenavn her" name="group_name_editor"/> + <texture_picker label="" name="insignia" tool_tip="Klik for at vælge bilede"/> + <text name="prepend_founded_by"> + Grundlægger: + </text> + <name_box initial_value="(finder)" name="founder_name"/> + <text name="join_cost_text"> + Gratis + </text> + <button label="MELD IND NU!" name="btn_join"/> + <accordion name="groups_accordion"> + <accordion_tab name="group_general_tab" title="Generelt"/> + <accordion_tab name="group_roles_tab" title="Roller"/> + <accordion_tab name="group_notices_tab" title="Beskeder"/> + <accordion_tab name="group_land_tab" title="Land/Aktiver"/> + </accordion> + <panel name="button_row"> + <button label="Lav" label_selected="Ny gruppe" name="btn_create"/> + <button label="Gem" label_selected="Gem" name="btn_apply"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_invite.xml b/indra/newview/skins/default/xui/da/panel_group_invite.xml index 813007aee0..1e00642c29 100644 --- a/indra/newview/skins/default/xui/da/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/da/panel_group_invite.xml @@ -1,31 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Invitér et medlem" name="invite_panel"> + <panel.string name="confirm_invite_owner_str"> + Er du sikker på, at du vil invitere ny(e) ejer(e)? Denne handling er permanent! + </panel.string> + <panel.string name="loading"> + (indlæser...) + </panel.string> + <panel.string name="already_in_group"> + Nogen af avatarerne var allerede i gruppen og blev ikke inviteret + </panel.string> <text name="help_text"> Du kan invitere flere beboere ad gangen til at blive medlem af din gruppe. Klik 'Åben personvælger' for at begynde. </text> - <button label="Åben personvælger" name="add_button" bottom_delta="-30"/> - <name_list name="invitee_list" - tool_tip="Hold Ctrl-tasten nede og klik på beboere for at vælge flere." /> - <button label="Fjern valgte fra listen" name="remove_button" - tool_tip="Fjerner beboere, der er valgt på ovenstående invitationsliste." /> + <button bottom_delta="-30" label="Åben personvælger" name="add_button"/> + <name_list name="invitee_list" tool_tip="Hold Ctrl knappen nede og klik på beboer navne for at vælge flere"/> + <button label="Fjern valgte fra listen" name="remove_button" tool_tip="Fjern beboere valgt ovenfor fra invitationslisten"/> <text name="role_text"> Vælg hvilken rolle, du vil tildele dem: </text> - <combo_box name="role_name" - tool_tip="Vælg fra listen med roller, du har tilladelse til at tildele medlemmerne." /> - <button label="Send invitationer" name="ok_button" /> - <button label="Annullér" name="cancel_button" /> - <string name="confirm_invite_owner_str"> - Er du sikker på, at du vil invitere ny(e) ejer(e)? Denne handling er permanent! - </string> - <!--button bottom="25" font="SansSerifSmall" halign="center" height="20" - label="Send invitationer" left="65" name="ok_button" width="140" /> - <button bottom_delta="-22" font="SansSerifSmall" halign="center" height="20" - label="Annullér" left_delta="0" name="cancel_button" width="140" /--> - <string name="loading"> - (indlæser...) + <combo_box name="role_name" tool_tip="Vælg fra en liste med roller du har ret til at tildele medlemmer"/> + <button label="Send invitationer" name="ok_button"/> + <button label="Annullér" name="cancel_button"/> + <string name="GroupInvitation"> + Gruppe invitation </string> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_land_money.xml b/indra/newview/skins/default/xui/da/panel_group_land_money.xml index 636a16f97b..c73d7c807d 100644 --- a/indra/newview/skins/default/xui/da/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/da/panel_group_land_money.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Land & L$" name="land_money_tab"> <string name="help_text"> - Grunde ejet af gruppen er vist sammen med bidragsdetaljer. En advarsel vises indtil Total land i brug er mindre end eller lig med det totale bidrag. Planlægning, detaljer og salgsfaneblade viser information om gruppens økonomi. + En advarsel vises indtil Total land i brug er mindre end eller lig med det totale bidrag. </string> <button label="?" name="help_button"/> <string name="cant_view_group_land_text"> @@ -17,27 +17,27 @@ Gruppeejet land </text> <scroll_list name="group_parcel_list"> - <column label="Grundens navn" name="name"/> + <column label="Parcel" name="name"/> <column label="Region" name="location"/> <column label="Type" name="type"/> <column label="Område" name="area"/> <column label="" name="hidden"/> </scroll_list> - <button label="Vis på kort" label_selected="Vis på kort" name="map_button"/> + <button label="Kort" label_selected="Kort" name="map_button"/> <text name="total_contributed_land_label"> - Total bidrag: + Totalt bidrag: </text> <text name="total_contributed_land_value"> [AREA] m² </text> <text name="total_land_in_use_label"> - Total land i brug: + Totalt land i brug: </text> <text name="total_land_in_use_value"> [AREA] m² </text> <text name="land_available_label"> - Tilgængeligt land: + Ledigt land: </text> <text name="land_available_value"> [AREA] m² @@ -46,40 +46,39 @@ Dit bidrag: </text> <string name="land_contrib_error"> - Ikke muligt at lave dit bidrag til landet. + Ikke muligt at lave dit bidrag til landet </string> <text name="your_contribution_units"> - ( m² ) + m² </text> <text name="your_contribution_max_value"> ([AMOUNT] maks.) </text> <text name="group_over_limit_text"> - Gruppemedlemmer må bidrag med mere, for at understøtte -med det land der bliver brugt. + Gruppemedlemmer må bidrag med mere, for at understøtte med det land der bliver brugt </text> <text name="group_money_heading"> Gruppe L$ </text> <tab_container name="group_money_tab_container"> - <panel label="Planlægning" name="group_money_planning_tab"> + <panel label="PLANLÆGNING" name="group_money_planning_tab"> <text_editor name="group_money_planning_text"> - Beregner... + Henter... </text_editor> </panel> - <panel label="Detaljer" name="group_money_details_tab"> + <panel label="DETALJER" name="group_money_details_tab"> <text_editor name="group_money_details_text"> - Beregner... + Henter... </text_editor> - <button label="< Før" label_selected="< Før" name="earlier_details_button" tool_tip="Gå tilbage i tid"/> - <button label="Efter >" label_selected="Efter >" name="later_details_button" tool_tip="Gå frem i tid"/> + <button label="< Før" label_selected="< Før" name="earlier_details_button" tool_tip="Tilbage"/> + <button label="Efter >" label_selected="Efter >" name="later_details_button" tool_tip="Næste"/> </panel> - <panel label="Salg" name="group_money_sales_tab"> + <panel label="SALG" name="group_money_sales_tab"> <text_editor name="group_money_sales_text"> - Beregner... + Henter... </text_editor> - <button label="< Før" label_selected="< Før" name="earlier_sales_button" tool_tip="Gå tilbage i tid"/> - <button label="Efter >" label_selected="Efter >" name="later_sales_button" tool_tip="Gå frem i tid"/> + <button label="< Før" label_selected="< Før" name="earlier_sales_button" tool_tip="Tilbage"/> + <button label="Efter >" label_selected="Efter >" name="later_sales_button" tool_tip="Næste"/> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_group_notices.xml b/indra/newview/skins/default/xui/da/panel_group_notices.xml index 9e6aa9eb7c..ec503c37dc 100644 --- a/indra/newview/skins/default/xui/da/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/da/panel_group_notices.xml @@ -1,42 +1,35 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Beskeder" name="notices_tab"> - <string name="help_text"> + <panel.string name="help_text"> Beskeder er en hurtig måde at kommunikere på på tværs i gruppen ved at sende en meddelelse eller en eventuel vedlagt genstand. beskeder sendes kun til gruppemedlemmer i roller som giver evnen til at modtage dem. Du kan slå beskeder fra i Generel-fanebladet. - </string> - <string name="no_notices_text"> - Der er ingen tidligere beskeder. - </string> - <button label="?" label_selected="?" name="help_button" /> - <text name="lbl"> - Arkiv med gruppebeskeder - </text> + </panel.string> + <panel.string name="no_notices_text"> + Der er ikke nogen tidligere beskeder + </panel.string> <text name="lbl2"> - Beskeder er gemt i 14 dage. -Listen er begrænset til 200 beskeder pr. gruppe hver dag. + Beskeder gemmes i 14 dage. +Maksimum er 200 pr. gruppe pr. dag </text> <scroll_list name="notice_list"> - <column label="" name="icon" /> - <column label="Emne" name="subject" /> - <column label="Fra" name="from" /> - <column label="Dato" name="date" /> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="Emne" name="subject"/> + <scroll_list.columns label="Fra" name="from"/> + <scroll_list.columns label="Dato" name="date"/> </scroll_list> <text name="notice_list_none_found"> - Ingen fundet. + Ingen fundet </text> - <button label="Lav ny besked" label_selected="Lav ny besked" name="create_new_notice" /> - <button label="Genopfrisk" label_selected="Genopfrisk liste" name="refresh_notices" /> + <button label="Lav en ny besked" label_selected="Lav ny besked" name="create_new_notice" tool_tip="Lav en ny besked"/> + <button label="Genopfrisk" label_selected="Genopfrisk liste" name="refresh_notices" tool_tip="Genopfrisk beskedliste"/> <panel label="Lav ny besked" name="panel_create_new_notice"> <text name="lbl"> Lav en besked </text> - <text name="lbl2"> - Du kan tilføje et bilag til beskeden ved at trække den fra beholdningen til dette felt. Vedhæftede objekter skal være sat til at kunne kopieres og overføres, og du kan ikke sende en mappe. - </text> <text name="lbl3"> Emne: </text> @@ -46,17 +39,19 @@ Listen er begrænset til 200 beskeder pr. gruppe hver dag. <text name="lbl5"> Vedhæft: </text> - <button label="Fjern bilag" label_selected="Fjern bilag" name="remove_attachment" /> - <button label="Afsend" label_selected="Afsend" name="send_notice" /> - <panel name="drop_target" - tool_tip="Træk en genstand fra beholdningen over på denne boks for at sende den sammen med beskeden. Du skal have tilladelse til at kopiere og overføre genstanden, for at kunne sende den med beskeden." /> + <text name="string"> + Træk og slip en gensand for at vedhæfte den: + </text> + <button label="Fjern" label_selected="Fjern bilag" name="remove_attachment"/> + <button label="Send" label_selected="Send" name="send_notice"/> + <group_drop_target name="drop_target" tool_tip="Træk en genstand fra din beholdning til dette felt for at sende den med denne besked. Du skal have rettigheder til at kopiere og overdrage denne genstand for at kunne vedhæfte den."/> </panel> <panel label="Se tidligere beskeder" name="panel_view_past_notice"> <text name="lbl"> Arkiverede beskeder </text> <text name="lbl2"> - For at sende en ny besked, klik på 'Lav ny besked'-knappen foroven. + For at sende en ny besked, tryk på + knappen </text> <text name="lbl3"> Emne: @@ -64,6 +59,6 @@ Listen er begrænset til 200 beskeder pr. gruppe hver dag. <text name="lbl4"> Besked: </text> - <button label="åben bilag" label_selected="åben bilag" name="open_attachment" /> + <button label="Åben bilag" label_selected="åben bilag" name="open_attachment"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_me.xml b/indra/newview/skins/default/xui/da/panel_me.xml new file mode 100644 index 0000000000..2cfd358d13 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_me.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Min profil" name="panel_me"> + <tab_container name="tabs"> + <panel label="PROFIL" name="panel_profile"/> + <panel label="FAVORITTER" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_general.xml b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml new file mode 100644 index 0000000000..7f1581888d --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Generelt" name="Media Settings General"> + <text name="home_label"> + Hjemmeside: + </text> + <text name="home_fails_whitelist_label"> + (Denne side optræder ikke i godkendte sider) + </text> + <line_editor name="home_url" tool_tip="Hjemmesiden for kilden til dette media"/> + <text name="preview_label"> + Vis + </text> + <text name="current_url_label"> + Nuværende side: + </text> + <text name="current_url" tool_tip="Den nuværende hjemmeside for kilden til dette media" value=""/> + <button label="Nulstil" name="current_url_reset_btn"/> + <check_box initial_value="false" label="Gentag afspil" name="auto_loop"/> + <check_box initial_value="false" label="Første klik medfører interaktion" name="first_click_interact"/> + <check_box initial_value="false" label="Auto zoom" name="auto_zoom"/> + <check_box initial_value="false" label="Afspil automatisk media" name="auto_play"/> + <text name="media_setting_note"> + Note: Beboere kan selv ændre denne indstilling + </text> + <check_box initial_value="false" label="Auto skalér media på objektets overflade" name="auto_scale"/> + <text name="size_label"> + Størrelse: + </text> + <text name="X_label"> + X + </text> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml new file mode 100644 index 0000000000..ee341f9142 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Sikkerhed" name="Media Settings Security"> + <check_box initial_value="false" label="Tillad kun adgang til specifikke URL'er (via "prefix")" name="whitelist_enable"/> + <text name="home_url_fails_some_items_in_whitelist"> + Opslag som hjemmesiden fejler ved er markeret: + </text> + <button label="Tilføj" name="whitelist_add"/> + <button label="Slet" name="whitelist_del"/> + <text name="home_url_fails_whitelist"> + Advarsel: Hjemmesiden angive i "Generelt" fanen er ikke indeholdt i godkendte sider. Den er slået fra, indtil en gyldig værdi er tilføjet. + </text> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_my_profile.xml b/indra/newview/skins/default/xui/da/panel_my_profile.xml new file mode 100644 index 0000000000..1dffc73239 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_my_profile.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profil" name="panel_profile"> + <string name="no_partner_text" value="Ingen"/> + <string name="RegisterDateFormat"> + [REG_DATE] ([AGE]) + </string> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Klik på Rediger Profil knappen nedenfor for at ændre billede"/> + </panel> + <panel name="first_life_image_panel"> + <icon label="" name="real_world_edit_icon" tool_tip="Klik på Rediger Profil knappen nedenfor for at ændre billede"/> + <text name="title_rw_descr_text" value="RL:"/> + </panel> + <text name="me_homepage_text"> + Web: + </text> + <text name="title_member_text" value="Medlem siden:"/> + <text name="title_acc_status_text" value="Konto:"/> + <text name="acc_status_text" value="Beboer. Ingen betalingsinfo"/> + <text name="title_partner_text" value="Partner:"/> + <text name="title_groups_text" value="Grupper:"/> + </panel> + </scroll_container> + <panel name="profile_buttons_panel"> + <button label="Tilføj ven" name="add_friend"/> + <button label="IM" name="im"/> + <button label="Opkald" name="call"/> + <button label="Kort" name="show_on_map_btn"/> + <button label="Teleportér" name="teleport"/> + </panel> + <panel name="profile_me_buttons_panel"> + <button label="Rediger profil" name="edit_profile_btn" tool_tip="Redigér personlig information"/> + <button label="Ændre udseende" name="edit_appearance_btn" tool_tip="Ændre dit udseende: fysiske data, tøj m.v."/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat.xml new file mode 100644 index 0000000000..7f94345976 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_nearby_chat.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- All our XML is utf-8 encoded. --> +<panel name="nearby_chat"> + <panel name="chat_caption"> + <text name="sender_name"> + CHAT NÆRVED + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml new file mode 100644 index 0000000000..2aa7ed7c6c --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <string name="min_width"> + 192 + </string> + <string name="max_width"> + 320 + </string> + <line_editor label="Klik her for at chatte." name="chat_box" tool_tip="Tryk på enter for at tale, Ctrl-Enter for at råbe."/> + <button name="show_nearby_chat" tool_tip="Viser/skjuler log for chat nærved"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_pick_info.xml b/indra/newview/skins/default/xui/da/panel_pick_info.xml new file mode 100644 index 0000000000..ce05018b5b --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_pick_info.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="Favorit info"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[name]"/> + <text name="pick_location" value="[loading...]"/> + <text name="pick_desc" value="[description]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teleportér" name="teleport_btn"/> + <button label="Kort" name="show_on_map_btn"/> + <button label="Redigér" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_place_profile.xml b/indra/newview/skins/default/xui/da/panel_place_profile.xml new file mode 100644 index 0000000000..24316fea14 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_place_profile.xml @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="place_profile"> + <string name="on" value="Til"/> + <string name="off" value="Fra"/> + <string name="anyone" value="Enhver"/> + <string name="available" value="ledig"/> + <string name="allocated" value="fordelt"/> + <string name="title_place" value="Sted profil"/> + <string name="title_teleport_history" value="Teleport historik sted"/> + <string name="not_available" value="(N\A)"/> + <string name="unknown" value="(ukendt)"/> + <string name="public" value="(offentlig)"/> + <string name="none_text" value="(ingen)"/> + <string name="sale_pending_text" value="(Salg igang)"/> + <string name="group_owned_text" value="(Gruppe ejet)"/> + <string name="price_text" value="L$"/> + <string name="area_text" value="m²"/> + <string name="all_residents_text" value="Alle beboere"/> + <string name="group_text" value="Gruppe"/> + <string name="can_resell"> + Købt land i denne region må sælges videre + </string> + <string name="can_not_resell"> + Købt land i denne region må ikke sælges videre + </string> + <string name="can_change"> + Købt jord i denne region må gerne samles eller opdeles. + </string> + <string name="can_not_change"> + Købt jord i denne region må ikke samles eller opdeles. + </string> + <string name="server_update_text"> + Information om dette sted er ikke tilgængelig før en server opdatering. + </string> + <string name="server_error_text"> + Information om dette sted er ikke tilgængelig lige nu, prøv venligst igen senere. + </string> + <string name="server_forbidden_text"> + Information om dette sted er ikke tilgængelig på grund af adgangsbegrænsninger. Check venligst dine rettigheder med stedets ejer. + </string> + <string name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <text name="title" value="Sted profil"/> + <scroll_container name="place_scroll"> + <panel name="scrolling_panel"> + <text name="owner_label" value="Ejer:"/> + <text name="maturity_value" value="ukendt"/> + <accordion name="advanced_info_accordion"> + <accordion_tab name="parcel_characteristics_tab" title="Parcel"> + <panel> + <text name="rating_label" value="Rating:"/> + <text name="rating_value" value="ukendt"/> + <text name="voice_label" value="Stem:"/> + <text name="voice_value" value="Til"/> + <text name="fly_label" value="Flyve:"/> + <text name="fly_value" value="Til"/> + <text name="push_label" value="Skub:"/> + <text name="push_value" value="Fra"/> + <text name="build_label" value="Byg:"/> + <text name="build_value" value="Til"/> + <text name="scripts_label" value="Scripts:"/> + <text name="scripts_value" value="Til"/> + <text name="damage_label" value="Skade:"/> + <text name="damage_value" value="Fra"/> + <button label="Om land" name="about_land_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="region_information_tab" title="Region"> + <panel> + <text name="region_name_label" value="Region:"/> + <text name="region_type_label" value="Type:"/> + <text name="region_rating_label" value="Rating:"/> + <text name="region_owner_label" value="Ejer:"/> + <text name="region_group_label" value="Gruppe:"/> + <button label="Region/Estate" name="region_info_btn"/> + </panel> + </accordion_tab> + <accordion_tab name="estate_information_tab" title="Estate"> + <panel> + <text name="estate_name_label" value="Estate:"/> + <text name="estate_rating_label" value="Rating:"/> + <text name="estate_owner_label" value="Ejer:"/> + <text name="covenant_label" value="Regler:"/> + </panel> + </accordion_tab> + <accordion_tab name="sales_tab" title="Til salg"> + <panel> + <text name="sales_price_label" value="Pris:"/> + <text name="area_label" value="Areal:"/> + <text name="traffic_label" value="Trafik:"/> + <text name="primitives_label" value="Prims:"/> + <text name="parcel_scripts_label" value="Scripts:"/> + <text name="terraform_limits_label" value="Terraform begrænsninger:"/> + <text name="subdivide_label" value="Mulighed for at Opdele/samle:"/> + <text name="resale_label" value="Mulighed for videresalg:"/> + <text name="sale_to_label" value="Til salg til:"/> + </panel> + </accordion_tab> + </accordion> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index c8602d3119..609512bc1b 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -39,4 +39,8 @@ </text> <check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/> <check_box label="Send e-mail til mig når jeg modtager IM og er offline" name="send_im_to_email"/> + <radio_group name="chat_window" tool_tip="Vis dine personlige beskeder i separate vinduer eller i ét vindue med mange faner (ændring kræver genstart)"> + <radio_item label="Flere vinduer" name="radio"/> + <radio_item label="Et vindue" name="radio2"/> + </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml index ed23a9a706..e17ccca4a1 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml @@ -1,85 +1,62 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Generelt" name="general_panel"> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" tool_tip="Log ind til min hjemme lokation som standard." label="Mit hjem" /> - <combo_box.item name="MyLastLocation" tool_tip="Log ind til min sidste lokation som standard." label="Min sidste lokation" /> - </combo_box> - <check_box label="Vis start lokation på login billedet" name="show_location_checkbox"/> - <combo_box name="fade_out_combobox"> - <combo_box.item name="Never" label="Aldrig"/> - <combo_box.item name="Show Temporarily" label="Vis midlertidigt"/> - <combo_box.item name="Always" label="Altid"/> - </combo_box> - <check_box label="Små avatar navne" name="small_avatar_names_checkbox"/> - <check_box label="Skjul mit navn på min skærm" name="show_my_name_checkbox"/> - <text name="group_titles_textbox"> - Gruppe titler: - </text> - <check_box label="Skjul alle gruppe titler" name="show_all_title_checkbox"/> - <check_box label="Gem min gruppe titel" name="show_my_title_checkbox"/> - <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/> - <text name="UI Size:"> - UI Størrelse: + <text name="language_textbox"> + Sprog: </text> - <check_box label="Brug opløsnings uafhængig skalering" name="ui_auto_scale"/> - <spinner label="Tid før inaktiv:" name="afk_timeout_spinner"/> - <check_box label="Giv besked når Linden dollars (L$) bliver brugt eller modtaget" name="notify_money_change_checkbox"/> - <text name="maturity_desired_label"> - Rating: + <combo_box name="language_combobox"> + <combo_box.item label="System standard" name="System Default Language"/> + <combo_box.item label="English (Engelsk)" name="English"/> + <combo_box.item label="Dansk - Beta" name="Danish"/> + <combo_box.item label="Deutsch (Tysk) - Beta" name="Deutsch(German)"/> + <combo_box.item label="Español (Spansk) - Beta" name="Spanish"/> + <combo_box.item label="Français (Fransk) - Beta" name="French"/> + <combo_box.item label="Polski (Polsk) - Beta" name="Polish"/> + <combo_box.item label="Portugués (Portugisisk) - Beta" name="Portugese"/> + <combo_box.item label="日本語 (Japansk) - Beta" name="(Japanese)"/> + </combo_box> + <text name="language_textbox2"> + (Kræver genstart) </text> <text name="maturity_desired_prompt"> Jeg ønsker adgang til inhold med rating: </text> + <text name="maturity_desired_textbox"/> <combo_box name="maturity_desired_combobox"> - <combo_box.item name="Desired_Adult" label="PG, Mature og Adult"/> - <combo_box.item name="Desired_Mature" label="PG and Mature"/> - <combo_box.item name="Desired_PG" label="PG"/> + <combo_box.item label="PG, Mature og Adult" name="Desired_Adult"/> + <combo_box.item label="PG and Mature" name="Desired_Mature"/> + <combo_box.item label="PG" name="Desired_PG"/> </combo_box> - <text name="maturity_desired_textbox"> - PG - </text> <text name="start_location_textbox"> Start lokation: </text> - <text name="show_names_textbox"> - Vis navne: - </text> + <combo_box name="start_location_combo"> + <combo_box.item label="Min sidste lokation" name="MyLastLocation" tool_tip="Log ind til min sidste lokation som standard."/> + <combo_box.item label="Mit hjem" name="MyHome" tool_tip="Log ind til min hjemme lokation som standard."/> + </combo_box> + <check_box initial_value="true" label="Vis start lokation på login billedet" name="show_location_checkbox"/> + <text name="name_tags_textbox"> + Navneskilte: + </text> + <radio_group name="Name_Tag_Preference"> + <radio_item label="Skjul" name="radio"/> + <radio_item label="Vis" name="radio2"/> + <radio_item label="Vis et øjeblik" name="radio3"/> + </radio_group> + <check_box label="Vis mit navn" name="show_my_name_checkbox1"/> + <check_box initial_value="true" label="Små avatar navne" name="small_avatar_names_checkbox"/> + <check_box label="Gruppetitler" name="show_all_title_checkbox1"/> <text name="effects_color_textbox"> Farve til mine effekter: </text> + <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/> + <text name="title_afk_text"> + Tid inden "væk": + </text> + <spinner label="Tid før inaktiv:" name="afk_timeout_spinner"/> <text name="seconds_textbox"> sekunder </text> - <text name="crash_report_textbox"> - Nedbrudsrapporter: + <text name="text_box3"> + Optaget autosvar: </text> - <text name="language_textbox"> - Sprog: - </text> - <text name="language_textbox2"> - (Kræver genstart for at virke optimalt) - </text> - <string name="region_name_prompt"> - <Skriv regions navn> - </string> - <combo_box name="crash_behavior_combobox"> - <combo_box.item name="Askbeforesending" label="Bed om bekræftigelse"/> - <combo_box.item name="Alwayssend" label="Send altid"/> - <combo_box.item name="Neversend" label="Send aldrig"/> - </combo_box> - <combo_box name="language_combobox"> - <combo_box.item name="System Default Language" label="System standard"/> - <combo_box.item name="English" label="English (Engelsk)"/> - <combo_box.item name="Danish" label="Dansk - Beta"/> - <combo_box.item name="Deutsch(German)" label="Deutsch (Tysk) - Beta"/> - <combo_box.item name="Spanish" label="Español (Spansk) - Beta"/> - <combo_box.item name="French" label="Français (Fransk) - Beta"/> - <combo_box.item name="Hungarian" label="Magyar (Ungarsk) - Beta"/> - <combo_box.item name="Polish" label="Polski (Polsk) - Beta"/> - <combo_box.item name="Portugese" label="Portugués (Portugisisk) - Beta"/> - <combo_box.item name="Chinese" label="中文 (简体) (Kinesisk) - Beta"/> - <combo_box.item name="(Japanese)" label="日本語 (Japansk) - Beta"/> - <combo_box.item name="(Korean)" label="한국어 (Koreansk) - Beta"/> - </combo_box> - <check_box label="Del sprog med objekter" name="language_is_public" tool_tip="Dette lader objekter i verden vide hvad dit foretrukne sprog er."/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml index 4dac7be413..bb1cacc773 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml @@ -1,42 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Grafik" name="Display panel"> - <button label="?" name="GraphicsPreferencesHelpButton" /> - <check_box label="Kør Second Life i et vindue" name="windowed mode" /> - <text_editor name="FullScreenInfo"> - Hvis dette ikke er valgt kører Second Life i Fuld skærm. - </text_editor> - <text name="WindowSizeLabel"> - Opløsning: + <text name="UI Size:"> + UI størrelse: </text> - <combo_box name="windowsize combo"> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="720x480" label="720x480 (NTSC)" /> - <combo_box.item name="768x576" label="768x576 (PAL)" /> - <combo_box.item name="1024x768" label="1024x768" /> - </combo_box> - <text name="DisplayResLabel"> - Skærm opløsning: - </text> - <text name="AspectRatioLabel1" tool_tip="bredde / højde"> - Format: - </text> - <combo_box name="aspect_ratio" tool_tip="bredde/ højde"> - <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard CRT)" /> - <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" /> - <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)" /> - <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)" /> - </combo_box> - <check_box label="Auto-detect format" name="aspect_auto_detect" /> - <text name="HigherText"> - Kvalitet og - </text> - <text name="QualityText"> - Ydelse: + <text name="QualitySpeed"> + Kvalitet og hastighed: </text> <text name="FasterText"> Hurtigere </text> + <text name="BetterText"> + Bedre + </text> + <slider label="" name="QualityPerformanceSelection"/> <text name="ShadersPrefText"> Lav </text> @@ -49,99 +25,82 @@ <text name="ShadersPrefText4"> Ultra </text> - <text name="HigherText2"> - Højere - </text> - <text name="QualityText2"> - Kvalitet - </text> - <slider label="" name="QualityPerformanceSelection" /> - <check_box label="Manuelt" name="CustomSettings" /> - <panel name="CustomGraphics Panel"> - <text name="ShadersText"> - Overflader: - </text> - <check_box label="Glatte flader og skin" name="BumpShiny" /> - <check_box label="Basale flader" name="BasicShaders" - tool_tip="Ved at slå dette valg fra, kan det forhindres at visse grafikkort drivere crasher." /> - <check_box label="Atmosfæriske flader" name="WindLightUseAtmosShaders" /> - <check_box label="Reflektioner i vand" name="Reflections" /> - <text name="ReflectionDetailText"> - Spejlnings detaljer: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item name="0" label="Terræn og træer" /> - <radio_item name="1" label="Alle statiske objekter" /> - <radio_item name="2" label="Alle avatarer og objekter" /> - <radio_item name="3" label="Alt" /> - </radio_group> - <text name="AvatarRenderingText"> - Avatar gengivelse - </text> - <check_box label="Mini-figurer på lang afstand" name="AvatarImpostors" /> - <check_box label="Hardware Skinning" name="AvatarVertexProgram" /> - <check_box label="Avatar tøj" name="AvatarCloth" /> - <text name="DrawDistanceMeterText1"> - m - </text> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Maks. visnings-afstand:" name="DrawDistance" /> - <slider label="Maks. antal partikler:" name="MaxParticleCount" /> - <slider label="Efterbehandlingskvalitet:" name="RenderPostProcess" /> - <text name="MeshDetailText"> - Netmaske detaljer: - </text> - <slider label=" Objekter:" name="ObjectMeshDetail" /> - <slider label=" Flexiprims:" name="FlexibleMeshDetail" /> - <slider label=" Træer:" name="TreeMeshDetail" /> - <slider label=" Avatarer:" name="AvatarMeshDetail" /> - <slider label=" Terræn:" name="TerrainMeshDetail" /> - <slider label=" Himmel:" name="SkyMeshDetail" /> - <text name="PostProcessText"> - Lav - </text> - <text name="ObjectMeshDetailText"> - Lav - </text> - <text name="FlexibleMeshDetailText"> - Lav - </text> - <text name="TreeMeshDetailText"> - Lav - </text> - <text name="AvatarMeshDetailText"> - Lav - </text> - <text name="TerrainMeshDetailText"> - Lav - </text> - <text name="SkyMeshDetailText"> - Lav - </text> - <text name="LightingDetailText"> - Lys detaljer: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item name="SunMoon" label="Kun sol og måne" /> - <radio_item name="LocalLights" label="Lys i nærheden" /> - </radio_group> - <text name="TerrainDetailText"> - Terræn detaljer: - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item name="0" label="Lav" /> - <radio_item name="2" label="Høj" /> - </radio_group> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Overflader: + </text> + <check_box initial_value="true" label="Glatte flader og skin" name="BumpShiny"/> + <check_box initial_value="true" label="Basale flader" name="BasicShaders" tool_tip="Ved at slå dette valg fra, kan det forhindres at visse grafikkort drivere crasher."/> + <check_box initial_value="true" label="Atmosfæriske flader" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Reflektioner i vand" name="Reflections"/> + <text name="ReflectionDetailText"> + Spejlnings detaljer: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Terræn og træer" name="0"/> + <radio_item label="Alle statiske objekter" name="1"/> + <radio_item label="Alle avatarer og objekter" name="2"/> + <radio_item label="Alt" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Avatar gengivelse + </text> + <check_box initial_value="true" label="Mini-figurer på lang afstand" name="AvatarImpostors"/> + <check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Avatar tøj" name="AvatarCloth"/> + <slider label="Maks. visnings-afstand:" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Maks. antal partikler:" name="MaxParticleCount"/> + <slider label="Efterbehandlingskvalitet:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Netmaske detaljer: + </text> + <slider label=" Objekter:" name="ObjectMeshDetail"/> + <slider label=" Flexiprims:" name="FlexibleMeshDetail"/> + <slider label=" Træer:" name="TreeMeshDetail"/> + <slider label=" Avatarer:" name="AvatarMeshDetail"/> + <slider label=" Terræn:" name="TerrainMeshDetail"/> + <slider label=" Himmel:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + Lav + </text> + <text name="ObjectMeshDetailText"> + Lav + </text> + <text name="FlexibleMeshDetailText"> + Lav + </text> + <text name="TreeMeshDetailText"> + Lav + </text> + <text name="AvatarMeshDetailText"> + Lav + </text> + <text name="TerrainMeshDetailText"> + Lav + </text> + <text name="SkyMeshDetailText"> + Lav + </text> + <text name="LightingDetailText"> + Lys detaljer: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="Kun sol og måne" name="SunMoon"/> + <radio_item label="Lys i nærheden" name="LocalLights"/> + </radio_group> + <text name="TerrainDetailText"> + Terræn detaljer: + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="Lav" name="0"/> + <radio_item label="Høj" name="2"/> + </radio_group> </panel> - <button label="Anbefalede indstillinger" name="Defaults" /> - <button label="Hardware valg" label_selected="Hardware Options" - name="GraphicsHardwareButton" /> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> - <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] - </panel.string> + <button label="Benyt" label_selected="Benyt" name="Apply"/> + <button label="Nulstil" name="Defaults"/> + <button label="Avanceret" name="Advanced"/> + <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml new file mode 100644 index 0000000000..987ba2a3f8 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="MediaControls"> + <layout_stack name="media_controls"> + <layout_panel name="media_address"> + <line_editor name="media_address_url" tool_tip="Media URL"/> + <layout_stack name="media_address_url_icons"> + <layout_panel> + <icon name="media_whitelist_flag" tool_tip="Godkendt side"/> + </layout_panel> + <layout_panel> + <icon name="media_secure_lock_flag" tool_tip="Sikker browsing"/> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel name="media_play_position"> + <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Filmafspilning fremskridt"/> + </layout_panel> + <layout_panel name="media_volume"> + <button name="media_mute_button" tool_tip="Sluk for dette media"/> + <slider name="volume_slider" tool_tip="Media lydstyrke"/> + </layout_panel> + </layout_stack> + <layout_stack> + <panel name="media_progress_indicator"> + <progress_bar name="media_progress_bar" tool_tip="Media hentes"/> + </panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_profile_view.xml b/indra/newview/skins/default/xui/da/panel_profile_view.xml new file mode 100644 index 0000000000..23b9d3ba83 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_profile_view.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + Online + </string> + <string name="status_offline"> + Offline + </string> + <text_editor name="user_name" value="(Henter...)"/> + <text name="status" value="Online"/> + <tab_container name="tabs"> + <panel label="PROFIL" name="panel_profile"/> + <panel label="FAVORITTER" name="panel_picks"/> + <panel label="NOTER & PRIVATLIV" name="panel_notes"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_region_estate.xml b/indra/newview/skins/default/xui/da/panel_region_estate.xml index 5d0799cab9..d726fedfe9 100644 --- a/indra/newview/skins/default/xui/da/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/da/panel_region_estate.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Estate" name="Estate"> <text name="estate_help_text"> Ændringer i dette afsnit vil påvirke alle @@ -11,61 +11,59 @@ regioner i dette estate. (ukendt) </text> <text name="owner_text"> - Ejer: + Estate ejer: </text> <text name="estate_owner"> (ukendt) </text> - <check_box label="Brug global tid" name="use_global_time_check" /> - <button label="?" name="use_global_time_help" /> - <check_box label="Sol i fast position" name="fixed_sun_check" /> - <button label="?" name="fixed_sun_help" /> - <slider label="Fase" name="sun_hour_slider" /> - <check_box label="Tillad offentlig adgang" name="externally_visible_check" /> - <button label="?" name="externally_visible_help" /> + <check_box label="Brug global tid" name="use_global_time_check"/> + <button label="?" name="use_global_time_help"/> + <check_box label="Sol i fast position" name="fixed_sun_check"/> + <button label="?" name="fixed_sun_help"/> + <slider label="Fase" name="sun_hour_slider"/> + <check_box label="Tillad offentlig adgang" name="externally_visible_check"/> + <button label="?" name="externally_visible_help"/> <text name="Only Allow"> Begræns adgang til: </text> - <check_box label="Beboere med betalingsoplysninger" name="limit_payment" - tool_tip="Blokér for brugere uden identifikation" /> - <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified" - tool_tip="Blokér for brugere der ikke har verificéret deres alder. Se support.secondlife.com for mere information." /> - <check_box label="Tillad stemme chat" name="voice_chat_check" /> - <button label="?" name="voice_chat_help" /> - <check_box label="Tillad direkte teleport" name="allow_direct_teleport" /> - <button label="?" name="allow_direct_teleport_help" /> + <check_box label="Beboere med betalingsoplysninger" name="limit_payment" tool_tip="Blokér for brugere uden identifikation"/> + <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér for brugere der ikke har verificéret deres alder. Se [SUPPORT_SITE] for mere information."/> + <check_box label="Tillad stemme chat" name="voice_chat_check"/> + <button label="?" name="voice_chat_help"/> + <check_box label="Tillad direkte teleport" name="allow_direct_teleport"/> + <button label="?" name="allow_direct_teleport_help"/> <text name="abuse_email_text" width="260"> Send beskeder misbrug til email adresse: </text> <string name="email_unsupported"> Ikke supporteret </string> - <button label="?" name="abuse_email_address_help" /> - <button label="Gem" name="apply_btn" /> - <button label="Smid bruger ud fra estate..." name="kick_user_from_estate_btn" /> - <button label="Send besked til estate..." name="message_estate_btn" /> + <button label="?" name="abuse_email_address_help"/> + <button label="Gem" name="apply_btn"/> + <button label="Smid bruger ud fra estate..." name="kick_user_from_estate_btn"/> + <button label="Send besked til estate..." name="message_estate_btn"/> <text name="estate_manager_label"> Administratorer: </text> - <button label="?" name="estate_manager_help" /> - <button label="Fjern..." name="remove_estate_manager_btn" /> - <button label="Tilføj..." name="add_estate_manager_btn" /> + <button label="?" name="estate_manager_help"/> + <button label="Fjern..." name="remove_estate_manager_btn"/> + <button label="Tilføj..." name="add_estate_manager_btn"/> <text name="allow_resident_label"> Godkendte beboere: </text> - <button label="?" name="allow_resident_help" /> - <button label="Fjern..." name="remove_allowed_avatar_btn" /> - <button label="Tilføj..." name="add_allowed_avatar_btn" /> + <button label="?" name="allow_resident_help"/> + <button label="Fjern..." name="remove_allowed_avatar_btn"/> + <button label="Tilføj..." name="add_allowed_avatar_btn"/> <text name="allow_group_label"> Tilladte grupper: </text> - <button label="?" name="allow_group_help" /> - <button label="Fjern..." name="remove_allowed_group_btn" /> - <button label="Tilføj..." name="add_allowed_group_btn" /> + <button label="?" name="allow_group_help"/> + <button label="Fjern..." name="remove_allowed_group_btn"/> + <button label="Tilføj..." name="add_allowed_group_btn"/> <text name="ban_resident_label"> Blokérede beboere: </text> - <button label="?" name="ban_resident_help" /> - <button label="Fjern..." name="remove_banned_avatar_btn" /> - <button label="Tilføj..." name="add_banned_avatar_btn" /> + <button label="?" name="ban_resident_help"/> + <button label="Fjern..." name="remove_banned_avatar_btn"/> + <button label="Tilføj..." name="add_banned_avatar_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/da/panel_side_tray_tab_caption.xml new file mode 100644 index 0000000000..5c0bd829d8 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_side_tray_tab_caption.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="sidetray_tab_panel"> + <text name="sidetray_tab_title" value="Side bjælke"/> + <button name="show_help" tool_tip="Vis hjælp"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_status_bar.xml b/indra/newview/skins/default/xui/da/panel_status_bar.xml index 20e72827f2..4e45b7e328 100644 --- a/indra/newview/skins/default/xui/da/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/da/panel_status_bar.xml @@ -1,44 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <text name="ParcelNameText" - tool_tip="Navn på det land/parcel som du står på. Klik på teksten for yderligere info."> - parcel name goes here - </text> - <text name="BalanceText" tool_tip="Konto balance"> - Henter... - </text> - <button label="" label_selected="" name="buycurrency" tool_tip="Køb valuta" /> - <text name="TimeText" tool_tip="Nuværende [SECOND_LIFE] tid"> - 12:00 - </text> - <string name="StatBarDaysOfWeek"> + <panel.string name="StatBarDaysOfWeek"> Søndag:Mandag:Tirsdag:Onsdag:Torsdag:Fredag:Lørdag - </string> - <string name="StatBarMonthsOfYear"> + </panel.string> + <panel.string name="StatBarMonthsOfYear"> Januar:Februar:Marts:April:Maj:Juni:Juli:August:September:Oktober:November:December - </string> - <button label="" label_selected="" name="scriptout" tool_tip="Script advarsler og fejl" /> - <button label="" label_selected="" name="health" tool_tip="Helbred" /> - <text name="HealthText" tool_tip="Helbred"> - 100% - </text> - <button label="" label_selected="" name="no_fly" tool_tip="Flyvning ikke tilladt" /> - <button label="" label_selected="" name="no_build" - tool_tip="Bygning og placering af objekter ikke tilladt" /> - <button label="" label_selected="" name="no_scripts" - tool_tip="Afvikling af scripts ikke tilladt" /> - <button label="" label_selected="" name="restrictpush" - tool_tip="Ikke tilladt at skubbe" /> - <button label="" label_selected="" name="status_no_voice" - tool_tip="Stemme chat ikke tilgængelig" /> - <button label="" label_selected="" name="buyland" tool_tip="Køb denne parcel" /> - <button label="" name="menubar_search_bevel_bg" /> - <line_editor label="Søg" name="search_editor" tool_tip="Søg [SECOND_LIFE]" /> - <button label="" label_selected="" name="search_btn" tool_tip="Søg [SECOND_LIFE]" /> - <string name="packet_loss_tooltip"> + </panel.string> + <panel.string name="packet_loss_tooltip"> Packet Loss - </string> - <string name="bandwidth_tooltip"> + </panel.string> + <panel.string name="bandwidth_tooltip"> Båndbredde - </string> + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="My Balance: Click to buy more L$"/> + <text name="TimeText" tool_tip="Nuværende tid (Pacific)"> + 12:00 + </text> + <button name="volume_btn" tool_tip="Kontrol for generel lydstyrke"/> </panel> diff --git a/indra/newview/skins/default/xui/da/role_actions.xml b/indra/newview/skins/default/xui/da/role_actions.xml index e4c8c4b93b..5ec90a759a 100644 --- a/indra/newview/skins/default/xui/da/role_actions.xml +++ b/indra/newview/skins/default/xui/da/role_actions.xml @@ -1,201 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> - <action_set - description="Disse rettigheder inkluderer adgang til at tilføje og fjerne gruppe medlemmer og tillade nye medlemmer at melde sig ind uden invitation" - name="Membership"> - <action description="Invitér personer til denne gruppe" - longdescription="Invitér personer til denne gruppe via 'Invitér ny person...' knappen i fanen: medlemmer & roller > underfanen: medlemmer" - name="member invite" /> - <action description="Fjern medlemmer fra denne gruppe" - longdescription="Fjern medlemmer i denne gruppe via 'Fjern fra gruppe' knappen i fanen: medlemmer & roller > underfanen: medlemmer. En ejer kan fjerne alle undtagen en anden ejer. Hvis du ikke er en ejer, kan et medlem kun fjernes fra gruppen hvis, og kun hvis, medlemmet kun findes i Alle rollen, og ikke i andre roller. for at fjerne medlemmer fra roller, skal du have rettigheden 'Fjern medlemmer fra roller'" - name="member eject" /> - <action - description="Åben eller luk for 'fri tilmelding' og ændre 'tilmeldingsgebyr'" - longdescription="Åben for 'fri tilmelding' så alle kan blive medlem af gruppen, eller luk for 'fri tilmelding' så kun inveterede kan blive medlem. ændre 'tilmeldingsgebyr' i gruppe opsætningsbilledet sektionen i Generelt fanen" - name="member options" /> + <action_set description="Disse rettigheder inkluderer adgang til at tilføje og fjerne gruppe medlemmer og tillade nye medlemmer at melde sig ind uden invitation" name="Membership"> + <action description="Invitér personer til denne gruppe" longdescription="Invitér personer til denne gruppe via 'Invitér ny person...' knappen i fanen: medlemmer & roller > underfanen: medlemmer" name="member invite"/> + <action description="Fjern medlemmer fra denne gruppe" longdescription="Fjern medlemmer i denne gruppe via 'Fjern fra gruppe' knappen i fanen: medlemmer & roller > underfanen: medlemmer. En ejer kan fjerne alle undtagen en anden ejer. Hvis du ikke er en ejer, kan et medlem kun fjernes fra gruppen hvis, og kun hvis, medlemmet kun findes i Alle rollen, og ikke i andre roller. for at fjerne medlemmer fra roller, skal du have rettigheden 'Fjern medlemmer fra roller" name="member eject"/> + <action description="Åben eller luk for 'fri tilmelding' og ændre 'tilmeldingsgebyr'" longdescription="Åben for 'fri tilmelding' så alle kan blive medlem af gruppen, eller luk for 'fri tilmelding' så kun inveterede kan blive medlem. ændre 'tilmeldingsgebyr' i gruppe opsætningsbilledet sektionen i Generelt fanen" name="member options"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at tilføje, fjerne og ændre gruppe-roller, tilføje og fjerne medlemmer i roller, og give rettigheder til roller" - name="Roles"> - <action description="Opret nye roller" - longdescription="Opret nye roller i fanen: Medlemmer & roller > under-fanen: Roller." - name="role create" /> - <action description="Slet roller" - longdescription="Slet roller i roller i fanen: Medlemmer & roller > under-fanen: Roller." - name="role delete" /> - <action - description="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen" - longdescription="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen. Dette håndteres i bunden af fanen:: Medlemmer & roller > under-fanen: Roller efter at have valgt en rolle." - name="role properties" /> - <action description="Tildel andre samme roller som dig selv" - longdescription="Tildel andre medlemmer til roller i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Et medlem med denne rettighed kan kun tildele andre medlemmer en rolle som tildeleren allerede selv har." - name="role assign member limited" /> - <action description="Tildele medlemmer enhver rolle" - longdescription="Tildel andre medlemmer til en hvilken som helst rolle i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - roller som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." - name="role assign member" /> - <action description="Fjern medlemmer fra roller" - longdescription="Fjern medlemmer fra roller i in Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Ejere kan ikke fjernes." - name="role remove member" /> - <action description="Tildel og fjern rettigheder for roller" - longdescription="Tildel og fjern rettigheder for roller i tilladte rettigheder sektionen på fanen: Medlemmer & roller > under-fanen: Roller. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - rettigheder som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du gør inden du tildeler denne rettighed." - name="role change actions" /> + <action_set description="Disse rettigheder inkluderer adgang til at tilføje, fjerne og ændre gruppe-roller, tilføje og fjerne medlemmer i roller, og give rettigheder til roller" name="Roles"> + <action description="Opret nye roller" longdescription="Opret nye roller i fanen: Medlemmer & roller > under-fanen: Roller." name="role create"/> + <action description="Slet roller" longdescription="Slet roller i roller i fanen: Medlemmer & roller > under-fanen: Roller." name="role delete"/> + <action description="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen" longdescription="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen. Dette håndteres i bunden af fanen:: Medlemmer & roller > under-fanen: Roller efter at have valgt en rolle." name="role properties"/> + <action description="Tildel andre samme roller som dig selv" longdescription="Tildel andre medlemmer til roller i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Et medlem med denne rettighed kan kun tildele andre medlemmer en rolle som tildeleren allerede selv har." name="role assign member limited"/> + <action description="Tildele medlemmer enhver rolle" longdescription="Tildel andre medlemmer til en hvilken som helst rolle i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - roller som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="role assign member"/> + <action description="Fjern medlemmer fra roller" longdescription="Fjern medlemmer fra roller i in Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Ejere kan ikke fjernes." name="role remove member"/> + <action description="Tildel og fjern rettigheder for roller" longdescription="Tildel og fjern rettigheder for roller i tilladte rettigheder sektionen på fanen: Medlemmer & roller > under-fanen: Roller. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - rettigheder som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du gør inden du tildeler denne rettighed." name="role change actions"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at ændre denne gruppes identitetsoplysninger, som f.eks. om gruppen kan ses af andre, gruppens fundats og billede." - name="Group Identity"> - <action description="Ændre fundats, billede og 'Vis i søgning'" - longdescription="Ændre fundats og 'Vis i søgning'. Dette gøres under fanen Generelt." - name="group change identity" /> + <action_set description="Disse rettigheder inkluderer adgang til at ændre denne gruppes identitetsoplysninger, som f.eks. om gruppen kan ses af andre, gruppens fundats og billede." name="Group Identity"> + <action description="Ændre fundats, billede og 'Vis i søgning'" longdescription="Ændre fundats og 'Vis i søgning'. Dette gøres under fanen Generelt." name="group change identity"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til dedikere, ændre og sælge land fra denne gruppes besiddelser. For at åbne 'Om land...' vinduet, højre-klik på jorden og vælg 'Om land...', eller klik på 'Om land...' i 'Verden' menuen." - name="Parcel Management"> - <action description="Dedikér eller køb land til gruppen" - longdescription="Dedikér eller køb land til gruppen. Dette gøres i fanen Generelt i 'Om land...'." - name="land deed" /> - <action description="Forlad land og overgiv det til guvernør Linden" - longdescription="Forlad land og overgiv det til guvernør Linden. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan overdrage gruppe-ejet land via fanen Generelt i 'Om land...' til Lindens ejerskab uden salg! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." - name="land release" /> - <action description="Sæt land til salg" - longdescription="Sæt land til salg. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan sælge gruppe-ejet land via fanen Generelt i 'Om land...'! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." - name="land set sale info" /> - <action description="Opdel og saml parceller" - longdescription="Opdel og saml parceller. Dette gøres ved at højreklikke på jorden og vælge 'Redigér terræn'" - name="land divide join" /> + <action_set description="Disse rettigheder inkluderer adgang til dedikere, ændre og sælge land fra denne gruppes besiddelser. For at åbne 'Om land...' vinduet, højre-klik på jorden og vælg 'Om land...', eller klik på 'Om land...' i 'Verden' menuen." name="Parcel Management"> + <action description="Dedikér eller køb land til gruppen" longdescription="Dedikér eller køb land til gruppen. Dette gøres i fanen Generelt i 'Om land...'." name="land deed"/> + <action description="Forlad land og overgiv det til guvernør Linden" longdescription="Forlad land og overgiv det til guvernør Linden. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan overdrage gruppe-ejet land via fanen Generelt i 'Om land...' til Lindens ejerskab uden salg! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land release"/> + <action description="Sæt land til salg" longdescription="Sæt land til salg. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan sælge gruppe-ejet land via fanen Generelt i 'Om land...'! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land set sale info"/> + <action description="Opdel og saml parceller" longdescription="Opdel og saml parceller. Dette gøres ved at højreklikke på jorden og vælge 'Redigér terræn'" name="land divide join"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at ændre parcel navn og en række parametre om f.eks. landingspunkt, teleports m.v.." - name="Parcel Identity"> - <action - description="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori" - longdescription="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori i 'Om land...' > Indstillinger fanen." - name="land find places" /> - <action - description="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning" - longdescription="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning. Dette håndteres i 'Om land...'> Opsætning fanen." - name="land change identity" /> - <action description="Sæt landingspunkt og teleport muligheder" - longdescription="På en gruppe-ejet parcel kan medlemmer, med en rolle med denne rettighed, sætte landingspunktet og dermed angive hvor indkommende teleporte skal ankomme og desuden angive dealjer om teleporte. Dette håndteres i 'Om land...'> Opsætning fanen." - name="land set landing point" /> + <action_set description="Disse rettigheder inkluderer adgang til at ændre parcel navn og en række parametre om f.eks. landingspunkt, teleports m.v.." name="Parcel Identity"> + <action description="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori" longdescription="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori i 'Om land...' > Indstillinger fanen." name="land find places"/> + <action description="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning" longdescription="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning. Dette håndteres i 'Om land...'> Opsætning fanen." name="land change identity"/> + <action description="Sæt landingspunkt og teleport muligheder" longdescription="På en gruppe-ejet parcel kan medlemmer, med en rolle med denne rettighed, sætte landingspunktet og dermed angive hvor indkommende teleporte skal ankomme og desuden angive dealjer om teleporte. Dette håndteres i 'Om land...'> Opsætning fanen." name="land set landing point"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at opsætte parcel indstillinger som f.eks. 'Lave objekter', 'Redigere terræn', samt musik og media indstillinger." - name="Parcel Settings"> - <action description="Ændre musik og media indstillinger" - longdescription="Ændre oplysninger om streaming musik og film i 'Om land...' > Media fanen." - name="land change media" /> - <action description="Ændre rettighed til 'Redigere terræn'" - longdescription="Ændre rettighed til 'Redigere terræn'. *ADVARSEL*: Redigere terræn' kan give alle og enhver ret til at ændre terræn og opsætte og flytte Linden planter. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." - name="land edit" /> - <action - description="Ændre diverse andre indstillinger i 'Om land...'> indstillinger fanen" - longdescription="Giv adgang til at ændre 'Sikker (ingen skade)', 'Flyve', og tillad andre beboere at: 'Lave objekter', 'Redigere terræn', 'Lave landemærker', og 'Køre scripts' på gruppe-ejet land via About Land > Indstillinger fanen." - name="land options" /> + <action_set description="Disse rettigheder inkluderer adgang til at opsætte parcel indstillinger som f.eks. 'Lave objekter', 'Redigere terræn', samt musik og media indstillinger." name="Parcel Settings"> + <action description="Ændre musik og media indstillinger" longdescription="Ændre oplysninger om streaming musik og film i 'Om land...' > Media fanen." name="land change media"/> + <action description="Ændre rettighed til 'Redigere terræn'" longdescription="Ændre rettighed til 'Redigere terræn'. *ADVARSEL*: Redigere terræn' kan give alle og enhver ret til at ændre terræn og opsætte og flytte Linden planter. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land edit"/> + <action description="Ændre diverse andre indstillinger i 'Om land...'> indstillinger fanen" longdescription="Giv adgang til at ændre 'Sikker (ingen skade)', 'Flyve', og tillad andre beboere at: 'Lave objekter', 'Redigere terræn', 'Lave landemærker', og 'Køre scripts' på gruppe-ejet land via About Land > Indstillinger fanen." name="land options"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at medlemmer kan omgå restriktioner på gruppe-ejede parceller." - name="Parcel Powers"> - <action description="Tillad altid 'Rediger Terræn'" - longdescription="Medlemmer med denne rolle har adgang til at redigere terræn på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." - name="land allow edit land" /> - <action description="Tillad altid at 'Flyve'" - longdescription="Medlemmer med denne rolle har adgang til at flyve på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." - name="land allow fly" /> - <action description="Tillad altid 'Lave objekter'" - longdescription="Medlemmer med denne rolle har adgang til at lave nye objekter på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." - name="land allow create" /> - <action description="Tillad altid at 'Lave landemærker'" - longdescription="Medlemmer med denne rolle har adgang til at lave landemærker på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." - name="land allow landmark" /> - <action description="Tillad altid 'sæt til hjem' på gruppe-ejet land" - longdescription="Medlemmer med denne rolle har adgang til at benytte 'Verden' menuen og vælge 'sæt til hjem' på en parcel der er dedikeret til gruppen." - name="land allow set home" /> + <action_set description="Disse rettigheder inkluderer adgang til at medlemmer kan omgå restriktioner på gruppe-ejede parceller." name="Parcel Powers"> + <action description="Tillad altid 'Rediger Terræn'" longdescription="Medlemmer med denne rolle har adgang til at redigere terræn på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow edit land"/> + <action description="Tillad altid at 'Flyve'" longdescription="Medlemmer med denne rolle har adgang til at flyve på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow fly"/> + <action description="Tillad altid 'Lave objekter'" longdescription="Medlemmer med denne rolle har adgang til at lave nye objekter på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow create"/> + <action description="Tillad altid at 'Lave landemærker'" longdescription="Medlemmer med denne rolle har adgang til at lave landemærker på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow landmark"/> + <action description="Tillad altid 'sæt til hjem' på gruppe-ejet land" longdescription="Medlemmer med denne rolle har adgang til at benytte 'Verden' menuen og vælge 'sæt til hjem' på en parcel der er dedikeret til gruppen." name="land allow set home"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at medlemmer kan tillade eller forbyde adgang til gruppe-ejede parceller, inkluderende at 'fryse' og udsmide beboere." - name="Parcel Access"> - <action description="Administrér adgangsregler for parceller" - longdescription="Administrér adgangsregler for parceller i 'Om land' > 'Adgang' fanen." - name="land manage allowed" /> - <action description="Administrér liste med blokerede beboere på parceller" - longdescription="Administrér liste med blokerede beboere på parceller i 'Om land' > 'Adgang' fanen." - name="land manage banned" /> - <action - description="Ændre indstillinger for at 'Sælge adgang til' parceller" - longdescription="Ændre indstillinger for at 'Sælge adgang til' parceller i 'Om land' > 'Adgang' fanen." - name="land manage passes" /> - <action - description="Adgang til at smide beboere ud og 'fryse' beboere på parceller" - longdescription="Medlermmer med denne rolle kan håndtere beboere som ikke er velkomne på gruppe-ejet parceller ved at højreklikke på dem, vælge Mere>, og vælge 'Smid ud...' eller 'Frys...'." - name="land admin" /> + <action_set description="Disse rettigheder inkluderer adgang til at medlemmer kan tillade eller forbyde adgang til gruppe-ejede parceller, inkluderende at 'fryse' og udsmide beboere." name="Parcel Access"> + <action description="Administrér adgangsregler for parceller" longdescription="Administrér adgangsregler for parceller i 'Om land' > 'Adgang' fanen." name="land manage allowed"/> + <action description="Administrér liste med blokerede beboere på parceller" longdescription="Administrér liste med blokerede beboere på parceller i 'Om land' > 'Adgang' fanen." name="land manage banned"/> + <action description="Ændre indstillinger for at 'Sælge adgang til' parceller" longdescription="Ændre indstillinger for at 'Sælge adgang til' parceller i 'Om land' > 'Adgang' fanen." name="land manage passes"/> + <action description="Adgang til at smide beboere ud og 'fryse' beboere på parceller" longdescription="Medlemmer med denne rolle kan håndtere beboere som ikke er velkomne på gruppe-ejet parceller ved at højreklikke på dem, vælge Mere>, og vælge 'Smid ud...' eller 'Frys...'." name="land admin"/> </action_set> - <action_set - description="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." - name="Parcel Content"> - <action description="Returnere objekter ejet af gruppen" - longdescription="Returne objekter på gruppe-ejede parceller der er ejet af gruppen. Dette håndteres i 'Om land...'> 'Objekter' fanen." - name="land return group owned" /> - <action description="Returnere objekter der er sat til 'gruppe'" - longdescription="Returnere objekter på gruppe-ejede parceller, der er 'sat til gruppe' i 'Om land...'> 'Objekter' fanen." - name="land return group set" /> - <action description="Returnere objekter der ikke er ejet af andre" - longdescription="Returnere objekter på gruppe-ejede parceller, der er 'Ejet af andre' i 'Om land...'> 'Objekter' fanen." - name="land return non group" /> - <action description="Ændre landskab med Linden planter" - longdescription="Mulighed for at ændre landskabet ved at placere og flytte Linden træer, planter, og græs. Disse genstande kan findes i din beholdnings Library > Objects mappe eller de kan oprettes via 'Byg' knappen." - name="land gardening" /> + <action_set description="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." name="Parcel Content"> + <action description="Returnere objekter ejet af gruppen" longdescription="Returne objekter på gruppe-ejede parceller der er ejet af gruppen. Dette håndteres i 'Om land...'> 'Objekter' fanen." name="land return group owned"/> + <action description="Returnere objekter der er sat til 'gruppe'" longdescription="Returnere objekter på gruppe-ejede parceller, der er 'sat til gruppe' i 'Om land...'> 'Objekter' fanen." name="land return group set"/> + <action description="Returnere objekter der ikke er ejet af andre" longdescription="Returnere objekter på gruppe-ejede parceller, der er 'Ejet af andre' i 'Om land...'> 'Objekter' fanen." name="land return non group"/> + <action description="Ændre landskab med Linden planter" longdescription="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." name="land gardening"/> </action_set> - <action_set - description="Disse rettigheder inkluderer mulighed til at dedikere, ændre og sælge gruppe-ejede objekter. Disse ændringer sker i 'Rediger'> 'Generelt' fanen." - name="Object Management"> - <action description="Dediker objekter til gruppe" - longdescription="Dediker objekter til gruppe i 'Rediger'> 'Generelt' fanen." - name="object deed" /> - <action description="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter" - longdescription="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter i 'Rediger'> 'Generelt' fanen." - name="object manipulate" /> - <action description="Sæt gruppe-ejede objekter til salg" - longdescription="Sæt gruppe-ejede objekter til salg i 'Rediger'> 'Generelt' fanen." - name="object set sale" /> + <action_set description="Disse rettigheder inkluderer mulighed til at dedikere, ændre og sælge gruppe-ejede objekter. Disse ændringer sker i 'Rediger'> 'Generelt' fanen." name="Object Management"> + <action description="Dediker objekter til gruppe" longdescription="Dediker objekter til gruppe i 'Rediger'> 'Generelt' fanen." name="object deed"/> + <action description="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter" longdescription="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter i 'Rediger'> 'Generelt' fanen." name="object manipulate"/> + <action description="Sæt gruppe-ejede objekter til salg" longdescription="Sæt gruppe-ejede objekter til salg i 'Rediger'> 'Generelt' fanen." name="object set sale"/> </action_set> - <action_set - description="Disse rettigheder inkluderer mulighed til at håndtere betalinger for gruppen og styre adgang til gruppens kontobevægelser." - name="Accounting"> - <action description="Betale gruppe regninger og modtage gruppe udbytte" - longdescription="Medlemmer med denne rolle vil automatisk betale gruppe regninger og modtage gruppe udbytte. Det betyder at de vil modtager en andel af indtægter fra salg af gruppe-ejet land og bidrage til betaling af gruppe-relaterede betalinger, som f.eks. betaling for at paceller vises i lister. " - name="accounting accountable" /> + <action_set description="Disse rettigheder inkluderer mulighed til at håndtere betalinger for gruppen og styre adgang til gruppens kontobevægelser." name="Accounting"> + <action description="Betale gruppe regninger og modtage gruppe udbytte" longdescription="Medlemmer med denne rolle vil automatisk betale gruppe regninger og modtage gruppe udbytte. Det betyder at de vil modtager en andel af indtægter fra salg af gruppe-ejet land og bidrage til betaling af gruppe-relaterede betalinger, som f.eks. betaling for at paceller vises i lister. " name="accounting accountable"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at kunne sende, modtage og se gruppe beskeder." - name="Notices"> - <action description="Send beskeder" - longdescription="Medlemmer med denne rolle kan sende beskeder i 'Beskeder' fanen." - name="notices send" /> - <action description="Modtage og se tidligere beskeder" - longdescription="Medlemmer med denne rolle kan modtage og se tidligere beskeder i 'Beskeder' fanen." - name="notices receive" /> + <action_set description="Disse rettigheder inkluderer adgang til at kunne sende, modtage og se gruppe beskeder." name="Notices"> + <action description="Send beskeder" longdescription="Medlemmer med denne rolle kan sende beskeder i 'Beskeder' fanen." name="notices send"/> + <action description="Modtage og se tidligere beskeder" longdescription="Medlemmer med denne rolle kan modtage og se tidligere beskeder i 'Beskeder' fanen." name="notices receive"/> </action_set> - <action_set - description="Disse rettigheder inkluderer adgang til at kunne oprette forslag, stemme på forslag og se historik med forslag." - name="Proposals"> - <action description="Opret forslag" - longdescription="Medlemmer med denne rolle kan oprette forslag som der kan stemmes om i 'Forslag' fanen." - name="proposal start" /> - <action description="Stem på forslag" - longdescription="Medlemmer med denne rolle kan stemme på forslag i 'Forslag' fanen." - name="proposal vote" /> + <action_set description="Disse rettigheder inkluderer adgang til at kunne oprette forslag, stemme på forslag og se historik med forslag." name="Proposals"> + <action description="Opret forslag" longdescription="Medlemmer med denne rolle kan oprette forslag som der kan stemmes om i 'Forslag' fanen." name="proposal start"/> + <action description="Stem på forslag" longdescription="Medlemmer med denne rolle kan stemme på forslag i 'Forslag' fanen." name="proposal vote"/> </action_set> - <action_set - description="Disse rettigheder styrer hvem der kan deltage i gruppe-chat og gruppe stemme-chat." - name="Chat"> - <action description="Deltage i gruppe-chat" - longdescription="Medlemmer med denne rolle kan deltage i gruppe-chat sessioner" - name="join group chat" /> - <action description="Deltag i gruppe stemme-chat" - longdescription="Medlemmer med denne rolle kan deltage i gruppe stemme-chat sessioner. BEMÆRK: Medlemmet skal også have rollen 'Deltage i gruppe-chat' for at denne rolle har effekt." - name="join voice chat" /> - <action description="Styr gruppe-chat" - longdescription="Medlemmer med denne rolle kan kontrollere adgang og deltagelse i gruppe-chat og gruppe stemme-chat sessioner." - name="moderate group chat" /> + <action_set description="Disse rettigheder styrer hvem der kan deltage i gruppe-chat og gruppe stemme-chat." name="Chat"> + <action description="Deltage i gruppe-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe-chat sessioner" name="join group chat"/> + <action description="Deltag i gruppe stemme-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe stemme-chat sessioner. BEMÆRK: Medlemmet skal også have rollen 'Deltage i gruppe-chat' for at denne rolle har effekt." name="join voice chat"/> + <action description="Styr gruppe-chat" longdescription="Medlemmer med denne rolle kan kontrollere adgang og deltagelse i gruppe-chat og gruppe stemme-chat sessioner." name="moderate group chat"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/da/sidepanel_appearance.xml b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml new file mode 100644 index 0000000000..27708f5c7a --- /dev/null +++ b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Sæt" name="appearance panel"> + <string name="No Outfit" value="Intet sæt"/> + <filter_editor label="Filtrér sæt" name="Filter"/> + <panel name="bottom_panel"> + <button name="options_gear_btn" tool_tip="Vis flere muligheder"/> + <button name="newlook_btn" tool_tip="Tilføj nyt sæt"/> + <dnd_button name="trash_btn" tool_tip="Fjern valgte del"/> + <button label="Bær" name="wear_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml new file mode 100644 index 0000000000..ae029f5939 --- /dev/null +++ b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Ting" name="objects panel"> + <panel label="" name="sidepanel__inventory_panel"> + <panel name="button_panel"> + <button label="Profil" name="info_btn"/> + <button label="Bær" name="wear_btn"/> + <button label="Afspil" name="play_btn"/> + <button label="Teleportér" name="teleport_btn"/> + </panel> + </panel> +</panel> 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_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index a797d54749..2bd8420925 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -82,6 +82,8 @@ orientation="vertical" tool_tip="Zoom camera toward focus" top_pad="0" + min_val="0" + max_val="1" width="18"> <commit_callback function="Slider.value_changed"/> </slider_bar> diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml index be32e917e5..214fb6ce54 100644 --- a/indra/newview/skins/default/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_resize="true" - height="480" + height="600" layout="topleft" min_height="150" min_width="500" @@ -11,7 +11,7 @@ save_rect="true" single_instance="true" title="HELP BROWSER" - width="620"> + width="650"> <floater.string name="loading_text"> Loading... @@ -20,20 +20,20 @@ name="done_text"> </floater.string> <layout_stack - bottom="480" + bottom="600" follows="left|right|top|bottom" layout="topleft" left="5" name="stack1" top="20" - width="610"> + width="640"> <layout_panel layout="topleft" left_delta="0" top_delta="0" name="external_controls" user_resize="false" - width="590"> + width="620"> <web_browser bottom="-11" follows="left|right|top|bottom" @@ -41,8 +41,8 @@ left="0" name="browser" top="0" - height="500" - width="590" /> + height="610" + width="620" /> <text follows="bottom|left" height="16" diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index bd25288a9e..978b40da77 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -19,8 +19,11 @@ left="1" name="im_box_tab_container" tab_position="bottom" - tab_width="80" + tab_width="64" + tab_max_width = "134" tab_height="16" + use_custom_icon_ctrl="true" + tab_icon_ctrl_pad="2" top="0" width="390" /> <icon 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/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml index 1903e7c714..5d35275e17 100644 --- a/indra/newview/skins/default/xui/en/floater_map.xml +++ b/indra/newview/skins/default/xui/en/floater_map.xml @@ -3,12 +3,10 @@ legacy_header_height="18" can_minimize="true" can_resize="true" - center_horiz="true" - center_vert="true" follows="top|right" height="218" layout="topleft" - min_height="60" + min_height="174" min_width="174" name="Map" title="Mini Map" @@ -16,6 +14,8 @@ save_rect="true" save_visibility="true" single_instance="true" + left="0" + top="0" width="200"> <floater.string name="mini_map_north"> diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index eb772cc0bd..cc9afe4474 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -89,7 +89,7 @@ No Answer. Please try again later. top="27" width="315" word_wrap="true"> - You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat. + You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY] </text> <text font="SansSerifLarge" @@ -100,7 +100,7 @@ No Answer. Please try again later. top="27" width="315" word_wrap="true"> - [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat. + [VOICE_CHANNEL_NAME] has ended the call. [RECONNECT_NEARBY] </text> <text font="SansSerif" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 15655a920e..05deca705a 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -56,7 +56,7 @@ help_topic="preferences_general_tab" name="general" /> <panel - class="panel_preference" + class="panel_preference_graphics" filename="panel_preferences_graphics1.xml" label="Graphics" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index 0d155fb01e..fc6f06ffd4 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -114,7 +114,7 @@ left="6" name="Keep" top_pad="5" - width="100" /> + width="110" /> <button follows="right|bottom" height="22" @@ -123,7 +123,7 @@ left_pad="5" name="Discard" top_delta="0" - width="100" /> + width="110" /> <button follows="right|bottom" height="22" @@ -132,5 +132,5 @@ left_pad="5" name="save_tex_btn" top_delta="0" - width="100" /> + width="110" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 775e7d66f7..9ca18d455b 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -2,16 +2,16 @@ <floater legacy_header_height="13" can_resize="true" - height="546" + height="600" layout="topleft" - min_height="546" - min_width="670" + min_height="400" + min_width="450" name="floater_search" help_topic="floater_search" save_rect="true" single_instance="true" title="FIND" - width="670"> + width="650"> <floater.string name="loading_text"> Loading... @@ -21,20 +21,20 @@ Done </floater.string> <layout_stack - bottom="541" + bottom="595" follows="left|right|top|bottom" layout="topleft" left="10" name="stack1" top="20" - width="650"> + width="630"> <layout_panel layout="topleft" left_delta="0" top_delta="0" name="browser_layout" user_resize="false" - width="650"> + width="630"> <web_browser bottom="-10" follows="left|right|top|bottom" @@ -42,8 +42,8 @@ left="0" name="browser" top="0" - height="500" - width="650" /> + height="555" + width="630" /> <text follows="bottom|left" height="16" diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml index dc8f00d5f3..b730f0e511 100644 --- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml @@ -28,4 +28,17 @@ width="200"> This contains long text and should scroll horizontally to the right </text_editor> + <text_editor + height="50" + follows="top|left|bottom" + font="SansSerif" + left="10" + name="numeric_text_editor" + tool_tip="text editor for numeric text entry only" + top_pad="10" + text_type="int" + width="200"> + This is text that is NOT a number, so shouldn't appear + </text_editor> + </floater> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index e1df50bf58..34d4b19410 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -4,7 +4,7 @@ can_resize="true" center_horiz="true" center_vert="true" - height="535" + height="600" layout="topleft" min_height="520" min_width="520" @@ -14,16 +14,16 @@ save_visibility="true" single_instance="true" title="WORLD MAP" - width="800"> + width="650"> <panel filename="panel_world_map.xml" follows="all" - height="500" + height="555" layout="topleft" left="10" name="objects_mapview" top="25" - width="542" /> + width="375" /> <panel name="layout_panel_1" height="22" @@ -394,7 +394,7 @@ <panel follows="right|top|bottom" - height="270" + height="310" top_pad="0" width="238"> <icon @@ -514,7 +514,7 @@ draw_stripes="false" bg_writeable_color="MouseGray" follows="all" - height="115" + height="145" layout="topleft" left="28" name="search_results" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index 9212d2d648..1e32cfd9df 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -13,11 +13,11 @@ function="Self.EnableStandUp" /> </menu_item_call> <context_menu - label="Take Off >" + label="Take Off ▶" layout="topleft" name="Take Off >"> <context_menu - label="Clothes >" + label="Clothes ▶" layout="topleft" name="Clothes >"> <menu_item_call @@ -151,7 +151,7 @@ <menu_item_call.on_enable function="Edit.EnableTakeOff" parameter="alpha" /> - </menu_item_call> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call @@ -164,11 +164,11 @@ </menu_item_call> </context_menu> <context_menu - label="HUD >" + label="HUD ▶" layout="topleft" name="Object Detach HUD" /> <context_menu - label="Detach >" + label="Detach ▶" layout="topleft" name="Object Detach" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 1993af6730..2874151df5 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -370,6 +370,14 @@ layout="topleft" name="Outfit Separator" /> <menu_item_call + label="Find Original" + layout="topleft" + name="Find Original"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="goto" /> + </menu_item_call> + <menu_item_call label="Purge Item" layout="topleft" name="Purge Item"> @@ -386,14 +394,6 @@ parameter="restore" /> </menu_item_call> <menu_item_call - label="Find Original" - layout="topleft" - name="Find Original"> - <menu_item_call.on_click - function="Inventory.DoToSelected" - parameter="goto" /> - </menu_item_call> - <menu_item_call label="Open" layout="topleft" name="Open"> diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index 56028bb2e5..5a9509e284 100644 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -65,7 +65,7 @@ </menu_item_call> <menu_item_separator layout="topleft" /> <context_menu - label="Put On >" + label="Put On ▶" name="Put On" > <menu_item_call enabled="false" @@ -77,16 +77,26 @@ function="Object.EnableWear" /> </menu_item_call> <context_menu - label="Attach >" + label="Attach ▶" name="Object Attach" /> <context_menu - label="Attach HUD >" + label="Attach HUD ▶" name="Object Attach HUD" /> </context_menu> <context_menu - label="Remove >" + label="Remove ▶" name="Remove"> <menu_item_call + enabled="false" + label="Take" + name="Pie Object Take"> + <menu_item_call.on_click + function="Tools.BuyOrTake" /> + <menu_item_call.on_enable + function="Tools.EnableBuyOrTake" + parameter="Buy,Take" /> + </menu_item_call> + <menu_item_call enabled="false" label="Report Abuse" name="Report Abuse..."> @@ -124,16 +134,6 @@ </menu_item_call> </context_menu> <menu_item_separator layout="topleft" /> - <menu_item_call - enabled="false" - label="Take" - name="Pie Object Take"> - <menu_item_call.on_click - function="Tools.BuyOrTake" /> - <menu_item_call.on_enable - function="Tools.EnableBuyOrTake" - parameter="Buy,Take" /> - </menu_item_call> <menu_item_call enabled="false" label="Take Copy" diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml index 1dc1c610cf..407ce14e81 100644 --- a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml @@ -19,6 +19,19 @@ <menu_item_call.on_click function="Profile.Share" /> </menu_item_call> + <menu_item_check + label="Block/Unblock" + layout="topleft" + name="block_unblock"> + <menu_item_check.on_click + function="Profile.BlockUnblock" /> + <menu_item_check.on_check + function="Profile.CheckItem" + parameter="is_blocked" /> + <menu_item_check.on_enable + function="Profile.EnableItem" + parameter="can_block" /> + </menu_item_check> <menu_item_call label="Kick" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 7a4f63bfe4..22f4d277a4 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1998,6 +1998,18 @@ function="Advanced.ToggleHUDInfo" parameter="fov" /> </menu_item_check> + <menu_item_check + label="Badge" + layout="topleft" + name="Badge" + shortcut="alt|control|shift|h"> + <menu_item_check.on_check + function="Advanced.CheckHUDInfo" + parameter="badge" /> + <menu_item_check.on_click + function="Advanced.ToggleHUDInfo" + parameter="badge" /> + </menu_item_check> </menu> <menu create_jump_keys="true" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 636db2b59b..72ac457882 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -391,19 +391,23 @@ Add this Ability to '[ROLE_NAME]'? notext="No" yestext="Yes"/> </notification> - <notification - icon="alertmodal.tga" - name="ClickUnimplemented" - type="alertmodal"> -Sorry, not implemented yet. + icon="alertmodal.tga" + name="JoinGroupCanAfford" + type="alertmodal"> +Joining this group costs L$[COST]. +Do you wish to proceed? + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="Join"/> </notification> <notification icon="alertmodal.tga" - name="JoinGroupCanAfford" + name="JoinGroupNoCost" type="alertmodal"> -Joining this group costs L$[COST]. +You are joining group [NAME]. Do you wish to proceed? <usetemplate name="okcancelbuttons" @@ -411,6 +415,7 @@ Do you wish to proceed? yestext="Join"/> </notification> + <notification icon="alertmodal.tga" name="JoinGroupCannotAfford" @@ -609,7 +614,7 @@ To place the media on only one face, choose Select Face and click on the desired notext="Cancel" yestext="OK"/> </notification> - + <notification icon="alertmodal.tga" name="MustBeInParcel" @@ -780,7 +785,7 @@ Save changes to classified [NAME]? notext="Don't Save" yestext="Save"/> </notification> - + <notification icon="alertmodal.tga" name="ClassifiedInsufficientFunds" @@ -831,7 +836,7 @@ Please select a proposal to view. Please select a history item to view. </notification> -<!-- +<!-- <notification icon="alertmodal.tga" name="ResetShowNextTimeDialogs" @@ -1029,10 +1034,10 @@ Unable to write file [[FILE]] icon="alertmodal.tga" name="UnsupportedHardware" type="alertmodal"> -Warning: Your system does not meet [APP_NAME]'s minimum system requirements. If you continue using [APP_NAME], you may experience poor performance. Unfortunately, the [SUPPORT_SITE] cannot provide technical support for unsupported system configurations. +Just so you know, your computer does not meet [APP_NAME]'s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can't provide technical support for unsupported system configurations. MINSPECS -Do you wish to visit [_URL] for more information? +Visit [_URL] for more information? <url option="0" name="url"> http://www.secondlife.com/corporate/sysreqs.php @@ -1048,8 +1053,8 @@ Do you wish to visit [_URL] for more information? icon="alertmodal.tga" name="UnknownGPU" type="alertmodal"> -Your system contains a graphics card that is unknown to [APP_NAME] at this time. -This is often the case with new hardware that hasn't been tested yet with [APP_NAME]. [APP_NAME] will most likely run properly, but you may need to adjust your graphics settings to something more appropriate. +Your system contains a graphics card that [APP_NAME] doesn't recognize. +This is often the case with new hardware that hasn't been tested yet with [APP_NAME]. It will probably be ok, but you may need to adjust your graphics settings. (Me > Preferences > Graphics). <form name="form"> <ignore name="ignore" @@ -1527,7 +1532,7 @@ Your search terms were too short so no search was performed. icon="alertmodal.tga" name="CouldNotTeleportReason" type="alertmodal"> -Could not teleport. +Teleport failed. [REASON] </notification> @@ -1980,9 +1985,8 @@ This is usually a temporary failure. Please customize and save the wearable agai icon="alertmodal.tga" name="YouHaveBeenLoggedOut" type="alertmodal"> -You have been logged out of [SECOND_LIFE]: +Darn. You have been logged out of [SECOND_LIFE] [MESSAGE] -You can still look at existing IM and chat by clicking 'View IM & Chat'. Otherwise, click 'Quit' to exit [APP_NAME] immediately. <usetemplate name="okcancelbuttons" notext="Quit" @@ -3847,7 +3851,7 @@ Are you sure you want to quit? <notification icon="alertmodal.tga" name="HelpReportAbuseEmailLL" - type="alertmodal"> + type="alert"> Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards]. All reported abuses are investigated and resolved. @@ -4643,7 +4647,7 @@ Please select at least one type of content to search (General, Moderate, or Adul type="notify"> [MESSAGE] </notification> - + <notification icon="notify.tga" name="EventNotification" @@ -4759,7 +4763,7 @@ The objects on the selected parcel that are NOT owned by you have been returned name="ServerObjectMessage" type="notify"> Message from [NAME]: -[MSG] +<nolink>[MSG]</nolink> </notification> <notification @@ -5173,7 +5177,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th text="Decline"/> </form> </notification> - + <notification icon="notify.tga" name="FriendshipOffered" @@ -5423,8 +5427,8 @@ Your L$ balance will be updated when processing completes. If processing takes m The status of your payment can be checked on your Transaction History page on your [http://secondlife.com/account/ Dashboard] </notification> - -<!-- + +<!-- <notification icon="notify.tga" name="FirstSit" @@ -5451,7 +5455,7 @@ You have opened the Build Tools. Every object you see around you was created usi </notification> --> -<!-- +<!-- <notification icon="notify.tga" name="FirstLeftClickNoHit" @@ -5537,7 +5541,7 @@ To toggle this menu, type="notify"> You are editing a Sculpted prim. Sculpties require a special texture to define their shape. </notification> ---> +--> <!-- <notification @@ -5826,7 +5830,7 @@ A SLurl was received from an untrusted browser and has been blocked for your sec priority="high" type="notifytip"> Multiple SLurls were received from an untrusted browser within a short period. -They will be blocked for a few seconds for your security. +They will be blocked for a few seconds for your security. </notification> <notification name="IMToast" type="notifytoast"> 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..51e2256a7d 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -19,21 +19,22 @@ name="avatar_icon" top="3" width="18" /> - <text_editor + <text 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_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 31719aad20..34c1923582 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -29,7 +29,7 @@ layout="topleft" name="back_btn" picture_style="true" - left="10" + left="11" tab_stop="false" top="2" width="23" /> @@ -40,7 +40,7 @@ layout="topleft" left_pad="10" name="title" - text_color="white" + text_color="LtGray" top="0" value="Classified Info" use_ellipses="true" @@ -49,13 +49,13 @@ color="DkGray2" opaque="true" follows="all" - height="500" + height="502" layout="topleft" - left="10" + left="9" top_pad="10" name="profile_scroll" reserve_scroll_corner="false" - width="313"> + width="310"> <panel name="scroll_content_panel" follows="left|top" @@ -65,16 +65,16 @@ background_visible="false" height="500" left="0" - width="295"> + width="285"> <texture_picker enabled="false" - follows="left|top" + follows="left|top|right" height="197" layout="topleft" - left="10" + left="11" name="classified_snapshot" - top="20" - width="290" /> + top="10" + width="286" /> <text_editor allow_scroll="false" bg_visible="false" @@ -181,37 +181,35 @@ </scroll_container> <panel follows="left|right|bottom" - height="20" + height="35" layout="topleft" - top_pad="8" - left="10" + top_pad="5" + left="9" name="buttons"> <button follows="bottom|left" - height="19" + height="23" label="Teleport" layout="topleft" left="0" name="teleport_btn" top="0" - width="90" /> + width="101" /> <button follows="bottom|left" - height="19" + height="23" label="Map" layout="topleft" - left_pad="10" + left_pad="3" name="show_on_map_btn" - top="0" - width="90" /> + width="100" /> <button follows="bottom|left" - height="19" + height="23" label="Edit" layout="topleft" - right="-1" name="edit_btn" - top="0" - width="90" /> + left_pad="3" + width="101" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml index b881719e3a..1375eb87d9 100644 --- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml @@ -64,6 +64,7 @@ layout="topleft" left="103" name="description" + textbox.show_context_menu="false" top_pad="0" width="178" word_wrap="true" /> @@ -75,6 +76,6 @@ left_pad="5" right="-8" name="info_chevron" - top_delta="15" + top_delta="24" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index 188ded3dab..a357ba1d97 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -23,7 +23,7 @@ layout="topleft" name="back_btn" picture_style="true" - left="10" + left="11" tab_stop="false" top="2" width="23" /> @@ -31,27 +31,27 @@ type="string" length="1" follows="top" - font="SansSerifHuge" - height="15" + font="SansSerifHugeBold" + height="26" layout="topleft" left_pad="10" name="title" - text_color="white" - top="5" + text_color="LtGray" + top="0" width="250"> Edit Classified </text> <scroll_container color="DkGray2" follows="all" - height="510" + height="502" layout="topleft" - left="10" + left="9" top_pad="10" name="profile_scroll" reserve_scroll_corner="false" opaque="true" - width="313"> + width="310"> <panel name="scroll_content_panel" follows="left|top" @@ -65,10 +65,10 @@ <texture_picker follows="left|top|right" height="197" - width="290" + width="286" layout="topleft" - top="20" - left="10" + top="10" + left="11" name="classified_snapshot" /> <icon height="18" @@ -78,7 +78,7 @@ name="edit_icon" label="" tool_tip="Click to select an image" - top="27" + top="17" width="18" /> <text type="string" @@ -165,29 +165,29 @@ </text> <button follows="left|top" - height="20" + height="23" label="Set to Current Location" layout="topleft" - left="8" + left="10" top_pad="5" name="set_to_curr_location_btn" - width="200" /> + width="156" /> <combo_box follows="left|top" - height="18" + height="23" label="" left="10" name="category" top_pad="5" - width="200" /> + width="156" /> <combo_box allow_text_entry="false" follows="left|top" - height="18" + height="23" left="10" name="content_type" top_pad="5" - width="200"> + width="156"> <combo_item name="mature_ci" value="Mature"> @@ -203,10 +203,11 @@ decimal_digits="0" follows="left|top" halign="left" - height="16" + height="23" increment="1" label_width="20" label="L$" + v_pad="10" layout="topleft" left="10" value="50" @@ -228,30 +229,29 @@ </scroll_container> <panel follows="left|right|bottom" - height="20" + height="23" label="bottom_panel" layout="topleft" - left="10" + left="9" name="bottom_panel" top_pad="5" width="303"> <button follows="bottom|left" - height="19" + height="23" label="Save" layout="topleft" name="save_changes_btn" left="0" top="0" - width="130" /> + width="152" /> <button follows="bottom|left" - height="19" + height="23" label="Cancel" layout="topleft" name="cancel_btn" - left_pad="5" - right="-1" - width="130" /> + left_pad="3" + width="152" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index 8e39697a16..6ef762dc1d 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -18,7 +18,7 @@ image_overlay="BackArrow_Off" layout="topleft" name="back_btn" - left="10" + left="11" tab_stop="false" top="2" width="23" /> @@ -26,26 +26,26 @@ type="string" length="1" follows="top" - font="SansSerifHuge" - height="15" + font="SansSerifHugeBold" + height="26" layout="topleft" left_pad="10" name="title" - text_color="white" - top="5" + text_color="LtGray" + top="0" width="250"> Edit Pick </text> <scroll_container color="DkGray2" follows="all" - height="500" + height="502" layout="topleft" - left="10" + left="9" top_pad="10" name="profile_scroll" opaque="true" - width="313"> + width="310"> <panel name="scroll_content_panel" follows="left|top|right" @@ -59,11 +59,11 @@ <texture_picker follows="left|top|right" height="197" - width="280" + width="272" layout="topleft" no_commit_on_selection="true" - top="20" - left="10" + top="10" + left="11" name="pick_snapshot" /> <icon height="18" @@ -73,7 +73,7 @@ name="edit_icon" label="" tool_tip="Click to select an image" - top="27" + top="17" width="18" /> <text type="string" @@ -100,7 +100,7 @@ max_length="63" name="pick_name" text_color="black" - width="280" /> + width="273" /> <text type="string" length="1" @@ -119,7 +119,7 @@ <text_editor follows="left|top|right" height="100" - width="280" + width="273" hide_scrollbar="false" layout="topleft" left="10" @@ -158,41 +158,40 @@ </text> <button follows="left|top" - height="20" + height="23" label="Set to Current Location" layout="topleft" left="8" top_pad="0" name="set_to_curr_location_btn" - width="200" /> + width="156" /> </panel> </scroll_container> <panel follows="left|right|bottom" - height="20" + height="23" label="bottom_panel" layout="topleft" - left="10" + left="9" name="bottom_panel" top_pad="5" width="303"> <button follows="bottom|left" - height="19" + height="23" label="Save [WHAT]" layout="topleft" name="save_changes_btn" left="0" top="0" - width="130" /> + width="152" /> <button follows="bottom|left" - height="19" + height="23" label="Cancel" layout="topleft" name="cancel_btn" - left_pad="5" - right="-1" - width="130" /> + left_pad="3" + width="152" /> </panel> </panel> 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_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index 396699ad6c..d1b22a34bb 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -71,7 +71,7 @@ layout="topleft" left_pad="10" name="title" - text_color="white" + text_color="LtGray" top="0" use_ellipses="true" value="Place Profile" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index c04414abbb..627e616af5 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -118,7 +118,7 @@ control_name="RememberPassword" follows="left|bottom" font="SansSerifSmall" height="16" -label="Remember" +label="Remember password" top_pad="3" name="remember_check" width="135" /> 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..d484564e0d 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -44,6 +44,7 @@ direction="down" height="23" image_overlay="Arrow_Left_Off" + image_bottom_pad="1" layout="topleft" left="10" name="back_btn" @@ -55,6 +56,7 @@ direction="down" height="23" image_overlay="Arrow_Right_Off" + image_bottom_pad="1" layout="topleft" left_pad="0" name="forward_btn" @@ -141,12 +143,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 +172,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..447ac1b123 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 @@ -140,6 +137,7 @@ background_visible="true" <avatar_list allow_select="true" follows="all" + height="235" layout="topleft" left="0" multi_select="true" @@ -155,6 +153,7 @@ background_visible="true" <avatar_list allow_select="true" follows="all" + height="235" layout="topleft" left="0" multi_select="true" @@ -163,6 +162,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 +236,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 diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 375f369ba7..097813131f 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -16,7 +16,7 @@ image_overlay="BackArrow_Off" layout="topleft" name="back_btn" - left="10" + left="11" tab_stop="false" top="2" width="23" /> @@ -27,7 +27,7 @@ layout="topleft" left_pad="10" name="title" - text_color="white" + text_color="LtGray" top="0" value="Pick Info" use_ellipses="true" @@ -36,12 +36,12 @@ color="DkGray2" opaque="true" follows="all" - height="500" + height="502" layout="topleft" - left="10" - top_pad="5" + left="9" + top_pad="10" name="profile_scroll" - width="313"> + width="310"> <panel name="scroll_content_panel" follows="left|top|right" @@ -57,10 +57,10 @@ follows="left|top|right" height="197" layout="topleft" - left="10" + left="11" name="pick_snapshot" - top="20" - width="280" /> + top="10" + width="272" /> <text_editor allow_scroll="false" bg_visible="false" @@ -115,8 +115,8 @@ follows="left|right|bottom" height="35" layout="topleft" - top_pad="8" - left="10" + top_pad="5" + left="9" name="buttons"> <button follows="bottom|left" @@ -126,24 +126,22 @@ left="0" name="teleport_btn" top="0" - width="90" /> + width="101" /> <button follows="bottom|left" height="23" label="Map" layout="topleft" - left_pad="10" + left_pad="3" name="show_on_map_btn" - top="0" - width="90" /> + width="100" /> <button follows="bottom|left" height="23" label="Edit" layout="topleft" - right="-1" name="edit_btn" - top="0" - width="90" /> + left_pad="3" + width="101" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index 023b1fc81d..8b25fb5d2a 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -64,6 +64,7 @@ layout="topleft" left="103" name="picture_descr" + textbox.show_context_menu="false" top_pad="0" width="178" word_wrap="true" /> @@ -75,6 +76,6 @@ left_pad="5" right="-8" name="info_chevron" - top_delta="15" + top_delta="24" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index d31f4d039f..887a89d518 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel +bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" follows="all" height="540" label="Picks" @@ -70,13 +73,15 @@ </accordion_tab> </accordion> <panel - background_visible="true" +bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" bevel_style="none" enabled="false" auto_resize="false" follows="bottom" - left="0" - height="18" + left="1" + height="27" label="bottom_panel" layout="topleft" name="edit_panel" @@ -90,9 +95,9 @@ image_unselected="OptionsMenu_Off" image_disabled="OptionsMenu_Disabled" layout="topleft" - left="0" + left="10" name="gear_menu_btn" - top="5" + top="9" width="18" /> <button follows="bottom|left" @@ -104,7 +109,7 @@ left_pad="15" name="new_btn" tool_tip="Create a new pick or classified at the current location" - top="5" + top="9" width="18" /> <button follows="bottom|right" @@ -115,14 +120,17 @@ layout="topleft" name="trash_btn" right="-10" - top="5" + top="9" width="18" /> </panel> <panel + bg_opaque_color="DkGray" + background_visible="true" + background_opaque="true" layout="topleft" left="0" height="30" - top_pad="10" + top_pad="7" name="buttons_cucks" width="313"> <button @@ -131,35 +139,33 @@ height="23" label="Info" layout="topleft" - left="5" + left="2" name="info_btn" tab_stop="false" tool_tip="Show pick information" - top="0" - width="55" /> + top="5" + width="95" /> <button enabled="false" follows="bottom|left" height="23" label="Teleport" layout="topleft" - left_pad="5" + left_pad="3" name="teleport_btn" tab_stop="false" tool_tip="Teleport to the corresponding area" - top="0" - width="77" /> + width="117" /> <button enabled="false" follows="bottom|left" height="23" label="Map" layout="topleft" - left_pad="5" + left_pad="3" name="show_on_map_btn" tab_stop="false" tool_tip="Show the corresponding area on the World Map" - top="0" - width="50" /> + width="90" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 7ac771de27..94c9b2de01 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -29,7 +29,7 @@ value="Place Profile" /> <string name="title_teleport_history" - value="Teleport History Location" /> + value="Teleport History" /> <string name="not_available" value="(N\A)" /> @@ -156,7 +156,7 @@ layout="topleft" left_pad="10" name="title" - text_color="white" + text_color="LtGray" top="0" use_ellipses="true" value="Place Profile" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 141678f7eb..05a3771edf 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> - <panel border="true" - follows="left|top|right|bottom" + follows="all" height="408" + label="Advanced" layout="topleft" left="102" name="advanced" @@ -13,130 +13,29 @@ name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <check_box - control_name="UseChatBubbles" - follows="left|top" - height="16" - label="Bubble chat" - layout="topleft" - left="30" - top="10" - name="bubble_text_chat" - width="150" /> - <color_swatch - can_apply_immediately="true" - color="0 0 0 1" - control_name="BackgroundChatColor" - follows="left|top" - height="47" - layout="topleft" - left_delta="280" - name="background" - tool_tip="Choose color for bubble chat" - top_delta="1" - width="44"> - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="BackgroundChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="BackgroundChatColor" /> - </color_swatch> - <slider - control_name="ChatBubbleOpacity" - follows="left|top" - height="16" - increment="0.05" - initial_value="1" - label="Opacity" - layout="topleft" - left_delta="-230" - top_pad="-28" - label_width="50" - name="bubble_chat_opacity" - width="200" /> - <text - follows="left|top" - type="string" - length="1" - height="25" - layout="topleft" - left="30" - top_pad="5" - name="AspectRatioLabel1" - tool_tip="width / height" - label_width="50" - width="120"> - Aspect ratio - </text> - <combo_box - allow_text_entry="true" - height="23" - follows="left|top" - layout="topleft" - left_pad="0" - max_chars="100" - name="aspect_ratio" - tool_tip="width / height" - top_delta="0" - width="150"> - <combo_box.item - enabled="true" - label=" 4:3 (Standard CRT)" - name="item1" - value="1.333333" /> - <combo_box.item - enabled="true" - label=" 5:4 (1280x1024 LCD)" - name="item2" - value="1.25" /> - <combo_box.item - enabled="true" - label=" 8:5 (Widescreen)" - name="item3" - value="1.6" /> - <combo_box.item - enabled="true" - label=" 16:9 (Widescreen)" - name="item4" - value="1.7777777" /> - </combo_box> - <check_box - control_name="FullScreenAutoDetectAspectRatio" - follows="left|top" - height="25" - label="Auto-detect" - layout="topleft" - left_pad="10" - name="aspect_auto_detect" - width="256"> - <check_box.commit_callback - function="Pref.AutoDetectAspect" /> - </check_box> - <text - follows="left|top" - type="string" - length="1" - height="10" - left="30" - name="heading1" - top_pad="5" - width="270"> -Camera: - </text> + <icon + follows="left|top" + height="18" + image_name="Cam_FreeCam_Off" + layout="topleft" + name="camera_icon" + mouse_opaque="false" + visible="true" + width="18" + left="30" + top="10"/> <slider can_edit_text="true" - control_name="CameraAngle" + control_name="CameraAngle" decimal_digits="2" - top_pad="5" follows="left|top" height="16" increment="0.025" initial_value="1.57" layout="topleft" label_width="100" - label="View Angle" - left_delta="50" + label="View angle" + left_pad="30" max_val="2.97" min_val="0.17" name="camera_fov" @@ -165,11 +64,11 @@ Camera: type="string" length="1" height="10" - left="30" + left="80" name="heading2" width="270" top_pad="5"> -Automatic positioning for: +Automatic position for: </text> <check_box control_name="EditCameraMovement" @@ -177,7 +76,7 @@ Automatic positioning for: follows="left|top" label="Build/Edit" layout="topleft" - left_delta="50" + left_delta="30" name="edit_camera_movement" tool_tip="Use automatic camera positioning when entering and exiting edit mode" width="280" @@ -191,27 +90,27 @@ Automatic positioning for: name="appearance_camera_movement" tool_tip="Use automatic camera positioning while in edit mode" width="242" /> - <text - follows="left|top" - type="string" - length="1" - height="10" - left="30" - name="heading3" - top_pad="5" - width="270"> -Avatars: - </text> + <icon + follows="left|top" + height="18" + image_name="Move_Walk_Off" + layout="topleft" + name="avatar_icon" + mouse_opaque="false" + visible="true" + width="18" + top_pad="2" + left="30" + /> <check_box control_name="FirstPersonAvatarVisible" follows="left|top" height="20" label="Show me in Mouselook" layout="topleft" - left_delta="50" + left_pad="30" name="first_person_avatar_visible" - width="256" - top_pad="0"/> + width="256" /> <check_box control_name="ArrowKeysAlwaysMove" follows="left|top" @@ -242,22 +141,61 @@ Avatars: name="enable_lip_sync" width="237" top_pad="0" /> + <check_box + control_name="UseChatBubbles" + follows="left|top" + height="16" + label="Bubble chat" + layout="topleft" + left="78" + top_pad="6" + name="bubble_text_chat" + width="150" /> + <slider + control_name="ChatBubbleOpacity" + follows="left|top" + height="16" + increment="0.05" + initial_value="1" + label="Opacity" + layout="topleft" + left="80" + label_width="50" + name="bubble_chat_opacity" + width="200" /> + <color_swatch + can_apply_immediately="true" + color="0 0 0 1" + control_name="BackgroundChatColor" + follows="left|top" + height="50" + layout="topleft" + left_pad="10" + name="background" + tool_tip="Choose color for bubble chat" + width="38"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="BackgroundChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="BackgroundChatColor" /> + </color_swatch> <check_box control_name="ShowScriptErrors" follows="left|top" height="20" - label="Show script errors" + label="Show script errors in:" layout="topleft" left="30" name="show_script_errors" - width="256" - top_pad="5"/> + width="256" /> <radio_group enabled_control="ShowScriptErrors" control_name="ShowScriptErrorsLocation" follows="top|left" draw_border="false" - height="40" + height="16" layout="topleft" left_delta="50" name="show_location" @@ -265,7 +203,7 @@ Avatars: width="364"> <radio_item height="16" - label="In chat" + label="Nearby chat" layout="topleft" left="3" name="0" @@ -273,7 +211,7 @@ Avatars: width="315" /> <radio_item height="16" - label="In a window" + label="Separate window" layout="topleft" left_delta="175" name="1" @@ -284,49 +222,47 @@ Avatars: follows="top|left" enabled_control="EnableVoiceChat" control_name="PushToTalkToggle" - height="20" - label="Toggle mode for microphone when I press the Speak trigger key:" + height="15" + label="Toggle speak on/off when I press:" layout="topleft" left="30" name="push_to_talk_toggle_check" width="237" - top_pad="-25" tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/> <line_editor follows="top|left" control_name="PushToTalkButton" - enabled="false" + enabled="false" enabled_control="EnableVoiceChat" - height="19" - left_delta="50" - max_length="254" + height="23" + left="80" + max_length="200" name="modifier_combo" label="Push-to-Speak trigger" - top_pad="0" - width="280" /> + top_pad="5" + width="200" /> <button follows="top|left" enabled_control="EnableVoiceChat" height="23" label="Set Key" - left_delta="0" + left_pad="5" name="set_voice_hotkey_button" - width="115" - top_pad="5"> + width="100"> <button.commit_callback function="Pref.VoiceSetKey" /> </button> <button - bottom_delta="0" enabled_control="EnableVoiceChat" - follows="left" + follows="top|left" halign="center" height="23" - label="Middle Mouse Button" - left_delta="120" + image_overlay="Refresh_Off" + tool_tip="Reset to Middle Mouse Button" mouse_opaque="true" name="set_voice_middlemouse_button" - width="160"> + left_pad="5" + width="25"> <button.commit_callback function="Pref.VoiceSetMiddleMouse" /> </button> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index ace8281b4e..188fd3b7bc 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="true" - height="500" + height="408" label="Popups" layout="topleft" left="0" @@ -14,7 +14,7 @@ follows="top|left" height="12" layout="topleft" - left="30" + left="10" name="tell_me_label" top="10" width="300"> @@ -32,7 +32,7 @@ <check_box control_name="ChatOnlineNotification" height="16" - label="When my friends log out or in" + label="When my friends log in or out" layout="topleft" left_delta="0" name="friends_online_notify_checkbox" @@ -42,38 +42,33 @@ type="string" length="1" follows="top|left" - font="SansSerifBold" height="12" layout="topleft" - left="30" + left="10" name="show_label" - top_pad="14" + top_pad="8" width="450"> - Always show these notifications: + Always show: </text> <scroll_list follows="top|left" - height="92" + height="140" layout="topleft" left="10" - multi_select="true" + multi_select="true" name="enabled_popups" width="475" /> <button enabled_control="FirstSelectedDisabledPopups" follows="top|left" height="23" - image_disabled="PushButton_Disabled" - image_disabled_selected="PushButton_Disabled" image_overlay="Arrow_Up" - image_selected="PushButton_Selected" - image_unselected="PushButton_Off" hover_glow_amount="0.15" layout="topleft" - left_delta="137" + left="180" name="enable_this_popup" - top_pad="10" - width="43"> + top_pad="5" + width="40"> <button.commit_callback function="Pref.ClickEnablePopup" /> </button> @@ -81,17 +76,13 @@ enabled_control="FirstSelectedEnabledPopups" follows="top|left" height="23" - image_disabled="PushButton_Disabled" - image_disabled_selected="PushButton_Disabled" image_overlay="Arrow_Down" - image_selected="PushButton_Selected" - image_unselected="PushButton_Off" hover_glow_amount="0.15" layout="topleft" - left_pad="50" + left_pad="40" name="disable_this_popup" top_delta="0" - width="43"> + width="40"> <button.commit_callback function="Pref.ClickDisablePopup" /> </button> @@ -99,21 +90,20 @@ type="string" length="1" follows="top|left" - font="SansSerifBold" height="12" layout="topleft" - left="30" + left="10" name="dont_show_label" - top_pad="10" + top_pad="-10" width="450"> - Never show these notifications: + Never show: </text> <scroll_list follows="top|left" - height="92" + height="140" layout="topleft" left="10" - multi_select="true" + multi_select="true" name="disabled_popups" width="475" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index b496f95422..099c789e4b 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -89,11 +89,12 @@ <text font="SansSerifSmall" type="string" + text_color="White_50" length="1" follows="left|top" height="18" layout="topleft" - left_pad="5" + left_pad="10" name="language_textbox2" width="200"> (Requires restart) @@ -179,7 +180,7 @@ left_pad="5" name="show_location_checkbox" top_delta="5" - width="256" /> + width="256" /> <text type="string" length="1" @@ -203,21 +204,21 @@ layout="topleft" name="radio" value="0" - width="100" /> + width="75" /> <radio_item label="On" layout="topleft" left_pad="12" name="radio2" value="1" - width="100" /> + width="75" /> <radio_item label="Show briefly" layout="topleft" left_pad="12" name="radio3" - value="2" - width="100" /> + value="2" + width="160" /> </radio_group> <check_box enabled_control="AvatarNameTagMode" @@ -326,7 +327,7 @@ left="30" mouse_opaque="false" name="text_box3" - top_pad="15" + top_pad="10" width="240"> Busy mode response: </text> @@ -335,18 +336,16 @@ text_readonly_color="LabelDisabledColor" bg_writeable_color="LtGray" use_ellipses="false" - bg_visible="true" - border_visible="true" hover="false" commit_on_focus_lost = "true" follows="left|top" - height="50" + height="60" layout="topleft" left="50" name="busy_response" - width="400" + width="440" word_wrap="true"> log_in_to_change </text_editor> - + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 39a8e53c7f..8bff865eb1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -33,16 +33,15 @@ <button control_name="MuteAudio" follows="top|right" - height="18" + height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" + left_pad="10" name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <check_box control_name="MuteWhenMinimized" height="15" @@ -74,20 +73,19 @@ function="Pref.setControlFalse" parameter="MuteAmbient" /> </slider> - <button - control_name="MuteAmbient" + <button + control_name="MuteAmbient" disabled_control="MuteAudio" follows="top|right" - height="18" + height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_wind" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelUI" disabled_control="MuteAudio" @@ -113,16 +111,15 @@ control_name="MuteUI" disabled_control="MuteAudio" follows="top|right" - height="18" + height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_ui" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelMedia" disabled_control="MuteAudio" @@ -144,20 +141,19 @@ function="Pref.setControlFalse" parameter="MuteMedia" /> </slider> - <button + <button control_name="MuteMedia" disabled_control="MuteAudio" follows="top|right" - height="18" + height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_media" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelSFX" disabled_control="MuteAudio" @@ -179,20 +175,19 @@ function="Pref.setControlFalse" parameter="MuteSounds" /> </slider> - <button + <button control_name="MuteSounds" disabled_control="MuteAudio" follows="top|right" - height="18" + height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_sfx" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <slider control_name="AudioLevelMusic" disabled_control="MuteAudio" @@ -214,20 +209,19 @@ function="Pref.setControlFalse" parameter="MuteMusic" /> </slider> - <button + <button control_name="MuteMusic" disabled_control="MuteAudio" follows="top|right" - height="18" + height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_music" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <check_box label_text.halign="left" follows="left|top" @@ -236,10 +230,9 @@ disabled_control="CmdLineDisableVoice" label="Enable voice" layout="topleft" - font.style="BOLD" - left="101" + left="28" name="enable_voice_check" - top_pad="13" + top_pad="5" width="110" > </check_box> @@ -265,21 +258,19 @@ function="Pref.setControlFalse" parameter="MuteVoice" /> </slider> - <button + <button control_name="MuteVoice" - enabled_control="EnableVoiceChat" disabled_control="MuteAudio" follows="top|right" - height="18" + height="16" image_selected="AudioMute_Off" image_unselected="Audio_Off" is_toggle="true" layout="topleft" - left_pad="16" - name="mute_voice" + left_pad="10" + name="mute_audio" tab_stop="false" - top_delta="-2" - width="22" /> + width="16" /> <text type="string" length="1" @@ -366,7 +357,7 @@ name="device_settings_panel" class="panel_voice_device_settings" width="501" - top="280"> + top="285"> <panel.string name="default_text"> Default diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index f5396951ca..607de65c5c 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -35,7 +35,7 @@ layout="topleft" left_pad="10" name="user_name" - text_color="white" + text_color="LtGray" top="0" value="(Loading...)" use_ellipses="true" diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 26568c2a28..c06e67a4bb 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -134,6 +134,7 @@ top="200" width="80" /> <spinner + decimal_digits="0" follows="left|top" height="20" increment="1" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index fab1f11273..bde45a9487 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -46,10 +46,10 @@ width="333"> top="0" width="30" /> <text - font="SansSerifHuge" + font="SansSerifHugeBold" height="20" left_pad="5" - text_color="white" + text_color="LtGray" top="3" use_ellipses="true" width="305" diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index e18f59ab64..18b59741bf 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -50,7 +50,7 @@ width="23" /> <text follows="top|left|right" - font="SansSerifHuge" + font="SansSerifHugeBold" height="26" layout="topleft" left_pad="10" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b4a12cfb32..a5dc14c69d 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -115,9 +115,6 @@ <!-- Avatar name: More than one avatar is selected/used here --> <string name="AvatarNameMultiple">(multiple)</string> - <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. --> - <string name="AvatarNameHippos">(hippos)</string> - <!-- Group name: text shown for LLUUID::null --> <string name="GroupNameNone">(none)</string> @@ -254,6 +251,7 @@ <string name="connected">Connected</string> <string name="unavailable">Voice not available at your current location</string> <string name="hang_up">Disconnected from in-world Voice Chat</string> + <string name="reconnect_nearby">You will now be reconnected to Nearby Voice Chat</string> <string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].</string> <string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].</string> <string name="ScriptTakeMoney">Take Linden dollars (L$) from you</string> diff --git a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml index 888b4eaf7c..a71b293f31 100644 --- a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml +++ b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml @@ -5,4 +5,12 @@ item_pad="0" keep_one_selected="true" multi_select="false" - opaque="true" />
\ No newline at end of file + opaque="true"> + <flat_list_view.no_items_text + follows="all" + name="no_items_msg" + v_pad="10" + h_pad="10" + value="There are no any items in the list" + wrap="true" /> +</flat_list_view>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml index 8ec206023e..23f32253b6 100644 --- a/indra/newview/skins/default/xui/en/widgets/inspector.xml +++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml @@ -1,10 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- See also settings.xml UIFloater* settings for configuration --> <inspector name="inspector" - bg_opaque_color="DkGray_66" - background_visible="true" - bg_opaque_image="none" - background_opaque="true" - bg_alpha_image="none" - text_color="InspectorTipTextColor" - /> + bg_opaque_color="DkGray_66" + background_visible="true" + bg_opaque_image="none" + background_opaque="true" + bg_alpha_image="none" + mouse_opaque="true" + text_color="InspectorTipTextColor"/> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 2163660206..1d61447e31 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -4,6 +4,8 @@ Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images. --> <location_input font="SansSerifSmall" + icon_maturity_general="Parcel_PG_Light" + icon_maturity_adult="Parcel_R_Light" add_landmark_image_enabled="Favorite_Star_Active" add_landmark_image_disabled="Favorite_Star_Off" add_landmark_image_hover="Favorite_Star_Over" @@ -41,6 +43,13 @@ scale_image="false" top="19" left="-3" /> + <maturity_icon + name="maturity_icon" + width="18" + height="16" + top="20" + follows="left|top" + /> <for_sale_button name="for_sale_btn" image_unselected="Parcel_ForSale_Light" @@ -99,7 +108,7 @@ top="19" left="2" follows="right|top" - image_name="Parcel_Damage_Dark" + image_name="Parcel_Health_Dark" /> <!-- Default text color is invisible on top of nav bar background --> <damage_text diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 597c4e83b6..4a163fc1e3 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -5,6 +5,7 @@ label_pad_left - padding to the left of tab button labels --> <tab_container tab_min_width="60" tab_max_width="150" + use_custom_icon_ctrl="false" halign="center" font="SansSerifSmall" tab_height="21" diff --git a/indra/newview/skins/default/xui/en/widgets/text_editor.xml b/indra/newview/skins/default/xui/en/widgets/text_editor.xml index 23ca8ea338..2ced8b1b4b 100644 --- a/indra/newview/skins/default/xui/en/widgets/text_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/text_editor.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Core parameters are in simple_text_editor.xml --> <text_editor - allow_html="false"/> + allow_html="false" + show_context_menu="true"/> diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml index a19201f7c3..9ca15ae50d 100644 --- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml +++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml @@ -1,12 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- See also settings.xml UIFloater* settings for configuration --> <tool_tip name="tooltip" max_width="200" padding="4" wrap="true" font="SansSerif" + mouse_opaque="false" bg_opaque_image="Tooltip" background_opaque="true" background_visible="true" - text_color="ToolTipTextColor" - /> + text_color="ToolTipTextColor"/> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml index ffdcf838d3..357b3682ba 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml @@ -46,7 +46,7 @@ L$ [AMT] </text> <text name="currency_links"> - [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP payment method] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP exchange rate] + [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP 支払方法] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP 通貨] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP 換算レート] </text> <text name="exchange_rate_note"> 金額を再入力して最新換算レートを確認します。 diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp index c541997e89..2b1496e912 100644 --- a/indra/test/llhttpclient_tut.cpp +++ b/indra/test/llhttpclient_tut.cpp @@ -269,6 +269,7 @@ namespace tut template<> template<> void HTTPClientTestObject::test<2>() { + skip("error test depends on dev's local ISP not supplying \"helpful\" search page"); LLHTTPClient::get("http://www.invalid", newResult()); runThePump(); ensureStatusError(); diff --git a/install.xml b/install.xml index 797bde5756..a35bd4b790 100644 --- a/install.xml +++ b/install.xml @@ -193,30 +193,30 @@ <key>darwin</key> <map> <key>md5sum</key> - <string>609c469ee1857723260b5a9943b9c2c1</string> + <string>84821102cb819257a66c8f38732647fc</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20091202.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100119.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>7085044567999489d82b9ed28f16e480</string> + <string>ee8e1b4bbcf137a84d6a85a1c51386ff</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20091202.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100119.tar.bz2</uri> </map> <key>linux64</key> <map> <key>md5sum</key> - <string>b4aeefcba3d749f1e9f2a12c6f70192b</string> + <string>af4badd6b2c10bc4db82ff1256695892</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20091202.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20100119.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>6746ae9fd9aff98b15f7b9f0f40334ab</string> + <string>acbf7a4165a917a4e087879d1756b355</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20091204.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100119.tar.bz2</uri> </map> </map> </map> @@ -1367,23 +1367,23 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>51f3fa1ab39563505df83b48ba432a3c</string> + <string>316f86790b7afb5c9bd4f95bc193b80f</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-darwin-20100115.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-darwin-20100205.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>ab9573d6aa2acdd79a553c144c9ecb09</string> + <string>13f6886fa3e6675838e47adcabb0f0ac</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-linux-20100115.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-linux-20100205.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>88ab785eebdc4f53a7dfc4e0b95f67ec</string> + <string>2a81e3c42799c33742746925f16b54ca</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-windows-20100115.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7930-windows-20100205.tar.bz2</uri> </map> </map> </map> |