diff options
531 files changed, 9896 insertions, 4464 deletions
@@ -66,3 +66,4 @@ glob:indra/newview/search_history.txt glob:indra/newview/filters.xml glob:indra/newview/avatar_icons_cache.txt glob:indra/newview/avatar_lad.log +glob:*.diff @@ -213,5 +213,7 @@ e440cd1dfbd128d7d5467019e497f7f803640ad6 3.2.0-beta1 9bcc2b7176634254e501e3fb4c5b56c1f637852e 3.2.0-beta2 2a13d30ee50ccfed50268238e36bb90d738ccc9e DRTVWR-98_3.2.0-beta3 2a13d30ee50ccfed50268238e36bb90d738ccc9e 3.2.0-beta3 +c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start +40b46edba007d15d0059c80864b708b99c1da368 3.2.2-start 3150219d229d628f0c15e58e8a51511cbd97e58d DRTVWR-94_3.2.0-release 3150219d229d628f0c15e58e8a51511cbd97e58d 3.2.0-release diff --git a/BuildParams b/BuildParams index 1c76b6f935..5068edb21f 100644..100755 --- a/BuildParams +++ b/BuildParams @@ -190,4 +190,10 @@ simon_viewer-dev-private.public_build = false simon_viewer-dev-private.email_status_this_is_os = false +# ======================================== +# Vir +# ======================================== +vir-project-1.viewer_channel = "Second Life Release" +vir-project-1.login_channel = "Second Life Release" + # eof diff --git a/autobuild.xml b/autobuild.xml index 9a68a70470..49031b9f17 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1206,9 +1206,9 @@ <key>archive</key> <map> <key>hash</key> - <string>1b92a69f5eba7cd8b017180659076db5</string> + <string>7108c2443dbcf4c032305814ce65ebb7</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/roxie_3p-llqtwebkit/rev/242182/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20111003.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/244065/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20111028.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1230,9 +1230,9 @@ <key>archive</key> <map> <key>hash</key> - <string>1e7f24b69b0fc751c7e86efe7c621882</string> + <string>24048a31d7b852774dc3117acbd4a86a</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/roxie_3p-llqtwebkit/rev/242182/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20111003.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/244065/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20111028.tar.bz2</string> </map> <key>name</key> <string>windows</string> diff --git a/doc/contributions.txt b/doc/contributions.txt index 988410701b..2b39e15e2a 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -480,6 +480,7 @@ Ima Mechanique OPEN-50 OPEN-61 OPEN-76 + STORM-959 STORM-1175 Imnotgoing Sideways Inma Rau @@ -581,6 +582,10 @@ Jonathan Yap STORM-1639 STORM-910 STORM-1642 + STORM-1105 + STORM-1222 + STORM-1659 + STORM-1674 Kadah Coba STORM-1060 Jondan Lundquist @@ -654,6 +659,8 @@ Lilly Zenovka Lizzy Macarthur Luban Yiyuan Luc Starsider +Luminous Luminos + STORM-959 Lunita Savira Maccus McCullough maciek marksman diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp index 7316717193..62465f9937 100644..100755 --- a/indra/linux_crash_logger/llcrashloggerlinux.cpp +++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp @@ -133,6 +133,12 @@ bool LLCrashLoggerLinux::mainLoop() return true; } +bool LLCrashLoggerLinux::cleanup() +{ + commonCleanup(); + return true; +} + void LLCrashLoggerLinux::updateApplication(const std::string& message) { LLCrashLogger::updateApplication(message); diff --git a/indra/linux_crash_logger/llcrashloggerlinux.h b/indra/linux_crash_logger/llcrashloggerlinux.h index 65d5e4e653..dae6c46651 100644..100755 --- a/indra/linux_crash_logger/llcrashloggerlinux.h +++ b/indra/linux_crash_logger/llcrashloggerlinux.h @@ -39,6 +39,7 @@ public: virtual bool mainLoop(); virtual void updateApplication(const std::string& = LLStringUtil::null); virtual void gatherPlatformSpecificFiles(); + virtual bool cleanup(); }; #endif diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 4db1b8bd10..bb7998c0a8 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -1821,6 +1821,7 @@ void LLPrivateMemoryPool::LLChunkHashElement::remove(LLPrivateMemoryPool::LLMemo //class LLPrivateMemoryPoolManager //-------------------------------------------------------------------- LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ; +BOOL LLPrivateMemoryPoolManager::sPrivatePoolEnabled = FALSE ; std::vector<LLPrivateMemoryPool*> LLPrivateMemoryPoolManager::sDanglingPoolList ; LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size) @@ -1832,7 +1833,7 @@ LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_poo mPoolList[i] = NULL ; } - mPrivatePoolEnabled = enabled ; + sPrivatePoolEnabled = enabled ; const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB mMaxPrivatePoolSize = llmax(max_pool_size, MAX_POOL_SIZE) ; @@ -1917,7 +1918,7 @@ void LLPrivateMemoryPoolManager::destroyClass() LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type) { - if(!mPrivatePoolEnabled) + if(!sPrivatePoolEnabled) { return NULL ; } @@ -2015,7 +2016,11 @@ void LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr } else { - if(!sInstance) //the private memory manager is destroyed, try the dangling list + if(!sPrivatePoolEnabled) + { + free(addr) ; //private pool is disabled. + } + else if(!sInstance) //the private memory manager is destroyed, try the dangling list { for(S32 i = 0 ; i < sDanglingPoolList.size(); i++) { @@ -2036,12 +2041,13 @@ void LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr addr = NULL ; break ; } - } + } + llassert_always(!addr) ; //addr should be release before hitting here! + } + else + { + llerrs << "private pool is used before initialized.!" << llendl ; } - - llassert_always(!addr) ; //addr should be release before hitting here! - - free(addr) ; } } diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 74cf42c894..bbbdaa6497 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -394,12 +394,12 @@ public: LLPrivateMemoryPool* newPool(S32 type) ; void deletePool(LLPrivateMemoryPool* pool) ; -private: - static LLPrivateMemoryPoolManager* sInstance ; - std::vector<LLPrivateMemoryPool*> mPoolList ; - BOOL mPrivatePoolEnabled; +private: + std::vector<LLPrivateMemoryPool*> mPoolList ; U32 mMaxPrivatePoolSize; + static LLPrivateMemoryPoolManager* sInstance ; + static BOOL sPrivatePoolEnabled; static std::vector<LLPrivateMemoryPool*> sDanglingPoolList ; public: //debug and statistics info. diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 1dc22519d7..fc1c1449da 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -29,7 +29,7 @@ const S32 LL_VERSION_MAJOR = 3; const S32 LL_VERSION_MINOR = 2; -const S32 LL_VERSION_PATCH = 0; +const S32 LL_VERSION_PATCH = 2; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index 331a1692ee..3461aa3e6c 100644..100755 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -42,6 +42,7 @@ #include "llpumpio.h" #include "llhttpclient.h" #include "llsdserialize.h" +#include "llproxy.h" LLPumpIO* gServicePump; BOOL gBreak = false; @@ -428,3 +429,9 @@ bool LLCrashLogger::init() return true; } + +// For cleanup code common to all platforms. +void LLCrashLogger::commonCleanup() +{ + LLProxy::cleanupClass(); +} diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h index 5d0cb5931c..1510d7e0b3 100644..100755 --- a/indra/llcrashlogger/llcrashlogger.h +++ b/indra/llcrashlogger/llcrashlogger.h @@ -48,7 +48,8 @@ public: virtual void updateApplication(const std::string& message = LLStringUtil::null); virtual bool init(); virtual bool mainLoop() = 0; - virtual bool cleanup() { return true; } + virtual bool cleanup() = 0; + void commonCleanup(); void setUserText(const std::string& text) { mCrashInfo["UserNotes"] = text; } S32 getCrashBehavior() { return mCrashBehavior; } bool runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout); diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index e5ca47da69..3c1ae45d68 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -681,7 +681,7 @@ public: if (lt != 0x7) { - OCT_ERRS << "!!! ELEMENT EXCEEDS RANGE OF SPATIAL PARTITION !!!" << llendl; + //OCT_ERRS << "!!! ELEMENT EXCEEDS RANGE OF SPATIAL PARTITION !!!" << llendl; return false; } diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index 87de202717..87de202717 100644..100755 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index c53857fcee..dbd96673a1 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -1239,6 +1239,14 @@ void LLPluginClassMedia::focus(bool focused) sendMessage(message); } +void LLPluginClassMedia::set_page_zoom_factor( double factor ) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_page_zoom_factor"); + + message.setValueReal("factor", factor); + sendMessage(message); +} + void LLPluginClassMedia::clear_cache() { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "clear_cache"); diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 1f548f8cc0..d95fa40091 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -202,6 +202,7 @@ public: bool pluginSupportsMediaBrowser(void); void focus(bool focused); + void set_page_zoom_factor( double factor ); void clear_cache(); void clear_cookies(); void set_cookies(const std::string &cookies); diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index aea58be12a..3396213f1c 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -82,7 +82,7 @@ BOOL LLDockableFloater::postBuild() mForceDocking = true; } - mDockTongue = LLUI::getUIImage("windows/Flyout_Pointer.png"); + mDockTongue = LLUI::getUIImage("Flyout_Pointer"); LLFloater::setDocked(true); return LLView::postBuild(); } @@ -239,8 +239,21 @@ void LLDockableFloater::setDockControl(LLDockControl* dockControl) setDocked(isDocked()); } -const LLUIImagePtr& LLDockableFloater::getDockTongue() +const LLUIImagePtr& LLDockableFloater::getDockTongue(LLDockControl::DocAt dock_side) { + switch(dock_side) + { + case LLDockControl::LEFT: + mDockTongue = LLUI::getUIImage("Flyout_Left"); + break; + case LLDockControl::RIGHT: + mDockTongue = LLUI::getUIImage("Flyout_Right"); + break; + default: + mDockTongue = LLUI::getUIImage("Flyout_Pointer"); + break; + } + return mDockTongue; } diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h index 8deb6c1159..89c9852f4a 100644 --- a/indra/llui/lldockablefloater.h +++ b/indra/llui/lldockablefloater.h @@ -113,6 +113,8 @@ public: bool getUniqueDocking() { return mUniqueDocking; } bool getUseTongue() { return mUseTongue; } + + void setUseTongue(bool use_tongue) { mUseTongue = use_tongue;} private: /** * Provides unique of dockable floater. @@ -122,7 +124,7 @@ private: protected: void setDockControl(LLDockControl* dockControl); - const LLUIImagePtr& getDockTongue(); + const LLUIImagePtr& getDockTongue(LLDockControl::DocAt dock_side = LLDockControl::TOP); // Checks if docking should be forced. // It may be useful e.g. if floater created in mouselook mode (see EXT-5609) diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index 6397bbd0de..af39e41fa6 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -100,12 +100,16 @@ void LLDockControl::repositionDockable() if (!mDockWidget) return; LLRect dockRect = mDockWidget->calcScreenRect(); LLRect rootRect; + LLRect floater_rect = mDockableFloater->calcScreenRect(); mGetAllowedRectCallback(rootRect); - // recalculate dockable position if dock position changed, dock visibility changed, - // root view rect changed or recalculation is forced - if (mPrevDockRect != dockRect || mDockWidgetVisible != isDockVisible() - || mRootRect != rootRect || mRecalculateDocablePosition) + // recalculate dockable position if: + if (mPrevDockRect != dockRect //dock position changed + || mDockWidgetVisible != isDockVisible() //dock visibility changed + || mRootRect != rootRect //root view rect changed + || mFloaterRect != floater_rect //floater rect changed + || mRecalculateDockablePosition //recalculation is forced + ) { // undock dockable and off() if dock not visible if (!isDockVisible()) @@ -136,7 +140,8 @@ void LLDockControl::repositionDockable() mPrevDockRect = dockRect; mRootRect = rootRect; - mRecalculateDocablePosition = false; + mFloaterRect = floater_rect; + mRecalculateDockablePosition = false; mDockWidgetVisible = isDockVisible(); } } @@ -203,21 +208,33 @@ void LLDockControl::moveDockable() switch (mDockAt) { case LEFT: - x = dockRect.mLeft; - y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight(); - // check is dockable inside root view rect - if (x < rootRect.mLeft) + + x = dockRect.mLeft - dockableRect.getWidth(); + y = dockRect.getCenterY() + dockableRect.getHeight() / 2; + + if (use_tongue) { - x = rootRect.mLeft; + x -= mDockTongue->getWidth(); } - if (x + dockableRect.getWidth() > rootRect.mRight) + + mDockTongueX = dockableRect.mRight; + mDockTongueY = dockableRect.getCenterY() - mDockTongue->getHeight() / 2; + + break; + + case RIGHT: + + x = dockRect.mRight; + y = dockRect.getCenterY() + dockableRect.getHeight() / 2; + + if (use_tongue) { - x = rootRect.mRight - dockableRect.getWidth(); + x += mDockTongue->getWidth(); } - - mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2; - - mDockTongueY = dockRect.mTop; + + mDockTongueX = dockRect.mRight; + mDockTongueY = dockableRect.getCenterY() - mDockTongue->getHeight() / 2; + break; case TOP: @@ -315,13 +332,12 @@ void LLDockControl::moveDockable() dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), dockableRect.getHeight()); } + LLRect localDocableParentRect; - mDockableFloater->getParent()->screenRectToLocal(dockableRect, - &localDocableParentRect); - mDockableFloater->setRect(localDocableParentRect); - mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY, - &mDockTongueX, &mDockTongueY); + mDockableFloater->getParent()->screenRectToLocal(dockableRect, &localDocableParentRect); + mDockableFloater->setRect(localDocableParentRect); + mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY, &mDockTongueX, &mDockTongueY); } @@ -330,7 +346,7 @@ void LLDockControl::on() if (isDockVisible()) { mEnabled = true; - mRecalculateDocablePosition = true; + mRecalculateDockablePosition = true; } } @@ -341,7 +357,7 @@ void LLDockControl::off() void LLDockControl::forceRecalculatePosition() { - mRecalculateDocablePosition = true; + mRecalculateDockablePosition = true; } void LLDockControl::drawToungue() diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h index 2e7359245f..c9602011f6 100644 --- a/indra/llui/lldockcontrol.h +++ b/indra/llui/lldockcontrol.h @@ -43,6 +43,7 @@ public: { TOP, LEFT, + RIGHT, BOTTOM }; @@ -79,12 +80,13 @@ private: private: get_allowed_rect_callback_t mGetAllowedRectCallback; bool mEnabled; - bool mRecalculateDocablePosition; + bool mRecalculateDockablePosition; bool mDockWidgetVisible; DocAt mDockAt; LLView* mDockWidget; LLRect mPrevDockRect; LLRect mRootRect; + LLRect mFloaterRect; LLFloater* mDockableFloater; LLUIImagePtr mDockTongue; S32 mDockTongueX; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 7100ea13a7..432397d3e9 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -935,7 +935,7 @@ void LLFloater::applyPositioning(LLFloater* other) case LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP: case LLFloaterEnums::OPEN_POSITIONING_CASCADING: - if (other != NULL) + if (other != NULL && other != this) { stackWith(*other); } @@ -1070,7 +1070,7 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user) const LLRect old_rect = getRect(); LLView::handleReshape(new_rect, by_user); - if (by_user) + if (by_user && !isMinimized()) { storeRectControl(); mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE; diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp index ceec9c7eb1..c1cd04186b 100644 --- a/indra/llui/llkeywords.cpp +++ b/indra/llui/llkeywords.cpp @@ -57,6 +57,22 @@ LLKeywords::LLKeywords() : mLoaded(FALSE) { } +inline BOOL LLKeywordToken::isTail(const llwchar* s) const +{ + BOOL res = TRUE; + const llwchar* t = mDelimiter.c_str(); + S32 len = mDelimiter.size(); + for (S32 i=0; i<len; i++) + { + if (s[i] != t[i]) + { + res = FALSE; + break; + } + } + return res; +} + LLKeywords::~LLKeywords() { std::for_each(mWordTokenMap.begin(), mWordTokenMap.end(), DeletePairedPointer()); @@ -106,6 +122,7 @@ BOOL LLKeywords::loadFromFile( const std::string& filename ) std::string SOL_LINE("[line "); std::string SOL_ONE_SIDED_DELIMITER("[one_sided_delimiter "); std::string SOL_TWO_SIDED_DELIMITER("[two_sided_delimiter "); + std::string SOL_DOUBLE_QUOTATION_MARKS("[double_quotation_marks "); LLColor3 cur_color( 1, 0, 0 ); LLKeywordToken::TOKEN_TYPE cur_type = LLKeywordToken::WORD; @@ -137,6 +154,12 @@ BOOL LLKeywords::loadFromFile( const std::string& filename ) cur_type = LLKeywordToken::TWO_SIDED_DELIMITER; continue; } + else if( line.find(SOL_DOUBLE_QUOTATION_MARKS) == 0 ) + { + cur_color = readColor( line.substr(SOL_DOUBLE_QUOTATION_MARKS.size()) ); + cur_type = LLKeywordToken::DOUBLE_QUOTATION_MARKS; + continue; + } else if( line.find(SOL_ONE_SIDED_DELIMITER) == 0 ) { cur_color = readColor( line.substr(SOL_ONE_SIDED_DELIMITER.size()) ); @@ -154,10 +177,26 @@ BOOL LLKeywords::loadFromFile( const std::string& filename ) if( !token_buffer.empty() && token_word_iter != word_tokens.end() ) { - // first word is keyword + // first word is the keyword or a left delimiter std::string keyword = (*token_word_iter); LLStringUtil::trim(keyword); + // second word may be a right delimiter + std::string delimiter; + if (cur_type == LLKeywordToken::TWO_SIDED_DELIMITER) + { + while (delimiter.length() == 0 && ++token_word_iter != word_tokens.end()) + { + delimiter = *token_word_iter; + LLStringUtil::trim(delimiter); + } + } + else if (cur_type == LLKeywordToken::DOUBLE_QUOTATION_MARKS) + { + // Closing delimiter is identical to the opening one. + delimiter = keyword; + } + // following words are tooltip std::string tool_tip; while (++token_word_iter != word_tokens.end()) @@ -170,11 +209,11 @@ BOOL LLKeywords::loadFromFile( const std::string& filename ) { // Replace : with \n for multi-line tool tips. LLStringUtil::replaceChar( tool_tip, ':', '\n' ); - addToken(cur_type, keyword, cur_color, tool_tip ); + addToken(cur_type, keyword, cur_color, tool_tip, delimiter ); } else { - addToken(cur_type, keyword, cur_color, LLStringUtil::null ); + addToken(cur_type, keyword, cur_color, LLStringUtil::null, delimiter ); } } } @@ -189,23 +228,26 @@ BOOL LLKeywords::loadFromFile( const std::string& filename ) void LLKeywords::addToken(LLKeywordToken::TOKEN_TYPE type, const std::string& key_in, const LLColor3& color, - const std::string& tool_tip_in ) + const std::string& tool_tip_in, + const std::string& delimiter_in) { LLWString key = utf8str_to_wstring(key_in); LLWString tool_tip = utf8str_to_wstring(tool_tip_in); + LLWString delimiter = utf8str_to_wstring(delimiter_in); switch(type) { case LLKeywordToken::WORD: - mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip); + mWordTokenMap[key] = new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null); break; case LLKeywordToken::LINE: - mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip)); + mLineTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, LLWStringUtil::null)); break; case LLKeywordToken::TWO_SIDED_DELIMITER: + case LLKeywordToken::DOUBLE_QUOTATION_MARKS: case LLKeywordToken::ONE_SIDED_DELIMITER: - mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip)); + mDelimiterTokenList.push_front(new LLKeywordToken(type, color, key, tool_tip, delimiter)); break; default: @@ -357,7 +399,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW } // cur is now at the first non-whitespace character of a new line - + // Line start tokens { BOOL line_done = FALSE; @@ -418,14 +460,15 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW S32 seg_end = 0; seg_start = cur - base; - cur += cur_delimiter->getLength(); + cur += cur_delimiter->getLengthHead(); - if( cur_delimiter->getType() == LLKeywordToken::TWO_SIDED_DELIMITER ) + LLKeywordToken::TOKEN_TYPE type = cur_delimiter->getType(); + if( type == LLKeywordToken::TWO_SIDED_DELIMITER || type == LLKeywordToken::DOUBLE_QUOTATION_MARKS ) { - while( *cur && !cur_delimiter->isHead(cur)) + while( *cur && !cur_delimiter->isTail(cur)) { // Check for an escape sequence. - if (*cur == '\\') + if (type == LLKeywordToken::DOUBLE_QUOTATION_MARKS && *cur == '\\') { // Count the number of backslashes. S32 num_backslashes = 0; @@ -435,10 +478,10 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW between_delimiters++; cur++; } - // Is the next character the end delimiter? - if (cur_delimiter->isHead(cur)) + // If the next character is the end delimiter? + if (cur_delimiter->isTail(cur)) { - // Is there was an odd number of backslashes, then this delimiter + // If there was an odd number of backslashes, then this delimiter // does not end the sequence. if (num_backslashes % 2 == 1) { @@ -461,13 +504,13 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW if( *cur ) { - cur += cur_delimiter->getLength(); - seg_end = seg_start + between_delimiters + 2 * cur_delimiter->getLength(); + cur += cur_delimiter->getLengthHead(); + seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead() + cur_delimiter->getLengthTail(); } else { // eof - seg_end = seg_start + between_delimiters + cur_delimiter->getLength(); + seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead(); } } else @@ -479,7 +522,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW between_delimiters++; cur++; } - seg_end = seg_start + between_delimiters + cur_delimiter->getLength(); + seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead(); } insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, defaultColor, editor); diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h index f6d75b7e75..ac34015393 100644 --- a/indra/llui/llkeywords.h +++ b/indra/llui/llkeywords.h @@ -41,23 +41,44 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr; class LLKeywordToken { public: - enum TOKEN_TYPE { WORD, LINE, TWO_SIDED_DELIMITER, ONE_SIDED_DELIMITER }; + /** + * @brief Types of tokens/delimters being parsed. + * + * @desc Tokens/delimiters that need to be identified/highlighted. All are terminated if an EOF is encountered. + * - WORD are keywords in the normal sense, i.e. constants, events, etc. + * - LINE are for entire lines (currently only flow control labels use this). + * - ONE_SIDED_DELIMITER are for open-ended delimiters which are terminated by EOL. + * - TWO_SIDED_DELIMITER are for delimiters that end with a different delimiter than they open with. + * - DOUBLE_QUOTATION_MARKS are for delimiting areas using the same delimiter to open and close. + */ + enum TOKEN_TYPE + { + WORD, + LINE, + TWO_SIDED_DELIMITER, + ONE_SIDED_DELIMITER, + DOUBLE_QUOTATION_MARKS + }; - LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip ) + LLKeywordToken( TOKEN_TYPE type, const LLColor3& color, const LLWString& token, const LLWString& tool_tip, const LLWString& delimiter ) : mType( type ), mToken( token ), mColor( color ), - mToolTip( tool_tip ) + mToolTip( tool_tip ), + mDelimiter( delimiter ) // right delimiter { } - S32 getLength() const { return mToken.size(); } + S32 getLengthHead() const { return mToken.size(); } + S32 getLengthTail() const { return mDelimiter.size(); } BOOL isHead(const llwchar* s) const; + BOOL isTail(const llwchar* s) const; const LLWString& getToken() const { return mToken; } const LLColor3& getColor() const { return mColor; } TOKEN_TYPE getType() const { return mType; } const LLWString& getToolTip() const { return mToolTip; } + const LLWString& getDelimiter() const { return mDelimiter; } #ifdef _DEBUG void dump(); @@ -68,6 +89,7 @@ private: LLWString mToken; LLColor3 mColor; LLWString mToolTip; + LLWString mDelimiter; }; class LLKeywords @@ -85,7 +107,8 @@ public: void addToken(LLKeywordToken::TOKEN_TYPE type, const std::string& key, const LLColor3& color, - const std::string& tool_tip = LLStringUtil::null); + const std::string& tool_tip = LLStringUtil::null, + const std::string& delimiter = LLStringUtil::null); // This class is here as a performance optimization. // The word token map used to be defined as std::map<LLWString, LLKeywordToken*>. diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 3ef8d8ff35..cb237fca7c 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1686,7 +1686,8 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p) mSpilloverMenu(NULL), mJumpKey(p.jump_key), mCreateJumpKeys(p.create_jump_keys), - mNeedsArrange(FALSE), + mNeedsArrange(FALSE), + mResetScrollPositionOnShow(true), mShortcutPad(p.shortcut_pad) { typedef boost::tokenizer<boost::char_separator<char> > tokenizer; @@ -3043,7 +3044,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y) S32 mouse_x, mouse_y; // Resetting scrolling position - if (menu->isScrollable()) + if (menu->isScrollable() && menu->isScrollPositionOnShowReset()) { menu->mFirstVisibleItem = NULL; } diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 77db588390..bdae899933 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -516,6 +516,9 @@ public: static class LLMenuHolderGL* sMenuContainer; + void resetScrollPositionOnShow(bool reset_scroll_pos) { mResetScrollPositionOnShow = reset_scroll_pos; } + bool isScrollPositionOnShowReset() { return mResetScrollPositionOnShow; } + protected: void createSpilloverBranch(); void cleanupSpilloverBranch(); @@ -565,6 +568,7 @@ private: KEY mJumpKey; BOOL mCreateJumpKeys; S32 mShortcutPad; + bool mResetScrollPositionOnShow; }; // end class LLMenuGL diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 515605200e..e7642ae190 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -109,9 +109,14 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p) mPadBetween(p.pad_between), mMinGirth(p.min_girth), mPopupMenuHandle(), + mRightMouseTargetButton(NULL), mStartDragItemCallback(NULL), mHandleDragItemCallback(NULL), mHandleDropCallback(NULL), + mButtonAddSignal(NULL), + mButtonEnterSignal(NULL), + mButtonLeaveSignal(NULL), + mButtonRemoveSignal(NULL), mDragAndDropTarget(false) { mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text; @@ -121,6 +126,10 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p) LLToolBar::~LLToolBar() { delete mPopupMenuHandle.get(); + delete mButtonAddSignal; + delete mButtonEnterSignal; + delete mButtonLeaveSignal; + delete mButtonRemoveSignal; } void LLToolBar::createContextMenu() @@ -131,6 +140,7 @@ void LLToolBar::createContextMenu() LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commit_reg; commit_reg.add("Toolbars.EnableSetting", boost::bind(&LLToolBar::onSettingEnable, this, _2)); + commit_reg.add("Toolbars.RemoveSelectedCommand", boost::bind(&LLToolBar::onRemoveSelectedCommand, this)); LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_reg; enable_reg.add("Toolbars.CheckSetting", boost::bind(&LLToolBar::isSettingChecked, this, _2)); @@ -212,7 +222,6 @@ bool LLToolBar::addCommand(const LLCommandId& commandId, int rank) mButtonPanel->addChild(button); mButtonMap.insert(std::make_pair(commandId.uuid(), button)); - // Insert the command and button in the right place in their respective lists if ((rank >= mButtonCommands.size()) || (rank == RANK_NONE)) { @@ -238,6 +247,14 @@ bool LLToolBar::addCommand(const LLCommandId& commandId, int rank) mNeedsLayout = true; + updateLayoutAsNeeded(); + + + if (mButtonAddSignal) + { + (*mButtonAddSignal)(button); + } + return true; } @@ -264,6 +281,11 @@ int LLToolBar::removeCommand(const LLCommandId& commandId) ++rank; } + if (mButtonRemoveSignal) + { + (*mButtonRemoveSignal)(*it_button); + } + // Delete the button and erase the command and button records delete (*it_button); mButtonCommands.erase(it_command); @@ -352,6 +374,23 @@ bool LLToolBar::stopCommandInProgress(const LLCommandId& commandId) return (command_button != NULL); } +bool LLToolBar::flashCommand(const LLCommandId& commandId, bool flash) +{ + LLButton * command_button = NULL; + + if (commandId != LLCommandId::null) + { + command_id_map::iterator it = mButtonMap.find(commandId.uuid()); + if (it != mButtonMap.end()) + { + command_button = it->second; + command_button->setFlashing(flash ? TRUE : FALSE); + } + } + + return (command_button != NULL); +} + BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask) { LLRect button_panel_rect; @@ -360,6 +399,20 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask) if (handle_it_here) { + // Determine which button the mouse was over during the click in case the context menu action + // is intended to affect the button. + BOOST_FOREACH(LLToolBarButton* button, mButtons) + { + LLRect button_rect; + button->localRectToOtherView(button->getLocalRect(), &button_rect, this); + + if (button_rect.pointInRect(x, y)) + { + mRightMouseTargetButton = button; + break; + } + } + createContextMenu(); LLContextMenu * menu = (LLContextMenu *) mPopupMenuHandle.get(); @@ -409,6 +462,18 @@ void LLToolBar::onSettingEnable(const LLSD& userdata) } } +void LLToolBar::onRemoveSelectedCommand() +{ + llassert(!mReadOnly); + + if (mRightMouseTargetButton) + { + removeCommand(mRightMouseTargetButton->getCommandId()); + + mRightMouseTargetButton = NULL; + } +} + void LLToolBar::setButtonType(LLToolBarEnums::ButtonType button_type) { bool regenerate_buttons = (mButtonType != button_type); @@ -487,11 +552,11 @@ int LLToolBar::getRankFromPosition(S32 x, S32 y) S32 mid_point = (button_rect.mRight + button_rect.mLeft) / 2; if (button_panel_x < mid_point) { - mDragx = button_rect.mLeft - mPadLeft; - mDragy = button_rect.mTop + mPadTop; - } - else - { + mDragx = button_rect.mLeft - mPadLeft; + mDragy = button_rect.mTop + mPadTop; + } + else + { rank++; mDragx = button_rect.mRight + mPadRight - 1; mDragy = button_rect.mTop + mPadTop; @@ -518,12 +583,12 @@ int LLToolBar::getRankFromPosition(S32 x, S32 y) { // We hit passed the end of the list so put the insertion point at the end if (orientation == LLLayoutStack::HORIZONTAL) - { + { mDragx = button_rect.mRight + mPadRight; mDragy = button_rect.mTop + mPadTop; - } - else - { + } + else + { mDragx = button_rect.mLeft - mPadLeft; mDragy = button_rect.mBottom - mPadBottom; } @@ -790,10 +855,16 @@ void LLToolBar::createButtons() { BOOST_FOREACH(LLToolBarButton* button, mButtons) { + if (mButtonRemoveSignal) + { + (*mButtonRemoveSignal)(button); + } + delete button; } mButtons.clear(); mButtonMap.clear(); + mRightMouseTargetButton = NULL; BOOST_FOREACH(LLCommandId& command_id, mButtonCommands) { @@ -801,6 +872,11 @@ void LLToolBar::createButtons() mButtons.push_back(button); mButtonPanel->addChild(button); mButtonMap.insert(std::make_pair(command_id.uuid(), button)); + + if (mButtonAddSignal) + { + (*mButtonAddSignal)(button); + } } mNeedsLayout = true; } @@ -870,8 +946,7 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id) button->setCommitCallback(executeParam); } - - + // Set up "is running" query callback const std::string& isRunningFunction = commandp->isRunningFunctionName(); if (isRunningFunction.length() > 0) { @@ -898,6 +973,36 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id) return button; } +boost::signals2::connection connectSignal(LLToolBar::button_signal_t*& signal, const LLToolBar::button_signal_t::slot_type& cb) +{ + if (!signal) + { + signal = new LLToolBar::button_signal_t(); + } + + return signal->connect(cb); +} + +boost::signals2::connection LLToolBar::setButtonAddCallback(const button_signal_t::slot_type& cb) +{ + return connectSignal(mButtonAddSignal, cb); +} + +boost::signals2::connection LLToolBar::setButtonEnterCallback(const button_signal_t::slot_type& cb) +{ + return connectSignal(mButtonEnterSignal, cb); +} + +boost::signals2::connection LLToolBar::setButtonLeaveCallback(const button_signal_t::slot_type& cb) +{ + return connectSignal(mButtonLeaveSignal, cb); +} + +boost::signals2::connection LLToolBar::setButtonRemoveCallback(const button_signal_t::slot_type& cb) +{ + return connectSignal(mButtonRemoveSignal, cb); +} + BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, @@ -969,8 +1074,6 @@ LLToolBarButton::LLToolBarButton(const Params& p) mOriginalImageOverlayColor(p.image_overlay_color), mOriginalImageOverlaySelectedColor(p.image_overlay_selected_color) { - mButtonFlashRate = 0.0; - mButtonFlashCount = 0; } LLToolBarButton::~LLToolBarButton() @@ -1012,6 +1115,7 @@ BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask) { handled = LLButton::handleHover(x, y, mask); } + return handled; } @@ -1024,6 +1128,23 @@ void LLToolBarButton::onMouseEnter(S32 x, S32 y, MASK mask) { mNeedsHighlight = TRUE; } + + LLToolBar* parent_toolbar = getParentByType<LLToolBar>(); + if (parent_toolbar && parent_toolbar->mButtonEnterSignal) + { + (*(parent_toolbar->mButtonEnterSignal))(this); + } +} + +void LLToolBarButton::onMouseLeave(S32 x, S32 y, MASK mask) +{ + LLButton::onMouseLeave(x, y, mask); + + LLToolBar* parent_toolbar = getParentByType<LLToolBar>(); + if (parent_toolbar && parent_toolbar->mButtonLeaveSignal) + { + (*(parent_toolbar->mButtonLeaveSignal))(this); + } } void LLToolBarButton::onMouseCaptureLost() @@ -1072,25 +1193,25 @@ void LLToolBarButton::setEnabled(BOOL enabled) } } - const std::string LLToolBarButton::getToolTip() const { std::string tooltip; + if (labelIsTruncated() || getCurrentLabel().empty()) { - return LLTrans::getString(LLCommandManager::instance().getCommand(mId)->labelRef()) + " -- " + LLView::getToolTip(); + tooltip = LLTrans::getString(LLCommandManager::instance().getCommand(mId)->labelRef()) + " -- " + LLView::getToolTip(); } else { - return LLView::getToolTip(); + tooltip = LLView::getToolTip(); } -} - - - - - - + LLToolBar* parent_toolbar = getParentByType<LLToolBar>(); + if (parent_toolbar && parent_toolbar->mButtonTooltipSuffix.length() > 0) + { + tooltip = tooltip + "\n(" + parent_toolbar->mButtonTooltipSuffix + ")"; + } + return tooltip; +} diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index e634e57f93..51fe23ddd1 100644 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -63,14 +63,17 @@ public: BOOL handleMouseDown(S32 x, S32 y, MASK mask); BOOL handleHover(S32 x, S32 y, MASK mask); + void reshape(S32 width, S32 height, BOOL called_from_parent = true); void setEnabled(BOOL enabled); void setCommandId(const LLCommandId& id) { mId = id; } + LLCommandId getCommandId() { return mId; } void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; } void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; } void onMouseEnter(S32 x, S32 y, MASK mask); + void onMouseLeave(S32 x, S32 y, MASK mask); void onMouseCaptureLost(); void onCommit(); @@ -120,6 +123,8 @@ namespace LLToolBarEnums SIDE_RIGHT, SIDE_TOP, }; + + LLLayoutStack::ELayoutOrientation getOrientation(SideType sideType); } // NOTE: This needs to occur before Param block declaration for proper compilation. @@ -142,6 +147,7 @@ namespace LLInitParam class LLToolBar : public LLUICtrl { + friend class LLToolBarButton; public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { @@ -160,7 +166,8 @@ public: pad_bottom, pad_between, min_girth; - // get rid of this + + // default command set Multiple<LLCommandId::Params> commands; Optional<LLPanel::Params> button_panel; @@ -171,8 +178,6 @@ public: // virtuals void draw(); void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - int getRankFromPosition(S32 x, S32 y); - int getRankFromPosition(const LLCommandId& id); BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, @@ -181,80 +186,103 @@ public: std::string& tooltip_msg); static const int RANK_NONE = -1; - bool addCommand(const LLCommandId& commandId, int rank = RANK_NONE); int removeCommand(const LLCommandId& commandId); // Returns the rank the removed command was at, RANK_NONE if not found - bool hasCommand(const LLCommandId& commandId) const; - bool enableCommand(const LLCommandId& commandId, bool enabled); - bool stopCommandInProgress(const LLCommandId& commandId); + bool hasCommand(const LLCommandId& commandId) const; // is this command bound to a button in this toolbar + bool enableCommand(const LLCommandId& commandId, bool enabled); // enable/disable button bound to the specified command, if it exists in this toolbar + bool stopCommandInProgress(const LLCommandId& commandId); // stop command if it is currently active + bool flashCommand(const LLCommandId& commandId, bool flash); // flash button associated with given command, if in this toolbar - void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; } + void setStartDragCallback(tool_startdrag_callback_t cb) { mStartDragItemCallback = cb; } // connects drag and drop behavior to external logic void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; } void setHandleDropCallback(tool_handledrop_callback_t cb) { mHandleDropCallback = cb; } bool isReadOnly() const { return mReadOnly; } LLToolBarButton* createButton(const LLCommandId& id); + typedef boost::signals2::signal<void (LLView* button)> button_signal_t; + boost::signals2::connection setButtonAddCallback(const button_signal_t::slot_type& cb); + boost::signals2::connection setButtonEnterCallback(const button_signal_t::slot_type& cb); + boost::signals2::connection setButtonLeaveCallback(const button_signal_t::slot_type& cb); + boost::signals2::connection setButtonRemoveCallback(const button_signal_t::slot_type& cb); + + // append the specified string to end of tooltip + void setTooltipButtonSuffix(const std::string& suffix) { mButtonTooltipSuffix = suffix; } + + LLToolBarEnums::SideType getSideType() const { return mSideType; } bool hasButtons() const { return !mButtons.empty(); } bool isModified() const { return mModified; } -protected: - friend class LLUICtrlFactory; - LLToolBar(const Params&); - ~LLToolBar(); - - void initFromParams(const Params&); - tool_startdrag_callback_t mStartDragItemCallback; - tool_handledrag_callback_t mHandleDragItemCallback; - tool_handledrop_callback_t mHandleDropCallback; - bool mDragAndDropTarget; - int mDragRank; - S32 mDragx, - mDragy, - mDragGirth; + int getRankFromPosition(S32 x, S32 y); + int getRankFromPosition(const LLCommandId& id); -public: // Methods used in loading and saving toolbar settings void setButtonType(LLToolBarEnums::ButtonType button_type); LLToolBarEnums::ButtonType getButtonType() { return mButtonType; } command_id_list_t& getCommandsList() { return mButtonCommands; } void clearCommandsList(); - + private: + friend class LLUICtrlFactory; + LLToolBar(const Params&); + ~LLToolBar(); + + void initFromParams(const Params&); void createContextMenu(); void updateLayoutAsNeeded(); void createButtons(); void resizeButtonsInRow(std::vector<LLToolBarButton*>& buttons_in_row, S32 max_row_girth); BOOL isSettingChecked(const LLSD& userdata); void onSettingEnable(const LLSD& userdata); + void onRemoveSelectedCommand(); +private: + // static layout state const bool mReadOnly; + const LLToolBarEnums::SideType mSideType; + const bool mWrap; + const S32 mPadLeft, + mPadRight, + mPadTop, + mPadBottom, + mPadBetween, + mMinGirth; + + // drag and drop state + tool_startdrag_callback_t mStartDragItemCallback; + tool_handledrag_callback_t mHandleDragItemCallback; + tool_handledrop_callback_t mHandleDropCallback; + bool mDragAndDropTarget; + int mDragRank; + S32 mDragx, + mDragy, + mDragGirth; typedef std::list<LLToolBarButton*> toolbar_button_list; + typedef std::map<LLUUID, LLToolBarButton*> command_id_map; toolbar_button_list mButtons; command_id_list_t mButtonCommands; - typedef std::map<LLUUID, LLToolBarButton*> command_id_map; command_id_map mButtonMap; LLToolBarEnums::ButtonType mButtonType; + LLToolBarButton::Params mButtonParams[LLToolBarEnums::BTNTYPE_COUNT]; + + // related widgets LLLayoutStack* mCenteringStack; - LLLayoutStack* mWrapStack; LLPanel* mButtonPanel; - LLToolBarEnums::SideType mSideType; - - bool mWrap; + LLHandle<class LLContextMenu> mPopupMenuHandle; + + LLToolBarButton* mRightMouseTargetButton; + bool mNeedsLayout; bool mModified; - S32 mPadLeft, - mPadRight, - mPadTop, - mPadBottom, - mPadBetween, - mMinGirth; - LLToolBarButton::Params mButtonParams[LLToolBarEnums::BTNTYPE_COUNT]; + button_signal_t* mButtonAddSignal; + button_signal_t* mButtonEnterSignal; + button_signal_t* mButtonLeaveSignal; + button_signal_t* mButtonRemoveSignal; - LLHandle<class LLContextMenu> mPopupMenuHandle; + std::string mButtonTooltipSuffix; }; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 4dd11541b9..8057506736 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -2545,8 +2545,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e { // This is where we would constrain move/resize to a particular screen - const S32 MIN_WIDTH = 320; - const S32 MIN_HEIGHT = 240; + const S32 MIN_WIDTH = 1024; + const S32 MIN_HEIGHT = 768; Rect currentBounds; Rect previousBounds; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 121c7880df..a84bd5fb08 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1031,6 +1031,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO mhInstance, NULL); + LL_INFOS("Window") << "window is created." << llendl ; + //----------------------------------------------------------------------- // Create GL drawing context //----------------------------------------------------------------------- @@ -1120,6 +1122,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO return FALSE; } + LL_INFOS("Window") << "Drawing context is created." << llendl ; + gGLManager.initWGL(); if (wglChoosePixelFormatARB) @@ -1256,7 +1260,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO LL_INFOS("Window") << "Choosing pixel formats: " << num_formats << " pixel formats returned" << LL_ENDL; } - + LL_INFOS("Window") << "pixel formats done." << llendl ; S32 swap_method = 0; S32 cur_format = num_formats-1; @@ -1306,6 +1310,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO mhInstance, NULL); + LL_INFOS("Window") << "recreate window done." << llendl ; + if (!(mhDC = GetDC(mWindowHandle))) { close(); @@ -2354,6 +2360,14 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ return 0; } + case WM_GETMINMAXINFO: + { + LPMINMAXINFO min_max = (LPMINMAXINFO)l_param; + min_max->ptMinTrackSize.x = 1024; + min_max->ptMinTrackSize.y = 768; + return 0; + } + case WM_SIZE: { window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_SIZE"); diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp index b555e92b96..8f1c1a2dd0 100644..100755 --- a/indra/mac_crash_logger/llcrashloggermac.cpp +++ b/indra/mac_crash_logger/llcrashloggermac.cpp @@ -249,5 +249,6 @@ void LLCrashLoggerMac::updateApplication(const std::string& message) bool LLCrashLoggerMac::cleanup() { + commonCleanup(); return true; } diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 0f74772e42..13d51099a8 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -25,12 +25,11 @@ * $/LicenseInfo$ * @endcond */ - #include "llqtwebkit.h" - #include "linden_common.h" #include "indra_constants.h" // for indra keyboard codes +#include "lltimer.h" #include "llgl.h" #include "llplugininstance.h" @@ -117,15 +116,19 @@ private: F32 mBackgroundG; F32 mBackgroundB; std::string mTarget; - + LLTimer mElapsedTime; + VolumeCatcher mVolumeCatcher; void postDebugMessage( const std::string& msg ) { if ( mEnableMediaPluginDebugging ) { + std::stringstream str; + str << "@Media Msg> " << "[" << (double)mElapsedTime.getElapsedTimeF32() << "] -- " << msg; + LLPluginMessage debug_message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "debug_message"); - debug_message.setValue("message_text", "Media> " + msg); + debug_message.setValue("message_text", str.str()); debug_message.setValue("message_level", "info"); sendMessage(debug_message); } @@ -323,7 +326,11 @@ private: LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled ); // turn on/off Javascript based on what host app tells us +#if LLQTWEBKIT_API_VERSION >= 11 + LLQtWebKit::getInstance()->enableJavaScript( mJavascriptEnabled ); +#else LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled ); +#endif std::stringstream str; str << "Cookies enabled = " << mCookiesEnabled << ", plugins enabled = " << mPluginsEnabled << ", Javascript enabled = " << mJavascriptEnabled; @@ -346,7 +353,7 @@ private: // append details to agent string LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent ); postDebugMessage( "Updating user agent with " + mUserAgent ); - + #if !LL_QTWEBKIT_USES_PIXMAPS // don't flip bitmap LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true ); @@ -374,7 +381,17 @@ private: url << "%22%3E%3C/body%3E%3C/html%3E"; //lldebugs << "data url is: " << url.str() << llendl; - + + // loading overlay debug screen follows media debugging flag from client for now. +#if LLQTWEBKIT_API_VERSION >= 16 + LLQtWebKit::getInstance()->enableLoadingOverlay(mBrowserWindowId, mEnableMediaPluginDebugging); +#else + llwarns << "Ignoring enableLoadingOverlay() call (llqtwebkit version is too old)." << llendl; +#endif + str.clear(); + str << "Loading overlay enabled = " << mEnableMediaPluginDebugging << " for mBrowserWindowId = " << mBrowserWindowId; + postDebugMessage( str.str() ); + LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() ); // LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); @@ -583,6 +600,10 @@ private: // These could be passed through as well, but aren't really needed. // message.setValue("uri", event.getEventUri()); // message.setValueBoolean("dead", (event.getIntValue() != 0)) + + // debug spam + postDebugMessage( "Sending cookie_set message from plugin: " + event.getStringValue() ); + sendMessage(message); } @@ -863,6 +884,8 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_ mPluginsEnabled = true; // default to on mEnableMediaPluginDebugging = false; mUserAgent = "LLPluginMedia Web Browser"; + + mElapsedTime.reset(); } MediaPluginWebKit::~MediaPluginWebKit() @@ -1210,7 +1233,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) { mEnableMediaPluginDebugging = message_in.getValueBoolean( "enable" ); } - else if(message_name == "js_enable_object") { @@ -1298,6 +1320,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) mFirstFocus = false; } } + else if(message_name == "set_page_zoom_factor") + { +#if LLQTWEBKIT_API_VERSION >= 15 + F32 factor = message_in.getValueReal("factor"); + LLQtWebKit::getInstance()->setPageZoomFactor(factor); +#else + llwarns << "Ignoring setPageZoomFactor message (llqtwebkit version is too old)." << llendl; +#endif + } else if(message_name == "clear_cache") { LLQtWebKit::getInstance()->clearCache(); @@ -1324,6 +1355,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) else if(message_name == "set_cookies") { LLQtWebKit::getInstance()->setCookies(message_in.getValue("cookies")); + + // debug spam + postDebugMessage( "Plugin setting cookie: " + message_in.getValue("cookies") ); } else if(message_name == "proxy_setup") { diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7288bf6933..ff9cf3199e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -219,7 +219,6 @@ set(viewer_SOURCE_FILES llfloateropenobject.cpp llfloaterpay.cpp llfloaterperms.cpp - llfloaterpostcard.cpp llfloaterpostprocess.cpp llfloaterpreference.cpp llfloaterproperties.cpp @@ -241,6 +240,7 @@ set(viewer_SOURCE_FILES llfloatertopobjects.cpp llfloatertos.cpp llfloatertoybox.cpp + llfloatertranslationsettings.cpp llfloateruipreview.cpp llfloaterurlentry.cpp llfloatervoiceeffect.cpp @@ -395,6 +395,12 @@ set(viewer_SOURCE_FILES llpanelprimmediacontrols.cpp llpanelprofile.cpp llpanelprofileview.cpp + llpanelsnapshot.cpp + llpanelsnapshotinventory.cpp + llpanelsnapshotlocal.cpp + llpanelsnapshotoptions.cpp + llpanelsnapshotpostcard.cpp + llpanelsnapshotprofile.cpp llpanelteleporthistory.cpp llpaneltiptoast.cpp llpanelvoiceeffect.cpp @@ -413,6 +419,7 @@ set(viewer_SOURCE_FILES llpopupview.cpp llpolymesh.cpp llpolymorph.cpp + llpostcard.cpp llpreview.cpp llpreviewanim.cpp llpreviewgesture.cpp @@ -602,6 +609,7 @@ set(viewer_SOURCE_FILES llwearablelist.cpp llwearabletype.cpp llweb.cpp + llwebprofile.cpp llwebsharing.cpp llwind.cpp llwindowlistener.cpp @@ -785,7 +793,6 @@ set(viewer_HEADER_FILES llfloateropenobject.h llfloaterpay.h llfloaterperms.h - llfloaterpostcard.h llfloaterpostprocess.h llfloaterpreference.h llfloaterproperties.h @@ -807,6 +814,7 @@ set(viewer_HEADER_FILES llfloatertopobjects.h llfloatertos.h llfloatertoybox.h + llfloatertranslationsettings.h llfloateruipreview.h llfloaterurlentry.h llfloatervoiceeffect.h @@ -955,6 +963,7 @@ set(viewer_HEADER_FILES llpanelprimmediacontrols.h llpanelprofile.h llpanelprofileview.h + llpanelsnapshot.h llpanelteleporthistory.h llpaneltiptoast.h llpanelvoicedevicesettings.h @@ -973,6 +982,7 @@ set(viewer_HEADER_FILES llpolymesh.h llpolymorph.h llpopupview.h + llpostcard.h llpreview.h llpreviewanim.h llpreviewgesture.h @@ -1162,6 +1172,7 @@ set(viewer_HEADER_FILES llwearablelist.h llwearabletype.h llweb.h + llwebprofile.h llwebsharing.h llwind.h llwindowlistener.h @@ -1987,12 +1998,19 @@ if (LL_TESTS) llmediadataclient.cpp lllogininstance.cpp llremoteparcelrequest.cpp + lltranslate.cpp llviewerhelputil.cpp llversioninfo.cpp llworldmap.cpp llworldmipmap.cpp ) + set_source_files_properties( + lltranslate.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${JSONCPP_LIBRARIES}" + ) + ################################################## # DISABLING PRECOMPILED HEADERS USAGE FOR TESTS ################################################## diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index b5f105439c..82b43432eb 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -603,9 +603,11 @@ return Leave current function or event handler # Comment [one_sided_delimiter .8, .3, .15] // Comment:Non-functional commentary or disabled code +[two_sided_delimiter .8, .3, .15] +/* */ Comment:Non-functional commentary or disabled code # String literals -[two_sided_delimiter 0, .2, 0] +[double_quotation_marks 0, .2, 0] " String literal #functions are supplied by the program now diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9f01674efe..9c055bdc5a 100644..100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1605,17 +1605,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>CloseSnapshotOnKeep</key> - <map> - <key>Comment</key> - <string>Close snapshot window after saving snapshot</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> <key>CmdLineDisableVoice</key> <map> <key>Comment</key> @@ -2630,17 +2619,6 @@ <key>Value</key> <integer>-1</integer> </map> - <key>DebugToolbarFUI</key> - <map> - <key>Comment</key> - <string>Turn on the FUI Toolbars</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> <key>DebugViews</key> <map> <key>Comment</key> @@ -4667,6 +4645,17 @@ <string>0.0.0</string> </map> + <key>LastSnapshotToProfileHeight</key> + <map> + <key>Comment</key> + <string>The height of the last profile snapshot, in px</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>768</integer> + </map> <key>LastSnapshotToEmailHeight</key> <map> <key>Comment</key> @@ -4678,6 +4667,17 @@ <key>Value</key> <integer>768</integer> </map> + <key>LastSnapshotToProfileWidth</key> + <map> + <key>Comment</key> + <string>The width of the last profile snapshot, in px</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>1024</integer> + </map> <key>LastSnapshotToEmailWidth</key> <map> <key>Comment</key> @@ -4733,17 +4733,6 @@ <key>Value</key> <integer>512</integer> </map> - <key>LastSnapshotType</key> - <map> - <key>Comment</key> - <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>0</integer> - </map> <key>LeftClickShowMenu</key> <map> <key>Comment</key> @@ -10608,6 +10597,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>SnapshotProfileLastResolution</key> + <map> + <key>Comment</key> + <string>Take next profile snapshot at this resolution</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>SnapshotPostcardLastResolution</key> <map> <key>Comment</key> @@ -11014,6 +11014,39 @@ <key>Value</key> <integer>0</integer> </map> + <key>TranslationService</key> + <map> + <key>Comment</key> + <string>Translation API to use. (google|bing)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>bing</string> + </map> + <key>GoogleTranslateAPIKey</key> + <map> + <key>Comment</key> + <string>Google Translate API key</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string></string> + </map> + <key>BingTranslateAPIKey</key> + <map> + <key>Comment</key> + <string>Bing AppID to use with the Microsoft Translator API</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string></string> + </map> <key>TutorialURL</key> <map> <key>Comment</key> @@ -13350,7 +13383,7 @@ <key>Comment</key> <string>Settings that are a applied per session (not saved).</string> <key>Persist</key> - <integer>1</integer> + <integer>0</integer> <key>Type</key> <string>String</string> <key>Value</key> @@ -13361,7 +13394,7 @@ <key>Comment</key> <string>User settings that are a applied per session (not saved).</string> <key>Persist</key> - <integer>1</integer> + <integer>0</integer> <key>Type</key> <string>String</string> <key>Value</key> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index d8295ddb87..8cdd8ed838 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -33,6 +33,17 @@ <key>Value</key> <string /> </map> + <key>DisplayDestinationsOnInitialRun</key> + <map> + <key>Comment</key> + <string>Display the destinations guide when a user first launches Second Life.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>LastInventoryInboxActivity</key> <map> <key>Comment</key> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 5d6b10c047..6641c80b94 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -393,7 +393,26 @@ max_attachment_offset="2.0" visible_in_first_person="true" /> - + <attachment_point + id="39" + group="9" + pie_slice="1" + name="Neck" + joint="mNeck" + position="0 0 0" + rotation="0 0 0" + visible_in_first_person="true" /> + + <attachment_point + id="40" + group="9" + pie_slice="2" + name="Avatar Center" + joint="mRoot" + position="0 0 0" + rotation="0 0 0" + visible_in_first_person="true" /> + <param id="32" group="1" diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 9ad313a9a7..9ad313a9a7 100644..100755 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt diff --git a/indra/newview/installers/darwin/dmg-cleanup.applescript b/indra/newview/installers/darwin/dmg-cleanup.applescript index f3d39aec21..8a71b392f9 100644 --- a/indra/newview/installers/darwin/dmg-cleanup.applescript +++ b/indra/newview/installers/darwin/dmg-cleanup.applescript @@ -19,7 +19,7 @@ tell application "Finder" set current view of foo to icon view set toolbar visible of foo to false set statusbar visible of foo to false - set the bounds of foo to {100, 100, 600, 399} + set the bounds of foo to {100, 100, 600, 449} -- set the position of front window to {100, 100} -- get {name, position} of every item of front window diff --git a/indra/newview/installers/darwin/fix_application_icon_position.sh b/indra/newview/installers/darwin/fix_application_icon_position.sh index c6b92589db..618e34820c 100644..100755 --- a/indra/newview/installers/darwin/fix_application_icon_position.sh +++ b/indra/newview/installers/darwin/fix_application_icon_position.sh @@ -1,6 +1,6 @@ # just run this script each time after you change the installer's name to fix the icon misalignment #!/bin/bash -cp -r ./../../../build-darwin-i386/newview/*.dmg ~/Desktop/TempBuild.dmg +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 diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store Binary files differindex 8f6c25c2f4..747ca961d8 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/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 4811f1fcd5..02ca7cbb3a 100644..100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -1,6 +1,22 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; secondlife setup.nsi
-;; Copyright 2004-2010, Linden Research, Inc.
+;; Copyright 2004-2011, Linden Research, Inc.
+;;
+;; This library is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU Lesser General Public
+;; License as published by the Free Software Foundation;
+;; version 2.1 of the License only.
+;;
+;; This library is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; Lesser General Public License for more details.
+;;
+;; You should have received a copy of the GNU Lesser General Public
+;; License along with this library; if not, write to the Free Software
+;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;;
+;; Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
;;
;; NSIS Unicode 2.38.1 or higher required
;; http://www.scratchpaper.com/
@@ -293,19 +309,106 @@ Function CheckNetworkConnection Return
FunctionEnd
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-; Delete files in Documents and Settings\<user>\SecondLife\cache
-; Delete files in Documents and Settings\All Users\SecondLife\cache
+; Save user files to temp location
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;Function RemoveCacheFiles
-;
-;; Delete files in Documents and Settings\<user>\SecondLife
+Function PreserveUserFiles
+
+Push $0
+Push $1
+Push $2
+
+ RMDir /r "$TEMP\SecondLifeSettingsBackup"
+ CreateDirectory "$TEMP\SecondLifeSettingsBackup"
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ CreateDirectory "$TEMP\SecondLifeSettingsBackup\$0"
+ CopyFiles "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\$0"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Copy files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ CreateDirectory "$TEMP\SecondLifeSettingsBackup\AllUsers\"
+ CopyFiles "$2\Application Data\SecondLife\*" "$TEMP\SecondLifeSettingsBackup\AllUsers\"
+Pop $0
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Restore user files from temp location
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Function RestoreUserFiles
+
+Push $0
+Push $1
+Push $2
+
+ StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+
+ LOOP:
+ EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
+ StrCmp $1 "" DONE ; no more users
+
+ ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath"
+ StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing
+
+ ; Required since ProfileImagePath is of type REG_EXPAND_SZ
+ ExpandEnvStrings $2 $2
+
+ CreateDirectory "$2\Application Data\SecondLife\"
+ CopyFiles "$TEMP\SecondLifeSettingsBackup\$0\*" "$2\Application Data\SecondLife\"
+
+ CONTINUE:
+ IntOp $0 $0 + 1
+ Goto LOOP
+ DONE:
+
+Pop $2
+Pop $1
+Pop $0
+
+; Copy files in Documents and Settings\All Users\SecondLife
+Push $0
+ ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+ StrCmp $0 "" +2
+ CreateDirectory "$2\Application Data\SecondLife\"
+ CopyFiles "$TEMP\SecondLifeSettingsBackup\AllUsers\*" "$2\Application Data\SecondLife\"
+Pop $0
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Clobber user files - TEST ONLY
+; This is here for testing, generally not desirable to call it.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;Function ClobberUserFilesTESTONLY
+
;Push $0
;Push $1
;Push $2
-; DetailPrint $(RemoveCacheFilesDP)
;
-; StrCpy $0 0 ; Index number used to iterate via EnumRegKey
+; StrCpy $0 0 ; Index number used to iterate via EnumRegKey
;
; LOOP:
; EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0
@@ -317,29 +420,24 @@ FunctionEnd ; ; Required since ProfileImagePath is of type REG_EXPAND_SZ
; ExpandEnvStrings $2 $2
;
-; ; When explicitly uninstalling, everything goes away
-; RMDir /r "$2\Application Data\SecondLife\cache"
+; RMDir /r "$2\Application Data\SecondLife\"
;
; CONTINUE:
; IntOp $0 $0 + 1
; Goto LOOP
; DONE:
+;
;Pop $2
;Pop $1
;Pop $0
;
-;; Delete files in Documents and Settings\All Users\SecondLife
+;; Copy files in Documents and Settings\All Users\SecondLife
;Push $0
-; ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
-; StrCmp $0 "" +2
-; RMDir /r "$0\SecondLife\cache"
+; ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData"
+; StrCmp $0 "" +2
+; RMDir /r "$2\Application Data\SecondLife\"
;Pop $0
;
-;; Delete filse in C:\Windows\Application Data\SecondLife
-;; If the user is running on a pre-NT system, Application Data lives here instead of
-;; in Documents and Settings.
-;RMDir /r "$WINDIR\Application Data\SecondLife\cache"
-;
;FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -412,17 +510,15 @@ Push $2 ; Required since ProfileImagePath is of type REG_EXPAND_SZ
ExpandEnvStrings $2 $2
- ; If uninstalling a normal install remove everything
- ; Otherwise (preview/dmz etc) just remove cache
- StrCmp $INSTFLAGS "" RM_ALL RM_CACHE
- RM_ALL:
- RMDir /r "$2\Application Data\SecondLife"
- RM_CACHE:
- # Local Settings directory is the cache, there is no "cache" subdir
- RMDir /r "$2\Local Settings\Application Data\SecondLife"
- # Vista version of the same
- RMDir /r "$2\AppData\Local\SecondLife"
- Delete "$2\Application Data\SecondLife\user_settings\settings_windlight.xml"
+ ; Remove all cache and settings files but leave any other .txt files to preserve the chat logs
+; RMDir /r "$2\Application Data\SecondLife\logs"
+ RMDir /r "$2\Application Data\SecondLife\browser_profile"
+ RMDir /r "$2\Application Data\SecondLife\user_settings"
+ Delete "$2\Application Data\SecondLife\*.xml"
+ Delete "$2\Application Data\SecondLife\*.bmp"
+ Delete "$2\Application Data\SecondLife\search_history.txt"
+ Delete "$2\Application Data\SecondLife\plugin_cookies.txt"
+ Delete "$2\Application Data\SecondLife\typed_locations.txt"
CONTINUE:
IntOp $0 $0 + 1
@@ -440,7 +536,7 @@ Push $0 RMDir /r "$0\SecondLife"
Pop $0
-; Delete filse in C:\Windows\Application Data\SecondLife
+; Delete files in C:\Windows\Application Data\SecondLife
; If the user is running on a pre-NT system, Application Data lives here instead of
; in Documents and Settings.
RMDir /r "$WINDIR\Application Data\SecondLife"
@@ -770,10 +866,11 @@ Call CloseSecondLife ; Make sure we're not running Call CheckNetworkConnection ; ping secondlife.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Call PreserveUserFiles
+
;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers.
;Call RemoveCacheFiles ; Installing over removes potentially corrupted
; VFS and cache files.
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Need to clean out shader files from previous installs to fix DEV-5663
Call RemoveOldShaders
@@ -854,6 +951,18 @@ WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" ; write out uninstaller
WriteUninstaller "$INSTDIR\uninst.exe"
+; Remove existing "Second Life Viewer 2" install if any.
+StrCmp $INSTDIR "$PROGRAMFILES\SecondLifeViewer2" SLV2_DONE ; unless that's the install directory
+IfFileExists "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" SLV2_FOUND SLV2_DONE
+
+SLV2_FOUND:
+ExecWait '"$PROGRAMFILES\SecondLifeViewer2\uninst.exe" /S _?=$PROGRAMFILES\SecondLifeViewer2'
+Delete "$PROGRAMFILES\SecondLifeViewer2\uninst.exe" ; with _? option above, uninst.exe will be left behind.
+RMDir "$PROGRAMFILES\SecondLifeViewer2" ; will remove only if empty.
+
+SLV2_DONE:
+Call RestoreUserFiles
+
; end of default section
SectionEnd
diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi Binary files differindex bd37e4ad4c..de7affe08a 100644 --- a/indra/newview/installers/windows/lang_ru.nsi +++ b/indra/newview/installers/windows/lang_ru.nsi diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi Binary files differindex 7b4ce358f3..5e7e3d797b 100644 --- a/indra/newview/installers/windows/lang_tr.nsi +++ b/indra/newview/installers/windows/lang_tr.nsi diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ecfd101eeb..c937f604fc 100644..100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1970,6 +1970,8 @@ bool LLAppViewer::initThreads() static const bool enable_threads = true; #endif + LLImage::initClass(); + LLVFSThread::initClass(enable_threads && false); LLLFSThread::initClass(enable_threads && false); @@ -1979,8 +1981,7 @@ bool LLAppViewer::initThreads() LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true, - app_metrics_qa_mode); - LLImage::initClass(); + app_metrics_qa_mode); if (LLFastTimer::sLog || LLFastTimer::sMetricLog) { @@ -2825,48 +2826,15 @@ void LLAppViewer::initUpdater() void LLAppViewer::checkForCrash(void) { - #if LL_SEND_CRASH_REPORTS if (gLastExecEvent == LAST_EXEC_FROZE) { - llinfos << "Last execution froze, requesting to send crash report." << llendl; - // - // Pop up a freeze or crash warning dialog - // - S32 choice; - const S32 cb = gCrashSettings.getS32("CrashSubmitBehavior"); - if(cb == CRASH_BEHAVIOR_ASK) - { - std::ostringstream msg; - msg << LLTrans::getString("MBFrozenCrashed"); - std::string alert = LLTrans::getString("APP_NAME") + " " + LLTrans::getString("MBAlert"); - choice = OSMessageBox(msg.str(), - alert, - OSMB_YESNO); - } - else if(cb == CRASH_BEHAVIOR_NEVER_SEND) - { - choice = OSBTN_NO; - } - else - { - choice = OSBTN_YES; - } - - if (OSBTN_YES == choice) - { - llinfos << "Sending crash report." << llendl; + llinfos << "Last execution froze, sending a crash report." << llendl; - bool report_freeze = true; - handleCrashReporting(report_freeze); - } - else - { - llinfos << "Not sending crash report." << llendl; - } + bool report_freeze = true; + handleCrashReporting(report_freeze); } #endif // LL_SEND_CRASH_REPORTS - } // @@ -3117,6 +3085,8 @@ void LLAppViewer::handleViewerCrash() llinfos << "Last render pool type: " << LLPipeline::sCurRenderPoolType << llendl ; + LLMemory::logMemoryInfo(true) ; + //print out recorded call stacks if there are any. LLError::LLCallStacks::print(); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f94c843ad9..647ace7ee3 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -403,11 +403,9 @@ bool LLAppViewerWin32::initHardwareTest() // if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe")) { - BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); - // per DEV-11631 - disable hardware probing for everything // but vram. - vram_only = TRUE; + BOOL vram_only = TRUE; LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware")); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 966f5b941e..40a4d665f8 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -78,6 +78,8 @@ void on_new_single_inventory_upload_complete( const LLSD& server_response, S32 upload_price) { + bool success = false; + if ( upload_price > 0 ) { // this upload costed us L$, update our balance @@ -152,6 +154,7 @@ void on_new_single_inventory_upload_complete( gInventory.updateItem(item); gInventory.notifyObservers(); + success = true; // Show the preview panel for textures and sounds to let // user know that the image (or snapshot) arrived intact. @@ -175,6 +178,13 @@ void on_new_single_inventory_upload_complete( // remove the "Uploading..." message LLUploadDialog::modalUploadFinished(); + + // Let the Snapshot floater know we have finished uploading a snapshot to inventory. + LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot"); + if (asset_type == LLAssetType::AT_TEXTURE && floater_snapshot) + { + floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", success).with("msg", "inventory"))); + } } LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data, diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 98de418878..4f2fd47488 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -443,17 +443,17 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, { setLandingTab(dest); } - /* - * the condition dest == NULL can be satisfied not only in the case - * of dragging to the right from the last tab of the favbar. there is a - * small gap between each tab. if the user drags something exactly there - * then mLandingTab will be set to NULL and the dragged item will be pushed - * to the end of the favorites bar. this is incorrect behavior. that's why - * we need an additional check which excludes the case described previously - * making sure that the mouse pointer is beyond the last tab. - */ - else if (mLastTab && x >= mLastTab->getRect().mRight) + else if (mLastTab && (x >= mLastTab->getRect().mRight)) { + /* + * the condition dest == NULL can be satisfied not only in the case + * of dragging to the right from the last tab of the favbar. there is a + * small gap between each tab. if the user drags something exactly there + * then mLandingTab will be set to NULL and the dragged item will be pushed + * to the end of the favorites bar. this is incorrect behavior. that's why + * we need an additional check which excludes the case described previously + * making sure that the mouse pointer is beyond the last tab. + */ setLandingTab(NULL); } @@ -467,7 +467,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, if (drop) { handleExistingFavoriteDragAndDrop(x, y); - showDragMarker(FALSE); } } else @@ -490,7 +489,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, setLandingTab(NULL); } handleNewFavoriteDragAndDrop(item, favorites_id, x, y); - showDragMarker(FALSE); } } } @@ -504,20 +502,29 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y) { + // Identify the button hovered and the side to drop LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); + bool insert_before = true; + if (!dest) + { + insert_before = false; + dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab); + } - // there is no need to handle if an item was dragged onto itself + // There is no need to handle if an item was dragged onto itself if (dest && dest->getLandmarkId() == mDragItemId) { return; } + // Insert the dragged item in the right place if (dest) { - LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId()); + LLInventoryModel::updateItemsOrder(mItems, mDragItemId, dest->getLandmarkId(), insert_before); } else { + // This can happen when the item list is empty mItems.push_back(gInventory.getItem(mDragItemId)); } @@ -534,22 +541,35 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y) void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, const LLUUID& favorites_id, S32 x, S32 y) { - LLFavoriteLandmarkButton* dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); - - // there is no need to handle if an item was dragged onto itself + // Identify the button hovered and the side to drop + LLFavoriteLandmarkButton* dest = NULL; + bool insert_before = true; + if (!mItems.empty()) + { + dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); + if (!dest) + { + insert_before = false; + dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLastTab); + } + } + + // There is no need to handle if an item was dragged onto itself if (dest && dest->getLandmarkId() == mDragItemId) { return; } - + LLPointer<LLViewerInventoryItem> viewer_item = new LLViewerInventoryItem(item); + // Insert the dragged item in the right place if (dest) { - insertBeforeItem(mItems, dest->getLandmarkId(), viewer_item); + insertItem(mItems, dest->getLandmarkId(), viewer_item, insert_before); } else { + // This can happen when the item list is empty mItems.push_back(viewer_item); } @@ -579,7 +599,11 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD) { viewer_item->setType(LLAssetType::AT_LANDMARK); - copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb)); + copy_inventory_from_notecard(favorites_id, + tool_dad->getObjectID(), + tool_dad->getSourceID(), + viewer_item.get(), + gInventoryCallbacks.registerCB(cb)); } else { @@ -642,7 +666,7 @@ void LLFavoritesBarCtrl::draw() { // mouse pointer hovers over an existing tab LLRect rect = mLandingTab->getRect(); - mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h); + mImageDragIndication->draw(rect.mLeft, rect.getHeight(), w, h); } else if (mLastTab) { @@ -650,6 +674,8 @@ void LLFavoritesBarCtrl::draw() LLRect rect = mLastTab->getRect(); mImageDragIndication->draw(rect.mRight, rect.getHeight(), w, h); } + // Once drawn, mark this false so we won't draw it again (unless we hit the favorite bar again) + mShowDragMarker = FALSE; } } @@ -721,7 +747,7 @@ void LLFavoritesBarCtrl::updateButtons() if (first_changed_item_index <= mItems.count()) { // Rebuild the buttons only - // child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator + // child_list_t is a linked list, so safe to erase from the middle if we pre-increment the iterator while (child_it != childs->end()) { @@ -810,9 +836,9 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem /** * WORKAROUND: - * there are some problem with displaying of fonts in buttons. - * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough. - * Problem will gone, if we stretch out the button. For that reason I have to put additional 20 pixels. + * There are some problem with displaying of fonts in buttons. + * Empty space or ellipsis might be displayed instead of last symbols, even though the width of the button is enough. + * The problem disappears if we pad the button with 20 pixels. */ int required_width = mFont->getWidth(item->getName()) + 20; int width = required_width > def_button_width? def_button_width : required_width; @@ -840,7 +866,6 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem fav_btn->setRect(butt_rect); // change only left and save bottom fav_btn->setFont(mFont); - fav_btn->setName(item->getName()); fav_btn->setLabel(item->getName()); fav_btn->setToolTip(item->getName()); fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); @@ -995,7 +1020,9 @@ void LLFavoritesBarCtrl::addOpenLandmarksMenuItem(LLToggleableMenu* menu) LLMenuItemCallGL::Params item_params; item_params.name("open_my_landmarks"); item_params.label(translated ? label_transl: label_untrans); - item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", LLSD())); + LLSD key; + key["type"] = "open_landmark_tab"; + item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", key)); LLMenuItemCallGL* menu_item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params); fitLabelWidth(menu_item); @@ -1176,7 +1203,9 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); if (mRestoreOverflowMenu && menu && !menu->getVisible()) { + menu->resetScrollPositionOnShow(false); showDropDownMenu(); + menu->resetScrollPositionOnShow(true); } } @@ -1298,25 +1327,24 @@ BOOL LLFavoritesBarCtrl::handleHover(S32 x, S32 y, MASK mask) LLUICtrl* LLFavoritesBarCtrl::findChildByLocalCoords(S32 x, S32 y) { - LLUICtrl* ctrl = 0; - S32 screenX, screenY; + LLUICtrl* ctrl = NULL; const child_list_t* list = getChildList(); - localPointToScreen(x, y, &screenX, &screenY); - - // look for a child which contains the point (screenX, screenY) in it's rectangle for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i) { - LLRect rect; - localRectToScreen((*i)->getRect(), &rect); - - if (rect.pointInRect(screenX, screenY)) + // Look only for children that are favorite buttons + if ((*i)->getName() == "favorites_bar_btn") { - ctrl = dynamic_cast<LLUICtrl*>(*i); - break; + LLRect rect = (*i)->getRect(); + // We consider a button hit if the cursor is left of the right side + // This makes the hit a bit less finicky than hitting directly on the button itself + if (x <= rect.mRight) + { + ctrl = dynamic_cast<LLUICtrl*>(*i); + break; + } } } - return ctrl; } @@ -1337,29 +1365,28 @@ BOOL LLFavoritesBarCtrl::needToSaveItemsOrder(const LLInventoryModel::item_array return result; } -LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) +void LLFavoritesBarCtrl::insertItem(LLInventoryModel::item_array_t& items, const LLUUID& dest_item_id, LLViewerInventoryItem* insertedItem, bool insert_before) { - LLInventoryModel::item_array_t::iterator result = items.end(); + // Get the iterator to the destination item + LLInventoryModel::item_array_t::iterator it_dest = LLInventoryModel::findItemIterByUUID(items, dest_item_id); + if (it_dest == items.end()) + return; - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + // Go to the next element if one wishes to insert after the dest element + if (!insert_before) { - if ((*i)->getUUID() == id) - { - result = i; - break; - } + ++it_dest; } - - return result; -} - -void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem) -{ - LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId); - llassert(beforeItem); - if (beforeItem) + + // Insert the source item in the right place + if (it_dest != items.end()) + { + items.insert(it_dest, insertedItem); + } + else { - items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem); + // Append to the list if it_dest reached the end + items.push_back(insertedItem); } } diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 1b11d6196e..2f75b3bb0e 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -130,7 +130,7 @@ private: * inserts an item identified by insertedItemId BEFORE an item identified by beforeItemId. * this function assumes that an item identified by insertedItemId doesn't exist in items array. */ - void insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem); + void insertItem(LLInventoryModel::item_array_t& items, const LLUUID& dest_item_id, LLViewerInventoryItem* insertedItem, bool insert_before); // finds an item by it's UUID in the items array LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id); diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 22f500ba15..83fb887d81 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -384,6 +384,9 @@ void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url) // Render the LLSD from getInfo() as a format_map_t LLStringUtil::format_map_t args; + // allow the "Release Notes" URL label to be localized + args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); + for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); ii != iend; ++ii) { diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 4746f93009..2bb1075ec4 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -433,7 +433,6 @@ BOOL LLPanelLandGeneral::postBuild() mTextDwell = getChild<LLTextBox>("DwellText"); - mBtnBuyLand = getChild<LLButton>("Buy Land..."); mBtnBuyLand->setClickedCallback(onClickBuyLand, (void*)&BUY_PERSONAL_LAND); @@ -696,20 +695,26 @@ void LLPanelLandGeneral::refresh() S32 area; S32 claim_price; S32 rent_price; - F32 dwell; + F32 dwell = DWELL_NAN; LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, &claim_price, &rent_price, &for_sale, &dwell); - // Area LLUIString price = getString("area_size_text"); price.setArg("[AREA]", llformat("%d",area)); mTextPriceLabel->setText(getString("area_text")); mTextPrice->setText(price.getString()); - mTextDwell->setText(llformat("%.0f", dwell)); + if (dwell == DWELL_NAN) + { + mTextDwell->setText(LLTrans::getString("LoadingData")); + } + else + { + mTextDwell->setText(llformat("%.0f", dwell)); + } if (for_sale) { diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp deleted file mode 100644 index 3bcbb987f7..0000000000 --- a/indra/newview/llfloaterpostcard.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/** - * @file llfloaterpostcard.cpp - * @brief Postcard send floater, allows setting name, e-mail address, etc. - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfloaterpostcard.h" - -#include "llfontgl.h" -#include "llsys.h" -#include "llgl.h" -#include "v3dmath.h" -#include "lldir.h" - -#include "llagent.h" -#include "llui.h" -#include "lllineeditor.h" -#include "llbutton.h" -#include "lltexteditor.h" -#include "llfloaterreg.h" -#include "llnotificationsutil.h" -#include "llviewercontrol.h" -#include "llviewernetwork.h" -#include "lluictrlfactory.h" -#include "lluploaddialog.h" -#include "llviewerstats.h" -#include "llviewerwindow.h" -#include "llstatusbar.h" -#include "llviewerregion.h" -#include "lleconomy.h" -#include "message.h" - -#include "llimagejpeg.h" -#include "llimagej2c.h" -#include "llvfile.h" -#include "llvfs.h" -#include "llviewertexture.h" -#include "llassetuploadresponders.h" -#include "llagentui.h" - -#include <boost/regex.hpp> //boost.regex lib - -///---------------------------------------------------------------------------- -/// Local function declarations, constants, enums, and typedefs -///---------------------------------------------------------------------------- - -///---------------------------------------------------------------------------- -/// Class LLFloaterPostcard -///---------------------------------------------------------------------------- - -LLFloaterPostcard::LLFloaterPostcard(const LLSD& key) -: LLFloater(key), - mJPEGImage(NULL), - mViewerImage(NULL), - mHasFirstMsgFocus(false) -{ -} - -// Destroys the object -LLFloaterPostcard::~LLFloaterPostcard() -{ - mJPEGImage = NULL; // deletes image -} - -BOOL LLFloaterPostcard::postBuild() -{ - // pick up the user's up-to-date email address - gAgent.sendAgentUserInfoRequest(); - - childSetAction("cancel_btn", onClickCancel, this); - childSetAction("send_btn", onClickSend, this); - - getChildView("from_form")->setEnabled(FALSE); - - std::string name_string; - LLAgentUI::buildFullname(name_string); - getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string)); - - // For the first time a user focusess to .the msg box, all text will be selected. - getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(onMsgFormFocusRecieved, _1, this)); - - getChild<LLUICtrl>("to_form")->setFocus(TRUE); - - return TRUE; -} - -// static -LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global) -{ - // Take the images from the caller - // It's now our job to clean them up - LLFloaterPostcard* instance = LLFloaterReg::showTypedInstance<LLFloaterPostcard>("postcard", LLSD(img->getID())); - - if (instance) // may be 0 if we're in mouselook mode - { - instance->mJPEGImage = jpeg; - instance->mViewerImage = img; - instance->mImageScale = image_scale; - instance->mPosTakenGlobal = pos_taken_global; - } - - return instance; -} - -void LLFloaterPostcard::draw() -{ - LLGLSUIDefault gls_ui; - LLFloater::draw(); - - if(!isMinimized() && mViewerImage.notNull() && mJPEGImage.notNull()) - { - // Force the texture to be 100% opaque when the floater is focused. - F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); - LLRect rect(getRect()); - - // first set the max extents of our preview - rect.translate(-rect.mLeft, -rect.mBottom); - rect.mLeft += 320; - rect.mRight -= 10; - rect.mTop -= 27; - rect.mBottom = rect.mTop - 130; - - // then fix the aspect ratio - F32 ratio = (F32)mJPEGImage->getWidth() / (F32)mJPEGImage->getHeight(); - if ((F32)rect.getWidth() / (F32)rect.getHeight() >= ratio) - { - rect.mRight = LLRect::tCoordType((F32)rect.mLeft + ((F32)rect.getHeight() * ratio)); - } - else - { - rect.mBottom = LLRect::tCoordType((F32)rect.mTop - ((F32)rect.getWidth() / ratio)); - } - { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f) % alpha); - rect.stretch(-1); - } - { - - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - { - glScalef(mImageScale.mV[VX], mImageScale.mV[VY], 1.f); - glMatrixMode(GL_MODELVIEW); - gl_draw_scaled_image(rect.mLeft, - rect.mBottom, - rect.getWidth(), - rect.getHeight(), - mViewerImage.get(), - LLColor4::white % alpha); - } - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - } - } -} - -// static -void LLFloaterPostcard::onClickCancel(void* data) -{ - if (data) - { - LLFloaterPostcard *self = (LLFloaterPostcard *)data; - - self->closeFloater(false); - } -} - -class LLSendPostcardResponder : public LLAssetUploadResponder -{ -public: - LLSendPostcardResponder(const LLSD &post_data, - const LLUUID& vfile_id, - LLAssetType::EType asset_type): - LLAssetUploadResponder(post_data, vfile_id, asset_type) - { - } - // *TODO define custom uploadFailed here so it's not such a generic message - void uploadComplete(const LLSD& content) - { - // we don't care about what the server returns from this post, just clean up the UI - LLUploadDialog::modalUploadFinished(); - } -}; - -// static -void LLFloaterPostcard::onClickSend(void* data) -{ - if (data) - { - LLFloaterPostcard *self = (LLFloaterPostcard *)data; - - std::string from(self->getChild<LLUICtrl>("from_form")->getValue().asString()); - std::string to(self->getChild<LLUICtrl>("to_form")->getValue().asString()); - - boost::regex emailFormat("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*"); - - if (to.empty() || !boost::regex_match(to, emailFormat)) - { - LLNotificationsUtil::add("PromptRecipientEmail"); - return; - } - - if (from.empty() || !boost::regex_match(from, emailFormat)) - { - LLNotificationsUtil::add("PromptSelfEmail"); - return; - } - - std::string subject(self->getChild<LLUICtrl>("subject_form")->getValue().asString()); - if(subject.empty() || !self->mHasFirstMsgFocus) - { - LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2)); - return; - } - - if (self->mJPEGImage.notNull()) - { - self->sendPostcard(); - } - else - { - LLNotificationsUtil::add("ErrorProcessingSnapshot"); - } - } -} - -// static -void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed) -{ - LLFloaterPostcard *self = (LLFloaterPostcard *)user_data; - - LLUploadDialog::modalUploadFinished(); - - if (result) - { - LLSD args; - args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); - LLNotificationsUtil::add("ErrorUploadingPostcard", args); - } - else - { - // only create the postcard once the upload succeeds - - // request the postcard - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("SendPostcard"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->addUUID("AssetID", self->mAssetID); - msg->addVector3d("PosGlobal", self->mPosTakenGlobal); - msg->addString("To", self->getChild<LLUICtrl>("to_form")->getValue().asString()); - msg->addString("From", self->getChild<LLUICtrl>("from_form")->getValue().asString()); - msg->addString("Name", self->getChild<LLUICtrl>("name_form")->getValue().asString()); - msg->addString("Subject", self->getChild<LLUICtrl>("subject_form")->getValue().asString()); - msg->addString("Msg", self->getChild<LLUICtrl>("msg_form")->getValue().asString()); - msg->addBOOL("AllowPublish", FALSE); - msg->addBOOL("MaturePublish", FALSE); - gAgent.sendReliableMessage(); - } - - self->closeFloater(); -} - -// static -void LLFloaterPostcard::updateUserInfo(const std::string& email) -{ - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("postcard"); - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); - iter != inst_list.end(); ++iter) - { - LLFloater* instance = *iter; - const std::string& text = instance->getChild<LLUICtrl>("from_form")->getValue().asString(); - if (text.empty()) - { - // there's no text in this field yet, pre-populate - instance->getChild<LLUICtrl>("from_form")->setValue(LLSD(email)); - } - } -} - -void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data) -{ - LLFloaterPostcard* self = (LLFloaterPostcard *)data; - if(self) - { - LLTextEditor* msgForm = self->getChild<LLTextEditor>("msg_form"); - if(msgForm && msgForm == receiver && msgForm->hasFocus() && !(self->mHasFirstMsgFocus)) - { - self->mHasFirstMsgFocus = true; - msgForm->setText(LLStringUtil::null); - } - } -} - -bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if(0 == option) - { - // User clicked OK - if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty()) - { - // Stuff the subject back into the form. - getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject")); - } - - if(!mHasFirstMsgFocus) - { - // The user never switched focus to the messagee window. - // Using the default string. - getChild<LLUICtrl>("msg_form")->setValue(getString("default_message")); - } - - sendPostcard(); - } - return false; -} - -void LLFloaterPostcard::sendPostcard() -{ - mTransactionID.generate(); - mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); - LLVFile::writeFile(mJPEGImage->getData(), mJPEGImage->getDataSize(), gVFS, mAssetID, LLAssetType::AT_IMAGE_JPEG); - - // upload the image - std::string url = gAgent.getRegion()->getCapability("SendPostcard"); - if(!url.empty()) - { - llinfos << "Send Postcard via capability" << llendl; - LLSD body = LLSD::emptyMap(); - // the capability already encodes: agent ID, region ID - body["pos-global"] = mPosTakenGlobal.getValue(); - body["to"] = getChild<LLUICtrl>("to_form")->getValue().asString(); - body["from"] = getChild<LLUICtrl>("from_form")->getValue().asString(); - body["name"] = getChild<LLUICtrl>("name_form")->getValue().asString(); - body["subject"] = getChild<LLUICtrl>("subject_form")->getValue().asString(); - body["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString(); - LLHTTPClient::post(url, body, new LLSendPostcardResponder(body, mAssetID, LLAssetType::AT_IMAGE_JPEG)); - } - else - { - gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE); - } - - // give user feedback of the event - gViewerWindow->playSnapshotAnimAndSound(); - LLUploadDialog::modalUploadDialog(getString("upload_message")); - - // don't destroy the window until the upload is done - // this way we keep the information in the form - setVisible(FALSE); - - // also remove any dependency on another floater - // so that we can be sure to outlive it while we - // need to. - LLFloater* dependee = getDependee(); - if (dependee) - dependee->removeDependentFloater(this); -} diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h deleted file mode 100644 index 472592154f..0000000000 --- a/indra/newview/llfloaterpostcard.h +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file llfloaterpostcard.h - * @brief Postcard send floater, allows setting name, e-mail address, etc. - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLFLOATERPOSTCARD_H -#define LL_LLFLOATERPOSTCARD_H - -#include "llfloater.h" -#include "llcheckboxctrl.h" - -#include "llpointer.h" - -class LLTextEditor; -class LLLineEditor; -class LLButton; -class LLViewerTexture; -class LLImageJPEG; - -class LLFloaterPostcard -: public LLFloater -{ -public: - LLFloaterPostcard(const LLSD& key); - virtual ~LLFloaterPostcard(); - - virtual BOOL postBuild(); - virtual void draw(); - - static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global); - - static void onClickCancel(void* data); - static void onClickSend(void* data); - - static void uploadCallback(const LLUUID& asset_id, - void *user_data, - S32 result, LLExtStat ext_status); - - static void updateUserInfo(const std::string& email); - - static void onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data); - bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response); - - void sendPostcard(); - -private: - - LLPointer<LLImageJPEG> mJPEGImage; - LLPointer<LLViewerTexture> mViewerImage; - LLTransactionID mTransactionID; - LLAssetID mAssetID; - LLVector2 mImageScale; - LLVector3d mPosTakenGlobal; - bool mHasFirstMsgFocus; -}; - - -#endif // LL_LLFLOATERPOSTCARD_H diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 5fdeb46daa..a333989e7e 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -345,6 +345,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this)); mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this)); mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this)); + mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this)); sSkin = gSavedSettings.getString("SkinCurrent"); @@ -599,6 +600,9 @@ void LLFloaterPreference::cancel() } // hide joystick pref floater LLFloaterReg::hideInstance("pref_joystick"); + + // hide translation settings floater + LLFloaterReg::hideInstance("prefs_translation"); // cancel hardware menu LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings"); @@ -1505,6 +1509,11 @@ void LLFloaterPreference::onClickProxySettings() LLFloaterReg::showInstance("prefs_proxy"); } +void LLFloaterPreference::onClickTranslationSettings() +{ + LLFloaterReg::showInstance("prefs_translation"); +} + void LLFloaterPreference::onClickActionChange() { mClickActionDirty = true; diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 5c74e9f60c..7ee3294478 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -156,6 +156,7 @@ public: void onChangeMaturity(); void onClickBlockList(); void onClickProxySettings(); + void onClickTranslationSettings(); void applyUIColor(LLUICtrl* ctrl, const LLSD& param); void getUIColor(LLUICtrl* ctrl, const LLSD& param); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 8105844b0d..48e6cca623 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -42,6 +42,8 @@ #include "llcombobox.h" #include "lleconomy.h" #include "lllandmarkactions.h" +#include "llpanelsnapshot.h" +#include "llsidetraypanelcontainer.h" #include "llsliderctrl.h" #include "llspinctrl.h" #include "llviewercontrol.h" @@ -50,9 +52,7 @@ #include "llviewercamera.h" #include "llviewerwindow.h" #include "llviewermenufile.h" // upload_new_resource() -#include "llfloaterpostcard.h" #include "llcheckboxctrl.h" -#include "llradiogroup.h" #include "llslurl.h" #include "lltoolfocus.h" #include "lltoolmgr.h" @@ -76,18 +76,17 @@ #include "llimagej2c.h" #include "lllocalcliprect.h" #include "llnotificationsutil.h" +#include "llpostcard.h" #include "llresmgr.h" // LLLocale #include "llvfile.h" #include "llvfs.h" +#include "llwebprofile.h" #include "llwindow.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- -S32 LLFloaterSnapshot::sUIWinHeightLong = 530 ; -S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 240 ; -S32 LLFloaterSnapshot::sUIWinWidth = 215 ; - +LLUICtrl* LLFloaterSnapshot::sThumbnailPlaceholder = NULL; LLSnapshotFloaterView* gSnapshotFloaterView = NULL; const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -101,6 +100,9 @@ S32 BORDER_WIDTH = 6; const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512 +static std::string lastSnapshotWidthName(S32 shot_type); +static std::string lastSnapshotHeightName(S32 shot_type); + static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_floater_view"); ///---------------------------------------------------------------------------- @@ -108,6 +110,7 @@ static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_float ///---------------------------------------------------------------------------- class LLSnapshotLivePreview : public LLView { + LOG_CLASS(LLSnapshotLivePreview); public: enum ESnapshotType { @@ -154,6 +157,7 @@ public: F32 getAspect() ; LLRect getImageRect(); BOOL isImageScaled(); + const LLVector3d& getPosTakenGlobal() const { return mPosTakenGlobal; } void setSnapshotType(ESnapshotType type) { mSnapshotType = type; } void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; } @@ -161,10 +165,12 @@ public: void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; } void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); void saveWeb(); - LLFloaterPostcard* savePostcard(); void saveTexture(); BOOL saveLocal(); + LLPointer<LLImageFormatted> getFormattedImage() const { return mFormattedImage; } + LLPointer<LLImageRaw> getEncodedImage() const { return mPreviewImageEncoded; } + BOOL setThumbnailImageSize() ; void generateThumbnailImage(BOOL force_update = FALSE) ; void resetThumbnailImage() { mThumbnailImage = NULL ; } @@ -327,7 +333,8 @@ BOOL LLSnapshotLivePreview::isImageScaled() } void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay) -{ +{ + lldebugs << "updateSnapshot: mSnapshotUpToDate = " << mSnapshotUpToDate << llendl; if (mSnapshotUpToDate) { S32 old_image_index = mCurImageIndex; @@ -367,6 +374,7 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail { mSnapshotDelayTimer.start(); mSnapshotDelayTimer.setTimerExpirySec(delay); + LLFloaterSnapshot::preUpdate(); } if(new_thumbnail) { @@ -629,8 +637,10 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize() F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height); // UI size for thumbnail - S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20; - S32 max_height = 90; + // *FIXME: the rect does not change, so maybe there's no need to recalculate max w/h. + const LLRect& thumbnail_rect = LLFloaterSnapshot::getThumbnailPlaceholderRect(); + S32 max_width = thumbnail_rect.getWidth(); + S32 max_height = thumbnail_rect.getHeight(); if (window_aspect_ratio > (F32)max_width / max_height) { @@ -746,7 +756,15 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update) //static BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) { - LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; + LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; + +#if 1 // XXX tmp + if (previewp->mWidth[previewp->mCurImageIndex] == 0 || previewp->mHeight[previewp->mCurImageIndex] == 0) + { + llwarns << "Incorrect dimensions: " << previewp->mWidth[previewp->mCurImageIndex] << "x" << previewp->mHeight[previewp->mCurImageIndex] << llendl; + return FALSE; + } +#endif LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin(); LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion(); @@ -774,6 +792,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) // time to produce a snapshot + lldebugs << "producing snapshot" << llendl; if (!previewp->mPreviewImage) { previewp->mPreviewImage = new LLImageRaw; @@ -809,6 +828,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE) { + lldebugs << "Encoding new image of format J2C" << llendl; LLPointer<LLImageJ2C> formatted = new LLImageJ2C; LLPointer<LLImageRaw> scaled = new LLImageRaw( previewp->mPreviewImage->getData(), @@ -829,18 +849,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) // delete any existing image previewp->mFormattedImage = NULL; // now create the new one of the appropriate format. - // note: postcards and web hardcoded to use jpeg always. - LLFloaterSnapshot::ESnapshotFormat format; - - if (previewp->getSnapshotType() == SNAPSHOT_POSTCARD || - previewp->getSnapshotType() == SNAPSHOT_WEB) - { - format = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; - } - else - { - format = previewp->getSnapshotFormat(); - } + LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotFormat(); + lldebugs << "Encoding new image of format " << format << llendl; switch(format) { @@ -920,12 +930,15 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) { previewp->generateThumbnailImage() ; } + lldebugs << "done creating snapshot" << llendl; + LLFloaterSnapshot::postUpdate(); return TRUE; } void LLSnapshotLivePreview::setSize(S32 w, S32 h) { + lldebugs << "setSize(" << w << ", " << h << ")" << llendl; mWidth[mCurImageIndex] = w; mHeight[mCurImageIndex] = h; } @@ -936,40 +949,9 @@ void LLSnapshotLivePreview::getSize(S32& w, S32& h) const h = mHeight[mCurImageIndex]; } -LLFloaterPostcard* LLSnapshotLivePreview::savePostcard() -{ - if(mViewerImage[mCurImageIndex].isNull()) - { - //this should never happen!! - llwarns << "The snapshot image has not been generated!" << llendl ; - return NULL ; - } - - // calculate and pass in image scale in case image data only use portion - // of viewerimage buffer - LLVector2 image_scale(1.f, 1.f); - if (!isImageScaled()) - { - image_scale.setVec(llmin(1.f, (F32)mWidth[mCurImageIndex] / (F32)getCurrentImage()->getWidth()), llmin(1.f, (F32)mHeight[mCurImageIndex] / (F32)getCurrentImage()->getHeight())); - } - - LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); - if(!jpg) - { - llwarns << "Formatted image not a JPEG" << llendl; - return NULL; - } - LLFloaterPostcard* floater = LLFloaterPostcard::showFromSnapshot(jpg, mViewerImage[mCurImageIndex], image_scale, mPosTakenGlobal); - // relinquish lifetime of jpeg image to postcard floater - mFormattedImage = NULL; - mDataSize = 0; - updateSnapshot(FALSE, FALSE); - - return floater; -} - void LLSnapshotLivePreview::saveTexture() { + lldebugs << "saving texture: " << mPreviewImage->getWidth() << "x" << mPreviewImage->getHeight() << llendl; // gen a new uuid for this asset LLTransactionID tid; tid.generate(); @@ -982,6 +964,7 @@ void LLSnapshotLivePreview::saveTexture() mPreviewImage->getComponents()); scaled->biasedScaleToPowerOfTwo(512); + lldebugs << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << llendl; if (formatted->encode(scaled, 0.0f)) { @@ -1020,9 +1003,10 @@ void LLSnapshotLivePreview::saveTexture() BOOL LLSnapshotLivePreview::saveLocal() { - BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage); + BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage, true); // Relinquish image memory. Save button will be disabled as a side-effect. + lldebugs << "resetting formatted image after saving to disk" << llendl; mFormattedImage = NULL; mDataSize = 0; updateSnapshot(FALSE, FALSE); @@ -1067,11 +1051,20 @@ void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& meta class LLFloaterSnapshot::Impl { + LOG_CLASS(LLFloaterSnapshot::Impl); public: + typedef enum e_status + { + STATUS_READY, + STATUS_WORKING, + STATUS_FINISHED + } EStatus; + Impl() : mAvatarPauseHandles(), mLastToolset(NULL), - mAspectRatioCheckOff(false) + mAspectRatioCheckOff(false), + mStatus(STATUS_READY) { } ~Impl() @@ -1080,43 +1073,55 @@ public: mAvatarPauseHandles.clear(); } - static void onClickDiscard(void* data); - static void onClickKeep(void* data); - static void onCommitSave(LLUICtrl* ctrl, void* data); static void onClickNewSnapshot(void* data); static void onClickAutoSnap(LLUICtrl *ctrl, void* data); //static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data); - static void onClickLess(void* data) ; static void onClickMore(void* data) ; static void onClickUICheck(LLUICtrl *ctrl, void* data); static void onClickHUDCheck(LLUICtrl *ctrl, void* data); - static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data); +#if 0 static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data); - static void onCommitQuality(LLUICtrl* ctrl, void* data); +#endif + static void applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked); static void onCommitResolution(LLUICtrl* ctrl, void* data) { updateResolution(ctrl, data); } static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE); static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data); static void onCommitLayerTypes(LLUICtrl* ctrl, void*data); + static void onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val); + static void onImageFormatChange(LLFloaterSnapshot* view); +#if 0 static void onCommitSnapshotType(LLUICtrl* ctrl, void* data); - static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data); static void onCommitCustomResolution(LLUICtrl *ctrl, void* data); +#endif + static void applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h); + static void onSnapshotUploadFinished(bool status); + static void onSendingPostcardFinished(bool status); static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ; static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value); + static LLPanelSnapshot* getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found = true); + static LLSnapshotLivePreview::ESnapshotType getActiveSnapshotType(LLFloaterSnapshot* floater); + static LLFloaterSnapshot::ESnapshotFormat getImageFormat(LLFloaterSnapshot* floater); + static LLSpinCtrl* getWidthSpinner(LLFloaterSnapshot* floater); + static LLSpinCtrl* getHeightSpinner(LLFloaterSnapshot* floater); + static void enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable); + static void setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked); + static LLSnapshotLivePreview* getPreviewView(LLFloaterSnapshot *floater); static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname); static void updateControls(LLFloaterSnapshot* floater); static void updateLayout(LLFloaterSnapshot* floater); - static void updateResolutionTextEntry(LLFloaterSnapshot* floater); + static void setStatus(EStatus status, bool ok = true, const std::string& msg = LLStringUtil::null); + EStatus getStatus() const { return mStatus; } private: - static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater); - static LLSD getTypeName(LLSnapshotLivePreview::ESnapshotType index); - static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater); static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater); static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname); static void checkAutoSnapshot(LLSnapshotLivePreview* floater, BOOL update_thumbnail = FALSE); static void checkAspectRatio(LLFloaterSnapshot *view, S32 index) ; + static void setWorking(LLFloaterSnapshot* floater, bool working); + static void setFinished(LLFloaterSnapshot* floater, bool finished, bool ok = true, const std::string& msg = LLStringUtil::null); + public: std::vector<LLAnimPauseRequest> mAvatarPauseHandles; @@ -1124,84 +1129,97 @@ public: LLToolset* mLastToolset; LLHandle<LLView> mPreviewHandle; bool mAspectRatioCheckOff ; + EStatus mStatus; }; // static -LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater) +LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found) { - LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get(); - return previewp; + LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container"); + LLPanelSnapshot* active_panel = dynamic_cast<LLPanelSnapshot*>(panel_container->getCurrentPanel()); + if (!ok_if_not_found) + { + llassert_always(active_panel != NULL); + } + return active_panel; } // static -LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater) +LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getActiveSnapshotType(LLFloaterSnapshot* floater) { - LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; - LLSD value = floater->getChild<LLUICtrl>("snapshot_type_radio")->getValue(); + LLSnapshotLivePreview::ESnapshotType type = LLSnapshotLivePreview::SNAPSHOT_WEB; + std::string name; + LLPanelSnapshot* spanel = getActivePanel(floater); - const std::string id = value.asString(); - if (id == "postcard") + if (spanel) { - index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; + name = spanel->getName(); } - else if (id == "texture") + + if (name == "panel_snapshot_postcard") { - index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE; + type = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; } - else if (id == "local") + else if (name == "panel_snapshot_inventory") { - index = LLSnapshotLivePreview::SNAPSHOT_LOCAL; + type = LLSnapshotLivePreview::SNAPSHOT_TEXTURE; } - else if (id == "share_to_web") + else if (name == "panel_snapshot_local") { - index = LLSnapshotLivePreview::SNAPSHOT_WEB; + type = LLSnapshotLivePreview::SNAPSHOT_LOCAL; } - return index; + return type; } // static -LLSD LLFloaterSnapshot::Impl::getTypeName(LLSnapshotLivePreview::ESnapshotType index) +LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getImageFormat(LLFloaterSnapshot* floater) { - std::string id; - switch (index) + LLPanelSnapshot* active_panel = getActivePanel(floater); + // FIXME: if the default is not PNG, profile uploads may fail. + return active_panel ? active_panel->getImageFormat() : LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; +} + +// static +LLSpinCtrl* LLFloaterSnapshot::Impl::getWidthSpinner(LLFloaterSnapshot* floater) +{ + LLPanelSnapshot* active_panel = getActivePanel(floater); + return active_panel ? active_panel->getWidthSpinner() : floater->getChild<LLSpinCtrl>("snapshot_width"); +} + +// static +LLSpinCtrl* LLFloaterSnapshot::Impl::getHeightSpinner(LLFloaterSnapshot* floater) +{ + LLPanelSnapshot* active_panel = getActivePanel(floater); + return active_panel ? active_panel->getHeightSpinner() : floater->getChild<LLSpinCtrl>("snapshot_height"); +} + +// static +void LLFloaterSnapshot::Impl::enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable) +{ + LLPanelSnapshot* active_panel = getActivePanel(floater); + if (active_panel) { - case LLSnapshotLivePreview::SNAPSHOT_WEB: - id = "share_to_web"; - break; - case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: - id = "postcard"; - break; - case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: - id = "texture"; - break; - case LLSnapshotLivePreview::SNAPSHOT_LOCAL: - default: - id = "local"; - break; + active_panel->enableAspectRatioCheckbox(enable); } - return LLSD(id); } // static -LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater) +void LLFloaterSnapshot::Impl::setAspectRatioCheckboxValue(LLFloaterSnapshot* floater, BOOL checked) { - ESnapshotFormat index = SNAPSHOT_FORMAT_PNG; - if(floater->hasChild("local_format_combo")) + LLPanelSnapshot* active_panel = getActivePanel(floater); + if (active_panel) { - LLComboBox* local_format_combo = floater->findChild<LLComboBox>("local_format_combo"); - const std::string id = local_format_combo->getSelectedItemLabel(); - if (id == "PNG") - index = SNAPSHOT_FORMAT_PNG; - else if (id == "JPEG") - index = SNAPSHOT_FORMAT_JPEG; - else if (id == "BMP") - index = SNAPSHOT_FORMAT_BMP; + active_panel->getChild<LLUICtrl>(active_panel->getAspectRatioCBName())->setValue(checked); } - return index; } - +// static +LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater) +{ + LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)floater->impl.mPreviewHandle.get(); + return previewp; +} // static LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSnapshot* floater) @@ -1229,12 +1247,27 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) { LLSnapshotLivePreview* previewp = getPreviewView(floaterp); - S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ; + BOOL advanced = gSavedSettings.getBOOL("AdvanceSnapshot"); + + // Show/hide advanced options. + LLPanel* advanced_options_panel = floaterp->getChild<LLPanel>("advanced_options_panel"); + floaterp->getChild<LLButton>("advanced_options_btn")->setToggleState(advanced); + if (advanced != advanced_options_panel->getVisible()) + { + S32 panel_width = advanced_options_panel->getRect().getWidth(); + floaterp->getChild<LLPanel>("advanced_options_panel")->setVisible(advanced); + S32 floater_width = floaterp->getRect().getWidth(); + floater_width += (advanced ? panel_width : -panel_width); + floaterp->reshape(floater_width, floaterp->getRect().getHeight()); + } - if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution + if(!advanced) //set to original window resolution { previewp->mKeepAspectRatio = TRUE; + floaterp->getChild<LLComboBox>("profile_size_combo")->setCurrentByIndex(0); + gSavedSettings.setS32("SnapshotProfileLastResolution", 0); + floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0); gSavedSettings.setS32("SnapshotPostcardLastResolution", 0); @@ -1256,7 +1289,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) floaterp->getParent()->setMouseOpaque(TRUE); // shrink to smaller layout - floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); + // *TODO: unneeded? + floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight()); // can see and interact with fullscreen preview now if (previewp) @@ -1286,7 +1320,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) else // turning off freeze frame mode { floaterp->getParent()->setMouseOpaque(FALSE); - floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); + // *TODO: unneeded? + floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight()); if (previewp) { previewp->setVisible(FALSE); @@ -1315,83 +1350,74 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) // static void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) { - LLRadioGroup* snapshot_type_radio = floater->getChild<LLRadioGroup>("snapshot_type_radio"); - LLSnapshotLivePreview::ESnapshotType shot_type = (LLSnapshotLivePreview::ESnapshotType)gSavedSettings.getS32("LastSnapshotType"); - snapshot_type_radio->setSelectedByValue(getTypeName(shot_type), true); - + LLSnapshotLivePreview::ESnapshotType shot_type = getActiveSnapshotType(floater); ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat"); LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); +#if 0 floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled")); +#endif +#if 0 floater->getChildView("postcard_size_combo")->setVisible( FALSE); floater->getChildView("texture_size_combo")->setVisible( FALSE); floater->getChildView("local_size_combo")->setVisible( FALSE); +#endif + floater->getChild<LLComboBox>("profile_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotProfileLastResolution")); floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution")); floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution")); floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution")); floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat")); // *TODO: Separate settings for Web images from postcards - floater->getChildView("send_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || - shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB); - floater->getChildView("upload_btn")->setVisible(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE); - floater->getChildView("save_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); - floater->getChildView("keep_aspect_check")->setEnabled(shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff); + enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff); + setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot")); floater->getChildView("layer_types")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); - BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot"); - BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL; - BOOL show_slider = (shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || - shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB || - (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG)); - - floater->getChildView("more_btn")->setVisible( !is_advance); // the only item hidden in advanced mode - floater->getChildView("less_btn")->setVisible( is_advance); - floater->getChildView("type_label2")->setVisible( is_advance); - floater->getChildView("format_label")->setVisible( is_advance && is_local); - floater->getChildView("local_format_combo")->setVisible( is_advance && is_local); - floater->getChildView("layer_types")->setVisible( is_advance); - floater->getChildView("layer_type_label")->setVisible( is_advance); - floater->getChildView("snapshot_width")->setVisible( is_advance); - floater->getChildView("snapshot_height")->setVisible( is_advance); - floater->getChildView("keep_aspect_check")->setVisible( is_advance); - floater->getChildView("ui_check")->setVisible( is_advance); - floater->getChildView("hud_check")->setVisible( is_advance); - floater->getChildView("keep_open_check")->setVisible( is_advance); - floater->getChildView("freeze_frame_check")->setVisible( is_advance); - floater->getChildView("auto_snapshot_check")->setVisible( is_advance); - floater->getChildView("image_quality_slider")->setVisible( is_advance && show_slider); - - if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot")) - { //clamp snapshot resolution to window size when showing UI or HUD in snapshot - - LLSpinCtrl* width_ctrl = floater->getChild<LLSpinCtrl>("snapshot_width"); - LLSpinCtrl* height_ctrl = floater->getChild<LLSpinCtrl>("snapshot_height"); - - S32 width = gViewerWindow->getWindowWidthRaw(); - S32 height = gViewerWindow->getWindowHeightRaw(); - - width_ctrl->setMaxValue(width); - - height_ctrl->setMaxValue(height); + LLPanelSnapshot* active_panel = getActivePanel(floater); + if (active_panel) + { + LLSpinCtrl* width_ctrl = getWidthSpinner(floater); + LLSpinCtrl* height_ctrl = getHeightSpinner(floater); - if (width_ctrl->getValue().asInteger() > width) + // Initialize spinners. + if (width_ctrl->getValue().asInteger() == 0) { - width_ctrl->forceSetValue(width); + S32 w = gSavedSettings.getS32(lastSnapshotWidthName(shot_type)); + lldebugs << "Initializing width spinner (" << width_ctrl->getName() << "): " << w << llendl; + width_ctrl->setValue(w); } - if (height_ctrl->getValue().asInteger() > height) + if (height_ctrl->getValue().asInteger() == 0) { - height_ctrl->forceSetValue(height); + S32 h = gSavedSettings.getS32(lastSnapshotHeightName(shot_type)); + lldebugs << "Initializing height spinner (" << height_ctrl->getName() << "): " << h << llendl; + height_ctrl->setValue(h); + } + + if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot")) + { //clamp snapshot resolution to window size when showing UI or HUD in snapshot + S32 width = gViewerWindow->getWindowWidthRaw(); + S32 height = gViewerWindow->getWindowHeightRaw(); + + width_ctrl->setMaxValue(width); + + height_ctrl->setMaxValue(height); + + if (width_ctrl->getValue().asInteger() > width) + { + width_ctrl->forceSetValue(width); + } + if (height_ctrl->getValue().asInteger() > height) + { + height_ctrl->forceSetValue(height); + } + } + else + { + width_ctrl->setMaxValue(6016); + height_ctrl->setMaxValue(6016); } - } - else - { - LLSpinCtrl* width = floater->getChild<LLSpinCtrl>("snapshot_width"); - width->setMaxValue(6016); - LLSpinCtrl* height = floater->getChild<LLSpinCtrl>("snapshot_height"); - height->setMaxValue(6016); } LLSnapshotLivePreview* previewp = getPreviewView(floater); @@ -1399,11 +1425,7 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) BOOL got_snap = previewp && previewp->getSnapshotUpToDate(); // *TODO: Separate maximum size for Web images from postcards - floater->getChildView("send_btn")->setEnabled((shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || - shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB) && - got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE); - floater->getChildView("upload_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap); - floater->getChildView("save_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap); + //lldebugs << "Is snapshot up-to-date? " << got_snap << llendl; LLLocale locale(LLLocale::USER_LOCALE); std::string bytes_string; @@ -1411,9 +1433,17 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) { LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); } - S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - floater->getChild<LLUICtrl>("texture")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); - floater->getChild<LLUICtrl>("upload_btn")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); + + // Update displayed image resolution. + LLTextBox* image_res_tb = floater->getChild<LLTextBox>("image_res_text"); + image_res_tb->setVisible(got_snap); + if (got_snap) + { + LLPointer<LLImageRaw> img = previewp->getEncodedImage(); + image_res_tb->setTextArg("[WIDTH]", llformat("%d", img->getWidth())); + image_res_tb->setTextArg("[HEIGHT]", llformat("%d", img->getHeight())); + } + floater->getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown")); floater->getChild<LLUICtrl>("file_size_label")->setColor( shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD @@ -1422,144 +1452,75 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) switch(shot_type) { - // *TODO: Separate settings for Web images from postcards case LLSnapshotLivePreview::SNAPSHOT_WEB: + layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; + floater->getChild<LLUICtrl>("layer_types")->setValue("colors"); + setResolution(floater, "profile_size_combo"); + break; case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; floater->getChild<LLUICtrl>("layer_types")->setValue("colors"); - if(is_advance) - { - setResolution(floater, "postcard_size_combo"); - } + setResolution(floater, "postcard_size_combo"); break; case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; floater->getChild<LLUICtrl>("layer_types")->setValue("colors"); - if(is_advance) - { - setResolution(floater, "texture_size_combo"); - } + setResolution(floater, "texture_size_combo"); break; case LLSnapshotLivePreview::SNAPSHOT_LOCAL: - if(is_advance) - { - setResolution(floater, "local_size_combo"); - } + setResolution(floater, "local_size_combo"); break; default: break; } - updateResolutionTextEntry(floater); - if (previewp) { + lldebugs << "Setting snapshot type (" << shot_type << "), format (" << shot_format << ")" << llendl; previewp->setSnapshotType(shot_type); previewp->setSnapshotFormat(shot_format); previewp->setSnapshotBufferType(layer_type); } -} - -// static -void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater) -{ - LLSpinCtrl* width_spinner = floater->getChild<LLSpinCtrl>("snapshot_width"); - LLSpinCtrl* height_spinner = floater->getChild<LLSpinCtrl>("snapshot_height"); - if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) + LLPanelSnapshot* current_panel = Impl::getActivePanel(floater); + if (current_panel) { - width_spinner->setAllowEdit(FALSE); - height_spinner->setAllowEdit(FALSE); - } - else - { - width_spinner->setAllowEdit(TRUE); - height_spinner->setAllowEdit(TRUE); + LLSD info; + info["have-snapshot"] = got_snap; + current_panel->updateControls(info); } } // static -void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail) +void LLFloaterSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg) { - if (previewp) + LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance(); + switch (status) { - BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot"); - previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); - } -} - -// static -void LLFloaterSnapshot::Impl::onClickDiscard(void* data) -{ - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; - - if (view) - { - view->closeFloater(); + case STATUS_READY: + setWorking(floater, false); + setFinished(floater, false); + break; + case STATUS_WORKING: + setWorking(floater, true); + setFinished(floater, false); + break; + case STATUS_FINISHED: + setWorking(floater, false); + setFinished(floater, true, ok, msg); + break; } -} - -// static -void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data) -{ - if (ctrl->getValue().asString() == "save as") - { - gViewerWindow->resetSnapshotLoc(); - } - onClickKeep(data); + floater->impl.mStatus = status; } // static -void LLFloaterSnapshot::Impl::onClickKeep(void* data) +void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail) { - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; - LLSnapshotLivePreview* previewp = getPreviewView(view); - if (previewp) { - switch (previewp->getSnapshotType()) - { - case LLSnapshotLivePreview::SNAPSHOT_WEB: - previewp->saveWeb(); - break; - - case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: - { - LLFloaterPostcard* floater = previewp->savePostcard(); - // if still in snapshot mode, put postcard floater in snapshot floaterview - // and link it to snapshot floater - if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep")) - { - gFloaterView->removeChild(floater); - gSnapshotFloaterView->addChild(floater); - view->addDependentFloater(floater, FALSE); - } - } - break; - - case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: - previewp->saveTexture(); - break; - - case LLSnapshotLivePreview::SNAPSHOT_LOCAL: - previewp->saveLocal(); - break; - - default: - break; - } - - if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) - { - view->closeFloater(); - } - else - { - checkAutoSnapshot(previewp); - } - - updateControls(view); + BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot"); + previewp->updateSnapshot(autosnap, update_thumbnail, autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); } } @@ -1590,32 +1551,19 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data) void LLFloaterSnapshot::Impl::onClickMore(void* data) { - gSavedSettings.setBOOL( "AdvanceSnapshot", TRUE ); + BOOL visible = gSavedSettings.getBOOL("AdvanceSnapshot"); - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; if (view) { + gSavedSettings.setBOOL("AdvanceSnapshot", !visible); +#if 0 view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() ); view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong()); +#endif updateControls(view) ; updateLayout(view) ; - if(getPreviewView(view)) - { - getPreviewView(view)->setThumbnailImageSize() ; - } - } -} -void LLFloaterSnapshot::Impl::onClickLess(void* data) -{ - gSavedSettings.setBOOL( "AdvanceSnapshot", FALSE ); - - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; - if (view) - { - view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() ); - view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort()); - updateControls(view) ; - updateLayout(view) ; + // *TODO: redundant? if(getPreviewView(view)) { getPreviewView(view)->setThumbnailImageSize() ; @@ -1651,21 +1599,21 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data) } } +#if 0 // static -void LLFloaterSnapshot::Impl::onClickKeepOpenCheck(LLUICtrl* ctrl, void* data) +void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data) { LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - - gSavedSettings.setBOOL( "CloseSnapshotOnKeep", !check->get() ); + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + applyKeepAspectCheck(view, check->get()); } +#endif // static -void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data) +void LLFloaterSnapshot::Impl::applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked) { - LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - gSavedSettings.setBOOL( "KeepAspectForSnapshot", check->get() ); - - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + gSavedSettings.setBOOL("KeepAspectForSnapshot", checked); + if (view) { LLSnapshotLivePreview* previewp = getPreviewView(view) ; @@ -1688,20 +1636,6 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data) } // static -void LLFloaterSnapshot::Impl::onCommitQuality(LLUICtrl* ctrl, void* data) -{ - LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; - S32 quality_val = llfloor((F32)slider->getValue().asReal()); - - LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data); - if (previewp) - { - previewp->setSnapshotQuality(quality_val); - } - checkAutoSnapshot(previewp, TRUE); -} - -// static void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data) { LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl; @@ -1723,18 +1657,16 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde LLSnapshotLivePreview *previewp = getPreviewView(view) ; // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here -#if 0 - if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getTypeIndex(view)) + if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getActiveSnapshotType(view)) { previewp->mKeepAspectRatio = FALSE ; return ; } -#endif if(0 == index) //current window size { view->impl.mAspectRatioCheckOff = true ; - view->getChildView("keep_aspect_check")->setEnabled(FALSE) ; + enableAspectRatioCheckbox(view, FALSE); if(previewp) { @@ -1744,20 +1676,17 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde else if(-1 == index) //custom { view->impl.mAspectRatioCheckOff = false ; - //if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType")) - { - view->getChildView("keep_aspect_check")->setEnabled(TRUE) ; + enableAspectRatioCheckbox(view, TRUE); - if(previewp) - { - previewp->mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ; - } + if(previewp) + { + previewp->mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ; } } else { view->impl.mAspectRatioCheckOff = true ; - view->getChildView("keep_aspect_check")->setEnabled(FALSE) ; + enableAspectRatioCheckbox(view, FALSE); if(previewp) { @@ -1768,23 +1697,63 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde return ; } -static std::string lastSnapshotWidthName() +// static +void LLFloaterSnapshot::Impl::setWorking(LLFloaterSnapshot* floater, bool working) +{ + LLUICtrl* working_lbl = floater->getChild<LLUICtrl>("working_lbl"); + working_lbl->setVisible(working); + floater->getChild<LLUICtrl>("working_indicator")->setVisible(working); + + if (working) + { + const std::string panel_name = getActivePanel(floater, false)->getName(); + const std::string prefix = panel_name.substr(std::string("panel_snapshot_").size()); + std::string progress_text = floater->getString(prefix + "_" + "progress_str"); + working_lbl->setValue(progress_text); + } + + // All controls should be disable while posting. + floater->setCtrlsEnabled(!working); + LLPanelSnapshot* active_panel = getActivePanel(floater); + if (active_panel) + { + active_panel->setCtrlsEnabled(!working); + } +} + +// static +void LLFloaterSnapshot::Impl::setFinished(LLFloaterSnapshot* floater, bool finished, bool ok, const std::string& msg) { - switch(gSavedSettings.getS32("LastSnapshotType")) + floater->getChild<LLUICtrl>("succeeded_panel")->setVisible(finished && ok); + floater->getChild<LLUICtrl>("failed_panel")->setVisible(finished && !ok); + + if (finished) { - // *TODO: Separate settings for Web snapshots and postcards - case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailWidth"; + LLUICtrl* finished_lbl = floater->getChild<LLUICtrl>(ok ? "succeeded_lbl" : "failed_lbl"); + std::string result_text = floater->getString(msg + "_" + (ok ? "succeeded_str" : "failed_str")); + finished_lbl->setValue(result_text); + + LLSideTrayPanelContainer* panel_container = floater->getChild<LLSideTrayPanelContainer>("panel_container"); + panel_container->openPreviousPanel(); + panel_container->getCurrentPanel()->onOpen(LLSD()); + } +} + +static std::string lastSnapshotWidthName(S32 shot_type) +{ + switch (shot_type) + { + case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToProfileWidth"; case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailWidth"; case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryWidth"; default: return "LastSnapshotToDiskWidth"; } } -static std::string lastSnapshotHeightName() +static std::string lastSnapshotHeightName(S32 shot_type) { - switch(gSavedSettings.getS32("LastSnapshotType")) + switch (shot_type) { - // *TODO: Separate settings for Web snapshots and postcards - case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailHeight"; + case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToProfileHeight"; case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailHeight"; case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryHeight"; default: return "LastSnapshotToDiskHeight"; @@ -1799,10 +1768,12 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL if (!view || !combobox) { + llassert(view && combobox); return; } // save off all selected resolution values + gSavedSettings.setS32("SnapshotProfileLastResolution", view->getChild<LLComboBox>("profile_size_combo")->getCurrentIndex()); gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex()); gSavedSettings.setS32("SnapshotTextureLastResolution", view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex()); gSavedSettings.setS32("SnapshotLocalLastResolution", view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex()); @@ -1824,16 +1795,45 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL if (width == 0 || height == 0) { // take resolution from current window size + lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl; previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); } else if (width == -1 || height == -1) { // load last custom value - previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName())); +#if 1 + S32 new_width = 0, new_height = 0; + LLPanelSnapshot* spanel = getActivePanel(view); + if (spanel) + { + lldebugs << "Loading typed res from panel " << spanel->getName() << llendl; + new_width = spanel->getTypedPreviewWidth(); + new_height = spanel->getTypedPreviewHeight(); + } + else + { + const S32 shot_type = getActiveSnapshotType(view); + lldebugs << "Loading saved res for shot_type " << shot_type << llendl; + new_width = gSavedSettings.getS32(lastSnapshotWidthName(shot_type)); + new_height = gSavedSettings.getS32(lastSnapshotHeightName(shot_type)); + } + + llassert(new_width > 0 && new_height > 0); + previewp->setSize(new_width, new_height); +#else + LLPanelSnapshot* spanel = getActivePanel(view); + if (spanel) + { + lldebugs << "Setting custom preview res : " << spanel->getTypedPreviewWidth() << "x" << spanel->getTypedPreviewHeight() << llendl; + previewp->setSize(spanel->getTypedPreviewWidth(), spanel->getTypedPreviewHeight()); + } + //previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName())); +#endif } else { // use the resolution from the selected pre-canned drop-down choice + lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl; previewp->setSize(width, height); } @@ -1853,10 +1853,10 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL resetSnapshotSizeOnUI(view, width, height) ; } - if(view->getChild<LLUICtrl>("snapshot_width")->getValue().asInteger() != width || view->getChild<LLUICtrl>("snapshot_height")->getValue().asInteger() != height) + if(getWidthSpinner(view)->getValue().asInteger() != width || getHeightSpinner(view)->getValue().asInteger() != height) { - view->getChild<LLUICtrl>("snapshot_width")->setValue(width); - view->getChild<LLUICtrl>("snapshot_height")->setValue(height); + getWidthSpinner(view)->setValue(width); + getHeightSpinner(view)->setValue(height); } if(original_width != width || original_height != height) @@ -1892,32 +1892,41 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data) } } -//static -void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data) +// static +void LLFloaterSnapshot::Impl::onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val) +{ + LLSnapshotLivePreview* previewp = getPreviewView(view); + if (previewp) + { + previewp->setSnapshotQuality(quality_val); + } + checkAutoSnapshot(previewp, TRUE); +} + +// static +void LLFloaterSnapshot::Impl::onImageFormatChange(LLFloaterSnapshot* view) { - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; if (view) { - gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view)); + gSavedSettings.setS32("SnapshotFormat", getImageFormat(view)); getPreviewView(view)->updateSnapshot(TRUE); updateControls(view); } } - +#if 0 //static -void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data) +void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data) { - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; if (view) { - gSavedSettings.setS32("SnapshotFormat", getFormatIndex(view)); + gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view)); getPreviewView(view)->updateSnapshot(TRUE); updateControls(view); } } - - +#endif // Sets the named size combo to "custom" mode. // static @@ -1931,6 +1940,10 @@ void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const s { gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex()); } + else if(comboname == "profile_size_combo") + { + gSavedSettings.setS32("SnapshotProfileLastResolution", combo->getCurrentIndex()); + } else if(comboname == "texture_size_combo") { gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex()); @@ -2027,21 +2040,29 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3 //static void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) { - view->getChild<LLSpinCtrl>("snapshot_width")->forceSetValue(width); - view->getChild<LLSpinCtrl>("snapshot_height")->forceSetValue(height); - gSavedSettings.setS32(lastSnapshotWidthName(), width); - gSavedSettings.setS32(lastSnapshotHeightName(), height); + getWidthSpinner(view)->forceSetValue(width); + getHeightSpinner(view)->forceSetValue(height); + gSavedSettings.setS32(lastSnapshotWidthName(getActiveSnapshotType(view)), width); + gSavedSettings.setS32(lastSnapshotHeightName(getActiveSnapshotType(view)), height); } +#if 0 //static void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* data) { - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + S32 w = llfloor((F32)getWidthSpinner(view)->getValue().asReal()); + S32 h = llfloor((F32)getHeightSpinner(view)->getValue().asReal()); + applyCustomResolution(view, w, h); +} +#endif + +// static +void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h) +{ + lldebugs << "applyCustomResolution(" << w << ", " << h << ")" << llendl; if (view) { - S32 w = llfloor((F32)view->getChild<LLUICtrl>("snapshot_width")->getValue().asReal()); - S32 h = llfloor((F32)view->getChild<LLUICtrl>("snapshot_height")->getValue().asReal()); - LLSnapshotLivePreview* previewp = getPreviewView(view); if (previewp) { @@ -2073,7 +2094,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat } } #endif - previewp->setMaxImageSize((S32)((LLSpinCtrl *)ctrl)->getMaxValue()) ; + previewp->setMaxImageSize((S32) getWidthSpinner(view)->getMaxValue()) ; // Check image size changes the value of height and width if(checkImageSize(previewp, w, h, w != curw, previewp->getMaxImageSize()) @@ -2085,19 +2106,33 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat previewp->setSize(w,h); checkAutoSnapshot(previewp, FALSE); previewp->updateSnapshot(FALSE, TRUE); + comboSetCustom(view, "profile_size_combo"); comboSetCustom(view, "postcard_size_combo"); comboSetCustom(view, "texture_size_combo"); comboSetCustom(view, "local_size_combo"); } } - gSavedSettings.setS32(lastSnapshotWidthName(), w); - gSavedSettings.setS32(lastSnapshotHeightName(), h); + gSavedSettings.setS32(lastSnapshotWidthName(getActiveSnapshotType(view)), w); + gSavedSettings.setS32(lastSnapshotHeightName(getActiveSnapshotType(view)), h); updateControls(view); } } +// static +void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(bool status) +{ + setStatus(STATUS_FINISHED, status, "profile"); +} + + +// static +void LLFloaterSnapshot::Impl::onSendingPostcardFinished(bool status) +{ + setStatus(STATUS_FINISHED, status, "postcard"); +} + ///---------------------------------------------------------------------------- /// Class LLFloaterSnapshot ///---------------------------------------------------------------------------- @@ -2134,24 +2169,18 @@ BOOL LLFloaterSnapshot::postBuild() LLWebSharing::instance().init(); } +#if 0 childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this); - childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this); +#endif childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this); - childSetAction("more_btn", Impl::onClickMore, this); - childSetAction("less_btn", Impl::onClickLess, this); - - childSetAction("upload_btn", Impl::onClickKeep, this); - childSetAction("send_btn", Impl::onClickKeep, this); - childSetCommitCallback("save_btn", Impl::onCommitSave, this); - childSetAction("discard_btn", Impl::onClickDiscard, this); - - childSetCommitCallback("image_quality_slider", Impl::onCommitQuality, this); - getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); + childSetAction("advanced_options_btn", Impl::onClickMore, this); +#if 0 childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this); childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this); +#endif childSetCommitCallback("ui_check", Impl::onClickUICheck, this); getChild<LLUICtrl>("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot")); @@ -2159,18 +2188,19 @@ BOOL LLFloaterSnapshot::postBuild() childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this); getChild<LLUICtrl>("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot")); - childSetCommitCallback("keep_open_check", Impl::onClickKeepOpenCheck, this); - getChild<LLUICtrl>("keep_open_check")->setValue(!gSavedSettings.getBOOL("CloseSnapshotOnKeep")); - +#if 0 childSetCommitCallback("keep_aspect_check", Impl::onClickKeepAspectCheck, this); - getChild<LLUICtrl>("keep_aspect_check")->setValue(gSavedSettings.getBOOL("KeepAspectForSnapshot")); +#endif + impl.setAspectRatioCheckboxValue(this, gSavedSettings.getBOOL("KeepAspectForSnapshot")); childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this); getChild<LLUICtrl>("layer_types")->setValue("colors"); getChildView("layer_types")->setEnabled(FALSE); - getChild<LLUICtrl>("snapshot_width")->setValue(gSavedSettings.getS32(lastSnapshotWidthName())); - getChild<LLUICtrl>("snapshot_height")->setValue(gSavedSettings.getS32(lastSnapshotHeightName())); +#if 0 // leads to crash later if one of the settings values is 0 + impl.getWidthSpinner(this)->setValue(gSavedSettings.getS32(lastSnapshotWidthName())); + impl.getHeightSpinner(this)->setValue(gSavedSettings.getS32(lastSnapshotHeightName())); +#endif getChild<LLUICtrl>("freeze_frame_check")->setValue(gSavedSettings.getBOOL("UseFreezeFrame")); childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this); @@ -2178,10 +2208,16 @@ BOOL LLFloaterSnapshot::postBuild() getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot")); childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this); + childSetCommitCallback("profile_size_combo", Impl::onCommitResolution, this); childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this); childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this); childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this); + LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1)); + LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1)); + + sThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder"); + // create preview window LLRect full_screen_rect = getRootView()->getRect(); LLSnapshotLivePreview::Params p; @@ -2221,19 +2257,30 @@ void LLFloaterSnapshot::draw() { if(previewp->getThumbnailImage()) { - LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect(); - - S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ; + bool working = impl.getStatus() == Impl::STATUS_WORKING; + const LLRect& thumbnail_rect = getThumbnailPlaceholderRect(); + S32 offset_x = thumbnail_rect.mLeft + (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 ; S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ; glMatrixMode(GL_MODELVIEW); // Apply floater transparency to the texture unless the floater is focused. F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); + LLColor4 color = working ? LLColor4::grey4 : LLColor4::white; gl_draw_scaled_image(offset_x, offset_y, previewp->getThumbnailWidth(), previewp->getThumbnailHeight(), - previewp->getThumbnailImage(), LLColor4::white % alpha); + previewp->getThumbnailImage(), color % alpha); previewp->drawPreviewRect(offset_x, offset_y) ; + + // Draw progress indicators on top of the preview. + if (working) + { + gGL.pushUIMatrix(); + const LLRect& r = getThumbnailPlaceholderRect(); + LLUI::translate((F32) r.mLeft, (F32) r.mBottom); + sThumbnailPlaceholder->draw(); + gGL.popUIMatrix(); + } } } } @@ -2249,6 +2296,9 @@ void LLFloaterSnapshot::onOpen(const LLSD& key) gSnapshotFloaterView->setEnabled(TRUE); gSnapshotFloaterView->setVisible(TRUE); gSnapshotFloaterView->adjustToFitScreen(this, FALSE); + + // Initialize default tab. + getChild<LLSideTrayPanelContainer>("panel_container")->getCurrentPanel()->onOpen(LLSD()); } void LLFloaterSnapshot::onClose(bool app_quitting) @@ -2256,6 +2306,62 @@ void LLFloaterSnapshot::onClose(bool app_quitting) getParent()->setMouseOpaque(FALSE); } +// virtual +S32 LLFloaterSnapshot::notify(const LLSD& info) +{ + // A child panel wants to change snapshot resolution. + if (info.has("combo-res-change")) + { + std::string combo_name = info["combo-res-change"]["control-name"].asString(); + impl.updateResolution(getChild<LLUICtrl>(combo_name), this); + return 1; + } + + if (info.has("custom-res-change")) + { + LLSD res = info["custom-res-change"]; + impl.applyCustomResolution(this, res["w"].asInteger(), res["h"].asInteger()); + return 1; + } + + if (info.has("keep-aspect-change")) + { + impl.applyKeepAspectCheck(this, info["keep-aspect-change"].asBoolean()); + return 1; + } + + if (info.has("image-quality-change")) + { + impl.onImageQualityChange(this, info["image-quality-change"].asInteger()); + return 1; + } + + if (info.has("image-format-change")) + { + impl.onImageFormatChange(this); + return 1; + } + + if (info.has("set-ready")) + { + impl.setStatus(Impl::STATUS_READY); + return 1; + } + + if (info.has("set-working")) + { + impl.setStatus(Impl::STATUS_WORKING); + return 1; + } + + if (info.has("set-finished")) + { + LLSD data = info["set-finished"]; + impl.setStatus(Impl::STATUS_FINISHED, data["ok"].asBoolean(), data["msg"].asString()); + return 1; + } + return 0; +} //static void LLFloaterSnapshot::update() @@ -2276,6 +2382,160 @@ void LLFloaterSnapshot::update() } } +// static +LLFloaterSnapshot* LLFloaterSnapshot::getInstance() +{ + return LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot"); +} + +// static +void LLFloaterSnapshot::saveTexture() +{ + lldebugs << "saveTexture" << llendl; + + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return; + } + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return; + } + + previewp->saveTexture(); +} + +// static +void LLFloaterSnapshot::saveLocal() +{ + lldebugs << "saveLocal" << llendl; + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return; + } + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return; + } + + previewp->saveLocal(); +} + +// static +void LLFloaterSnapshot::preUpdate() +{ + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (instance) + { + // Disable the send/post/save buttons until snapshot is ready. + Impl::updateControls(instance); + } +} + +// static +void LLFloaterSnapshot::postUpdate() +{ + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (instance) + { + // Enable the send/post/save buttons. + Impl::updateControls(instance); + } +} + +// static +void LLFloaterSnapshot::postSave() +{ + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return; + } + + instance->impl.updateControls(instance); + instance->impl.setStatus(Impl::STATUS_WORKING); +} + +// static +void LLFloaterSnapshot::postPanelSwitch() +{ + LLFloaterSnapshot* instance = getInstance(); + instance->impl.updateControls(instance); +} + +// static +LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData() +{ + // FIXME: May not work for textures. + + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return NULL; + } + + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return NULL; + } + + LLPointer<LLImageFormatted> img = previewp->getFormattedImage(); + if (!img.get()) + { + llwarns << "Empty snapshot image data" << llendl; + llassert(img.get() != NULL); + } + + return img; +} + +// static +const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal() +{ + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return LLVector3d::zero; + } + + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return LLVector3d::zero; + } + + return previewp->getPosTakenGlobal(); +} + +// static +void LLFloaterSnapshot::setAgentEmail(const std::string& email) +{ + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); + if (instance) + { + LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container"); + LLPanel* postcard_panel = panel_container->getPanelByName("panel_snapshot_postcard"); + postcard_panel->notify(LLSD().with("agent-email", email)); + } +} ///---------------------------------------------------------------------------- /// Class LLSnapshotFloaterView diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index c92d9efde5..2c79c749d6 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -27,11 +27,15 @@ #ifndef LL_LLFLOATERSNAPSHOT_H #define LL_LLFLOATERSNAPSHOT_H +#include "llimage.h" #include "llfloater.h" +class LLSpinCtrl; class LLFloaterSnapshot : public LLFloater { + LOG_CLASS(LLFloaterSnapshot); + public: typedef enum e_snapshot_format { @@ -47,20 +51,29 @@ public: /*virtual*/ void draw(); /*virtual*/ void onOpen(const LLSD& key); /*virtual*/ void onClose(bool app_quitting); + /*virtual*/ S32 notify(const LLSD& info); static void update(); - - static S32 getUIWinHeightLong() {return sUIWinHeightLong ;} - static S32 getUIWinHeightShort() {return sUIWinHeightShort ;} - static S32 getUIWinWidth() {return sUIWinWidth ;} + + // TODO: create a snapshot model instead + static LLFloaterSnapshot* getInstance(); + static void saveTexture(); + static void saveLocal(); + static void preUpdate(); + static void postUpdate(); + static void postSave(); + static void postPanelSwitch(); + static LLPointer<LLImageFormatted> getImageData(); + static const LLVector3d& getPosTakenGlobal(); + static void setAgentEmail(const std::string& email); + + static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholder->getRect(); } private: + static LLUICtrl* sThumbnailPlaceholder; + class Impl; Impl& impl; - - static S32 sUIWinHeightLong ; - static S32 sUIWinHeightShort ; - static S32 sUIWinWidth ; }; class LLSnapshotFloaterView : public LLFloaterView diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp index 66f644748e..324afe661f 100644 --- a/indra/newview/llfloatertoybox.cpp +++ b/indra/newview/llfloatertoybox.cpp @@ -42,6 +42,7 @@ LLFloaterToybox::LLFloaterToybox(const LLSD& key) , mToolBar(NULL) { mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this)); + mCommitCallbackRegistrar.add("Toybox.ClearAll", boost::bind(&LLFloaterToybox::onBtnClearAll, this)); } LLFloaterToybox::~LLFloaterToybox() @@ -63,6 +64,7 @@ BOOL LLFloaterToybox::postBuild() mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); + mToolBar->setButtonEnterCallback(boost::bind(&LLFloaterToybox::onToolBarButtonEnter,this,_1)); // // Sort commands by localized labels so they will appear alphabetized in all languages @@ -105,8 +107,8 @@ void LLFloaterToybox::draw() { const LLCommandId& id = *it; - const bool commandOnToolbar = gToolBarView->hasCommand(id); - mToolBar->enableCommand(id, !commandOnToolbar); + const bool command_not_present = (gToolBarView->hasCommand(id) == LLToolBarView::TOOLBAR_NONE); + mToolBar->enableCommand(id, command_not_present); } LLFloater::draw(); @@ -120,15 +122,35 @@ static bool finish_restore_toybox(const LLSD& notification, const LLSD& response { LLToolBarView::loadDefaultToolbars(); } + + return false; +} + +static bool finish_clear_all_toybox(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + + if (option == 0) + { + LLToolBarView::clearAllToolbars(); + } + return false; } + static LLNotificationFunctorRegistration finish_restore_toybox_reg("ConfirmRestoreToybox", finish_restore_toybox); +static LLNotificationFunctorRegistration finish_clear_all_toybox_reg("ConfirmClearAllToybox", finish_clear_all_toybox); void LLFloaterToybox::onBtnRestoreDefaults() { LLNotificationsUtil::add("ConfirmRestoreToybox"); } +void LLFloaterToybox::onBtnClearAll() +{ + LLNotificationsUtil::add("ConfirmClearAllToybox"); +} + BOOL LLFloaterToybox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, @@ -140,5 +162,30 @@ BOOL LLFloaterToybox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return mToolBar->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); } +void LLFloaterToybox::onToolBarButtonEnter(LLView* button) +{ + std::string suffix = ""; + + LLCommandId commandId(button->getName()); + LLCommand* command = LLCommandManager::instance().getCommand(commandId); + + if (command) + { + S32 command_loc = gToolBarView->hasCommand(commandId); + + switch(command_loc) + { + case LLToolBarView::TOOLBAR_BOTTOM: suffix = LLTrans::getString("Toolbar_Bottom_Tooltip"); break; + case LLToolBarView::TOOLBAR_LEFT: suffix = LLTrans::getString("Toolbar_Left_Tooltip"); break; + case LLToolBarView::TOOLBAR_RIGHT: suffix = LLTrans::getString("Toolbar_Right_Tooltip"); break; + + default: + break; + } + } + + mToolBar->setTooltipButtonSuffix(suffix); +} + // eof diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h index 62bf68680d..10aee0e6f5 100644 --- a/indra/newview/llfloatertoybox.h +++ b/indra/newview/llfloatertoybox.h @@ -50,8 +50,11 @@ public: std::string& tooltip_msg); protected: + void onBtnClearAll(); void onBtnRestoreDefaults(); + void onToolBarButtonEnter(LLView* button); + public: LLToolBar * mToolBar; }; diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp new file mode 100644 index 0000000000..959edff713 --- /dev/null +++ b/indra/newview/llfloatertranslationsettings.cpp @@ -0,0 +1,296 @@ +/** + * @file llfloatertranslationsettings.cpp + * @brief Machine translation settings for chat + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatertranslationsettings.h" + +// Viewer includes +#include "lltranslate.h" +#include "llviewercontrol.h" // for gSavedSettings + +// Linden library includes +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llfloaterreg.h" +#include "lllineeditor.h" +#include "llnotificationsutil.h" +#include "llradiogroup.h" + +class EnteredKeyVerifier : public LLTranslate::KeyVerificationReceiver +{ +public: + EnteredKeyVerifier(LLTranslate::EService service, bool alert) + : LLTranslate::KeyVerificationReceiver(service) + , mAlert(alert) + { + } + +private: + /*virtual*/ void setVerificationStatus(bool ok) + { + LLFloaterTranslationSettings* floater = + LLFloaterReg::getTypedInstance<LLFloaterTranslationSettings>("prefs_translation"); + + if (!floater) + { + llwarns << "Cannot find translation settings floater" << llendl; + return; + } + + switch (getService()) + { + case LLTranslate::SERVICE_BING: + floater->setBingVerified(ok, mAlert); + break; + case LLTranslate::SERVICE_GOOGLE: + floater->setGoogleVerified(ok, mAlert); + break; + } + } + + bool mAlert; +}; + +LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key) +: LLFloater(key) +, mMachineTranslationCB(NULL) +, mLanguageCombo(NULL) +, mTranslationServiceRadioGroup(NULL) +, mBingAPIKeyEditor(NULL) +, mGoogleAPIKeyEditor(NULL) +, mBingVerifyBtn(NULL) +, mGoogleVerifyBtn(NULL) +, mOKBtn(NULL) +, mBingKeyVerified(false) +, mGoogleKeyVerified(false) +{ +} + +// virtual +BOOL LLFloaterTranslationSettings::postBuild() +{ + mMachineTranslationCB = getChild<LLCheckBoxCtrl>("translate_chat_checkbox"); + mLanguageCombo = getChild<LLComboBox>("translate_language_combo"); + mTranslationServiceRadioGroup = getChild<LLRadioGroup>("translation_service_rg"); + mBingAPIKeyEditor = getChild<LLLineEditor>("bing_api_key"); + mGoogleAPIKeyEditor = getChild<LLLineEditor>("google_api_key"); + mBingVerifyBtn = getChild<LLButton>("verify_bing_api_key_btn"); + mGoogleVerifyBtn = getChild<LLButton>("verify_google_api_key_btn"); + mOKBtn = getChild<LLButton>("ok_btn"); + + mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this)); + mTranslationServiceRadioGroup->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this)); + mOKBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnOK, this)); + getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false)); + mBingVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnBingVerify, this)); + mGoogleVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnGoogleVerify, this)); + + mBingAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); + mBingAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onBingKeyEdited, this), NULL); + mGoogleAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); + mGoogleAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onGoogleKeyEdited, this), NULL); + + center(); + return TRUE; +} + +// virtual +void LLFloaterTranslationSettings::onOpen(const LLSD& key) +{ + mMachineTranslationCB->setValue(gSavedSettings.getBOOL("TranslateChat")); + mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE); + mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE); + + std::string bing_key = gSavedSettings.getString("BingTranslateAPIKey"); + if (!bing_key.empty()) + { + mBingAPIKeyEditor->setText(bing_key); + mBingAPIKeyEditor->setTentative(FALSE); + verifyKey(LLTranslate::SERVICE_BING, bing_key, false); + } + else + { + mBingAPIKeyEditor->setTentative(TRUE); + mBingKeyVerified = FALSE; + } + + std::string google_key = gSavedSettings.getString("GoogleTranslateAPIKey"); + if (!google_key.empty()) + { + mGoogleAPIKeyEditor->setText(google_key); + mGoogleAPIKeyEditor->setTentative(FALSE); + verifyKey(LLTranslate::SERVICE_GOOGLE, google_key, false); + } + else + { + mGoogleAPIKeyEditor->setTentative(TRUE); + mGoogleKeyVerified = FALSE; + } + + updateControlsEnabledState(); +} + +void LLFloaterTranslationSettings::setBingVerified(bool ok, bool alert) +{ + if (alert) + { + showAlert(ok ? "bing_api_key_verified" : "bing_api_key_not_verified"); + } + + mBingKeyVerified = ok; + updateControlsEnabledState(); +} + +void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert) +{ + if (alert) + { + showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified"); + } + + mGoogleKeyVerified = ok; + updateControlsEnabledState(); +} + +std::string LLFloaterTranslationSettings::getSelectedService() const +{ + return mTranslationServiceRadioGroup->getSelectedValue().asString(); +} + +std::string LLFloaterTranslationSettings::getEnteredBingKey() const +{ + return mBingAPIKeyEditor->getTentative() ? LLStringUtil::null : mBingAPIKeyEditor->getText(); +} + +std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const +{ + return mGoogleAPIKeyEditor->getTentative() ? LLStringUtil::null : mGoogleAPIKeyEditor->getText(); +} + +void LLFloaterTranslationSettings::showAlert(const std::string& msg_name) const +{ + LLSD args; + args["MESSAGE"] = getString(msg_name); + LLNotificationsUtil::add("GenericAlert", args); +} + +void LLFloaterTranslationSettings::updateControlsEnabledState() +{ + // Enable/disable controls based on the checkbox value. + bool on = mMachineTranslationCB->getValue().asBoolean(); + std::string service = getSelectedService(); + bool bing_selected = service == "bing"; + bool google_selected = service == "google"; + + mTranslationServiceRadioGroup->setEnabled(on); + mLanguageCombo->setEnabled(on); + + getChild<LLTextBox>("bing_api_key_label")->setEnabled(on); + mBingAPIKeyEditor->setEnabled(on); + + getChild<LLTextBox>("google_api_key_label")->setEnabled(on); + mGoogleAPIKeyEditor->setEnabled(on); + + mBingAPIKeyEditor->setEnabled(on && bing_selected); + mGoogleAPIKeyEditor->setEnabled(on && google_selected); + + mBingVerifyBtn->setEnabled(on && bing_selected && + !mBingKeyVerified && !getEnteredBingKey().empty()); + mGoogleVerifyBtn->setEnabled(on && google_selected && + !mGoogleKeyVerified && !getEnteredGoogleKey().empty()); + + mOKBtn->setEnabled( + !on || ( + (bing_selected && mBingKeyVerified) || + (google_selected && mGoogleKeyVerified) + )); +} + +void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert) +{ + LLTranslate::KeyVerificationReceiverPtr receiver = + new EnteredKeyVerifier((LLTranslate::EService) service, alert); + LLTranslate::verifyKey(receiver, key); +} + +void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control) +{ + LLLineEditor* editor = dynamic_cast<LLLineEditor*>(control); + if (editor && editor->hasTabStop()) // if enabled. getEnabled() doesn't work + { + if (editor->getTentative()) + { + editor->setText(LLStringUtil::null); + editor->setTentative(FALSE); + } + } +} + +void LLFloaterTranslationSettings::onBingKeyEdited() +{ + if (mBingAPIKeyEditor->isDirty()) + { + setBingVerified(false, false); + } +} + +void LLFloaterTranslationSettings::onGoogleKeyEdited() +{ + if (mGoogleAPIKeyEditor->isDirty()) + { + setGoogleVerified(false, false); + } +} + +void LLFloaterTranslationSettings::onBtnBingVerify() +{ + std::string key = getEnteredBingKey(); + if (!key.empty()) + { + verifyKey(LLTranslate::SERVICE_BING, key); + } +} + +void LLFloaterTranslationSettings::onBtnGoogleVerify() +{ + std::string key = getEnteredGoogleKey(); + if (!key.empty()) + { + verifyKey(LLTranslate::SERVICE_GOOGLE, key); + } +} + +void LLFloaterTranslationSettings::onBtnOK() +{ + gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean()); + gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString()); + gSavedSettings.setString("TranslationService", getSelectedService()); + gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey()); + gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey()); + closeFloater(false); +} diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h new file mode 100644 index 0000000000..9b47ad72ed --- /dev/null +++ b/indra/newview/llfloatertranslationsettings.h @@ -0,0 +1,76 @@ +/** + * @file llfloatertranslationsettings.h + * @brief Machine translation settings for chat + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERTRANSLATIONSETTINGS_H +#define LL_LLFLOATERTRANSLATIONSETTINGS_H + +#include "llfloater.h" + +class LLButton; +class LLCheckBoxCtrl; +class LLComboBox; +class LLLineEditor; +class LLRadioGroup; + +class LLFloaterTranslationSettings : public LLFloater +{ +public: + LLFloaterTranslationSettings(const LLSD& key); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + void setBingVerified(bool ok, bool alert); + void setGoogleVerified(bool ok, bool alert); + +private: + std::string getSelectedService() const; + std::string getEnteredBingKey() const; + std::string getEnteredGoogleKey() const; + void showAlert(const std::string& msg_name) const; + void updateControlsEnabledState(); + void verifyKey(int service, const std::string& key, bool alert = true); + + void onEditorFocused(LLFocusableElement* control); + void onBingKeyEdited(); + void onGoogleKeyEdited(); + void onBtnBingVerify(); + void onBtnGoogleVerify(); + void onBtnOK(); + + LLCheckBoxCtrl* mMachineTranslationCB; + LLComboBox* mLanguageCombo; + LLLineEditor* mBingAPIKeyEditor; + LLLineEditor* mGoogleAPIKeyEditor; + LLRadioGroup* mTranslationServiceRadioGroup; + LLButton* mBingVerifyBtn; + LLButton* mGoogleVerifyBtn; + LLButton* mOKBtn; + + bool mBingKeyVerified; + bool mGoogleKeyVerified; +}; + +#endif // LL_LLFLOATERTRANSLATIONSETTINGS_H diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 676eaf825d..a26515821d 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -556,6 +556,10 @@ public: folders_t::const_iterator getFoldersBegin() const { return mFolders.begin(); } folders_t::const_iterator getFoldersEnd() const { return mFolders.end(); } folders_t::size_type getFoldersCount() const { return mFolders.size(); } + + items_t::const_iterator getItemsBegin() const { return mItems.begin(); } + items_t::const_iterator getItemsEnd() const { return mItems.end(); } + items_t::size_type getItemsCount() const { return mItems.size(); } }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index fa3f546157..2b9c113a72 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -240,7 +240,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) gViewerWindow->setup3DRender(); } -const F32 WIND_ALTITUDE = 180.f; +const F32 WIND_RELATIVE_ALTITUDE = 25.f; void LLWind::renderVectors() { @@ -254,13 +254,13 @@ void LLWind::renderVectors() gGL.pushMatrix(); LLVector3 origin_agent; origin_agent = gAgent.getPosAgentFromGlobal(mOriginGlobal); - gGL.translatef(origin_agent.mV[VX], origin_agent.mV[VY], WIND_ALTITUDE); + gGL.translatef(origin_agent.mV[VX], origin_agent.mV[VY], gAgent.getPositionAgent().mV[VZ] + WIND_RELATIVE_ALTITUDE); for (j = 0; j < mSize; j++) { for (i = 0; i < mSize; i++) { - x = mCloudVelX[i + j*mSize] * WIND_SCALE_HACK; - y = mCloudVelY[i + j*mSize] * WIND_SCALE_HACK; + x = mVelX[i + j*mSize] * WIND_SCALE_HACK; + y = mVelY[i + j*mSize] * WIND_SCALE_HACK; gGL.pushMatrix(); gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0); gGL.color3f(0,1,0); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 33cb3a54a7..c8e48b0d42 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -47,12 +47,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed) LLIMFloaterContainer::~LLIMFloaterContainer() { + mNewMessageConnection.disconnect(); LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this); } BOOL LLIMFloaterContainer::postBuild() { - LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1)); + mNewMessageConnection = LLIMModel::instance().mNewMsgSignal.connect(boost::bind(&LLIMFloaterContainer::onNewMessageReceived, this, _1)); // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button // mTabContainer will be initialized in LLMultiFloater::addChild() return TRUE; diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 53dfcd78ff..892ecef48d 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -62,7 +62,7 @@ public: private: typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t; avatarID_panel_map_t mSessions; - + boost::signals2::connection mNewMessageConnection; void onNewMessageReceived(const LLSD& data); }; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 6e9baed5f2..ed4bb727cd 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1679,13 +1679,44 @@ BOOL LLCallDialog::postBuild() { if (!LLDockableFloater::postBuild() || !gToolBarView) return FALSE; + + dockToToolbarButton("speak"); + + return TRUE; +} + +void LLCallDialog::dockToToolbarButton(const std::string& toolbarButtonName) +{ + LLDockControl::DocAt dock_pos = getDockControlPos(toolbarButtonName); + LLView *anchor_panel = gToolBarView->findChildView(toolbarButtonName); - LLView *anchor_panel = gToolBarView->findChildView("speak"); - setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP)); + setUseTongue(anchor_panel); - return TRUE; + setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(dock_pos), dock_pos)); } +LLDockControl::DocAt LLCallDialog::getDockControlPos(const std::string& toolbarButtonName) +{ + LLCommandId command_id(toolbarButtonName); + S32 toolbar_loc = gToolBarView->hasCommand(command_id); + + LLDockControl::DocAt doc_at = LLDockControl::TOP; + + switch (toolbar_loc) + { + case LLToolBarView::TOOLBAR_LEFT: + doc_at = LLDockControl::RIGHT; + break; + + case LLToolBarView::TOOLBAR_RIGHT: + doc_at = LLDockControl::LEFT; + break; + } + + return doc_at; +} + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLOutgoingCallDialog //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 93b604d36a..b1be26a169 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -491,14 +491,16 @@ class LLCallDialog : public LLDockableFloater { public: LLCallDialog(const LLSD& payload); - ~LLCallDialog(); + virtual ~LLCallDialog(); virtual BOOL postBuild(); + void dockToToolbarButton(const std::string& toolbarButtonName); + // check timer state /*virtual*/ void draw(); /*virtual*/ void onOpen(const LLSD& key); - + protected: // lifetime timer for a notification LLTimer mLifetimeTimer; @@ -519,6 +521,9 @@ protected: void setIcon(const LLSD& session_id, const LLSD& participant_id); LLSD mPayload; + +private: + LLDockControl::DocAt getDockControlPos(const std::string& toolbarButtonName); }; class LLIncomingCallDialog : public LLCallDialog diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0e27bd81be..0c092e9a56 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2027,7 +2027,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, #endif } } - if (move_is_into_outbox && !move_is_from_outbox) + else if (move_is_into_outbox && !move_is_from_outbox) { dropFolderToOutbox(inv_cat); } @@ -3544,10 +3544,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // because they must contain only links to wearable items. accept = !(move_is_into_current_outfit || move_is_into_outfit); - if(drop) + if(accept && drop) { - copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), - LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); + copy_inventory_from_notecard(mUUID, // Drop to the chosen destination folder + LLToolDragAndDrop::getInstance()->getObjectID(), + LLToolDragAndDrop::getInstance()->getSourceID(), + inv_item); } } else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index e86c427ae2..dc25689fa3 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -2528,9 +2528,9 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) { LLPointer<LLViewerInventoryCategory> tfolder = new LLViewerInventoryCategory(gAgent.getID()); tfolder->unpackMessage(msg, _PREHASH_FolderData, i); - //llinfos << "unpaked folder '" << tfolder->getName() << "' (" - // << tfolder->getUUID() << ") in " << tfolder->getParentUUID() - // << llendl; + llinfos << "unpacked folder '" << tfolder->getName() << "' (" + << tfolder->getUUID() << ") in " << tfolder->getParentUUID() + << llendl; if(tfolder->getUUID().notNull()) { folders.push_back(tfolder); @@ -2570,8 +2570,8 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) { LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem; titem->unpackMessage(msg, _PREHASH_ItemData, i); - //llinfos << "unpaked item '" << titem->getName() << "' in " - // << titem->getParentUUID() << llendl; + llinfos << "unpaked item '" << titem->getName() << "' in " + << titem->getParentUUID() << llendl; U32 callback_id; msg->getU32Fast(_PREHASH_ItemData, _PREHASH_CallbackID, callback_id); if(titem->getUUID().notNull()) @@ -2879,40 +2879,62 @@ BOOL LLInventoryModel::getIsFirstTimeInViewer2() return sFirstTimeInViewer2; } -static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInventoryModel::item_array_t& items, const LLUUID& id) +LLInventoryModel::item_array_t::iterator LLInventoryModel::findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) { - LLInventoryModel::item_array_t::iterator result = items.end(); + LLInventoryModel::item_array_t::iterator curr_item = items.begin(); - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + while (curr_item != items.end()) { - if ((*i)->getUUID() == id) + if ((*curr_item)->getUUID() == id) { - result = i; break; } + ++curr_item; } - return result; + return curr_item; } // static // * @param[in, out] items - vector with items to be updated. It should be sorted in a right way // * before calling this method. // * @param src_item_id - LLUUID of inventory item to be moved in new position -// * @param dest_item_id - LLUUID of inventory item before which source item should be placed. -void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id) +// * @param dest_item_id - LLUUID of inventory item before (or after) which source item should +// * be placed. +// * @param insert_before - bool indicating if src_item_id should be placed before or after +// * dest_item_id. Default is true. +void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id, bool insert_before) { - LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id); - LLInventoryModel::item_array_t::iterator it_dest = find_item_iter_by_uuid(items, dest_item_id); + LLInventoryModel::item_array_t::iterator it_src = findItemIterByUUID(items, src_item_id); + LLInventoryModel::item_array_t::iterator it_dest = findItemIterByUUID(items, dest_item_id); - if (it_src == items.end() || it_dest == items.end()) return; + // If one of the passed UUID is not in the item list, bail out + if ((it_src == items.end()) || (it_dest == items.end())) + return; + // Erase the source element from the list, keep a copy before erasing. LLViewerInventoryItem* src_item = *it_src; items.erase(it_src); - // target iterator can not be valid because the container was changed, so update it. - it_dest = find_item_iter_by_uuid(items, dest_item_id); - items.insert(it_dest, src_item); + // Note: Target iterator is not valid anymore because the container was changed, so update it. + it_dest = findItemIterByUUID(items, dest_item_id); + + // Go to the next element if one wishes to insert after the dest element + if (!insert_before) + { + ++it_dest; + } + + // Reinsert the source item in the right place + if (it_dest != items.end()) + { + items.insert(it_dest, src_item); + } + else + { + // Append to the list if it_dest reached the end + items.push_back(src_item); + } } //* @param[in] items vector of items in order to be saved. diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index e0e81f1006..a0fd455cf3 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -332,11 +332,16 @@ protected: //-------------------------------------------------------------------- public: // Changes items order by insertion of the item identified by src_item_id - // before the item identified by dest_item_id. Both items must exist in items array. - // Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id. + // before (or after) the item identified by dest_item_id. Both items must exist in items array. + // Sorting is stored after method is finished. Only src_item_id is moved before (or after) dest_item_id. + // The parameter "insert_before" controls on which side of dest_item_id src_item_id gets rensinserted. static void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, - const LLUUID& dest_item_id); + const LLUUID& dest_item_id, + bool insert_before = true); + // Gets an iterator on an item vector knowing only the item UUID. + // Returns end() of the vector if not found. + static LLInventoryModel::item_array_t::iterator findItemIterByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id); // Saves current order of the passed items using inventory item sort field. // Resets 'items' sort fields and saves them on server. diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 1f1e49726d..58ba0219cc 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -68,7 +68,6 @@ static LLDefaultChildRegistry::Register<LLMediaCtrl> r("web_browser"); LLMediaCtrl::Params::Params() : start_url("start_url"), border_visible("border_visible", true), - ignore_ui_scale("ignore_ui_scale", true), decouple_texture_size("decouple_texture_size", false), texture_width("texture_width", 1024), texture_height("texture_height", 1024), @@ -89,7 +88,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mFrequentUpdates( true ), mForceUpdate( false ), mHomePageUrl( "" ), - mIgnoreUIScale( true ), mAlwaysRefresh( false ), mMediaSource( 0 ), mTakeFocusOnClick( p.focus_on_click ), @@ -112,8 +110,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : setCaretColor( (unsigned int)color.mV[0], (unsigned int)color.mV[1], (unsigned int)color.mV[2] ); } - setIgnoreUIScale(p.ignore_ui_scale); - setHomePageUrl(p.start_url, p.initial_mime_type); setBorderVisible(p.border_visible); @@ -124,10 +120,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : if(!getDecoupleTextureSize()) { - S32 screen_width = mIgnoreUIScale ? - llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]) : getRect().getWidth(); - S32 screen_height = mIgnoreUIScale ? - llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight(); + S32 screen_width = llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]); + S32 screen_height = llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]); setTextureSize(screen_width, screen_height); } @@ -471,8 +465,8 @@ void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent ) { if(!getDecoupleTextureSize()) { - S32 screen_width = mIgnoreUIScale ? llround((F32)width * LLUI::sGLScaleFactor.mV[VX]) : width; - S32 screen_height = mIgnoreUIScale ? llround((F32)height * LLUI::sGLScaleFactor.mV[VY]) : height; + S32 screen_width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); + S32 screen_height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]); // when floater is minimized, these sizes are negative if ( screen_height > 0 && screen_width > 0 ) @@ -689,6 +683,8 @@ bool LLMediaCtrl::ensureMediaSourceExists() mMediaSource->addObserver( this ); mMediaSource->setBackgroundColor( getBackgroundColor() ); mMediaSource->setTrustedBrowser(mTrusted); + mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); + if(mClearCache) { mMediaSource->clearCache(); @@ -770,15 +766,7 @@ void LLMediaCtrl::draw() { gGL.pushUIMatrix(); { - if (mIgnoreUIScale) - { - gGL.loadUIIdentity(); - // font system stores true screen origin, need to scale this by UI scale factor - // to get render origin for this view (with unit scale) - gGL.translateUI(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]), - floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]), - LLFontGL::sCurOrigin.mZ); - } + mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); // scale texture to fit the space using texture coords gGL.getTexUnit(0)->bind(media_texture); @@ -826,14 +814,6 @@ void LLMediaCtrl::draw() x_offset = (r.getWidth() - width) / 2; y_offset = (r.getHeight() - height) / 2; - if(mIgnoreUIScale) - { - x_offset = llround((F32)x_offset * LLUI::sGLScaleFactor.mV[VX]); - y_offset = llround((F32)y_offset * LLUI::sGLScaleFactor.mV[VY]); - width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); - height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]); - } - // draw the browser gGL.begin( LLRender::QUADS ); if (! media_plugin->getTextureCoordsOpenGL()) @@ -900,14 +880,14 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y) coords_opengl = mMediaSource->getMediaPlugin()->getTextureCoordsOpenGL(); } - x = mIgnoreUIScale ? llround((F32)x * LLUI::sGLScaleFactor.mV[VX]) : x; + x = llround((F32)x * LLUI::sGLScaleFactor.mV[VX]); if ( ! coords_opengl ) { - y = mIgnoreUIScale ? llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]) : y; + y = llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]); } else { - y = mIgnoreUIScale ? llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]) : getRect().getHeight() - y; + y = llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]); }; } diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 3c0436e27a..7f2a5e1642 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -51,7 +51,6 @@ public: Optional<std::string> start_url; Optional<bool> border_visible, - ignore_ui_scale, hide_loading, decouple_texture_size, trusted_content, @@ -125,9 +124,6 @@ public: bool getFrequentUpdates() { return mFrequentUpdates; }; void setFrequentUpdates( bool frequentUpdatesIn ) { mFrequentUpdates = frequentUpdatesIn; }; - void setIgnoreUIScale(bool ignore) { mIgnoreUIScale = ignore; } - bool getIgnoreUIScale() { return mIgnoreUIScale; } - void setAlwaysRefresh(bool refresh) { mAlwaysRefresh = refresh; } bool getAlwaysRefresh() { return mAlwaysRefresh; } @@ -181,28 +177,29 @@ public: const S32 mTextureDepthBytes; LLUUID mMediaTextureID; LLViewBorder* mBorder; - bool mFrequentUpdates; - bool mForceUpdate; - bool mTrusted; - std::string mHomePageUrl; - std::string mHomePageMimeType; - std::string mCurrentNavUrl; - std::string mErrorPageURL; - std::string mTarget; - bool mIgnoreUIScale; - bool mAlwaysRefresh; + bool mFrequentUpdates, + mForceUpdate, + mTrusted, + mAlwaysRefresh, + mTakeFocusOnClick, + mStretchToFill, + mMaintainAspectRatio, + mHideLoading, + mHidingInitialLoad, + mClearCache, + mHoverTextChanged, + mDecoupleTextureSize; + + std::string mHomePageUrl, + mHomePageMimeType, + mCurrentNavUrl, + mErrorPageURL, + mTarget; viewer_media_t mMediaSource; - bool mTakeFocusOnClick; - bool mStretchToFill; - bool mMaintainAspectRatio; - bool mHideLoading; - bool mHidingInitialLoad; - bool mDecoupleTextureSize; - S32 mTextureWidth; - S32 mTextureHeight; - bool mClearCache; + S32 mTextureWidth, + mTextureHeight; + class LLWindowShade* mWindowShade; - bool mHoverTextChanged; LLContextMenu* mContextMenu; }; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 3418462192..a7303ad035 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -60,13 +60,9 @@ static const S32 RESIZE_BAR_THICKNESS = 3; static LLRegisterPanelClassWrapper<LLNearbyChat> t_panel_nearby_chat("panel_nearby_chat"); -LLNearbyChat::LLNearbyChat() - : LLPanel() - ,mChatHistory(NULL) -{ -} - -LLNearbyChat::~LLNearbyChat() +LLNearbyChat::LLNearbyChat(const LLNearbyChat::Params& p) +: LLPanel(p), + mChatHistory(NULL) { } @@ -178,15 +174,20 @@ bool LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata) return false; } +void LLNearbyChat::removeScreenChat() +{ + LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); + if(chat_channel) + { + chat_channel->removeToastsFromChannel(); + } +} + void LLNearbyChat::setVisible(BOOL visible) { if(visible) { - LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); - if(chat_channel) - { - chat_channel->removeToastsFromChannel(); - } + removeScreenChat(); } LLPanel::setVisible(visible); diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 5ef584c8ff..7c5975cbc5 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -37,8 +37,7 @@ class LLChatHistory; class LLNearbyChat: public LLPanel { public: - LLNearbyChat(); - ~LLNearbyChat(); + LLNearbyChat(const Params& p = LLPanel::getDefaultParams()); BOOL postBuild (); @@ -63,13 +62,14 @@ public: void loadHistory(); static LLNearbyChat* getInstance(); + void removeScreenChat(); private: void getAllowedRect (LLRect& rect); void onNearbySpeakers (); - + private: LLHandle<LLView> mPopupMenuHandle; diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index a811332261..114472ba56 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -47,6 +47,7 @@ #include "llviewerwindow.h" #include "llrootview.h" #include "llviewerchat.h" +#include "llnearbychat.h" #include "llresizehandle.h" @@ -147,12 +148,12 @@ LLNearbyChatBar* LLNearbyChatBar::getInstance() void LLNearbyChatBar::showHistory() { + openFloater(); + if (!getChildView("nearby_chat")->getVisible()) { onToggleNearbyChatPanel(); } - - openFloater(); } void LLNearbyChatBar::draw() @@ -379,7 +380,10 @@ void LLNearbyChatBar::onToggleNearbyChatPanel() if (nearby_chat->getVisible()) { - mExpandedHeight = getRect().getHeight(); + if (!isMinimized()) + { + mExpandedHeight = getRect().getHeight(); + } setResizeLimits(getMinWidth(), COLLAPSED_HEIGHT); nearby_chat->setVisible(FALSE); reshape(getRect().getWidth(), COLLAPSED_HEIGHT); @@ -396,6 +400,17 @@ void LLNearbyChatBar::onToggleNearbyChatPanel() } } +void LLNearbyChatBar::setMinimized(BOOL b) +{ + LLNearbyChat* nearby_chat = getChild<LLNearbyChat>("nearby_chat"); + // when unminimizing with nearby chat visible, go ahead and kill off screen chats + if (!b && nearby_chat->getVisible()) + { + nearby_chat->removeScreenChat(); + } + LLFloater::setMinimized(b); +} + void LLNearbyChatBar::onChatBoxCommit() { if (mChatBox->getText().length() > 0) diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index bc00c1b9fc..e9734899b3 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -60,6 +60,7 @@ public: static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate); void showHistory(); + /*virtual*/void setMinimized(BOOL b); protected: static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str); diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 330a21ef65..c43c95a366 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -568,7 +568,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, // WARNING - not sChatWatcher->post(notification); - if( chat_bar->getVisible() && nearby_chat->getVisible() + if( !chat_bar->isMinimized() + && nearby_chat->isInVisibleChain() || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT && gSavedSettings.getBOOL("UseChatBubbles") ) || !mChannel->getShowToasts() ) // to prevent toasts in Busy mode diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 2a08a29842..aa009a76fa 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -29,6 +29,7 @@ #include "llfloaterreg.h" #include "llnearbychat.h" +#include "llnearbychatbar.h" #include "llnotificationhandler.h" #include "llnotifications.h" #include "lltoastnotifypanel.h" @@ -93,7 +94,8 @@ bool LLTipHandler::processNotification(const LLSD& notify) // don't show toast if Nearby Chat is opened LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); - if (nearby_chat->getVisible()) + LLNearbyChatBar* nearby_chat_bar = LLNearbyChatBar::getInstance(); + if (nearby_chat_bar->getVisible() && nearby_chat->getVisible()) { return false; } diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 8477219f87..e66dd5690c 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -1431,7 +1431,7 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg, LLSD substitution; // We don't do time zone corrections of the calculated number of seconds // because we don't have a full time stamp, only a date. - substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", start_date); + substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", start_date); LLStringUtil::format (time_str, substitution); text.append(time_str); @@ -1442,7 +1442,7 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg, text.append(LLTrans::getString("NextStipendDay")); time_str = date_format_str; - substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", next_stipend_date); + substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%Y-%m-%d", next_stipend_date); LLStringUtil::format (time_str, substitution); text.append(time_str); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index a65631b8d8..c7454e85a9 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -1399,10 +1399,6 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin inventory_list->restoreFolderState(); } - // Open the immediate children of the root folder, since those - // are invisible in the UI and thus must always be open. - inventory_list->getRootFolder()->openTopLevelFolders(); - if (inventory_list->getFilterSubString().empty() && string.empty()) { // current filter and new filter empty, do nothing diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index d6c407d548..9944b51902 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -111,7 +111,7 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p) mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2)); - mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); + //mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this)); mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this)); mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2)); diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp index ac528947a4..7cb4bbf891 100644 --- a/indra/newview/llpanelmarketplaceinbox.cpp +++ b/indra/newview/llpanelmarketplaceinbox.cpp @@ -151,6 +151,20 @@ U32 LLPanelMarketplaceInbox::getFreshItemCount() const fresh_item_count++; } } + + LLFolderViewFolder::items_t::const_iterator items_it = inbox_folder->getItemsBegin(); + LLFolderViewFolder::items_t::const_iterator items_end = inbox_folder->getItemsEnd(); + + for (; items_it != items_end; ++items_it) + { + const LLFolderViewItem * item_view = *items_it; + const LLInboxFolderViewItem * inbox_item_view = dynamic_cast<const LLInboxFolderViewItem*>(item_view); + + if (inbox_item_view && inbox_item_view->isFresh()) + { + fresh_item_count++; + } + } } } @@ -171,6 +185,7 @@ U32 LLPanelMarketplaceInbox::getTotalItemCount() const if (inbox_folder) { item_count += inbox_folder->getFoldersCount(); + item_count += inbox_folder->getItemsCount(); } } diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index 2e4bf55d51..df89adb8da 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -45,6 +45,7 @@ static LLDefaultChildRegistry::Register<LLInboxInventoryPanel> r1("inbox_inventory_panel"); static LLDefaultChildRegistry::Register<LLInboxFolderViewFolder> r2("inbox_folder_view_folder"); +static LLDefaultChildRegistry::Register<LLInboxFolderViewItem> r3("inbox_folder_view_item"); // @@ -137,7 +138,7 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge) { - LLFolderViewItem::Params params; + LLInboxFolderViewItem::Params params; params.name = bridge->getDisplayName(); params.icon = bridge->getIcon(); @@ -171,10 +172,6 @@ LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p) #endif } -LLInboxFolderViewFolder::~LLInboxFolderViewFolder() -{ -} - // virtual void LLInboxFolderViewFolder::draw() { @@ -190,6 +187,20 @@ void LLInboxFolderViewFolder::draw() LLFolderViewFolder::draw(); } +void LLInboxFolderViewFolder::selectItem() +{ + LLFolderViewFolder::selectItem(); + + deFreshify(); +} + +void LLInboxFolderViewFolder::toggleOpen() +{ + LLFolderViewFolder::toggleOpen(); + + deFreshify(); +} + void LLInboxFolderViewFolder::computeFreshness() { const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity"); @@ -218,20 +229,6 @@ void LLInboxFolderViewFolder::deFreshify() gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); } -void LLInboxFolderViewFolder::selectItem() -{ - LLFolderViewFolder::selectItem(); - - deFreshify(); -} - -void LLInboxFolderViewFolder::toggleOpen() -{ - LLFolderViewFolder::toggleOpen(); - - deFreshify(); -} - void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc) { mCreationDate = creation_date_utc; @@ -246,9 +243,85 @@ void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc) // LLInboxFolderViewItem Implementation // +LLInboxFolderViewItem::LLInboxFolderViewItem(const Params& p) + : LLFolderViewItem(p) + , LLBadgeOwner(getHandle()) + , mFresh(false) +{ +#if SUPPORTING_FRESH_ITEM_COUNT + initBadgeParams(p.new_badge()); +#endif +} + +BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root) +{ + BOOL retval = LLFolderViewItem::addToFolder(folder, root); + +#if SUPPORTING_FRESH_ITEM_COUNT + // Compute freshness if our parent is the root folder for the inbox + if (mParentFolder == mRoot) + { + computeFreshness(); + } +#endif + + return retval; +} + BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask) { return TRUE; } +// virtual +void LLInboxFolderViewItem::draw() +{ +#if SUPPORTING_FRESH_ITEM_COUNT + if (!badgeHasParent()) + { + addBadgeToParentPanel(); + } + + setBadgeVisibility(mFresh); +#endif + + LLFolderViewItem::draw(); +} + +void LLInboxFolderViewItem::selectItem() +{ + LLFolderViewItem::selectItem(); + + deFreshify(); +} + +void LLInboxFolderViewItem::computeFreshness() +{ + const U32 last_expansion_utc = gSavedPerAccountSettings.getU32("LastInventoryInboxActivity"); + + if (last_expansion_utc > 0) + { + mFresh = (mCreationDate > last_expansion_utc); + +#if DEBUGGING_FRESHNESS + if (mFresh) + { + llinfos << "Item is fresh! -- creation " << mCreationDate << ", saved_freshness_date " << last_expansion_utc << llendl; + } +#endif + } + else + { + mFresh = true; + } +} + +void LLInboxFolderViewItem::deFreshify() +{ + mFresh = false; + + gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); +} + + // eof diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 46eeb9ea7f..d6b827ee3e 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -69,16 +69,15 @@ public: }; LLInboxFolderViewFolder(const Params& p); - ~LLInboxFolderViewFolder(); - + void draw(); - void computeFreshness(); - void deFreshify(); - void selectItem(); void toggleOpen(); + void computeFreshness(); + void deFreshify(); + bool isFresh() const { return mFresh; } protected: @@ -88,15 +87,35 @@ protected: }; -class LLInboxFolderViewItem : public LLFolderViewItem +class LLInboxFolderViewItem : public LLFolderViewItem, public LLBadgeOwner { public: - LLInboxFolderViewItem(const Params& p) - : LLFolderViewItem(p) + struct Params : public LLInitParam::Block<Params, LLFolderViewItem::Params> { - } + Optional<LLBadge::Params> new_badge; + + Params() + : new_badge("new_badge") + { + } + }; + LLInboxFolderViewItem(const Params& p); + + BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root); BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + + void draw(); + + void selectItem(); + + void computeFreshness(); + void deFreshify(); + + bool isFresh() const { return mFresh; } + +protected: + bool mFresh; }; #endif //LL_INBOXINVENTORYPANEL_H diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 72c6be4c79..04e78e04e3 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -130,11 +130,11 @@ public: void createPick() { - LLSD params; - params["id"] = gAgent.getID(); - params["open_tab_name"] = "panel_picks"; - params["show_tab_panel"] = "create_pick"; - LLFloaterSidePanelContainer::showPanel("my_profile", params); + // open the new pick panel on the Picks floater + LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); + + LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); + picks->createNewPick(); } void editPick(LLPickData* pick_info) @@ -247,12 +247,11 @@ public: void createClassified() { - // open the new classified panel on the Me > Picks sidetray - LLSD params; - params["id"] = gAgent.getID(); - params["open_tab_name"] = "panel_picks"; - params["show_tab_panel"] = "create_classified"; - LLFloaterSidePanelContainer::showPanel("my_profile", params); + // open the new classified panel on the Picks floater + LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); + + LLPanelPicks* picks = picks_floater->findChild<LLPanelPicks>("panel_picks"); + picks->createNewClassified(); } void openClassified(LLAvatarClassifiedInfo* c_info) diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 29db110523..3bb7413ac3 100755 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -82,6 +82,9 @@ public: // parent panels failed to work (picks related code was in my profile panel) void setProfilePanel(LLPanelProfile* profile_panel); + void createNewPick(); + void createNewClassified(); + protected: /*virtual*/void updateButtons(); @@ -115,9 +118,6 @@ private: bool onEnableMenuItem(const LLSD& user_data); - void createNewPick(); - void createNewClassified(); - void openPickInfo(); void openClassifiedInfo(); void openClassifiedInfo(const LLSD& params); diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 7f8f9b29af..6d321d4716 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -82,6 +82,7 @@ static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; static const std::string LANDMARK_INFO_TYPE = "landmark"; static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; +static const std::string LANDMARK_TAB_INFO_TYPE = "open_landmark_tab"; // Support for secondlife:///app/parcel/{UUID}/about SLapps class LLParcelHandler : public LLCommandHandler @@ -365,83 +366,104 @@ void LLPanelPlaces::onOpen(const LLSD& key) if (key.size() != 0) { - mFilterEditor->clear(); - onFilterEdit("", false); - - mPlaceInfoType = key["type"].asString(); - mPosGlobal.setZero(); - mItem = NULL; - isLandmarkEditModeOn = false; - togglePlaceInfoPanel(TRUE); - - if (mPlaceInfoType == AGENT_INFO_TYPE) + std::string key_type = key["type"].asString(); + if (key_type == LANDMARK_TAB_INFO_TYPE) { - mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); + // Small hack: We need to toggle twice. The first toggle moves from the Landmark + // or Teleport History info panel to the Landmark or Teleport History list panel. + // For this first toggle, the mPlaceInfoType should be the one previously used so + // that the state can be corretly set. + // The second toggle forces the list to be set to Landmark. + // This avoids extracting and duplicating all the state logic from togglePlaceInfoPanel() + // here or some specific private method + togglePlaceInfoPanel(FALSE); + mPlaceInfoType = key_type; + togglePlaceInfoPanel(FALSE); + // Update the active tab + onTabSelected(); + // Update the buttons at the bottom of the panel + updateVerbs(); } - else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) + else { - mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); + mFilterEditor->clear(); + onFilterEdit("", false); - if (key.has("x") && key.has("y") && key.has("z")) + mPlaceInfoType = key_type; + mPosGlobal.setZero(); + mItem = NULL; + isLandmarkEditModeOn = false; + togglePlaceInfoPanel(TRUE); + + if (mPlaceInfoType == AGENT_INFO_TYPE) { - mPosGlobal = LLVector3d(key["x"].asReal(), - key["y"].asReal(), - key["z"].asReal()); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); } - else + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) { - mPosGlobal = gAgent.getPositionGlobal(); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); + + if (key.has("x") && key.has("y") && key.has("z")) + { + mPosGlobal = LLVector3d(key["x"].asReal(), + key["y"].asReal(), + key["z"].asReal()); + } + else + { + mPosGlobal = gAgent.getPositionGlobal(); + } + + mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); + + mSaveBtn->setEnabled(FALSE); } - - mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); - - mSaveBtn->setEnabled(FALSE); - } - else if (mPlaceInfoType == LANDMARK_INFO_TYPE) - { - mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); - - LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); - if (!item) - return; - - setItem(item); - } - else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) - { - if (key.has("id")) + else if (mPlaceInfoType == LANDMARK_INFO_TYPE) { - LLUUID parcel_id = key["id"].asUUID(); - mPlaceProfile->setParcelID(parcel_id); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); - // query the server to get the global 3D position of this - // parcel - we need this for teleport/mapping functions. - mRemoteParcelObserver->setParcelID(parcel_id); + LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); + if (!item) + return; + + setItem(item); } - else + else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { - mPosGlobal = LLVector3d(key["x"].asReal(), - key["y"].asReal(), - key["z"].asReal()); - mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + if (key.has("id")) + { + LLUUID parcel_id = key["id"].asUUID(); + mPlaceProfile->setParcelID(parcel_id); + + // query the server to get the global 3D position of this + // parcel - we need this for teleport/mapping functions. + mRemoteParcelObserver->setParcelID(parcel_id); + } + else + { + mPosGlobal = LLVector3d(key["x"].asReal(), + key["y"].asReal(), + key["z"].asReal()); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + } + + mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); } + else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + S32 index = key["id"].asInteger(); - mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); - } - else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) - { - S32 index = key["id"].asInteger(); + const LLTeleportHistoryStorage::slurl_list_t& hist_items = + LLTeleportHistoryStorage::getInstance()->getItems(); - const LLTeleportHistoryStorage::slurl_list_t& hist_items = - LLTeleportHistoryStorage::getInstance()->getItems(); + mPosGlobal = hist_items[index].mGlobalPos; - mPosGlobal = hist_items[index].mGlobalPos; + mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + } - mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); - mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + updateVerbs(); } - - updateVerbs(); } LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -942,7 +964,8 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) } } else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_INFO_TYPE) + mPlaceInfoType == LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) { mLandmarkInfo->setVisible(visible); @@ -960,13 +983,15 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) { LLLandmarksPanel* landmarks_panel = dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName("Landmarks")); - if (landmarks_panel && mItem.notNull()) + if (landmarks_panel) { // If a landmark info is being closed we open the landmarks tab // and set this landmark selected. mTabContainer->selectTabPanel(landmarks_panel); - - landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); + if (mItem.notNull()) + { + landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); + } } } } @@ -1163,7 +1188,8 @@ LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel() return mPlaceProfile; } else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_INFO_TYPE) + mPlaceInfoType == LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) { return mLandmarkInfo; } diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp new file mode 100644 index 0000000000..fdae521ac5 --- /dev/null +++ b/indra/newview/llpanelsnapshot.cpp @@ -0,0 +1,195 @@ +/** + * @file llpanelsnapshot.cpp + * @brief Snapshot panel base class + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelsnapshot.h" + +// libs +#include "llcombobox.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" +#include "lltrans.h" + +// newview +#include "llsidetraypanelcontainer.h" +#include "llviewercontrol.h" // gSavedSettings + +// virtual +BOOL LLPanelSnapshot::postBuild() +{ + getChild<LLUICtrl>(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onResolutionComboCommit, this, _1)); + getChild<LLUICtrl>(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this)); + getChild<LLUICtrl>(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onCustomResolutionCommit, this)); + getChild<LLUICtrl>(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onKeepAspectRatioCommit, this, _1)); + + updateControls(LLSD()); + return TRUE; +} + +// virtual +void LLPanelSnapshot::onOpen(const LLSD& key) +{ + S32 old_format = gSavedSettings.getS32("SnapshotFormat"); + S32 new_format = (S32) getImageFormat(); + + gSavedSettings.setS32("SnapshotFormat", new_format); + setCtrlsEnabled(true); + + // Switching panels will likely change image format. + // Not updating preview right away may lead to errors, + // e.g. attempt to send a large BMP image by email. + if (old_format != new_format) + { + LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); + } + + updateCustomResControls(); +} + +LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const +{ + return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; +} + +LLSpinCtrl* LLPanelSnapshot::getWidthSpinner() +{ + return getChild<LLSpinCtrl>(getWidthSpinnerName()); +} + +LLSpinCtrl* LLPanelSnapshot::getHeightSpinner() +{ + return getChild<LLSpinCtrl>(getHeightSpinnerName()); +} + +S32 LLPanelSnapshot::getTypedPreviewWidth() const +{ + return getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger(); +} + +S32 LLPanelSnapshot::getTypedPreviewHeight() const +{ + return getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger(); +} + +void LLPanelSnapshot::enableAspectRatioCheckbox(BOOL enable) +{ + getChild<LLUICtrl>(getAspectRatioCBName())->setEnabled(enable); +} + +LLSideTrayPanelContainer* LLPanelSnapshot::getParentContainer() +{ + LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); + if (!parent) + { + llwarns << "Cannot find panel container" << llendl; + return NULL; + } + + return parent; +} + +// virtual +void LLPanelSnapshot::updateCustomResControls() +{ + LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName()); + S32 selected_idx = combo->getFirstSelectedIndex(); + const bool enable = selected_idx == (combo->getItemCount() - 1); // Current Window or Custom selected + + getChild<LLUICtrl>(getWidthSpinnerName())->setEnabled(enable); + getChild<LLSpinCtrl>(getWidthSpinnerName())->setAllowEdit(enable); + getChild<LLUICtrl>(getHeightSpinnerName())->setEnabled(enable); + getChild<LLSpinCtrl>(getHeightSpinnerName())->setAllowEdit(enable); + enableAspectRatioCheckbox(enable); +} + +void LLPanelSnapshot::updateImageQualityLevel() +{ + LLSliderCtrl* quality_slider = getChild<LLSliderCtrl>("image_quality_slider"); + S32 quality_val = llfloor((F32) quality_slider->getValue().asReal()); + + std::string quality_lvl; + + if (quality_val < 20) + { + quality_lvl = LLTrans::getString("snapshot_quality_very_low"); + } + else if (quality_val < 40) + { + quality_lvl = LLTrans::getString("snapshot_quality_low"); + } + else if (quality_val < 60) + { + quality_lvl = LLTrans::getString("snapshot_quality_medium"); + } + else if (quality_val < 80) + { + quality_lvl = LLTrans::getString("snapshot_quality_high"); + } + else + { + quality_lvl = LLTrans::getString("snapshot_quality_very_high"); + } + + getChild<LLTextBox>("image_quality_level")->setTextArg("[QLVL]", quality_lvl); +} + +void LLPanelSnapshot::goBack() +{ + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPreviousPanel(); + parent->getCurrentPanel()->onOpen(LLSD()); + } +} + +void LLPanelSnapshot::cancel() +{ + goBack(); + LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-ready", true)); +} + +void LLPanelSnapshot::onCustomResolutionCommit() +{ + LLSD info; + info["w"] = getChild<LLUICtrl>(getWidthSpinnerName())->getValue().asInteger(); + info["h"] = getChild<LLUICtrl>(getHeightSpinnerName())->getValue().asInteger(); + LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info)); +} + +void LLPanelSnapshot::onResolutionComboCommit(LLUICtrl* ctrl) +{ + updateCustomResControls(); + + LLSD info; + info["combo-res-change"]["control-name"] = ctrl->getName(); + LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshot::onKeepAspectRatioCommit(LLUICtrl* ctrl) +{ + LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean())); +} diff --git a/indra/newview/llpanelsnapshot.h b/indra/newview/llpanelsnapshot.h new file mode 100644 index 0000000000..a49782a3e0 --- /dev/null +++ b/indra/newview/llpanelsnapshot.h @@ -0,0 +1,69 @@ +/** + * @file llpanelsnapshot.h + * @brief Snapshot panel base class + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELSNAPSHOT_H +#define LL_LLPANELSNAPSHOT_H + +#include "llfloatersnapshot.h" + +class LLSideTrayPanelContainer; + +/** + * Snapshot panel base class. + */ +class LLPanelSnapshot: public LLPanel +{ +public: + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + virtual std::string getWidthSpinnerName() const = 0; + virtual std::string getHeightSpinnerName() const = 0; + virtual std::string getAspectRatioCBName() const = 0; + virtual std::string getImageSizeComboName() const = 0; + + virtual S32 getTypedPreviewWidth() const; + virtual S32 getTypedPreviewHeight() const; + virtual LLSpinCtrl* getWidthSpinner(); + virtual LLSpinCtrl* getHeightSpinner(); + virtual void enableAspectRatioCheckbox(BOOL enable); + virtual LLFloaterSnapshot::ESnapshotFormat getImageFormat() const; + virtual void updateControls(const LLSD& info) = 0; ///< Update controls from saved settings + +protected: + LLSideTrayPanelContainer* getParentContainer(); + virtual void updateCustomResControls(); + void updateImageQualityLevel(); + void goBack(); ///< Switch to the default (Snapshot Options) panel + void cancel(); + + // common UI callbacks + void onCustomResolutionCommit(); + void onResolutionComboCommit(LLUICtrl* ctrl); + void onKeepAspectRatioCommit(LLUICtrl* ctrl); +}; + +#endif // LL_LLPANELSNAPSHOT_H diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp new file mode 100644 index 0000000000..63ccbc1b02 --- /dev/null +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -0,0 +1,109 @@ +/** + * @file llpanelsnapshotinventory.cpp + * @brief The panel provides UI for saving snapshot as an inventory texture. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcombobox.h" +#include "lleconomy.h" +#include "llsidetraypanelcontainer.h" +#include "llspinctrl.h" + +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llviewercontrol.h" // gSavedSettings + +/** + * The panel provides UI for saving snapshot as an inventory texture. + */ +class LLPanelSnapshotInventory +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotInventory); + +public: + LLPanelSnapshotInventory(); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + /*virtual*/ void updateCustomResControls(); ///< Show/hide custom resolution controls (spinners and checkbox) + /*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "inventory_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; } + /*virtual*/ void updateControls(const LLSD& info); + + void onSend(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotInventory> panel_class("llpanelsnapshotinventory"); + +LLPanelSnapshotInventory::LLPanelSnapshotInventory() +{ + mCommitCallbackRegistrar.add("Inventory.Save", boost::bind(&LLPanelSnapshotInventory::onSend, this)); + mCommitCallbackRegistrar.add("Inventory.Cancel", boost::bind(&LLPanelSnapshotInventory::cancel, this)); +} + +// virtual +BOOL LLPanelSnapshotInventory::postBuild() +{ + return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotInventory::onOpen(const LLSD& key) +{ + getChild<LLUICtrl>("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload())); + LLPanelSnapshot::onOpen(key); +} + +// virtual +void LLPanelSnapshotInventory::updateCustomResControls() +{ + LLComboBox* combo = getChild<LLComboBox>(getImageSizeComboName()); + S32 selected_idx = combo->getFirstSelectedIndex(); + const bool show = selected_idx == (combo->getItemCount() - 1); // Custom selected + + getChild<LLUICtrl>(getWidthSpinnerName())->setVisible(show); + getChild<LLUICtrl>(getHeightSpinnerName())->setVisible(show); + getChild<LLUICtrl>(getAspectRatioCBName())->setVisible(show); + + // enable controls if possible + LLPanelSnapshot::updateCustomResControls(); +} + +// virtual +void LLPanelSnapshotInventory::updateControls(const LLSD& info) +{ + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotInventory::onSend() +{ + LLFloaterSnapshot::saveTexture(); + LLFloaterSnapshot::postSave(); +} diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp new file mode 100644 index 0000000000..eaa27b8d41 --- /dev/null +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -0,0 +1,154 @@ +/** + * @file llpanelsnapshotlocal.cpp + * @brief The panel provides UI for saving snapshot to a local folder. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcombobox.h" +#include "llsidetraypanelcontainer.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" + +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llviewercontrol.h" // gSavedSettings + +/** + * The panel provides UI for saving snapshot to a local folder. + */ +class LLPanelSnapshotLocal +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotLocal); + +public: + LLPanelSnapshotLocal(); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + /*virtual*/ std::string getWidthSpinnerName() const { return "local_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "local_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "local_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "local_size_combo"; } + /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const; + /*virtual*/ void updateControls(const LLSD& info); + + void onFormatComboCommit(LLUICtrl* ctrl); + void onQualitySliderCommit(LLUICtrl* ctrl); + void onSend(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal"); + +LLPanelSnapshotLocal::LLPanelSnapshotLocal() +{ + mCommitCallbackRegistrar.add("Local.Save", boost::bind(&LLPanelSnapshotLocal::onSend, this)); + mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::cancel, this)); +} + +// virtual +BOOL LLPanelSnapshotLocal::postBuild() +{ + getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onQualitySliderCommit, this, _1)); + getChild<LLUICtrl>("local_format_combo")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onFormatComboCommit, this, _1)); + + return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotLocal::onOpen(const LLSD& key) +{ + LLPanelSnapshot::onOpen(key); +} + +// virtual +LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshotLocal::getImageFormat() const +{ + LLFloaterSnapshot::ESnapshotFormat fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; + + LLComboBox* local_format_combo = getChild<LLComboBox>("local_format_combo"); + const std::string id = local_format_combo->getValue().asString(); + if (id == "PNG") + { + fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; + } + else if (id == "JPEG") + { + fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; + } + else if (id == "BMP") + { + fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP; + } + + return fmt; +} + +// virtual +void LLPanelSnapshotLocal::updateControls(const LLSD& info) +{ + LLFloaterSnapshot::ESnapshotFormat fmt = + (LLFloaterSnapshot::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat"); + getChild<LLComboBox>("local_format_combo")->selectNthItem((S32) fmt); + + const bool show_quality_ctrls = (fmt == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG); + getChild<LLUICtrl>("image_quality_slider")->setVisible(show_quality_ctrls); + getChild<LLUICtrl>("image_quality_level")->setVisible(show_quality_ctrls); + + getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); + updateImageQualityLevel(); + + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild<LLUICtrl>("save_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotLocal::onFormatComboCommit(LLUICtrl* ctrl) +{ + // will call updateControls() + LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); +} + +void LLPanelSnapshotLocal::onQualitySliderCommit(LLUICtrl* ctrl) +{ + updateImageQualityLevel(); + + LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; + S32 quality_val = llfloor((F32)slider->getValue().asReal()); + LLSD info; + info["image-quality-change"] = quality_val; + LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshotLocal::onSend() +{ + LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance(); + + floater->notify(LLSD().with("set-working", true)); + LLFloaterSnapshot::saveLocal(); + LLFloaterSnapshot::postSave(); + goBack(); + floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local"))); +} diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp new file mode 100644 index 0000000000..df904b6836 --- /dev/null +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -0,0 +1,104 @@ +/** + * @file llpanelsnapshotoptions.cpp + * @brief Snapshot posting options panel. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lleconomy.h" +#include "llpanel.h" +#include "llsidetraypanelcontainer.h" + +#include "llfloatersnapshot.h" // FIXME: create a snapshot model + +/** + * Provides several ways to save a snapshot. + */ +class LLPanelSnapshotOptions +: public LLPanel +{ + LOG_CLASS(LLPanelSnapshotOptions); + +public: + LLPanelSnapshotOptions(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + void openPanel(const std::string& panel_name); + void onSaveToProfile(); + void onSaveToEmail(); + void onSaveToInventory(); + void onSaveToComputer(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotOptions> panel_class("llpanelsnapshotoptions"); + +LLPanelSnapshotOptions::LLPanelSnapshotOptions() +{ + mCommitCallbackRegistrar.add("Snapshot.SaveToProfile", boost::bind(&LLPanelSnapshotOptions::onSaveToProfile, this)); + mCommitCallbackRegistrar.add("Snapshot.SaveToEmail", boost::bind(&LLPanelSnapshotOptions::onSaveToEmail, this)); + mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this)); + mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this)); +} + +// virtual +void LLPanelSnapshotOptions::onOpen(const LLSD& key) +{ + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + getChild<LLUICtrl>("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost)); +} + +void LLPanelSnapshotOptions::openPanel(const std::string& panel_name) +{ + LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); + if (!parent) + { + llwarns << "Cannot find panel container" << llendl; + return; + } + + parent->openPanel(panel_name); + parent->getCurrentPanel()->onOpen(LLSD()); + LLFloaterSnapshot::postPanelSwitch(); +} + +void LLPanelSnapshotOptions::onSaveToProfile() +{ + openPanel("panel_snapshot_profile"); +} + +void LLPanelSnapshotOptions::onSaveToEmail() +{ + openPanel("panel_snapshot_postcard"); +} + +void LLPanelSnapshotOptions::onSaveToInventory() +{ + openPanel("panel_snapshot_inventory"); +} + +void LLPanelSnapshotOptions::onSaveToComputer() +{ + openPanel("panel_snapshot_local"); +} diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp new file mode 100644 index 0000000000..6867c7af4e --- /dev/null +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -0,0 +1,269 @@ +/** + * @file llpanelsnapshotpostcard.cpp + * @brief Postcard sending panel. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcombobox.h" +#include "llnotificationsutil.h" +#include "llsidetraypanelcontainer.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" +#include "lltexteditor.h" + +#include "llagent.h" +#include "llagentui.h" +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llpostcard.h" +#include "llviewercontrol.h" // gSavedSettings +#include "llviewerwindow.h" + +#include <boost/regex.hpp> + +/** + * Sends postcard via email. + */ +class LLPanelSnapshotPostcard +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotPostcard); + +public: + LLPanelSnapshotPostcard(); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ S32 notify(const LLSD& info); + +private: + /*virtual*/ std::string getWidthSpinnerName() const { return "postcard_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "postcard_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "postcard_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "postcard_size_combo"; } + /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; } + /*virtual*/ void updateControls(const LLSD& info); + + bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response); + void sendPostcard(); + + void onMsgFormFocusRecieved(); + void onFormatComboCommit(LLUICtrl* ctrl); + void onQualitySliderCommit(LLUICtrl* ctrl); + void onTabButtonPress(S32 btn_idx); + void onSend(); + + bool mHasFirstMsgFocus; + std::string mAgentEmail; +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotPostcard> panel_class("llpanelsnapshotpostcard"); + +LLPanelSnapshotPostcard::LLPanelSnapshotPostcard() +: mHasFirstMsgFocus(false) +{ + mCommitCallbackRegistrar.add("Postcard.Send", boost::bind(&LLPanelSnapshotPostcard::onSend, this)); + mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::cancel, this)); + mCommitCallbackRegistrar.add("Postcard.Message", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 0)); + mCommitCallbackRegistrar.add("Postcard.Settings", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 1)); + +} + +// virtual +BOOL LLPanelSnapshotPostcard::postBuild() +{ + // pick up the user's up-to-date email address + gAgent.sendAgentUserInfoRequest(); + + std::string name_string; + LLAgentUI::buildFullname(name_string); + getChild<LLUICtrl>("name_form")->setValue(LLSD(name_string)); + + // For the first time a user focuses to .the msg box, all text will be selected. + getChild<LLUICtrl>("msg_form")->setFocusChangedCallback(boost::bind(&LLPanelSnapshotPostcard::onMsgFormFocusRecieved, this)); + + getChild<LLUICtrl>("to_form")->setFocus(TRUE); + + getChild<LLUICtrl>("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onQualitySliderCommit, this, _1)); + + getChild<LLButton>("message_btn")->setToggleState(TRUE); + + return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotPostcard::onOpen(const LLSD& key) +{ + LLPanelSnapshot::onOpen(key); +} + +// virtual +S32 LLPanelSnapshotPostcard::notify(const LLSD& info) +{ + if (!info.has("agent-email")) + { + llassert(info.has("agent-email")); + return 0; + } + + if (mAgentEmail.empty()) + { + mAgentEmail = info["agent-email"].asString(); + } + + return 1; +} + +// virtual +void LLPanelSnapshotPostcard::updateControls(const LLSD& info) +{ + getChild<LLUICtrl>("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); + updateImageQualityLevel(); + + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild<LLUICtrl>("send_btn")->setEnabled(have_snapshot); +} + +bool LLPanelSnapshotPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if(0 == option) + { + // User clicked OK + if((getChild<LLUICtrl>("subject_form")->getValue().asString()).empty()) + { + // Stuff the subject back into the form. + getChild<LLUICtrl>("subject_form")->setValue(getString("default_subject")); + } + + if (!mHasFirstMsgFocus) + { + // The user never switched focus to the message window. + // Using the default string. + getChild<LLUICtrl>("msg_form")->setValue(getString("default_message")); + } + + sendPostcard(); + } + return false; +} + + +void LLPanelSnapshotPostcard::sendPostcard() +{ + std::string to(getChild<LLUICtrl>("to_form")->getValue().asString()); + std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString()); + + LLSD postcard = LLSD::emptyMap(); + postcard["pos-global"] = LLFloaterSnapshot::getPosTakenGlobal().getValue(); + postcard["to"] = to; + postcard["from"] = mAgentEmail; + postcard["name"] = getChild<LLUICtrl>("name_form")->getValue().asString(); + postcard["subject"] = subject; + postcard["msg"] = getChild<LLUICtrl>("msg_form")->getValue().asString(); + LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard); + + // Give user feedback of the event. + gViewerWindow->playSnapshotAnimAndSound(); + + LLFloaterSnapshot::postSave(); +} + +void LLPanelSnapshotPostcard::onMsgFormFocusRecieved() +{ + LLTextEditor* msg_form = getChild<LLTextEditor>("msg_form"); + if (msg_form->hasFocus() && !mHasFirstMsgFocus) + { + mHasFirstMsgFocus = true; + msg_form->setText(LLStringUtil::null); + } +} + +void LLPanelSnapshotPostcard::onFormatComboCommit(LLUICtrl* ctrl) +{ + // will call updateControls() + LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); +} + +void LLPanelSnapshotPostcard::onQualitySliderCommit(LLUICtrl* ctrl) +{ + updateImageQualityLevel(); + + LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; + S32 quality_val = llfloor((F32)slider->getValue().asReal()); + LLSD info; + info["image-quality-change"] = quality_val; + LLFloaterSnapshot::getInstance()->notify(info); // updates the "SnapshotQuality" setting +} + +void LLPanelSnapshotPostcard::onTabButtonPress(S32 btn_idx) +{ + LLButton* buttons[2] = { + getChild<LLButton>("message_btn"), + getChild<LLButton>("settings_btn"), + }; + + // Switch between Message and Settings tabs. + LLButton* clicked_btn = buttons[btn_idx]; + LLButton* other_btn = buttons[!btn_idx]; + LLSideTrayPanelContainer* container = + getChild<LLSideTrayPanelContainer>("postcard_panel_container"); + + container->selectTab(clicked_btn->getToggleState() ? btn_idx : !btn_idx); + //clicked_btn->setEnabled(FALSE); + other_btn->toggleState(); + //other_btn->setEnabled(TRUE); + + lldebugs << "Button #" << btn_idx << " (" << clicked_btn->getName() << ") clicked" << llendl; +} + +void LLPanelSnapshotPostcard::onSend() +{ + // Validate input. + std::string to(getChild<LLUICtrl>("to_form")->getValue().asString()); + + boost::regex email_format("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*"); + + if (to.empty() || !boost::regex_match(to, email_format)) + { + LLNotificationsUtil::add("PromptRecipientEmail"); + return; + } + + if (mAgentEmail.empty() || !boost::regex_match(mAgentEmail, email_format)) + { + LLNotificationsUtil::add("PromptSelfEmail"); + return; + } + + std::string subject(getChild<LLUICtrl>("subject_form")->getValue().asString()); + if(subject.empty() || !mHasFirstMsgFocus) + { + LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLPanelSnapshotPostcard::missingSubjMsgAlertCallback, this, _1, _2)); + return; + } + + // Send postcard. + sendPostcard(); +} diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp new file mode 100644 index 0000000000..89245fc804 --- /dev/null +++ b/indra/newview/llpanelsnapshotprofile.cpp @@ -0,0 +1,100 @@ +/** + * @file llpanelsnapshotprofile.cpp + * @brief Posts a snapshot to My Profile feed. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +// libs +#include "llcombobox.h" +#include "llfloaterreg.h" +#include "llpanel.h" +#include "llspinctrl.h" + +// newview +#include "llfloatersnapshot.h" +#include "llpanelsnapshot.h" +#include "llsidetraypanelcontainer.h" +#include "llwebprofile.h" + +/** + * Posts a snapshot to My Profile feed. + */ +class LLPanelSnapshotProfile +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotProfile); + +public: + LLPanelSnapshotProfile(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + /*virtual*/ std::string getWidthSpinnerName() const { return "profile_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "profile_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "profile_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "profile_size_combo"; } + /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; } + /*virtual*/ void updateControls(const LLSD& info); + + void onSend(); +}; + +static LLRegisterPanelClassWrapper<LLPanelSnapshotProfile> panel_class("llpanelsnapshotprofile"); + +LLPanelSnapshotProfile::LLPanelSnapshotProfile() +{ + mCommitCallbackRegistrar.add("PostToProfile.Send", boost::bind(&LLPanelSnapshotProfile::onSend, this)); + mCommitCallbackRegistrar.add("PostToProfile.Cancel", boost::bind(&LLPanelSnapshotProfile::cancel, this)); +} + +// virtual +BOOL LLPanelSnapshotProfile::postBuild() +{ + return LLPanelSnapshot::postBuild(); +} + +// virtual +void LLPanelSnapshotProfile::onOpen(const LLSD& key) +{ + LLPanelSnapshot::onOpen(key); +} + +// virtual +void LLPanelSnapshotProfile::updateControls(const LLSD& info) +{ + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild<LLUICtrl>("post_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotProfile::onSend() +{ + std::string caption = getChild<LLUICtrl>("caption")->getValue().asString(); + bool add_location = getChild<LLUICtrl>("add_location_cb")->getValue().asBoolean(); + + LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location); + LLFloaterSnapshot::postSave(); +} diff --git a/indra/newview/llpostcard.cpp b/indra/newview/llpostcard.cpp new file mode 100644 index 0000000000..4f2d6da7e5 --- /dev/null +++ b/indra/newview/llpostcard.cpp @@ -0,0 +1,155 @@ +/** + * @file llpostcard.cpp + * @brief Sending postcards. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpostcard.h" + +#include "llvfile.h" +#include "llvfs.h" +#include "llviewerregion.h" + +#include "message.h" + +#include "llagent.h" +#include "llassetuploadresponders.h" + +/////////////////////////////////////////////////////////////////////////////// +// misc + +static void postcard_upload_callback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) +{ + LLSD* postcard_data = (LLSD*)user_data; + + if (result) + { + // TODO: display the error messages in UI + llwarns << "Failed to send postcard: " << LLAssetStorage::getErrorString(result) << llendl; + LLPostCard::reportPostResult(false); + } + else + { + // only create the postcard once the upload succeeds + + // request the postcard + const LLSD& data = *postcard_data; + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("SendPostcard"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->addUUID("AssetID", data["asset-id"].asUUID()); + msg->addVector3d("PosGlobal", LLVector3d(data["pos-global"])); + msg->addString("To", data["to"]); + msg->addString("From", data["from"]); + msg->addString("Name", data["name"]); + msg->addString("Subject", data["subject"]); + msg->addString("Msg", data["msg"]); + msg->addBOOL("AllowPublish", FALSE); + msg->addBOOL("MaturePublish", FALSE); + gAgent.sendReliableMessage(); + + LLPostCard::reportPostResult(true); + } + + delete postcard_data; +} + + +/////////////////////////////////////////////////////////////////////////////// +// LLPostcardSendResponder + +class LLPostcardSendResponder : public LLAssetUploadResponder +{ + LOG_CLASS(LLPostcardSendResponder); + +public: + LLPostcardSendResponder(const LLSD &post_data, + const LLUUID& vfile_id, + LLAssetType::EType asset_type): + LLAssetUploadResponder(post_data, vfile_id, asset_type) + { + } + + /*virtual*/ void uploadComplete(const LLSD& content) + { + llinfos << "Postcard sent" << llendl; + LL_DEBUGS("Snapshots") << "content: " << content << llendl; + LLPostCard::reportPostResult(true); + } + + /*virtual*/ void uploadFailure(const LLSD& content) + { + llwarns << "Sending postcard failed: " << content << llendl; + LLPostCard::reportPostResult(false); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLPostCard + +LLPostCard::result_callback_t LLPostCard::mResultCallback; + +// static +void LLPostCard::send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data) +{ + LLTransactionID transaction_id; + LLAssetID asset_id; + + transaction_id.generate(); + asset_id = transaction_id.makeAssetID(gAgent.getSecureSessionID()); + LLVFile::writeFile(image->getData(), image->getDataSize(), gVFS, asset_id, LLAssetType::AT_IMAGE_JPEG); + + // upload the image + std::string url = gAgent.getRegion()->getCapability("SendPostcard"); + if (!url.empty()) + { + llinfos << "Sending postcard via capability" << llendl; + // the capability already encodes: agent ID, region ID + LL_DEBUGS("Snapshots") << "url: " << url << llendl; + LL_DEBUGS("Snapshots") << "body: " << postcard_data << llendl; + LL_DEBUGS("Snapshots") << "data size: " << image->getDataSize() << llendl; + LLHTTPClient::post(url, postcard_data, + new LLPostcardSendResponder(postcard_data, asset_id, LLAssetType::AT_IMAGE_JPEG)); + } + else + { + llinfos << "Sending postcard" << llendl; + LLSD* data = new LLSD(postcard_data); + (*data)["asset-id"] = asset_id; + gAssetStorage->storeAssetData(transaction_id, LLAssetType::AT_IMAGE_JPEG, + &postcard_upload_callback, (void *)data, FALSE); + } +} + +// static +void LLPostCard::reportPostResult(bool ok) +{ + if (mResultCallback) + { + mResultCallback(ok); + } +} diff --git a/indra/newview/llpostcard.h b/indra/newview/llpostcard.h new file mode 100644 index 0000000000..0eb118b906 --- /dev/null +++ b/indra/newview/llpostcard.h @@ -0,0 +1,48 @@ +/** + * @file llpostcard.h + * @brief Sending postcards. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLPOSTCARD_H +#define LL_LLPOSTCARD_H + +#include "llimage.h" +#include "lluuid.h" + +class LLPostCard +{ + LOG_CLASS(LLPostCard); + +public: + typedef boost::function<void(bool ok)> result_callback_t; + + static void send(LLPointer<LLImageFormatted> image, const LLSD& postcard_data); + static void setPostResultCallback(result_callback_t cb) { mResultCallback = cb; } + static void reportPostResult(bool ok); + +private: + static result_callback_t mResultCallback; +}; + +#endif // LL_LLPOSTCARD_H diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 119fc95cf0..18626e3273 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -363,8 +363,10 @@ void LLPreview::onBtnCopyToInv(void* userdata) // Copy to inventory if (self->mNotecardInventoryID.notNull()) { - copy_inventory_from_notecard(self->mNotecardObjectID, - self->mNotecardInventoryID, item); + copy_inventory_from_notecard(LLUUID::null, + self->mNotecardObjectID, + self->mNotecardInventoryID, + item); } else { diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 45cf81751b..15ba5195d9 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -708,6 +708,8 @@ void LLScreenChannel::showToastsTop() //-------------------------------------------------------------------------- void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) { + LLScreenChannelBase::updateRect(); + LLRect toast_rect; LLToast::Params p; p.lifetime_secs = timer; @@ -730,13 +732,10 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer) text_box->setValue(text); text_box->setVisible(TRUE); - S32 old_height = text_box->getRect().getHeight(); text_box->reshapeToFitText(); text_box->setOrigin(text_box->getRect().mLeft, (wrapper_panel->getRect().getHeight() - text_box->getRect().getHeight())/2); - S32 new_height = text_box->getRect().getHeight(); - S32 height_delta = new_height - old_height; - toast_rect.setLeftTopAndSize(0, toast_rect.getHeight() + height_delta +gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight()); + toast_rect.setLeftTopAndSize(0, getRect().getHeight() - gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight()); mStartUpToastPanel->setRect(toast_rect); addChild(mStartUpToastPanel); diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index a24f6b24f0..91f8035556 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -113,21 +113,13 @@ public: switch (added_category_type) { case LLFolderType::FT_INBOX: + mSidepanelInventory->enableInbox(true); mSidepanelInventory->observeInboxModifications(added_category->getUUID()); break; case LLFolderType::FT_OUTBOX: + mSidepanelInventory->enableOutbox(true); mSidepanelInventory->observeOutboxModifications(added_category->getUUID()); break; - case LLFolderType::FT_NONE: - // HACK until sim update to properly create folder with system type - if (added_category->getName() == "Received Items") - { - mSidepanelInventory->observeInboxModifications(added_category->getUUID()); - } - else if (added_category->getName() == "Merchant Outbox") - { - mSidepanelInventory->observeOutboxModifications(added_category->getUUID()); - } default: break; } @@ -288,7 +280,6 @@ BOOL LLSidepanelInventory::postBuild() gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged)); gSavedSettings.getControl("InventoryDisplayOutbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayOutboxChanged)); - updateInboxOutbox(); // Update the verbs buttons state. updateVerbs(); @@ -316,20 +307,20 @@ void LLSidepanelInventory::updateInboxOutbox() // Set up observer for inbox changes, if we have an inbox already if (!inbox_id.isNull()) { - observeInboxModifications(inbox_id); - // Enable the display of the inbox if it exists enableInbox(true); + + observeInboxModifications(inbox_id); } #if ENABLE_MERCHANT_OUTBOX_PANEL // Set up observer for outbox changes, if we have an outbox already if (!outbox_id.isNull()) { - observeOutboxModifications(outbox_id); - // Enable the display of the outbox if it exists enableOutbox(true); + + observeOutboxModifications(outbox_id); } #endif } diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp index 95a12c7c23..e340333c2c 100644 --- a/indra/newview/llsidetraypanelcontainer.cpp +++ b/indra/newview/llsidetraypanelcontainer.cpp @@ -62,6 +62,13 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key) getCurrentPanel()->onOpen(key); } +void LLSideTrayPanelContainer::openPanel(const std::string& panel_name, const LLSD& key) +{ + LLSD combined_key = key; + combined_key[PARAM_SUB_PANEL_NAME] = panel_name; + onOpen(combined_key); +} + void LLSideTrayPanelContainer::openPreviousPanel() { if(!mDefaultPanelName.empty()) diff --git a/indra/newview/llsidetraypanelcontainer.h b/indra/newview/llsidetraypanelcontainer.h index 14269b002b..93a85ed374 100644 --- a/indra/newview/llsidetraypanelcontainer.h +++ b/indra/newview/llsidetraypanelcontainer.h @@ -57,6 +57,11 @@ public: /*virtual*/ void onOpen(const LLSD& key); /** + * Opens given subpanel. + */ + void openPanel(const std::string& panel_name, const LLSD& key = LLSD::emptyMap()); + + /** * Opens previous panel from panel navigation history. */ void openPreviousPanel(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index e62227fa3c..9d8d1be0f5 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -190,6 +190,7 @@ #include "lllogin.h" #include "llevents.h" #include "llstartuplistener.h" +#include "lltoolbarview.h" #if LL_WINDOWS #include "lldxhardware.h" @@ -2091,7 +2092,12 @@ void login_show() #else BOOL bUseDebugLogin = TRUE; #endif - + // Hide the toolbars: may happen to come back here if login fails after login agent but before login in region + if (gToolBarView) + { + gToolBarView->setVisible(FALSE); + } + LLPanelLogin::show( gViewerWindow->getWindowRectScaled(), bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"), login_callback, NULL ); diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index ffe864e220..3aa6a3b7e5 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -203,10 +203,9 @@ void LLSysWellWindow::reshapeWindow() { new_window_height = MAX_WINDOW_HEIGHT; } - S32 newY = curRect.mTop + new_window_height - curRect.getHeight(); - S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH - : curRect.getWidth(); - curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height); + S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH : curRect.getWidth(); + + curRect.setLeftTopAndSize(curRect.mLeft, curRect.mTop, newWidth, new_window_height); reshape(curRect.getWidth(), curRect.getHeight(), TRUE); setRect(curRect); } diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 70b0a31308..e7a176f4f9 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1641,8 +1641,8 @@ void LLTextureCache::purgeTextures(bool validate) { purge_count++; LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL; - removeEntry(idx, entries[idx], filename) ; cache_size -= entries[idx].mBodySize; + removeEntry(idx, entries[idx], filename) ; } } @@ -1879,13 +1879,12 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename) file_maybe_exists = false; } } + mTexturesSizeTotal -= entry.mBodySize; entry.mImageSize = -1; entry.mBodySize = 0; mHeaderIDMap.erase(entry.mID); - mTexturesSizeMap.erase(entry.mID); - - mTexturesSizeTotal -= entry.mBodySize; + mTexturesSizeMap.erase(entry.mID); mFreeList.insert(idx); } diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index 5d2cebe031..5ff0ccfeb2 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -30,12 +30,16 @@ #include "lltoolbarview.h" #include "llappviewer.h" +#include "llbutton.h" +#include "llclipboard.h" #include "lldir.h" -#include "llxmlnode.h" +#include "lldockablefloater.h" +#include "lldockcontrol.h" +#include "llimview.h" +#include "lltransientfloatermgr.h" #include "lltoolbar.h" -#include "llbutton.h" #include "lltooldraganddrop.h" -#include "llclipboard.h" +#include "llxmlnode.h" #include "llagent.h" // HACK for destinations guide on startup #include "llfloaterreg.h" // HACK for destinations guide on startup @@ -68,13 +72,14 @@ LLToolBarView::ToolbarSet::ToolbarSet() LLToolBarView::LLToolBarView(const LLToolBarView::Params& p) : LLUICtrl(p), - mToolbarLeft(NULL), - mToolbarRight(NULL), - mToolbarBottom(NULL), mDragStarted(false), mDragToolbarButton(NULL), mToolbarsLoaded(false) { + for (S32 i = 0; i < TOOLBAR_COUNT; i++) + { + mToolbars[i] = NULL; + } } void LLToolBarView::initFromParams(const LLToolBarView::Params& p) @@ -90,46 +95,100 @@ LLToolBarView::~LLToolBarView() BOOL LLToolBarView::postBuild() { - mToolbarLeft = getChild<LLToolBar>("toolbar_left"); - mToolbarRight = getChild<LLToolBar>("toolbar_right"); - mToolbarBottom = getChild<LLToolBar>("toolbar_bottom"); + mToolbars[TOOLBAR_LEFT] = getChild<LLToolBar>("toolbar_left"); + mToolbars[TOOLBAR_RIGHT] = getChild<LLToolBar>("toolbar_right"); + mToolbars[TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom"); - mToolbarLeft->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); - mToolbarLeft->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); - mToolbarLeft->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); - - mToolbarRight->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); - mToolbarRight->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); - mToolbarRight->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); - - mToolbarBottom->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); - mToolbarBottom->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); - mToolbarBottom->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); + for (int i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + { + mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); + mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); + mToolbars[i]->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4)); + mToolbars[i]->setButtonAddCallback(boost::bind(LLToolBarView::onToolBarButtonAdded,_1)); + mToolbars[i]->setButtonRemoveCallback(boost::bind(LLToolBarView::onToolBarButtonRemoved,_1)); + } LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&handleLoginToolbarSetup)); return TRUE; } -bool LLToolBarView::hasCommand(const LLCommandId& commandId) const +S32 LLToolBarView::hasCommand(const LLCommandId& commandId) const +{ + S32 command_location = TOOLBAR_NONE; + + for (S32 loc = TOOLBAR_FIRST; loc <= TOOLBAR_LAST; loc++) + { + if (mToolbars[loc]->hasCommand(commandId)) + { + command_location = loc; + break; + } + } + + return command_location; +} + +S32 LLToolBarView::addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank) +{ + int old_rank; + removeCommand(commandId, old_rank); + + S32 command_location = mToolbars[toolbar]->addCommand(commandId, rank); + + return command_location; +} + +S32 LLToolBarView::removeCommand(const LLCommandId& commandId, int& rank) +{ + S32 command_location = hasCommand(commandId); + rank = LLToolBar::RANK_NONE; + + if (command_location != TOOLBAR_NONE) + { + rank = mToolbars[command_location]->removeCommand(commandId); + } + + return command_location; +} + +S32 LLToolBarView::enableCommand(const LLCommandId& commandId, bool enabled) { - bool has_command = false; - if (mToolbarLeft && !has_command) + S32 command_location = hasCommand(commandId); + + if (command_location != TOOLBAR_NONE) { - has_command = mToolbarLeft->hasCommand(commandId); + mToolbars[command_location]->enableCommand(commandId, enabled); } - if (mToolbarRight && !has_command) + + return command_location; +} + +S32 LLToolBarView::stopCommandInProgress(const LLCommandId& commandId) +{ + S32 command_location = hasCommand(commandId); + + if (command_location != TOOLBAR_NONE) { - has_command = mToolbarRight->hasCommand(commandId); + mToolbars[command_location]->stopCommandInProgress(commandId); } - if (mToolbarBottom && !has_command) + + return command_location; +} + +S32 LLToolBarView::flashCommand(const LLCommandId& commandId, bool flash) +{ + S32 command_location = hasCommand(commandId); + + if (command_location != TOOLBAR_NONE) { - has_command = mToolbarBottom->hasCommand(commandId); + mToolbars[command_location]->flashCommand(commandId, flash); } - return has_command; + + return command_location; } -bool LLToolBarView::addCommand(const LLCommandId& command, LLToolBar* toolbar) +bool LLToolBarView::addCommandInternal(const LLCommandId& command, LLToolBar* toolbar) { LLCommandManager& mgr = LLCommandManager::instance(); if (mgr.getCommand(command)) @@ -147,6 +206,7 @@ bool LLToolBarView::addCommand(const LLCommandId& command, LLToolBar* toolbar) bool LLToolBarView::loadToolbars(bool force_default) { LLToolBarView::ToolbarSet toolbar_set; + bool err = false; // Load the toolbars.xml file std::string toolbar_file = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "toolbars.xml"); @@ -164,80 +224,90 @@ bool LLToolBarView::loadToolbars(bool force_default) if(!LLXMLNode::parseFile(toolbar_file, root, NULL)) { llwarns << "Unable to load toolbars from file: " << toolbar_file << llendl; - return false; + err = true; } - if(!root->hasName("toolbars")) + + if (!err && !root->hasName("toolbars")) { llwarns << toolbar_file << " is not a valid toolbars definition file" << llendl; - return false; + err = true; } // Parse the toolbar settings LLXUIParser parser; + if (!err) + { parser.readXUI(root, toolbar_set, toolbar_file); - if (!toolbar_set.validateBlock()) + } + if (!err && !toolbar_set.validateBlock()) { - llerrs << "Unable to validate toolbars from file: " << toolbar_file << llendl; - return false; + llwarns << "Unable to validate toolbars from file: " << toolbar_file << llendl; + err = true; } - // Clear the toolbars now before adding the loaded commands and settings - if (mToolbarLeft) + if (err) { - mToolbarLeft->clearCommandsList(); + if (force_default) + { + llerrs << "Unable to load toolbars from default file : " << toolbar_file << llendl; + return false; } - if (mToolbarRight) - { - mToolbarRight->clearCommandsList(); + // Try to load the default toolbars + return loadToolbars(true); } - if (mToolbarBottom) + + // Clear the toolbars now before adding the loaded commands and settings + for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) { - mToolbarBottom->clearCommandsList(); + if (mToolbars[i]) + { + mToolbars[i]->clearCommandsList(); + } } // Add commands to each toolbar - if (toolbar_set.left_toolbar.isProvided() && mToolbarLeft) + if (toolbar_set.left_toolbar.isProvided() && mToolbars[TOOLBAR_LEFT]) { if (toolbar_set.left_toolbar.button_display_mode.isProvided()) { LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode; - mToolbarLeft->setButtonType(button_type); + mToolbars[TOOLBAR_LEFT]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.left_toolbar.commands) + BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands) { - if (addCommand(LLCommandId(command_name_param), mToolbarLeft) == false) + if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_LEFT])) { - llwarns << "Error adding command '" << command_name_param.name() << "' to left toolbar." << llendl; + llwarns << "Error adding command '" << command_params.name() << "' to left toolbar." << llendl; } } } - if (toolbar_set.right_toolbar.isProvided() && mToolbarRight) + if (toolbar_set.right_toolbar.isProvided() && mToolbars[TOOLBAR_RIGHT]) { if (toolbar_set.right_toolbar.button_display_mode.isProvided()) { LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode; - mToolbarRight->setButtonType(button_type); + mToolbars[TOOLBAR_RIGHT]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.right_toolbar.commands) + BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands) { - if (addCommand(LLCommandId(command_name_param), mToolbarRight) == false) + if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_RIGHT])) { - llwarns << "Error adding command '" << command_name_param.name() << "' to right toolbar." << llendl; + llwarns << "Error adding command '" << command_params.name() << "' to right toolbar." << llendl; } } } - if (toolbar_set.bottom_toolbar.isProvided() && mToolbarBottom) + if (toolbar_set.bottom_toolbar.isProvided() && mToolbars[TOOLBAR_BOTTOM]) { if (toolbar_set.bottom_toolbar.button_display_mode.isProvided()) { LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode; - mToolbarBottom->setButtonType(button_type); + mToolbars[TOOLBAR_BOTTOM]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.bottom_toolbar.commands) + BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands) { - if (addCommand(LLCommandId(command_name_param), mToolbarBottom) == false) + if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_BOTTOM])) { - llwarns << "Error adding command '" << command_name_param.name() << "' to bottom toolbar." << llendl; + llwarns << "Error adding command '" << command_params.name() << "' to bottom toolbar." << llendl; } } } @@ -245,6 +315,19 @@ bool LLToolBarView::loadToolbars(bool force_default) return true; } +bool LLToolBarView::clearToolbars() +{ + for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + { + if (mToolbars[i]) + { + mToolbars[i]->clearCommandsList(); + } + } + + return true; +} + //static bool LLToolBarView::loadDefaultToolbars() { @@ -262,6 +345,23 @@ bool LLToolBarView::loadDefaultToolbars() return retval; } +//static +bool LLToolBarView::clearAllToolbars() +{ + bool retval = false; + + if (gToolBarView) + { + retval = gToolBarView->clearToolbars(); + if (retval) + { + gToolBarView->saveToolbars(); + } + } + + return retval; +} + void LLToolBarView::saveToolbars() const { if (!mToolbarsLoaded) @@ -269,20 +369,20 @@ void LLToolBarView::saveToolbars() const // Build the parameter tree from the toolbar data LLToolBarView::ToolbarSet toolbar_set; - if (mToolbarLeft) + if (mToolbars[TOOLBAR_LEFT]) { - toolbar_set.left_toolbar.button_display_mode = mToolbarLeft->getButtonType(); - addToToolset(mToolbarLeft->getCommandsList(),toolbar_set.left_toolbar); + toolbar_set.left_toolbar.button_display_mode = mToolbars[TOOLBAR_LEFT]->getButtonType(); + addToToolset(mToolbars[TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar); } - if (mToolbarRight) + if (mToolbars[TOOLBAR_RIGHT]) { - toolbar_set.right_toolbar.button_display_mode = mToolbarRight->getButtonType(); - addToToolset(mToolbarRight->getCommandsList(),toolbar_set.right_toolbar); + toolbar_set.right_toolbar.button_display_mode = mToolbars[TOOLBAR_RIGHT]->getButtonType(); + addToToolset(mToolbars[TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar); } - if (mToolbarBottom) + if (mToolbars[TOOLBAR_BOTTOM]) { - toolbar_set.bottom_toolbar.button_display_mode = mToolbarBottom->getButtonType(); - addToToolset(mToolbarBottom->getCommandsList(),toolbar_set.bottom_toolbar); + toolbar_set.bottom_toolbar.button_display_mode = mToolbars[TOOLBAR_BOTTOM]->getButtonType(); + addToToolset(mToolbars[TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar); } // Serialize the parameter tree @@ -323,35 +423,122 @@ void LLToolBarView::addToToolset(command_id_list_t& command_list, Toolbar& toolb } } -void LLToolBarView::draw() +void LLToolBarView::onToolBarButtonAdded(LLView* button) { - //LLPanel* sizer_left = getChild<LLPanel>("sizer_left"); + llassert(button); - LLRect bottom_rect, left_rect, right_rect; + if (button->getName() == "speak") + { + // Add the "Speak" button as a control view in LLTransientFloaterMgr + // to prevent hiding the transient IM floater upon pressing "Speak". + LLTransientFloaterMgr::getInstance()->addControlView(button); + + // Redock incoming and/or outgoing call windows, if applicable + + LLFloater* incoming_floater = LLFloaterReg::getLastFloaterInGroup("incoming_call"); + LLFloater* outgoing_floater = LLFloaterReg::getLastFloaterInGroup("outgoing_call"); + + if (incoming_floater && incoming_floater->isShown()) + { + LLCallDialog* incoming = dynamic_cast<LLCallDialog *>(incoming_floater); + llassert(incoming); + + LLDockControl* dock_control = incoming->getDockControl(); + if (dock_control->getDock() == NULL) + { + incoming->dockToToolbarButton("speak"); + } + } + + if (outgoing_floater && outgoing_floater->isShown()) + { + LLCallDialog* outgoing = dynamic_cast<LLCallDialog *>(outgoing_floater); + llassert(outgoing); + + LLDockControl* dock_control = outgoing->getDockControl(); + if (dock_control->getDock() == NULL) + { + outgoing->dockToToolbarButton("speak"); + } + } + } + else if (button->getName() == "voice") + { + // Add the "Voice controls" button as a control view in LLTransientFloaterMgr + // to prevent hiding the transient IM floater upon pressing "Voice controls". + LLTransientFloaterMgr::getInstance()->addControlView(button); + } +} + +void LLToolBarView::onToolBarButtonRemoved(LLView* button) +{ + llassert(button); - if (mToolbarBottom) + if (button->getName() == "speak") { - mToolbarBottom->getParent()->reshape(mToolbarBottom->getParent()->getRect().getWidth(), mToolbarBottom->getRect().getHeight()); - mToolbarBottom->localRectToOtherView(mToolbarBottom->getLocalRect(), &bottom_rect, this); + LLTransientFloaterMgr::getInstance()->removeControlView(button); + + // Undock incoming and/or outgoing call windows + + LLFloater* incoming_floater = LLFloaterReg::getLastFloaterInGroup("incoming_call"); + LLFloater* outgoing_floater = LLFloaterReg::getLastFloaterInGroup("outgoing_call"); + + if (incoming_floater && incoming_floater->isShown()) + { + LLDockableFloater* incoming = dynamic_cast<LLDockableFloater *>(incoming_floater); + llassert(incoming); + + LLDockControl* dock_control = incoming->getDockControl(); + dock_control->setDock(NULL); + } + + if (outgoing_floater && outgoing_floater->isShown()) + { + LLDockableFloater* outgoing = dynamic_cast<LLDockableFloater *>(outgoing_floater); + llassert(outgoing); + + LLDockControl* dock_control = outgoing->getDockControl(); + dock_control->setDock(NULL); + } } - if (mToolbarLeft) + else if (button->getName() == "voice") { - mToolbarLeft->getParent()->reshape(mToolbarLeft->getRect().getWidth(), mToolbarLeft->getParent()->getRect().getHeight()); - mToolbarLeft->localRectToOtherView(mToolbarLeft->getLocalRect(), &left_rect, this); + LLTransientFloaterMgr::getInstance()->removeControlView(button); } - if (mToolbarRight) +} + +void LLToolBarView::draw() +{ + LLRect toolbar_rects[TOOLBAR_COUNT]; + + for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) { - mToolbarRight->getParent()->reshape(mToolbarRight->getRect().getWidth(), mToolbarRight->getParent()->getRect().getHeight()); - mToolbarRight->localRectToOtherView(mToolbarRight->getLocalRect(), &right_rect, this); + if (mToolbars[i]) + { + LLLayoutStack::ELayoutOrientation orientation = LLToolBarEnums::getOrientation(mToolbars[i]->getSideType()); + + if (orientation == LLLayoutStack::HORIZONTAL) + { + mToolbars[i]->getParent()->reshape(mToolbars[i]->getParent()->getRect().getWidth(), mToolbars[i]->getRect().getHeight()); + } + else + { + mToolbars[i]->getParent()->reshape(mToolbars[i]->getRect().getWidth(), mToolbars[i]->getParent()->getRect().getHeight()); + } + + mToolbars[i]->localRectToOtherView(mToolbars[i]->getLocalRect(), &toolbar_rects[i], this); + } } // Draw drop zones if drop of a tool is active if (isToolDragged()) { LLColor4 drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" ); - gl_rect_2d(bottom_rect, drop_color, TRUE); - gl_rect_2d(left_rect, drop_color, TRUE); - gl_rect_2d(right_rect, drop_color, TRUE); + + for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + { + gl_rect_2d(toolbar_rects[i], drop_color, TRUE); + } } LLUICtrl::draw(); @@ -363,9 +550,9 @@ void LLToolBarView::draw() // ---------------------------------------- -void LLToolBarView::startDragTool(S32 x, S32 y, LLToolBarButton* button) +void LLToolBarView::startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton) { - resetDragTool(button); + resetDragTool(toolbarButton); // Flag the tool dragging but don't start it yet LLToolDragAndDrop::getInstance()->setDragStart( x, y ); @@ -391,9 +578,7 @@ BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp // Second, stop the command if it is in progress and requires stopping! LLCommandId command_id = LLCommandId(uuid); - gToolBarView->mToolbarLeft->stopCommandInProgress(command_id); - gToolBarView->mToolbarRight->stopCommandInProgress(command_id); - gToolBarView->mToolbarBottom->stopCommandInProgress(command_id); + gToolBarView->stopCommandInProgress(command_id); gToolBarView->mDragStarted = true; return TRUE; @@ -424,10 +609,10 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t { // Suppress the command from the toolbars (including the one it's dropped in, // this will handle move position). - bool command_present = gToolBarView->hasCommand(command_id); + S32 old_toolbar_loc = gToolBarView->hasCommand(command_id); LLToolBar* old_toolbar = NULL; - if (command_present) + if (old_toolbar_loc != TOOLBAR_NONE) { llassert(gToolBarView->mDragToolbarButton); old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); @@ -437,9 +622,8 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t } else { - gToolBarView->mToolbarBottom->removeCommand(command_id); - gToolBarView->mToolbarLeft->removeCommand(command_id); - gToolBarView->mToolbarRight->removeCommand(command_id); + int old_rank = LLToolBar::RANK_NONE; + gToolBarView->removeCommand(command_id, old_rank); } } @@ -463,27 +647,29 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t return handled; } -void LLToolBarView::resetDragTool(LLToolBarButton* button) +void LLToolBarView::resetDragTool(LLToolBarButton* toolbarButton) { // Clear the saved command, toolbar and rank gToolBarView->mDragStarted = false; - gToolBarView->mDragToolbarButton = button; + gToolBarView->mDragToolbarButton = toolbarButton; } void LLToolBarView::setToolBarsVisible(bool visible) { - mToolbarBottom->getParent()->setVisible(visible); - mToolbarLeft->getParent()->setVisible(visible); - mToolbarRight->getParent()->setVisible(visible); + for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + { + mToolbars[i]->getParent()->setVisible(visible); + } } bool LLToolBarView::isModified() const { bool modified = false; - modified |= mToolbarBottom->isModified(); - modified |= mToolbarLeft->isModified(); - modified |= mToolbarRight->isModified(); + for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + { + modified |= mToolbars[i]->isModified(); + } return modified; } @@ -496,9 +682,11 @@ bool LLToolBarView::isModified() const void handleLoginToolbarSetup() { // Open the destinations guide by default on first login, per Rhett - if (gSavedSettings.getBOOL("FirstLoginThisInstall") || gAgent.isFirstLogin()) + if (gSavedPerAccountSettings.getBOOL("DisplayDestinationsOnInitialRun") || gAgent.isFirstLogin()) { LLFloaterReg::showInstance("destinations"); + + gSavedPerAccountSettings.setBOOL("DisplayDestinationsOnInitialRun", FALSE); } } diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index 2b26db3802..b99e8bc28d 100644 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -39,6 +39,19 @@ class LLUICtrlFactory; class LLToolBarView : public LLUICtrl { public: + typedef enum + { + TOOLBAR_NONE = 0, + TOOLBAR_LEFT, + TOOLBAR_RIGHT, + TOOLBAR_BOTTOM, + + TOOLBAR_COUNT, + + TOOLBAR_FIRST = TOOLBAR_LEFT, + TOOLBAR_LAST = TOOLBAR_BOTTOM, + } EToolBarLocation; + // Xui structure of the toolbar panel struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> {}; @@ -52,6 +65,7 @@ public: { Mandatory<LLToolBarEnums::ButtonType> button_display_mode; Multiple<LLCommandId::Params> commands; + Toolbar(); }; struct ToolbarSet : public LLInitParam::Block<ToolbarSet> @@ -59,6 +73,7 @@ public: Optional<Toolbar> left_toolbar, right_toolbar, bottom_toolbar; + ToolbarSet(); }; @@ -66,20 +81,31 @@ public: virtual ~LLToolBarView(); virtual BOOL postBuild(); virtual void draw(); + // Toolbar view interface with the rest of the world - // Checks if the commandId is being used somewhere in one of the toolbars - bool hasCommand(const LLCommandId& commandId) const; + // Checks if the commandId is being used somewhere in one of the toolbars, returns EToolBarLocation + S32 hasCommand(const LLCommandId& commandId) const; + S32 addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank = LLToolBar::RANK_NONE); + S32 removeCommand(const LLCommandId& commandId, int& rank); // Sets the rank the removed command was at, RANK_NONE if not found + S32 enableCommand(const LLCommandId& commandId, bool enabled); + S32 stopCommandInProgress(const LLCommandId& commandId); + S32 flashCommand(const LLCommandId& commandId, bool flash); + // Loads the toolbars from the existing user or default settings bool loadToolbars(bool force_default = false); // return false if load fails + // Clears all buttons off the toolbars + bool clearToolbars(); + void setToolBarsVisible(bool visible); static bool loadDefaultToolbars(); + static bool clearAllToolbars(); - static void startDragTool(S32 x, S32 y, LLToolBarButton* button); + static void startDragTool(S32 x, S32 y, LLToolBarButton* toolbarButton); static BOOL handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type); static BOOL handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar); - static void resetDragTool(LLToolBarButton* button); + static void resetDragTool(LLToolBarButton* toolbarButton); bool isModified() const; @@ -91,13 +117,14 @@ protected: private: void saveToolbars() const; - bool addCommand(const LLCommandId& commandId, LLToolBar* toolbar); + bool addCommandInternal(const LLCommandId& commandId, LLToolBar* toolbar); void addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const; + static void onToolBarButtonAdded(LLView* button); + static void onToolBarButtonRemoved(LLView* button); + // Pointers to the toolbars handled by the toolbar view - LLToolBar* mToolbarLeft; - LLToolBar* mToolbarRight; - LLToolBar* mToolbarBottom; + LLToolBar* mToolbars[TOOLBAR_COUNT]; bool mToolbarsLoaded; bool mDragStarted; diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp index c648a6a28a..3d68c10489 100644 --- a/indra/newview/lltransientfloatermgr.cpp +++ b/indra/newview/lltransientfloatermgr.cpp @@ -42,9 +42,9 @@ LLTransientFloaterMgr::LLTransientFloaterMgr() &LLTransientFloaterMgr::leftMouseClickCallback, this, _2, _3, _4)); } - mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>())); - mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>())); - mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(IM, std::set<LLView*>())); + mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(GLOBAL, controls_set_t())); + mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(DOCKED, controls_set_t())); + mGroupControls.insert(std::pair<ETransientGroup, controls_set_t >(IM, controls_set_t())); } void LLTransientFloaterMgr::registerTransientFloater(LLTransientFloater* floater) @@ -59,12 +59,16 @@ void LLTransientFloaterMgr::unregisterTransientFloater(LLTransientFloater* float void LLTransientFloaterMgr::addControlView(ETransientGroup group, LLView* view) { - mGroupControls.find(group)->second.insert(view); + if (!view) return; + + mGroupControls.find(group)->second.insert(view->getHandle()); } void LLTransientFloaterMgr::removeControlView(ETransientGroup group, LLView* view) { - mGroupControls.find(group)->second.erase(view); + if (!view) return; + + mGroupControls.find(group)->second.erase(view->getHandle()); } void LLTransientFloaterMgr::addControlView(LLView* view) @@ -89,7 +93,7 @@ void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y) { ETransientGroup group = floater->getGroup(); - bool hide = isControlClicked(mGroupControls.find(group)->second, x, y); + bool hide = isControlClicked(group, mGroupControls.find(group)->second, x, y); if (hide) { floater->setTransientVisible(FALSE); @@ -98,13 +102,25 @@ void LLTransientFloaterMgr::hideTransientFloaters(S32 x, S32 y) } } -bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32 y) +bool LLTransientFloaterMgr::isControlClicked(ETransientGroup group, controls_set_t& set, S32 x, S32 y) { + std::list< LLHandle<LLView> > dead_handles; + bool res = true; for (controls_set_t::iterator it = set.begin(); it != set.end(); it++) { - LLView* control_view = *it; + LLView* control_view = NULL; + + LLHandle<LLView> handle = *it; + if (handle.isDead()) + { + dead_handles.push_back(handle); + continue; + } + + control_view = handle.get(); + if (!control_view->getVisible()) { continue; @@ -118,6 +134,13 @@ bool LLTransientFloaterMgr::isControlClicked(std::set<LLView*>& set, S32 x, S32 break; } } + + for (std::list< LLHandle<LLView> >::iterator it = dead_handles.begin(); it != dead_handles.end(); ++it) + { + LLHandle<LLView> handle = *it; + mGroupControls.find(group)->second.erase(handle); + } + return res; } @@ -130,8 +153,8 @@ void LLTransientFloaterMgr::leftMouseClickCallback(S32 x, S32 y, return; } - bool hide = isControlClicked(mGroupControls.find(DOCKED)->second, x, y) - && isControlClicked(mGroupControls.find(GLOBAL)->second, x, y); + bool hide = isControlClicked(DOCKED, mGroupControls.find(DOCKED)->second, x, y) + && isControlClicked(GLOBAL, mGroupControls.find(GLOBAL)->second, x, y); if (hide) { hideTransientFloaters(x, y); diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h index 2919244121..b4611c8c87 100644 --- a/indra/newview/lltransientfloatermgr.h +++ b/indra/newview/lltransientfloatermgr.h @@ -56,14 +56,15 @@ public: void removeControlView(LLView* view); private: + typedef std::set<LLHandle<LLView> > controls_set_t; + typedef std::map<ETransientGroup, controls_set_t > group_controls_t; + void hideTransientFloaters(S32 x, S32 y); void leftMouseClickCallback(S32 x, S32 y, MASK mask); - bool isControlClicked(std::set<LLView*>& set, S32 x, S32 y); -private: + bool isControlClicked(ETransientGroup group, controls_set_t& set, S32 x, S32 y); + std::set<LLTransientFloater*> mTransSet; - typedef std::set<LLView*> controls_set_t; - typedef std::map<ETransientGroup, std::set<LLView*> > group_controls_t; group_controls_t mGroupControls; }; diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 2f60b6b90b..7eb54271f4 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -31,82 +31,294 @@ #include <curl/curl.h> #include "llbufferstream.h" +#include "lltrans.h" #include "llui.h" #include "llversioninfo.h" #include "llviewercontrol.h" #include "reader.h" -// These two are concatenated with the language specifiers to form a complete Google Translate URL -const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q="; -const char* LLTranslate::m_GoogleLangSpec = "&langpair="; -float LLTranslate::m_GoogleTimeout = 5; +// virtual +void LLGoogleTranslationHandler::getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const +{ + url = std::string("https://www.googleapis.com/language/translate/v2?key=") + + getAPIKey() + "&q=" + LLURI::escape(text) + "&target=" + to_lang; + if (!from_lang.empty()) + { + url += "&source=" + from_lang; + } +} -LLSD LLTranslate::m_Header; -// These constants are for the GET header. -const char* LLTranslate::m_AcceptHeader = "Accept"; -const char* LLTranslate::m_AcceptType = "text/plain"; -const char* LLTranslate::m_AgentHeader = "User-Agent"; +// virtual +void LLGoogleTranslationHandler::getKeyVerificationURL( + std::string& url, + const std::string& key) const +{ + url = std::string("https://www.googleapis.com/language/translate/v2/languages?key=") + + key + "&target=en"; +} -// These constants are in the JSON returned from Google -const char* LLTranslate::m_GoogleData = "responseData"; -const char* LLTranslate::m_GoogleTranslation = "translatedText"; -const char* LLTranslate::m_GoogleLanguage = "detectedSourceLanguage"; +// virtual +bool LLGoogleTranslationHandler::parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const +{ + Json::Value root; + Json::Reader reader; -//static -void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg) + if (!reader.parse(body, root)) + { + err_msg = reader.getFormatedErrorMessages(); + return false; + } + + if (!root.isObject()) // empty response? should not happen + { + return false; + } + + if (status != STATUS_OK) + { + // Request failed. Extract error message from the response. + parseErrorResponse(root, status, err_msg); + return false; + } + + // Request succeeded, extract translation from the response. + return parseTranslation(root, translation, detected_lang); +} + +// static +void LLGoogleTranslationHandler::parseErrorResponse( + const Json::Value& root, + int& status, + std::string& err_msg) { - std::string url; - getTranslateUrl(url, from_lang, to_lang, mesg); + const Json::Value& error = root.get("error", 0); + if (!error.isObject() || !error.isMember("message") || !error.isMember("code")) + { + return; + } - std::string user_agent = llformat("%s %d.%d.%d (%d)", - LLVersionInfo::getChannel().c_str(), - LLVersionInfo::getMajor(), - LLVersionInfo::getMinor(), - LLVersionInfo::getPatch(), - LLVersionInfo::getBuild()); + err_msg = error["message"].asString(); + status = error["code"].asInt(); +} - if (!m_Header.size()) +// static +bool LLGoogleTranslationHandler::parseTranslation( + const Json::Value& root, + std::string& translation, + std::string& detected_lang) +{ + // JsonCpp is prone to aborting the program on failed assertions, + // so be super-careful and verify the response format. + const Json::Value& data = root.get("data", 0); + if (!data.isObject() || !data.isMember("translations")) { - m_Header.insert(m_AcceptHeader, LLSD(m_AcceptType)); - m_Header.insert(m_AgentHeader, LLSD(user_agent)); + return false; + } + + const Json::Value& translations = data["translations"]; + if (!translations.isArray() || translations.size() == 0) + { + return false; + } + + const Json::Value& first = translations[0U]; + if (!first.isObject() || !first.isMember("translatedText")) + { + return false; } - LLHTTPClient::get(url, result, m_Header, m_GoogleTimeout); + translation = first["translatedText"].asString(); + detected_lang = first.get("detectedSourceLanguage", "").asString(); + return true; } -//static -void LLTranslate::getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &mesg) +// static +std::string LLGoogleTranslationHandler::getAPIKey() +{ + return gSavedSettings.getString("GoogleTranslateAPIKey"); +} + +// virtual +void LLBingTranslationHandler::getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const { - char * curl_str = curl_escape(mesg.c_str(), mesg.size()); - std::string const escaped_mesg(curl_str); - curl_free(curl_str); + url = std::string("http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=") + + getAPIKey() + "&text=" + LLURI::escape(text) + "&to=" + to_lang; + if (!from_lang.empty()) + { + url += "&from=" + from_lang; + } +} - translate_url = m_GoogleURL - + escaped_mesg + m_GoogleLangSpec - + from_lang // 'from' language; empty string for auto - + "%7C" // | - + to_lang; // 'to' language +// virtual +void LLBingTranslationHandler::getKeyVerificationURL( + std::string& url, + const std::string& key) const +{ + url = std::string("http://api.microsofttranslator.com/v2/Http.svc/GetLanguagesForTranslate?appId=") + + key; } -//static -bool LLTranslate::parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language) +// virtual +bool LLBingTranslationHandler::parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const { - Json::Value root; - Json::Reader reader; - - bool success = reader.parse(body, root); - if (!success) + if (status != STATUS_OK) { - LL_WARNS("Translate") << "Non valid response from Google Translate API: '" << reader.getFormatedErrorMessages() << "'" << LL_ENDL; + static const std::string MSG_BEGIN_MARKER = "Message: "; + size_t begin = body.find(MSG_BEGIN_MARKER); + if (begin != std::string::npos) + { + begin += MSG_BEGIN_MARKER.size(); + } + else + { + begin = 0; + err_msg.clear(); + } + size_t end = body.find("</p>", begin); + err_msg = body.substr(begin, end-begin); + LLStringUtil::replaceString(err_msg, "
", ""); // strip CR return false; } - - translation = root[m_GoogleData].get(m_GoogleTranslation, "").asString(); - detected_language = root[m_GoogleData].get(m_GoogleLanguage, "").asString(); + + // Sample response: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hola</string> + size_t begin = body.find(">"); + if (begin == std::string::npos || begin >= (body.size() - 1)) + { + begin = 0; + } + else + { + ++begin; + } + + size_t end = body.find("</string>", begin); + + detected_lang = ""; // unsupported by this API + translation = body.substr(begin, end-begin); + LLStringUtil::replaceString(translation, "
", ""); // strip CR return true; } +// static +std::string LLBingTranslationHandler::getAPIKey() +{ + return gSavedSettings.getString("BingTranslateAPIKey"); +} + +LLTranslate::TranslationReceiver::TranslationReceiver(const std::string& from_lang, const std::string& to_lang) +: mFromLang(from_lang) +, mToLang(to_lang) +, mHandler(LLTranslate::getPreferredHandler()) +{ +} + +// virtual +void LLTranslate::TranslationReceiver::completedRaw( + U32 http_status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) +{ + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + + const std::string body = strstrm.str(); + std::string translation, detected_lang, err_msg; + int status = http_status; + LL_DEBUGS("Translate") << "HTTP status: " << status << " " << reason << LL_ENDL; + LL_DEBUGS("Translate") << "Response body: " << body << LL_ENDL; + if (mHandler.parseResponse(status, body, translation, detected_lang, err_msg)) + { + // Fix up the response + LLStringUtil::replaceString(translation, "<", "<"); + LLStringUtil::replaceString(translation, ">",">"); + LLStringUtil::replaceString(translation, ""","\""); + LLStringUtil::replaceString(translation, "'","'"); + LLStringUtil::replaceString(translation, "&","&"); + LLStringUtil::replaceString(translation, "'","'"); + + handleResponse(translation, detected_lang); + } + else + { + if (err_msg.empty()) + { + err_msg = LLTrans::getString("TranslationResponseParseError"); + } + + llwarns << "Translation request failed: " << err_msg << llendl; + handleFailure(status, err_msg); + } +} + +LLTranslate::KeyVerificationReceiver::KeyVerificationReceiver(EService service) +: mService(service) +{ +} + +LLTranslate::EService LLTranslate::KeyVerificationReceiver::getService() const +{ + return mService; +} + +// virtual +void LLTranslate::KeyVerificationReceiver::completedRaw( + U32 http_status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) +{ + bool ok = (http_status == 200); + setVerificationStatus(ok); +} + +//static +void LLTranslate::translateMessage( + TranslationReceiverPtr &receiver, + const std::string &from_lang, + const std::string &to_lang, + const std::string &mesg) +{ + std::string url; + receiver->mHandler.getTranslateURL(url, from_lang, to_lang, mesg); + + LL_DEBUGS("Translate") << "Sending translation request: " << url << LL_ENDL; + sendRequest(url, receiver); +} + +// static +void LLTranslate::verifyKey( + KeyVerificationReceiverPtr& receiver, + const std::string& key) +{ + std::string url; + const LLTranslationAPIHandler& handler = getHandler(receiver->getService()); + handler.getKeyVerificationURL(url, key); + + LL_DEBUGS("Translate") << "Sending key verification request: " << url << LL_ENDL; + sendRequest(url, receiver); +} + //static std::string LLTranslate::getTranslateLanguage() { @@ -119,3 +331,52 @@ std::string LLTranslate::getTranslateLanguage() return language; } +// static +const LLTranslationAPIHandler& LLTranslate::getPreferredHandler() +{ + EService service = SERVICE_BING; + + std::string service_str = gSavedSettings.getString("TranslationService"); + if (service_str == "google") + { + service = SERVICE_GOOGLE; + } + + return getHandler(service); +} + +// static +const LLTranslationAPIHandler& LLTranslate::getHandler(EService service) +{ + static LLGoogleTranslationHandler google; + static LLBingTranslationHandler bing; + + if (service == SERVICE_GOOGLE) + { + return google; + } + + return bing; +} + +// static +void LLTranslate::sendRequest(const std::string& url, LLHTTPClient::ResponderPtr responder) +{ + static const float REQUEST_TIMEOUT = 5; + static LLSD sHeader; + + if (!sHeader.size()) + { + std::string user_agent = llformat("%s %d.%d.%d (%d)", + LLVersionInfo::getChannel().c_str(), + LLVersionInfo::getMajor(), + LLVersionInfo::getMinor(), + LLVersionInfo::getPatch(), + LLVersionInfo::getBuild()); + + sHeader.insert("Accept", "text/plain"); + sHeader.insert("User-Agent", user_agent); + } + + LLHTTPClient::get(url, responder, sHeader, REQUEST_TIMEOUT); +} diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index e85a42e878..c2330daa81 100644 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -30,89 +30,257 @@ #include "llhttpclient.h" #include "llbufferstream.h" +namespace Json +{ + class Value; +} + +/** + * Handler of an HTTP machine translation service. + * + * Derived classes know the service URL + * and how to parse the translation result. + */ +class LLTranslationAPIHandler +{ +public: + /** + * Get URL for translation of the given string. + * + * Sending HTTP GET request to the URL will initiate translation. + * + * @param[out] url Place holder for the result. + * @param from_lang Source language. Leave empty for auto-detection. + * @param to_lang Target language. + * @param text Text to translate. + */ + virtual void getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const = 0; + + /** + * Get URL to verify the given API key. + * + * Sending request to the URL verifies the key. + * Positive HTTP response (code 200) means that the key is valid. + * + * @param[out] url Place holder for the URL. + * @param[in] key Key to verify. + */ + virtual void getKeyVerificationURL( + std::string &url, + const std::string &key) const = 0; + + /** + * Parse translation response. + * + * @param[in,out] status HTTP status. May be modified while parsing. + * @param body Response text. + * @param[out] translation Translated text. + * @param[out] detected_lang Detected source language. May be empty. + * @param[out] err_msg Error message (in case of error). + */ + virtual bool parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const = 0; + + virtual ~LLTranslationAPIHandler() {} + +protected: + static const int STATUS_OK = 200; +}; + +/// Google Translate v2 API handler. +class LLGoogleTranslationHandler : public LLTranslationAPIHandler +{ + LOG_CLASS(LLGoogleTranslationHandler); + +public: + /*virtual*/ void getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const; + /*virtual*/ void getKeyVerificationURL( + std::string &url, + const std::string &key) const; + /*virtual*/ bool parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const; + +private: + static void parseErrorResponse( + const Json::Value& root, + int& status, + std::string& err_msg); + static bool parseTranslation( + const Json::Value& root, + std::string& translation, + std::string& detected_lang); + static std::string getAPIKey(); +}; + +/// Microsoft Translator v2 API handler. +class LLBingTranslationHandler : public LLTranslationAPIHandler +{ + LOG_CLASS(LLBingTranslationHandler); + +public: + /*virtual*/ void getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const; + /*virtual*/ void getKeyVerificationURL( + std::string &url, + const std::string &key) const; + /*virtual*/ bool parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const; +private: + static std::string getAPIKey(); +}; + +/** + * Entry point for machine translation services. + * + * Basically, to translate a string, we need to know the URL + * of a translation service, have a valid API for the service + * and be given the target language. + * + * Callers specify the string to translate and the target language, + * LLTranslate takes care of the rest. + * + * API keys for translation are taken from saved settings. + */ class LLTranslate { LOG_CLASS(LLTranslate); + public : + + typedef enum e_service { + SERVICE_BING, + SERVICE_GOOGLE, + } EService; + + /** + * Subclasses are supposed to handle translation results (e.g. show them in chat) + */ class TranslationReceiver: public LLHTTPClient::Responder { + public: + + /** + * Using mHandler, parse incoming response. + * + * Calls either handleResponse() or handleFailure() + * depending on the HTTP status code and parsing success. + * + * @see handleResponse() + * @see handleFailure() + * @see mHandler + */ + /*virtual*/ void completedRaw( + U32 http_status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer); + protected: - TranslationReceiver(const std::string &from_lang, const std::string &to_lang) - : m_fromLang(from_lang), - m_toLang(to_lang) - { - } + friend class LLTranslate; - virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) {}; - virtual void handleFailure() {}; + /// Remember source and target languages for subclasses to be able to filter inappropriate results. + TranslationReceiver(const std::string& from_lang, const std::string& to_lang); + /// Override point to handle successful translation. + virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) = 0; + + /// Override point to handle unsuccessful translation. + virtual void handleFailure(int status, const std::string& err_msg) = 0; + + std::string mFromLang; + std::string mToLang; + const LLTranslationAPIHandler& mHandler; + }; + + /** + * Subclasses are supposed to handle API key verification result. + */ + class KeyVerificationReceiver: public LLHTTPClient::Responder + { public: - ~TranslationReceiver() - { - } - - virtual void completedRaw( U32 status, - const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer) - { - if (200 <= status && status < 300) - { - LLBufferStream istr(channels, buffer.get()); - std::stringstream strstrm; - strstrm << istr.rdbuf(); - - const std::string result = strstrm.str(); - std::string translation; - std::string detected_language; - - if (!parseGoogleTranslate(result, translation, detected_language)) - { - handleFailure(); - return; - } - - // Fix up the response - LLStringUtil::replaceString(translation, "<", "<"); - LLStringUtil::replaceString(translation, ">",">"); - LLStringUtil::replaceString(translation, ""","\""); - LLStringUtil::replaceString(translation, "'","'"); - LLStringUtil::replaceString(translation, "&","&"); - LLStringUtil::replaceString(translation, "'","'"); - - handleResponse(translation, detected_language); - } - else - { - LL_WARNS("Translate") << "HTTP request for Google Translate failed with status " << status << ", reason: " << reason << LL_ENDL; - handleFailure(); - } - } + EService getService() const; protected: - const std::string m_toLang; - const std::string m_fromLang; + /** + * Save the translation service the key belongs to. + * + * Subclasses need to know it. + * + * @see getService() + */ + KeyVerificationReceiver(EService service); + + /** + * Parse verification response. + * + * Calls setVerificationStatus() with the verification status, + * which is true if HTTP status code is 200. + * + * @see setVerificationStatus() + */ + /*virtual*/ void completedRaw( + U32 http_status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer); + + /** + * Override point for subclasses to handle key verification status. + */ + virtual void setVerificationStatus(bool ok) = 0; + + EService mService; }; - static void translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg); - static float m_GoogleTimeout; + typedef boost::intrusive_ptr<TranslationReceiver> TranslationReceiverPtr; + typedef boost::intrusive_ptr<KeyVerificationReceiver> KeyVerificationReceiverPtr; + + /** + * Translate given text. + * + * @param receiver Object to pass translation result to. + * @param from_lang Source language. Leave empty for auto-detection. + * @param to_lang Target language. + * @param mesg Text to translate. + */ + static void translateMessage(TranslationReceiverPtr &receiver, const std::string &from_lang, const std::string &to_lang, const std::string &mesg); + + /** + * Verify given API key of a translation service. + * + * @param receiver Object to pass verification result to. + * @param key Key to verify. + */ + static void verifyKey(KeyVerificationReceiverPtr& receiver, const std::string& key); static std::string getTranslateLanguage(); private: - static void getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &text); - static bool parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language); - - static LLSD m_Header; - static const char* m_GoogleURL; - static const char* m_GoogleLangSpec; - static const char* m_AcceptHeader; - static const char* m_AcceptType; - static const char* m_AgentHeader; - static const char* m_UserAgent; - - static const char* m_GoogleData; - static const char* m_GoogleTranslation; - static const char* m_GoogleLanguage; + static const LLTranslationAPIHandler& getPreferredHandler(); + static const LLTranslationAPIHandler& getHandler(EService service); + static void sendRequest(const std::string& url, LLHTTPClient::ResponderPtr responder); }; #endif diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index ba53540374..74c4f6d2dc 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -85,7 +85,6 @@ #include "llfloateropenobject.h" #include "llfloaterpay.h" #include "llfloaterperms.h" -#include "llfloaterpostcard.h" #include "llfloaterpostprocess.h" #include "llfloaterpreference.h" #include "llfloaterproperties.h" @@ -107,6 +106,7 @@ #include "llfloatertos.h" #include "llfloatertopobjects.h" #include "llfloatertoybox.h" +#include "llfloatertranslationsettings.h" #include "llfloateruipreview.h" #include "llfloatervoiceeffect.h" #include "llfloaterwhitelistentry.h" @@ -244,10 +244,10 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); - LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostcard>); LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>); LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>); + LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>); LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>); LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>); LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519d4fe7f8..163581ea7f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1209,7 +1209,23 @@ void move_inventory_item( gAgent.sendReliableMessage(); } -void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id) +const LLUUID get_folder_by_itemtype(const LLInventoryItem *src) +{ + LLUUID retval = LLUUID::null; + + if (src) + { + retval = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); + } + + return retval; +} + +void copy_inventory_from_notecard(const LLUUID& destination_id, + const LLUUID& object_id, + const LLUUID& notecard_inv_id, + const LLInventoryItem *src, + U32 callback_id) { if (NULL == src) { @@ -1255,7 +1271,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar body["notecard-id"] = notecard_inv_id; body["object-id"] = object_id; body["item-id"] = src->getUUID(); - body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); + body["folder-id"] = destination_id; body["callback-id"] = (LLSD::Integer)callback_id; request["message"] = "CopyInventoryFromNotecard"; diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 41542a4e0f..7822ef4da6 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -363,7 +363,10 @@ void move_inventory_item( const std::string& new_name, LLPointer<LLInventoryCallback> cb); -void copy_inventory_from_notecard(const LLUUID& object_id, +const LLUUID get_folder_by_itemtype(const LLInventoryItem *src); + +void copy_inventory_from_notecard(const LLUUID& destination_id, + const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id = 0); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 41b4dc01e8..2858330597 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -50,6 +50,7 @@ #include "llvoavatar.h" #include "llvoavatarself.h" #include "llviewerregion.h" +#include "llwebprofile.h" #include "llwebsharing.h" // For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this! #include "llfilepicker.h" #include "llnotifications.h" @@ -319,6 +320,10 @@ public: std::string cookie = content["set-cookie"].asString(); LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost); + + // Set cookie for snapshot publishing. + std::string auth_cookie = cookie.substr(0, cookie.find(";")); // strip path + LLWebProfile::setAuthCookie(auth_cookie); } void completedRaw( @@ -1484,6 +1489,8 @@ void LLViewerMedia::setOpenIDCookie() std::string profile_url = getProfileURL(""); LLURL raw_profile_url( profile_url.c_str() ); + LL_DEBUGS("MediaAuth") << "Requesting " << profile_url << llendl; + LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << llendl; LLHTTPClient::get(profile_url, new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()), headers); @@ -1716,7 +1723,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, mNavigateSuspended(false), mNavigateSuspendedDeferred(false), mIsUpdated(false), - mTrustedBrowser(false) + mTrustedBrowser(false), + mZoomFactor(1.0) { // Set up the mute list observer if it hasn't been set up already. @@ -2302,6 +2310,17 @@ void LLViewerMediaImpl::clearCache() } } + +////////////////////////////////////////////////////////////////////////////////////////// +void LLViewerMediaImpl::setPageZoomFactor( double factor ) +{ + if(mMediaSource && factor != mZoomFactor) + { + mZoomFactor = factor; + mMediaSource->set_page_zoom_factor( factor ); + } +} + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button) { @@ -2450,44 +2469,58 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask) ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::updateJavascriptObject() { + static LLFrameTimer timer ; + if ( mMediaSource ) { // flag to expose this information to internal browser or not. bool enable = gSavedSettings.getBOOL("BrowserEnableJSObject"); + + if(!enable) + { + return ; //no need to go further. + } + + if(timer.getElapsedTimeF32() < 1.0f) + { + return ; //do not update more than once per second. + } + timer.reset() ; + mMediaSource->jsEnableObject( enable ); // these values are only menaingful after login so don't set them before bool logged_in = LLLoginInstance::getInstance()->authSuccess(); if ( logged_in ) { - // current location within a region - LLVector3 agent_pos = gAgent.getPositionAgent(); - double x = agent_pos.mV[ VX ]; - double y = agent_pos.mV[ VY ]; - double z = agent_pos.mV[ VZ ]; - mMediaSource->jsAgentLocationEvent( x, y, z ); - - // current location within the grid - LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); - double global_x = agent_pos_global.mdV[ VX ]; - double global_y = agent_pos_global.mdV[ VY ]; - double global_z = agent_pos_global.mdV[ VZ ]; - mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); - - // current agent orientation - double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); - double angle = rotation * RAD_TO_DEG; - if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation! - mMediaSource->jsAgentOrientationEvent( angle ); - - // current region agent is in - std::string region_name(""); - LLViewerRegion* region = gAgent.getRegion(); - if ( region ) - { - region_name = region->getName(); - }; - mMediaSource->jsAgentRegionEvent( region_name ); + // current location within a region + LLVector3 agent_pos = gAgent.getPositionAgent(); + double x = agent_pos.mV[ VX ]; + double y = agent_pos.mV[ VY ]; + double z = agent_pos.mV[ VZ ]; + mMediaSource->jsAgentLocationEvent( x, y, z ); + + // current location within the grid + LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); + double global_x = agent_pos_global.mdV[ VX ]; + double global_y = agent_pos_global.mdV[ VY ]; + double global_z = agent_pos_global.mdV[ VZ ]; + mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); + + // current agent orientation + double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); + double angle = rotation * RAD_TO_DEG; + if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation! + mMediaSource->jsAgentOrientationEvent( angle ); + + // current region agent is in + std::string region_name(""); + LLViewerRegion* region = gAgent.getRegion(); + if ( region ) + { + region_name = region->getName(); + }; + mMediaSource->jsAgentRegionEvent( region_name ); } // language code the viewer is set to diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 0b69b8f0c1..3db9f0b4e0 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -250,6 +250,7 @@ public: std::string getMediaEntryURL() { return mMediaEntryURL; } void setHomeURL(const std::string& home_url, const std::string& mime_type = LLStringUtil::null) { mHomeURL = home_url; mHomeMimeType = mime_type;}; void clearCache(); + void setPageZoomFactor( double factor ); std::string getMimeType() { return mMimeType; } void scaleMouse(S32 *mouse_x, S32 *mouse_y); void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y); @@ -416,6 +417,7 @@ private: private: // a single media url with some data and an impl. LLPluginClassMedia* mMediaSource; + F64 mZoomFactor; LLUUID mTextureId; bool mMovieImageHasMips; std::string mMediaURL; // The last media url set with NavigateTo diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 2345fbfd6a..22d95563d8 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -968,6 +968,10 @@ U32 info_display_from_string(std::string info_display) { return LLPipeline::RENDER_DEBUG_SCULPTED; } + else if ("wind vectors" == info_display) + { + return LLPipeline::RENDER_DEBUG_WIND_VECTORS; + } else { return 0; @@ -980,6 +984,8 @@ class LLAdvancedToggleInfoDisplay : public view_listener_t { U32 info_display = info_display_from_string( userdata.asString() ); + LL_INFOS("ViewerMenu") << "toggle " << userdata.asString() << LL_ENDL; + if ( info_display != 0 ) { LLPipeline::toggleRenderDebug( (void*)info_display ); @@ -997,6 +1003,8 @@ class LLAdvancedCheckInfoDisplay : public view_listener_t U32 info_display = info_display_from_string( userdata.asString() ); bool new_value = false; + LL_INFOS("ViewerMenu") << "check " << userdata.asString() << LL_ENDL; + if ( info_display != 0 ) { new_value = LLPipeline::toggleRenderDebugControl( (void*)info_display ); @@ -7962,6 +7970,9 @@ void initialize_menus() view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts"); + + commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory)); + // Agent commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying)); enable.add("Agent.enableFlying", boost::bind(&LLAgent::enableFlying)); @@ -8337,6 +8348,8 @@ void initialize_menus() view_listener_t::addMenu(new LLGoToObject(), "GoToObject"); commit.add("PayObject", boost::bind(&handle_give_money_dialog)); + commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory)); + enable.add("EnablePayObject", boost::bind(&enable_pay_object)); enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar)); enable.add("EnableEdit", boost::bind(&enable_object_edit)); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index b9293b3b31..7e830e14bf 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -528,23 +528,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t { gViewerWindow->playSnapshotAnimAndSound(); - LLPointer<LLImageFormatted> formatted; - switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))) - { - case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG: - formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality")); - break; - case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: - formatted = new LLImagePNG; - break; - case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP: - formatted = new LLImageBMP; - break; - default: - llwarns << "Unknown Local Snapshot format" << llendl; - return true; - } - + LLPointer<LLImageFormatted> formatted = new LLImagePNG; formatted->enableOverSize() ; formatted->encode(raw, 0); formatted->disableOverSize() ; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index f0d53668d4..7cae19a1d2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -59,9 +59,9 @@ #include "llfloaterland.h" #include "llfloaterregioninfo.h" #include "llfloaterlandholdings.h" -#include "llfloaterpostcard.h" #include "llfloaterpreference.h" #include "llfloatersidepanelcontainer.h" +#include "llfloatersnapshot.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" #include "llinventoryfunctions.h" @@ -3121,7 +3121,7 @@ protected: { // filter out non-interesting responeses if ( !translation.empty() - && (m_toLang != detected_language) + && (mToLang != detected_language) && (LLStringUtil::compareInsensitive(translation, m_origMesg) != 0) ) { m_chat.mText += " (" + translation + ")"; @@ -3130,10 +3130,13 @@ protected: LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs); } - void handleFailure() + void handleFailure(int status, const std::string& err_msg) { - LLTranslate::TranslationReceiver::handleFailure(); - m_chat.mText += " (?)"; + llwarns << "Translation failed for mesg " << m_origMesg << " toLang " << mToLang << " fromLang " << mFromLang << llendl; + + std::string msg = LLTrans::getString("TranslationFailed", LLSD().with("[REASON]", err_msg)); + LLStringUtil::replaceString(msg, "\n", " "); // we want one-line error messages + m_chat.mText += " (" + msg + ")"; LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs); } @@ -3371,7 +3374,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) const std::string from_lang = ""; // leave empty to trigger autodetect const std::string to_lang = LLTranslate::getTranslateLanguage(); - LLHTTPClient::ResponderPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args); + LLTranslate::TranslationReceiverPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args); LLTranslate::translateMessage(result, from_lang, to_lang, mesg); } else @@ -6467,7 +6470,7 @@ void process_user_info_reply(LLMessageSystem* msg, void**) msg->getString( "UserData", "DirectoryVisibility", dir_visibility); LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email); - LLFloaterPostcard::updateUserInfo(email); + LLFloaterSnapshot::setAgentEmail(email); } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d81e67bfe2..d81e67bfe2 100644..100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 8db72da1ee..d6002e7320 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -113,7 +113,7 @@ LLViewerParcelMgr::LLViewerParcelMgr() mRequestResult(0), mWestSouth(), mEastNorth(), - mSelectedDwell(0.f), + mSelectedDwell(DWELL_NAN), mAgentParcelSequenceID(-1), mHoverRequestResult(0), mHoverWestSouth(), @@ -233,7 +233,7 @@ void LLViewerParcelMgr::getDisplayInfo(S32* area_out, S32* claim_out, S32 price = 0; S32 rent = 0; BOOL for_sale = FALSE; - F32 dwell = 0.f; + F32 dwell = DWELL_NAN; if (mSelected) { @@ -579,7 +579,7 @@ void LLViewerParcelMgr::deselectLand() mCurrentParcel->mBanList.clear(); //mCurrentParcel->mRenterList.reset(); - mSelectedDwell = 0.f; + mSelectedDwell = DWELL_NAN; // invalidate parcel selection so that existing users of this selection can clean up mCurrentParcelSelection->setParcel(NULL); @@ -1663,7 +1663,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use LLViewerParcelMgr::getInstance()->requestParcelMediaURLFilter(); // Request dwell for this land, if it's not public land. - LLViewerParcelMgr::getInstance()->mSelectedDwell = 0.f; + LLViewerParcelMgr::getInstance()->mSelectedDwell = DWELL_NAN; if (0 != local_id) { LLViewerParcelMgr::getInstance()->sendParcelDwellRequest(); diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 68d8978ea8..cac8d8391c 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -43,6 +43,8 @@ class LLParcel; class LLViewerTexture; class LLViewerRegion; +const F32 DWELL_NAN = -1.0f; // A dwell having this value will be displayed as Loading... + // Constants for sendLandOwner //const U32 NO_NEIGHBOR_JOIN = 0x0; //const U32 ALL_NEIGHBOR_JOIN = U32( NORTH_MASK diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 0a9fae68a6..b41ed00f17 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -88,12 +88,12 @@ public: { LLVector3d global_pos; landmark->getGlobalPos(global_pos); - LLViewerInventoryItem* agent_lanmark = + LLViewerInventoryItem* agent_landmark = LLLandmarkActions::findLandmarkForGlobalPos(global_pos); - if (agent_lanmark) + if (agent_landmark) { - showInfo(agent_lanmark->getUUID()); + showInfo(agent_landmark->getUUID()); } else { @@ -104,8 +104,13 @@ public: } else { + LLInventoryItem* item = item_ptr.get(); LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied(); - copy_inventory_from_notecard(object_id, notecard_inventory_id, item_ptr.get(), gInventoryCallbacks.registerCB(cb)); + copy_inventory_from_notecard(get_folder_by_itemtype(item), + object_id, + notecard_inventory_id, + item, + gInventoryCallbacks.registerCB(cb)); } } } @@ -1266,9 +1271,11 @@ bool LLViewerTextEditor::importStream(std::istream& str) void LLViewerTextEditor::copyInventory(const LLInventoryItem* item, U32 callback_id) { - copy_inventory_from_notecard(mObjectID, + copy_inventory_from_notecard(LLUUID::null, // Don't specify a destination -- let the sim do that + mObjectID, mNotecardInventoryID, - item, callback_id); + item, + callback_id); } bool LLViewerTextEditor::hasEmbeddedInventory() diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 280337be0f..786e2b73b1 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -417,6 +417,48 @@ const S32 min_non_tex_system_mem = (128<<20); // 128 MB F32 texmem_lower_bound_scale = 0.85f; F32 texmem_middle_bound_scale = 0.925f; +//static +bool LLViewerTexture::isMemoryForTextureLow() +{ + const static S32 MIN_FREE_TEXTURE_MEMORY = 5 ; //MB + const static S32 MIN_FREE_MAIN_MEMORy = 100 ; //MB + + bool low_mem = false ; + if (gGLManager.mHasATIMemInfo) + { + S32 meminfo[4]; + glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); + + if(meminfo[0] / 1024 < MIN_FREE_TEXTURE_MEMORY) + { + low_mem = true ; + } + } +#if 0 //ignore nVidia cards + else if (gGLManager.mHasNVXMemInfo) + { + S32 free_memory; + glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); + + if(free_memory / 1024 < MIN_FREE_TEXTURE_MEMORY) + { + low_mem = true ; + } + } +#endif + + if(!low_mem) //check main memory, only works for windows. + { + LLMemory::updateMemoryInfo() ; + if(LLMemory::getAvailableMemKB() / 1024 < MIN_FREE_MAIN_MEMORy) + { + low_mem = true ; + } + } + + return low_mem ; +} + //static void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity) { @@ -449,6 +491,11 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity sEvaluationTimer.reset(); } } + else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow()) + { + sDesiredDiscardBias += discard_bias_delta; + sEvaluationTimer.reset(); + } else if (sDesiredDiscardBias > 0.0f && BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < sMaxBoundTextureMemInMegaBytes * texmem_lower_bound_scale && BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < sMaxTotalTextureMemInMegaBytes * texmem_lower_bound_scale) diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index a4a5ae0a5b..b96441127d 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -267,6 +267,7 @@ private: /*virtual*/ LLImageGL* getGLTexture() const ; virtual void switchToCachedImage(); + static bool isMemoryForTextureLow() ; protected: LLUUID mID; S32 mBoostLevel; // enum describing priority level diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index c64488251a..a48572f792 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -530,9 +530,11 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) } llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl; } - if(mImageList.erase(image) != 1) + + S32 count = mImageList.erase(image) ; + if(count != 1) { - llerrs << "Error happens when remove image from mImageList!" << llendl ; + llerrs << "Error happens when remove image from mImageList: " << count << llendl ; } image->setInImageList(FALSE) ; @@ -1053,6 +1055,13 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended) // Treat any card with < 32 MB (shudder) as having 32 MB // - it's going to be swapping constantly regardless S32 max_vram = gGLManager.mVRAM; + + if(gGLManager.mIsATI) + { + //shrink the availabe vram for ATI cards because some of them do not handel texture swapping well. + max_vram = (S32)(max_vram * 0.75f); + } + max_vram = llmax(max_vram, getMinVideoRamSetting()); max_texmem = max_vram; if (!get_recommended) @@ -1060,10 +1069,19 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended) } else { - if (get_recommended) - max_texmem = 128; - else + if (!get_recommended) + { max_texmem = 512; + } + else if (gSavedSettings.getBOOL("NoHardwareProbe")) //did not do hardware detection at startup + { + max_texmem = 512; + } + else + { + max_texmem = 128; + } + llwarns << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << llendl; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 6fcbc401af..cf21ac4e5d 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1789,17 +1789,13 @@ void LLViewerWindow::initBase() mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle(); // Create the toolbar view - // *TODO: Eventually, suppress the existence of this debug setting and turn toolbar FUI on permanently - if (gSavedSettings.getBOOL("DebugToolbarFUI")) - { - // Get a pointer to the toolbar view holder - LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder"); - // Load the toolbar view from file - gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance()); - gToolBarView->setShape(panel_holder->getLocalRect()); - // Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI()) - gToolBarView->setVisible(FALSE); - } + // Get a pointer to the toolbar view holder + LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder"); + // Load the toolbar view from file + gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance()); + gToolBarView->setShape(panel_holder->getLocalRect()); + // Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI()) + gToolBarView->setVisible(FALSE); // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); @@ -4020,10 +4016,11 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d } // Saves an image to the harddrive as "SnapshotX" where X >= 1. -BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image) +BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker) { if (!image) { + llwarns << "No image to save" << llendl; return FALSE; } @@ -4043,7 +4040,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image) pick_type = LLFilePicker::FFSAVE_ALL; // ??? // Get a base file location if needed. - if ( ! isSnapshotLocSet()) + if (force_picker || !isSnapshotLocSet()) { std::string proposed_name( sSnapshotBaseName ); @@ -4083,6 +4080,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image) } while( -1 != err ); // search until the file is not found (i.e., stat() gives an error). + llinfos << "Saving snapshot to " << filepath << llendl; return image->save(filepath); } diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index d10b06f121..0cb7f82b58 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -324,7 +324,7 @@ public: BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ; BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); } void resetSnapshotLoc() const { sSnapshotDir.clear(); } - BOOL saveImageNumbered(LLImageFormatted *image); + BOOL saveImageNumbered(LLImageFormatted *image, bool force_picker = false); // Reset the directory where snapshots are saved. // Client will open directory picker on next snapshot save. diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 380d63c77b..380d63c77b 100644..100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp new file mode 100644 index 0000000000..641f338f2c --- /dev/null +++ b/indra/newview/llwebprofile.cpp @@ -0,0 +1,305 @@ +/** + * @file llwebprofile.cpp + * @brief Web profile access. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llwebprofile.h" + +// libs +#include "llbufferstream.h" +#include "llhttpclient.h" +#include "llimagepng.h" +#include "llplugincookiestore.h" + +// newview +#include "llpanelprofile.h" // for getProfileURL(). FIXME: move the method to LLAvatarActions +#include "llviewermedia.h" // FIXME: don't use LLViewerMedia internals + +// third-party +#include "reader.h" // JSON + +/* + * Workflow: + * 1. LLViewerMedia::setOpenIDCookie() + * -> GET https://my-demo.secondlife.com/ via LLViewerMediaWebProfileResponder + * -> LLWebProfile::setAuthCookie() + * 2. LLWebProfile::uploadImage() + * -> GET "https://my-demo.secondlife.com/snapshots/s3_upload_config" via ConfigResponder + * 3. LLWebProfile::post() + * -> POST <config_url> via PostImageResponder + * -> redirect + * -> GET <redirect_url> via PostImageRedirectResponder + */ + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfileResponders::ConfigResponder + +class LLWebProfileResponders::ConfigResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLWebProfileResponders::ConfigResponder); + +public: + ConfigResponder(LLPointer<LLImageFormatted> imagep) + : mImagep(imagep) + { + } + + /*virtual*/ void completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + const std::string body = strstrm.str(); + + if (status != 200) + { + llwarns << "Failed to get upload config (" << status << ")" << llendl; + LLWebProfile::reportImageUploadStatus(false); + return; + } + + Json::Value root; + Json::Reader reader; + if (!reader.parse(body, root)) + { + llwarns << "Failed to parse upload config: " << reader.getFormatedErrorMessages() << llendl; + LLWebProfile::reportImageUploadStatus(false); + return; + } + + // *TODO: 404 = not supported by the grid + // *TODO: increase timeout or handle 499 Expired + + // Convert config to LLSD. + const Json::Value data = root["data"]; + const std::string upload_url = root["url"].asString(); + LLSD config; + config["acl"] = data["acl"].asString(); + config["AWSAccessKeyId"] = data["AWSAccessKeyId"].asString(); + config["Content-Type"] = data["Content-Type"].asString(); + config["key"] = data["key"].asString(); + config["policy"] = data["policy"].asString(); + config["success_action_redirect"] = data["success_action_redirect"].asString(); + config["signature"] = data["signature"].asString(); + config["add_loc"] = data.get("add_loc", "0").asString(); + config["caption"] = data.get("caption", "").asString(); + + // Do the actual image upload using the configuration. + LL_DEBUGS("Snapshots") << "Got upload config, POSTing image to " << upload_url << ", config=[" << config << "]" << llendl; + LLWebProfile::post(mImagep, config, upload_url); + } + +private: + LLPointer<LLImageFormatted> mImagep; +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfilePostImageRedirectResponder +class LLWebProfileResponders::PostImageRedirectResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLWebProfileResponders::PostImageRedirectResponder); + +public: + /*virtual*/ void completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + if (status != 200) + { + llwarns << "Failed to upload image: " << status << " " << reason << llendl; + LLWebProfile::reportImageUploadStatus(false); + return; + } + + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + const std::string body = strstrm.str(); + llinfos << "Image uploaded." << llendl; + LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << llendl; + LLWebProfile::reportImageUploadStatus(true); + } + +private: + LLPointer<LLImageFormatted> mImagep; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfileResponders::PostImageResponder +class LLWebProfileResponders::PostImageResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLWebProfileResponders::PostImageResponder); + +public: + /*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content) + { + // Viewer seems to fail to follow a 303 redirect on POST request + // (URLRequest Error: 65, Send failed since rewinding of the data stream failed). + // Handle it manually. + if (status == 303) + { + LLSD headers = LLViewerMedia::getHeaders(); + headers["Cookie"] = LLWebProfile::getAuthCookie(); + const std::string& redir_url = content["location"]; + LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << llendl; + LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder, headers); + } + else + { + llwarns << "Unexpected POST status: " << status << " " << reason << llendl; + LL_DEBUGS("Snapshots") << "headers: [" << content << "]" << llendl; + LLWebProfile::reportImageUploadStatus(false); + } + } + + // Override just to suppress warnings. + /*virtual*/ void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfile + +std::string LLWebProfile::sAuthCookie; +LLWebProfile::status_callback_t LLWebProfile::mStatusCallback; + +// static +void LLWebProfile::uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location) +{ + // Get upload configuration data. + std::string config_url(getProfileURL(LLStringUtil::null) + "snapshots/s3_upload_config"); + config_url += "?caption=" + LLURI::escape(caption); + config_url += "&add_loc=" + std::string(add_location ? "1" : "0"); + + LL_DEBUGS("Snapshots") << "Requesting " << config_url << llendl; + LLSD headers = LLViewerMedia::getHeaders(); + headers["Cookie"] = getAuthCookie(); + LLHTTPClient::get(config_url, new LLWebProfileResponders::ConfigResponder(image), headers); +} + +// static +void LLWebProfile::setAuthCookie(const std::string& cookie) +{ + LL_DEBUGS("Snapshots") << "Setting auth cookie: " << cookie << llendl; + sAuthCookie = cookie; +} + +// static +void LLWebProfile::post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url) +{ + if (dynamic_cast<LLImagePNG*>(image.get()) == 0) + { + llwarns << "Image to upload is not a PNG" << llendl; + llassert(dynamic_cast<LLImagePNG*>(image.get()) != 0); + return; + } + + const std::string boundary = "----------------------------0123abcdefab"; + + LLSD headers = LLViewerMedia::getHeaders(); + headers["Cookie"] = getAuthCookie(); + headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; + + std::ostringstream body; + + // *NOTE: The order seems to matter. + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"key\"\r\n\r\n" + << config["key"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"AWSAccessKeyId\"\r\n\r\n" + << config["AWSAccessKeyId"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"acl\"\r\n\r\n" + << config["acl"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n" + << config["Content-Type"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"policy\"\r\n\r\n" + << config["policy"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"signature\"\r\n\r\n" + << config["signature"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"success_action_redirect\"\r\n\r\n" + << config["success_action_redirect"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.png\"\r\n" + << "Content-Type: image/png\r\n\r\n"; + + // Insert the image data. + // *FIX: Treating this as a string will probably screw it up ... + U8* image_data = image->getData(); + for (S32 i = 0; i < image->getDataSize(); ++i) + { + body << image_data[i]; + } + + body << "\r\n--" << boundary << "--\r\n"; + + // postRaw() takes ownership of the buffer and releases it later. + size_t size = body.str().size(); + U8 *data = new U8[size]; + memcpy(data, body.str().data(), size); + + // Send request, successful upload will trigger posting metadata. + LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers); +} + +// static +void LLWebProfile::reportImageUploadStatus(bool ok) +{ + if (mStatusCallback) + { + mStatusCallback(ok); + } +} + +// static +std::string LLWebProfile::getAuthCookie() +{ + // This is needed to test image uploads on Linux viewer built with OpenSSL 1.0.0 (0.9.8 works fine). + const char* debug_cookie = getenv("LL_SNAPSHOT_COOKIE"); + return debug_cookie ? debug_cookie : sAuthCookie; +} diff --git a/indra/newview/llwebprofile.h b/indra/newview/llwebprofile.h new file mode 100644 index 0000000000..10279bffac --- /dev/null +++ b/indra/newview/llwebprofile.h @@ -0,0 +1,69 @@ +/** + * @file llwebprofile.h + * @brief Web profile access. + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLWEBPROFILE_H +#define LL_LLWEBPROFILE_H + +#include "llimage.h" + +namespace LLWebProfileResponders +{ + class ConfigResponder; + class PostImageResponder; + class PostImageRedirectResponder; +}; + +/** + * @class LLWebProfile + * + * Manages interaction with, a web service allowing the upload of snapshot images + * taken within the viewer. + */ +class LLWebProfile +{ + LOG_CLASS(LLWebProfile); + +public: + typedef boost::function<void(bool ok)> status_callback_t; + + static void uploadImage(LLPointer<LLImageFormatted> image, const std::string& caption, bool add_location); + static void setAuthCookie(const std::string& cookie); + static void setImageUploadResultCallback(status_callback_t cb) { mStatusCallback = cb; } + +private: + friend class LLWebProfileResponders::ConfigResponder; + friend class LLWebProfileResponders::PostImageResponder; + friend class LLWebProfileResponders::PostImageRedirectResponder; + + static void post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url); + static void reportImageUploadStatus(bool ok); + static std::string getAuthCookie(); + + static std::string sAuthCookie; + static status_callback_t mStatusCallback; +}; + +#endif // LL_LLWEBPROFILE_H diff --git a/indra/newview/llwind.cpp b/indra/newview/llwind.cpp index 69d3090442..4c39fb5b74 100644 --- a/indra/newview/llwind.cpp +++ b/indra/newview/llwind.cpp @@ -46,16 +46,12 @@ #include "llworld.h" -const F32 CLOUD_DIVERGENCE_COEF = 0.5f; - - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// LLWind::LLWind() -: mSize(16), - mCloudDensityp(NULL) +: mSize(16) { init(); } @@ -65,8 +61,6 @@ LLWind::~LLWind() { delete [] mVelX; delete [] mVelY; - delete [] mCloudVelX; - delete [] mCloudVelY; } @@ -77,31 +71,23 @@ LLWind::~LLWind() void LLWind::init() { + LL_DEBUGS("Wind") << "initializing wind size: "<< mSize << LL_ENDL; + // Initialize vector data mVelX = new F32[mSize*mSize]; mVelY = new F32[mSize*mSize]; - mCloudVelX = new F32[mSize*mSize]; - mCloudVelY = new F32[mSize*mSize]; - S32 i; for (i = 0; i < mSize*mSize; i++) { mVelX[i] = 0.5f; mVelY[i] = 0.5f; - mCloudVelX[i] = 0.0f; - mCloudVelY[i] = 0.0f; } } void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp) { - if (!mCloudDensityp) - { - return; - } - LLPatchHeader patch_header; S32 buffer[16*16]; @@ -122,22 +108,15 @@ void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp) decode_patch(bitpack, buffer); decompress_patch(mVelY, buffer, &patch_header); - - S32 i, j, k; - // HACK -- mCloudVelXY is the same as mVelXY, except we add a divergence - // that is proportional to the gradient of the cloud density - // ==> this helps to clump clouds together - // NOTE ASSUMPTION: cloud density has the same dimensions as the wind field - // This needs to be fixed... causes discrepency at region boundaries for (j=1; j<mSize-1; j++) { for (i=1; i<mSize-1; i++) { k = i + j * mSize; - *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k - 1)); - *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k - mSize)); + *(mVelX + k) = *(mVelX + k); + *(mVelY + k) = *(mVelY + k); } } @@ -145,29 +124,29 @@ void LLWind::decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp) for (j=1; j<mSize-1; j++) { k = i + j * mSize; - *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k) - *(mCloudDensityp + k - 2)); - *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k - mSize)); + *(mVelX + k) = *(mVelX + k); + *(mVelY + k) = *(mVelY + k); } i = 0; for (j=1; j<mSize-1; j++) { k = i + j * mSize; - *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 2) - *(mCloudDensityp + k)); - *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + mSize) - *(mCloudDensityp + k + mSize)); + *(mVelX + k) = *(mVelX + k); + *(mVelY + k) = *(mVelY + k); } j = mSize - 1; for (i=1; i<mSize-1; i++) { k = i + j * mSize; - *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k - 1)); - *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k) - *(mCloudDensityp + k - 2*mSize)); + *(mVelX + k) = *(mVelX + k); + *(mVelY + k) = *(mVelY + k); } j = 0; for (i=1; i<mSize-1; i++) { k = i + j * mSize; - *(mCloudVelX + k) = *(mVelX + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 1) - *(mCloudDensityp + k -1)); - *(mCloudVelY + k) = *(mVelY + k) + CLOUD_DIVERGENCE_COEF * (*(mCloudDensityp + k + 2*mSize) - *(mCloudDensityp + k)); + *(mVelX + k) = *(mVelX + k); + *(mVelY + k) = *(mVelY + k); } } @@ -280,74 +259,6 @@ LLVector3 LLWind::getVelocity(const LLVector3 &pos_region) return r_val * WIND_SCALE_HACK; } - -LLVector3 LLWind::getCloudVelocity(const LLVector3 &pos_region) -{ - llassert(mSize == 16); - // Resolves value of wind at a location relative to SW corner of region - // - // Returns wind magnitude in X,Y components of vector3 - LLVector3 r_val; - F32 dx,dy; - S32 k; - - LLVector3 pos_clamped_region(pos_region); - - F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters(); - - if (pos_clamped_region.mV[VX] < 0.f) - { - pos_clamped_region.mV[VX] = 0.f; - } - else if (pos_clamped_region.mV[VX] >= region_width_meters) - { - pos_clamped_region.mV[VX] = (F32) fmod(pos_clamped_region.mV[VX], region_width_meters); - } - - if (pos_clamped_region.mV[VY] < 0.f) - { - pos_clamped_region.mV[VY] = 0.f; - } - else if (pos_clamped_region.mV[VY] >= region_width_meters) - { - pos_clamped_region.mV[VY] = (F32) fmod(pos_clamped_region.mV[VY], region_width_meters); - } - - - S32 i = llfloor(pos_clamped_region.mV[VX] * mSize / region_width_meters); - S32 j = llfloor(pos_clamped_region.mV[VY] * mSize / region_width_meters); - k = i + j*mSize; - dx = ((pos_clamped_region.mV[VX] * mSize / region_width_meters) - (F32) i); - dy = ((pos_clamped_region.mV[VY] * mSize / region_width_meters) - (F32) j); - - if ((i < mSize-1) && (j < mSize-1)) - { - // Interior points, no edges - r_val.mV[VX] = mCloudVelX[k]*(1.0f - dx)*(1.0f - dy) + - mCloudVelX[k + 1]*dx*(1.0f - dy) + - mCloudVelX[k + mSize]*dy*(1.0f - dx) + - mCloudVelX[k + mSize + 1]*dx*dy; - r_val.mV[VY] = mCloudVelY[k]*(1.0f - dx)*(1.0f - dy) + - mCloudVelY[k + 1]*dx*(1.0f - dy) + - mCloudVelY[k + mSize]*dy*(1.0f - dx) + - mCloudVelY[k + mSize + 1]*dx*dy; - } - else - { - r_val.mV[VX] = mCloudVelX[k]; - r_val.mV[VY] = mCloudVelY[k]; - } - - r_val.mV[VZ] = 0.f; - return r_val * WIND_SCALE_HACK; -} - - -void LLWind::setCloudDensityPointer(F32 *densityp) -{ - mCloudDensityp = densityp; -} - void LLWind::setOriginGlobal(const LLVector3d &origin_global) { mOriginGlobal = origin_global; diff --git a/indra/newview/llwind.h b/indra/newview/llwind.h index 925cb6d642..3b57f07124 100644 --- a/indra/newview/llwind.h +++ b/indra/newview/llwind.h @@ -27,7 +27,6 @@ #ifndef LL_LLWIND_H #define LL_LLWIND_H -//#include "vmath.h" #include "llmath.h" #include "v3math.h" #include "v3dmath.h" @@ -44,25 +43,21 @@ public: ~LLWind(); void renderVectors(); LLVector3 getVelocity(const LLVector3 &location); // "location" is region-local - LLVector3 getCloudVelocity(const LLVector3 &location); // "location" is region-local LLVector3 getVelocityNoisy(const LLVector3 &location, const F32 dim); // "location" is region-local void decompress(LLBitPack &bitpack, LLGroupHeader *group_headerp); LLVector3 getAverage(); - void setCloudDensityPointer(F32 *densityp); void setOriginGlobal(const LLVector3d &origin_global); private: S32 mSize; F32 * mVelX; F32 * mVelY; - F32 * mCloudVelX; - F32 * mCloudVelY; - F32 * mCloudDensityp; LLVector3d mOriginGlobal; void init(); + LOG_CLASS(LLWind); }; #endif diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 265d5dc801..e99657cd22 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -422,7 +422,7 @@ void LLWorldMapView::draw() // Draw something whenever we have enough info if (overlayimage->hasGLTexture()) { - gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); + gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA); gGL.getTexUnit(0)->bind(overlayimage); gGL.color4f(1.f, 1.f, 1.f, 1.f); gGL.begin(LLRender::QUADS); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a50f66f282..93354e6579 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -4383,6 +4383,11 @@ void LLPipeline::renderDebug() } } + if (mRenderDebugMask & RENDER_DEBUG_WIND_VECTORS) + { + gAgent.getRegion()->mWind.renderVectors(); + } + if (mRenderDebugMask & RENDER_DEBUG_COMPOSITION) { // Debug composition layers diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 27ee2745b5..0661de8cec 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -438,7 +438,7 @@ public: RENDER_DEBUG_VERIFY = 0x0000002, RENDER_DEBUG_BBOXES = 0x0000004, RENDER_DEBUG_OCTREE = 0x0000008, - RENDER_DEBUG_PICKING = 0x0000010, + RENDER_DEBUG_WIND_VECTORS = 0x0000010, RENDER_DEBUG_OCCLUSION = 0x0000020, RENDER_DEBUG_POINTS = 0x0000040, RENDER_DEBUG_TEXTURE_PRIORITY = 0x0000080, diff --git a/indra/newview/skins/default/textures/arrow_keys.png b/indra/newview/skins/default/textures/arrow_keys.png Binary files differdeleted file mode 100644 index f19af59251..0000000000 --- a/indra/newview/skins/default/textures/arrow_keys.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png b/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png Binary files differdeleted file mode 100644 index b5781718ec..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png b/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png Binary files differdeleted file mode 100644 index 5a9346fd39..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png Binary files differdeleted file mode 100644 index 20fa40e127..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png Binary files differdeleted file mode 100644 index f1420e0002..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png Binary files differdeleted file mode 100644 index 89a6269edc..0000000000 --- a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png Binary files differnew file mode 100644 index 0000000000..857fa1e047 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png Binary files differnew file mode 100644 index 0000000000..453bb53673 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png Binary files differnew file mode 100644 index 0000000000..135a66ca0d --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png Binary files differnew file mode 100644 index 0000000000..a63aec5e6d --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png Binary files differnew file mode 100644 index 0000000000..1719eb3e84 --- /dev/null +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png diff --git a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png b/indra/newview/skins/default/textures/checkerboard_transparency_bg.png Binary files differdeleted file mode 100644 index 9a16935204..0000000000 --- a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/circle.tga b/indra/newview/skins/default/textures/circle.tga Binary files differdeleted file mode 100644 index d7097e3a35..0000000000 --- a/indra/newview/skins/default/textures/circle.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png Binary files differdeleted file mode 100644 index e47f913db1..0000000000 --- a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png Binary files differdeleted file mode 100644 index e2c67de9c0..0000000000 --- a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png Binary files differdeleted file mode 100644 index 295cd89a57..0000000000 --- a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png Binary files differdeleted file mode 100644 index 0758cbcf0d..0000000000 --- a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png Binary files differdeleted file mode 100644 index c2cbc2b1e5..0000000000 --- a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_label_web.tga b/indra/newview/skins/default/textures/icn_label_web.tga Binary files differdeleted file mode 100644 index 7c9131dfff..0000000000 --- a/indra/newview/skins/default/textures/icn_label_web.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_media.tga b/indra/newview/skins/default/textures/icn_media.tga Binary files differdeleted file mode 100644 index 43dd342c9d..0000000000 --- a/indra/newview/skins/default/textures/icn_media.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga b/indra/newview/skins/default/textures/icn_voice-groupfocus.tga Binary files differdeleted file mode 100644 index 9f48d4609d..0000000000 --- a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_voice-localchat.tga b/indra/newview/skins/default/textures/icn_voice-localchat.tga Binary files differdeleted file mode 100644 index 7cf267eaf5..0000000000 --- a/indra/newview/skins/default/textures/icn_voice-localchat.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga b/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga Binary files differdeleted file mode 100644 index abadb09aaf..0000000000 --- a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icon_day_cycle.tga b/indra/newview/skins/default/textures/icon_day_cycle.tga Binary files differdeleted file mode 100644 index 2d5dee1e94..0000000000 --- a/indra/newview/skins/default/textures/icon_day_cycle.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icon_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tga Binary files differdeleted file mode 100644 index f548126e5a..0000000000 --- a/indra/newview/skins/default/textures/icon_event_adult.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icon_lock.tga b/indra/newview/skins/default/textures/icon_lock.tga Binary files differdeleted file mode 100644 index 23521aa113..0000000000 --- a/indra/newview/skins/default/textures/icon_lock.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/AddItem_Over.png b/indra/newview/skins/default/textures/icons/AddItem_Over.png Binary files differdeleted file mode 100644 index cad6e8d52f..0000000000 --- a/indra/newview/skins/default/textures/icons/AddItem_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/BackArrow_Over.png b/indra/newview/skins/default/textures/icons/BackArrow_Over.png Binary files differdeleted file mode 100644 index b36e03a8cf..0000000000 --- a/indra/newview/skins/default/textures/icons/BackArrow_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/DragHandle.png b/indra/newview/skins/default/textures/icons/DragHandle.png Binary files differdeleted file mode 100644 index c3cbc07a33..0000000000 --- a/indra/newview/skins/default/textures/icons/DragHandle.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Generic_Object.png b/indra/newview/skins/default/textures/icons/Generic_Object.png Binary files differdeleted file mode 100644 index e3a80b2aef..0000000000 --- a/indra/newview/skins/default/textures/icons/Generic_Object.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Inv_Gift.png b/indra/newview/skins/default/textures/icons/Inv_Gift.png Binary files differdeleted file mode 100644 index 5afe85d72d..0000000000 --- a/indra/newview/skins/default/textures/icons/Inv_Gift.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png b/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png Binary files differdeleted file mode 100644 index fcabd4c6d3..0000000000 --- a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png b/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png Binary files differdeleted file mode 100644 index 0e60b417b0..0000000000 --- a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png Binary files differdeleted file mode 100644 index d72f02f708..0000000000 --- a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png Binary files differdeleted file mode 100644 index f82354959e..0000000000 --- a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/TrashItem_Over.png b/indra/newview/skins/default/textures/icons/TrashItem_Over.png Binary files differdeleted file mode 100644 index 1a0eea6c67..0000000000 --- a/indra/newview/skins/default/textures/icons/TrashItem_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png Binary files differdeleted file mode 100644 index b5508423eb..0000000000 --- a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png Binary files differdeleted file mode 100644 index 4813d37198..0000000000 --- a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.png Binary files differdeleted file mode 100644 index 41984c43e4..0000000000 --- a/indra/newview/skins/default/textures/icons/parcel_color_M.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/image_edit_icon.tga b/indra/newview/skins/default/textures/image_edit_icon.tga Binary files differdeleted file mode 100644 index 8666f0bbe6..0000000000 --- a/indra/newview/skins/default/textures/image_edit_icon.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/inv_folder_animation.tga b/indra/newview/skins/default/textures/inv_folder_animation.tga Binary files differdeleted file mode 100644 index 1b4df7a2d8..0000000000 --- a/indra/newview/skins/default/textures/inv_folder_animation.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga Binary files differdeleted file mode 100644 index 04539c2cc4..0000000000 --- a/indra/newview/skins/default/textures/inv_folder_inbox.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_avatar_above_8.tga b/indra/newview/skins/default/textures/map_avatar_above_8.tga Binary files differdeleted file mode 100644 index 193428e530..0000000000 --- a/indra/newview/skins/default/textures/map_avatar_above_8.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_avatar_below_8.tga b/indra/newview/skins/default/textures/map_avatar_below_8.tga Binary files differdeleted file mode 100644 index 9e14bfab90..0000000000 --- a/indra/newview/skins/default/textures/map_avatar_below_8.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_event_adult.tga b/indra/newview/skins/default/textures/map_event_adult.tga Binary files differdeleted file mode 100644 index f548126e5a..0000000000 --- a/indra/newview/skins/default/textures/map_event_adult.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_event_mature.tga b/indra/newview/skins/default/textures/map_event_mature.tga Binary files differdeleted file mode 100644 index 71067c0dfd..0000000000 --- a/indra/newview/skins/default/textures/map_event_mature.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/map_track_8.tga b/indra/newview/skins/default/textures/map_track_8.tga Binary files differdeleted file mode 100644 index 53425ff45b..0000000000 --- a/indra/newview/skins/default/textures/map_track_8.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/model_wizard/divider_line.png b/indra/newview/skins/default/textures/model_wizard/divider_line.png Binary files differdeleted file mode 100644 index 76c9e68767..0000000000 --- a/indra/newview/skins/default/textures/model_wizard/divider_line.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/mute_icon.tga b/indra/newview/skins/default/textures/mute_icon.tga Binary files differdeleted file mode 100644 index 879b9e6188..0000000000 --- a/indra/newview/skins/default/textures/mute_icon.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png Binary files differdeleted file mode 100644 index a91b74819f..0000000000 --- a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png Binary files differdeleted file mode 100644 index a2caf227a7..0000000000 --- a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Help_Over.png b/indra/newview/skins/default/textures/navbar/Help_Over.png Binary files differdeleted file mode 100644 index b9bc0d0f87..0000000000 --- a/indra/newview/skins/default/textures/navbar/Help_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/navbar/Home_Over.png b/indra/newview/skins/default/textures/navbar/Home_Over.png Binary files differdeleted file mode 100644 index d9c6b3842e..0000000000 --- a/indra/newview/skins/default/textures/navbar/Home_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/places_rating_adult.tga b/indra/newview/skins/default/textures/places_rating_adult.tga Binary files differdeleted file mode 100644 index c344fb1e78..0000000000 --- a/indra/newview/skins/default/textures/places_rating_adult.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/places_rating_mature.tga b/indra/newview/skins/default/textures/places_rating_mature.tga Binary files differdeleted file mode 100644 index 61c879bc92..0000000000 --- a/indra/newview/skins/default/textures/places_rating_mature.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/places_rating_pg.tga b/indra/newview/skins/default/textures/places_rating_pg.tga Binary files differdeleted file mode 100644 index 7805dbce60..0000000000 --- a/indra/newview/skins/default/textures/places_rating_pg.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/propertyline.tga b/indra/newview/skins/default/textures/propertyline.tga Binary files differdeleted file mode 100644 index 0c504eea71..0000000000 --- a/indra/newview/skins/default/textures/propertyline.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png b/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png Binary files differdeleted file mode 100644 index be7c87efb6..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png Binary files differdeleted file mode 100644 index 9a3f3703b2..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png Binary files differdeleted file mode 100644 index dd72cc0162..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png Binary files differdeleted file mode 100644 index b537dcbe46..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png Binary files differdeleted file mode 100644 index 7674a75ac3..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png Binary files differdeleted file mode 100644 index 9c9b923a5a..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png Binary files differdeleted file mode 100644 index 15c3053491..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png b/indra/newview/skins/default/textures/quick_tips/move_fly_first.png Binary files differdeleted file mode 100644 index b6e2ce60e4..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png b/indra/newview/skins/default/textures/quick_tips/move_fly_second.png Binary files differdeleted file mode 100644 index 84b63cc338..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_first.png b/indra/newview/skins/default/textures/quick_tips/move_run_first.png Binary files differdeleted file mode 100644 index 16093dc683..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_run_first.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_second.png b/indra/newview/skins/default/textures/quick_tips/move_run_second.png Binary files differdeleted file mode 100644 index 19fa43ec32..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_run_second.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png b/indra/newview/skins/default/textures/quick_tips/move_walk_first.png Binary files differdeleted file mode 100644 index 92d120d53e..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png b/indra/newview/skins/default/textures/quick_tips/move_walk_second.png Binary files differdeleted file mode 100644 index f8e28722be..0000000000 --- a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/show_btn.tga b/indra/newview/skins/default/textures/show_btn.tga Binary files differdeleted file mode 100644 index 5f05f377e3..0000000000 --- a/indra/newview/skins/default/textures/show_btn.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/show_btn_selected.tga b/indra/newview/skins/default/textures/show_btn_selected.tga Binary files differdeleted file mode 100644 index 00a2f34a37..0000000000 --- a/indra/newview/skins/default/textures/show_btn_selected.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/smicon_warn.tga b/indra/newview/skins/default/textures/smicon_warn.tga Binary files differdeleted file mode 100644 index 90ccaa07e5..0000000000 --- a/indra/newview/skins/default/textures/smicon_warn.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/snapshot_download.png b/indra/newview/skins/default/textures/snapshot_download.png Binary files differnew file mode 100644 index 0000000000..6aa1abded5 --- /dev/null +++ b/indra/newview/skins/default/textures/snapshot_download.png diff --git a/indra/newview/skins/default/textures/snapshot_email.png b/indra/newview/skins/default/textures/snapshot_email.png Binary files differnew file mode 100644 index 0000000000..dee784a9bf --- /dev/null +++ b/indra/newview/skins/default/textures/snapshot_email.png diff --git a/indra/newview/skins/default/textures/spacer35.tga b/indra/newview/skins/default/textures/spacer35.tga Binary files differdeleted file mode 100644 index b88bc6680a..0000000000 --- a/indra/newview/skins/default/textures/spacer35.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/square_btn_32x128.tga b/indra/newview/skins/default/textures/square_btn_32x128.tga Binary files differdeleted file mode 100644 index d7ce58dac3..0000000000 --- a/indra/newview/skins/default/textures/square_btn_32x128.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga b/indra/newview/skins/default/textures/square_btn_selected_32x128.tga Binary files differdeleted file mode 100644 index 59ca365aa4..0000000000 --- a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/startup_logo.j2c b/indra/newview/skins/default/textures/startup_logo.j2c Binary files differdeleted file mode 100644 index d1b991f17f..0000000000 --- a/indra/newview/skins/default/textures/startup_logo.j2c +++ /dev/null diff --git a/indra/newview/skins/default/textures/status_busy.tga b/indra/newview/skins/default/textures/status_busy.tga Binary files differdeleted file mode 100644 index 7743d9c7bb..0000000000 --- a/indra/newview/skins/default/textures/status_busy.tga +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png Binary files differdeleted file mode 100644 index 0b91abfb0d..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png Binary files differdeleted file mode 100644 index 33a47236a5..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png Binary files differdeleted file mode 100644 index 421f5e1705..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png Binary files differdeleted file mode 100644 index 905d4c973e..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png Binary files differdeleted file mode 100644 index 909f0d0a47..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png Binary files differdeleted file mode 100644 index cc505c4a30..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png Binary files differdeleted file mode 100644 index 8e0fb9661e..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png Binary files differdeleted file mode 100644 index d4ac451c8e..0000000000 --- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index bb91d32c6c..8702ebde2a 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -39,7 +39,7 @@ with the same filename but different name <texture name="Accordion_Over" file_name="containers/Accordion_Over.png" preload="false" /> <texture name="Accordion_Selected" file_name="containers/Accordion_Selected.png" preload="false" /> -<texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" /> + <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" /> <texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" /> <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" /> @@ -48,9 +48,6 @@ with the same filename but different name <texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" /> <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" /> -<!-- ---> - <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" /> <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" /> <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" /> @@ -157,7 +154,6 @@ with the same filename but different name <texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> - <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> @@ -190,6 +186,10 @@ with the same filename but different name <texture name="Flag" file_name="navbar/Flag.png" preload="false" /> + <texture name="Flyout_Left" file_name="windows/Flyout_Left.png" preload="false" /> + <texture name="Flyout_Pointer" file_name="windows/Flyout_Pointer.png" preload="false" /> + <texture name="Flyout_Right" file_name="windows/Flyout_Right.png" preload="false" /> + <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" /> <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" /> <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" /> @@ -547,6 +547,10 @@ with the same filename but different name <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" /> <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="Snapshot_Download" file_name="snapshot_download.png" preload="false" /> + <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" /> + <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" /> + <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" /> <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" /> @@ -568,21 +572,13 @@ with the same filename but different name <texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" /> <texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" /> - <texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" /> - <texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" /> <texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" /> - <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" /> <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" /> <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" /> - <texture name="TabIcon_Me_Selected" file_name="taskpanel/TabIcon_Me_Selected.png" preload="false" /> <texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" /> <texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" /> - <texture name="TabIcon_People_Selected" file_name="taskpanel/TabIcon_People_Selected.png" preload="false" /> - <texture name="TabIcon_Places_Large" file_name="taskpanel/TabIcon_Places_Large.png" preload="false" /> <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" /> - <texture name="TabIcon_Places_Selected" file_name="taskpanel/TabIcon_Places_Selected.png" preload="false" /> <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" /> - <texture name="TabIcon_Things_Selected" file_name="taskpanel/TabIcon_Things_Selected.png" preload="false" /> <texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> <texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> @@ -646,6 +642,12 @@ with the same filename but different name <texture name="VoicePTT_Lvl3" file_name="bottomtray/VoicePTT_Lvl3.png" preload="false" /> <texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" /> <texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" /> + + <texture name="VoicePTT_Lvl1_Dark" file_name="bottomtray/VoicePTT_Lvl1_Dark.png" preload="false" /> + <texture name="VoicePTT_Lvl2_Dark" file_name="bottomtray/VoicePTT_Lvl2_Dark.png" preload="false" /> + <texture name="VoicePTT_Lvl3_Dark" file_name="bottomtray/VoicePTT_Lvl3_Dark.png" preload="false" /> + <texture name="VoicePTT_Off_Dark" file_name="bottomtray/VoicePTT_Off_Dark.png" preload="false" /> + <texture name="VoicePTT_On_Dark" file_name="bottomtray/VoicePTT_On_Dark.png" preload="false" /> <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" /> @@ -678,9 +680,6 @@ with the same filename but different name <!--WARNING OLD ART BELOW *do not use*--> <texture name="icn_media_web.tga" preload="true" /> <texture name="icn_media_movie.tga" preload="true" /> - <texture name="icn_voice-localchat.tga" /> - <texture name="icn_voice-groupfocus.tga" /> - <texture name="icn_voice-pvtfocus.tga" /> <texture name="jump_left_out.tga" file_name="widgets/jump_left_out.png" /> <texture name="jump_left_in.tga" file_name="widgets/jump_left_in.png" /> @@ -714,7 +713,6 @@ with the same filename but different name <texture name="icon_avatar_offline.tga" /> <texture name="icon_avatar_online.tga" /> - <texture name="icon_day_cycle.tga" /> <texture name="icon_diurnal.tga" /> <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" /> <texture name="icon_top_pick.tga" /> @@ -731,7 +729,6 @@ with the same filename but different name <texture name="map_avatar_16.tga" /> <texture name="map_avatar_8.tga" /> <texture name="map_event.tga" /> - <texture name="map_event_mature.tga" /> <texture name="map_home.tga" /> <texture name="map_infohub.tga" /> <texture name="map_telehub.tga" /> diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png Binary files differdeleted file mode 100644 index bc504d130e..0000000000 --- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_Over.png Binary files differdeleted file mode 100644 index 5a7162addf..0000000000 --- a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png Binary files differdeleted file mode 100644 index fd1d11dd0b..0000000000 --- a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png Binary files differdeleted file mode 100644 index 45bcb0464e..0000000000 --- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png Binary files differdeleted file mode 100644 index dabbd85b34..0000000000 --- a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png Binary files differdeleted file mode 100644 index 064a4c4f7f..0000000000 --- a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png Binary files differdeleted file mode 100644 index 064a4c4f7f..0000000000 --- a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png Binary files differdeleted file mode 100644 index 3e7d803a28..0000000000 --- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_Over.png Binary files differdeleted file mode 100644 index a5c8cbe293..0000000000 --- a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png Binary files differdeleted file mode 100644 index 605d159eaa..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png Binary files differdeleted file mode 100644 index c79547dffd..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png Binary files differdeleted file mode 100644 index e353542ad9..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png Binary files differdeleted file mode 100644 index dd2fceb716..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png Binary files differdeleted file mode 100644 index cf78ea3924..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png Binary files differdeleted file mode 100644 index 53587197da..0000000000 --- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png Binary files differdeleted file mode 100644 index 7afb9c99c3..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png Binary files differdeleted file mode 100644 index 77c4224539..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png Binary files differdeleted file mode 100644 index 8b93dd551e..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png Binary files differdeleted file mode 100644 index 3f207cbea2..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png Binary files differdeleted file mode 100644 index 220df9db25..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png Binary files differdeleted file mode 100644 index 5bbcdcb0b4..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png Binary files differdeleted file mode 100644 index dde367f05e..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png Binary files differdeleted file mode 100644 index d4f30b9adb..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png Binary files differdeleted file mode 100644 index 5bbcdcb0b4..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png Binary files differdeleted file mode 100644 index 467c43fc90..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png Binary files differdeleted file mode 100644 index 2049736897..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png Binary files differdeleted file mode 100644 index 2049736897..0000000000 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png Binary files differdeleted file mode 100644 index b6f900d3bd..0000000000 --- a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png Binary files differdeleted file mode 100644 index 01e0a2d9f1..0000000000 --- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png Binary files differdeleted file mode 100644 index 2ce84ea5be..0000000000 --- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Flyout.png b/indra/newview/skins/default/textures/windows/Flyout.png Binary files differdeleted file mode 100644 index 5596b194c9..0000000000 --- a/indra/newview/skins/default/textures/windows/Flyout.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Flyout_Left.png b/indra/newview/skins/default/textures/windows/Flyout_Left.png Binary files differnew file mode 100644 index 0000000000..6ac9fe2efd --- /dev/null +++ b/indra/newview/skins/default/textures/windows/Flyout_Left.png diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png Binary files differdeleted file mode 100644 index 361fab59e0..0000000000 --- a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Flyout_Right.png b/indra/newview/skins/default/textures/windows/Flyout_Right.png Binary files differnew file mode 100644 index 0000000000..aa1f0625aa --- /dev/null +++ b/indra/newview/skins/default/textures/windows/Flyout_Right.png diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png Binary files differdeleted file mode 100644 index 67bd399358..0000000000 --- a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png b/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png Binary files differdeleted file mode 100644 index 3ab8c3666a..0000000000 --- a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png +++ /dev/null diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index 0ccaab73ba..fc8bc33096 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -10,7 +10,7 @@ <floater.string name="AboutPosition"> Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i regionen [REGION] lokaliseret ved <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[SERVER_RELEASE_NOTES_URL] </floater.string> <floater.string name="AboutSystem"> CPU: [CPU] diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml index bd17224259..76bc40edac 100644 --- a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="CHAT NÆRVED"> - <check_box label="Oversæt chat (håndteret af Google)" name="translate_chat_checkbox"/> + <check_box label="Oversæt chat" name="translate_chat_checkbox"/> </floater> 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 f0f6242fff..890a3038ef 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -31,7 +31,7 @@ <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> <text name="translate_chb_label"> - Benyt maskinel oversættelse ved chat (håndteret af Google) + Benyt maskinel oversættelse ved chat </text> <text name="translate_language_text" width="110"> Oversæt chat til : diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml index 071aab46f4..0d89fae986 100644 --- a/indra/newview/skins/default/xui/da/teleport_strings.xml +++ b/indra/newview/skins/default/xui/da/teleport_strings.xml @@ -20,6 +20,10 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a Beklager, systemet kunne ikke fuldføre teleport forbindelse. Prøv igen om lidt. </message> + <message name="NoHelpIslandTP"> + Du kan ikke teleportere tilbage til Welcome Island. +Gå til 'Welcome Island Puclic' for at prøve tutorial igen. + </message> <message name="noaccess_tport"> Beklager, du har ikke adgang til denne teleport destination. </message> diff --git a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml index bbb4114200..2aabbb18f2 100644 --- a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="CHAT IN DER NÄHE"> - <check_box label="Chat übersetzen (Service von Google)" name="translate_chat_checkbox"/> + <check_box label="Chat übersetzen" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml index d85ca7ce4d..60fa8ff0d8 100644 --- a/indra/newview/skins/default/xui/de/inspect_group.xml +++ b/indra/newview/skins/default/xui/de/inspect_group.xml @@ -26,7 +26,7 @@ Hoch solln sie leben! Elche forever! Und auch Mungos! <text name="group_cost"> Mitgliedschaft: 123 L$ </text> - <button label="Zusammen" name="join_btn"/> + <button label="Beitreten" name="join_btn"/> <button label="Verlassen" name="leave_btn"/> <button label="Profil anzeigen" name="view_profile_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml index c3ce42efa1..2068c39024 100644 --- a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="nearby_chat"> - <check_box label="Chat übersetzen (von Google bereitgestellt)" name="translate_chat_checkbox"/> + <check_box label="Chat übersetzen" name="translate_chat_checkbox"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 104f89b80c..04f6c27330 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -31,7 +31,7 @@ <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> <text name="translate_chb_label"> - Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt) + Beim Chatten Maschinenübersetzung verwenden </text> <text name="translate_language_text"> Chat übersetzen in: diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index 5c8b8302c8..979ccba48d 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -16,7 +16,7 @@ <combo_box.item label="Русский (Russisch) – Beta" name="Russian"/> <combo_box.item label="Türkçe (Türkisch) – Beta" name="Turkish"/> <combo_box.item label="日本語 (Japanisch) - Beta" name="(Japanese)"/> - <combo_box.item label="正體 (Traditionelles Chinesisch) – Beta" name="Traditional Chinese"/> + <combo_box.item label="正體中文 (Traditionelles Chinesisch) – Beta" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (Erfordert Neustart) diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml index 69c952c532..bbfc830688 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -20,6 +20,10 @@ Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab u Das System konnte keine Teleport-Verbindung herstellen. Versuchen Sie es später noch einmal. </message> + <message name="NoHelpIslandTP"> + Sie können nicht zurück nach Welcome Island teleportieren. +Gehen Sie zu „Welcome Island Public“ und wiederholen sie das Tutorial. + </message> <message name="noaccess_tport"> Sie haben leider keinen Zugang zu diesem Teleport-Ziel. </message> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index eaffbf5fa6..1c7b354221 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -487,7 +487,7 @@ name="DwellText" top_delta="0" width="186"> - 0 + Loading... </text> <button diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 2d973e7d90..6009821f7f 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -16,11 +16,11 @@ save_rect="true" save_visibility="true" title="AVATAR PICKER" - width="635"> + width="700"> <web_browser top="25" height="200" - width="635" + width="700" follows="all" name="avatar_picker_contents" trusted_content="true"/> diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml index b9c415633f..0637eedfb2 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml @@ -23,6 +23,5 @@ right="-1" top="1" bottom="-1" - ignore_ui_scale="false" name="browser"/> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml index 989b4a0580..87606c1a2a 100644 --- a/indra/newview/skins/default/xui/en/floater_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/floater_chat_bar.xml @@ -15,6 +15,7 @@ min_height="60" min_width="150" can_resize="true" + default_tab_group="1" name="chat_bar" width="380"> <panel @@ -26,50 +27,56 @@ visible="false" filename="panel_nearby_chat.xml" name="nearby_chat" /> - <panel width="380" height="31" left="0" bottom="-1" follows="left|right|bottom"> - <line_editor - border_style="line" - border_thickness="1" - follows="left|right" - height="23" - label="Click here to chat." - layout="topleft" - left_delta="7" - left="0" - max_length_bytes="1023" - name="chat_box" - text_pad_left="5" - text_pad_right="25" - tool_tip="Press Enter to say, Ctrl+Enter to shout" - top="2" - width="335" /> - <output_monitor - auto_update="true" - follows="right" - draw_border="false" - height="16" - layout="topleft" - left_pad="-24" - mouse_opaque="true" - name="chat_zone_indicator" - top="6" - visible="true" - width="20" /> - <button - follows="right" - is_toggle="true" - width="20" - top="2" - layout="topleft" - left_pad="12" - image_disabled="ComboButton_UpOff" - image_unselected="ComboButton_UpOff" - image_selected="ComboButton_On" - image_pressed="ComboButton_UpSelected" - image_pressed_selected="ComboButton_Selected" - height="23" - name="show_nearby_chat" - tool_tip="Shows/hides nearby chat log"> - </button> + <panel width="380" + height="31" + left="0" + bottom="-1" + follows="left|right|bottom" + tab_group="1"> + <line_editor + border_style="line" + border_thickness="1" + follows="left|right" + height="23" + label="Click here to chat." + layout="topleft" + left_delta="7" + left="0" + max_length_bytes="1023" + name="chat_box" + text_pad_left="5" + text_pad_right="25" + tool_tip="Press Enter to say, Ctrl+Enter to shout" + top="2" + width="335" /> + <output_monitor + auto_update="true" + follows="right" + draw_border="false" + height="16" + layout="topleft" + left_pad="-24" + mouse_opaque="true" + name="chat_zone_indicator" + top="6" + visible="true" + width="20" /> + <button + follows="right" + is_toggle="true" + width="20" + top="2" + layout="topleft" + left_pad="12" + image_disabled="ComboButton_UpOff" + image_unselected="ComboButton_UpOff" + image_selected="ComboButton_On" + image_pressed="ComboButton_UpSelected" + image_pressed_selected="ComboButton_Selected" + height="23" + chrome="true" + name="show_nearby_chat" + tool_tip="Shows/hides nearby chat log"> + </button> </panel> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index fbaf4f0a8a..fbaf4f0a8a 100644..100755 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml 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 9db6568ee3..ffbb6aa28b 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -8,6 +8,7 @@ layout="topleft" name="outgoing call" help_topic="outgoing_call" + save_dock_state="true" title="CALLING" width="410"> <floater.string diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 91b4ed6954..d7a1510c1c 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -5,400 +5,308 @@ can_minimize="true" can_close="true" follows="left|top" - height="520" + height="600" layout="topleft" name="Snapshot" help_topic="snapshot" save_rect="true" save_visibility="true" title="SNAPSHOT PREVIEW" - width="245"> + width="470"> <floater.string name="unknown"> unknown </floater.string> - <radio_group - height="70" - label="Snapshot type" - layout="topleft" - left="10" - name="snapshot_type_radio" - top="20" - width="205"> -<!-- - <radio_item - height="16" - label="Share to Web" - layout="topleft" - name="share_to_web" - top_pad="0" /> ---> - <radio_item - height="16" - label="Email" - layout="topleft" - name="postcard" - top_pad="2" /> - <radio_item - height="16" - label="My inventory (L$[AMOUNT])" - layout="topleft" - name="texture" - top_pad="2" /> - <radio_item - height="16" - label="Save to my computer" - layout="topleft" - name="local" - top_pad="2" /> - </radio_group> - <ui_ctrl - height="90" - width="125" + <string + name="postcard_progress_str"> + Sending Email + </string> + <string + name="profile_progress_str"> + Posting + </string> + <string + name="inventory_progress_str"> + Saving to Inventory + </string> + <string + name="local_progress_str"> + Saving to Computer + </string> + <string + name="profile_succeeded_str"> + Your Profile Feed has been updated! + </string> + <string + name="postcard_succeeded_str"> + Email Sent! + </string> + <string + name="inventory_succeeded_str"> + Saved to Inventory! + </string> + <string + name="local_succeeded_str"> + Saved to Computer! + </string> + <string + name="profile_failed_str"> + Failed to update your Profile Feed. + </string> + <string + name="postcard_failed_str"> + Failed to send email. + </string> + <string + name="inventory_failed_str"> + Failed to save to inventory. + </string> + <string + name="local_failed_str"> + Failed to save to computer. + </string> + <view_border + bevel_style="in" + follows="left|top" + height="21" + left="10" layout="topleft" - name="thumbnail_placeholder" - top_pad="6" + name="img_info_border" + top="22" + width="50" + /> + <icon + follows="top|left" + height="18" + image_name="Snapshot_Off" + layout="topleft" + left_delta="-5" + mouse_opaque="true" + name="refresh_icon" + top_delta="3" + width="36" /> + <button follows="left|top" - left="10" - /> - <text - type="string" - font="SansSerifSmall" - length="1" - follows="left|top" - height="14" - layout="topleft" - right="-5" - left_delta="0" - halign="right" - name="file_size_label" - top_pad="8" - width="195"> - [SIZE] KB - </text> - <button - follows="left|top" - height="22" - image_overlay="Refresh_Off" - layout="topleft" - left="10" - name="new_snapshot_btn" - width="23" /> - <button - follows="left|top" - height="23" - label="Send" - layout="topleft" - left_pad="5" - right="-5" - name="send_btn" - width="100" /> - <button - follows="left|top" - height="23" - label="Save (L$[AMOUNT])" - layout="topleft" - right="-5" - name="upload_btn" - top_delta="0" - width="110" /> - <flyout_button - follows="left|top" - height="23" - label="Save" - layout="topleft" - right="-5" - name="save_btn" - tool_tip="Save image to a file" - top_delta="0" - width="100"> - <flyout_button.item - label="Save" - name="save_item" - value="save" /> - <flyout_button.item - label="Save As..." - name="saveas_item" - value="save as" /> - </flyout_button> - <button - follows="left|top" - height="23" - label="More" - layout="topleft" - left="10" - name="more_btn" - tool_tip="Advanced options" - width="80" /> + height="22" + image_overlay="Refresh_Off" + layout="topleft" + left_delta="31" + name="new_snapshot_btn" + top_delta="-3" + width="23" /> <button follows="left|top" height="23" - label="Less" + image_overlay="TabIcon_Close_Off" + is_toggle="true" layout="topleft" - left_delta="0" - name="less_btn" + left="240" + name="advanced_options_btn" tool_tip="Advanced options" top_delta="0" - width="80" /> - <button - follows="left|top" - height="23" - label="Cancel" - layout="topleft" - right="-5" - left_pad="5" - name="discard_btn" - width="110" /> - <text - type="string" - length="1" - follows="top|left" - height="12" - layout="topleft" - left="10" - name="type_label2" - top_pad="5" - width="127"> - Size - </text> - <text - type="string" - length="1" - follows="top|left" - height="12" - layout="topleft" - left_pad="5" - name="format_label" - top_delta="0" - width="70"> - Format - </text> - <combo_box - height="23" - label="Resolution" - layout="topleft" - left="10" - name="postcard_size_combo" - width="120"> - <combo_box.item - label="Current Window" - name="CurrentWindow" - value="[i0,i0]" /> - <combo_box.item - label="640x480" - name="640x480" - value="[i640,i480]" /> - <combo_box.item - label="800x600" - name="800x600" - value="[i800,i600]" /> - <combo_box.item - label="1024x768" - name="1024x768" - value="[i1024,i768]" /> - <combo_box.item - label="Custom" - name="Custom" - value="[i-1,i-1]" /> - </combo_box> - <combo_box - height="23" - label="Resolution" - layout="topleft" - left_delta="0" - name="texture_size_combo" - top_delta="0" - width="127"> - <combo_box.item - label="Current Window" - name="CurrentWindow" - value="[i0,i0]" /> - <combo_box.item - label="Small (128x128)" - name="Small(128x128)" - value="[i128,i128]" /> - <combo_box.item - label="Medium (256x256)" - name="Medium(256x256)" - value="[i256,i256]" /> - <combo_box.item - label="Large (512x512)" - name="Large(512x512)" - value="[i512,i512]" /> - <combo_box.item - label="Custom" - name="Custom" - value="[i-1,i-1]" /> - </combo_box> - <combo_box - height="23" - label="Resolution" - layout="topleft" - left_delta="0" - name="local_size_combo" - top_delta="0" - width="127"> - <combo_box.item - label="Current Window" - name="CurrentWindow" - value="[i0,i0]" /> - <combo_box.item - label="320x240" - name="320x240" - value="[i320,i240]" /> - <combo_box.item - label="640x480" - name="640x480" - value="[i640,i480]" /> - <combo_box.item - label="800x600" - name="800x600" - value="[i800,i600]" /> - <combo_box.item - label="1024x768" - name="1024x768" - value="[i1024,i768]" /> - <combo_box.item - label="1280x1024" - name="1280x1024" - value="[i1280,i1024]" /> - <combo_box.item - label="1600x1200" - name="1600x1200" - value="[i1600,i1200]" /> - <combo_box.item - label="Custom" - name="Custom" - value="[i-1,i-1]" /> - </combo_box> - <combo_box - height="23" - label="Format" - layout="topleft" - left_pad="5" - name="local_format_combo" - width="70"> - <combo_box.item - label="PNG" - name="PNG" /> - <combo_box.item - label="JPEG" - name="JPEG" /> - <combo_box.item - label="BMP" - name="BMP" /> - </combo_box> - <spinner - allow_text_entry="false" - decimal_digits="0" - follows="left|top" - height="20" - increment="32" - label="Width" - label_width="40" - layout="topleft" - left="10" - max_val="6016" - min_val="32" - name="snapshot_width" - top_pad="10" - width="95" /> - <spinner - allow_text_entry="false" - decimal_digits="0" - follows="left|top" - height="20" - increment="32" - label="Height" - label_width="40" - layout="topleft" - left_pad="5" - max_val="6016" - min_val="32" - name="snapshot_height" - top_delta="0" - width="95" /> - <check_box - bottom_delta="20" - label="Constrain proportions" - layout="topleft" - left="10" - name="keep_aspect_check" /> - <slider - decimal_digits="0" - follows="left|top" - height="15" - increment="1" - initial_value="75" - label="Image quality" - label_width="124" - layout="topleft" - left_delta="0" - max_val="100" - name="image_quality_slider" - top_pad="5" - width="228" /> - <text - type="string" - length="1" + width="23" /> + <ui_ctrl + height="160" + width="250" + layout="topleft" + name="thumbnail_placeholder" + top="50" + follows="left|top" + left="10"> + <loading_indicator + follows="left|top" + height="48" + layout="topleft" + name="working_indicator" + left="101" + top="46" + visible="false" + width="48" /> + <text + follows="left|top|right" + font="SansSerifBold" + height="14" + layout="topleft" + left="5" + length="1" + halign="center" + name="working_lbl" + right="-5" + top="98" + translate="false" + type="string" + visible="false" + width="130"> + Working + </text> + </ui_ctrl> + <view_border + bevel_style="in" + height="21" + width="250" + layout="topleft" + name="img_info_border" + top_pad="3" + follows="left|top" + left_delta="0" + /> + <text + type="string" + font="SansSerifSmall" + length="1" + follows="left|top" + height="14" + layout="topleft" + left_delta="5" + halign="left" + name="image_res_text" + top_delta="5" + width="100"> + [WIDTH] x [HEIGHT] px + </text> + <text + follows="left|top" + font="SansSerifSmall" + height="14" + layout="topleft" + left="200" + length="1" + halign="right" + name="file_size_label" + top_delta="0" + type="string" + width="50"> + [SIZE] KB + </text> + <panel_container follows="left|top" - height="13" + height="360" layout="topleft" - left="10" - name="layer_type_label" - top_pad="5" - width="50"> - Capture: - </text> - <combo_box - height="23" - label="Image Layers" - layout="topleft" - left="30" - name="layer_types" - width="145"> - <combo_box.item - label="Colors" - name="Colors" - value="colors" /> - <combo_box.item - label="Depth" - name="Depth" - value="depth" /> - </combo_box> - <check_box - label="Interface" - layout="topleft" - left="30" + left="0" + name="panel_container" + default_panel_name="panel_snapshot_options" top_pad="10" - width="180" - name="ui_check" /> - <check_box - label="HUDs" - layout="topleft" - left="30" - top_pad="10" - width="180" - name="hud_check" /> - <check_box - label="Keep open after saving" - layout="topleft" - left="10" - top_pad="8" - width="180" - name="keep_open_check" /> - <check_box - label="Freeze frame (fullscreen)" + width="270"> + <panel + class="llpanelsnapshotoptions" + filename="panel_snapshot_options.xml" + follows="all" + layout="topleft" + left="0" + name="panel_snapshot_options" + top="0" /> + <panel + class="llpanelsnapshotprofile" + follows="all" + layout="topleft" + name="panel_snapshot_profile" + filename="panel_snapshot_profile.xml" /> + <panel + class="llpanelsnapshotpostcard" + follows="all" + layout="topleft" + name="panel_snapshot_postcard" + filename="panel_snapshot_postcard.xml" /> + <panel + class="llpanelsnapshotinventory" + follows="all" + layout="topleft" + name="panel_snapshot_inventory" + filename="panel_snapshot_inventory.xml" /> + <panel + class="llpanelsnapshotlocal" + follows="all" + layout="topleft" + name="panel_snapshot_local" + filename="panel_snapshot_local.xml" /> + </panel_container> + <panel + height="295" layout="topleft" - left="10" - top_pad="8" - width="180" - name="freeze_frame_check" /> - <check_box - label="Auto-refresh" - layout="topleft" - left="10" - top_pad="8" - width="180" - name="auto_snapshot_check" /> + left="270" + name="advanced_options_panel" + top="20" + width="200"> + <text + type="string" + font="SansSerifSmall" + length="1" + follows="left|top" + height="14" + layout="topleft" + left="10" + halign="left" + name="advanced_options_label" + right="-10" + top="10"> + ADVANCED OPTIONS + </text> + <view_border + bevel_style="in" + follows="left|top|right" + height="1" + left="10" + layout="topleft" + name="advanced_options_hr" + right="-10" + top_pad="5" + /> + <text + type="string" + length="1" + follows="left|top" + height="13" + layout="topleft" + left="10" + name="layer_type_label" + top_pad="10" + width="50"> + Capture: + </text> + <combo_box + follows="left|top|right" + height="23" + label="Image Layers" + layout="topleft" + left="30" + name="layer_types" + right="-10"> + <combo_box.item + label="Colors" + name="Colors" + value="colors" /> + <combo_box.item + label="Depth" + name="Depth" + value="depth" /> + </combo_box> + <check_box + label="Interface" + layout="topleft" + left="30" + top_pad="10" + width="180" + name="ui_check" /> + <check_box + label="HUDs" + layout="topleft" + left="30" + top_pad="10" + width="180" + name="hud_check" /> + <check_box + label="Freeze frame (fullscreen)" + layout="topleft" + left="10" + top_pad="8" + width="180" + name="freeze_frame_check" /> + <check_box + label="Auto-refresh" + layout="topleft" + left="10" + top_pad="8" + width="180" + name="auto_snapshot_check" /> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml index c7e09bf45e..493d44a9cf 100644 --- a/indra/newview/skins/default/xui/en/floater_toybox.xml +++ b/indra/newview/skins/default/xui/en/floater_toybox.xml @@ -5,7 +5,7 @@ can_minimize="false" can_resize="false" default_tab_group="1" - height="460" + height="330" help_topic="toybox" layout="topleft" legacy_header_height="18" @@ -13,7 +13,7 @@ open_positioning="centered" save_rect="true" single_instance="true" - title="CUSTOMIZE TOOLBARS" + title="TOOLBAR BUTTONS" width="650"> <text follows="left|top" @@ -46,7 +46,7 @@ Buttons will appear as shown or as icon-only depending on each toolbar's settings. </text> <toolbar - bottom="395" + bottom="265" button_display_mode="icons_with_text" follows="all" left="20" @@ -82,20 +82,32 @@ <panel bevel_style="none" border="true" - bottom="396" + bottom="266" follows="left|bottom|right" left="20" right="-20" - top="396" /> + top="266" /> + <button + follows="left|bottom|right" + height="23" + label="Clear all toolbars" + label_selected="Clear all toolbars" + layout="topleft" + left="185" + name="btn_clear_all" + top="285" + width="130"> + <button.commit_callback function="Toybox.ClearAll" /> + </button> <button follows="left|bottom|right" height="23" label="Restore defaults" label_selected="Restore defaults" layout="topleft" - left="260" + left="335" name="btn_restore_defaults" - top="415" + top="285" width="130"> <button.commit_callback function="Toybox.RestoreDefaults" /> </button> diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml new file mode 100644 index 0000000000..a212ce7889 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + height="310" + layout="topleft" + name="floater_translation_settings" + help_topic="translation_settings" + save_rect="true" + title="CHAT TRANSLATION SETTINGS" + width="485"> + + <string name="bing_api_key_not_verified">Bing appID not verified. Please try again.</string> + <string name="google_api_key_not_verified">Google API key not verified. Please try again.</string> + + <string name="bing_api_key_verified">Bing appID verified.</string> + <string name="google_api_key_verified">Google API key verified.</string> + + <check_box + height="16" + label="Enable machine translation while chatting" + layout="topleft" + left="10" + name="translate_chat_checkbox" + top="30" + width="20" /> + <text + height="20" + follows="left|top" + layout="topleft" + left="40" + name="translate_language_label" + top_pad="20" + width="130"> + Translate chat into: + </text> + <combo_box + allow_text_entry="true" + follows="left|top" + height="23" + left_pad="10" + max_chars="135" + mouse_opaque="true" + name="translate_language_combo" + top_delta="-5" + width="190"> + <combo_box.item + label="System Default" + name="System Default Language" + value="default" /> + <combo_box.item + label="English" + name="English" + value="en" /> + <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. --> + <combo_box.item + label="Dansk (Danish)" + name="Danish" + value="da" /> + <combo_box.item + label="Deutsch (German)" + name="German" + value="de" /> + <combo_box.item + label="Español (Spanish)" + name="Spanish" + value="es" /> + <combo_box.item + label="Français (French)" + name="French" + value="fr" /> + <combo_box.item + label="Italiano (Italian)" + name="Italian" + value="it" /> + <combo_box.item + label="Magyar (Hungarian)" + name="Hungarian" + value="hu" /> + <combo_box.item + label="Nederlands (Dutch)" + name="Dutch" + value="nl" /> + <combo_box.item + label="Polski (Polish)" + name="Polish" + value="pl" /> + <combo_box.item + label="Português (Portuguese)" + name="Portugese" + value="pt" /> + <combo_box.item + label="Русский (Russian)" + name="Russian" + value="ru" /> + <combo_box.item + label="Türkçe (Turkish)" + name="Turkish" + value="tr" /> + <combo_box.item + label="Українська (Ukrainian)" + name="Ukrainian" + value="uk" /> + <combo_box.item + label="中文 (正體) (Chinese)" + name="Chinese" + value="zh" /> + <combo_box.item + label="日本語 (Japanese)" + name="Japanese" + value="ja" /> + <combo_box.item + label="한국어 (Korean)" + name="Korean" + value="ko" /> + </combo_box> + + <text + follows="top|left|right" + height="15" + layout="topleft" + left="40" + name="tip" + top_pad="20" + width="330" + wrap="true"> + Choose translation service: + </text> + + <radio_group + follows="top|left" + height="80" + layout="topleft" + left_delta="10" + name="translation_service_rg" + top_pad="20" + width="320"> + <radio_item + initial_value="bing" + label="Bing Translator" + layout="topleft" + name="bing" /> + <radio_item + initial_value="google" + label="Google Translate" + layout="topleft" + name="google" + top_pad="55" /> + </radio_group> + + <text + type="string" + length="1" + follows="top|right" + height="20" + layout="topleft" + left="70" + name="bing_api_key_label" + top_pad="-55" + width="85"> + Bing [http://www.bing.com/developers/createapp.aspx AppID]: + </text> + <line_editor + default_text="Enter Bing AppID and click "Verify"" + follows="top|left" + height="20" + layout="topleft" + left_pad="10" + max_length_chars="50" + top_delta="-4" + name="bing_api_key" + width="210" /> + <button + follows="left|top" + height="23" + label="Verify" + layout="topleft" + left_pad="10" + name="verify_bing_api_key_btn" + top_delta="-2" + width="90" /> + + <text + follows="top|right" + height="20" + layout="topleft" + left="70" + length="1" + name="google_api_key_label" + top_pad="50" + type="string" + width="85"> + Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]: + </text> + <line_editor + default_text="Enter Google API key and click "Verify"" + follows="top|left" + height="20" + layout="topleft" + left_pad="10" + max_length_chars="50" + top_delta="-4" + name="google_api_key" + width="210" /> + <button + follows="left|top" + height="23" + label="Verify" + layout="topleft" + left_pad="10" + name="verify_google_api_key_btn" + top_delta="-2" + width="90" /> + + <text + follows="top|right" + height="20" + layout="topleft" + left="185" + length="1" + name="google_links_text" + top_delta="-23" + type="string" + width="100"> + [http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Stats] + </text> + + <button + follows="left|top" + height="23" + label="OK" + layout="topleft" + right="-120" + name="ok_btn" + top="-30" + width="100" /> + <button + follows="left|top" + height="23" + label="Cancel" + layout="topleft" + left_pad="10" + name="cancel_btn" + width="100" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index 93a04050b6..6807b01fa3 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -89,7 +89,7 @@ visible="true" width="20" /> </layout_panel> - <layout_panel name="leave_call_panel" height="26" auto_resize="false"> + <layout_panel name="leave_call_panel" height="26" min_height="26" user_resize="false" auto_resize="false"> <layout_stack clip="true" follows="left|top|right" diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml index ef3dd844cd..e83257d2a0 100644 --- a/indra/newview/skins/default/xui/en/inspect_remote_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml @@ -36,7 +36,7 @@ height="16" left="8" name="object_owner_label" - width="55" + width="65" top_pad="12"> Owner: </text> diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml index 59912b5503..fbe40a7244 100644 --- a/indra/newview/skins/default/xui/en/menu_toolbars.xml +++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml @@ -3,9 +3,15 @@ layout="topleft" name="Toolbars Popup" visible="false"> - <menu_item_call label="Choose buttons..." + <menu_item_call label="Remove this button" layout="topleft" - name="Chose Buttons"> + name="Remove button"> + <menu_item_call.on_click function="Toolbars.RemoveSelectedCommand" /> + </menu_item_call> + <menu_item_separator layout="topleft" /> + <menu_item_call label="Toolbar buttons..." + layout="topleft" + name="Choose Buttons"> <menu_item_call.on_click function="Floater.Show" parameter="toybox" /> </menu_item_call> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 63e50b0b9f..263d961be1 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -43,6 +43,15 @@ function="Floater.Toggle" parameter="inventory" /> </menu_item_check> + <menu_item_call + label="New Inventory Window" + name="NewInventoryWindow" + shortcut="control|shift|I" + visible="false"> + <menu_item_call.on_click + function="Inventory.NewWindow" + parameter="" /> + </menu_item_call> <menu_item_check label="Gestures..." name="Gestures" @@ -166,7 +175,7 @@ parameter="preferences" /> </menu_item_call> <menu_item_call - label="Toolbars..." + label="Toolbar buttons..." name="Toolbars" shortcut="control|T"> <menu_item_call.on_click @@ -529,13 +538,13 @@ <menu create_jump_keys="true" - label="Enviroment Editor" - name="Enviroment Editor" + label="Environment Editor" + name="Environment Editor" tear_off="true"> <menu_item_call - label="Enviroment Settings..." - name="Enviroment Settings"> + label="Environment Settings..." + name="Environment Settings"> <menu_item_call.on_click function="World.EnvSettings" parameter="editor"/> @@ -2437,6 +2446,16 @@ parameter="raycast" /> </menu_item_check> <menu_item_check + label="Wind Vectors" + name="Wind Vectors"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="wind vectors" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="wind vectors" /> + </menu_item_check> + <menu_item_check label="Render Complexity" name="rendercomplexity"> <menu_item_check.on_check diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 3ed8c30ca8..e4458f33b1 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4636,7 +4636,21 @@ Are you sure you want to quit? name="ConfirmRestoreToybox" type="alertmodal"> <unique/> -Are you sure you want to restore your default buttons and toolbars? +This action will restore your default buttons and toolbars. + +You cannot undo this action. + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> + </notification> + + <notification + icon="alertmodal.tga" + name="ConfirmClearAllToybox" + type="alertmodal"> + <unique/> +This action will return all buttons to the toolbox and your toolbars will be empty. You cannot undo this action. <usetemplate @@ -4644,7 +4658,7 @@ You cannot undo this action. notext="Cancel" yestext="OK"/> </notification> - + <notification icon="alertmodal.tga" name="DeleteItems" diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml index 8e8d8e6505..0f8c37c691 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml @@ -32,7 +32,7 @@ name="Upper Fabric" tool_tip="Click to choose a picture" top="10" - width="74" > + width="75" > <texture_picker.commit_callback function="TexturePicker.Commit" /> </texture_picker> diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 3835cd17b6..6521bf2a4e 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -22,17 +22,17 @@ top="600" <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp --> <web_browser tab_stop="false" -trusted_content="true" -bg_opaque_color="Black" -border_visible="false" -bottom="600" -follows="all" -left="0" -name="login_html" -start_url="" -top="0" -height="600" - width="980" /> + trusted_content="true" + bg_opaque_color="Black" + border_visible="false" + bottom="600" + follows="all" + left="0" + name="login_html" + start_url="" + top="0" + height="600" + width="980"/> <layout_stack follows="left|bottom|right" name="login_widgets" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml index f766236b2e..d492f9bd68 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml @@ -11,7 +11,7 @@ control_name="TranslateChat" enabled="true" height="16" - label="Translate chat (powered by Google)" + label="Translate chat" layout="topleft" left="5" name="translate_chat_checkbox" diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 5d7334f780..670aa47313 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -202,7 +202,7 @@ background_visible="true" </layout_panel> <layout_panel - follows="bottom|left|right" + follows="bottom|right" height="23" layout="bottomleft" left_pad="0" @@ -212,7 +212,7 @@ background_visible="true" auto_resize="true" width="24"> <menu_button - follows="bottom|left|right" + follows="bottom|right" height="23" image_disabled="ComboButton_UpOff" image_unselected="ComboButton_UpOff" diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/panel_postcard_message.xml index adc2433105..e9f322f590 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/panel_postcard_message.xml @@ -1,117 +1,87 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_minimize="false" - can_resize="true" +<panel height="380" layout="topleft" - min_height="380" - min_width="490" - name="Postcard" - help_topic="postcard" - title="EMAIL SNAPSHOT" + name="panel_postcard_message" width="490"> - <floater.string - name="default_subject"> - Postcard from [SECOND_LIFE]. - </floater.string> - <floater.string - name="default_message"> - Check this out! - </floater.string> - <floater.string - name="upload_message"> - Sending... - </floater.string> <text type="string" length="1" bottom="35" follows="top|left" font="SansSerif" + height="16" layout="topleft" left="12" - name="to_label"> - Recipient's Email: + name="to_label" + top="10" + width="60"> + To: </text> <line_editor control_name="LastPostcardRecipient" - follows="left|top" + follows="left|top|right" height="20" layout="topleft" - left_delta="148" + left_pad="10" name="to_form" - top_delta="-4" - width="150" /> - <text - type="string" - length="1" - bottom_delta="23" - follows="top|left" - font="SansSerif" - layout="topleft" - left="12" - name="from_label"> - Your Email: - </text> - <line_editor - follows="left|top" - height="20" - layout="topleft" - left_delta="148" - name="from_form" - top_delta="-4" - width="150" /> + right="-10" + top_delta="-4" /> <text type="string" length="1" bottom_delta="23" follows="top|left" font="SansSerif" + height="16" layout="topleft" left="12" - name="name_label"> - Your Name: + name="name_label" + width="60"> + From: </text> <line_editor - follows="left|top" + follows="left|top|right" height="20" layout="topleft" - left_delta="148" + left_pad="10" max_length_bytes="100" name="name_form" - top_delta="-4" - width="150" /> + right="-10" + top_delta="-4" /> <text type="string" length="1" bottom_delta="23" follows="top|left" font="SansSerif" + height="16" layout="topleft" left="12" - name="subject_label"> + name="subject_label" + width="60"> Subject: </text> <line_editor - follows="left|top" + follows="left|top|right" height="20" label="Type your subject here." layout="topleft" - left_delta="148" + left_pad="10" max_length_bytes="100" name="subject_form" - top_delta="-4" - width="150" /> + right="-10" + top_delta="-4" /> <text type="string" length="1" bottom_delta="23" - follows="top|left" + follows="top|left|right" font="SansSerif" layout="topleft" left="12" - name="msg_label"> + name="msg_label" + right="-10"> Message: </text> <text_editor @@ -123,9 +93,9 @@ left_delta="0" max_length="700" name="msg_form" - word_wrap="true" + right="-10" top_pad="10" - width="420"> + word_wrap="true"> Type your message here. </text_editor> <button @@ -136,7 +106,10 @@ name="cancel_btn" right="-10" top="350" - width="100" /> + width="100"> + <button.commit_callback + function="Postcard.Cancel" /> + </button> <button follows="right|bottom" height="23" @@ -145,5 +118,8 @@ left_delta="-106" name="send_btn" top_delta="0" - width="100" /> -</floater> + width="100"> + <button.commit_callback + function="Postcard.Send" /> + </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_postcard_settings.xml b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml new file mode 100644 index 0000000000..84e3593798 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_postcard_settings" + width="490"> + <combo_box + follows="left|top|right" + height="23" + label="Resolution" + layout="topleft" + left="10" + name="postcard_size_combo" + right="-10" + top_pad="10"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="640x480" + name="640x480" + value="[i640,i480]" /> + <combo_box.item + label="800x600" + name="800x600" + value="[i800,i600]" /> + <combo_box.item + label="1024x768" + name="1024x768" + value="[i1024,i768]" /> + <combo_box.item + label="Custom" + name="Custom" + value="[i-1,i-1]" /> + </combo_box> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Width" + label_width="40" + layout="topleft" + left="10" + max_val="6016" + min_val="32" + name="postcard_snapshot_width" + top_pad="10" + width="95" /> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Height" + label_width="40" + layout="topleft" + left_pad="5" + max_val="6016" + min_val="32" + name="postcard_snapshot_height" + top_delta="0" + width="95" /> + <check_box + bottom_delta="20" + follows="left|top" + label="Constrain proportions" + layout="topleft" + left="10" + name="postcard_keep_aspect_check" /> + <slider + decimal_digits="0" + follows="left|top" + height="15" + increment="1" + initial_value="75" + label="Image quality" + label_width="80" + layout="topleft" + left="10" + max_val="100" + name="image_quality_slider" + top_pad="7" + width="200" /> + <text + type="string" + follows="left|top" + font="SansSerifSmall" + length="1" + height="14" + layout="topleft" + left_pad="-5" + halign="left" + name="image_quality_level" + top_delta="0" + width="60"> + ([QLVL]) + </text> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 52be805260..caf7fc85f5 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -204,119 +204,16 @@ name="nearby_toasts_fadingtime" top_pad="3" width="325" /> - - <check_box - control_name="TranslateChat" - enabled="true" - height="16" - layout="topleft" - left="30" - name="translate_chat_checkbox" - top_pad="5" - width="400" /> - <!-- *HACK - After storm-1109 will be fixed: instead of using this text_box, word_wrap should be applied for "translate_chat_checkbox" check_box's label.--> - <text - follows="top|left" - height="15" - layout="topleft" - left="50" - name="translate_chb_label" - top_delta="1" - width="450" - wrap="true"> - Use machine translation while chatting (powered by Google) - </text> - <text - top_pad="20" - name="translate_language_text" - follows="left|top" - layout="topleft" - left_delta="20" - height="20" - width="110"> - Translate chat into: - </text> - <combo_box - allow_text_entry="true" - bottom_delta="3" - control_name="TranslateLanguage" - enabled="true" - follows="left|top" - height="23" - left_delta="110" - max_chars="135" - mouse_opaque="true" - name="translate_language_combobox" - width="146"> - <combo_box.item - label="System Default" - name="System Default Language" - value="default" /> - <combo_box.item - label="English" - name="English" - value="en" /> - <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. --> - <combo_box.item - label="Dansk (Danish)" - name="Danish" - value="da" /> - <combo_box.item - label="Deutsch (German)" - name="German" - value="de" /> - <combo_box.item - label="Español (Spanish)" - name="Spanish" - value="es" /> - <combo_box.item - label="Français (French)" - name="French" - value="fr" /> - <combo_box.item - label="Italiano (Italian)" - name="Italian" - value="it" /> - <combo_box.item - label="Magyar (Hungarian)" - name="Hungarian" - value="hu" /> - <combo_box.item - label="Nederlands (Dutch)" - name="Dutch" - value="nl" /> - <combo_box.item - label="Polski (Polish)" - name="Polish" - value="pl" /> - <combo_box.item - label="Português (Portuguese)" - name="Portugese" - value="pt" /> - <combo_box.item - label="Русский (Russian)" - name="Russian" - value="ru" /> - <combo_box.item - label="Türkçe (Turkish)" - name="Turkish" - value="tr" /> - <combo_box.item - label="Українська (Ukrainian)" - name="Ukrainian" - value="uk" /> - <combo_box.item - label="中文 (正體) (Chinese)" - name="Chinese" - value="zh" /> - <combo_box.item - label="日本語 (Japanese)" - name="Japanese" - value="ja" /> - <combo_box.item - label="한국어 (Korean)" - name="Korean" - value="ko" /> - </combo_box> + <button + follows="left|top" + height="23" + label="Chat Translation Settings" + layout="topleft" + left="30" + name="ok_btn" + top="-40" + width="170"> + <button.commit_callback + function="Pref.TranslationSettings" /> + </button> </panel>
\ No newline at end of file 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 0a1c0872e9..4079a80924 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -92,7 +92,7 @@ value="ja" /> <combo_box.item enabled="true" - label="正體 (Traditional Chinese) - Beta" + label="正體中文 (Traditional Chinese) - Beta" name="Traditional Chinese" value="zh" /> </combo_box> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml new file mode 100644 index 0000000000..7b148fa338 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_inventory" + width="490"> + <icon + follows="top|left" + height="18" + image_name="Snapshot_Inventory" + layout="topleft" + left="12" + mouse_opaque="true" + name="title_icon" + top="5" + width="18" /> + <text + follows="top|left|right" + font="SansSerifBold" + height="20" + layout="topleft" + left_pad="12" + length="1" + name="title" + right="-10" + text_color="white" + type="string" + top_delta="5"> + Save to My Inventory + </text> + <view_border + bevel_style="in" + follows="left|top|right" + height="1" + left="10" + layout="topleft" + name="hr" + right="-10" + top_pad="5" + /> + <text + bottom="35" + follows="top|left|right" + font="SansSerif" + height="56" + layout="topleft" + left="12" + length="1" + name="hint_lbl" + top_pad="10" + type="string" + word_wrap="true"> + Saving an image to your inventory costs L$[UPLOAD_COST]. To save your image as a texture select one of the square formats. + </text> + <combo_box + follows="top|left|right" + height="23" + label="Resolution" + layout="topleft" + left_delta="0" + name="texture_size_combo" + right="-10" + top_pad="10"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="Small (128x128)" + name="Small(128x128)" + value="[i128,i128]" /> + <combo_box.item + label="Medium (256x256)" + name="Medium(256x256)" + value="[i256,i256]" /> + <combo_box.item + label="Large (512x512)" + name="Large(512x512)" + value="[i512,i512]" /> + <combo_box.item + label="Custom" + name="Custom" + value="[i-1,i-1]" /> + </combo_box> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Width" + label_width="40" + layout="topleft" + left="10" + max_val="6016" + min_val="32" + name="inventory_snapshot_width" + top_pad="10" + width="95" /> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Height" + label_width="40" + layout="topleft" + left_pad="5" + max_val="6016" + min_val="32" + name="inventory_snapshot_height" + top_delta="0" + width="95" /> + <check_box + bottom_delta="20" + follows="left|top" + label="Constrain proportions" + layout="topleft" + left="10" + name="inventory_keep_aspect_check" /> + <button + follows="right|bottom" + height="23" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-10" + top="350" + width="100"> + <button.commit_callback + function="Inventory.Cancel" /> + </button> + <button + follows="right|bottom" + height="23" + label="Save" + layout="topleft" + left_delta="-106" + name="save_btn" + top_delta="0" + width="100"> + <button.commit_callback + function="Inventory.Save" /> + </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml new file mode 100644 index 0000000000..4d6c4bcdfa --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -0,0 +1,194 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_local" + width="490"> + <icon + follows="top|left" + height="18" + image_name="Snapshot_Download" + layout="topleft" + left="12" + mouse_opaque="true" + name="title_icon" + top="5" + width="18" /> + <text + follows="top|left|right" + font="SansSerifBold" + height="20" + layout="topleft" + left_pad="12" + length="1" + name="title" + right="-10" + text_color="white" + type="string" + top_delta="4"> + Save to My Computer + </text> + <view_border + bevel_style="in" + follows="left|top|right" + height="1" + left="10" + layout="topleft" + name="hr" + right="-10" + top_pad="5" + /> + <combo_box + follows="left|top|right" + height="23" + label="Resolution" + layout="topleft" + left_delta="0" + name="local_size_combo" + right="-10" + top_pad="10"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="320x240" + name="320x240" + value="[i320,i240]" /> + <combo_box.item + label="640x480" + name="640x480" + value="[i640,i480]" /> + <combo_box.item + label="800x600" + name="800x600" + value="[i800,i600]" /> + <combo_box.item + label="1024x768" + name="1024x768" + value="[i1024,i768]" /> + <combo_box.item + label="1280x1024" + name="1280x1024" + value="[i1280,i1024]" /> + <combo_box.item + label="1600x1200" + name="1600x1200" + value="[i1600,i1200]" /> + <combo_box.item + label="Custom" + name="Custom" + value="[i-1,i-1]" /> + </combo_box> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Width" + label_width="40" + layout="topleft" + left="10" + max_val="6016" + min_val="32" + name="local_snapshot_width" + top_pad="10" + width="95" /> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Height" + label_width="40" + layout="topleft" + left_pad="5" + max_val="6016" + min_val="32" + name="local_snapshot_height" + top_delta="0" + width="95" /> + <check_box + bottom_delta="20" + follows="left|top" + label="Constrain proportions" + layout="topleft" + left="10" + name="local_keep_aspect_check" /> + <combo_box + follows="left|top" + height="23" + label="Format" + layout="topleft" + left_delta="0" + name="local_format_combo" + top_pad="10" + width="120"> + <combo_box.item + label="PNG (Lossless)" + name="PNG" + value="PNG" /> + <combo_box.item + label="JPEG" + name="JPEG" + value="JPEG" /> + <combo_box.item + label="BMP (Lossless)" + name="BMP" + value="BMP" /> + </combo_box> + <slider + decimal_digits="0" + follows="left|top" + height="15" + increment="1" + initial_value="75" + label="Image quality" + label_width="80" + layout="topleft" + left="10" + max_val="100" + name="image_quality_slider" + top_pad="7" + width="200" /> + <text + type="string" + follows="left|top" + font="SansSerifSmall" + length="1" + height="14" + layout="topleft" + left_pad="-5" + halign="left" + name="image_quality_level" + top_delta="0" + width="60"> + ([QLVL]) + </text> + <button + follows="right|bottom" + height="23" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-10" + top="350" + width="100"> + <button.commit_callback + function="Local.Cancel" /> + </button> + <button + follows="right|bottom" + height="23" + label="Save" + layout="topleft" + left_delta="-106" + name="save_btn" + top_delta="0" + width="100"> + <button.commit_callback + function="Local.Save" /> + </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml new file mode 100644 index 0000000000..792f6dbec8 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -0,0 +1,148 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="all" + height="240" + layout="topleft" + name="panel_snapshot_options" + width="490"> + <button + follows="left|top|right" + font="SansSerif" + halign="left" + height="38" + image_overlay="Snapshot_Profile" + image_overlay_alignment="left" + image_top_pad="-2" + imgoverlay_label_space="10" + label="Post to My Profile Feed" + layout="topleft" + left="10" + name="save_to_profile_btn" + pad_left="10" + right="-10" + top="5"> + <button.commit_callback + function="Snapshot.SaveToProfile" /> + </button> + <button + follows="left|top|right" + font="SansSerif" + halign="left" + height="38" + image_overlay="Snapshot_Email" + image_overlay_alignment="left" + image_top_pad="-2" + imgoverlay_label_space="10" + label="Email" + layout="topleft" + left_delta="0" + name="save_to_email_btn" + pad_left="10" + right="-10" + top_pad="10"> + <button.commit_callback + function="Snapshot.SaveToEmail" /> + </button> + <button + follows="left|top|right" + font="SansSerif" + halign="left" + height="38" + image_overlay="Snapshot_Inventory" + image_overlay_alignment="left" + image_top_pad="-2" + imgoverlay_label_space="10" + label="Save to My Inventory (L$[AMOUNT])" + layout="topleft" + left_delta="0" + name="save_to_inventory_btn" + pad_left="10" + right="-10" + top_pad="10"> + <button.commit_callback + function="Snapshot.SaveToInventory" /> + </button> + <button + follows="left|top|right" + font="SansSerif" + halign="left" + height="38" + image_overlay="Snapshot_Download" + image_overlay_alignment="left" + image_top_pad="-2" + imgoverlay_label_space="10" + label="Save to My Computer" + layout="topleft" + left_delta="0" + name="save_to_computer_btn" + pad_left="10" + right="-10" + top_pad="10"> + <button.commit_callback + function="Snapshot.SaveToComputer" /> + </button> + <panel + background_visible="true" + bg_alpha_color="0.9 1 0.9 1" + bottom="-10" + follows="left|bottom|right" + font="SansSerifLarge" + halign="center" + height="20" + layout="topleft" + left_delta="0" + length="1" + name="succeeded_panel" + right="-10" + type="string" + visible="false"> + <text + follows="all" + font="SansSerif" + halign="center" + height="18" + layout="topleft" + left="1" + length="1" + name="succeeded_lbl" + right="-1" + text_color="0.2 0.5 0.2 1" + top="4" + translate="false" + type="string"> + Succeeded + </text> + </panel> + <panel + background_visible="true" + bg_alpha_color="1 0.9 0.9 1" + bottom="-10" + follows="left|bottom|right" + font="SansSerifLarge" + halign="center" + height="20" + layout="topleft" + left_delta="0" + length="1" + name="failed_panel" + right="-10" + type="string" + visible="false"> + <text + follows="all" + font="SansSerif" + halign="center" + height="18" + layout="topleft" + left="1" + length="1" + name="failed_lbl" + right="-1" + text_color="0.5 0.2 0.2 1" + top="4" + translate="false" + type="string"> + Failed + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml new file mode 100644 index 0000000000..d8ff043444 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_postcard" + width="490"> + <string + name="default_subject"> + Postcard from [SECOND_LIFE]. + </string> + <string + name="default_message"> + Check this out! + </string> + <string + name="upload_message"> + Sending... + </string> + <string + name="default_subject"> + Postcard from [SECOND_LIFE]. + </string> + <string + name="default_message"> + Check this out! + </string> + <icon + follows="top|left" + height="18" + image_name="Snapshot_Email" + layout="topleft" + left="12" + mouse_opaque="true" + name="title_icon" + top="5" + width="18" /> + <text + follows="top|left|right" + font="SansSerifBold" + height="20" + layout="topleft" + left_pad="12" + length="1" + name="title" + right="-10" + text_color="white" + type="string" + top_delta="3"> + Email + </text> + <button + follows="right|top" + height="23" + is_toggle="true" + label="Message" + layout="topleft" + name="message_btn" + right="-82" + top_delta="-7" + width="70"> + <button.commit_callback + function="Postcard.Message" /> + </button> + <button + follows="right|top" + height="23" + is_toggle="true" + label="Settings" + layout="topleft" + name="settings_btn" + top_delta="0" + right="-10" + width="70"> + <button.commit_callback + function="Postcard.Settings" /> + </button> + <view_border + bevel_style="in" + follows="left|top|right" + height="1" + left="10" + layout="topleft" + name="hr" + right="-10" + top_pad="5" + /> + <panel_container + follows="all" + height="340" + layout="topleft" + left="0" + name="postcard_panel_container" + default_panel_name="panel_postcard_message" + top_pad="10" + width="490"> + <panel + follows="all" + layout="topleft" + name="panel_postcard_message" + filename="panel_postcard_message.xml" /> + <panel + follows="all" + layout="topleft" + name="panel_postcard_settings" + filename="panel_postcard_settings.xml" /> + </panel_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml new file mode 100644 index 0000000000..0760a33f82 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + height="380" + layout="topleft" + name="panel_snapshot_profile" + width="490"> + <icon + follows="top|left" + height="18" + image_name="Snapshot_Profile" + layout="topleft" + left="12" + mouse_opaque="true" + name="title_icon" + top="5" + width="18" /> + <text + follows="top|left|right" + font="SansSerifBold" + height="20" + layout="topleft" + left_pad="12" + length="1" + name="title" + right="-10" + text_color="white" + type="string" + top_delta="4"> + Post to My Profile Feed + </text> + <view_border + bevel_style="in" + follows="left|top|right" + height="1" + left="10" + layout="topleft" + name="hr" + right="-10" + top_pad="5" + /> + <combo_box + follows="left|top" + height="23" + label="Resolution" + layout="topleft" + left_delta="0" + name="profile_size_combo" + top_pad="10" + width="250"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="640x480" + name="640x480" + value="[i640,i480]" /> + <combo_box.item + label="800x600" + name="800x600" + value="[i800,i600]" /> + <combo_box.item + label="1024x768" + name="1024x768" + value="[i1024,i768]" /> + <combo_box.item + label="Custom" + name="Custom" + value="[i-1,i-1]" /> + </combo_box> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Width" + label_width="40" + layout="topleft" + left="10" + max_val="6016" + min_val="32" + name="profile_snapshot_width" + top_pad="10" + width="95" /> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Height" + label_width="40" + layout="topleft" + left_pad="5" + max_val="6016" + min_val="32" + name="profile_snapshot_height" + top_delta="0" + width="95" /> + <check_box + bottom_delta="20" + label="Constrain proportions" + layout="topleft" + left="10" + name="profile_keep_aspect_check" /> + <text + length="1" + follows="top|left|right" + font="SansSerif" + height="16" + layout="topleft" + left="12" + name="caption_label" + right="-10" + top_pad="10" + type="string"> + Caption: + </text> + <text_editor + follows="all" + height="170" + layout="topleft" + left_delta="0" + length="1" + max_length="700" + name="caption" + right="-10" + top_pad="5" + type="string" + word_wrap="true"> + </text_editor> + <check_box + follows="left|bottom" + initial_value="true" + label="Include location" + layout="topleft" + left_delta="0" + name="add_location_cb" + top_pad="15" /> + <button + follows="right|bottom" + height="23" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-10" + top="350" + width="100"> + <button.commit_callback + function="PostToProfile.Cancel" /> + </button> + <button + follows="right|bottom" + height="23" + label="Post" + layout="topleft" + left_delta="-106" + name="post_btn" + top_delta="0" + width="100"> + <button.commit_callback + function="PostToProfile.Send" /> + </button> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 422bbada7f..3239c4e531 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -2,7 +2,7 @@ <panel background_opaque="true" background_visible="true" - bg_opaque_color="MouseGray" + bg_opaque_color="DkGray" chrome="true" follows="top|right" height="19" @@ -39,10 +39,7 @@ width="160" top="1" follows="right|top" - name="balance_bg" - bg_visible="true" - background_opaque="true" - bg_opaque_image="bevel_background"> + name="balance_bg"> <text halign="center" font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml index 79f29777ce..fc527f5f9d 100644 --- a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml @@ -4,7 +4,7 @@ background_opaque="false" bg_opaque_color="Black_50" bg_alpha_color="Black_50" - follows="left|top|right" + follows="left|top" height="19" layout="topleft" name="topinfo_bar" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index c4031de0f8..befcc5dd87 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2183,6 +2183,8 @@ Returns a string with the requested data about the region <string name="Stomach">Stomach</string> <string name="Left Pec">Left Pec</string> <string name="Right Pec">Right Pec</string> + <string name="Neck">Neck</string> + <string name="Avatar Center">Avatar Center</string> <string name="Invalid Attachment">Invalid Attachment Point</string> <!-- Avatar age computation, see LLDateUtil::ageFromDate --> @@ -2269,7 +2271,7 @@ Returns a string with the requested data about the region <string name="NextStipendDay" value="The next stipend day is " /> <string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string> <string name="GroupIndividualShare" value=" Group Individual Share" /> - <string name="GroupColumn" value=" Group" /> + <string name="GroupColumn" value=" Group" /> <string name="Balance">Balance</string> <string name="Credits">Credits</string> <string name="Debits">Debits</string> @@ -3529,6 +3531,10 @@ Try enclosing path to the editor with double quotes. <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string> <string name="ExternalEditorFailedToRun">External editor failed to run.</string> + <!-- Machine translation of chat messahes --> + <string name="TranslationFailed">Translation failed: [REASON]</string> + <string name="TranslationResponseParseError">Error parsing translation response.</string> + <!-- Key names begin --> <string name="Esc">Esc</string> <string name="Space">Space</string> @@ -3705,6 +3711,10 @@ Try enclosing path to the editor with double quotes. <string name="Command_View_Tooltip">Changing camera angle</string> <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string> + <string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string> + <string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string> + <string name="Toolbar_Right_Tooltip" >currently in your right toolbar</string> + <!-- Mesh UI terms --> <string name="Retain%">Retain%</string> <string name="Detail">Detail</string> @@ -3714,4 +3724,12 @@ Try enclosing path to the editor with double quotes. <string name="Wrap">Wrap</string> <string name="Preview">Preview</string> <string name="Normal">Normal</string> + + <!-- Snapshot image quality levels --> + <string name="snapshot_quality_very_low">Very Low</string> + <string name="snapshot_quality_low">Low</string> + <string name="snapshot_quality_medium">Medium</string> + <string name="snapshot_quality_high">High</string> + <string name="snapshot_quality_very_high">Very High</string> + </strings> diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml index bae821d3b5..dce6b8dd6d 100644 --- a/indra/newview/skins/default/xui/en/teleport_strings.xml +++ b/indra/newview/skins/default/xui/en/teleport_strings.xml @@ -20,6 +20,10 @@ If you still cannot teleport, please log out and log back in to resolve the prob Sorry, but system was unable to complete the teleport connection. Try again in a moment. </message> + <message name="NoHelpIslandTP"> +You cannot teleport back to Welcome Island. +Go to 'Welcome Island Public' to repeat the tutorial. + </message> <message name="noaccess_tport"> Sorry, you do not have access to that teleport destination. </message> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index 413ca1d1ef..f47e9874b4 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -12,13 +12,19 @@ tab_stop="false" width="25" /> <chiclet_im_adhoc.speaker - auto_update="true" - draw_border="false" - height="23" - left="25" - name="speaker" - visible="false" - width="20" /> + image_mute="Parcel_VoiceNo_Light" + image_off="VoicePTT_Off_Dark" + image_on="VoicePTT_On_Dark" + image_level_1="VoicePTT_Lvl1_Dark" + image_level_2="VoicePTT_Lvl2_Dark" + image_level_3="VoicePTT_Lvl3_Dark" + auto_update="true" + draw_border="false" + height="24" + left="25" + name="speaker" + visible="false" + width="20" /> <chiclet_im_adhoc.avatar_icon bottom="3" follows="left|top|bottom" diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml index 372a89cbc7..8dfdf95e80 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_group.xml @@ -12,13 +12,19 @@ tab_stop="false" width="25" /> <chiclet_im_group.speaker - auto_update="true" - draw_border="false" - height="25" - left="25" - name="speaker" - visible="false" - width="20" /> + image_mute="Parcel_VoiceNo_Light" + image_off="VoicePTT_Off_Dark" + image_on="VoicePTT_On_Dark" + image_level_1="VoicePTT_Lvl1_Dark" + image_level_2="VoicePTT_Lvl2_Dark" + image_level_3="VoicePTT_Lvl3_Dark" + auto_update="true" + draw_border="false" + height="24" + left="25" + name="speaker" + visible="false" + width="20" /> <chiclet_im_group.group_icon bottom="3" default_icon="Generic_Group" diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml index d27c14f4e7..cef698e577 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml @@ -12,13 +12,19 @@ tab_stop="false" width="25"/> <chiclet_im_p2p.speaker - auto_update="true" - draw_border="false" - height="23" - left="25" - name="speaker" - visible="false" - width="20" /> + image_mute="Parcel_VoiceNo_Light" + image_off="VoicePTT_Off_Dark" + image_on="VoicePTT_On_Dark" + image_level_1="VoicePTT_Lvl1_Dark" + image_level_2="VoicePTT_Lvl2_Dark" + image_level_3="VoicePTT_Lvl3_Dark" + auto_update="true" + draw_border="false" + height="24" + left="25" + name="speaker" + visible="false" + width="20" /> <chiclet_im_p2p.avatar_icon bottom="3" color="white" diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml new file mode 100644 index 0000000000..7a7a6e9a09 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_item.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<inbox_folder_view_item + item_height="20" + item_top_pad="4" + selection_image="Rounded_Square" + > + <new_badge + label="New" + label_offset_horiz="-1" + location="right" + padding_horiz="12.5" + padding_vert="2" + location_offset_hcenter="-23" + border_image="New_Tag_Border" + border_color="DkGray2" + image="New_Tag_Background" + image_color="Black" + /> +</inbox_folder_view_item> diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml index 7e7a9c61cf..0aa478ace9 100644 --- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml +++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml @@ -30,6 +30,8 @@ image_overlay_alignment="left" use_ellipses="true" auto_resize="true" + button_flash_count="99999" + button_flash_rate="1.0" flash_color="EmphasisColor"/> <button_icon pad_left="10" pad_right="10" @@ -49,5 +51,7 @@ chrome="true" use_ellipses="true" auto_resize="true" + button_flash_count="99999" + button_flash_rate="1.0" flash_color="EmphasisColor"/> </toolbar> diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml index 93bb8444b4..b7c9cc27ac 100644 --- a/indra/newview/skins/default/xui/es/floater_about.xml +++ b/indra/newview/skins/default/xui/es/floater_about.xml @@ -10,7 +10,7 @@ <floater.string name="AboutPosition"> Estás en la posición [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[SERVER_RELEASE_NOTES_URL] </floater.string> <floater.string name="AboutSystem"> CPU: [CPU] @@ -37,6 +37,9 @@ Versión del servidor de voz: [VOICE_VERSION] <floater.string name="AboutTraffic"> Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) </floater.string> + <floater.string name="ErrorFetchingServerReleaseNotesURL"> + Error al obtener la URL de las notas de la versión del servidor. + </floater.string> <tab_container name="about_tab"> <panel label="Información" name="support_panel"> <button label="Copiar al portapapeles" name="copy_btn" width="165"/> diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 83749fc535..b6391e28a0 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -213,19 +213,19 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s Plus de objetos en la región: [BONUS] </text> <text name="Simulator primitive usage:"> - Uso de primitivas: + Capacidad de la región: </text> <text name="objects_available"> [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles) </text> <text name="Primitives parcel supports:"> - Prims que admite la parcela: + Capacidad del terreno de la parcela: </text> <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> - Prims en la parcela: + Impacto en el terreno de la parcela: </text> <text name="total_objects_text"> [COUNT] diff --git a/indra/newview/skins/default/xui/es/floater_avatar.xml b/indra/newview/skins/default/xui/es/floater_avatar.xml new file mode 100644 index 0000000000..7c87fbe01c --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_avatar.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Avatar" title="SELECTOR DE AVATAR"/> diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml index 04f743b659..cdcb9a146b 100644 --- a/indra/newview/skins/default/xui/es/floater_camera.xml +++ b/indra/newview/skins/default/xui/es/floater_camera.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="camera_floater" title=""> +<floater name="camera_floater" title="VER"> <floater.string name="rotate_tooltip"> Girar la cámara alrededor de lo enfocado </floater.string> diff --git a/indra/newview/skins/default/xui/es/floater_chat_bar.xml b/indra/newview/skins/default/xui/es/floater_chat_bar.xml new file mode 100644 index 0000000000..5e5ef616b8 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_chat_bar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="chat_bar" title="CHAT"> + <panel> + <line_editor label="Pulsa aquí para chatear." name="chat_box" tool_tip="Pulsa Enter para decirlo o Ctrl+Enter para gritarlo"/> + <button name="show_nearby_chat" tool_tip="Muestra o esconde el registro del chat"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_destinations.xml b/indra/newview/skins/default/xui/es/floater_destinations.xml new file mode 100644 index 0000000000..df18698d2f --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_destinations.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Destinations" title="DESTINOS"/> diff --git a/indra/newview/skins/default/xui/es/floater_fast_timers.xml b/indra/newview/skins/default/xui/es/floater_fast_timers.xml new file mode 100644 index 0000000000..eeb39583ef --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_fast_timers.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="fast_timers"> + <string name="pause"> + Pausa + </string> + <string name="run"> + Correr + </string> + <button label="Pausa" name="pause_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_how_to.xml b/indra/newview/skins/default/xui/es/floater_how_to.xml new file mode 100644 index 0000000000..4a57dc3643 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_how_to.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_how_to" title="CÓMO"/> diff --git a/indra/newview/skins/default/xui/es/floater_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml index 370b7f5053..69f638418e 100644 --- a/indra/newview/skins/default/xui/es/floater_map.xml +++ b/indra/newview/skins/default/xui/es/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map" title=""> +<floater name="Map" title="MINIMAPA"> <floater.string name="ToolTipMsg"> [REGIÓN](Haz doble clic para abrir el mapa y pulsa la tecla Mayús y arrastra para obtener una vista panorámica) </floater.string> @@ -7,7 +7,7 @@ [REGION](Pulsa dos veces para teleportarte, pulsa mayús y arrastra para obtener una panorámica) </floater.string> <floater.string name="mini_map_caption"> - MINIMAPA + Minimapa </floater.string> <text label="N" name="floater_map_north" text="N"> N diff --git a/indra/newview/skins/default/xui/es/floater_model_preview.xml b/indra/newview/skins/default/xui/es/floater_model_preview.xml index 36f988b25f..3e77453612 100644 --- a/indra/newview/skins/default/xui/es/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/es/floater_model_preview.xml @@ -1,10 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Model Preview" title="Cargar modelo"> - <string name="status_idle"> - Inactivo - </string> +<floater name="Model Preview" title="SUBIR MODELO"> + <string name="status_idle"/> <string name="status_parse_error"> - Problema de análisis de DAE - consulta los datos en el registro. + Error: Problema de análisis de DAE - consulta los datos en el registro. </string> <string name="status_reading_file"> Cargando... @@ -51,6 +49,9 @@ <string name="mesh_status_missing_lod"> Falta un nivel de detalle requerido. </string> + <string name="mesh_status_invalid_material_list"> + Los materiales con niveles de detalle no son un subconjunto del modelo de referencia. + </string> <string name="layer_all"> Todo </string> @@ -63,188 +64,211 @@ <string name="tbd"> TBD </string> - <text name="name_label"> - Nombre: - </text> - <text name="lod_label"> - Vista previa: - </text> - <combo_box name="preview_lod_combo" tool_tip="Nivel de detalle disponible en la vista previa"> - <combo_item name="high"> - Nivel de detalle: Alto - </combo_item> - <combo_item name="medium"> - Nivel de detalle: Media - </combo_item> - <combo_item name="low"> - Nivel de detalle: Bajo - </combo_item> - <combo_item name="lowest"> - Nivel de detalle: Mínimo - </combo_item> - </combo_box> - <text name="warning_title"> - ATENCIÓN: - </text> - <text name="warning_message"> - No podrás terminar de subir este modelo a los servidores de Second Life. [[VURL] Averigua cómo] puedes obtener autorización para subir modelos de malla. - </text> - <text name="weights_text"> - Descargar: -Física: -Servidor: - -Equiv. en prims: - </text> - <text name="weights"> - [ST] -[PH] -[SIM] - -[EQ] - </text> - <tab_container name="import_tab"> - <panel label="Nivel de detalle" name="lod_panel"> - <text name="lod_table_header"> - Seleccionar nivel de detalle: - </text> - <text name="high_label" value="Alto"/> - <text name="high_triangles" value="0"/> - <text name="high_vertices" value="0"/> - <text name="medium_label" value="Media"/> - <text name="medium_triangles" value="0"/> - <text name="medium_vertices" value="0"/> - <text name="low_label" value="Bajo"/> - <text name="low_triangles" value="0"/> - <text name="low_vertices" value="0"/> - <text name="lowest_label" value="Mínimo"/> - <text name="lowest_triangles" value="0"/> - <text name="lowest_vertices" value="0"/> - <text name="lod_table_footer"> - Nivel de detalle: [DETALLE] - </text> - <radio_group name="lod_file_or_limit" value="lod_from_file"> - <radio_item label="Cargar desde el archivo" name="lod_from_file"/> - <radio_item label="Generar automáticamente" name="lod_auto_generate"/> - <radio_item label="Ninguno" name="lod_none"/> - </radio_group> - <button label="Examinar..." name="lod_browse"/> - <combo_box name="lod_mode"> - <combo_item name="triangle_limit"> - Límite de triángulo - </combo_item> - <combo_item name="error_threshold"> - Margen de error - </combo_item> - </combo_box> - <text name="build_operator_text"> - Crear operador: + <panel name="left_panel"> + <panel name="model_name_representation_panel"> + <text name="name_label"> + Nombre del modelo: </text> - <text name="queue_mode_text"> - Modo de cola: + <text name="model_category_label"> + Este modelo representa... </text> - <combo_box name="build_operator"> - <combo_item name="edge_collapse"> - Cerrar bordes - </combo_item> - <combo_item name="half_edge_collapse"> - Cerrar la mitad de los bordes - </combo_item> - </combo_box> - <combo_box name="queue_mode"> - <combo_item name="greedy"> - Egoísta - </combo_item> - <combo_item name="lazy"> - Vago - </combo_item> - <combo_item name="independent"> - Independiente - </combo_item> + <combo_box name="model_category_combo"> + <combo_item label="Elegir uno..." name="Choose one"/> + <combo_item label="Forma del avatar" name="Avatar shape"/> + <combo_item label="Anexo del avatar" name="Avatar attachment"/> + <combo_item label="Objeto en movimiento (vehículo, animal)" name="Moving object (vehicle, animal)"/> + <combo_item label="Componente de construcción" name="Building Component"/> + <combo_item label="Grande, sin movimiento, etc." name="Large, non moving etc"/> + <combo_item label="Más pequeño, sin movimiento, etc." name="Smaller, non-moving etc"/> + <combo_item label="No es exactamente ninguno de estos" name="Not really any of these"/> </combo_box> - <text name="border_mode_text"> - Modo de borde: - </text> - <text name="share_tolderance_text"> - Tolerancia de uso compartido: - </text> - <combo_box name="border_mode"> - <combo_item name="border_unlock"> - Desbloquear - </combo_item> - <combo_item name="border_lock"> - Lock - </combo_item> - </combo_box> - <text name="crease_label"> - Ángulo de marca: - </text> - <spinner name="crease_angle" value="75"/> </panel> - <panel label="Física" name="physics_panel"> - <panel name="physics geometry"> - <radio_group name="physics_load_radio" value="physics_load_from_file"> - <radio_item label="Archivo:" name="physics_load_from_file"/> - <radio_item label="Utilizar nivel de detalle:" name="physics_use_lod"/> - </radio_group> - <combo_box name="physics_lod_combo" tool_tip="Nivel de detalle para forma física"> - <combo_item name="physics_lowest"> - Mínimo - </combo_item> - <combo_item name="physics_low"> - Bajo - </combo_item> - <combo_item name="physics_medium"> - Media - </combo_item> - <combo_item name="physics_high"> - Alto - </combo_item> - </combo_box> - <button label="Examinar..." name="physics_browse"/> + <tab_container name="import_tab"> + <panel label="Nivel de detalle" name="lod_panel" title="Nivel de detalle"> + <text initial_value="Origen" name="source" value="Origen"/> + <text initial_value="Triángulos" name="triangles" value="Triángulos"/> + <text initial_value="Vértices" name="vertices" value="Vértices"/> + <text initial_value="Alto" name="high_label" value="Alto"/> + <button label="Buscar..." name="lod_browse_high"/> + <text initial_value="0" name="high_triangles" value="0"/> + <text initial_value="0" name="high_vertices" value="0"/> + <text initial_value="Medio" name="medium_label" value="Medio"/> + <button label="Buscar..." name="lod_browse_medium"/> + <text initial_value="0" name="medium_triangles" value="0"/> + <text initial_value="0" name="medium_vertices" value="0"/> + <text initial_value="Bajo" name="low_label" value="Bajo"/> + <button label="Buscar..." name="lod_browse_low"/> + <text initial_value="0" name="low_triangles" value="0"/> + <text initial_value="0" name="low_vertices" value="0"/> + <text initial_value="Mínimo" name="lowest_label" value="Mínimo"/> + <button label="Buscar..." name="lod_browse_lowest"/> + <text initial_value="0" name="lowest_triangles" value="0"/> + <text initial_value="0" name="lowest_vertices" value="0"/> + <check_box label="Generar normales" name="gen_normals"/> + <text initial_value="Ángulo de pliegue:" name="crease_label" value="Ángulo de pliegue:"/> + <spinner name="crease_angle" value="75"/> </panel> - <panel name="physics analysis"> - <slider label="Leve:" name="Smooth"/> - <check_box label="Cerrar agujeros (lento)" name="Close Holes (Slow)"/> - <button label="Analizar" name="Decompose"/> - <button label="Cancelar" name="decompose_cancel"/> + <panel label="Física" name="physics_panel"> + <panel name="physics geometry"> + <text name="first_step_name"> + Paso 1: Nivel de detalle + </text> + <combo_box name="physics_lod_combo" tool_tip="Niveles de detalle para utilizar con la forma física"> + <combo_item name="choose_one"> + Elegir uno... + </combo_item> + <combo_item name="physics_high"> + Alto + </combo_item> + <combo_item name="physics_medium"> + Medio + </combo_item> + <combo_item name="physics_low"> + Bajo + </combo_item> + <combo_item name="physics_lowest"> + Mínimo + </combo_item> + <combo_item name="load_from_file"> + De archivo + </combo_item> + </combo_box> + <button label="Buscar..." name="physics_browse"/> + </panel> + <panel name="physics analysis"> + <text name="method_label"> + Paso 2: Analizar + </text> + <text name="analysis_method_label"> + Método: + </text> + <text name="quality_label"> + Calidad: + </text> + <text name="smooth_method_label"> + Leve: + </text> + <check_box label="Cerrar agujeros" name="Close Holes (Slow)"/> + <button label="Analizar" name="Decompose"/> + <button label="Cancelar" name="decompose_cancel"/> + </panel> + <panel name="physics simplification"> + <text name="second_step_label"> + Paso 3: Simplificar + </text> + <text name="simp_method_header"> + Método: + </text> + <text name="pass_method_header"> + Pases: + </text> + <text name="Detail Scale label"> + Escala de detalle: + </text> + <text name="Retain%_label"> + Retención: + </text> + <combo_box name="Combine Quality" value="1"/> + <button label="Simplificar" name="Simplify"/> + <button label="Cancelar" name="simplify_cancel"/> + </panel> + <panel name="physics info"> + <text name="results_text"> + Resultados: + </text> + <text name="physics_triangles"> + Triángulos: [TRIANGLES], + </text> + <text name="physics_points"> + Vértices: [POINTS], + </text> + <text name="physics_hulls"> + Apariencias: [HULLS] + </text> + </panel> </panel> - <panel name="physics simplification"> - <slider label="Pases:" name="Combine Quality"/> - <slider label="Escala de detalle:" name="Detail Scale"/> - <slider label="Retener:" name="Retain%"/> - <button label="Simplificar" name="Simplify"/> - <button label="Cancelar" name="simplify_cancel"/> - </panel> - <panel name="physics info"> - <slider label="Ampliación de vista previa:" name="physics_explode"/> - <text name="physics_triangles"> - Triángulos: [TRIÁNGULOS] + <panel label="Opciones de subida" name="modifiers_panel"> + <text name="scale_label"> + Escala (1=sin ajuste de escala): + </text> + <spinner name="import_scale" value="1.0"/> + <text name="dimensions_label"> + Dimensiones: </text> - <text name="physics_points"> - Intersecciones: [PUNTOS] + <text name="import_dimensions"> + [X] X [Y] X [Z] </text> - <text name="physics_hulls"> - Aspecto exterior: [ASPECTO EXTERIOR] + <check_box label="Incluir texturas" name="upload_textures"/> + <text name="include_label"> + Solo para modelos de avatar: </text> + <check_box label="Incluir el peso de la piel" name="upload_skin"/> + <check_box label="Incluir posturas de las articulaciones" name="upload_joints"/> + <text name="pelvis_offset_label"> + Desplazamiento Z (subir o bajar el avatar): + </text> + <spinner name="pelvis_offset" value="0.0"/> </panel> - </panel> - <panel label="Modificadores" name="modifiers_panel"> - <spinner name="import_scale" value="1.0"/> - <text name="import_dimensions"> - [X] x [Y] x [Z] m + </tab_container> + <panel name="weights_and_warning_panel"> + <button label="Calcular pesos y precio" name="calculate_btn" tool_tip="Calcular pesos y precio"/> + <button label="Cancelar" name="cancel_btn"/> + <button label="subir" name="ok_btn" tool_tip="Subir al simulador"/> + <button label="Limpiar la configuración y reiniciar el formulario" name="reset_btn"/> + <text name="upload_fee"> + Precio de subida: L$ [FEE] + </text> + <text name="prim_weight"> + Impacto en el terreno: [EQ] + </text> + <text name="download_weight"> + Descargar: [ST] + </text> + <text name="physics_weight"> + Física: [PH] + </text> + <text name="server_weight"> + Servidor: [SIM] + </text> + <text name="warning_title"> + NOTA: + </text> + <text name="warning_message"> + No tienes derechos para subir modelos de malla. [[VURL] Averigua cómo] puedes obtener la autorización. + </text> + <text name="status"> + [STATUS] </text> - <check_box label="Texturas" name="upload_textures"/> - <check_box label="Peso de la piel" name="upload_skin"/> - <check_box label="Posturas de las articulaciones" name="upload_joints"/> - <spinner name="pelvis_offset" value="0.0"/> </panel> - </tab_container> - <text name="upload_fee"> - Precio de subida: L$ [FEE] + </panel> + <text name="lod_label"> + Vista previa: </text> - <button label="Establecer en valores predeterminados" name="reset_btn" tool_tip="Establecer en valores predeterminados"/> - <button label="Calcular pesos y precio" name="calculate_btn" tool_tip="Calcular pesos y precio"/> - <button label="Subir" name="ok_btn" tool_tip="Cargar al simulador"/> - <button label="Cancelar" name="cancel_btn"/> + <panel name="right_panel"> + <combo_box name="preview_lod_combo" tool_tip="LOD para ver en renderizado de prueba"> + <combo_item name="high"> + Alto + </combo_item> + <combo_item name="medium"> + Media + </combo_item> + <combo_item name="low"> + Bajo + </combo_item> + <combo_item name="lowest"> + Mínimo + </combo_item> + </combo_box> + <text name="label_display"> + Mostrar... + </text> + <check_box label="Bordes" name="show_edges"/> + <check_box label="Física" name="show_physics"/> + <check_box label="Texturas" name="show_textures"/> + <check_box label="Pesos de la piel" name="show_skin_weight"/> + <check_box label="Articulaciones" name="show_joint_positions"/> + <text name="physics_explode_label"> + Ampliación de vista previa: + </text> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_model_wizard.xml b/indra/newview/skins/default/xui/es/floater_model_wizard.xml index 86de557ed9..c4eb5e955a 100644 --- a/indra/newview/skins/default/xui/es/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/es/floater_model_wizard.xml @@ -6,26 +6,20 @@ <button label="2. Optimizar" name="optimize_btn"/> <button label="1. Seleccionar archivo" name="choose_file_btn"/> <panel name="choose_file_panel"> - <panel name="choose_file_header_panel"> - <text name="choose_file_header_text"> + <panel name="header_panel"> + <text name="header_text"> Elige el archivo de modelo </text> </panel> - <panel name="choose_file_content_panel"> + <panel name="content"> <text name="advanced_users_text"> Usuarios avanzados: si tienes experiencia con las herramientas de creación de contenidos 3D, quizá te interese utilizar la función de subida avanzada. </text> <button label="Cambiar al modo Avanzado" name="switch_to_advanced"/> - <text name="choose_model_file_label"> + <text name="Cache location"> Elige el archivo de modelo que deseas subir </text> <button label="Buscar..." label_selected="Buscar..." name="browse"/> - <text name="support_collada_text"> - Second Life admite los archivos COLLADA (.dae) - </text> - <text name="dimensions_label"> - Dimensiones (metros): - </text> <text name="dimensions"> X Y Z </text> @@ -38,18 +32,15 @@ </panel> </panel> <panel name="optimize_panel"> - <panel name="optimize_header_panel"> - <text name="optimize_header_text"> + <panel name="header_panel"> + <text name="header_text"> Optimizar el modelo </text> </panel> - <text name="optimize_hint"> + <text name="description"> Hemos optimizado el rendimiento del modelo, pero puedes ajustarlo más si lo deseas. </text> - <panel name="optimize_content_panel"> - <text name="generating_lod_label"> - Generando el nivel de detalle - </text> + <panel name="content"> <text name="high_detail_text"> Generar el nivel de detalle: Alto </text> @@ -64,123 +55,64 @@ </text> </panel> <panel name="content2"> - <text name="optimize_performance_text"> - Rendimiento - </text> - <text name="optimize_faster_rendering_text"> - Renderizado más rápido -Menos detalles -Menos peso de prim - </text> - <text name="optimize_accuracy_text"> - Precisión - </text> - <text name="optimize_slower_rendering_text"> - Renderizado más lento -Más detalles -Más peso de prim - </text> - <text name="accuracy_slider_mark1"> - ' - </text> - <text name="accuracy_slider_mark2"> - ' - </text> - <text name="accuracy_slider_mark3"> - ' - </text> <button label="Recalcular la geometría" name="recalculate_geometry_btn"/> - <text name="geometry_preview_label"> + <text name="lod_label"> Vista previa de geometría </text> <combo_box name="preview_lod_combo" tool_tip="LOD para ver en renderizado de prueba"> - <combo_item name="preview_lod_high"> + <combo_item name="high"> Detalle alto </combo_item> - <combo_item name="preview_lod_medium"> + <combo_item name="medium"> Detalles medios </combo_item> - <combo_item name="preview_lod_low"> + <combo_item name="low"> Detalle bajo </combo_item> - <combo_item name="preview_lod_lowest"> + <combo_item name="lowest"> Detalles mínimos </combo_item> </combo_box> </panel> </panel> <panel name="physics_panel"> - <panel name="physics_header_panel"> - <text name="physics_header_text"> + <panel name="header_panel"> + <text name="header_text"> Ajustar la física </text> </panel> - <text name="physics_hint"> + <text name="description"> Crearemos una forma para la apariencia exterior del modelo. Ajusta el nivel de detalle de la forma según se necesite para el propósito proyectado del modelo. </text> - <panel name="physics_content_panel"> - <text name="physics_performance_text"> - Rendimiento - </text> - <text name="physics_faster_rendering_text"> - Renderizado más rápido -Menos detalles -Menos peso de prim - </text> - <text name="physics_accuracy_text"> - Precisión - </text> - <text name="physics_slower_dendering_text"> - Renderizado más lento -Más detalles -Más peso de prim - </text> - <text name="physics_example_1"> - Ejemplos: -Objetos en movimiento -Objetos voladores -Vehículos - </text> - <text name="physics_example_2"> - Ejemplos: -Objetos estáticos pequeños -Objetos con menos detalles -Muebles sencillos - </text> - <text name="physics_example_3"> - Ejemplos: -Objetos estáticos -Objetos con detalles -Edificios - </text> + <panel name="content"> <button label="Recalcular física" name="recalculate_physics_btn"/> <button label="Recalculando..." name="recalculating_physics_btn"/> - <text name="physics_preview_label"> + <text name="lod_label"> Prueba de física </text> <combo_box name="preview_lod_combo2" tool_tip="LOD para ver en renderizado de prueba"> - <combo_item name="preview_lod2_high"> + <combo_item name="high"> Detalle alto </combo_item> - <combo_item name="preview_lod2_medium"> + <combo_item name="medium"> Detalles medios </combo_item> - <combo_item name="preview_lod2_low"> + <combo_item name="low"> Detalle bajo </combo_item> - <combo_item name="preview_lod2_lowest"> + <combo_item name="lowest"> Detalles mínimos </combo_item> </combo_box> </panel> </panel> <panel name="review_panel"> - <panel name="review_header_panel"> - <text name="review_header_text"> + <panel name="header_panel"> + <text name="header_text"> Revisar </text> </panel> - <panel name="review_content_panel"> + <panel name="content"> <text name="review_prim_equiv"> Impacto en la parcela/región: [EQUIV] equivalentes en prim </text> @@ -193,8 +125,8 @@ Edificios </panel> </panel> <panel name="upload_panel"> - <panel name="upload_header_panel"> - <text name="upload_header_text"> + <panel name="header_panel"> + <text name="header_text"> Subida finalizada </text> </panel> diff --git a/indra/newview/skins/default/xui/es/floater_moveview.xml b/indra/newview/skins/default/xui/es/floater_moveview.xml index 258f84c361..b29fe04848 100644 --- a/indra/newview/skins/default/xui/es/floater_moveview.xml +++ b/indra/newview/skins/default/xui/es/floater_moveview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> +<floater name="move_floater" title="MOVERME"> <string name="walk_forward_tooltip"> Caminar hacia adelante (cursor arriba o W) </string> @@ -58,14 +58,14 @@ Volar </string> <panel name="panel_actions"> - <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/> <button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izq. (cursor izq. o A)"/> <joystick_slide name="move left btn" tool_tip="Caminar a la izq. (pulsa Mayúsculas + cursor izq. o A)"/> - <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/> <button label="" label_selected="" name="turn right btn" tool_tip="Girar a la der. (cursor der. o D)"/> <joystick_slide name="move right btn" tool_tip="Caminar a la der. (pulsa Mayúsculas + cursor der. o D)"/> <joystick_turn name="forward btn" tool_tip="Caminar hacia adelante (cursor arriba o W)"/> <joystick_turn name="backward btn" tool_tip="Caminar de espaldas (cursor abajo o S)"/> + <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/> + <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/> </panel> <panel name="panel_modes"> <button label="" name="mode_walk_btn" tool_tip="Modo de caminar"/> diff --git a/indra/newview/skins/default/xui/es/floater_my_appearance.xml b/indra/newview/skins/default/xui/es/floater_my_appearance.xml new file mode 100644 index 0000000000..774babf04e --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_my_appearance.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_appearance" title="APARIENCIA"> + <panel label="Modificar la apariencia" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_my_inventory.xml b/indra/newview/skins/default/xui/es/floater_my_inventory.xml new file mode 100644 index 0000000000..0efd9f1c6d --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_my_inventory.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_inventory" title="INVENTARIO"/> diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml index 1fee9ab056..b3b8cdcfff 100644 --- a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="CHAT"> - <check_box label="Traducir chat (mediante Google)" name="translate_chat_checkbox"/> + <check_box label="Traducir chat" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_object_weights.xml b/indra/newview/skins/default/xui/es/floater_object_weights.xml new file mode 100644 index 0000000000..50c4f0518d --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_object_weights.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="object_weights" title="AVANZADAS"> + <floater.string name="nothing_selected" value="--"/> + <text name="selected_text" value="SELECCIONADOS"/> + <text name="objects" value="--"/> + <text name="objects_label" value="Objetos"/> + <text name="prims" value="--"/> + <text name="prims_label" value="Primitivas"/> + <text name="weights_of_selected_text" value="PESOS DE SELECCIONADOS"/> + <text name="download" value="--"/> + <text name="download_label" value="Descargar"/> + <text name="physics" value="--"/> + <text name="physics_label" value="Física"/> + <text name="server" value="--"/> + <text name="server_label" value="Servidor"/> + <text name="display" value="--"/> + <text name="display_label" value="Mostrar"/> + <text name="land_impacts_text" value="IMPACTOS EN EL TERRENO"/> + <text name="selected" value="--"/> + <text name="selected_label" value="Seleccionados"/> + <text name="rezzed_on_land" value="--"/> + <text name="rezzed_on_land_label" value="Colocados en el terreno"/> + <text name="remaining_capacity" value="--"/> + <text name="remaining_capacity_label" value="Capacidad restante"/> + <text name="total_capacity" value="--"/> + <text name="total_capacity_label" value="Capacidad total"/> + <text name="help_SLURL" value="[secondlife:///app/help/object_weights ¿Qué es todo esto?...]"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml new file mode 100644 index 0000000000..f48d0d2d0c --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="modal container" title="GUARDAR EL VESTUARIO"/> diff --git a/indra/newview/skins/default/xui/es/floater_people.xml b/indra/newview/skins/default/xui/es/floater_people.xml new file mode 100644 index 0000000000..f5a3eab008 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_people.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_people" title="GENTE"> + <panel_container name="main_panel"> + <panel label="Perfil del grupo" name="panel_group_info_sidetray"/> + <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/> + </panel_container> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_picks.xml b/indra/newview/skins/default/xui/es/floater_picks.xml new file mode 100644 index 0000000000..255aa5dcdc --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_picks.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_picks" title="Destacados"/> diff --git a/indra/newview/skins/default/xui/es/floater_places.xml b/indra/newview/skins/default/xui/es/floater_places.xml new file mode 100644 index 0000000000..12c6548205 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_places.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_places" title="LUGARES"> + <panel label="Lugares" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_sound_devices.xml b/indra/newview/skins/default/xui/es/floater_sound_devices.xml index a5ffbd517a..0291f9e796 100644 --- a/indra/newview/skins/default/xui/es/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/es/floater_sound_devices.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="Dispositivos de sonido"> +<floater name="floater_sound_devices" title="DISPOSITIVOS DE SONIDO"> <text name="voice_label"> Chat de voz </text> diff --git a/indra/newview/skins/default/xui/es/floater_stats.xml b/indra/newview/skins/default/xui/es/floater_stats.xml index 5f4fabf375..ba4af2e866 100644 --- a/indra/newview/skins/default/xui/es/floater_stats.xml +++ b/indra/newview/skins/default/xui/es/floater_stats.xml @@ -10,8 +10,8 @@ </stat_view> <stat_view label="Avanzado" name="advanced"> <stat_view label="Renderización" name="render"> - <stat_bar label="KTris generados" name="ktrisframe"/> - <stat_bar label="KTris generados" name="ktrissec"/> + <stat_bar label="KTris generados por fotograma" name="ktrisframe"/> + <stat_bar label="KTris generados por segundo" name="ktrissec"/> <stat_bar label="Objetos en total" name="objs"/> <stat_bar label="Objetos nuevos" name="newobjs"/> </stat_view> @@ -43,18 +43,6 @@ <stat_bar label="Pin de objetos" name="physicspinnedtasks"/> <stat_bar label="Objetos con bajo nivel de detalle" name="physicslodtasks"/> <stat_bar label="Memoria asignada" name="physicsmemoryallocated"/> - <stat_bar label="Agentes: actual./seg." name="simagentups"/> - <stat_bar label="Agentes del grid principal" name="simmainagents"/> - <stat_bar label="Agentes secundarios" name="simchildagents"/> - <stat_bar label="Objetos" name="simobjects"/> - <stat_bar label="Objetos activos" name="simactiveobjects"/> - <stat_bar label="Scripts activos" name="simactivescripts"/> - <stat_bar label="Eventos de scripts" name="simscripteps"/> - <stat_bar label="Paquetes salientes" name="siminpps"/> - <stat_bar label="Paquetes entrantes" name="simoutpps"/> - <stat_bar label="Descargas pendientes" name="simpendingdownloads"/> - <stat_bar label="Subidas pendientes" name="simpendinguploads"/> - <stat_bar label="Total de bytes no reconocidos" name="simtotalunackedbytes"/> </stat_view> <stat_view label="Tiempo (ms)" name="simperf"> <stat_bar label="Tiempo total de los frames" name="simframemsec"/> @@ -64,6 +52,14 @@ <stat_bar label="Tiempo de los agentes" name="simagentmsec"/> <stat_bar label="Tiempo de las imágenes" name="simimagesmsec"/> <stat_bar label="Tiempo de los scripts" name="simscriptmsec"/> + <stat_bar label="Tiempo libre" name="simsparemsec"/> + <stat_view label="Datos de tiempo (ms)" name="timedetails"> + <stat_bar label="Paso de física" name="simsimphysicsstepmsec"/> + <stat_bar label="Actualizar formas físicas" name="simsimphysicsshapeupdatemsec"/> + <stat_bar label="Otros (Física)" name="simsimphysicsothermsec"/> + <stat_bar label="Tiempo de suspensión" name="simsleepmsec"/> + <stat_bar label="E/S bombeo" name="simpumpiomsec"/> + </stat_view> </stat_view> </stat_view> </container_view> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index f6e246ebae..650b4b457d 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -25,10 +25,10 @@ Pulsa y arrastra para seleccionar el terreno. </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] objetos ( [PRIM_COUNT] prims[PE_STRING] ) seleccionados + [OBJ_COUNT] objetos seleccionados, impacto en el terreno [LAND_IMPACT] </floater.string> - <floater.string name="status_selectprimequiv"> - , [SEL_WEIGHT] equivalentes en prim + <floater.string name="status_remaining_capacity"> + Capacidad restante [LAND_CAPACITY]. </floater.string> <button label="" label_selected="" name="button focus" tool_tip="Visión"/> <button label="" label_selected="" name="button move" tool_tip="Mover"/> @@ -105,8 +105,8 @@ <text name="selection_empty"> No está seleccionado nada. </text> - <text name="selection_weight"> - Peso de física [PHYS_WEIGHT], Coste de renderizado [DISP_WEIGHT]. + <text name="remaining_capacity"> + [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Más información] </text> <tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288"> <panel label="General" name="General"> @@ -319,7 +319,6 @@ Tipo de unión </text> <combo_box name="sculpt type control"> - <combo_box.item label="(ninguna)" name="None"/> <combo_box.item label="Esfera" name="Sphere"/> <combo_box.item label="Toroide" name="Torus"/> <combo_box.item label="Plano" name="Plane"/> diff --git a/indra/newview/skins/default/xui/es/floater_toybox.xml b/indra/newview/skins/default/xui/es/floater_toybox.xml new file mode 100644 index 0000000000..b36a05a6e4 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_toybox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Toybox" title="PERSONALIZAR BARRAS DE HERRAMIENTAS"> + <text name="toybox label 1"> + Puedes agregar o quitar botones arrastrándolos a las barras de herramientas o desde ellas. + </text> + <text name="toybox label 2"> + Los botones aparecerán como se muestra o solo como iconos, según la configuración de cada barra de herramientas. + </text> + <button label="Restaurar valores predeterminados" label_selected="Restaurar valores predeterminados" name="btn_restore_defaults"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml index f02855123c..cefec2a7a1 100644 --- a/indra/newview/skins/default/xui/es/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/es/floater_voice_controls.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_voice_controls" title="Controles de Voz"> +<floater name="floater_voice_controls" title="CONTROLES DE LA VOZ"> <string name="title_nearby"> - CHAT DE VOZ + Chat de voz </string> <string name="title_group"> Multiconferencia de voz con [GROUP] diff --git a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml index 22a1873234..9945908c4f 100644 --- a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_navbar_menu"> - <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Mostrar la barra de navegación y de favoritos" name="ShowNavbarNavigationPanel"/> <menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/> <menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml index cabcacaed5..e3abf7ad62 100644 --- a/indra/newview/skins/default/xui/es/menu_login.xml +++ b/indra/newview/skins/default/xui/es/menu_login.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Login Menu"> <menu label="Yo" name="File"> - <menu_item_call label="Preferencias" name="Preferences..."/> + <menu_item_call label="Preferencias..." name="Preferences..."/> <menu_item_call label="Salir de [APP_NAME]" name="Quit"/> </menu> <menu label="Ayuda" name="Help"> diff --git a/indra/newview/skins/default/xui/es/menu_toolbars.xml b/indra/newview/skins/default/xui/es/menu_toolbars.xml new file mode 100644 index 0000000000..f8ed1c54ca --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_toolbars.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Toolbars Popup"> + <menu_item_call label="Elegir botones..." name="Chose Buttons"/> + <menu_item_check label="Iconos y etiquetas" name="icons_with_text"/> + <menu_item_check label="Solo iconos" name="icons_only"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index bc8a5731ab..0714e7f2c6 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -1,29 +1,30 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> <menu label="Yo" name="Me"> - <menu_item_call label="Preferencias" name="Preferences"/> - <menu_item_call label="Mi panel de control" name="Manage My Account"> + <menu_item_call label="Panel de control..." name="Manage My Account"> <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/> </menu_item_call> - <menu_item_call label="Comprar L$" name="Buy and Sell L$"/> - <menu_item_call label="Mi perfil" name="Profile"/> - <menu_item_call label="Mi apariencia" name="ChangeOutfit"/> - <menu_item_check label="Mi Inventario" name="Inventory"/> - <menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/> - <menu_item_check label="Mis gestos" name="Gestures"/> - <menu_item_check label="Mi voz" name="ShowVoice"/> + <menu_item_call label="Perfil..." name="Profile"/> + <menu_item_call label="Apariencia" name="ChangeOutfit"/> + <menu_item_check label="Inventario..." name="Inventory"/> + <menu_item_check label="Gestos..." name="Gestures"/> + <menu_item_check label="Voz..." name="ShowVoice"/> <menu label="Movimiento" name="Movement"> <menu_item_call label="Sentarte" name="Sit Down Here"/> <menu_item_check label="Volar" name="Fly"/> <menu_item_check label="Correr siempre" name="Always Run"/> <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> </menu> - <menu label="Mi estado" name="Status"> + <menu label="Estado" name="Status"> <menu_item_call label="Ausente" name="Set Away"/> <menu_item_call label="Ocupado" name="Set Busy"/> </menu> <menu_item_call label="Solicitar estatus de Administrador" name="Request Admin Options"/> <menu_item_call label="Dejar el estatus de Administrador" name="Leave Admin Options"/> + <menu_item_call label="Comprar L$" name="Buy and Sell L$"/> + <menu_item_call label="Preferencias..." name="Preferences"/> + <menu_item_call label="Barras de herramientas..." name="Toolbars"/> + <menu_item_call label="Ocultar todos los controles" name="Hide UI"/> <menu_item_call label="Salir de [APP_NAME]" name="Quit"/> </menu> <menu label="Comunicarme" name="Communicate"> @@ -145,7 +146,6 @@ </menu> <menu label="Ayuda" name="Help"> <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/> - <menu_item_check label="Permitir consejos" name="Enable Hints"/> <menu_item_call label="Denunciar una infracción" name="Report Abuse"/> <menu_item_call label="Informar de un fallo" name="Report Bug"/> <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/> @@ -161,7 +161,7 @@ <menu label="Herramientas de rendimiento" name="Performance Tools"> <menu_item_call label="Medidor de lag" name="Lag Meter"/> <menu_item_check label="Estadísticas" name="Statistics Bar"/> - <menu_item_check label="Mostrar cuánto cuesta renderizar el avatar" name="Avatar Rendering Cost"/> + <menu_item_check label="Mostrar el peso del dibujo de los avatares" name="Avatar Rendering Cost"/> </menu> <menu label="Realzado y Visibilidad" name="Highlighting and Visibility"> <menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/> @@ -271,6 +271,7 @@ <menu_item_check label="Actualizar el tipo" name="Update Type"/> <menu_item_check label="Información sobre el nivel de detalle" name="LOD Info"/> <menu_item_check label="Crear cola" name="Build Queue"/> + <menu_item_check label="Complejidad del renderizado" name="rendercomplexity"/> <menu_item_check label="Esculpir" name="Sculpt"/> </menu> <menu label="Rendering" name="Rendering"> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 4fb29b9427..3fe0072a20 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -1919,6 +1919,12 @@ Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar u ¿Estás seguro de que quieres salir? <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/> </notification> + <notification name="ConfirmRestoreToybox"> + ¿Estás seguro de que quieres restaurar los botones y barras de herramientas predeterminados? + +Esta acción no se puede deshacer. + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> + </notification> <notification name="DeleteItems"> [QUESTION] <usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/> @@ -2999,10 +3005,6 @@ Al ocultar el botón Hablar se desactiva la función de voz. <button name="cancel" text="Cancelar"/> </form> </notification> - <notification label="" name="ModeChange"> - Para cambiar de modo tienes que salir y reiniciar. - <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> - </notification> <notification label="" name="NoClassifieds"> La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión. <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> @@ -3047,6 +3049,10 @@ Al ocultar el botón Hablar se desactiva la función de voz. Las búsquedas solo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo? <usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/> </notification> + <notification label="" name="ConfirmHideUI"> + Esta acción ocultará todos los botones y elementos de menú. Para restaurarlos, pulsa otra vez en [SHORTCUT]. + <usetemplate ignoretext="Confirmar antes de ocultar la IU" name="okcancelignore" notext="Cancelar" yestext="OK"/> + </notification> <global name="UnsupportedGLRequirements"> Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples ('multitexture support'). Si la tienes, comprueba que tienes los últimos 'drivers' para tu tarjeta gráfica, así como los últimos parches y 'service packs' para tu sistema operativo. diff --git a/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml new file mode 100644 index 0000000000..eaaa5dbe78 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_chiclet_bar.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chiclet_bar"> + <layout_stack name="toolbar_stack"> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Conversaciones"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Notificaciones"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_me.xml b/indra/newview/skins/default/xui/es/panel_me.xml index ed253904aa..850cd6ec71 100644 --- a/indra/newview/skins/default/xui/es/panel_me.xml +++ b/indra/newview/skins/default/xui/es/panel_me.xml @@ -1,7 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Mi perfil" name="panel_me"> - <tab_container name="tabs"> - <panel label="MI PERFIL" name="panel_profile"/> - <panel label="MIS DESTACADOS" name="panel_picks"/> - </tab_container> + <panel label="MIS DESTACADOS" name="panel_picks"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml index 293c9ef1d9..1b7f5d5a9f 100644 --- a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml @@ -1,18 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> - <panel name="navigation_panel"> - <pull_button name="back_btn" tool_tip="Volver a la localización anterior"/> - <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/> - <button name="home_btn" tool_tip="Teleportar a mi Base"/> - <location_input label="Localización" name="location_combo"/> - <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar"> - <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/> - </search_combo_box> - </panel> - <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!"> - <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!"> - Barra de Favoritos - </label> - <chevron_button name=">>" tool_tip="Ver más de Mis favoritos"/> - </favorites_bar> + <layout_stack name="nvp_stack"> + <layout_panel name="navigation_layout_panel"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/> + <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/> + <button name="home_btn" tool_tip="Teleportar a mi Base"/> + <location_input label="Lugar" name="location_combo"/> + </panel> + </layout_panel> + <layout_panel name="favorites_layout_panel"> + <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!"> + <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!"> + Barra de Favoritos + </label> + <more_button name=">>" tool_tip="Ver más de Mis favoritos"> + Más ▼ + </more_button> + </favorites_bar> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml new file mode 100644 index 0000000000..5a852a6711 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_chat"> + <check_box label="Traducir chat" name="translate_chat_checkbox"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index a15c8deaf9..e822585566 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -31,7 +31,7 @@ <spinner label="Tiempo de los otros interlocutores:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> <text name="translate_chb_label"> - Usar en el chat el traductor automático de Google + Usar en el chat el traductor automático </text> <text name="translate_language_text"> Traducir el chat al: @@ -51,7 +51,7 @@ <combo_box.item label="Русский (ruso)" name="Russian"/> <combo_box.item label="Türkçe (turco)" name="Turkish"/> <combo_box.item label="Українська (ucraniano)" name="Ukrainian"/> - <combo_box.item label="中文 (正體) (chino)" name="Chinese"/> + <combo_box.item label="中文 (正體) (Chino)" name="Chinese"/> <combo_box.item label="日本語 (japonés)" name="Japanese"/> <combo_box.item label="한국어 (coreano)" name="Korean"/> </combo_box> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index c762e6b7fe..4fc163f5b6 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -13,7 +13,10 @@ <combo_box.item label="Italiano - Beta" name="Italian"/> <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/> <combo_box.item label="Português (portugués) - Beta" name="Portugese"/> + <combo_box.item label="Русский (Ruso) - Beta" name="Russian"/> + <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/> <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/> + <combo_box.item label="正體中文 (Chino tradicional) - Beta" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (requiere reiniciar) @@ -48,7 +51,6 @@ <check_box label="Títulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar títulos de grupos, como Jefe o Miembro"/> <check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/> <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/> - <check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/> <text name="inworld_typing_rg_label"> Si pulsas las teclas de letras: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_move.xml b/indra/newview/skins/default/xui/es/panel_preferences_move.xml index d95e167361..b2ff6b61c2 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_move.xml @@ -7,18 +7,33 @@ </text> <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/> <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/> - <check_box initial_value="verdadero" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar el posicionamiento automático de la cámara para la barra lateral"/> + <text name="keyboard_lbl"> + Teclado: + </text> + <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/> + <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/> + <text name="mouse_lbl"> + Ratón: + </text> <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/> <text name=" Mouse Sensitivity"> Sensibilidad del ratón en la Vista subjetiva: </text> <check_box label="Invertir" name="invert_mouse"/> - <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/> - <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/> - <check_box label="Haz doble clic para:" name="double_click_chkbox"/> - <radio_group name="double_click_action"> - <radio_item label="Teleportarte" name="radio_teleport"/> - <radio_item label="Piloto automático" name="radio_autopilot"/> - </radio_group> + <text name="single_click_action_lbl"> + Un clic en el terreno: + </text> + <combo_box name="single_click_action_combo"> + <combo_box.item label="Ninguna acción" name="0"/> + <combo_box.item label="Ir al punto seleccionado" name="1"/> + </combo_box> + <text name="double_click_action_lbl"> + Doble clic en el terreno: + </text> + <combo_box name="double_click_action_combo"> + <combo_box.item label="Ninguna acción" name="0"/> + <combo_box.item label="Ir al punto seleccionado" name="1"/> + <combo_box.item label="Teleportarte al punto seleccionado" name="2"/> + </combo_box> <button label="Otros dispositivos" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml index 0391258b75..d43790c8c6 100644 --- a/indra/newview/skins/default/xui/es/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml @@ -17,12 +17,9 @@ </panel.string> <panel name="balance_bg"> <text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/> - <button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/> + <button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/> + <button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life"/> </panel> - <combo_box name="mode_combo" tool_tip="Selecciona el modo. Elige Básico para una exploración rápida y fácil y para chatear. Elige Avanzado para tener acceso a más funciones."> - <combo_box.item label="Modo Básico" name="Basic"/> - <combo_box.item label="Modo Avanzado" name="Advanced"/> - </combo_box> <text name="TimeText" tool_tip="Hora actual (Pacífico)"> 24:00 AM PST </text> diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml index aae9bfc113..79d0cb84e8 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml @@ -14,7 +14,7 @@ </string> <button label="Objetos recibidos" name="inbox_btn"/> <text name="inbox_fresh_new_count"> - [NUM] Nuevos + [NUM] nuevos </text> <panel tool_tip="Drag and drop items to your inventory to manage and use them"> <text name="inbox_inventory_placeholder"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index cc044ba416..83747b85c0 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -34,6 +34,9 @@ <string name="ProgressChangingResolution"> Cambiando la resolución... </string> + <string name="Fullbright"> + Brillo al máximo (antiguo) + </string> <string name="LoginInProgress"> Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere. </string> @@ -116,7 +119,7 @@ No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula. </string> <string name="LoginFailedNoNetwork"> - Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet. + Error de red: no se ha podido conectar; por favor, revisa tu conexión a internet. </string> <string name="LoginFailed"> Error en el inicio de sesión. @@ -1255,6 +1258,9 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="Marketplace Error Internal Import"> Error: Este objeto tiene un problema. Vuelve a intentarlo más tarde. </string> + <string name="Open landmarks"> + Abrir hitos + </string> <string name="no_transfer" value="(no transferible)"/> <string name="no_modify" value="(no modificable)"/> <string name="no_copy" value="(no copiable)"/> @@ -4158,8 +4164,8 @@ Denuncia de infracción <string name="Female - Wow"> Mujer - Admiración </string> - <string name="/bow1"> - /reverencia1 + <string name="/bow"> + /reverencia </string> <string name="/clap"> /aplaudir @@ -4671,4 +4677,172 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="ParticleHiding"> Ocultando las partículas </string> + <string name="Command_AboutLand_Label"> + Acerca del terreno + </string> + <string name="Command_Appearance_Label"> + Apariencia + </string> + <string name="Command_Avatar_Label"> + Avatar + </string> + <string name="Command_Build_Label"> + Construir + </string> + <string name="Command_Chat_Label"> + Chat + </string> + <string name="Command_Compass_Label"> + Brújula + </string> + <string name="Command_Destinations_Label"> + Destinos + </string> + <string name="Command_Gestures_Label"> + Gestos + </string> + <string name="Command_HowTo_Label"> + Cómo + </string> + <string name="Command_Inventory_Label"> + Inventario + </string> + <string name="Command_Map_Label"> + Mapa + </string> + <string name="Command_Marketplace_Label"> + Mercado + </string> + <string name="Command_MiniMap_Label"> + Minimapa + </string> + <string name="Command_Move_Label"> + Moverme + </string> + <string name="Command_People_Label"> + Gente + </string> + <string name="Command_Picks_Label"> + Destacados + </string> + <string name="Command_Places_Label"> + Lugares + </string> + <string name="Command_Preferences_Label"> + Preferencias + </string> + <string name="Command_Profile_Label"> + Perfil + </string> + <string name="Command_Search_Label"> + Buscar + </string> + <string name="Command_Snapshot_Label"> + Foto + </string> + <string name="Command_Speak_Label"> + Hablar + </string> + <string name="Command_View_Label"> + Visión + </string> + <string name="Command_Voice_Label"> + Chat de voz + </string> + <string name="Command_AboutLand_Tooltip"> + Información sobre el terreno que vas a visitar + </string> + <string name="Command_Appearance_Tooltip"> + Cambiar tu avatar + </string> + <string name="Command_Avatar_Tooltip"> + Elegir un avatar completo + </string> + <string name="Command_Build_Tooltip"> + Construir objetos y modificar la forma del terreno + </string> + <string name="Command_Chat_Tooltip"> + Habla por chat de texto con las personas próximas + </string> + <string name="Command_Compass_Tooltip"> + Brújula + </string> + <string name="Command_Destinations_Tooltip"> + Destinos de interés + </string> + <string name="Command_Gestures_Tooltip"> + Gestos para tu avatar + </string> + <string name="Command_HowTo_Tooltip"> + Cómo hacer las tareas habituales + </string> + <string name="Command_Inventory_Tooltip"> + Ver y usar tus pertenencias + </string> + <string name="Command_Map_Tooltip"> + Mapa del mundo + </string> + <string name="Command_Marketplace_Tooltip"> + Ir de compras + </string> + <string name="Command_MiniMap_Tooltip"> + Mostrar la gente que está cerca + </string> + <string name="Command_Move_Tooltip"> + Desplazando el avatar + </string> + <string name="Command_People_Tooltip"> + Amigos, grupos y personas próximas + </string> + <string name="Command_Picks_Tooltip"> + Lugares que se mostrarán como favoritos en tu perfil + </string> + <string name="Command_Places_Tooltip"> + Lugares que has guardado + </string> + <string name="Command_Preferences_Tooltip"> + Preferencias + </string> + <string name="Command_Profile_Tooltip"> + Consulta o edita tu perfil + </string> + <string name="Command_Search_Tooltip"> + Buscar lugares, eventos y personas + </string> + <string name="Command_Snapshot_Tooltip"> + Tomar una fotografía + </string> + <string name="Command_Speak_Tooltip"> + Utiliza el micrófono para hablar con las personas próximas + </string> + <string name="Command_View_Tooltip"> + Cambiando el ángulo de la cámara + </string> + <string name="Command_Voice_Tooltip"> + Personas próximas con capacidad de voz + </string> + <string name="Retain%"> + % retención + </string> + <string name="Detail"> + Detalle + </string> + <string name="Better Detail"> + Mejor detalle + </string> + <string name="Surface"> + Superficie + </string> + <string name="Solid"> + Sólido + </string> + <string name="Wrap"> + Envoltura + </string> + <string name="Preview"> + Vista previa + </string> + <string name="Normal"> + Normal + </string> </strings> diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml index e0e0061729..e785a7ac40 100644 --- a/indra/newview/skins/default/xui/es/teleport_strings.xml +++ b/indra/newview/skins/default/xui/es/teleport_strings.xml @@ -19,6 +19,10 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. Lo sentimos, pero el sistema no ha podido completar el teleporte. Vuelva a intentarlo en un momento. </message> + <message name="NoHelpIslandTP"> + No puede teleportarse de vuelta a la Welcome Island ('Isla de Ayuda'). +Vaya a la 'Welcome Island Public' ('Isla Pública de Ayuda') para repetir el tutorial. + </message> <message name="noaccess_tport"> Lo sentimos, pero no tienes acceso al destino de este teleporte. </message> diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml index 9b1b21c434..8bbd34baae 100644 --- a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="CHAT PRÈS DE MOI"> - <check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/> + <check_box label="Traduction du chat" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml index 98eddf196b..31cb3308e3 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="nearby_chat"> - <check_box label="Traduction du chat (fournie par Google)" name="translate_chat_checkbox"/> + <check_box label="Traduction du chat" name="translate_chat_checkbox"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 646f53704c..fa026d8106 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -31,7 +31,7 @@ <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> <text name="translate_chb_label"> - Utiliser la traduction automatique lors des chats (fournie par Google) + Utiliser la traduction automatique lors des chats </text> <text name="translate_language_text"> Traduire le chat en : diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml index dd4c1c9f63..66b84af3aa 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -16,7 +16,7 @@ <combo_box.item label="Русский (Russe) - Bêta" name="Russian"/> <combo_box.item label="Türkçe (Turc) - Bêta" name="Turkish"/> <combo_box.item label="日本語 (Japonais) - Bêta" name="(Japanese)"/> - <combo_box.item label="正體 (Chinois traditionnel) - Bêta" name="Traditional Chinese"/> + <combo_box.item label="正體中文 (Chinois traditionnel) - Bêta" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (redémarrage requis) diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml index 7c291c0984..401b272c81 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -20,6 +20,10 @@ Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis r Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. Veuillez réessayer dans un moment. </message> + <message name="NoHelpIslandTP"> + Vous ne pouvez pas retourner sur Welcome Island. +Pour répéter le didacticiel, veuillez aller sur Welcome Island Public. + </message> <message name="noaccess_tport"> Désolé, vous n'avez pas accès à cette destination. </message> diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml index 4c41df8a62..9e81899880 100644 --- a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="CHAT NEI DINTORNI"> - <check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/> + <check_box label="Traduci chat" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml index 7afc3cd7e7..1b529e2737 100644 --- a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="nearby_chat"> - <check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/> + <check_box label="Traduci chat" name="translate_chat_checkbox"/> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 72e687b6d1..1a0a1d8434 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -29,9 +29,9 @@ <check_box label="Chat IM" name="EnableIMChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva un messaggio IM"/> <spinner label="Durata chat vicine:" name="nearby_toasts_lifetime"/> <spinner label="Durata dissolvenza chat vicine:" name="nearby_toasts_fadingtime"/> - <check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/> + <check_box label="Use machine translation while chatting" name="translate_chat_checkbox"/> <text name="translate_chb_label"> - Usa la traduzione meccanica durante le chat (tecnologia Google) + Usa la traduzione meccanica durante le chat </text> <text name="translate_language_text" width="110"> Traduci chat in: diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml index 4f52105404..90a833471c 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml @@ -16,7 +16,7 @@ <combo_box.item label="Русский (Russo) - Beta" name="Russian"/> <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/> <combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/> - <combo_box.item label="正體 (Cinese tradizionale) - Beta" name="Traditional Chinese"/> + <combo_box.item label="正體中文 (Cinese tradizionale) - Beta" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (Richiede il riavvio) diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml index 7a1046abd3..a0b324d8fb 100644 --- a/indra/newview/skins/default/xui/it/teleport_strings.xml +++ b/indra/newview/skins/default/xui/it/teleport_strings.xml @@ -18,6 +18,10 @@ Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE <message name="timeout_tport"> Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo. </message> + <message name="NoHelpIslandTP"> + Non è possibile per te ritornare all'Welcome Island. +Vai alla 'Welcome Island Public' per ripetere il tutorial. + </message> <message name="noaccess_tport"> Spiacenti, ma non hai accesso nel luogo di destinazione richiesto. </message> diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index 47bb2455cf..c628ade43e 100644 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -10,7 +10,7 @@ <floater.string name="AboutPosition"> あなたの現在地は、[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] の [REGION] です。位置は <nolink>[HOSTNAME]</nolink> です。([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [リリースノート]] +[SERVER_RELEASE_NOTES_URL] </floater.string> <floater.string name="AboutSystem"> CPU: [CPU] @@ -37,6 +37,9 @@ Qt Webkit バージョン: [QT_WEBKIT_VERSION] <floater.string name="AboutTraffic"> パケットロス: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) </floater.string> + <floater.string name="ErrorFetchingServerReleaseNotesURL"> + サーバーのリリースノートの URL を取得中にエラーが発生しました。 + </floater.string> <tab_container name="about_tab"> <panel label="情報" name="support_panel"> <button label="クリップボードにコピー" name="copy_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index e870a8ace9..3c88c902f8 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -214,19 +214,19 @@ オブジェクトボーナス: [BONUS] </text> <text name="Simulator primitive usage:"> - プリム使用状況: + リージョン(地域)の許容数: </text> <text name="objects_available"> [MAX] の内 [COUNT] ([AVAILABLE] 利用可能) </text> <text name="Primitives parcel supports:"> - 区画でサポートされるプリム数: + 区画の許容数: </text> <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> - 区画上のプリム数: + 区画の負荷: </text> <text name="total_objects_text"> [COUNT] diff --git a/indra/newview/skins/default/xui/ja/floater_avatar.xml b/indra/newview/skins/default/xui/ja/floater_avatar.xml new file mode 100644 index 0000000000..c4455282d2 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_avatar.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Avatar" title="アバターピッカー"/> diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml index 71a20c8e18..5d3a048975 100644 --- a/indra/newview/skins/default/xui/ja/floater_camera.xml +++ b/indra/newview/skins/default/xui/ja/floater_camera.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="camera_floater"> +<floater name="camera_floater" title="表示"> <floater.string name="rotate_tooltip"> フォーカスを中心にカメラを回転 </floater.string> diff --git a/indra/newview/skins/default/xui/ja/floater_chat_bar.xml b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml new file mode 100644 index 0000000000..9735afb101 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="chat_bar" title="近くのチャット"> + <panel> + <line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="Enter キーを押して話し、Ctrl + Enter キーで叫びます。"/> + <button name="show_nearby_chat" tool_tip="近くのチャットログを表示・非表示"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_destinations.xml b/indra/newview/skins/default/xui/ja/floater_destinations.xml new file mode 100644 index 0000000000..b7f6ad4d4e --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_destinations.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Destinations" title="行き先"/> diff --git a/indra/newview/skins/default/xui/ja/floater_fast_timers.xml b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml new file mode 100644 index 0000000000..5f538ecdb0 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="fast_timers"> + <string name="pause"> + 一時停止 + </string> + <string name="run"> + 走る + </string> + <button label="一時停止" name="pause_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_how_to.xml b/indra/newview/skins/default/xui/ja/floater_how_to.xml new file mode 100644 index 0000000000..4cebe27226 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_how_to.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_how_to" title="ハウツー"/> diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml index ff5a25fd7b..1122203446 100644 --- a/indra/newview/skins/default/xui/ja/floater_map.xml +++ b/indra/newview/skins/default/xui/ja/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map" title=""> +<floater name="Map" title="ミニマップ"> <floater.string name="ToolTipMsg"> [REGION](ダブルクリックで地図を開く。Shift‐ドラッグで水平・垂直移動) </floater.string> diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml index 07667bb697..157c68a570 100644 --- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml @@ -1,10 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Model Preview" title="モデルをアップロード"> - <string name="status_idle"> - 待機状態 - </string> +<floater name="Model Preview" title="モデルウィザード"> + <string name="status_idle"/> <string name="status_parse_error"> - Dae に問題が見つかりました - 詳細についてはログをご参照ください。 + エラー:Dae に問題が見つかりました - 詳細についてはログをご参照ください。 </string> <string name="status_reading_file"> ローディング... @@ -51,6 +49,9 @@ <string name="mesh_status_missing_lod"> 必要な描画詳細度が見つかりません。 </string> + <string name="mesh_status_invalid_material_list"> + LOD 付きの材料は参考モデルのサブセットではありません。 + </string> <string name="layer_all"> 全て </string> @@ -63,188 +64,211 @@ <string name="tbd"> 未定 </string> - <text name="name_label"> - 名前: - </text> - <text name="lod_label"> - プレビュー: - </text> - <combo_box name="preview_lod_combo" tool_tip="プレビュー表示のLOD設定"> - <combo_item name="high"> - 描画詳細度:高 - </combo_item> - <combo_item name="medium"> - 描画詳細度:中 - </combo_item> - <combo_item name="low"> - 描画詳細度:低 - </combo_item> - <combo_item name="lowest"> - 描画詳細度:最低 - </combo_item> - </combo_box> - <text name="warning_title"> - 警告: - </text> - <text name="warning_message"> - このモデルを Second Life サーバーにアップロードすることはできません。メッシュモデルのアップロード手順については [[VURL] こちらを参照してください]。 - </text> - <text name="weights_text"> - ダウンロード: -物理演算: -サーバー負荷: - -プリム換算: - </text> - <text name="weights"> - [ST] -[PH] -[SIM] - -[EQ] - </text> - <tab_container name="import_tab"> - <panel label="描画詳細度" name="lod_panel"> - <text name="lod_table_header"> - 描画詳細度を選択: - </text> - <text name="high_label" value="高"/> - <text name="high_triangles" value="0"/> - <text name="high_vertices" value="0"/> - <text name="medium_label" value="中"/> - <text name="medium_triangles" value="0"/> - <text name="medium_vertices" value="0"/> - <text name="low_label" value="低"/> - <text name="low_triangles" value="0"/> - <text name="low_vertices" value="0"/> - <text name="lowest_label" value="最低"/> - <text name="lowest_triangles" value="0"/> - <text name="lowest_vertices" value="0"/> - <text name="lod_table_footer"> - 描画詳細度: [DETAIL] - </text> - <radio_group name="lod_file_or_limit" value="lod_from_file"> - <radio_item label="ファイルからロード" name="lod_from_file"/> - <radio_item label="自動作成" name="lod_auto_generate"/> - <radio_item label="なし" name="lod_none"/> - </radio_group> - <button label="参照" name="lod_browse"/> - <combo_box name="lod_mode"> - <combo_item name="triangle_limit"> - 三角形の限度数 - </combo_item> - <combo_item name="error_threshold"> - エラーしきい値 - </combo_item> - </combo_box> - <text name="build_operator_text"> - 制作演算子: + <panel name="left_panel"> + <panel name="model_name_representation_panel"> + <text name="name_label"> + モデル名: </text> - <text name="queue_mode_text"> - キューモード: + <text name="model_category_label"> + このモデルは... </text> - <combo_box name="build_operator"> - <combo_item name="edge_collapse"> - 稜の完全複合 - </combo_item> - <combo_item name="half_edge_collapse"> - 稜の半複合 - </combo_item> - </combo_box> - <combo_box name="queue_mode"> - <combo_item name="greedy"> - グリーディ - </combo_item> - <combo_item name="lazy"> - レイジー - </combo_item> - <combo_item name="independent"> - インディペンデント - </combo_item> + <combo_box name="model_category_combo"> + <combo_item label="1つを選択..." name="Choose one"/> + <combo_item label="アバターの形" name="Avatar shape"/> + <combo_item label="アバターのアタッチメント" name="Avatar attachment"/> + <combo_item label="動くオブジェクト(車、動物)" name="Moving object (vehicle, animal)"/> + <combo_item label="制作用コンポーネント" name="Building Component"/> + <combo_item label="大型、不動、等" name="Large, non moving etc"/> + <combo_item label="やや小型、不動、等" name="Smaller, non-moving etc"/> + <combo_item label="いずれにも該当しない" name="Not really any of these"/> </combo_box> - <text name="border_mode_text"> - 境界線モード: - </text> - <text name="share_tolderance_text"> - 共有誤差: - </text> - <combo_box name="border_mode"> - <combo_item name="border_unlock"> - ロック解除 - </combo_item> - <combo_item name="border_lock"> - ロック - </combo_item> - </combo_box> - <text name="crease_label"> - 折れ角度: - </text> - <spinner name="crease_angle" value="75"/> </panel> - <panel label="物理効果" name="physics_panel"> - <panel name="physics geometry"> - <radio_group name="physics_load_radio" value="physics_load_from_file"> - <radio_item label="ファイル:" name="physics_load_from_file"/> - <radio_item label="次の描画詳細度を使用:" name="physics_use_lod"/> - </radio_group> - <combo_box name="physics_lod_combo" tool_tip="実像に適用するLOD"> - <combo_item name="physics_lowest"> - 最低 - </combo_item> - <combo_item name="physics_low"> - 低 - </combo_item> - <combo_item name="physics_medium"> - 中 - </combo_item> - <combo_item name="physics_high"> - 高 - </combo_item> - </combo_box> - <button label="参照" name="physics_browse"/> + <tab_container name="import_tab"> + <panel label="描画詳細度" name="lod_panel" title="描画詳細度"> + <text initial_value="データ源" name="source" value="データ源"/> + <text initial_value="三角形" name="triangles" value="三角形"/> + <text initial_value="頂点" name="vertices" value="頂点"/> + <text initial_value="高" name="high_label" value="高"/> + <button label="参照" name="lod_browse_high"/> + <text initial_value="0" name="high_triangles" value="0"/> + <text initial_value="0" name="high_vertices" value="0"/> + <text initial_value="中" name="medium_label" value="中"/> + <button label="参照" name="lod_browse_medium"/> + <text initial_value="0" name="medium_triangles" value="0"/> + <text initial_value="0" name="medium_vertices" value="0"/> + <text initial_value="低" name="low_label" value="低"/> + <button label="参照" name="lod_browse_low"/> + <text initial_value="0" name="low_triangles" value="0"/> + <text initial_value="0" name="low_vertices" value="0"/> + <text initial_value="最低" name="lowest_label" value="最低"/> + <button label="参照" name="lod_browse_lowest"/> + <text initial_value="0" name="lowest_triangles" value="0"/> + <text initial_value="0" name="lowest_vertices" value="0"/> + <check_box label="ノーマルの作成" name="gen_normals"/> + <text initial_value="折れ角度:" name="crease_label" value="折れ角度:"/> + <spinner name="crease_angle" value="75"/> </panel> - <panel name="physics analysis"> - <slider label="滑らかさ:" name="Smooth"/> - <check_box label="穴を閉じる(スロー)" name="Close Holes (Slow)"/> - <button label="分析" name="Decompose"/> - <button label="取り消し" name="decompose_cancel"/> + <panel label="物理効果" name="physics_panel"> + <panel name="physics geometry"> + <text name="first_step_name"> + 手順1:描画詳細度 + </text> + <combo_box name="physics_lod_combo" tool_tip="実像に適用するLOD"> + <combo_item name="choose_one"> + 1つを選択... + </combo_item> + <combo_item name="physics_high"> + 高 + </combo_item> + <combo_item name="physics_medium"> + 中 + </combo_item> + <combo_item name="physics_low"> + 低 + </combo_item> + <combo_item name="physics_lowest"> + 最低 + </combo_item> + <combo_item name="load_from_file"> + ファイルから + </combo_item> + </combo_box> + <button label="参照" name="physics_browse"/> + </panel> + <panel name="physics analysis"> + <text name="method_label"> + 手順2:分析 + </text> + <text name="analysis_method_label"> + 方法: + </text> + <text name="quality_label"> + 品質: + </text> + <text name="smooth_method_label"> + 滑らかさ: + </text> + <check_box label="穴を閉じる" name="Close Holes (Slow)"/> + <button label="分析" name="Decompose"/> + <button label="取り消し" name="decompose_cancel"/> + </panel> + <panel name="physics simplification"> + <text name="second_step_label"> + 手順3:単純化 + </text> + <text name="simp_method_header"> + 方法: + </text> + <text name="pass_method_header"> + パス: + </text> + <text name="Detail Scale label"> + 詳細度: + </text> + <text name="Retain%_label"> + 維持率: + </text> + <combo_box name="Combine Quality" value="1"/> + <button label="単純化" name="Simplify"/> + <button label="取り消し" name="simplify_cancel"/> + </panel> + <panel name="physics info"> + <text name="results_text"> + 結果: + </text> + <text name="physics_triangles"> + 三角形:[TRIANGLES], + </text> + <text name="physics_points"> + 頂点:[POINTS], + </text> + <text name="physics_hulls"> + 外殻構造:[HULLS] + </text> + </panel> </panel> - <panel name="physics simplification"> - <slider label="パス:" name="Combine Quality"/> - <slider label="詳細度:" name="Detail Scale"/> - <slider label="維持率:" name="Retain%"/> - <button label="単純化" name="Simplify"/> - <button label="取り消し" name="simplify_cancel"/> - </panel> - <panel name="physics info"> - <slider label="プレビュースプレッド:" name="physics_explode"/> - <text name="physics_triangles"> - 三角形: [TRIANGLES] + <panel label="アップロードのオプション" name="modifiers_panel"> + <text name="scale_label"> + スケール(1=増減なし): + </text> + <spinner name="import_scale" value="1.0"/> + <text name="dimensions_label"> + サイズ: </text> - <text name="physics_points"> - 頂点: [POINTS] + <text name="import_dimensions"> + [X] X [Y] X [Z] </text> - <text name="physics_hulls"> - 外殻構造: [HULLS] + <check_box label="テクスチャを含む" name="upload_textures"/> + <text name="include_label"> + アバターモデル専用: </text> + <check_box label="スキンの重さを含む" name="upload_skin"/> + <check_box label="ジョイントポジションを含む" name="upload_joints"/> + <text name="pelvis_offset_label"> + Z オフセット(アバターを上下調整): + </text> + <spinner name="pelvis_offset" value="0.0"/> </panel> - </panel> - <panel label="修飾子" name="modifiers_panel"> - <spinner name="import_scale" value="1.0"/> - <text name="import_dimensions"> - [X] x [Y] x [Z] m + </tab_container> + <panel name="weights_and_warning_panel"> + <button label="ウェイトと料金の計算" name="calculate_btn" tool_tip="ウェイトと料金の計算"/> + <button label="取り消し" name="cancel_btn"/> + <button label="アップロード" name="ok_btn" tool_tip="シミュレーターにアップロード"/> + <button label="設定をクリアしてフォームをリセット" name="reset_btn"/> + <text name="upload_fee"> + アップロード料金:L$ [FEE] + </text> + <text name="prim_weight"> + 土地の負荷:[EQ] + </text> + <text name="download_weight"> + ダウンロード:[ST] + </text> + <text name="physics_weight"> + 物理演算:[PH] + </text> + <text name="server_weight"> + サーバー負荷:[SIM] + </text> + <text name="warning_title"> + ご注意: + </text> + <text name="warning_message"> + メッシュモデルをアップロードする権利がありません。権利の取得方法については [[VURL]] こちらを参照してください。 + </text> + <text name="status"> + [STATUS] </text> - <check_box label="テクスチャ" name="upload_textures"/> - <check_box label="スキンの重さ" name="upload_skin"/> - <check_box label="ジョイントポジション" name="upload_joints"/> - <spinner name="pelvis_offset" value="0.0"/> </panel> - </tab_container> - <text name="upload_fee"> - アップロード料金:L$ [FEE] + </panel> + <text name="lod_label"> + プレビュー: </text> - <button label="デフォルトに設定" name="reset_btn" tool_tip="デフォルトに設定"/> - <button label="ウェイトと料金の計算" name="calculate_btn" tool_tip="ウェイトと料金の計算"/> - <button label="アップロード" name="ok_btn" tool_tip="シミュレーターにアップロード"/> - <button label="取り消し" name="cancel_btn"/> + <panel name="right_panel"> + <combo_box name="preview_lod_combo" tool_tip="プレビュー表示の LOD 設定"> + <combo_item name="high"> + 高 + </combo_item> + <combo_item name="medium"> + 中 + </combo_item> + <combo_item name="low"> + 低 + </combo_item> + <combo_item name="lowest"> + 最低 + </combo_item> + </combo_box> + <text name="label_display"> + ディスプレイ... + </text> + <check_box label="稜" name="show_edges"/> + <check_box label="物理効果" name="show_physics"/> + <check_box label="テクスチャ" name="show_textures"/> + <check_box label="スキンの重さ" name="show_skin_weight"/> + <check_box label="ジョイント" name="show_joint_positions"/> + <text name="physics_explode_label"> + プレビュースプレッド: + </text> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml index 2f336fcbde..915b37557f 100644 --- a/indra/newview/skins/default/xui/ja/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/ja/floater_model_wizard.xml @@ -6,26 +6,20 @@ <button label="2. 最適化" name="optimize_btn"/> <button label="1. ファイルを選択" name="choose_file_btn"/> <panel name="choose_file_panel"> - <panel name="choose_file_header_panel"> - <text name="choose_file_header_text"> + <panel name="header_panel"> + <text name="header_text"> モデルファイルを選択 </text> </panel> - <panel name="choose_file_content_panel"> + <panel name="content"> <text name="advanced_users_text"> 上級ユーザーの場合:3D コンテンツの制作ツールを使い慣れた方は、高度なアップローダーもお試しください。 </text> <button label="アドバンスモードに切り替える" name="switch_to_advanced"/> - <text name="choose_model_file_label"> + <text name="Cache location"> アップロードするモデルファイルの選択 </text> <button label="参照" label_selected="参照" name="browse"/> - <text name="support_collada_text"> - Second Life は COLLADA (.dae) ファイルをサポートします。 - </text> - <text name="dimensions_label"> - サイズ(メートル): - </text> <text name="dimensions"> X Y Z </text> @@ -38,18 +32,15 @@ </panel> </panel> <panel name="optimize_panel"> - <panel name="optimize_header_panel"> - <text name="optimize_header_text"> + <panel name="header_panel"> + <text name="header_text"> モデルを最適化 </text> </panel> - <text name="optimize_hint"> + <text name="description"> パフォーマンスを重視してモデルを最適化しました。必要に応じて調整してください。 </text> - <panel name="optimize_content_panel"> - <text name="generating_lod_label"> - 次の描画詳細度を作成 - </text> + <panel name="content"> <text name="high_detail_text"> 次の描画詳細度を作成:高 </text> @@ -64,123 +55,64 @@ </text> </panel> <panel name="content2"> - <text name="optimize_performance_text"> - パフォーマンス - </text> - <text name="optimize_faster_rendering_text"> - レンダリング速度の向上 -詳細度の低下 -プリム換算ウェイトの軽減 - </text> - <text name="optimize_accuracy_text"> - 正確さ - </text> - <text name="optimize_slower_rendering_text"> - レンダリング速度の低下 -詳細化 -プリム換算ウェイトの増加 - </text> - <text name="accuracy_slider_mark1"> - ' - </text> - <text name="accuracy_slider_mark2"> - ' - </text> - <text name="accuracy_slider_mark3"> - ' - </text> <button label="ジオメトリを再計算" name="recalculate_geometry_btn"/> - <text name="geometry_preview_label"> + <text name="lod_label"> ジオメトリのプレビュー </text> <combo_box name="preview_lod_combo" tool_tip="プレビュー表示の LOD 設定"> - <combo_item name="preview_lod_high"> + <combo_item name="high"> 高い詳細度 </combo_item> - <combo_item name="preview_lod_medium"> + <combo_item name="medium"> 中の詳細度 </combo_item> - <combo_item name="preview_lod_low"> + <combo_item name="low"> 低い詳細度 </combo_item> - <combo_item name="preview_lod_lowest"> + <combo_item name="lowest"> 最低の詳細度 </combo_item> </combo_box> </panel> </panel> <panel name="physics_panel"> - <panel name="physics_header_panel"> - <text name="physics_header_text"> + <panel name="header_panel"> + <text name="header_text"> 物理作用の調整 </text> </panel> - <text name="physics_hint"> + <text name="description"> モデルの外殻構造のシェイプは弊社が作成します。モデルの目的に応じてシェイプの詳細度を調整してください。 </text> - <panel name="physics_content_panel"> - <text name="physics_performance_text"> - パフォーマンス - </text> - <text name="physics_faster_rendering_text"> - レンダリング速度の向上 -詳細度の低下 -プリム換算ウェイトの軽減 - </text> - <text name="physics_accuracy_text"> - 正確 - </text> - <text name="physics_slower_dendering_text"> - レンダリング速度の低下 -詳細化 -プリム換算ウェイトの増加 - </text> - <text name="physics_example_1"> - 例: -動くオブジェクト -飛行オブジェクト -車 - </text> - <text name="physics_example_2"> - 例: -小さな静止オブジェクト -比較的詳細度の低いオブジェクト -シンプルな家具 - </text> - <text name="physics_example_3"> - 例: -静止オブジェクト -詳細なオブジェクト -建物 - </text> + <panel name="content"> <button label="物理演算ウェイトを再計算" name="recalculate_physics_btn"/> <button label="再計算中..." name="recalculating_physics_btn"/> - <text name="physics_preview_label"> + <text name="lod_label"> 物理作用のプレビュー </text> <combo_box name="preview_lod_combo2" tool_tip="プレビュー表示の LOD 設定"> - <combo_item name="preview_lod2_high"> + <combo_item name="high"> 高い詳細度 </combo_item> - <combo_item name="preview_lod2_medium"> + <combo_item name="medium"> 中の詳細度 </combo_item> - <combo_item name="preview_lod2_low"> + <combo_item name="low"> 低い詳細度 </combo_item> - <combo_item name="preview_lod2_lowest"> + <combo_item name="lowest"> 最低の詳細度 </combo_item> </combo_box> </panel> </panel> <panel name="review_panel"> - <panel name="review_header_panel"> - <text name="review_header_text"> + <panel name="header_panel"> + <text name="header_text"> 確認 </text> </panel> - <panel name="review_content_panel"> + <panel name="content"> <text name="review_prim_equiv"> 区画/リージョンへの負荷:[EQUIV] プリム換算値 </text> @@ -193,8 +125,8 @@ </panel> </panel> <panel name="upload_panel"> - <panel name="upload_header_panel"> - <text name="upload_header_text"> + <panel name="header_panel"> + <text name="header_text"> アップロード完了 </text> </panel> diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml index 57ab32f486..88c1905b8a 100644 --- a/indra/newview/skins/default/xui/ja/floater_moveview.xml +++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> +<floater name="move_floater" title="移動"> <string name="walk_forward_tooltip"> 前に進む(上矢印か W を押す) </string> @@ -58,14 +58,14 @@ 飛ぶ </string> <panel name="panel_actions"> - <button label="" label_selected="" name="move up btn" tool_tip="上に移動(E を押す)"/> <button label="" label_selected="" name="turn left btn" tool_tip="左を向く(左矢印か A を押す)"/> <joystick_slide name="move left btn" tool_tip="左に歩く(Shift + 左矢印か A を押す)"/> - <button label="" label_selected="" name="move down btn" tool_tip="下に移動(C を押す)"/> <button label="" label_selected="" name="turn right btn" tool_tip="右を向く(右矢印か D を押す)"/> <joystick_slide name="move right btn" tool_tip="右に歩く(Shift + 右矢印か D を押す)"/> <joystick_turn name="forward btn" tool_tip="前に進む(上矢印か W を押す)"/> <joystick_turn name="backward btn" tool_tip="後ろに歩く(下矢印か S を押す)"/> + <button label="" label_selected="" name="move up btn" tool_tip="上に移動(E を押す)"/> + <button label="" label_selected="" name="move down btn" tool_tip="下に移動(C を押す)"/> </panel> <panel name="panel_modes"> <button label="" name="mode_walk_btn" tool_tip="歩行モード"/> diff --git a/indra/newview/skins/default/xui/ja/floater_my_appearance.xml b/indra/newview/skins/default/xui/ja/floater_my_appearance.xml new file mode 100644 index 0000000000..c9a0ecefd7 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_my_appearance.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_appearance" title="容姿"> + <panel label="容姿の編集" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_my_inventory.xml b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml new file mode 100644 index 0000000000..c6a789b63b --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_inventory" title="持ち物"/> diff --git a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml index a29c6a0630..bcddcc6907 100644 --- a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="近くのチャット"> - <check_box label="チャットを翻訳(Google翻訳)" name="translate_chat_checkbox"/> + <check_box label="チャットを翻訳" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_object_weights.xml b/indra/newview/skins/default/xui/ja/floater_object_weights.xml new file mode 100644 index 0000000000..3bd9b6b069 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_object_weights.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="object_weights" title="詳しい設定"> + <floater.string name="nothing_selected" value="--"/> + <text name="selected_text" value="選択済"/> + <text name="objects" value="--"/> + <text name="objects_label" value="オブジェクト"/> + <text name="prims" value="--"/> + <text name="prims_label" value="プリム"/> + <text name="weights_of_selected_text" value="選択済み項目のウエイト"/> + <text name="download" value="--"/> + <text name="download_label" value="ダウンロード"/> + <text name="physics" value="--"/> + <text name="physics_label" value="物理効果"/> + <text name="server" value="--"/> + <text name="server_label" value="サーバー"/> + <text name="display" value="--"/> + <text name="display_label" value="ディスプレイ"/> + <text name="land_impacts_text" value="土地の負荷"/> + <text name="selected" value="--"/> + <text name="selected_label" value="選択済"/> + <text name="rezzed_on_land" value="--"/> + <text name="rezzed_on_land_label" value="土地に Rez 済み"/> + <text name="remaining_capacity" value="--"/> + <text name="remaining_capacity_label" value="残りの許容数"/> + <text name="total_capacity" value="--"/> + <text name="total_capacity_label" value="許容合計"/> + <text name="help_SLURL" value="[secondlife:///app/help/object_weights オブジェクトのウェイトとは?]"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_people.xml b/indra/newview/skins/default/xui/ja/floater_people.xml new file mode 100644 index 0000000000..08bee88103 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_people.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_people" title="人"> + <panel_container name="main_panel"> + <panel label="グループ情報" name="panel_group_info_sidetray"/> + <panel label="ブロックされた住人とオブジェクト" name="panel_block_list_sidetray"/> + </panel_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_picks.xml b/indra/newview/skins/default/xui/ja/floater_picks.xml new file mode 100644 index 0000000000..359585eb86 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_picks.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_picks" title="ピック"/> diff --git a/indra/newview/skins/default/xui/ja/floater_places.xml b/indra/newview/skins/default/xui/ja/floater_places.xml new file mode 100644 index 0000000000..0d167444db --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_places.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_places" title="場所"> + <panel label="場所" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml index 97927776c7..6a1f34cfd8 100644 --- a/indra/newview/skins/default/xui/ja/floater_stats.xml +++ b/indra/newview/skins/default/xui/ja/floater_stats.xml @@ -10,8 +10,8 @@ </stat_view> <stat_view label="アドバンス" name="advanced"> <stat_view label="描画" name="render"> - <stat_bar label="KTris 描画" name="ktrisframe"/> - <stat_bar label="KTris 描画" name="ktrissec"/> + <stat_bar label="フレームごとの KTris 描画" name="ktrisframe"/> + <stat_bar label="秒ごとの KTris 描画" name="ktrissec"/> <stat_bar label="オブジェクト合計" name="objs"/> <stat_bar label="新規オブジェクト" name="newobjs"/> </stat_view> @@ -64,6 +64,14 @@ <stat_bar label="エージェント時間" name="simagentmsec"/> <stat_bar label="イメージ時間" name="simimagesmsec"/> <stat_bar label="スクリプト時間" name="simscriptmsec"/> + <stat_bar label="余暇" name="simsparemsec"/> + <stat_view label="時間の詳細(ms)" name="timedetails"> + <stat_bar label="物理効果の単位" name="simsimphysicsstepmsec"/> + <stat_bar label="物理形状を更新" name="simsimphysicsshapeupdatemsec"/> + <stat_bar label="他の物理効果" name="simsimphysicsothermsec"/> + <stat_bar label="スリープ時間" name="simsleepmsec"/> + <stat_bar label="ポンプ I/O" name="simpumpiomsec"/> + </stat_view> </stat_view> </stat_view> </container_view> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index a8b5febd54..8eddf55a44 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -25,10 +25,10 @@ 土地をクリックし、ドラッグして選択 </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] 個のオブジェクト([PRIM_COUNT] 個のプリム [PE_STRING])が選択されています + 選択されているオブジェクトは [OBJ_COUNT] 個、土地の負荷は [LAND_IMPACT] </floater.string> - <floater.string name="status_selectprimequiv"> - , [SEL_WEIGHT] プリム換算値 + <floater.string name="status_remaining_capacity"> + 残りの許容数 [LAND_CAPACITY]。 </floater.string> <button label="" label_selected="" name="button focus" tool_tip="フォーカス"/> <button label="" label_selected="" name="button move" tool_tip="動かす"/> @@ -105,8 +105,8 @@ <text name="selection_empty"> 何も選択されていません。 </text> - <text name="selection_weight"> - 物理演算ウェイト [PHYS_WEIGHT]、レンダリングコスト [DISP_WEIGHT]。 + <text name="remaining_capacity"> + [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細] </text> <tab_container name="Object Info Tabs"> <panel label="一般" name="General"> @@ -325,7 +325,6 @@ 縫い目のタイプ </text> <combo_box name="sculpt type control"> - <combo_box.item label="(なし)" name="None"/> <combo_box.item label="球体" name="Sphere"/> <combo_box.item label="トーラス" name="Torus"/> <combo_box.item label="平面" name="Plane"/> diff --git a/indra/newview/skins/default/xui/ja/floater_toybox.xml b/indra/newview/skins/default/xui/ja/floater_toybox.xml new file mode 100644 index 0000000000..d7056f806c --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_toybox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Toybox" title="ツールバーをカスタマイズ"> + <text name="toybox label 1"> + ボタンをツールバーに追加または削除するにはボタンをドラッグします。 + </text> + <text name="toybox label 2"> + 各ツールバーの設定に応じて、ボタンは以下のように表示されたり、アイコンのみで表示されます。 + </text> + <button label="デフォルト設定を復元" label_selected="デフォルト設定を復元" name="btn_restore_defaults"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml index 3a1ae49700..2e633ae1b2 100644 --- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_navbar_menu"> - <menu_item_check label="ナビゲーションバーを表示" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="ナビゲーションバーとお気に入りバーを表示" name="ShowNavbarNavigationPanel"/> <menu_item_check label="お気に入りバーを表示" name="ShowNavbarFavoritesPanel"/> <menu_item_check label="「場所」のミニフィールドを表示" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml index dca872e9b8..4c88f17f3d 100644 --- a/indra/newview/skins/default/xui/ja/menu_login.xml +++ b/indra/newview/skins/default/xui/ja/menu_login.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Login Menu"> <menu label="ミー" name="File"> - <menu_item_call label="環境設定" name="Preferences..."/> + <menu_item_call label="環境設定..." name="Preferences..."/> <menu_item_call label="[APP_NAME] を終了" name="Quit"/> </menu> <menu label="ヘルプ" name="Help"> diff --git a/indra/newview/skins/default/xui/ja/menu_toolbars.xml b/indra/newview/skins/default/xui/ja/menu_toolbars.xml new file mode 100644 index 0000000000..e911ca4a13 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_toolbars.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Toolbars Popup"> + <menu_item_call label="ボタンを選択..." name="Chose Buttons"/> + <menu_item_check label="アイコンとラベル" name="icons_with_text"/> + <menu_item_check label="アイコンのみ" name="icons_only"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index edce5c50fc..b9dbb81c0a 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -1,29 +1,30 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> <menu label="ミー" name="Me"> - <menu_item_call label="環境設定" name="Preferences"/> - <menu_item_call label="マイアカウント" name="Manage My Account"> + <menu_item_call label="マイアカウント..." name="Manage My Account"> <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/> </menu_item_call> - <menu_item_call label="L$ の購入" name="Buy and Sell L$"/> - <menu_item_call label="プロフィール" name="Profile"/> - <menu_item_call label="容姿" name="ChangeOutfit"/> - <menu_item_check label="持ち物" name="Inventory"/> - <menu_item_check label="持ち物" name="ShowSidetrayInventory"/> - <menu_item_check label="ジェスチャー" name="Gestures"/> - <menu_item_check label="マイボイス" name="ShowVoice"/> + <menu_item_call label="プロフィール..." name="Profile"/> + <menu_item_call label="容姿..." name="ChangeOutfit"/> + <menu_item_check label="持ち物..." name="Inventory"/> + <menu_item_check label="ジェスチャー..." name="Gestures"/> + <menu_item_check label="ボイス..." name="ShowVoice"/> <menu label="ムーブメント" name="Movement"> <menu_item_call label="座る" name="Sit Down Here"/> <menu_item_check label="飛ぶ" name="Fly"/> <menu_item_check label="常に走る" name="Always Run"/> <menu_item_call label="私のアニメーションを停止する" name="Stop Animating My Avatar"/> </menu> - <menu label="ログイン状態" name="Status"> + <menu label="ログイン" name="Status"> <menu_item_call label="一時退席中" name="Set Away"/> <menu_item_call label="取り込み中" name="Set Busy"/> </menu> <menu_item_call label="管理者権限のリクエスト" name="Request Admin Options"/> <menu_item_call label="管理者ステータス解除" name="Leave Admin Options"/> + <menu_item_call label="L$ の購入" name="Buy and Sell L$"/> + <menu_item_call label="環境設定..." name="Preferences"/> + <menu_item_call label="ツールバー..." name="Toolbars"/> + <menu_item_call label="全てのコントロールを非表示にする" name="Hide UI"/> <menu_item_call label="[APP_NAME] を終了" name="Quit"/> </menu> <menu label="コミュニケーション" name="Communicate"> @@ -145,7 +146,6 @@ </menu> <menu label="ヘルプ" name="Help"> <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/> - <menu_item_check label="ヒントを有効にする" name="Enable Hints"/> <menu_item_call label="嫌がらせを報告する" name="Report Abuse"/> <menu_item_call label="バグを報告する" name="Report Bug"/> <menu_item_call label="[APP_NAME] について" name="About Second Life"/> @@ -161,7 +161,7 @@ <menu label="パフォーマンスツール" name="Performance Tools"> <menu_item_call label="ラグ計測器" name="Lag Meter"/> <menu_item_check label="統計バー" name="Statistics Bar"/> - <menu_item_check label="アバターのレンダリングコストを表示する" name="Avatar Rendering Cost"/> + <menu_item_check label="アバターの描画ウェイトを表示" name="Avatar Rendering Cost"/> </menu> <menu label="ハイライトと目に見えるもの" name="Highlighting and Visibility"> <menu_item_check label="チージービーコン" name="Cheesy Beacon"/> @@ -289,6 +289,7 @@ <menu_item_check label="光" name="Lights"/> <menu_item_check label="骨組みの衝突判定" name="Collision Skeleton"/> <menu_item_check label="レイキャスト" name="Raycast"/> + <menu_item_check label="描画の詳細度" name="rendercomplexity"/> <menu_item_check label="スカルプト" name="Sculpt"/> </menu> <menu label="レンダリング" name="Rendering"> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index c138aeb383..85f09b4500 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -1953,6 +1953,12 @@ Adult 専用リージョンに入るには、住人のアカウントが年齢 終了しようとしています。続けますか? <usetemplate ignoretext="終了時の確認" name="okcancelignore" notext="終了しない" yestext="終了"/> </notification> + <notification name="ConfirmRestoreToybox"> + デフォルトのボタンとツールバーを復元しますか? + +この操作は元に戻せません。 + <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/> + </notification> <notification name="DeleteItems"> [QUESTION] <usetemplate ignoretext="アイテムを削除する前の確認" name="okcancelignore" notext="取り消し" yestext="OK"/> @@ -3041,10 +3047,6 @@ M キーを押して変更します。 <button name="cancel" text="取り消し"/> </form> </notification> - <notification label="" name="ModeChange"> - モードを変更するには終了して再起動する必要があります。 - <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/> - </notification> <notification label="" name="NoClassifieds"> クラシファイド広告の作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。 <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/> @@ -3089,6 +3091,10 @@ M キーを押して変更します。 検索はアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか? <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/> </notification> + <notification label="" name="ConfirmHideUI"> + この操作により、全てのメニュー項目とボタンが非表示になります。再び表示するには [SHORTCUT] をもう一度クリックしてください。 + <usetemplate ignoretext="UI を非表示にする前に確認" name="okcancelignore" notext="取り消し" yestext="OK"/> + </notification> <global name="UnsupportedGLRequirements"> [APP_NAME] に必要なハードウェアがないようです。 [APP_NAME] にはマルチテクスチャをサポートする OpenGL グラフィックカードが必要です。 お使いのグラフィックカードの最新ドライバがインストールされているかどうか、オペレーティングシステムのサービスパックとパッチが入っているかをご確認ください。 diff --git a/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml new file mode 100644 index 0000000000..6717ba9ba3 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_chiclet_bar.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chiclet_bar"> + <layout_stack name="toolbar_stack"> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="会話"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="通知"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml index dda5bc0009..896bbff0ee 100644 --- a/indra/newview/skins/default/xui/ja/panel_me.xml +++ b/indra/newview/skins/default/xui/ja/panel_me.xml @@ -1,7 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="マイ プロフィール" name="panel_me"> - <tab_container name="tabs"> - <panel label="マイ プロフィール" name="panel_profile"/> - <panel label="マイ ピック" name="panel_picks"/> - </tab_container> + <panel label="マイ ピック" name="panel_picks"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml index 0426c4fe9a..51402b2e00 100644 --- a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml @@ -1,18 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> - <panel name="navigation_panel"> - <pull_button name="back_btn" tool_tip="前の場所へ戻ります"/> - <pull_button name="forward_btn" tool_tip="次の場所へ進みます"/> - <button name="home_btn" tool_tip="「ホーム」にテレポート"/> - <location_input label="場所" name="location_combo"/> - <search_combo_box label="検索" name="search_combo_box" tool_tip="検索"> - <combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/> - </search_combo_box> - </panel> - <favorites_bar name="favorite" tool_tip="ランドマークをここにドラッグして、Second Lifeのお気に入りの場所に素早くアクセス!"> - <label name="favorites_bar_label" tool_tip="ランドマークをここにドラッグして、Second Lifeのお気に入りの場所に素早くアクセス!"> - お気に入りバー - </label> - <chevron_button name=">>" tool_tip="お気に入りをもっと表示"/> - </favorites_bar> + <layout_stack name="nvp_stack"> + <layout_panel name="navigation_layout_panel"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="前の場所"/> + <pull_button name="forward_btn" tool_tip="次の場所"/> + <button name="home_btn" tool_tip="「ホーム」にテレポートします"/> + <location_input label="所在地" name="location_combo"/> + </panel> + </layout_panel> + <layout_panel name="favorites_layout_panel"> + <favorites_bar name="favorite" tool_tip="ランドマークをここにドラッグして、Second Lifeのお気に入りの場所に素早くアクセス!"> + <label name="favorites_bar_label" tool_tip="ランドマークをここにドラッグして、Second Lifeのお気に入りの場所に素早くアクセス!"> + お気に入りバー + </label> + <more_button name=">>" tool_tip="お気に入りをもっと表示"> + 詳細 ▼ + </more_button> + </favorites_bar> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml new file mode 100644 index 0000000000..aca055bb43 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_chat"> + <check_box label="チャットを翻訳" name="translate_chat_checkbox"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index 20e17de5f1..1502442a06 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -29,9 +29,9 @@ <check_box label="IM チャット" name="EnableIMChatPopups" tool_tip="これを選択すると、インスタントメッセージを受信した際にポップアップが表示されます"/> <spinner label="近くのチャットメッセージが表示される長さ:" name="nearby_toasts_lifetime"/> <spinner label="近くのチャットメッセージが消えるまでの長さ:" name="nearby_toasts_fadingtime"/> - <check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/> + <check_box label="Use machine translation while chatting" name="translate_chat_checkbox"/> <text name="translate_chb_label"> - チャット中に内容を機械翻訳する(Google翻訳) + チャット中に内容を機械翻訳する </text> <text name="translate_language_text"> 翻訳する言語: @@ -51,7 +51,7 @@ <combo_box.item label="Русский(ロシア語)" name="Russian"/> <combo_box.item label="Türkçe(トルコ語)" name="Turkish"/> <combo_box.item label="Українська(ウクライナ語)" name="Ukrainian"/> - <combo_box.item label="中文 (正體)(中国語)" name="Chinese"/> + <combo_box.item label="中文 (正體) (Chinese)" name="Chinese"/> <combo_box.item label="日本語" name="Japanese"/> <combo_box.item label="한국어(韓国語)" name="Korean"/> </combo_box> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index 4356f3d47f..1bafa52fbe 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -13,7 +13,10 @@ <combo_box.item label="Italiano (イタリア語) - ベータ" name="Italian"/> <combo_box.item label="Polski (ポーランド語) - ベータ" name="Polish"/> <combo_box.item label="Português(ポルトガル語) - ベータ" name="Portugese"/> + <combo_box.item label="Русский (ロシア語) - ベータ" name="Russian"/> + <combo_box.item label="Türkçe (トルコ語) - ベータ" name="Turkish"/> <combo_box.item label="日本語 – ベータ" name="(Japanese)"/> + <combo_box.item label="正體中文 (中国語 - 繁体字) - ベータ" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (再起動後に反映) @@ -48,7 +51,6 @@ <check_box label="グループタイトル" name="show_all_title_checkbox1" tool_tip="オフィサーまたはメンバーなど、グループタイトルを表示"/> <check_box label="フレンドをハイライト表示" name="show_friends" tool_tip="フレンドの名前をハイライト表示"/> <check_box label="表示名を表示" name="display_names_check" tool_tip="これを選択すると、チャット、IM などで表示名が表示されます。"/> - <check_box label="ビューワの UI ヒントを有効にする" name="viewer_hints_check"/> <text name="inworld_typing_rg_label"> 文字キーを押して次の操作: </text> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml index 806bcfc14a..121bebfd52 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml @@ -7,18 +7,33 @@ </text> <check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードのオン・オフの切り替えに、自動カメラポジションを使います"/> <check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードに入ったときに、自動カメラポジションを使います"/> - <check_box initial_value="true" label="サイドバー" name="appearance_sidebar_positioning" tool_tip="サイドバーに自動カメラポジションを使います"/> + <text name="keyboard_lbl"> + キーボード: + </text> + <check_box label="常にキー操作で動くようにする" name="arrow_keys_move_avatar_check"/> + <check_box label="上矢印キー2度押し+長押しで走る" name="tap_tap_hold_to_run"/> + <text name="mouse_lbl"> + マウス: + </text> <check_box label="一人称視点で表示する" name="first_person_avatar_visible"/> <text name=" Mouse Sensitivity"> 一人称視点のマウスの感度: </text> <check_box label="切り替え" name="invert_mouse"/> - <check_box label="常にキー操作で動くようにする" name="arrow_keys_move_avatar_check"/> - <check_box label="上矢印キー2度押し+長押しで走る" name="tap_tap_hold_to_run"/> - <check_box label="ダブルクリックで次の操作:" name="double_click_chkbox"/> - <radio_group name="double_click_action"> - <radio_item label="テレポート" name="radio_teleport"/> - <radio_item label="自動追跡" name="radio_autopilot"/> - </radio_group> + <text name="single_click_action_lbl"> + 土地をシングルクリック: + </text> + <combo_box name="single_click_action_combo"> + <combo_box.item label="動作なし" name="0"/> + <combo_box.item label="クリックされた地点に移動" name="1"/> + </combo_box> + <text name="double_click_action_lbl"> + 土地をダブルクリック: + </text> + <combo_box name="double_click_action_combo"> + <combo_box.item label="動作なし" name="0"/> + <combo_box.item label="クリックされた地点に移動" name="1"/> + <combo_box.item label="クリックされた地点にテレポート" name="2"/> + </combo_box> <button label="その他のディバイス" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 35c1148cc1..93689b81af 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -18,11 +18,8 @@ <panel name="balance_bg"> <text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$20"/> <button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/> + <button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く"/> </panel> - <combo_box name="mode_combo" tool_tip="モードを選択します。ベーシックモードでは探索やチャットをすばやく簡単に実行でき、アドバンスモードでは、より多くの機能が利用できます。"> - <combo_box.item label="ベーシックモード" name="Basic"/> - <combo_box.item label="アドバンスモード" name="Advanced"/> - </combo_box> <text name="TimeText" tool_tip="現在時刻(太平洋)"> 24:00 AM PST </text> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 41dc098ba2..f611b96502 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -77,10 +77,10 @@ キャッシュファイルを検証しています(所要時間は 60 ~ 90 秒)... </string> <string name="LoginProcessingResponse"> - 応答を処理しています... + 対応を処理中です... </string> <string name="LoginInitializingWorld"> - ワールドを初期化しています... + ワールドを初期化中です... </string> <string name="LoginDecodingImages"> 画像をデコードしています... @@ -128,7 +128,7 @@ グリッドサーバーが返した証明書の署名を認証できませんでした。グリッドの管理者にお問い合わせください。 </string> <string name="LoginFailedNoNetwork"> - ネットワークエラー: 接続を確立できませんでした。お使いのネットワーク接続をご確認ください。 + ネットワークエラー:接続を確立できませんでした。お使いのネットワーク接続をご確認ください。 </string> <string name="LoginFailed"> ログインに失敗しました。 @@ -1276,6 +1276,9 @@ support@secondlife.com にお問い合わせください。 <string name="Marketplace Error Internal Import"> エラー:この商品に関して問題が発生しました。しばらくしてからお試しください。 </string> + <string name="Open landmarks"> + ランドマークを開く + </string> <string name="no_transfer" value=" (再販・プレゼント不可)"/> <string name="no_modify" value=" (編集不可)"/> <string name="no_copy" value=" (コピー不可)"/> @@ -4254,8 +4257,8 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="Female - Wow"> 女性 - Wow </string> - <string name="/bow1"> - /bow1 + <string name="/bow"> + /おじぎする </string> <string name="/clap"> /拍手 @@ -4767,4 +4770,172 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="ParticleHiding"> パーティクルを非表示 </string> + <string name="Command_AboutLand_Label"> + 土地情報 + </string> + <string name="Command_Appearance_Label"> + 容姿 + </string> + <string name="Command_Avatar_Label"> + アバター + </string> + <string name="Command_Build_Label"> + 制作 + </string> + <string name="Command_Chat_Label"> + チャット + </string> + <string name="Command_Compass_Label"> + コンパス + </string> + <string name="Command_Destinations_Label"> + 行き先 + </string> + <string name="Command_Gestures_Label"> + ジェスチャー + </string> + <string name="Command_HowTo_Label"> + ハウツー + </string> + <string name="Command_Inventory_Label"> + 持ち物 + </string> + <string name="Command_Map_Label"> + 地図 + </string> + <string name="Command_Marketplace_Label"> + マーケットプレイス + </string> + <string name="Command_MiniMap_Label"> + ミニマップ + </string> + <string name="Command_Move_Label"> + 移動 + </string> + <string name="Command_People_Label"> + 人 + </string> + <string name="Command_Picks_Label"> + ピック + </string> + <string name="Command_Places_Label"> + 場所 + </string> + <string name="Command_Preferences_Label"> + 環境設定 + </string> + <string name="Command_Profile_Label"> + プロフィール + </string> + <string name="Command_Search_Label"> + 検索 + </string> + <string name="Command_Snapshot_Label"> + スナップショット + </string> + <string name="Command_Speak_Label"> + 話す + </string> + <string name="Command_View_Label"> + 視界 + </string> + <string name="Command_Voice_Label"> + 近くのボイス + </string> + <string name="Command_AboutLand_Tooltip"> + 訪問先に関する情報 + </string> + <string name="Command_Appearance_Tooltip"> + アバターを変更 + </string> + <string name="Command_Avatar_Tooltip"> + アバター一式を選択 + </string> + <string name="Command_Build_Tooltip"> + オブジェクトの制作と地形の変形 + </string> + <string name="Command_Chat_Tooltip"> + 近くの人と文字チャットする + </string> + <string name="Command_Compass_Tooltip"> + コンパス + </string> + <string name="Command_Destinations_Tooltip"> + 行ってみたい場所 + </string> + <string name="Command_Gestures_Tooltip"> + アバターのジェスチャー + </string> + <string name="Command_HowTo_Tooltip"> + 一般的タスクの実行方法 + </string> + <string name="Command_Inventory_Tooltip"> + 持ち物を表示・使用 + </string> + <string name="Command_Map_Tooltip"> + 世界地図 + </string> + <string name="Command_Marketplace_Tooltip"> + ショッピングに出掛ける + </string> + <string name="Command_MiniMap_Tooltip"> + 近くの人を表示する + </string> + <string name="Command_Move_Tooltip"> + アバターの移動 + </string> + <string name="Command_People_Tooltip"> + フレンド、グループ、近くの人 + </string> + <string name="Command_Picks_Tooltip"> + プロフィールで紹介するお気に入りの場所 + </string> + <string name="Command_Places_Tooltip"> + 保存済みの場所 + </string> + <string name="Command_Preferences_Tooltip"> + 環境設定 + </string> + <string name="Command_Profile_Tooltip"> + プロフィールを編集・表示 + </string> + <string name="Command_Search_Tooltip"> + 場所、イベント、人を検索 + </string> + <string name="Command_Snapshot_Tooltip"> + ピクチャを撮る + </string> + <string name="Command_Speak_Tooltip"> + マイクを使って近くの人と話す + </string> + <string name="Command_View_Tooltip"> + カメラの角度を変更 + </string> + <string name="Command_Voice_Tooltip"> + ボイスチャット機能を持つ近くの人 + </string> + <string name="Retain%"> + 維持率 + </string> + <string name="Detail"> + 詳細 + </string> + <string name="Better Detail"> + もっと詳しく + </string> + <string name="Surface"> + 表面 + </string> + <string name="Solid"> + ソリッド + </string> + <string name="Wrap"> + ラップ + </string> + <string name="Preview"> + プレビュー + </string> + <string name="Normal"> + 普通 + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml index 2f67d43707..04ea1c2438 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -20,6 +20,10 @@ 申し訳ございませんが、システムはテレポートの接続を完了できませんでした。 もう少し後でやり直してください。 </message> + <message name="NoHelpIslandTP"> + Welcome Islandには戻ることができません。 +「Welcome Island Public」に行き、 + </message> <message name="noaccess_tport"> 残念ながら、そのテレポート目的地へのアクセスがありません。 </message> diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml index 637325ddd0..409429ffaa 100644 --- a/indra/newview/skins/default/xui/pl/floater_about.xml +++ b/indra/newview/skins/default/xui/pl/floater_about.xml @@ -10,7 +10,7 @@ <floater.string name="AboutPosition"> Położenie [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[SERVER_RELEASE_NOTES_URL] </floater.string> <floater.string name="AboutSystem"> Procesor: [CPU] diff --git a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml index 7dc3e1f22e..214d465f1c 100644 --- a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="CZAT LOKALNY"> - <check_box label="Tłumaczenie czatu (wspierane przez Google)" name="translate_chat_checkbox"/> + <check_box label="Tłumaczenie czatu" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index be730eb73f..7fd1029e6a 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -31,7 +31,7 @@ <spinner label="Czas znikania czatu w pobliżu:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> <text name="translate_chb_label"> - Użyj translatora podczas rozmowy (wspierany przez Google) + Użyj translatora podczas rozmowy </text> <text name="translate_language_text"> Przetłumacz czat na: diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml index 57fb55bf4c..0366c3fdbc 100644 --- a/indra/newview/skins/default/xui/pl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml @@ -19,6 +19,10 @@ Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj. <message name="timeout_tport"> Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz. </message> + <message name="NoHelpIslandTP"> + Brak możliwości ponownej teleportacji do Welcome Island. +Odwiedź 'Welcome Island Public' by powtórzyć szkolenie. + </message> <message name="noaccess_tport"> Przepraszamy, ale nie masz dostępu do miejsca docelowego. </message> diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml index 60edfa505f..653861f7d8 100644 --- a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="Bate-papo local"> - <check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/> + <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml index 9d44c7f62d..15470dc94a 100644 --- a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="nearby_chat"> - <check_box label="Traduzir bate-papo (via Google)" name="translate_chat_checkbox"/> + <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index e5aa42aae0..f98659aa73 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -31,7 +31,7 @@ <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> <check_box name="translate_chat_checkbox"/> <text name="translate_chb_label"> - Traduzir bate-papo automaticamente (via Google) + Traduzir bate-papo automaticamente </text> <text name="translate_language_text"> Traduzir bate-papo para: diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index 1c19a55de6..c53aa7d5f7 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -16,7 +16,7 @@ <combo_box.item label="Русский (Russo) - Beta" name="Russian"/> <combo_box.item label="Türkçe (Turco) - Beta" name="Turkish"/> <combo_box.item label="日本語 (Japonês) - Beta" name="(Japanese)"/> - <combo_box.item label="正體 (Chinês tradicional) - Beta" name="Traditional Chinese"/> + <combo_box.item label="正體中文 (Chinês tradicional) - Beta" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (Reinicie para trocar de idioma) diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml index 11ea0f4195..f8ded1ce69 100644 --- a/indra/newview/skins/default/xui/pt/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml @@ -18,6 +18,10 @@ Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. <message name="timeout_tport"> Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes. </message> + <message name="NoHelpIslandTP"> + Você não pode se tele-transportar de volta à Ilha de Welcome. +Vá para a Ilha de Welcome Pública para repetir este tutorial. + </message> <message name="noaccess_tport"> Desculpe, você não tem acesso ao destino deste teletransporte. </message> diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml index 6bc550c3fe..deb6be319c 100644 --- a/indra/newview/skins/default/xui/ru/floater_about.xml +++ b/indra/newview/skins/default/xui/ru/floater_about.xml @@ -10,7 +10,7 @@ <floater.string name="AboutPosition"> Вы в точке [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] в регионе «[REGION]», расположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[SERVER_RELEASE_NOTES_URL] </floater.string> <floater.string name="AboutSystem"> ЦП: [CPU] @@ -36,6 +36,9 @@ <floater.string name="AboutTraffic"> Потеряно пакетов: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) </floater.string> + <floater.string name="ErrorFetchingServerReleaseNotesURL"> + Ошибка при получении URL-адреса заметок о выпуске сервера. + </floater.string> <tab_container name="about_tab"> <panel label="Данные" name="support_panel"> <button label="Копировать в буфер обмена" name="copy_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_about_land.xml b/indra/newview/skins/default/xui/ru/floater_about_land.xml index cf43f41107..488d2cda17 100644 --- a/indra/newview/skins/default/xui/ru/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ru/floater_about_land.xml @@ -212,19 +212,19 @@ Бонусный множитель для объектов: [BONUS] </text> <text name="Simulator primitive usage:"> - Примитивов используется: + Емкость региона: </text> <text name="objects_available"> [COUNT] из [MAX] ([AVAILABLE] доступно) </text> <text name="Primitives parcel supports:"> - Разрешено для размещения: + Емкость участка: </text> <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> - Примитивов на участке: + Воздействие участка: </text> <text name="total_objects_text"> [COUNT] diff --git a/indra/newview/skins/default/xui/ru/floater_avatar.xml b/indra/newview/skins/default/xui/ru/floater_avatar.xml new file mode 100644 index 0000000000..6bdf819880 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_avatar.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Avatar" title="ВЫБОР АВАТАРА"/> diff --git a/indra/newview/skins/default/xui/ru/floater_camera.xml b/indra/newview/skins/default/xui/ru/floater_camera.xml index 495c5d55fc..7a1f530668 100644 --- a/indra/newview/skins/default/xui/ru/floater_camera.xml +++ b/indra/newview/skins/default/xui/ru/floater_camera.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="camera_floater"> +<floater name="camera_floater" title="КАМЕРА"> <floater.string name="rotate_tooltip"> Повернуть камеру вокруг точки фокусировки </floater.string> diff --git a/indra/newview/skins/default/xui/ru/floater_chat_bar.xml b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml new file mode 100644 index 0000000000..eceab1775a --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="chat_bar" title="ЛОКАЛЬНЫЙ ЧАТ"> + <panel> + <line_editor label="Щелкните здесь для общения." name="chat_box" tool_tip="Нажмите Enter, чтобы сказать, Ctrl+Enter, чтобы прокричать"/> + <button name="show_nearby_chat" tool_tip="Показать/скрыть лог локального чата"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ru/floater_day_cycle_options.xml deleted file mode 100644 index 7c702f246d..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_day_cycle_options.xml +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Day Cycle Floater" title="РЕДАКТОР СУТОЧНОГО ЦИКЛА"> - <tab_container name="Day Cycle Tabs"> - <panel label="Суточный цикл" name="Day Cycle"> - <multi_slider initial_value="0" name="WLTimeSlider"/> - <multi_slider initial_value="0" name="WLDayCycleKeys"/> - <text name="WL12am"> - 00:00 - </text> - <text name="WL3am"> - 03:00 - </text> - <text name="WL6am"> - 06:00 - </text> - <text name="WL9amHash"> - 09:00 - </text> - <text name="WL12pmHash"> - 12:00 - </text> - <text name="WL3pm"> - 15:00 - </text> - <text name="WL6pm"> - 18:00 - </text> - <text name="WL9pm"> - 21:00 - </text> - <text name="WL12am2"> - 00:00 - </text> - <text name="WL12amHash"> - | - </text> - <text name="WL3amHash"> - I - </text> - <text name="WL6amHash"> - | - </text> - <text name="WL9amHash2"> - I - </text> - <text name="WL12pmHash2"> - | - </text> - <text name="WL3pmHash"> - I - </text> - <text name="WL6pmHash"> - | - </text> - <text name="WL9pmHash"> - I - </text> - <text name="WL12amHash2"> - | - </text> - <button label="Добавить ключ" label_selected="Добавить ключ" name="WLAddKey"/> - <button label="Удалить ключ" label_selected="Удалить ключ" name="WLDeleteKey"/> - <text name="WLCurKeyFrameText"> - Настройки ключевого кадра: - </text> - <text name="WLCurKeyTimeText"> - Ключевое время: - </text> - <spinner label="ч" name="WLCurKeyHour"/> - <spinner label="мин" name="WLCurKeyMin"/> - <text name="WLCurKeyTimeText2"> - Ключевая настройка: - </text> - <combo_box label="Настройка" name="WLKeyPresets"/> - <text name="DayCycleText"> - Привязка: - </text> - <combo_box label="5 мин" name="WLSnapOptions"/> - <text name="DayCycleText2"> - Длительность цикла: - </text> - <spinner label="ч" name="WLLengthOfDayHour"/> - <spinner label="мин" name="WLLengthOfDayMin"/> - <spinner label="с" name="WLLengthOfDaySec"/> - <text name="DayCycleText3"> - Просмотр: - </text> - <button label="Проиграть" label_selected="Проиграть" name="WLAnimSky"/> - <button label="Стоп!" label_selected="Стоп" name="WLStopAnimSky"/> - <button label="Использовать время в землевладении" label_selected="Перейти на время землевладения" name="WLUseLindenTime"/> - <button label="Сохранить тестовый день" label_selected="Сохранить тестовый день" name="WLSaveDayCycle"/> - <button label="Загрузить тестовый день" label_selected="Загрузить тестовый день" name="WLLoadDayCycle"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_destinations.xml b/indra/newview/skins/default/xui/ru/floater_destinations.xml new file mode 100644 index 0000000000..e769812beb --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_destinations.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Destinations" title="МЕСТА"/> diff --git a/indra/newview/skins/default/xui/ru/floater_fast_timers.xml b/indra/newview/skins/default/xui/ru/floater_fast_timers.xml new file mode 100644 index 0000000000..20936b8494 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_fast_timers.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="fast_timers"> + <string name="pause"> + Пауза + </string> + <string name="run"> + Бег + </string> + <button label="Пауза" name="pause_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_how_to.xml b/indra/newview/skins/default/xui/ru/floater_how_to.xml new file mode 100644 index 0000000000..52525e5d33 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_how_to.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_how_to" title="ПОМОЩЬ"/> diff --git a/indra/newview/skins/default/xui/ru/floater_joystick.xml b/indra/newview/skins/default/xui/ru/floater_joystick.xml index 2390789746..cc93152225 100644 --- a/indra/newview/skins/default/xui/ru/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ru/floater_joystick.xml @@ -4,13 +4,13 @@ устройство не выбрано </floater.string> <check_box label="Включить джойстик:" name="enable_joystick"/> - <spinner label="Наложение по оси X" name="JoystickAxis1"/> - <spinner label="Наложение по оси Y" name="JoystickAxis2"/> - <spinner label="Наложение по оси Z" name="JoystickAxis0"/> - <spinner label="Наложение уклонов" name="JoystickAxis4"/> - <spinner label="Наложение сгибов" name="JoystickAxis5"/> - <spinner label="Наложение вращения" name="JoystickAxis3"/> - <spinner label="Наложение масштабирования" name="JoystickAxis6"/> + <spinner label="Наложение по X" name="JoystickAxis1"/> + <spinner label="Наложение по Y" name="JoystickAxis2"/> + <spinner label="Наложение по Z" name="JoystickAxis0"/> + <spinner label="Н. уклонов" name="JoystickAxis4"/> + <spinner label="Н. сгибов" name="JoystickAxis5"/> + <spinner label="Н. вращения" name="JoystickAxis3"/> + <spinner label="Н. масштабир." name="JoystickAxis6"/> <check_box label="Масштабирование" name="ZoomDirect"/> <check_box label="3D курсор" name="Cursor3D"/> <check_box label="Автоуровень" name="AutoLeveling"/> @@ -18,7 +18,7 @@ Режимы управления: </text> <check_box label="Аватар" name="JoystickAvatarEnabled"/> - <check_box label="Строительство" name="JoystickBuildEnabled"/> + <check_box label="Стройка" name="JoystickBuildEnabled"/> <check_box label="Камера" name="JoystickFlycamEnabled"/> <stat_view label="Монитор джойстика" name="axis_view"> <stat_bar label="Ось 0" name="axis0"/> @@ -56,13 +56,13 @@ Невидимая зона по Z </text> <text name="PitchDeadZone"> - Невидимая зона уклона + Невид. зона уклона </text> <text name="YawDeadZone"> - Невидимая зона сгиба + Невид. зона сгиба </text> <text name="RollDeadZone"> - Невидимая зона вращения + Невид. зона вращения </text> <text name="Feathering"> Размывка краев @@ -71,7 +71,7 @@ Масштаб </text> <text name="ZoomDeadZone"> - Невидимая зона при масштабировании + Невид. зона масшт. </text> <button label="Стандартные значения SpaceNavigator" name="SpaceNavigatorDefaults"/> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_map.xml b/indra/newview/skins/default/xui/ru/floater_map.xml index 169bac5bd2..59ceb0a773 100644 --- a/indra/newview/skins/default/xui/ru/floater_map.xml +++ b/indra/newview/skins/default/xui/ru/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map" title=""> +<floater name="Map" title="МИНИКАРТА"> <floater.string name="ToolTipMsg"> [REGION](Двойной щелчок открывает карту, shift+перетягивание – обзор) </floater.string> @@ -7,7 +7,7 @@ [REGION](Двойной щелчок – телепортация, shift+перетягивание – обзор) </floater.string> <floater.string name="mini_map_caption"> - МИНИКАРТА + Миникарта </floater.string> <text label="С" name="floater_map_north"> С diff --git a/indra/newview/skins/default/xui/ru/floater_model_preview.xml b/indra/newview/skins/default/xui/ru/floater_model_preview.xml index 53ef685f9e..31517e722d 100644 --- a/indra/newview/skins/default/xui/ru/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/ru/floater_model_preview.xml @@ -1,10 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Model Preview" title="Передать модель"> - <string name="status_idle"> - Неактивно - </string> +<floater name="Model Preview" title="ПЕРЕДАЧА МОДЕЛИ"> + <string name="status_idle"/> <string name="status_parse_error"> - Проблема при анализе файла DAE – см. подробности в журнале. + Ошибка. Проблема при анализе файла DAE – см. подробности в журнале. </string> <string name="status_reading_file"> Загрузка... @@ -51,6 +49,9 @@ <string name="mesh_status_missing_lod"> Отсутствует необходимый уровень детализации. </string> + <string name="mesh_status_invalid_material_list"> + Материалы уровня детализации не входят в эталонную модель. + </string> <string name="layer_all"> Все </string> @@ -63,186 +64,211 @@ <string name="tbd"> Позже </string> - <text name="name_label"> - Название: - </text> - <text name="lod_label"> - Просмотр: - </text> - <combo_box name="preview_lod_combo" tool_tip="Уровень детализации при предварительном просмотре"> - <combo_item name="high"> - Уровень детализации: высокий - </combo_item> - <combo_item name="medium"> - Уровень детализации: средний - </combo_item> - <combo_item name="low"> - Уровень детализации: низкий - </combo_item> - <combo_item name="lowest"> - Уровень детализации: самый низкий - </combo_item> - </combo_box> - <text name="warning_title"> - ВНИМАНИЕ! - </text> - <text name="warning_message"> - Вы не сможете завершить передачу этой модели на серверы Second Life. [[VURL] Узнайте, как] получить право на передачу сеточных моделей. - </text> - <text name="weights_text"> - Загрузка: -Физические данные: -Сервер: -Эквивалент в примитивах: - </text> - <text name="weights"> - [ST] -[PH] -[SIM] -[EQ] - </text> - <tab_container name="import_tab"> - <panel label="Уровень детализации" name="lod_panel"> - <text name="lod_table_header"> - Выберите уровень детализации: - </text> - <text name="high_label" value="высокий"/> - <text name="high_triangles" value="0"/> - <text name="high_vertices" value="0"/> - <text name="medium_label" value="средний"/> - <text name="medium_triangles" value="0"/> - <text name="medium_vertices" value="0"/> - <text name="low_label" value="низкий"/> - <text name="low_triangles" value="0"/> - <text name="low_vertices" value="0"/> - <text name="lowest_label" value="самый низкий"/> - <text name="lowest_triangles" value="0"/> - <text name="lowest_vertices" value="0"/> - <text name="lod_table_footer"> - Уровень детализации: [DETAIL] - </text> - <radio_group name="lod_file_or_limit" value="lod_from_file"> - <radio_item label="Загрузка из файла" name="lod_from_file"/> - <radio_item label="Автосоздание" name="lod_auto_generate"/> - <radio_item label="Нет" name="lod_none"/> - </radio_group> - <button label="Обзор..." name="lod_browse"/> - <combo_box name="lod_mode"> - <combo_item name="triangle_limit"> - Предельное число треугольников - </combo_item> - <combo_item name="error_threshold"> - Порог ошибки - </combo_item> - </combo_box> - <text name="build_operator_text"> - Оператор построения: + <panel name="left_panel"> + <panel name="model_name_representation_panel"> + <text name="name_label"> + Имя модели: </text> - <text name="queue_mode_text"> - Режим очереди: + <text name="model_category_label"> + Эта модель представляет... </text> - <combo_box name="build_operator"> - <combo_item name="edge_collapse"> - Слияние ребер - </combo_item> - <combo_item name="half_edge_collapse"> - Слияние ребер к одной вершине - </combo_item> - </combo_box> - <combo_box name="queue_mode"> - <combo_item name="greedy"> - интенсивный - </combo_item> - <combo_item name="lazy"> - медленный - </combo_item> - <combo_item name="independent"> - независимый - </combo_item> + <combo_box name="model_category_combo"> + <combo_item label="Выберите вариант..." name="Choose one"/> + <combo_item label="Форма аватара" name="Avatar shape"/> + <combo_item label="Присоединение аватара" name="Avatar attachment"/> + <combo_item label="Подвижный объект (машина, животное)" name="Moving object (vehicle, animal)"/> + <combo_item label="Строительный компонент" name="Building Component"/> + <combo_item label="Большая, неподвижная и т.д." name="Large, non moving etc"/> + <combo_item label="Малая, неподвижная и т.д." name="Smaller, non-moving etc"/> + <combo_item label="Ни один из них" name="Not really any of these"/> </combo_box> - <text name="border_mode_text"> - Границы: - </text> - <text name="share_tolderance_text"> - Допуск на совпадение: - </text> - <combo_box name="border_mode"> - <combo_item name="border_unlock"> - нефиксированные - </combo_item> - <combo_item name="border_lock"> - фиксированные - </combo_item> - </combo_box> - <text name="crease_label"> - Угол сгиба: - </text> - <spinner name="crease_angle" value="75"/> </panel> - <panel label="Физика" name="physics_panel"> - <panel name="physics geometry"> - <radio_group name="physics_load_radio" value="physics_load_from_file"> - <radio_item label="Файл:" name="physics_load_from_file"/> - <radio_item label="Использовать уровни детализации:" name="physics_use_lod"/> - </radio_group> - <combo_box name="physics_lod_combo" tool_tip="Уровень детализации для физической формы"> - <combo_item name="physics_lowest"> - самый низкий - </combo_item> - <combo_item name="physics_low"> - низкий - </combo_item> - <combo_item name="physics_medium"> - средний - </combo_item> - <combo_item name="physics_high"> - высокий - </combo_item> - </combo_box> - <button label="Обзор..." name="physics_browse"/> + <tab_container name="import_tab"> + <panel label="Уровень детализации" name="lod_panel" title="Уровень детализации"> + <text initial_value="Источник" name="source" value="Источник"/> + <text initial_value="Треугольники" name="triangles" value="Треугольники"/> + <text initial_value="Вершины" name="vertices" value="Вершины"/> + <text initial_value="Высокий" name="high_label" value="Высокий"/> + <button label="Обзор..." name="lod_browse_high"/> + <text initial_value="0" name="high_triangles" value="0"/> + <text initial_value="0" name="high_vertices" value="0"/> + <text initial_value="Средний" name="medium_label" value="Средний"/> + <button label="Обзор..." name="lod_browse_medium"/> + <text initial_value="0" name="medium_triangles" value="0"/> + <text initial_value="0" name="medium_vertices" value="0"/> + <text initial_value="Низкий" name="low_label" value="Низкий"/> + <button label="Обзор..." name="lod_browse_low"/> + <text initial_value="0" name="low_triangles" value="0"/> + <text initial_value="0" name="low_vertices" value="0"/> + <text initial_value="Самый низкий" name="lowest_label" value="Самый низкий"/> + <button label="Обзор..." name="lod_browse_lowest"/> + <text initial_value="0" name="lowest_triangles" value="0"/> + <text initial_value="0" name="lowest_vertices" value="0"/> + <check_box label="Генерировать нормали" name="gen_normals"/> + <text initial_value="Угол сгиба:" name="crease_label" value="Угол сгиба:"/> + <spinner name="crease_angle" value="75"/> </panel> - <panel name="physics analysis"> - <slider label="Гладкость:" name="Smooth"/> - <check_box label="Закрыть отверстия (медленно)" name="Close Holes (Slow)"/> - <button label="Анализ" name="Decompose"/> - <button label="Отмена" name="decompose_cancel"/> + <panel label="Физика" name="physics_panel"> + <panel name="physics geometry"> + <text name="first_step_name"> + Шаг 1. Уровень детализации + </text> + <combo_box name="physics_lod_combo" tool_tip="Уровень детализации для физической формы"> + <combo_item name="choose_one"> + Выберите вариант... + </combo_item> + <combo_item name="physics_high"> + Высокое + </combo_item> + <combo_item name="physics_medium"> + Средний + </combo_item> + <combo_item name="physics_low"> + Низкий + </combo_item> + <combo_item name="physics_lowest"> + Самый низкий + </combo_item> + <combo_item name="load_from_file"> + Из файла + </combo_item> + </combo_box> + <button label="Обзор..." name="physics_browse"/> + </panel> + <panel name="physics analysis"> + <text name="method_label"> + Шаг 2. Анализ + </text> + <text name="analysis_method_label"> + Метод: + </text> + <text name="quality_label"> + Качество: + </text> + <text name="smooth_method_label"> + Гладкость: + </text> + <check_box label="Закрыть отверстия" name="Close Holes (Slow)"/> + <button label="Анализ" name="Decompose"/> + <button label="Отмена" name="decompose_cancel"/> + </panel> + <panel name="physics simplification"> + <text name="second_step_label"> + Шаг 3. Упрощение + </text> + <text name="simp_method_header"> + Метод: + </text> + <text name="pass_method_header"> + Проходов: + </text> + <text name="Detail Scale label"> + Масштаб деталей: + </text> + <text name="Retain%_label"> + Сохранять: + </text> + <combo_box name="Combine Quality" value="1"/> + <button label="Упрощение" name="Simplify"/> + <button label="Отмена" name="simplify_cancel"/> + </panel> + <panel name="physics info"> + <text name="results_text"> + Результаты: + </text> + <text name="physics_triangles"> + Треугольников: [TRIANGLES], + </text> + <text name="physics_points"> + Вершин: [POINTS], + </text> + <text name="physics_hulls"> + Оболочек: [HULLS] + </text> + </panel> </panel> - <panel name="physics simplification"> - <slider label="Проходов:" name="Combine Quality"/> - <slider label="Масштаб деталей:" name="Detail Scale"/> - <slider label="Сохранять:" name="Retain%"/> - <button label="Упрощение" name="Simplify"/> - <button label="Отмена" name="simplify_cancel"/> - </panel> - <panel name="physics info"> - <slider label="Просмотр разложения:" name="physics_explode"/> - <text name="physics_triangles"> - Треугольников: [TRIANGLES] + <panel label="Параметры передачи" name="modifiers_panel"> + <text name="scale_label"> + Масштаб (1=не масштабировать): + </text> + <spinner name="import_scale" value="1.0"/> + <text name="dimensions_label"> + Размеры: </text> - <text name="physics_points"> - Вершин: [POINTS] + <text name="import_dimensions"> + [X] X [Y] X [Z] </text> - <text name="physics_hulls"> - Оболочек: [HULLS] + <check_box label="Включить текстуры" name="upload_textures"/> + <text name="include_label"> + Только для моделей аватаров: </text> + <check_box label="Включить вес кожи" name="upload_skin"/> + <check_box label="Включить положения суставов" name="upload_joints"/> + <text name="pelvis_offset_label"> + Смещение по Z (поднять или опустить аватар): + </text> + <spinner name="pelvis_offset" value="0.0"/> </panel> - </panel> - <panel label="Модификаторы" name="modifiers_panel"> - <spinner name="import_scale" value="1.0"/> - <text name="import_dimensions"> - [X] x [Y] x [Z] м + </tab_container> + <panel name="weights_and_warning_panel"> + <button label="Рассчитать вес и плату" name="calculate_btn" tool_tip="Рассчитать вес и плату"/> + <button label="Отмена" name="cancel_btn"/> + <button label="Передать" name="ok_btn" tool_tip="Передать в симулятор"/> + <button label="Очистить настройки и сбросить форму" name="reset_btn"/> + <text name="upload_fee"> + Плата за передачу: L$ [FEE] + </text> + <text name="prim_weight"> + Влияние земли: [EQ] + </text> + <text name="download_weight"> + Загрузка: [ST] + </text> + <text name="physics_weight"> + Физика: [PH] + </text> + <text name="server_weight"> + Сервер: [SIM] + </text> + <text name="warning_title"> + ПРИМЕЧАНИЕ. + </text> + <text name="warning_message"> + У вас нет прав на передачу сеточных моделей. [[VURL] Узнайте, как] получить их. + </text> + <text name="status"> + [STATUS] </text> - <check_box label="Текстуры" name="upload_textures"/> - <check_box label="Вес кожи" name="upload_skin"/> - <check_box label="Положение сочленений" name="upload_joints"/> - <spinner name="pelvis_offset" value="0.0"/> </panel> - </tab_container> - <text name="upload_fee"> - Плата за передачу: L$ [FEE] + </panel> + <text name="lod_label"> + Просмотр: </text> - <button label="По умолчанию" name="reset_btn" tool_tip="По умолчанию"/> - <button label="Рассчитать вес и плату" name="calculate_btn" tool_tip="Рассчитать вес и плату"/> - <button label="Передача" name="ok_btn" tool_tip="Передать в симулятор"/> - <button label="Отмена" name="cancel_btn"/> + <panel name="right_panel"> + <combo_box name="preview_lod_combo" tool_tip="Уровень детализации при предварительном просмотре"> + <combo_item name="high"> + Высокий + </combo_item> + <combo_item name="medium"> + Среднее + </combo_item> + <combo_item name="low"> + Низкий + </combo_item> + <combo_item name="lowest"> + Самый низкий + </combo_item> + </combo_box> + <text name="label_display"> + Показать... + </text> + <check_box label="Ребра" name="show_edges"/> + <check_box label="Физика" name="show_physics"/> + <check_box label="Текстуры" name="show_textures"/> + <check_box label="Вес кожи" name="show_skin_weight"/> + <check_box label="Суставы" name="show_joint_positions"/> + <text name="physics_explode_label"> + Просмотр разложения: + </text> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml index 9b2924a3db..204f752cd9 100644 --- a/indra/newview/skins/default/xui/ru/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/ru/floater_model_wizard.xml @@ -6,26 +6,20 @@ <button label="2. Оптимизировать" name="optimize_btn"/> <button label="1. Выбрать файл" name="choose_file_btn"/> <panel name="choose_file_panel"> - <panel name="choose_file_header_panel"> - <text name="choose_file_header_text"> - Выберите файл + <panel name="header_panel"> + <text name="header_text"> + Выберите файл модели </text> </panel> - <panel name="choose_file_content_panel"> + <panel name="content"> <text name="advanced_users_text"> Пользователям, работающим в расширенном режиме: если вы умеете создавать трехмерные графические объекты, то, возможно, захотите воспользоваться средством Advanced Uploader, которое предоставляет расширенные возможности передачи объектов. </text> <button label="Перейти в расширенный режим" name="switch_to_advanced"/> - <text name="choose_model_file_label"> + <text name="Cache location"> Выберите файл модели для передачи </text> <button label="Обзор..." label_selected="Обзор..." name="browse"/> - <text name="support_collada_text"> - В Second Life поддерживаются файлы COLLADA (DAE) - </text> - <text name="dimensions_label"> - Размеры (в метрах): - </text> <text name="dimensions"> X Y Z </text> @@ -38,18 +32,15 @@ </panel> </panel> <panel name="optimize_panel"> - <panel name="optimize_header_panel"> - <text name="optimize_header_text"> + <panel name="header_panel"> + <text name="header_text"> Оптимизировать модель </text> </panel> - <text name="optimize_hint"> + <text name="description"> Мы оптимизировали модель для повышения быстродействия. По желанию можно выполнить дополнительную настройку. </text> - <panel name="optimize_content_panel"> - <text name="generating_lod_label"> - Создается уровень детализации - </text> + <panel name="content"> <text name="high_detail_text"> Создать уровень детализации: высокий </text> @@ -64,123 +55,64 @@ </text> </panel> <panel name="content2"> - <text name="optimize_performance_text"> - Быстродействие - </text> - <text name="optimize_faster_rendering_text"> - Ускорить прорисовку -Меньше деталей -Уменьшить вес примитива - </text> - <text name="optimize_accuracy_text"> - Точность - </text> - <text name="optimize_slower_rendering_text"> - Замедлить прорисовку -Больше деталей -Повысить вес примитива - </text> - <text name="accuracy_slider_mark1"> - ' - </text> - <text name="accuracy_slider_mark2"> - ' - </text> - <text name="accuracy_slider_mark3"> - ' - </text> <button label="Пересчитать геометрию" name="recalculate_geometry_btn"/> - <text name="geometry_preview_label"> + <text name="lod_label"> Просмотр геометрии </text> <combo_box name="preview_lod_combo" tool_tip="Детализация при предварительном просмотре"> - <combo_item name="preview_lod_high"> + <combo_item name="high"> Детально </combo_item> - <combo_item name="preview_lod_medium"> + <combo_item name="medium"> Средняя детализация </combo_item> - <combo_item name="preview_lod_low"> + <combo_item name="low"> Мало деталей </combo_item> - <combo_item name="preview_lod_lowest"> + <combo_item name="lowest"> Минимум деталей </combo_item> </combo_box> </panel> </panel> <panel name="physics_panel"> - <panel name="physics_header_panel"> - <text name="physics_header_text"> + <panel name="header_panel"> + <text name="header_text"> Настроить физические параметры </text> </panel> - <text name="physics_hint"> + <text name="description"> Мы создадим форму для внешнего каркаса модели. Настройте уровень детализации формы в соответствии с целями, для которых предназначена модель. </text> - <panel name="physics_content_panel"> - <text name="physics_performance_text"> - Быстродействие - </text> - <text name="physics_faster_rendering_text"> - Ускорить прорисовку -Меньше деталей -Уменьшить вес примитива - </text> - <text name="physics_accuracy_text"> - Точность - </text> - <text name="physics_slower_dendering_text"> - Замедлить прорисовку -Больше деталей -Повысить вес примитива - </text> - <text name="physics_example_1"> - Примеры: -подвижные объекты; -летающие объекты; -транспорт. - </text> - <text name="physics_example_2"> - Примеры: -небольшие неподвижные объекты; -простые объекты; -простая мебель. - </text> - <text name="physics_example_3"> - Примеры: -неподвижные объекты; -сложные объекты; -здания. - </text> + <panel name="content"> <button label="Пересчитать физические данные" name="recalculate_physics_btn"/> <button label="Пересчет..." name="recalculating_physics_btn"/> - <text name="physics_preview_label"> + <text name="lod_label"> Просмотр физических данных </text> - <combo_box name="preview_lod_combo2" tool_tip="Детализация при предварительном просмотре"> - <combo_item name="preview_lod2_high"> + <combo_box name="preview_lod_combo2" tool_tip="Уровень детализации при предварительном просмотре"> + <combo_item name="high"> Детально </combo_item> - <combo_item name="preview_lod2_medium"> + <combo_item name="medium"> Средняя детализация </combo_item> - <combo_item name="preview_lod2_low"> + <combo_item name="low"> Мало деталей </combo_item> - <combo_item name="preview_lod2_lowest"> + <combo_item name="lowest"> Минимум деталей </combo_item> </combo_box> </panel> </panel> <panel name="review_panel"> - <panel name="review_header_panel"> - <text name="review_header_text"> - Пересмотреть + <panel name="header_panel"> + <text name="header_text"> + Просмотр </text> </panel> - <panel name="review_content_panel"> + <panel name="content"> <text name="review_prim_equiv"> Воздействие на участок/регион: эквивалент в примитивах: [EQUIV] </text> @@ -193,8 +125,8 @@ </panel> </panel> <panel name="upload_panel"> - <panel name="upload_header_panel"> - <text name="upload_header_text"> + <panel name="header_panel"> + <text name="header_text"> Передача завершена </text> </panel> diff --git a/indra/newview/skins/default/xui/ru/floater_moveview.xml b/indra/newview/skins/default/xui/ru/floater_moveview.xml index c6ef4a06b3..6e01f997e1 100644 --- a/indra/newview/skins/default/xui/ru/floater_moveview.xml +++ b/indra/newview/skins/default/xui/ru/floater_moveview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> +<floater name="move_floater" title="ПЕРЕМЕЩЕНИЕ"> <string name="walk_forward_tooltip"> Идти вперед (нажмите стрелку вверх или клавишу W) </string> diff --git a/indra/newview/skins/default/xui/ru/floater_my_appearance.xml b/indra/newview/skins/default/xui/ru/floater_my_appearance.xml new file mode 100644 index 0000000000..b90d80f3fd --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_my_appearance.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_appearance" title="ВНЕШНОСТЬ"> + <panel label="Изменить внешний вид" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_my_inventory.xml b/indra/newview/skins/default/xui/ru/floater_my_inventory.xml new file mode 100644 index 0000000000..534d2a5774 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_my_inventory.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_inventory" title="ИНВЕНТАРЬ"/> diff --git a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml index fd3c9f3512..184c753e40 100644 --- a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="ЛОКАЛЬНЫЙ ЧАТ"> - <check_box label="Перевод чата (используется Google)" name="translate_chat_checkbox"/> + <check_box label="Перевод чата" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_object_weights.xml b/indra/newview/skins/default/xui/ru/floater_object_weights.xml new file mode 100644 index 0000000000..41e0118732 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_object_weights.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="object_weights" title="ДОПОЛНИТЕЛЬНО"> + <floater.string name="nothing_selected" value="--"/> + <text name="selected_text" value="ВЫБРАНО"/> + <text name="objects" value="--"/> + <text name="objects_label" value="Объекты"/> + <text name="prims" value="--"/> + <text name="prims_label" value="Примитивы"/> + <text name="weights_of_selected_text" value="ВЕС ВЫБРАННОГО"/> + <text name="download" value="--"/> + <text name="download_label" value="Загрузить"/> + <text name="physics" value="--"/> + <text name="physics_label" value="Физика"/> + <text name="server" value="--"/> + <text name="server_label" value="Сервер"/> + <text name="display" value="--"/> + <text name="display_label" value="Показать"/> + <text name="land_impacts_text" value="ВОЗДЕЙСТВИЕ НА ЗЕМЛЮ"/> + <text name="selected" value="--"/> + <text name="selected_label" value="Выбрано"/> + <text name="rezzed_on_land" value="--"/> + <text name="rezzed_on_land_label" value="Выложено на землю"/> + <text name="remaining_capacity" value="--"/> + <text name="remaining_capacity_label" value="Остаток емкости"/> + <text name="total_capacity" value="--"/> + <text name="total_capacity_label" value="Общая емкость"/> + <text name="help_SLURL" value="[secondlife:///app/help/object_weights Что это такое?...]"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml index 781ee8c771..301206e473 100644 --- a/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/ru/floater_outfit_save_as.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title="Сохранение костюма"> +<floater name="modal container" title="СОХРАНИТЬ КОСТЮМ"> <button label="Сохранить" label_selected="Сохранить" name="Save"/> <button label="Отмена" label_selected="Отмена" name="Cancel"/> <text name="Save item as:"> diff --git a/indra/newview/skins/default/xui/ru/floater_people.xml b/indra/newview/skins/default/xui/ru/floater_people.xml new file mode 100644 index 0000000000..7abc34986a --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_people.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_people" title="ЛЮДИ"> + <panel_container name="main_panel"> + <panel label="Профиль группы" name="panel_group_info_sidetray"/> + <panel label="Черный список жителей и объектов" name="panel_block_list_sidetray"/> + </panel_container> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_picks.xml b/indra/newview/skins/default/xui/ru/floater_picks.xml new file mode 100644 index 0000000000..e0ae8d6f03 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_picks.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_picks" title="Подборка"/> diff --git a/indra/newview/skins/default/xui/ru/floater_places.xml b/indra/newview/skins/default/xui/ru/floater_places.xml new file mode 100644 index 0000000000..2a22a855ef --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_places.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_places" title="МЕСТА"> + <panel label="Места" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_preferences.xml b/indra/newview/skins/default/xui/ru/floater_preferences.xml index 31c751250e..fc244b9d8b 100644 --- a/indra/newview/skins/default/xui/ru/floater_preferences.xml +++ b/indra/newview/skins/default/xui/ru/floater_preferences.xml @@ -11,7 +11,7 @@ <panel label="Уведомления" name="msgs"/> <panel label="Цвета" name="colors"/> <panel label="Приватность" name="im"/> - <panel label="Настройка" name="input"/> - <panel label="Расширенный" name="advanced1"/> + <panel label="Конфигурация" name="input"/> + <panel label="Дополнительно" name="advanced1"/> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_sound_devices.xml b/indra/newview/skins/default/xui/ru/floater_sound_devices.xml index 809cea5aa1..fc8de858cd 100644 --- a/indra/newview/skins/default/xui/ru/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/ru/floater_sound_devices.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="Звуковые устройства"> +<floater name="floater_sound_devices" title="ЗВУКОВЫЕ УСТРОЙСТВА"> <text name="voice_label"> Голосовой чат </text> diff --git a/indra/newview/skins/default/xui/ru/floater_stats.xml b/indra/newview/skins/default/xui/ru/floater_stats.xml index c5cccd4091..b1f60c8029 100644 --- a/indra/newview/skins/default/xui/ru/floater_stats.xml +++ b/indra/newview/skins/default/xui/ru/floater_stats.xml @@ -10,8 +10,8 @@ </stat_view> <stat_view label="Дополнительно" name="advanced"> <stat_view label="Отрисовка" name="render"> - <stat_bar label="Треугольников за секунду" name="ktrisframe"/> - <stat_bar label="Треугольников за секунду" name="ktrissec"/> + <stat_bar label="Треугольников на кадр" name="ktrisframe"/> + <stat_bar label="Треугольников в секунду" name="ktrissec"/> <stat_bar label="Всего объектов" name="objs"/> <stat_bar label="Новых объектов" name="newobjs"/> </stat_view> @@ -32,7 +32,7 @@ <stat_bar label="Слои" name="layerskbitstat"/> <stat_bar label="Действительный ввод" name="actualinkbitstat"/> <stat_bar label="Действительный вывод" name="actualoutkbitstat"/> - <stat_bar label="Ожидающие оп-ции VFS" name="vfspendingoperations"/> + <stat_bar label="Ожидающие операции VFS" name="vfspendingoperations"/> </stat_view> </stat_view> <stat_view label="Симулятор" name="sim"> @@ -64,6 +64,14 @@ <stat_bar label="Время на клиент" name="simagentmsec"/> <stat_bar label="Время на изображения" name="simimagesmsec"/> <stat_bar label="Время на скрипт" name="simscriptmsec"/> + <stat_bar label="Резервное время" name="simsparemsec"/> + <stat_view label="Данные времени (мс)" name="timedetails"> + <stat_bar label="Шаг физики" name="simsimphysicsstepmsec"/> + <stat_bar label="Обновить физ. формы" name="simsimphysicsshapeupdatemsec"/> + <stat_bar label="Физика - прочее" name="simsimphysicsothermsec"/> + <stat_bar label="Время сна" name="simsleepmsec"/> + <stat_bar label="Ввод/вывод" name="simpumpiomsec"/> + </stat_view> </stat_view> </stat_view> </container_view> diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index 7200ec80fa..660eca51c6 100644 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -25,10 +25,10 @@ Щелкните и переместите для выделения земли </floater.string> <floater.string name="status_selectcount"> - Выбрано объектов: [OBJ_COUNT] (примитивов: [PRIM_COUNT] [PE_STRING]) + Выбрано объектов: [OBJ_COUNT], влияние на землю [LAND_IMPACT] </floater.string> - <floater.string name="status_selectprimequiv"> - , в примитивах: [SEL_WEIGHT] + <floater.string name="status_remaining_capacity"> + Остаток емкости [LAND_CAPACITY]. </floater.string> <button name="button focus" tool_tip="Отчетливость"/> <button name="button move" tool_tip="Переместить"/> @@ -107,8 +107,8 @@ <text name="selection_empty"> Ничего не выбрано. </text> - <text name="selection_weight"> - Вес физических параметров [PHYS_WEIGHT], стоимость прорисовки [DISP_WEIGHT]. + <text name="remaining_capacity"> + [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Дополнительная информация] </text> <tab_container name="Object Info Tabs"> <panel label="Общие" name="General"> @@ -321,7 +321,6 @@ Тип стыковки </text> <combo_box name="sculpt type control"> - <combo_box.item label="(нет)" name="None"/> <combo_box.item label="По сфере" name="Sphere"/> <combo_box.item label="По тору" name="Torus"/> <combo_box.item label="По плоскости" name="Plane"/> diff --git a/indra/newview/skins/default/xui/ru/floater_toybox.xml b/indra/newview/skins/default/xui/ru/floater_toybox.xml new file mode 100644 index 0000000000..eb03e8c8bf --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_toybox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Toybox" title="НАСТРОИТЬ ПАНЕЛИ ИНСТРУМЕНТОВ"> + <text name="toybox label 1"> + Добавьте или удалите кнопки, перетягивая их на панели инструментов или с них. + </text> + <text name="toybox label 2"> + Кнопки будут отображены в исходном виде или в виде значков, в зависимости от настроек каждой панели инструментов. + </text> + <button label="Восстановить умолчания" label_selected="Восстановить умолчания" name="btn_restore_defaults"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml index 9fd6518984..6520a4342c 100644 --- a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_voice_controls" title="Управление голосом"> +<floater name="floater_voice_controls" title="УПРАВЛЕНИЕ ГОЛОСОМ"> <string name="title_nearby"> - ЛОКАЛЬНЫЙ ГОЛОСОВОЙ ЧАТ + Голоса собеседников </string> <string name="title_group"> Звонок группе [GROUP] diff --git a/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml index f77896677d..34e5f4c0e4 100644 --- a/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/ru/menu_hide_navbar.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_navbar_menu"> - <menu_item_check label="Показать панель навигации" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Показать панель навигации и избранного" name="ShowNavbarNavigationPanel"/> <menu_item_check label="Показать панель избранного" name="ShowNavbarFavoritesPanel"/> <menu_item_check label="Показать мини-панель местоположения" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/ru/menu_login.xml b/indra/newview/skins/default/xui/ru/menu_login.xml index 3b545bf593..aa3570f176 100644 --- a/indra/newview/skins/default/xui/ru/menu_login.xml +++ b/indra/newview/skins/default/xui/ru/menu_login.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Login Menu"> <menu label="Я" name="File"> - <menu_item_call label="Настройки" name="Preferences..."/> + <menu_item_call label="Настройки..." name="Preferences..."/> <menu_item_call label="Выход из [APP_NAME]" name="Quit"/> </menu> <menu label="Справка" name="Help"> diff --git a/indra/newview/skins/default/xui/ru/menu_toolbars.xml b/indra/newview/skins/default/xui/ru/menu_toolbars.xml new file mode 100644 index 0000000000..e04a9ee57d --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_toolbars.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Toolbars Popup"> + <menu_item_call label="Выбор кнопок..." name="Chose Buttons"/> + <menu_item_check label="Значки и подписи" name="icons_with_text"/> + <menu_item_check label="Только значки" name="icons_only"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index c4e553f918..322a27003f 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -1,27 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> <menu label="Я" name="Me"> - <menu_item_call label="Настройки" name="Preferences"/> - <menu_item_call label="Моя информационная панель" name="Manage My Account"/> - <menu_item_call label="Купить L$" name="Buy and Sell L$"/> - <menu_item_call label="Мой профиль" name="Profile"/> - <menu_item_call label="Мой внешний вид" name="ChangeOutfit"/> - <menu_item_check label="Мой инвентарь" name="Inventory"/> - <menu_item_check label="Мой инвентарь" name="ShowSidetrayInventory"/> - <menu_item_check label="Мои жесты" name="Gestures"/> - <menu_item_check label="Мой голос" name="ShowVoice"/> + <menu_item_call label="Информационная панель..." name="Manage My Account"/> + <menu_item_call label="Профиль…" name="Profile"/> + <menu_item_call label="Внешность..." name="ChangeOutfit"/> + <menu_item_check label="Инвентарь..." name="Inventory"/> + <menu_item_check label="Жесты..." name="Gestures"/> + <menu_item_check label="Голос..." name="ShowVoice"/> <menu label="Движение" name="Movement"> <menu_item_call label="Сесть" name="Sit Down Here"/> <menu_item_check label="Полет" name="Fly"/> <menu_item_check label="Всегда бегать" name="Always Run"/> <menu_item_call label="Остановить анимацию" name="Stop Animating My Avatar"/> </menu> - <menu label="Мой статус" name="Status"> + <menu label="Статус" name="Status"> <menu_item_call label="Нет на месте" name="Set Away"/> <menu_item_call label="Не беспокоить" name="Set Busy"/> </menu> <menu_item_call label="Запрос статуса администратора" name="Request Admin Options"/> <menu_item_call label="Выход из статуса администратора" name="Leave Admin Options"/> + <menu_item_call label="Купить L$" name="Buy and Sell L$"/> + <menu_item_call label="Настройки..." name="Preferences"/> + <menu_item_call label="Панели инструментов..." name="Toolbars"/> + <menu_item_call label="Скрыть все элементы управления" name="Hide UI"/> <menu_item_call label="Выход из [APP_NAME]" name="Quit"/> </menu> <menu label="Общение" name="Communicate"> @@ -32,7 +33,7 @@ <menu_item_check label="Голоса собеседников" name="Nearby Voice"/> </menu> <menu label="Мир" name="World"> - <menu_item_check label="Мини-карта" name="Mini-Map"/> + <menu_item_check label="Миникарта" name="Mini-Map"/> <menu_item_check label="Карта мира" name="World Map"/> <menu_item_check label="Поиск" name="Search"/> <menu_item_call label="Снимок" name="Take Snapshot"/> @@ -144,7 +145,6 @@ </menu> <menu label="Справка" name="Help"> <menu_item_call label="Справка по [SECOND_LIFE]" name="Second Life Help"/> - <menu_item_check label="Включить подсказки" name="Enable Hints"/> <menu_item_call label="Жалоба" name="Report Abuse"/> <menu_item_call label="Сообщить об ошибке" name="Report Bug"/> <menu_item_call label="О [APP_NAME]" name="About Second Life"/> @@ -160,7 +160,7 @@ <menu label="Производительность" name="Performance Tools"> <menu_item_call label="Запаздывание" name="Lag Meter"/> <menu_item_check label="Статистика" name="Statistics Bar"/> - <menu_item_check label="Стоимость отрисовки аватара" name="Avatar Rendering Cost"/> + <menu_item_check label="Показать вес отрисовки для аватаров" name="Avatar Rendering Cost"/> </menu> <menu label="Подсветка и видимость" name="Highlighting and Visibility"> <menu_item_check label="Мигающий маяк" name="Cheesy Beacon"/> @@ -288,6 +288,7 @@ <menu_item_check label="Освещение" name="Lights"/> <menu_item_check label="Каркас столкновений" name="Collision Skeleton"/> <menu_item_check label="Лучи" name="Raycast"/> + <menu_item_check label="Сложность визуализации" name="rendercomplexity"/> <menu_item_check label="Лепка" name="Sculpt"/> </menu> <menu label="Визуализация" name="Rendering"> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 91c8dbf761..87ae9d06dd 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -1909,6 +1909,12 @@ http://secondlife.com/download. Выйти из программы? <usetemplate ignoretext="Подтверждать перед выходом" name="okcancelignore" notext="Не выходить" yestext="Выйти"/> </notification> + <notification name="ConfirmRestoreToybox"> + Вы действительно хотите восстановить принятые по умолчанию кнопки и панели инструментов? + +Это действие нельзя отменить. + <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/> + </notification> <notification name="DeleteItems"> [QUESTION] <usetemplate ignoretext="Подтверждать перед удалением предметов" name="okcancelignore" notext="Отмена" yestext="OK"/> @@ -2995,10 +3001,6 @@ http://secondlife.com/download. <button name="cancel" text="Отмена"/> </form> </notification> - <notification label="" name="ModeChange"> - Для смены режима требуется выйти из программы и перезапустить ее. - <usetemplate name="okcancelbuttons" notext="Не выходить" yestext="Выйти"/> - </notification> <notification label="" name="NoClassifieds"> Создание и редактирование рекламы доступно только в расширенном режиме. Выйти из программы и сменить режим? Меню смены режима находится на экране входа. <usetemplate name="okcancelbuttons" notext="Не выходить" yestext="Выйти"/> @@ -3043,6 +3045,10 @@ http://secondlife.com/download. Поиск доступен только в расширенном режиме. Выйти из программы и сменить режим? <usetemplate name="okcancelbuttons" notext="Не выходить" yestext="Выход"/> </notification> + <notification label="" name="ConfirmHideUI"> + Это действие приведет к скрытию всех меню и кнопок. Чтобы вернуть их, щелкните [SHORTCUT] снова. + <usetemplate ignoretext="Подтверждать перед скрытием интерфейса" name="okcancelignore" notext="Отмена" yestext="OK"/> + </notification> <global name="UnsupportedGLRequirements"> По-видимому, ваше оборудование не удовлетворяет требованиям [APP_NAME]. Для работы [APP_NAME] необходима графическая карта OpenGL с поддержкой мультитекстур. Если у вас есть такая карта, убедитесь, что установлены новейшие версии драйверов для нее и пакеты обновлений и исправления для операционной системы. diff --git a/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml new file mode 100644 index 0000000000..f203ecde4b --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_chiclet_bar.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chiclet_bar"> + <layout_stack name="toolbar_stack"> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Разговоры"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Уведомления"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_me.xml b/indra/newview/skins/default/xui/ru/panel_me.xml index b37627b4d9..21a125af87 100644 --- a/indra/newview/skins/default/xui/ru/panel_me.xml +++ b/indra/newview/skins/default/xui/ru/panel_me.xml @@ -1,7 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Мой профиль" name="panel_me"> - <tab_container name="tabs"> - <panel label="МОЙ ПРОФИЛЬ" name="panel_profile"/> - <panel label="МОЯ ПОДБОРКА" name="panel_picks"/> - </tab_container> + <panel label="МОЯ ПОДБОРКА" name="panel_picks"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml index 3bda315261..d9890acff2 100644 --- a/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_navigation_bar.xml @@ -1,18 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> - <panel name="navigation_panel"> - <pull_button name="back_btn" tool_tip="Вернуться в предыдущее место"/> - <pull_button name="forward_btn" tool_tip="Перейти в следующее место"/> - <button name="home_btn" tool_tip="Телепортироваться домой"/> - <location_input label="Место" name="location_combo"/> - <search_combo_box label="Поиск" name="search_combo_box" tool_tip="Поиск"> - <combo_editor label="Поиск [SECOND_LIFE]" name="search_combo_editor"/> - </search_combo_box> - </panel> - <favorites_bar name="favorite" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!"> - <label name="favorites_bar_label" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!"> - Панель «Избранное» - </label> - <chevron_button name=">>" tool_tip="Показать больше избранного"/> - </favorites_bar> + <layout_stack name="nvp_stack"> + <layout_panel name="navigation_layout_panel"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Вернуться в предыдущее место"/> + <pull_button name="forward_btn" tool_tip="Перейти в следующее место"/> + <button name="home_btn" tool_tip="Телепортация домой"/> + <location_input label="Место" name="location_combo"/> + </panel> + </layout_panel> + <layout_panel name="favorites_layout_panel"> + <favorites_bar name="favorite" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!"> + <label name="favorites_bar_label" tool_tip="Перетаскивайте сюда закладки, чтобы было удобнее переходить в любимые места в Second Life!"> + Панель «Избранное» + </label> + <more_button name=">>" tool_tip="Показать больше избранного"> + Больше ▼ + </more_button> + </favorites_bar> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml new file mode 100644 index 0000000000..1d26eecf87 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_chat"> + <check_box label="Перевод чата" name="translate_chat_checkbox"/> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml index ae6d8bf94d..7d8ee96924 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_advanced.xml @@ -17,7 +17,7 @@ <button label="Обзор" label_selected="Обзор" name="set_cache"/> <button label="Расположение по умолчанию" label_selected="Расположение по умолчанию" name="default_cache_location"/> <text name="UI Size:"> - Размер интерфейса: + Интерфейс: </text> <check_box label="Показывать ошибки скрипта в:" name="show_script_errors"/> <radio_group name="show_location"> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml index e1135b5ee1..9d7ae546fd 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_alerts.xml @@ -3,7 +3,7 @@ <text name="tell_me_label"> Сообщать мне: </text> - <check_box label="о тратах и доходах" name="notify_money_change_checkbox"/> + <check_box label="о расходах и доходах" name="notify_money_change_checkbox"/> <check_box label="о входе и выходе моих друзей" name="friends_online_notify_checkbox"/> <text name="show_label"> Всегда показывать: diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index bc9e9a24ba..fb368b8b5e 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -4,39 +4,39 @@ Размер шрифта: </text> <radio_group name="chat_font_size"> - <radio_item label="Маленький" name="radio" value="0"/> + <radio_item label="Мелкий" name="radio" value="0"/> <radio_item label="Средний" name="radio2" value="1"/> - <radio_item label="Большой" name="radio3" value="2"/> + <radio_item label="Крупный" name="radio3" value="2"/> </radio_group> <check_box initial_value="истина" label="Воспроизводить анимацию ввода текста при общении" name="play_typing_animation"/> - <check_box label="Отправлять мне сообщения по Email, когда я в оффлайне" name="send_im_to_email"/> - <check_box label="Включить текстовые сообщения и журнал общения в чате" name="plain_text_chat_history"/> + <check_box label="Отправлять мне сообщения по почте, когда меня нет в сети" name="send_im_to_email"/> + <check_box label="Вести журнал текстового IM и чата" name="plain_text_chat_history"/> <check_box label="Чат в пузырьках" name="bubble_text_chat"/> <text name="show_ims_in_label"> - Показать сообщения в: + Показывать сообщения: </text> <text name="requires_restart_label"> (требуется перезапуск) </text> <radio_group name="chat_window" tool_tip="Показывать IM-сообщения в отдельных окнах или же в одном окне с несколькими вкладками (требуется перезапуск)"> - <radio_item label="Отдельные окна" name="radio" value="0"/> - <radio_item label="Вкладки" name="radio2" value="1"/> + <radio_item label="В отдельных окнах" name="radio" value="0"/> + <radio_item label="На вкладках" name="radio2" value="1"/> </radio_group> <text name="disable_toast_label"> Включить всплывающие сообщения с новыми репликами в чате: </text> <check_box label="Групповой чат" name="EnableGroupChatPopups" tool_tip="Отображать всплывающие уведомления при появлении сообщений в групповом чате"/> <check_box label="Текстовые чаты" name="EnableIMChatPopups" tool_tip="Отображать всплывающие уведомления при получении IM-сообщений"/> - <spinner label="Время отображения всплывающих сообщений чата:" name="nearby_toasts_lifetime"/> - <spinner label="Время затухания всплывающих сообщений чата:" name="nearby_toasts_fadingtime"/> + <spinner label="Время отображения всплывающих реплик:" name="nearby_toasts_lifetime"/> + <spinner label="Время затухания всплывающих реплик:" name="nearby_toasts_fadingtime"/> <text name="translate_chb_label"> - Использовать машинный перевод во время общения (используется Google) + Использовать машинный перевод во время общения </text> <text name="translate_language_text"> Переводить чат на: </text> <combo_box name="translate_language_combobox"> - <combo_box.item label="Стандартная система" name="System Default Language"/> + <combo_box.item label="Язык системы" name="System Default Language"/> <combo_box.item label="English" name="English"/> <combo_box.item label="Dansk" name="Danish"/> <combo_box.item label="Deutsch" name="German"/> @@ -50,7 +50,7 @@ <combo_box.item label="Русский" name="Russian"/> <combo_box.item label="Türkçe" name="Turkish"/> <combo_box.item label="Українська" name="Ukrainian"/> - <combo_box.item label="中文 (简体) (Chinese)" name="Chinese"/> + <combo_box.item label="中文 (简体) (китайский)" name="Chinese"/> <combo_box.item label="日本語 (Japanese)" name="Japanese"/> <combo_box.item label="한국어 (Korean)" name="Korean"/> </combo_box> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml index 17d84e2a39..48c34fcbb2 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_colors.xml @@ -35,9 +35,9 @@ Цвет фона тегов имен (также для чата в пузырьках): </text> <color_swatch name="background" tool_tip="Выберите цвет для тегов имен"/> - <slider label="Прозрачность:" name="bubble_chat_opacity" tool_tip="Задайте прозрачность тегов имен"/> + <slider label="Видимость:" name="bubble_chat_opacity" tool_tip="Задайте непрозрачность тегов имен"/> <text name="floater_opacity"> - Прозрачность окон: + Непрозрачность окон: </text> <slider label="Активные:" name="active"/> <slider label="Неактивные:" name="inactive"/> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml index 28d08d7702..49f743a6ba 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml @@ -4,31 +4,33 @@ Язык: </text> <combo_box name="language_combobox"> - <combo_box.item label="Стандартная настройка системы" name="System Default Language"/> - <combo_box.item label="Английский" name="English"/> + <combo_box.item label="Язык системы" name="System Default Language"/> + <combo_box.item label="English - Английский" name="English"/> <combo_box.item label="Dansk – датский (бета-версия)" name="Danish"/> <combo_box.item label="Deutsch – немецкий (бета-версия)" name="Deutsch(German)"/> <combo_box.item label="Español – испанский (бета-версия)" name="Spanish"/> <combo_box.item label="Français – французский (бета-версия)" name="French"/> <combo_box.item label="Italiano – итальянский (бета-версия)" name="Italian"/> - <combo_box.item label="Nederlands – нидерландский (бета-версия)" name="Dutch"/> <combo_box.item label="Polski – польский (бета-версия)" name="Polish"/> <combo_box.item label="Português – португальский (бета-версия)" name="Portugese"/> + <combo_box.item label="Русский (бета-версия)" name="Russian"/> + <combo_box.item label="Türkçe - турецкий (бета-версия)" name="Turkish"/> <combo_box.item label="日本語 – японский (бета-версия)" name="(Japanese)"/> + <combo_box.item label="正體中文 - китайский, традиционное письмо (бета-версия)" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (Требуется перезапуск) </text> <text name="maturity_desired_prompt"> - Я хочу видеть содержимое: + Показывать контент: </text> <combo_box name="maturity_desired_combobox"> - <combo_box.item label="General, Moderate, Adult" name="Desired_Adult"/> - <combo_box.item label="General и Moderate" name="Desired_Mature"/> - <combo_box.item label="Общие" name="Desired_PG"/> + <combo_box.item label="Общий, умеренный, для взрослых" name="Desired_Adult"/> + <combo_box.item label="Общий и умеренный" name="Desired_Mature"/> + <combo_box.item label="Общий" name="Desired_PG"/> </combo_box> <text name="start_location_textbox"> - Начальное место: + Место старта: </text> <combo_box name="start_location_combo"> <combo_box.item label="Мое последнее место" name="MyLastLocation"/> @@ -36,7 +38,7 @@ </combo_box> <check_box initial_value="истина" label="Показывать на экране входа" name="show_location_checkbox"/> <text name="name_tags_textbox"> - Теги имени: + Теги имен: </text> <radio_group name="Name_Tag_Preference"> <radio_item label="Выкл." name="radio" value="0"/> @@ -44,10 +46,10 @@ <radio_item label="Временный показ" name="radio3" value="2"/> </radio_group> <check_box label="Мое имя" name="show_my_name_checkbox1"/> - <check_box label="Имена пользователей" name="show_slids" tool_tip="Показывать имя пользователя, такое, как bobsmith123"/> - <check_box label="Титулы группы" name="show_all_title_checkbox1" tool_tip="Показывать титулы групп, такие, как Officer или Member"/> + <check_box label="Имена пользователей" name="show_slids" tool_tip="Показывать имя пользователя, например, bobsmith123"/> + <check_box label="Титулы групп" name="show_all_title_checkbox1" tool_tip="Показывать титулы групп, например, Officer или Member"/> <check_box label="Подсветка друзей" name="show_friends" tool_tip="Подсвечивать теги имен ваших друзей"/> - <check_box label="Просмотреть экранные имена" name="display_names_check" tool_tip="Показывать экранные имена в чате, IM, тегах имен и пр."/> + <check_box label="Экранные имена" name="display_names_check" tool_tip="Показывать экранные имена в чате, IM, тегах имен и пр."/> <text name="inworld_typing_rg_label"> Нажатие клавиш с буквами: </text> @@ -56,9 +58,9 @@ <radio_item label="Приводит к перемещению (т. е. WASD)" name="radio_move" value="0"/> </radio_group> <text name="title_afk_text"> - Включение режима «Отошел» через: + Задержка режима «Отошел»: </text> - <combo_box label="Включение режима «Отошел» через:" name="afk"> + <combo_box label="Задержка режима «Отошел»:" name="afk"> <combo_box.item label="2 мин" name="item0"/> <combo_box.item label="5 мин" name="item1"/> <combo_box.item label="10 мин" name="item2"/> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml index 867307cc43..a7e826f5fc 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml @@ -42,10 +42,10 @@ <combo_box.item label="Солнце/луна + осветители" name="2"/> </combo_box> <text name="reflection_label"> - Отражения от воды: + Вода отражает: </text> <combo_box name="Reflections"> - <combo_box.item label="Минимальные" name="0"/> + <combo_box.item label="Минимум" name="0"/> <combo_box.item label="Ландшафт и деревья" name="1"/> <combo_box.item label="Все статичные объекты" name="2"/> <combo_box.item label="Все аватары и объекты" name="3"/> @@ -99,16 +99,16 @@ <check_box initial_value="истина" label="Аппаратная отрисовка" name="AvatarVertexProgram"/> <check_box initial_value="истина" label="Одежда аватара" name="AvatarCloth"/> <text name="TerrainDetailText"> - Детализация ландшафта: + Ландшафт: </text> <radio_group name="TerrainDetailRadio"> - <radio_item label="Низко" name="0"/> - <radio_item label="Высоко" name="2"/> + <radio_item label="Грубо" name="0"/> + <radio_item label="Детально" name="2"/> </radio_group> --> </panel> <button label="Применить" label_selected="Применить" name="Apply"/> <button label="Сброс" name="Defaults"/> <button label="Дополнительно" name="Advanced"/> - <button label="Аппаратные" label_selected="Аппаратные" name="GraphicsHardwareButton"/> + <button label="Аппаратура" label_selected="Аппаратура" name="GraphicsHardwareButton"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml index 331776902f..878a729113 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_move.xml @@ -5,20 +5,35 @@ <text name="heading2"> Автоматическая установка позиции для: </text> - <check_box label="Создания/редактирование" name="edit_camera_movement" tool_tip="Производить автоматическое позиционирование камеры при входе в режим редактирования и выходе из него"/> - <check_box label="Внешность" name="appearance_camera_movement" tool_tip="Производить автоматическое позиционирование камеры в режиме изменения внешности"/> - <check_box initial_value="истина" label="Боковая панель" name="appearance_sidebar_positioning" tool_tip="Производить автоматическое позиционирование камеры для боковой панели"/> + <check_box label="создания/редактирования" name="edit_camera_movement" tool_tip="Производить автоматическое позиционирование камеры при входе в режим редактирования и выходе из него"/> + <check_box label="внешности" name="appearance_camera_movement" tool_tip="Производить автоматическое позиционирование камеры в режиме изменения внешности"/> + <text name="keyboard_lbl"> + Клавиатура: + </text> + <check_box label="Клавиши стрелок всегда перемещают меня" name="arrow_keys_move_avatar_check"/> + <check_box label="Бег после двойного нажатия клавиши" name="tap_tap_hold_to_run"/> + <text name="mouse_lbl"> + Мышь: + </text> <check_box label="Показывать меня при обзоре мышью" name="first_person_avatar_visible"/> <text name=" Mouse Sensitivity"> Чувствительность мыши: </text> <check_box label="Инвертировать" name="invert_mouse"/> - <check_box label="Клавиши стрелок всегда перемещают меня" name="arrow_keys_move_avatar_check"/> - <check_box label="Бег после двойного нажатия клавиши" name="tap_tap_hold_to_run"/> - <check_box label="Двойной щелчок для:" name="double_click_chkbox"/> - <radio_group name="double_click_action"> - <radio_item label="Телепорт" name="radio_teleport"/> - <radio_item label="Автопилот" name="radio_autopilot"/> - </radio_group> + <text name="single_click_action_lbl"> + Один щелчок на земле: + </text> + <combo_box name="single_click_action_combo"> + <combo_box.item label="Без действия" name="0"/> + <combo_box.item label="Перемещение в точку щелчка" name="1"/> + </combo_box> + <text name="double_click_action_lbl"> + Двойной щелчок на земле: + </text> + <combo_box name="double_click_action_combo"> + <combo_box.item label="Без действия" name="0"/> + <combo_box.item label="Перемещение в точку щелчка" name="1"/> + <combo_box.item label="Телепортация в точку щелчка" name="2"/> + </combo_box> <button label="Другие устройства" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml index f3c7e43022..20bb839eed 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_privacy.xml @@ -20,7 +20,7 @@ <check_box label="Метка времени в каждой строке журнала чата" name="show_timestamps_check_im"/> <check_box label="Метка времени в имени файла журнала." name="logfile_name_datestamp"/> <text name="log_path_desc"> - Размещение журналов: + Папка журналов: </text> <button label="Обзор" label_selected="Обзор" name="log_path_button"/> <button label="Черный список" name="block_list"/> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml index 9f23e2f5f7..db88189169 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Настройка" name="Input panel"> +<panel label="Конфигурация" name="Input panel"> <text name="Network:"> Сеть: </text> <text name="Maximum bandwidth"> - Максимальная ширина канала + Макс. ширина канала </text> <text name="text_box2"> Кбит/с @@ -32,5 +32,5 @@ <text name="Proxy Settings:"> Настройки прокси-сервера: </text> - <button label="Задать настройки прокси" label_selected="Обзор" name="set_proxy"/> + <button label="Задать настройки" label_selected="Обзор" name="set_proxy"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml index 123989966c..bf673750d2 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Звуки" name="Preference Media panel"> <panel.string name="middle_mouse"> - Средняя кнопка мыши + среднюю кнопку мыши </panel.string> - <slider label="Главный регулятор" name="System Volume"/> + <slider label="Общая громкость" name="System Volume"/> <check_box initial_value="истина" name="mute_when_minimized"/> <text name="mute_chb_label"> Заглушать, когда свернуто @@ -24,11 +24,11 @@ Настройки голосового чата </text> <text name="Listen from"> - Прослушивание с позиции: + Слушать с: </text> <radio_group name="ear_location"> - <radio_item label="Камера" name="0"/> - <radio_item label="Аватар" name="1"/> + <radio_item label="Камеры" name="0"/> + <radio_item label="Аватара" name="1"/> </radio_group> <check_box label="Губы аватара двигаются при разговоре" name="enable_lip_sync"/> <check_box label="Включать/выключать микрофон, когда я нажимаю:" name="push_to_talk_toggle_check" tool_tip="В режиме переключения ОДНОКРАТНОЕ нажатие и отпускание данной клавиши включает/выключает микрофон. Если режим переключения отключен, то микрофон передает голос, только когда клавиша нажата."/> diff --git a/indra/newview/skins/default/xui/ru/panel_sound_devices.xml b/indra/newview/skins/default/xui/ru/panel_sound_devices.xml index 4a57ed4f4f..98dab288a3 100644 --- a/indra/newview/skins/default/xui/ru/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/ru/panel_sound_devices.xml @@ -20,6 +20,6 @@ </text> <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Измените значение, используя ползунок"/> <text name="wait_text"> - Ожидайте + Подождите </text> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml index ddf63d69c2..6822244196 100644 --- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml @@ -17,12 +17,9 @@ </panel.string> <panel name="balance_bg"> <text name="balance" tool_tip="Щелкните для обновления вашего баланса L$" value="L$20"/> - <button label="КУПИТЬ L$" name="buyL" tool_tip="Щелкните для покупки L$"/> + <button label="Купить L$" name="buyL" tool_tip="Щелкните для покупки L$"/> + <button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life"/> </panel> - <combo_box name="mode_combo" tool_tip="Выберите режим. Основной – для быстрого и простого ознакомления с игрой, а также общения. Расширенный – для доступа к более широким возможностям."> - <combo_box.item label="Основной режим" name="Basic"/> - <combo_box.item label="Расширенный режим" name="Advanced"/> - </combo_box> <text name="TimeText" tool_tip="Текущее время (тихоокеанское)"> 00:00 (тихоокеанское время) </text> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 44440ea542..df657b39c6 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1273,6 +1273,9 @@ support@secondlife.com. <string name="Marketplace Error Internal Import"> Ошибка. Эта вещь создает проблему. Повторите попытку позже. </string> + <string name="Open landmarks"> + Открыть закладки + </string> <string name="no_transfer" value="(не передается)"/> <string name="no_modify" value="(не изменяется)"/> <string name="no_copy" value="(не копируется)"/> @@ -1937,7 +1940,7 @@ support@secondlife.com. Новый скрипт </string> <string name="BusyModeResponseDefault"> - У жителя, которому вы адресовали сообщение, задан статус «Не беспокоить». Ваше сообщение все равно будет отображено на панели IM для просмотра позже. + У адресата вашего сообщения задан статус «Не беспокоить». Ваше сообщение все равно будет отображено на панели IM для просмотра позже. </string> <string name="MuteByName"> (по имени) @@ -4248,8 +4251,8 @@ support@secondlife.com. <string name="Female - Wow"> Женщина – ух ты! </string> - <string name="/bow1"> - /поклон1 + <string name="/bow"> + /поклон </string> <string name="/clap"> /хлопнуть @@ -4772,4 +4775,172 @@ support@secondlife.com. <string name="ParticleHiding"> Частицы скрыты </string> + <string name="Command_AboutLand_Label"> + О земле + </string> + <string name="Command_Appearance_Label"> + Внешность + </string> + <string name="Command_Avatar_Label"> + Аватар + </string> + <string name="Command_Build_Label"> + Строительство + </string> + <string name="Command_Chat_Label"> + Чат + </string> + <string name="Command_Compass_Label"> + Компас + </string> + <string name="Command_Destinations_Label"> + Места + </string> + <string name="Command_Gestures_Label"> + Жесты + </string> + <string name="Command_HowTo_Label"> + Инструкции + </string> + <string name="Command_Inventory_Label"> + Инвентарь + </string> + <string name="Command_Map_Label"> + Карта + </string> + <string name="Command_Marketplace_Label"> + Торговый центр + </string> + <string name="Command_MiniMap_Label"> + Миникарта + </string> + <string name="Command_Move_Label"> + Переместить + </string> + <string name="Command_People_Label"> + Люди + </string> + <string name="Command_Picks_Label"> + Подборка + </string> + <string name="Command_Places_Label"> + Места + </string> + <string name="Command_Preferences_Label"> + Настройки + </string> + <string name="Command_Profile_Label"> + Профиль + </string> + <string name="Command_Search_Label"> + Поиск + </string> + <string name="Command_Snapshot_Label"> + Снимок + </string> + <string name="Command_Speak_Label"> + Говорить + </string> + <string name="Command_View_Label"> + Вид + </string> + <string name="Command_Voice_Label"> + Голоса собеседников + </string> + <string name="Command_AboutLand_Tooltip"> + Информация о посещаемой вами земле + </string> + <string name="Command_Appearance_Tooltip"> + Сменить аватар + </string> + <string name="Command_Avatar_Tooltip"> + Выберите весь аватар + </string> + <string name="Command_Build_Tooltip"> + Построение объектов и формирование ландшафта + </string> + <string name="Command_Chat_Tooltip"> + Обменивайтесь текстовыми репликами с людьми вокруг вас + </string> + <string name="Command_Compass_Tooltip"> + Компас + </string> + <string name="Command_Destinations_Tooltip"> + Интересные места + </string> + <string name="Command_Gestures_Tooltip"> + Жесты для аватара + </string> + <string name="Command_HowTo_Tooltip"> + Выполнение типичных задач + </string> + <string name="Command_Inventory_Tooltip"> + Просмотр и использование вашего имущества + </string> + <string name="Command_Map_Tooltip"> + Карта мира + </string> + <string name="Command_Marketplace_Tooltip"> + Покупки + </string> + <string name="Command_MiniMap_Tooltip"> + Показать людей поблизости + </string> + <string name="Command_Move_Tooltip"> + Перемещение аватара + </string> + <string name="Command_People_Tooltip"> + Друзья, группы и люди поблизости + </string> + <string name="Command_Picks_Tooltip"> + Места, которые будут показаны в вашем профиле как избранное + </string> + <string name="Command_Places_Tooltip"> + Сохраненные вами места + </string> + <string name="Command_Preferences_Tooltip"> + Настройки + </string> + <string name="Command_Profile_Tooltip"> + Редактирование или просмотр вашего профиля + </string> + <string name="Command_Search_Tooltip"> + Поиск мест, событий, людей + </string> + <string name="Command_Snapshot_Tooltip"> + Сделать снимок + </string> + <string name="Command_Speak_Tooltip"> + Говорите с людьми вокруг вас с помощью микрофона + </string> + <string name="Command_View_Tooltip"> + Изменение угла камеры + </string> + <string name="Command_Voice_Tooltip"> + Люди около вас с оспособностью говорить + </string> + <string name="Retain%"> + Остаток% + </string> + <string name="Detail"> + Детализация + </string> + <string name="Better Detail"> + Более детально + </string> + <string name="Surface"> + Поверхность + </string> + <string name="Solid"> + Сплошной + </string> + <string name="Wrap"> + Оболочка + </string> + <string name="Preview"> + Предварительный просмотр + </string> + <string name="Normal"> + Нормальный + </string> </strings> diff --git a/indra/newview/skins/default/xui/ru/teleport_strings.xml b/indra/newview/skins/default/xui/ru/teleport_strings.xml index 6a7a181046..296562e6f1 100644 --- a/indra/newview/skins/default/xui/ru/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ru/teleport_strings.xml @@ -20,6 +20,10 @@ Системе не удалось выполнить подключение телепорта. Повторите попытку позже. </message> + <message name="NoHelpIslandTP"> + Вы не можете телепортироваться обратно на Остров Помощи. +Телепортируйтесь на Общественный Остров Помощи, чтобы повторить обучение + </message> <message name="noaccess_tport"> У вас нет доступа к точке назначения этого телепорта. </message> diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml index 2fdbafdfb4..998890b85c 100644 --- a/indra/newview/skins/default/xui/tr/floater_about.xml +++ b/indra/newview/skins/default/xui/tr/floater_about.xml @@ -10,7 +10,7 @@ <floater.string name="AboutPosition"> <nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] konumundasınız [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [Sürüm Notları]] +[SERVER_RELEASE_NOTES_URL] </floater.string> <floater.string name="AboutSystem"> CPU: [CPU] @@ -37,6 +37,9 @@ Ses Sunucusu Sürümü: [VOICE_VERSION] <floater.string name="AboutTraffic"> Kaybolan Paketler: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) </floater.string> + <floater.string name="ErrorFetchingServerReleaseNotesURL"> + Sunucu sürümü notları URL'si alınırken hata oluştu. + </floater.string> <tab_container name="about_tab"> <panel label="Bilgi" name="support_panel"> <button label="Panoya Kopyala" name="copy_btn"/> diff --git a/indra/newview/skins/default/xui/tr/floater_about_land.xml b/indra/newview/skins/default/xui/tr/floater_about_land.xml index 6256f954b2..c44722f4ba 100644 --- a/indra/newview/skins/default/xui/tr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/tr/floater_about_land.xml @@ -212,19 +212,19 @@ Bölge Nesne Bonusu Faktörü: [BONUS] </text> <text name="Simulator primitive usage:"> - İlkel Kullanım: + Bölge kapasitesi: </text> <text name="objects_available"> [COUNT] / [MAX] ([AVAILABLE]) uygun </text> <text name="Primitives parcel supports:"> - Prim parsel desteği: + Parsel arazi kapasitesi: </text> <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> - Parseldeki prims: + Parsel arazi etkisi: </text> <text name="total_objects_text"> [COUNT] diff --git a/indra/newview/skins/default/xui/tr/floater_avatar.xml b/indra/newview/skins/default/xui/tr/floater_avatar.xml new file mode 100644 index 0000000000..fc9e3c8a9b --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_avatar.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Avatar" title="AVATAR SEÇİCİ"/> diff --git a/indra/newview/skins/default/xui/tr/floater_camera.xml b/indra/newview/skins/default/xui/tr/floater_camera.xml index 066b7cc933..4161e6ea52 100644 --- a/indra/newview/skins/default/xui/tr/floater_camera.xml +++ b/indra/newview/skins/default/xui/tr/floater_camera.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="camera_floater"> +<floater name="camera_floater" title="GÖSTER"> <floater.string name="rotate_tooltip"> Odak Etrafında Kamerayı Döndür </floater.string> @@ -13,7 +13,7 @@ Kamera modları </floater.string> <floater.string name="pan_mode_title"> - Yörünge Değişimi - Yakınlaştırma - Kamerayı Çevirme + Yörünge - Yakınlş. - Kamerayı Çvr. </floater.string> <floater.string name="presets_mode_title"> Ön Ayarlı Görünümler diff --git a/indra/newview/skins/default/xui/tr/floater_chat_bar.xml b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml new file mode 100644 index 0000000000..d2385e6be3 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="chat_bar" title="YAKINDAKİ SOHBET"> + <panel> + <line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/> + <button name="show_nearby_chat" tool_tip="yakın sohbet günlüğünü gösterir/gizler"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/tr/floater_day_cycle_options.xml deleted file mode 100644 index 9e706d9892..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_day_cycle_options.xml +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Day Cycle Floater" title="GÜN DÖNGÜSÜ DÜZENLEYİCİ"> - <tab_container name="Day Cycle Tabs"> - <panel label="Gün Döngüsü" name="Day Cycle"> - <multi_slider initial_value="0" name="WLTimeSlider"/> - <multi_slider initial_value="0" name="WLDayCycleKeys"/> - <text name="WL12am"> - 12öö - </text> - <text name="WL3am"> - 3öö - </text> - <text name="WL6am"> - 6öö - </text> - <text name="WL9amHash"> - 9öö - </text> - <text name="WL12pmHash"> - 12ös - </text> - <text name="WL3pm"> - 3ös - </text> - <text name="WL6pm"> - 6ös - </text> - <text name="WL9pm"> - 9ös - </text> - <text name="WL12am2"> - 12öö - </text> - <text name="WL12amHash"> - | - </text> - <text name="WL3amHash"> - I - </text> - <text name="WL6amHash"> - | - </text> - <text name="WL9amHash2"> - I - </text> - <text name="WL12pmHash2"> - | - </text> - <text name="WL3pmHash"> - I - </text> - <text name="WL6pmHash"> - | - </text> - <text name="WL9pmHash"> - I - </text> - <text name="WL12amHash2"> - | - </text> - <button label="Anahtar Ekle" label_selected="Anahtar Ekle" name="WLAddKey"/> - <button label="Anahtarı Sil" label_selected="Anahtarı Sil" name="WLDeleteKey"/> - <text name="WLCurKeyFrameText"> - Anahtar Kare Ayarları: - </text> - <text name="WLCurKeyTimeText"> - Anahtar Zamanı: - </text> - <spinner label="Saat" name="WLCurKeyHour"/> - <spinner label="Dak" name="WLCurKeyMin"/> - <text name="WLCurKeyTimeText2"> - Anahtar Ön Ayarı: - </text> - <combo_box label="Ön Ayar" name="WLKeyPresets"/> - <text name="DayCycleText"> - Yasla: - </text> - <combo_box label="5 dak" name="WLSnapOptions"/> - <text name="DayCycleText2"> - Döngü Uzunluğu: - </text> - <spinner label="Saat" name="WLLengthOfDayHour"/> - <spinner label="Dak" name="WLLengthOfDayMin"/> - <spinner label="San" name="WLLengthOfDaySec"/> - <text name="DayCycleText3"> - Önizleme: - </text> - <button label="Oyna" label_selected="Oyna" name="WLAnimSky"/> - <button label="Durdur!" label_selected="Durdur" name="WLStopAnimSky"/> - <button label="Gayrimenkul Saati Kullan" label_selected="Gayrimenkul Saatine Git" name="WLUseLindenTime"/> - <button label="Test Gününü Kaydet" label_selected="Test Gününü Kaydet" name="WLSaveDayCycle"/> - <button label="Test Gününü Yükle" label_selected="Test Gününü Yükle" name="WLLoadDayCycle"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_destinations.xml b/indra/newview/skins/default/xui/tr/floater_destinations.xml new file mode 100644 index 0000000000..4504366d63 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_destinations.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Destinations" title="HEDEF KONUMLAR"/> diff --git a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml index a5cbe3a416..e2e87ddf1e 100644 --- a/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml +++ b/indra/newview/skins/default/xui/tr/floater_edit_day_cycle.xml @@ -36,31 +36,31 @@ <button label="Anahtar Ekle" label_selected="Anahtar Ekle" name="WLAddKey"/> <button label="Anahtarı Sil" label_selected="Anahtarı Sil" name="WLDeleteKey"/> <text name="WL12am"> - 12öö + 12 </text> <text name="WL3am"> - 3öö + 3 </text> <text name="WL6am"> - 6öö + 6 </text> <text name="WL9amHash"> - 9öö + 9 </text> <text name="WL12pmHash"> - 12ös + 24 </text> <text name="WL3pm"> - 3ös + 15 </text> <text name="WL6pm"> - 6ös + 18 </text> <text name="WL9pm"> - 9ös + 21 </text> <text name="WL12am2"> - 12öö + 12 </text> <text name="WL12amHash"> | @@ -97,7 +97,7 @@ <text name="WLCurKeyTimeText"> Zaman: </text> - <time name="time" value="6:00 ÖÖ"/> + <time name="time" value="6:00"/> <check_box label="Bunu yeni gün döngüm yap" name="make_default_cb"/> <button label="Kaydet" name="save"/> <button label="İptal" name="cancel"/> diff --git a/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml b/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml index 16564963e5..0e9f86148d 100644 --- a/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml +++ b/indra/newview/skins/default/xui/tr/floater_edit_sky_preset.xml @@ -86,21 +86,21 @@ | </text> <text name="WL12am"> - 12öö + 12 </text> <text name="WL6am"> - 6öö + 6 </text> <text name="WL12pmHash"> - 12ös + 24 </text> <text name="WL6pm"> - 6ös + 18 </text> <text name="WL12am2"> - 12öö + 12 </text> - <time name="WLDayTime" value="6:00 ÖÖ"/> + <time name="WLDayTime" value="6:00"/> <text name="WLEastAngleText"> Doğu Açısı </text> diff --git a/indra/newview/skins/default/xui/tr/floater_fast_timers.xml b/indra/newview/skins/default/xui/tr/floater_fast_timers.xml new file mode 100644 index 0000000000..5736bda45e --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_fast_timers.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="fast_timers"> + <string name="pause"> + Duraklat + </string> + <string name="run"> + Koş + </string> + <button label="Duraklat" name="pause_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_how_to.xml b/indra/newview/skins/default/xui/tr/floater_how_to.xml new file mode 100644 index 0000000000..a42fe0b122 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_how_to.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_how_to" title="NASIL YAPILIR"/> diff --git a/indra/newview/skins/default/xui/tr/floater_map.xml b/indra/newview/skins/default/xui/tr/floater_map.xml index 36ec097cc4..7d6c314f04 100644 --- a/indra/newview/skins/default/xui/tr/floater_map.xml +++ b/indra/newview/skins/default/xui/tr/floater_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map" title=""> +<floater name="Map" title="MİNİ-HARİTA"> <floater.string name="ToolTipMsg"> [REGION](Haritayı açmak için çift tıkla, yatay hareket için shift çek) </floater.string> @@ -7,7 +7,7 @@ [REGION](Işınlamak için çift tıkla, yatay hareket için shift çek) </floater.string> <floater.string name="mini_map_caption"> - MİNİHARİTA + Mini-harita </floater.string> <text label="K" name="floater_map_north"> K diff --git a/indra/newview/skins/default/xui/tr/floater_model_preview.xml b/indra/newview/skins/default/xui/tr/floater_model_preview.xml index 7388d236ed..339545f96e 100644 --- a/indra/newview/skins/default/xui/tr/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/tr/floater_model_preview.xml @@ -1,10 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Model Preview" title="Modeli Karşıya Yükle"> - <string name="status_idle"> - Boşta - </string> +<floater name="Model Preview" title="MODELİ KARŞIYA YÜKLE"> + <string name="status_idle"/> <string name="status_parse_error"> - Dae ayrıştırma sorunu - ayrıntılar için günlüğe bakın. + Hata: Tarih ayrıştırma sorunu - ayrıntılar için günlüğe bakın. </string> <string name="status_reading_file"> Yükleniyor... @@ -51,6 +49,9 @@ <string name="mesh_status_missing_lod"> Gereken ayrıntı seviyesi eksik. </string> + <string name="mesh_status_invalid_material_list"> + Ayrıntı seviyesi malzemeleri, referans modelin bir alt kümesi değil. + </string> <string name="layer_all"> Tümü </string> @@ -63,188 +64,211 @@ <string name="tbd"> ileride belirlenecektir </string> - <text name="name_label"> - Ad: - </text> - <text name="lod_label"> - Önizleme: - </text> - <combo_box name="preview_lod_combo" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi"> - <combo_item name="high"> - Ayrıntı Seviyesi: Yüksek - </combo_item> - <combo_item name="medium"> - Ayrıntı Seviyesi: Orta - </combo_item> - <combo_item name="low"> - Ayrıntı Seviyesi: Düşük - </combo_item> - <combo_item name="lowest"> - Ayrıntı Seviyesi: En Düşük - </combo_item> - </combo_box> - <text name="warning_title"> - UYARI: - </text> - <text name="warning_message"> - Bu modelin Second Life sunucularına nihai karşıya yüklemesini tamamlayamayacaksınız. Örgü modellerinin karşıya yüklenmesi için etkinleştirmenin [[VURL] nasıl yapılacağını öğrenin]. - </text> - <text name="weights_text"> - Karşıdan Yükle: -Fizik: -Sunucu: - -Prim eşdeğerleri: - </text> - <text name="weights"> - [ST] -[PH] -[SIM] - -[EQ] - </text> - <tab_container name="import_tab"> - <panel label="Ayrıntı Seviyesi" name="lod_panel"> - <text name="lod_table_header"> - Ayrıntı Seviyesini Seç: - </text> - <text name="high_label" value="Yüksek"/> - <text name="high_triangles" value="0"/> - <text name="high_vertices" value="0"/> - <text name="medium_label" value="Orta"/> - <text name="medium_triangles" value="0"/> - <text name="medium_vertices" value="0"/> - <text name="low_label" value="Düşük"/> - <text name="low_triangles" value="0"/> - <text name="low_vertices" value="0"/> - <text name="lowest_label" value="En Düşük"/> - <text name="lowest_triangles" value="0"/> - <text name="lowest_vertices" value="0"/> - <text name="lod_table_footer"> - Ayrıntı Seviyesi: [DETAIL] - </text> - <radio_group name="lod_file_or_limit" value="lod_from_file"> - <radio_item label="Dosyadan yükle" name="lod_from_file"/> - <radio_item label="Otomatik oluştur" name="lod_auto_generate"/> - <radio_item label="Hiçbiri" name="lod_none"/> - </radio_group> - <button label="Gözat..." name="lod_browse"/> - <combo_box name="lod_mode"> - <combo_item name="triangle_limit"> - Üçgen Limiti - </combo_item> - <combo_item name="error_threshold"> - Hata Eşiği - </combo_item> - </combo_box> - <text name="build_operator_text"> - İnşa İşleci: + <panel name="left_panel"> + <panel name="model_name_representation_panel"> + <text name="name_label"> + Model adı: </text> - <text name="queue_mode_text"> - Kuyruk Modu: + <text name="model_category_label"> + Bu modelin temsil ettiği... </text> - <combo_box name="build_operator"> - <combo_item name="edge_collapse"> - Kenar Bütünleştirme - </combo_item> - <combo_item name="half_edge_collapse"> - Yarım Kenar Bütünleştirme - </combo_item> - </combo_box> - <combo_box name="queue_mode"> - <combo_item name="greedy"> - Açgözlü - </combo_item> - <combo_item name="lazy"> - Tembel - </combo_item> - <combo_item name="independent"> - Bağımsız - </combo_item> + <combo_box name="model_category_combo"> + <combo_item label="Birini Seçin..." name="Choose one"/> + <combo_item label="Avatar şekli" name="Avatar shape"/> + <combo_item label="Avatar aksesuarı" name="Avatar attachment"/> + <combo_item label="Hareket eden nesne (araç, hayvan)" name="Moving object (vehicle, animal)"/> + <combo_item label="Bina Bileşeni" name="Building Component"/> + <combo_item label="Büyük, hareketsiz, vs." name="Large, non moving etc"/> + <combo_item label="Daha küçük, hareketsiz, vs." name="Smaller, non-moving etc"/> + <combo_item label="Bunlardan herhangi biri değil" name="Not really any of these"/> </combo_box> - <text name="border_mode_text"> - Sınır Modu: - </text> - <text name="share_tolderance_text"> - Paylaşma Toleransı: - </text> - <combo_box name="border_mode"> - <combo_item name="border_unlock"> - Kilidi Kaldır - </combo_item> - <combo_item name="border_lock"> - Kilitle - </combo_item> - </combo_box> - <text name="crease_label"> - Kıvrım Açısı: - </text> - <spinner name="crease_angle" value="75"/> </panel> - <panel label="Fizik" name="physics_panel"> - <panel name="physics geometry"> - <radio_group name="physics_load_radio" value="physics_load_from_file"> - <radio_item label="Dosya:" name="physics_load_from_file"/> - <radio_item label="Ayrıntı Seviyesini Kullan:" name="physics_use_lod"/> - </radio_group> - <combo_box name="physics_lod_combo" tool_tip="Fizik şekli için kullanılacak ayrıntı seviyesi"> - <combo_item name="physics_lowest"> - En Düşük - </combo_item> - <combo_item name="physics_low"> - Düşük - </combo_item> - <combo_item name="physics_medium"> - Orta - </combo_item> - <combo_item name="physics_high"> - Yüksek - </combo_item> - </combo_box> - <button label="Gözat..." name="physics_browse"/> + <tab_container name="import_tab"> + <panel label="Ayrıntı Seviyesi" name="lod_panel" title="Ayrıntı Seviyesi"> + <text initial_value="Kaynak" name="source" value="Kaynak"/> + <text initial_value="Üçgenler" name="triangles" value="Üçgenler"/> + <text initial_value="Köşeler" name="vertices" value="Köşeler"/> + <text initial_value="Yüksek" name="high_label" value="Yüksek"/> + <button label="Gözat..." name="lod_browse_high"/> + <text initial_value="0" name="high_triangles" value="0"/> + <text initial_value="0" name="high_vertices" value="0"/> + <text initial_value="Orta" name="medium_label" value="Orta"/> + <button label="Gözat..." name="lod_browse_medium"/> + <text initial_value="0" name="medium_triangles" value="0"/> + <text initial_value="0" name="medium_vertices" value="0"/> + <text initial_value="Düşük" name="low_label" value="Düşük"/> + <button label="Gözat..." name="lod_browse_low"/> + <text initial_value="0" name="low_triangles" value="0"/> + <text initial_value="0" name="low_vertices" value="0"/> + <text initial_value="En Düşük" name="lowest_label" value="En Düşük"/> + <button label="Gözat..." name="lod_browse_lowest"/> + <text initial_value="0" name="lowest_triangles" value="0"/> + <text initial_value="0" name="lowest_vertices" value="0"/> + <check_box label="Normalleri Oluştur" name="gen_normals"/> + <text initial_value="Kıvrım Açısı:" name="crease_label" value="Kıvrım Açısı:"/> + <spinner name="crease_angle" value="75"/> </panel> - <panel name="physics analysis"> - <slider label="Düzeltme:" name="Smooth"/> - <check_box label="Delikleri Kapa (yavaş)" name="Close Holes (Slow)"/> - <button label="Çözümle" name="Decompose"/> - <button label="İptal" name="decompose_cancel"/> + <panel label="Fizik" name="physics_panel"> + <panel name="physics geometry"> + <text name="first_step_name"> + 1. Adım: Ayrıntı Seviyesi + </text> + <combo_box name="physics_lod_combo" tool_tip="Fizik şekli için kullanılacak ayrıntı"> + <combo_item name="choose_one"> + Birini seçin... + </combo_item> + <combo_item name="physics_high"> + Yüksek + </combo_item> + <combo_item name="physics_medium"> + Orta + </combo_item> + <combo_item name="physics_low"> + Düşük + </combo_item> + <combo_item name="physics_lowest"> + En Düşük + </combo_item> + <combo_item name="load_from_file"> + Dosyadan + </combo_item> + </combo_box> + <button label="Gözat..." name="physics_browse"/> + </panel> + <panel name="physics analysis"> + <text name="method_label"> + 2. Adım: Çözümle + </text> + <text name="analysis_method_label"> + Yöntem: + </text> + <text name="quality_label"> + Kalite: + </text> + <text name="smooth_method_label"> + Düzeltme: + </text> + <check_box label="Delikleri Kapat" name="Close Holes (Slow)"/> + <button label="Çözümle" name="Decompose"/> + <button label="İptal" name="decompose_cancel"/> + </panel> + <panel name="physics simplification"> + <text name="second_step_label"> + 3. Adım: Basitleştir + </text> + <text name="simp_method_header"> + Yöntem: + </text> + <text name="pass_method_header"> + Geçişler: + </text> + <text name="Detail Scale label"> + Ayrıntı ölçeği: + </text> + <text name="Retain%_label"> + Koru: + </text> + <combo_box name="Combine Quality" value="1"/> + <button label="Basitleştir" name="Simplify"/> + <button label="İptal" name="simplify_cancel"/> + </panel> + <panel name="physics info"> + <text name="results_text"> + Sonuçlar: + </text> + <text name="physics_triangles"> + Üçgenler: [TRIANGLES], + </text> + <text name="physics_points"> + Köşeler: [POINTS], + </text> + <text name="physics_hulls"> + Gövdeler: [HULLS] + </text> + </panel> </panel> - <panel name="physics simplification"> - <slider label="Geçişler:" name="Combine Quality"/> - <slider label="Ayrıntı Ölçeği:" name="Detail Scale"/> - <slider label="Koru:" name="Retain%"/> - <button label="Basitleştir" name="Simplify"/> - <button label="İptal" name="simplify_cancel"/> - </panel> - <panel name="physics info"> - <slider label="Önizleme Yayılımı:" name="physics_explode"/> - <text name="physics_triangles"> - Üçgenler: [TRIANGLES] + <panel label="Karşıya yükleme seçenekleri" name="modifiers_panel"> + <text name="scale_label"> + Ölçek (1=ölçekleme yok): + </text> + <spinner name="import_scale" value="1.0"/> + <text name="dimensions_label"> + Boyutlar: </text> - <text name="physics_points"> - Köşeler: [POINTS] + <text name="import_dimensions"> + [X] X [Y] X [Z] </text> - <text name="physics_hulls"> - Gövdeler: [HULLS] + <check_box label="Dokuları dahil et" name="upload_textures"/> + <text name="include_label"> + Sadece avatar modelleri için: </text> + <check_box label="Dış katman ağırlığını dahil et" name="upload_skin"/> + <check_box label="Eklem konumlarını dahil et" name="upload_joints"/> + <text name="pelvis_offset_label"> + Z kayması (avatarı kaldırmak veya indirmek için): + </text> + <spinner name="pelvis_offset" value="0.0"/> </panel> - </panel> - <panel label="Değiştiriciler" name="modifiers_panel"> - <spinner name="import_scale" value="1.0"/> - <text name="import_dimensions"> - [X] x [Y] x [Z] m + </tab_container> + <panel name="weights_and_warning_panel"> + <button label="Ağırlıkları ve ücreti hesapla" name="calculate_btn" tool_tip="Ağırlıkları ve ücreti hesapla"/> + <button label="İptal" name="cancel_btn"/> + <button label="Karşıya Yükle" name="ok_btn" tool_tip="Simülatöre karşıya yükle"/> + <button label="Ayarları temizle ve formu sıfırla" name="reset_btn"/> + <text name="upload_fee"> + Karşıya yükleme ücreti: L$ [FEE] + </text> + <text name="prim_weight"> + Arazi etkisi [EQ] + </text> + <text name="download_weight"> + Karşıdan Yükle: [ST] + </text> + <text name="physics_weight"> + Fizik: [PH] + </text> + <text name="server_weight"> + Sunucu: [SIM] + </text> + <text name="warning_title"> + NOT: + </text> + <text name="warning_message"> + Örgü modellerini karşıya yüklemeye hakkınız yok. Nasıl onaylanacağınızı [[VURL] öğrenin]. + </text> + <text name="status"> + [STATUS] </text> - <check_box label="Dokular" name="upload_textures"/> - <check_box label="Dış katman ağırlığı" name="upload_skin"/> - <check_box label="Eklem konumları" name="upload_joints"/> - <spinner name="pelvis_offset" value="0.0"/> </panel> - </tab_container> - <text name="upload_fee"> - Karşıya yükleme ücreti: L$ [FEE] + </panel> + <text name="lod_label"> + Önizleme: </text> - <button label="Varsayılanlara ayarla" name="reset_btn" tool_tip="Varsayılanlara ayarla"/> - <button label="Ağırlıkları ve ücreti hesapla" name="calculate_btn" tool_tip="Ağırlıkları ve ücreti hesapla"/> - <button label="Karşıya Yükle" name="ok_btn" tool_tip="Simülatöre karşıya yükle"/> - <button label="İptal" name="cancel_btn"/> + <panel name="right_panel"> + <combo_box name="preview_lod_combo" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi"> + <combo_item name="high"> + Yüksek + </combo_item> + <combo_item name="medium"> + Orta + </combo_item> + <combo_item name="low"> + Düşük + </combo_item> + <combo_item name="lowest"> + En Düşük + </combo_item> + </combo_box> + <text name="label_display"> + Ekran... + </text> + <check_box label="Kenarlar" name="show_edges"/> + <check_box label="Fizik" name="show_physics"/> + <check_box label="Dokular" name="show_textures"/> + <check_box label="Dış katman ağırlıkları" name="show_skin_weight"/> + <check_box label="Eklemler" name="show_joint_positions"/> + <text name="physics_explode_label"> + Önizleme Yayılımı: + </text> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/tr/floater_model_wizard.xml b/indra/newview/skins/default/xui/tr/floater_model_wizard.xml index a0a67e2def..108d20cfac 100644 --- a/indra/newview/skins/default/xui/tr/floater_model_wizard.xml +++ b/indra/newview/skins/default/xui/tr/floater_model_wizard.xml @@ -6,26 +6,20 @@ <button label="2. Optimize et" name="optimize_btn"/> <button label="1. Dosya Seç" name="choose_file_btn"/> <panel name="choose_file_panel"> - <panel name="choose_file_header_panel"> - <text name="choose_file_header_text"> + <panel name="header_panel"> + <text name="header_text"> Model dosyasını seçin </text> </panel> - <panel name="choose_file_content_panel"> + <panel name="content"> <text name="advanced_users_text"> Gelişmiş kullanıcılar: Eğer 3B içerik oluşturma araçlarını kullanmayı biliyorsanız, Gelişmiş Karşıya Yükleyiciyi kullanmak isteyebilirsiniz. </text> <button label="Gelişmişe geç" name="switch_to_advanced"/> - <text name="choose_model_file_label"> + <text name="Cache location"> Karşıya yüklenecek model dosyasını seçin </text> <button label="Gözat..." label_selected="Gözat..." name="browse"/> - <text name="support_collada_text"> - Second Life, COLLADA (.dae) dosyalarını destekler - </text> - <text name="dimensions_label"> - Boyutlar (metre): - </text> <text name="dimensions"> X Y Z </text> @@ -38,18 +32,15 @@ </panel> </panel> <panel name="optimize_panel"> - <panel name="optimize_header_panel"> - <text name="optimize_header_text"> + <panel name="header_panel"> + <text name="header_text"> Modeli optimize et </text> </panel> - <text name="optimize_hint"> + <text name="description"> Modeli performans için optimize ettik. İstiyorsanız daha da ayarlayabilirsiniz. </text> - <panel name="optimize_content_panel"> - <text name="generating_lod_label"> - Ayrıntı Seviyesi Oluşturuluyor - </text> + <panel name="content"> <text name="high_detail_text"> Ayrıntı Seviyesi Oluştur: Yüksek </text> @@ -64,123 +55,64 @@ </text> </panel> <panel name="content2"> - <text name="optimize_performance_text"> - Performans - </text> - <text name="optimize_faster_rendering_text"> - Daha hızlı işleme -Daha az ayrıntı -Daha düşük prim ağırlığı - </text> - <text name="optimize_accuracy_text"> - Hassasiyet - </text> - <text name="optimize_slower_rendering_text"> - Daha yavaş işleme -Daha çok ayrıntı -Daha yüksek prim ağırlığı - </text> - <text name="accuracy_slider_mark1"> - ' - </text> - <text name="accuracy_slider_mark2"> - ' - </text> - <text name="accuracy_slider_mark3"> - ' - </text> <button label="Geometri hesaplarını tekrar yap" name="recalculate_geometry_btn"/> - <text name="geometry_preview_label"> + <text name="lod_label"> Geometri önizleme </text> <combo_box name="preview_lod_combo" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi"> - <combo_item name="preview_lod_high"> + <combo_item name="high"> Çok ayrıntı </combo_item> - <combo_item name="preview_lod_medium"> + <combo_item name="medium"> Orta düzey ayrıntı </combo_item> - <combo_item name="preview_lod_low"> + <combo_item name="low"> Az ayrıntı </combo_item> - <combo_item name="preview_lod_lowest"> + <combo_item name="lowest"> En az ayrıntı </combo_item> </combo_box> </panel> </panel> <panel name="physics_panel"> - <panel name="physics_header_panel"> - <text name="physics_header_text"> + <panel name="header_panel"> + <text name="header_text"> Fizik ayarlarını yap </text> </panel> - <text name="physics_hint"> + <text name="description"> Modelin dış gövdesi için bir şekil oluşturacağız. Modelinizin amacına uygun olarak şeklin ayrıntı seviyesini belirleyin. </text> - <panel name="physics_content_panel"> - <text name="physics_performance_text"> - Performans - </text> - <text name="physics_faster_rendering_text"> - Daha hızlı işleme -Daha az ayrıntı -Daha düşük prim ağırlığı - </text> - <text name="physics_accuracy_text"> - Hassasiyet - </text> - <text name="physics_slower_dendering_text"> - Daha yavaş işleme -Daha çok ayrıntı -Daha yüksek prim ağırlığı - </text> - <text name="physics_example_1"> - Örnekler: -Hareketli nesneler -Uçan nesneler -Araçlar - </text> - <text name="physics_example_2"> - Örnekler: -Küçük statik nesneler -Daha az ayrıntılı nesneler -Basit eşyalar - </text> - <text name="physics_example_3"> - Örnekler: -Statik nesneler -Ayrıntılı nesneler -Binalar - </text> + <panel name="content"> <button label="Fizik hesaplarını tekrar yap" name="recalculate_physics_btn"/> <button label="Tekrar hesaplanıyor..." name="recalculating_physics_btn"/> - <text name="physics_preview_label"> + <text name="lod_label"> Fizik önizleme </text> <combo_box name="preview_lod_combo2" tool_tip="Önizleme işlemesinde görülecek ayrıntı seviyesi"> - <combo_item name="preview_lod2_high"> + <combo_item name="high"> Çok ayrıntı </combo_item> - <combo_item name="preview_lod2_medium"> + <combo_item name="medium"> Orta düzey ayrıntı </combo_item> - <combo_item name="preview_lod2_low"> + <combo_item name="low"> Az ayrıntı </combo_item> - <combo_item name="preview_lod2_lowest"> + <combo_item name="lowest"> En az ayrıntı </combo_item> </combo_box> </panel> </panel> <panel name="review_panel"> - <panel name="review_header_panel"> - <text name="review_header_text"> + <panel name="header_panel"> + <text name="header_text"> İncele </text> </panel> - <panel name="review_content_panel"> + <panel name="content"> <text name="review_prim_equiv"> Parsele/bölgeye etkisi: [EQUIV] prim eşdeğerleri </text> @@ -193,8 +125,8 @@ Binalar </panel> </panel> <panel name="upload_panel"> - <panel name="upload_header_panel"> - <text name="upload_header_text"> + <panel name="header_panel"> + <text name="header_text"> Karşıya yükleme bitti </text> </panel> diff --git a/indra/newview/skins/default/xui/tr/floater_moveview.xml b/indra/newview/skins/default/xui/tr/floater_moveview.xml index 0d7c118f1e..74ed613a62 100644 --- a/indra/newview/skins/default/xui/tr/floater_moveview.xml +++ b/indra/newview/skins/default/xui/tr/floater_moveview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> +<floater name="move_floater" title="HAREKET ET"> <string name="walk_forward_tooltip"> İleri Yürü (Yukarı Okuna veya W'ye basın) </string> diff --git a/indra/newview/skins/default/xui/tr/floater_my_appearance.xml b/indra/newview/skins/default/xui/tr/floater_my_appearance.xml new file mode 100644 index 0000000000..4d71187a1f --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_my_appearance.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_appearance" title="GÖRÜNÜM"> + <panel label="Görünümü Düzenle" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_my_inventory.xml b/indra/newview/skins/default/xui/tr/floater_my_inventory.xml new file mode 100644 index 0000000000..8c62692a88 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_my_inventory.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_my_inventory" title="ENVANTER"/> diff --git a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml index 6570c4379c..6b12ad0ef5 100644 --- a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="YAKINDAKİ SOHBET"> - <check_box label="Sohbeti çevir (Google tarafından desteklenir)" name="translate_chat_checkbox"/> + <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/tr/floater_object_weights.xml b/indra/newview/skins/default/xui/tr/floater_object_weights.xml new file mode 100644 index 0000000000..b57943f666 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_object_weights.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="object_weights" title="GELİŞMİŞ"> + <floater.string name="nothing_selected" value="--"/> + <text name="selected_text" value="SEÇİLİ"/> + <text name="objects" value="--"/> + <text name="objects_label" value="Nesneler"/> + <text name="prims" value="--"/> + <text name="prims_label" value="Primler"/> + <text name="weights_of_selected_text" value="SEÇİLENLERİN AĞIRLIKLARI"/> + <text name="download" value="--"/> + <text name="download_label" value="Karşıdan yükle"/> + <text name="physics" value="--"/> + <text name="physics_label" value="Fizik"/> + <text name="server" value="--"/> + <text name="server_label" value="Sunucu"/> + <text name="display" value="--"/> + <text name="display_label" value="Ekran"/> + <text name="land_impacts_text" value="ARAZİ ETKİLERİ"/> + <text name="selected" value="--"/> + <text name="selected_label" value="Seçili"/> + <text name="rezzed_on_land" value="--"/> + <text name="rezzed_on_land_label" value="Arazide oluşturulmuş"/> + <text name="remaining_capacity" value="--"/> + <text name="remaining_capacity_label" value="Kalan kapasite"/> + <text name="total_capacity" value="--"/> + <text name="total_capacity_label" value="Toplam kapasite"/> + <text name="help_SLURL" value="[secondlife:///app/help/object_weights Bunların tümü ne?...]"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml index 849fdcdbbc..7a9f507c93 100644 --- a/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/tr/floater_outfit_save_as.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title="Dış Görünümü Kaydet"> +<floater name="modal container" title="DIŞ GÖRÜNÜMÜ KAYDET"> <button label="Kaydet" label_selected="Kaydet" name="Save"/> <button label="İptal" label_selected="İptal" name="Cancel"/> <text name="Save item as:"> diff --git a/indra/newview/skins/default/xui/tr/floater_people.xml b/indra/newview/skins/default/xui/tr/floater_people.xml new file mode 100644 index 0000000000..94a27bff57 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_people.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_people" title="KİŞİLER"> + <panel_container name="main_panel"> + <panel label="Grup Profili" name="panel_group_info_sidetray"/> + <panel label="Engellenmiş Sakinler ve Nesneler" name="panel_block_list_sidetray"/> + </panel_container> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_picks.xml b/indra/newview/skins/default/xui/tr/floater_picks.xml new file mode 100644 index 0000000000..513a2e319a --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_picks.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_picks" title="Seçmeler"/> diff --git a/indra/newview/skins/default/xui/tr/floater_places.xml b/indra/newview/skins/default/xui/tr/floater_places.xml new file mode 100644 index 0000000000..4e09a699f6 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_places.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_places" title="YERLER"> + <panel label="Yerler" name="main_panel"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_preview_texture.xml b/indra/newview/skins/default/xui/tr/floater_preview_texture.xml index 4548fbae64..79e184130a 100644 --- a/indra/newview/skins/default/xui/tr/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/tr/floater_preview_texture.xml @@ -34,7 +34,7 @@ <combo_item name="16:10"> 16:10 </combo_item> - <combo_item name="16:9" tool_tip="Profil favorileri"> + <combo_item name="16:9" tool_tip="Profil seçmeleri"> 16:9 </combo_item> <combo_item name="2:1"> diff --git a/indra/newview/skins/default/xui/tr/floater_sound_devices.xml b/indra/newview/skins/default/xui/tr/floater_sound_devices.xml index 99c3bea954..470a222d7e 100644 --- a/indra/newview/skins/default/xui/tr/floater_sound_devices.xml +++ b/indra/newview/skins/default/xui/tr/floater_sound_devices.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="Ses Aygıtları"> +<floater name="floater_sound_devices" title="SES CİHAZLARI"> <text name="voice_label"> Sesli Sohbet </text> diff --git a/indra/newview/skins/default/xui/tr/floater_stats.xml b/indra/newview/skins/default/xui/tr/floater_stats.xml index 2218060cc7..17f1166c46 100644 --- a/indra/newview/skins/default/xui/tr/floater_stats.xml +++ b/indra/newview/skins/default/xui/tr/floater_stats.xml @@ -10,8 +10,8 @@ </stat_view> <stat_view label="Gelişmiş" name="advanced"> <stat_view label="İşle" name="render"> - <stat_bar label="Çizilen Üçgenler" name="ktrisframe"/> - <stat_bar label="Çizilen Üçgenler" name="ktrissec"/> + <stat_bar label="Çerçeve Başına Çizilen Üçgenler" name="ktrisframe"/> + <stat_bar label="Saniyede Bir Çizilen Üçgenler" name="ktrissec"/> <stat_bar label="Toplam Nesne" name="objs"/> <stat_bar label="Yeni Nesne" name="newobjs"/> </stat_view> @@ -64,6 +64,14 @@ <stat_bar label="Aracı Süresi" name="simagentmsec"/> <stat_bar label="Görüntü Süresi" name="simimagesmsec"/> <stat_bar label="Komut Dosyası Süresi" name="simscriptmsec"/> + <stat_bar label="Yedek Zaman" name="simsparemsec"/> + <stat_view label="Zaman Ayrıntıları (ms)" name="timedetails"> + <stat_bar label="Fizik Adımı" name="simsimphysicsstepmsec"/> + <stat_bar label="Fizik Şekillerini Güncelle" name="simsimphysicsshapeupdatemsec"/> + <stat_bar label="Fizik Diğer" name="simsimphysicsothermsec"/> + <stat_bar label="Uyku Zamanı" name="simsleepmsec"/> + <stat_bar label="Pompa Giriş Çıkış" name="simpumpiomsec"/> + </stat_view> </stat_view> </stat_view> </container_view> diff --git a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml index 1ba9f8c2aa..4ef789f585 100644 --- a/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/tr/floater_texture_ctrl.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="FAVORİ: DOKU"> +<floater name="texture picker" title="SEÇME: DOKU"> <floater.string name="choose_picture"> Bir resim seçmek için tıklayın </floater.string> <floater.string name="pick title"> - Favori: + Seçme: </floater.string> <text name="Multiple"> Birden çok doku diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index 68c18d65e8..cd5e6b7fac 100644 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="İNŞA ARAÇLARI"> +<floater name="toolbox floater" short_title="İNŞA ET ARAÇLARI"> <floater.string name="status_rotate"> Nesneyi döndürmek için renkli bantları sürükleyin </floater.string> @@ -25,10 +25,10 @@ Araziyi seçmek için tıklayın ve sürükleyin </floater.string> <floater.string name="status_selectcount"> - [OBJ_COUNT] nesne ( [PRIM_COUNT] prim [PE_STRING] ) seçili + [OBJ_COUNT] nesne seçili, [LAND_IMPACT] arazi etkisi </floater.string> - <floater.string name="status_selectprimequiv"> - , [SEL_WEIGHT] prim eşdeğerleri + <floater.string name="status_remaining_capacity"> + Kalan kapasite [LAND_CAPACITY]. </floater.string> <button name="button focus" tool_tip="Odak"/> <button name="button move" tool_tip="Hareket Et"/> @@ -107,8 +107,8 @@ <text name="selection_empty"> Seçilen bir şey yok. </text> - <text name="selection_weight"> - Fizik ağırlığı [PHYS_WEIGHT], İşleme Maliyeti [DISP_WEIGHT]. + <text name="remaining_capacity"> + [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights Ek bilgi] </text> <tab_container name="Object Info Tabs"> <panel label="Genel" name="General"> @@ -321,7 +321,6 @@ Dikiş türü </text> <combo_box name="sculpt type control"> - <combo_box.item label="(hiçbiri)" name="None"/> <combo_box.item label="Küre" name="Sphere"/> <combo_box.item label="Torus" name="Torus"/> <combo_box.item label="Düzlem" name="Plane"/> diff --git a/indra/newview/skins/default/xui/tr/floater_toybox.xml b/indra/newview/skins/default/xui/tr/floater_toybox.xml new file mode 100644 index 0000000000..05d3633df0 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_toybox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Toybox" title="ARAÇ ÇUBUKLARINI ÖZELLEŞTİR"> + <text name="toybox label 1"> + Düğmeleri araç çubuklarına veya araç çubuklarından sürükleyerek ekleyin ya da kaldırın. + </text> + <text name="toybox label 2"> + Her bir araç çubuğunun ayarına göre düğmeler gösterilir veya sadece simgeleri yer alır. + </text> + <button label="Varsayılanları geri yükle" label_selected="Varsayılanları geri yükle" name="btn_restore_defaults"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_controls.xml b/indra/newview/skins/default/xui/tr/floater_voice_controls.xml index d5d6606e4e..dac05d8327 100644 --- a/indra/newview/skins/default/xui/tr/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/tr/floater_voice_controls.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_voice_controls" title="Ses Denetimleri"> +<floater name="floater_voice_controls" title="SES DENETİMLERİ"> <string name="title_nearby"> - YAKINDAKİ SES + Yakındaki ses </string> <string name="title_group"> - [GROUP] ile Grup Araması + [GROUP] ile grup araması </string> <string name="title_adhoc"> - Konferans Araması + Konferans araması </string> <string name="title_peer_2_peer"> [NAME] ile arama diff --git a/indra/newview/skins/default/xui/tr/floater_windlight_options.xml b/indra/newview/skins/default/xui/tr/floater_windlight_options.xml index 02910e2539..6c5fba374c 100644 --- a/indra/newview/skins/default/xui/tr/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/tr/floater_windlight_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="WindLight floater" title="GELİŞMİŞ GÖKYÜZÜ DÜZENLEYİCİ"> <floater.string name="WLDefaultSkyNames"> - A-12ÖÖ:A-12ÖS:A-3ÖÖ:A-3ÖS:A-4.30ÖS:A-6ÖÖ:A-6ÖS:A-9ÖÖ:A-9ÖS:Barselona:Tipi:Mavi Gün Ortası:Sahilde Öğleden Sonra:Sahilde Gün Batımı:Varsayılan:Çölde Gün Batımı:Güzel Bir Gün:Kabarık Büyük Bulutlar:Sisli:Şık Şık:Şık Şık Şık:Dondurma:Hayalet:Uygunsuz Gerçekler:Gün Ortası1:Gün Ortası 2:Gün Ortası 3:Gün Ortası 4:Gece:Korsan:Mor:Denizcinin Keyfi:Saf Tensel + A-12:A-24:A-3:A-15:A-16.30:A-6:A-18:A-9:A-21:Barselona:Tipi:Mavi Gün Ortası:Sahilde Öğleden Sonra:Sahilde Gün Batımı:Varsayılan:Çölde Gün Batımı:Güzel Bir Gün:Kabarık Büyük Bulutlar:Sisli:Şık Şık:Şık Şık Şık:Dondurma:Hayalet:Uygunsuz Gerçekler:Gün Ortası1:Gün Ortası 2:Gün Ortası 3:Gün Ortası 4:Gece:Korsan:Mor:Denizcinin Keyfi:Saf Tensel </floater.string> <text name="KeyFramePresetsText"> Gökyüzü Ön Ayarları: diff --git a/indra/newview/skins/default/xui/tr/menu_bottomtray.xml b/indra/newview/skins/default/xui/tr/menu_bottomtray.xml index c437669704..f17c0f9971 100644 --- a/indra/newview/skins/default/xui/tr/menu_bottomtray.xml +++ b/indra/newview/skins/default/xui/tr/menu_bottomtray.xml @@ -8,7 +8,7 @@ <menu_item_check label="İnşa Et düğmesi" name="ShowBuildButton"/> <menu_item_check label="Arama düğmesi" name="ShowSearchButton"/> <menu_item_check label="Harita düğmesi" name="ShowWorldMapButton"/> - <menu_item_check label="Mini-Harita düğmesi" name="ShowMiniMapButton"/> + <menu_item_check label="Mini-harita düğmesi" name="ShowMiniMapButton"/> <menu_item_call label="Kes" name="NearbyChatBar_Cut"/> <menu_item_call label="Kopyala" name="NearbyChatBar_Copy"/> <menu_item_call label="Yapıştır" name="NearbyChatBar_Paste"/> diff --git a/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml b/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml index 9ae433d8bb..cb9b678fdd 100644 --- a/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/tr/menu_gesture_gear.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="menu_gesture_gear"> - <menu_item_call label="Sık Kullanılanlara Ekle/Çıkar" name="activate"/> + <menu_item_call label="Favorilere Ekle/Çıkar" name="activate"/> <menu_item_call label="Kopyala" name="copy_gesture"/> <menu_item_call label="Yapıştır" name="paste"/> <menu_item_call label="UUID'yi Kopyala" name="copy_uuid"/> diff --git a/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml b/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml index d9b99e040b..d1f213516b 100644 --- a/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/tr/menu_hide_navbar.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="hide_navbar_menu"> - <menu_item_check label="Gezinme Çubuğunu Göster" name="ShowNavbarNavigationPanel"/> - <menu_item_check label="Sık Kullanılanlar Çubuğunu Göster" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Gezinme ve Favoriler Çubuğunu Göster" name="ShowNavbarNavigationPanel"/> + <menu_item_check label="Favoriler Çubuğunu Göster" name="ShowNavbarFavoritesPanel"/> <menu_item_check label="Mini Konum Çubuğunu Göster" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/tr/menu_landmark.xml b/indra/newview/skins/default/xui/tr/menu_landmark.xml index 17068d445d..c68a2f6a90 100644 --- a/indra/newview/skins/default/xui/tr/menu_landmark.xml +++ b/indra/newview/skins/default/xui/tr/menu_landmark.xml @@ -2,6 +2,6 @@ <toggleable_menu name="landmark_overflow_menu"> <menu_item_call label="SLurl'i Kopyala" name="copy"/> <menu_item_call label="Sil" name="delete"/> - <menu_item_call label="Favori Oluştur" name="pick"/> - <menu_item_call label="Sık Kullanılanlar Çubuğuna Ekle" name="add_to_favbar"/> + <menu_item_call label="Seçme Oluştur" name="pick"/> + <menu_item_call label="Favoriler Çubuğuna Ekle" name="add_to_favbar"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_login.xml b/indra/newview/skins/default/xui/tr/menu_login.xml index a726925bd3..4c3539b38b 100644 --- a/indra/newview/skins/default/xui/tr/menu_login.xml +++ b/indra/newview/skins/default/xui/tr/menu_login.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Login Menu"> <menu label="Ben" name="File"> - <menu_item_call label="Tercihler" name="Preferences..."/> + <menu_item_call label="Tercihler..." name="Preferences..."/> <menu_item_call label="[APP_NAME]'den Çık" name="Quit"/> </menu> <menu label="Yardım" name="Help"> diff --git a/indra/newview/skins/default/xui/tr/menu_picks_plus.xml b/indra/newview/skins/default/xui/tr/menu_picks_plus.xml index 0bd84fa88e..d9c4fefc97 100644 --- a/indra/newview/skins/default/xui/tr/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/tr/menu_picks_plus.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="picks_plus_menu"> - <menu_item_call label="Yeni Favori" name="create_pick"/> + <menu_item_call label="Yeni Seçme" name="create_pick"/> <menu_item_call label="Yeni İlan" name="create_classified"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_place.xml b/indra/newview/skins/default/xui/tr/menu_place.xml index 4ef7c01f09..ad167a328a 100644 --- a/indra/newview/skins/default/xui/tr/menu_place.xml +++ b/indra/newview/skins/default/xui/tr/menu_place.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="place_overflow_menu"> <menu_item_call label="Yer İmi Yap" name="landmark"/> - <menu_item_call label="Favori Oluştur" name="pick"/> + <menu_item_call label="Seçme Oluştur" name="pick"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml index 5282d9fec7..939ee2c7cb 100644 --- a/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/tr/menu_places_gear_landmark.xml @@ -15,5 +15,5 @@ <menu_item_call label="Tüm klasörleri genişlet" name="expand_all"/> <menu_item_call label="Tüm klasörleri daralt" name="collapse_all"/> <menu_item_check label="Tarihe Göre Sırala" name="sort_by_date"/> - <menu_item_call label="Favori Oluştur" name="create_pick"/> + <menu_item_call label="Seçme Oluştur" name="create_pick"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_slurl.xml b/indra/newview/skins/default/xui/tr/menu_slurl.xml index 03e3837ea0..73ac068b26 100644 --- a/indra/newview/skins/default/xui/tr/menu_slurl.xml +++ b/indra/newview/skins/default/xui/tr/menu_slurl.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="Popup"> <menu_item_call label="URL Hakkında" name="about_url"/> - <menu_item_call label="URL'ye Işınlan" name="teleport_to_url"/> + <menu_item_call label="URL'ye Işınla" name="teleport_to_url"/> <menu_item_call label="Harita" name="show_on_map"/> </menu> diff --git a/indra/newview/skins/default/xui/tr/menu_toolbars.xml b/indra/newview/skins/default/xui/tr/menu_toolbars.xml new file mode 100644 index 0000000000..7cb3192ec4 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_toolbars.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Toolbars Popup"> + <menu_item_call label="Düğmeleri seç..." name="Chose Buttons"/> + <menu_item_check label="Simgeler ve etiketler" name="icons_with_text"/> + <menu_item_check label="Sadece simgeler" name="icons_only"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index fa09e42a14..efeed833a5 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -1,27 +1,28 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu_bar name="Main Menu"> <menu label="Ben" name="Me"> - <menu_item_call label="Tercihler" name="Preferences"/> - <menu_item_call label="Kontrol Panelim" name="Manage My Account"/> - <menu_item_call label="L$ Satın Al" name="Buy and Sell L$"/> - <menu_item_call label="Profilim" name="Profile"/> - <menu_item_call label="Görünümüm" name="ChangeOutfit"/> - <menu_item_check label="Envanterim" name="Inventory"/> - <menu_item_check label="Envanterim" name="ShowSidetrayInventory"/> - <menu_item_check label="Mimiklerim" name="Gestures"/> - <menu_item_check label="Sesim" name="ShowVoice"/> + <menu_item_call label="Kontrol Paneli..." name="Manage My Account"/> + <menu_item_call label="Profil..." name="Profile"/> + <menu_item_call label="Görünüm..." name="ChangeOutfit"/> + <menu_item_check label="Envanter..." name="Inventory"/> + <menu_item_check label="Mimikler..." name="Gestures"/> + <menu_item_check label="Ses..." name="ShowVoice"/> <menu label="Hareket" name="Movement"> <menu_item_call label="Otur" name="Sit Down Here"/> <menu_item_check label="Uç" name="Fly"/> <menu_item_check label="Daima Koş" name="Always Run"/> <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/> </menu> - <menu label="Durumum" name="Status"> + <menu label="Durum" name="Status"> <menu_item_call label="Uzakta" name="Set Away"/> <menu_item_call label="Meşgul" name="Set Busy"/> </menu> <menu_item_call label="Yönetici Durumu Talep Et" name="Request Admin Options"/> <menu_item_call label="Yönetici Durumundan Ayrıl" name="Leave Admin Options"/> + <menu_item_call label="L$ Satın Al" name="Buy and Sell L$"/> + <menu_item_call label="Tercihler..." name="Preferences"/> + <menu_item_call label="Araç çubukları..." name="Toolbars"/> + <menu_item_call label="Tüm denetimleri sakla" name="Hide UI"/> <menu_item_call label="[APP_NAME]'den Çık" name="Quit"/> </menu> <menu label="İletişim Kur" name="Communicate"> @@ -32,7 +33,7 @@ <menu_item_check label="Yakındaki Ses" name="Nearby Voice"/> </menu> <menu label="Dünya" name="World"> - <menu_item_check label="Mini-Harita" name="Mini-Map"/> + <menu_item_check label="Mini-harita" name="Mini-Map"/> <menu_item_check label="Dünya Haritası" name="World Map"/> <menu_item_check label="Ara" name="Search"/> <menu_item_call label="Anlık Görüntü" name="Take Snapshot"/> @@ -55,7 +56,7 @@ <menu_item_check label="Parsel Özellikleri" name="Parcel Properties"/> <menu_item_check label="Gelişmiş Menü" name="Show Advanced Menu"/> </menu> - <menu_item_call label="Ana Konuma Işınlan" name="Teleport Home"/> + <menu_item_call label="Ana Konuma Işınla" name="Teleport Home"/> <menu_item_call label="Ana Konumu Burası Olarak Seç" name="Set Home to Here"/> <menu label="Güneş" name="Environment Settings"> <menu_item_call label="Gün Doğumu" name="Sunrise"/> @@ -144,7 +145,6 @@ </menu> <menu label="Yardım" name="Help"> <menu_item_call label="[SECOND_LIFE] Yardımı" name="Second Life Help"/> - <menu_item_check label="İpuçlarını Etkinleştir" name="Enable Hints"/> <menu_item_call label="Kötüye Kullanımı Bildir" name="Report Abuse"/> <menu_item_call label="Hata Bildir" name="Report Bug"/> <menu_item_call label="[APP_NAME] Hakkında" name="About Second Life"/> @@ -160,7 +160,7 @@ <menu label="Performans Araçları" name="Performance Tools"> <menu_item_call label="Gecikme Ölçer" name="Lag Meter"/> <menu_item_check label="İstatistik Çubuğu" name="Statistics Bar"/> - <menu_item_check label="Avatar İşlemi Maaliyetini Göster" name="Avatar Rendering Cost"/> + <menu_item_check label="Avatarlar İçin Çizim Ağırlığını Göster" name="Avatar Rendering Cost"/> </menu> <menu label="Vurgulama ve Görünürlük" name="Highlighting and Visibility"> <menu_item_check label="Yanıp Sönen İşaret" name="Cheesy Beacon"/> @@ -288,6 +288,7 @@ <menu_item_check label="Işıklar" name="Lights"/> <menu_item_check label="Çarpışma İskeleti" name="Collision Skeleton"/> <menu_item_check label="Işın Yayını" name="Raycast"/> + <menu_item_check label="İşleme Karmaşıklığı" name="rendercomplexity"/> <menu_item_check label="Şekillendir" name="Sculpt"/> </menu> <menu label="İşleme" name="Rendering"> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 5eff0cf570..a268c103a6 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -189,7 +189,7 @@ Bu Yetenek '[ROLE_NAME]' rolüne eklensin mi? <usetemplate ignoretext="Aksesuarları çıkarmadan önce doğrulama iste" name="okcancelignore" notext="Hayır" yestext="Evet"/> </notification> <notification name="JoinGroupCanAfford"> - Bu gruba katılmanın maliyeti: [COST] L$. + Bu gruba katılmanın maliyeti: L$ [COST]. Devam etmek istiyor musunuz? <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Katıl"/> </notification> @@ -199,33 +199,33 @@ Devam etmek istiyor musunuz? <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Katıl"/> </notification> <notification name="JoinGroupCannotAfford"> - Bu gruba katılmanın maliyeti: [COST] L$. + Bu gruba katılmanın maliyeti: L$ [COST]. Bu gruba katılmak için yeterli L$'na sahip değilsiniz. </notification> <notification name="CreateGroupCost"> - Bu grubu oluşturmanın maliyeti: 100 L$. + Bu grubu oluşturmanın maliyeti: L$ 100. Grupların birden fazla üyeye sahip olması gereklidir, aksi takdirde grup kalıcı olarak silinir. Lütfen 48 saat içinde diğer üyeleri davet edin. - <usetemplate canceltext="İptal" name="okcancelbuttons" notext="İptal" yestext="100 L$ ödeyerek grubu oluştur"/> + <usetemplate canceltext="İptal" name="okcancelbuttons" notext="İptal" yestext="L$ 100 ödeyerek grubu oluştur"/> </notification> <notification name="LandBuyPass"> - [COST] L$ ödeyerek ('[PARCEL_NAME]') arazisine [TIME] saat süreyle girebilirsiniz. Giriş hakkı satın almak istiyor musunuz? + L$ [COST] ödeyerek ('[PARCEL_NAME]') arazisine [TIME] saat süreyle girebilirsiniz. Giriş hakkı satın almak istiyor musunuz? <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="SalePriceRestriction"> - Herhangi birine satış yaparken satış fiyatı 0 L$'ndan daha yüksek bir değere ayarlanmalıdır. -0 L$ fiyatla satış yapıyorsanız lütfen satışın yapılacağı kişiyi seçin. + Herhangi birine satış yaparken satış fiyatı L$ 0'dan daha yüksek bir değere ayarlanmalıdır. +L$ 0 fiyatla satış yapıyorsanız lütfen satışın yapılacağı kişiyi seçin. </notification> <notification name="ConfirmLandSaleChange"> Seçili [LAND_SIZE] m² arazi satışa çıkarılmak üzere ayarlanıyor. -Satış fiyatınız [SALE_PRICE] L$ olacak ve [NAME] için satışa açık olacaktır. +Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olacaktır. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="ConfirmLandSaleToAnyoneChange"> DİKKAT: 'Herkes için satışa açık' seçeneğinin tıklanması, arazinizi tüm [SECOND_LIFE] topluluğuna açık hale getirir, bu bölgede bulunmayanlar da buna dahildir. Seçili [LAND_SIZE] m² arazi satışa çıkarılmak üzere ayarlanıyor. -Satış fiyatınız [SALE_PRICE] L$ olacak ve [NAME] için satışa açık olacaktır. +Satış fiyatınız L$ [SALE_PRICE] olacak ve [NAME] için satışa açık olacaktır. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="ReturnObjectsDeededToGroup"> @@ -365,7 +365,7 @@ Devam etmek istediğinize emin misiniz? <usetemplate name="okbutton" yestext="Tamam"/> </notification> <notification name="DeleteAvatarPick"> - Favori <nolink>[PICK]</nolink> silinsin mi? + Seçme <nolink>[PICK]</nolink> silinsin mi? <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="DeleteOutfits"> @@ -1008,7 +1008,7 @@ bu simdeki TÜM ARAZİLERDEN SİLMEK istediğinize emin misiniz? İlanınız için bir ad belirtmelisiniz. </notification> <notification name="MinClassifiedPrice"> - Listeleme için ödenmesi gereken tutar en az [MIN_PRICE] L$ olmalıdır. + Listeleme için ödenmesi gereken tutar en az L$ [MIN_PRICE] olmalıdır. Lütfen daha yüksek bir tutar girin. </notification> @@ -1586,7 +1586,7 @@ Lütfen daha sonra tekrar deneyin. </notification> <notification name="TeleportToPick"> [PICK] konumuna ışınlanılsın mı? - <usetemplate ignoretext="Favori sekmesindeki bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/> + <usetemplate ignoretext="Seçme sekmesindeki bir konuma ışınlanma istediğimde doğrulama iste" name="okcancelignore" notext="İptal Et" yestext="Işınla"/> </notification> <notification name="TeleportToClassified"> [CLASSIFIED] konumuna ışınlanılsın mı? @@ -1766,7 +1766,7 @@ Erişkinlik Seviyesi tercihinizi şimdi yükseltmek ve araziye girebilmek için <notification name="PublishClassified"> Hatırla: İlan ücretleri iade edilmez. -Şimdi [AMOUNT] L$ ödeyerek bu ilanı yayınlamak istiyor musunuz? +Şimdi L$ [AMOUNT] ödeyerek bu ilanı yayınlamak istiyor musunuz? <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="SetClassifiedMature"> @@ -1810,7 +1810,7 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin. Lütfen sadece bir nesne seçin ve tekrar deneyin. </notification> <notification name="BuyOriginal"> - Özgün nesne [OWNER] kullanıcısından [PRICE] L$ karşılığında satın alınsın mı? + Özgün nesne [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı? Nesnenin sahibi siz olacaksınız. Şu işlemleri yapabileceksiniz: Değiştirme: [MODIFYPERM] @@ -1819,7 +1819,7 @@ Nesnenin sahibi siz olacaksınız. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="BuyOriginalNoOwner"> - Özgün nesne PRICE] L$ karşılığında satın alınsın mı? + Özgün nesne L$ [PRICE] karşılığında satın alınsın mı? Nesnenin sahibi siz olacaksınız. Şu işlemleri yapabileceksiniz: Değiştirme: [MODIFYPERM] @@ -1828,7 +1828,7 @@ Nesnenin sahibi siz olacaksınız. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="BuyCopy"> - Bir kopyası [OWNER] kullanıcısından [PRICE] L$ karşılığında satın alınsın mı? + Bir kopyası [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı? Nesne envanterinize kopyalanacak. Şu işlemleri yapabileceksiniz: Değiştirme: [MODIFYPERM] @@ -1837,7 +1837,7 @@ Nesne envanterinize kopyalanacak. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="BuyCopyNoOwner"> - Bir kopyası [PRICE] L$ karşılığında satın alınsın mı? + Bir kopyası L$ [PRICE] karşılığında satın alınsın mı? Nesne envanterinize kopyalanacak. Şu işlemleri yapabileceksiniz: Değiştirme: [MODIFYPERM] @@ -1846,12 +1846,12 @@ Nesne envanterinize kopyalanacak. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="BuyContents"> - İçerik [OWNER] kullanıcısından [PRICE] L$ karşılığında satın alınsın mı? + İçerik [OWNER] kullanıcısından L$ [PRICE] karşılığında satın alınsın mı? İçerik envanterinize kopyalanacak. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> <notification name="BuyContentsNoOwner"> - İçerik [PRICE] L$ karşılığında satın alınsın mı? + İçerik L$ [PRICE] karşılığında satın alınsın mı? İçerik envanterinize kopyalanacak. <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> @@ -1875,7 +1875,7 @@ Lütfen parolanızı yeniden girin ve Tamam'ı tıklatın. </notification> <notification name="SetPickLocation"> Not: -Bu favorinin konumunu güncellediniz fakat diğer detaylar özgün değerlerini koruyacak. +Bu seçmenin konumunu güncellediniz fakat diğer detaylar özgün değerlerini koruyacak. <usetemplate name="okbutton" yestext="Tamam"/> </notification> <notification name="MoveInventoryFromObject"> @@ -1909,6 +1909,12 @@ Envanter öğesi/öğeleri taşınsın mı? Çıkmak istediğinize emin misiniz? <usetemplate ignoretext="Çıkmadan önce doğrulama iste" name="okcancelignore" notext="Çıkma" yestext="Çık"/> </notification> + <notification name="ConfirmRestoreToybox"> + Varsayılan düğmelerinizi ve araç çubuklarınızı geri yüklemek istediğinize emin misiniz? + +Bu eylemi geri alamazsınız. + <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> + </notification> <notification name="DeleteItems"> [QUESTION] <usetemplate ignoretext="Öğeleri silmeden önce doğrulama iste" name="okcancelignore" notext="İptal" yestext="Tamam"/> @@ -2126,7 +2132,7 @@ Bu adımda web tarayıcınızın başlatılacağına dikkat edin. (Yaklaşık 5 dakika sürecektir.) </notification> <notification name="UploadPayment"> - Karşıya yüklemek için [AMOUNT] L$ ödediniz. + Karşıya yüklemek için L$ [AMOUNT] ödediniz. </notification> <notification name="UploadWebSnapshotDone"> Web sitesinde yer alan anlık görüntülerin karşıya yüklenmesi tamamlandı. @@ -2473,7 +2479,7 @@ Lütfen biraz sonra tekrar deneyin. [MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> - <button name="Teleport" text="Işınlan"/> + <button name="Teleport" text="Işınla"/> <button name="Cancel" text="İptal"/> </form> </notification> @@ -2995,10 +3001,6 @@ Görünümünüzü döndürmek için dünya üzerindeki herhangi bir yeri tıkla <button name="cancel" text="İptal Et"/> </form> </notification> - <notification label="" name="ModeChange"> - Mod değiştirme, uygulamadan çıkıp yeniden başlatmanızı gerektiriyor. - <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/> - </notification> <notification label="" name="NoClassifieds"> İlan oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir. <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/> @@ -3012,7 +3014,7 @@ Görünümünüzü döndürmek için dünya üzerindeki herhangi bir yeri tıkla <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/> </notification> <notification label="" name="NoPicks"> - Favorileri oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir. + Seçmeleri oluşturma ve düzenleme sadece Gelişmiş modda kullanılabilir. Uygulamadan çıkıp, mod değiştirmek ister misiniz? Mod seçici oturum açma ekranında bulunabilir. <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/> </notification> <notification label="" name="NoWorldMap"> @@ -3043,6 +3045,10 @@ Görünümünüzü döndürmek için dünya üzerindeki herhangi bir yeri tıkla Arama sadece Gelişmiş modda kullanılabilir. Oturumunuzu kapatıp, mod değiştirmek ister misiniz? <usetemplate name="okcancelbuttons" notext="Çıkma" yestext="Çık"/> </notification> + <notification label="" name="ConfirmHideUI"> + Bu eylem tüm menü öğelerini ve düğmelerini gizler. Bunları geri almak için [SHORTCUT] üzerine tekrar tıklayın. + <usetemplate ignoretext="KA'ni gizlemeden önce onayla" name="okcancelignore" notext="İptal" yestext="Tamam"/> + </notification> <global name="UnsupportedGLRequirements"> [APP_NAME] uygulaması için gerekli donanım gereksinimlerine sahip olmadığınız görünüyor. [APP_NAME] çoklu doku desteği sunan bir OpenGL grafik kartı gerektiriyor. Eğer grafik kartınız bu özellikteyse, grafik kartınızın en son sürücülerine ve işletim sisteminiz için gerekli Service Pack ve yamalara sahip olup olmadığınızı kontrol etmeyi deneyebilirsiniz. diff --git a/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml new file mode 100644 index 0000000000..a1e8190bbc --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_chiclet_bar.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chiclet_bar"> + <layout_stack name="toolbar_stack"> + <layout_panel name="im_well_panel"> + <chiclet_im_well name="im_well"> + <button name="Unread IM messages" tool_tip="Sohbetler"/> + </chiclet_im_well> + </layout_panel> + <layout_panel name="notification_well_panel"> + <chiclet_notification name="notification_well"> + <button name="Unread" tool_tip="Bildirimler"/> + </chiclet_notification> + </layout_panel> + </layout_stack> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_edit_pick.xml b/indra/newview/skins/default/xui/tr/panel_edit_pick.xml index 446beb6eb8..98b02d27df 100644 --- a/indra/newview/skins/default/xui/tr/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/tr/panel_edit_pick.xml @@ -4,7 +4,7 @@ (kaydedildikten sonra güncelleştirilir) </panel.string> <text name="title"> - Favori Düzenle + Seçme Düzenle </text> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> @@ -27,7 +27,7 @@ <panel label="bottom_panel" name="bottom_panel"> <layout_stack name="layout_stack1"> <layout_panel name="layout_panel1"> - <button label="Favori Kaydet" name="save_changes_btn"/> + <button label="Seçme Kaydet" name="save_changes_btn"/> </layout_panel> <layout_panel name="layout_panel2"> <button label="İptal" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/tr/panel_landmarks.xml b/indra/newview/skins/default/xui/tr/panel_landmarks.xml index 7543decb36..d40d0c1543 100644 --- a/indra/newview/skins/default/xui/tr/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/tr/panel_landmarks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Landmarks"> <accordion name="landmarks_accordion"> - <accordion_tab name="tab_favorites" title="Sık Kullanılanlar çubuğu"/> + <accordion_tab name="tab_favorites" title="Favoriler çubuğu"/> <accordion_tab name="tab_landmarks" title="Yer İmlerim"/> <accordion_tab name="tab_inventory" title="Envanterim"/> <accordion_tab name="tab_library" title="Kütüphane"/> diff --git a/indra/newview/skins/default/xui/tr/panel_me.xml b/indra/newview/skins/default/xui/tr/panel_me.xml index dcf4f19be2..4b911c9ce6 100644 --- a/indra/newview/skins/default/xui/tr/panel_me.xml +++ b/indra/newview/skins/default/xui/tr/panel_me.xml @@ -1,7 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Profilim" name="panel_me"> - <tab_container name="tabs"> - <panel label="PROFİLİM" name="panel_profile"/> - <panel label="FAVORİLERİM" name="panel_picks"/> - </tab_container> + <panel label="SEÇMELERİM" name="panel_picks"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml index b28036228f..8d43e3fb5a 100644 --- a/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/tr/panel_navigation_bar.xml @@ -1,18 +1,23 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="navigation_bar"> - <panel name="navigation_panel"> - <pull_button name="back_btn" tool_tip="Önceki konuma geri git"/> - <pull_button name="forward_btn" tool_tip="Bir konum ileri git"/> - <button name="home_btn" tool_tip="Ana konumuma ışınla"/> - <location_input label="Konum" name="location_combo"/> - <search_combo_box label="Ara" name="search_combo_box" tool_tip="Ara"> - <combo_editor label="[SECOND_LIFE] içinde arama yap" name="search_combo_editor"/> - </search_combo_box> - </panel> - <favorites_bar name="favorite" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!"> - <label name="favorites_bar_label" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!"> - Sık Kullanılanlar Çubuğu - </label> - <chevron_button name=">>" tool_tip="Sık Kullanılanlarımdan daha çok göster"/> - </favorites_bar> + <layout_stack name="nvp_stack"> + <layout_panel name="navigation_layout_panel"> + <panel name="navigation_panel"> + <pull_button name="back_btn" tool_tip="Önceki konuma geri git"/> + <pull_button name="forward_btn" tool_tip="Bir konum ileri git"/> + <button name="home_btn" tool_tip="Ana konumuma ışınla"/> + <location_input label="Konum" name="location_combo"/> + </panel> + </layout_panel> + <layout_panel name="favorites_layout_panel"> + <favorites_bar name="favorite" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!"> + <label name="favorites_bar_label" tool_tip="Second Life içerisinde sık kullandığınız yerlere hızla erişmek için Yer İmlerini buraya sürükleyin!"> + Favoriler Çubuğu + </label> + <more_button name=">>" tool_tip="Favorilerimden daha çok göster"> + Daha Fazla ▼ + </more_button> + </favorites_bar> + </layout_panel> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml new file mode 100644 index 0000000000..c405105e00 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="nearby_chat"> + <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml b/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml index cc9f531831..00cd49abcd 100644 --- a/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/tr/panel_outfit_edit.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <!-- Side tray Outfit Edit panel --> <panel name="outfit_edit"> - <string name="No Outfit" value="Kıyafet Yok"/> + <string name="No Outfit" value="Dış Görünüm Yok"/> <string name="unsaved_changes" value="Kaydedilmemiş Değişiklikler"/> <string name="now_editing" value="Şimdi Düzenleniyor"/> <panel.string name="not_available"> @@ -20,7 +20,7 @@ <panel name="header_panel"> <panel name="outfit_name_and_status"> <text name="status" value="Şimdi düzenleniyor..."/> - <text name="curr_outfit_name" value="[Mevcut Kıyafet]"/> + <text name="curr_outfit_name" value="[Mevcut Dış Görünüm]"/> </panel> </panel> <layout_stack name="im_panels"> diff --git a/indra/newview/skins/default/xui/tr/panel_outfits_list.xml b/indra/newview/skins/default/xui/tr/panel_outfits_list.xml index 12892e1642..60a3576d84 100644 --- a/indra/newview/skins/default/xui/tr/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/tr/panel_outfits_list.xml @@ -6,6 +6,6 @@ </accordion> <panel name="bottom_panel"> <menu_button name="options_gear_btn" tool_tip="İlave seçenekleri göster"/> - <button name="trash_btn" tool_tip="Seçili kıyafeti sil"/> + <button name="trash_btn" tool_tip="Seçili dış görünümü sil"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml index 96701fbd84..7d42e3ab79 100644 --- a/indra/newview/skins/default/xui/tr/panel_people.xml +++ b/indra/newview/skins/default/xui/tr/panel_people.xml @@ -3,7 +3,7 @@ <panel label="Kişiler" name="people_panel"> <string name="no_recent_people" value="Yakın zamanlı kişi yok. Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/search/people Arayı] veya [secondlife:///app/worldmap Dünya Haritasını] deneyin."/> <string name="no_filtered_recent_people" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin."/> - <string name="no_one_near" value="Yakında kimse yok. Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/search/people Arayı] veya [secondlife:///app/worldmap Dünya Haritasını] deneyin."/> + <string name="no_one_near" value="Yakında kimse yok. Birlikte takılacak kişiler mi arıyorsunuz? [secondlife:///app/search/people Arayın] veya [secondlife:///app/worldmap Dünya Haritasını] deneyin."/> <string name="no_one_filtered_near" value="Aradığınızı bulamadınız mı? [secondlife:///app/search/people/[SEARCH_TERM] Ara] deneyin."/> <string name="no_friends_online" value="Çevrimiçi arkadaş yok"/> <string name="no_friends" value="Arkadaş yok"/> diff --git a/indra/newview/skins/default/xui/tr/panel_picks.xml b/indra/newview/skins/default/xui/tr/panel_picks.xml index a36f3faf03..26beac7854 100644 --- a/indra/newview/skins/default/xui/tr/panel_picks.xml +++ b/indra/newview/skins/default/xui/tr/panel_picks.xml @@ -1,22 +1,22 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Favorilerim" name="panel_picks"> - <string name="no_picks" value="Favori Yok"/> + <string name="no_picks" value="Seçme Yok"/> <string name="no_classifieds" value="İlan Yok"/> <accordion name="accordion"> - <accordion_tab name="tab_picks" title="Favorilerim"/> + <accordion_tab name="tab_picks" title="Seçmelerim"/> <accordion_tab name="tab_classifieds" title="İlanlar"/> </accordion> <panel label="bottom_panel" name="edit_panel"> <layout_stack name="edit_panel_ls"> <layout_panel name="gear_menu_btn"> - <button name="new_btn" tool_tip="Mevcut konumda yeni bir favori veya ilan oluşturun"/> + <button name="new_btn" tool_tip="Mevcut konumda yeni bir seçme veya ilan oluşturun"/> </layout_panel> </layout_stack> </panel> <panel name="buttons_cucks"> <layout_stack name="buttons_cucks_ls"> <layout_panel name="info_btn_lp"> - <button label="Bilgi" name="info_btn" tool_tip="Favori bilgilerini göster"/> + <button label="Bilgi" name="info_btn" tool_tip="Seçme bilgilerini göster"/> </layout_panel> <layout_panel name="teleport_btn_lp"> <button label="Işınla" name="teleport_btn" tool_tip="İlişkili alana ışınlanın"/> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index bb7e6da68c..9c9e960715 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -30,7 +30,7 @@ <spinner label="Yakındaki sohbet iletilerinin vurgulanma süresi:" name="nearby_toasts_lifetime"/> <spinner label="Yakındaki sohbet iletilerinin sönme süresi:" name="nearby_toasts_fadingtime"/> <text name="translate_chb_label"> - Sohbet ederken makine çevirisi kullanılsın (Google tarafından desteklenir) + Sohbet ederken makine çevirisi kullanılsın </text> <text name="translate_language_text"> Sohbeti şu dile çevir: @@ -50,7 +50,7 @@ <combo_box.item label="Русский (Rusça)" name="Russian"/> <combo_box.item label="Türkçe (Türkçe)" name="Turkish"/> <combo_box.item label="Українська (Ukraynaca)" name="Ukrainian"/> - <combo_box.item label="中文 (简体) (Çince)" name="Chinese"/> + <combo_box.item label="中文 (正體) (Çince)" name="Chinese"/> <combo_box.item label="日本語 (Japonca)" name="Japanese"/> <combo_box.item label="한국어 (Korece)" name="Korean"/> </combo_box> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml index bd651049d0..fbfc07c4b8 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml @@ -5,16 +5,18 @@ </text> <combo_box name="language_combobox"> <combo_box.item label="Sistem varsayılanı" name="System Default Language"/> - <combo_box.item label="İngilizce" name="English"/> + <combo_box.item label="English (İngilizce)" name="English"/> <combo_box.item label="Dansk (Danca) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Almanca) - Beta" name="Deutsch(German)"/> <combo_box.item label="Español (İspanyolca) - Beta" name="Spanish"/> <combo_box.item label="Français (Fransızca) - Beta" name="French"/> <combo_box.item label="Italiano (İtalyanca) - Beta" name="Italian"/> - <combo_box.item label="Nederlands (Felemekçe) - Beta" name="Dutch"/> <combo_box.item label="Polski (Lehçe) - Beta" name="Polish"/> <combo_box.item label="Português (Portekizce) - Beta" name="Portugese"/> + <combo_box.item label="Русский (Rusça) - Beta" name="Russian"/> + <combo_box.item label="Türkçe - Beta" name="Turkish"/> <combo_box.item label="日本語 (Japonca) - Beta" name="(Japanese)"/> + <combo_box.item label="正體中文 (Geleneksel Çince) - Beta" name="Traditional Chinese"/> </combo_box> <text name="language_textbox2"> (Yeniden başlatma gerekir) diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_move.xml b/indra/newview/skins/default/xui/tr/panel_preferences_move.xml index da102b078c..c35eaec9c3 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_move.xml @@ -7,18 +7,33 @@ </text> <check_box label="İnşa Et/Düzenle" name="edit_camera_movement" tool_tip="Düzenleme moduna girerken ve düzenleme modundan çıkarken otomatik kamera konumunu kullanın"/> <check_box label="Görünüm" name="appearance_camera_movement" tool_tip="Düzenleme modundayken otomatik kamera konumunu kullan"/> - <check_box initial_value="true" label="Kenar çubuğu" name="appearance_sidebar_positioning" tool_tip="Kenar çubuğu için otomatik kamera konumunu kullan"/> + <text name="keyboard_lbl"> + Klavye: + </text> + <check_box label="Ok tuşları beni her zaman hareket ettirir" name="arrow_keys_move_avatar_check"/> + <check_box label="Koşmak için iki kez dokun ve tut" name="tap_tap_hold_to_run"/> + <text name="mouse_lbl"> + Fare: + </text> <check_box label="Fare üzerinden görünümde beni göster" name="first_person_avatar_visible"/> <text name=" Mouse Sensitivity"> Fare üzerinden görünümde fare hassasiyeti </text> <check_box label="Tersine çevir" name="invert_mouse"/> - <check_box label="Ok tuşları beni her zaman hareket ettirir" name="arrow_keys_move_avatar_check"/> - <check_box label="Koşmak için iki kez dokun ve tut" name="tap_tap_hold_to_run"/> - <check_box label="Çift Tıklayınca şunu yap:" name="double_click_chkbox"/> - <radio_group name="double_click_action"> - <radio_item label="Işınla" name="radio_teleport"/> - <radio_item label="Otomatik pilot" name="radio_autopilot"/> - </radio_group> + <text name="single_click_action_lbl"> + Arazi üzerine tek tıklama: + </text> + <combo_box name="single_click_action_combo"> + <combo_box.item label="Eylem yok" name="0"/> + <combo_box.item label="Tıklanan noktaya hareket et" name="1"/> + </combo_box> + <text name="double_click_action_lbl"> + Arazi üzerine çift tıklama: + </text> + <combo_box name="double_click_action_combo"> + <combo_box.item label="Eylem yok" name="0"/> + <combo_box.item label="Tıklanan noktaya hareket et" name="1"/> + <combo_box.item label="Tıklanan noktaya ışınla" name="2"/> + </combo_box> <button label="Diğer Aygıtlar" name="joystick_setup_button"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml index 38fa8ab7f9..e76616f667 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_privacy.xml @@ -11,7 +11,7 @@ <check_box label="Çevrimiçi olduğumu sadece arkadaşlar ve gruplar bilsin" name="online_visibility"/> <check_box label="Sadece arkadaşlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/> <check_box label="Aramaları sonlandırırken mikrofonu kapat" name="auto_disengage_mic_check"/> - <check_box label="Oturum Açarken Sık Kullanılan Yer İmlerimi Göster ('Buradan başla' açılır menüsünden)" name="favorites_on_login_check"/> + <check_box label="Oturum Açarken Favori Yer İmlerimi Göster ('Buradan başla' açılır menüsünden)" name="favorites_on_login_check"/> <text name="Logs:"> Sohbet Günlükleri: </text> diff --git a/indra/newview/skins/default/xui/tr/panel_profile_view.xml b/indra/newview/skins/default/xui/tr/panel_profile_view.xml index c5cee39b70..17c5002bd7 100644 --- a/indra/newview/skins/default/xui/tr/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/tr/panel_profile_view.xml @@ -14,7 +14,7 @@ <text name="user_label" value="Kullanıcı Adı:"/> <tab_container name="tabs"> <panel label="PROFİL" name="panel_profile"/> - <panel label="FAVORİLER" name="panel_picks"/> + <panel label="SEÇMELER" name="panel_picks"/> <panel label="NOTLAR & GİZLİLİK" name="panel_notes"/> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml index a7491e9c88..63726b94e2 100644 --- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml @@ -17,12 +17,9 @@ </panel.string> <panel name="balance_bg"> <text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$20"/> - <button label="L$ SATIN AL" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/> + <button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/> + <button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç"/> </panel> - <combo_box name="mode_combo" tool_tip="Modunuzu seçin. Hızlı ve kolay keşif yapmak ile sohbet etmek için Temel seçimini yapın. Daha fazla özelliğe erişmek için Gelişmiş seçimini yapın."> - <combo_box.item label="Temel Mod" name="Basic"/> - <combo_box.item label="Gelişmiş Mod" name="Advanced"/> - </combo_box> <text name="TimeText" tool_tip="Geçerli zaman (Pasifik)"> 24:00 AM PST </text> diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml index 002589b276..18f7d6dca2 100644 --- a/indra/newview/skins/default/xui/tr/role_actions.xml +++ b/indra/newview/skins/default/xui/tr/role_actions.xml @@ -53,10 +53,10 @@ <action description="Gruba ait olmayan nesneleri iade et" longdescription="Grubun sahip olduğu parseller üzerinde gruba ait olmayan nesneleri Arazi Hakkında > Nesneler sekmesinden iade edin." name="land return non group" value="34"/> <action description="Linden bitkilerini kullanarak bahçe düzenleme" longdescription="Linden ağaçlarını, bitkilerini ve çimleri yerleştirerek veya yerlerini değiştirerek bahçe düzenleme yeteneği. Bu öğeler envanterinizin Kütüphane > Nesneler klasörü içinde bulunabilir veya İnşa Et menüsünden oluşturulabilir." name="land gardening" value="35"/> </action_set> - <action_set description="Bu Yeteneklere grubun sahip olduğu nesneleri devretme, değiştirme ve satma güçleri de dahildir. Bu değişiklikler İnşa Araçları > Genel sekmesinden yapılabilir. Bir nesneyi sağ tıklatıp Düzenle'yi seçerek ayarlarını görebilirsiniz." name="Object Management"> - <action description="Nesneleri gruba devret" longdescription="Nesneleri İnşa Araçları > Genel sekmesinden gruba devredin." name="object deed" value="36"/> - <action description="Grubun sahip olduğu nesneleri kullan (taşı, kopyala, değiştir)" longdescription="Grubun sahip olduğu nesneleri, İnşa Araçları > Genel sekmesi üzerinden kullanın (taşıyın, kopyalayın, değiştirin)." name="object manipulate" value="38"/> - <action description="Grubun sahip olduğu nesneleri satışa çıkar" longdescription="Grubun sahip olduğu nesneleri İnşa Araçları > Genel sekmesinden satışa çıkarın." name="object set sale" value="39"/> + <action_set description="Bu Yeteneklere grubun sahip olduğu nesneleri devretme, değiştirme ve satma güçleri de dahildir. Bu değişiklikler İnşa Et Araçları > Genel sekmesinden yapılabilir. Bir nesneyi sağ tıklatıp Düzenle'yi seçerek ayarlarını görebilirsiniz." name="Object Management"> + <action description="Nesneleri gruba devret" longdescription="Nesneleri İnşa Et Araçları > Genel sekmesinden gruba devredin." name="object deed" value="36"/> + <action description="Grubun sahip olduğu nesneleri kullan (taşı, kopyala, değiştir)" longdescription="Grubun sahip olduğu nesneleri, İnşa Et Araçları > Genel sekmesi üzerinden kullanın (taşıyın, kopyalayın, değiştirin)." name="object manipulate" value="38"/> + <action description="Grubun sahip olduğu nesneleri satışa çıkar" longdescription="Grubun sahip olduğu nesneleri İnşa Et Araçları > Genel sekmesinden satışa çıkarın." name="object set sale" value="39"/> </action_set> <action_set description="Bu Yeteneklere Üyelerin grup borçlarını ödemesini ve grup kâr paylarını almasını sağlayan ve grup hesabının geçmiş bilgilerine erişimi sınırlandıran güçler de dahildir." name="Accounting"> <action description="Grup borçlarını öde ve grup kâr paylarını al" longdescription="Bu Yeteneğe sahip bir Roldeki Üyeler otomatik olarak grup borçlarını ödeyecek ve grup kâr paylarını alacaktır. Bu da grubun sahip olduğu arazi satışlarından kendilerine düşen ve günlük olarak dağıtılan ksımı alacakları gibi parsel için ilan verme ücreti gibi masraflara da katkıda bulunacakları anlamına gelir." name="accounting accountable" value="40"/> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml b/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml index 75528974ec..b632f21cf5 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_appearance.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Kıyafetler" name="appearance panel"> - <string name="No Outfit" value="Kıyafet Yok"/> +<panel label="Dış Görünümler" name="appearance panel"> + <string name="No Outfit" value="Dış Görünüm Yok"/> <string name="Unsaved Changes" value="Kaydedilmemiş değişiklikler"/> <string name="Now Wearing" value="Şimdi giyiyor..."/> - <string name="Changing outfits" value="Kıyafetleri değiştiriyor"/> + <string name="Changing outfits" value="Dış görünümler değiştiriliyor"/> <panel name="panel_currentlook"> <button label="E" name="editappearance_btn"/> <button label="O" name="openoutfit_btn"/> @@ -11,9 +11,9 @@ (Durum) </text> <text name="currentlook_name"> - MOOSE gibi gerçekten Uzun bir Adla Kıyafetim + MOOSE gibi gerçekten Uzun bir Adla Dış Görünümüm </text> - <button label="" name="edit_outfit_btn" tool_tip="Bu kıyafeti düzenle"/> + <button label="" name="edit_outfit_btn" tool_tip="Bu dış görünümü düzenle"/> </panel> - <filter_editor label="Kıyafetleri Filtrele" name="Filter"/> + <filter_editor label="Dış Görünümleri Filtrele" name="Filter"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml index e02eae1d92..70c449b402 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_inventory.xml @@ -7,14 +7,14 @@ <layout_panel name="inbox_layout_panel"> <panel label="" name="marketplace_inbox"> <string name="InboxLabelWithArg"> - Alınan Öğeler ([NUM]) + Alınan öğeler ([NUM]) </string> <string name="InboxLabelNoArg"> - Alınan Öğeler + Alınan öğeler </string> - <button label="Alınan Öğeler" name="inbox_btn"/> + <button label="Alınan öğeler" name="inbox_btn"/> <text name="inbox_fresh_new_count"> - [NUM] Yeni + [NUM] yeni </text> <panel tool_tip="Drag and drop items to your inventory to manage and use them"> <text name="inbox_inventory_placeholder"> @@ -26,12 +26,12 @@ <layout_panel name="outbox_layout_panel"> <panel label="" name="marketplace_outbox"> <string name="OutboxLabelWithArg"> - Satıcı Giden Kutusu ([NUM]) + Satıcı giden kutusu ([NUM]) </string> <string name="OutboxLabelNoArg"> - Satıcı Giden Kutusu + Satıcı giden kutusu </string> - <button label="Satıcı Giden Kutusu" name="outbox_btn"/> + <button label="Satıcı giden kutusu" name="outbox_btn"/> <button label="" name="outbox_sync_btn" tool_tip="Pazaryeri Vitrinime Gönder"/> <panel> <panel name="outbox_inventory_placeholder_panel"> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 543989804a..a17d78486d 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -29,22 +29,22 @@ Önbellek temizleniyor... </string> <string name="StartupInitializingTextureCache"> - Doku Önbelleği Başlatılıyor... + Doku önbelleği başlatılıyor... </string> <string name="StartupInitializingVFS"> VFS Başlatılıyor... </string> <string name="StartupRequireDriverUpdate"> - Grafik Başlatma Başarılamadı. Lütfen Grafik Sürücünüzü Güncelleştirin! + Grafik başlatma başarılamadı. Lütfen grafik sürücünüzü güncelleştirin! </string> <string name="ProgressRestoring"> Geri yükleniyor... </string> <string name="ProgressChangingResolution"> - Çözünürlük Değiştiriliyor... + Çözünürlük değiştiriliyor... </string> <string name="Fullbright"> - Tam Parlak (Eski) + Tam parlak (eski) </string> <string name="LoginInProgress"> Oturum açılıyor. [APP_NAME] kilitlenmiş görünebilir. Lütfen bekleyin. @@ -77,10 +77,10 @@ Önbellek dosyaları doğrulanıyor (60-90 saniye zaman alabilir)... </string> <string name="LoginProcessingResponse"> - Yanıt İşleniyor... + Yanıt işleniyor... </string> <string name="LoginInitializingWorld"> - Dünya Başlatılıyor... + Dünya başlatılıyor... </string> <string name="LoginDecodingImages"> Görüntülerin kodu çözülüyor... @@ -128,7 +128,7 @@ Ağ sunucusu tarafından döndürülen sertifika imzası doğrulanamadı. Lütfen Ağ yöneticinize başvurun. </string> <string name="LoginFailedNoNetwork"> - Ağ Hatası: Bağlantı kurulamadı, lütfen ağ bağlantınızı kontrol edin. + Ağ hatası: Bağlantı kurulamadı, lütfen ağ bağlantınızı kontrol edin. </string> <string name="LoginFailed"> Oturum açılamadı. @@ -584,7 +584,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. sim durumu </string> <string name="favorite"> - sık kullanılan + favori </string> <string name="symbolic link"> bağlantı @@ -1205,7 +1205,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Aradığınızı bulamadınız mı? [secondlife:///app/search/places/[SEARCH_TERM] Arama] ile bulmayı deneyin. </string> <string name="FavoritesNoMatchingItems"> - Bir yer imini sık kullanılanlarınıza eklemek için buraya sürükleyin. + Bir yer imini favorilerinize eklemek için buraya sürükleyin. </string> <string name="InventoryNoTexture"> Envanterinizde bu dokunun kopyası yok @@ -1273,6 +1273,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="Marketplace Error Internal Import"> Hata: Bu öğede bir sorun var. Daha sonra tekrar deneyin. </string> + <string name="Open landmarks"> + Açık yer imleri + </string> <string name="no_transfer" value="(aktarım yok)"/> <string name="no_modify" value="(değiştirme yok)"/> <string name="no_copy" value="(kopya yok)"/> @@ -1377,10 +1380,10 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. Mimikler </string> <string name="InvFolder Favorite"> - Sık Kullanılanlarım + Favorilerim </string> <string name="InvFolder favorite"> - Sık Kullanılanlarım + Favorilerim </string> <string name="InvFolder Current Outfit"> Mevcut Dış Görünüm @@ -1982,10 +1985,10 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. (yayınlandıktan sonra güncelleştirilir) </string> <string name="NoPicksClassifiedsText"> - Herhangi bir Favori veya İlan oluşturmadınız. Bir Favori veya İlan oluşturmak için aşağıdaki Artı düğmesine tıklayın. + Herhangi bir Seçme veya İlan oluşturmadınız. Bir Seçme veya İlan oluşturmak için aşağıdaki Artı düğmesine tıklayın. </string> <string name="NoAvatarPicksClassifiedsText"> - Kullanıcının herhangi bir favorisi veya ilanı yok + Kullanıcının herhangi bir seçmesi veya ilanı yok </string> <string name="PicksClassifiedsLoadingText"> Yükleniyor... @@ -4162,7 +4165,7 @@ Kötüye Kullanımı Bildirme Konuşma Mimikleri </string> <string name="Common Gestures"> - Sık Kullanılan Mimikler + Favori Mimikler </string> <string name="Male - Excuse me"> Erkek - Afedersiniz @@ -4251,8 +4254,8 @@ Kötüye Kullanımı Bildirme <string name="Female - Wow"> Kadın - Vay be </string> - <string name="/bow1"> - /selamlama1 + <string name="/bow"> + /selamlama </string> <string name="/clap"> /alkış @@ -4776,4 +4779,172 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="ParticleHiding"> Parçacıklar Gizleniyor </string> + <string name="Command_AboutLand_Label"> + Arazi hakkında + </string> + <string name="Command_Appearance_Label"> + Görünüm + </string> + <string name="Command_Avatar_Label"> + Avatar + </string> + <string name="Command_Build_Label"> + İnşa Et + </string> + <string name="Command_Chat_Label"> + Sohbet + </string> + <string name="Command_Compass_Label"> + Pusula + </string> + <string name="Command_Destinations_Label"> + Hedef Konum + </string> + <string name="Command_Gestures_Label"> + Mimikler + </string> + <string name="Command_HowTo_Label"> + Nasıl yapılır + </string> + <string name="Command_Inventory_Label"> + Envanter + </string> + <string name="Command_Map_Label"> + Harita + </string> + <string name="Command_Marketplace_Label"> + Pazaryeri + </string> + <string name="Command_MiniMap_Label"> + Mini-harita + </string> + <string name="Command_Move_Label"> + Hareket Et + </string> + <string name="Command_People_Label"> + Kişiler + </string> + <string name="Command_Picks_Label"> + Seçmeler + </string> + <string name="Command_Places_Label"> + Yerler + </string> + <string name="Command_Preferences_Label"> + Tercihler + </string> + <string name="Command_Profile_Label"> + Profil + </string> + <string name="Command_Search_Label"> + Ara + </string> + <string name="Command_Snapshot_Label"> + Anlık görüntü + </string> + <string name="Command_Speak_Label"> + Konuş + </string> + <string name="Command_View_Label"> + Görünüm + </string> + <string name="Command_Voice_Label"> + Yakındaki ses + </string> + <string name="Command_AboutLand_Tooltip"> + Ziyaret ettiğiniz araziyle ilgili bilgi + </string> + <string name="Command_Appearance_Tooltip"> + Avatarınızı değiştirin + </string> + <string name="Command_Avatar_Tooltip"> + Eksiksiz bir avatar seçin + </string> + <string name="Command_Build_Tooltip"> + Nesneler oluşturma ve yüzeyi şekillendirme + </string> + <string name="Command_Chat_Tooltip"> + Metin kullanarak yakındaki kişilerle sohbet etmek + </string> + <string name="Command_Compass_Tooltip"> + Pusula + </string> + <string name="Command_Destinations_Tooltip"> + İlgilendiğiniz hedef konumlar + </string> + <string name="Command_Gestures_Tooltip"> + Avatarınız için mimikler + </string> + <string name="Command_HowTo_Tooltip"> + Genel görevleri nasıl yapacağınız + </string> + <string name="Command_Inventory_Tooltip"> + Eşyalarınızı görüntüleyin ve kullanın + </string> + <string name="Command_Map_Tooltip"> + Dünya haritası + </string> + <string name="Command_Marketplace_Tooltip"> + Alışveriş yap + </string> + <string name="Command_MiniMap_Tooltip"> + Yakındaki kişileri göster + </string> + <string name="Command_Move_Tooltip"> + Avatarınızı hareket ettirmek + </string> + <string name="Command_People_Tooltip"> + Arkadaşlar, gruplar ve yakındaki kişiler + </string> + <string name="Command_Picks_Tooltip"> + Profilinizde favori olarak gösterilecek yerler + </string> + <string name="Command_Places_Tooltip"> + Kaydettiğiniz yerler + </string> + <string name="Command_Preferences_Tooltip"> + Tercihler + </string> + <string name="Command_Profile_Tooltip"> + Profilinizi düzenleyin veya görüntüleyin + </string> + <string name="Command_Search_Tooltip"> + Yerler, etkinlikler ve kişiler bulmak + </string> + <string name="Command_Snapshot_Tooltip"> + Resim çekin + </string> + <string name="Command_Speak_Tooltip"> + Mikrofonunuzu kullanarak yakındaki kişilerle konuşun + </string> + <string name="Command_View_Tooltip"> + Kamera açısını değiştirmek + </string> + <string name="Command_Voice_Tooltip"> + Ses imkanına sahip yakındaki kişiler + </string> + <string name="Retain%"> + Koru % + </string> + <string name="Detail"> + Ayrıntı + </string> + <string name="Better Detail"> + Daha İyi Ayrıntı + </string> + <string name="Surface"> + Yüzey + </string> + <string name="Solid"> + Katı + </string> + <string name="Wrap"> + Sar + </string> + <string name="Preview"> + Önizleme + </string> + <string name="Normal"> + Normal + </string> </strings> diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml index c0c4be1393..c506bb8a58 100644 --- a/indra/newview/skins/default/xui/tr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml @@ -20,6 +20,10 @@ Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp otu Üzgünüz fakat sistem ışınlama bağlantısını tamamlayamadı. Bir dakika sonra tekrar deneyin. </message> + <message name="NoHelpIslandTP"> +You cannot teleport back to Welcome Island. +Go to 'Welcome Island Public' to repeat the tutorial. + </message> <message name="noaccess_tport"> Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz. </message> diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml index 0ac85d399e..7e19c124a1 100644 --- a/indra/newview/skins/default/xui/zh/floater_about.xml +++ b/indra/newview/skins/default/xui/zh/floater_about.xml @@ -10,7 +10,7 @@ <floater.string name="AboutPosition"> You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[SERVER_RELEASE_NOTES_URL] </floater.string> <floater.string name="AboutSystem"> CPU:[CPU] diff --git a/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml deleted file mode 100644 index 84186c5836..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Day Cycle Floater" title="日循環編輯器"> - <tab_container name="Day Cycle Tabs"> - <panel label="日循環" name="Day Cycle"> - <multi_slider initial_value="0" name="WLTimeSlider"/> - <multi_slider initial_value="0" name="WLDayCycleKeys"/> - <text name="WL12am"> - 12am - </text> - <text name="WL3am"> - 3am - </text> - <text name="WL6am"> - 6am - </text> - <text name="WL9amHash"> - 9am - </text> - <text name="WL12pmHash"> - 12pm - </text> - <text name="WL3pm"> - 3pm - </text> - <text name="WL6pm"> - 6pm - </text> - <text name="WL9pm"> - 9pm - </text> - <text name="WL12am2"> - 12am - </text> - <text name="WL12amHash"> - | - </text> - <text name="WL3amHash"> - I - </text> - <text name="WL6amHash"> - | - </text> - <text name="WL9amHash2"> - I - </text> - <text name="WL12pmHash2"> - | - </text> - <text name="WL3pmHash"> - I - </text> - <text name="WL6pmHash"> - | - </text> - <text name="WL9pmHash"> - I - </text> - <text name="WL12amHash2"> - | - </text> - <button label="Add Key" label_selected="Add Key" name="WLAddKey"/> - <button label="Delete Key" label_selected="Delete Key" name="WLDeleteKey"/> - <text name="WLCurKeyFrameText"> - Key Frame Settings: - </text> - <text name="WLCurKeyTimeText"> - Key Time: - </text> - <spinner label="Hour" name="WLCurKeyHour"/> - <spinner label="Min" name="WLCurKeyMin"/> - <text name="WLCurKeyTimeText2"> - Key Preset: - </text> - <combo_box label="Preset" name="WLKeyPresets"/> - <text name="DayCycleText"> - Snap: - </text> - <combo_box label="五分鐘" name="WLSnapOptions"/> - <text name="DayCycleText2"> - Length of Cycle: - </text> - <spinner label="小時" name="WLLengthOfDayHour"/> - <spinner label="分" name="WLLengthOfDayMin"/> - <spinner label="秒" name="WLLengthOfDaySec"/> - <text name="DayCycleText3"> - 預覽: - </text> - <button label="播放" label_selected="播放" name="WLAnimSky"/> - <button label="停止!" label_selected="停止" name="WLStopAnimSky"/> - <button label="Use Estate Time" label_selected="Go to Estate Time" name="WLUseLindenTime"/> - <button label="Save Test Day" label_selected="Save Test Day" name="WLSaveDayCycle"/> - <button label="Load Test Day" label_selected="Load Test Day" name="WLLoadDayCycle"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml index f0c34acb06..38a5dab523 100644 --- a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="nearby_chat" title="附近的聊天"> - <check_box label="Translate chat (powered by Google)" name="translate_chat_checkbox"/> + <check_box label="Translate chat" name="translate_chat_checkbox"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml index fc326c2ce2..738c77fd08 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml @@ -30,7 +30,7 @@ <spinner label="Nearby chat toasts life time:" name="nearby_toasts_lifetime"/> <spinner label="Nearby chat toasts fading time:" name="nearby_toasts_fadingtime"/> <text name="translate_chb_label"> - 聊天時使用機器自動進行翻譯(由 Google 所提供) + 聊天時使用機器自動進行翻譯 </text> <text name="translate_language_text"> 聊天翻譯為: diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml index 29f9599c97..6827fab6e6 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml @@ -5,15 +5,15 @@ </text> <combo_box name="language_combobox"> <combo_box.item label="系統預設" name="System Default Language"/> - <combo_box.item label="英語" name="English"/> - <combo_box.item label="Dansk (Danish) - Beta" name="Danish"/> - <combo_box.item label="Deutsch (German) - Beta" name="Deutsch(German)"/> - <combo_box.item label="Español (Spanish) - Beta" name="Spanish"/> - <combo_box.item label="Français (French) - Beta" name="French"/> - <combo_box.item label="Italiano (Italian) - Beta" name="Italian"/> - <combo_box.item label="Polski (Polish) - Beta" name="Polish"/> - <combo_box.item label="Português (Portuguese) - Beta" name="Portugese"/> - <combo_box.item label="日本語 (Japanese) - Beta" name="(Japanese)"/> + <combo_box.item label="English (英語)" name="English"/> + <combo_box.item label="Dansk (丹麥語) - Beta" name="Danish"/> + <combo_box.item label="Deutsch (德語) - Beta" name="Deutsch(German)"/> + <combo_box.item label="Español (西班牙語) - Beta" name="Spanish"/> + <combo_box.item label="Français (法語) - Beta" name="French"/> + <combo_box.item label="Italiano (義大利語) - Beta" name="Italian"/> + <combo_box.item label="Polski (波蘭語) - Beta" name="Polish"/> + <combo_box.item label="Português (葡萄牙語) - Beta" name="Portugese"/> + <combo_box.item label="日本語 (日語) - Beta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> (須重新啟動) diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml index ffb4c903bb..bfdb107810 100644 --- a/indra/newview/skins/default/xui/zh/teleport_strings.xml +++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml @@ -20,6 +20,10 @@ 抱歉,不過系統無法完成瞬間傳送的聯接。 請稍後再試。 </message> + <message name="NoHelpIslandTP"> + 您不能瞬间转移回“援助岛”。 +去“公共援助岛”重复您的教程。 + </message> <message name="noaccess_tport"> 抱歉,你並沒有權限進入要瞬間傳送的目的地。 </message> diff --git a/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml deleted file mode 100644 index f95913ef2b..0000000000 --- a/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="ScriptChiclet Menu"> - <menu_item_call label="Close (TODO: translate to Russian)" name="Close"/> -</menu> diff --git a/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml deleted file mode 100644 index 2efe6d7e71..0000000000 --- a/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="ScriptChiclet Menu"> - <menu_item_call label="Close (TODO: translate to Turkish)" name="Close"/> -</menu> diff --git a/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml deleted file mode 100644 index a0a8520650..0000000000 --- a/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="ScriptChiclet Menu"> - <menu_item_call label="Close (TODO: translate to Traditional Chinese)" name="Close"/> -</menu> diff --git a/indra/newview/tests/lltranslate_test.cpp b/indra/newview/tests/lltranslate_test.cpp new file mode 100644 index 0000000000..10e37fae97 --- /dev/null +++ b/indra/newview/tests/lltranslate_test.cpp @@ -0,0 +1,345 @@ +/** + * @file lltranslate_test.cpp + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "../test/lltut.h" +#include "../lltranslate.h" +#include "../llversioninfo.h" +#include "../llviewercontrol.h" + +#include "llbufferstream.h" +#include "lltrans.h" +#include "llui.h" + +static const std::string GOOGLE_VALID_RESPONSE1 = +"{\ + \"data\": {\ + \"translations\": [\ + {\ + \"translatedText\": \"привет\",\ + \"detectedSourceLanguage\": \"es\"\ + }\ + ]\ + }\ +}"; + +static const std::string GOOGLE_VALID_RESPONSE2 = +"{\ + \"data\": {\ + \"translations\": [\ + {\ + \"translatedText\": \"привет\"\ + }\ + ]\ + }\ +}\ +"; + +static const std::string GOOGLE_VALID_RESPONSE3 = +"{\ + \"error\": {\ + \"errors\": [\ + {\ + \"domain\": \"global\",\ + \"reason\": \"invalid\",\ + \"message\": \"Invalid Value\"\ + }\ + ],\ + \"code\": 400,\ + \"message\": \"Invalid Value\"\ + }\ +}"; + +static const std::string BING_VALID_RESPONSE1 = +"<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Привет</string>"; + +static const std::string BING_VALID_RESPONSE2 = +"<html><body><h1>Argument Exception</h1><p>Method: Translate()</p><p>Parameter: </p>\ +<p>Message: 'from' must be a valid language</p><code></code>\ +<p>message id=3743.V2_Rest.Translate.58E8454F</p></body></html>"; + +static const std::string BING_VALID_RESPONSE3 = +"<html><body><h1>Argument Exception</h1><p>Method: Translate()</p>\ +<p>Parameter: appId</p><p>Message: Invalid appId
\nParameter name: appId</p>\ +<code></code><p>message id=3737.V2_Rest.Translate.56016759</p></body></html>"; + +namespace tut +{ + class translate_test + { + protected: + void test_translation( + LLTranslationAPIHandler& handler, + int status, const std::string& resp, + const std::string& exp_trans, const std::string& exp_lang, const std::string& exp_err) + { + std::string translation, detected_lang, err_msg; + bool rc = handler.parseResponse(status, resp, translation, detected_lang, err_msg); + ensure_equals("rc", rc, (status == 200)); + ensure_equals("err_msg", err_msg, exp_err); + ensure_equals("translation", translation, exp_trans); + ensure_equals("detected_lang", detected_lang, exp_lang); + } + + LLGoogleTranslationHandler mGoogle; + LLBingTranslationHandler mBing; + }; + + typedef test_group<translate_test> translate_test_group_t; + typedef translate_test_group_t::object translate_test_object_t; + tut::translate_test_group_t tut_translate("LLTranslate"); + + template<> template<> + void translate_test_object_t::test<1>() + { + test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE1, "привет", "es", ""); + } + + template<> template<> + void translate_test_object_t::test<2>() + { + test_translation(mGoogle, 200, GOOGLE_VALID_RESPONSE2, "привет", "", ""); + } + + template<> template<> + void translate_test_object_t::test<3>() + { + test_translation(mGoogle, 400, GOOGLE_VALID_RESPONSE3, "", "", "Invalid Value"); + } + + template<> template<> + void translate_test_object_t::test<4>() + { + test_translation(mGoogle, 400, + "", + "", "", "* Line 1, Column 1\n Syntax error: value, object or array expected.\n"); + } + + template<> template<> + void translate_test_object_t::test<5>() + { + test_translation(mGoogle, 400, + "[]", + "", "", ""); + } + + template<> template<> + void translate_test_object_t::test<6>() + { + test_translation(mGoogle, 400, + "{\"oops\": \"invalid\"}", + "", "", ""); + } + + template<> template<> + void translate_test_object_t::test<7>() + { + test_translation(mGoogle, 400, + "{\"data\": {}}", + "", "", ""); + } + + template<> template<> + void translate_test_object_t::test<8>() + { + test_translation(mGoogle, 400, + "{\"data\": { \"translations\": [ {} ] }}", + "", "", ""); + } + + template<> template<> + void translate_test_object_t::test<9>() + { + test_translation(mGoogle, 400, + "{\"data\": { \"translations\": [ { \"translatedTextZZZ\": \"привет\", \"detectedSourceLanguageZZZ\": \"es\" } ] }}", + "", "", ""); + } + + template<> template<> + void translate_test_object_t::test<10>() + { + test_translation(mBing, 200, BING_VALID_RESPONSE1, "Привет", "", ""); + } + + template<> template<> + void translate_test_object_t::test<11>() + { + test_translation(mBing, 400, BING_VALID_RESPONSE2, "", "", "'from' must be a valid language"); + } + + template<> template<> + void translate_test_object_t::test<12>() + { + test_translation(mBing, 400, BING_VALID_RESPONSE3, "", "", "Invalid appId\nParameter name: appId"); + } + + template<> template<> + void translate_test_object_t::test<13>() + { + test_translation(mBing, 200, + "Привет</string>", + "Привет", "", ""); + } + + template<> template<> + void translate_test_object_t::test<14>() + { + test_translation(mBing, 200, + "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Привет", + "Привет", "", ""); + } + + template<> template<> + void translate_test_object_t::test<15>() + { + test_translation(mBing, 200, + "Привет", + "Привет", "", ""); + } + + template<> template<> + void translate_test_object_t::test<16>() + { + test_translation(mBing, 400, + "Message: some error</p>", + "", "", "some error"); + } + + template<> template<> + void translate_test_object_t::test<17>() + { + test_translation(mBing, 400, + "Message: some error", + "", "", "some error"); + } + + template<> template<> + void translate_test_object_t::test<18>() + { + test_translation(mBing, 400, + "some error</p>", + "", "", "some error"); + } + + template<> template<> + void translate_test_object_t::test<19>() + { + test_translation(mBing, 400, + "some error", + "", "", "some error"); + } + + template<> template<> + void translate_test_object_t::test<20>() + { + std::string url; + mBing.getTranslateURL(url, "en", "es", "hi"); + ensure_equals("bing URL", url, + "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es&from=en"); + } + + template<> template<> + void translate_test_object_t::test<21>() + { + std::string url; + mBing.getTranslateURL(url, "", "es", "hi"); + ensure_equals("bing URL", url, + "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=dummy&text=hi&to=es"); + } + + template<> template<> + void translate_test_object_t::test<22>() + { + std::string url; + mGoogle.getTranslateURL(url, "en", "es", "hi"); + ensure_equals("google URL", url, + "https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es&source=en"); + } + + template<> template<> + void translate_test_object_t::test<23>() + { + std::string url; + mGoogle.getTranslateURL(url, "", "es", "hi"); + ensure_equals("google URL", url, + "https://www.googleapis.com/language/translate/v2?key=dummy&q=hi&target=es"); + } +} + +//== Misc stubs =============================================================== +LLControlGroup gSavedSettings("test"); + +std::string LLUI::getLanguage() { return "en"; } +std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) { return "dummy"; } + +LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name) {} +std::string LLControlGroup::getString(const std::string& name) { return "dummy"; } +LLControlGroup::~LLControlGroup() {} + +namespace boost { + void intrusive_ptr_add_ref(LLCurl::Responder*) {} + void intrusive_ptr_release(LLCurl::Responder*) {} +} + +LLCurl::Responder::Responder() {} +void LLCurl::Responder::completedHeader(U32, std::string const&, LLSD const&) {} +void LLCurl::Responder::completedRaw(U32, const std::string&, const LLChannelDescriptors&, const LLIOPipe::buffer_ptr_t& buffer) {} +void LLCurl::Responder::completed(U32, std::string const&, LLSD const&) {} +void LLCurl::Responder::error(U32, std::string const&) {} +void LLCurl::Responder::errorWithContent(U32, std::string const&, LLSD const&) {} +void LLCurl::Responder::result(LLSD const&) {} +LLCurl::Responder::~Responder() {} + +void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32) {} +void LLHTTPClient::get(const std::string&, boost::intrusive_ptr<LLCurl::Responder>, const LLSD&, const F32) {} + +LLBufferStream::LLBufferStream(const LLChannelDescriptors& channels, LLBufferArray* buffer) +: std::iostream(&mStreamBuf), mStreamBuf(channels, buffer) {} +LLBufferStream::~LLBufferStream() {} + +LLBufferStreamBuf::LLBufferStreamBuf(const LLChannelDescriptors&, LLBufferArray*) {} +#if( LL_WINDOWS || __GNUC__ > 2) +LLBufferStreamBuf::pos_type LLBufferStreamBuf::seekoff( + off_type off, + std::ios::seekdir way, + std::ios::openmode which) +#else +streampos LLBufferStreamBuf::seekoff( + streamoff off, + std::ios::seekdir way, + std::ios::openmode which) +#endif +{ return 0; } +int LLBufferStreamBuf::sync() {return 0;} +int LLBufferStreamBuf::underflow() {return 0;} +int LLBufferStreamBuf::overflow(int) {return 0;} +LLBufferStreamBuf::~LLBufferStreamBuf() {} + +S32 LLVersionInfo::getBuild() { return 0; } +const std::string& LLVersionInfo::getChannel() {static std::string dummy; return dummy;} +S32 LLVersionInfo::getMajor() { return 0; } +S32 LLVersionInfo::getMinor() { return 0; } +S32 LLVersionInfo::getPatch() { return 0; } diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index f0bee2bfee..0931c4ec9b 100644..100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -495,8 +495,9 @@ class WindowsManifest(ViewerManifest): # tag:"crash-logger" here as a cue to the exporter self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], dst="win_crash_logger.exe") - self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'], - dst="updater.exe") +# For CHOP-397, windows updater no longer used. +# self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'], +# dst="updater.exe") if not self.is_packaging_viewer(): self.package_file = "copied_deps" @@ -573,10 +574,10 @@ class WindowsManifest(ViewerManifest): grid_vars_template = """ OutFile "%(installer_file)s" !define INSTFLAGS "%(flags)s" - !define INSTNAME "SecondLifeViewer2" - !define SHORTCUT "Second Life Viewer 2" + !define INSTNAME "SecondLifeViewer" + !define SHORTCUT "Second Life Viewer" !define URLNAME "secondlife" - Caption "Second Life ${VERSION}" + Caption "Second Life" """ else: # beta grid viewer @@ -804,7 +805,7 @@ class DarwinManifest(ViewerManifest): self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) def package_finish(self): - channel_standin = 'Second Life Viewer 2' # hah, our default channel is not usable on its own + channel_standin = 'Second Life Viewer' # hah, our default channel is not usable on its own if not self.default_channel(): channel_standin = self.channel() diff --git a/indra/viewer_components/updater/scripts/darwin/update_install b/indra/viewer_components/updater/scripts/darwin/update_install index 6a95f96d86..e7f36dc5a3 100644..100755 --- a/indra/viewer_components/updater/scripts/darwin/update_install +++ b/indra/viewer_components/updater/scripts/darwin/update_install @@ -6,5 +6,5 @@ # cd "$(dirname "$0")" -(../Resources/mac-updater.app/Contents/MacOS/mac-updater -dmg "$1" -name "Second Life Viewer 2"; if [ $? -ne 0 ]; then echo $3 >> "$2"; fi;) & +(../Resources/mac-updater.app/Contents/MacOS/mac-updater -dmg "$1" -name "Second Life Viewer"; if [ $? -ne 0 ]; then echo $3 >> "$2"; fi;) & exit 0 diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install index 88451340ec..e0505a9f72 100644..100755 --- a/indra/viewer_components/updater/scripts/linux/update_install +++ b/indra/viewer_components/updater/scripts/linux/update_install @@ -1,7 +1,7 @@ #! /bin/bash INSTALL_DIR=$(cd "$(dirname "$0")/.." ; pwd) export LD_LIBRARY_PATH="$INSTALL_DIR/lib" -bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer 2" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml" +bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml" if [ $? -ne 0 ] then echo $3 >> "$2" diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp index 170babbb98..36d988ead7 100644..100755 --- a/indra/win_crash_logger/llcrashloggerwindows.cpp +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -370,5 +370,6 @@ bool LLCrashLoggerWindows::cleanup() sleep_and_pump_messages(3); } PostQuitMessage(0); + commonCleanup(); return true; } |