diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2026-05-21 19:37:15 +0300 |
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2026-05-21 19:37:15 +0300 |
| commit | 15d82beb6056fa16a1ea1cbf01c5d673a95e0267 (patch) | |
| tree | 55af7639161926313434d9e4a8b9872369668d5d | |
| parent | ff536adef0b74c20f55bd501ad593e4eef762082 (diff) | |
| parent | 6d4c4c029ce43aa413266135829cd2bc00001890 (diff) | |
Merge branch 'main' into marchcat/slua-26.2
# Conflicts:
# indra/llfilesystem/lldir.cpp
# indra/llfilesystem/llfilesystem.cpp
# indra/newview/llappviewer.cpp
# indra/newview/lltexturecache.cpp
# indra/newview/llvoiceclient.cpp
# indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
432 files changed, 5107 insertions, 5864 deletions
diff --git a/autobuild.xml b/autobuild.xml index 3f07900e58..ade79ef9ad 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2329,6 +2329,38 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string> <key>description</key> <string>Viewer fonts</string> </map> + <key>google-fonts</key> + <map> + <key>platforms</key> + <map> + <key>common</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>8de96fd083783b9f4df1d8d7028c8a713a7d7217</string> + <key>hash_algorithm</key> + <string>sha1</string> + <key>url</key> + <string>https://github.com/secondlife/3p-google-fonts/releases/download/v1.0.0-r6/google_fonts-1.0.0.24469773244-common-24469773244.tar.zst</string> + </map> + <key>name</key> + <string>common</string> + </map> + </map> + <key>license</key> + <string>SIL Open Font License, Version 1.1</string> + <key>license_file</key> + <string>LICENSES/google_inter.txt</string> + <key>copyright</key> + <string>Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)</string> + <key>version</key> + <string>1.0.0.22606339007</string> + <key>name</key> + <string>google-fonts</string> + <key>description</key> + <string>Google fonts</string> + </map> <key>viewer-manager</key> <map> <key>platforms</key> diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 1c8495de74..7fc47de875 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -17,6 +17,7 @@ use_prebuilt_binary(slvoice) use_prebuilt_binary(nanosvg) use_prebuilt_binary(viewer-fonts) +use_prebuilt_binary(google-fonts) use_prebuilt_binary(emoji_shortcodes) include(LSLDefinitions) diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index 613c408157..6f2f7eae61 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -225,6 +225,7 @@ void LLAudioEngine::updateChannels() void LLAudioEngine::idle() { + LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA; // "Update" all of our audio sources, clean up dead ones. // Primarily does position updating, cleanup of unused audio sources. // Also does regeneration of the current priority of each audio source. diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index a0394da281..404e0c71ce 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -163,6 +163,28 @@ constexpr U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only constexpr U8 SIM_ACCESS_DOWN = 254; constexpr U8 SIM_ACCESS_MAX = SIM_ACCESS_ADULT; +// map item types +constexpr U32 MAP_ITEM_TELEHUB = 0x01; +constexpr U32 MAP_ITEM_PG_EVENT = 0x02; +constexpr U32 MAP_ITEM_MATURE_EVENT = 0x03; +// constexpr U32 MAP_ITEM_POPULAR = 0x04; // No longer supported, 2009-03-02 KLW +// constexpr U32 MAP_ITEM_AGENT_COUNT = 0x05; +constexpr U32 MAP_ITEM_AGENT_LOCATIONS = 0x06; +constexpr U32 MAP_ITEM_LAND_FOR_SALE = 0x07; +constexpr U32 MAP_ITEM_CLASSIFIED = 0x08; +constexpr U32 MAP_ITEM_ADULT_EVENT = 0x09; +constexpr U32 MAP_ITEM_LAND_FOR_SALE_ADULT = 0x0a; + +// Region map layer numbers +constexpr S32 MAP_SIM_OBJECTS = 0; +constexpr S32 MAP_SIM_TERRAIN = 1; +constexpr S32 MAP_SIM_LAND_FOR_SALE = 2; // Transparent alpha overlay of land for sale +constexpr S32 MAP_SIM_IMAGE_TYPES = 3; // Number of map layers +constexpr S32 MAP_SIM_INFO_MASK = 0x00FFFFFF; // Agent access may be stuffed into upper byte +constexpr S32 MAP_SIM_LAYER_MASK = 0x0000FFFF; // Layer info is in lower 16 bits +constexpr S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000; +constexpr S32 MAP_SIM_PRELUDE = 0x00020000; + // attachment constants constexpr U8 ATTACHMENT_ADD = 0x80; diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index ce09c566a9..3a855bc480 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -285,6 +285,7 @@ public: #ifdef LL_WINDOWS virtual bool reportCrashToBugsplat(void* pExcepInfo /*EXCEPTION_POINTERS*/) { return false; } + virtual bool reportCustomToBugsplat(const std::string& description) { return false; } #endif public: diff --git a/indra/llcommon/llwatchdog.cpp b/indra/llcommon/llwatchdog.cpp index 1bc1283d0b..66b565c763 100644 --- a/indra/llcommon/llwatchdog.cpp +++ b/indra/llcommon/llwatchdog.cpp @@ -87,7 +87,7 @@ void LLWatchdogEntry::start() void LLWatchdogEntry::stop() { // this can happen very late in the shutdown sequence - if (!LLWatchdog::wasDeleted()) + if (LLWatchdog::instanceExists()) { LLWatchdog::getInstance()->remove(this); } @@ -173,6 +173,17 @@ void LLWatchdog::add(LLWatchdogEntry* e) { lockThread(); mSuspects.insert(e); + + if (!mFrozeList.empty()) + { + mFrozeList.erase(e); + if (mFrozeList.empty()) + { + // Clear error marker file if there is no frozen threads, + // viewer is responsive again. + mClearMarkerFnc(); + } + } unlockThread(); } @@ -180,10 +191,16 @@ void LLWatchdog::remove(LLWatchdogEntry* e) { lockThread(); mSuspects.erase(e); + mFrozeList.erase(e); unlockThread(); } -void LLWatchdog::init(func_t set_error_state_callback) +void LLWatchdog::init( + create_marker_func_t error_state_callback, + clear_marker_func_t clear_marker_callback, + report_func_t report_callback, + notify_func_t notify_callback, + bool crash_on_freeze) { if (!mSuspectsAccessMutex && !mTimer) { @@ -196,7 +213,11 @@ void LLWatchdog::init(func_t set_error_state_callback) // start needs to use the mSuspectsAccessMutex mTimer->start(); } - mCreateMarkerFnc = set_error_state_callback; + mCreateMarkerFnc = error_state_callback; + mClearMarkerFnc = clear_marker_callback; + mCrashReportFnc = report_callback; + mNotifyFnc = notify_callback; + mCrashOnFreeze = crash_on_freeze; } void LLWatchdog::cleanup() @@ -251,21 +272,47 @@ void LLWatchdog::run() mTimer->stop(); } - // Sets error marker file - mCreateMarkerFnc(); - // Todo1: Warn user? - // Todo2: We probably want to report even if 5 seconds passed, just not error 'yet'. std::string last_state = (*result)->getLastState(); - if (last_state.empty()) + std::string description = "Watchdog timer for thread " + (*result)->getThreadName() + " expired"; + if (!last_state.empty()) { - LL_ERRS() << "Watchdog timer for thread " << (*result)->getThreadName() - << " expired; assuming viewer is hung and crashing" << LL_ENDL; + description += " with state: " + last_state; + } + description += "; assuming viewer is hung and crashing"; + + if (!mCrashOnFreeze) + { + // Sets watchdog marker file + mCreateMarkerFnc(false); + // If it's mainloop and it somehow recovers, it will re-add itself + LLWatchdogEntry* froze_entry = *result; + mSuspects.erase(result); + mFrozeList.insert(froze_entry); + LL_WARNS() << description << LL_ENDL; } else { - LL_ERRS() << "Watchdog timer for thread " << (*result)->getThreadName() - << " expired with state: " << last_state - << "; assuming viewer is hung and crashing" << LL_ENDL; + + if (!mCrashReportFnc(description)) + { + // Sets error marker file + mCreateMarkerFnc(true); + // If false is returned, then we failed to report the issue to bugsplat, + // instead, Notify user, then crash viewer. + // Todo: ask user if viewer should quit or wait? + mNotifyFnc(); + LL_ERRS() << description << LL_ENDL; + } + else + { + // Sets watchdog marker file + mCreateMarkerFnc(false); + // Already reported, don't report again. + // If it's mainloop and it somehow recovers, it will re-add itself + LLWatchdogEntry* froze_entry = *result; + mSuspects.erase(result); + mFrozeList.insert(froze_entry); + } } } } diff --git a/indra/llcommon/llwatchdog.h b/indra/llcommon/llwatchdog.h index fded881bb8..f138fbccb0 100644 --- a/indra/llcommon/llwatchdog.h +++ b/indra/llcommon/llwatchdog.h @@ -83,18 +83,26 @@ private: }; class LLWatchdogTimerThread; // Defined in the cpp -class LLWatchdog : public LLSingleton<LLWatchdog> +class LLWatchdog : public LLSimpleton<LLWatchdog> { - LLSINGLETON(LLWatchdog); +public: + LLWatchdog(); ~LLWatchdog(); -public: // Add an entry to the watchdog. void add(LLWatchdogEntry* e); void remove(LLWatchdogEntry* e); - typedef std::function<void()> func_t; - void init(func_t set_error_state_callback); + typedef std::function<void(bool)> create_marker_func_t; + typedef std::function<void()> clear_marker_func_t; + typedef std::function<bool(std::string&)> report_func_t; + typedef std::function<void()> notify_func_t; + void init( + create_marker_func_t error_state_callback, + clear_marker_func_t clear_marker_callback, + report_func_t report_callback, + notify_func_t notify_callback, + bool crash_on_freeze); void run(); void cleanup(); @@ -105,14 +113,19 @@ private: typedef std::set<LLWatchdogEntry*> SuspectsRegistry; SuspectsRegistry mSuspects; + SuspectsRegistry mFrozeList; LLMutex* mSuspectsAccessMutex; LLWatchdogTimerThread* mTimer; U64 mLastClockCount; + bool mCrashOnFreeze; // At the moment watchdog expects app to set markers in mCreateMarkerFnc, // but technically can be used to set any error states or do some cleanup // or show warnings. - func_t mCreateMarkerFnc; + create_marker_func_t mCreateMarkerFnc; + clear_marker_func_t mClearMarkerFnc; + report_func_t mCrashReportFnc; + notify_func_t mNotifyFnc; }; #endif // LL_LLTHREADWATCHDOG_H diff --git a/indra/llfilesystem/lldir.cpp b/indra/llfilesystem/lldir.cpp index 1a647362c5..756d09e69a 100644 --- a/indra/llfilesystem/lldir.cpp +++ b/indra/llfilesystem/lldir.cpp @@ -41,6 +41,7 @@ #include "lldiriterator.h" #include "stringize.h" #include "llstring.h" +#include "llprocess.h" #include <boost/bind.hpp> #include <algorithm> @@ -1087,6 +1088,61 @@ LLDir::SepOff LLDir::needSep(const std::string& path, const std::string& name) c return SepOff(false, 0); } +void LLDir::openDir(const std::string& filepath) +{ + if (filepath.empty()) + { + LL_WARNS() << "Cannot open file browser: filepath is empty" << LL_ENDL; + return; + } + + // Extract directory path from full filepath + std::string dir_path = getDirName(filepath); + + LLProcess::Params params; + +#if LL_WINDOWS + // Windows: Use explorer.exe with /select flag to highlight the file + std::string system_root = LLStringUtil::getenv("SystemRoot"); + if (system_root.empty()) + { + system_root = LLStringUtil::getenv("WINDIR"); + } + if (system_root.empty()) + { + LL_WARNS() << "Neither SystemRoot nor WINDIR environment variable is set" << LL_ENDL; + system_root = "C:\\Windows"; // Last resort fallback + } + params.executable = system_root + "\\explorer.exe"; + params.args.add("/select,"); + params.args.add(filepath); +#elif LL_DARWIN + // macOS: Use 'open' command with -R flag to reveal in Finder + params.executable = "/usr/bin/open"; + params.args.add("-R"); + params.args.add(filepath); +#elif LL_LINUX + // Linux: Use xdg-open to open the directory + // Note: Most file managers don't support file selection, so we open the directory + params.executable = "/usr/bin/xdg-open"; + params.args.add(dir_path); +#else + LL_WARNS() << "Platform not supported for file browser opening" << LL_ENDL; + return; +#endif + + params.autokill = false; // Don't kill the file browser when viewer exits + + if (!LLProcess::create(params)) + { + LL_WARNS() << "Failed to open file browser for: " << filepath << LL_ENDL; + } + else + { + LL_INFOS() << "Opened file browser for: " << filepath << LL_ENDL; + } +} + void dir_exists_or_crash(const std::string &dir_name) { #if LL_WINDOWS diff --git a/indra/llfilesystem/lldir.h b/indra/llfilesystem/lldir.h index 8388816059..8742b7f937 100644 --- a/indra/llfilesystem/lldir.h +++ b/indra/llfilesystem/lldir.h @@ -194,6 +194,9 @@ class LLDir virtual void dumpCurrentDirectories(LLError::ELevel level = LLError::LEVEL_DEBUG); + // Open the system file browser to reveal a file or directory + void openDir(const std::string& filepath); + // Utility routine std::string buildSLOSCacheDir() const; diff --git a/indra/llfilesystem/llfilesystem.cpp b/indra/llfilesystem/llfilesystem.cpp index 388cbc280f..dcebec494f 100644 --- a/indra/llfilesystem/llfilesystem.cpp +++ b/indra/llfilesystem/llfilesystem.cpp @@ -33,6 +33,7 @@ #include "llfilesystem.h" #include "llfasttimer.h" #include "lldiskcache.h" +#include "boost/filesystem.hpp" constexpr S32 LLFileSystem::READ = 0x00000001; constexpr S32 LLFileSystem::WRITE = 0x00000002; @@ -74,9 +75,12 @@ bool LLFileSystem::getExists(const LLUUID& file_id, const LLAssetType::EType fil LL_PROFILE_ZONE_SCOPED; const std::string filename = LLDiskCache::metaDataToFilepath(file_id, file_type); - // not only test for existence but for the file to be not empty - S64 size = LLFile::size(filename); - return size > 0; + boost::system::error_code ec; + if (boost::filesystem::exists(filename, ec) && boost::filesystem::is_regular_file(filename, ec)) + { + return boost::filesystem::file_size(filename, ec) > 0; + } + return false; } // static @@ -108,6 +112,19 @@ bool LLFileSystem::renameFile(const LLUUID& old_file_id, const LLAssetType::ETyp return true; } +// static +S32 LLFileSystem::getFileSize(const LLUUID& file_id, const LLAssetType::EType file_type) +{ + const std::string filename = LLDiskCache::metaDataToFilepath(file_id, file_type); + + boost::system::error_code ec; + if (boost::filesystem::exists(filename, ec) && boost::filesystem::is_regular_file(filename, ec)) + { + return static_cast<S32>(boost::filesystem::file_size(filename, ec)); + } + return 0; +} + bool LLFileSystem::read(U8* buffer, S32 bytes) { bool success = false; diff --git a/indra/llfilesystem/llfilesystem.h b/indra/llfilesystem/llfilesystem.h index bc8b9216bd..d212a5d709 100644 --- a/indra/llfilesystem/llfilesystem.h +++ b/indra/llfilesystem/llfilesystem.h @@ -62,6 +62,7 @@ class LLFileSystem void updateFileAccessTime(); static bool getExists(const LLUUID& file_id, const LLAssetType::EType file_type); + static S32 getFileSize(const LLUUID& file_id, const LLAssetType::EType file_type); static bool removeFile(const LLUUID& file_id, const LLAssetType::EType file_type, int suppress_warning = 0); static bool renameFile(const LLUUID& old_file_id, const LLAssetType::EType old_file_type, const LLUUID& new_file_id, const LLAssetType::EType new_file_type); diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h index 0e11dca876..196ecdcf7d 100644 --- a/indra/llmath/v3math.h +++ b/indra/llmath/v3math.h @@ -155,7 +155,6 @@ class LLVector3 friend const LLVector3& operator*=(LLVector3 &a, const LLVector3 &b); // Returns a * b; friend const LLVector3& operator*=(LLVector3 &a, F32 k); // Return a times scaler k friend const LLVector3& operator/=(LLVector3 &a, F32 k); // Return a divided by scaler k - friend const LLVector3& operator/=(LLVector3& a, const LLVector3& b); friend const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &b); // Returns a * b; friend LLVector3 operator-(const LLVector3 &a); // Return vector -a @@ -461,14 +460,6 @@ inline const LLVector3& operator/=(LLVector3& a, F32 k) return a; } -inline const LLVector3& operator/=(LLVector3& a, const LLVector3& b) -{ - a.mV[VX] /= b.mV[VX]; - a.mV[VY] /= b.mV[VY]; - a.mV[VZ] /= b.mV[VZ]; - return a; -} - inline LLVector3 operator-(const LLVector3& a) { return LLVector3(-a.mV[VX], -a.mV[VY], -a.mV[VZ]); diff --git a/indra/llmessage/llcorehttputil.cpp b/indra/llmessage/llcorehttputil.cpp index f18af1f18e..7e619d45e3 100644 --- a/indra/llmessage/llcorehttputil.cpp +++ b/indra/llmessage/llcorehttputil.cpp @@ -37,6 +37,7 @@ #include "llsdserialize.h" #include "boost/json.hpp" // Boost.Json #include "llfilesystem.h" +#include "workqueue.h" #include "message.h" // for getting the port #include "llstl.h" @@ -297,41 +298,73 @@ void HttpCoroHandler::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRespons } else { - try + constexpr size_t MAX_BODY_SIZE_THRESHOLD = 65536; + bool posted = false; + // Some messsages (ex: AISAPI) can return large bodies. + // If the body is larger than our threshold, post the + // parsing to the general queue to avoid stalling the + // main thread. + if (response->getBodySize() > MAX_BODY_SIZE_THRESHOLD) { - result = this->handleSuccess(response, status); - } - catch (std::bad_alloc&) - { - LLError::LLUserWarningMsg::showOutOfMemory(); - LL_ERRS("CoreHTTP") << "Failed to allocate memory for response handling." << LL_ENDL; - } - } + response->addRef(); - buildStatusEntry(response, status, result); + LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop"); + LL::WorkQueue::ptr_t general_queue = LL::WorkQueue::getInstance("General"); + posted = main_queue->postTo( + general_queue, + [handler = shared_from_this(), response, status]() // Work done on general queue + { + std::pair<LLSD, LLCore::HttpStatus> result; + result.second = status; + try + { + result.first = handler->handleSuccess(response, result.second); + } + catch (std::bad_alloc&) + { + LLError::LLUserWarningMsg::showOutOfMemory(); + LL_ERRS("CoreHTTP") << "Failed to allocate memory for response handling (threaded)." << LL_ENDL; + } + // LLSD is not thread safe! Be carefull with moving the result around. + return result; + }, + [handler = shared_from_this(), response](std::pair<LLSD, LLCore::HttpStatus> result) mutable // Callback to main thread + { + handler->replyPost(response, result.second, result.first); + response->release(); + }); - if (!status) - { - LLSD &httpStatus = result[HttpCoroutineAdapter::HTTP_RESULTS]; + if (posted) + { + // Thread will do the cleanup and notify the pump. Done. + return; + } + else + { + // For whatever reason, failed to post, clean up and + // do the work on the main thread. + response->release(); + } + } - LLCore::BufferArray *body = response->getBody(); - LLCore::BufferArrayStream bas(body); - LLSD::String bodyData; - bodyData.reserve(response->getBodySize()); - bas >> std::noskipws; - bodyData.assign(std::istream_iterator<U8>(bas), std::istream_iterator<U8>()); - httpStatus["error_body"] = LLSD(bodyData); - if (getBoolSetting(HTTP_LOGBODY_KEY)) + if (!posted) { - // commenting out, but keeping since this can be useful for debugging - LL_WARNS("CoreHTTP") << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL; + try + { + result = this->handleSuccess(response, status); + } + catch (std::bad_alloc&) + { + LLError::LLUserWarningMsg::showOutOfMemory(); + LL_ERRS("CoreHTTP") << "Failed to allocate memory for response handling." << LL_ENDL; + } } } - mReplyPump.post(result); + replyPost(response, status, result); } -void HttpCoroHandler::buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result) +void HttpCoroHandler::buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result) const { LLSD httpresults = LLSD::emptyMap(); @@ -359,6 +392,31 @@ void HttpCoroHandler::buildStatusEntry(LLCore::HttpResponse *response, LLCore::H result[HttpCoroutineAdapter::HTTP_RESULTS] = httpresults; } +void HttpCoroHandler::replyPost(LLCore::HttpResponse* response, LLCore::HttpStatus &status, LLSD& result) +{ + buildStatusEntry(response, status, result); + + if (!status) + { + LLSD& httpStatus = result[HttpCoroutineAdapter::HTTP_RESULTS]; + + LLCore::BufferArray* body = response->getBody(); + LLCore::BufferArrayStream bas(body); + LLSD::String bodyData; + bodyData.reserve(response->getBodySize()); + bas >> std::noskipws; + bodyData.assign(std::istream_iterator<U8>(bas), std::istream_iterator<U8>()); + httpStatus["error_body"] = LLSD(bodyData); + if (getBoolSetting(HTTP_LOGBODY_KEY)) + { + // commenting out, but keeping since this can be useful for debugging + LL_WARNS("CoreHTTP") << "Returned body=" << std::endl << httpStatus["error_body"].asString() << LL_ENDL; + } + } + + mReplyPump.post(result); +} + void HttpCoroHandler::writeStatusCodes(LLCore::HttpStatus status, const std::string &url, LLSD &result) { result[HttpCoroutineAdapter::HTTP_RESULTS_SUCCESS] = static_cast<LLSD::Boolean>(status); @@ -391,8 +449,8 @@ public: HttpCoroLLSDHandler(LLEventStream &reply); protected: - virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status); - virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success); + virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const; + virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const; }; //------------------------------------------------------------------------- @@ -402,7 +460,7 @@ HttpCoroLLSDHandler::HttpCoroLLSDHandler(LLEventStream &reply): } -LLSD HttpCoroLLSDHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) +LLSD HttpCoroLLSDHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const { LLSD result; @@ -445,7 +503,7 @@ LLSD HttpCoroLLSDHandler::handleSuccess(LLCore::HttpResponse * response, LLCore: return result; } -LLSD HttpCoroLLSDHandler::parseBody(LLCore::HttpResponse *response, bool &success) +LLSD HttpCoroLLSDHandler::parseBody(LLCore::HttpResponse *response, bool &success) const { success = true; if (response->getBodySize() == 0) @@ -476,8 +534,8 @@ class HttpCoroRawHandler : public HttpCoroHandler public: HttpCoroRawHandler(LLEventStream &reply); - virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status); - virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success); + virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const; + virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const; }; //------------------------------------------------------------------------- @@ -486,7 +544,7 @@ HttpCoroRawHandler::HttpCoroRawHandler(LLEventStream &reply): { } -LLSD HttpCoroRawHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) +LLSD HttpCoroRawHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const { LLSD result = LLSD::emptyMap(); @@ -532,7 +590,7 @@ LLSD HttpCoroRawHandler::handleSuccess(LLCore::HttpResponse * response, LLCore:: return result; } -LLSD HttpCoroRawHandler::parseBody(LLCore::HttpResponse *response, bool &success) +LLSD HttpCoroRawHandler::parseBody(LLCore::HttpResponse *response, bool &success) const { success = true; return LLSD(); @@ -551,8 +609,8 @@ class HttpCoroJSONHandler : public HttpCoroHandler public: HttpCoroJSONHandler(LLEventStream &reply); - virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status); - virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success); + virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const; + virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const; }; //------------------------------------------------------------------------- @@ -561,7 +619,7 @@ HttpCoroJSONHandler::HttpCoroJSONHandler(LLEventStream &reply) : { } -LLSD HttpCoroJSONHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) +LLSD HttpCoroJSONHandler::handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const { LLSD result = LLSD::emptyMap(); @@ -587,7 +645,7 @@ LLSD HttpCoroJSONHandler::handleSuccess(LLCore::HttpResponse * response, LLCore: return result; } -LLSD HttpCoroJSONHandler::parseBody(LLCore::HttpResponse *response, bool &success) +LLSD HttpCoroJSONHandler::parseBody(LLCore::HttpResponse *response, bool &success) const { success = true; BufferArray * body(response->getBody()); diff --git a/indra/llmessage/llcorehttputil.h b/indra/llmessage/llcorehttputil.h index 8fa638fd6e..17d59092a2 100644 --- a/indra/llmessage/llcorehttputil.h +++ b/indra/llmessage/llcorehttputil.h @@ -259,7 +259,7 @@ inline LLCore::HttpHandle requestPatchWithLLSD(LLCore::HttpRequest::ptr_t & requ /// +- ["url"] - The URL used to make the call. /// +- ["headers"] - A map of name name value pairs with the HTTP headers. /// -class HttpCoroHandler : public LLCore::HttpHandler +class HttpCoroHandler : public LLCore::HttpHandler, public std::enable_shared_from_this<HttpCoroHandler> { public: @@ -279,11 +279,12 @@ public: protected: /// this method may modify the status value - virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) = 0; - virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) = 0; + virtual LLSD handleSuccess(LLCore::HttpResponse * response, LLCore::HttpStatus &status) const = 0; + virtual LLSD parseBody(LLCore::HttpResponse *response, bool &success) const = 0; private: - void buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result); + void buildStatusEntry(LLCore::HttpResponse *response, LLCore::HttpStatus status, LLSD &result) const; + void replyPost(LLCore::HttpResponse* response, LLCore::HttpStatus& status, LLSD& result); LLEventStream &mReplyPump; }; diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 803574f9fa..c2f602c119 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -1650,3 +1650,15 @@ void LLPluginClassMedia::initializeUrlHistory(const LLSD& url_history) LL_DEBUGS("Plugin") << "Sending history" << LL_ENDL; } + +void LLPluginClassMedia::forceRenderRefresh() +{ + // Force layout recalculation by briefly hiding/showing the web content + // Used to clear black screen issues after resize, see #5607 + const std::string refresh_script = + "document.documentElement.style.visibility='hidden';" + "document.documentElement.offsetHeight;" + "document.documentElement.style.visibility='';"; + + executeJavaScript(refresh_script); +} diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index bfede4e9c1..43514687ed 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -354,6 +354,8 @@ public: std::shared_ptr<LLPluginClassMedia> getSharedPtr() { return std::dynamic_pointer_cast<LLPluginClassMedia>(shared_from_this()); } // due to enable_shared_from_this + void forceRenderRefresh(); + protected: LLPluginClassMediaOwner *mOwner; diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp index b2cd1dc597..764ab222ad 100644 --- a/indra/llprimitive/llgltfmaterial.cpp +++ b/indra/llprimitive/llgltfmaterial.cpp @@ -924,6 +924,34 @@ void LLGLTFMaterial::updateTextureTracking() // for material overrides editor will set it } +// Test cases: +// Case 1. +// Input: scale 1.0,1.0; Offset horizontal 0.0, Offset vertical 0.0 Rotation 0.349066; +// Expected output: scale 1.0,1.0; Offset horizontal 0.201, Offset vertical -0.141 Rotation -0.349066; +// Case 2. +// Input: scale 1.0,1.0; Offset horizontal 0.5, Offset vertical 0.1 Rotation 0; +// Expected output: scale 1.0,1.0; Offset horizontal 0.5, Offset vertical -0.1 Rotation -0; +// Case 3. +// Input: scale 1.0,1.0; Offset horizontal 0.1, Offset vertical 0.2 Rotation 0.349066; +// Expected output: scale 1.0,1.0; Offset horizontal 0.295, Offset vertical -0.345 Rotation -0.349066; +// Case 4. +// Input: scale 1.0,1.0; Offset horizontal 0.5, Offset vertical 0.0 Rotation 0.349066; +// Expected output: scale 1.0,1.0; Offset horizontal 0.701, Offset vertical -0.141 Rotation -0.349066; +// Case 5. +// Input: scale 10.0,15.0; Offset horizontal 0.0, Offset vertical 0.0 Rotation -1.57079637 +// Expected output: scale 15.0,10.0; Offset horizontal 7.5, Offset vertical -4.0 Rotation 1.57079637; +// Case 6. +// Input: scale 10.0,15.0; Offset horizontal 0.0, Offset vertical 0.0 Rotation 0 +// Expected output: scale 10.0,15.0; Offset horizontal 0.5, Offset vertical .0 Rotation 0; +// Case 7. +// Input: scale 10.0,15.0; Offset horizontal 0.0, Offset vertical 0.0 Rotation -0.785398163 +// Expected output: scale 12.74,12.74; Offset horizontal 0.5, Offset vertical .0 Rotation 0.785398163; +// +// Legacy offsets are right to left and top to bottom. +// PBR offsets are right to left and bottom to top. +// +// Legacy rotation is relative to face's center counter clockwise, +// PBR rotation is relative to top-left corner, clockwise void LLGLTFMaterial::convertTextureTransformToPBR( F32 tex_scale_s, F32 tex_scale_t, @@ -934,23 +962,108 @@ void LLGLTFMaterial::convertTextureTransformToPBR( LLVector2& pbr_offset, F32& pbr_rotation) { - pbr_scale.set(tex_scale_s, tex_scale_t); - pbr_rotation = -(tex_rotation) / 2.f; - const F32 adjusted_offset_s = tex_offset_s; - const F32 adjusted_offset_t = -tex_offset_t; - F32 center_adjust_s = 0.5f * (1.0f - tex_scale_s); - F32 center_adjust_t = 0.5f * (1.0f - tex_scale_t); + // Legacy is counter-clockwise, PBR is clockwise + pbr_rotation = -tex_rotation; - if (pbr_rotation != 0.0f) + // Center of the tile + const F32 center_s = 0.5f; + const F32 center_t = 0.5f; + + // Calculate the rotated scale + F32 cos_rot = cosf(tex_rotation); + F32 sin_rot = sinf(tex_rotation); + F32 cos_sq = cos_rot * cos_rot; + F32 sin_sq = sin_rot * sin_rot; + + // GLTF scale doesn't match legacy scaling when rotation is applied. + // Legacy applies scale then rotation, which allows for planar aligment + // withoutn deformations, but gltf rotates first, so when scale gets + // aplied image gets deformed by rotation. + // It appears to be imposible to properly match legacy scale, so this + // is an approximation that at least matches at 0, 90, 180, 270 degree + // rotations, and is close enough at angles like 45. + pbr_scale.mV[VX] = tex_scale_s * cos_sq + tex_scale_t * sin_sq; + pbr_scale.mV[VY] = tex_scale_s * sin_sq + tex_scale_t * cos_sq; + + // Center adjustment for scale + F32 center_adjust_s = 0.5f * (1.0f - pbr_scale.mV[VX]); + F32 center_adjust_t = 0.5f * (1.0f - pbr_scale.mV[VY]); + + // 2. Offset from center + F32 pos_s = center_adjust_s - center_s; + F32 pos_t = center_adjust_t - center_t; + + // 3. Rotate around center (clockwise, as per GLTF spec) + F32 c = cosf(pbr_rotation); + F32 s = sinf(pbr_rotation); + F32 rot_s = pos_s * c + pos_t * s; + F32 rot_t = -pos_s * s + pos_t * c; + + // 4. Move back to top-left and apply offset + pbr_offset.set(rot_s + center_s + tex_offset_s, rot_t + center_t - tex_offset_t); +} + +// Convert PBR transform values back to legacy TE transform values. +// This is the reverse of convertTextureTransformToPBR. +void LLGLTFMaterial::convertPBRTransformToTexture( + const LLVector2& pbr_scale, + const LLVector2& pbr_offset, + F32 pbr_rotation, + F32& tex_scale_s, + F32& tex_scale_t, + F32& tex_offset_s, + F32& tex_offset_t, + F32& tex_rotation) +{ + tex_rotation = -pbr_rotation; + + // Reverse the scale transformation + // From: pbr_s = tex_s * cos² + tex_t * sin² + // pbr_t = tex_s * sin² + tex_t * cos² + // Solve for tex_s and tex_t + F32 cos_rot = cosf(tex_rotation); + F32 sin_rot = sinf(tex_rotation); + F32 cos_sq = cos_rot * cos_rot; + F32 sin_sq = sin_rot * sin_rot; + + F32 denom = cos_sq * cos_sq - sin_sq * sin_sq; + + if (fabsf(denom) < 0.0001f) // Near 45 degrees (cos²≈sin²≈0.5) + { + // At 45°: both scales contribute equally + // pbr_s = pbr_t = (tex_s + tex_t) / 2 + // So: tex_s + tex_t = 2 * pbr_avg + // Use the average and assume symmetric scaling + tex_scale_s = tex_scale_t = (pbr_scale.mV[VX] + pbr_scale.mV[VY]) / 2.f; + } + else { - const F32 c = cosf(pbr_rotation); - const F32 s = sinf(pbr_rotation); - const F32 tmp_s = center_adjust_s * c - center_adjust_t * s; - const F32 tmp_t = center_adjust_s * s + center_adjust_t * c; - center_adjust_s = tmp_s; - center_adjust_t = tmp_t; + // Solve the 2x2 system: + // pbr_s * cos² - pbr_t * sin² = tex_s * (cos⁴ - sin⁴) + // pbr_t * cos² - pbr_s * sin² = tex_t * (cos⁴ - sin⁴) + tex_scale_s = (pbr_scale.mV[VX] * cos_sq - pbr_scale.mV[VY] * sin_sq) / denom; + tex_scale_t = (pbr_scale.mV[VY] * cos_sq - pbr_scale.mV[VX] * sin_sq) / denom; } - pbr_offset.set(adjusted_offset_s + center_adjust_s, - adjusted_offset_t + center_adjust_t); + // Center of the tile + const F32 center_s = 0.5f; + const F32 center_t = 0.5f; + + // Center adjustment for scale + F32 center_adjust_s = 0.5f * (1.0f - pbr_scale.mV[VX]); + F32 center_adjust_t = 0.5f * (1.0f - pbr_scale.mV[VY]); + + // 2. Offset from center + F32 pos_s = center_adjust_s - center_s; + F32 pos_t = center_adjust_t - center_t; + + // 3. Rotate around center (clockwise, as per GLTF spec) + F32 c = cosf(pbr_rotation); + F32 s = sinf(pbr_rotation); + F32 rot_s = pos_s * c + pos_t * s; + F32 rot_t = -pos_s * s + pos_t * c; + + // 3. Recover legacy offset + tex_offset_s = pbr_offset.mV[0] - rot_s - center_s; + tex_offset_t = -(pbr_offset.mV[1] - rot_t - center_t); } diff --git a/indra/llprimitive/llgltfmaterial.h b/indra/llprimitive/llgltfmaterial.h index 8d45cb6185..c37062e7d3 100644 --- a/indra/llprimitive/llgltfmaterial.h +++ b/indra/llprimitive/llgltfmaterial.h @@ -222,6 +222,14 @@ public: LLVector2& pbr_scale, LLVector2& pbr_offset, F32& pbr_rotation); + + // Convert PBR transform values to legacy TE transform values. + static void convertPBRTransformToTexture(const LLVector2& pbr_scale, + const LLVector2& pbr_offset, + F32 pbr_rotation, + F32& tex_scale_s, F32& tex_scale_t, + F32& tex_offset_s, F32& tex_offset_t, + F32& tex_rotation); protected: static LLVector2 vec2FromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const LLVector2& default_value); static F32 floatFromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const F32 default_value); diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index d37b16ce0c..19326d301e 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -39,6 +39,7 @@ // For some reason, this won't work if it's not wrapped in the ifdef #ifdef FT_FREETYPE_H #include FT_FREETYPE_H +#include FT_MULTIPLE_MASTERS_H #endif #include "lldir.h" @@ -116,6 +117,8 @@ LLFontGlyphInfo::LLFontGlyphInfo(U32 index, EFontGlyphType glyph_type) mYBitmapOffset(0), // Offset to the origin in the bitmap mXBearing(0), // Distance from baseline to left in pixels mYBearing(0), // Distance from baseline to top in pixels + mLsbDelta(0), + mRsbDelta(0), mBitmapEntry(std::make_pair(EFontGlyphType::Unspecified, -1)) // Which bitmap in the bitmap cache contains this glyph { } @@ -131,6 +134,8 @@ LLFontGlyphInfo::LLFontGlyphInfo(const LLFontGlyphInfo& fgi) , mYBitmapOffset(fgi.mYBitmapOffset) , mXBearing(fgi.mXBearing) , mYBearing(fgi.mYBearing) + , mLsbDelta(fgi.mLsbDelta) + , mRsbDelta(fgi.mRsbDelta) { mBitmapEntry = fgi.mBitmapEntry; } @@ -141,6 +146,7 @@ LLFontFreetype::LLFontFreetype() mDescender(0.f), mLineHeight(0.f), mIsFallback(false), + mHinting(EFontHinting::FORCE_AUTOHINT), mFTFace(nullptr), mRenderGlyphCount(0), mStyle(0), @@ -164,7 +170,7 @@ LLFontFreetype::~LLFontFreetype() // mFallbackFonts cleaned up by LLPointer destructor } -bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n) +bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags) { // Don't leak face objects. This is also needed to deal with // changed font file names. @@ -188,6 +194,20 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v return false; mIsFallback = is_fallback; + mHinting = hinting; + mFontFlags = flags; + mWeight = weight; + + bool variable_font = false; + if (weight >= 0) + { + variable_font = setVariationAxis("wght", static_cast<F32>(weight)); + + // For Inter, also set optical size based on point size + // This makes text look better at different sizes + setVariationAxis("opsz", point_size); + } + F32 pixels_per_em = (point_size / 72.f)*vert_dpi; // Size in inches * dpi error = FT_Set_Char_Size(mFTFace, /* handle to face object */ @@ -243,6 +263,18 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v { mStyle |= LLFontGL::BOLD; } + else if (flags & LLFontGL::BOLD) + { + // FontGL applies programmatic bolding to fonts that are a part of 'bold' descriptor but don't have the bold style set. + // Ex: Inter SemiBold doesn't have FT_STYLE_FLAG_BOLD and without this style it would be bolded programmatically. + mStyle |= LLFontGL::BOLD; + } + else if (weight >= 600 && variable_font) + { + // If the font is heavy enough, consider it bold and avoid programmatic bolding + // even if it doesn't have the bold style set. + mStyle |= LLFontGL::BOLD; + } if(mFTFace->style_flags & FT_STYLE_FLAG_ITALIC) { @@ -341,16 +373,10 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const //llassert(!mIsFallback); LLFontGlyphInfo* left_glyph_info = getGlyphInfo(char_left, EFontGlyphType::Unspecified);; - U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0; // Kern this puppy. LLFontGlyphInfo* right_glyph_info = getGlyphInfo(char_right, EFontGlyphType::Unspecified); - U32 right_glyph = right_glyph_info ? right_glyph_info->mGlyphIndex : 0; - FT_Vector delta; - - llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, ft_kerning_unfitted, &delta)); - - return delta.x*(1.f/64.f); + return getXKerning(left_glyph_info, right_glyph_info); } F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const @@ -363,9 +389,28 @@ F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LL FT_Vector delta; - llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, ft_kerning_unfitted, &delta)); + llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, FT_KERNING_UNFITTED, &delta)); - return delta.x*(1.f/64.f); + // Apply the FreeType auto-hinter's subpixel side-bearing correction between + // adjacent glyphs. When the hinter has shifted the right side of the left + // glyph or the left side of the right glyph, (rsb_delta - lsb_delta) is the + // sub-pixel nudge that keeps spacing visually even. + F32 delta_correction = 0.0f; + if (left_glyph_info && right_glyph_info) + { + // According to FreeType docs, these delta values should only trigger + // discrete ±1 pixel adjustments when they cross certain thresholds. + // Substructing delta_diff from delta.x doesn't work as well as treating + // it as a thresholds + S32 delta_diff = left_glyph_info->mRsbDelta - right_glyph_info->mLsbDelta; + if (delta_diff > 32) + delta_correction = -1.0f; + else if (delta_diff < -31) + delta_correction = 1.0f; + } + + // ft_kerning_unfitted mode always returns 26.6 fixed-point values + return (F32)(delta.x * (1.f / 64.f)) + delta_correction; } bool LLFontFreetype::hasGlyph(llwchar wch) const @@ -510,6 +555,11 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l gi->mHeight = height; gi->mXBearing = fontp->mFTFace->glyph->bitmap_left; gi->mYBearing = fontp->mFTFace->glyph->bitmap_top; + // FreeType fills these when the glyph has been auto-hinted; they describe how + // much the hinter nudged the left/right side bearings (in 26.6 pixels). Keep + // them so inter-glyph spacing can be corrected in getXKerning(). + gi->mLsbDelta = (S32)fontp->mFTFace->glyph->lsb_delta; + gi->mRsbDelta = (S32)fontp->mFTFace->glyph->rsb_delta; // Convert these from 26.6 units to float pixels. gi->mXAdvance = fontp->mFTFace->glyph->advance.x / 64.f; gi->mYAdvance = fontp->mFTFace->glyph->advance.y / 64.f; @@ -635,7 +685,7 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, ll if (mFTFace == nullptr) return; - FT_Int32 load_flags = FT_LOAD_FORCE_AUTOHINT; + FT_Int32 load_flags = (FT_Int32)mHinting; if (EFontGlyphType::Color == bitmap_type) { // We may not actually get a color render so our caller should always examine mFTFace->glyph->bitmap.pixel_mode @@ -678,7 +728,7 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, ll void LLFontFreetype::reset(F32 vert_dpi, F32 horz_dpi) { resetBitmapCache(); - loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mIsFallback, 0); + loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mWeight, mIsFallback, 0, mHinting, mFontFlags); if (!mIsFallback) { // This is the head of the list - need to rebuild ourself and all fallbacks. @@ -846,6 +896,73 @@ void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 } } +bool LLFontFreetype::setVariationAxis(const std::string& axis_tag, F32 value) +{ + if (!mFTFace) + return false; + + // Check if this is a variable font + FT_MM_Var* master = nullptr; + if (FT_Get_MM_Var(mFTFace, &master) != 0) + { + // Not a variable font - this is not an error, just silently skip + return false; + } + + // Find the axis by tag (e.g., "wght" for weight) + FT_UInt axis_index = 0; + bool found = false; + for (FT_UInt i = 0; i < master->num_axis; i++) + { + // Compare the 4-byte tag + if (master->axis[i].tag == FT_MAKE_TAG(axis_tag[0], axis_tag[1], axis_tag[2], axis_tag[3])) + { + axis_index = i; + found = true; + + // Clamp value to valid range for this axis + F32 min_val = master->axis[i].minimum / 65536.0f; + F32 max_val = master->axis[i].maximum / 65536.0f; + value = llclamp(value, min_val, max_val); + + break; + } + } + + if (!found) + { + FT_Done_MM_Var(gFTLibrary, master); + LL_WARNS_ONCE("Font") << "Axis '" << axis_tag << "' not found in font: " << mName << LL_ENDL; + return false; + } + + FT_UInt num_coords = master->num_axis; + FT_Fixed* coords = new FT_Fixed[num_coords]; + + // Get current coordinates + FT_Get_Var_Design_Coordinates(mFTFace, num_coords, coords); + + // Update the specific axis + coords[axis_index] = (FT_Fixed)(value * 65536.0f); + + // Set all coordinates + int error = FT_Set_Var_Design_Coordinates(mFTFace, num_coords, coords); + + delete[] coords; + FT_Done_MM_Var(gFTLibrary, master); + + if (error != 0) + { + LL_WARNS() << "Failed to set variation coordinates for " << axis_tag + << " = " << value << " in font: " << mName << LL_ENDL; + return false; + } + + LL_DEBUGS("Font") << "Set " << axis_tag << " = " << value + << " for font: " << mName << LL_ENDL; + return true; +} + namespace ll { diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index f7600e40a3..d2164e8fa2 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -43,6 +43,7 @@ struct FT_FaceRec_; typedef struct FT_FaceRec_* LLFT_Face; struct FT_StreamRec_; typedef struct FT_StreamRec_ LLFT_Stream; +enum class EFontHinting : S32; namespace ll { @@ -87,6 +88,8 @@ struct LLFontGlyphInfo S32 mYBitmapOffset; // Offset to the origin in the bitmap S32 mXBearing; // Distance from baseline to left in pixels S32 mYBearing; // Distance from baseline to top in pixels + S32 mLsbDelta; // FreeType subpixel left side bearing delta (26.6 units) + S32 mRsbDelta; // FreeType subpixel right side bearing delta (26.6 units) std::pair<EFontGlyphType, S32> mBitmapEntry; // Which bitmap in the bitmap cache contains this glyph }; @@ -100,7 +103,7 @@ public: // is_fallback should be true for fallback fonts that aren't used // to render directly (Unicode backup, primarily) - bool loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n); + bool loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags); S32 getNumFaces(const std::string& filename); @@ -162,9 +165,14 @@ private: void resetBitmapCache(); void setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride = 0) const; bool setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U16 height, const U8* data, U32 stride) const; + bool setVariationAxis(const std::string& axis_tag, F32 value); bool hasGlyph(llwchar wch) const; // Has a glyph for this character LLFontGlyphInfo* addGlyph(llwchar wch, EFontGlyphType glyph_type) const; // Add a new character to the font if necessary - LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found) + LLFontGlyphInfo* addGlyphFromFont( + const LLFontFreetype *fontp, + llwchar wch, + U32 glyph_index, + EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found) void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const; void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const; @@ -180,6 +188,9 @@ private: LLFT_Face mFTFace; bool mIsFallback; + EFontHinting mHinting; + S32 mFontFlags; + S32 mWeight = -1; typedef std::pair<LLPointer<LLFontFreetype>, char_functor_t> fallback_font_t; typedef std::vector<fallback_font_t> fallback_font_vector_t; fallback_font_vector_t mFallbackFonts; // A list of fallback fonts to look for glyphs in (for Unicode chars) diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 16eec1fdd2..5d99c35047 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -90,14 +90,14 @@ void LLFontGL::destroyGL() mFontFreetype->destroyGL(); } -bool LLFontGL::loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool is_fallback, S32 face_n) +bool LLFontGL::loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags) { if(mFontFreetype == reinterpret_cast<LLFontFreetype*>(NULL)) { mFontFreetype = new LLFontFreetype; } - return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, is_fallback, face_n); + return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, weight, is_fallback, face_n, hinting, flags); } S32 LLFontGL::getNumFaces(const std::string& filename) @@ -1115,7 +1115,14 @@ LLFontGL* LLFontGL::getFontSansSerifSmallItalic() //static LLFontGL* LLFontGL::getFontSansSerif() { - static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",0)); + static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Small",0)); + return fontp; +} + +// static +LLFontGL* LLFontGL::getFontSansSerifMedium() +{ + static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif", "Medium", 0)); return fontp; } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 1c8e036f58..3b82d8e43d 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -87,7 +87,7 @@ public: void destroyGL(); - bool loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool is_fallback, S32 face_n); + bool loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, S32 weight, bool is_fallback, S32 face_n, EFontHinting hinting, S32 flags); S32 getNumFaces(const std::string& filename); S32 getCacheGeneration() const; @@ -204,6 +204,7 @@ public: static LLFontGL* getFontSansSerifSmallBold(); static LLFontGL* getFontSansSerifSmallItalic(); static LLFontGL* getFontSansSerif(); + static LLFontGL* getFontSansSerifMedium(); static LLFontGL* getFontSansSerifBig(); static LLFontGL* getFontSansSerifHuge(); static LLFontGL* getFontSansSerifBold(); diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index c48a389f6a..890308ab54 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -170,7 +170,7 @@ LLFontDescriptor LLFontDescriptor::normalize() const if (new_size != s_template_string && new_size.empty() && findSubString(new_name,"Monospace")) new_size = "Monospace"; if (new_size.empty()) - new_size = "Medium"; + new_size = "Small"; if (removeSubString(new_name,"Bold")) new_style |= LLFontGL::BOLD; @@ -181,16 +181,16 @@ LLFontDescriptor LLFontDescriptor::normalize() const return LLFontDescriptor(new_name,new_size,new_style, getFontFiles(), getFontCollectionFiles()); } -void LLFontDescriptor::addFontFile(const std::string& file_name, const std::string& char_functor) +void LLFontDescriptor::addFontFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor) { char_functor_map_t::const_iterator it = mCharFunctors.find(char_functor); - mFontFiles.push_back(LLFontFileInfo(file_name, (mCharFunctors.end() != it) ? it->second : nullptr)); + mFontFiles.push_back(LLFontFileInfo(file_name, hinting, flags, size_delta, weight, (mCharFunctors.end() != it) ? it->second : nullptr)); } -void LLFontDescriptor::addFontCollectionFile(const std::string& file_name, const std::string& char_functor) +void LLFontDescriptor::addFontCollectionFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor) { char_functor_map_t::const_iterator it = mCharFunctors.find(char_functor); - mFontCollectionFiles.push_back(LLFontFileInfo(file_name, (mCharFunctors.end() != it) ? it->second : nullptr)); + mFontCollectionFiles.push_back(LLFontFileInfo(file_name, hinting, flags, size_delta, weight, (mCharFunctors.end() != it) ? it->second : nullptr)); } LLFontRegistry::LLFontRegistry(bool create_gl_textures) @@ -289,23 +289,69 @@ bool font_desc_init_from_xml(LLXMLNodePtr node, LLFontDescriptor& desc) { std::string font_file_name = child->getTextContents(); std::string char_functor; + EFontHinting hinting = EFontHinting::FORCE_AUTOHINT; + S32 flags = 0; + S32 weight = -1; if (child->hasAttribute("functor")) { child->getAttributeString("functor", char_functor); } + if (child->hasAttribute("font_hinting")) + { + std::string attr_hinting; + child->getAttributeString("font_hinting", attr_hinting); + LLStringUtil::toLower(attr_hinting); + + if (attr_hinting == "default") + { + hinting = EFontHinting::DEFAULT; + } + else if (attr_hinting == "force_auto") + { + hinting = EFontHinting::FORCE_AUTOHINT; + } + else if (attr_hinting == "no_hinting") + { + hinting = EFontHinting::NO_HINTING; + } + } + + if (child->hasAttribute("flags")) + { + std::string attr_flags; + child->getAttributeString("flags", attr_flags); + LLStringUtil::toLower(attr_flags); + + if (attr_flags == "bold") + { + flags |= LLFontGL::BOLD; + } + } + + F32 size_delta = 0.f; + if (child->hasAttribute("size_delta")) + { + child->getAttributeF32("size_delta", size_delta); + } + + if (child->hasAttribute("font_weight")) + { + child->getAttributeS32("font_weight", weight); + } + if (child->hasAttribute("load_collection")) { bool col = false; child->getAttributeBOOL("load_collection", col); if (col) { - desc.addFontCollectionFile(font_file_name, char_functor); + desc.addFontCollectionFile(font_file_name, hinting, flags, size_delta, weight, char_functor); } } - desc.addFontFile(font_file_name, char_functor); + desc.addFontFile(font_file_name, hinting, flags, size_delta, weight, char_functor); } else if (child->hasName("os")) { @@ -462,7 +508,7 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) // Add ultimate fallback list - generated dynamically on linux, // null elsewhere. std::transform(getUltimateFallbackList().begin(), getUltimateFallbackList().end(), std::back_inserter(font_files), - [](const std::string& file_name) { return LLFontFileInfo(file_name); }); + [](const std::string& file_name) { return LLFontFileInfo(file_name, EFontHinting::FORCE_AUTOHINT, 0, 0.f, -1); }); // Load fonts based on names. if (font_files.empty()) @@ -517,8 +563,8 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) { fontp = new LLFontGL; } - if (fontp->loadFace(font_path, point_size_scale, - LLFontGL::sVertDPI, LLFontGL::sHorizDPI, is_fallback, i)) + if (fontp->loadFace(font_path, point_size_scale + font_file_it->mSizeDelta, + LLFontGL::sVertDPI, LLFontGL::sHorizDPI, font_file_it->mWeight, is_fallback, i, font_file_it->mHinting, font_file_it->mFlags)) { is_font_loaded = true; if (is_first_found) diff --git a/indra/llrender/llfontregistry.h b/indra/llrender/llfontregistry.h index 8bbf5aa30c..fcbb2667e4 100644 --- a/indra/llrender/llfontregistry.h +++ b/indra/llrender/llfontregistry.h @@ -34,22 +34,45 @@ class LLFontGL; typedef std::vector<std::string> string_vec_t; +enum class EFontHinting : S32 +{ + DEFAULT = 0, + NO_HINTING = 0x8000U, + FORCE_AUTOHINT = 0x20, +}; + struct LLFontFileInfo { - LLFontFileInfo(const std::string& file_name, const std::function<bool(llwchar)>& char_functor = nullptr) + LLFontFileInfo(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::function<bool(llwchar)>& char_functor = nullptr) : FileName(file_name) , CharFunctor(char_functor) + , mHinting(hinting) + , mFlags(flags) + , mSizeDelta(size_delta) + , mWeight(weight) { } - LLFontFileInfo(const LLFontFileInfo& ffi) + LLFontFileInfo(const LLFontFileInfo& ffi, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight) : FileName(ffi.FileName) , CharFunctor(ffi.CharFunctor) + , mHinting(hinting) + , mFlags(flags) + , mSizeDelta(size_delta) + , mWeight(weight) { } std::string FileName; std::function<bool(llwchar)> CharFunctor; + EFontHinting mHinting; + S32 mFlags; + S32 mWeight; // -1 - default, whatever is in the file. + + // Not all fonts are the same size, Ex: dejavu is bigger than inter, + // so in some cases we want to adjust relative sizes to make characters + // from different files match. + F32 mSizeDelta; }; typedef std::vector<LLFontFileInfo> font_file_info_vec_t; @@ -71,10 +94,10 @@ public: const std::string& getSize() const { return mSize; } void setSize(const std::string& size) { mSize = size; } - void addFontFile(const std::string& file_name, const std::string& char_functor = LLStringUtil::null); + void addFontFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor = LLStringUtil::null); const font_file_info_vec_t & getFontFiles() const { return mFontFiles; } void setFontFiles(const font_file_info_vec_t& font_files) { mFontFiles = font_files; } - void addFontCollectionFile(const std::string& file_name, const std::string& char_functor = LLStringUtil::null); + void addFontCollectionFile(const std::string& file_name, EFontHinting hinting, S32 flags, F32 size_delta, S32 weight, const std::string& char_functor = LLStringUtil::null); const font_file_info_vec_t& getFontCollectionFiles() const { return mFontCollectionFiles; } void setFontCollectionFiles(const font_file_info_vec_t& font_collection_files) { mFontCollectionFiles = font_collection_files; } diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 3165cb313b..1cb7efafe2 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -2183,7 +2183,7 @@ void LLImageGL::calcAlphaChannelOffsetAndStride() void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h) { - if(sSkipAnalyzeAlpha || !mNeedsAlphaAndPickMask) + if(!data_in || sSkipAnalyzeAlpha || !mNeedsAlphaAndPickMask) { return ; } diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index e26c53bc2e..ab88e4868e 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -1698,64 +1698,25 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z) return; } - LLVector4a vert(x, y, z); - transform(vert); - mVerticesp[mCount] = vert; - - mCount++; - mVerticesp[mCount] = mVerticesp[mCount-1]; - mColorsp[mCount] = mColorsp[mCount-1]; - mTexcoordsp[mCount] = mTexcoordsp[mCount-1]; -} - -void LLRender::transform(LLVector3& vert) -{ - if (!mUIOffset.empty()) + if (mUIOffset.empty()) { - vert += LLVector3(mUIOffset.back().getF32ptr()); - vert *= LLVector3(mUIScale.back().getF32ptr()); + mVerticesp[mCount].set(x,y,z); } -} - -void LLRender::transform(LLVector4a& vert) -{ - if (!mUIOffset.empty()) + else { + LLVector4a vert(x, y, z); vert.add(mUIOffset.back()); vert.mul(mUIScale.back()); + mVerticesp[mCount] = vert; } -} - -void LLRender::untransform(LLVector3& vert) -{ - if (!mUIOffset.empty()) - { - vert /= LLVector3(mUIScale.back().getF32ptr()); - vert -= LLVector3(mUIOffset.back().getF32ptr()); - } -} - -void LLRender::batchTransform(LLVector4a* verts, U32 vert_count) -{ - if (!mUIOffset.empty()) - { - const LLVector4a& offset = mUIOffset.back(); - const LLVector4a& scale = mUIScale.back(); - - for (U32 i = 0; i < vert_count; ++i) - { - verts[i].add(offset); - verts[i].mul(scale); - } - } -} -void LLRender::vertexBatchPreTransformed(const std::vector<LLVector4a>& verts) -{ - vertexBatchPreTransformed(verts.data(), narrow(verts.size())); + mCount++; + mVerticesp[mCount] = mVerticesp[mCount-1]; + mColorsp[mCount] = mColorsp[mCount-1]; + mTexcoordsp[mCount] = mTexcoordsp[mCount-1]; } -void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count) +void LLRender::vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count) { if (mCount + vert_count > 4094) { @@ -1776,7 +1737,7 @@ void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count mVerticesp[mCount] = mVerticesp[mCount-1]; } -void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, S32 vert_count) +void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count) { if (mCount + vert_count > 4094) { @@ -1800,7 +1761,7 @@ void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector } } -void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, const LLColor4U* colors, S32 vert_count) +void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U* colors, S32 vert_count) { if (mCount + vert_count > 4094) { diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 51301c7cac..9c17cf3470 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -449,16 +449,9 @@ public: void diffuseColor4ubv(const U8* c); void diffuseColor4ub(U8 r, U8 g, U8 b, U8 a); - void transform(LLVector3& vert); - void transform(LLVector4a& vert); - void untransform(LLVector3& vert); - - void batchTransform(LLVector4a* verts, U32 vert_count); - - void vertexBatchPreTransformed(const std::vector<LLVector4a>& verts); - void vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count); - void vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, S32 vert_count); - void vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, const LLColor4U*, S32 vert_count); + void vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count); + void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count); + void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U*, S32 vert_count); void setColorMask(bool writeColor, bool writeAlpha); void setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha); diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 828bfb289b..fa9de1eb09 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -39,7 +39,7 @@ static const std::string DD_BUTTON_NAME = "dd_button"; static const std::string DD_TEXTBOX_NAME = "dd_textbox"; static const std::string DD_HEADER_NAME = "dd_header"; -static const S32 HEADER_HEIGHT = 23; +static const S32 HEADER_HEIGHT = 25; static const S32 HEADER_IMAGE_LEFT_OFFSET = 5; static const S32 HEADER_TEXT_LEFT_OFFSET = 30; static const F32 AUTO_OPEN_TIME = 1.f; diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 0048c44189..7f209c60a7 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -85,6 +85,7 @@ LLButton::Params::Params() image_top_pad("image_top_pad"), image_bottom_pad("image_bottom_pad"), imgoverlay_label_space("imgoverlay_label_space", 1), + image_overlay_right_delta("image_overlay_right_delta", 0), label_color("label_color"), label_color_selected("label_color_selected"), // requires is_toggle true label_color_disabled("label_color_disabled"), @@ -109,6 +110,8 @@ LLButton::Params::Params() commit_on_capture_lost("commit_on_capture_lost", false), display_pressed_state("display_pressed_state", true), use_draw_context_alpha("use_draw_context_alpha", true), + draw_focus_border("draw_focus_border", true), + hover_hand_cursor("hover_hand_cursor", false), badge("badge"), handle_right_mouse("handle_right_mouse"), held_down_delay("held_down_delay"), @@ -158,6 +161,7 @@ LLButton::LLButton(const LLButton::Params& p) mImageOverlayTopPad(p.image_top_pad), mImageOverlayBottomPad(p.image_bottom_pad), mImgOverlayLabelSpace(p.imgoverlay_label_space), + mImageOverlayRightDelta(p.image_overlay_right_delta), mIsToggle(p.is_toggle), mScaleImage(p.scale_image), mDropShadowedText(p.label_shadow), @@ -179,6 +183,8 @@ LLButton::LLButton(const LLButton::Params& p) mMouseUpSignal(NULL), mHeldDownSignal(NULL), mUseDrawContextAlpha(p.use_draw_context_alpha), + mDrawFocusBorder(p.draw_focus_border), + mHoverHandCursor(p.hover_hand_cursor), mHandleRightMouse(p.handle_right_mouse), mFlashingTimer(NULL) { @@ -653,7 +659,7 @@ bool LLButton::handleHover(S32 x, S32 y, MASK mask) } // We only handle the click if the click both started and ended within us - getWindow()->setCursor(UI_CURSOR_ARROW); + getWindow()->setCursor(mHoverHandCursor ? UI_CURSOR_HAND : UI_CURSOR_ARROW); LL_DEBUGS("UserInput") << "hover handled by " << getName() << LL_ENDL; } return true; @@ -840,10 +846,9 @@ void LLButton::draw() label_color = ll::ui::SearchableControl::getHighlightFontColor(); // overlay with keyboard focus border - if (hasFocus()) + if (hasFocus() && mDrawFocusBorder) { - F32 lerp_amt = gFocusMgr.getFocusFlashAmt(); - drawBorder(imagep, gFocusMgr.getFocusColor() % alpha, ll_round(lerp(1.f, 3.f, lerp_amt))); + drawBorder(imagep, gFocusMgr.getFocusColor() % alpha, gFocusMgr.getFocusFlashWidth()); } if (use_glow_effect) @@ -930,6 +935,17 @@ void LLButton::draw() } overlay_color.mV[VALPHA] *= alpha; + if (mImageOverlayRightDelta > 0) + { + mImageOverlay->draw(getRect().getWidth() - overlay_width - mImageOverlayRightDelta, + center_y - (overlay_height / 2), + overlay_width, + overlay_height, + overlay_color); + } + else + { + switch(mImageOverlayAlignment) { case LLFontGL::LEFT: @@ -964,6 +980,7 @@ void LLButton::draw() // draw nothing break; } + } } // Draw label diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index f530eceb4b..0d1a28ee31 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -110,6 +110,7 @@ public: //image overlay paddings Optional<S32> image_top_pad; Optional<S32> image_bottom_pad; + Optional<S32> image_overlay_right_delta; /** * Space between image_overlay and label @@ -132,7 +133,9 @@ public: Optional<F32> hover_glow_amount; Optional<TimeIntervalParam> held_down_delay; - Optional<bool> use_draw_context_alpha; + Optional<bool> use_draw_context_alpha, + draw_focus_border, + hover_hand_cursor; Optional<LLBadge::Params> badge; @@ -366,12 +369,16 @@ protected: S32 mImageOverlayBottomPad; bool mUseDrawContextAlpha; + bool mDrawFocusBorder; + bool mHoverHandCursor; /* * Space between image_overlay and label */ S32 mImgOverlayLabelSpace; + S32 mImageOverlayRightDelta; + F32 mHoverGlowStrength; F32 mCurGlowStrength; diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 91e6f281da..ca512a9883 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -67,6 +67,10 @@ LLConsole::LLConsole(const LLConsole::Params& p) { setFontSize(p.font_size_index); } + if (mFont == nullptr) + { + setFontSize(0); // sans-serif + } mFadeTime = mLinePersistTime - FADE_DURATION; setMaxLines(LLUI::getInstance()->mSettingGroups["config"]->getS32("ConsoleMaxLines")); } @@ -79,6 +83,13 @@ void LLConsole::setLinePersistTime(F32 seconds) void LLConsole::reshape(S32 width, S32 height, bool called_from_parent) { + if (mFont == nullptr) + { + // not initialized yet + LL_WARNS() << "LLConsole::reshape called before font is set" << LL_ENDL; + return; + } + S32 new_width = llmax(50, llmin(getRect().getWidth(), width)); S32 new_height = llmax(mFont->getLineHeight() + 15, llmin(getRect().getHeight(), height)); diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp index 15536178ab..b3b47084c5 100644 --- a/indra/llui/lldraghandle.cpp +++ b/indra/llui/lldraghandle.cpp @@ -59,7 +59,9 @@ LLDragHandle::LLDragHandle(const LLDragHandle::Params& p) mMaxTitleWidth( 0 ), mForeground( true ), mDragHighlightColor(p.drag_highlight_color()), - mDragShadowColor(p.drag_shadow_color()) + mDragShadowColor(p.drag_shadow_color()), + mFont(p.font), + mLabelVPad(p.label_vpad()) { static LLUICachedControl<S32> snap_margin ("SnapMargin", 0); @@ -98,14 +100,13 @@ void LLDragHandleTop::setTitle(const std::string& title) } else { - const LLFontGL* font = LLFontGL::getFontSansSerif(); LLTextBox::Params params; params.name("Drag Handle Title"); params.rect(getRect()); params.initial_value(trimmed_title); - params.font(font); + params.font(mFont); params.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT | FOLLOWS_RIGHT); - params.font_shadow(LLFontGL::DROP_SHADOW_SOFT); + params.font_shadow(LLFontGL::NO_SHADOW); params.use_ellipses = true; params.parse_urls = false; //cancel URL replacement in floater title mTitleBox = LLUICtrlFactory::create<LLTextBox> (params); @@ -236,7 +237,6 @@ void LLDragHandleLeft::draw() void LLDragHandleTop::reshapeTitleBox() { - static LLUICachedControl<S32> title_vpad("UIFloaterTitleVPad", 0); if( ! mTitleBox) { return; @@ -248,7 +248,7 @@ void LLDragHandleTop::reshapeTitleBox() LLRect title_rect; title_rect.setLeftTopAndSize( LEFT_PAD, - getRect().getHeight() - title_vpad, + getRect().getHeight() - mLabelVPad, title_width, title_height); diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h index 73211d5292..f768839749 100644 --- a/indra/llui/lldraghandle.h +++ b/indra/llui/lldraghandle.h @@ -43,13 +43,17 @@ public: : public LLInitParam::Block<Params, LLView::Params> { Optional<std::string> label; + Optional<S32> label_vpad; Optional<LLUIColor> drag_highlight_color; Optional<LLUIColor> drag_shadow_color; + Optional<const LLFontGL*> font; Params() : label("label"), + label_vpad("label_vpad", 7), drag_highlight_color("drag_highlight_color", LLUIColorTable::instance().getColor("DefaultHighlightLight")), - drag_shadow_color("drag_shadow_color", LLUIColorTable::instance().getColor("DefaultShadowDark")) + drag_shadow_color("drag_shadow_color", LLUIColorTable::instance().getColor("DefaultShadowDark")), + font("font", LLFontGL::getFontSansSerif()) { changeDefault(mouse_opaque, true); changeDefault(follows.flags, FOLLOWS_ALL); @@ -82,6 +86,8 @@ protected: protected: LLTextBox* mTitleBox; + const LLFontGL* mFont; + S32 mLabelVPad; private: LLRect mButtonsRect; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index da913ee9d6..f1a97ee074 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -183,8 +183,10 @@ LLFloater::Params::Params() show_title("show_title", true), auto_close("auto_close", false), positioning("positioning", LLFloaterEnums::POSITIONING_RELATIVE), + header_font("header_font", LLFontGL::getFontSansSerif()), header_height("header_height", 0), legacy_header_height("legacy_header_height", 0), + header_vpad("header_vpad", 7), close_image("close_image"), restore_image("restore_image"), minimize_image("minimize_image"), @@ -294,7 +296,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p) memset(mButtonsEnabled, 0, BUTTON_COUNT * sizeof(bool)); memset(mButtons, 0, BUTTON_COUNT * sizeof(LLButton*)); - addDragHandle(); + addDragHandle(p); addResizeCtrls(); initFromParams(p); @@ -337,7 +339,7 @@ void LLFloater::initFloater(const Params& p) } } -void LLFloater::addDragHandle() +void LLFloater::addDragHandle(const LLFloater::Params& floater_params) { if (!mDragHandle) { @@ -347,6 +349,8 @@ void LLFloater::addDragHandle() p.name("drag"); p.follows.flags(FOLLOWS_ALL); p.label(mTitle); + p.font(floater_params.header_font); + p.label_vpad(floater_params.header_vpad); mDragHandle = LLUICtrlFactory::create<LLDragHandleLeft>(p); } else // drag on top @@ -355,6 +359,8 @@ void LLFloater::addDragHandle() p.name("Drag Handle"); p.follows.flags(FOLLOWS_ALL); p.label(mTitle); + p.font(floater_params.header_font); + p.label_vpad(floater_params.header_vpad); mDragHandle = LLUICtrlFactory::create<LLDragHandleTop>(p); } addChild(mDragHandle); diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 9e1594bdd2..bda2531b43 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -172,8 +172,10 @@ public: Optional<LLFloaterEnums::EOpenPositioning> positioning; + Optional<const LLFontGL*> header_font; Optional<S32> header_height, - legacy_header_height; // HACK see initFromXML() + legacy_header_height, // HACK see initFromXML() + header_vpad; Optional<F32> rel_x, rel_y; @@ -442,7 +444,7 @@ private: bool offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index); void addResizeCtrls(); void layoutResizeCtrls(); - void addDragHandle(); + void addDragHandle(const LLFloater::Params& p); void layoutDragHandle(); // repair layout static void updateActiveFloaterTransparency(); diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 7544a44478..ce0e8036e7 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -464,6 +464,11 @@ F32 LLFocusMgr::getFocusFlashAmt() const return clamp_rescale(mFocusFlashTimer.getElapsedTimeF32(), 0.f, FOCUS_FADE_TIME, 1.f, 0.f); } +S32 LLFocusMgr::getFocusFlashWidth() const +{ + return ll_round(lerp(1.f, 2.f, getFocusFlashAmt())); +} + LLColor4 LLFocusMgr::getFocusColor() const { static LLUIColor focus_color_cached = LLUIColorTable::instance().getColor("FocusColor"); diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 89fee5c9f1..2e2293196b 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -101,7 +101,7 @@ public: void setKeystrokesOnly(bool keystrokes_only) { mKeystrokesOnly = keystrokes_only; } F32 getFocusFlashAmt() const; - S32 getFocusFlashWidth() const { return ll_round(lerp(1.f, 3.f, getFocusFlashAmt())); } + S32 getFocusFlashWidth() const; LLColor4 getFocusColor() const; void triggerFocusFlash(); bool getAppHasFocus() const { return mAppHasFocus; } diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index dafbca7433..fcc1964bd6 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -159,9 +159,11 @@ LLFolderViewItem::Params::Params() icon_width("icon_width", 0), text_pad("text_pad", 0), text_pad_right("text_pad_right", 0), + text_pad_top("text_pad_top", 1), single_folder_mode("single_folder_mode", false), double_click_override("double_click_override", false), arrow_size("arrow_size", 0), + arrow_pad_top("arrow_pad_top", 1), max_folder_item_overlap("max_folder_item_overlap", 0) { } @@ -201,7 +203,9 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p) mIconWidth(p.icon_width), mTextPad(p.text_pad), mTextPadRight(p.text_pad_right), + mTextPadTop(p.text_pad_top), mArrowSize(p.arrow_size), + mArrowPadTop(p.arrow_pad_top), mSingleFolderMode(p.single_folder_mode), mMaxFolderItemOverlap(p.max_folder_item_overlap), mDoubleClickOverride(p.double_click_override) @@ -811,7 +815,7 @@ void LLFolderViewItem::drawOpenFolderArrow() if (hasVisibleChildren() || !isFolderComplete()) { gl_draw_scaled_rotated_image( - mIndentation, getRect().getHeight() - mArrowSize - mTextPad - sTopPad, + mIndentation, getRect().getHeight() - mArrowSize - mArrowPadTop - sTopPad, mArrowSize, mArrowSize, mControlLabelRotation, sFolderArrowImg->getImage(), sFgColor); } } @@ -1045,7 +1049,7 @@ void LLFolderViewItem::draw() S32 filter_string_length = mViewModelItem->hasFilterStringMatch() ? (S32)mViewModelItem->getFilterStringSize() : 0; F32 right_x = 0; - F32 y = (F32)rect_height - line_height - (F32)mTextPad - (F32)sTopPad; + F32 y = (F32)rect_height - line_height - (F32)mTextPadTop - (F32)sTopPad; F32 text_left = (F32)getLabelXPos(); LLWString combined_string = mLabel + mLabelSuffix; @@ -1124,7 +1128,7 @@ void LLFolderViewItem::draw() if(mLabelSuffix.empty() || (font == sSuffixFont)) { F32 match_string_left = text_left + font->getWidthF32(combined_string.c_str(), 0, filter_offset + filter_string_length) - font->getWidthF32(combined_string.c_str(), filter_offset, filter_string_length); - F32 yy = (F32)rect_height - line_height - (F32)mTextPad - (F32)sTopPad; + F32 yy = (F32)rect_height - line_height - (F32)mTextPadTop - (F32)sTopPad; font->render(combined_string, filter_offset, match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, filter_string_length, S32_MAX, &right_x); @@ -1135,7 +1139,7 @@ void LLFolderViewItem::draw() if(label_filter_length > 0) { F32 match_string_left = text_left + font->getWidthF32(mLabel.c_str(), 0, filter_offset + label_filter_length) - font->getWidthF32(mLabel.c_str(), filter_offset, label_filter_length); - F32 yy = (F32)rect_height - line_height - (F32)mTextPad - (F32)sTopPad; + F32 yy = (F32)rect_height - line_height - (F32)mTextPadTop - (F32)sTopPad; font->render(mLabel, filter_offset, match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, label_filter_length, S32_MAX, &right_x); @@ -1146,7 +1150,7 @@ void LLFolderViewItem::draw() { S32 suffix_offset = llmax(0, filter_offset - (S32)mLabel.size()); F32 match_string_left = text_left + font->getWidthF32(mLabel.c_str(), 0, static_cast<S32>(mLabel.size())) + sSuffixFont->getWidthF32(mLabelSuffix.c_str(), 0, suffix_offset + suffix_filter_length) - sSuffixFont->getWidthF32(mLabelSuffix.c_str(), suffix_offset, suffix_filter_length); - F32 yy = (F32)rect_height - sSuffixFont->getLineHeight() - (F32)mTextPad - (F32)sTopPad; + F32 yy = (F32)rect_height - sSuffixFont->getLineHeight() - (F32)mTextPadTop - (F32)sTopPad; sSuffixFont->render(mLabelSuffix, suffix_offset, match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, suffix_filter_length, S32_MAX, &right_x); diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index 23d794bf26..258a806b91 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -73,7 +73,9 @@ public: icon_width, text_pad, text_pad_right, + text_pad_top, arrow_size, + arrow_pad_top, max_folder_item_overlap; Optional<bool> single_folder_mode, double_click_override; @@ -117,7 +119,9 @@ protected: mIconWidth, mTextPad, mTextPadRight, + mTextPadTop, mArrowSize, + mArrowPadTop, mMaxFolderItemOverlap; F32 mControlLabelRotation; diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index fe0591ce4b..1dc80671cc 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -48,17 +48,21 @@ static LLLayoutStack::LayoutStackRegistry::Register<LLLayoutPanel> register_layo LLLayoutPanel::Params::Params() : expanded_min_dim("expanded_min_dim", 0), min_dim("min_dim", -1), + max_dim("max_dim", -1), user_resize("user_resize", false), auto_resize("auto_resize", true) { addSynonym(min_dim, "min_width"); addSynonym(min_dim, "min_height"); + addSynonym(max_dim, "max_width"); + addSynonym(max_dim, "max_height"); } LLLayoutPanel::LLLayoutPanel(const Params& p) : LLPanel(p), mExpandedMinDim(p.expanded_min_dim.isProvided() ? p.expanded_min_dim : p.min_dim), mMinDim(p.min_dim), + mMaxDim(p.max_dim), mAutoResize(p.auto_resize), mUserResize(p.user_resize), mCollapsed(false), @@ -75,6 +79,7 @@ LLLayoutPanel::LLLayoutPanel(const Params& p) { mVisibleAmt = 0.f; } + setMaxDim(mMaxDim); } void LLLayoutPanel::initFromParams(const Params& p) @@ -113,6 +118,8 @@ S32 LLLayoutPanel::getTargetDim() const void LLLayoutPanel::setTargetDim(S32 value) { + value = llmin(value, mMaxDim); + LLRect new_rect(getRect()); if (mOrientation == LLLayoutStack::HORIZONTAL) { @@ -145,6 +152,7 @@ void LLLayoutPanel::setOrientation( LLView::EOrientation orientation ) setMinDim(layout_dim); } mTargetDim = llmax(layout_dim, getMinDim()); + mTargetDim = llmin(mTargetDim, mMaxDim); } void LLLayoutPanel::setVisible( bool visible ) @@ -167,6 +175,7 @@ void LLLayoutPanel::reshape( S32 width, S32 height, bool called_from_parent /*= if (!mIgnoreReshape && !mAutoResize) { mTargetDim = (mOrientation == LLLayoutStack::HORIZONTAL) ? width : height; + mTargetDim = llmin(mTargetDim, mMaxDim); LLLayoutStack* stackp = dynamic_cast<LLLayoutStack*>(getParent()); if (stackp) { @@ -439,6 +448,7 @@ void LLLayoutStack::updateLayout() F32 fraction_to_distribute = (panelp->mFractionalSize * panelp->getAutoResizeFactor()) / (total_visible_fraction); S32 delta = ll_round((F32)space_to_distribute * fraction_to_distribute); panelp->mTargetDim += delta; + panelp->mTargetDim = llmin(panelp->mTargetDim, panelp->mMaxDim); remaining_space -= delta; } } @@ -455,6 +465,7 @@ void LLLayoutStack::updateLayout() { S32 space_for_panel = remaining_space > 0 ? 1 : -1; panelp->mTargetDim += space_for_panel; + panelp->mTargetDim = llmin(panelp->mTargetDim, panelp->mMaxDim); remaining_space -= space_for_panel; } } diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 9e3536aaff..4c78c8a289 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -140,7 +140,8 @@ public: struct Params : public LLInitParam::Block<Params, LLPanel::Params> { Optional<S32> expanded_min_dim, - min_dim; + min_dim, + max_dim; Optional<bool> user_resize, auto_resize; @@ -164,6 +165,8 @@ public: S32 getMinDim() const { return llmax(0, mMinDim); } void setMinDim(S32 value) { mMinDim = value; } + void setMaxDim(S32 value) { mMaxDim = value < 0 ? S32_MAX : value; } + S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : getMinDim(); } void setExpandedMinDim(S32 value) { mExpandedMinDim = value; } @@ -198,6 +201,7 @@ protected: S32 mExpandedMinDim; S32 mMinDim; + S32 mMaxDim; bool mCollapsed; F32 mVisibleAmt; F32 mCollapseAmt; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index ef62666918..9a88083a5d 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -97,6 +97,7 @@ LLLineEditor::Params::Params() ignore_tab("ignore_tab", true), is_password("is_password", false), allow_emoji("allow_emoji", true), + draw_focus_border("draw_focus_border", true), cursor_color("cursor_color"), use_bg_color("use_bg_color", false), bg_color("bg_color"), @@ -147,6 +148,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) mIgnoreTab( p.ignore_tab ), mDrawAsterixes( p.is_password ), mAllowEmoji( p.allow_emoji ), + mDrawFocusBorder(p.draw_focus_border), mSpellCheck( p.spellcheck ), mSpellCheckStart(-1), mSpellCheckEnd(-1), @@ -1795,7 +1797,7 @@ void LLLineEditor::drawBackground() if (!image) return; // optionally draw programmatic border - if (has_focus) + if (has_focus && mDrawFocusBorder) { LLColor4 tmp_color = gFocusMgr.getFocusColor(); tmp_color.setAlpha(alpha); @@ -1955,12 +1957,11 @@ void LLLineEditor::draw() width = llmin(width, mTextRightEdge - ll_round(rendered_pixels_right)); gl_rect_2d(ll_round(rendered_pixels_right), cursor_top, ll_round(rendered_pixels_right)+width, cursor_bottom, color); - LLColor4 tmp_color( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], alpha ); rendered_text += mFontBufferSelection.render( mGLFont, mText, mScrollHPos + rendered_text, rendered_pixels_right, text_bottom, - tmp_color, + LLColor4::black, LLFontGL::LEFT, LLFontGL::BOTTOM, 0, LLFontGL::NO_SHADOW, diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 6384bfdc5f..fd248edda3 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -95,7 +95,8 @@ public: show_label_focused, is_password, allow_emoji, - use_bg_color; + use_bg_color, + draw_focus_border; // colors Optional<LLUIColor> cursor_color, @@ -411,6 +412,7 @@ protected: bool mAllowEmoji; bool mUseBgColor; + bool mDrawFocusBorder; LLWString mPreeditWString; LLWString mPreeditOverwrittenWString; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 6ba31c251e..3b21ed8f47 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -73,7 +73,7 @@ S32 MENU_BAR_WIDTH = 410; /// Local function declarations, constants, enums, and typedefs ///============================================================================ -const S32 LABEL_BOTTOM_PAD_PIXELS = 2; +const S32 LABEL_BOTTOM_PAD_PIXELS = 1; const U32 LEFT_PAD_PIXELS = 3; const U32 LEFT_WIDTH_PIXELS = 15; @@ -519,21 +519,25 @@ void LLMenuItemGL::draw( void ) } else { + // Munus are all of the same size, so fixed offset works here, + // but it won't work if somebody decides to use different font + // todo: adjust logic to work of rect and font height + F32 y = (F32)MENU_ITEM_PADDING / 2.f; if( !mDrawBoolLabel.empty() ) { - mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color, + mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, y, color, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false ); } - mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color, + mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, y, color, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false ); if( !mDrawAccelLabel.empty() ) { - mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color, + mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, y, color, LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false ); } if( !mDrawBranchLabel.empty() ) { - mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f), color, + mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, y, color, LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, false ); } } @@ -1638,6 +1642,9 @@ void LLMenuItemBranchDownGL::draw( void ) { color = mDisabledColor.get(); } + // Munus are all of the same size, so fixed offset works here, + // but it won't work if somebody decides to use different font + // todo: adjust logic to work of rect and font height getFont()->render( mLabel.getWString(), 0, (F32)getRect().getWidth() / 2.f, (F32)LABEL_BOTTOM_PAD_PIXELS, color, LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 5e0985c79c..27f1dcb03d 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -483,7 +483,7 @@ void LLTabContainer::draw() tuple->mButton->setVisible( true ); } - S32 max_scroll_visible = getTabCount() - getMaxScrollPos() + getScrollPos(); + S32 max_scroll_visible = getVisibleTabCount() - getMaxScrollPos() + getScrollPos(); S32 idx = 0; for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { @@ -1380,6 +1380,20 @@ S32 LLTabContainer::getTabCount() const return static_cast<S32>(mTabList.size()); } +S32 LLTabContainer::getVisibleTabCount() const +{ + S32 visible_count = 0; + for (tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr) + { + const LLTabTuple* pTT = *itr; + if (pTT->mVisible) + { + visible_count++; + } + } + return visible_count; +} + LLPanel* LLTabContainer::getPanelByIndex(S32 index) const { if (index >= 0 && index < (S32)mTabList.size()) @@ -2109,6 +2123,14 @@ void LLTabContainer::updateMaxScrollPos() S32 tab_space = 0; S32 available_space = 0; tab_space = mTotalTabWidth; + for(tuple_list_t::const_iterator tab_it = mTabList.begin(); tab_it != mTabList.end(); ++tab_it) + { + const LLTabTuple* tuple = *tab_it; + if (!tuple->mVisible) + { + tab_space -= tuple->mButton->getRect().getWidth(); + } + } available_space = getRect().getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + tabcntr_tab_h_pad); if( tab_space > available_space ) @@ -2118,7 +2140,7 @@ void LLTabContainer::updateMaxScrollPos() available_width_with_arrows -= tabcntr_tab_partial_width; S32 running_tab_width = 0; - setMaxScrollPos(getTabCount()); + setMaxScrollPos(getVisibleTabCount()); for(tuple_list_t::reverse_iterator tab_it = mTabList.rbegin(); tab_it != mTabList.rend(); ++tab_it) { running_tab_width += (*tab_it)->mButton->getRect().getWidth(); @@ -2129,7 +2151,7 @@ void LLTabContainer::updateMaxScrollPos() setMaxScrollPos(getMaxScrollPos()-1); } // in case last tab doesn't actually fit on screen, make it the last scrolling position - setMaxScrollPos(llmin(getMaxScrollPos(), getTabCount() - 1)); + setMaxScrollPos(llmin(getMaxScrollPos(), getVisibleTabCount() - 1)); no_scroll = false; } } @@ -2202,3 +2224,16 @@ void LLTabContainer::setTabVisibility( LLPanel const *aPanel, bool aVisible ) updateMaxScrollPos(); } + +bool LLTabContainer::getTabVisibility(const LLPanel* panel) const +{ + for (tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr) + { + LLTabTuple const* pTT = *itr; + if (pTT->mTabPanel == panel) + { + return pTT->mVisible; + } + } + return false; +} diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 4ac7e73d25..3095e641f8 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -188,6 +188,7 @@ public: LLPanel* getCurrentPanel(); S32 getCurrentPanelIndex() const; S32 getTabCount() const; + S32 getVisibleTabCount() const; LLPanel* getPanelByIndex(S32 index) const; S32 getIndexForPanel(LLPanel* panel) const; S32 getPanelIndexByTitle(std::string_view title) const; @@ -225,6 +226,7 @@ public: S32 getMaxTabWidth() const { return mMaxTabWidth; } void setTabVisibility( LLPanel const *aPanel, bool ); + bool getTabVisibility(const LLPanel* panel) const; void startDragAndDropDelayTimer() { mDragAndDropDelayTimer.start(); } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 24ae5c09e9..5882c1edbb 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -51,6 +51,9 @@ const F32 CURSOR_FLASH_DELAY = 1.0f; // in seconds const S32 CURSOR_THICKNESS = 2; const F32 TRIPLE_CLICK_INTERVAL = 0.3f; // delay between double and triple click. +constexpr F32 FOCUSED_SELECTION_BG_ALPHA = 1; +constexpr F32 UNFOCUSED_SELECTION_BG_ALPHA = 0.7f; + LLTextBase::line_info::line_info(S32 index_start, S32 index_end, LLRect rect, S32 line_num) : mDocIndexStart(index_start), mDocIndexEnd(index_end), @@ -529,7 +532,7 @@ void LLTextBase::drawSelectionBackground() // Draw the selection box (we're using a box instead of reversing the colors on the selected text). gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); const LLColor4& color = mSelectedBGColor; - F32 alpha = hasFocus() ? 0.7f : 0.3f; + F32 alpha = hasFocus() ? FOCUSED_SELECTION_BG_ALPHA : UNFOCUSED_SELECTION_BG_ALPHA; alpha *= getDrawContext().mAlpha; LLColor4 selection_color(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], alpha); diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 3ab5e905e3..35477bdea9 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -408,6 +408,7 @@ public: /*virtual*/ void setColor(const LLUIColor& c) override; virtual void setReadOnlyColor(const LLUIColor& c); /*virtual*/ void onVisibilityChange(bool new_visibility) override; + void setBgReadOnlyColor(const LLUIColor& c) { mReadOnlyBgColor = c; } /*virtual*/ void setValue(const LLSD& value) override; /*virtual*/ LLTextViewModel* getViewModel() const override; diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 05461edd82..9a27049d37 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -80,7 +80,7 @@ LLUICtrl::Params::Params() mouseenter_callback("mouseenter_callback"), mouseleave_callback("mouseleave_callback"), control_name("control_name"), - font("font", LLFontGL::getFontEmojiMedium()), + font("font", LLFontGL::getFontEmojiSmall()), font_halign("halign"), font_valign("valign"), length("length"), // ignore LLXMLNode cruft diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index d53fd6eb91..68ca61681c 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -149,7 +149,7 @@ void LLViewBorder::drawOnePixelLines() top_color = gFocusMgr.getFocusColor(); bottom_color = top_color; - LLUI::setLineWidth(lerp(1.f, 3.f, gFocusMgr.getFocusFlashAmt())); + LLUI::setLineWidth(lerp(1.f, 2.f, gFocusMgr.getFocusFlashAmt())); } S32 left = 0; diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index 8e08239ee6..a286f75f42 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -733,12 +733,17 @@ void LLWebRTCImpl::intSetMute(bool mute, int delay_ms) { mPeerCustomProcessor->setGain(mMute ? 0.0f : mGain); } + + // Sequence counter to prevent race conditions from rapid requests to mute/unmute + static std::atomic<uint32_t> mute_sequence(0); + uint32_t current_sequence = ++mute_sequence; + if (mMute) { mWorkerThread->PostDelayedTask( - [this] + [this, current_sequence] { - if (mDeviceModule) + if (mDeviceModule && (current_sequence == mute_sequence.load())) { mDeviceModule->ForceStopRecording(); } @@ -748,9 +753,9 @@ void LLWebRTCImpl::intSetMute(bool mute, int delay_ms) else { mWorkerThread->PostTask( - [this] + [this, current_sequence] { - if (mDeviceModule) + if (mDeviceModule && (current_sequence == mute_sequence.load())) { mDeviceModule->InitRecording(); mDeviceModule->ForceStartRecording(); @@ -806,6 +811,8 @@ LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() : mPeerConnection(nullptr), mMute(MUTE_INITIAL), mAnswerReceived(false), + mPeerConnectionState(webrtc::PeerConnectionInterface::PeerConnectionState::kNew), + mDisconnectCount(0), mPendingJobs(0) { } @@ -1232,11 +1239,15 @@ void LLWebRTCPeerConnectionImpl::OnIceGatheringChange(webrtc::PeerConnectionInte } } +static const webrtc::TimeDelta DISCONNECT_RENEGOTIATE_DELAY = webrtc::TimeDelta::Millis(10000); + // Called any time the PeerConnectionState changes. void LLWebRTCPeerConnectionImpl::OnConnectionChange(webrtc::PeerConnectionInterface::PeerConnectionState new_state) { RTC_LOG(LS_ERROR) << __FUNCTION__ << " Peer Connection State Change " << new_state; + mPeerConnectionState = new_state; + switch (new_state) { case webrtc::PeerConnectionInterface::PeerConnectionState::kConnected: @@ -1252,13 +1263,32 @@ void LLWebRTCPeerConnectionImpl::OnConnectionChange(webrtc::PeerConnectionInterf break; } case webrtc::PeerConnectionInterface::PeerConnectionState::kFailed: - case webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected: { for (auto &observer : mSignalingObserverList) { observer->OnRenegotiationNeeded(); } - + break; + } + case webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected: + { + // Wait 10 seconds before renegotiating in case the connection recovers on its own. + // Use a sequence count so that only the most recent disconnect transition can trigger + // a renegotiation, avoiding stale delayed tasks from earlier disconnect/reconnect cycles. + uint32_t disconnect_count = ++mDisconnectCount; + mWebRTCImpl->PostDelayedSignalingTask( + [this, disconnect_count]() + { + if (disconnect_count == mDisconnectCount + && mPeerConnectionState == webrtc::PeerConnectionInterface::PeerConnectionState::kDisconnected) + { + for (auto &observer : mSignalingObserverList) + { + observer->OnRenegotiationNeeded(); + } + } + }, + DISCONNECT_RENEGOTIATE_DELAY); break; } default: @@ -1531,6 +1561,57 @@ void LLWebRTCPeerConnectionImpl::unsetDataObserver(LLWebRTCDataObserver* observe } } +class LLStatsCollectorCallback : public webrtc::RTCStatsCollectorCallback +{ +public: + typedef std::function<void(const LLWebRTCStatsMap&)> StatsCallback; + + LLStatsCollectorCallback(StatsCallback callback) : callback_(callback) {} + + void OnStatsDelivered(const webrtc::scoped_refptr<const webrtc::RTCStatsReport>& report) override + { + if (callback_) + { + // Transform RTCStatsReport stats to simple map + LLWebRTCStatsMap stats_map; + for (const auto& stats : *report) + { + std::map<std::string, std::string> stat_attributes; + + // Convert each attribute to string format + for (const auto& attribute : stats.Attributes()) + { + stat_attributes[attribute.name()] = attribute.ToString(); + } + stats_map[stats.id()] = stat_attributes; + } + callback_(stats_map); + } + } + +private: + StatsCallback callback_; +}; + +void LLWebRTCPeerConnectionImpl::gatherConnectionStats() +{ + if (!mPeerConnection) + { + return; + } + + auto stats_callback = webrtc::make_ref_counted<LLStatsCollectorCallback>( + [this](const LLWebRTCStatsMap& generic_stats) + { + for (auto& observer : mSignalingObserverList) + { + observer->OnStatsDelivered(generic_stats); + } + }); + + mPeerConnection->GetStats(stats_callback.get()); +} + LLWebRTCImpl * gWebRTCImpl = nullptr; LLWebRTCDeviceInterface * getDeviceInterface() { diff --git a/indra/llwebrtc/llwebrtc.h b/indra/llwebrtc/llwebrtc.h index 7d06b7d2b4..e76e708f0c 100644 --- a/indra/llwebrtc/llwebrtc.h +++ b/indra/llwebrtc/llwebrtc.h @@ -38,6 +38,7 @@ #ifndef LLWEBRTC_H #define LLWEBRTC_H +#include <map> #include <string> #include <vector> @@ -55,6 +56,7 @@ namespace llwebrtc { +typedef std::map<std::string, std::map<std::string, std::string>> LLWebRTCStatsMap; class LLWebRTCLogCallback { @@ -240,6 +242,8 @@ class LLWebRTCSignalingObserver // Called when the data channel has been established and data // transfer can begin. virtual void OnDataChannelReady(LLWebRTCDataInterface *data_interface) = 0; + + virtual void OnStatsDelivered(const LLWebRTCStatsMap& stats_data) {} }; // LLWebRTCPeerConnectionInterface representsd a connection to a peer, @@ -273,6 +277,8 @@ class LLWebRTCPeerConnectionInterface virtual void unsetSignalingObserver(LLWebRTCSignalingObserver* observer) = 0; virtual void AnswerAvailable(const std::string &sdp) = 0; + + virtual void gatherConnectionStats() = 0; }; // The following define the dynamic linked library diff --git a/indra/llwebrtc/llwebrtc_impl.h b/indra/llwebrtc/llwebrtc_impl.h index 01cfb17ced..bd7a2e0bcf 100644 --- a/indra/llwebrtc/llwebrtc_impl.h +++ b/indra/llwebrtc/llwebrtc_impl.h @@ -343,6 +343,7 @@ public: inner_->InitRecording(); inner_->StartRecording(); } + inner_->InitPlayout(); inner_->StartPlayout(); } } @@ -479,6 +480,13 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceO mSignalingThread->PostTask(std::move(task), location); } + void PostDelayedSignalingTask(absl::AnyInvocable<void() &&> task, + webrtc::TimeDelta delay, + const webrtc::Location& location = webrtc::Location::Current()) + { + mSignalingThread->PostDelayedTask(std::move(task), delay, location); + } + void PostNetworkTask(absl::AnyInvocable<void() &&> task, const webrtc::Location& location = webrtc::Location::Current()) { @@ -648,6 +656,8 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface, void enableSenderTracks(bool enable); void enableReceiverTracks(bool enable); + void gatherConnectionStats() override; + protected: LLWebRTCImpl * mWebRTCImpl; @@ -673,6 +683,10 @@ class LLWebRTCPeerConnectionImpl : public LLWebRTCPeerConnectionInterface, std::vector<LLWebRTCDataObserver *> mDataObserverList; webrtc::scoped_refptr<webrtc::DataChannelInterface> mDataChannel; + // connection state tracking for delayed renegotiation on disconnect + webrtc::PeerConnectionInterface::PeerConnectionState mPeerConnectionState; + uint32_t mDisconnectCount; + std::atomic<int> mPendingJobs; }; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index bd2b484e7a..eb378d958d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -198,7 +198,6 @@ set(viewer_SOURCE_FILES llfloateravatartextures.cpp llfloaterbanduration.cpp llfloaterbeacons.cpp - llfloaterbigpreview.cpp llfloaterbuildoptions.cpp llfloaterbulkpermission.cpp llfloaterbulkupload.cpp @@ -306,7 +305,6 @@ set(viewer_SOURCE_FILES llfloatersidepanelcontainer.cpp llfloaterslapptest.cpp llfloatersnapshot.cpp - llfloatersounddevices.cpp llfloaterspellchecksettings.cpp llfloatertelehub.cpp llfloatertestinspectors.cpp @@ -318,7 +316,6 @@ set(viewer_SOURCE_FILES llfloatertranslationsettings.cpp llfloateruipreview.cpp llfloaterurlentry.cpp - llfloatervoiceeffect.cpp llfloatervoicevolume.cpp llfloaterwebcontent.cpp llfloaterwhitelistentry.cpp @@ -421,6 +418,7 @@ set(viewer_SOURCE_FILES llfloaterimnearbychat.cpp llfloaterimnearbychathandler.cpp llfloaterimnearbychatlistener.cpp + llnearbyvoicemoderation.cpp llnetmap.cpp llnotificationalerthandler.cpp llnotificationgrouphandler.cpp @@ -514,7 +512,6 @@ set(viewer_SOURCE_FILES llpanelsnapshotprofile.cpp llpanelteleporthistory.cpp llpaneltiptoast.cpp - llpanelvoiceeffect.cpp llpaneltopinfobar.cpp llpanelpulldown.cpp llpanelvoicedevicesettings.cpp @@ -884,7 +881,6 @@ set(viewer_HEADER_FILES llfloateravatartextures.h llfloaterbanduration.h llfloaterbeacons.h - llfloaterbigpreview.h llfloaterbuildoptions.h llfloaterbulkpermission.h llfloaterbulkupload.h @@ -996,7 +992,6 @@ set(viewer_HEADER_FILES llfloatersidepanelcontainer.h llfloaterslapptest.h llfloatersnapshot.h - llfloatersounddevices.h llfloaterspellchecksettings.h llfloatertelehub.h llfloatertestinspectors.h @@ -1008,7 +1003,6 @@ set(viewer_HEADER_FILES llfloatertranslationsettings.h llfloateruipreview.h llfloaterurlentry.h - llfloatervoiceeffect.h llfloatervoicevolume.h llfloaterwebcontent.h llfloaterwhitelistentry.h @@ -1105,6 +1099,7 @@ set(viewer_HEADER_FILES llnameeditor.h llnamelistctrl.h llnavigationbar.h + llnearbyvoicemoderation.h llnetmap.h llnotificationhandler.h llnotificationlistitem.h @@ -1190,7 +1185,6 @@ set(viewer_HEADER_FILES llpaneltiptoast.h llpanelpulldown.h llpanelvoicedevicesettings.h - llpanelvoiceeffect.h llpaneltopinfobar.h llpanelvolume.h llpanelvolumepulldown.h diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 124b7a2cd0..b7397ce158 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -26.1.1 +26.2.0 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f7c41873bb..ab797253db 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -489,6 +489,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>RecentJumpThresholdSecs</key> + <map> + <key>Comment</key> + <string>Seconds after a jump input during which finish-anim is suppressed to avoid interrupting rapid successive jumps.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>1.0</real> + </map> <key>AvatarAxisDeadZone0</key> <map> <key>Comment</key> @@ -5905,6 +5916,17 @@ <key>Value</key> <integer>90</integer> </map> + <key>ScriptToastButtonWidth</key> + <map> + <key>Comment</key> + <string>Default width of buttons in the Script dialog toast.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>110</integer> + </map> <key>NotificationChannelRightMargin</key> <map> <key>Comment</key> @@ -6136,6 +6158,39 @@ <key>Value</key> <integer>0</integer> </map> + <key>OpenDebugStatVoice</key> + <map> + <key>Comment</key> + <string>Expand Voice (WebRTC) stats display</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>OpenDebugStatVoiceOutgoing</key> + <map> + <key>Comment</key> + <string>Expand Outgoing audio (Voice) stats display</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>OpenDebugStatVoiceIncoming</key> + <map> + <key>Comment</key> + <string>Expand Incoming audio (Voice) stats display</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>OutBandwidth</key> <map> <key>Comment</key> @@ -10689,6 +10744,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>GroupTitlesTagMode</key> + <map> + <key>Comment</key> + <string>Select Group Titles tag mode: 0 - no group tags, 1 - only my group tag, 2 - all group tags</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>2</integer> + </map> <key>ShowAxes</key> <map> <key>Comment</key> @@ -12327,17 +12393,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>UIFloaterTitleVPad</key> - <map> - <key>Comment</key> - <string>Distance from top of floater to top of title string, pixels</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <real>7</real> - </map> <key>UIImgDefaultEyesUUID</key> <map> <key>Comment</key> @@ -16507,6 +16562,39 @@ <key>Value</key> <integer>0</integer> </map> + <key>InventoryShowRecentTab</key> + <map> + <key>Comment</key> + <string>Show/hide Recent tab in the Inventory floater</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>InventoryShowWornTab</key> + <map> + <key>Comment</key> + <string>Show/hide Worn tab in the Inventory floater</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>InventoryShowFavoritesTab</key> + <map> + <key>Comment</key> + <string>Show/hide Favorites tab in the Inventory floater</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>StatsReportMaxDuration</key> <map> <key>Comment</key> diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp index 66aa29d86b..01c9f63b15 100644 --- a/indra/newview/gltf/llgltfloader.cpp +++ b/indra/newview/gltf/llgltfloader.cpp @@ -440,7 +440,25 @@ void LLGLTFLoader::processNodeHierarchy(S32 node_idx, std::map<std::string, S32> (LLModel::NO_ERRORS == pModel->getStatus()) && validate_model(pModel)) { - mTransform.setIdentity(); + // Build the scene transform. + // Non-skinned meshes: scene transform carries coord rotation + hierarchy, + // preserving the object's rotation/position/scale for upload. + // Skinned meshes: transform is already baked into vertices, so scene is identity. + if (node.mSkin >= 0) + { + mTransform.setIdentity(); + } + else + { + glm::mat4 hierarchy_transform; + computeCombinedNodeTransform(mGLTFAsset, node_idx, hierarchy_transform); + glm::mat4 combined = coord_system_rotation * hierarchy_transform; + if (mApplyXYRotation) + { + combined = coord_system_rotationxy * combined; + } + mTransform = LLMatrix4(glm::value_ptr(combined)); + } transformation = mTransform; // adjust the transformation to compensate for mesh normalization @@ -684,7 +702,12 @@ std::string LLGLTFLoader::processTexture(std::string& full_path_out, S32 texture // Process embedded textures if (image.mBufferView >= 0) { - return extractTextureToTempFile(texture_index, texture_type); + std::string temp_path = extractTextureToTempFile(texture_index, texture_type); + if (!temp_path.empty()) + { + full_path_out = temp_path; + } + return temp_path; } return ""; @@ -734,23 +757,47 @@ bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& bas S32 skinIdx = nodeno.mSkin; - // Compute final combined transform matrix (hierarchy + coordinate rotation) + // Compute the vertex transform for this mesh. + // Non-skinned meshes: vertices are left untransformed; the node's hierarchy transform + // (rotation, translation, scale) is stored in the scene transform instead, matching + // the DAE loader. This ensures the uploaded object's bounding box and transform + // properties are correct. See: https://github.com/secondlife/viewer/issues/5431 + // Skinned meshes: coord rotation + hierarchy are baked into vertex positions because + // inverse bind matrices and skin weights are already computed in that space. + // TODO: consider aligning skinned meshes with the DAE loader (scene transform instead + // of vertex baking), which would require adjusting inverse bind matrices, bind shape + // matrix, and weight keying to match. S32 node_index = static_cast<S32>(&nodeno - &mGLTFAsset.mNodes[0]); glm::mat4 hierarchy_transform; computeCombinedNodeTransform(mGLTFAsset, node_index, hierarchy_transform); - // Combine transforms: coordinate rotation applied to hierarchy transform - glm::mat4 final_transform = coord_system_rotation * hierarchy_transform; - if (mApplyXYRotation) + glm::mat4 vertex_transform; + if (skinIdx >= 0) { - final_transform = coord_system_rotationxy * final_transform; + // Skinned mesh: bake coord rotation + hierarchy into vertices. + // Inverse bind matrices and skin weights depend on this transform being applied. + vertex_transform = coord_system_rotation * hierarchy_transform; + if (mApplyXYRotation) + { + vertex_transform = coord_system_rotationxy * vertex_transform; + } + } + else + { + // Non-skinned mesh: don't apply any transform to vertices. + // The hierarchy transform will be stored in the scene transform matrix. + vertex_transform = glm::mat4(1.0f); // identity } // Check if we have a negative scale (flipped coordinate system) - bool hasNegativeScale = glm::determinant(final_transform) < 0.0f; + // coord_system_rotation and coord_system_rotationxy are pure rotations (det=1), + // so negative scale depends only on the hierarchy transform. + bool hasNegativeScale = glm::determinant(hierarchy_transform) < 0.0f; + + bool hasVertexTransform = (vertex_transform != glm::mat4(1.0f)); // Pre-compute normal transform matrix (transpose of inverse of upper-left 3x3) - const glm::mat3 normal_transform = glm::transpose(glm::inverse(glm::mat3(final_transform))); + const glm::mat3 normal_transform = glm::transpose(glm::inverse(glm::mat3(vertex_transform))); // Mark unsuported joints with '-1' so that they won't get added into weights // GLTF maps all joints onto all meshes. Gather use count per mesh to cut unused ones. @@ -803,27 +850,45 @@ bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& bas return false; // Skip this primitive } - // Apply the global scale and center offset to all vertices + // Apply vertex transform (if any) to all vertices. + // Skinned meshes: this bakes coord rotation + hierarchy into vertices. + // Non-skinned meshes: vertex_transform is identity (no baking). for (U32 i = 0; i < prim.getVertexCount(); i++) { - // Use pre-computed final_transform - glm::vec4 pos(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2], 1.0f); - glm::vec4 transformed_pos = final_transform * pos; - GLTFVertex vert; - vert.position = glm::vec3(transformed_pos); - if (!prim.mNormals.empty()) + if (hasVertexTransform) { - // Use pre-computed normal_transform - glm::vec3 normal_vec(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]); - vert.normal = glm::normalize(normal_transform * normal_vec); + glm::vec4 pos(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2], 1.0f); + glm::vec4 transformed_pos = vertex_transform * pos; + vert.position = glm::vec3(transformed_pos); + + if (!prim.mNormals.empty()) + { + glm::vec3 normal_vec(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]); + vert.normal = glm::normalize(normal_transform * normal_vec); + } + else + { + vert.normal = glm::normalize(normal_transform * glm::vec3(0.0f, 0.0f, 1.0f)); + LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL; + } } else { - // Use default normal (pointing up in model space) - vert.normal = glm::normalize(normal_transform * glm::vec3(0.0f, 0.0f, 1.0f)); - LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL; + // No transform: store raw GLTF positions and normals. + // The scene transform will carry coord rotation + hierarchy. + vert.position = glm::vec3(prim.mPositions[i][0], prim.mPositions[i][1], prim.mPositions[i][2]); + + if (!prim.mNormals.empty()) + { + vert.normal = glm::vec3(prim.mNormals[i][0], prim.mNormals[i][1], prim.mNormals[i][2]); + } + else + { + vert.normal = glm::vec3(0.0f, 0.0f, 1.0f); + LL_DEBUGS("GLTF_IMPORT") << "No normals found for primitive, using default normal." << LL_ENDL; + } } // Flip texture V coordinate diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 60af0cad05..3ab87cac13 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -426,6 +426,7 @@ LLAgent::LLAgent() : mIsDoNotDisturb(false), mControlFlags(0x00000000), + mLastJumpInputTime(0.0), mAutoPilot(false), mAutoPilotFlyOnStop(false), @@ -780,6 +781,10 @@ void LLAgent::moveUp(S32 direction) if (direction > 0) { + if (!getFlying()) + { + mLastJumpInputTime = LLTimer::getTotalSeconds(); + } setControlFlags(AGENT_CONTROL_UP_POS | AGENT_CONTROL_FAST_UP); } else if (direction < 0) @@ -2663,7 +2668,21 @@ void LLAgent::onAnimStop(const LLUUID& id) } else if (id == ANIM_AGENT_PRE_JUMP || id == ANIM_AGENT_LAND || id == ANIM_AGENT_MEDIUM_LAND) { - setControlFlags(AGENT_CONTROL_FINISH_ANIM); + // FIRE-34049/FIRE-34273/https://github.com/secondlife/viewer/issues/4218 + // Avoid forcing AGENT_CONTROL_FINISH_ANIM, which can short-circuit the next pre-jump + // during rapid successive jumps. + // TODO: a more robust fix would require knowing which specific animation finished, + // information that is not currently provided by the simulator. + const bool up_pos = (mControlFlags & AGENT_CONTROL_UP_POS) != 0; + const F64 now = LLTimer::getTotalSeconds(); + const F64 elapsed = now - mLastJumpInputTime; + static LLCachedControl<F32> recent_jump_threshold_secs(gSavedSettings, "RecentJumpThresholdSecs"); + const bool recent_jump = (mLastJumpInputTime > 0.0) && (elapsed < recent_jump_threshold_secs); + + if (!up_pos && !recent_jump) + { + setControlFlags(AGENT_CONTROL_FINISH_ANIM); + } } } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 3352890d99..e6d9623957 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -487,6 +487,7 @@ private: S32 mControlsTakenCount[TOTAL_CONTROLS]; S32 mControlsTakenPassedOnCount[TOTAL_CONTROLS]; U32 mControlFlags; // Replacement for the mFooKey's + F64 mLastJumpInputTime; // Time of last jump input (key-down) in seconds from LLTimer::getTotalSeconds() //-------------------------------------------------------------------- // Animations diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 9c76f56ef3..f67f2688a1 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -1019,6 +1019,9 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht } //------------------------------------------------------------------------- +U32 AISUpdate::sBatchFrameCount = 0; +LLTimer AISUpdate::sBatchTimer; + AISUpdate::AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& request_body) : mType(type) { @@ -1036,8 +1039,16 @@ AISUpdate::AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& mFetchDepth = request_body["depth"].asInteger(); } - mTimer.setTimerExpirySec(AIS_EXPIRY_SECONDS); - mTimer.start(); + mTaskTimer.setTimerExpirySec(AIS_TASK_EXPIRY_SECONDS); + mTaskTimer.start(); + + U32 current_frame = LLFrameTimer::getFrameCount(); + if (sBatchFrameCount != current_frame) + { + sBatchTimer.setTimerExpirySec(AIS_BATCH_EXPIRY_SECONDS); + sBatchTimer.start(); + sBatchFrameCount = current_frame; + } parseUpdate(update); } @@ -1058,7 +1069,7 @@ void AISUpdate::clearParseResults() void AISUpdate::checkTimeout() { - if (mTimer.hasExpired()) + if (mTaskTimer.hasExpired() || sBatchTimer.hasExpired()) { // If we are taking too long, don't starve other tasks, // yield to mainloop. @@ -1067,7 +1078,16 @@ void AISUpdate::checkTimeout() // a chance, so wait for a frame tick instead. llcoro::suspendUntilNextFrame(); LLCoros::checkStop(); - mTimer.setTimerExpirySec(AIS_EXPIRY_SECONDS); + mTaskTimer.setTimerExpirySec(AIS_TASK_EXPIRY_SECONDS); + + U32 current_frame = LLFrameTimer::getFrameCount(); + if (sBatchFrameCount != current_frame) + { + // To give other tasks a chance batch timer + // has a longer delay. + sBatchTimer.setTimerExpirySec(AIS_BATCH_EXPIRY_SECONDS); + sBatchFrameCount = current_frame; + } } } diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index cfc286da2e..1dab0dd1f9 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -130,9 +130,13 @@ private: void clearParseResults(); void checkTimeout(); - // Fetch can return large packets of data, throttle it to not cause lags - // Todo: make throttle work over all fetch requests isntead of per-request - const F32 AIS_EXPIRY_SECONDS = 0.008f; + // Fetches can return large packets of data, + // throttle them individually to not get stuck + // on a single large task. And throttle sum total + // to not cause lags when multiple large fetches + // returned results. + const F32 AIS_TASK_EXPIRY_SECONDS = 0.008f; + const F32 AIS_BATCH_EXPIRY_SECONDS = 0.010f; typedef std::map<LLUUID,size_t> uuid_int_map_t; uuid_int_map_t mCatDescendentDeltas; @@ -154,7 +158,9 @@ private: uuid_list_t mCategoryIds; bool mFetch; S32 mFetchDepth; - LLTimer mTimer; + LLTimer mTaskTimer; + static LLTimer sBatchTimer; + static U32 sBatchFrameCount; AISAPI::COMMAND_TYPE mType; }; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ec4f69a080..04f54a829f 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -380,6 +380,7 @@ const std::string MARKER_FILE_NAME("SecondLife.exec_marker"); const std::string START_MARKER_FILE_NAME("SecondLife.start_marker"); const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker"); const std::string LOGOUT_MARKER_FILE_NAME("SecondLife.logout_marker"); +const std::string WATCHDOG_MARKER_FILE_NAME("SecondLife.watchdog_marker"); static std::string gLaunchFileOnQuit; //---------------------------------------------------------------------------- @@ -963,6 +964,7 @@ bool LLAppViewer::init() // Initialize event recorder LLViewerEventRecorder::createInstance(); + LLWatchdog::createInstance(); // // Initialize the window @@ -3155,20 +3157,60 @@ bool LLAppViewer::initWindow() << " (setting = " << watchdog_enabled_setting << ")" << LL_ENDL; - if (use_watchdog) + // Watchdog reports to statistics via marker files, that is + // pointless without ability to write (!mSecondInstance) those files. + // If use_watchdog is set, watchdog also reports to bugspat. + if (use_watchdog || !mSecondInstance) { - LLWatchdog::getInstance()->init([]() - { - LLAppViewer* app = LLAppViewer::instance(); - if (app->logoutRequestSent()) + LLWatchdog::getInstance()->init( + [](bool final_marker) { - app->createErrorMarker(LAST_EXEC_LOGOUT_FROZE); - } - else + LLAppViewer* app = LLAppViewer::instance(); + // Without watchdog everything will be counted as + // either 'unknown' (no crash marker) or based of present crash marker + if (final_marker) + { + // watchdog is going to crash viewer, so crate a 'crash' marker + if (app->logoutRequestSent()) + { + app->createErrorMarker(LAST_EXEC_LOGOUT_FROZE); + } + else + { + app->createErrorMarker(LAST_EXEC_FROZE); + } + } + else + { + // not going to crash, just create a 'watchdog' marker + app->createWatchdogMarker(); + } + }, + []() { - app->createErrorMarker(LAST_EXEC_FROZE); - } - }); + LLAppViewer* app = LLAppViewer::instance(); + // in case process recovered from freeze, remove watchdog marker. + app->removeWatchdogMarker(); + }, + [](std::string &desc) + { +#if LL_WINDOWS && LL_BUGSPLAT + LLAppViewer* app = LLAppViewer::instance(); + app->writeDebugInfo(); + return app->reportCustomToBugsplat(desc); +#else + return false; +#endif + }, + []() + { + LLAppViewer* app = LLAppViewer::instance(); + app->sendLogoutRequest(); + // Might be better to ask user if user wants to terminate the app or wait. + OSMessageBox(LLTrans::getString("MBFreezeDetected"), LLTrans::getString("MBFatalError"), OSMB_OK); + }, + use_watchdog); + } LLNotificationsUI::LLNotificationManager::getInstance(); @@ -3933,13 +3975,8 @@ void LLAppViewer::processMarkerFiles() { // the file existed, is ours, and matched our version, so we can report on what it says LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found; last exec crashed or froze" << LL_ENDL; -#if LL_WINDOWS && LL_BUGSPLAT - // bugsplat will set correct state in bugsplatSendLog - // Might be more accurate to rename this one into 'unknown' + // App terminated unexpectedly or froze, we don't know the cause yet. gLastExecEvent = LAST_EXEC_UNKNOWN; -#else - gLastExecEvent = LAST_EXEC_OTHER_CRASH; -#endif // LL_WINDOWS } else @@ -3992,23 +4029,29 @@ void LLAppViewer::processMarkerFiles() } LLFile::remove(logout_marker_file); } - // and last refine based on whether or not a marker created during a non-llerr crash is found + // Refine based on whether or not a marker created during + // a crash is found or if wathdog caught a freeze. + // Bugsplat will set correct state in bugsplatSendLog. std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); + std::string watchdog_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME); if(LLFile::isfile(error_marker_file)) { S32 marker_code = getMarkerErrorCode(error_marker_file); if (marker_code >= 0) { - if (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) - { - gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; - LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; - } - else if (marker_code > 0 && marker_code < (S32)LAST_EXEC_COUNT) + if (marker_code > 0 && marker_code < (S32)LAST_EXEC_COUNT) { + // If we have a code, it takes precendence gLastExecEvent = (eLastExecEvent)marker_code; LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; } + // if we have the marker, even without a code, it's a crash. + else if (gLastExecEvent == LAST_EXEC_LOGOUT_UNKNOWN + || gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) + { + gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; + LL_INFOS("MarkerFile") << "Error marker '" << error_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; + } else { gLastExecEvent = LAST_EXEC_OTHER_CRASH; @@ -4020,6 +4063,33 @@ void LLAppViewer::processMarkerFiles() LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL; } LLFile::remove(error_marker_file); + if (LLFile::isfile(watchdog_marker_file)) + { + // If viewer crashed after a freeze was detected, + // crash still takes precendence. Just clear watchdog. + removeWatchdogMarker(); + } + } + else + { + // so only check watchdog marker if there is no error marker. + if (LLFile::isfile(watchdog_marker_file)) + { + if (LAST_EXEC_UNKNOWN == gLastExecEvent + || LAST_EXEC_LOGOUT_UNKNOWN == gLastExecEvent) + { + // watchdog marker gets created if we detect a freeze, + // so if viwer did not stop gracefully, and we know it wasn't a crash, + // we have no other info, check watchdog. + if (markerIsSameVersion(watchdog_marker_file)) + { + gLastExecEvent = LAST_EXEC_UNKNOWN == gLastExecEvent ? LAST_EXEC_FROZE : LAST_EXEC_LOGOUT_FROZE; + LL_INFOS("MarkerFile") << "Watchdog marker '" << watchdog_marker_file << "' found, setting LastExecEvent to FROZE" + << LL_ENDL; + } + } + removeWatchdogMarker(); + } } #if LL_DARWIN @@ -4064,6 +4134,7 @@ void LLAppViewer::removeMarkerFiles() { LL_WARNS("MarkerFile") << "logout marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; } + removeWatchdogMarker(); } else { @@ -4480,13 +4551,66 @@ void LLAppViewer::purgeCefStaleCaches() LL_PROFILE_ZONE_SCOPED; // TODO: we really shouldn't use a hard coded name for the cache folder here... const std::string browser_parent_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache"); - if (LLFile::isdir(browser_parent_cache)) + if (!LLFile::isdir(browser_parent_cache)) + { + return; + } + // We are using a fixed name to not leave stale folders + // around in case something goes wrong on startup. + const std::string holder_cache_name = browser_parent_cache + "_rename"; + + // Try to rename the entire directory first + if (LLFile::rename(browser_parent_cache, holder_cache_name) == 0) + { + LL_DEBUGS("AppInit") << "Successfully renamed CEF cache folder for deletion" << LL_ENDL; + } + else + { + // Rename failed (likely another instance has files open in the cache) + // Create holder folder and move individual subfolders instead + LL_DEBUGS("AppInit") << "Could not rename CEF cache folder (may be in use), moving individual folders" << LL_ENDL; + + if (!LLFile::isdir(holder_cache_name) && LLFile::mkdir(holder_cache_name) != 0) + { + LL_WARNS() << "Failed to create holder folder: " << holder_cache_name << LL_ENDL; + // Attept normal cleanup + gDirUtilp->deleteDirAndContents(browser_parent_cache); + return; + } + + // Iterate through subdirectories in the cache folder + LLDirIterator dir_iter(browser_parent_cache, "*"); + std::string subfolder_name; + while (dir_iter.next(subfolder_name)) + { + if (subfolder_name == "." || subfolder_name == "..") + { + continue; + } + + std::string source_path = browser_parent_cache + gDirUtilp->getDirDelimiter() + subfolder_name; + std::string dest_path = holder_cache_name + gDirUtilp->getDirDelimiter() + subfolder_name; + + // If folder is in use, move will fail, don't delete it. + LLFile::rename(source_path, dest_path); + } + } + + // Post deletion task to the General work queue to avoid blocking the main thread + if (auto queue = LL::WorkQueue::getInstance("General")) + { + // Alternatively throw it at LLPurgeDiskCacheThread to clean + // it during periodic purges. + queue->post([holder_cache_name]() + { + LL_PROFILE_ZONE_NAMED("cef_cache_cleanup"); + gDirUtilp->deleteDirAndContents(holder_cache_name); + }); + } + else { - // This is a sledgehammer approach - nukes the cef_cache dir entirely - // which is then recreated the first time a CEF instance creates an - // individual cache folder. If we ever decide to retain some folders - // e.g. Search UI cache - then we will need a more granular approach. - gDirUtilp->deleteDirAndContents(browser_parent_cache); + LL_WARNS() << "Failed to get General work queue, deleting CEF cache synchronously" << LL_ENDL; + gDirUtilp->deleteDirAndContents(holder_cache_name); } } @@ -5456,6 +5580,30 @@ bool LLAppViewer::errorMarkerExists() const return LLFile::isfile(error_marker_file); } +void LLAppViewer::createWatchdogMarker() const +{ + if (!mSecondInstance) + { + std::string error_marker = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME); + + LLAPRFile file; + file.open(error_marker, LL_APR_WB); + if (file.getFileHandle()) + { + recordMarkerVersion(file); + file.close(); + } + } +} +void LLAppViewer::removeWatchdogMarker() const +{ + if (!mSecondInstance) + { + std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, WATCHDOG_MARKER_FILE_NAME); + LLFile::remove(error_marker_file); + } +} + void LLAppViewer::outOfMemorySoftQuit() { if (!mQuitRequested) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index c977757e48..d76e5015e9 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -254,6 +254,9 @@ public: void createErrorMarker(eLastExecEvent error_code) const; bool errorMarkerExists() const; + void createWatchdogMarker() const; + void removeWatchdogMarker() const; + // Attempt a 'soft' quit with disconnect and saving of settings/cache. // Intended to be thread safe. // Good chance of viewer crashing either way, but better than alternatives. diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f8ea09d40e..dda6d9d029 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -121,6 +121,7 @@ namespace // MiniDmpSender pointer. As things stand, though, we must define an // actual function and store the pointer statically. static MiniDmpSender *sBugSplatSender = nullptr; + static std::string sBugsplatDescriptionField; bool bugsplatSendLog(UINT nCode, LPVOID lpVal1, LPVOID lpVal2) { @@ -157,8 +158,21 @@ namespace WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml"))); } - // LL_ERRS message, when there is one - sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage())); + if (!sBugsplatDescriptionField.empty()) + { + // Can be set by watchdog or other code that detects a problem + // and wants to add some context to the crash report. + // Will be visible in the BugSplat web UI. + sBugSplatSender->setDefaultUserDescription(WCSTR(sBugsplatDescriptionField)); + // This type of crash is not necessarily a crash, or final. + // Prepare for the next one. + sBugsplatDescriptionField.clear(); + } + else + { + // LL_ERRS message, when there is one + sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage())); + } sBugSplatSender->setAttribute(WCSTR(L"OS"), WCSTR(LLOSInfo::instance().getOSStringSimple())); // In case we ever stop using email for this sBugSplatSender->setAttribute(WCSTR(L"AppState"), WCSTR(LLStartUp::getStartupStateString())); @@ -435,22 +449,8 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, // commands and exit the process before we do anything else. if (!velopack_initialize()) { + // Obsolete? Always return true // Velopack handled the invocation (install/uninstall hook) - - // Drop install related settings - gDirUtilp->initAppDirs("SecondLife"); - - std::string user_settings_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml"); - LLControlGroup settings("global"); - if (settings.loadFromFile(user_settings_path)) - { - // If user reinstalls or updates, we want to recheck for nsis leftovers. - if (settings.controlExists("PreviousInstallChecked")) - { - settings.setBOOL("PreviousInstallChecked", false); - } - settings.saveToFile(user_settings_path, true); - } return 0; } #endif @@ -864,6 +864,38 @@ bool LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo) return false; } +#if defined(LL_BUGSPLAT) +static int reportCustomToBugsplatFilter(EXCEPTION_POINTERS* pExcepInfo) +{ + if (sBugSplatSender) + { + sBugSplatSender->createReport(pExcepInfo); + } + return EXCEPTION_EXECUTE_HANDLER; +} +#endif + +bool LLAppViewerWin32::reportCustomToBugsplat(const std::string &description) +{ +#if defined(LL_BUGSPLAT) + if (sBugSplatSender) + { + sBugsplatDescriptionField = description; + + __try + { + // Generate a custom exception code + RaiseException(0xE0000001, 0, 0, NULL); + } + __except (reportCustomToBugsplatFilter(GetExceptionInformation())) + { + } + return true; + } +#endif // LL_BUGSPLAT + return false; +} + bool LLAppViewerWin32::initWindow() { // This is a workaround/hotfix for a change in Windows 11 24H2 (and possibly later) diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 0741758a0c..53177f7f95 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -44,6 +44,7 @@ public: bool cleanup() override; bool reportCrashToBugsplat(void* pExcepInfo) override; + bool reportCustomToBugsplat(const std::string& description) override; protected: bool initWindow() override; // Override to initialize the viewer's window. diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 47803edc73..6bd15d4b61 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -647,7 +647,7 @@ void LLCOFWearables::addClothingTypesDummies(const LLAppearanceMgr::wearables_by for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++) { - if (clothing_by_type[type].empty()) + if (!clothing_by_type[type].empty()) continue; LLWearableType::EType w_type = static_cast<LLWearableType::EType>(type); diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 97d2345778..ce236dec66 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -200,13 +200,14 @@ void LLColorSwatchCtrl::draw() F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); mBorder->setKeyboardFocusHighlight(hasFocus()); - // Draw border - LLRect border( 0, getRect().getHeight(), getRect().getWidth(), mLabelHeight ); - gl_rect_2d( border, mBorderColor.get(), false ); - LLRect interior = border; + LLRect gl_border(0, getRect().getHeight(), getRect().getWidth(), mLabelHeight); + LLColor4 gl_border_color = mBorderColor.get(); + LLRect interior = gl_border; interior.stretch( -1 ); + bool show_border_ctrl = true; + // Check state if ( mValid ) { @@ -239,7 +240,9 @@ void LLColorSwatchCtrl::draw() { if (mFallbackImage.notNull()) { - mFallbackImage->draw(interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), LLColor4::white % alpha); + mFallbackImage->draw(interior.mLeft - 1, interior.mBottom - 1, mFallbackImage->getWidth(), mFallbackImage->getHeight(), LLColor4::white % alpha); + gl_border_color = LLUIColorTable::instance().getColor("ColorSwatchBorderColorGray").get(); + show_border_ctrl = false; } else { @@ -250,6 +253,11 @@ void LLColorSwatchCtrl::draw() } } + mBorder->setVisible(show_border_ctrl); + + // Draw border + gl_rect_2d(gl_border, gl_border_color, false); + LLUICtrl::draw(); } diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 99d770b6e2..2297fddf0c 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -59,11 +59,18 @@ public: virtual void onChange(EStatusType status, const LLSD& channelInfo, bool proximal) { + bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); conversation->showVoiceIndicator(conversation && status != STATUS_JOINING && status != STATUS_LEFT_CHANNEL - && LLVoiceClient::getInstance()->voiceEnabled() - && LLVoiceClient::getInstance()->isVoiceWorking()); + && voice_enabled); + + static bool s_voice_enabled(false); + if (s_voice_enabled != voice_enabled) + { + s_voice_enabled = voice_enabled; + conversation->updateConversationIndicators(); + } } private: @@ -509,11 +516,25 @@ void LLConversationViewSession::refresh() // Update all speaking indicators LLSpeakingIndicatorManager::updateSpeakingIndicators(); + updateConversationIndicators(); + + requestArrange(); + if (vmi) + { + // Do the regular upstream refresh + LLFolderViewFolder::refresh(); + } +} + +void LLConversationViewSession::updateConversationIndicators() +{ + bool is_active_channel = isInActiveVoiceChannel(); + // we should show indicator for specified voice session only if this is current channel. EXT-5562. if (mSpeakingIndicator) { - mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel); - mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); + mSpeakingIndicator->setIsActiveChannel(is_active_channel); + mSpeakingIndicator->setShowParticipantsSpeaking(is_active_channel); } LLConversationViewParticipant* participant = NULL; @@ -523,16 +544,9 @@ void LLConversationViewSession::refresh() participant = dynamic_cast<LLConversationViewParticipant*>(*iter); if (participant) { - participant->allowSpeakingIndicator(mIsInActiveVoiceChannel); + participant->allowSpeakingIndicator(is_active_channel); } } - - requestArrange(); - if (vmi) - { - // Do the regular upstream refresh - LLFolderViewFolder::refresh(); - } } void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& session_id) @@ -543,7 +557,7 @@ void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& sessi { bool old_value = mIsInActiveVoiceChannel; mIsInActiveVoiceChannel = vmi->getUUID() == session_id; - mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel && !LLVoiceChannel::isSuspended()); + mCallIconLayoutPanel->setVisible(isInActiveVoiceChannel() && !LLVoiceChannel::isSuspended()); if (old_value != mIsInActiveVoiceChannel) { refresh(); @@ -567,6 +581,13 @@ bool LLConversationViewSession::highlightFriendTitle(LLConversationItem* vmi) return false; } +bool LLConversationViewSession::isInActiveVoiceChannel() +{ + return mIsInActiveVoiceChannel && + LLVoiceClient::getInstance()->voiceEnabled() && + LLVoiceClient::getInstance()->isVoiceWorking(); +} + // // Implementation of conversations list participant (avatar) widgets // diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index a6d240ed84..5844041127 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -94,7 +94,8 @@ public: void setHighlightState(bool hihglight_state); LLFloater* getSessionFloater(); - bool isInActiveVoiceChannel() { return mIsInActiveVoiceChannel; } + bool isInActiveVoiceChannel(); + void updateConversationIndicators(); bool highlightFriendTitle(LLConversationItem* vmi); diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index f1b46f0533..9eddec55c5 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -73,9 +73,9 @@ namespace Details // We will wait RETRY_SECONDS + (errorCount * RETRY_SECONDS_INC) before retrying after an error. // This means we attempt to recover relatively quickly but back off giving more time to recover // until we finally give up after MAX_EVENT_POLL_HTTP_ERRORS attempts. - constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS = 15.f; // ~ half of a normal timeout. - constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC = 5.f; // ~ half of a normal timeout. - constexpr S32 MAX_EVENT_POLL_HTTP_ERRORS = 10; // ~5 minutes, by the above rules. + constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS = 1.f; + constexpr F32 EVENT_POLL_ERROR_RETRY_SECONDS_INC = 3.f; + constexpr S32 MAX_EVENT_POLL_ERRORS = 15; // ~5 minutes, by the above rules. constexpr F64 MIN_SECONDS_PASSED = 10.0; // Minimum time we expect the server to hold the request. int LLEventPollImpl::sNextCounter = 1; @@ -238,23 +238,26 @@ namespace Details } else if (!status.isHttpStatus()) { - /// Some LLCore or LIBCurl error was returned. This is unlikely to be recoverable - LL_WARNS("LLEventPollImpl") << "<" << counter << "> Critical error from poll request returned from libraries. Canceling coroutine." << LL_ENDL; - break; + // Some LLCore or LIBCurl error was returned. + LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error from poll request returned from libraries. " << status.toTerseString() << LL_ENDL; + } + else + { + LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error result from LLCoreHttpUtil::HttpCoroHandler. Code " + << status.toTerseString() << ": '" << httpResults["message"] << "'" << LL_ENDL; } - LL_WARNS("LLEventPollImpl") << "<" << counter << "> Error result from LLCoreHttpUtil::HttpCoroHandler. Code " - << status.toTerseString() << ": '" << httpResults["message"] << "'" << LL_ENDL; - if (errorCount < MAX_EVENT_POLL_HTTP_ERRORS) + if (errorCount < MAX_EVENT_POLL_ERRORS) { // An unanticipated error has been received from our poll // request. Calculate a timeout and wait for it to expire(sleep) - // before trying again. The sleep time is increased by 5 seconds + // before trying again. The sleep time is increased by 3 seconds // for each consecutive error. - ++errorCount; F32 waitToRetry = EVENT_POLL_ERROR_RETRY_SECONDS + errorCount * EVENT_POLL_ERROR_RETRY_SECONDS_INC; + ++errorCount; + LL_WARNS("LLEventPollImpl") << "<" << counter << "> Retrying in " << waitToRetry << " seconds, error count is now " << errorCount << LL_ENDL; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index b9c84c10cf..ec7ea398f0 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1061,6 +1061,91 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offs return true; } +F32 dot_product(const LLVector3& a, const LLVector3& b) +{ + return a.mV[VX] * b.mV[VX] + a.mV[VY] * b.mV[VY] + a.mV[VZ] * b.mV[VZ]; +} + +bool LLFace::calcAlignedPlanarGLTF( + const LLFace* align_to, + LLVector2* res_st_offset, + LLVector2* res_st_scale, + F32* res_st_rot, + S32 gltf_info_index) const +{ + if (!align_to) + { + return false; + } + + const LLTextureEntry* orig_tep = align_to->getTextureEntry(); + const LLTextureEntry* tep = getTextureEntry(); + if (!orig_tep || !tep) + { + return false; + } + + // Only support planar mapping for now + if (orig_tep->getTexGen() != LLTextureEntry::TEX_GEN_PLANAR || + tep->getTexGen() != LLTextureEntry::TEX_GEN_PLANAR) + { + return false; + } + + LLGLTFMaterial* orig_mat = orig_tep->getGLTFRenderMaterial(); + LLGLTFMaterial* this_mat = tep->getGLTFRenderMaterial(); + if (!orig_mat || !this_mat) + { + return false; + } + + // Get the original GLTF transform for the specified channel + const auto& orig_tt = orig_mat->mTextureTransform[gltf_info_index]; + + // Convert GLTF transform to legacy TE transform + F32 map_scaleS, map_scaleT, map_offsS, map_offsT, map_rot; + LLGLTFMaterial::convertPBRTransformToTexture( + orig_tt.mScale, + orig_tt.mOffset, + orig_tt.mRotation, + map_scaleS, map_scaleT, map_offsS, map_offsT, map_rot); + + // Calculate aligments + LLVector3 orig_pos, this_pos; + LLQuaternion orig_face_rot, this_face_rot; + F32 orig_proj_scale, this_proj_scale; + align_to->getPlanarProjectedParams(&orig_face_rot, &orig_pos, &orig_proj_scale); + getPlanarProjectedParams(&this_face_rot, &this_pos, &this_proj_scale); + + // The rotation of "this face's" texture: + LLQuaternion orig_st_rot = LLQuaternion(map_rot, LLVector3::z_axis) * orig_face_rot; + LLQuaternion this_st_rot = orig_st_rot * ~this_face_rot; + F32 x_ang, y_ang, z_ang; + this_st_rot.getEulerAngles(&x_ang, &y_ang, &z_ang); + + // Offset and scale of "this face's" texture: + LLVector3 centers_dist = (this_pos - orig_pos) * ~orig_st_rot; + LLVector3 st_scale(map_scaleS, map_scaleT, 1.f); + st_scale *= orig_proj_scale; + centers_dist.scaleVec(st_scale); + LLVector2 orig_st_offset(map_offsS, map_offsT); + + LLVector2 tex_res_st_offset = orig_st_offset + (LLVector2)centers_dist; + tex_res_st_offset.mV[VX] -= (S32)tex_res_st_offset.mV[VX]; + tex_res_st_offset.mV[VY] -= (S32)tex_res_st_offset.mV[VY]; + + st_scale /= this_proj_scale; + + // Convert aligned legacy TE transform back to GLTF transform + LLGLTFMaterial::convertTextureTransformToPBR( + st_scale.mV[0], st_scale.mV[1], + tex_res_st_offset.mV[0], tex_res_st_offset.mV[1], + z_ang, + *res_st_scale, *res_st_offset, *res_st_rot); + + return true; +} + void LLFace::updateRebuildFlags() { if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME)) @@ -1395,11 +1480,11 @@ bool LLFace::getGeometryVolume(const LLVolume& volume, // They are used only to display a face selection marker // (white square with a rounded cross at the center) const auto& tt = gltf_mat->mTextureTransform[gltf_info_index]; - r = -tt.mRotation * 2; - ms = tt.mScale[VX]; - mt = tt.mScale[VY]; - os += tt.mOffset[VX] + (ms - 1) / 2; - ot -= tt.mOffset[VY] + (mt - 1) / 2; + LLGLTFMaterial::convertPBRTransformToTexture( + tt.mScale, + tt.mOffset, + tt.mRotation, + ms, mt, os, ot, r); } else { diff --git a/indra/newview/llface.h b/indra/newview/llface.h index df31e9ea90..6e9d23c3a2 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -103,6 +103,8 @@ public: LLVector3 getPositionAgent() const; LLVector2 surfaceToTexture(LLVector2 surface_coord, const LLVector4a& position, const LLVector4a& normal); void getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_pos, F32* scale) const; + bool calcAlignedPlanarGLTF(const LLFace* align_to, LLVector2* res_st_offset, + LLVector2* res_st_scale, F32* res_st_rot, S32 gltf_info_index = 0) const; bool calcAlignedPlanarTE(const LLFace* align_to, LLVector2* st_offset, LLVector2* st_scale, F32* st_rot, LLRender::eTexIndex map = LLRender::DIFFUSE_MAP) const; diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 7262d18483..99e93bafbf 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -245,8 +245,8 @@ void doSaveDialogModeless(const std::string* file, NSURL *last_url = [[NSUserDefaults standardUserDefaults] URLForKey:@"NSNavLastRootDirectory"]; if(!last_url) { - NSURL *documents_url = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject; - [panel setDirectoryURL:documents_url]; + NSURL *downloads_url = [[NSFileManager defaultManager] URLsForDirectory:NSDownloadsDirectory inDomains:NSUserDomainMask].firstObject; + [panel setDirectoryURL:downloads_url]; } [panel beginWithCompletionHandler:^(NSModalResponse result) diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index 95e7b9af41..ed07d49ac1 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -403,7 +403,7 @@ void LLFloater360Capture::suspendForAFrame() U32 curr_frame_count = LLFrameTimer::getFrameCount(); while (LLFrameTimer::getFrameCount() <= curr_frame_count + frame_count_delta) { - llcoro::suspend(); + llcoro::suspendUntilNextFrame(); } } diff --git a/indra/newview/llfloaterbigpreview.cpp b/indra/newview/llfloaterbigpreview.cpp deleted file mode 100644 index ba682494bb..0000000000 --- a/indra/newview/llfloaterbigpreview.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/** -* @file llfloaterbigpreview.cpp -* @brief Display of extended (big) preview for snapshots and SL Share -* @author merov@lindenlab.com -* -* $LicenseInfo:firstyear=2013&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2013, 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 "llfloaterbigpreview.h" -#include "llsnapshotlivepreview.h" - -/////////////////////// -//LLFloaterBigPreview// -/////////////////////// - -LLFloaterBigPreview::LLFloaterBigPreview(const LLSD& key) : LLFloater(key), - mPreviewPlaceholder(NULL), - mFloaterOwner(NULL) -{ -} - -LLFloaterBigPreview::~LLFloaterBigPreview() -{ - if (mPreviewHandle.get()) - { - mPreviewHandle.get()->die(); - } -} - -void LLFloaterBigPreview::onCancel() -{ - closeFloater(); -} - -void LLFloaterBigPreview::closeOnFloaterOwnerClosing(LLFloater* floaterp) -{ - if (isFloaterOwner(floaterp)) - { - closeFloater(); - } -} - -bool LLFloaterBigPreview::postBuild() -{ - mPreviewPlaceholder = getChild<LLUICtrl>("big_preview_placeholder"); - return LLFloater::postBuild(); -} - -void LLFloaterBigPreview::draw() -{ - LLFloater::draw(); - - LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get()); - - // Display the preview if one is available - if (previewp && previewp->getBigThumbnailImage()) - { - // Get the preview rect - const LLRect& preview_rect = mPreviewPlaceholder->getRect(); - - // Get the preview texture size - S32 thumbnail_w = previewp->getBigThumbnailWidth(); - S32 thumbnail_h = previewp->getBigThumbnailHeight(); - - // Compute the scaling ratio and the size of the final texture in the rect: we want to prevent anisotropic scaling (distorted in x and y) - F32 ratio = llmax((F32)(thumbnail_w)/(F32)(preview_rect.getWidth()), (F32)(thumbnail_h)/(F32)(preview_rect.getHeight())); - thumbnail_w = (S32)((F32)(thumbnail_w)/ratio); - thumbnail_h = (S32)((F32)(thumbnail_h)/ratio); - - // Compute the preview offset within the preview rect: we want to center that preview in the available rect - const S32 local_offset_x = (preview_rect.getWidth() - thumbnail_w) / 2 ; - const S32 local_offset_y = (preview_rect.getHeight() - thumbnail_h) / 2 ; - - // Compute preview offset within the floater rect - S32 offset_x = preview_rect.mLeft + local_offset_x; - S32 offset_y = preview_rect.mBottom + local_offset_y; - - gGL.matrixMode(LLRender::MM_MODELVIEW); - // Apply floater transparency to the texture unless the floater is focused. - F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); - LLColor4 color = LLColor4::white; - - // Draw the preview texture - gl_draw_scaled_image(offset_x, offset_y, - thumbnail_w, thumbnail_h, - previewp->getBigThumbnailImage(), color % alpha); - } -} - diff --git a/indra/newview/llfloaterbigpreview.h b/indra/newview/llfloaterbigpreview.h deleted file mode 100644 index 1d5804acf5..0000000000 --- a/indra/newview/llfloaterbigpreview.h +++ /dev/null @@ -1,54 +0,0 @@ -/** -* @file llfloaterbigpreview.h -* @brief Display of extended (big) preview for snapshots -* @author merov@lindenlab.com -* -* $LicenseInfo:firstyear=2013&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2013, 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_LLFLOATERBIGPREVIEW_H -#define LL_LLFLOATERBIGPREVIEW_H - -#include "llfloater.h" - -class LLFloaterBigPreview : public LLFloater -{ -public: - LLFloaterBigPreview(const LLSD& key); - ~LLFloaterBigPreview(); - - bool postBuild(); - void draw(); - void onCancel(); - - void setPreview(LLView* previewp) { mPreviewHandle = previewp->getHandle(); } - void setFloaterOwner(LLFloater* floaterp) { mFloaterOwner = floaterp; } - bool isFloaterOwner(LLFloater* floaterp) const { return (mFloaterOwner == floaterp); } - void closeOnFloaterOwnerClosing(LLFloater* floaterp); - -private: - LLHandle<LLView> mPreviewHandle; - LLUICtrl* mPreviewPlaceholder; - LLFloater* mFloaterOwner; -}; - -#endif // LL_LLFLOATERBIGPREVIEW_H - diff --git a/indra/newview/llfloaterexperiences.cpp b/indra/newview/llfloaterexperiences.cpp index 999a473a49..79d74093a2 100644 --- a/indra/newview/llfloaterexperiences.cpp +++ b/indra/newview/llfloaterexperiences.cpp @@ -385,8 +385,11 @@ void LLFloaterExperiences::retrieveExperienceListCoro(std::string url, if (!status) { + LL_WARNS("Experience") << "Failed to retrieve list. Error: " << status.toTerseString() + << ". Type: " << errorNotify << " Message: " << status.getMessage() << LL_ENDL; + LLSD subs; - subs["ERROR_MESSAGE"] = status.getType(); + subs["ERROR_MESSAGE"] = llformat(" %d\n %s", (S32)status.getType(), status.getMessage().c_str()); LLNotificationsUtil::add(errorNotify, subs); return; diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index a0f2dbe197..5f9d3ac304 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -57,6 +57,8 @@ #include "llsdserialize.h" #include "llviewermenu.h" // is_agent_mappable #include "llviewerobjectlist.h" +#include "llvoavatar.h" +#include "llnearbyvoicemoderation.h" const S32 EVENTS_PER_IDLE_LOOP_CURRENT_SESSION = 80; @@ -90,6 +92,7 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param mAutoResize = false; LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this); + LLNearbyVoiceModeration::getInstance(); } LLFloaterIMContainer::~LLFloaterIMContainer() @@ -530,6 +533,33 @@ void LLFloaterIMContainer::idleUpdate() mGeneralTitleInUse = !needs_override; setTitle(needs_override ? conversation_floaterp->getTitle() : mGeneralTitle); } + const LLConversationItem* nearby_session = getSessionModel(LLUUID()); + if (nearby_session) + { + LLSpeakerMgr* speaker_mgr = (LLSpeakerMgr*)(LLLocalSpeakerMgr::getInstance()); + + LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = nearby_session->getChildrenBegin(); + LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = nearby_session->getChildrenEnd(); + while (current_participant_model != end_participant_model) + { + LLConversationItemParticipant* participant_model = + dynamic_cast<LLConversationItemParticipant*>((*current_participant_model).get()); + if (participant_model) + { + bool show_moderator_options = LLNearbyVoiceModeration::getInstance()->isNearbyChatModerator(); + LLUUID participant_id = participant_model->getUUID(); + if (participant_id != gAgentID) + { + // Don't show moderator options if participant is not connected to the same spatial channel + LLSpeaker* speakerp = speaker_mgr->findSpeaker(participant_id).get(); + show_moderator_options &= speakerp && speakerp->isInVoiceChannel(); + } + participant_model->setModeratorOptionsVisible(show_moderator_options); + } + + current_participant_model++; + } + } } mParticipantRefreshTimer.setTimerExpirySec(1.0f); @@ -1685,6 +1715,10 @@ bool LLFloaterIMContainer::visibleContextMenuItem(const LLSD& userdata) { return isMuted(conversation_item->getUUID()); } + else if ("can_allow_text_chat" == item) + { + return !isNearbyChatSpeakerSelected(); + } return true; } @@ -2014,9 +2048,27 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata, bool is_self) { - // only group moderators can perform actions related to this "enable callback" - if (!isGroupModerator()) + if (LLNearbyVoiceModeration::getInstance()->isNearbyChatModerator() && isNearbyChatSpeakerSelected()) { + // Determine here which actions are allowed + if ("can_moderate_voice" == userdata) + { + return true; + } + else if (("can_mute" == userdata)) + { + return !is_self; + } + else if ("can_unmute" == userdata) + { + return true; + } + + return false; + } + else if (!isGroupModerator()) + { + // only group moderators can perform actions related to this "enable callback" return false; } @@ -2149,7 +2201,35 @@ void LLFloaterIMContainer::banSelectedMember(const LLUUID& participant_uuid) void LLFloaterIMContainer::moderateVoice(const std::string& command, const LLUUID& userID) { - if (!gAgent.getRegion()) return; + if (!gAgent.getRegion()) + { + return; + } + + if (isNearbyChatSpeakerSelected()) + { + if ("selected" == command) + { + // Request a mute/unmute using a capability request via the simulator + LLNearbyVoiceModeration::getInstance()->requestMuteIndividual(userID, !isMuted(userID)); + } + else + if ("mute_all" == command) + { + // Send the mute_all request to the server + const bool mute_state = true; + LLNearbyVoiceModeration::getInstance()->requestMuteAll(mute_state); + } + else + if ("unmute_all" == command) + { + // Send the unmute_all request to the server + const bool mute_state = false; + LLNearbyVoiceModeration::getInstance()->requestMuteAll(mute_state); + } + + return; + } if (command.compare("selected")) { @@ -2267,6 +2347,31 @@ LLSpeaker * LLFloaterIMContainer::getSpeakerOfSelectedParticipant(LLSpeakerMgr * return speaker_managerp->findSpeaker(participant_itemp->getUUID()); } +bool LLFloaterIMContainer::isNearbyChatSpeakerSelected() +{ + LLFolderViewItem *selectedItem = mConversationsRoot->getCurSelectedItem(); + if (!selectedItem) + { + LL_WARNS() << "Current selected item is null" << LL_ENDL; + return NULL; + } + + conversations_widgets_map::const_iterator iter = mConversationsWidgets.begin(); + conversations_widgets_map::const_iterator end = mConversationsWidgets.end(); + const LLUUID * conversation_uuidp = NULL; + while(iter != end) + { + if (iter->second == selectedItem || iter->second == selectedItem->getParentFolder()) + { + conversation_uuidp = &iter->first; + break; + } + ++iter; + } + // Nearby chat ID is LLUUID::null + return conversation_uuidp->isNull(); +} + void LLFloaterIMContainer::toggleAllowTextChat(const LLUUID& participant_uuid) { LLIMSpeakerMgr * speaker_managerp = dynamic_cast<LLIMSpeakerMgr*>(getSpeakerMgrForSelectedParticipant()); diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 30eed8be36..9f1690a9b9 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -178,6 +178,7 @@ private: void banSelectedMember(const LLUUID& participant_uuid); void openNearbyChat(); bool isParticipantListExpanded(); + bool isNearbyChatSpeakerSelected(); void idleUpdate(); // for convenience (self) from static idle void idleProcessEvents(); diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 84a9fad708..73bce6f2fd 100644 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -142,7 +142,7 @@ void LLFloaterIMSession::onClickCloseBtn(bool app_qutting) { if (app_qutting) { - LLFloaterIMSessionTab::onClickCloseBtn(); + LLFloaterIMSessionTab::onClickCloseBtn(app_qutting); return; } @@ -1056,7 +1056,7 @@ void LLFloaterIMSession::processAgentListUpdates(const LLSD& body) if (moderator_muted_text) label = LLTrans::getString("IM_muted_text_label"); else - label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID); + label = LLIMModel::instance().getName(mSessionID); mInputEditor->setLabel(label); if (moderator_muted_text) diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 65c13797ac..b70d21e2c5 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -48,6 +48,7 @@ #include "llfloaterimnearbychat.h" #include "llgroupiconctrl.h" #include "lllayoutstack.h" +#include "llnotificationsutil.h" #include "llpanelemojicomplete.h" #include "lltoolbarview.h" @@ -934,7 +935,7 @@ void LLFloaterIMSessionTab::hideOrShowTitle() void LLFloaterIMSessionTab::updateSessionName(const std::string& name) { - mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + name); + mInputEditor->setLabel(name); } void LLFloaterIMSessionTab::updateChatIcon(const LLUUID& id) @@ -1417,3 +1418,20 @@ bool LLFloaterIMSessionTab::handleKeyHere(KEY key, MASK mask ) } return handled; } + +void LLFloaterIMSessionTab::onClickCloseBtn(bool app_quitting) +{ + bool is_ad_hoc = (mSession ? mSession->isAdHocSessionType() : false); + if (is_ad_hoc && !app_quitting) + { + LLNotificationsUtil::add("ConfirmLeaveAdhoc", LLSD(), LLSD(), [this](const LLSD& notification, const LLSD& response) + { + if (0 == LLNotificationsUtil::getSelectedOption(notification, response)) + closeFloater(); + }); + } + else + { + closeFloater(); + } +} diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index 289a9e90fe..fdc93d6fb4 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -84,6 +84,8 @@ public: void closeFloater(bool app_quitting = false) override; void deleteAllChildren() override; + virtual void onClickCloseBtn(bool app_quitting = false) override; + // Handle the left hand participant list widgets void addConversationViewParticipant(LLConversationItem* item, bool update_view = true); void removeConversationViewParticipant(const LLUUID& participant_id); diff --git a/indra/newview/llfloaterlinkreplace.cpp b/indra/newview/llfloaterlinkreplace.cpp index c961070787..33e054aab9 100644 --- a/indra/newview/llfloaterlinkreplace.cpp +++ b/indra/newview/llfloaterlinkreplace.cpp @@ -225,6 +225,21 @@ void LLFloaterLinkReplace::linkCreatedCallback(LLHandle<LLFloaterLinkReplace> fl << " - description update = " << (needs_description_update ? "true" : "false") << LL_NEWLINE << " - outfit_folder_id = " << outfit_folder_id.asString() << LL_ENDL; + std::string old_description; + if (needs_wearable_ordering_update) + { + LLViewerInventoryItem* old_item = gInventory.getItem(old_item_id); + LLViewerInventoryItem* target_item = gInventory.getItem(target_item_id); + if (old_item && target_item && + old_item->getType() == LLAssetType::AT_CLOTHING && + target_item->getType() == LLAssetType::AT_CLOTHING && + old_item->getWearableType() == target_item->getWearableType()) + { + // Preserve the original description, which contains ordering info + old_description = old_item->getActualDescription(); + } + } + // If we are replacing an object, bodypart or gesture link within an outfit folder, // we need to change the actual description of the link itself. LLAppearanceMgr *should* // have created COF links that will be used to save the outfit with an empty description. @@ -246,7 +261,14 @@ void LLFloaterLinkReplace::linkCreatedCallback(LLHandle<LLFloaterLinkReplace> fl { LLPointer<LLViewerInventoryItem> item = *it; - if ((item->getType() == LLAssetType::AT_BODYPART || + if (item->getType() == LLAssetType::AT_CLOTHING && !old_description.empty()) + { + // Use the old description to set ordering info + LLSD updates; + updates["desc"] = old_description; + update_inventory_item(item->getUUID(), updates, LLPointer<LLInventoryCallback>(NULL)); + } + else if ((item->getType() == LLAssetType::AT_BODYPART || item->getType() == LLAssetType::AT_OBJECT || item->getType() == LLAssetType::AT_GESTURE) && !item->getActualDescription().empty()) @@ -347,12 +369,9 @@ void LLFloaterLinkReplace::processBatch(LLInventoryModel::item_array_t items) bool is_outfit_folder = gInventory.isObjectDescendentOf(source_item->getParentUUID(), outfit_folder_id); // If either the new or old item in the COF is a wearable, we need to update wearable ordering after the link has been replaced bool needs_wearable_ordering_update = (is_outfit_folder && source_item->getType() == LLAssetType::AT_CLOTHING) || target_item->getType() == LLAssetType::AT_CLOTHING; - // Other items in the COF need a description update (description of the actual link item must be empty) - bool needs_description_update = is_outfit_folder && target_item->getType() != LLAssetType::AT_CLOTHING; LL_DEBUGS() << "is_outfit_folder = " << (is_outfit_folder ? "true" : "false") << LL_NEWLINE - << "needs_wearable_ordering_update = " << (needs_wearable_ordering_update ? "true" : "false") << LL_NEWLINE - << "needs_description_update = " << (needs_description_update ? "true" : "false") << LL_ENDL; + << "needs_wearable_ordering_update = " << (needs_wearable_ordering_update ? "true" : "false") << LL_ENDL; LLInventoryObject::const_object_list_t obj_array; obj_array.push_back(LLConstPointer<LLInventoryObject>(target_item)); @@ -361,7 +380,7 @@ void LLFloaterLinkReplace::processBatch(LLInventoryModel::item_array_t items) source_item->getUUID(), target_item->getUUID(), needs_wearable_ordering_update, - needs_description_update, + is_outfit_folder, (is_outfit_folder ? source_item->getParentUUID() : LLUUID::null) )); link_inventory_array(source_item->getParentUUID(), obj_array, cb); } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 81e3619ef0..0bdd407474 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -621,8 +621,6 @@ void LLFloaterPreference::apply() std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); setCacheLocation(cache_location); - LLViewerMedia::getInstance()->setCookiesEnabled(getChild<LLUICtrl>("cookies_enabled")->getValue()); - if (hasChild("web_proxy_enabled", true) &&hasChild("web_proxy_editor", true) && hasChild("web_proxy_port", true)) { bool proxy_enable = getChild<LLUICtrl>("web_proxy_enabled")->getValue(); diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 9b7a4e5134..3c84f5b459 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -123,19 +123,32 @@ void LLFloaterSearch::initiateSearch(const LLSD& tokens) subs["COLLECTION"] = ""; if (subs["TYPE"] == "standard") { + std::string collection_args; if (mCollectionType.find(collection) != mCollectionType.end()) { - subs["COLLECTION"] = "&collection_chosen=" + std::string(collection); + collection_args = "&collection_chosen=" + std::string(collection); } - else + else if (tokens.has("collections") && tokens["collections"].isArray()) + { + const LLSD &sd = tokens["collections"]; + for (LLSD::array_const_iterator it = sd.beginArray(); + it != sd.endArray(); + ++it) + { + if (mCollectionType.find(it->asString()) != mCollectionType.end()) + { + collection_args += "&collection_chosen=" + std::string(*it); + } + } + } + if (collection_args.empty()) { - std::string collection_args(""); for (std::set<std::string>::iterator it = mCollectionType.begin(); it != mCollectionType.end(); ++it) { collection_args += "&collection_chosen=" + std::string(*it); } - subs["COLLECTION"] = collection_args; } + subs["COLLECTION"] = collection_args; } // Default to PG diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index faf7ed0d8c..83d7a92846 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1043,7 +1043,7 @@ bool LLFloaterSnapshot::postBuild() getChild<LLComboBox>("profile_size_combo")->selectNthItem(0); getChild<LLComboBox>("postcard_size_combo")->selectNthItem(0); getChild<LLComboBox>("texture_size_combo")->selectNthItem(0); - getChild<LLComboBox>("local_size_combo")->selectNthItem(8); + getChild<LLComboBox>("local_size_combo")->selectNthItem(0); getChild<LLComboBox>("local_format_combo")->selectNthItem(0); impl->mPreviewHandle = previewp->getHandle(); diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp deleted file mode 100644 index f11c5c0ad8..0000000000 --- a/indra/newview/llfloatersounddevices.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file llfloatersounddevices.cpp - * @author Leyla Farazha - * @brief Sound Preferences used for minimal skin - * -* $LicenseInfo:firstyear=2011&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 "llfloatersounddevices.h" - -#include "lldraghandle.h" - -#include "llpanelvoicedevicesettings.h" - -// Library includes -#include "indra_constants.h" - -// protected -LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key) -: LLTransientDockableFloater(NULL, false, key) -{ - LLTransientFloaterMgr::getInstance()->addControlView(this); - - // force docked state since this floater doesn't save it between recreations - setDocked(true); -} - -LLFloaterSoundDevices::~LLFloaterSoundDevices() -{ - LLTransientFloaterMgr::getInstance()->removeControlView(this); -} - -// virtual -bool LLFloaterSoundDevices::postBuild() -{ - LLTransientDockableFloater::postBuild(); - - updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) - - LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel"); - if (panel) - { - panel->setUseTuningMode(false); - getChild<LLUICtrl>("voice_input_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel)); - getChild<LLUICtrl>("voice_output_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel)); - getChild<LLUICtrl>("mic_volume_slider")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel)); - } - return true; -} - -//virtual -void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/) -{ - LLTransientDockableFloater::setDocked(docked, pop_on_undock); -} - -// virtual -void LLFloaterSoundDevices::setFocus(bool b) -{ - LLTransientDockableFloater::setFocus(b); - - // Force using active floater transparency - // We have to override setFocus() for because selecting an item of the - // combobox causes the floater to lose focus and thus become transparent. - updateTransparency(TT_ACTIVE); -} diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp deleted file mode 100644 index 9f7c9aba87..0000000000 --- a/indra/newview/llfloatervoiceeffect.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/** - * @file llfloatervoiceeffect.cpp - * @author Aimee - * @brief Selection and preview of voice effect. - * - * $LicenseInfo:firstyear=2010&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 "llfloatervoiceeffect.h" - -#include "llscrolllistctrl.h" -#include "lltrans.h" -#include "llweb.h" - -LLFloaterVoiceEffect::LLFloaterVoiceEffect(const LLSD& key) - : LLFloater(key) -{ - mCommitCallbackRegistrar.add("VoiceEffect.Record", boost::bind(&LLFloaterVoiceEffect::onClickRecord, this)); - mCommitCallbackRegistrar.add("VoiceEffect.Play", boost::bind(&LLFloaterVoiceEffect::onClickPlay, this)); - mCommitCallbackRegistrar.add("VoiceEffect.Stop", boost::bind(&LLFloaterVoiceEffect::onClickStop, this)); -// mCommitCallbackRegistrar.add("VoiceEffect.Activate", boost::bind(&LLFloaterVoiceEffect::onClickActivate, this)); -} - -// virtual -LLFloaterVoiceEffect::~LLFloaterVoiceEffect() -{ - if(LLVoiceClient::instanceExists()) - { - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->removeObserver(this); - } - } -} - -// virtual -bool LLFloaterVoiceEffect::postBuild() -{ - setDefaultBtn("record_btn"); - getChild<LLButton>("record_btn")->setFocus(true); - getChild<LLUICtrl>("voice_morphing_link")->setTextArg("[URL]", LLTrans::getString("voice_morphing_url")); - - mVoiceEffectList = getChild<LLScrollListCtrl>("voice_effect_list"); - if (mVoiceEffectList) - { - mVoiceEffectList->setCommitCallback(boost::bind(&LLFloaterVoiceEffect::onClickPlay, this)); -// mVoiceEffectList->setDoubleClickCallback(boost::bind(&LLFloaterVoiceEffect::onClickActivate, this)); - } - - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->addObserver(this); - - // Disconnect from the current voice channel ready to record a voice sample for previewing - effect_interface->enablePreviewBuffer(true); - } - - refreshEffectList(); - updateControls(); - - return true; -} - -// virtual -void LLFloaterVoiceEffect::onClose(bool app_quitting) -{ - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->enablePreviewBuffer(false); - } -} - -void LLFloaterVoiceEffect::refreshEffectList() -{ - if (!mVoiceEffectList) - { - return; - } - - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (!effect_interface) - { - mVoiceEffectList->setEnabled(false); - return; - } - - LL_DEBUGS("Voice")<< "Rebuilding Voice Morph list."<< LL_ENDL; - - // Preserve selected items and scroll position - S32 scroll_pos = mVoiceEffectList->getScrollPos(); - uuid_vec_t selected_items; - std::vector<LLScrollListItem*> items = mVoiceEffectList->getAllSelected(); - for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++) - { - selected_items.push_back((*it)->getUUID()); - } - - mVoiceEffectList->deleteAllItems(); - - { - // Add the "No Voice Morph" entry - LLSD element; - - element["id"] = LLUUID::null; - element["columns"][NAME_COLUMN]["column"] = "name"; - element["columns"][NAME_COLUMN]["value"] = getString("no_voice_effect"); - element["columns"][NAME_COLUMN]["font"]["style"] = "BOLD"; - - LLScrollListItem* sl_item = mVoiceEffectList->addElement(element, ADD_BOTTOM); - // *HACK: Copied from llfloatergesture.cpp : ["font"]["style"] does not affect font style :( - if(sl_item) - { - ((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(LLFontGL::BOLD); - } - } - - // Add each Voice Morph template, if there are any (template list includes all usable effects) - const voice_effect_list_t& template_list = effect_interface->getVoiceEffectTemplateList(); - if (!template_list.empty()) - { - for (voice_effect_list_t::const_iterator it = template_list.begin(); it != template_list.end(); ++it) - { - const LLUUID& effect_id = it->second; - - std::string localized_effect = "effect_" + it->first; - std::string effect_name = hasString(localized_effect) ? getString(localized_effect) : it->first; // XML contains localized effects names - - LLSD effect_properties = effect_interface->getVoiceEffectProperties(effect_id); - - // Tag the active effect. - if (effect_id == LLVoiceClient::instance().getVoiceEffectDefault()) - { - effect_name += " " + getString("active_voice_effect"); - } - - // Tag available effects that are new this session - if (effect_properties["is_new"].asBoolean()) - { - effect_name += " " + getString("new_voice_effect"); - } - - LLDate expiry_date = effect_properties["expiry_date"].asDate(); - bool is_template_only = effect_properties["template_only"].asBoolean(); - - std::string font_style = "NORMAL"; - if (!is_template_only) - { - font_style = "BOLD"; - } - - LLSD element; - element["id"] = effect_id; - - element["columns"][NAME_COLUMN]["column"] = "name"; - element["columns"][NAME_COLUMN]["value"] = effect_name; - element["columns"][NAME_COLUMN]["font"]["style"] = font_style; - - element["columns"][1]["column"] = "expires"; - if (!is_template_only) - { - element["columns"][DATE_COLUMN]["value"] = expiry_date; - element["columns"][DATE_COLUMN]["type"] = "date"; - } - else { - element["columns"][DATE_COLUMN]["value"] = getString("unsubscribed_voice_effect"); - } -// element["columns"][DATE_COLUMN]["font"]["style"] = "NORMAL"; - - LLScrollListItem* sl_item = mVoiceEffectList->addElement(element, ADD_BOTTOM); - // *HACK: Copied from llfloatergesture.cpp : ["font"]["style"] does not affect font style :( - if(sl_item) - { - LLFontGL::StyleFlags style = is_template_only ? LLFontGL::NORMAL : LLFontGL::BOLD; - LLScrollListText* slt = dynamic_cast<LLScrollListText*>(sl_item->getColumn(0)); - llassert(slt); - if (slt) - { - slt->setFontStyle(style); - } - } - } - } - - // Re-select items that were selected before, and restore the scroll position - for(uuid_vec_t::iterator it = selected_items.begin(); it != selected_items.end(); it++) - { - mVoiceEffectList->selectByID(*it); - } - mVoiceEffectList->setScrollPos(scroll_pos); - mVoiceEffectList->setEnabled(true); -} - -void LLFloaterVoiceEffect::updateControls() -{ - bool recording = false; - - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - recording = effect_interface->isPreviewRecording(); - } - - getChild<LLButton>("record_btn")->setVisible(!recording); - getChild<LLButton>("record_stop_btn")->setVisible(recording); -} - -// virtual -void LLFloaterVoiceEffect::onVoiceEffectChanged(bool effect_list_updated) -{ - if (effect_list_updated) - { - refreshEffectList(); - } - updateControls(); -} - -void LLFloaterVoiceEffect::onClickRecord() -{ - LL_DEBUGS("Voice") << "Record clicked" << LL_ENDL; - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->recordPreviewBuffer(); - } - updateControls(); -} - -void LLFloaterVoiceEffect::onClickPlay() -{ - LL_DEBUGS("Voice") << "Play clicked" << LL_ENDL; - if (!mVoiceEffectList) - { - return; - } - - const LLUUID& effect_id = mVoiceEffectList->getCurrentID(); - - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->playPreviewBuffer(effect_id); - } - updateControls(); -} - -void LLFloaterVoiceEffect::onClickStop() -{ - LL_DEBUGS("Voice") << "Stop clicked" << LL_ENDL; - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->stopPreviewBuffer(); - } - updateControls(); -} - -//void LLFloaterVoiceEffect::onClickActivate() -//{ -// LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); -// if (effect_interface && mVoiceEffectList) -// { -// effect_interface->setVoiceEffect(mVoiceEffectList->getCurrentID()); -// } -//} - diff --git a/indra/newview/llfloatervoiceeffect.h b/indra/newview/llfloatervoiceeffect.h deleted file mode 100644 index 323beb64ae..0000000000 --- a/indra/newview/llfloatervoiceeffect.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @file llfloatervoiceeffect.h - * @author Aimee - * @brief Selection and preview of voice effects. - * - * $LicenseInfo:firstyear=2010&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_LLFLOATERVOICEEFFECT_H -#define LL_LLFLOATERVOICEEFFECT_H - -#include "llfloater.h" -#include "llvoiceclient.h" - -class LLButton; -class LLScrollListCtrl; - -class LLFloaterVoiceEffect - : public LLFloater - , public LLVoiceEffectObserver -{ -public: - LOG_CLASS(LLFloaterVoiceEffect); - - LLFloaterVoiceEffect(const LLSD& key); - virtual ~LLFloaterVoiceEffect(); - - bool postBuild() override; - void onClose(bool app_quitting) override; - -private: - enum ColumnIndex - { - NAME_COLUMN = 0, - DATE_COLUMN = 1, - }; - - void refreshEffectList(); - void updateControls(); - - /// Called by voice effect provider when voice effect list is changed. - virtual void onVoiceEffectChanged(bool effect_list_updated) override; - - void onClickRecord(); - void onClickPlay(); - void onClickStop(); -// void onClickActivate(); - - LLUUID mSelectedID; - LLScrollListCtrl* mVoiceEffectList; -}; - -#endif diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 458ea24d33..7522ea4907 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2555,7 +2555,7 @@ bool get_is_favorite(const LLUUID& obj_id) return obj && obj->getIsFavorite(); } - return object->getIsFavorite(); + return object && object->getIsFavorite(); } void set_favorite(const LLUUID& obj_id, bool favorite) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 68739341e9..933a6d530f 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -2847,8 +2847,44 @@ void LLMeshUploadThread::packModelIntance( texture_index.find(texture) == texture_index.end()) { texture_index[texture] = texture_num; - std::string str = texture_str.str(); - res["texture_list"][texture_num] = LLSD::Binary(str.begin(), str.end()); + if (include_textures) + { + std::string str = texture_str.str(); + res["texture_list"][texture_num] = LLSD::Binary(str.begin(), str.end()); + } + else + { // When not including the whole texture, we need to send some metadata about the image + // to ensure accurate price estimation. If not included, the server will assume all + // textures are 1024 x 1024, which could lead to a low estimate. + LLSD info = LLSD::emptyMap(); + + S32 texture_width = 0; + S32 texture_height = 0; + if (texture->hasSavedRawImage()) + { + LLImageDataLock lock(texture->getSavedRawImage()); + + LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(texture->getSavedRawImage()); + + if (!upload_file.isNull() && upload_file->getDataSize() && !upload_file->isBufferInvalid()) + { + texture_width = upload_file->getWidth(); + texture_height = upload_file->getHeight(); + } + } + + if ((texture_width <= 0) || (texture_height <= 0)) + { + // Fall back to the texture's stored dimensions if we can't get dimensions from the raw image. + texture_width = texture->getFullWidth(); + texture_height = texture->getFullHeight(); + } + + info["width"] = texture_width; + info["height"] = texture_height; + res["texture_info"][texture_num] = info; + res["texture_list"][texture_num] = LLSD::Binary(); // empty binary to indicate texture is not included, for older server compatibility + } // store indexes for error handling; texture_list_dest.push_back(material.mDiffuseMapFilename); texture_num++; @@ -2881,8 +2917,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>& LLSD res; if (mDestinationFolderId.isNull()) { - result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT); - result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE); + result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT); + result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE); } else { @@ -3331,6 +3367,8 @@ void LLMeshRepoThread::notifyLoadedMeshes() loaded_queue.swap(mLoadedQ); mLoadedMutex->unlock(); + LL_PROFILE_ZONE_NAMED("notify loaded meshes"); + update_metrics = true; // Process the elements free of the lock @@ -3362,6 +3400,8 @@ void LLMeshRepoThread::notifyLoadedMeshes() unavil_queue.swap(mUnavailableQ); mLoadedMutex->unlock(); + LL_PROFILE_ZONE_NAMED("notify unavail meshes"); + update_metrics = true; // Process the elements free of the lock @@ -3380,6 +3420,7 @@ void LLMeshRepoThread::notifyLoadedMeshes() { if (mLoadedMutex->trylock()) { + LL_PROFILE_ZONE_NAMED("notify misc meshes"); std::deque<LLPointer<LLMeshSkinInfo>> skin_info_q; std::deque<UUIDBasedRequest> skin_info_unavail_q; std::list<LLModel::Decomposition*> decomp_q; diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index dfead5ee8a..9a0612e9f9 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -712,7 +712,14 @@ void LLNavigationBar::resizeLayoutPanel() } void LLNavigationBar::invokeSearch(std::string search_text) { - LLFloaterReg::showInstance("search", LLSD().with("category", "standard").with("query", LLSD(search_text))); + LLSD key; + key["category"] = "standard"; + key["query"] = search_text; + LLSD collections = LLSD::emptyArray(); + collections.append("destinations"); + collections.append("places"); + key["collections"] = collections; + LLFloaterReg::showInstance("search", key); } void LLNavigationBar::clearHistoryCache() diff --git a/indra/newview/llnearbyvoicemoderation.cpp b/indra/newview/llnearbyvoicemoderation.cpp new file mode 100644 index 0000000000..a5ee0e9423 --- /dev/null +++ b/indra/newview/llnearbyvoicemoderation.cpp @@ -0,0 +1,220 @@ +/** + * @file llnearbyvoicemoderation.cpp + * + * $LicenseInfo:firstyear=2008&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 "llagent.h" +#include "llnotificationsutil.h" +#include "llviewerregion.h" +#include "llvoavatar.h" +#include "llvoicechannel.h" +#include "llvoiceclient.h" +#include "llviewerobjectlist.h" +#include "llviewerparcelmgr.h" +#include "roles_constants.h" + +#include "llnearbyvoicemoderation.h" + +LLNearbyVoiceModeration::LLNearbyVoiceModeration() +{ +} + +LLNearbyVoiceModeration::~LLNearbyVoiceModeration() +{ +} + +LLVOAvatar* LLNearbyVoiceModeration::getVOAvatarFromId(const LLUUID& agent_id) +{ + LLViewerObject *obj = gObjectList.findObject(agent_id); + while (obj && obj->isAttachment()) + { + obj = (LLViewerObject*)obj->getParent(); + } + + if (obj && obj->isAvatar()) + { + return (LLVOAvatar*)obj; + } + else + { + return NULL; + } +} + +const std::string LLNearbyVoiceModeration::getCapUrlFromRegion(LLViewerRegion* region) +{ + if (! region || ! region->capabilitiesReceived()) + { + return std::string(); + } + + std::string url = region->getCapability("SpatialVoiceModerationRequest"); + if (url.empty()) + { + LL_INFOS() << "Capability URL for region " << region->getName() << " is empty" << LL_ENDL; + return std::string(); + } + LL_INFOS() << "Capability URL for region " << region->getName() << " is " << url << LL_ENDL; + + return url; +} + +void LLNearbyVoiceModeration::requestMuteIndividual(const LLUUID& agent_id, bool mute) +{ + LLVOAvatar* avatar = getVOAvatarFromId(agent_id); + if (avatar) + { + const std::string cap_url = getCapUrlFromRegion(avatar->getRegion()); + if (cap_url.length()) + { + const std::string operand = mute ? "mute" : "unmute"; + + LLSD body; + body["operand"] = operand; + body["agent_id"] = agent_id; + + const std::string agent_name = avatar->getFullname(); + LL_INFOS() << "Resident " << agent_name + << " (" << agent_id << ")" << " applying " << operand << LL_ENDL; + + std::string success_msg = + STRINGIZE("Resident " << agent_name + << " (" << agent_id << ")" << " nearby voice was set to " << operand); + + std::string failure_msg = + STRINGIZE("Unable to change voice muting for resident " + << agent_name << " (" << agent_id << ")"); + + LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost( + cap_url, + body, + success_msg, + failure_msg); + } + } +} + +void LLNearbyVoiceModeration::requestMuteAll(bool mute) +{ + // Use our own avatar to get the region name + LLViewerRegion* region = gAgent.getRegion(); + + const std::string cap_url = getCapUrlFromRegion(region); + if (cap_url.length()) + { + const std::string operand = mute ? "mute_all" : "unmute_all"; + + LLSD body; + body["operand"] = operand; + + LL_INFOS() << "For all residents in this region, applying: " << operand << LL_ENDL; + + std::string success_msg = + STRINGIZE("Nearby voice for all residents was set to: " << operand); + + std::string failure_msg = + STRINGIZE("Unable to set nearby voice for all residents to: " << operand); + + LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost( + cap_url, + body, + success_msg, + failure_msg); + } +} + +void LLNearbyVoiceModeration::setMutedInfo(const std::string& channelID, bool mute) +{ + auto it = mChannelMuteMap.find(channelID); + if (it == mChannelMuteMap.end()) + { + if (mute) + { + // Channel is new and being muted + showMutedNotification(true); + } + mChannelMuteMap[channelID] = mute; + } + else + { + if (it->second != mute) + { + // Flag changed + showMutedNotification(mute); + it->second = mute; + } + } + if (mute && LLVoiceClient::getInstance()->getUserPTTState()) + { + LLVoiceClient::getInstance()->setUserPTTState(false); + } +} + +bool LLNearbyVoiceModeration::showNotificationIfNeeded() +{ + if (LLVoiceClient::getInstance()->inProximalChannel() && + LLVoiceClient::getInstance()->getIsModeratorMuted(gAgentID)) + { + return showMutedNotification(true); + } + return false; +} + +bool LLNearbyVoiceModeration::showMutedNotification(bool is_muted) +{ + // Check if the current voice channel is nearby chat + if (LLVoiceClient::getInstance()->inProximalChannel()) + { + LLNotificationsUtil::add(is_muted ? "NearbyVoiceMutedByModerator" : "NearbyVoiceUnmutedByModerator"); + return true; + } + return false; +} + +bool LLNearbyVoiceModeration::isNearbyChatModerator() +{ + // Region doesn't support WebRTC voice + if (!gAgent.getRegion() || !gAgent.getRegion()->isRegionWebRTCEnabled()) + { + return false; + } + + // Only show moderator options when connected to spatial voice chat + LLVoiceChannel* channel = LLVoiceChannel::getCurrentVoiceChannel(); + if (!channel || channel->getSessionID().notNull() || !LLAgent::isActionAllowed("speak")) + { + return false; + } + + if (LLViewerParcelMgr::getInstance()->isVoiceRestricted()) + { + // Only the parcel owner should have access to moderate parcel voice space + return LLViewerParcelMgr::getInstance()->allowVoiceModeration(); + } + else + { + return gAgent.canManageEstate(); + } +} diff --git a/indra/newview/llfloatersounddevices.h b/indra/newview/llnearbyvoicemoderation.h index 9b21b62747..619f169883 100644 --- a/indra/newview/llfloatersounddevices.h +++ b/indra/newview/llnearbyvoicemoderation.h @@ -1,9 +1,7 @@ /** - * @file llfloatersounddevices.h - * @author Leyla Farazha - * @brief Sound Preferences used for minimal skin + * @file llnearbyvoicemoderation.h * -* $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * @@ -25,25 +23,28 @@ * $/LicenseInfo$ */ -#ifndef LL_LLFLOATERSOUNDDEVICES_H -#define LL_LLFLOATERSOUNDDEVICES_H +#pragma once -#include "lltransientdockablefloater.h" +class LLVOAvatar; -class LLFloaterSoundDevices : public LLTransientDockableFloater -{ -public: +class LLNearbyVoiceModeration : public LLSingleton <LLNearbyVoiceModeration> { + LLSINGLETON(LLNearbyVoiceModeration); + ~LLNearbyVoiceModeration(); - LOG_CLASS(LLFloaterSoundDevices); + public: + void requestMuteIndividual(const LLUUID& userID, bool mute); + void requestMuteAll(bool mute); - LLFloaterSoundDevices(const LLSD& key); - ~LLFloaterSoundDevices(); - - bool postBuild() override; - void setDocked(bool docked, bool pop_on_undock = true) override; - void setFocus(bool b) override; -}; + void setMutedInfo(const std::string& channelID, bool mute); + bool showMutedNotification(bool is_muted); + bool showNotificationIfNeeded(); + bool isNearbyChatModerator(); -#endif //LL_LLFLOATERSOUNDDEVICES_H + private: + LLVOAvatar* getVOAvatarFromId(const LLUUID& id); + const std::string getCapUrlFromRegion(LLViewerRegion* region); + boost::signals2::connection mParcelCallbackConnection; + std::map<std::string, bool> mChannelMuteMap; +}; diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index af472c4259..63ec43458b 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -47,6 +47,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "llappviewer.h" // for gDisconnected +#include "llavataractions.h" #include "llcallingcard.h" // LLAvatarTracker #include "llfloaterland.h" #include "llfloaterworldmap.h" @@ -397,20 +398,41 @@ void LLNetMap::draw() LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgentCamera.getCameraPositionGlobal()); - // Draw avatars + std::vector<std::pair<U32, bool>> indexed_avatars; + indexed_avatars.reserve(avatar_ids.size()); for (U32 i = 0; i < avatar_ids.size(); i++) { - LLUUID uuid = avatar_ids[i]; + indexed_avatars.emplace_back(i, LLAvatarActions::isFriend(avatar_ids[i])); + } + + // Sort avatars so non-friends are drawn first and friend dots will appear on top + std::sort(indexed_avatars.begin(), indexed_avatars.end(), + [](const auto& a, const auto& b) { return a.second < b.second; }); + + uuid_vec_t sorted_avatar_ids; + std::vector<LLVector3d> sorted_positions; + sorted_avatar_ids.reserve(avatar_ids.size()); + sorted_positions.reserve(positions.size()); + + // Reorder avatar_ids and positions based on sorted indices + for (const auto& indexed_avatar : indexed_avatars) + { + sorted_avatar_ids.push_back(avatar_ids[indexed_avatar.first]); + sorted_positions.push_back(positions[indexed_avatar.first]); + } + + // Draw avatars + for (U32 i = 0; i < sorted_avatar_ids.size(); i++) + { + LLUUID uuid = sorted_avatar_ids[i]; // Skip self, we'll draw it later if (uuid == gAgent.getID()) continue; - pos_map = globalPosToView(positions[i]); - - bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL); + pos_map = globalPosToView(sorted_positions[i]); - LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color; + LLColor4 color = LLAvatarActions::isFriend(uuid) ? map_avatar_friend_color : map_avatar_color; - unknown_relative_z = positions[i].mdV[VZ] >= COARSEUPDATE_MAX_Z && + unknown_relative_z = sorted_positions[i].mdV[VZ] >= COARSEUPDATE_MAX_Z && camera_position.mV[VZ] >= COARSEUPDATE_MAX_Z; LLWorldMapView::drawAvatar( diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp index 9a33bcb1b9..4939cd5fbb 100644 --- a/indra/newview/llnotificationlistitem.cpp +++ b/indra/newview/llnotificationlistitem.cpp @@ -175,13 +175,15 @@ void LLNotificationListItem::onMouseEnter(S32 x, S32 y, MASK mask) { mCondensedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "ScrollHoveredColor" )); mExpandedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "ScrollHoveredColor" )); + mNoticeTextExp->setBgReadOnlyColor(LLUIColorTable::instance().getColor("SelectedBgReadOnlyColor")); } void LLNotificationListItem::onMouseLeave(S32 x, S32 y, MASK mask) { mCondensedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemUnselected" )); mExpandedViewPanel->setTransparentColor(LLUIColorTable::instance().getColor( "SysWellItemUnselected" )); -} + mNoticeTextExp->setBgReadOnlyColor(LLUIColorTable::instance().getColor("TextBgReadOnlyColor")); + } //static LLNotificationListItem* LLNotificationListItem::create(const Params& p) diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index bcb51b22ca..345426824e 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -852,6 +852,27 @@ struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatX(mPanel, uv_scale.mV[VX], te, object->getID()); LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatY(mPanel, uv_scale.mV[VY], te, object->getID()); } + + // Also align GLTF material if any + S32 gltf_info_index = 0; // base texture + LLVector2 gltf_offset, gltf_scale; + F32 gltf_rot; + if (facep->calcAlignedPlanarGLTF(mCenterFace, &gltf_offset, &gltf_scale, &gltf_rot, gltf_info_index)) + { + LLGLTFMaterial new_override; + const LLTextureEntry* tep = object->getTE(te); + if (tep && tep->getGLTFMaterialOverride()) + { + new_override = *tep->getGLTFMaterialOverride(); + } + + LLGLTFMaterial::TextureTransform& transform = new_override.mTextureTransform[gltf_info_index]; + transform.mOffset.set(gltf_offset.mV[0], gltf_offset.mV[1]); + transform.mScale.set(gltf_scale.mV[0], gltf_scale.mV[1]); + transform.mRotation = gltf_rot; + + LLGLTFMaterialList::queueModify(object, te, &new_override); + } } if (!set_aligned) { @@ -1906,7 +1927,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) if (mColorSwatch) { mColorSwatch->setEnabled( false ); - mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") ); + mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image") ); mColorSwatch->setValid(false); } diff --git a/indra/newview/llpanelgenerictip.cpp b/indra/newview/llpanelgenerictip.cpp index bc2b28269f..1b5228713e 100644 --- a/indra/newview/llpanelgenerictip.cpp +++ b/indra/newview/llpanelgenerictip.cpp @@ -43,5 +43,13 @@ LLPanelGenericTip::LLPanelGenericTip( S32 max_line_count = gSavedSettings.getS32("TipToastMessageLineCount"); snapToMessageHeight(getChild<LLTextBox> ("message"), max_line_count); + + // Check if notification should respond to mouse clicks + if (notification->getPayload().has("respond_on_mousedown") + && notification->getPayload()["respond_on_mousedown"]) + { + setMouseDownCallback(boost::bind(&LLNotification::respond, + notification, notification->getResponseTemplate())); + } } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 3bb416afd7..b68599dae9 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -51,6 +51,7 @@ #include "llstartup.h" #include "lltextbox.h" #include "llui.h" +#include "llframetimer.h" #include "lluiconstants.h" #include "llslurl.h" #include "llversioninfo.h" @@ -177,6 +178,19 @@ public: }; LLLoginLocationAutoHandler gLoginLocationAutoHandler; +std::string getShortGridLabel(const std::string& slurl_grid) +{ + if (slurl_grid == MAINGRID) + { + return LLTrans::getString("AgniGridLabelShort"); + } + if (slurl_grid == BETAGRID) + { + return LLTrans::getString("AditiGridLabelShort"); + } + return LLGridManager::getInstance()->getGridLabel(slurl_grid); +} + //--------------------------------------------------------------------------- // Public methods //--------------------------------------------------------------------------- @@ -187,7 +201,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mCallback(callback), mCallbackData(cb_data), mListener(std::make_unique<LLPanelLoginListener>(this)), - mFirstLoginThisInstall(gSavedSettings.getBOOL("FirstLoginThisInstall")), mUsernameLength(0), mPasswordLength(0), mLocationLength(0), @@ -208,15 +221,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, login_holder->addChild(this); } - if (mFirstLoginThisInstall) - { - buildFromFile( "panel_login_first.xml"); - } - else - { - buildFromFile( "panel_login.xml"); - } - + buildFromFile( "panel_login.xml"); reshape(rect.getWidth(), rect.getHeight()); LLLineEditor* password_edit(getChild<LLLineEditor>("password_edit")); @@ -225,17 +230,19 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, password_edit->setCommitCallback(boost::bind(&LLPanelLogin::onClickConnect, false)); childSetAction("connect_btn", onClickConnect, this); + childSetAction("sign_btn", onClickSignUp, this); mLoginBtn = getChild<LLButton>("connect_btn"); setDefaultBtn(mLoginBtn); // change z sort of clickable text to be behind buttons sendChildToBack(getChildView("forgot_password_text")); - sendChildToBack(getChildView("sign_up_text")); + + mLoginStack = getChild<LLLayoutStack>("login_stack"); + mGridPanel = getChild<LLLayoutPanel>("grid_panel"); std::string current_grid = LLGridManager::getInstance()->getGrid(); - if (!mFirstLoginThisInstall) - { + LLComboBox* favorites_combo = getChild<LLComboBox>("start_location_combo"); updateLocationSelectorsVisibility(); // separate so that it can be called from preferences favorites_combo->setReturnCallback(boost::bind(&LLPanelLogin::onClickConnect, false)); @@ -255,17 +262,16 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, if (!grid_choice->first.empty() && current_grid != grid_choice->first) { LL_DEBUGS("AppInit") << "adding " << grid_choice->first << LL_ENDL; - server_choice_combo->add(grid_choice->second, grid_choice->first); + server_choice_combo->add(getShortGridLabel(grid_choice->first), grid_choice->first); } } server_choice_combo->sortByName(); LL_DEBUGS("AppInit") << "adding current " << current_grid << LL_ENDL; - server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(), + server_choice_combo->add(getShortGridLabel(current_grid), current_grid, ADD_TOP); server_choice_combo->selectFirstItem(); - } LLSLURL start_slurl(LLStartUp::getStartSLURL()); // The StartSLURL might have been set either by an explicit command-line @@ -312,12 +318,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text"); forgot_password_text->setClickedCallback(onClickForgotPassword, NULL); - LLTextBox* sign_up_text = getChild<LLTextBox>("sign_up_text"); - sign_up_text->setClickedCallback(onClickSignUp, NULL); - // get the web browser control - LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); - web_browser->addObserver(this); + mWebBrowser = getChild<LLMediaCtrl>("login_html"); + mWebBrowser->addObserver(this); loadLoginPage(); @@ -338,15 +341,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, void LLPanelLogin::addFavoritesToStartLocation() { - if (mFirstLoginThisInstall) - { - // first login panel has no favorites, just update name length and buttons - std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple(); - mUsernameLength = static_cast<unsigned int>(user_defined_name.length()); - updateLoginButtons(); - return; - } - // Clear the combo. LLComboBox* combo = getChild<LLComboBox>("start_location_combo"); if (!combo) return; @@ -566,16 +560,8 @@ void LLPanelLogin::resetFields() // function is used to reset list in case of changes by external sources return; } - if (sInstance->mFirstLoginThisInstall) - { - // no list to populate - LL_WARNS() << "Shouldn't happen, user should have no ability to modify list on first install" << LL_ENDL; - } - else - { - LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid()); - sInstance->populateUserList(cred); - } + LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid()); + sInstance->populateUserList(cred); } // static @@ -756,6 +742,11 @@ void LLPanelLogin::updateLocationSelectorsVisibility() { server_combo->setVisible(show_server); } + if (LLTextBox* grid_txt = sInstance->getChild<LLTextBox>("grid_text")) + { + grid_txt->setVisible(show_server); + } + sInstance->collapseGridPanel(!show_server); } } @@ -791,7 +782,7 @@ void LLPanelLogin::onUpdateStartSLURL(const LLSLURL& new_start_slurl) // update the grid selector to match the slurl LLComboBox* server_combo = sInstance->getChild<LLComboBox>("server_combo"); - std::string server_label(LLGridManager::getInstance()->getGridLabel(slurl_grid)); + std::string server_label(getShortGridLabel(slurl_grid)); server_combo->setSimple(server_label); updateServer(); // to change the links and splash screen @@ -864,11 +855,9 @@ void LLPanelLogin::setAlwaysRefresh(bool refresh) { if (sInstance && LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) { - LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - - if (web_browser) + if (sInstance->mWebBrowser) { - web_browser->setAlwaysRefresh(refresh); + sInstance->mWebBrowser->setAlwaysRefresh(refresh); } } } @@ -925,16 +914,35 @@ void LLPanelLogin::loadLoginPage() gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid()); - LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - if (web_browser->getCurrentNavUrl() != login_uri.asString()) + if (sInstance->mWebBrowser) + { + if (sInstance->mWebBrowser->getCurrentNavUrl() != login_uri.asString()) + { + LL_DEBUGS("AppInit") << "loading: " << login_uri << LL_ENDL; + sInstance->mWebBrowser->navigateTo(login_uri.asString(), "text/html"); + } + } + else { - LL_DEBUGS("AppInit") << "loading: " << login_uri << LL_ENDL; - web_browser->navigateTo( login_uri.asString(), "text/html" ); + LL_WARNS("AppInit") << "No web browser control for login panel" << LL_ENDL; } } -void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event) +void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) { + constexpr F32 REFRESH_DELAY = 2.f; + switch (event) + { + case MEDIA_EVENT_SIZE_CHANGED: + { + mForceRefreshTimer.reset(); + mForceRefreshTimer.setTimerExpirySec(REFRESH_DELAY); + mForceRefresh = true; + break; + } + default: + break; + } } //--------------------------------------------------------------------------- @@ -1101,8 +1109,7 @@ void LLPanelLogin::onRememberUserCheck(void*) LLComboBox* user_combo(sInstance->getChild<LLComboBox>("username_combo")); bool remember = remember_name->getValue().asBoolean(); - if (!sInstance->mFirstLoginThisInstall - && user_combo->getCurrentIndex() != -1 + if (user_combo->getCurrentIndex() != -1 && !remember) { remember = true; @@ -1219,17 +1226,14 @@ void LLPanelLogin::updateLoginButtons() } mLoginBtn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0 && !mAlertNotif); - if (!mFirstLoginThisInstall) + LLComboBox* user_combo = getChild<LLComboBox>("username_combo"); + LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name"); + if (user_combo->getCurrentIndex() != -1) { - LLComboBox* user_combo = getChild<LLComboBox>("username_combo"); - LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name"); - if (user_combo->getCurrentIndex() != -1) - { - remember_name->setValue(true); - LLCheckBoxCtrl* remember_pass = getChild<LLCheckBoxCtrl>("remember_password"); - remember_pass->setEnabled(true); - } // Note: might be good idea to do "else remember_name->setValue(mRememberedState)" but it might behave 'weird' to user - } + remember_name->setValue(true); + LLCheckBoxCtrl* remember_pass = getChild<LLCheckBoxCtrl>("remember_password"); + remember_pass->setEnabled(true); + } // Note: might be good idea to do "else remember_name->setValue(mRememberedState)" but it might behave 'weird' to user } void LLPanelLogin::populateUserList(LLPointer<LLCredential> credential) @@ -1408,3 +1412,29 @@ bool LLPanelLogin::onUpdateNotification(const LLSD& notify) } return false; } + +void LLPanelLogin::collapseGridPanel(bool collapse) +{ + if (mGridPanel->isCollapsed() == collapse) + { + return; + } + mLoginStack->collapsePanel(mGridPanel, collapse); + mLoginStack->updateLayout(); +} + +void LLPanelLogin::draw() +{ + LLPanel::draw(); + + // Workaround for the black screen issue (see #5607) + // Should be removed after the proper fix for resizing is implemented + if (mForceRefresh && mForceRefreshTimer.hasExpired()) + { + if (mWebBrowser->getMediaPlugin()) + { + mWebBrowser->getMediaPlugin()->forceRenderRefresh(); + } + mForceRefresh = false; + } +} diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index f527aa53ac..a00081795e 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -48,6 +48,8 @@ public: void *callback_data); ~LLPanelLogin(); + void draw(); + virtual void setFocus( bool b ); static void show(const LLRect &rect, @@ -87,6 +89,8 @@ public: // extract name from cred in a format apropriate for username field static std::string getUserName(LLPointer<LLCredential> &cred); + void collapseGridPanel(bool collapse); + private: friend class LLPanelLoginListener; void addFavoritesToStartLocation(); @@ -122,7 +126,6 @@ private: static LLPanelLogin* sInstance; static bool sCapslockDidNotification; - bool mFirstLoginThisInstall; static bool sCredentialSet; @@ -130,8 +133,15 @@ private: unsigned int mPasswordLength; unsigned int mLocationLength; + LLTimer mForceRefreshTimer; + bool mForceRefresh {false}; + bool mAlertNotif; LLButton* mLoginBtn; + LLLayoutPanel* mGridPanel; + LLLayoutStack* mLoginStack; + + LLMediaCtrl* mWebBrowser; }; #endif diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index ad7aa57842..04eebcefc1 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -216,14 +216,14 @@ bool LLPanelMainInventory::postBuild() mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2)); } - LLInventoryPanel* favorites_panel = getChild<LLInventoryPanel>(FAVORITES); - if (favorites_panel) + mFavoritesPanel = getChild<LLInventoryPanel>(FAVORITES); + if (mFavoritesPanel) { - favorites_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER)); - LLInventoryFilter& favorites_filter = favorites_panel->getFilter(); + mFavoritesPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER)); + LLInventoryFilter& favorites_filter = mFavoritesPanel->getFilter(); favorites_filter.setEmptyLookupMessage("InventoryNoMatchingFavorites"); favorites_filter.markDefault(); - favorites_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, favorites_panel, _1, _2)); + mFavoritesPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mFavoritesPanel, _1, _2)); } mSearchTypeCombo = getChild<LLComboBox>("search_type"); @@ -319,6 +319,10 @@ bool LLPanelMainInventory::postBuild() menu->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str); } + mFilterTabs->setTabVisibility(mRecentPanel, gSavedSettings.getBOOL("InventoryShowRecentTab")); + mFilterTabs->setTabVisibility(mWornItemsPanel, gSavedSettings.getBOOL("InventoryShowWornTab")); + mFilterTabs->setTabVisibility(mFavoritesPanel, gSavedSettings.getBOOL("InventoryShowFavoritesTab")); + // Trigger callback for focus received so we can deselect items in inbox/outbox LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMainInventory::onFocusReceived, this)); @@ -1613,8 +1617,10 @@ void LLPanelMainInventory::initSingleFolderRoot(const LLUUID& start_folder_id) void LLPanelMainInventory::initInventoryViews() { mAllItemsPanel->initializeViewBuilding(); - mRecentPanel->initializeViewBuilding(); - mWornItemsPanel->initializeViewBuilding(); + if (gSavedSettings.getBOOL("InventoryShowRecentTab")) + mRecentPanel->initializeViewBuilding(); + if (gSavedSettings.getBOOL("InventoryShowWornTab")) + mWornItemsPanel->initializeViewBuilding(); } void LLPanelMainInventory::toggleViewMode() @@ -2056,6 +2062,27 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) { setViewMode(MODE_COMBINATION); } + + if (command_name == "toggle_recent_tab") + { + bool visibility = !gSavedSettings.getBOOL("InventoryShowRecentTab"); + gSavedSettings.setBOOL("InventoryShowRecentTab", visibility); + mFilterTabs->setTabVisibility(mRecentPanel, visibility); + mRecentPanel->initializeViewBuilding(); + } + if (command_name == "toggle_worn_tab") + { + bool visibility = !gSavedSettings.getBOOL("InventoryShowWornTab"); + gSavedSettings.setBOOL("InventoryShowWornTab", visibility); + mFilterTabs->setTabVisibility(mWornItemsPanel, visibility); + mWornItemsPanel->initializeViewBuilding(); + } + if (command_name == "toggle_favorites_tab") + { + bool visibility = !gSavedSettings.getBOOL("InventoryShowFavoritesTab"); + gSavedSettings.setBOOL("InventoryShowFavoritesTab", visibility); + mFilterTabs->setTabVisibility(mFavoritesPanel, visibility); + } } void LLPanelMainInventory::onVisibilityChange( bool new_visibility ) @@ -2283,6 +2310,19 @@ bool LLPanelMainInventory::isActionChecked(const LLSD& userdata) return isCombinationViewMode(); } + if (command_name == "recent_tab") + { + return mFilterTabs->getTabVisibility(mRecentPanel); + } + if (command_name == "worn_tab") + { + return mFilterTabs->getTabVisibility(mWornItemsPanel); + } + if (command_name == "favorites_tab") + { + return mFilterTabs->getTabVisibility(mFavoritesPanel); + } + return false; } diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index a78c0c0fad..03650e7fc1 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -199,6 +199,7 @@ private: LLInventoryPanel* mAllItemsPanel = nullptr; LLInventoryPanel* mRecentPanel = nullptr; LLInventoryPanel* mWornItemsPanel = nullptr; + LLInventoryPanel* mFavoritesPanel = nullptr; bool mResortActivePanel; LLSaveFolderState* mSavedFolderState; std::string mFilterText; diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index cbf5819fda..cff09b0778 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -786,7 +786,9 @@ void LLPanelPermissions::refresh() getChildView("Edit Cost")->setEnabled(change_sale_allowed && !is_for_sale_mixed); // Set the checkbox to tentative if the prices of each object selected // are not the same. - getChild<LLUICtrl>("checkbox for sale")->setTentative( is_for_sale_mixed); + // If object is marked for sale yet is not transferable, mark as tentative, + // as it is in a state where it can't be sold + getChild<LLUICtrl>("checkbox for sale")->setTentative((!can_transfer && num_for_sale) || is_for_sale_mixed); getChildView("sale type")->setEnabled(num_for_sale && can_transfer && !is_sale_price_mixed); getChildView("Next owner can:")->setEnabled(true); diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp deleted file mode 100644 index a0129b2cb1..0000000000 --- a/indra/newview/llpanelvoiceeffect.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/** - * @file llpanelvoiceeffect.cpp - * @author Aimee - * @brief Panel to select Voice Morphs. - * - * $LicenseInfo:firstyear=2010&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 "llpanelvoiceeffect.h" - -#include "llcombobox.h" -#include "llfloaterreg.h" -#include "llpanel.h" -#include "lltrans.h" -#include "lltransientfloatermgr.h" -#include "llvoiceclient.h" -#include "llweb.h" - -static LLPanelInjector<LLPanelVoiceEffect> t_panel_voice_effect("panel_voice_effect"); - -LLPanelVoiceEffect::LLPanelVoiceEffect() - : mVoiceEffectCombo(NULL) -{ - mCommitCallbackRegistrar.add("Voice.CommitVoiceEffect", boost::bind(&LLPanelVoiceEffect::onCommitVoiceEffect, this)); -} - -LLPanelVoiceEffect::~LLPanelVoiceEffect() -{ - LLView* combo_list_view = mVoiceEffectCombo->getChildView("ComboBox"); - LLTransientFloaterMgr::getInstance()->removeControlView(combo_list_view); - - if(LLVoiceClient::instanceExists()) - { - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->removeObserver(this); - } - } -} - -// virtual -bool LLPanelVoiceEffect::postBuild() -{ - mVoiceEffectCombo = getChild<LLComboBox>("voice_effect"); - - // Need to tell LLTransientFloaterMgr about the combo list, otherwise it can't - // be clicked while in a docked floater as it extends outside the floater area. - LLView* combo_list_view = mVoiceEffectCombo->getChildView("ComboBox"); - LLTransientFloaterMgr::getInstance()->addControlView(combo_list_view); - - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (effect_interface) - { - effect_interface->addObserver(this); - } - - update(true); - - return true; -} - -////////////////////////////////////////////////////////////////////////// -/// PRIVATE SECTION -////////////////////////////////////////////////////////////////////////// - -void LLPanelVoiceEffect::onCommitVoiceEffect() -{ - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (!effect_interface) - { - mVoiceEffectCombo->setEnabled(false); - return; - } - - LLSD value = mVoiceEffectCombo->getValue(); - if (value.asInteger() == PREVIEW_VOICE_EFFECTS) - { - // Open the Voice Morph preview floater - LLFloaterReg::showInstance("voice_effect"); - } - else if (value.asInteger() == GET_VOICE_EFFECTS) - { - // Open the voice morphing info web page - LLWeb::loadURL(LLTrans::getString("voice_morphing_url")); - } - else - { - effect_interface->setVoiceEffect(value.asUUID()); - } - - mVoiceEffectCombo->setValue(effect_interface->getVoiceEffect()); -} - -// virtual -void LLPanelVoiceEffect::onVoiceEffectChanged(bool effect_list_updated) -{ - update(effect_list_updated); -} - -void LLPanelVoiceEffect::update(bool list_updated) -{ - if (mVoiceEffectCombo) - { - LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface(); - if (!effect_interface) return; - if (list_updated) - { - // Add the default "No Voice Morph" entry. - mVoiceEffectCombo->removeall(); - mVoiceEffectCombo->add(getString("no_voice_effect"), LLUUID::null); - mVoiceEffectCombo->addSeparator(); - - // Add entries for each Voice Morph. - const voice_effect_list_t& effect_list = effect_interface->getVoiceEffectList(); - if (!effect_list.empty()) - { - for (voice_effect_list_t::const_iterator it = effect_list.begin(); it != effect_list.end(); ++it) - { - mVoiceEffectCombo->add(it->first, it->second, ADD_BOTTOM); - } - - mVoiceEffectCombo->addSeparator(); - } - - // Add the fixed entries to go to the preview floater or marketing page. - mVoiceEffectCombo->add(getString("preview_voice_effects"), PREVIEW_VOICE_EFFECTS); - mVoiceEffectCombo->add(getString("get_voice_effects"), GET_VOICE_EFFECTS); - } - - if (effect_interface && LLVoiceClient::instance().isVoiceWorking()) - { - // Select the current Voice Morph. - mVoiceEffectCombo->setValue(effect_interface->getVoiceEffect()); - mVoiceEffectCombo->setEnabled(true); - } - else - { - // If voice isn't working or Voice Effects are not supported disable the control. - mVoiceEffectCombo->setValue(LLUUID::null); - mVoiceEffectCombo->setEnabled(false); - } - } -} diff --git a/indra/newview/llpanelvoiceeffect.h b/indra/newview/llpanelvoiceeffect.h deleted file mode 100644 index f920e41081..0000000000 --- a/indra/newview/llpanelvoiceeffect.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file llpanelvoiceeffect.h - * @author Aimee - * @brief Panel to select Voice Effects. - * - * $LicenseInfo:firstyear=2010&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_PANELVOICEEFFECT_H -#define LL_PANELVOICEEFFECT_H - -#include "llpanel.h" -#include "llvoiceclient.h" - -class LLComboBox; - -class LLPanelVoiceEffect - : public LLPanel - , public LLVoiceEffectObserver -{ -public: - LOG_CLASS(LLPanelVoiceEffect); - - LLPanelVoiceEffect(); - virtual ~LLPanelVoiceEffect(); - - bool postBuild() override; - -private: - void onCommitVoiceEffect(); - void update(bool list_updated); - - /// Called by voice effect provider when voice effect list is changed. - void onVoiceEffectChanged(bool effect_list_updated) override; - - // Fixed entries in the Voice Morph list - typedef enum e_voice_effect_combo_items - { - NO_VOICE_EFFECT = 0, - PREVIEW_VOICE_EFFECTS = 1, - GET_VOICE_EFFECTS = 2 - } EVoiceEffectComboItems; - - LLComboBox* mVoiceEffectCombo; -}; - - -#endif //LL_PANELVOICEEFFECT_H diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 526fb6c8aa..af3e64c451 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -85,6 +85,7 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id, LLPreviewNotecard::~LLPreviewNotecard() { delete mLiveFile; + mEditor = nullptr; } bool LLPreviewNotecard::postBuild() @@ -178,7 +179,7 @@ bool LLPreviewNotecard::handleKeyHere(KEY key, MASK mask) // virtual bool LLPreviewNotecard::canClose() { - if(mForceClose || mEditor->isPristine()) + if(mForceClose || !mEditor || mEditor->isPristine()) { return true; } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 66872b104e..c2ac07af88 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -137,6 +137,9 @@ void LLSpatialGroup::clearDrawMap() bool LLSpatialGroup::isHUDGroup() const { + if (hasState(DEAD)) + return false; + LLSpatialPartition* part = (LLSpatialPartition*)mSpatialPartition; return part && part->isHUDPartition(); } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 69f60ee6ce..7312a69ffa 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2627,8 +2627,9 @@ void uninstall_nsis_if_required() S32 found_minor = 0; S32 found_patch = 0; U64 found_build = 0; + std::string nsis_path; - if (!get_nsis_version(found_major, found_minor, found_patch, found_build)) + if (!get_nsis_version(found_major, found_minor, found_patch, found_build, nsis_path)) { return; } @@ -2660,7 +2661,7 @@ void uninstall_nsis_if_required() // so there is no point to check build. LL_INFOS() << "Found NSIS install " << found_major << "." << found_minor << "." << found_patch << "." << found_build << LL_ENDL; - clear_nsis_links(); + clear_nsis_links(nsis_path); LLSD args; args["VERSION"] = llformat("%d.%d.%d", found_major, found_minor, found_patch); diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 2042ab2187..f6ba52365b 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -871,7 +871,7 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id) //debug bool LLTextureCache::isInCache(const LLUUID& id) { - LLMutexLock lock(&mHeaderMutex); + LLMutexLock lock(&mHeaderIDMapMutex); id_map_t::const_iterator iter = mHeaderIDMap.find(id); return (iter != mHeaderIDMap.end()) ; @@ -1110,10 +1110,13 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create { S32 idx = -1; - id_map_t::iterator iter1 = mHeaderIDMap.find(id); - if (iter1 != mHeaderIDMap.end()) { - idx = iter1->second; + LLMutexLock lock(&mHeaderIDMapMutex); + id_map_t::iterator iter1 = mHeaderIDMap.find(id); + if (iter1 != mHeaderIDMap.end()) + { + idx = iter1->second; + } } if (idx < 0) @@ -1141,10 +1144,19 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create // Erase entry from LRU regardless mLRU.erase(curiter2); // Look up entry and use it if it is valid - id_map_t::iterator iter3 = mHeaderIDMap.find(oldid); - if (iter3 != mHeaderIDMap.end() && iter3->second >= 0) + + S32 found_idx = -1; + { + LLMutexLock lock(&mHeaderIDMapMutex); + id_map_t::iterator iter3 = mHeaderIDMap.find(oldid); + if (iter3 != mHeaderIDMap.end() && iter3->second >= 0) + { + found_idx = iter3->second; + } + } + if (found_idx >= 0) { - idx = iter3->second; + idx = found_idx; removeCachedTexture(oldid) ;//remove the existing cached texture to release the entry index. break; } @@ -1279,7 +1291,10 @@ bool LLTextureCache::updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 bool update_header = false ; if(entry.mImageSize < 0) //is a brand-new entry { - mHeaderIDMap[entry.mID] = idx; + { + LLMutexLock lock(&mHeaderIDMapMutex); + mHeaderIDMap[entry.mID] = idx; + } mTexturesSizeMap[entry.mID] = new_body_size ; mTexturesSizeTotal += new_body_size ; @@ -1317,8 +1332,8 @@ bool LLTextureCache::updateEntry(S32& idx, Entry& entry, S32 new_image_size, S32 U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) { + LLMutexLock lock(&mHeaderIDMapMutex); U32 num_entries = mHeaderEntriesInfo.mEntries; - mHeaderIDMap.clear(); mTexturesSizeMap.clear(); mFreeList.clear(); @@ -1617,7 +1632,10 @@ void LLTextureCache::purgeAllTextures(bool purge_directories) LLFile::remove(mTexturesDirName); } } - mHeaderIDMap.clear(); + { + LLMutexLock lock(&mHeaderIDMapMutex); + mHeaderIDMap.clear(); + } mTexturesSizeMap.clear(); mTexturesSizeTotal = 0; mFreeList.clear(); @@ -1664,6 +1682,7 @@ void LLTextureCache::purgeTexturesLazy(F32 time_limit_sec) { if (iter1->second > 0) { + LLMutexLock lock(&mHeaderIDMapMutex); id_map_t::iterator iter2 = mHeaderIDMap.find(iter1->first); if (iter2 != mHeaderIDMap.end()) { @@ -1705,8 +1724,13 @@ void LLTextureCache::purgeTexturesLazy(F32 time_limit_sec) Entry entry = mPurgeEntryList.back().second; mPurgeEntryList.pop_back(); // make sure record is still valid - id_map_t::iterator iter_header = mHeaderIDMap.find(entry.mID); - if (iter_header != mHeaderIDMap.end() && iter_header->second == idx) + bool remove_entry = false; + { + LLMutexLock lock(&mHeaderIDMapMutex); + id_map_t::iterator iter_header = mHeaderIDMap.find(entry.mID); + remove_entry = (iter_header != mHeaderIDMap.end() && iter_header->second == idx); + } + if (remove_entry) { std::string tex_filename = getTextureFileName(entry.mID); removeEntry(idx, entry, tex_filename); @@ -1749,6 +1773,7 @@ void LLTextureCache::purgeTextures(bool validate) { if (iter1->second > 0) { + LLMutexLock lock(&mHeaderIDMapMutex); id_map_t::iterator iter2 = mHeaderIDMap.find(iter1->first); if (iter2 != mHeaderIDMap.end()) { @@ -2002,7 +2027,7 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d { U32 offset; { - LLMutexLock lock(&mHeaderMutex); + LLMutexLock lock(&mHeaderIDMapMutex); id_map_t::const_iterator iter = mHeaderIDMap.find(id); if(iter == mHeaderIDMap.end()) { @@ -2016,9 +2041,10 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d U8* data; S32 head[4]; { + LL_PROFILE_ZONE_NAMED("Read fast cache"); LLMutexLock lock(&mFastCacheMutex); - openFastCache(); + openFastCache(); // only reopens if needed, lasts 10 seconds mFastCachep->seek(APR_SET, offset); @@ -2049,7 +2075,9 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d closeFastCache(); } - LLPointer<LLImageRaw> raw = new LLImageRaw(data, head[0], head[1], head[2], true); + + // directly construct image from new buffer. + LLPointer<LLImageRaw> raw = new LLImageRaw(data, head[0], head[1], head[2], true /*take ownership*/); return raw; } @@ -2227,7 +2255,10 @@ void LLTextureCache::removeCachedTexture(const LLUUID& id) mTexturesSizeTotal -= mTexturesSizeMap[id] ; mTexturesSizeMap.erase(id); } - mHeaderIDMap.erase(id); + { + LLMutexLock lock(&mHeaderIDMapMutex); + mHeaderIDMap.erase(id); + } LLFile::remove(getTextureFileName(id)); } @@ -2254,7 +2285,10 @@ void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename) entry.mImageSize = -1; entry.mBodySize = 0; - mHeaderIDMap.erase(entry.mID); + { + LLMutexLock lock(&mHeaderIDMapMutex); + mHeaderIDMap.erase(entry.mID); + } mTexturesSizeMap.erase(entry.mID); mFreeList.insert(idx); } diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index fd4c4001b6..100527fbfc 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -148,7 +148,7 @@ public: U32 getMaxEntries() { return sCacheMaxEntries; }; bool isInCache(const LLUUID& id) ; bool isInLocal(const LLUUID& id) ; //not thread safe at the moment - + LLMutex* getFastCacheMutex() { return &mFastCacheMutex; } protected: // Accessed by LLTextureCacheWorker std::string getLocalFileName(const LLUUID& id); @@ -194,6 +194,7 @@ private: // Internal LLMutex mWorkersMutex; LLMutex mHeaderMutex; + LLMutex mHeaderIDMapMutex; // To avoid deadlocks, never lock mFastCacheMutex after mHeaderIDMapMutex. LLMutex mListMutex; LLMutex mFastCacheMutex; LLAPRFile* mHeaderAPRFile; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 6c0b3bfa13..0c4a9c81c2 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -46,7 +46,7 @@ const S32 BOTTOM_PAD = VPAD * 3; const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding -S32 BUTTON_WIDTH = 90; +const S32 BUTTON_WIDTH = 90; //static @@ -58,7 +58,8 @@ LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, const LLRect& rect, bool show_images) : LLCheckBoxToastPanel(notification) , LLInstanceTracker<LLToastNotifyPanel, LLUUID, LLInstanceTrackerReplaceOnCollision>(notification->getID()) -, mTextBox(NULL) +, mTextBox(NULL), + mButtonWidth(BUTTON_WIDTH) { init(rect, show_images); } @@ -69,9 +70,9 @@ void LLToastNotifyPanel::addDefaultButton() LLButton* ok_btn = createButton(form_element, false); LLRect new_btn_rect(ok_btn->getRect()); - new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - BUTTON_WIDTH)/ 2, BOTTOM_PAD, + new_btn_rect.setOriginAndSize(llabs(getRect().getWidth() - mButtonWidth) / 2, BOTTOM_PAD, //auto_size for ok button makes it very small, so let's make it wider - BUTTON_WIDTH, new_btn_rect.getHeight()); + mButtonWidth, new_btn_rect.getHeight()); ok_btn->setRect(new_btn_rect); addChild(ok_btn, -1); mNumButtons = 1; @@ -98,7 +99,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, bool is_opt p.font = font; p.rect.height = BTN_HEIGHT; p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata)); - p.rect.width = BUTTON_WIDTH; + p.rect.width = mButtonWidth; p.auto_resize = false; p.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM); p.enabled = !form_element.has("enabled") || form_element["enabled"].asBoolean(); @@ -108,7 +109,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, bool is_opt p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor")); } // for the scriptdialog buttons we use fixed button size. This is a limit! - if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (BUTTON_WIDTH-2*HPAD)) + if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (mButtonWidth - 2 * HPAD)) { p.rect.width = 1; p.auto_resize = true; @@ -273,7 +274,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) mInfoPanel = getChild<LLPanel>("info_panel"); mControlPanel = getChild<LLPanel>("control_panel"); - BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth"); + // customize panel's attributes // is it intended for displaying a tip? mIsTip = mNotification->getType() == "notifytip"; @@ -282,6 +283,10 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) // is it a script dialog? mIsScriptDialog = (notif_name == "ScriptDialog" || notif_name == "ScriptDialogGroup"); + static LLCachedControl<S32> btn_width(gSavedSettings, "ToastButtonWidth", 90); + static LLCachedControl<S32> script_button_width(gSavedSettings, "ScriptToastButtonWidth", 110); + mButtonWidth = mIsScriptDialog ? script_button_width : btn_width; + bool is_content_trusted = (notif_name != "LoadWebPage"); // is it a caution? // @@ -362,8 +367,21 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) } else { - const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel + S32 button_panel_width = mControlPanel->getRect().getWidth();// get initial width from XML S32 button_panel_height = mControlPanel->getRect().getHeight(); + + // Script dialog has wider buttons so it requires wider layout to ensure proper spacing + if (mIsScriptDialog) + { + // width for 3 columns: 3 buttons + 2 gaps + S32 min_width_required = 3 * mButtonWidth + 2 * (2 * HPAD); + if (min_width_required > button_panel_width) + { + button_panel_width = min_width_required; + S32 width_increase = button_panel_width - mControlPanel->getRect().getWidth(); + reshape(getRect().getWidth() + width_increase, getRect().getHeight()); + } + } //try get an average h_pad to spread out buttons S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size())); if(h_pad < 2*HPAD) @@ -373,8 +391,8 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons. * In last case set default h_pad to avoid heaping of buttons */ - S32 button_per_row = button_panel_width / BUTTON_WIDTH; - h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1 because we do not need space after last button in a row + S32 button_per_row = button_panel_width / mButtonWidth; + h_pad = (button_panel_width % mButtonWidth) / (button_per_row - 1);// -1 because we do not need space after last button in a row if(h_pad < 2*HPAD) // still not enough space between buttons ? { h_pad = 2*HPAD; @@ -385,7 +403,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) // we are using default width for script buttons so we can determinate button_rows // to get a number of rows we divide the required width of the buttons to button_panel_width // buttons.size() is reduced by -2 due to presence of ignore button which is calculated independently a bit lower - S32 button_rows = llceil(F32(buttons.size() - 2) * (BUTTON_WIDTH + h_pad) / (button_panel_width + h_pad)); + S32 button_rows = llceil(F32(buttons.size() - 2) * (mButtonWidth + h_pad) / (button_panel_width + h_pad)); //reserve one row for the ignore_btn button_rows++; //calculate required panel height for scripdialog notification. diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index d694513aba..71b9eaf8f5 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -134,6 +134,8 @@ protected: S32 mNumOptions { 0 }; S32 mNumButtons { 0 }; + S32 mButtonWidth; + static const std::string sFontDefault; static const std::string sFontScript; }; diff --git a/indra/newview/llvelopack.cpp b/indra/newview/llvelopack.cpp index 28e989c4ba..6a667925b3 100644 --- a/indra/newview/llvelopack.cpp +++ b/indra/newview/llvelopack.cpp @@ -330,14 +330,14 @@ static std::wstring get_desktop_path() return L""; } -static bool create_shortcut(const std::wstring& shortcut_path, +static HRESULT create_shortcut(const std::wstring& shortcut_path, const std::wstring& target_path, const std::wstring& arguments, const std::wstring& description, const std::wstring& icon_path) { HRESULT hr = CoInitialize(NULL); - if (FAILED(hr)) return false; + if (FAILED(hr)) return hr; IShellLinkW* shell_link = nullptr; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, @@ -365,7 +365,7 @@ static bool create_shortcut(const std::wstring& shortcut_path, } CoUninitialize(); - return SUCCEEDED(hr); + return hr; } static void register_protocol_handler(const std::wstring& protocol, @@ -405,9 +405,172 @@ static void register_protocol_handler(const std::wstring& protocol, } } -void clear_nsis_links() +static bool get_shortcut_target(const std::wstring& lnk_path, std::wstring& target_path_str) +{ + // Resolve the shortcut to check its target + wchar_t target_path[MAX_PATH] = { 0 }; + HRESULT hr = CoInitialize(NULL); + bool res = false; + if (SUCCEEDED(hr)) + { + IShellLinkW* psl = nullptr; + hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&psl); + if (SUCCEEDED(hr)) + { + IPersistFile* ppf = nullptr; + hr = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); + if (SUCCEEDED(hr)) + { + hr = ppf->Load(lnk_path.c_str(), STGM_READ); + if (SUCCEEDED(hr)) + { + // Resolve() in theory may retarget to a different executable, + // but we should be fine as long as folder stays the same, + // otherwise we shouldn't clear it. + hr = psl->Resolve(NULL, SLR_NO_UI | SLR_NOUPDATE | SLR_ANY_MATCH); + if (SUCCEEDED(hr)) + { + hr = psl->GetPath(target_path, MAX_PATH, nullptr, 0); + if (SUCCEEDED(hr)) + { + target_path_str = std::wstring(target_path); + res = true; + } + } + } + ppf->Release(); + } + psl->Release(); + } + CoUninitialize(); + } + return res; +} + +static bool paths_are_equal(const std::wstring& path1, const std::wstring& path2) +{ + try + { + std::error_code ec1, ec2; + std::filesystem::path p1(path1); + std::filesystem::path p2(path2); + + // Get canonical (absolute, normalized) paths + auto canonical1 = std::filesystem::canonical(p1, ec1); + auto canonical2 = std::filesystem::canonical(p2, ec2); + + // If either path doesn't exist, fall back to string comparison + if (ec1 || ec2) + { + // Normalize case for comparison + std::wstring lower1 = path1; + std::wstring lower2 = path2; + std::transform(lower1.begin(), lower1.end(), lower1.begin(), ::towlower); + std::transform(lower2.begin(), lower2.end(), lower2.begin(), ::towlower); + while (!lower1.empty() && (lower1.back() == L'\\' || lower1.back() == L'/')) + { + lower1.pop_back(); + } + while (!lower2.empty() && (lower2.back() == L'\\' || lower2.back() == L'/')) + { + lower2.pop_back(); + } + return lower1 == lower2; + } + + // Use filesystem::equivalent which handles all path variations + return std::filesystem::equivalent(canonical1, canonical2, ec1); + } + catch (const std::filesystem::filesystem_error&) + { + // Fallback to case-insensitive string comparison + std::wstring lower1 = path1; + std::wstring lower2 = path2; + std::transform(lower1.begin(), lower1.end(), lower1.begin(), ::towlower); + std::transform(lower2.begin(), lower2.end(), lower2.begin(), ::towlower); + while (!lower1.empty() && (lower1.back() == L'\\' || lower1.back() == L'/')) + { + lower1.pop_back(); + } + while (!lower2.empty() && (lower2.back() == L'\\' || lower2.back() == L'/')) + { + lower2.pop_back(); + } + return lower1 == lower2; + } +} + +static void update_taskbar_shortcut(const std::string& nsis_folder_path, const std::wstring& appdata_path, const std::wstring& app_name, const std::wstring& link_name) +{ + std::wstring taskbar_path = appdata_path; + taskbar_path += L"\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\"; + taskbar_path += link_name; + + if (!PathFileExistsW(taskbar_path.c_str())) + { + // User didn't create one + return; + } + + // Verify we are removing or updating the right thing. + // It is not warranteed that the shortcut points to NSIS. + std::wstring target_path; + if (get_shortcut_target(taskbar_path, target_path)) + { + // Strip the filename part to get just the folder path + std::filesystem::path trim_path(target_path); + if (trim_path.has_filename()) + { + target_path = trim_path.parent_path().wstring(); + } + std::wstring nsis_path_w = ll_convert<std::wstring>(nsis_folder_path); + if (!paths_are_equal(nsis_path_w, target_path)) + { + // Shortcut points to something else, don't mess with it + LL_INFOS("Velopack") << "Found a matching shortcut, but it points to a different channel. Expected: " + << ll_convert_wide_to_string(nsis_path_w) + << ", actual: " << ll_convert_wide_to_string(target_path) + << LL_ENDL; + return; + } + } + + // First try to overwrite shortcut + std::wstring current_exe = ll_convert<std::wstring>(gDirUtilp->getExecutablePathAndName()); + HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe); + if (SUCCEEDED(hr)) + { + LL_INFOS("Velopack") << "Successfully updated taskbar shortcut to point to current exe" << LL_ENDL; + return; + } + + // Try deleting and if possible, recreating separately. We should not leave hanging shortcuts behind. + if (!DeleteFileW(taskbar_path.c_str())) + { + DWORD error = GetLastError(); + if (error != ERROR_FILE_NOT_FOUND) + { + LL_WARNS("Velopack") << "Failed to delete NSIS taskbar shortcut: " + << ll_convert_wide_to_string(taskbar_path) + << " (error: " << error << ")" << LL_ENDL; + } + } + else + { + // Deleted user created link, recreate it with new target if possible. + LL_INFOS("Velopack") << "Updating taskbar shortcut to point to current exe" << LL_ENDL; + HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe); + if (FAILED(hr)) + { + LL_WARNS("Velopack") << "Failed to re-create taskbar shortcut, error: " << std::hex << hr << ", NSIS shortcut was removed" << LL_ENDL; + } + } +} + +void clear_nsis_links(const std::string& nsis_folder_path) { wchar_t path[MAX_PATH]; + std::wstring app_name = get_app_name(); // 1. The 'start' shortcuts set by nsis would be global, like app shortcut: // C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Second Life Viewer\Second Life Viewer.lnk @@ -415,7 +578,7 @@ void clear_nsis_links() if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, 0, path))) { std::wstring start_menu_path = path; - std::wstring folder_path = start_menu_path + L"\\" + get_app_name(); + std::wstring folder_path = start_menu_path + L"\\" + app_name; std::error_code ec; std::filesystem::path dir(folder_path); @@ -431,11 +594,11 @@ void clear_nsis_links() } // 2. Desktop link, also a global one. - // C:\Users\Public\Desktop + // C:\Users\Public\Desktop\Second Life Viewer.lnk if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, 0, path))) { std::wstring desktop_path = path; - std::wstring shortcut_path = desktop_path + L"\\" + get_app_name() + L".lnk"; + std::wstring shortcut_path = desktop_path + L"\\" + app_name + L".lnk"; if (!DeleteFileW(shortcut_path.c_str())) { DWORD error = GetLastError(); @@ -447,6 +610,19 @@ void clear_nsis_links() } } } + + // 3. Taskbar links, which are user-specific and located at: + // %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\ + // Note that it can be a link to velopack already or to a different NSIS viewer. + // Name might also be different based on method of creation. + if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, path))) + { + update_taskbar_shortcut(nsis_folder_path, path, app_name, L"Second Life.lnk"); // Window class name + update_taskbar_shortcut(nsis_folder_path, path, app_name, L"Second Life(1).lnk"); // Just in case user somehow did it twice and removed first + update_taskbar_shortcut(nsis_folder_path, path, app_name, L"SecondLifeViewer.lnk"); // Executable name + update_taskbar_shortcut(nsis_folder_path, path, app_name, L"secondlife-bin.lnk"); // Debug builds + update_taskbar_shortcut(nsis_folder_path, path, app_name, app_name + L".lnk"); // Default name + } } static void parse_version(const wchar_t* version_str, int& major, int& minor, int& patch, uint64_t& build) @@ -462,7 +638,8 @@ bool get_nsis_version( int& nsis_major, int& nsis_minor, int& nsis_patch, - uint64_t& nsis_build) + uint64_t& nsis_build, + std::string& nsis_path) { // Test for presence of NSIS viewer registration, then // attempt to read uninstall info @@ -515,12 +692,21 @@ bool get_nsis_version( } std::error_code ec; std::filesystem::path path(path_buffer); + // check if uninstaller exists if (!std::filesystem::exists(path, ec)) { return false; } - // Todo: check codesigning? + // We found a valid NSIS installation, trim the path to get the folder + wchar_t* pos = wcsstr(path_buffer, L"uninst.exe"); + if (pos) + { + // Trim uninst.exe from the path by setting null terminator before it + *pos = L'\0'; + } + // Note that it has a trailing backslash. + nsis_path = ll_convert_wide_to_string(path_buffer); return true; } @@ -647,6 +833,33 @@ static void on_first_run(void* p_user_data, const char* app_version) MultiByteToWideChar(CP_UTF8, 0, app_version, -1, &version[0], len); register_uninstall_info(install_dir, app_name, version); + + // Drop install related settings + // Unfortunately gDirUtilp is not initialized yet and it's shouldn't + // be possible to change location of the settings. For now it's simpler + // to hardcode the location. + std::optional<std::string> app_data = LLStringUtil::getoptenv("APPDATA"); + if (app_data) + { + // Strip trailing delimiter if present + std::string app_data_path = *app_data; + if (!app_data_path.empty() && (app_data_path.back() == '\\' || app_data_path.back() == '/')) + { + app_data_path.pop_back(); + } + + std::string user_settings_path = app_data_path + "\\SecondLife\\user_settings\\settings.xml"; + LLControlGroup settings("global"); + if (settings.loadFromFile(user_settings_path)) + { + // If user reinstalls or updates, we want to recheck for nsis leftovers. + if (settings.controlExists("PreviousInstallChecked")) + { + settings.setBOOL("PreviousInstallChecked", false); + } + settings.saveToFile(user_settings_path, true); + } + } } static void on_after_install(void* user_data, const char* app_version) diff --git a/indra/newview/llvelopack.h b/indra/newview/llvelopack.h index d04d0db7dc..449330f68d 100644 --- a/indra/newview/llvelopack.h +++ b/indra/newview/llvelopack.h @@ -46,12 +46,13 @@ void velopack_set_progress_callback(std::function<void(int)> callback); void velopack_cleanup(); #if LL_WINDOWS -void clear_nsis_links(); +void clear_nsis_links(const std::string& nsis_folder_path); bool get_nsis_version( int& nsis_major, int& nsis_minor, int& nsis_patch, - uint64_t& nsis_build); + uint64_t& nsis_build, + std::string& nsis_folder_path); #endif #endif // LL_VELOPACK diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 2ca2c5c07d..a9aa63e68f 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -200,7 +200,7 @@ LLFontGL* LLViewerChat::getChatFont() break; default: case 1: - fontp = LLFontGL::getFontSansSerif(); + fontp = LLFontGL::getFontSansSerifMedium(); break; case 2: fontp = LLFontGL::getFontSansSerifBig(); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 6b1ec4bbbe..e85c7db48d 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -575,9 +575,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot) LLImageGL::updateStats(gFrameTimeSeconds); static LLCachedControl<S32> avatar_name_tag_mode(gSavedSettings, "AvatarNameTagMode", 1); - static LLCachedControl<bool> name_tag_show_group_titles(gSavedSettings, "NameTagShowGroupTitles", true); + static LLCachedControl<S32> name_tag_show_group_titles(gSavedSettings, "GroupTitlesTagMode", 2 /*all group tags*/); LLVOAvatar::sRenderName = avatar_name_tag_mode; - LLVOAvatar::sRenderGroupTitles = name_tag_show_group_titles && avatar_name_tag_mode > 0; + LLVOAvatar::sRenderGroupTitles = avatar_name_tag_mode > 0 ? name_tag_show_group_titles : 0; gPipeline.mBackfaceCull = true; gFrameCount++; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index c1843e7c7e..d907dca3ee 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -44,7 +44,6 @@ #include "llfloateravatarrendersettings.h" #include "llfloateravatartextures.h" #include "llfloaterbanduration.h" -#include "llfloaterbigpreview.h" #include "llfloaterbeacons.h" #include "llfloaterbuildoptions.h" #include "llfloaterbulkpermission.h" @@ -143,7 +142,6 @@ #include "llfloatersidepanelcontainer.h" #include "llfloaterslapptest.h" #include "llfloatersnapshot.h" -#include "llfloatersounddevices.h" #include "llfloaterspellchecksettings.h" #include "llfloatertelehub.h" #include "llfloatertestinspectors.h" @@ -154,7 +152,6 @@ #include "llfloatertoybox.h" #include "llfloatertranslationsettings.h" #include "llfloateruipreview.h" -#include "llfloatervoiceeffect.h" #include "llfloaterwebcontent.h" #include "llfloatervoicevolume.h" #include "llfloaterwhitelistentry.h" @@ -499,7 +496,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_color", "floater_settings_color.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsColor>); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); - LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>); LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>); LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>); LLFloaterReg::add("scene_load_stats", "floater_scene_load_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSceneLoadStats>); @@ -512,8 +508,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("guidebook", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHowTo>); LLFloaterReg::add("slapp_test", "floater_test_slapp.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSLappTest>); - LLFloaterReg::add("big_preview", "floater_big_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBigPreview>); - LLFloaterUIPreviewUtil::registerFloater(); LLFloaterReg::add("upload_anim_bvh", "floater_animation_bvh_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBvhPreview>, "upload"); LLFloaterReg::add("upload_anim_anim", "floater_animation_anim_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload"); @@ -522,8 +516,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("upload_script", "floater_script_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptPreview>, "upload"); LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload"); - LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>); - LLFloaterReg::add("web_content", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create); LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>); LLFloaterReg::add("window_size", "floater_window_size.xml", &LLFloaterReg::build<LLFloaterWindowSize>); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 37ad29a9f3..566389accb 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -649,7 +649,7 @@ void init_menus() LLRect menuBarRect = gLoginMenuBarView->getRect(); menuBarRect.setLeftTopAndSize(0, menu_bar_holder->getRect().getHeight(), menuBarRect.getWidth(), menuBarRect.getHeight()); gLoginMenuBarView->setRect(menuBarRect); - gLoginMenuBarView->setBackgroundColor( color ); + gLoginMenuBarView->setBackgroundColor(LLColor4::black); menu_bar_holder->addChild(gLoginMenuBarView); // tooltips are on top of EVERYTHING, including menus @@ -3017,6 +3017,40 @@ void handle_object_show_original() show_item_original(object->getAttachmentItemID()); } +void handle_object_set_favorite(const LLSD& userdata) +{ + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if (!object) + { + return; + } + LLViewerObject *parent = (LLViewerObject*)object->getParent(); + while (parent) + { + if(parent->isAvatar()) + { + break; + } + object = parent; + parent = (LLViewerObject*)parent->getParent(); + } + if (!object || object->isAvatar()) + { + return; + } + + LLUUID item_id = gInventory.getLinkedItemID(object->getAttachmentItemID()); + + std::string action = userdata.asString(); + if (action == "Add") + { + set_favorite(item_id, true); + } + if (action == "Remove") + { + set_favorite(item_id, false); + } +} static void init_default_item_label(LLUICtrl* ctrl) { @@ -3073,6 +3107,41 @@ bool enable_object_touch(LLUICtrl* ctrl) return new_value; }; +bool enable_object_favorite(const LLSD& userdata) +{ + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if (!object) + { + return false; + } + LLViewerObject* parent = (LLViewerObject*)object->getParent(); + while (parent) + { + if (parent->isAvatar()) + { + break; + } + object = parent; + parent = (LLViewerObject*)parent->getParent(); + } + if (!object || object->isAvatar()) + { + return false; + } + + std::string action = userdata.asString(); + LLUUID item_id = gInventory.getLinkedItemID(object->getAttachmentItemID()); + if (action == "Add") + { + return !get_is_favorite(item_id); + } + if (action == "Remove") + { + return get_is_favorite(item_id); + } + return false; +} + //void label_touch(std::string& label, void*) //{ // LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); @@ -9557,17 +9626,6 @@ class LLWorldEnableEnvPreset : public view_listener_t } }; - -/// Post-Process callbacks -class LLWorldPostProcess : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - LLFloaterReg::showInstance("env_post_process"); - return true; - } -}; - class LLWorldCheckBanLines : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -9861,7 +9919,6 @@ void initialize_menus() view_listener_t::addMenu(new LLWorldEnableEnvSettings(), "World.EnableEnvSettings"); view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset"); view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset"); - view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess"); view_listener_t::addMenu(new LLWorldCheckBanLines() , "World.CheckBanLines"); view_listener_t::addMenu(new LLWorldShowBanLines() , "World.ShowBanLines"); @@ -10173,6 +10230,7 @@ void initialize_menus() view_listener_t::addMenu(new LLObjectBuild(), "Object.Build"); commit.add("Object.Touch", boost::bind(&handle_object_touch)); commit.add("Object.ShowOriginal", boost::bind(&handle_object_show_original)); + commit.add("Object.SetFavorite", boost::bind(&handle_object_set_favorite, _2)); commit.add("Object.SitOrStand", boost::bind(&handle_object_sit_or_stand)); commit.add("Object.Delete", boost::bind(&handle_object_delete)); view_listener_t::addMenu(new LLObjectAttachToAvatar(true), "Object.AttachToAvatar"); @@ -10201,6 +10259,7 @@ void initialize_menus() enable.add("Object.EnableEditGLTFMaterial", boost::bind(&enable_object_edit_gltf_material)); enable.add("Object.EnableOpen", boost::bind(&enable_object_open)); enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1)); + enable.add("Object.EnableFavorites", boost::bind(&enable_object_favorite, _2)); enable.add("Object.EnableDelete", boost::bind(&enable_object_delete)); enable.add("Object.EnableWear", boost::bind(&object_is_wearable)); diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index 6cb3aee20c..8ec2a6d661 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -63,7 +63,7 @@ const std::string GRID_LOGIN_IDENTIFIER_TYPES = "login_identifier_types"; const std::string GRID_SLURL_BASE = "slurl_base"; const std::string GRID_APP_SLURL_BASE = "app_slurl_base"; -const std::string DEFAULT_LOGIN_PAGE = "https://viewer-splash.secondlife.com/"; +const std::string DEFAULT_LOGIN_PAGE = "https://viewer-splash-v2.secondlife.com/"; const std::string MAIN_GRID_LOGIN_URI = "https://login.agni.lindenlab.com/cgi-bin/login.cgi"; @@ -125,7 +125,7 @@ void LLGridManager::initialize(const std::string& grid_file) MAIN_GRID_WEB_PROFILE_URL, "Agni"); addSystemGrid(LLTrans::getString("AditiGridLabel"), - "util.aditi.lindenlab.com", + BETAGRID, "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", "https://secondlife.aditi.lindenlab.com/helpers/", DEFAULT_LOGIN_PAGE, diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 2ed663e038..0937425a18 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -30,6 +30,7 @@ // @TODO this really should be private, but is used in llslurl #define MAINGRID "util.agni.lindenlab.com" +#define BETAGRID "util.aditi.lindenlab.com" /// Exception thrown when a grid is not valid class LLInvalidGridName diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 12583e81da..eb389c9a4b 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4664,9 +4664,10 @@ const LLQuaternion LLViewerObject::getRenderRotation() const } else { - if (!mDrawable->isRoot()) + LLDrawable* parent = mDrawable->getParent(); + if (!mDrawable->isRoot() && parent) { - ret = getRotation() * LLQuaternion(mDrawable->getParent()->getWorldMatrix()); + ret = getRotation() * LLQuaternion(parent->getWorldMatrix()); } else { diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 6a029645fb..b794047135 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -702,6 +702,16 @@ bool LLViewerParcelMgr::allowAgentVoice() const return allowAgentVoice(gAgent.getRegion(), mAgentParcel); } +bool LLViewerParcelMgr::isVoiceRestricted() const +{ + return mAgentParcel && !mAgentParcel->getParcelFlagUseEstateVoiceChannel(); +} + +bool LLViewerParcelMgr::allowVoiceModeration() const +{ + return isVoiceRestricted() && isParcelOwnedByAgent(mAgentParcel, GP_SESSION_MODERATOR); +} + bool LLViewerParcelMgr::allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const { return region && region->isVoiceEnabled() diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 8439283eb0..0d79496ccc 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -174,6 +174,12 @@ public: bool allowAgentVoice() const; bool allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const; + // Returns true if this parcel is using private voice channel + bool isVoiceRestricted() const; + + // Can this agent moderate Nearby voice chat on this parcel? + bool allowVoiceModeration() const; + // Can this agent start flying on this parcel? // Used for parcel property icons in nav bar. bool allowAgentFly(const LLViewerRegion* region, const LLParcel* parcel) const; diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 17d2edee4d..cf92850762 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -63,9 +63,9 @@ LLUIColor LLViewerParcelOverlay::sForSaleColor; LLUIColor LLViewerParcelOverlay::sAuctionColor; LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_width_meters) -: mRegion(region), - mParcelGridsPerEdge(S32(region_width_meters / PARCEL_GRID_STEP_METERS)), - mDirty(false), +: mRegion( region ), + mParcelGridsPerEdge( S32( region_width_meters / PARCEL_GRID_STEP_METERS ) ), + mDirty( false ), mTimeSinceLastUpdate(), mOverlayTextureIdx(-1) { @@ -467,9 +467,9 @@ void LLViewerParcelOverlay::updatePropertyLines() { for (S32 col = 0; col < GRIDS_PER_EDGE; col++) { - U8 overlay = mOwnership[row * GRIDS_PER_EDGE + col]; + U8 overlay = mOwnership[row*GRIDS_PER_EDGE+col]; S32 colorIndex = overlay & PARCEL_COLOR_MASK; - switch (colorIndex) + switch(colorIndex) { case PARCEL_SELF: case PARCEL_GROUP: @@ -483,11 +483,11 @@ void LLViewerParcelOverlay::updatePropertyLines() const LLColor4U& color = colors[colorIndex]; - F32 left = col * GRID_STEP; - F32 right = left + GRID_STEP; + F32 left = col*GRID_STEP; + F32 right = left+GRID_STEP; - F32 bottom = row * GRID_STEP; - F32 top = bottom + GRID_STEP; + F32 bottom = row*GRID_STEP; + F32 top = bottom+GRID_STEP; // West edge if (overlay & PARCEL_WEST_LINE) @@ -528,121 +528,99 @@ void LLViewerParcelOverlay::addPropertyLine(F32 start_x, F32 start_y, F32 dx, F3 Edge& edge = mEdges.back(); edge.color = color; - // Detailized rendering vertices: - // A B C D E F G - // *-*------*--------*--------*------*-* : 'outside' vertices are placed right on the border - // *------*--------*--------*------* : 'inside' vertices are shifted on LINE_WIDTH inside - - // Simplified rendering vertices: - // A G - // *-----------------------------------* - // *-----------------------------------* - F32 outside_x = start_x; F32 outside_y = start_y; - F32 outside_z = land.resolveHeightRegion(outside_x, outside_y); - F32 inside_x = start_x + tick_dx; - F32 inside_y = start_y + tick_dy; - F32 inside_z = land.resolveHeightRegion(inside_x, inside_y); - - auto move = [&](F32 distance) - { - outside_x += dx * distance; - outside_y += dy * distance; - outside_z = land.resolveHeightRegion(outside_x, outside_y); - inside_x += dx * distance; - inside_y += dy * distance; - inside_z = land.resolveHeightRegion(inside_x, inside_y); - }; + F32 outside_z = 0.f; + F32 inside_x = start_x + tick_dx; + F32 inside_y = start_y + tick_dy; + F32 inside_z = 0.f; - auto split = [&](U32 lod, const LLVector4a& start, F32 x, F32 y, F32 z, F32 part) + auto split = [&](const LLVector3& start, F32 x, F32 y, F32 z, F32 part) { - F32 new_x = start[VX] + (x - start[VX]) * part; - F32 new_y = start[VY] + (y - start[VY]) * part; - edge.pushVertex(lod, new_x, new_y, water_z, 0); + F32 new_x = start.mV[VX] + (x - start.mV[VX]) * part; + F32 new_y = start.mV[VY] + (y - start.mV[VY]) * part; + F32 new_z = start.mV[VZ] + (z - start.mV[VZ]) * part; + edge.vertices.emplace_back(new_x, new_y, new_z); }; - auto checkForSplit = [&](U32 lod) + auto checkForSplit = [&]() { - const std::vector<LLVector4a>& vertices = edge.verticesUnderWater[lod]; - const LLVector4a& last_outside = vertices.back(); - F32 z0 = last_outside[VZ]; + const LLVector3& last_outside = edge.vertices.back(); + F32 z0 = last_outside.mV[VZ]; F32 z1 = outside_z; if ((z0 >= water_z && z1 >= water_z) || (z0 < water_z && z1 < water_z)) return; F32 part = (water_z - z0) / (z1 - z0); - const LLVector4a& last_inside = vertices[vertices.size() - 2]; - split(lod, last_inside, inside_x, inside_y, inside_z, part); - split(lod, last_outside, outside_x, outside_y, outside_z, part); + const LLVector3& last_inside = edge.vertices[edge.vertices.size() - 2]; + split(last_inside, inside_x, inside_y, inside_z, part); + split(last_outside, outside_x, outside_y, outside_z, part); }; - auto pushTwoVertices = [&](U32 lod) - { - LLVector3 out(outside_x, outside_y, outside_z); - LLVector3 in(inside_x, inside_y, inside_z); - if (fabs(inside_z - outside_z) < LINE_WIDTH / 5) - { - edge.pushVertex(lod, inside_x, inside_y, inside_z, water_z); - } - else - { - // Make the line thinner if heights differ too much - LLVector3 dist(in - out); - F32 coef = dist.length() / LINE_WIDTH; - LLVector3 new_in(out + dist / coef); - edge.pushVertex(lod, new_in[VX], new_in[VY], new_in[VZ], water_z); - } - edge.pushVertex(lod, outside_x, outside_y, outside_z, water_z); - }; + // First part, only one vertex + outside_z = land.resolveHeightRegion( outside_x, outside_y ); - // Point A simplified (first two vertices) - pushTwoVertices(1); + edge.vertices.emplace_back(outside_x, outside_y, outside_z); - // Point A detailized (only one vertex) - edge.pushVertex(0, outside_x, outside_y, outside_z, water_z); + inside_x += dx * LINE_WIDTH; + inside_y += dy * LINE_WIDTH; - // Point B (two vertices) - move(LINE_WIDTH); - pushTwoVertices(0); + outside_x += dx * LINE_WIDTH; + outside_y += dy * LINE_WIDTH; - // Points C, D, E - F32 distance = 1.f - LINE_WIDTH; + // Then the "actual edge" + inside_z = land.resolveHeightRegion( inside_x, inside_y ); + outside_z = land.resolveHeightRegion( outside_x, outside_y ); + + edge.vertices.emplace_back(inside_x, inside_y, inside_z); + edge.vertices.emplace_back(outside_x, outside_y, outside_z); + + inside_x += dx * (dx - LINE_WIDTH); + inside_y += dy * (dy - LINE_WIDTH); + + outside_x += dx * (dx - LINE_WIDTH); + outside_y += dy * (dy - LINE_WIDTH); + + // Middle part, full width constexpr S32 GRID_STEP = (S32)PARCEL_GRID_STEP_METERS; - for (U32 i = 1; i < GRID_STEP; ++i) + for (S32 i = 1; i < GRID_STEP; i++) { - move(distance); - checkForSplit(0); - pushTwoVertices(0); - distance = 1.f; + inside_z = land.resolveHeightRegion( inside_x, inside_y ); + outside_z = land.resolveHeightRegion( outside_x, outside_y ); + + checkForSplit(); + + edge.vertices.emplace_back(inside_x, inside_y, inside_z); + edge.vertices.emplace_back(outside_x, outside_y, outside_z); + + inside_x += dx; + inside_y += dy; + + outside_x += dx; + outside_y += dy; } - // Point F (two vertices) - move(1.f - LINE_WIDTH); - checkForSplit(0); - pushTwoVertices(0); + // Extra buffer for edge + inside_x -= dx * LINE_WIDTH; + inside_y -= dy * LINE_WIDTH; - // Point G simplified (last two vertices) - move(LINE_WIDTH); - pushTwoVertices(1); + outside_x -= dx * LINE_WIDTH; + outside_y -= dy * LINE_WIDTH; - // Point G detailized (only one vertex) - edge.pushVertex(0, outside_x, outside_y, outside_z, water_z); -} + inside_z = land.resolveHeightRegion( inside_x, inside_y ); + outside_z = land.resolveHeightRegion( outside_x, outside_y ); -void LLViewerParcelOverlay::Edge::pushVertex(U32 lod, F32 x, F32 y, F32 z, F32 water_z) -{ - verticesUnderWater[lod].emplace_back(x, y, z); - gGL.transform(verticesUnderWater[lod].back()); + checkForSplit(); - if (z >= water_z) - { - verticesAboveWater[lod].push_back(verticesUnderWater[lod].back()); - } - else - { - verticesAboveWater[lod].emplace_back(x, y, water_z); - gGL.transform(verticesAboveWater[lod].back()); - } + edge.vertices.emplace_back(inside_x, inside_y, inside_z); + edge.vertices.emplace_back(outside_x, outside_y, outside_z); + + outside_x += dx * LINE_WIDTH; + outside_y += dy * LINE_WIDTH; + + // Last edge is not drawn to the edge + outside_z = land.resolveHeightRegion( outside_x, outside_y ); + + edge.vertices.emplace_back(outside_x, outside_y, outside_z); } void LLViewerParcelOverlay::setDirty() @@ -687,9 +665,6 @@ void LLViewerParcelOverlay::renderPropertyLines() if (!show) return; - LL_PROFILE_ZONE_SCOPED; - LL_PROFILE_GPU_ZONE("Property Lines"); - LLSurface& land = mRegion->getLand(); bool render_water = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER); @@ -727,8 +702,6 @@ void LLViewerParcelOverlay::renderPropertyLines() // Stomp the camera into two dimensions LLVector3 camera_region = mRegion->getPosRegionFromGlobal( gAgentCamera.getCameraPositionGlobal() ); - bool draw_underwater = camera_region.mV[VZ] < water_z || - !gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER); // Set up a cull plane 2 * PARCEL_GRID_STEP_METERS behind // the camera. The cull plane normal is the camera's at axis. @@ -736,23 +709,15 @@ void LLViewerParcelOverlay::renderPropertyLines() cull_plane_point *= -2.f * PARCEL_GRID_STEP_METERS; cull_plane_point += camera_region; - bool render_hidden = !draw_underwater && - LLSelectMgr::sRenderHiddenSelections && - LLFloaterReg::instanceVisible("build"); + bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build"); constexpr F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f; - const F32 PROPERTY_LINE_LOD0_DIST_SQUARED = PROPERTY_LINE_CLIP_DIST_SQUARED / 25; for (const Edge& edge : mEdges) { - const std::vector<LLVector4a>& vertices0 = edge.verticesAboveWater[0]; - const F32* first = vertices0.front().getF32ptr(); - const F32* last = vertices0.back().getF32ptr(); - LLVector3 center((first[VX] + last[VX]) / 2, (first[VY] + last[VY]) / 2, (first[VZ] + last[VZ]) / 2); - gGL.untransform(center); + LLVector3 center = edge.vertices[edge.vertices.size() >> 1]; - F32 dist_squared = dist_vec_squared(center, camera_region); - if (dist_squared > PROPERTY_LINE_CLIP_DIST_SQUARED) + if (dist_vec_squared2D(center, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED) { continue; } @@ -766,33 +731,43 @@ void LLViewerParcelOverlay::renderPropertyLines() continue; } - U32 lod = dist_squared < PROPERTY_LINE_LOD0_DIST_SQUARED ? 0 : 1; - gGL.begin(LLRender::TRIANGLE_STRIP); gGL.color4ubv(edge.color.mV); - if (draw_underwater) + for (const LLVector3& vertex : edge.vertices) { - gGL.vertexBatchPreTransformed(edge.verticesUnderWater[lod]); + if (render_hidden || camera_z < water_z || vertex.mV[2] >= water_z) + { + gGL.vertex3fv(vertex.mV); + } + else + { + LLVector3 visible = vertex; + visible.mV[VZ] = water_z; + gGL.vertex3fv(visible.mV); + } } - else + + gGL.end(); + + if (render_hidden) { - gGL.vertexBatchPreTransformed(edge.verticesAboveWater[lod]); + LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER); - if (render_hidden) - { - LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER); + gGL.begin(LLRender::TRIANGLE_STRIP); - LLColor4U color = edge.color; - color.mV[VALPHA] /= 4; - gGL.color4ubv(color.mV); + LLColor4U color = edge.color; + color.mV[VALPHA] /= 4; + gGL.color4ubv(color.mV); - gGL.vertexBatchPreTransformed(edge.verticesUnderWater[lod]); + for (const LLVector3& vertex : edge.vertices) + { + gGL.vertex3fv(vertex.mV); } - } - gGL.end(); + gGL.end(); + } } gGL.popMatrix(); diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h index 7271c85701..50bef02ddf 100644 --- a/indra/newview/llviewerparceloverlay.h +++ b/indra/newview/llviewerparceloverlay.h @@ -116,10 +116,7 @@ private: struct Edge { - void pushVertex(U32 lod, F32 x, F32 y, F32 z, F32 water_z); - // LOD: 0 - detailized, 1 - simplified - std::vector<LLVector4a> verticesAboveWater[2]; - std::vector<LLVector4a> verticesUnderWater[2]; + std::vector<LLVector3> vertices; LLColor4U color; }; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index eed118e7d0..8875372eff 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -3301,6 +3301,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("SetDisplayName"); capabilityNames.append("SimConsoleAsync"); capabilityNames.append("SimulatorFeatures"); + capabilityNames.append("SpatialVoiceModerationRequest"); capabilityNames.append("StartGroupProposal"); capabilityNames.append("TerrainNavMeshProperties"); capabilityNames.append("TextureStats"); @@ -3801,6 +3802,16 @@ std::string LLViewerRegion::getSimHostName() return std::string("..."); } + +bool LLViewerRegion::isRegionWebRTCEnabled() +{ + if (mSimulatorFeaturesReceived && mSimulatorFeatures.has("VoiceServerType")) + { + return mSimulatorFeatures["VoiceServerType"].asString() == "webrtc"; + } + return false; +} + void LLViewerRegion::applyCacheMiscExtras(LLViewerObject* obj) { LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 974bc375b8..f1eb335582 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -424,6 +424,8 @@ public: std::string getSimHostName(); + bool isRegionWebRTCEnabled(); + static bool isNewObjectCreationThrottleDisabled() {return sNewObjectCreationThrottle < 0;} // rebuild reflection probe list diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 5193514fe8..3a04b212a7 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -263,6 +263,20 @@ LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > HUDS_FRAME_PCT("huds_ LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > UI_FRAME_PCT("ui_frame_pct"); LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > SWAP_FRAME_PCT("swap_frame_pct"); LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > IDLE_FRAME_PCT("idle_frame_pct"); + + + +LLTrace::SampleStatHandle<U32> WEBRTC_PACKETS_IN_LOST("webrtc_packets_in_lost", "Lost incoming packets"), + WEBRTC_PACKETS_IN_RECEIVED("webrtc_packets_in_recv", "Incoming packets received"), + WEBRTC_PACKETS_OUT_SENT("webrtc_packets_out_sent", "Outgoing packets sent"), + WEBRTC_PACKETS_OUT_LOST("webrtc_packets_out_lost", "Lost outgoing packets"); + +LLTrace::SampleStatHandle<F32> WEBRTC_JITTER_OUT("webrtc_jitter_out", "Timing variation of outgoing audio"), + WEBRTC_JITTER_IN("webrtc_jitter_in", "Timing variation of incoming audio"), + WEBRTC_LATENCY("webrtc_latency", "Round-trip audio delay"), + WEBRTC_UPLOAD_BANDWIDTH("webrtc_upload_bandwidth", "Estimated upload bandwidth"), + WEBRTC_JITTER_BUFFER("webrtc_jitter_buffer", "Average delay added to smooth incoming audio"); + } LLViewerStats::LLViewerStats() diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 1ac8b2f66b..8ec0dd0024 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -232,6 +232,9 @@ extern LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT extern LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION; extern LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD; +extern LLTrace::SampleStatHandle<U32> WEBRTC_PACKETS_IN_LOST, WEBRTC_PACKETS_IN_RECEIVED, WEBRTC_PACKETS_OUT_SENT, WEBRTC_PACKETS_OUT_LOST; +extern LLTrace::SampleStatHandle<F32> WEBRTC_JITTER_OUT, WEBRTC_JITTER_IN, WEBRTC_LATENCY, WEBRTC_UPLOAD_BANDWIDTH, WEBRTC_JITTER_BUFFER; + } class LLViewerStats : public LLSingleton<LLViewerStats> diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 23915d01fa..0f23596c9a 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1898,13 +1898,11 @@ bool LLViewerFetchedTexture::processFetchResults(S32& desired_discard, S32 curre mRawDiscardLevel = INVALID_DISCARD_LEVEL; mIsFetching = false; mLastPacketTimer.reset(); - } - else - { - mIsRawImageValid = true; - addToCreateTexture(); + return false; } + mIsRawImageValid = true; + if (mBoostLevel == LLGLTexture::BOOST_ICON) { S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; @@ -1916,7 +1914,11 @@ bool LLViewerFetchedTexture::processFetchResults(S32& desired_discard, S32 curre // // BOOST_ICON gets scaling because profile icons can have a bunch of different formats, not just j2c // Might need another pass to use discard for j2c and scaling for everything else. - mRawImage = mRawImage->scaled(expected_width, expected_height); + LLPointer<LLImageRaw> scaled = mRawImage->scaled(expected_width, expected_height); + if (scaled.notNull()) + { + mRawImage = scaled; + } } } @@ -1931,10 +1933,16 @@ bool LLViewerFetchedTexture::processFetchResults(S32& desired_discard, S32 curre // // Todo: probably needs to be remade to use discard, all thumbnails are supposed to be j2c, // so no need to scale, should be posible to use discard to scale image down. - mRawImage = mRawImage->scaled(expected_width, expected_height); + LLPointer<LLImageRaw> scaled = mRawImage->scaled(expected_width, expected_height); + if (scaled.notNull()) + { + mRawImage = scaled; + } } } + addToCreateTexture(); + return true; } else diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 11ca3098fd..96962bbeae 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1191,15 +1191,19 @@ F32 LLViewerTextureList::updateImagesLoadingFastCache(F32 max_time) LLTimer timer; image_list_t::iterator enditer = mFastCacheList.begin(); - for (image_list_t::iterator iter = mFastCacheList.begin(); - iter != mFastCacheList.end();) { - image_list_t::iterator curiter = iter++; - enditer = iter; - LLViewerFetchedTexture *imagep = *curiter; - imagep->loadFromFastCache(); - if (timer.getElapsedTimeF32() > max_time) - break; + // prelock fast cache mutex to avoid waiting multiple times. + LLMutexLock cache_lock(LLAppViewer::getTextureCache()->getFastCacheMutex()); + for (image_list_t::iterator iter = mFastCacheList.begin(); + iter != mFastCacheList.end();) + { + image_list_t::iterator curiter = iter++; + enditer = iter; + LLViewerFetchedTexture* imagep = *curiter; + imagep->loadFromFastCache(); + if (timer.getElapsedTimeF32() > max_time) + break; + } } mFastCacheList.erase(mFastCacheList.begin(), enditer); return timer.getElapsedTimeF32(); diff --git a/indra/newview/llviewerwearable.cpp b/indra/newview/llviewerwearable.cpp index 583fb25330..50af9756a3 100644 --- a/indra/newview/llviewerwearable.cpp +++ b/indra/newview/llviewerwearable.cpp @@ -96,6 +96,7 @@ LLViewerWearable::~LLViewerWearable() // virtual LLWearable::EImportResult LLViewerWearable::importStream( std::istream& input_stream, LLAvatarAppearance* avatarp ) { + LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; // suppress texlayerset updates while wearables are being imported. Layersets will be updated // when the wearables are "worn", not loaded. Note state will be restored when this object is destroyed. LLOverrideBakedTextureUpdate stop_bakes(false); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 773ff14e90..1b85f84e55 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2322,14 +2322,22 @@ void LLViewerWindow::initWorldUI() physical_mem = LLMemory::getMaxMemKB(); } - if (!gNonInteractive && physical_mem > MIN_PHYSICAL_MEMORY) + if (!gNonInteractive) { - LL_INFOS() << "Preloading cef instances" << LL_ENDL; + if (physical_mem > MIN_PHYSICAL_MEMORY) + { + LL_INFOS() << "Preloading cef instances" << LL_ENDL; - LLFloaterReg::getInstance("destinations"); - LLFloaterReg::getInstance("avatar_welcome_pack"); - LLFloaterReg::getInstance("search"); - LLFloaterReg::getInstance("marketplace"); + LLFloaterReg::getInstance("destinations"); + LLFloaterReg::getInstance("avatar_welcome_pack"); + LLFloaterReg::getInstance("search"); + LLFloaterReg::getInstance("marketplace"); + } + else if (gSavedSettings.getBOOL("FirstLoginThisInstall")) + { + // Preload the welcome pack for first-time login even on low end hardware + LLFloaterReg::getInstance("avatar_welcome_pack"); + } } } @@ -4906,6 +4914,19 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save if (image->save(filepath)) { playSnapshotAnimAndSound(); + + // Show clickable notification with filepath + LLSD args; + args["FILEPATH"] = filepath; + + LLSD payload; + payload["filepath"] = filepath; + + LLNotificationsUtil::add("SnapshotSavedToComputer", + args, + payload.with("respond_on_mousedown", true), + boost::bind(&LLViewerWindow::onSnapshotNotificationClick, _1, _2)); + success_cb(); } else @@ -4920,6 +4941,16 @@ void LLViewerWindow::resetSnapshotLoc() } // static +void LLViewerWindow::onSnapshotNotificationClick(const LLSD& notification, const LLSD& response) +{ + std::string filepath = notification["payload"]["filepath"].asString(); + if (!filepath.empty()) + { + gDirUtilp->openDir(filepath); + } +} + +// static void LLViewerWindow::movieSize(S32 new_width, S32 new_height) { LLCoordWindow size; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 105c1b8baa..ada15bfedc 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -409,6 +409,7 @@ public: void resetSnapshotLoc(); void playSnapshotAnimAndSound(); + static void onSnapshotNotificationClick(const LLSD& notification, const LLSD& response); // draws selection boxes around selected objects, must call displayObjects first void renderSelections( bool for_gl_pick, bool pick_parcel_walls, bool for_hud ); diff --git a/indra/newview/llvlmanager.cpp b/indra/newview/llvlmanager.cpp index c2bcd32921..f4c2c27cee 100644 --- a/indra/newview/llvlmanager.cpp +++ b/indra/newview/llvlmanager.cpp @@ -68,7 +68,11 @@ void LLVLManager::addLayerData(LLVLData *vl_datap, const S32Bytes mesg_size) } else { - LL_ERRS() << "Unknown layer type!" << (S32)vl_datap->mType << LL_ENDL; + // Corrupted message? New feature? + LL_WARNS() << "Unknown layer type!" << (S32)vl_datap->mType + << " for region " << vl_datap->mRegionp->getName() << LL_ENDL; + delete vl_datap; // addLayerData took ownership + return; } mPacketData.push_back(vl_datap); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 14de3461c9..8994a2b4d3 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -217,6 +217,13 @@ enum ERenderName RENDER_NAME_FADE }; +enum ERenderGroupTitle +{ + RENDER_GROUP_TITLE_NEVER, + RENDER_GROUP_TITLE_SELF, + RENDER_GROUP_TITLE_ALWAYS +}; + #define JELLYDOLLS_SHOULD_IMPOSTOR //----------------------------------------------------------------------------- @@ -607,7 +614,7 @@ const LLUUID LLVOAvatar::sStepSounds[LL_MCODE_END] = }; S32 LLVOAvatar::sRenderName = RENDER_NAME_ALWAYS; -bool LLVOAvatar::sRenderGroupTitles = true; +S32 LLVOAvatar::sRenderGroupTitles = RENDER_GROUP_TITLE_ALWAYS; S32 LLVOAvatar::sNumVisibleChatBubbles = 0; bool LLVOAvatar::sDebugInvisible = false; bool LLVOAvatar::sShowAttachmentPoints = false; @@ -3551,9 +3558,10 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name) addNameTagLine(line, name_tag_color, LLFontGL::NORMAL, LLFontGL::getFontSansSerifSmall()); } + bool render_title = (sRenderGroupTitles == RENDER_GROUP_TITLE_ALWAYS) || + (isSelf() && (sRenderGroupTitles == RENDER_GROUP_TITLE_SELF)); - if (sRenderGroupTitles - && title && title->getString() && title->getString()[0] != '\0') + if (render_title && title && title->getString() && title->getString()[0] != '\0') { std::string title_str = title->getString(); LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR); @@ -11417,12 +11425,17 @@ void LLVOAvatar::calculateUpdateRenderComplexity() LLPerfStats::tunables.userFPSTuningStrategy != LLPerfStats::TUNE_SCENE_ONLY && !isVisuallyMuted()) { - LLUUID id = getID(); // <== use id to make sure this avatar didn't get deleted between frames - LL::WorkQueue::getInstance("mainloop")->post([this, id]() + const LLUUID id = getID(); // <== use id to make sure this avatar didn't get deleted between frames + LL::WorkQueue::getInstance("mainloop")->post([id]() { - if (gObjectList.findObject(id) != nullptr) + LLViewerObject* obj = gObjectList.findObject(id); + if (obj + && !obj->isDead() + && obj->isAvatar() + && obj->mDrawable) { - gPipeline.profileAvatar(this); + LLVOAvatar* avatar = (LLVOAvatar*)obj; + gPipeline.profileAvatar(avatar); } }); } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 7ccf46d643..3d93f43582 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -354,7 +354,7 @@ public: //-------------------------------------------------------------------- public: static S32 sRenderName; - static bool sRenderGroupTitles; + static S32 sRenderGroupTitles; static const U32 NON_IMPOSTORS_MAX_SLIDER; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors * slider in panel_preferences_graphics1.xml */ static U32 sMaxNonImpostors; // affected by control "RenderAvatarMaxNonImpostors" @@ -1118,7 +1118,7 @@ private: bool mNameFriend; bool mNameCloud; F32 mNameAlpha; - bool mRenderGroupTitles; + S32 mRenderGroupTitles; //-------------------------------------------------------------------- // Display the name (then optionally fade it out) diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index b941d356a1..0852258994 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -472,10 +472,6 @@ void LLVoiceChannelGroup::activate() } } } - - // Mic default state is OFF on initiating/joining Ad-Hoc/Group calls. It's on for P2P using the AdHoc infra. - - LLVoiceClient::getInstance()->setUserPTTState(mIsP2P); } } @@ -534,6 +530,10 @@ void LLVoiceChannelGroup::handleStatusChange(EStatusType type) case STATUS_JOINED: mRetries = 3; mIsRetrying = false; + + // Mic default state is OFF on initiating/joining Ad-Hoc/Group calls. It's on for P2P using the AdHoc infra. + LLVoiceClient::getInstance()->setUserPTTState(mIsP2P); + break; default: break; } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 507154a2a3..0890b04e72 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -42,6 +42,7 @@ #include "lltrans.h" #include "lluiusage.h" #include "llmutelist.h" +#include "llnearbyvoicemoderation.h" const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f; @@ -744,6 +745,9 @@ void LLVoiceClient::setUserPTTState(bool ptt) { if (ptt) { + // Nearby chat is muted by moderator, don't toggle PTT + if (!mUserPTTState && LLNearbyVoiceModeration::getInstance()->showNotificationIfNeeded()) + return; LLUIUsage::instance().logCommand("Agent.EnableMicrophone"); } mUserPTTState = ptt; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index e58a6577f1..35392fbcb8 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -1106,7 +1106,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() while (!sPump && !sShuttingDown) { // Can't use the pump until we have it available. - llcoro::suspend(); + llcoro::suspendUntilNextFrame(); } if (sShuttingDown) diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 481f9e3522..c09a8f7a3b 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -61,10 +61,12 @@ #include "llrand.h" #include "llviewerwindow.h" #include "llviewercamera.h" +#include "llviewerstats.h" #include "llversioninfo.h" #include "llviewernetwork.h" #include "llnotificationsutil.h" +#include "llnearbyvoicemoderation.h" #include "llcorehttputil.h" #include "lleventfilter.h" @@ -80,6 +82,8 @@ const std::string WEBRTC_VOICE_SERVER_TYPE = "webrtc"; +const F32 STATS_TIMER_DELAY = 2.0; + namespace { const F32 MAX_AUDIO_DIST = 50.0f; @@ -2904,6 +2908,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() } mWebRTCAudioInterface->setReceiveVolume(mSpeakerVolume); LLWebRTCVoiceClient::getInstance()->OnConnectionEstablished(mChannelID, mRegionID); + resetConnectionStats(); setVoiceConnectionState(VOICE_STATE_WAIT_FOR_DATA_CHANNEL); break; } @@ -2957,6 +2962,13 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() sendJoin(); } } + + static LLTimer stats_timer; + if (stats_timer.getElapsedTimeF32() > STATS_TIMER_DELAY) + { + mWebRTCPeerConnectionInterface->gatherConnectionStats(); + stats_timer.reset(); + } } break; } @@ -3088,6 +3100,13 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b LL_WARNS("Voice") << "Expected object from data channel:" << data << LL_ENDL; return; } + + bool is_primary_region = mPrimary; + if (!mPrimary && isSpatial() && gAgent.getRegion()) + { + is_primary_region = (mRegionID == gAgent.getRegion()->getRegionID()); + LL_WARNS() << "mPrimary is false, expected: " << is_primary_region << " connection state: " << getVoiceConnectionState() << LL_ENDL; + } boost::json::object voice_data = voice_data_parsed.as_object(); boost::json::object mute; boost::json::object user_gain; @@ -3173,12 +3192,63 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b if (participant_obj.contains("m") && participant_obj["m"].is_bool()) { - participant->mIsModeratorMuted = participant_obj["m"].as_bool(); + bool is_moderator_muted = participant_obj["m"].as_bool(); + if (isSpatial()) + { + // ignore muted flags from non-primary server + if (is_primary_region || primary) + { + participant->mIsModeratorMuted = is_moderator_muted; + if (gAgentID == agent_id) + { + LLNearbyVoiceModeration::getInstance()->setMutedInfo(mChannelID, is_moderator_muted); + } + } + } + else + { + participant->mIsModeratorMuted = is_moderator_muted; + } } } } - } + else + { + if (isSpatial() && (is_primary_region || primary)) + { + // mute info message can be received before join message, so try to mute again later + if (participant_obj.contains("m") && participant_obj["m"].is_bool()) + { + LL_WARNS() << "Mute info msg received: " << participant_obj["m"].as_bool() + << " but participant " << agent_id + << " was not found in channel " << mChannelID << LL_ENDL; + bool is_moderator_muted = participant_obj["m"].as_bool(); + std::string channel_id = mChannelID; + F32 delay { 1.5f }; + doAfterInterval( + [channel_id, agent_id, is_moderator_muted]() + { + LLWebRTCVoiceClient::participantStatePtr_t participant = + LLWebRTCVoiceClient::getInstance()->findParticipantByID(channel_id, agent_id); + if (participant) + { + participant->mIsModeratorMuted = is_moderator_muted; + LL_WARNS() << "Participant " << agent_id << " is found after delay, is_muted: " << is_moderator_muted << LL_ENDL; + if (gAgentID == agent_id) + { + LLNearbyVoiceModeration::getInstance()->setMutedInfo(channel_id, is_moderator_muted); + } + } + else + { + LL_WARNS() << "Participant " << agent_id << " is still not found in channel " << channel_id << LL_ENDL; + } + }, delay); + } + } + } + } // tell the simulator to set the mute and volume data for this // participant, if there are any updates. boost::json::object root; @@ -3250,6 +3320,112 @@ void LLVoiceWebRTCConnection::sendJoin() mWebRTCDataInterface->sendData(json_data, false); } +void LLVoiceWebRTCConnection::OnStatsDelivered(const llwebrtc::LLWebRTCStatsMap& stats_data) +{ + LL::WorkQueue::postMaybe(mMainQueue, [=, this] + { + if (mShutDown) + { + return; + } + for (const auto& [stats_id, attributes] : stats_data) + { + if (attributes.contains("currentRoundTripTime")) + { + F32 rtt_seconds = 0.0f; + LLStringUtil::convertToF32(attributes.at("currentRoundTripTime"), rtt_seconds); + sample(LLStatViewer::WEBRTC_LATENCY, rtt_seconds * 1000.0f); + } + if (attributes.contains("availableOutgoingBitrate")) + { + F32 bitrate_bps = 0.0f; + LLStringUtil::convertToF32(attributes.at("availableOutgoingBitrate"), bitrate_bps); + sample(LLStatViewer::WEBRTC_UPLOAD_BANDWIDTH, bitrate_bps / 1000.0f); + } + + // Stat type detection below is heuristic-based. + // It's relied on specific fields to distinguish outbound-rtp, remote-inbound-rtp, and inbound-rtp. + // This approach works with current WebRTC stats but may need updating later. + + // Outbound RTP + if (attributes.contains("mediaSourceId")) + { + U32 out_packets_sent = 0; + LLStringUtil::convertToU32(attributes.at("packetsSent"), out_packets_sent); + sample(LLStatViewer::WEBRTC_PACKETS_OUT_SENT, out_packets_sent); + } + // Remote-Inbound RTP + else if (attributes.contains("localId")) + { + if (attributes.contains("packetsLost")) + { + U32 out_packets_lost = 0; + LLStringUtil::convertToU32(attributes.at("packetsLost"), out_packets_lost); + sample(LLStatViewer::WEBRTC_PACKETS_OUT_LOST, out_packets_lost); + } + if (attributes.contains("jitter")) + { + F32 jitter_seconds = 0.0f; + LLStringUtil::convertToF32(attributes.at("jitter"), jitter_seconds); + sample(LLStatViewer::WEBRTC_JITTER_OUT, jitter_seconds * 1000.0f); + } + } + // Inbound RTP + else if (attributes.contains("jitterBufferDelay")) + { + if (attributes.contains("packetsLost")) + { + U32 in_packets_lost = 0; + LLStringUtil::convertToU32(attributes.at("packetsLost"), in_packets_lost); + sample(LLStatViewer::WEBRTC_PACKETS_IN_LOST, in_packets_lost); + } + if (attributes.contains("packetsReceived")) + { + U32 in_packets_recv = 0; + LLStringUtil::convertToU32(attributes.at("packetsReceived"), in_packets_recv); + sample(LLStatViewer::WEBRTC_PACKETS_IN_RECEIVED, in_packets_recv); + } + if (attributes.contains("jitter")) + { + F32 jitter_seconds = 0.0f; + LLStringUtil::convertToF32(attributes.at("jitter"), jitter_seconds); + sample(LLStatViewer::WEBRTC_JITTER_IN, jitter_seconds * 1000.0f); + } + if (attributes.contains("jitterBufferDelay") && attributes.contains("jitterBufferEmittedCount")) + { + F32 total_delay_seconds = 0.0f; + F32 emitted_count_f = 0.0f; + + // total delay in seconds + LLStringUtil::convertToF32(attributes.at("jitterBufferDelay"), total_delay_seconds); + + // number of packets played out + LLStringUtil::convertToF32(attributes.at("jitterBufferEmittedCount"), emitted_count_f); + if (emitted_count_f > 0.0f) + { + F32 avg_delay_seconds = total_delay_seconds / emitted_count_f; + F32 avg_delay_ms = avg_delay_seconds * 1000.0f; + sample(LLStatViewer::WEBRTC_JITTER_BUFFER, avg_delay_seconds * 1000.0f); + } + } + } + } + }); +} + +void LLVoiceWebRTCConnection::resetConnectionStats() +{ + sample(LLStatViewer::WEBRTC_JITTER_BUFFER, 0); + sample(LLStatViewer::WEBRTC_JITTER_IN, 0); + sample(LLStatViewer::WEBRTC_JITTER_OUT, 0); + sample(LLStatViewer::WEBRTC_LATENCY, 0); + sample(LLStatViewer::WEBRTC_PACKETS_IN_LOST, 0); + sample(LLStatViewer::WEBRTC_PACKETS_IN_RECEIVED, 0); + sample(LLStatViewer::WEBRTC_PACKETS_OUT_SENT, 0); + sample(LLStatViewer::WEBRTC_PACKETS_OUT_LOST, 0); + sample(LLStatViewer::WEBRTC_UPLOAD_BANDWIDTH, 0); +} + ///////////////////////////// // WebRTC Spatial Connection diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index 2ce575852a..6786b049c2 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -540,6 +540,8 @@ private: static bool sShuttingDown; LLEventMailDrop mWebRTCPump; + + LLSD mLastWebRTCStats; }; @@ -603,6 +605,8 @@ class LLVoiceWebRTCConnection : //@{ void OnDataReceived(const std::string &data, bool binary) override; void OnDataChannelReady(llwebrtc::LLWebRTCDataInterface *data_interface) override; + + void OnStatsDelivered(const llwebrtc::LLWebRTCStatsMap& stats_data) override; //@} void OnDataReceivedImpl(const std::string &data, bool binary); @@ -638,6 +642,8 @@ class LLVoiceWebRTCConnection : void OnVoiceConnectionRequestSuccess(const LLSD &body); + void resetConnectionStats(); + protected: typedef enum e_voice_connection_state { diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index 6d234a9a34..38e49d0750 100644 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -41,6 +41,8 @@ #include "llrootview.h" #include "llsdutil.h" #include "stringize.h" +#include "llclipboard.h" +#include "lleditmenuhandler.h" #include <functional> #include <typeinfo> #include <map> @@ -89,7 +91,8 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& &LLWindowListener::getPaths, LLSDMap("reply", LLSD())); add("keyDown", - keySomething + "keypress event.\n" + keyExplain + mask, + keySomething + "keypress event.\n" + keyExplain + + "The [\"char\"] parameter detects and handles non-ASCII characters seperately\n" + mask, &LLWindowListener::keyDown); add("keyUp", keySomething + "key release event.\n" + keyExplain + mask, @@ -107,6 +110,10 @@ LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& "Given an integer number of [\"clicks\"], inject the requested mouse scroll event.\n" "(positive clicks moves downward through typical content)", &LLWindowListener::mouseScroll); + add("pasteText", + "Paste specified [\"text\"] into the current edit field\n" + "Optional [\"path\"] specifies target UI element (must be focusable).", + &LLWindowListener::pasteText); } template <typename MAPPED> @@ -264,6 +271,20 @@ void LLWindowListener::keyDown(LLSD const & evt) KEY key = getKEY(evt); MASK mask = getMask(evt); + bool is_non_ascii = false; + llwchar uni_char = 0; + + if (evt.has("char")) + { + LLWString wstr = utf8str_to_wstring(evt["char"].asString()); + if (!wstr.empty()) + { + uni_char = wstr[0]; + // If the Unicode code point is outside ASCII range, use Unicode-only handling + is_non_ascii = (uni_char >= 0x80); + } + } + if (evt.has("path")) { std::string path(evt["path"]); @@ -278,8 +299,17 @@ void LLWindowListener::keyDown(LLSD const & evt) response.setResponse(target_view->getInfo()); gFocusMgr.setKeyboardFocus(target_view); - gViewerInput.handleKey(key, mask, false); - if(key < 0x80) mWindow->handleUnicodeChar(key, mask); + + if (is_non_ascii) + { + // For non-ASCII characters, only send the Unicode event + mWindow->handleUnicodeChar(uni_char, mask); + } + else + { + gViewerInput.handleKey(key, mask, false); + if(key < 0x80) mWindow->handleUnicodeChar(key, mask); + } } else { @@ -290,8 +320,16 @@ void LLWindowListener::keyDown(LLSD const & evt) } else { - gViewerInput.handleKey(key, mask, false); - if(key < 0x80) mWindow->handleUnicodeChar(key, mask); + if (is_non_ascii) + { + // For non-ASCII characters, only send the Unicode event + mWindow->handleUnicodeChar(uni_char, mask); + } + else + { + gViewerInput.handleKey(key, mask, false); + if(key < 0x80) mWindow->handleUnicodeChar(key, mask); + } } } @@ -521,3 +559,60 @@ void LLWindowListener::mouseScroll(LLSD const & request) mWindow->handleScrollWheel(NULL, clicks); } + +void LLWindowListener::pasteText(LLSD const & evt) +{ + Response response(LLSD(), evt); + + if (!evt.has("text")) + { + response.error(STRINGIZE(evt["op"].asString() << " request did not provide required \"text\" parameter")); + return; + } + + std::string text_to_paste = evt["text"].asString(); + if (evt.has("path")) + { + std::string path(evt["path"]); + LLView* target_view = LLUI::getInstance()->resolvePath(LLUI::getInstance()->getRootView(), path); + if (!target_view) + { + response.error(STRINGIZE(evt["op"].asString() << " request specified invalid \"path\": " << path)); + return; + } + else if(!target_view->isAvailable()) + { + response.error(STRINGIZE("Target view specified by \"path\": " << path << " is not visible")); + return; + } + else + { + // Focus the target view + gFocusMgr.setKeyboardFocus(target_view); + } + } + + // Check if edit menu handler is available + if (!LLEditMenuHandler::gEditMenuHandler) + { + response.error(STRINGIZE(evt["op"].asString() << " request failed: no edit menu handler available")); + return; + } + + // Save current clipboard contents + LLWString saved_clipboard; + LLClipboard::instance().pasteFromClipboard(saved_clipboard); + + LLClipboard::instance().copyToClipboard(utf8str_to_wstring(text_to_paste), 0, static_cast<S32>(text_to_paste.size())); + LLEditMenuHandler::gEditMenuHandler->paste(); + + // Restore original clipboard contents if there were any + if (!saved_clipboard.empty()) + { + LLClipboard::instance().copyToClipboard(saved_clipboard, 0, static_cast<S32>(saved_clipboard.size())); + } + else + { + LLClipboard::instance().reset(); + } +} diff --git a/indra/newview/llwindowlistener.h b/indra/newview/llwindowlistener.h index 9908a9c451..d3a16cfde9 100644 --- a/indra/newview/llwindowlistener.h +++ b/indra/newview/llwindowlistener.h @@ -47,6 +47,7 @@ public: void mouseUp(LLSD const & evt); void mouseMove(LLSD const & evt); void mouseScroll(LLSD const & evt); + void pasteText(LLSD const & evt); private: LLViewerWindow * mWindow; diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index 68e7f3ee29..91bc699708 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -37,18 +37,6 @@ #include "llviewertexture.h" #include "llgltexture.h" -// map item types -const U32 MAP_ITEM_TELEHUB = 0x01; -const U32 MAP_ITEM_PG_EVENT = 0x02; -const U32 MAP_ITEM_MATURE_EVENT = 0x03; -//const U32 MAP_ITEM_POPULAR = 0x04; // No longer supported, 2009-03-02 KLW -//const U32 MAP_ITEM_AGENT_COUNT = 0x05; -const U32 MAP_ITEM_AGENT_LOCATIONS = 0x06; -const U32 MAP_ITEM_LAND_FOR_SALE = 0x07; -const U32 MAP_ITEM_CLASSIFIED = 0x08; -const U32 MAP_ITEM_ADULT_EVENT = 0x09; -const U32 MAP_ITEM_LAND_FOR_SALE_ADULT = 0x0a; - // Description of objects like hubs, events, land for sale, people and more (TBD). // Note: we don't store a "type" in there so we need to store instances of this class in // well known objects (i.e. list of objects which type is "well known"). diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp index a5433133ab..3264f8ae8b 100644 --- a/indra/newview/llworldmapmessage.cpp +++ b/indra/newview/llworldmapmessage.cpp @@ -34,7 +34,6 @@ #include "llfloaterworldmap.h" constexpr U32 LAYER_FLAG = 2; -constexpr S32 MAP_SIM_RETURN_NULL_SIMS = 0x00010000; //--------------------------------------------------------------------------- // World Map Message Handling diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 3b72e512da..d130f010f2 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -2746,6 +2746,10 @@ void LLPipeline::clearRebuildGroups() { LLSpatialGroup* group = *iter; + if (!group || group->isDead()) + { + continue; + } // If the group contains HUD objects, save the group if (group->isHUDGroup()) { diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 2ad285eb1f..d627556a7c 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -4,13 +4,16 @@ <!-- Named Colors --> <color name="EmphasisColor" - value="0.38 0.694 0.573 1" /> - <color - name="EmphasisColor_13" - value="0.38 0.694 0.573 0.13" /> + value="0.3 0.82 1 1" /> <color name="EmphasisColor_35" - value="0.38 0.694 0.573 0.35" /> + value="0.426 0.729 1.0 0.368" /> + <color + name="SelectionColor" + value="0.706 0.851 1 1" /> + <color + name="ScrollHoveredColor" + value="0.18 0.26 0.33 1" /> <color name="BeaconColor" value="0.749 0.298 0 1" /> @@ -53,6 +56,9 @@ <color name="DkGray2" value="0.169 0.169 0.169 1" /> + <color + name="DkGrayLogin" + value="0.129 0.133 0.137 1" /> <color name="MouseGray" value="0.191 0.191 0.191 1" /> @@ -338,7 +344,7 @@ reference="EmphasisColor" /> <color name="ConversationFriendColor" - value="0.42 0.85 0.71 1" /> + reference="EmphasisColor" /> <color name="DefaultHighlightDark" reference="White_10" /> @@ -359,7 +365,7 @@ reference="Black" /> <color name="FilterTextColor" - value="0.38 0.69 0.57 1" /> + reference="EmphasisColor" /> <color name="FloaterButtonImageColor" reference="LtGray" /> @@ -377,7 +383,7 @@ reference="Black_50" /> <color name="FocusColor" - reference="EmphasisColor" /> + value="0.7 0.7 0.7 1" /> <color name="FolderViewLoadingMessageTextColor" value="0.3344 0.5456 0.5159 1" /> @@ -595,7 +601,7 @@ reference="White" /> <color name="NameTagFriend" - value="0.447 0.784 0.663 1" /> + reference="EmphasisColor" /> <color name="NameTagLegacy" reference="White" /> @@ -741,9 +747,6 @@ name="ScrollHighlightedColor" reference="Unused?" /> <color - name="ScrollHoveredColor" - reference="EmphasisColor_13" /> - <color name="ScrollSelectedBGColor" reference="EmphasisColor_35" /> <color @@ -762,6 +765,9 @@ name="SelectedOutfitTextColor" reference="EmphasisColor" /> <color + name="WornOutfitTextColor" + value="0.54 0.73 0.87 1" /> + <color name="SearchableControlHighlightFontColor" value="1 0 0 1" /> <color @@ -792,6 +798,9 @@ name="SystemChatColor" reference="LtGray" /> <color + name="SelectedBgReadOnlyColor" + value="0.15 0.21 0.27 1" /> + <color name="TextBgFocusColor" reference="White" /> <color @@ -863,18 +872,24 @@ name="ColorSwatchBorderColor" value="0.45098 0.517647 0.607843 1"/> <color + name="ColorSwatchBorderColorGray" + value="0.329 0.329 0.329 1"/> + <color name="ChatTeleportSeparatorColor" reference="Black" /> <color name="ChatTimestampColor" reference="White" /> <color + name="MenuBarStreamingBgColor" + reference="DkGray" /> + <color name="MenuBarBetaBgColor" reference="DkBlue" /> - <color - name="MenuBarProjectBgColor" - reference="MdBlue" /> - <color + <color + name="MenuBarProjectBgColor" + reference="MdBlue" /> + <color name="MenuBarTestBgColor" reference="DkRed" /> <color @@ -984,7 +999,7 @@ value="1 0.14 0 1" /> <color name="OutfitGalleryItemSelected" - value="0.22 0.45 0.35 1" /> + value="0.26 0.36 0.47 1"/> <color name="OutfitGalleryItemWorn" value="0.33 0.58 0.47 1" /> @@ -995,6 +1010,9 @@ name="PanelGray" value="0.27 0.27 0.27 1" /> <color + name="PanelDark" + value="0.078 0.078 0.078 1" /> + <color name="PerformanceMid" value="1 0.8 0 1" /> <color diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png Binary files differindex ffc3c85ea2..2e84daaf6b 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png Binary files differindex c8560c0869..1854cb87df 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_In.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png Binary files differindex 2812d614e6..d009044ee1 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png Binary files differindex ae2c57c207..a9415e9cc0 100644 --- a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png +++ b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_In.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png Binary files differindex 9f31d461b5..f22f6e23b6 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Backward_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png Binary files differindex f7ed4c25fb..238d005bef 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png Binary files differindex d0a825a682..ad4a02ee27 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Forward_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png Binary files differindex 2f81fb1588..1a134661eb 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png Binary files differindex 4f86e81a15..8c5bf3bc66 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png Binary files differindex b211371e64..1eeab859e5 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_TurnLeft_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png Binary files differindex e937c3f012..57762defe4 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_TurnRight_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png Binary files differindex ed4902f3ee..512bd3b64e 100644 --- a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png +++ b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png Binary files differindex cd18ae310d..b1012e505e 100644 --- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png Binary files differindex b0ed6ee8eb..49cdadded7 100644 --- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2.png diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png Binary files differindex be4881b64c..9afe58dcd1 100644 --- a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png +++ b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On.png diff --git a/indra/newview/skins/default/textures/build/Object_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png Binary files differindex d50dc69ffe..051c85d05d 100644 --- a/indra/newview/skins/default/textures/build/Object_Cone_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Cone_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Cube_Selected.png b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png Binary files differindex 3d6964530d..3560b36ec6 100644 --- a/indra/newview/skins/default/textures/build/Object_Cube_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Cube_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png Binary files differindex 3ed0389961..8f752aaf4c 100644 --- a/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Cylinder_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Grass_Selected.png b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png Binary files differindex 3ebd5ea7a1..90844abe94 100644 --- a/indra/newview/skins/default/textures/build/Object_Grass_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Grass_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png Binary files differindex 3bdc4d1fd5..66e1c45567 100644 --- a/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cone_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png Binary files differindex 0912442e29..48ae5969a1 100644 --- a/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Hemi_Cylinder_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png Binary files differindex 33db4a2de8..eff8a231d6 100644 --- a/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Hemi_Sphere_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Prism_Selected.png b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png Binary files differindex 9e80fe2b84..ab7921b97d 100644 --- a/indra/newview/skins/default/textures/build/Object_Prism_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Prism_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png Binary files differindex d36bfa55d4..446951d992 100644 --- a/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Pyramid_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Ring_Selected.png b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png Binary files differindex 962f6efb93..a23e6dba50 100644 --- a/indra/newview/skins/default/textures/build/Object_Ring_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Ring_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png Binary files differindex 715d597144..daf39a658c 100644 --- a/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Sphere_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png Binary files differindex b2ea680f23..28175f107e 100644 --- a/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Tetrahedron_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Torus_Selected.png b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png Binary files differindex 1fc22686eb..049ca64f05 100644 --- a/indra/newview/skins/default/textures/build/Object_Torus_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Torus_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Tree_Selected.png b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png Binary files differindex 5bd87f8a2f..8b45d668aa 100644 --- a/indra/newview/skins/default/textures/build/Object_Tree_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Tree_Selected.png diff --git a/indra/newview/skins/default/textures/build/Object_Tube_Selected.png b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png Binary files differindex a4c3f39e14..c94a984c41 100644 --- a/indra/newview/skins/default/textures/build/Object_Tube_Selected.png +++ b/indra/newview/skins/default/textures/build/Object_Tube_Selected.png diff --git a/indra/newview/skins/default/textures/containers/Accordion_Selected.png b/indra/newview/skins/default/textures/containers/Accordion_Selected.png Binary files differindex 0616dea6a3..ab852007ab 100644 --- a/indra/newview/skins/default/textures/containers/Accordion_Selected.png +++ b/indra/newview/skins/default/textures/containers/Accordion_Selected.png diff --git a/indra/newview/skins/default/textures/containers/TabLeft_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Off.png Binary files differnew file mode 100644 index 0000000000..d6c6bc41ec --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Off.png diff --git a/indra/newview/skins/default/textures/containers/TabLeft_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Selected.png Binary files differnew file mode 100644 index 0000000000..cc310bbc26 --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabLeft_Flat_Selected.png diff --git a/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Off.png Binary files differnew file mode 100644 index 0000000000..177d341ba3 --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Off.png diff --git a/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Selected.png Binary files differnew file mode 100644 index 0000000000..54bd4d923d --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabTop_First_Flat_Selected.png diff --git a/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Off.png Binary files differnew file mode 100644 index 0000000000..28a315665b --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Off.png diff --git a/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Selected.png Binary files differnew file mode 100644 index 0000000000..993e79b37f --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabTop_Last_Flat_Selected.png diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Off.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Off.png Binary files differnew file mode 100644 index 0000000000..1f5d926cc8 --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Off.png diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Selected.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Selected.png Binary files differnew file mode 100644 index 0000000000..e4e4d27d42 --- /dev/null +++ b/indra/newview/skins/default/textures/containers/TabTop_Middle_Flat_Selected.png diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png Binary files differindex 642113b135..62f82879cf 100644 --- a/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png +++ b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Selected.png diff --git a/indra/newview/skins/default/textures/icons/Info_Over.png b/indra/newview/skins/default/textures/icons/Info_Over.png Binary files differindex 0efd596d3e..1d00c2c175 100644 --- a/indra/newview/skins/default/textures/icons/Info_Over.png +++ b/indra/newview/skins/default/textures/icons/Info_Over.png diff --git a/indra/newview/skins/default/textures/icons/Inv_SysClosed.png b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png Binary files differindex 9af3b60cbd..19afa94cc4 100644 --- a/indra/newview/skins/default/textures/icons/Inv_SysClosed.png +++ b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png diff --git a/indra/newview/skins/default/textures/icons/Inv_SysOpen.png b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png Binary files differindex 01e7dbff8f..7ca0f5a849 100644 --- a/indra/newview/skins/default/textures/icons/Inv_SysOpen.png +++ b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png Binary files differindex 1eafc304f5..7b147df369 100644 --- a/indra/newview/skins/default/textures/icons/SL_Logo.png +++ b/indra/newview/skins/default/textures/icons/SL_Logo.png diff --git a/indra/newview/skins/default/textures/icons/back_arrow_off.png b/indra/newview/skins/default/textures/icons/back_arrow_off.png Binary files differindex ab82dfc0a7..0c96257470 100644 --- a/indra/newview/skins/default/textures/icons/back_arrow_off.png +++ b/indra/newview/skins/default/textures/icons/back_arrow_off.png diff --git a/indra/newview/skins/default/textures/icons/back_arrow_over.png b/indra/newview/skins/default/textures/icons/back_arrow_over.png Binary files differindex ad8c1f8d2c..a7fac5ef99 100644 --- a/indra/newview/skins/default/textures/icons/back_arrow_over.png +++ b/indra/newview/skins/default/textures/icons/back_arrow_over.png diff --git a/indra/newview/skins/default/textures/icons/back_arrow_press.png b/indra/newview/skins/default/textures/icons/back_arrow_press.png Binary files differindex 8aecc3d876..0c96257470 100644 --- a/indra/newview/skins/default/textures/icons/back_arrow_press.png +++ b/indra/newview/skins/default/textures/icons/back_arrow_press.png diff --git a/indra/newview/skins/default/textures/icons/check_mark.png b/indra/newview/skins/default/textures/icons/check_mark.png Binary files differindex 5431dd31c8..00ec32964d 100644 --- a/indra/newview/skins/default/textures/icons/check_mark.png +++ b/indra/newview/skins/default/textures/icons/check_mark.png diff --git a/indra/newview/skins/default/textures/icons/hand.png b/indra/newview/skins/default/textures/icons/hand.png Binary files differindex d8ef2e22fa..6effb7c77d 100644 --- a/indra/newview/skins/default/textures/icons/hand.png +++ b/indra/newview/skins/default/textures/icons/hand.png diff --git a/indra/newview/skins/default/textures/icons/see_me_online.png b/indra/newview/skins/default/textures/icons/see_me_online.png Binary files differindex 4059035b20..51d369003c 100644 --- a/indra/newview/skins/default/textures/icons/see_me_online.png +++ b/indra/newview/skins/default/textures/icons/see_me_online.png diff --git a/indra/newview/skins/default/textures/locked_image_dark.png b/indra/newview/skins/default/textures/locked_image_dark.png Binary files differnew file mode 100644 index 0000000000..b952f2cfb0 --- /dev/null +++ b/indra/newview/skins/default/textures/locked_image_dark.png diff --git a/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png b/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png Binary files differindex e27dbe2cad..cbb78cd514 100644 --- a/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png +++ b/indra/newview/skins/default/textures/navbar/Favorite_Star_Active.png diff --git a/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png b/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png Binary files differindex 7909d54f2b..6b4092bf49 100644 --- a/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png +++ b/indra/newview/skins/default/textures/navbar/Favorite_Star_Over.png diff --git a/indra/newview/skins/default/textures/navbar/Row_Selection.png b/indra/newview/skins/default/textures/navbar/Row_Selection.png Binary files differindex fc4f0c07ef..0eeb4f494c 100644 --- a/indra/newview/skins/default/textures/navbar/Row_Selection.png +++ b/indra/newview/skins/default/textures/navbar/Row_Selection.png diff --git a/indra/newview/skins/default/textures/square_selection.png b/indra/newview/skins/default/textures/square_selection.png Binary files differnew file mode 100644 index 0000000000..9f344c4842 --- /dev/null +++ b/indra/newview/skins/default/textures/square_selection.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index ff5737ab49..1f4b12fc91 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -124,7 +124,9 @@ with the same filename but different name <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" /> <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" /> <texture name="Checkbox_Off" file_name="widgets/Checkbox_Off.png" preload="true" /> + <texture name="Checkbox_Slim_Off" file_name="widgets/Checkbox_Slim_Off.png" preload="true" /> <texture name="Checkbox_On" file_name="widgets/Checkbox_On.png" preload="true" /> + <texture name="Checkbox_Slim_On" file_name="widgets/Checkbox_Slim_On.png" preload="true" /> <texture name="Checkbox_On_Press" file_name="widgets/Checkbox_On_Press.png" preload="true" /> <texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" /> <texture name="Check_Mark" file_name="icons/check_mark.png" preload="true" /> @@ -172,6 +174,8 @@ with the same filename but different name <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" /> + <texture name="ComboButton_Arrow" file_name="widgets/ComboButton_Arrow.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_Transparent" file_name="widgets/ComboButton_Transparent.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="Container" file_name="containers/Container.png" preload="false" /> @@ -559,15 +563,16 @@ with the same filename but different name <texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Over" file_name="widgets/PushButton_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> - <texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> - <texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Selected" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Selected_Disabled" file_name="widgets/PushButton_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Login" file_name="widgets/PushButton_Login.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Login_Over" file_name="widgets/PushButton_Login_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="PushButton_Login_Pressed" file_name="widgets/PushButton_Login_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> - + <texture name="PushButton_Sign" file_name="widgets/PushButton_Sign.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Sign_Over" file_name="widgets/PushButton_Sign_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="PushButton_Sign_Pressed" file_name="widgets/PushButton_Sign_Pressed.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="RadioButton_Press" file_name="widgets/RadioButton_Press.png" preload="true" /> <texture name="RadioButton_On_Press" file_name="widgets/RadioButton_On_Press.png" preload="true" /> @@ -648,6 +653,8 @@ with the same filename but different name <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" /> <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" /> + <texture name="Square_Selection" file_name="square_selection.png" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" /> + <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" /> @@ -656,6 +663,7 @@ with the same filename but different name <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" /> <texture name="login_sl_logo" file_name="windows/login_sl_logo.png" preload="true" /> + <texture name="login_sl_logo_horizontal" file_name="windows/login_sl_logo_horizontal.png" preload="true" /> <texture name="login_sl_logo_small" file_name="windows/login_sl_logo_small.png" preload="true" /> <texture name="first_login_image" file_name="windows/first_login_image.jpg" preload="true" /> @@ -685,6 +693,15 @@ with the same filename but different name <texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" /> <texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" /> + <texture name="TabLeft_Flat_Off" file_name="containers/TabLeft_Flat_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="TabLeft_Flat_Selected" file_name="containers/TabLeft_Flat_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" /> + <texture name="TabTop_First_Flat_Off" file_name="containers/TabTop_First_Flat_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_Last_Flat_Off" file_name="containers/TabTop_Last_Flat_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_Middle_Flat_Off" file_name="containers/TabTop_Middle_Flat_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_First_Flat_Selected" file_name="containers/TabTop_First_Flat_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_Last_Flat_Selected" file_name="containers/TabTop_Last_Flat_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <texture name="TabTop_Middle_Flat_Selected" file_name="containers/TabTop_Middle_Flat_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> + <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" /> <texture name="TabTop_Right_Flashing" file_name="containers/TabTop_Right_Flashing.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" /> @@ -702,7 +719,9 @@ with the same filename but different name <texture name="TextField_Search_Off" file_name="widgets/TextField_Search_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> <texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> <texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Highlight" file_name="widgets/TextField_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> <texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" /> + <texture name="TextField_Transparent" file_name="widgets/TextField_Transparent.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="Thumbnail_Fallback" file_name="icons/thumbnail_fallback_icon.png" preload="true" /> @@ -870,6 +889,7 @@ with the same filename but different name <texture name="badge_warn.j2c" /> <texture name="badge_ok.j2c" /> <texture name="materials_ui_x_24.png" /> + <texture name="locked_image" file_name="locked_image_dark.png" preload="true"/> <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" /> diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png b/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png Binary files differindex 8439f82e29..383ff8f6e3 100644 --- a/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/Checkbox_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Off.png b/indra/newview/skins/default/textures/widgets/Checkbox_Off.png Binary files differindex cb9a04d84f..66f12496cb 100644 --- a/indra/newview/skins/default/textures/widgets/Checkbox_Off.png +++ b/indra/newview/skins/default/textures/widgets/Checkbox_Off.png diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On.png b/indra/newview/skins/default/textures/widgets/Checkbox_On.png Binary files differindex 0ec090504a..549bbde5cd 100644 --- a/indra/newview/skins/default/textures/widgets/Checkbox_On.png +++ b/indra/newview/skins/default/textures/widgets/Checkbox_On.png diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png Binary files differindex 5759f7de69..9c80670837 100644 --- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/Checkbox_On_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png Binary files differindex ba46e91c55..903c61f01b 100644 --- a/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png +++ b/indra/newview/skins/default/textures/widgets/Checkbox_On_Press.png diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Press.png b/indra/newview/skins/default/textures/widgets/Checkbox_Press.png Binary files differindex 5f5a33d878..96dfd7267c 100644 --- a/indra/newview/skins/default/textures/widgets/Checkbox_Press.png +++ b/indra/newview/skins/default/textures/widgets/Checkbox_Press.png diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Slim_Off.png b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_Off.png Binary files differnew file mode 100644 index 0000000000..99af0397d5 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_Off.png diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Slim_On.png b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_On.png Binary files differnew file mode 100644 index 0000000000..cabecf1467 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/Checkbox_Slim_On.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Arrow.png b/indra/newview/skins/default/textures/widgets/ComboButton_Arrow.png Binary files differnew file mode 100644 index 0000000000..7961967458 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Arrow.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png b/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png Binary files differindex ebeb813349..5b2bc7b163 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png Binary files differindex 4f573cf6fa..7199470307 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_Off.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Off.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png Binary files differindex 1a834bfbbc..715b401ce5 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Selected.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Transparent.png b/indra/newview/skins/default/textures/widgets/ComboButton_Transparent.png Binary files differnew file mode 100644 index 0000000000..4b978877e1 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Transparent.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png Binary files differindex 5a067aca7c..9e74524be4 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png Binary files differindex ff56367147..aa8865c33d 100644 --- a/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png +++ b/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png diff --git a/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png b/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png Binary files differindex 9a69f7e0d9..fff0cfaff2 100644 --- a/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/DropDown_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/DropDown_Off.png b/indra/newview/skins/default/textures/widgets/DropDown_Off.png Binary files differindex b118e7a7d4..9f6a2313b9 100644 --- a/indra/newview/skins/default/textures/widgets/DropDown_Off.png +++ b/indra/newview/skins/default/textures/widgets/DropDown_Off.png diff --git a/indra/newview/skins/default/textures/widgets/DropDown_On.png b/indra/newview/skins/default/textures/widgets/DropDown_On.png Binary files differindex 613a8c2ff6..a498465940 100644 --- a/indra/newview/skins/default/textures/widgets/DropDown_On.png +++ b/indra/newview/skins/default/textures/widgets/DropDown_On.png diff --git a/indra/newview/skins/default/textures/widgets/DropDown_Press.png b/indra/newview/skins/default/textures/widgets/DropDown_Press.png Binary files differindex fa3a152df1..b6bf4d1c22 100644 --- a/indra/newview/skins/default/textures/widgets/DropDown_Press.png +++ b/indra/newview/skins/default/textures/widgets/DropDown_Press.png diff --git a/indra/newview/skins/default/textures/widgets/ListItem_Over.png b/indra/newview/skins/default/textures/widgets/ListItem_Over.png Binary files differindex e72c1c4020..9316567e7b 100644 --- a/indra/newview/skins/default/textures/widgets/ListItem_Over.png +++ b/indra/newview/skins/default/textures/widgets/ListItem_Over.png diff --git a/indra/newview/skins/default/textures/widgets/ListItem_Select.png b/indra/newview/skins/default/textures/widgets/ListItem_Select.png Binary files differindex 0e16a8b454..cd65d347d6 100644 --- a/indra/newview/skins/default/textures/widgets/ListItem_Select.png +++ b/indra/newview/skins/default/textures/widgets/ListItem_Select.png diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png Binary files differindex de71f763d3..b2767c6174 100644 --- a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png +++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Off.png diff --git a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png Binary files differindex 8bfa3acb42..de50b29f79 100644 --- a/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png +++ b/indra/newview/skins/default/textures/widgets/MarketplaceBtn_Selected.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png b/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png Binary files differindex e99ec4b14b..64a9a2d885 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Login.png b/indra/newview/skins/default/textures/widgets/PushButton_Login.png Binary files differindex 8e7d932ab1..7e892d2b0a 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Login.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Login.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png Binary files differindex 038ba23be2..9110889d6c 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Login_Over.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png b/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png Binary files differindex 828aa1a139..bf38c2cd75 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Login_Pressed.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Off.png b/indra/newview/skins/default/textures/widgets/PushButton_Off.png Binary files differindex 29eeed7c78..113c371a4d 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Off.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Off.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_On.png b/indra/newview/skins/default/textures/widgets/PushButton_On.png Binary files differindex 65d92a9d82..db70f75dd6 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_On.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_On.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Over.png Binary files differindex 819f27c0ba..67dfa0ca75 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Over.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Over.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Press.png b/indra/newview/skins/default/textures/widgets/PushButton_Press.png Binary files differindex b0a92d8ffe..8dfa9030b1 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Press.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Press.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png Binary files differindex 8588576fb0..062fcf9246 100644 --- a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png +++ b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Press.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Sign.png b/indra/newview/skins/default/textures/widgets/PushButton_Sign.png Binary files differnew file mode 100644 index 0000000000..f1c27f8c9b --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/PushButton_Sign.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Sign_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Over.png Binary files differnew file mode 100644 index 0000000000..efef8bebad --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Over.png diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Sign_Pressed.png b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Pressed.png Binary files differnew file mode 100644 index 0000000000..ec3409e8b8 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/PushButton_Sign_Pressed.png diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png b/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png Binary files differindex 32ec25fe0e..fb98907be2 100644 --- a/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/RadioButton_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Off.png b/indra/newview/skins/default/textures/widgets/RadioButton_Off.png Binary files differindex 5d267af5dc..231aead651 100644 --- a/indra/newview/skins/default/textures/widgets/RadioButton_Off.png +++ b/indra/newview/skins/default/textures/widgets/RadioButton_Off.png diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On.png b/indra/newview/skins/default/textures/widgets/RadioButton_On.png Binary files differindex e6bf0db157..066872ff82 100644 --- a/indra/newview/skins/default/textures/widgets/RadioButton_On.png +++ b/indra/newview/skins/default/textures/widgets/RadioButton_On.png diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png Binary files differindex 72aae43618..43af5bec2f 100644 --- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/RadioButton_On_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png Binary files differindex f3883b82b3..6870a48129 100644 --- a/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png +++ b/indra/newview/skins/default/textures/widgets/RadioButton_On_Press.png diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Press.png b/indra/newview/skins/default/textures/widgets/RadioButton_Press.png Binary files differindex 0025256045..0fb0054bfb 100644 --- a/indra/newview/skins/default/textures/widgets/RadioButton_Press.png +++ b/indra/newview/skins/default/textures/widgets/RadioButton_Press.png diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png Binary files differindex 9afc907c1c..eb9563e0ee 100644 --- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png +++ b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz.png diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png Binary files differindex ede643e528..144a7cba25 100644 --- a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png +++ b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png Binary files differindex d9f05d33ec..8ad008ba51 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png Binary files differindex d2342f6538..ca5f84a088 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png Binary files differindex 6223ad8dfe..9b1531a11e 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png Binary files differindex 101d5a0930..28f5bf37f7 100644 --- a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png +++ b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Press.png diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png Binary files differindex 5cfa3ae4e1..fb98907be2 100644 --- a/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png +++ b/indra/newview/skins/default/textures/widgets/SliderThumb_Disabled.png diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png Binary files differindex 66cdcbeb94..231aead651 100644 --- a/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png +++ b/indra/newview/skins/default/textures/widgets/SliderThumb_Off.png diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png Binary files differindex 0bf8e43e81..0fb0054bfb 100644 --- a/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png +++ b/indra/newview/skins/default/textures/widgets/SliderThumb_Press.png diff --git a/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png b/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png Binary files differindex 720830f83f..65cfaf4c62 100644 --- a/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png +++ b/indra/newview/skins/default/textures/widgets/SliderTrack_Horiz.png diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png Binary files differindex 51d269bd45..720946aba6 100644 --- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png +++ b/indra/newview/skins/default/textures/widgets/Stepper_Down_Off.png diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png Binary files differindex b4f19b7dbb..505fa6c82c 100644 --- a/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png +++ b/indra/newview/skins/default/textures/widgets/Stepper_Down_Press.png diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png Binary files differindex a01d928aef..9482e4773e 100644 --- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png +++ b/indra/newview/skins/default/textures/widgets/Stepper_Up_Off.png diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png Binary files differindex d5b672d943..ca311768c4 100644 --- a/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png +++ b/indra/newview/skins/default/textures/widgets/Stepper_Up_Press.png diff --git a/indra/newview/skins/default/textures/widgets/TextField_Highlight.png b/indra/newview/skins/default/textures/widgets/TextField_Highlight.png Binary files differnew file mode 100644 index 0000000000..71c2a5dbc3 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/TextField_Highlight.png diff --git a/indra/newview/skins/default/textures/widgets/TextField_Transparent.png b/indra/newview/skins/default/textures/widgets/TextField_Transparent.png Binary files differnew file mode 100644 index 0000000000..1735184387 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/TextField_Transparent.png diff --git a/indra/newview/skins/default/textures/widgets/track_control_moon_back.png b/indra/newview/skins/default/textures/widgets/track_control_moon_back.png Binary files differindex 03d1e805e1..1e2ce7bc83 100644 --- a/indra/newview/skins/default/textures/widgets/track_control_moon_back.png +++ b/indra/newview/skins/default/textures/widgets/track_control_moon_back.png diff --git a/indra/newview/skins/default/textures/widgets/track_control_moon_front.png b/indra/newview/skins/default/textures/widgets/track_control_moon_front.png Binary files differindex cdc52fe08a..25f2914ecc 100644 --- a/indra/newview/skins/default/textures/widgets/track_control_moon_front.png +++ b/indra/newview/skins/default/textures/widgets/track_control_moon_front.png diff --git a/indra/newview/skins/default/textures/widgets/track_control_sphere.png b/indra/newview/skins/default/textures/widgets/track_control_sphere.png Binary files differindex 60a81d1fea..adfb51edd2 100644 --- a/indra/newview/skins/default/textures/widgets/track_control_sphere.png +++ b/indra/newview/skins/default/textures/widgets/track_control_sphere.png diff --git a/indra/newview/skins/default/textures/widgets/track_control_sun_back.png b/indra/newview/skins/default/textures/widgets/track_control_sun_back.png Binary files differindex b3191ccc5d..98bae90332 100644 --- a/indra/newview/skins/default/textures/widgets/track_control_sun_back.png +++ b/indra/newview/skins/default/textures/widgets/track_control_sun_back.png diff --git a/indra/newview/skins/default/textures/windows/Inspector_I.png b/indra/newview/skins/default/textures/windows/Inspector_I.png Binary files differindex 843f6e9fbe..d51cf43051 100644 --- a/indra/newview/skins/default/textures/windows/Inspector_I.png +++ b/indra/newview/skins/default/textures/windows/Inspector_I.png diff --git a/indra/newview/skins/default/textures/windows/Window_Background.png b/indra/newview/skins/default/textures/windows/Window_Background.png Binary files differindex 9864ec0db8..83a09584c1 100644 --- a/indra/newview/skins/default/textures/windows/Window_Background.png +++ b/indra/newview/skins/default/textures/windows/Window_Background.png diff --git a/indra/newview/skins/default/textures/windows/Window_Foreground.png b/indra/newview/skins/default/textures/windows/Window_Foreground.png Binary files differindex a86b236504..1f4f9040bc 100644 --- a/indra/newview/skins/default/textures/windows/Window_Foreground.png +++ b/indra/newview/skins/default/textures/windows/Window_Foreground.png diff --git a/indra/newview/skins/default/textures/windows/login_sl_logo_horizontal.png b/indra/newview/skins/default/textures/windows/login_sl_logo_horizontal.png Binary files differnew file mode 100644 index 0000000000..f56d0bd542 --- /dev/null +++ b/indra/newview/skins/default/textures/windows/login_sl_logo_horizontal.png diff --git a/indra/newview/skins/default/xui/da/floater_joystick.xml b/indra/newview/skins/default/xui/da/floater_joystick.xml index 49e1397e9f..c756bc6969 100644 --- a/indra/newview/skins/default/xui/da/floater_joystick.xml +++ b/indra/newview/skins/default/xui/da/floater_joystick.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Joystick" title="JOYSTICK OPSÆTNING"> <check_box label="Aktiver Joystick:" name="enable_joystick"/> - <spinner label="X akse mapping" name="JoystickAxis1"/> - <spinner label="Y akse mapping" name="JoystickAxis2"/> - <spinner label="Z akse mapping" name="JoystickAxis0"/> - <spinner label="Hældning mapping" name="JoystickAxis4"/> - <spinner label="Drejning mapping" name="JoystickAxis5"/> - <spinner label="Rulning mapping" name="JoystickAxis3"/> - <spinner label="Zoom mapping" name="JoystickAxis6"/> + <spinner label="X akse mapping" name="JoystickAxis1" label_width="115" width="155"/> + <spinner label="Y akse mapping" name="JoystickAxis2" label_width="115" width="155"/> + <spinner label="Z akse mapping" name="JoystickAxis0" label_width="115" width="155"/> + <spinner label="Hældning mapping" name="JoystickAxis4" label_width="115" width="155"/> + <spinner label="Drejning mapping" name="JoystickAxis5" label_width="115" width="155"/> + <spinner label="Rulning mapping" name="JoystickAxis3" label_width="115" width="155"/> + <spinner label="Zoom mapping" name="JoystickAxis6" label_width="115" width="155"/> <check_box label="Direkte zoom" name="ZoomDirect"/> <check_box label="3D Cursor" name="Cursor3D"/> <check_box label="Auto opret" name="AutoLeveling"/> diff --git a/indra/newview/skins/default/xui/da/floater_sound_devices.xml b/indra/newview/skins/default/xui/da/floater_sound_devices.xml deleted file mode 100644 index cb4cbba570..0000000000 --- a/indra/newview/skins/default/xui/da/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="Lyd enheder"> - <text name="voice_label"> - Stemme chat - </text> - <check_box label="Aktiveret" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_voice_effect.xml b/indra/newview/skins/default/xui/da/floater_voice_effect.xml deleted file mode 100644 index 86ad251103..0000000000 --- a/indra/newview/skins/default/xui/da/floater_voice_effect.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Steder" name="voice_effects" title="STEMME MORPH"> - <string name="no_voice_effect"> - (Ingen stemme "morph") - </string> - <string name="active_voice_effect"> - (Aktiv) - </string> - <string name="unsubscribed_voice_effect"> - (Ikke aktiveret) - </string> - <string name="new_voice_effect"> - (Ny!) - </string> - <text name="preview_text"> - For at se - </text> - <text name="status_text"> - Optag en prøve, klik derefter på en stemme for at høre hvordan det vil lyde. - </text> - <button label="Optag" name="record_btn" tool_tip="Optag en stemmeprøve."/> - <button label="Stop" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] Abonnér nu] - </text> - <scroll_list name="voice_effect_list" tool_tip="Optag en prøve med din stemme og klik på en effekt for at teste."> - <scroll_list.columns label="Stemme navn" name="name"/> - <scroll_list.columns label="Udløber" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml index 443e84b64a..e05be4e310 100644 --- a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml @@ -3,7 +3,7 @@ <text name="media_label"> Indtast en URL eller et URL mønster for at tilføje til listen med godkendte domæner </text> - <line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)"/> + <line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)" bottom_delta="25"/> <button label="OK" name="ok_btn"/> <button label="Annullér" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml index 7caa17d514..fa245416cf 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml @@ -4,6 +4,7 @@ Vis mig når: </text> <check_box label="Når jeg bruger eller får L$" name="notify_money_change_checkbox"/> + <check_box name="notify_money_spend_checkbox" left_delta="70"/> <check_box label="Når mine venner logger på eller af" name="friends_online_notify_checkbox"/> <text name="show_label"> Vis altid: diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index 26d2ae4abd..acae39061b 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -30,7 +30,7 @@ <radio_item label="Avatar position" name="1"/> </radio_group> <check_box label="Bevæg avatar-læber når der snakkes" name="enable_lip_sync"/> - <check_box label="Skift tale tænd/sluk når jeg trykker:" name="push_to_talk_toggle_check" tool_tip="Når du er i skift-modus, vil hvert tryk tænde eller slukke din mikrofon. Når du ikke er i skift-modus, vil din mikrofon kun være tændt når knappen/tasten holdes nede (som en Walkie Talkie)"/> + <check_box label="Skift tale tænd/sluk når jeg trykker" name="push_to_talk_toggle_check" tool_tip="Når du er i skift-modus, vil hvert tryk tænde eller slukke din mikrofon. Når du ikke er i skift-modus, vil din mikrofon kun være tændt når knappen/tasten holdes nede (som en Walkie Talkie)"/> <line_editor label="Tryk-for-tale udløser" name="modifier_combo"/> <button label="Angiv taste" name="set_voice_hotkey_button"/> <button name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste muse-knap"/> diff --git a/indra/newview/skins/default/xui/da/panel_voice_effect.xml b/indra/newview/skins/default/xui/da/panel_voice_effect.xml deleted file mode 100644 index 50f561ec7f..0000000000 --- a/indra/newview/skins/default/xui/da/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Voice Morphing Off - </string> - <string name="preview_voice_effects"> - Se stemme "morph" ▶ - </string> - <string name="get_voice_effects"> - Hente stemme "morph" ▶ - </string> - <combo_box name="voice_effect" tool_tip="Vælg en stemme "morph" for at ændre din stemme"> - <combo_box.item label="Stemme morph slukket" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/de/floater_big_preview.xml b/indra/newview/skins/default/xui/de/floater_big_preview.xml deleted file mode 100644 index c5ce56d1d9..0000000000 --- a/indra/newview/skins/default/xui/de/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="VORSCHAU"/> diff --git a/indra/newview/skins/default/xui/de/floater_post_process.xml b/indra/newview/skins/default/xui/de/floater_post_process.xml deleted file mode 100644 index a6ed8cc3df..0000000000 --- a/indra/newview/skins/default/xui/de/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Post-Process Floater" title="POST-PROCESSING-EINSTELLUNGEN"> - <tab_container name="Post-Process Tabs"> - <panel label="Farbfilter" name="wmiColorFilterPanel"> - <check_box label="Ein" name="wmiColorFilterToggle" /> - <text name="wmiColorFilterBrightnessText"> - Helligkeit - </text> - <text name="wmiColorFilterSaturationText"> - Sättigung - </text> - <text name="wmiColorFilterContrastText"> - Kontrast - </text> - <text name="wmiColorFilterBaseText"> - Kontrast-Grundfarbe - </text> - <slider label="R" name="wmiColorFilterBaseR" /> - <slider label="G" name="wmiColorFilterBaseG" /> - <slider label="B" name="wmiColorFilterBaseB" /> - <slider label="I" name="wmiColorFilterBaseI" /> - </panel> - <panel label="Nachtsicht" name="wmiNightVisionPanel"> - <check_box label="Ein" name="wmiNightVisionToggle" /> - <text name="wmiNightVisionBrightMultText"> - Lichtverstärkungsmultiplikator - </text> - <text name="wmiNightVisionNoiseSizeText"> - Rauschen-Größe - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Rauschen-Stärke - </text> - </panel> - <panel label="Bloom" name="wmiBloomPanel"> - <check_box label="Ein" name="wmiBloomToggle" /> - <text name="wmiBloomExtractText"> - Luminanz-Extraktion - </text> - <text name="wmiBloomSizeText"> - Bloom-Größe - </text> - <text name="wmiBloomStrengthText"> - Bloom-Stärke - </text> - </panel> - <panel label="Extras" name="Extras"> - <button label="Effekt laden" label_selected="Effekt laden" name="PPLoadEffect" /> - <button label="Effekt speichern" label_selected="Effekt speichern" name="PPSaveEffect" /> - <line_editor label="Effektname" name="PPEffectNameEditor" /> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_sound_devices.xml b/indra/newview/skins/default/xui/de/floater_sound_devices.xml deleted file mode 100644 index 22ccb2c1a2..0000000000 --- a/indra/newview/skins/default/xui/de/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="SOUNDGERÄTE"> - <text name="voice_label"> - Voice-Chat - </text> - <check_box label="Aktiviert" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_voice_effect.xml b/indra/newview/skins/default/xui/de/floater_voice_effect.xml deleted file mode 100644 index 8d37950480..0000000000 --- a/indra/newview/skins/default/xui/de/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Orte" name="voice_effects" title="VOICE-MORPHING-VORSCHAU"> - <string name="no_voice_effect"> - (Kein Voice-Morphing) - </string> - <string name="active_voice_effect"> - (Aktiv) - </string> - <string name="unsubscribed_voice_effect"> - (nicht abonniert) - </string> - <string name="new_voice_effect"> - (Neu!) - </string> - <string name="effect_Arena"> - Arena - </string> - <string name="effect_Beast"> - Bestie - </string> - <string name="effect_Buff"> - Muskulös - </string> - <string name="effect_Buzz"> - Buzz - </string> - <string name="effect_Camille"> - Camille - </string> - <string name="effect_Creepy"> - Unheimlich - </string> - <string name="effect_CreepyBot"> - UnheimlicherBot - </string> - <string name="effect_Cyber"> - Cyber - </string> - <string name="effect_DeepBot"> - TieferBot - </string> - <string name="effect_Demon"> - Dämon - </string> - <string name="effect_Female Elf"> - Weibliche Elfe - </string> - <string name="effect_Flirty"> - Kokett - </string> - <string name="effect_Foxy"> - Attraktiv - </string> - <string name="effect_Halloween 2010 Bonus"> - Bonus_Halloween_2010 - </string> - <string name="effect_Helium"> - Helium - </string> - <string name="effect_Husky"> - Rauchig - </string> - <string name="effect_Husky Whisper"> - Rauchiges Flüstern - </string> - <string name="effect_Intercom"> - Intercom - </string> - <string name="effect_Julia"> - Julia - </string> - <string name="effect_Lo Lilt"> - Leises Trällern - </string> - <string name="effect_Macho"> - Macho - </string> - <string name="effect_Micro"> - Micro - </string> - <string name="effect_Mini"> - Mini - </string> - <string name="effect_Model"> - Modell - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - Alptraum - </string> - <string name="effect_PopBot"> - PopBot - </string> - <string name="effect_Rachel"> - Rachel - </string> - <string name="effect_Radio"> - Radio - </string> - <string name="effect_Robot"> - Roboter - </string> - <string name="effect_Roxanne"> - Roxanne - </string> - <string name="effect_Rumble"> - Rumpeln - </string> - <string name="effect_Sabrina"> - Sabrina - </string> - <string name="effect_Samantha"> - Samantha - </string> - <string name="effect_Sexy"> - Sexy - </string> - <string name="effect_Shorty"> - Shorty - </string> - <string name="effect_Smaller"> - Kleiner - </string> - <string name="effect_Sneaky"> - Hinterhältig - </string> - <string name="effect_Stallion"> - Hengst - </string> - <string name="effect_Sultry"> - Feurig - </string> - <string name="effect_Thunder"> - Donner - </string> - <string name="effect_Vixen"> - Erotisch - </string> - <string name="effect_WhinyBot"> - JammernderBot - </string> - <text name="preview_text"> - Zur Vorschau - </text> - <text name="status_text"> - Stimme aufnehmen und auf einen Effekt klicken, um diesen auf Ihre Stimme anzuwenden. - </text> - <button label="Aufnehmen" name="record_btn" tool_tip="Nehmen Sie Ihre Stimme auf."/> - <button label="Stopp" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] Jetzt abonnieren] - </text> - <scroll_list name="voice_effect_list" tool_tip="Nehmen Sie Ihre Stimme auf und klicken Sie dann auf einen Effekt, um diesen auszuprobieren."> - <scroll_list.columns label="Bezeichnung" name="name"/> - <scroll_list.columns label="Gültig bis" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/de/panel_login_first.xml b/indra/newview/skins/default/xui/de/panel_login_first.xml deleted file mode 100644 index 038001157e..0000000000 --- a/indra/newview/skins/default/xui/de/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php?lang=de - </panel.string> - <panel.string name="sign_up_url"> - https://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Benutzername" name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/> - <line_editor label="Kennwort" name="password_edit"/> - <button label="Anmelden" name="connect_btn"/> - <check_box label="Details speichern" name="remember_check"/> - <text name="forgot_password_text"> - Kennwort vergessen - </text> - <text name="sign_up_text"> - Registrieren - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Ihr erster Schritt ist Learning Island. Suchen Sie die Pforte! - </text> - <text name="image_caption_right"> - Erkunden Sie dann Social Island und lernen Sie andere Einwohner kennen! - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/de/panel_voice_effect.xml b/indra/newview/skins/default/xui/de/panel_voice_effect.xml deleted file mode 100644 index 533deb8597..0000000000 --- a/indra/newview/skins/default/xui/de/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Voice-Morphing Aus - </string> - <string name="preview_voice_effects"> - Voice-Morphing ausprobieren ▶ - </string> - <string name="get_voice_effects"> - Voice-Morphing abonnieren ▶ - </string> - <combo_box name="voice_effect" tool_tip="Wählen Sie einen Voice-Morph-Effekt aus, um Ihre Stimme zu verändern."> - <combo_box.item label="Voice-Morphing Aus" name="no_voice_effect"/> - </combo_box> -</panel> 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 c5b42b6dae..ffb9c0f78e 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -974,7 +974,7 @@ layout="topleft" left="28" name="Set to group:" - top_pad="5" + top_pad="9" width="176"> Set to group: </text> @@ -1022,7 +1022,7 @@ layout="topleft" left="28" name="Owned by others:" - top_pad="5" + top_pad="9" width="176"> Owned by others: </text> @@ -1593,7 +1593,7 @@ Only large parcels can be listed in search. left="10" name="with media:" top="10" - width="100"> + width="110"> Type: </text> <combo_box @@ -1620,7 +1620,7 @@ Only large parcels can be listed in search. layout="topleft" left="10" name="at URL:" - width="100" + width="110" top_pad="10"> Home Page: </text> @@ -1632,7 +1632,7 @@ Only large parcels can be listed in search. max_length_bytes="255" name="media_url" select_on_focus="true" - width="300" + width="290" top_delta="0"/> <button follows="left|top" @@ -1659,13 +1659,13 @@ Only large parcels can be listed in search. follows="left|top" height="20" layout="topleft" - left="110" + left="120" max_length_bytes="255" name="url_description" select_on_focus="true" tool_tip="Text displayed next to play/load button" top_delta="0" - width="300" /> + width="290" /> <text type="string" length="1" @@ -1685,7 +1685,7 @@ Only large parcels can be listed in search. follows="left|top" height="80" layout="topleft" - left="110" + left="120" name="media texture" tool_tip="Click to choose a picture" top_delta="0" @@ -1698,7 +1698,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="8" name="replace_texture_help" - width="300" + width="290" word_wrap="true" top_delta="0"> Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture. @@ -1707,7 +1707,7 @@ Only large parcels can be listed in search. height="16" label="Auto scale" layout="topleft" - left="107" + left="117" name="media_auto_scale" top_pad="-10" tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required." @@ -1721,7 +1721,7 @@ Only large parcels can be listed in search. left="10" name="media_size" tool_tip="Size to render Web media, leave 0 for default." - width="100" + width="110" top_pad="10"> Size: </text> @@ -1776,7 +1776,7 @@ Only large parcels can be listed in search. left="10" name="Options:" top_pad="10" - width="100"> + width="110"> Options: </text> <check_box @@ -1786,7 +1786,7 @@ Only large parcels can be listed in search. left_pad="-3" name="media_loop" tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning." - top_delta="-1" + top_delta="1" width="200" /> </panel> <panel diff --git a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml index 870ddee554..308f4feb5a 100644 --- a/indra/newview/skins/default/xui/en/floater_add_payment_method.xml +++ b/indra/newview/skins/default/xui/en/floater_add_payment_method.xml @@ -50,7 +50,6 @@ follows="top|left|right" height="24" label="Get started" - font="SansSerifMedium" layout="topleft" left="320" name="continue_btn" @@ -59,6 +58,7 @@ image_hover_unselected="PushButton_Login_Over" label_color="White" top_pad ="15" + pad_bottom="1" width="140"/> <button follows="top|left|right" @@ -66,6 +66,7 @@ label="Later" layout="topleft" left_pad="9" + pad_bottom="1" name="close_btn" width="90"/> <icon @@ -97,7 +98,6 @@ type="string" length="1" follows="top|left" - font="SansSerifMedium" text_color="White" height="75" width="260" @@ -112,7 +112,6 @@ type="string" length="1" follows="top|left" - font="SansSerifMedium" text_color="White" height="75" width="260" @@ -126,7 +125,6 @@ type="string" length="1" follows="top|left" - font="SansSerifMedium" text_color="White" height="75" width="260" diff --git a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml index 889eeb5369..d6dc112dce 100644 --- a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml +++ b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml @@ -47,15 +47,15 @@ name="ambient_lbl" height="10" layout="topleft" - left="10" + left="7" top="5" - width="80">Ambient:</text> + width="80">Ambient</text> <color_swatch can_apply_immediately="true" follows="left|top" height="40" label_height="0" layout="topleft" - left_delta="0" + left_delta="3" name="ambient_light" top_pad="5" width="60"/> @@ -63,15 +63,15 @@ name="blue_horizon_lbl" height="10" layout="topleft" - left_delta="0" + left="7" top_pad="10" - width="80">Blue Horizon:</text> + width="80">Blue Horizon</text> <color_swatch can_apply_immediately="true" follows="left|top" height="40" label_height="0" layout="topleft" - left_delta="0" + left_delta="3" name="blue_horizon" top_pad="5" width="60"/> @@ -79,15 +79,15 @@ name="blue_density_lbl" height="10" layout="topleft" - left_delta="0" + left="7" top_pad="10" - width="80">Blue Density:</text> + width="80">Blue Density</text> <color_swatch can_apply_immediately="true" follows="left|top" height="40" label_height="0" layout="topleft" - left_delta="0" + left_delta="3" name="blue_density" top_pad="5" width="60"/> @@ -107,7 +107,7 @@ layout="topleft" right="-12" top="5" - width="60">Sun Color:</text> + width="60">Sun Color</text> <color_swatch can_apply_immediately="true" follows="left|top" height="10" @@ -123,7 +123,7 @@ layout="topleft" left_delta="0" top_pad="5" - width="80">Cloud Color:</text> + width="80">Cloud Color</text> <color_swatch can_apply_immediately="true" follows="left|top" height="10" @@ -139,7 +139,7 @@ left_delta="0" top_pad="10" name="cloud_map_label" - width="80">Cloud Image:</text> + width="80">Cloud Image</text> <texture_picker height="63" layout="topleft" left_delta="0" @@ -152,7 +152,7 @@ left_delta="0" top_pad="-13" name="water_map_label" - width="80">Water Image:</text> + width="80">Water Image</text> <texture_picker height="63" layout="topleft" left_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index adbce0d982..0c82cbb00c 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -63,7 +63,7 @@ layout="topleft" left="10" name="InstructSearchResidentName" - top="8" + top="7" width="220"> Type part of a person's name: </text> @@ -76,7 +76,7 @@ height="23" left_delta="0" name="Edit" - top_pad="0" + top_pad="3" width="65" /> <button follows="top|right" diff --git a/indra/newview/skins/default/xui/en/floater_big_preview.xml b/indra/newview/skins/default/xui/en/floater_big_preview.xml deleted file mode 100644 index 362853d06f..0000000000 --- a/indra/newview/skins/default/xui/en/floater_big_preview.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater - positioning="cascading" - can_close="true" - can_resize="true" - can_minimize="false" - help_topic="floater_big_preview" - layout="topleft" - name="floater_big_preview" - save_rect="true" - single_instance="true" - reuse_instance="true" - title="PREVIEW" - height="465" - width="770"> - <panel - height="450" - width="750" - visible="true" - name="big_preview_placeholder" - top="5" - follows="all" - left="10"> - </panel> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 7636284b4b..17631ad30c 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -29,7 +29,7 @@ control_name="BulkChangeIncludeAnimations" height="16" name="check_animation" - top="24" + top="30" left="10" width="16" /> <icon @@ -73,7 +73,7 @@ name="check_gesture" left="95" width="16" - top="25" /> + top="30" /> <icon height="16" image_name="Inv_Gesture" @@ -116,7 +116,7 @@ control_name="BulkChangeIncludeScripts" height="16" name="check_script" - top="25" + top="30" left="180" width="16" /> @@ -161,7 +161,7 @@ height="16" name="check_settings" left="245" - top="25" + top="30" width="16" /> <icon height="16" @@ -291,7 +291,7 @@ height="16" label="Copy" layout="topleft" - top_pad="0" + top_pad="3" name="next_owner_copy" tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="92"> @@ -302,7 +302,7 @@ control_name="BulkChangeNextOwnerTransfer" enabled_control="BulkChangeNextOwnerCopy" height="16" - top_pad="0" + top_pad="3" initial_value="true" label="Transfer" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index e8e83301be..5e0903a40f 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -93,7 +93,6 @@ type="string" length="1" follows="top|left" - font="SansSerifMedium" height="16" layout="topleft" left="20" @@ -105,7 +104,6 @@ <text type="string" length="1" - font="SansSerifMedium" follows="top|left" halign="right" height="16" @@ -128,7 +126,6 @@ type="string" length="1" follows="top|left" - font="SansSerifMedium" height="16" layout="topleft" left="20" @@ -140,7 +137,6 @@ <text type="string" length="1" - font="SansSerifMedium" follows="top|left" halign="right" height="16" @@ -163,7 +159,6 @@ type="string" length="1" follows="top|left" - font="SansSerifMedium" font.style="BOLD" height="16" layout="topleft" @@ -176,7 +171,6 @@ <text type="string" length="1" - font="SansSerifMedium" follows="top|left" halign="right" height="16" @@ -207,7 +201,6 @@ type="string" length="1" follows="top|left" - font="SansSerifMedium" height="16" top_pad="15" layout="topleft" @@ -217,7 +210,6 @@ Choose amount to buy </text> <text - font="SansSerifMedium" type="string" length="1" follows="left|top" @@ -233,7 +225,6 @@ type="string" max_length_bytes="10" halign="right" - font="SansSerifMedium" select_on_focus="true" follows="top|left" top_delta="-4" @@ -247,7 +238,6 @@ <text type="string" length="1" - font="SansSerifMedium" text_color="EmphasisColor" follows="top|left" halign="right" @@ -276,7 +266,6 @@ </text> <text type="string" - font="SansSerifMedium" length="1" follows="top|left" height="16" @@ -290,7 +279,6 @@ <text type="string" length="1" - font="SansSerifMedium" follows="top|left" top_delta="0" height="16" @@ -350,7 +338,6 @@ Re-enter amount to see the latest exchange rate. length="1" follows="top|left" layout="topleft" - font="SansSerifMedium" top="10" left="20" width="310" diff --git a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml index 787b2f8be4..b911e9b6f5 100644 --- a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml +++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml @@ -290,7 +290,7 @@ <button follows="top|left" height="23" - width="110" + width="113" label="Clone Track From" left="10" top_pad="10" @@ -298,7 +298,7 @@ <button follows="top|left" height="23" - width="110" + width="113" label="Load Track From" top_pad="0" left_delta="0" @@ -306,7 +306,7 @@ <button follows="top|left" height="23" - width="110" + width="113" label="Clear Track" top_pad="0" left_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml b/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml index c831684594..41e8d3dc8a 100644 --- a/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml +++ b/indra/newview/skins/default/xui/en/floater_edit_hover_height.xml @@ -5,7 +5,7 @@ can_minimize="true" can_close="true" can_resize="false" - height="80" + height="84" width="515" layout="topleft" name="HoverHeight" @@ -39,6 +39,6 @@ label="Bind Camera view" layout="topleft" name="BindCameraCheck" - top_pad="7" + top_pad="14" width="237"/> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_font_test.xml b/indra/newview/skins/default/xui/en/floater_font_test.xml index 61cb91e2f3..8070ed55e6 100644 --- a/indra/newview/skins/default/xui/en/floater_font_test.xml +++ b/indra/newview/skins/default/xui/en/floater_font_test.xml @@ -5,7 +5,7 @@ height="800" layout="topleft" min_height="175" - min_width="154" + min_width="390" name="contents" help_topic="contents" title="FONT TEST" diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml index f8ec696af9..e94669bba4 100644 --- a/indra/newview/skins/default/xui/en/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml @@ -6,7 +6,7 @@ name="godtools floater" help_topic="godtools_floater" title="GOD TOOLS" - width="400"> + width="410"> <tab_container follows="left|top" height="364" @@ -15,7 +15,7 @@ name="GodTools Tabs" tab_position="top" top="20" - width="400"> + width="410"> <panel border="true" follows="left|top|right|bottom" @@ -72,11 +72,11 @@ follows="left|top|right" height="20" layout="topleft" - left_pad="0" + left_pad="5" max_length_bytes="63" name="region name" top_delta="0" - width="250"> + width="294"> <line_editor.commit_callback function="RegionTools.ChangeAnything" /> </line_editor> @@ -233,13 +233,13 @@ border_style="line" border_thickness="1" follows="top|right" - height="16" + height="18" layout="topleft" - left_delta="108" + left_delta="90" max_length_bytes="10" name="estate" top_delta="0" - width="50" /> + width="100" /> <text type="string" length="1" @@ -249,7 +249,7 @@ layout="topleft" left="200" name="parent id" - top_pad="4" + top_pad="7" width="190"> Parent ID: </text> @@ -257,14 +257,14 @@ border_style="line" border_thickness="1" follows="top|right" - height="16" + height="18" layout="topleft" - left_delta="108" + left_delta="90" max_length_bytes="10" name="parentestate" tool_tip="This is the parent estate for this region" top_delta="0" - width="50"> + width="100"> <line_editor.commit_callback function="RegionTools.ChangeAnything" /> </line_editor> @@ -276,22 +276,22 @@ layout="topleft" left="200" name="Grid Pos: " - top_pad="4" - width="190"> + top_pad="7" + width="90"> Grid Pos: </text> <line_editor border_style="line" border_thickness="1" follows="top|right" - height="16" + height="18" layout="topleft" - left_delta="88" + left_pad="0" max_length_bytes="10" name="gridposx" tool_tip="This is the grid x position for this region" top_delta="0" - width="50"> + width="46"> <line_editor.commit_callback function="RegionTools.ChangeAnything" /> </line_editor> @@ -299,14 +299,14 @@ border_style="line" border_thickness="1" follows="top|right" - height="16" + height="18" layout="topleft" - left_pad="10" + left_pad="8" max_length_bytes="10" name="gridposy" tool_tip="This is the grid y position for this region" top_delta="0" - width="40"> + width="46"> <line_editor.commit_callback function="RegionTools.ChangeAnything" /> </line_editor> @@ -318,20 +318,20 @@ layout="topleft" left="200" name="Redirect to Grid: " - top_pad="4" - width="88"> + top_pad="7" + width="90"> Redirect to Grid: </text> <line_editor border_style="line" border_thickness="1" follows="top|right" - height="16" + height="18" layout="topleft" left_pad="0" max_length_bytes="10" name="redirectx" - width="50"> + width="46"> <line_editor.commit_callback function="RegionTools.ChangeAnything" /> </line_editor> @@ -339,13 +339,13 @@ border_style="line" border_thickness="1" follows="top|right" - height="16" + height="18" layout="topleft" - left_pad="10" + left_pad="8" max_length_bytes="10" name="redirecty" top_delta="0" - width="40"> + width="46"> <line_editor.commit_callback function="RegionTools.ChangeAnything" /> </line_editor> @@ -407,10 +407,10 @@ label="Refresh" label_selected="Refresh" layout="topleft" - left="278" + left="280" name="Refresh" tool_tip="Click here to refresh the above information" - top_pad="10" + top_pad="14" width="110"> <button.commit_callback function="RegionTools.Refresh" /> @@ -526,7 +526,7 @@ height="16" label="Disable Physics" layout="topleft" - left_delta="120" + left_delta="136" name="disable physics" tool_tip="Set this to disable all physics in this region" top_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml index a51e7a844a..5dd3dfa2bf 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml @@ -27,7 +27,6 @@ left_pad="12" top_delta="2" name="multi_folder_txt" - font="SansSerifMedium" text_color="White" width="300"> Double-click on folder in multi-folder view: @@ -37,7 +36,6 @@ follows="left|top" top_pad="8" layout="topleft" - font="SansSerifMedium" left="60" width="300" height="66" @@ -90,7 +88,6 @@ left_pad="12" top_delta="2" name="single_folder_txt" - font="SansSerifMedium" text_color="White" width="300"> Double-click on folder in single-folder view: @@ -100,7 +97,6 @@ follows="left|top" top_pad="8" layout="topleft" - font="SansSerifMedium" left="60" width="300" height="44" @@ -142,10 +138,9 @@ layout="topleft" left_pad="13" name="find_original_txt" - font="SansSerifMedium" text_color="White" top_delta="1" - width="300"> + width="310"> Clicking on "Show in inventory" or "Find original" </text> <radio_group @@ -153,7 +148,6 @@ follows="left|top" top_pad="8" layout="topleft" - font="SansSerifMedium" left="60" width="300" height="44" @@ -196,7 +190,6 @@ left_pad="12" top_delta="2" name="favorites_txt" - font="SansSerifMedium" text_color="White" width="300"> Favorites @@ -206,7 +199,6 @@ layout="topleft" follows="left|top" top_pad="8" - font="SansSerifMedium" left="60" width="300" height="18" @@ -219,7 +211,6 @@ follows="left|top" top_pad="5" layout="topleft" - font="SansSerifMedium" left="60" width="150" height="18" @@ -232,7 +223,6 @@ follows="left|top" top_pad="5" layout="topleft" - font="SansSerifMedium" left="60" width="150" height="18" @@ -276,7 +266,6 @@ left_pad="12" top_delta="2" name="single_folder_txt" - font="SansSerifMedium" text_color="White" width="300"> Pressing enter on an avatar attachment diff --git a/indra/newview/skins/default/xui/en/floater_live_material_editor.xml b/indra/newview/skins/default/xui/en/floater_live_material_editor.xml index 5b7dab6a52..a104923f8d 100644 --- a/indra/newview/skins/default/xui/en/floater_live_material_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_live_material_editor.xml @@ -4,9 +4,9 @@ can_resize="true" default_tab_group="1" height="790" - width="256" + width="267" min_height="500" - min_width="256" + min_width="267" layout="topleft" name="material editor" help_topic="material_editor" @@ -17,7 +17,7 @@ top="18" left="4" height="768" - width="250" + width="261" follows="all" layout="topleft" color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/floater_material_editor.xml b/indra/newview/skins/default/xui/en/floater_material_editor.xml index 21ceeafeea..f894e94622 100644 --- a/indra/newview/skins/default/xui/en/floater_material_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_material_editor.xml @@ -4,9 +4,9 @@ can_resize="true" default_tab_group="1" height="891" - width="256" + width="267" min_height="500" - min_width="256" + min_width="267" layout="topleft" name="material editor" help_topic="material_editor" @@ -20,7 +20,7 @@ top="18" left="4" height="768" - width="250" + width="261" follows="all" layout="topleft" color="DkGray2" 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 39e9de0980..fb828b804a 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -1407,7 +1407,7 @@ follows="top|left" height="15" layout="topleft" - left="220" + left="240" name="pelvis_offset_label" text_color="White" top="8" @@ -1421,12 +1421,13 @@ max_val="3.0" name="pelvis_offset" top_pad="10" + left="340" value="0.0" width="80"/> <text follows="top|left" height="17" - left="425" + left="435" name="skin_too_many_joints" text_color="Orange" top="7" @@ -1437,7 +1438,7 @@ <text follows="top|left" height="32" - left="425" + left="435" name="skin_unknown_joint" text_color="Orange" top="8" @@ -1879,7 +1880,7 @@ Analysed: top="5" left_pad="20" name="label_display" - width="50"> + width="53"> Display... </text> <check_box @@ -1889,7 +1890,7 @@ Analysed: layout="topleft" left_delta="0" name="show_edges" - top_pad="8"> + top_pad="10"> </check_box> <check_box follows="top|left" @@ -1897,7 +1898,7 @@ Analysed: label_text.text_color="White" layout="topleft" name="show_physics" - top_pad="8"> + top_pad="10"> </check_box> <check_box follows="top|left" @@ -1905,7 +1906,7 @@ Analysed: label_text.text_color="White" layout="topleft" name="show_textures" - top_pad="8"> + top_pad="10"> </check_box> <check_box follows="top|left" @@ -1913,7 +1914,7 @@ Analysed: label_text.text_color="White" layout="topleft" name="show_skin_weight" - top_pad="8"> + top_pad="10"> </check_box> <check_box follows="top|left" @@ -1923,7 +1924,7 @@ Analysed: width="130" layout="topleft" name="show_joint_overrides" - top_pad="8"> + top_pad="10"> </check_box> <check_box follows="top|left" @@ -1931,7 +1932,7 @@ Analysed: label_text.text_color="White" layout="topleft" name="show_joint_positions" - top_pad="17"> + top_pad="21"> </check_box> <text follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_my_environments.xml b/indra/newview/skins/default/xui/en/floater_my_environments.xml index 8c9c450d7c..88fd8bf585 100644 --- a/indra/newview/skins/default/xui/en/floater_my_environments.xml +++ b/indra/newview/skins/default/xui/en/floater_my_environments.xml @@ -41,6 +41,7 @@ mouse_opaque="true" name="icon_settingsdays" left="4" + top="9" width="16" /> <check_box height="16" @@ -48,7 +49,7 @@ layout="topleft" left_pad="2" name="chk_days" - top_delta="0" + top_delta="2" width="60" /> <icon height="16" @@ -57,6 +58,7 @@ mouse_opaque="true" name="icon_settingsskies" left_pad="10" + top="9" width="16" /> <check_box height="16" @@ -64,7 +66,7 @@ layout="topleft" left_pad="2" name="chk_skies" - top_delta="0" + top_delta="2" width="60" /> <icon height="16" @@ -73,6 +75,7 @@ mouse_opaque="true" name="icon_settingswater" left_pad="10" + top="9" width="16" /> <check_box height="16" @@ -80,7 +83,7 @@ layout="topleft" left_pad="2" name="chk_water" - top_delta="0" + top_delta="2" width="60" /> <filter_editor follows="left|top|right" @@ -89,7 +92,7 @@ layout="topleft" left="4" name="flt_search" - top_pad="6" + top_pad="4" right="-4" /> </layout_panel> <layout_panel diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml index 881c1f7469..def57abfe4 100644 --- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml @@ -12,7 +12,7 @@ save_visibility="true" reuse_instance="true" title="INVENTORY" - width="418" > + width="424" > <panel class="sidepanel_inventory" name="main_panel" diff --git a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml index 9981e5d893..66c229e698 100644 --- a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml +++ b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater - height="130" + height="140" width="300" layout="topleft" name="floater_new_feature_notification" @@ -40,7 +40,7 @@ New feature text_color="White" layout="topleft" left="10" - height="40" + height="50" top_pad="14" right="-10" word_wrap="true" diff --git a/indra/newview/skins/default/xui/en/floater_performance.xml b/indra/newview/skins/default/xui/en/floater_performance.xml index dac8a71b2d..5fb9eeb2de 100644 --- a/indra/newview/skins/default/xui/en/floater_performance.xml +++ b/indra/newview/skins/default/xui/en/floater_performance.xml @@ -65,10 +65,10 @@ text_color="White" height="20" layout="topleft" - left="395" + left="392" top="7" name="fps_desc1_lbl" - width="150"> + width="153"> Allow 5-10 seconds for </text> <text @@ -78,7 +78,7 @@ layout="topleft" top_pad="-3" name="fps_desc2_lbl" - width="150"> + width="153"> changes to take full effect. </text> </panel> @@ -265,7 +265,7 @@ left="10" name="complexity_info" top_pad="0" - width="455"> + width="490"> Reduce the complexity of your avatar if you aren't satisfied with current FPS. </text> <icon diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 4b0e0bb221..b7d992bcb4 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -82,8 +82,8 @@ name="pref core" tab_group="1" tab_position="left" - tab_width="140" - tab_padding_right="0" + tab_width="136" + tab_padding_right="4" top="40" width="658"> <panel diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml index aff4111d35..af8e882f10 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml @@ -695,8 +695,8 @@ height="16" increment="1" initial_value="160" - label="Post Process Quality:" - label_width="145" + label="Sky:" + label_width="164" layout="topleft" left="420" min_val="0" @@ -782,7 +782,7 @@ control_name="RenderShadowDetail" height="18" layout="topleft" - left_delta="130" + left_delta="175" top_delta="0" name="ShadowDetail" width="150"> @@ -832,7 +832,7 @@ control_name="RenderReflectionProbeDetail" height="18" layout="topleft" - left_delta="130" + left_delta="175" top_delta="0" name="ReflectionDetail" width="150"> @@ -868,7 +868,7 @@ control_name="RenderReflectionProbeLevel" height="18" layout="topleft" - left_delta="130" + left_delta="175" top_delta="0" name="ReflectionLevel" width="150"> @@ -900,7 +900,7 @@ name="ReflectionProbeCount" text_readonly_color="LabelDisabledColor" top_delta="22" - width="128"> + width="130"> Max Reflection Probes: </text> @@ -909,7 +909,7 @@ height="18" layout="topleft" label="Max. Reflection Probes:" - left_delta="130" + left_delta="175" top_delta="0" name="ProbeCount" width="150"> @@ -943,7 +943,7 @@ increment="0.1" initial_value="160" label="Exposure:" - label_width="145" + label_width="164" layout="topleft" left="420" min_val="0.5" @@ -987,7 +987,7 @@ control_name="RenderHeroProbeResolution" height="18" layout="topleft" - left_delta="130" + left_delta="175" top_delta="0" name="MirrorResolution" width="150"> @@ -1027,7 +1027,7 @@ control_name="RenderHeroProbeUpdateRate" height="18" layout="topleft" - left_delta="130" + left_delta="175" top_delta="0" name="HeroProbeUpdateRate" width="150"> @@ -1058,7 +1058,7 @@ increment="0.1" initial_value="160" label="Sharpening:" - label_width="145" + label_width="164" layout="topleft" left="420" min_val="0.0" @@ -1087,7 +1087,7 @@ control_name="RenderTonemapType" height="18" layout="topleft" - left_delta="130" + left_delta="175" top_delta="0" name="TonemapType" width="150"> @@ -1109,7 +1109,7 @@ initial_value="1" label="Tone Mapping Mix:" tool_tip="Mix between linear and tone mapped colors" - label_width="145" + label_width="164" layout="topleft" left="420" min_val="0.0" diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml deleted file mode 100644 index dec0e9b6c6..0000000000 --- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater - border_visible="false" - border="false" - legacy_header_height="18" - can_minimize="true" - can_resize="false" - can_close="false" - chrome="true" - save_dock_state="true" - save_visibility="true" - save_rect="true" - single_instance="true" - bevel_style="in" - height="164" - layout="topleft" - name="floater_sound_devices" - title="SOUND DEVICES" - width="490"> - <panel - layout="topleft" - follows="all" - filename="panel_sound_devices.xml" - name="device_settings_panel" - width="400" - left="10" - top="26" - class="panel_voice_device_settings"/> - <text - name="voice_label" - top="136" - left="12" - height="14" - width="80" - layout="topleft" - >Voice Chat</text> - <check_box - layout="topleft" - control_name="EnableVoiceChat" - follows="bottom|left" - top="138" - left="80" - name="enable_voice" - width="100" - height="14" - label="Enabled" - /> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index 1600c422c3..191db4f854 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -418,6 +418,64 @@ </stat_view> </stat_view> </stat_view> + <stat_view name="voice" + label="Voice" + setting="OpenDebugStatVoice"> + <stat_bar + name="webrtc_latency" + label="Latency" + stat="webrtc_latency" + unit_label="ms" + decimal_digits="1"/> + <stat_bar + name="webrtc_upload_bandwidth" + label="Upload bandwidth" + stat="webrtc_upload_bandwidth" + unit_label="kbps" + decimal_digits="0"/> + <stat_view name="incoming_audio" + label="Incoming audio" + setting="OpenDebugStatVoiceIncoming"> + <stat_bar + name="incoming_packet_recv" + label="Packets received" + stat="webrtc_packets_in_recv"/> + <stat_bar + name="packets_in_lost" + label="Packets lost" + stat="webrtc_packets_in_lost"/> + <stat_bar + name="jitter_in" + label="Jitter" + stat="webrtc_jitter_in" + unit_label="ms" + decimal_digits="1"/> + <stat_bar + name="jitter_buffer" + label="Jitter buffer" + stat="webrtc_jitter_buffer" + unit_label="ms" + decimal_digits="1"/> + </stat_view> + <stat_view name="outgoing_audio" + label="Outgoing audio" + setting="OpenDebugStatVoiceOutgoing"> + <stat_bar + name="packets_out_sent" + label="Packets sent" + stat="webrtc_packets_out_sent"/> + <stat_bar + name="packets_out_lost" + label="Packets lost" + stat="webrtc_packets_out_lost"/> + <stat_bar + name="jitter_out" + label="Jitter" + stat="webrtc_jitter_out" + unit_label="ms" + decimal_digits="1"/> + </stat_view> + </stat_view> </container_view> </scroll_container> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml index 9d4fb82ec6..7108005f00 100644 --- a/indra/newview/skins/default/xui/en/floater_telehub.xml +++ b/indra/newview/skins/default/xui/en/floater_telehub.xml @@ -2,7 +2,7 @@ <!-- Explicit left edge to avoid overlapping build tools --> <floater legacy_header_height="18" - height="250" + height="260" layout="topleft" name="telehub" help_topic="telehub" diff --git a/indra/newview/skins/default/xui/en/floater_test_slapp.xml b/indra/newview/skins/default/xui/en/floater_test_slapp.xml index 5a13a0147e..35f5961285 100644 --- a/indra/newview/skins/default/xui/en/floater_test_slapp.xml +++ b/indra/newview/skins/default/xui/en/floater_test_slapp.xml @@ -17,7 +17,6 @@ follows="left|top|right" height="16" name="trusted_txt" - font="SansSerifMedium" text_color="white" layout="topleft" left="16"> diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index 023df69f0f..e736fc58b2 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -99,7 +99,7 @@ font.name="SansSerifSmall" name="test_text10" tool_tip="text"> - SansSerifSmall + SansSerif The 华文细黑 brown fox ヒラキjumped over the lazy dog. </text> <text @@ -111,7 +111,7 @@ font.name="SansSerifMedium" name="test_text11" tool_tip="text"> - SansSerif + SansSerifMedium The 华文细黑 brown fox ヒラキjumped over the lazy dog. </text> <text diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index d3a872c9d5..d94a6c71b5 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -84,11 +84,14 @@ left="10" name="button focus" tool_tip="Focus" - width="35"> - <button.commit_callback - function="BuildTool.setTool" - parameter="Focus" /> - </button> + width="35" + font="DejaVu" + font.size="LSmall" + pad_bottom="1"> + <button.commit_callback + function="BuildTool.setTool" + parameter="Focus" /> + </button> <button follows="left|top" height="25" @@ -99,7 +102,10 @@ left_pad="10" name="button move" tool_tip="Move" - width="35"> + width="35" + font="DejaVu" + font.size="LSmall" + pad_bottom="1"> <button.commit_callback function="BuildTool.setTool" parameter="Move" /> @@ -114,7 +120,10 @@ left_pad="10" name="button edit" tool_tip="Edit" - width="35"> + width="35" + font="DejaVu" + font.size="LSmall" + pad_bottom="1"> <button.commit_callback function="BuildTool.setTool" parameter="Edit" /> @@ -129,7 +138,10 @@ left_pad="10" name="button create" tool_tip="Create" - width="35"> + width="35" + font="DejaVu" + font.size="LSmall" + pad_bottom="1"> <button.commit_callback function="BuildTool.setTool" parameter="Create" /> @@ -144,7 +156,10 @@ left_pad="10" name="button land" tool_tip="Land" - width="35"> + width="35" + font="DejaVu" + font.size="LSmall" + pad_bottom="1"> <button.commit_callback function="BuildTool.setTool" parameter="Land" /> @@ -161,15 +176,19 @@ left="8" name="text status" top_pad="3" - width="285"> + width="285" + font="DejaVu" + font.size="LSmall"> Drag to move, shift-drag to copy </text> <radio_group layout="topleft" left="10" - height="70" - top="59" - name="focus_radio_group"> + height="70" + top="59" + name="focus_radio_group" + font="DejaVu" + font.size="LSmall" > <radio_item top_pad="6" label="Zoom" @@ -198,16 +217,20 @@ top_delta="-2" left_delta="100" name="slider zoom" - width="134"> + width="134" + font="DejaVu" + font.size="LSmall"> <slider_bar.commit_callback function="BuildTool.commitZoom"/> </slider_bar> <radio_group - left="10" - height="70" - top="59" + left="10" + height="70" + top="59" layout="topleft" - name="move_radio_group"> + name="move_radio_group" + font="DejaVu" + font.size="LSmall" > <radio_item top_pad="6" label="Move" @@ -232,7 +255,9 @@ top="55" height="70" layout="topleft" - name="edit_radio_group"> + name="edit_radio_group" + font="DejaVu" + font.size="LSmall" > <radio_item label="Move" layout="topleft" @@ -263,7 +288,9 @@ label="Edit linked" layout="topleft" name="checkbox edit linked parts" - top_pad="-18"> + top_pad="-18" + font="DejaVu" + font.size="LSmall"> <check_box.commit_callback function="BuildTool.selectComponent"/> </check_box> @@ -276,7 +303,10 @@ layout="topleft" left="143" name="link_btn" - width="50"> + width="50" + font="DejaVu" + font.size="LSmall" + pad_bottom="1"> <button.commit_callback function="BuildTool.LinkObjects"/> </button> @@ -287,7 +317,10 @@ layout="topleft" left_pad="2" name="unlink_btn" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall" + pad_bottom="1"> <button.commit_callback function="BuildTool.UnlinkObjects"/> </button> @@ -298,10 +331,12 @@ layout="topleft" left="143" name="checkbox uniform" - top="48" + top="47" label_text.wrap="true" label_text.width="100" - width="134" /> + width="134" + font="DejaVu" + font.size="LSmall" /> <check_box control_name="ScaleStretchTextures" height="19" @@ -310,18 +345,22 @@ layout="topleft" left="143" name="checkbox stretch textures" - top_pad="-4" + top_pad="-2" follows="left|top" - width="134" /> + width="134" + font="DejaVu" + font.size="LSmall" /> <check_box control_name="SnapEnabled" height="18" initial_value="true" label="Snap" layout="topleft" - top_pad="0" + top_pad="-1" name="checkbox snap to grid" - width="134" /> + width="134" + font="DejaVu" + font.size="LSmall"/> <combo_box height="20" layout="topleft" @@ -331,7 +370,9 @@ top="83" left="195" top_pad="0" - width="60"> + width="60" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall"> <combo_box.item label="World" name="World" @@ -577,7 +618,7 @@ layout="topleft" left_delta="0" name="checkbox copy selection" - top_delta="15" + top_delta="17" width="134" /> <check_box control_name="CreateToolCopyCenters" @@ -587,7 +628,7 @@ layout="topleft" left_delta="18" name="checkbox copy centers" - top="85" + top="92" width="134" /> <check_box control_name="CreateToolCopyRotates" @@ -596,7 +637,7 @@ layout="topleft" left_delta="0" name="checkbox copy rotates" - top_delta="16" + top_delta="17" width="134" /> <radio_group height="105" @@ -604,7 +645,9 @@ left="4" name="land_radio_group" top="54" - width="114"> + width="114" + font="DejaVu" + font.size="LSmall" > <radio_item height="19" label="Select Land" @@ -746,7 +789,8 @@ length="1" height="16" follows="left|top" - font="SansSerifSmall" + font="DejaVu" + font.size="LSmall" layout="topleft" left="10" name="selection_empty" @@ -760,7 +804,8 @@ length="1" height="16" follows="left|top" - font="SansSerifSmall" + font="DejaVu" + font.size="LSmall" layout="topleft" left="10" name="selection_faces" @@ -775,7 +820,8 @@ length="1" height="16" follows="left|top" - font="SansSerifSmall" + font="DejaVu" + font.size="LSmall" layout="topleft" left="10" name="selection_count" @@ -830,7 +876,9 @@ tab_height="25" open_tabs_on_drag_and_drop="true" top="173" - width="295"> + width="295" + font="DejaVu" + font.size="LSmall"> <panel border="false" @@ -904,7 +952,9 @@ left="10" name="Name:" top="5" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall"> Name: </text> <line_editor @@ -923,7 +973,9 @@ left="10" name="Description:" top_pad="3" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall"> Description: </text> <line_editor @@ -945,7 +997,9 @@ layout="topleft" name="Creator:" top_pad="7" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall"> Creator: </text> <avatar_icon @@ -967,7 +1021,6 @@ height="29" layout="topleft" name="Creator Name" - font="SansSerifSmall" top_delta="-1" translate="false" width="170" @@ -984,7 +1037,9 @@ layout="topleft" name="Owner:" top_pad="3" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall"> Owner: </text> <avatar_icon @@ -1015,7 +1070,8 @@ height="29" layout="topleft" name="Owner Name" - font="SansSerifSmall" + font="DejaVu" + font.size="LSmall" left_pad="1" top_delta="-1" translate="false" @@ -1033,7 +1089,9 @@ height="18" name="Group:" top_pad="3" - width="75"> + width="75" + font="DejaVu" + font.size="LSmall"> Group: </text> <name_box @@ -1053,7 +1111,10 @@ name="button set group" tab_stop="false" tool_tip="Choose a group to share this object's permissions" - width="23" /> + width="23" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <check_box height="19" follows="left|top" @@ -1063,7 +1124,9 @@ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." top_pad="5" left="100" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <button follows="top|left" height="23" @@ -1073,7 +1136,10 @@ name="button deed" left_pad="19" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer." - width="80" /> + width="80" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <text type="string" length="1" @@ -1083,7 +1149,9 @@ top_pad="10" left="10" name="label click action" - width="82"> + width="82" + font="DejaVu" + font.size="LSmall" > Click to: </text> <combo_box @@ -1093,7 +1161,9 @@ name="clickaction" width="130" left_pad="10" - tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" > + tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Touch (default)" name="Touch/grab(default)" @@ -1134,7 +1204,9 @@ name="checkbox for sale" left="7" width="97" - tool_tip="Lets people buy this object, its content or it copy inworld for specified price." /> + tool_tip="Lets people buy this object, its content or it copy inworld for specified price." + font="DejaVu" + font.size="LSmall" /> <!-- NEW PRICE SPINNER Objects are allowed to be for sale for L$0 to invoke buy UI behavior even though the user gets a free copy. @@ -1152,7 +1224,9 @@ even though the user gets a free copy. min_val="0" height="20" max_val="999999999" - tool_tip="Object cost." /> + tool_tip="Object cost." + font="DejaVu" + font.size="LSmall" /> <!-- NEW SALE TYPE COMBO BOX --> <combo_box left_pad="8" @@ -1166,7 +1240,9 @@ even though the user gets a free copy. mouse_opaque="true" name="sale type" width="89" - tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." > + tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item name="Copy" label="Copy" @@ -1188,7 +1264,9 @@ even though the user gets a free copy. layout="topleft" left="7" name="search_check" - tool_tip="Let people see this object in search results" /> + tool_tip="Let people see this object in search results" + font="DejaVu" + font.size="LSmall" /> <panel border="false" follows="left|top" @@ -1212,7 +1290,9 @@ even though the user gets a free copy. follows="left|top|right" layout="topleft" name="perm_modify" - width="264"> + width="264" + font="DejaVu" + font.size="LSmall" > You can modify this object </text> <text @@ -1220,7 +1300,9 @@ even though the user gets a free copy. follows="left|top" name="Anyone can:" width="250" - left="10"> + left="10" + font="DejaVu" + font.size="LSmall" > Anyone: </text> <check_box @@ -1230,7 +1312,9 @@ even though the user gets a free copy. name="checkbox allow everyone move" tool_tip="Anyone can move the object." left="10" - width="85" /> + width="85" + font="DejaVu" + font.size="LSmall" /> <check_box height="19" label="Copy" @@ -1238,14 +1322,18 @@ even though the user gets a free copy. left_pad="0" name="checkbox allow everyone copy" tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive." - width="90" /> + width="90" + font="DejaVu" + font.size="LSmall" /> <text type="string" follows="left|top" height="19" name="Next owner can:" width="250" - left="10"> + left="10" + font="DejaVu" + font.size="LSmall" > Next owner: </text> <check_box @@ -1256,7 +1344,9 @@ even though the user gets a free copy. height="10" name="checkbox next owner can modify" tool_tip="Next owner can edit properties like item name or scale of this object." - width="85" /> + width="85" + font="DejaVu" + font.size="LSmall" /> <check_box follows="left|top|right" height="19" @@ -1265,7 +1355,9 @@ even though the user gets a free copy. left_pad="0" name="checkbox next owner can copy" tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." - width="80" /> + width="80" + font="DejaVu" + font.size="LSmall" /> <check_box follows="left|top|right" height="19" @@ -1275,7 +1367,9 @@ even though the user gets a free copy. left_pad="0" top_delta="0" tool_tip="Next owner can give away or resell this object." - width="100" /> + width="100" + font="DejaVu" + font.size="LSmall" /> <!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, but that's OK, this is used only for debugging. --> <text @@ -1288,7 +1382,9 @@ even though the user gets a free copy. left="230" name="B:" height="10" - width="80"> + width="80" + font="DejaVu" + font.size="LSmall" > B: </text> <text @@ -1301,7 +1397,9 @@ even though the user gets a free copy. top_pad="2" name="O:" height="10" - width="80"> + width="80" + font="DejaVu" + font.size="LSmall" > O: </text> <text @@ -1314,7 +1412,9 @@ even though the user gets a free copy. top_pad="2" name="G:" height="10" - width="80"> + width="80" + font="DejaVu" + font.size="LSmall" > G: </text> <text @@ -1327,7 +1427,9 @@ even though the user gets a free copy. layout="topleft" name="E:" height="10" - width="80"> + width="80" + font="DejaVu" + font.size="LSmall" > E: </text> <text @@ -1340,7 +1442,9 @@ even though the user gets a free copy. top_pad="2" name="N:" height="10" - width="80"> + width="80" + font="DejaVu" + font.size="LSmall" > N: </text> <text @@ -1353,7 +1457,9 @@ even though the user gets a free copy. top_pad="2" name="F:" height="10" - width="80"> + width="80" + font="DejaVu" + font.size="LSmall" > F: </text> </panel> @@ -1373,7 +1479,9 @@ even though the user gets a free copy. name="pathfinding_attributes_label" top_pad="4" width="150" - left="10"> + left="10" + font="DejaVu" + font.size="LSmall" > Pathfinding attributes: </text> <text @@ -1383,7 +1491,9 @@ even though the user gets a free copy. name="pathfinding_attributes_value" width="130" word_wrap="false" - left_pad="0"> + left_pad="0" + font="DejaVu" + font.size="LSmall" > </text> </panel> </panel> @@ -1408,7 +1518,9 @@ even though the user gets a free copy. tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits." top_pad="5" left="10" - width="123" /> + width="123" + font="DejaVu" + font.size="LSmall" /> <check_box height="19" label="Physical" @@ -1416,7 +1528,9 @@ even though the user gets a free copy. name="Physical Checkbox Ctrl" tool_tip="Allows object to be pushed and affected by gravity" top_pad="0" - width="123" /> + width="123" + font="DejaVu" + font.size="LSmall" /> <check_box height="19" label="Temporary" @@ -1424,7 +1538,9 @@ even though the user gets a free copy. name="Temporary Checkbox Ctrl" tool_tip="Causes object to be deleted 1 minute after creation" top_pad="0" - width="123" /> + width="123" + font="DejaVu" + font.size="LSmall" /> <check_box height="19" label="Phantom" @@ -1432,7 +1548,9 @@ even though the user gets a free copy. name="Phantom Checkbox Ctrl" tool_tip="Causes object to not collide with other objects or avatars" top_pad="0" - width="123" /> + width="123" + font="DejaVu" + font.size="LSmall" /> <view_border bevel_style="none" follows="top|left" @@ -1441,7 +1559,9 @@ even though the user gets a free copy. left_delta="0" name="object_horizontal" top_pad="10" - width="95" /> + width="95" + font="DejaVu" + font.size="LSmall" /> <menu_button menu_filename="menu_copy_paste_pos.xml" follows="top|left" @@ -1465,7 +1585,9 @@ even though the user gets a free copy. tool_tip="Position (meters)" left_pad="8" top_delta="0" - width="121"> + width="121" + font="DejaVu" + font.size="LSmall" > Position (m) </text> <spinner @@ -1482,7 +1604,9 @@ even though the user gets a free copy. name="Pos X" text_enabled_color="1 0 0.3 .7" top_pad="8" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -1497,7 +1621,9 @@ even though the user gets a free copy. name="Pos Y" text_enabled_color="EmphasisColor" top_pad="3" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -1512,7 +1638,9 @@ even though the user gets a free copy. name="Pos Z" text_enabled_color="0 0.8 1 .65" top_pad="3" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <menu_button menu_filename="menu_copy_paste_size.xml" follows="top|left" @@ -1525,7 +1653,7 @@ even though the user gets a free copy. top_pad="13" name="clipboard_size_btn" tool_tip="Paste options" - width="19"/> + width="19" /> <text type="string" length="1" @@ -1536,7 +1664,9 @@ even though the user gets a free copy. top_delta="0" name="label size" tool_tip="Size (meters)" - width="121"> + width="121" + font="DejaVu" + font.size="LSmall" > Size (m) </text> <spinner @@ -1553,7 +1683,9 @@ even though the user gets a free copy. name="Scale X" text_enabled_color="1 1 1 1" top_pad="8" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -1568,7 +1700,9 @@ even though the user gets a free copy. name="Scale Y" text_enabled_color="1 1 1 1" top_pad="3" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -1583,7 +1717,9 @@ even though the user gets a free copy. name="Scale Z" text_enabled_color="1 1 1 1" top_pad="3" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <menu_button menu_filename="menu_copy_paste_rot.xml" follows="top|left" @@ -1607,7 +1743,9 @@ even though the user gets a free copy. top_delta="0" name="label rotation" tool_tip="Rotation (degrees)" - width="121"> + width="121" + font="DejaVu" + font.size="LSmall" > Rotation (°) </text> <spinner @@ -1625,7 +1763,9 @@ even though the user gets a free copy. name="Rot X" text_enabled_color="1 1 1 1" top_pad="8" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -1641,7 +1781,9 @@ even though the user gets a free copy. name="Rot Y" text_enabled_color="1 1 1 1" top_pad="3" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -1657,7 +1799,9 @@ even though the user gets a free copy. name="Rot Z" text_enabled_color="1 1 1 1" top_pad="3" - width="87" /> + width="87" + font="DejaVu" + font.size="LSmall" /> <!-- <text type="string" length="1" @@ -1686,7 +1830,9 @@ even though the user gets a free copy. name="comboBaseType" top="6" left="125" - width="125"> + width="125" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Box" name="Box" @@ -1742,7 +1888,9 @@ even though the user gets a free copy. left="125" name="text cut" top_pad="5" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Path Cut (begin/end) </text> <spinner @@ -1757,7 +1905,9 @@ even though the user gets a free copy. max_val="0.98" name="cut begin" top_pad="4" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="16" @@ -1770,7 +1920,9 @@ even though the user gets a free copy. min_val="0.02" name="cut end" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -1780,7 +1932,9 @@ even though the user gets a free copy. left="125" name="text hollow" top_pad="7" - width="68"> + width="68" + font="DejaVu" + font.size="LSmall" > Hollow </text> <text @@ -1791,7 +1945,9 @@ even though the user gets a free copy. layout="topleft" left_pad="10" name="text skew" - width="63"> + width="63" + font="DejaVu" + font.size="LSmall" > Skew </text> <spinner @@ -1805,7 +1961,9 @@ even though the user gets a free copy. max_val="95" name="Scale 1" top_pad="4" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -1818,7 +1976,9 @@ even though the user gets a free copy. min_val="-0.95" name="Skew" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -1828,7 +1988,9 @@ even though the user gets a free copy. left="125" name="Hollow Shape" top_pad="7" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Hollow Shape </text> <combo_box @@ -1837,7 +1999,9 @@ even though the user gets a free copy. left_delta="0" name="hole" top_pad="-2" - width="150"> + width="150" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Default" name="Default" @@ -1864,7 +2028,9 @@ even though the user gets a free copy. left_delta="0" name="text twist" top_pad="7" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Twist (begin/end) </text> <spinner @@ -1881,7 +2047,9 @@ even though the user gets a free copy. min_val="-180" name="Twist Begin" top_pad="4" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="0" follows="left|top" @@ -1896,7 +2064,9 @@ even though the user gets a free copy. min_val="-180" name="Twist End" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -1906,7 +2076,9 @@ even though the user gets a free copy. left="125" name="scale_taper" top_pad="7" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Taper </text> <text @@ -1919,7 +2091,9 @@ even though the user gets a free copy. left_delta="0" name="scale_hole" top_delta="0" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Hole Size </text> <spinner @@ -1935,7 +2109,9 @@ even though the user gets a free copy. min_val="-1" name="Taper Scale X" top_pad="4" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -1949,7 +2125,9 @@ even though the user gets a free copy. min_val="-1" name="Taper Scale Y" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -1959,7 +2137,9 @@ even though the user gets a free copy. left="125" name="text topshear" top_pad="5" - width="141"> + width="141" + font="DejaVu" + font.size="LSmall" > Top Shear </text> <spinner @@ -1976,7 +2156,9 @@ even though the user gets a free copy. min_val="-0.5" name="Shear X" top_pad="4" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -1991,7 +2173,9 @@ even though the user gets a free copy. min_val="-0.5" name="Shear Y" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <text visible="false" type="string" @@ -2002,7 +2186,9 @@ even though the user gets a free copy. left="125" name="advanced_cut" top_pad="7" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Profile Cut (begin/end) </text> <text @@ -2015,7 +2201,9 @@ even though the user gets a free copy. left_delta="0" name="advanced_dimple" top_delta="0" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Dimple (begin/end) </text> <text @@ -2027,7 +2215,9 @@ even though the user gets a free copy. left_delta="0" name="advanced_slice" top_delta="0" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Slice (begin/end) </text> <spinner @@ -2042,7 +2232,9 @@ even though the user gets a free copy. max_val="0.98" name="Path Limit Begin" top_pad="3" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2055,7 +2247,9 @@ even though the user gets a free copy. min_val="0.02" name="Path Limit End" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <text visible="false" type="string" @@ -2066,7 +2260,9 @@ even though the user gets a free copy. left="125" name="text taper2" top_pad="7" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Taper </text> <spinner @@ -2083,7 +2279,9 @@ even though the user gets a free copy. min_val="-1" name="Taper X" top_pad="3" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner visible="false" decimal_digits="2" @@ -2098,7 +2296,9 @@ even though the user gets a free copy. min_val="-1" name="Taper Y" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <text visible="false" type="string" @@ -2109,7 +2309,9 @@ even though the user gets a free copy. left="125" name="text radius delta" top_pad="7" - width="78"> + width="78" + font="DejaVu" + font.size="LSmall" > Radius </text> <text @@ -2121,7 +2323,9 @@ even though the user gets a free copy. layout="topleft" left_delta="78" name="text revolutions" - width="68"> + width="68" + font="DejaVu" + font.size="LSmall" > Revolutions </text> <spinner @@ -2135,7 +2339,9 @@ even though the user gets a free copy. min_val="-1" name="Radius Offset" top_pad="4" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <spinner visible="false" decimal_digits="2" @@ -2148,7 +2354,9 @@ even though the user gets a free copy. min_val="1" name="Revolutions" top_delta="0" - width="68" /> + width="68" + font="DejaVu" + font.size="LSmall" /> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2161,7 +2369,9 @@ even though the user gets a free copy. tool_tip="Click to choose a picture" top="70" visible="false" - width="145" /> + width="145" + caption_text.font="DejaVu" + caption_text.font.size="LSmall" /> <check_box height="19" label="Mirror" @@ -2171,7 +2381,9 @@ even though the user gets a free copy. tool_tip="Flips sculpted prim along the X axis" top_pad="8" visible="false" - width="130" /> + width="130" + font="DejaVu" + font.size="LSmall" /> <check_box height="19" label="Inside-out" @@ -2181,7 +2393,9 @@ even though the user gets a free copy. tool_tip="Inverts the sculpted prims normals, making it appear inside-out" top_pad="4" visible="false" - width="121" /> + width="121" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -2192,7 +2406,9 @@ even though the user gets a free copy. name="label sculpt type" top_pad="10" visible="false" - width="130"> + width="130" + font="DejaVu" + font.size="LSmall" > Stitching type </text> <combo_box @@ -2202,7 +2418,9 @@ even though the user gets a free copy. name="sculpt type control" top_pad="4" visible="false" - width="150"> + width="150" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Sphere" name="Sphere" @@ -2259,7 +2477,9 @@ even though the user gets a free copy. name="select_single" top="5" width="252" - word_wrap="true"> + word_wrap="true" + font="DejaVu" + font.size="LSmall" > Select only one primitive to edit features. </text> <text @@ -2271,7 +2491,9 @@ even though the user gets a free copy. left="10" name="edit_object" top="5" - width="252"> + width="252" + font="DejaVu" + font.size="LSmall" > Edit object features: </text> <check_box @@ -2282,7 +2504,9 @@ even though the user gets a free copy. name="Animated Mesh Checkbox Ctrl" tool_tip="Allows rigged mesh objects to be animated independently" top_pad="10" - width="121" /> + width="121" + font="DejaVu" + font.size="LSmall" /> <check_box height="10" label="Flexible Path" @@ -2292,7 +2516,9 @@ even though the user gets a free copy. name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)" top_pad="15" - width="121" /> + width="121" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2305,7 +2531,9 @@ even though the user gets a free copy. max_val="3" name="FlexNumSections" top_pad="10" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2319,7 +2547,9 @@ even though the user gets a free copy. min_val="-10" name="FlexGravity" top_pad="4" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2332,7 +2562,9 @@ even though the user gets a free copy. max_val="10" name="FlexFriction" top_pad="4" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2345,7 +2577,9 @@ even though the user gets a free copy. max_val="10" name="FlexWind" top_pad="4" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2358,7 +2592,9 @@ even though the user gets a free copy. max_val="10" name="FlexTension" top_pad="4" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2372,7 +2608,9 @@ even though the user gets a free copy. min_val="-10" name="FlexForceX" top_pad="4" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2386,7 +2624,9 @@ even though the user gets a free copy. min_val="-10" name="FlexForceY" top_pad="4" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -2400,7 +2640,9 @@ even though the user gets a free copy. min_val="-10" name="FlexForceZ" top_pad="4" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <view_border bevel_style="none" follows="top|left" @@ -2409,7 +2651,9 @@ even though the user gets a free copy. left="8" name="object_horizontal" top_pad="10" - width="278" /> + width="278" + font="DejaVu" + font.size="LSmall" /> <check_box height="16" label="Light" @@ -2418,7 +2662,9 @@ even though the user gets a free copy. name="Light Checkbox Ctrl" tool_tip="Causes object to emit light" top_pad="8" - width="60" /> + width="60" + font="DejaVu" + font.size="LSmall" /> <color_swatch can_apply_immediately="true" color="0.5 0.5 0.5 1" @@ -2430,7 +2676,9 @@ even though the user gets a free copy. top_pad="-17" name="colorswatch" tool_tip="Click to open color picker" - width="40" /> + width="40" + font="DejaVu" + font.size="LSmall" /> <texture_picker allow_no_texture="true" top_delta="0" @@ -2443,7 +2691,9 @@ even though the user gets a free copy. mouse_opaque="true" name="light texture control" tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)" - width="32" /> + width="32" + caption_text.font="DejaVu" + caption_text.font.size="LSmall" /> <menu_button menu_filename="menu_copy_paste_light.xml" follows="top|left" @@ -2467,7 +2717,9 @@ even though the user gets a free copy. left="10" name="Light Intensity" top_pad="26" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner bottom_delta="0" decimal_digits="3" follows="left|top" @@ -2481,7 +2733,9 @@ even though the user gets a free copy. min_val="0" mouse_opaque="true" name="Light FOV" - width="120" /> + width="120" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" initial_value="5" @@ -2492,7 +2746,9 @@ even though the user gets a free copy. max_val="20" name="Light Radius" top_pad="3" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner bottom_delta="0" decimal_digits="3" follows="left|top" @@ -2506,7 +2762,9 @@ even though the user gets a free copy. min_val="-20" mouse_opaque="true" name="Light Focus" - width="120" /> + width="120" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" increment="0.25" @@ -2518,7 +2776,9 @@ even though the user gets a free copy. max_val="2" name="Light Falloff" top_pad="3" - width="128" /> + width="128" + font="DejaVu" + font.size="LSmall" /> <spinner bottom_delta="0" decimal_digits="3" follows="left|top" @@ -2532,7 +2792,9 @@ even though the user gets a free copy. min_val="0" mouse_opaque="true" name="Light Ambiance" - width="120" /> + width="120" + font="DejaVu" + font.size="LSmall" /> <check_box height="16" label="Reflection Probe" @@ -2541,15 +2803,19 @@ even though the user gets a free copy. name="Reflection Probe" tool_tip="Adjusts how objects within this volume receive reflections when PBR is enabled" top_pad="10" - width="60" /> + width="60" + font="DejaVu" + font.size="LSmall" /> <combo_box height="19" top_delta="0" - left="144" + left="144" follows="left|top" name="Probe Volume Type" tool_tip="Choose the probe influence volume" - width="140"> + width="140" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Sphere" name="Sphere" @@ -2568,7 +2834,9 @@ even though the user gets a free copy. name="Probe Dynamic" tool_tip="When enabled, Avatars will appear in reflections within this probe's influence volume." bottom_delta="19" - width="60" /> + width="60" + font="DejaVu" + font.size="LSmall" /> <text bottom_delta="-8" @@ -2580,7 +2848,9 @@ even though the user gets a free copy. left="10" name="Probe Update Label" text_readonly_color="LabelDisabledColor" - width="100"> + width="100" + font="DejaVu" + font.size="LSmall" > Probe Update </text> <combo_box @@ -2590,7 +2860,9 @@ even though the user gets a free copy. follows="left|top" name="Probe Update Type" tool_tip="Determines how the probe updates. Static updates the slowest and without avatars. Dynamic updates more frequently, with avatars visible in the probes. Mirror (Environment) turns this probe into a realtime planar projected probe that only reflects the environment, but does not calculate ambiance. Mirror (Everything) is similar to Mirror (Environment), but it reflects particles and avatars." - width="140"> + width="140" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Static" name="Static" @@ -2621,7 +2893,9 @@ even though the user gets a free copy. min_val="0" mouse_opaque="true" name="Probe Ambiance" - width="120" /> + width="120" + font="DejaVu" + font.size="LSmall" /> <spinner bottom_delta="0" decimal_digits="3" follows="left|top" @@ -2635,7 +2909,9 @@ even though the user gets a free copy. min_val="0" mouse_opaque="true" name="Probe Near Clip" - width="120" /> + width="120" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -2644,7 +2920,9 @@ even though the user gets a free copy. layout="topleft" name="label physicsshapetype" top="38" - width="121"> + width="121" + font="DejaVu" + font.size="LSmall" > Physics Shape Type: </text> <combo_box @@ -2654,13 +2932,17 @@ even though the user gets a free copy. follows="left|top" name="Physics Shape Type Combo Ctrl" tool_tip="Choose the physics shape type" - width="108"/> + width="108" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" /> <combo_box height="19" layout="topleft" name="material" top_pad="5" - width="150"> + width="150" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Stone" name="Stone" @@ -2703,7 +2985,9 @@ even though the user gets a free copy. max_val="28" name="Physics Gravity" top_pad="10" - width="132" /> + width="132" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" @@ -2718,7 +3002,9 @@ even though the user gets a free copy. min_val="0" name="Physics Friction" top_pad="4" - width="132" /> + width="132" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" @@ -2734,7 +3020,9 @@ even though the user gets a free copy. min_val="1" name="Physics Density" top_pad="4" - width="132" /> + width="132" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" @@ -2749,7 +3037,9 @@ even though the user gets a free copy. min_val="0" name="Physics Restitution" top_pad="8" - width="132" /> + width="132" + font="DejaVu" + font.size="LSmall" /> </panel> <panel label="Texture" @@ -2777,7 +3067,10 @@ even though the user gets a free copy. left="8" name="button new script" top="10" - width="134" /> + width="134" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <button follows="left|top" height="23" @@ -2785,7 +3078,10 @@ even though the user gets a free copy. layout="topleft" left_pad="8" name="button permissions" - width="134" /> + width="134" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <filter_editor follows="left|top|right" label="Enter filter text" @@ -2822,7 +3118,8 @@ even though the user gets a free copy. <text type="string" length="1" - font="SansSerifBig" + font="DejaVu" + font.size="Small" follows="left|top" height="19" layout="topleft" @@ -2841,7 +3138,9 @@ even though the user gets a free copy. left="30" name="label_area_price" top="48" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Price: L$[PRICE] for [AREA] m² </text> <text @@ -2853,7 +3152,9 @@ even though the user gets a free copy. left_delta="0" name="label_area" top_delta="0" - width="150"> + width="150" + font="DejaVu" + font.size="LSmall" > Area: [AREA] m² </text> <button @@ -2865,7 +3166,10 @@ even though the user gets a free copy. left_delta="0" name="button about land" top_pad="4" - width="125" /> + width="125" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <check_box control_name="ShowParcelOwners" height="19" @@ -2875,11 +3179,14 @@ even though the user gets a free copy. name="checkbox show owners" tool_tip="Colorize the parcels according to the type of owner: Green = Your land Aqua = Your group's land Red = Owned by others Yellow = For sale Purple = For auction Grey = Public" top_pad="8" - width="205" /> + width="205" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" - font="SansSerifBig" + font="DejaVu" + font.size="Small" follows="left|top" height="19" layout="topleft" @@ -2898,7 +3205,10 @@ even though the user gets a free copy. left="30" name="button subdivide land" top="172" - width="125" /> + width="125" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <button follows="left|top" height="23" @@ -2908,11 +3218,15 @@ even though the user gets a free copy. left_delta="0" name="button join land" top_pad="4" - width="125" /> + width="125" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <text type="string" length="1" - font="SansSerifBig" + font="DejaVu" + font.size="Small" follows="left|top" height="19" layout="topleft" @@ -2931,7 +3245,10 @@ even though the user gets a free copy. left="30" name="button buy land" top="276" - width="125" /> + width="125" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> <button follows="left|top" height="23" @@ -2941,7 +3258,10 @@ even though the user gets a free copy. left_delta="0" name="button abandon land" top_pad="4" - width="125" /> + width="125" + font="DejaVu" + font.size="LSmall" + pad_bottom="1" /> </panel> <!-- end of tabs --> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml index 7fe9830d23..d75d2e0db7 100644 --- a/indra/newview/skins/default/xui/en/floater_toybox.xml +++ b/indra/newview/skins/default/xui/en/floater_toybox.xml @@ -16,7 +16,6 @@ width="650"> <text follows="left|top" - font="SansSerifMedium" valign="top" halign="left" height="20" @@ -31,7 +30,6 @@ </text> <text follows="left|top" - font="SansSerifMedium" valign="top" halign="left" height="20" @@ -49,7 +47,7 @@ button_display_mode="icons_with_text" follows="all" left="20" - button_icon_and_text.button_width.max="140" + button_icon_and_text.button_width.max="172" button_icon_and_text.button_width.min="70" name="toybox_toolbar" pad_left="5" diff --git a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml index c0d260ef59..279a05748d 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_chat_volume.xml @@ -22,7 +22,7 @@ increment="0.025" initial_value="0.5" label="Voice Chat" - label_width="60" + label_width="62" layout="topleft" left="15" top="50" diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml deleted file mode 100644 index d037bdb813..0000000000 --- a/indra/newview/skins/default/xui/en/floater_voice_effect.xml +++ /dev/null @@ -1,162 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater - legacy_header_height="27" - can_resize="true" - height="500" - name="voice_effects" - help_topic="voice_effects" - title="VOICE MORPHING PREVIEW" - background_visible="true" - label="Places" - layout="topleft" - min_height="360" - min_width="200" - save_rect="true" - width="300"> - <string name="no_voice_effect"> - (No Voice Morph) - </string> - <string name="active_voice_effect"> - (Active) - </string> - <string name="unsubscribed_voice_effect"> - (Unsubscribed) - </string> - <string name="new_voice_effect"> - (New!) - </string> - - <!-- effect names begin --> - <string name="effect_Arena">Arena</string> - <string name="effect_Beast">Beast</string> - <string name="effect_Buff">Buff</string> - <string name="effect_Buzz">Buzz</string> - <string name="effect_Camille">Camille</string> - <string name="effect_Creepy">Creepy</string> - <string name="effect_CreepyBot">CreepyBot</string> - <string name="effect_Cyber">Cyber</string> - <string name="effect_DeepBot">DeepBot</string> - <string name="effect_Demon">Demon</string> - <string name="effect_Female Elf">Female Elf</string> - <string name="effect_Flirty">Flirty</string> - <string name="effect_Foxy">Foxy</string> - <string name="effect_Halloween 2010 Bonus">Halloween_2010_Bonus</string> - <string name="effect_Helium">Helium</string> - <string name="effect_Husky">Husky</string> - <string name="effect_Husky Whisper">Husky Whisper</string> - <string name="effect_Intercom">Intercom</string> - <string name="effect_Julia">Julia</string> - <string name="effect_Lo Lilt">Lo Lilt</string> - <string name="effect_Macho">Macho</string> - <string name="effect_Micro">Micro</string> - <string name="effect_Mini">Mini</string> - <string name="effect_Model">Model</string> - <string name="effect_Nano">Nano</string> - <string name="effect_Nightmare">Nightmare</string> - <string name="effect_PopBot">PopBot</string> - <string name="effect_Rachel">Rachel</string> - <string name="effect_Radio">Radio</string> - <string name="effect_Robot">Robot</string> - <string name="effect_Roxanne">Roxanne</string> - <string name="effect_Rumble">Rumble</string> - <string name="effect_Sabrina">Sabrina</string> - <string name="effect_Samantha">Samantha</string> - <string name="effect_Sexy">Sexy</string> - <string name="effect_Shorty">Shorty</string> - <string name="effect_Smaller">Smaller</string> - <string name="effect_Sneaky">Sneaky</string> - <string name="effect_Stallion">Stallion</string> - <string name="effect_Sultry">Sultry</string> - <string name="effect_Thunder">Thunder</string> - <string name="effect_Vixen">Vixen</string> - <string name="effect_WhinyBot">WhinyBot</string> - <!-- effect names end --> - - <text - height="16" - word_wrap="true" - use_ellipses="true" - type="string" - follows="left|top|right" - layout="topleft" - font="SansSerifBold" - color="White" - left="10" - name="preview_text" - right="-10" - top="27">To Preview - </text> - <text - height="23" - word_wrap="true" - use_ellipses="true" - type="string" - follows="left|top|right" - layout="topleft" - left="10" - name="status_text" - right="-5" - top_pad="0"> -Record a sample, then click on a voice to hear how it will sound. - </text> - <button - follows="left|top" - height="23" - label="Record" - layout="topleft" - left="10" - name="record_btn" - tool_tip="Record a sample of your voice." - top_pad="5" - width="100"> - <button.commit_callback - function="VoiceEffect.Record" /> - </button> - <button - follows="left|top" - height="23" - label="Stop" - layout="topleft" - left_delta="0" - name="record_stop_btn" - top_delta="0" - width="100"> - <button.commit_callback - function="VoiceEffect.Stop" /> - </button> - <text - height="23" - halign="right" - use_ellipses="true" - type="string" - follows="left|top|right" - layout="topleft" - left_pad="10" - top_delta="10" - name="voice_morphing_link" - right="-10"> - [[URL] Subscribe Now] - </text> - <scroll_list - bottom="-10" - draw_heading="true" - follows="all" - layout="topleft" - left="10" - multi_select="false" - name="voice_effect_list" - right="-10" - tool_tip="Record a sample of your voice, then click an effect to preview." - top="95"> - <scroll_list.columns - label="Voice Name" - name="name" - relative_width="0.60" /> - <scroll_list.columns - dynamic_width="true" - label="Expires" - name="expires" - relative_width="0.30" /> - </scroll_list> - -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml index 4e75b2b29c..fdc1e64e05 100644 --- a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml +++ b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml @@ -10,12 +10,12 @@ title="WHITELIST ENTRY" width="390"> - <text type="string" length="1" bottom="20" follows="top|left" height="15" layout="topleft" - left="10" name="media_label" top="20"> + <text type="string" length="1" follows="top|left|right" height="30" layout="topleft" + left="10" name="media_label" top="20" right="-10" word_wrap="true"> Enter a URL or URL pattern to add to the list of allowed domains </text> - <line_editor bottom_delta="40" enabled="true" follows="left|top" font="SansSerif" + <line_editor bottom_delta="15" enabled="true" follows="left|top" font="SansSerif" height="20" left="10" name="whitelist_entry" tool_tip="Enter a URL or URL pattern to White List" width="350" /> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index b0635a2229..4e64b09c1e 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -167,7 +167,7 @@ follows="top|right" halign="left" height="16" - top_delta="-2" + top_delta="-5" left_pad="7" layout="topleft" name="person_label" @@ -181,9 +181,9 @@ layout="topleft" left="3" name="infohub_chk" - top_pad="3" + top_pad="7" width="22" /> - <icon + <icon follows="top|right" height="16" image_name="map_infohub.tga" @@ -191,7 +191,7 @@ left_pad="0" mouse_opaque="true" name="infohub" - top_delta="0" + top_delta="-3" width="16" /> <text type="string" @@ -199,7 +199,7 @@ follows="top|right" halign="left" height="16" - top_delta="2" + top_delta="0" left_pad="3" layout="topleft" name="infohub_label" @@ -213,7 +213,7 @@ layout="topleft" left="3" name="land_for_sale_chk" - top_pad="2" + top_pad="8" width="22" /> <icon follows="top|right" @@ -222,16 +222,16 @@ layout="topleft" mouse_opaque="true" name="landforsale" - top_delta="0" + top_delta="-3" left_pad="0" width="16" /> - <text + <text type="string" length="1" follows="top|right" halign="left" height="16" - top_delta="2" + top_delta="1" left_pad="3" layout="topleft" name="land_sale_label" @@ -257,7 +257,7 @@ layout="topleft" left_pad="0" name="auction_label" - top_delta="3" + top_delta="1" width="170"> land auction </text> @@ -270,7 +270,7 @@ mouse_opaque="true" name="square2_owner" left="20" - top_pad="-5" + top_pad="-2" width="16" /> <text type="string" @@ -280,7 +280,7 @@ layout="topleft" left_pad="0" name="by_owner_label" - top_delta="3" + top_delta="0" width="100"> by owner </text> @@ -290,7 +290,7 @@ control_name="MapShowGridCoords" layout="topleft" follows="top|right" - top_pad="2" + top_pad="5" left="3" height="16" width="22" @@ -300,8 +300,8 @@ type="string" layout="topleft" follows="top|right" - top_delta="2" - left_pad="3" + top_delta="-2" + left_pad="2" height="16" width="220" halign="left" @@ -357,7 +357,7 @@ height="16" layout="topleft" left="135" - top_pad="1" + top_pad="5" name="event_chk" width="22" /> <icon @@ -367,6 +367,7 @@ layout="topleft" mouse_opaque="true" name="event" + top_delta="-2" left_pad="0" width="18" /> <text @@ -375,7 +376,7 @@ follows="top|right" halign="left" height="16" - top_delta="2" + top_delta="0" left_pad="3" layout="topleft" name="pg_label" @@ -391,7 +392,7 @@ layout="topleft" left="135" name="events_mature_chk" - top_pad="3" + top_pad="7" width="22" /> <icon follows="top|right" @@ -400,16 +401,16 @@ layout="topleft" mouse_opaque="true" name="events_mature_icon" - top_delta="0" + top_delta="-2" left_pad="0" width="18" /> - <text + <text type="string" length="1" follows="top|right" halign="left" height="16" - top_delta="2" + top_delta="0" left_pad="3" layout="topleft" name="events_mature_label" @@ -424,7 +425,7 @@ layout="topleft" left="135" name="events_adult_chk" - top_pad="3" + top_pad="7" width="22" /> <icon follows="top|right" @@ -434,15 +435,15 @@ left_pad="0" mouse_opaque="true" name="events_adult_icon" - top_delta="0" + top_delta="-2" width="18" /> - <text + <text type="string" length="1" follows="top|right" halign="left" height="16" - top_delta="2" + top_delta="0" left_pad="3" layout="topleft" name="events_adult_label" diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 45ec1e27f1..1ad01ee120 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <fonts> - <font name="default" comment="default font files (global fallbacks)"> - <file>DejaVuSans.ttf</file> + <font + name="default" + comment="default font files (global fallbacks)"> + <file load_collection="true" font_weight="400">InterVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans.ttf</file> <file functor="is_emoji">TwemojiSVG.ttf</file> <os name="Windows"> <file>meiryo.TTC</file> @@ -31,9 +34,11 @@ </os> </font> - <font name="SansSerifBold" - comment="Name of bold sans-serif font"> - <file>DejaVuSans-Bold.ttf</file> + <font + name="SansSerifBold" + comment="Name of bold sans-serif font"> + <file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans-Bold.ttf</file> <os name="Windows"> <file>arialbd.ttf</file> </os> @@ -42,8 +47,11 @@ </os> </font> - <font name="SansSerif" comment="Name of san-serif font (Truetype file name)"> - <file>DejaVuSans.ttf</file> + <font + name="SansSerif" + comment="Name of san-serif font (Truetype file name)"> + <file load_collection="true" font_weight="400">InterVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans.ttf</file> <os name="Windows"> <file>arial.ttf</file> </os> @@ -52,31 +60,38 @@ </os> </font> - <font name="SansSerif" - comment="Name of bold sans-serif font" - font_style="BOLD"> - <file>DejaVuSans-Bold.ttf</file> + <font + name="SansSerif" + comment="Name of bold sans-serif font" + font_style="BOLD"> + <file load_collection="true" flags="bold" font_weight="700">InterVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans-Bold.ttf</file> </font> - <font name="SansSerif" - comment="Name of italic sans-serif font" - font_style="ITALIC"> - <file>DejaVuSans-Oblique.ttf</file> + <font + name="SansSerif" + comment="Name of italic sans-serif font" + font_style="ITALIC"> + <file load_collection="true" font_weight="400">InterItalicVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans-Oblique.ttf</file> </font> - <font name="SansSerif" - comment="Name of bold italic sans-serif font" - font_style="BOLD|ITALIC"> - <file>DejaVuSans-BoldOblique.ttf</file> + <font + name="SansSerif" + comment="Name of bold italic sans-serif font" + font_style="BOLD|ITALIC"> + <file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans-BoldOblique.ttf</file> </font> <font name="Emoji" comment="Name of emoji font"> <file>TwemojiSVG.ttf</file> </font> - - <font name="Monospace" - comment="Name of monospace font"> + + <font + name="Monospace" + comment="Name of monospace font"> <file>DejaVuSansMono.ttf</file> </font> @@ -103,9 +118,11 @@ <file>DejaVuSans-BoldOblique.ttf</file> </font> - <font name="Helvetica" - comment="Name of Helvetica font"> - <file>DejaVuSans.ttf</file> + <font + name="Helvetica" + comment="Name of Helvetica font"> + <file font_weight="400">InterVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans.ttf</file> <os name="Windows"> <file>arial.ttf</file> </os> @@ -114,10 +131,12 @@ </os> </font> - <font name="Helvetica" - comment="Name of Helvetica font (bold)" - font_style="BOLD"> - <file>DejaVuSans-Bold.ttf</file> + <font + name="Helvetica" + comment="Name of Helvetica font (bold)" + font_style="BOLD"> + <file flags="bold" font_weight="700">InterVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans-Bold.ttf</file> <os name="Windows"> <file>arialbd.ttf</file> </os> @@ -126,10 +145,12 @@ </os> </font> - <font name="Helvetica" - comment="Name of Helvetica font (italic)" - font_style="ITALIC"> - <file>DejaVuSans-Oblique.ttf</file> + <font + name="Helvetica" + comment="Name of Helvetica font (italic)" + font_style="ITALIC"> + <file font_weight="400">InterItalicVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans-Oblique.ttf</file> <os name="Windows"> <file>ariali.ttf</file> </os> @@ -138,10 +159,12 @@ </os> </font> - <font name="Helvetica" - comment="Name of Helvetica font (bold italic)" - font_style="BOLD|ITALIC"> - <file>DejaVuSans-BoldOblique.ttf</file> + <font + name="Helvetica" + comment="Name of Helvetica font (bold italic)" + font_style="BOLD|ITALIC"> + <file font_weight="800">InterItalicVariableFont.ttf</file> + <file size_delta="-0.5">DejaVuSans-BoldOblique.ttf</file> <os name="Windows"> <file>arialbi.ttf</file> </os> @@ -150,33 +173,38 @@ </os> </font> - <font name="OverrideTest" - comment="Name of font to test overriding"> + <font + name="OverrideTest" + comment="Name of font to test overriding"> <file>times.ttf</file> - <file>DejaVuSans.ttf</file> + <file font_weight="400">InterVariableFont.ttf</file> </font> <font_size name="Monospace" - comment="Size for monospaced font (points, or 1/72 of an inch)" - size="8.0" - /> + comment="Size for monospaced font (points, or 1/72 of an inch)" + size="8.0" + /> <font_size name="Huge" - comment="Size of huge font (points, or 1/72 of an inch)" - size="16.0" - /> + comment="Size of huge font (points, or 1/72 of an inch)" + size="16.0" + /> <font_size name="Large" - comment="Size of large font (points, or 1/72 of an inch)" - size="10.6" - /> + comment="Size of large font (points, or 1/72 of an inch)" + size="11.0" + /> <font_size name="Medium" - comment="Size of medium font (points, or 1/72 of an inch)" - size="8.6" - /> + comment="Size of medium font (points, or 1/72 of an inch)" + size="10" + /> <font_size name="Small" - comment="Size of small font (points, or 1/72 of an inch)" - size="7.6" - /> - <font_size name="SmallLSL" + comment="Size of small font (points, or 1/72 of an inch)" + size="9" + /> + <font_size name="LSmall" + comment="Legacy size of small font (points, or 1/72 of an inch)" + size="7.6" + /> +<font_size name="SmallLSL" comment="Size of small font for LSL editor (points, or 1/72 of an inch)" size="7" /> diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index c190d9610f..226454df7c 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -9,7 +9,7 @@ bg_opaque_image="Inspector_Background" can_close="false" can_minimize="false" - height="158" + height="188" layout="topleft" name="inspect_group" single_instance="true" @@ -47,7 +47,7 @@ </text> <text follows="all" - height="45" + height="65" left="8" name="group_details" use_ellipses="true" @@ -80,7 +80,7 @@ L$123 to join height="23" label="Join" left="8" - top="125" + top="156" name="join_btn" width="103" commit_callback.function="InspectGroup.Join"/> @@ -89,7 +89,7 @@ L$123 to join height="23" label="Leave" left="8" - top="125" + top="156" name="leave_btn" width="103" commit_callback.function="InspectGroup.Leave"/> @@ -98,7 +98,7 @@ L$123 to join height="23" label="View Profile" name="view_profile_btn" - top="125" + top="156" left="117" width="103" commit_callback.function="InspectGroup.ViewProfile" /> diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index d978619355..c9adf46ad7 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -48,6 +48,28 @@ <menu_item_call.on_click function="Object.ShowOriginal" /> </menu_item_call> + <menu_item_call + label="Add to favorites" + layout="topleft" + name="Add to favorites"> + <menu_item_call.on_click + function="Object.SetFavorite" + parameter="Add" /> + <menu_item_call.on_visible + function="Object.EnableFavorites" + parameter="Add"/> + </menu_item_call> + <menu_item_call + label="Remove from favorites" + layout="topleft" + name="Remove from favorites"> + <menu_item_call.on_click + function="Object.SetFavorite" + parameter="Remove" /> + <menu_item_call.on_visible + function="Object.EnableFavorites" + parameter="Remove" /> + </menu_item_call> <menu_item_separator layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index 62cdaa5886..5a28f0dde5 100644 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -176,57 +176,60 @@ <on_click function="Group.DoToSelected" parameter="leave_group"/> <on_enable function="Avatar.EnableItem" parameter="can_leave_group" /> </menu_item_call> - <menu_item_separator layout="topleft" name="Moderator Options Separator"/> - <context_menu - label="Moderator Options" - layout="topleft" - name="Moderator Options"> - <menu_item_check - label="Allow text chat" - layout="topleft" - name="AllowTextChat"> - <on_check function="Avatar.CheckItem" parameter="is_allowed_text_chat" /> - <on_click function="Avatar.DoToSelected" parameter="toggle_allow_text_chat" /> - <on_enable function="Avatar.EnableItem" parameter="can_allow_text_chat" /> - </menu_item_check> - <menu_item_separator layout="topleft" name="moderate_voice_separator" /> - <menu_item_call - label="Mute this participant" - layout="topleft" - name="ModerateVoiceMuteSelected"> - <on_click function="Avatar.DoToSelected" parameter="selected" /> - <on_enable function="Avatar.EnableItem" parameter="can_mute" /> - <on_visible function="Avatar.VisibleItem" parameter="show_mute" /> - </menu_item_call> + <menu_item_separator layout="topleft" name="Moderator Options Separator"/> + <context_menu + label="Moderator Options" + layout="topleft" + name="Moderator Options"> + <menu_item_check + label="Allow text chat" + layout="topleft" + name="AllowTextChat"> + <on_check function="Avatar.CheckItem" parameter="is_allowed_text_chat" /> + <on_click function="Avatar.DoToSelected" parameter="toggle_allow_text_chat" /> + <on_enable function="Avatar.EnableItem" parameter="can_allow_text_chat" /> + <on_visible function="Avatar.VisibleItem" parameter="can_allow_text_chat" /> + </menu_item_check> + <menu_item_separator layout="topleft" name="moderate_voice_separator"> + <on_visible function="Avatar.VisibleItem" parameter="can_allow_text_chat" /> + </menu_item_separator> + <menu_item_call + label="Mute this participant" + layout="topleft" + name="ModerateVoiceMuteSelected"> + <on_click function="Avatar.DoToSelected" parameter="selected" /> + <on_enable function="Avatar.EnableItem" parameter="can_mute" /> + <on_visible function="Avatar.VisibleItem" parameter="show_mute" /> + </menu_item_call> + <menu_item_call + label="Unmute this participant" + layout="topleft" + name="ModerateVoiceUnMuteSelected"> + <on_click function="Avatar.DoToSelected" parameter="selected" /> + <on_enable function="Avatar.EnableItem" parameter="can_unmute" /> + <on_visible function="Avatar.VisibleItem" parameter="show_unmute" /> + </menu_item_call> + <menu_item_call + label="Mute everyone" + layout="topleft" + name="ModerateVoiceMute"> + <on_click function="Avatar.DoToSelected" parameter="mute_all" /> + <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" /> + </menu_item_call> + <menu_item_call + label="Unmute everyone" + layout="topleft" + name="ModerateVoiceUnmute"> + <on_click function="Avatar.DoToSelected" parameter="unmute_all" /> + <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" /> + </menu_item_call> + </context_menu> + <menu_item_separator layout="topleft" name="Group Ban Separator"/> <menu_item_call - label="Unmute this participant" - layout="topleft" - name="ModerateVoiceUnMuteSelected"> - <on_click function="Avatar.DoToSelected" parameter="selected" /> - <on_enable function="Avatar.EnableItem" parameter="can_unmute" /> - <on_visible function="Avatar.VisibleItem" parameter="show_unmute" /> - </menu_item_call> - <menu_item_call - label="Mute everyone" - layout="topleft" - name="ModerateVoiceMute"> - <on_click function="Avatar.DoToSelected" parameter="mute_all" /> - <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" /> - </menu_item_call> - <menu_item_call - label="Unmute everyone" - layout="topleft" - name="ModerateVoiceUnmute"> - <on_click function="Avatar.DoToSelected" parameter="unmute_all" /> - <on_enable function="Avatar.EnableItem" parameter="can_moderate_voice" /> - </menu_item_call> - </context_menu> - <menu_item_separator layout="topleft" name="Group Ban Separator"/> - <menu_item_call - label="Ban member" - layout="topleft" - name="BanMember"> - <on_click function="Avatar.DoToSelected" parameter="ban_member" /> - <on_enable function="Avatar.EnableItem" parameter="can_ban_member" /> - </menu_item_call> + label="Ban member" + layout="topleft" + name="BanMember"> + <on_click function="Avatar.DoToSelected" parameter="ban_member" /> + <on_enable function="Avatar.EnableItem" parameter="can_ban_member" /> + </menu_item_call> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml index 97f53d3a17..f85f897700 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml @@ -53,11 +53,7 @@ function="Inventory.GearDefault.Visible" parameter="multi_folder_view" /> </menu_item_check> - <menu_item_separator> - <menu_item_separator.on_visible - function="Inventory.GearDefault.Visible" - parameter="single_folder_view" /> - </menu_item_separator> + <menu_item_separator/> <menu_item_check label="List view" layout="topleft" @@ -100,4 +96,46 @@ function="Inventory.GearDefault.Visible" parameter="single_folder_view" /> </menu_item_check> + <menu_item_check + label="Recent tab" + layout="topleft" + name="recent_tab"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="toggle_recent_tab" /> + <on_check + function="Inventory.GearDefault.Check" + parameter="recent_tab" /> + <on_visible + function="Inventory.GearDefault.Visible" + parameter="multi_folder_view" /> + </menu_item_check> + <menu_item_check + label="Worn tab" + layout="topleft" + name="worn_tab"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="toggle_worn_tab" /> + <on_check + function="Inventory.GearDefault.Check" + parameter="worn_tab" /> + <on_visible + function="Inventory.GearDefault.Visible" + parameter="multi_folder_view" /> + </menu_item_check> + <menu_item_check + label="Favorites tab" + layout="topleft" + name="favorites_tab"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="toggle_favorites_tab" /> + <on_check + function="Inventory.GearDefault.Check" + parameter="favorites_tab" /> + <on_visible + function="Inventory.GearDefault.Visible" + parameter="multi_folder_view" /> + </menu_item_check> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index ba43e80eda..ffe4bcebd5 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -960,7 +960,8 @@ </menu_item_check> <menu_item_check label="Midday (Legacy)" - name="legacy noon"> + name="legacy noon" + shortcut="control|shift|T"> <menu_item_check.on_click function="World.EnvSettings" parameter="legacy noon" /> @@ -992,7 +993,8 @@ </menu_item_check> <menu_item_check label="Use Shared Environment" - name="Use Shared Environment"> + name="Use Shared Environment" + shortcut="control|shift|X"> <menu_item_check.on_click function="World.EnvSettings" parameter="region" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index b820ede964..a9adb772e5 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -9145,6 +9145,14 @@ Failed to save snapshot to [PATH]: Disk is full. [NEED_MEMORY]KB is required but Failed to save snapshot to [PATH]: Directory does not exist. </notification> + <notification icon="notifytip.tga" + name="SnapshotSavedToComputer" type="notifytip"> +Screenshot saved to: + [FILEPATH] + +Click to open folder. + </notification> + <notification icon="notifytip.tga" name="PresetNotSaved" @@ -9220,6 +9228,23 @@ Your voice has been muted by moderator. </notification> <notification + icon="notifytip.tga" + name="NearbyVoiceMutedByModerator" + type="notifytip"> + The moderator has muted your voice chat. +People in this location will not hear you if you speak. + <tag>voice</tag> + </notification> + + <notification + icon="notifytip.tga" + name="NearbyVoiceUnmutedByModerator" + type="notifytip"> + Your voice chat can now be heard by people in this location. + <tag>voice</tag> + </notification> + + <notification icon="alertmodal.tga" name="FailedToGetBenefits" type="alertmodal"> @@ -9704,6 +9729,22 @@ Are you sure you want to leave this call? <notification icon="alertmodal.tga" + name="ConfirmLeaveAdhoc" + type="alertmodal"> +Are you sure you want to leave this conference chat? + <tag>confirm</tag> + <tag>voice</tag> + <usetemplate + ignoretext="Confirm before I leave conference chat" + name="okcancelignore" + notext="No" + yestext="Yes"> + <unique/> + </usetemplate> + </notification> + + <notification + icon="alertmodal.tga" name="ConfirmMuteAll" type="alert"> You have selected to mute all participants in a group call. diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml index ca6e94397d..f9b65e3f13 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml @@ -61,7 +61,7 @@ left_pad="5" name="avatar_name" parse_urls="false" - top="6" + top="5" use_ellipses="true" value="(loading)" width="180" /> diff --git a/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml index 5ac0bf54de..6b4312a22a 100644 --- a/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_blocked_list_item.xml @@ -65,7 +65,7 @@ left_pad="5" name="item_name" parse_urls="false" - top="6" + top="4" use_ellipses="true" width="180" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 4f48911376..dde2df7128 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -23,7 +23,7 @@ <text parse_urls="false" allow_scroll="false" - v_pad = "6" + v_pad = "4" read_only = "true" follows="left|right" font.style="BOLD" @@ -49,7 +49,7 @@ left_pad="5" name="time_box" right="-5" - top="7" + top="5" value="23:30" width="110" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml index 5406497930..c43f82c0f1 100644 --- a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml @@ -109,7 +109,7 @@ image_overlay_alignment="center" image_pressed="WellButton_Lit" image_pressed_selected="WellButton_Lit_Selected" - image_selected="PushButton_Press" + image_selected="PushButton_Selected" label_color="Black" left="0" name="Unread" diff --git a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml index 7902588598..90e367543e 100644 --- a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml @@ -78,7 +78,7 @@ left="5" name="conversation_title" parse_urls="false" - top="6" + top="4" use_ellipses="true" value="(loading)" width="35" /> @@ -86,6 +86,7 @@ auto_update="true" follows="top|right" draw_border="false" + top="6" height="16" layout="topleft" left_pad="5" diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml index c1d743c3da..2bd25b43bd 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml @@ -15,7 +15,7 @@ <string name="height_value_label_color" translate="false">White</string> <text follows="top|left|right" - font="SansSerifSmallBold" + font="SansSerifSmall" halign="right" height="12" layout="topleft" @@ -36,7 +36,7 @@ layout="topleft" left="10" name="accordion_panel" - top_pad="0" + top_pad="5" width="313"> <accordion layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_experience_search.xml b/indra/newview/skins/default/xui/en/panel_experience_search.xml index bb07476ad0..7867361623 100644 --- a/indra/newview/skins/default/xui/en/panel_experience_search.xml +++ b/indra/newview/skins/default/xui/en/panel_experience_search.xml @@ -47,12 +47,14 @@ <text name="lbl name part" left="0" + top_pad="1" follows="top|left|right" right="-1"> Enter part of the name: </text> <line_editor left="0" + top_pad="9" follows="left|top|right" name="edit" height="18" @@ -121,7 +123,7 @@ draw_heading="true" left="0" right="-1" - height="239" + height="236" top_pad="4" follows="all" column_padding="5" diff --git a/indra/newview/skins/default/xui/en/panel_gltf_material.xml b/indra/newview/skins/default/xui/en/panel_gltf_material.xml index 45df40bc05..697c6e60b7 100644 --- a/indra/newview/skins/default/xui/en/panel_gltf_material.xml +++ b/indra/newview/skins/default/xui/en/panel_gltf_material.xml @@ -7,7 +7,7 @@ top="0" left="0" height="768" - width="247"> + width="257"> <check_box follows="left|top" layout="topleft" @@ -20,7 +20,7 @@ <panel border="true" follows="left|top" - width="246" + width="256" height="196" layout="topleft" left="1" @@ -175,7 +175,7 @@ <panel border="true" follows="left|top" - width="246" + width="256" height="175" layout="topleft" left="1" @@ -252,7 +252,7 @@ layout="topleft" left_delta="0" top_pad="5" - width="96" + width="105" name="roughness_factor_lbl"> Roughness Factor </text> @@ -273,7 +273,7 @@ <panel border="true" follows="left|top" - width="246" + width="256" height="175" layout="topleft" left="1" @@ -343,7 +343,7 @@ <panel border="true" follows="left|top" - width="246" + width="256" height="175" layout="topleft" left="1" diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 74bc7736f9..260dc02ae3 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -64,8 +64,7 @@ Hover your mouse over the options for more help. use_ellipses="true" width="168" /> <text - font="SansSerifMedium" - text_color="white" + text_color="white" type="string" follows="left|top" height="16" diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml index ff6af88707..dff00e4e60 100644 --- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml @@ -44,7 +44,7 @@ layout="topleft" left_pad="5" name="group_name" - top="6" + top="4" use_ellipses="true" value="Unknown" width="242" /> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 1162dcf20d..2ecc4585ba 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -28,7 +28,7 @@ You can turn off Notices on the General tab. left="5" name="lbl2" right="-1" - top="5" + top="3" width="300"> Notices are kept for 14 days. Maximum 200 per group daily @@ -42,7 +42,7 @@ Maximum 200 per group daily left="0" right="-1" name="notice_list" - top_pad="0" + top_pad="6" width="304"> <scroll_list.columns label="" @@ -276,7 +276,6 @@ Maximum 200 per group daily width="313"> <text type="string" - font="SansSerifMedium" height="16" layout="topleft" left="10" diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml index 7442136761..741ed5af41 100644 --- a/indra/newview/skins/default/xui/en/panel_hint.xml +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -3,7 +3,6 @@ width="205" height="34"> <text name="hint_title" - font="SansSerifMedium" left="8" right="180" top="8" diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml index d712245df8..3e3205531f 100644 --- a/indra/newview/skins/default/xui/en/panel_hint_image.xml +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -4,7 +4,6 @@ height="40" layout="topleft"> <text name="hint_title" - font="SansSerifMedium" left="8" right="290" top="8" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 27b74a46ce..482cbef236 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -6,7 +6,7 @@ name="panel_login" focus_root="true" background_visible="true" - bg_opaque_color="0.16 0.16 0.16 1" + bg_opaque_color="DkGrayLogin" background_opaque="true" width="1024"> <panel.string @@ -18,182 +18,379 @@ https://join.secondlife.com/ </panel.string> <layout_stack - follows="left|right|top" - height="172" - left="0" - name="ui_stack" - orientation="horizontal" - top="10" - width="1024"> + follows="all" + layout="topleft" + orientation="horizontal" + name="main_stack" + border_size="0" + animate="false" + top="0" + left="0" + height="768" + width="1024"> + <layout_panel + auto_resize="true" + user_resize="false" + layout="topleft" + name="left_spacer" + background_visible="false" + min_width="0" + expanded_min_dim="0" + width="1"> + </layout_panel> <layout_panel - height="172" - auto_resize="true" - name="ui_elastic_pad_left" - width="32" /> + auto_resize="false" + user_resize="false" + layout="topleft" + name="center_stage" + background_visible="true" + bg_opaque_color="DkGrayLogin" + background_opaque="true" + width="1008" + height="768"> + <layout_stack + follows="all" + layout="topleft" + orientation="horizontal" + name="ui_stack" + border_size="0" + animate="false" + top="0" + left="0" + height="768" + width="1008"> + <layout_panel + auto_resize="false" + user_resize="false" + layout="topleft" + name="ui_container" + width="300" + height="768" + background_visible="true" + bg_opaque_color="PanelDark" + background_opaque="true"> + <icon + height="77" + width="160" + image_name="login_sl_logo_horizontal" + layout="topleft" + follows="left|top" + left="70" + top="39" + name="sl_logo_small" /> + <icon + left="40" + top_pad="30" + width="220" + height="28" + image_name="TextField_Active" + layout="topleft" + follows="left|top" + name="text_field_bg1" /> + <combo_box + left="40" + top_delta="0" + allow_text_entry="true" + follows="left|top" + layout="topleft" + height="28" + label="Username" + combo_editor.font="SansSerifLarge" + max_chars="128" + combo_editor.commit_on_focus_lost="false" + combo_editor.prevalidator="ascii" + tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine" + name="username_combo" + width="220"> + <combo_box.combo_button + image_overlay="ComboButton_Arrow" + image_overlay_right_delta="10" + image_unselected="ComboButton_Transparent" + hover_glow_amount="0" + image_selected="ComboButton_Transparent" + image_disabled="ComboButton_Transparent" /> + <combo_box.combo_editor + background_image="TextField_Transparent" + background_image_disabled="TextField_Transparent" + background_image_focused="TextField_Transparent" + draw_focus_border="false" + text_pad_left="8" + bg_image_always_focused="true"/> + </combo_box> + <check_box + follows="left|top" + font="SansSerifMedium" + label_text.text_color="White" + top_pad="3" + layout="topleft" + height="24" + label="Remember username" + word_wrap="down" + check_button.bottom="3" + name="remember_name" + tool_tip="Already remembered user can be forgotten from Me > Preferences > Advanced > Remembered Usernames." + width="198"> + <check_box.label_text left="23"/> + <check_box.check_button + image_selected="Checkbox_Slim_On" + image_unselected="Checkbox_Slim_Off" + image_pressed="Checkbox_Slim_Off" + image_pressed_selected="Checkbox_Slim_Off"/> + </check_box> + <line_editor + follows="left|top" + height="28" + top_pad="20" + max_length_chars="16" + text_pad_left="8" + name="password_edit" + label="Password" + bg_image_always_focused="true" + font="SansSerifLarge" + is_password="true" + select_on_focus="true" + draw_focus_border="false" + commit_on_focus_lost="false" + width="220" /> + <check_box + control_name="RememberPassword" + follows="left|top" + font="SansSerifMedium" + label_text.text_color="White" + height="24" + top_pad="3" + label="Remember password" + word_wrap="down" + check_button.bottom="3" + name="remember_password" + width="165"> + <check_box.label_text left="23"/> + <check_box.check_button + image_selected="Checkbox_Slim_On" + image_unselected="Checkbox_Slim_Off" + image_pressed="Checkbox_Slim_Off" + image_pressed_selected="Checkbox_Slim_Off"/> + </check_box> + <text + follows="left|top" + font="SansSerif" + text_color="White" + height="12" + name="location_text" + top_pad="18" + width="120" + valign="center"> + Start here + </text> + <icon + top_pad="6" + width="220" + height="28" + image_name="TextField_Active" + layout="topleft" + follows="left|top" + name="text_field_bg2" /> + <combo_box + allow_text_entry="true" + control_name="NextLoginLocation" + follows="left|top" + label="My favorite places" + height="28" + max_chars="128" + combo_editor.font="SansSerifLarge" + top_delta="0" + name="start_location_combo" + width="220" + combo_button.scale_image="true"> + <combo_box.combo_button + image_overlay="ComboButton_Arrow" + hover_glow_amount="0" + image_overlay_right_delta="10" + image_unselected="ComboButton_Transparent" + image_selected="ComboButton_Transparent" + image_disabled="ComboButton_Transparent" /> + <combo_box.combo_editor + background_image="TextField_Transparent" + background_image_disabled="TextField_Transparent" + background_image_focused="TextField_Transparent" + draw_focus_border="false" + text_pad_left="8" + bg_image_always_focused="true"/> + <combo_box.item + label="My last location" + name="MyLastLocation" + value="last" /> + <combo_box.item + label="My home" + name="MyHome" + value="home" /> + </combo_box> + <layout_stack + follows="left|top" + layout="topleft" + orientation="vertical" + name="login_stack" + border_size="0" + animate="false" + top_pad="0" + left="0" + height="218" + width="300"> + <layout_panel + auto_resize="false" + user_resize="false" + layout="topleft" + name="grid_panel" + background_visible="false" + height="64" + width="300"> + <text + follows="left|top" + font="SansSerif" + text_color="white" + height="12" + name="grid_text" + top="18" + left="40" + width="120" + valign="center"> + Grid + </text> + <combo_box + allow_text_entry="false" + font="SansSerifTiny" + follows="left|top" + height="28" + top_pad="6" + left="40" + max_chars="128" + label="Select grid" + layout="topleft" + name="server_combo" + width="220"> + <combo_box.drop_down_button + pad_bottom="1" + pad_left="10" + font="SansSerifLarge" + label_color="Black" + label_color_selected="Black" + draw_focus_border="false" + image_overlay="ComboButton_Arrow" + image_overlay_right_delta="10" + image_unselected="TextField_Active" + image_selected="TextField_Active" + image_pressed="TextField_Active" + image_pressed_selected="TextField_Active"/> + </combo_box> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + layout="topleft" + name="login_panel" + background_visible="false" + height="172" + width="300"> + <button + follows="left|top" + image_unselected="PushButton_Login" + image_pressed="PushButton_Login_Pressed" + image_hover_unselected="PushButton_Login_Over" + label="Log in" + label_color="Black" + label_color_disabled="Black" + font="SansSerifLarge" + font.style="BOLD" + name="connect_btn" + draw_focus_border="false" + hover_hand_cursor="true" + enabled="true" + width="220" + height="30" + left="40" + top="25" + pad_bottom="1" /> + <text + follows="left|top" + font="SansSerifMedium" + text_color="EmphasisColor" + height="15" + name="forgot_password_text" + left="60" + top_pad="9" + width="180" + halign="center"> + Need help logging in? + </text> + <button + follows="left|top" + image_unselected="PushButton_Sign" + image_pressed="PushButton_Sign_Pressed" + image_hover_unselected="PushButton_Sign_Over" + label="Create account" + label_color="White" + label_color_disabled="Black" + font="SansSerifMedium" + font.style="BOLD" + name="sign_btn" + draw_focus_border="false" + hover_hand_cursor="true" + width="220" + height="35" + left="40" + top_pad="25" + pad_bottom="1" /> + </layout_panel> + </layout_stack> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + layout="topleft" + name="middle_gutter" + min_width="18" + max_width="18" + expanded_min_dim="18" + width="18" + height="768" + background_visible="true" + bg_opaque_color="DkGrayLogin" + background_opaque="true"> + </layout_panel> + <layout_panel + auto_resize="false" + user_resize="false" + layout="topleft" + name="web_container" + width="690" + height="768" + background_visible="true" + bg_opaque_color="DkGrayLogin" + background_opaque="true"> + <web_browser + tab_stop="false" + trusted_content="true" + bg_opaque_color="DkGrayLogin" + border_visible="false" + follows="all" + left="0" + top="0" + right="-1" + bottom="-1" + name="login_html" + start_url="" /> + </layout_panel> + </layout_stack> + </layout_panel> <layout_panel - auto_resize="false" - follows="left|right|top" - name="ui_container" - width="1011" - left="0" - top="0" - height="172"> - <icon - height="73" - width="165" - image_name="login_sl_logo" - left="0" - top="25" - name="sl_logo_small" /> - <combo_box - left_pad="22" - bottom_delta="-7" - allow_text_entry="true" - follows="left|top" - height="32" - label="Username" - combo_editor.font="SansSerifLarge" - max_chars="128" - combo_editor.commit_on_focus_lost="false" - combo_editor.prevalidator="ascii" - tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine" - name="username_combo" - width="206"> - <combo_box.combo_editor - text_pad_left="8" - bg_image_always_focused="true"/> - </combo_box> - <line_editor - follows="left|top" - height="32" - left_pad="15" - max_length_chars="16" - text_pad_left="8" - name="password_edit" - label="Password" - bg_image_always_focused="true" - font="SansSerifLarge" - is_password="true" - select_on_focus="true" - commit_on_focus_lost="false" - bottom_delta="0" - width="165" /> - <combo_box - allow_text_entry="true" - control_name="NextLoginLocation" - follows="left|top" - label="My favorite places" - height="32" - max_chars="128" - combo_editor.font="SansSerifLarge" - left_pad="15" - bottom_delta="0" - name="start_location_combo" - width="175" - combo_button.scale_image="true"> - <combo_box.combo_editor - bg_image_always_focused="true" - text_pad_left="8"/> - <combo_box.item - label="My last location" - name="MyLastLocation" - value="last" /> - <combo_box.item - label="My home" - name="MyHome" - value="home" /> - </combo_box> - <button - follows="left|top" - image_unselected="PushButton_Login" - image_pressed="PushButton_Login_Pressed" - image_hover_unselected="PushButton_Login_Over" - label="Log In" - label_color="White" - font="SansSerifMedium" - name="connect_btn" - enabled="true" - width="120" - height="32" - left_pad="15" - bottom_delta="0" /> - <text - follows="left|top" - font="SansSerifLarge" - font.style="BOLD" - text_color="EmphasisColor" - height="34" - name="sign_up_text" - left_pad="10" - width="200" - valign="center"> - Sign up - </text> - <check_box - follows="left|top" - font="SansSerifMedium" - left="185" - bottom_delta="21" - height="24" - label="Remember me" - word_wrap="down" - check_button.bottom="3" - name="remember_name" - tool_tip="Already remembered user can be forgotten from Me > Preferences > Advanced > Remembered Usernames." - width="198" /> - <check_box - control_name="RememberPassword" - follows="left|top" - font="SansSerifMedium" - height="24" - left="408" - bottom_delta="0" - label="Remember password" - word_wrap="down" - check_button.bottom="3" - name="remember_password" - width="165" /> - <combo_box - allow_text_entry="false" - font="SansSerifTiny" - follows="left|top" - height="26" - left="588" - bottom_delta="8" - max_chars="128" - label="Select grid" - layout="topleft" - name="server_combo" - width="149" /> - <text - follows="left|top" - font="SansSerifMedium" - text_color="EmphasisColor" - height="16" - name="forgot_password_text" - left="778" - bottom_delta="-8" - width="120" - halign="center"> - Password help - </text> - </layout_panel> - <layout_panel - height="172" - auto_resize="true" - name="ui_elastic_pad_right" - width="32" /> + auto_resize="true" + user_resize="false" + layout="topleft" + name="right_spacer" + background_visible="false" + min_width="0" + expanded_min_dim="0" + width="1"> + </layout_panel> </layout_stack> - <web_browser - tab_stop="false" - trusted_content="true" - bg_opaque_color="Black" - border_visible="false" - follows="all" - left="0" - name="login_html" - start_url="" - top="154" - height="600" - width="1024" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml deleted file mode 100644 index d6ac71db94..0000000000 --- a/indra/newview/skins/default/xui/en/panel_login_first.xml +++ /dev/null @@ -1,262 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel - follows="all" - height="768" - layout="topleft" - name="panel_login" - focus_root="true" - background_visible="true" - bg_opaque_color="0.16 0.16 0.16 1" - background_opaque="true" - width="1024"> - <panel.string - name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <panel.string - name="sign_up_url"> - https://join.secondlife.com/ - </panel.string> - <layout_stack - follows="left|right|top|bottom" - width="1024" - height="768" - left="0" - name="logo_stack" - orientation="vertical" - top="0"> - <layout_panel - height="18" - auto_resize="false" - name="page_top" - width="1024" /> - <!-- start of logo stack --> - <layout_panel - height="130" - min_height="10" - auto_resize="false" - name="parent_panel" - width="1024"> - <layout_stack - follows="left|right|top|bottom" - height="100" - left="0" - name="logo_stack" - orientation="horizontal" - top="0" - width="1024"> - <layout_panel - height="110" - min_height="10" - auto_resize="true" - name="logo_left" - width="300" /> - <layout_panel - auto_resize="false" - follows="left|right|top" - name="logo_container" - width="225" - left="0" - top="0" - height="105"> - <icon - height="94" - image_name="login_sl_logo" - left="0" - name="sl_logo" - top="0" /> - </layout_panel> - <layout_panel - height="100" - name="logo_right" - auto_resize="true" - width="300" /> - </layout_stack> - </layout_panel> - <!-- end of logo stack --> - <!-- start of widget stack --> - <layout_panel - height="100" - min_height="10" - auto_resize="false" - name="parent_panel2" - width="1024"> - <layout_stack - follows="left|right|top|bottom" - height="80" - left="0" - name="widget_stack" - orientation="horizontal" - top="0" - width="1024"> - <layout_panel - height="80" - min_height="10" - auto_resize="true" - name="widget_left" - width="200" /> - <layout_panel - auto_resize="false" - follows="left|right|top" - name="widget_container" - width="730" - left="0" - top="0" - height="80"> - <combo_box - allow_text_entry="true" - follows="left|bottom" - height="32" - left="42" - label="Username" - combo_editor.font="SansSerifLarge" - max_chars="128" - top="0" - combo_editor.prevalidator="ascii" - tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine" - name="username_combo" - width="232"> - <combo_box.combo_editor - text_pad_left="8" /> - <combo_box.combo_button - visible ="false"/> - <combo_box.drop_down_button - visible ="false"/> - </combo_box> - <line_editor - follows="left|top" - width="200" - height="32" - left="262" - max_length_chars="16" - name="password_edit" - label="Password" - text_pad_left="8" - font="SansSerifLarge" - is_password="true" - select_on_focus="true" - commit_on_focus_lost="false" - top="0" /> - <button - follows="left|top" - image_unselected="PushButton_Login" - image_pressed="PushButton_Login_Pressed" - image_hover_unselected="PushButton_Login_Over" - label="Log In" - label_color="White" - font="SansSerifLarge" - name="connect_btn" - left_pad="15" - width="120" - height="32" - top="0" /> - <text - follows="left|top" - font="SansSerifLarge" - font.style="BOLD" - text_color="EmphasisColor" - height="34" - name="sign_up_text" - left_pad="10" - top="0" - width="200" - valign="center"> - Sign up - </text> - <check_box - follows="left|top" - font="SansSerifLarge" - left="42" - top="32" - height="24" - label="Remember me" - word_wrap="down" - check_button.bottom="3" - name="remember_name" - tool_tip="Already remembered user can be forgotten from Me > Preferences > Advanced > Remembered Usernames." - width="198" /> - <check_box - control_name="RememberPassword" - follows="left|top" - font="SansSerifLarge" - height="24" - left="262" - bottom_delta="0" - label="Remember password" - word_wrap="down" - check_button.bottom="3" - name="remember_password" - width="198" /> - <text - follows="left|top" - font="SansSerifLarge" - text_color="EmphasisColor" - height="16" - name="forgot_password_text" - left="492" - top="34" - width="200"> - Forgotten password - </text> - </layout_panel> - <layout_panel - height="100" - name="widget_right" - auto_resize="true" - width="200" /> - </layout_stack> - </layout_panel> - <!-- end of widget stack --> - <!-- start of images stack --> - <layout_panel - height="500" - min_height="10" - auto_resize="false" - name="parent_panel3" - width="1024"> - <layout_stack - follows="left|right|top|bottom" - height="500" - left="0" - name="images_stack" - orientation="horizontal" - top="0" - width="1024"> - <layout_panel - height="500" - min_height="10" - auto_resize="true" - name="images_left" - width="96" /> - <layout_panel - auto_resize="false" - follows="left|right|top" - name="images_container" - width="675" - left="0" - top="0" - height="500"> - <icon - height="450" - width="675" - image_name="first_login_image" - left="0" - name="image_left" - top="0" /> - </layout_panel> - <layout_panel - height="100" - name="images_right" - auto_resize="true" - width="96" /> - </layout_stack> - </layout_panel> - <!-- end of images stack --> - <layout_panel - height="400" - min_height="10" - auto_resize="true" - name="page_bottom" - width="1024" /> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 6e1e6facbe..a302d44e83 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -34,7 +34,6 @@ left="12" right="-12" name="ItemcountText" - font="SansSerifMedium" text_color="InventoryItemLinkColor" use_ellipses="true" top_pad="0"> diff --git a/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml index 61cd6a83d4..371147b28a 100644 --- a/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml +++ b/indra/newview/skins/default/xui/en/panel_marketplace_listings.xml @@ -108,7 +108,6 @@ left="2" width="306" halign="center" - font="SansSerifMedium" font_shadow="hard" valign="top"> Drop folders here to create new listings diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 85cf4419a3..4d924a6c24 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -89,7 +89,7 @@ image_hover_unselected="PushButton_Over" image_bottom_pad="1" layout="topleft" - left="10" + left="9" name="back_btn" tool_tip="Go back to previous location" top="2" @@ -102,7 +102,7 @@ image_hover_unselected="PushButton_Over" image_bottom_pad="1" layout="topleft" - left_pad="0" + left_pad="1" name="forward_btn" tool_tip="Go forward one location" top_delta="0" diff --git a/indra/newview/skins/default/xui/en/panel_notification_list_item.xml b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml index 80db209b59..c6e2c124d1 100644 --- a/indra/newview/skins/default/xui/en/panel_notification_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_notification_list_item.xml @@ -63,7 +63,8 @@ use_ellipses="true" word_wrap="false" mouse_opaque="false" name="sender_or_fee_box" visible="false"> Sender: "Resident R e s i d e n t R e s i d e n t" </text> - <text allow_scroll="false" font="SansSerifSmall" top="0" right="-5" width="95" height="13" follows="right" halign="right" layout="topleft" left_pad="5" + <!-- Old DejaVu font is used to avoid overlapping with sender name --> + <text allow_scroll="false" font="DejaVu" font.size="LSmall" top="0" right="-5" width="100" height="13" follows="right" halign="right" layout="topleft" left_pad="5" name="notification_time" value="2014/12/24 23:30" /> </panel> </panel> @@ -105,7 +106,8 @@ use_ellipses="true" word_wrap="false" mouse_opaque="false" name="sender_or_fee_box_exp" visible="false"> Sender: "Resident R e s i d e n t R e s i d e n t" </text> - <text allow_scroll="false" font="SansSerifSmall" top="0" right="-1" width="95" height="13" follows="right" halign="right" layout="topleft" left_pad="5" + <!-- Old DejaVu font is used to avoid overlapping with sender name --> + <text allow_scroll="false" font="DejaVu" font.size="LSmall" top="0" right="-1" width="100" height="13" follows="right" halign="right" layout="topleft" left_pad="5" name="notification_time_exp" value="2014/12/24 23:30" /> </panel> <panel border="false" left="0" height="115" width="230" bevel_style="none" follows="all" layout="topleft" name="notification_text_panel_exp" visible="true"> diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index a0e3344304..4cd9d27841 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -216,7 +216,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap <button follows="left|bottom" height="22" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" is_toggle="true" @@ -251,7 +251,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap follows="bottom|right" height="22" image_overlay="Search_Icon" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" is_toggle="true" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 1be34550fa..d43045ebaa 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -183,6 +183,7 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip increment="1" follows="left|top" left="5" + top_pad="5" min_val="0" max_val="4096" label="Range:" @@ -199,13 +200,13 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip <layout_stack clip="false" follows="all" - height="410" + height="406" layout="topleft" left="0" mouse_opaque="false" orientation="vertical" right="-1" - top_pad="0"> + top_pad="3"> <layout_panel height="142" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml b/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml index 9f930d1557..1bea605d91 100644 --- a/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml +++ b/indra/newview/skins/default/xui/en/panel_performance_autoadjustments.xml @@ -144,7 +144,7 @@ <button follows="top|left" height="22" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" label="Auto-adjust now" @@ -157,7 +157,7 @@ <button follows="top|left" height="22" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" label="Cancel" @@ -183,7 +183,7 @@ follows="top|left" height="20" initial_value="true" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" is_toggle="true" diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml index 5031784644..df14a66515 100644 --- a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml +++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml @@ -91,7 +91,7 @@ layout="topleft" left_pad="40" name="fastest_lbl" - width="40"> + width="42"> Fastest </text> <radio_group @@ -240,7 +240,7 @@ left_pad="10" top_delta="1" name="farther_lbl" - width="40"> + width="45"> Farther </text> <text @@ -284,7 +284,7 @@ top_delta="0" left="160" name="enhancements_desc" - width="350"> + width="375"> Shadows significantly improve visual quality but can reduce speed. </text> <text @@ -307,7 +307,8 @@ left_delta="150" top_delta="0" name="ShadowDetail" - width="150"> + width="153"> + <combo_box.drop_down_button pad_right="20" /> <combo_box.item label="None" name="0" @@ -417,7 +418,7 @@ top_delta="3" left_pad="10" name="photo_dist_det_desc" - width="180"> + width="192"> (Enter value between 0.0 and 4.0) </text> <text @@ -426,7 +427,7 @@ height="18" layout="topleft" top="80" - left="213" + left="215" name="0_lbl" width="7"> 0 @@ -446,7 +447,7 @@ font="SansSerifSmall" height="18" layout="topleft" - left_pad="30" + left_pad="29" name="2_lbl" width="7"> 2 @@ -468,7 +469,7 @@ layout="topleft" left_pad="30" name="4_lbl" - width="7"> + width="8"> 4 </text> <text @@ -476,7 +477,7 @@ font="SansSerifSmall" height="18" layout="topleft" - left_pad="30" + left_pad="29" name="5_lbl" width="7"> 5 diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 434ee1db35..57d9146a36 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -13,18 +13,6 @@ name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left="33" - name="Cache:" - top_pad="10" - width="100"> - Cache: - </text> <spinner control_name="CacheSize" decimal_digits="0" @@ -33,14 +21,14 @@ increment="64" initial_value="1024" label="Cache size (896 - 32768MB)" - label_width="150" + label_width="170" layout="topleft" - left="80" + left="33" max_val="32768" min_val="896" top_pad="10" name="cachesizespinner" - width="210" /> + width="230" /> <text type="string" length="1" @@ -59,7 +47,7 @@ label="Clear Cache" label_selected="Clear Cache" layout="topleft" - left_pad="20" + left_pad="25" name="clear_cache" top_delta="0" width="100"> @@ -72,7 +60,7 @@ follows="left|top" height="10" layout="topleft" - left="80" + left="33" name="Cache location" top_pad="5" width="300"> @@ -86,7 +74,7 @@ font="SansSerif" height="23" layout="topleft" - left="80" + left="33" max_length_bytes="4096" name="cache_location" top_pad="5" @@ -113,7 +101,7 @@ left_pad="3" name="default_cache_location" top_delta="0" - width="100"> + width="104"> <button.commit_callback function="Pref.ResetCache" /> </button> 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 aa641a35f7..6d1b952639 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -110,7 +110,8 @@ left="255" max_chars="135" name="time_format_combobox" - width="70"> + width="71"> + <combo_box.drop_down_button pad_right="22" /> <combo_box.item enabled="true" label="1:00 PM" @@ -244,7 +245,7 @@ height="20" layout="topleft" left="35" - top_pad="0" + top_pad="5" name="Name_Tag_Preference"> <radio_item label="Off" @@ -295,16 +296,16 @@ tool_tip="Show username, like bobsmith123" top_delta="0" /> <check_box - control_name="NameTagShowGroupTitles" - enabled_control="AvatarNameTagMode" + control_name="UseDisplayNames" + follows="top|left" height="16" - label="Group titles" + label="Display names" layout="topleft" left="35" - width="100" - name="show_all_title_checkbox1" - tool_tip="Show group titles, like Officer or Member" - top_pad="3" /> + name="display_names_check" + width="100" + tool_tip="Check to use display names in chat, IM, name tags, etc." + top_pad="5"/> <check_box control_name="NameTagShowFriends" enabled_control="AvatarNameTagMode" @@ -313,19 +314,29 @@ layout="topleft" left_pad="50" name="show_friends" - tool_tip="Highlight the name tags of your friends"/> - <check_box - control_name="UseDisplayNames" - follows="top|left" - height="16" - label="View Display Names" - layout="topleft" - left="35" - name="display_names_check" - width="237" - tool_tip="Check to use display names in chat, IM, name tags, etc." - top_pad="3"/> - + tool_tip="Highlight the name tags of your friends"/> + <combo_box + height="23" + layout="topleft" + control_name="GroupTitlesTagMode" + enabled_control="AvatarNameTagMode" + left="38" + top_pad="3" + name="group_title" + width="130"> + <combo_box.item + label="No group tags" + name="no_tags" + value="0" /> + <combo_box.item + label="Only my group tag" + name="my_tag" + value="1" /> + <combo_box.item + label="All group tags" + name="all_tags" + value="2" /> + </combo_box> <text type="string" length="1" @@ -334,7 +345,7 @@ layout="topleft" left="30" name="inworld_typing_rg_label" - top_pad="1" + top_pad="5" width="400"> Pressing letter keys: </text> @@ -343,7 +354,7 @@ height="34" layout="topleft" left="35" - top_pad="0" + top_pad="5" name="inworld_typing_preference"> <radio_item label="Starts local chat" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index bf07ae4d68..0f44366947 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -104,7 +104,7 @@ layout="topleft" left="65" name="FasterText" - top_pad="4" + top_pad="10" width="80"> Faster </text> @@ -114,14 +114,14 @@ follows="left|top" height="12" layout="topleft" - left_delta="360" + left_delta="363" name="BetterText" top_delta="0" width="100"> Better </text> <icon - color="DkGray" + color="DkGray0" height="14" image_name="Rounded_Square" layout="topleft" @@ -130,7 +130,7 @@ top_delta="-2" width="2" /> <icon - color="DkGray" + color="DkGray0" height="14" image_name="Rounded_Square" layout="topleft" @@ -138,7 +138,7 @@ name="LowMidGraphicsDivet" width="2" /> <icon - color="DkGray" + color="DkGray0" height="14" image_name="Rounded_Square" layout="topleft" @@ -147,7 +147,7 @@ top_delta="0" width="2" /> <icon - color="DkGray" + color="DkGray0" height="14" image_name="Rounded_Square" layout="topleft" @@ -156,7 +156,7 @@ top_delta="0" width="2" /> <icon - color="DkGray" + color="DkGray0" height="14" image_name="Rounded_Square" layout="topleft" @@ -165,7 +165,7 @@ top_delta="0" width="2" /> <icon - color="DkGray" + color="DkGray0" height="14" image_name="Rounded_Square" layout="topleft" @@ -174,7 +174,7 @@ top_delta="0" width="2" /> <icon - color="DkGray" + color="DkGray0" height="14" image_name="Rounded_Square" layout="topleft" @@ -216,15 +216,15 @@ min_val="64" max_val="512" name="DrawDistance" - top_delta="40" - width="427" /> + top_delta="34" + width="428" /> <text type="string" length="1" follows="left|top" height="12" layout="topleft" - left_delta="427" + left_delta="425" name="DrawDistanceMeterText2" top_delta="0" width="128"> @@ -286,7 +286,7 @@ initial_value="101" increment="1" label="Avatar maximum complexity:" - label_width="165" + label_width="187" layout="topleft" left="30" min_val="1" @@ -294,7 +294,7 @@ name="IndirectMaxComplexity" show_text="false" top_delta="28" - width="300"> + width="394"> <slider.commit_callback function="Pref.UpdateIndirectMaxComplexity" parameter="IndirectMaxComlexityText" /> @@ -306,7 +306,7 @@ height="16" layout="topleft" top_delta="0" - left_delta="304" + left_delta="398" text_readonly_color="LabelDisabledColor" name="IndirectMaxComplexityText" width="65"> @@ -329,7 +329,7 @@ label_width="240" left="30" top_delta="20" - width="393"> + width="394"> <slider.commit_callback function="Pref.UpdateIndirectMaxNonImpostors" parameter="IndirectNonImpostorsText" /> @@ -341,7 +341,7 @@ height="16" layout="topleft" top_delta="0" - left_delta="397" + left_delta="398" text_readonly_color="LabelDisabledColor" name="IndirectMaxNonImpostorsText" width="65"> @@ -369,7 +369,7 @@ increment="0.1" initial_value="160" label="Brightness (exposure)" - label_width="145" + label_width="187" layout="topleft" left="30" min_val="0.5" @@ -377,7 +377,7 @@ name="RenderExposure" show_text="true" top_pad="14" - width="260"> + width="424"> </slider> <!-- End of Basic Settings block --> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 1c00837073..8b60be30f9 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -10,6 +10,7 @@ top="1" width="517"> + <!-- remove "hide_tabs" param when Discord tab is actually used --> <tab_container top_pad="0" enabled="true" @@ -18,6 +19,7 @@ width="517" left_delta="0" name="privacy_tab_container" + hide_tabs="true" tab_position="top" tab_stop="false"> <panel diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 258c49785e..2036ed75ca 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -170,7 +170,7 @@ left="30" name="Software updates:" mouse_opaque="false" - top_pad="5" + top_pad="8" width="300"> Software updates: </text> @@ -180,7 +180,7 @@ height="23" layout="topleft" left_delta="50" - top_pad="5" + top_pad="10" name="updater_service_combobox" width="300"> <combo_box.item @@ -197,29 +197,29 @@ value="0" /> </combo_box> <check_box - top_delta="4" + top_pad="10" enabled="true" follows="left|top" + layout="topleft" height="14" control_name="UpdaterWillingToTest" label="Willing to update to Beta" left_delta="0" mouse_opaque="true" name="update_willing_to_test" - width="400" - top_pad="5"/> + width="400"/> <check_box - top_delta="4" + top_pad="8" enabled="true" follows="left|top" + layout="topleft" height="14" control_name="UpdaterShowReleaseNotes" label="Show Release Notes after update" left_delta="0" mouse_opaque="true" name="update_show_release_notes" - width="400" - top_pad="5"/> + width="400"/> <text type="string" length="1" @@ -229,7 +229,7 @@ left="30" name="Proxy Settings:" mouse_opaque="false" - top_pad="5" + top_pad="8" width="300"> Proxy Settings: </text> @@ -242,8 +242,7 @@ layout="topleft" left_delta="50" name="set_proxy" - top_pad="5" - > + top_pad="10" > <button.commit_callback function="Pref.Proxy" /> </button> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 52413abe74..1dcbf4e666 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -319,7 +319,7 @@ top_delta="25" name="Listen media from" height="15" - width="165" + width="180" halign="right"> Hear media and sounds from </text> @@ -327,7 +327,7 @@ control_name="MediaSoundsEarLocation" follows="left|top" layout="topleft" - left_pad="5" + left_pad="10" width="130" height="23" top_delta="-4" @@ -346,7 +346,7 @@ layout="topleft" height="15" left="23" - width="165" + width="180" name="media_autoplay_label" halign="right"> Auto-play media @@ -357,7 +357,7 @@ follows="left|top" layout="topleft" height="23" - left_delta="170" + left_delta="190" top_delta="-4" name="media_auto_play_combo" width="130"> @@ -379,7 +379,7 @@ layout="topleft" height="15" left="23" - width="165" + width="180" name="media_firstinteract_label" halign="right"> Media first-interact @@ -390,11 +390,12 @@ follows="left|top" layout="topleft" height="23" - left_delta="170" + left_delta="190" top_delta="-4" width="130" name="media_first_interact_combo" tool_tip="This setting controls which media (once loaded) does not require a first click to focus before interaction can begin. This allows clicks to be passed directly to media bypassing the focus click requirement. Each option also inherits the previous ones."> + <combo_box.drop_down_button pad_right="19" /> <item label="Disabled" name="media_first_click_none" @@ -457,7 +458,7 @@ layout="topleft" follows="left" height="15" - width="165" + width="187" name="noise_suppression_label" left="23" top_delta="22" @@ -469,7 +470,7 @@ enabled_control="EnableVoiceChat" follows="left|top" layout="topleft" - left_delta="170" + left_delta="190" top_delta="-6" width="130" height="23" @@ -503,7 +504,7 @@ left="23" top_delta="30" name="Listen from" - width="165" + width="180" height="15" halign="right"> Hear voice from @@ -513,7 +514,7 @@ control_name="VoiceEarLocation" follows="left|top" layout="topleft" - left_delta="170" + left_delta="190" top_delta="-6" width="130" height="23" @@ -545,7 +546,7 @@ tool_tip="Check to enable voice echo cancellation" label="Echo Cancellation" layout="topleft" - left="260" + left="275" name="enable_echo_cancellation" top_pad="-15" width="200"/> @@ -558,7 +559,7 @@ layout="topleft" left="20" name="push_to_talk_toggle_check" - width="237" + width="245" tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down." top_pad="5"/> <check_box @@ -569,7 +570,7 @@ label="Automatic Gain Control" layout="topleft" name="voice_automatic_gain_control" - left="260" + left="275" top_pad="-15" width="200"/> <check_box @@ -591,7 +592,7 @@ label="Show voice dot above avatars" layout="topleft" name="voice_dot_visualizer" - left="260" + left="275" top_pad="-15" width="200"/> <button @@ -603,7 +604,7 @@ label="Voice Input/Output devices" layout="topleft" left="20" - top_pad="0" + top_pad="1" name="device_settings_btn" width="200"> </button> diff --git a/indra/newview/skins/default/xui/en/panel_region_experiences.xml b/indra/newview/skins/default/xui/en/panel_region_experiences.xml index 199dca4853..5e9ebabba7 100644 --- a/indra/newview/skins/default/xui/en/panel_region_experiences.xml +++ b/indra/newview/skins/default/xui/en/panel_region_experiences.xml @@ -13,7 +13,6 @@ <panel.string name="trusted_estate_text"> Any Experience may be Key. - Key Experiences have permission to run on this estate. Additionally, if the estate does not allow public access, Residents participating in any Key Experience may enter the estate and can remain as long as they are in a Key Experience. diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 47e1e669d1..4e624276cc 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -67,12 +67,12 @@ </text> <text follows="left|top" - font="SansSerif" + font="SansSerifSmall" height="20" layout="topleft" - left_delta="50" + left_delta="53" name="version_channel_text" - top_delta="0" + top_delta="1" width="400"> unknown </text> @@ -81,7 +81,7 @@ font="SansSerif" height="20" layout="topleft" - top_delta="0" + top_delta="-1" right="-100" name="grid_position_lbl" width="80"> diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml index 73e0a1000f..dd9907dc1f 100644 --- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml @@ -42,7 +42,7 @@ max_val="100" name="water_height_spin" top="40" - width="180" /> + width="190" /> <spinner follows="left|top" height="20" @@ -54,7 +54,7 @@ max_val="100" name="terrain_raise_spin" top="40" - width="180" /> + width="190" /> <spinner follows="left|top" height="20" @@ -67,7 +67,7 @@ min_val="-100" name="terrain_lower_spin" top="60" - width="180" /> + width="190" /> <view_border bevel_style="none" follows="top|left" @@ -330,7 +330,7 @@ follows="left|top" height="20" layout="topleft" - left_pad="10" + left_pad="15" name="height_text_lbl7" top_delta="0" width="100"> @@ -349,7 +349,7 @@ min_val="-500" name="height_start_spin_1" top_delta="15" - width="100" /> + width="105" /> <!-- northeast low--> <spinner follows="left|top" @@ -363,7 +363,7 @@ min_val="-500" name="height_start_spin_3" top_delta="0" - width="100" /> + width="105" /> <!-- northwest high--> <spinner follows="left|top" @@ -377,7 +377,7 @@ min_val="-500" name="height_range_spin_1" top_delta="20" - width="100" /> + width="105" /> <!-- northeast high--> <spinner follows="left|top" @@ -391,7 +391,7 @@ min_val="-500" name="height_range_spin_3" top_delta="0" - width="100" /> + width="105" /> <text follows="left|top" height="20" @@ -406,7 +406,7 @@ follows="left|top" height="20" layout="topleft" - left_pad="10" + left_pad="15" name="height_text_lbl9" top_delta="0" width="100"> @@ -425,7 +425,7 @@ min_val="-500" name="height_start_spin_0" top_delta="15" - width="100" /> + width="105" /> <!-- southeast low--> <spinner follows="left|top" @@ -439,7 +439,7 @@ min_val="-500" name="height_start_spin_2" top_delta="0" - width="100" /> + width="105" /> <!--southwest high--> <spinner follows="left|top" @@ -453,7 +453,7 @@ min_val="-500" name="height_range_spin_0" top_delta="20" - width="100" /> + width="105" /> <!-- southeast high--> <spinner follows="left|top" @@ -467,7 +467,7 @@ min_val="-500" name="height_range_spin_2" top_delta="0" - width="100" /> + width="105" /> <!-- Terrain Download/Upload/Bake buttons --> <button follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml index a29cdb5b41..c03d6a9745 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml @@ -35,7 +35,7 @@ layout="topleft" left_delta="15" top_pad="15" - width="80"> + width="86"> Ambient Color: </text> <color_swatch @@ -53,9 +53,9 @@ follows="left" height="10" layout="topleft" - left_delta="90" + left_delta="110" top_delta="-15" - width="80"> + width="86"> Blue Horizon: </text> <color_swatch @@ -73,9 +73,9 @@ follows="left" height="10" layout="topleft" - left_delta="90" + left_delta="110" top_delta="-15" - width="80"> + width="86"> Blue Density: </text> <color_swatch @@ -166,7 +166,7 @@ layout="topleft" left_delta="-5" top_delta="25" - width="80"> + width="90"> Moisture Level: </text> <slider @@ -190,7 +190,7 @@ layout="topleft" left_delta="-5" top_delta="25" - width="80"> + width="90"> Droplet Radius: </text> <slider 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 16111758cc..2d3a8618ed 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -91,7 +91,7 @@ left="0" name="balance" tool_tip="L$ [AMT] Click to refresh your L$ balance. Double-click to display or hide your L$ balance." - v_pad="4" + v_pad="2" top="0" wrap="false" value="L$??" @@ -102,7 +102,7 @@ follows="right|top|bottom" image_hover_unselected="PushButton_Over" image_unselected="PushButton_Off" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" height="18" label="Buy L$" label_color="White" @@ -122,7 +122,7 @@ image_overlay_alignment="left" image_hover_unselected="PushButton_Over" image_unselected="PushButton_Off" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" height="18" label="Shop" label_color="White" @@ -140,7 +140,7 @@ follows="right|top" halign="right" height="16" - top="5" + top="3" layout="topleft" left_pad="0" name="TimeText" diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index 1c70383bf9..5ff02de6f6 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -51,7 +51,9 @@ name="color label" text_readonly_color="LabelDisabledColor" top="6" - width="64"> + width="64" + font="DejaVu" + font.size="LSmall" > Color </text> <!-- label is blank because control places it below the box --> @@ -77,7 +79,9 @@ name="color trans" text_readonly_color="LabelDisabledColor" top="6" - width="110"> + width="110" + font="DejaVu" + font.size="LSmall" > Transparency % </text> <spinner @@ -91,7 +95,9 @@ max_val="100" name="ColorTrans" top_pad="4" - width="80" /> + width="80" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -102,7 +108,9 @@ name="glow label" text_readonly_color="LabelDisabledColor" top="6" - width="80"> + width="80" + font="DejaVu" + font.size="LSmall" > Glow </text> <spinner @@ -114,7 +122,9 @@ left_delta="0" name="glow" top_pad="4" - width="77" /> + width="77" + font="DejaVu" + font.size="LSmall" /> <check_box height="19" label="Full Bright" @@ -122,7 +132,9 @@ left="7" name="checkbox fullbright" top_pad="4" - width="81" /> + width="81" + font="DejaVu" + font.size="LSmall" /> <check_box height="19" label="Hide water" @@ -130,7 +142,9 @@ left="172" top_delta="0" name="checkbox_hide_water" - width="81" /> + width="81" + font="DejaVu" + font.size="LSmall" /> <view_border bevel_style="none" follows="top|left" @@ -139,7 +153,9 @@ left="8" name="object_horizontal" top_pad="4" - width="278" /> + width="278" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -149,7 +165,9 @@ left="12" top_pad="12" name="label_matmedia" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall" > Material </text> <combo_box @@ -158,7 +176,9 @@ left="10" name="combobox matmedia" top_pad="5" - width="90"> + width="90" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Textures" name="Materials" @@ -179,7 +199,9 @@ top_delta="-20" width="150" visible = "false" - name="radio_material_type"> + name="radio_material_type" + font="DejaVu" + font.size="LSmall" > <radio_item label="Texture (diffuse)" name="Texture (diffuse)" @@ -209,7 +231,9 @@ top_delta="0" width="150" visible = "false" - name="radio_pbr_type"> + name="radio_pbr_type" + font="DejaVu" + font.size="LSmall" > <radio_item label="Complete material" name="Complete material" @@ -270,7 +294,9 @@ name="checkbox_sync_settings" tool_tip="Adjust all maps repeats simultaneously" top_pad="19" - width="160" /> + width="160" + font="DejaVu" + font.size="LSmall" /> <texture_picker can_apply_immediately="true" allow_no_texture="true" @@ -282,7 +308,9 @@ name="pbr_control" tool_tip="Click to choose a pbr material" top_pad="5" - width="64" /> + width="64" + caption_text.font="DejaVu" + caption_text.font.size="LSmall" /> <button follows="left|top" height="23" @@ -291,7 +319,9 @@ top_delta="0" name="pbr_from_inventory" label="Choose from inventory" - width="140"/> + width="140" + font="DejaVu" + font.size="LSmall" /> <text visible="false" type="string" @@ -303,7 +333,9 @@ left_delta="0" name="material_permissions_loading_label" text_readonly_color="LabelDisabledColor" - width="160"> + width="160" + font="DejaVu" + font.size="LSmall" > Loading contents... </text> <button @@ -314,7 +346,9 @@ top_delta="0" name="edit_selected_pbr" label="Edit Selected" - width="140"/> + width="140" + font="DejaVu" + font.size="LSmall" /> <button follows="left|top" height="23" @@ -323,7 +357,9 @@ top_pad="4" name="save_selected_pbr" label="Save to inventory" - width="140"/> + width="140" + font="DejaVu" + font.size="LSmall" /> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -336,7 +372,9 @@ name="texture control" tool_tip="Click to choose a picture" top_delta="-54" - width="64" /> + width="64" + caption_text.font="DejaVu" + caption_text.font.size="LSmall" /> <text type="string" length="1" @@ -347,7 +385,9 @@ name="label alphamode" text_readonly_color="LabelDisabledColor" top_delta="0" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall" > Alpha mode </text> <combo_box @@ -356,7 +396,9 @@ left_delta="0" name="combobox alphamode" top_pad="4" - width="120"> + width="120" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall"> <combo_box.item label="None" name="None" @@ -384,7 +426,9 @@ name="label maskcutoff" text_readonly_color="LabelDisabledColor" top_pad="4" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall" > Mask cutoff </text> <spinner @@ -399,7 +443,9 @@ left_delta="0" increment="1" name="maskcutoff" - width="80" /> + width="80" + font="DejaVu" + font.size="LSmall" /> <texture_picker allow_no_texture="true" can_apply_immediately="true" @@ -413,7 +459,9 @@ name="bumpytexture control" tool_tip="Click to choose a picture" top_delta="-55" - width="64" /> + width="64" + caption_text.font="DejaVu" + caption_text.font.size="LSmall" /> <text type="string" length="1" @@ -424,7 +472,9 @@ name="label bumpiness" text_readonly_color="LabelDisabledColor" top_delta="0" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall" > Bumpiness </text> <combo_box @@ -433,7 +483,9 @@ left_delta="0" name="combobox bumpiness" top_pad="4" - width="90"> + width="90" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="None" name="None" @@ -527,7 +579,9 @@ name="shinytexture control" tool_tip="Click to choose a picture" top_delta="-14" - width="64" /> + width="64" + caption_text.font="DejaVu" + caption_text.font.size="LSmall" /> <text type="string" length="1" @@ -538,7 +592,9 @@ left_pad="10" text_readonly_color="LabelDisabledColor" top_delta="4" - width="90"> + width="90" + font="DejaVu" + font.size="LSmall" > Shininess </text> <combo_box @@ -547,7 +603,9 @@ left_pad="10" name="combobox shininess" top_delta="-6" - width="90"> + width="90" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="None" name="None" @@ -582,7 +640,9 @@ name="label glossiness" text_readonly_color="LabelDisabledColor" top_pad="7" - width="116"> + width="116" + font="DejaVu" + font.size="LSmall" > Glossiness </text> <spinner @@ -597,7 +657,9 @@ top_delta="-4" left_pad="10" name="glossiness" - width="64" /> + width="64" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -608,7 +670,9 @@ name="label environment" text_readonly_color="LabelDisabledColor" top_pad="8" - width="116"> + width="116" + font="DejaVu" + font.size="LSmall" > Environment </text> <spinner @@ -623,7 +687,9 @@ top_delta="-4" left_pad="10" name="environment" - width="64" /> + width="64" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -634,7 +700,9 @@ name="label shinycolor" text_readonly_color="LabelDisabledColor" top_pad="8" - width="116"> + width="116" + font="DejaVu" + font.size="LSmall" > Color </text> <!-- label is blank because control places it below the box --> @@ -658,7 +726,9 @@ use_ellipses="true" read_only="true" name="media_info" - width="280"> + width="280" + font="DejaVu" + font.size="LSmall" > URL of chosen media, if any, goes here </text> <button @@ -670,7 +740,9 @@ top_pad="4" tool_tip="Add Media" label="Choose..." - width="85"/> + width="85" + font="DejaVu" + font.size="LSmall" /> <button follows="top|left" height="18" @@ -680,7 +752,9 @@ tool_tip="Delete this media texture" top_delta="0" label="Remove" - width="85"/> + width="85" + font="DejaVu" + font.size="LSmall" /> <button follows="left|top" height="18" @@ -691,7 +765,9 @@ name="button align" top_delta="0" tool_tip="Align media texture (must load first)" - width="85" /> + width="85" + font="DejaVu" + font.size="LSmall" /> <text type="string" length="1" @@ -702,7 +778,9 @@ name="tex gen" text_readonly_color="LabelDisabledColor" top_pad="46" - width="140"> + width="140" + font="DejaVu" + font.size="LSmall" > Mapping </text> <combo_box @@ -711,7 +789,9 @@ left_pad="0" name="combobox texgen" top_pad="-13" - width="125"> + width="125" + drop_down_button.font="DejaVu" + drop_down_button.font.size="LSmall" > <combo_box.item label="Default" name="Default" @@ -733,7 +813,9 @@ max_val="10000" name="TexScaleU" top_pad="5" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -745,7 +827,9 @@ min_val="-10000" max_val="10000" name="TexScaleV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="1" follows="left|top" @@ -758,7 +842,9 @@ max_val="100" min_val="-100" name="rptctrl" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -772,7 +858,9 @@ max_val="360" min_val="-360" name="TexRot" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -784,7 +872,9 @@ min_val="-1" max_val="1" name="TexOffsetU" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -796,7 +886,9 @@ min_val="-1" max_val="1" name="TexOffsetV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -809,7 +901,9 @@ max_val="10000" name="bumpyScaleU" top_delta="-115" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -821,7 +915,9 @@ min_val="-10000" max_val="10000" name="bumpyScaleV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -836,7 +932,9 @@ max_val="360" min_val="-360" name="bumpyRot" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -848,7 +946,9 @@ min_val="-1" max_val="1" name="bumpyOffsetU" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -860,7 +960,9 @@ min_val="-1" max_val="1" name="bumpyOffsetV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -873,7 +975,9 @@ max_val="10000" name="shinyScaleU" top_delta="-115" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -885,7 +989,9 @@ min_val="-10000" max_val="10000" name="shinyScaleV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="2" follows="left|top" @@ -900,7 +1006,9 @@ max_val="360" min_val="-360" name="shinyRot" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -912,7 +1020,9 @@ min_val="-1" max_val="1" name="shinyOffsetU" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -924,7 +1034,9 @@ min_val="-1" max_val="1" name="shinyOffsetV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <check_box follows="top|left" height="16" @@ -935,7 +1047,9 @@ name="checkbox planar align" tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping." top_delta="20" - width="260" /> + width="260" + font="DejaVu" + font.size="LSmall" /> <button follows="left|top" layout="topleft" @@ -946,7 +1060,9 @@ label_selected="Align current texture layers" name="button align textures" tool_tip="Align current texture layers" - width="66" /> + width="66" + font="DejaVu" + font.size="LSmall" /> <web_browser visible="false" enabled="false" @@ -972,7 +1088,9 @@ max_val="10000" name="gltfTextureScaleU" top_delta="34" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -984,7 +1102,9 @@ min_val="-10000" max_val="10000" name="gltfTextureScaleV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner decimal_digits="1" follows="left|top" @@ -997,7 +1117,9 @@ max_val="100" min_val="-100" name="gltfRptctrl" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -1009,7 +1131,9 @@ min_val="-360" max_val="360" name="gltfTextureRotation" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -1021,7 +1145,9 @@ min_val="-999" max_val="999" name="gltfTextureOffsetU" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <spinner follows="left|top" height="19" @@ -1033,6 +1159,8 @@ min_val="-999" max_val="999" name="gltfTextureOffsetV" - width="265" /> + width="265" + font="DejaVu" + font.size="LSmall" /> <!-- END PBR Material texture transform parameters --> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_voice_effect.xml b/indra/newview/skins/default/xui/en/panel_voice_effect.xml deleted file mode 100644 index 42cd510efd..0000000000 --- a/indra/newview/skins/default/xui/en/panel_voice_effect.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel - follows="all" - height="26" - layout="topleft" - name="panel_voice_effect" - width="200"> - <string name="no_voice_effect"> - Voice Morphing Off - </string> - <string name="preview_voice_effects"> - Preview Voice Morphing ▶ - </string> - <string name="get_voice_effects"> - Get Voice Morphing ▶ - </string> - <combo_box - enabled="false" - follows="left|top|right" - height="23" - name="voice_effect" - tool_tip="Select a Voice Morph to change your voice" - top_pad="0" - width="200"> - <combo_box.item - label="Voice Morphing Off" - name="no_voice_effect" - top_pad="0" - value="0" /> - <combo_box.commit_callback - function="Voice.CommitVoiceEffect" /> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index a16b0b58da..bc0350c446 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -29,7 +29,7 @@ width="333"> background_visible="true" bg_opaque_color="DkGray2" left="10" - top="5" + top="0" follows="left|top|right" layout="topleft" width="307" @@ -50,25 +50,15 @@ width="333"> layout="topleft" name="openoutfit_btn" visible="false" /> - <icon - follows="top|left" - height="31" - image_name="Shirt_Large" - name="outfit_icon" - mouse_opaque="false" - visible="true" - left="1" - top="0" - width="31" /> <text - font="SansSerifSmall" + font="SansSerifSmallBold" text_color="EmphasisColor" width="300" height="13" follows="top|left|right" layout="topleft" - left="35" - top="3" + left="5" + top="0" mouse_opaque="false" name="currentlook_status" > (Status) @@ -76,7 +66,7 @@ width="333"> <text font="SansSerifLargeBold" height="20" - left="35" + left="5" parse_urls="false" text_color="White" top="15" diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index de47e05291..3fc22d69ca 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -69,7 +69,6 @@ <button control_name="InventoryInboxToggleState" label="Received items" - font="SansSerifMedium" name="inbox_btn" height="35" image_unselected="MarketplaceBtn_Off" @@ -92,7 +91,6 @@ top="10" right="-20" name="inbox_fresh_new_count" - font="SansSerifMedium" halign="right" top_pad="0"> [NUM] new diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 1860d38b0e..60304b6962 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -116,6 +116,8 @@ Voice Server Version: [VOICE_VERSION] <string name="AgniGridLabel">Second Life Main Grid (Agni)</string> <string name="AditiGridLabel">Second Life Beta Test Grid (Aditi)</string> + <string name="AgniGridLabelShort">Agni (production)</string> + <string name="AditiGridLabelShort">Aditi (beta)</string> <string name="ViewerDownloadURL">http://secondlife.com/download</string> <string name="LoginFailedViewerNotPermitted"> @@ -3007,6 +3009,9 @@ If this message persists, restart your computer. [APP_NAME] appears to have frozen or crashed on the previous run. Would you like to send a crash report? </string> + <string name="MBFreezeDetected"> + [APP_NAME] appears to have frozen. If this issue occurs regularly, please contact support at https://support.secondlife.com. + </string> <string name="MBAlert">Notification</string> <string name="MBNoDirectX"> [APP_NAME] is unable to detect DirectX 9.0b or greater. diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml index 090447a6a2..c7669e81af 100644 --- a/indra/newview/skins/default/xui/en/widgets/button.xml +++ b/indra/newview/skins/default/xui/en/widgets/button.xml @@ -11,7 +11,7 @@ image_top_pad="0" image_bottom_pad="0" imgoverlay_label_space="1" - label_color="ButtonLabelColor" + label_color="White" label_color_selected="ButtonLabelSelectedColor" label_color_disabled="ButtonLabelDisabledColor" label_color_disabled_selected="ButtonLabelSelectedDisabledColor" @@ -21,9 +21,10 @@ font="SansSerifSmall" hover_glow_amount="0.15" halign="center" - pad_bottom="1" + pad_bottom="2" height="23" scale_image="true" + label_shadow="false" handle_right_mouse="true" use_draw_context_alpha="true" held_down_delay.seconds="0.5" diff --git a/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml b/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml index cf995e5833..ebe2fa07e2 100644 --- a/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml +++ b/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml @@ -9,7 +9,7 @@ left_pad="0" icon_pad="10" icon_width="20" - text_pad="7" + text_pad="5" text_pad_right="4" arrow_size="12" max_folder_item_overlap="2" diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index 604f62b099..3a0f43de3d 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -7,10 +7,10 @@ select_on_focus="true" text_tentative_color="TextFgTentativeColor" highlight_text_field="true" - background_image="TextField_Search_Off" - background_image_disabled="TextField_Search_Disabled" - background_image_focused="TextField_Search_Active" - background_image_highlight="TextField_Search_Highlight"> + background_image="TextField_Off" + background_image_disabled="TextField_Disabled" + background_image_focused="TextField_Active" + background_image_highlight="TextField_Highlight"> <search_button label="" top_pad="4" left_pad="4" diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml index 11758556d6..73c6dc5d7a 100644 --- a/indra/newview/skins/default/xui/en/widgets/floater.xml +++ b/indra/newview/skins/default/xui/en/widgets/floater.xml @@ -9,7 +9,9 @@ bg_alpha_image="Window_Background" background_visible="true" background_opaque="false" + header_font="SansSerif" header_height="25" + header_vpad="5" close_image="Icon_Close_Foreground" restore_image="Icon_Restore_Foreground" minimize_image="Icon_Minimize_Foreground" diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml index 50c5285e04..671cb37ca3 100644 --- a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml @@ -3,16 +3,21 @@ folder_arrow_image="Folder_Arrow" favorite_image="Inv_Favorite_Star_Full" favorite_content_image="Inv_Favorite_Star_Content" - folder_indentation="8" - item_height="20" + folder_indentation="10" + item_height="21" item_top_pad="4" selection_image="Rounded_Square" mouse_opaque="true" follows="left|top|right" left_pad="5" - icon_pad="2" + icon_pad="4" icon_width="16" - text_pad="1" + text_pad="5" text_pad_right="4" + text_pad_top="0" arrow_size="12" max_folder_item_overlap="2"/> + +<!-- Potential properties not included above: + arrow_pad_top +--> diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml index 14cd3e159c..499152f060 100644 --- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml +++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_list.xml @@ -10,7 +10,7 @@ mouse_opaque="false" scale_image="true" image_selected="PushButton_Selected_Press" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_unselected="PushButton_Off" image_disabled="PushButton_Disabled" diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml index 865c145022..41ef9d2b8a 100644 --- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml +++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml @@ -6,7 +6,7 @@ folder_indentation="8" item_height="20" item_top_pad="4" - selection_image="Rounded_Square" + selection_image="Square_Selection" left_pad="5" icon_pad="2" icon_width="16" 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 index 09cbb1d3ab..ad4249da4e 100644 --- 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 @@ -2,7 +2,7 @@ <inbox_folder_view_item item_height="20" item_top_pad="4" - selection_image="Rounded_Square" + selection_image="Square_Selection" > <new_badge label="New" diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml index ce36a39a21..b00b8a241b 100644 --- a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml @@ -17,7 +17,7 @@ <worn_style font="SansSerifSmall" font.style="BOLD" - color="EmphasisColor" /> + color="WornOutfitTextColor" /> <item_icon height="16" follows="top|left" diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml index ae642e1da5..cf6dc0a8c0 100644 --- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml @@ -11,7 +11,7 @@ text_pad_left="2" text_readonly_color="TextFgReadOnlyColor" text_tentative_color="TextFgTentativeColor" - highlight_color="EmphasisColor" + highlight_color="SelectionColor" preedit_bg_color="White" mouse_opaque="true" name="line_editor" diff --git a/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml index ea49b750d1..6824080b49 100644 --- a/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml @@ -55,7 +55,6 @@ width="30" /> <panel_camera_item.text follows="top|left|right" - font="SansSerifMedium" height="15" layout="topleft" left ="38" diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index 51144c92b6..8294b96799 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -8,10 +8,10 @@ select_on_focus="true" text_tentative_color="TextFgTentativeColor" highlight_text_field="true" - background_image="TextField_Search_Off" - background_image_disabled="TextField_Search_Disabled" - background_image_focused="TextField_Search_Active" - background_image_highlight="TextField_Search_Highlight"> + background_image="TextField_Off" + background_image_disabled="TextField_Disabled" + background_image_focused="TextField_Active" + background_image_highlight="TextField_Highlight"> <search_button top_pad="4" left_pad="4" diff --git a/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml b/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml index b99010e17a..041470d0d2 100644 --- a/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml @@ -15,12 +15,12 @@ default_color="TextDefaultColor" text_color="TextFgColor" text_readonly_color="TextFgReadOnlyColor" - text_selected_color="White" + text_selected_color="Black" h_pad="6" v_pad="4" bg_visible="true" bg_readonly_color="TextBgReadOnlyColor" bg_writeable_color="TextBgWriteableColor" - bg_selected_color="EmphasisColor" + bg_selected_color="SelectionColor" bg_focus_color="TextBgFocusColor"> </simple_text_editor> diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 22955fe73d..63613d34cb 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -6,10 +6,11 @@ label_pad_left - padding to the left of tab button labels <tab_container name="tab_container" mouse_opaque="false" tab_min_width="60" - tab_max_width="150" + tab_max_width="160" use_custom_icon_ctrl="false" halign="center" - font="SansSerifSmall" + font="SansSerif" + font.size="Small" tab_height="21" label_pad_bottom="1" label_pad_left="4"> @@ -19,22 +20,22 @@ label_pad_left - padding to the left of tab button labels tab_left_image_flash tab_top_image_flash --> - <first_tab tab_top_image_unselected="TabTop_Left_Off" - tab_top_image_selected="TabTop_Left_Selected" + <first_tab tab_top_image_unselected="TabTop_First_Flat_Off" + tab_top_image_selected="TabTop_First_Flat_Selected" tab_bottom_image_unselected="Toolbar_Left_Off" tab_bottom_image_selected="Toolbar_Left_Selected" - tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> - <middle_tab tab_top_image_unselected="TabTop_Middle_Off" - tab_top_image_selected="TabTop_Middle_Selected" + tab_left_image_unselected="TabLeft_Flat_Off" + tab_left_image_selected="TabLeft_Flat_Selected"/> + <middle_tab tab_top_image_unselected="TabTop_Middle_Flat_Off" + tab_top_image_selected="TabTop_Middle_Flat_Selected" tab_bottom_image_unselected="Toolbar_Middle_Off" tab_bottom_image_selected="Toolbar_Middle_Selected" - tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> - <last_tab tab_top_image_unselected="TabTop_Right_Off" - tab_top_image_selected="TabTop_Right_Selected" + tab_left_image_unselected="TabLeft_Flat_Off" + tab_left_image_selected="TabLeft_Flat_Selected"/> + <last_tab tab_top_image_unselected="TabTop_Last_Flat_Off" + tab_top_image_selected="TabTop_Last_Flat_Selected" tab_bottom_image_unselected="Toolbar_Right_Off" tab_bottom_image_selected="Toolbar_Right_Selected" - tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> + tab_left_image_unselected="TabLeft_Flat_Off" + tab_left_image_selected="TabLeft_Flat_Selected"/> </tab_container> diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml index 8345911525..a038fe5181 100644 --- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml +++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml @@ -15,16 +15,17 @@ <button_icon_and_text imgoverlay_label_space="7" label_color_selected="White" halign="left" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" image_disabled_selected="PushButton_Selected_Disabled" image_disabled="PushButton_Disabled" button_width.min="70" - button_width.max="140" + button_width.max="172" desired_height="24" pad_left="10" pad_right="10" + pad_bottom="1" follows="left|top" chrome="true" image_overlay_alignment="left" @@ -37,7 +38,7 @@ pad_right="10" image_bottom_pad="10" image_top_pad="10" - image_pressed="PushButton_Press" + image_pressed="PushButton_Selected" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" image_disabled_selected="PushButton_Selected_Disabled" diff --git a/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml b/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml index aa235e103b..a0b119ed72 100644 --- a/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <inventory_list_item follows="top|right|left" - height="20" + height="21" name="inventory_item" tab_stop="false" hover_image="ListItem_Over" @@ -17,7 +17,7 @@ <worn_style font="SansSerifSmall" font.style="BOLD" - color="EmphasisColor" /> + color="WornOutfitTextColor" /> <item_icon height="16" follows="top|left" @@ -25,18 +25,18 @@ layout="topleft" left="0" name="item_icon" - top="0" + top="1" width="16" /> <item_name follows="left|right" - height="20" + height="21" layout="topleft" left="21" parse_urls="false" use_ellipses="true" name="item_name" text_color="white" - top="4" + top="2" value="..." width="359" /> <add_btn diff --git a/indra/newview/skins/default/xui/es/floater_big_preview.xml b/indra/newview/skins/default/xui/es/floater_big_preview.xml deleted file mode 100644 index b112243d7a..0000000000 --- a/indra/newview/skins/default/xui/es/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="VISTA PREVIA"/> diff --git a/indra/newview/skins/default/xui/es/floater_post_process.xml b/indra/newview/skins/default/xui/es/floater_post_process.xml deleted file mode 100644 index 5c62ccde36..0000000000 --- a/indra/newview/skins/default/xui/es/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="CONFIGURACIÓN DEL PROCESAMIENTO"> - <tab_container name="Post-Process Tabs"> - <panel label="Color del filtro" name="wmiColorFilterPanel"> - <check_box label="Activar" name="wmiColorFilterToggle"/> - <text name="wmiColorFilterBrightnessText"> - Brillo - </text> - <text name="wmiColorFilterSaturationText"> - Saturación - </text> - <text name="wmiColorFilterContrastText"> - Contraste - </text> - <text name="wmiColorFilterBaseText"> - Color base del contraste - </text> - <slider label="R" name="wmiColorFilterBaseR"/> - <slider label="V" name="wmiColorFilterBaseG"/> - <slider label="A" name="wmiColorFilterBaseB"/> - <slider label="I" name="wmiColorFilterBaseI"/> - </panel> - <panel label="Visión nocturna" name="wmiNightVisionPanel"> - <check_box label="Activar" name="wmiNightVisionToggle"/> - <text name="wmiNightVisionBrightMultText"> - Amplificación de luz - </text> - <text name="wmiNightVisionNoiseSizeText"> - Cantidad de ruido - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Intensidad del ruido - </text> - </panel> - <panel label="Bloom" name="wmiBloomPanel"> - <check_box label="Activar" name="wmiBloomToggle"/> - <text name="wmiBloomExtractText"> - Extracción de la luminosidad - </text> - <text name="wmiBloomSizeText"> - Bloom: cantidad - </text> - <text name="wmiBloomStrengthText"> - Bloom: intensidad - </text> - </panel> - <panel label="Extras" name="Extras"> - <button label="Cargar efecto" label_selected="Cargar efecto" name="PPLoadEffect"/> - <button label="Guardar efecto" label_selected="Guardar efecto" name="PPSaveEffect"/> - <line_editor label="Nombre del efecto" name="PPEffectNameEditor"/> - </panel> - </tab_container> -</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 deleted file mode 100644 index 0291f9e796..0000000000 --- a/indra/newview/skins/default/xui/es/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="DISPOSITIVOS DE SONIDO"> - <text name="voice_label"> - Chat de voz - </text> - <check_box label="Activados" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/es/floater_voice_effect.xml b/indra/newview/skins/default/xui/es/floater_voice_effect.xml deleted file mode 100644 index 02ebe80ff7..0000000000 --- a/indra/newview/skins/default/xui/es/floater_voice_effect.xml +++ /dev/null @@ -1,138 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Lugares" name="voice_effects" title="PROBAR TRANSFORMACIÓN DE VOZ"> - <string name="no_voice_effect"> - (Sin transformación de voz) - </string> - <string name="active_voice_effect"> - (Activo) - </string> - <string name="unsubscribed_voice_effect"> - (Suscripción cancelada) - </string> - <string name="new_voice_effect"> - (¡Nuevo!) - </string> - <string name="effect_Arena"> - Campo - </string> - <string name="effect_Beast"> - Bestia - </string> - <string name="effect_Buff"> - Musculoso - </string> - <string name="effect_Buzz"> - Murmullo - </string> - <string name="effect_Camille"> - Camila - </string> - <string name="effect_Creepy"> - Aterrador - </string> - <string name="effect_CreepyBot"> - Robot aterrador - </string> - <string name="effect_Cyber"> - Cyber - </string> - <string name="effect_DeepBot"> - Robot profundo - </string> - <string name="effect_Demon"> - Diablo - </string> - <string name="effect_Flirty"> - Coqueta - </string> - <string name="effect_Foxy"> - Astuto - </string> - <string name="effect_Halloween_2010_Bonus"> - Halloween_2010_Bonus - </string> - <string name="effect_Helium"> - Helio - </string> - <string name="effect_Husky"> - Corpulento - </string> - <string name="effect_Intercom"> - Intercom - </string> - <string name="effect_Macho"> - Macho - </string> - <string name="effect_Micro"> - Micro - </string> - <string name="effect_Mini"> - Mini - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - Pesadilla - </string> - <string name="effect_PopBot"> - Robot pop - </string> - <string name="effect_Rachel"> - Raquel - </string> - <string name="effect_Radio"> - Radio - </string> - <string name="effect_Robot"> - Robot - </string> - <string name="effect_Roxanne"> - Roxana - </string> - <string name="effect_Sabrina"> - Sabrina - </string> - <string name="effect_Samantha"> - Samanta - </string> - <string name="effect_Sexy"> - Sexy - </string> - <string name="effect_Shorty"> - Bajito - </string> - <string name="effect_Sneaky"> - Furtivo - </string> - <string name="effect_Stallion"> - Mujeriego - </string> - <string name="effect_Sultry"> - Sensual - </string> - <string name="effect_Thunder"> - Trueno - </string> - <string name="effect_Vixen"> - Tigresa - </string> - <string name="effect_WhinyBot"> - Robot llorica - </string> - <text name="preview_text"> - Para probarla - </text> - <text name="status_text"> - Graba una muestra y pulsa en una voz para escuchar cómo suena. - </text> - <button label="Grabar" name="record_btn" tool_tip="Graba una muestra de tu voz."/> - <button label="Parar" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] Suscríbete ahora] - </text> - <scroll_list name="voice_effect_list" tool_tip="Graba una muestra de tu voz y pulsa en un efecto para ver cómo suena."> - <scroll_list.columns label="Nombre de la voz" name="name"/> - <scroll_list.columns label="Caduca" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/es/panel_login_first.xml b/indra/newview/skins/default/xui/es/panel_login_first.xml deleted file mode 100644 index ccb6858351..0000000000 --- a/indra/newview/skins/default/xui/es/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php?lang=es - </panel.string> - <panel.string name="sign_up_url"> - https://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Nombre de usuario" name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/> - <line_editor label="Contraseña" name="password_edit"/> - <button label="Iniciar sesión" name="connect_btn"/> - <check_box label="Recordarme" name="remember_check"/> - <text name="forgot_password_text"> - Contraseña olvidada - </text> - <text name="sign_up_text"> - Regístrate - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Tu primer destino es la Isla de aprendizaje. ¡Encuentra el portal de salida! - </text> - <text name="image_caption_right"> - A continuación, puedes explorar la Isla social y hablar con otros residentes nuevos. - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/es/panel_voice_effect.xml b/indra/newview/skins/default/xui/es/panel_voice_effect.xml deleted file mode 100644 index 94a0428941..0000000000 --- a/indra/newview/skins/default/xui/es/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Transformación de voz desactivada - </string> - <string name="preview_voice_effects"> - Probar transformación de voz ▶ - </string> - <string name="get_voice_effects"> - Obtener transformación de voz ▶ - </string> - <combo_box name="voice_effect" tool_tip="Selecciona una transformación de voz para cambiar tu voz"> - <combo_box.item label="Transformación de voz desactivada" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/fr/floater_big_preview.xml b/indra/newview/skins/default/xui/fr/floater_big_preview.xml deleted file mode 100644 index 0c09a4c188..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="APERÇU"/> diff --git a/indra/newview/skins/default/xui/fr/floater_post_process.xml b/indra/newview/skins/default/xui/fr/floater_post_process.xml deleted file mode 100644 index a22c7512e5..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_post_process.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Post-Process Floater" title="PARAMÈTRES POST-TRAITEMENT"> - <tab_container name="Post-Process Tabs"> - <panel label="Filtre couleur" name="wmiColorFilterPanel"> - <check_box label="Activer" name="wmiColorFilterToggle" /> - <text name="wmiColorFilterBrightnessText"> - Luminosité - </text> - <text name="wmiColorFilterSaturationText"> - Saturation - </text> - <text name="wmiColorFilterContrastText"> - Contraste - </text> - <text name="wmiColorFilterBaseText"> - Couleur de base du contraste - </text> - <slider label="R" name="wmiColorFilterBaseR" /> - <slider label="V" name="wmiColorFilterBaseG" /> - <slider label="B" name="wmiColorFilterBaseB" /> - <slider label="I" name="wmiColorFilterBaseI" /> - </panel> - <panel label="Vision de nuit" name="wmiNightVisionPanel"> - <check_box label="Activer" name="wmiNightVisionToggle" /> - <text name="wmiNightVisionBrightMultText"> - Multiple d'amplificateur de lumière - </text> - <text name="wmiNightVisionNoiseSizeText"> - Taille du bruit - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Force du bruit - </text> - </panel> - <panel label="Éclat" name="wmiBloomPanel"> - <check_box label="Activer" name="wmiBloomToggle" /> - <text name="wmiBloomExtractText"> - Extraction de la luminosité - </text> - <text name="wmiBloomSizeText"> - Taille de l'éclat - </text> - <text name="wmiBloomStrengthText"> - Force de l'éclat - </text> - </panel> - <panel label="Extras" name="Extras"> - <button label="Charger effet" label_selected="Charger effet" name="PPLoadEffect" /> - <button label="Enregistrer effet" label_selected="Enregistrer effet" - name="PPSaveEffect" /> - <line_editor label="Nom de l'effet" name="PPEffectNameEditor" /> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_sound_devices.xml b/indra/newview/skins/default/xui/fr/floater_sound_devices.xml deleted file mode 100644 index 080ade9dd4..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="PERIPHERIQUES AUDIO"> - <text name="voice_label"> - Chat vocal - </text> - <check_box label="Activé" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml deleted file mode 100644 index f9a76d127e..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Endroits" name="voice_effects" title="APERÇU DES EFFETS DE VOIX"> - <string name="no_voice_effect"> - (Aucun effet de voix) - </string> - <string name="active_voice_effect"> - (Actif) - </string> - <string name="unsubscribed_voice_effect"> - (Pas d'abonnement) - </string> - <string name="new_voice_effect"> - (Nouveau !) - </string> - <string name="effect_Arena"> - Stade - </string> - <string name="effect_Beast"> - Brute - </string> - <string name="effect_Buff"> - Nasal - </string> - <string name="effect_Buzz"> - Friture - </string> - <string name="effect_Camille"> - Camille - </string> - <string name="effect_Creepy"> - Effrayant - </string> - <string name="effect_CreepyBot"> - BotEffrayant - </string> - <string name="effect_Cyber"> - Cyber - </string> - <string name="effect_DeepBot"> - BotGrave - </string> - <string name="effect_Demon"> - Démon - </string> - <string name="effect_Female Elf"> - Femme elfe - </string> - <string name="effect_Flirty"> - Flirt - </string> - <string name="effect_Foxy"> - Séduction - </string> - <string name="effect_Halloween 2010 Bonus"> - Halloween_2010_Bonus - </string> - <string name="effect_Helium"> - Hélium - </string> - <string name="effect_Husky"> - Rauque - </string> - <string name="effect_Husky Whisper"> - Murmure rauque - </string> - <string name="effect_Intercom"> - Interphone - </string> - <string name="effect_Julia"> - Julia - </string> - <string name="effect_Lo Lilt"> - Mélodieux - </string> - <string name="effect_Macho"> - Macho - </string> - <string name="effect_Micro"> - Micro - </string> - <string name="effect_Mini"> - Mini - </string> - <string name="effect_Model"> - Modèle - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - Cauchemar - </string> - <string name="effect_PopBot"> - BotPop - </string> - <string name="effect_Rachel"> - Rachel - </string> - <string name="effect_Radio"> - Radio - </string> - <string name="effect_Robot"> - Robot - </string> - <string name="effect_Roxanne"> - Roxanne - </string> - <string name="effect_Rumble"> - Grondement - </string> - <string name="effect_Sabrina"> - Sabrina - </string> - <string name="effect_Samantha"> - Samantha - </string> - <string name="effect_Sexy"> - Sexy - </string> - <string name="effect_Shorty"> - Petite voix - </string> - <string name="effect_Smaller"> - Plus faible - </string> - <string name="effect_Sneaky"> - Sournois - </string> - <string name="effect_Stallion"> - Étalon - </string> - <string name="effect_Sultry"> - Sensuel - </string> - <string name="effect_Thunder"> - Tonnerre - </string> - <string name="effect_Vixen"> - Mégère - </string> - <string name="effect_WhinyBot"> - BotPleurnichard - </string> - <text name="preview_text"> - Aperçu - </text> - <text name="status_text"> - Enregistrez un extrait et cliquez sur un effet pour obtenir un aperçu. - </text> - <button label="Enregistrer" name="record_btn" tool_tip="Enregistrez un extrait de votre voix."/> - <button label="Arrêter" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] S'abonner] - </text> - <scroll_list name="voice_effect_list" tool_tip="Enregistrez un extrait de votre voix, puis cliquez sur un effet pour obtenir un aperçu."> - <scroll_list.columns label="Nom de l'effet" name="name"/> - <scroll_list.columns label="Date d'expiration" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/fr/panel_login_first.xml b/indra/newview/skins/default/xui/fr/panel_login_first.xml deleted file mode 100644 index 8f40d0230c..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php?lang=fr - </panel.string> - <panel.string name="sign_up_url"> - https://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Nom d'utilisateur" name="username_combo" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/> - <line_editor label="Mot de passe" name="password_edit"/> - <button label="Connexion" name="connect_btn"/> - <check_box font="SansSerifSmall" label="Mémoriser mes informations" name="remember_check"/> - <text name="forgot_password_text"> - Mot de passe oublié - </text> - <text name="sign_up_text"> - S'inscrire - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Votre première étape est Learning Island. Trouvez le portail de sortie. - </text> - <text name="image_caption_right"> - Puis explorez Social Island et faites la connaissance d'autres résidents. - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_voice_effect.xml b/indra/newview/skins/default/xui/fr/panel_voice_effect.xml deleted file mode 100644 index a134854706..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Effet de voix désactivé - </string> - <string name="preview_voice_effects"> - Aperçu des effets de voix ▶ - </string> - <string name="get_voice_effects"> - Obtenir un effet de voix ▶ - </string> - <combo_box name="voice_effect" tool_tip="Sélectionner un effet pour modifier le son de votre voix"> - <combo_box.item label="Effet de voix désactivé" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/it/floater_big_preview.xml b/indra/newview/skins/default/xui/it/floater_big_preview.xml deleted file mode 100644 index 7bc50a6d39..0000000000 --- a/indra/newview/skins/default/xui/it/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="ANTEPRIMA"/> diff --git a/indra/newview/skins/default/xui/it/floater_post_process.xml b/indra/newview/skins/default/xui/it/floater_post_process.xml deleted file mode 100644 index 3aa8b29101..0000000000 --- a/indra/newview/skins/default/xui/it/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="IMPOSTAZIONI DI POST-PRODUZIONE"> - <tab_container name="Post-Process Tabs"> - <panel label="Filtro Colore" name="wmiColorFilterPanel"> - <check_box label="Abilita" name="wmiColorFilterToggle"/> - <text name="wmiColorFilterBrightnessText"> - Luminosità - </text> - <text name="wmiColorFilterSaturationText"> - Saturazione - </text> - <text name="wmiColorFilterContrastText"> - Contrasto - </text> - <text name="wmiColorFilterBaseText"> - Colore Base Contrasto - </text> - <slider label="R" name="wmiColorFilterBaseR"/> - <slider label="G" name="wmiColorFilterBaseG"/> - <slider label="B" name="wmiColorFilterBaseB"/> - <slider label="I" name="wmiColorFilterBaseI"/> - </panel> - <panel label="Visione Notturna" name="wmiNightVisionPanel"> - <check_box label="Abilita" name="wmiNightVisionToggle"/> - <text name="wmiNightVisionBrightMultText"> - Amplificazione Multipla Luce - </text> - <text name="wmiNightVisionNoiseSizeText"> - Ampiezza disturbo - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Forza disturbo - </text> - </panel> - <panel label="Raggiatura" name="wmiBloomPanel"> - <check_box label="Abilita" name="wmiBloomToggle"/> - <text name="wmiBloomExtractText"> - Estrazione luminosità - </text> - <text name="wmiBloomSizeText"> - Dimensione raggiatura - </text> - <text name="wmiBloomStrengthText"> - Forza raggiatura - </text> - </panel> - <panel label="Extra" name="Extras"> - <button label="Carica effetto" label_selected="Carica effetto" name="PPLoadEffect"/> - <button label="Salva effetto" label_selected="Salva effetto" name="PPSaveEffect"/> - <line_editor label="Nome Effetto" name="PPEffectNameEditor"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_sound_devices.xml b/indra/newview/skins/default/xui/it/floater_sound_devices.xml deleted file mode 100644 index 9799b48d89..0000000000 --- a/indra/newview/skins/default/xui/it/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="DISPOSITIVI AUDIO"> - <text name="voice_label"> - Chat vocale - </text> - <check_box label="Abilitato" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_voice_effect.xml b/indra/newview/skins/default/xui/it/floater_voice_effect.xml deleted file mode 100644 index f102622f5d..0000000000 --- a/indra/newview/skins/default/xui/it/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Luoghi" name="voice_effects" title="ANTEPRIMA MANIPOLAZIONE VOCE"> - <string name="no_voice_effect"> - (Nessuna manipolazione voce) - </string> - <string name="active_voice_effect"> - (Attivato) - </string> - <string name="unsubscribed_voice_effect"> - (Iscrizione annullata) - </string> - <string name="new_voice_effect"> - (Nuovo!) - </string> - <string name="effect_Arena"> - Arena - </string> - <string name="effect_Beast"> - Bestia - </string> - <string name="effect_Buff"> - Appassionato - </string> - <string name="effect_Buzz"> - Euforia - </string> - <string name="effect_Camille"> - Camilla - </string> - <string name="effect_Creepy"> - Terrificante - </string> - <string name="effect_CreepyBot"> - TerrificanteBot - </string> - <string name="effect_Cyber"> - Cyber - </string> - <string name="effect_DeepBot"> - ProfondoBot - </string> - <string name="effect_Demon"> - Demonio - </string> - <string name="effect_Female Elf"> - Elfo donna - </string> - <string name="effect_Flirty"> - Civettuolo - </string> - <string name="effect_Foxy"> - Scaltro - </string> - <string name="effect_Halloween 2010 Bonus"> - Halloween_2010_Bonus - </string> - <string name="effect_Helium"> - Elio - </string> - <string name="effect_Husky"> - Fusto - </string> - <string name="effect_Husky Whisper"> - Sospiro rauco - </string> - <string name="effect_Intercom"> - Interfono - </string> - <string name="effect_Julia"> - Julia - </string> - <string name="effect_Lo Lilt"> - Inflessione bassa - </string> - <string name="effect_Macho"> - Macho - </string> - <string name="effect_Micro"> - Micro - </string> - <string name="effect_Mini"> - Mini - </string> - <string name="effect_Model"> - Modella - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - Incubo - </string> - <string name="effect_PopBot"> - PopBot - </string> - <string name="effect_Rachel"> - Rachele - </string> - <string name="effect_Radio"> - Radio - </string> - <string name="effect_Robot"> - Robot - </string> - <string name="effect_Roxanne"> - Rosanna - </string> - <string name="effect_Rumble"> - Rombo - </string> - <string name="effect_Sabrina"> - Sabrina - </string> - <string name="effect_Samantha"> - Samanta - </string> - <string name="effect_Sexy"> - Sexy - </string> - <string name="effect_Shorty"> - Bassotto - </string> - <string name="effect_Smaller"> - Più piccolo - </string> - <string name="effect_Sneaky"> - Vile - </string> - <string name="effect_Stallion"> - Stallone - </string> - <string name="effect_Sultry"> - Focoso - </string> - <string name="effect_Thunder"> - Tuono - </string> - <string name="effect_Vixen"> - Maliziosa - </string> - <string name="effect_WhinyBot"> - PiangiBot - </string> - <text name="preview_text"> - Per l'anteprima - </text> - <text name="status_text"> - Registra un campione di voce, quindi fai clic su un effetto per ascoltare il risultato. - </text> - <button label="Registra" name="record_btn" tool_tip="Registra un campione della tua voce."/> - <button label="Ferma" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] Subscribe Now] - </text> - <scroll_list name="voice_effect_list" tool_tip="Registra un campione della tua voce, quindi fai clic su uno degli effetti per un'anteprima del risultato."> - <scroll_list.columns label="Nome effetto" name="name"/> - <scroll_list.columns label="Scade il" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/it/panel_login_first.xml b/indra/newview/skins/default/xui/it/panel_login_first.xml deleted file mode 100644 index 5b04fd411a..0000000000 --- a/indra/newview/skins/default/xui/it/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php?lang=it - </panel.string> - <panel.string name="sign_up_url"> - http://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Nome utente" name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come roby12 o Stella Solare"/> - <line_editor label="Password" name="password_edit"/> - <button label="Accedi" name="connect_btn"/> - <check_box label="Ricordami" name="remember_check"/> - <text name="forgot_password_text"> - Password dimenticata - </text> - <text name="sign_up_text"> - Registrati - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Il primo passo è a Learning Island. Trova il portale di uscita! - </text> - <text name="image_caption_right"> - Quindi esplora Social Island e incontra altri nuovi residenti. - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/it/panel_voice_effect.xml b/indra/newview/skins/default/xui/it/panel_voice_effect.xml deleted file mode 100644 index b43f766e5e..0000000000 --- a/indra/newview/skins/default/xui/it/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Disattiva manipolazione voce - </string> - <string name="preview_voice_effects"> - Anteprima manipolazione voce ▶ - </string> - <string name="get_voice_effects"> - Ottieni manipolazione voce ▶ - </string> - <combo_box name="voice_effect" tool_tip="Scegli un effetto di manipolazione per modificare il suono della tua voce"> - <combo_box.item label="Disattiva manipolazione voce" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/ja/floater_big_preview.xml b/indra/newview/skins/default/xui/ja/floater_big_preview.xml deleted file mode 100644 index e88d6fc488..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="プレビュー"/>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/floater_post_process.xml b/indra/newview/skins/default/xui/ja/floater_post_process.xml deleted file mode 100644 index 91ecbb73a2..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="ポストプロセス設定"> - <tab_container name="Post-Process Tabs"> - <panel label="カラー・フィルタ" name="wmiColorFilterPanel"> - <check_box label="有効" name="wmiColorFilterToggle"/> - <text name="wmiColorFilterBrightnessText"> - 明度 - </text> - <text name="wmiColorFilterSaturationText"> - 彩度 - </text> - <text name="wmiColorFilterContrastText"> - 輝度 - </text> - <text name="wmiColorFilterBaseText"> - 輝度の基準色 - </text> - <slider label="赤" name="wmiColorFilterBaseR"/> - <slider label="緑" name="wmiColorFilterBaseG"/> - <slider label="青" name="wmiColorFilterBaseB"/> - <slider label="I" name="wmiColorFilterBaseI"/> - </panel> - <panel label="暗視" name="wmiNightVisionPanel"> - <check_box label="有効" name="wmiNightVisionToggle"/> - <text name="wmiNightVisionBrightMultText"> - 光の増幅(マルチ) - </text> - <text name="wmiNightVisionNoiseSizeText"> - ノイズ・サイズ - </text> - <text name="wmiNightVisionNoiseStrengthText"> - ノイズ強度 - </text> - </panel> - <panel label="ブルーム" name="wmiBloomPanel"> - <check_box label="有効" name="wmiBloomToggle"/> - <text name="wmiBloomExtractText"> - 明度の抽出 - </text> - <text name="wmiBloomSizeText"> - ブルーム・サイズ - </text> - <text name="wmiBloomStrengthText"> - ブルーム強度 - </text> - </panel> - <panel label="その他" name="Extras"> - <button label="効果読み込み" label_selected="効果読み込み" name="PPLoadEffect"/> - <button label="効果保存" label_selected="効果保存" name="PPSaveEffect"/> - <line_editor label="効果名" name="PPEffectNameEditor"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_sound_devices.xml b/indra/newview/skins/default/xui/ja/floater_sound_devices.xml deleted file mode 100644 index 28d2388bed..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="サウンドデバイス"> - <text name="voice_label"> - ボイスチャット - </text> - <check_box label="有効" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml deleted file mode 100644 index b38ea9331a..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="場所" name="voice_effects" title="ボイスモーフィングのプレビュー"> - <string name="no_voice_effect"> - (ボイスモーフィングなし) - </string> - <string name="active_voice_effect"> - (アクティブ) - </string> - <string name="unsubscribed_voice_effect"> - (取消し済み) - </string> - <string name="new_voice_effect"> - (新登場!) - </string> - <string name="effect_Arena"> - アリーナ - </string> - <string name="effect_Beast"> - 野獣 - </string> - <string name="effect_Buff"> - がっしり - </string> - <string name="effect_Buzz"> - ブザー - </string> - <string name="effect_Camille"> - カミール - </string> - <string name="effect_Creepy"> - 気味の悪い - </string> - <string name="effect_CreepyBot"> - 気味わるボット - </string> - <string name="effect_Cyber"> - サイバー - </string> - <string name="effect_DeepBot"> - ディープボット - </string> - <string name="effect_Demon"> - デーモン - </string> - <string name="effect_Female Elf"> - 女性のエルフ - </string> - <string name="effect_Flirty"> - 気のありそうな - </string> - <string name="effect_Foxy"> - 魅惑的 - </string> - <string name="effect_Halloween 2010 Bonus"> - ハロウィン_2010_ボーナス - </string> - <string name="effect_Helium"> - ヘリウム - </string> - <string name="effect_Husky"> - ハスキー - </string> - <string name="effect_Husky Whisper"> - スモーキーウィスパー - </string> - <string name="effect_Intercom"> - インターホン - </string> - <string name="effect_Julia"> - ジュリア - </string> - <string name="effect_Lo Lilt"> - 軽快 - </string> - <string name="effect_Macho"> - マッチョ - </string> - <string name="effect_Micro"> - ミクロ - </string> - <string name="effect_Mini"> - ミニ - </string> - <string name="effect_Model"> - モデル - </string> - <string name="effect_Nano"> - ナノ - </string> - <string name="effect_Nightmare"> - 悪夢 - </string> - <string name="effect_PopBot"> - ポップボット - </string> - <string name="effect_Rachel"> - レイチェル - </string> - <string name="effect_Radio"> - ラジオ - </string> - <string name="effect_Robot"> - ロボット - </string> - <string name="effect_Roxanne"> - ロクサン - </string> - <string name="effect_Rumble"> - ランブル - </string> - <string name="effect_Sabrina"> - サブリナ - </string> - <string name="effect_Samantha"> - サマンサ - </string> - <string name="effect_Sexy"> - セクシー - </string> - <string name="effect_Shorty"> - チビ - </string> - <string name="effect_Smaller"> - 小さめ - </string> - <string name="effect_Sneaky"> - コソコソ - </string> - <string name="effect_Stallion"> - 雄馬 - </string> - <string name="effect_Sultry"> - 艶かしい - </string> - <string name="effect_Thunder"> - サンダー - </string> - <string name="effect_Vixen"> - 性悪な - </string> - <string name="effect_WhinyBot"> - 不機嫌ボット - </string> - <text name="preview_text"> - プレビュー - </text> - <text name="status_text"> - 声をテスト録音してからボイスエフェクトを1つクリックして聞いてみます。 - </text> - <button label="録音" name="record_btn" tool_tip="あなたの声を録音します。"/> - <button label="停止" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] 今すぐ申し込む] - </text> - <scroll_list name="voice_effect_list" tool_tip="声を録音してボイスモーフィングを1つクリックすると、そのエフェクトをプレビューできます。"> - <scroll_list.columns label="ボイス名" name="name"/> - <scroll_list.columns label="有効期限" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/ja/fonts.xml b/indra/newview/skins/default/xui/ja/fonts.xml index 2085e916c8..7abb3593b6 100644 --- a/indra/newview/skins/default/xui/ja/fonts.xml +++ b/indra/newview/skins/default/xui/ja/fonts.xml @@ -2,11 +2,9 @@ <fonts> <font name="default" comment="default font files (global fallbacks)"> <file> - NotoSansCJKjp-Medium.otf - </file> - <file> - DejaVuSans.ttf + NotoSansCJKjp-SemiBold.otf </file> + <file load_collection="true" font_weight="400">InterVariableFont.ttf</file> <os name="Windows"> <file load_collection="true"> YuGothM.ttc @@ -41,7 +39,7 @@ </os> <os name="Mac"> <file> - YuGothic-Medium.otf + YuGothic-SemiBold.otf </file> <file> ヒラギノ角ゴシック W3.ttc @@ -82,9 +80,7 @@ <file> NotoSansCJKjp-Bold.otf </file> - <file> - DejaVuSans-Bold.ttf - </file> + <file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file> <os name="Windows"> <file load_collection="true"> YuGothB.ttc @@ -104,11 +100,9 @@ </font> <font name="SansSerif" comment="Name of san-serif font (Truetype file name)"> <file> - NotoSansCJKjp-Bold.otf - </file> - <file> - DejaVuSans.ttf + NotoSansCJKjp-SemiBold.otf </file> + <file load_collection="true" font_weight="400">InterVariableFont.ttf</file> <os name="Windows"> <file> arial.ttf @@ -121,19 +115,13 @@ </os> </font> <font name="SansSerif" comment="Name of bold sans-serif font" font_style="BOLD"> - <file> - DejaVuSans-Bold.ttf - </file> + <file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file> </font> <font name="SansSerif" comment="Name of italic sans-serif font" font_style="ITALIC"> - <file> - DejaVuSans-Oblique.ttf - </file> + <file load_collection="true" font_weight="400">InterItalicVariableFont.ttf</file> </font> <font name="SansSerif" comment="Name of bold italic sans-serif font" font_style="BOLD|ITALIC"> - <file> - DejaVuSans-BoldOblique.ttf - </file> + <file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file> </font> <font name="Monospace" comment="Name of monospace font"> <file> @@ -144,29 +132,25 @@ </file> </font> <font name="DejaVu" comment="Name of DejaVu font"> - <file> - DejaVuSans.ttf - </file> + <file>DejaVuSans.ttf</file> </font> <font name="DejaVu" comment="Name of DejaVu font (bold)" font_style="BOLD"> - <file> - DejaVuSans-Bold.ttf - </file> + <file> + DejaVuSans-Bold.ttf + </file> </font> <font name="DejaVu" comment="Name of DejaVu font (italic)" font_style="ITALIC"> - <file> - DejaVuSans-Oblique.ttf - </file> + <file> + DejaVuSans-Oblique.ttf + </file> </font> <font name="DejaVu" comment="Name of DejaVu font (bold italic)" font_style="BOLD|ITALIC"> - <file> - DejaVuSans-BoldOblique.ttf - </file> + <file> + DejaVuSans-BoldOblique.ttf + </file> </font> <font name="Helvetica" comment="Name of Helvetica font"> - <file> - DejaVuSans.ttf - </file> + <file load_collection="true" font_weight="400">InterVariableFont.ttf</file> <os name="Windows"> <file> arial.ttf @@ -179,9 +163,7 @@ </os> </font> <font name="Helvetica" comment="Name of Helvetica font (bold)" font_style="BOLD"> - <file> - DejaVuSans-Bold.ttf - </file> + <file load_collection="true" font_weight="700" flags="bold">InterVariableFont.ttf</file> <os name="Windows"> <file> arialbd.ttf @@ -194,9 +176,7 @@ </os> </font> <font name="Helvetica" comment="Name of Helvetica font (italic)" font_style="ITALIC"> - <file> - DejaVuSans-Oblique.ttf - </file> + <file load_collection="true" font_weight="400">InterItalicVariableFont.ttf</file> <os name="Windows"> <file> ariali.ttf @@ -209,9 +189,7 @@ </os> </font> <font name="Helvetica" comment="Name of Helvetica font (bold italic)" font_style="BOLD|ITALIC"> - <file> - DejaVuSans-BoldOblique.ttf - </file> + <file load_collection="true" flags="bold" font_weight="700">InterItalicVariableFont.ttf</file> <os name="Windows"> <file> arialbi.ttf @@ -227,13 +205,11 @@ <file> times.ttf </file> - <file> - DejaVuSans.ttf - </file> + <file font_weight="400">InterVariableFont.ttf</file> </font> <font_size name="Monospace" comment="Size for monospaced font (points, or 1/72 of an inch)" size="8.0"/> <font_size name="Huge" comment="Size of huge font (points, or 1/72 of an inch)" size="16.0"/> - <font_size name="Large" comment="Size of large font (points, or 1/72 of an inch)" size="10.6"/> - <font_size name="Medium" comment="Size of medium font (points, or 1/72 of an inch)" size="8.6"/> - <font_size name="Small" comment="Size of small font (points, or 1/72 of an inch)" size="7.6"/> + <font_size name="Large" comment="Size of large font (points, or 1/72 of an inch)" size="11"/> + <font_size name="Medium" comment="Size of medium font (points, or 1/72 of an inch)" size="9"/> + <font_size name="Small" comment="Size of small font (points, or 1/72 of an inch)" size="8"/> </fonts> diff --git a/indra/newview/skins/default/xui/ja/panel_login_first.xml b/indra/newview/skins/default/xui/ja/panel_login_first.xml deleted file mode 100644 index 0f987fc816..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_login_first.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - https://secondlife.com/my/account/request.php?lang=ja-JP - </panel.string> - <panel.string name="sign_up_url"> - https://join.secondlife.com/?lang=ja - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="page_top"/> - <layout_panel name="parent_panel"> - <layout_stack name="logo_stack"> - <layout_panel name="logo_left"/> - <layout_panel name="logo_container"> - <icon name="sl_logo"/> - </layout_panel> - <layout_panel auto_resize="true"/> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_left"/> - <layout_panel name="widget_container"> - <combo_box label="ユーザ名" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)" name="username_combo"> - <combo_box.combo_editor/> - <combo_box.combo_button/> - <combo_box.drop_down_button/> - </combo_box> - <line_editor name="password_edit" label="パスワード"/> - <button label="ログイン" name="connect_btn"/> - <text name="sign_up_text" valign="center"> - サインアップ - </text> - <check_box label="ユーザ名を記憶" name="remember_name" tool_tip="すでに記憶されているユーザーは、「私」>「初期設定」>「詳細設定」>「記憶されたユーザー名」から削除できます。"/> - <check_box label="パスワード記憶" name="remember_password"/> - <text name="forgot_password_text"> - パスワードを忘れましたか? - </text> - </layout_panel> - <layout_panel name="widget_right"/> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_left"/> - <layout_panel name="images_container"> - <icon name="image_left"/> - </layout_panel> - <layout_panel name="images_right"/> - </layout_stack> - </layout_panel> - <layout_panel name="page_bottom"/> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_voice_effect.xml b/indra/newview/skins/default/xui/ja/panel_voice_effect.xml deleted file mode 100644 index 57a1bb7838..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - ボイスモーフィングなし - </string> - <string name="preview_voice_effects"> - ボイスモーフィングをプレビュー - </string> - <string name="get_voice_effects"> - ボイスモーフィングを取得 - </string> - <combo_box name="voice_effect" tool_tip="ボイスモーフィングを選択してボイスを変更"> - <combo_box.item label="ボイスモーフィングなし" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/pl/floater_big_preview.xml b/indra/newview/skins/default/xui/pl/floater_big_preview.xml deleted file mode 100644 index e730cff618..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> -<floater name="floater_big_preview" title="PODGLĄD" /> diff --git a/indra/newview/skins/default/xui/pl/floater_post_process.xml b/indra/newview/skins/default/xui/pl/floater_post_process.xml deleted file mode 100644 index 47c40d2315..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_post_process.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Post-Process Floater" title="USTAWIENIA PRZETWARZANIA KOŃCOWEGO"> - <tab_container name="Post-Process Tabs"> - <panel label="Filtr koloru" name="wmiColorFilterPanel"> - <check_box label="Włącz" name="wmiColorFilterToggle" /> - <text name="wmiColorFilterBrightnessText"> - Jasność - </text> - <text name="wmiColorFilterSaturationText"> - Nasycenie - </text> - <text name="wmiColorFilterContrastText"> - Kontrast - </text> - <text name="wmiColorFilterBaseText"> - Kontrast koloru podstawowego - </text> - </panel> - <panel label="Noktowizja" name="wmiNightVisionPanel"> - <check_box label="Włącz" name="wmiNightVisionToggle" /> - <text name="wmiNightVisionBrightMultText"> - Wielokrotne wzmocnienie światła - </text> - <text name="wmiNightVisionNoiseSizeText"> - Rozmiar szumu - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Moc szumu - </text> - </panel> - <panel label="Poświata" name="wmiBloomPanel"> - <check_box label="Włącz" name="wmiBloomToggle" /> - <text name="wmiBloomExtractText"> - Ekstracja luminacji - </text> - <text name="wmiBloomSizeText"> - Rozmiar poświaty - </text> - <text name="wmiBloomStrengthText"> - Moc poświaty - </text> - </panel> - <panel label="Dodatki" name="Extras"> - <button label="Wczytaj efekt" label_selected="Wczytaj efekt" name="PPLoadEffect" /> - <button label="Zapisz efekt" label_selected="Zapisz efekt" name="PPSaveEffect" /> - <line_editor label="Nazwa efektu" name="PPEffectNameEditor" /> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_sound_devices.xml b/indra/newview/skins/default/xui/pl/floater_sound_devices.xml deleted file mode 100644 index 93a27f68a7..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_sound_devices" title="URZĄDZENIA DŹWIĘKOWE"> - <text name="voice_label"> - Czat głos. - </text> - <check_box name="enable_voice" label="Włączone" /> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_voice_effect.xml b/indra/newview/skins/default/xui/pl/floater_voice_effect.xml deleted file mode 100644 index b02266caa9..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_voice_effect.xml +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="voice_effects" title="PODGLĄD PRZEKSZTAŁCANIA GŁOSU" label="Miejsca"> - <string name="no_voice_effect"> - (Bez Przekształcania) - </string> - <string name="active_voice_effect"> - (Aktywny) - </string> - <string name="unsubscribed_voice_effect"> - (Bez subskrybcji) - </string> - <string name="new_voice_effect"> - (Nowy!) - </string> - <string name="effect_Beast"> - Bestia - </string> - <string name="effect_Buzz"> - Brzęczenie - </string> - <string name="effect_Creepy"> - Przerażający - </string> - <string name="effect_Cyber"> - Cybernetyczny - </string> - <string name="effect_Female Elf"> - Kobiecy Elf - </string> - <string name="effect_Flirty"> - Flirt - </string> - <string name="effect_Foxy"> - Ponętny - </string> - <string name="effect_Helium"> - Hel - </string> - <string name="effect_Husky Whisper"> - Szept Husky - </string> - <string name="effect_Macho"> - Maczo - </string> - <string name="effect_Micro"> - Mikrus - </string> - <string name="effect_Mini"> - Miniaturowy - </string> - <string name="effect_Nano"> - Malutki - </string> - <string name="effect_Nightmare"> - Koszmar - </string> - <string name="effect_Rumble"> - Burczenie - </string> - <string name="effect_Sexy"> - Seksowny - </string> - <string name="effect_Shorty"> - Krótki - </string> - <string name="effect_Smaller"> - Mniejszy - </string> - <string name="effect_Sneaky"> - Podstępny - </string> - <string name="effect_Stallion"> - Ogier - </string> - <string name="effect_Sultry"> - Gorąco - </string> - <string name="effect_Thunder"> - Grzmot - </string> - <string name="effect_Vixen"> - Lisica - </string> - <text name="preview_text"> - Podgląd - </text> - <text name="status_text"> - Nagraj próbkę, a następnie kliknij na głos aby usłyszeć jego brzmienie. - </text> - <button label="Nagraj" name="record_btn" tool_tip="Nagraj próbkę swojego głosu." /> - <text name="voice_morphing_link"> - [[URL] Subskrybuj teraz] - </text> - <scroll_list name="voice_effect_list" tool_tip="Nagraj próbkę swojego głosu, a następnie kliknij na efekt aby odsłuchać podgląd."> - <scroll_list.columns label="Nazwa głosu" name="name" /> - <scroll_list.columns label="Wygasa" name="expires" /> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/pl/panel_login_first.xml b/indra/newview/skins/default/xui/pl/panel_login_first.xml deleted file mode 100644 index 0604ecbcff..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_login_first.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="panel_login"> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Użytkownik" tool_tip="Nazwa użytkownika wybrana przy rejestracji, np. bobsmith12 lub Steller Sunshine" name="username_combo" /> - <line_editor name="password_edit" label="Hasło" /> - <button label="Zaloguj" name="connect_btn" /> - <check_box label="Zapamiętaj mnie" name="remember_check" /> - <text name="forgot_password_text"> - Zapomniałem/am hasła - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Wyspa Nauki to Twój pierwszy krok. Znajdź portal z wyjściem! - </text> - <text name="image_caption_right"> - Potem zwiedź Wyspę Towarzyską i poznaj innych nowych rezydentów! - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_voice_effect.xml b/indra/newview/skins/default/xui/pl/panel_voice_effect.xml deleted file mode 100644 index 94878943a1..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Wyłącz Przekształcanie - </string> - <string name="preview_voice_effects"> - Przeglądaj Przekształcania ▶ - </string> - <string name="get_voice_effects"> - Uzyskaj Przekształcanie ▶ - </string> - <combo_box name="voice_effect" tool_tip="Wybierz odpowienie Przekształcanie Głosu, aby zmienić brzmienie swojego głosu"> - <combo_box.item label="Wyłącz Przekształcanie" name="no_voice_effect" /> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/pt/floater_big_preview.xml b/indra/newview/skins/default/xui/pt/floater_big_preview.xml deleted file mode 100644 index 76ca176689..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="VISUALIZAR"/> diff --git a/indra/newview/skins/default/xui/pt/floater_post_process.xml b/indra/newview/skins/default/xui/pt/floater_post_process.xml deleted file mode 100644 index d4f2e96539..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="AJUSTES DE PÓS-PROCESSAMENTO"> - <tab_container name="Post-Process Tabs"> - <panel label="Filtro de Cor" name="wmiColorFilterPanel"> - <check_box label="Habilitar" name="wmiColorFilterToggle"/> - <text name="wmiColorFilterBrightnessText"> - Brilho - </text> - <text name="wmiColorFilterSaturationText"> - Saturação - </text> - <text name="wmiColorFilterContrastText"> - Contraste - </text> - <text name="wmiColorFilterBaseText"> - Cor Base do Contraste - </text> - <slider label="R" name="wmiColorFilterBaseR"/> - <slider label="G" name="wmiColorFilterBaseG"/> - <slider label="B" name="wmiColorFilterBaseB"/> - <slider label="I" name="wmiColorFilterBaseI"/> - </panel> - <panel label="visão Noturna" name="wmiNightVisionPanel"> - <check_box label="Habilitar" name="wmiNightVisionToggle"/> - <text name="wmiNightVisionBrightMultText"> - Múltiplo de Amplificação de Luz - </text> - <text name="wmiNightVisionNoiseSizeText"> - Tamanho de Ruído - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Intensidade de Ruído - </text> - </panel> - <panel label="Florescência" name="wmiBloomPanel"> - <check_box label="Habilitar" name="wmiBloomToggle"/> - <text name="wmiBloomExtractText"> - Extração de Luminosidade - </text> - <text name="wmiBloomSizeText"> - Tamanho da florescência - </text> - <text name="wmiBloomStrengthText"> - Inensidade da florescência - </text> - </panel> - <panel label="Extras" name="Extras"> - <button label="CarregaEfeito" label_selected="CarregaEfeito" name="PPLoadEffect"/> - <button label="SalvaEfeito" label_selected="SalvaEfeito" name="PPSaveEffect"/> - <line_editor label="Nome do Efeito" name="PPEffectNameEditor"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_sound_devices.xml b/indra/newview/skins/default/xui/pt/floater_sound_devices.xml deleted file mode 100644 index 948d727540..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="DISPOSITIVOS DE SOM"> - <text name="voice_label"> - Bate-papo de voz - </text> - <check_box label="Ativado" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml deleted file mode 100644 index 71d3c33ae5..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Lugares" name="voice_effects" title="AMOSTRA DE DISTORÇÃO DE VOZ"> - <string name="no_voice_effect"> - (Não distorcer voz) - </string> - <string name="active_voice_effect"> - (Ativo) - </string> - <string name="unsubscribed_voice_effect"> - (Cancelou) - </string> - <string name="new_voice_effect"> - (Novo!) - </string> - <string name="effect_Arena"> - Arena - </string> - <string name="effect_Beast"> - Fera - </string> - <string name="effect_Buff"> - Entusiasmado - </string> - <string name="effect_Buzz"> - Zumbido - </string> - <string name="effect_Camille"> - Camille - </string> - <string name="effect_Creepy"> - Assustador - </string> - <string name="effect_CreepyBot"> - RobôAssustador - </string> - <string name="effect_Cyber"> - Cyber - </string> - <string name="effect_DeepBot"> - RobôVozGrossa - </string> - <string name="effect_Demon"> - Demônio - </string> - <string name="effect_Female Elf"> - Elfa - </string> - <string name="effect_Flirty"> - Paquerador - </string> - <string name="effect_Foxy"> - Sensual - </string> - <string name="effect_Halloween 2010 Bonus"> - Bônus_Halloween_2010 - </string> - <string name="effect_Helium"> - Hélio - </string> - <string name="effect_Husky"> - Rouco - </string> - <string name="effect_Husky Whisper"> - Sussurro rouco - </string> - <string name="effect_Intercom"> - Interfone - </string> - <string name="effect_Julia"> - Julia - </string> - <string name="effect_Lo Lilt"> - Cantarolado baixo - </string> - <string name="effect_Macho"> - Macho - </string> - <string name="effect_Micro"> - Micro - </string> - <string name="effect_Mini"> - Mini - </string> - <string name="effect_Model"> - Modelo - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - Pesadelo - </string> - <string name="effect_PopBot"> - RobôPop - </string> - <string name="effect_Rachel"> - Rachel - </string> - <string name="effect_Radio"> - Rádio - </string> - <string name="effect_Robot"> - Robô - </string> - <string name="effect_Roxanne"> - Roxanne - </string> - <string name="effect_Rumble"> - Ronco - </string> - <string name="effect_Sabrina"> - Sabrina - </string> - <string name="effect_Samantha"> - Samantha - </string> - <string name="effect_Sexy"> - Sexy - </string> - <string name="effect_Shorty"> - Baixinho - </string> - <string name="effect_Smaller"> - Menor - </string> - <string name="effect_Sneaky"> - Sorrateiro - </string> - <string name="effect_Stallion"> - Garanhão - </string> - <string name="effect_Sultry"> - Ardente - </string> - <string name="effect_Thunder"> - Trovão - </string> - <string name="effect_Vixen"> - Maliciosa - </string> - <string name="effect_WhinyBot"> - RobôReclamão - </string> - <text name="preview_text"> - Visualizar - </text> - <text name="status_text"> - Grave uma amostra da sua voz, depois clique em um efeito para ouvir o resultado. - </text> - <button label="Gravar" name="record_btn" tool_tip="Grave uma amostra da sua voz."/> - <button label="Parar" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] Assine agora] - </text> - <scroll_list name="voice_effect_list" tool_tip="Grave sua voz por alguns instantes, depois clique num efeito para ouvir a distorção."> - <scroll_list.columns label="Nome da voz" name="name"/> - <scroll_list.columns label="Vence em" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/pt/panel_login_first.xml b/indra/newview/skins/default/xui/pt/panel_login_first.xml deleted file mode 100644 index 86c61163bc..0000000000 --- a/indra/newview/skins/default/xui/pt/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php?lang=pt - </panel.string> - <panel.string name="sign_up_url"> - https://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Nome de usuário" name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 ou Magia Solar"/> - <line_editor label="Senha" name="password_edit"/> - <button label="Login" name="connect_btn"/> - <check_box label="Lembrar-me" name="remember_check"/> - <text name="forgot_password_text"> - Senha esquecida - </text> - <text name="sign_up_text"> - Cadastre-se - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Sua primeira parada é a Ilha da Educação. Encontre o portal de saída! - </text> - <text name="image_caption_right"> - Em seguida, explore a Ilha Social e encontre novos residentes! - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_voice_effect.xml b/indra/newview/skins/default/xui/pt/panel_voice_effect.xml deleted file mode 100644 index 1d7878408a..0000000000 --- a/indra/newview/skins/default/xui/pt/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Distorção de voz desligada - </string> - <string name="preview_voice_effects"> - Checar distorção de voz ▶ - </string> - <string name="get_voice_effects"> - Distorcer voz ▶ - </string> - <combo_box name="voice_effect" tool_tip="Selecione um efeito de distorção para mudar sua voz."> - <combo_box.item label="Distorção de voz desligada" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/ru/floater_big_preview.xml b/indra/newview/skins/default/xui/ru/floater_big_preview.xml deleted file mode 100644 index cdacebadef..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="ПРОСМОТР"/> diff --git a/indra/newview/skins/default/xui/ru/floater_post_process.xml b/indra/newview/skins/default/xui/ru/floater_post_process.xml deleted file mode 100644 index ae97670548..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="НАСТРОЙКИ ПОСЛЕДУЮЩЕЙ ОБРАБОТКИ"> - <tab_container name="Post-Process Tabs"> - <panel label="Цветовой фильтр" name="wmiColorFilterPanel"> - <check_box label="Вкл." name="wmiColorFilterToggle"/> - <text name="wmiColorFilterBrightnessText"> - Яркость - </text> - <text name="wmiColorFilterSaturationText"> - Насыщенность - </text> - <text name="wmiColorFilterContrastText"> - Контрастность - </text> - <text name="wmiColorFilterBaseText"> - Основной цвет контрастности - </text> - <slider label="К" name="wmiColorFilterBaseR"/> - <slider label="З" name="wmiColorFilterBaseG"/> - <slider label="С" name="wmiColorFilterBaseB"/> - <slider label="И" name="wmiColorFilterBaseI"/> - </panel> - <panel label="Ночное видение" name="wmiNightVisionPanel"> - <check_box label="Вкл." name="wmiNightVisionToggle"/> - <text name="wmiNightVisionBrightMultText"> - Коэффициент усиления света - </text> - <text name="wmiNightVisionNoiseSizeText"> - Размер искажений - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Мощность искажений - </text> - </panel> - <panel label="Ореол" name="wmiBloomPanel"> - <check_box label="Вкл." name="wmiBloomToggle"/> - <text name="wmiBloomExtractText"> - Яркость света - </text> - <text name="wmiBloomSizeText"> - Размер ореола - </text> - <text name="wmiBloomStrengthText"> - Мощность ореола - </text> - </panel> - <panel label="Дополнительно" name="Extras"> - <button label="Загрузить эффект" label_selected="Загрузить эффект" name="PPLoadEffect"/> - <button label="Сохранить эффект" label_selected="Сохранить эффект" name="PPSaveEffect"/> - <line_editor label="Название эффекта" name="PPEffectNameEditor"/> - </panel> - </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 deleted file mode 100644 index fc8de858cd..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="ЗВУКОВЫЕ УСТРОЙСТВА"> - <text name="voice_label"> - Голосовой чат - </text> - <check_box label="Включен" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml b/indra/newview/skins/default/xui/ru/floater_voice_effect.xml deleted file mode 100644 index d3cef042a3..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Места" name="voice_effects" title="ПРОСМОТР ИЗМЕНЕНИЯ ГОЛОСА"> - <string name="no_voice_effect"> - (Нет изменения голоса) - </string> - <string name="active_voice_effect"> - (Активно) - </string> - <string name="unsubscribed_voice_effect"> - (Нет подписки) - </string> - <string name="new_voice_effect"> - (Новый!) - </string> - <string name="effect_Arena"> - Arena - </string> - <string name="effect_Beast"> - Beast - </string> - <string name="effect_Buff"> - Buff - </string> - <string name="effect_Buzz"> - Buzz - </string> - <string name="effect_Camille"> - Camille - </string> - <string name="effect_Creepy"> - Creepy - </string> - <string name="effect_CreepyBot"> - CreepyBot - </string> - <string name="effect_Cyber"> - Cyber - </string> - <string name="effect_DeepBot"> - DeepBot - </string> - <string name="effect_Demon"> - Demon - </string> - <string name="effect_Female Elf"> - Фея - </string> - <string name="effect_Flirty"> - Flirty - </string> - <string name="effect_Foxy"> - Foxy - </string> - <string name="effect_Halloween 2010 Bonus"> - Бонус_за_Хэллоуин_2010 - </string> - <string name="effect_Helium"> - Helium - </string> - <string name="effect_Husky"> - Husky - </string> - <string name="effect_Husky Whisper"> - Хриплый шепот - </string> - <string name="effect_Intercom"> - Внутренняя связь - </string> - <string name="effect_Julia"> - Julia - </string> - <string name="effect_Lo Lilt"> - Напев - </string> - <string name="effect_Macho"> - Macho - </string> - <string name="effect_Micro"> - Micro - </string> - <string name="effect_Mini"> - Mini - </string> - <string name="effect_Model"> - Модель - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - Nightmare - </string> - <string name="effect_PopBot"> - PopBot - </string> - <string name="effect_Rachel"> - Rachel - </string> - <string name="effect_Radio"> - Radio - </string> - <string name="effect_Robot"> - Robot - </string> - <string name="effect_Roxanne"> - Roxanne - </string> - <string name="effect_Rumble"> - Урчание - </string> - <string name="effect_Sabrina"> - Sabrina - </string> - <string name="effect_Samantha"> - Samantha - </string> - <string name="effect_Sexy"> - Sexy - </string> - <string name="effect_Shorty"> - Shorty - </string> - <string name="effect_Smaller"> - Меньше - </string> - <string name="effect_Sneaky"> - Sneaky - </string> - <string name="effect_Stallion"> - Stallion - </string> - <string name="effect_Sultry"> - Sultry - </string> - <string name="effect_Thunder"> - Thunder - </string> - <string name="effect_Vixen"> - Vixen - </string> - <string name="effect_WhinyBot"> - WhinyBot - </string> - <text name="preview_text"> - Прослушивание - </text> - <text name="status_text"> - Запишите образец, затем щелкните, чтобы услышать, как будет звучать голос. - </text> - <button label="Запись" name="record_btn" tool_tip="Записать образец вашего голоса."/> - <button label="Стоп" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] Подписаться] - </text> - <scroll_list name="voice_effect_list" tool_tip="Запишите образец вашего голоса, затем щелкните, чтобы прослушать эффект."> - <scroll_list.columns label="Название голоса" name="name"/> - <scroll_list.columns label="Истекает" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/ru/panel_login_first.xml b/indra/newview/skins/default/xui/ru/panel_login_first.xml deleted file mode 100644 index 5db81ea7ca..0000000000 --- a/indra/newview/skins/default/xui/ru/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <panel.string name="sign_up_url"> - https://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Имя пользователя" name="username_combo" tool_tip="Имя пользователя, которое вы выбрали при регистрации, например, «bobsmith12» или «Steller Sunshine»"/> - <line_editor label="Пароль" name="password_edit"/> - <button label="Войти" name="connect_btn"/> - <check_box label="Запомнить меня" name="remember_check"/> - <text name="forgot_password_text"> - Забытый пароль - </text> - <text name="sign_up_text"> - Регистрация - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Ваш первый шаг – Учебный остров. Найдите портал выхода! - </text> - <text name="image_caption_right"> - Затем исследуйте Социальный остров и познакомьтесь с другими новичками! - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_voice_effect.xml b/indra/newview/skins/default/xui/ru/panel_voice_effect.xml deleted file mode 100644 index de0b38198f..0000000000 --- a/indra/newview/skins/default/xui/ru/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Изменение голоса отключено - </string> - <string name="preview_voice_effects"> - Прослушать изменение голоса ▶ - </string> - <string name="get_voice_effects"> - Приобрести изменение голоса ▶ - </string> - <combo_box name="voice_effect" tool_tip="Выбор типа изменения для своего голоса"> - <combo_box.item label="Изменение голоса отключено" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/tr/floater_big_preview.xml b/indra/newview/skins/default/xui/tr/floater_big_preview.xml deleted file mode 100644 index c99a71d3c2..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="ÖNİZLEME"/> diff --git a/indra/newview/skins/default/xui/tr/floater_post_process.xml b/indra/newview/skins/default/xui/tr/floater_post_process.xml deleted file mode 100644 index 5e419f8ffa..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="İŞLEM SONRASI AYARLARI"> - <tab_container name="Post-Process Tabs"> - <panel label="Renk Filtresi" name="wmiColorFilterPanel"> - <check_box label="Etkinleştir" name="wmiColorFilterToggle"/> - <text name="wmiColorFilterBrightnessText"> - Parlaklık - </text> - <text name="wmiColorFilterSaturationText"> - Doygunluk - </text> - <text name="wmiColorFilterContrastText"> - Kontrast - </text> - <text name="wmiColorFilterBaseText"> - Kontrast Baz Rengi - </text> - <slider label="R" name="wmiColorFilterBaseR"/> - <slider label="G" name="wmiColorFilterBaseG"/> - <slider label="B" name="wmiColorFilterBaseB"/> - <slider label="I" name="wmiColorFilterBaseI"/> - </panel> - <panel label="Gece Görüşü" name="wmiNightVisionPanel"> - <check_box label="Etkinleştir" name="wmiNightVisionToggle"/> - <text name="wmiNightVisionBrightMultText"> - Işık Yükseltme Çarpanı - </text> - <text name="wmiNightVisionNoiseSizeText"> - Gürültü Büyüklüğü - </text> - <text name="wmiNightVisionNoiseStrengthText"> - Gürültü Gücü - </text> - </panel> - <panel label="Işıma" name="wmiBloomPanel"> - <check_box label="Etkinleştir" name="wmiBloomToggle"/> - <text name="wmiBloomExtractText"> - Parlaklık Çıkarma - </text> - <text name="wmiBloomSizeText"> - Işıma Büyüklüğü - </text> - <text name="wmiBloomStrengthText"> - Işıma Gücü - </text> - </panel> - <panel label="Ekstralar" name="Extras"> - <button label="EfektYükle" label_selected="EfektYükle" name="PPLoadEffect"/> - <button label="EfektKaydet" label_selected="EfektKaydet" name="PPSaveEffect"/> - <line_editor label="Efekt Adı" name="PPEffectNameEditor"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_sound_devices.xml b/indra/newview/skins/default/xui/tr/floater_sound_devices.xml deleted file mode 100644 index 470a222d7e..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="SES CİHAZLARI"> - <text name="voice_label"> - Sesli Sohbet - </text> - <check_box label="Etkin" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml b/indra/newview/skins/default/xui/tr/floater_voice_effect.xml deleted file mode 100644 index 7a157244cd..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Yerler" name="voice_effects" title="SES ŞEKİLLENDİRME ÖNİZLEMESİ"> - <string name="no_voice_effect"> - (Ses Şekillendirme Yok) - </string> - <string name="active_voice_effect"> - (Etkin) - </string> - <string name="unsubscribed_voice_effect"> - (Abonelik İptal) - </string> - <string name="new_voice_effect"> - (Yeni!) - </string> - <string name="effect_Arena"> - Arena - </string> - <string name="effect_Beast"> - Yaratık - </string> - <string name="effect_Buff"> - Yapılı - </string> - <string name="effect_Buzz"> - Vızıltı - </string> - <string name="effect_Camille"> - Camille - </string> - <string name="effect_Creepy"> - Korkutucu - </string> - <string name="effect_CreepyBot"> - KorkutucuBot - </string> - <string name="effect_Cyber"> - Siber - </string> - <string name="effect_DeepBot"> - DerinBot - </string> - <string name="effect_Demon"> - İblis - </string> - <string name="effect_Female Elf"> - Dişi Cin - </string> - <string name="effect_Flirty"> - Cilveli - </string> - <string name="effect_Foxy"> - Alımlı - </string> - <string name="effect_Halloween 2010 Bonus"> - Halloween_2010_Bonus - </string> - <string name="effect_Helium"> - Helyum - </string> - <string name="effect_Husky"> - Güçlü - </string> - <string name="effect_Husky Whisper"> - Boğuk Fısıltı - </string> - <string name="effect_Intercom"> - İnterkom - </string> - <string name="effect_Julia"> - Julia - </string> - <string name="effect_Lo Lilt"> - Yavaş Mırıltı - </string> - <string name="effect_Macho"> - Maço - </string> - <string name="effect_Micro"> - Mikro - </string> - <string name="effect_Mini"> - Mini - </string> - <string name="effect_Model"> - Model - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - Kabus - </string> - <string name="effect_PopBot"> - PopBot - </string> - <string name="effect_Rachel"> - Rachel - </string> - <string name="effect_Radio"> - Radyo - </string> - <string name="effect_Robot"> - Robot - </string> - <string name="effect_Roxanne"> - Roxanne - </string> - <string name="effect_Rumble"> - Gurultu - </string> - <string name="effect_Sabrina"> - Sabrina - </string> - <string name="effect_Samantha"> - Samantha - </string> - <string name="effect_Sexy"> - Seksi - </string> - <string name="effect_Shorty"> - Bücür - </string> - <string name="effect_Smaller"> - Daha Küçük - </string> - <string name="effect_Sneaky"> - Sinsi - </string> - <string name="effect_Stallion"> - Maskülen - </string> - <string name="effect_Sultry"> - İhtiraslı - </string> - <string name="effect_Thunder"> - Gök gürültüsü - </string> - <string name="effect_Vixen"> - Çekici - </string> - <string name="effect_WhinyBot"> - AğlakBot - </string> - <text name="preview_text"> - Önizleme için - </text> - <text name="status_text"> - Bir örnek kaydettikten sonra sese tıklayarak nasıl olduğunu duyun. - </text> - <button label="Kaydet" name="record_btn" tool_tip="Sesinizin örneğini kaydedin."/> - <button label="Durdur" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] Hemen Abone Ol] - </text> - <scroll_list name="voice_effect_list" tool_tip="Sesinizin örneğini kaydettikten sonra önizleme için bir efekte tıklayın."> - <scroll_list.columns label="Ses Adı" name="name"/> - <scroll_list.columns label="Bitiş Tarihi" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/tr/panel_login_first.xml b/indra/newview/skins/default/xui/tr/panel_login_first.xml deleted file mode 100644 index 1fc80c2b97..0000000000 --- a/indra/newview/skins/default/xui/tr/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <panel.string name="sign_up_url"> - https://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="Kullanıcı Adı" name="username_combo" tool_tip="Kaydolduğunuzda seçtiğiniz kullanıcı adı, örn. mustafayalcin12 veya Faruk Gungoren"/> - <line_editor label="Parola" name="password_edit"/> - <button label="Oturum Aç" name="connect_btn"/> - <check_box label="Beni hatırla" name="remember_check"/> - <text name="forgot_password_text"> - Parolamı unuttum - </text> - <text name="sign_up_text"> - Kaydol - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - Başlangıç yeriniz Eğitim Adası. Haydi çıkış portalını bulun! - </text> - <text name="image_caption_right"> - Sonra da Sosyal Ada'yı keşfe çıkın ve diğer LS sakinleriyle tanışın! - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_voice_effect.xml b/indra/newview/skins/default/xui/tr/panel_voice_effect.xml deleted file mode 100644 index b46833d7e6..0000000000 --- a/indra/newview/skins/default/xui/tr/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - Ses Şekillendirme Kapalı - </string> - <string name="preview_voice_effects"> - Ses Şekillendirme Önizleme ▶ - </string> - <string name="get_voice_effects"> - Ses Şekillendirmeyi Etkinleştir ▶ - </string> - <combo_box name="voice_effect" tool_tip="Sesinizi değiştirmek için bir Ses Şekli seçin"> - <combo_box.item label="Ses Şekillendirme Kapalı" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/skins/default/xui/zh/floater_big_preview.xml b/indra/newview/skins/default/xui/zh/floater_big_preview.xml deleted file mode 100644 index ae68cd7ddf..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_big_preview.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_big_preview" title="預覽"/> diff --git a/indra/newview/skins/default/xui/zh/floater_post_process.xml b/indra/newview/skins/default/xui/zh/floater_post_process.xml deleted file mode 100644 index 2908f7c1d0..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_post_process.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="後處理設定:"> - <tab_container name="Post-Process Tabs"> - <panel label="顏色過濾" name="wmiColorFilterPanel"> - <check_box label="啟用" name="wmiColorFilterToggle"/> - <text name="wmiColorFilterBrightnessText"> - 亮度 - </text> - <text name="wmiColorFilterSaturationText"> - 飽和度 - </text> - <text name="wmiColorFilterContrastText"> - 對比 - </text> - <text name="wmiColorFilterBaseText"> - 對比基本色 - </text> - <slider label="R" name="wmiColorFilterBaseR"/> - <slider label="G" name="wmiColorFilterBaseG"/> - <slider label="B" name="wmiColorFilterBaseB"/> - <slider label="I" name="wmiColorFilterBaseI"/> - </panel> - <panel label="夜視" name="wmiNightVisionPanel"> - <check_box label="啟用" name="wmiNightVisionToggle"/> - <text name="wmiNightVisionBrightMultText"> - 光放大倍數 - </text> - <text name="wmiNightVisionNoiseSizeText"> - 噪音規模 - </text> - <text name="wmiNightVisionNoiseStrengthText"> - 噪音強度 - </text> - </panel> - <panel label="開花" name="wmiBloomPanel"> - <check_box label="啟用" name="wmiBloomToggle"/> - <text name="wmiBloomExtractText"> - 光度萃取 - </text> - <text name="wmiBloomSizeText"> - 開花大小 - </text> - <text name="wmiBloomStrengthText"> - 開花強度 - </text> - </panel> - <panel label="其他" name="Extras"> - <button label="LoadEffect" label_selected="LoadEffect" name="PPLoadEffect"/> - <button label="SaveEffect" label_selected="SaveEffect" name="PPSaveEffect"/> - <line_editor label="效果名稱" name="PPEffectNameEditor"/> - </panel> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_sound_devices.xml b/indra/newview/skins/default/xui/zh/floater_sound_devices.xml deleted file mode 100644 index 0374c74f8f..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_sound_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_sound_devices" title="聲音裝置"> - <text name="voice_label"> - 語音聊天 - </text> - <check_box label="已啟用" name="enable_voice"/> -</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml b/indra/newview/skins/default/xui/zh/floater_voice_effect.xml deleted file mode 100644 index aab5fa6028..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_voice_effect.xml +++ /dev/null @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="地點" name="voice_effects" title="語音變聲試聽"> - <string name="no_voice_effect"> - (無變聲效果) - </string> - <string name="active_voice_effect"> - (使用中) - </string> - <string name="unsubscribed_voice_effect"> - (已停止訂用) - </string> - <string name="new_voice_effect"> - (新的!) - </string> - <string name="effect_Arena"> - 競技場 - </string> - <string name="effect_Beast"> - 野獸 - </string> - <string name="effect_Buff"> - Buff - </string> - <string name="effect_Buzz"> - Buzz - </string> - <string name="effect_Camille"> - 卡蜜兒 - </string> - <string name="effect_Creepy"> - 怪異 - </string> - <string name="effect_CreepyBot"> - 怪異機器人 - </string> - <string name="effect_Cyber"> - 科幻 - </string> - <string name="effect_DeepBot"> - 深沉機器人 - </string> - <string name="effect_Demon"> - 魔鬼 - </string> - <string name="effect_Female Elf"> - 女性 - 小精靈 - </string> - <string name="effect_Flirty"> - 調情 - </string> - <string name="effect_Foxy"> - 香豔 - </string> - <string name="effect_Halloween 2010 Bonus"> - 2010萬聖節加贈 - </string> - <string name="effect_Helium"> - 氦氣 - </string> - <string name="effect_Husky"> - 沙啞 - </string> - <string name="effect_Husky Whisper"> - 沙啞耳語 - </string> - <string name="effect_Intercom"> - 對講機 - </string> - <string name="effect_Julia"> - 茱莉亞 - </string> - <string name="effect_Lo Lilt"> - 輕微抑揚頓挫 - </string> - <string name="effect_Macho"> - 陽剛 - </string> - <string name="effect_Micro"> - Micro - </string> - <string name="effect_Mini"> - 迷你 - </string> - <string name="effect_Model"> - 模型 - </string> - <string name="effect_Nano"> - Nano - </string> - <string name="effect_Nightmare"> - 惡夢 - </string> - <string name="effect_PopBot"> - PopBot - </string> - <string name="effect_Rachel"> - 瑞秋 - </string> - <string name="effect_Radio"> - 收音機 - </string> - <string name="effect_Robot"> - 機器人 - </string> - <string name="effect_Roxanne"> - 蘿姍 - </string> - <string name="effect_Rumble"> - 低沉隆隆聲 - </string> - <string name="effect_Sabrina"> - 薩賓娜 - </string> - <string name="effect_Samantha"> - 姍曼莎 - </string> - <string name="effect_Sexy"> - 性感 - </string> - <string name="effect_Shorty"> - 矮個兒 - </string> - <string name="effect_Smaller"> - 較小 - </string> - <string name="effect_Sneaky"> - 鬼祟 - </string> - <string name="effect_Stallion"> - 種馬 - </string> - <string name="effect_Sultry"> - 勾魂 - </string> - <string name="effect_Thunder"> - 雷聲 - </string> - <string name="effect_Vixen"> - 潑婦 - </string> - <string name="effect_WhinyBot"> - 哭鬧機器人 - </string> - <text name="preview_text"> - 預覽 - </text> - <text name="status_text"> - 錄下一段樣本,再點按聲音檢查結果。 - </text> - <button label="錄音" name="record_btn" tool_tip="錄下一段你的聲音。"/> - <button label="停止" name="record_stop_btn"/> - <text name="voice_morphing_link"> - [[URL] 現在訂用] - </text> - <scroll_list name="voice_effect_list" tool_tip="錄下一段你的聲音,再點選一個效果試聽。"> - <scroll_list.columns label="語音名稱" name="name"/> - <scroll_list.columns label="過期" name="expires"/> - </scroll_list> -</floater> diff --git a/indra/newview/skins/default/xui/zh/panel_login_first.xml b/indra/newview/skins/default/xui/zh/panel_login_first.xml deleted file mode 100644 index 4d72fcdd03..0000000000 --- a/indra/newview/skins/default/xui/zh/panel_login_first.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<panel name="panel_login"> - <panel.string name="forgot_password_url"> - http://secondlife.com/account/request.php - </panel.string> - <panel.string name="sign_up_url"> - http://join.secondlife.com/ - </panel.string> - <layout_stack name="logo_stack"> - <layout_panel name="parent_panel2"> - <layout_stack name="widget_stack"> - <layout_panel name="widget_container"> - <combo_box label="使用者名稱" name="username_combo" tool_tip="使用者名稱是你註冊時所挑選的,例如 bobsmith12 或 Steller Sunshine"/> - <line_editor label="密碼" name="password_edit"/> - <button label="登入" name="connect_btn"/> - <check_box label="記得我" name="remember_check"/> - <text name="forgot_password_text"> - 忘記密碼 - </text> - <text name="sign_up_text"> - 註冊 - </text> - </layout_panel> - </layout_stack> - </layout_panel> - <layout_panel name="parent_panel3"> - <layout_stack name="images_stack"> - <layout_panel name="images_container"> - <text name="image_caption_left"> - 你在「學習島」的第一步。 找到離開的傳送門! - </text> - <text name="image_caption_right"> - 接著,到「社交島」探索,認識新的居民朋友! - </text> - </layout_panel> - </layout_stack> - </layout_panel> - </layout_stack> -</panel> diff --git a/indra/newview/skins/default/xui/zh/panel_voice_effect.xml b/indra/newview/skins/default/xui/zh/panel_voice_effect.xml deleted file mode 100644 index 6c8a452014..0000000000 --- a/indra/newview/skins/default/xui/zh/panel_voice_effect.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_voice_effect"> - <string name="no_voice_effect"> - 關閉變聲效果 - </string> - <string name="preview_voice_effects"> - 預覽變聲效果 ▶ - </string> - <string name="get_voice_effects"> - 取得變聲效果 ▶ - </string> - <combo_box name="voice_effect" tool_tip="選取一個變聲效果來改變你的聲音"> - <combo_box.item label="關閉變聲效果" name="no_voice_effect"/> - </combo_box> -</panel> diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp index 94cf0fcf10..1cbb8b50eb 100644 --- a/indra/newview/tests/llviewernetwork_test.cpp +++ b/indra/newview/tests/llviewernetwork_test.cpp @@ -236,7 +236,7 @@ namespace tut std::string("https://secondlife.com/helpers/")); ensure_equals("Agni login page", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"), - std::string("https://viewer-splash.secondlife.com/")); + std::string("https://viewer-splash-v2.secondlife.com/")); ensure("Agni is a system grid", LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com")); @@ -261,7 +261,7 @@ namespace tut std::string("https://secondlife.aditi.lindenlab.com/helpers/")); ensure_equals("Aditi login page", LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"), - std::string("https://viewer-splash.secondlife.com/")); + std::string("https://viewer-splash-v2.secondlife.com/")); ensure("Aditi is a system grid", LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com")); } @@ -309,7 +309,7 @@ namespace tut std::string("https://secondlife.com/helpers/")); ensure_equals("Agni login page", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"), - std::string("https://viewer-splash.secondlife.com/")); + std::string("https://viewer-splash-v2.secondlife.com/")); ensure("Agni is a system grid", LLGridManager::getInstance()->isSystemGrid("util.agni.lindenlab.com")); @@ -333,7 +333,7 @@ namespace tut std::string("https://secondlife.aditi.lindenlab.com/helpers/")); ensure_equals("Aditi login page", LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"), - std::string("https://viewer-splash.secondlife.com/")); + std::string("https://viewer-splash-v2.secondlife.com/")); ensure("Aditi is a system grid", LLGridManager::getInstance()->isSystemGrid("util.aditi.lindenlab.com")); @@ -422,7 +422,7 @@ namespace tut std::string("https://secondlife.com/helpers/")); ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(), - std::string("https://viewer-splash.secondlife.com/")); + std::string("https://viewer-splash-v2.secondlife.com/")); ensure_equals("update url base for Agni", // relies on agni being the default std::string("https://update.secondlife.com/update"), LLGridManager::getInstance()->getUpdateServiceURL()); |
