# Conflicts:
#	indra/newview/fsfloaterim.h
master
Ansariel 2023-07-13 09:22:50 +02:00
commit d3c3df624b
161 changed files with 989 additions and 887 deletions

View File

@ -167,8 +167,8 @@ jobs:
path_sep="\\"
fi
function find_most_recent_bundle() {
local pattern="$1-.*$2-.*"
local most_recent_file=$(ls -t "${{ github.workspace }}" | grep "$pattern" | head -1)
local pattern="$1-.*$2[-_]+.*"
local most_recent_file=$(ls -t "${{ github.workspace }}" | egrep "$pattern" | head -1)
if [ -z "$most_recent_file" ]; then
echo ""
else

View File

@ -1140,11 +1140,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>eebbcd0757dd28646ebb4505e7af140e</string>
<string>9d9f72f50cffe7443e4b58f009ffc1f4</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-2.02.13-darwin64-6.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-2.02.15-darwin64-9.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -1154,11 +1154,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>5fee0f9587f50531211ff9e1e860692f</string>
<string>79fb2f09d2c81ed6464e11af36566910</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-2.02.13-linux64-230861132.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-2.02.15-linux64-231741426.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -1168,11 +1168,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>99c928b18a0d2f08b0ee33fca90c4118</string>
<string>c1bce2b362c31345200297a4010626e9</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.13-windows-230860911.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.15-windows-231741106.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -1182,18 +1182,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>01946a6427d126570607c02b75560f02</string>
<string>cd0e8f58fece3eac0b5ebe21f354bf8c</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.13-windows64-230860913.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.15-windows64-231741113.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>2.02.13</string>
<string>2.02.15</string>
</map>
<key>fontconfig</key>
<map>

View File

@ -49,6 +49,8 @@
#include "httpstats.h"
#include "indra_constants.h" // <FS> Clownflare changes
// *DEBUG: "[curl:bugs] #1420" problem and testing.
//
// A pipelining problem, https://sourceforge.net/p/curl/bugs/1420/,
@ -525,6 +527,7 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
check_curl_easy_setopt(mCurlHandle, CURLOPT_SEEKDATA, getHandle());
check_curl_easy_setopt(mCurlHandle, CURLOPT_COOKIEFILE, "");
check_curl_easy_setopt(mCurlHandle, CURLOPT_USERAGENT, APP_NAME.c_str()); // <FS> Clownflare changes
if (gpolicy.mSslCtxCallback)
{

View File

@ -44,7 +44,12 @@ static const char* subdirs = "0123456789abcdef";
LLDiskCache::LLDiskCache(const std::string cache_dir,
const uintmax_t max_size_bytes,
const bool enable_cache_debug_info) :
const bool enable_cache_debug_info
// <FS:Beq> Add High/Low water mark support
,const F32 highwater_mark_percent
,const F32 lowwater_mark_percent
// </FS:Beq>
) :
mCacheDir(cache_dir),
mMaxSizeBytes(max_size_bytes),
mEnableCacheDebugInfo(enable_cache_debug_info)
@ -113,6 +118,8 @@ void LLDiskCache::purge()
#else
std::string cache_path(mCacheDir);
#endif
uintmax_t file_size_total = 0; // <FS:Beq/> try to make simple cache less naive.
if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())
{
// <FS:Ansariel> Optimize asset simple disk cache
@ -137,6 +144,7 @@ void LLDiskCache::purge()
{
continue;
}
file_size_total += file_size; // <FS:Beq/> try to make simple cache less naive.
file_info.push_back(file_info_t(file_time, { file_size, file_path }));
}
@ -145,52 +153,106 @@ void LLDiskCache::purge()
}
}
// <FS:Beq> add high water/low water thresholds to reduce the churn in the cache.
LL_DEBUGS("LLDiskCache") << "Cache is " << (int)(((F32)file_size_total)/mMaxSizeBytes*100.0) << "% full" << LL_ENDL;
if( file_size_total < mMaxSizeBytes * (mHighPercent/100) )
{
// Nothing to do here
LL_DEBUGS("LLDiskCache") << "Not exceded high water - do nothing" << LL_ENDL;
return;
}
// If we reach here we are above the trigger level so we must purge until we've removed enough to take us down to the low water mark.
// </FS:Beq>
std::sort(file_info.begin(), file_info.end(), [](file_info_t& x, file_info_t& y)
{
return x.first > y.first;
return x.first < y.first; // <FS:Beq/> sort oldest to newest, to we can remove the oldest files first.
});
LL_INFOS() << "Purging cache to a maximum of " << mMaxSizeBytes << " bytes" << LL_ENDL;
// <FS:Beq> add high water/low water thresholds to reduce the churn in the cache.
auto target_size = (uintmax_t)(mMaxSizeBytes * (mLowPercent/100));
LL_INFOS() << "Purging cache to a maximum of " << target_size << " bytes" << LL_ENDL;
// </FS:Beq>
// <FS:Beq> Extra accounting to track the retention of static assets
//std::vector<bool> file_removed;
std::vector<S32> file_removed;
int keep{0};
int del{0};
int skip{0};
enum class purge_action { delete_file=0, keep_file, skip_file };
std::map<std::string,purge_action> file_removed;
auto keep{file_info.size()};
auto del{0};
auto skip{0};
// </FS:Beq>
if (mEnableCacheDebugInfo)
{
file_removed.reserve(file_info.size());
}
uintmax_t file_size_total = 0;
// <FS:Beq> revised purge logic to track amount removed not retained to shortern loop
// uintmax_t file_size_total = 0;
// if (mEnableCacheDebugInfo)
// {
// file_removed.reserve(file_info.size());
// }
// uintmax_t file_size_total = 0;
// for (file_info_t& entry : file_info)
// {
// file_size_total += entry.second.first;
// bool should_remove = file_size_total > mMaxSizeBytes;
// // <FS> Make sure static assets are not eliminated
// S32 action{ should_remove ? 0 : 1 };
// if (should_remove)
// {
// auto uuid_as_string = gDirUtilp->getBaseFileName(entry.second.second, true);
// uuid_as_string = uuid_as_string.substr(mCacheFilenamePrefix.size() + 1, 36);// skip "sl_cache_" and trailing "_N"
// // LL_INFOS() << "checking UUID=" <<uuid_as_string<< LL_ENDL;
// if (std::find(mSkipList.begin(), mSkipList.end(), uuid_as_string) != mSkipList.end())
// {
// // this is one of our protected items so no purging
// should_remove = false;
// action = 2;
// updateFileAccessTime(entry.second.second); // force these to the front of the list next time so that purge size works
// }
// }
// // </FS>
// if (mEnableCacheDebugInfo)
// {
// // <FS> Static asset stuff
// //file_removed.push_back(should_remove);
// file_removed.push_back(action);
// }
uintmax_t deleted_size_total = 0;
for (file_info_t& entry : file_info)
{
file_size_total += entry.second.first;
// first check if we still need to delete more files
bool should_remove = (file_size_total - deleted_size_total) > target_size;
bool should_remove = file_size_total > mMaxSizeBytes;
// <FS> Make sure static assets are not eliminated
S32 action{ should_remove ? 0 : 1 };
if (should_remove)
auto action{ should_remove ? purge_action::delete_file : purge_action::keep_file };
if (!should_remove)
{
auto uuid_as_string = gDirUtilp->getBaseFileName(entry.second.second, true);
uuid_as_string = uuid_as_string.substr(mCacheFilenamePrefix.size() + 1, 36);// skip "sl_cache_" and trailing "_N"
// LL_INFOS() << "checking UUID=" <<uuid_as_string<< LL_ENDL;
if (std::find(mSkipList.begin(), mSkipList.end(), uuid_as_string) != mSkipList.end())
{
// this is one of our protected items so no purging
should_remove = false;
action = 2;
updateFileAccessTime(entry.second.second); // force these to the front of the list next time so that purge size works
}
break;
}
// </FS>
auto this_file_size = entry.second.first;
deleted_size_total += this_file_size;
auto uuid_as_string = gDirUtilp->getBaseFileName(entry.second.second, true);
uuid_as_string = uuid_as_string.substr(mCacheFilenamePrefix.size() + 1, 36);// skip "sl_cache_" and trailing "_N"
// LL_INFOS() << "checking UUID=" <<uuid_as_string<< LL_ENDL;
if (std::find(mSkipList.begin(), mSkipList.end(), uuid_as_string) != mSkipList.end())
{
// this is one of our protected items so no purging
should_remove = false;
action = purge_action::skip_file;
updateFileAccessTime(entry.second.second); // force these to the front of the list next time so that purge size works
skip++;
}
else{
del++;
}
keep--;
if (mEnableCacheDebugInfo)
{
// <FS> Static asset stuff
//file_removed.push_back(should_remove);
file_removed.push_back(action);
// <FS> Static asset stuff
//file_removed.push_back(should_remove);
file_removed.emplace(entry.second.second, action);
}
// </FS>
if (should_remove)
{
boost::filesystem::remove(entry.second.second, ec);
@ -200,37 +262,52 @@ void LLDiskCache::purge()
}
}
}
// <FS:Beq> update the debug logging to be more useful
auto end_time = std::chrono::high_resolution_clock::now();
auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
// </FS:Beq>
if (mEnableCacheDebugInfo)
{
auto end_time = std::chrono::high_resolution_clock::now();
auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
// <FS:Beq> update the debug logging to be more useful
// auto end_time = std::chrono::high_resolution_clock::now();
// auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
// </FS:Beq>
// Log afterward so it doesn't affect the time measurement
// Logging thousands of file results can take hundreds of milliseconds
auto deleted_so_far = 0; // <FS:Beq/> update the debug logging to be more useful
for (size_t i = 0; i < file_info.size(); ++i)
{
const file_info_t& entry = file_info[i];
// <FS> Static asset stuff
deleted_so_far += entry.second.first; // <FS:Beq/> update the debug logging to be more useful
//const bool removed = file_removed[i];
//const std::string action = removed ? "DELETE:" : "KEEP:";
std::string action{};
switch (file_removed[i])
{
default:
case 0:
action = "KEEP";
keep++;
break;
case 1:
// Check if the file exists in the map
auto& filename{ entry.second.second };
if (file_removed.find(filename) != file_removed.end()) {
// File found in the map, retrieve the corresponding enum value
switch (file_removed[filename]) {
case purge_action::delete_file:
action = "DELETE";
del++;
break;
case 2:
break;
case purge_action::skip_file:
action = "STATIC";
skip++;
break;
break;
default:
// Handle any unexpected enum value
action = "UNKNOWN";
break;
}
}
else
{
action = "KEEP";
}
// </FS>
// have to do this because of LL_INFO/LL_END weirdness
@ -240,14 +317,22 @@ void LLDiskCache::purge()
line << entry.first << " ";
line << entry.second.first << " ";
line << entry.second.second;
line << " (" << file_size_total << "/" << mMaxSizeBytes << ")";
line << " (" << file_size_total - deleted_so_far << "/" << mMaxSizeBytes << ")"; // <FS:Beq/> update the debug logging to be more useful
LL_INFOS() << line.str() << LL_ENDL;
}
LL_INFOS() << "Total dir size after purge is " << dirFileSize(mCacheDir) << LL_ENDL;
LL_INFOS() << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
LL_INFOS() << "Deleted: " << del << " Skipped: " << skip << " Kept: " << keep << LL_ENDL; // <FS:Beq/> Extra accounting to track the retention of static assets
// <FS:Beq> make the summary stats more easily enabled.
}
// <FS:Beq> update the debug logging to be more useful
// LL_INFOS() << "Total dir size after purge is " << dirFileSize(mCacheDir) << LL_ENDL;
// LL_INFOS() << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
auto newCacheSize = updateCacheSize(file_size_total - deleted_size_total);
LL_INFOS("LLDiskCache") << "Total dir size after purge is " << newCacheSize << LL_ENDL;
LL_INFOS("LLDiskCache") << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
// </FS:Beq>
LL_INFOS("LLDiskCache") << "Deleted: " << del << " Skipped: " << skip << " Kept: " << keep << LL_ENDL; // <FS:Beq/> Extra accounting to track the retention of static assets
LL_INFOS("LLDiskCache") << "Total of " << deleted_size_total << " bytes removed." << LL_ENDL; // <FS:Beq/> Extra accounting to track the retention of static assets
// } <FS:Beq/> this bracket was moved up a few lines.
}
const std::string LLDiskCache::assetTypeToString(LLAssetType::EType at)
@ -534,8 +619,32 @@ void LLDiskCache::removeOldVFSFiles()
}
}
uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
// <FS:Beq> Lets not scan every single time if we can avoid it eh?
// uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
// {
uintmax_t LLDiskCache::updateCacheSize(const uintmax_t newsize)
{
mStoredCacheSize = newsize;
mLastScanTime = system_clock::now();
return mStoredCacheSize;
}
uintmax_t LLDiskCache::dirFileSize(const std::string& dir, bool force )
{
using namespace std::chrono;
const seconds cache_duration{ 120 };// A rather arbitrary number. it takes 5 seconds+ on a fast drive to scan 80K+ items. purge runs every minute and will update. so 120 should mean we never need a superfluous cache scan.
const auto current_time = system_clock::now();
const auto time_difference = duration_cast<seconds>(current_time - mLastScanTime);
// Check if the cached result can be used
if( !force && time_difference < cache_duration )
{
LL_DEBUGS("LLDiskCache") << "Using cached result: " << mStoredCacheSize << LL_ENDL;
return mStoredCacheSize;
}
// </FS:Beq>
uintmax_t total_file_size = 0;
/**
@ -577,7 +686,10 @@ uintmax_t LLDiskCache::dirFileSize(const std::string& dir)
}
}
return total_file_size;
// <FS:Beq> Lets not scan every single time if we can avoid it eh?
// return total_file_size;
return updateCacheSize(total_file_size);
// </FS:Beq>
}
LLPurgeDiskCacheThread::LLPurgeDiskCacheThread() :

View File

@ -63,6 +63,9 @@
#define _LLDISKCACHE
#include "llsingleton.h"
#include <chrono>
using namespace std::chrono;
class LLDiskCache :
public LLParamSingleton<LLDiskCache>
@ -92,7 +95,18 @@ class LLDiskCache :
* if there are bugs, we can ask uses to enable this
* setting and send us their logs
*/
const bool enable_cache_debug_info);
const bool enable_cache_debug_info,
// <FS:Beq> Add high/low threshold controls for cache purging
/**
* A floating point percentage of the max_size_bytes above which the cache purge will trigger.
*/
const F32 highwater_mark_percent,
/**
* A floating point percentage of the max_size_bytes which the cache purge will aim to reach once triggered.
*/
const F32 lowwater_mark_percent
// </FS:Beq>
);
virtual ~LLDiskCache() = default;
@ -157,6 +171,10 @@ class LLDiskCache :
// <FS:Ansariel> Better asset cache size control
void setMaxSizeBytes(uintmax_t size) { mMaxSizeBytes = size; }
// <FS:Beq> High/Low water control
void setHighWaterPercentage(F32 HiPct) { mHighPercent = llclamp(HiPct, mLowPercent, 100.0); };
void setLowWaterPercentage(F32 LowPct) { mLowPercent = llclamp(LowPct, 0.0, mHighPercent); };
// </FS:Beq>
private:
/**
@ -164,7 +182,8 @@ class LLDiskCache :
* directory. Primarily used here to determine the directory size
* before and after the cache purge
*/
uintmax_t dirFileSize(const std::string& dir);
uintmax_t updateCacheSize(const uintmax_t newsize); // <FS:Beq/> enable time based caching of dirfilesize except when force is true.
uintmax_t dirFileSize(const std::string& dir, bool force=false); // <FS:Beq/> enable time based caching of dirfilesize except when force is true.
/**
* Utility function to convert an LLAssetType enum into a
@ -172,6 +191,13 @@ class LLDiskCache :
*/
const std::string assetTypeToString(LLAssetType::EType at);
/**
* cache the directory size cos it takes forever to calculate it
*
*/
uintmax_t mStoredCacheSize{ 0 };
time_point<system_clock> mLastScanTime{ };
private:
/**
* The maximum size of the cache in bytes. After purge is called, the
@ -179,6 +205,10 @@ class LLDiskCache :
* less than this value
*/
uintmax_t mMaxSizeBytes;
// <FS:Beq> High/Low water control
F32 mHighPercent { 95.0 };
F32 mLowPercent { 70.0 };
// </FS:Beq>
/**
* The folder that holds the cached files. The consumer of this

View File

@ -332,6 +332,18 @@ void LLExperienceCache::requestExperiences()
std::string urlBase = mCapability("GetExperienceInfo");
if (urlBase.empty())
{
// <FS:Beq> FIRE-33046 reduce logging of warning in OS grids with no experiences capability
#ifdef OPENSIM
if( LLGridManager::instance().isInOpenSim() )
{
// In Opensim this can occur if the grid does not have experiences capability. make it a debug
LL_DEBUGS("ExperienceCache") << "No Experience capability." << LL_ENDL;
}
else
// Danger: Dangling 'else'
// In SL, this is a sign of a problem as everything should have experience capability so flag it as a warning still.
#endif
// </FS:Beq>
LL_WARNS("ExperienceCache") << "No Experience capability." << LL_ENDL;
return;
}

View File

@ -72,7 +72,11 @@ typedef enum e_chat_style
CHAT_STYLE_IRC,
CHAT_STYLE_HISTORY,
CHAT_STYLE_TELEPORT_SEP,
CHAT_STYLE_MODERATOR
// <FS:Zi> Add a distinct color for server side group chat replay
// CHAT_STYLE_MODERATOR
CHAT_STYLE_MODERATOR,
CHAT_STYLE_SERVER_HISTORY
// </FS:Zi>
}EChatStyle;
// A piece of chat

View File

@ -53,6 +53,8 @@
#include "llvoavatarself.h" // for gAgentAvatarp
#include "llavatarnamecache.h"
#include "fsassetblacklist.h"
constexpr S32 MAX_ANIMATIONS = 100;
// --------------------------------------------------------------------------
@ -157,13 +159,13 @@ BOOL AnimationExplorer::postBuild()
{
mAnimationScrollList = getChild<LLScrollListCtrl>("animation_list");
mStopButton = getChild<LLButton>("stop_btn");
mRevokeButton = getChild<LLButton>("revoke_btn");
mBlacklistButton = getChild<LLButton>("blacklist_btn");
mStopAndRevokeButton = getChild<LLButton>("stop_and_revoke_btn");
mNoOwnedAnimationsCheckBox = getChild<LLCheckBoxCtrl>("no_owned_animations_check");
mAnimationScrollList->setCommitCallback(boost::bind(&AnimationExplorer::onSelectAnimation, this));
mStopButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopPressed, this));
mRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onRevokePressed, this));
mBlacklistButton->setCommitCallback(boost::bind(&AnimationExplorer::onBlacklistPressed, this));
mStopAndRevokeButton->setCommitCallback(boost::bind(&AnimationExplorer::onStopAndRevokePressed, this));
mNoOwnedAnimationsCheckBox->setCommitCallback(boost::bind(&AnimationExplorer::onOwnedCheckToggled, this));
@ -199,7 +201,7 @@ void AnimationExplorer::onSelectAnimation()
S32 column = mAnimationScrollList->getColumn("animation_id")->mIndex;
mCurrentAnimationID = item->getColumn(column)->getValue().asUUID();
column = mAnimationScrollList->getColumn("played_by")->mIndex;
column = mAnimationScrollList->getColumn("object_id")->mIndex;
mCurrentObject = item->getColumn(column)->getValue().asUUID();
startMotion(mCurrentAnimationID);
@ -214,23 +216,35 @@ void AnimationExplorer::onStopPressed()
}
}
void AnimationExplorer::onRevokePressed()
void AnimationExplorer::onBlacklistPressed()
{
if (mCurrentObject.notNull())
onStopPressed();
LLScrollListItem* item = mAnimationScrollList->getFirstSelected();
if (!item)
{
LLViewerObject* vo = gObjectList.findObject(mCurrentObject);
if (vo)
{
gAgentAvatarp->revokePermissionsOnObject(vo);
}
return;
}
S32 column = mAnimationScrollList->getColumn("played_by")->mIndex;
std::string region_name{};
if (gAgent.getRegion())
{
region_name = gAgent.getRegion()->getName();
}
FSAssetBlacklist::getInstance()->addNewItemToBlacklist(mCurrentAnimationID, item->getColumn(column)->getValue(), region_name, LLAssetType::AT_ANIMATION);
}
void AnimationExplorer::onStopAndRevokePressed()
{
onStopPressed();
onRevokePressed();
if (mCurrentObject.notNull())
{
if (LLViewerObject* vo = gObjectList.findObject(mCurrentObject); vo)
{
gAgentAvatarp->revokePermissionsOnObject(vo);
}
}
}
void AnimationExplorer::onOwnedCheckToggled()
@ -316,11 +330,10 @@ void AnimationExplorer::updateList(F64 current_timestamp)
// go through the list of playing animations to find out if this animation played by
// this object is still running
for (LLVOAvatar::AnimSourceIterator anim_iter = gAgentAvatarp->mAnimationSources.begin();
anim_iter != gAgentAvatarp->mAnimationSources.end(); ++anim_iter)
for (const auto& [anim_object_id, anim_anim_id] : gAgentAvatarp->mAnimationSources)
{
// object and animation found
if (anim_iter->first == object_id && anim_iter->second == anim_id)
if (anim_object_id == object_id && anim_anim_id == anim_id)
{
// set text to "Still playing" and break out of this loop
played_text->setText(LLTrans::getString("animation_explorer_still_playing"));
@ -343,8 +356,7 @@ void AnimationExplorer::updateList(F64 current_timestamp)
}
std::string prio_text = LLTrans::getString("animation_explorer_unknown_priority");
LLKeyframeMotion* motion = dynamic_cast<LLKeyframeMotion*>(gAgentAvatarp->findMotion(anim_id));
if (motion)
if (LLKeyframeMotion* motion = dynamic_cast<LLKeyframeMotion*>(gAgentAvatarp->findMotion(anim_id)); motion)
{
prio_text = llformat("%d", (S32)motion->getPriority());
}
@ -367,8 +379,7 @@ void AnimationExplorer::addAnimation(const LLUUID& id, const LLUUID& played_by,
std::string playedByName = played_by.asString();
// find out if the object is still in reach
LLViewerObject* vo = gObjectList.findObject(played_by);
if (vo)
if (LLViewerObject* vo = gObjectList.findObject(played_by); vo)
{
// if it was an avatar, get the name here
if (vo->isAvatar())
@ -450,8 +461,7 @@ void AnimationExplorer::addAnimation(const LLUUID& id, const LLUUID& played_by,
void AnimationExplorer::onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name)
{
auto iter = mAvatarNameCacheConnections.find(id);
if (iter != mAvatarNameCacheConnections.end())
if (auto iter = mAvatarNameCacheConnections.find(id); iter != mAvatarNameCacheConnections.end())
{
if (iter->second.connected())
{
@ -478,10 +488,8 @@ void AnimationExplorer::requestNameCallback(LLMessageSystem* msg)
LLUUID object_id;
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, object_id, index);
uuid_vec_t::iterator iter;
iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), object_id);
// if this is one of the objects we were looking for, process the data
if (iter != mRequestedIDs.end())
if (auto iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), object_id); iter != mRequestedIDs.end())
{
// get the name of the object
std::string object_name;
@ -502,11 +510,9 @@ void AnimationExplorer::updateListEntry(const LLUUID& id, const std::string& nam
S32 played_by_column = mAnimationScrollList->getColumn("played_by")->mIndex;
// find all scroll list entries with this object UUID and update the names there
std::vector<LLScrollListItem*> items = mAnimationScrollList->getAllData();
for (std::vector<LLScrollListItem*>::iterator list_iter = items.begin(); list_iter != items.end(); ++list_iter)
for (LLScrollListItem* item : mAnimationScrollList->getAllData())
{
LLScrollListItem* item = *list_iter;
LLUUID list_object_id = item->getColumn(object_id_column)->getValue().asUUID();
const LLUUID& list_object_id = item->getColumn(object_id_column)->getValue().asUUID();
if (id == list_object_id)
{

View File

@ -100,7 +100,7 @@ class AnimationExplorer
LLScrollListCtrl* mAnimationScrollList;
LLButton* mStopButton;
LLButton* mRevokeButton;
LLButton* mBlacklistButton;
LLButton* mStopAndRevokeButton;
LLCheckBoxCtrl* mNoOwnedAnimationsCheckBox;
@ -126,7 +126,7 @@ class AnimationExplorer
void onSelectAnimation();
void onStopPressed();
void onRevokePressed();
void onBlacklistPressed();
void onStopAndRevokePressed();
void onOwnedCheckToggled();
};

View File

@ -2952,6 +2952,28 @@
<key>Value</key>
<integer>2048</integer>
</map>
<key>FSDiskCacheHighWaterPercent</key>
<map>
<key>Comment</key>
<string>Trigger point above which we should start to clear out older cache entries</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>95.0</integer>
</map>
<key>FSDiskCacheLowWaterPercent</key>
<map>
<key>Comment</key>
<string>Level to drain cache to once it goes over the high water limit.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>70.0</integer>
</map>
<key>CacheLocation</key>
<map>
<key>Comment</key>

View File

@ -173,6 +173,7 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
mRequestNeedsSent(false),
mRlvBehaviorCallbackConnection()
{
LLViewerRegion::sFSAreaSearchActive = true;
mFactoryMap["area_search_list_panel"] = LLCallbackMap(createPanelList, this);
mFactoryMap["area_search_find_panel"] = LLCallbackMap(createPanelFind, this);
mFactoryMap["area_search_filter_panel"] = LLCallbackMap(createPanelFilter, this);
@ -182,12 +183,13 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
// Register an idle update callback
gIdleCallbacks.addFunction(idle, this);
mParcelChangedObserver = new FSParcelChangeObserver(this);
LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver);
mParcelChangedObserver = std::make_unique<FSParcelChangeObserver>(this);
LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver.get());
}
FSAreaSearch::~FSAreaSearch()
{
LLViewerRegion::sFSAreaSearchActive = false;
if (!gIdleCallbacks.deleteFunction(idle, this))
{
LL_WARNS("FSAreaSearch") << "FSAreaSearch::~FSAreaSearch() failed to delete callback" << LL_ENDL;
@ -209,9 +211,8 @@ FSAreaSearch::~FSAreaSearch()
if (mParcelChangedObserver)
{
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver);
delete mParcelChangedObserver;
mParcelChangedObserver = NULL;
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver.get());
mParcelChangedObserver = nullptr;
}
}
@ -252,9 +253,7 @@ void FSAreaSearch::draw()
for (const auto item : items)
{
LLViewerObject* objectp = gObjectList.findObject(item->getUUID());
if (objectp)
if (LLViewerObject* objectp = gObjectList.findObject(item->getUUID()); objectp)
{
const std::string& objectName = mObjectDetails[item->getUUID()].description;
gObjectList.addDebugBeacon(objectp->getPositionAgent(), objectName, mBeaconColor, mBeaconTextColor, beacon_line_width);
@ -299,7 +298,7 @@ void* FSAreaSearch::createPanelFilter(void* data)
void* FSAreaSearch::createPanelAdvanced(void* data)
{
FSAreaSearch* self = (FSAreaSearch*)data;
self->mPanelAdvanced = new FSPanelAreaSearchAdvanced(self);
self->mPanelAdvanced = new FSPanelAreaSearchAdvanced();
return self->mPanelAdvanced;
}
@ -324,8 +323,7 @@ void FSAreaSearch::checkRegion()
if (mActive)
{
// Check if we changed region, and if we did, clear the object details cache.
LLViewerRegion* region = gAgent.getRegion(); // getRegion can return NULL if disconnected.
if (region && (region != mLastRegion))
if (LLViewerRegion* region = gAgent.getRegion(); region && (region != mLastRegion))
{
if (!mExcludeNeighborRegions)
{
@ -459,8 +457,7 @@ void FSAreaSearch::findObjects()
if (object_it.second.request == FSObjectProperties::NEED || object_it.second.request == FSObjectProperties::SENT)
{
const LLUUID& id = object_it.second.id;
LLViewerObject* objectp = gObjectList.findObject(id);
if (!objectp)
if (LLViewerObject* objectp = gObjectList.findObject(id); !objectp)
{
object_it.second.request = FSObjectProperties::FAILED;
mRequested--;
@ -1035,8 +1032,7 @@ void FSAreaSearch::matchObject(FSObjectProperties& details, LLViewerObject* obje
row_params.columns.add(cell_params);
cell_params.column = "land_impact";
F32 cost = objectp->getLinksetCost();
if (cost > F_ALMOST_ZERO)
if (F32 cost = objectp->getLinksetCost(); cost > F_ALMOST_ZERO)
{
cell_params.value = cost;
}
@ -1098,14 +1094,11 @@ void FSAreaSearch::updateObjectCosts(const LLUUID& object_id, F32 object_cost, F
return;
}
FSScrollListCtrl* result_list = mPanelList->getResultList();
if (result_list)
if (FSScrollListCtrl* result_list = mPanelList->getResultList(); result_list)
{
LLScrollListItem* list_row = result_list->getItem(LLSD(object_id));
if (list_row)
if (LLScrollListItem* list_row = result_list->getItem(LLSD(object_id)); list_row)
{
LLScrollListColumn* list_column = result_list->getColumn("land_impact");
if (list_column)
if (LLScrollListColumn* list_column = result_list->getColumn("land_impact"); list_column)
{
LLScrollListCell* linkset_cost_cell = list_row->getColumn(list_column->mIndex);
linkset_cost_cell->setValue(LLSD(link_cost));
@ -1160,8 +1153,7 @@ void FSAreaSearch::avatarNameCacheCallback(const LLUUID& id, const LLAvatarName&
void FSAreaSearch::callbackLoadFullName(const LLUUID& id, const std::string& full_name )
{
auto iter = mNameCacheConnections.find(id);
if (iter != mNameCacheConnections.end())
if (auto iter = mNameCacheConnections.find(id); iter != mNameCacheConnections.end())
{
if (iter->second.connected())
{
@ -1444,8 +1436,7 @@ void FSPanelAreaSearchList::onDoubleClick()
}
const LLUUID& object_id = item->getUUID();
LLViewerObject* objectp = gObjectList.findObject(object_id);
if (objectp)
if (LLViewerObject* objectp = gObjectList.findObject(object_id); objectp)
{
FSObjectProperties& details = mFSAreaSearch->mObjectDetails[object_id];
LLTracker::trackLocation(objectp->getPositionGlobal(), details.name, "", LLTracker::LOCATION_ITEM);
@ -2060,10 +2051,6 @@ BOOL FSPanelAreaSearchFind::postBuild()
return LLPanel::postBuild();
}
// virtual
FSPanelAreaSearchFind::~FSPanelAreaSearchFind()
{ }
void FSPanelAreaSearchFind::onButtonClickedClear()
{
mNameLineEditor->clear();
@ -2180,10 +2167,6 @@ BOOL FSPanelAreaSearchFilter::postBuild()
return LLPanel::postBuild();
}
// virtual
FSPanelAreaSearchFilter::~FSPanelAreaSearchFilter()
{ }
void FSPanelAreaSearchFilter::onCommitCheckbox()
{
mFSAreaSearch->setFilterLocked(mCheckboxLocked->get());
@ -2280,10 +2263,6 @@ FSPanelAreaSearchOptions::FSPanelAreaSearchOptions(FSAreaSearch* pointer)
mEnableCallbackRegistrar.add("AreaSearch.EnableColumn", boost::bind(&FSPanelAreaSearchOptions::onEnableColumnVisibilityChecked, this, _2));
}
// virtual
FSPanelAreaSearchOptions::~FSPanelAreaSearchOptions()
{ }
void FSPanelAreaSearchOptions::onCommitCheckboxDisplayColumn(const LLSD& userdata)
{
const std::string& column_name = userdata.asStringRef();
@ -2306,11 +2285,6 @@ bool FSPanelAreaSearchOptions::onEnableColumnVisibilityChecked(const LLSD& userd
// Advanced tab
//---------------------------------------------------------------------------
FSPanelAreaSearchAdvanced::FSPanelAreaSearchAdvanced(FSAreaSearch* pointer)
: LLPanel()
{
}
BOOL FSPanelAreaSearchAdvanced::postBuild()
{
mCheckboxClickTouch = getChild<LLCheckBoxCtrl>("double_click_touch");
@ -2319,7 +2293,3 @@ BOOL FSPanelAreaSearchAdvanced::postBuild()
return LLPanel::postBuild();
}
// virtual
FSPanelAreaSearchAdvanced::~FSPanelAreaSearchAdvanced()
{ }

View File

@ -217,7 +217,7 @@ private:
class FSParcelChangeObserver;
friend class FSParcelChangeObserver;
FSParcelChangeObserver* mParcelChangedObserver;
std::unique_ptr<FSParcelChangeObserver> mParcelChangedObserver;
LLTabContainer* mTab;
FSPanelAreaSearchList* mPanelList;
@ -332,7 +332,7 @@ class FSPanelAreaSearchFind
LOG_CLASS(FSPanelAreaSearchFind);
public:
FSPanelAreaSearchFind(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchFind();
virtual ~FSPanelAreaSearchFind() = default;
/*virtual*/ BOOL postBuild();
/*virtual*/ BOOL handleKeyHere(KEY key,MASK mask);
@ -365,7 +365,7 @@ class FSPanelAreaSearchFilter
LOG_CLASS(FSPanelAreaSearchFilter);
public:
FSPanelAreaSearchFilter(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchFilter();
virtual ~FSPanelAreaSearchFilter() = default;
/*virtual*/ BOOL postBuild();
@ -410,7 +410,7 @@ class FSPanelAreaSearchOptions
LOG_CLASS(FSPanelAreaSearchOptions);
public:
FSPanelAreaSearchOptions(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchOptions();
virtual ~FSPanelAreaSearchOptions() = default;
private:
void onCommitCheckboxDisplayColumn(const LLSD& userdata);
@ -430,8 +430,8 @@ class FSPanelAreaSearchAdvanced
{
LOG_CLASS(FSPanelAreaSearchAdvanced);
public:
FSPanelAreaSearchAdvanced(FSAreaSearch* pointer);
virtual ~FSPanelAreaSearchAdvanced();
FSPanelAreaSearchAdvanced() = default;
virtual ~FSPanelAreaSearchAdvanced() = default;
/*virtual*/ BOOL postBuild();

View File

@ -54,6 +54,9 @@ LLAssetType::EType S32toAssetType(S32 assetindex)
case 6:
type = LLAssetType::AT_OBJECT;
break;
case 20:
type = LLAssetType::AT_ANIMATION;
break;
case 45:
type = LLAssetType::AT_PERSON;
break;
@ -76,8 +79,7 @@ bool FSAssetBlacklist::isBlacklisted(const LLUUID& id, LLAssetType::EType type)
return false;
}
blacklist_type_map_t::iterator it;
it = mBlacklistTypeContainer.find(type);
blacklist_type_map_t::iterator it = mBlacklistTypeContainer.find(type);
if (it == mBlacklistTypeContainer.end())
{
@ -114,8 +116,7 @@ bool FSAssetBlacklist::removeItem(const LLUUID& id)
{
gObjectList.removeDerenderedItem(id);
blacklist_data_t::iterator it;
it = mBlacklistData.find(id);
blacklist_data_t::iterator it = mBlacklistData.find(id);
if (it == mBlacklistData.end())
{
@ -133,9 +134,7 @@ bool FSAssetBlacklist::removeItem(const LLUUID& id)
void FSAssetBlacklist::removeItemFromBlacklist(const LLUUID& id)
{
uuid_vec_t ids;
ids.push_back(id);
removeItemsFromBlacklist(ids);
removeItemsFromBlacklist({ id });
}
void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids)
@ -145,13 +144,13 @@ void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids)
bool need_save = false;
LLSD data;
for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
for (const auto& id : ids)
{
if (removeItem(*it))
if (removeItem(id))
{
need_save = true;
}
data.append((*it).asString());
data.append(id.asString());
}
if (need_save)
@ -161,7 +160,7 @@ void FSAssetBlacklist::removeItemsFromBlacklist(const uuid_vec_t& ids)
if (!mBlacklistChangedCallback.empty())
{
mBlacklistChangedCallback(data, BLACKLIST_REMOVE);
mBlacklistChangedCallback(data, eBlacklistOperation::BLACKLIST_REMOVE);
}
}
}
@ -194,7 +193,7 @@ void FSAssetBlacklist::addNewItemToBlacklistData(const LLUUID& id, const LLSD& d
if (!mBlacklistChangedCallback.empty())
{
mBlacklistChangedCallback(LLSD().with(id.asString(), data), BLACKLIST_ADD);
mBlacklistChangedCallback(LLSD().with(id.asString(), data), eBlacklistOperation::BLACKLIST_ADD);
}
}
@ -205,18 +204,13 @@ bool FSAssetBlacklist::addEntryToBlacklistMap(const LLUUID& id, LLAssetType::ETy
return false;
}
blacklist_type_map_t::iterator it;
it = mBlacklistTypeContainer.find(type);
if (it != mBlacklistTypeContainer.end())
if (auto it = mBlacklistTypeContainer.find(type); it != mBlacklistTypeContainer.end())
{
mBlacklistTypeContainer[type].insert(id);
}
else
{
blacklisted_uuid_container_t cont;
cont.insert(id);
mBlacklistTypeContainer[type] = cont;
mBlacklistTypeContainer[type] = blacklisted_uuid_container_t{ id };
}
return true;
}
@ -233,7 +227,7 @@ void FSAssetBlacklist::loadBlacklist()
{
for (LLSD::map_const_iterator itr = data.beginMap(); itr != data.endMap(); ++itr)
{
LLUUID uid = LLUUID(itr->first);
LLUUID uid{ itr->first };
LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES);
cipher.decrypt(uid.mData, UUID_BYTES);
LLSD entry_data = itr->second;
@ -273,7 +267,7 @@ void FSAssetBlacklist::loadBlacklist()
LLSDSerialize::fromXMLDocument(datallsd, oldfile);
for (LLSD::map_const_iterator itr = datallsd.beginMap(); itr != datallsd.endMap(); ++itr)
{
LLUUID uid = LLUUID(itr->first);
LLUUID uid{ itr->first };
LLSD data = itr->second;
if (uid.isNull() || !data.has("entry_name") || !data.has("entry_type") || !data.has("entry_date"))
{
@ -310,14 +304,14 @@ void FSAssetBlacklist::saveBlacklist()
llofstream save_file(mBlacklistFileName.c_str());
LLSD savedata;
for (blacklist_data_t::const_iterator itr = mBlacklistData.begin(); itr != mBlacklistData.end(); ++itr)
for (const auto& [id, data] : mBlacklistData)
{
if (itr->second["asset_permanent"].asBoolean())
if (data["asset_permanent"].asBoolean())
{
LLUUID shadow_id(itr->first);
LLUUID shadow_id{ id };
LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES);
cipher.encrypt(shadow_id.mData, UUID_BYTES);
savedata[shadow_id.asString()] = itr->second;
savedata[shadow_id.asString()] = data;
}
}

View File

@ -29,15 +29,15 @@
#ifndef FS_ASSETBLACKLIST_H
#define FS_ASSETBLACKLIST_H
#include <boost/unordered_map.hpp>
#include <boost/unordered_set.hpp>
#include <unordered_map>
#include <unordered_set>
#include "llsingleton.h"
#include "llassettype.h"
typedef boost::unordered_set<LLUUID, FSUUIDHash> blacklisted_uuid_container_t;
typedef std::map<LLAssetType::EType, blacklisted_uuid_container_t> blacklist_type_map_t;
typedef boost::unordered_map<LLUUID, LLSD, FSUUIDHash> blacklist_data_t;
using blacklisted_uuid_container_t = std::unordered_set<LLUUID, FSUUIDHash>;
using blacklist_type_map_t = std::map<LLAssetType::EType, blacklisted_uuid_container_t>;
using blacklist_data_t = std::unordered_map<LLUUID, LLSD, FSUUIDHash>;
class FSAssetBlacklist : public LLSingleton<FSAssetBlacklist>
{
@ -54,7 +54,7 @@ public:
blacklist_data_t getBlacklistData() const { return mBlacklistData; };
enum eBlacklistOperation
enum class eBlacklistOperation
{
BLACKLIST_ADD,
BLACKLIST_REMOVE

View File

@ -803,6 +803,7 @@ public:
}
else if ((mSourceType == CHAT_SOURCE_AGENT || (mSourceType == CHAT_SOURCE_SYSTEM && mType == CHAT_TYPE_RADAR))
&& !mAvatarID.isNull()
&& chat.mChatStyle != CHAT_STYLE_SERVER_HISTORY
&& chat.mChatStyle != CHAT_STYLE_HISTORY)
{
// ...from a normal user, lookup the name and fill in later.
@ -831,6 +832,7 @@ public:
// [/RLVa:KB]
}
else if (chat.mChatStyle == CHAT_STYLE_HISTORY ||
chat.mChatStyle == CHAT_STYLE_SERVER_HISTORY ||
(mSourceType == CHAT_SOURCE_AGENT || (mSourceType == CHAT_SOURCE_SYSTEM && mType == CHAT_TYPE_RADAR)))
{
//if it's an avatar name with a username add formatting
@ -1508,12 +1510,19 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
delimiter_style = "BOLD";
}
bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY;
bool message_from_log = (chat.mChatStyle == CHAT_STYLE_HISTORY || chat.mChatStyle == CHAT_STYLE_SERVER_HISTORY);
bool teleport_separator = chat.mSourceType == CHAT_SOURCE_TELEPORT;
// We graying out chat history by graying out messages that contains full date in a time string
if (message_from_log && !is_conversation_log)
{
txt_color = LLUIColorTable::instance().getColor("ChatHistoryMessageFromLog");
if (chat.mChatStyle == CHAT_STYLE_HISTORY)
{
txt_color = LLUIColorTable::instance().getColor("ChatHistoryMessageFromLog");
}
else if (chat.mChatStyle == CHAT_STYLE_SERVER_HISTORY)
{
txt_color = LLUIColorTable::instance().getColor("ChatHistoryMessageFromServerLog");
}
body_message_params.color(txt_color);
body_message_params.readonly_color(txt_color);
name_params.color(txt_color);

View File

@ -1025,7 +1025,7 @@ LLSD FSData::getSystemInfo()
sysinfo1 += llformat("%s\n\n", info["SERVER_VERSION"].asString().c_str());
sysinfo1 += llformat("CPU: %s\n", info["CPU"].asString().c_str());
sysinfo1 += llformat("Memory: %d MB\n", info["MEMORY_MB"].asInteger());
sysinfo1 += llformat("Memory: %d MB (Used: %d MB)\n", info["MEMORY_MB"].asInteger(), info["USED_RAM"].asInteger());
sysinfo1 += llformat("OS: %s\n", info["OS_VERSION"].asString().c_str());
sysinfo1 += llformat("Graphics Card Vendor: %s\n", info["GRAPHICS_CARD_VENDOR"].asString().c_str());
sysinfo1 += llformat("Graphics Card: %s\n", info["GRAPHICS_CARD"].asString().c_str());

View File

@ -100,6 +100,8 @@ std::string FSFloaterAssetBlacklist::getTypeString(S32 type)
return getString("asset_sound");
case LLAssetType::AT_OBJECT:
return getString("asset_object");
case LLAssetType::AT_ANIMATION:
return getString("asset_animation");
case LLAssetType::AT_PERSON:
return getString("asset_resident");
default:
@ -112,11 +114,9 @@ void FSFloaterAssetBlacklist::buildBlacklist()
bool needs_sort = mResultList->isSorted();
mResultList->setNeedsSort(false);
blacklist_data_t data = FSAssetBlacklist::instance().getBlacklistData();
for (blacklist_data_t::const_iterator iterator = data.begin(); iterator != data.end(); ++iterator)
for (const auto& [id, data] : FSAssetBlacklist::instance().getBlacklistData())
{
addElementToList(iterator->first, iterator->second);
addElementToList(id, data);
}
mResultList->setNeedsSort(needs_sort);
@ -166,11 +166,10 @@ void FSFloaterAssetBlacklist::addElementToList(const LLUUID& id, const LLSD& dat
void FSFloaterAssetBlacklist::removeElements()
{
uuid_vec_t items;
std::vector<LLScrollListItem*> list = mResultList->getAllSelected();
for (std::vector<LLScrollListItem*>::const_iterator it = list.begin(); it != list.end(); ++it)
for (auto listitem : mResultList->getAllSelected())
{
items.push_back((*it)->getUUID());
items.emplace_back(listitem->getUUID());
}
FSAssetBlacklist::instance().removeItemsFromBlacklist(items);
@ -178,7 +177,7 @@ void FSFloaterAssetBlacklist::removeElements()
void FSFloaterAssetBlacklist::onBlacklistChanged(const LLSD& data, FSAssetBlacklist::eBlacklistOperation op)
{
if (op == FSAssetBlacklist::BLACKLIST_ADD)
if (op == FSAssetBlacklist::eBlacklistOperation::BLACKLIST_ADD)
{
bool need_sort = mResultList->isSorted();
mResultList->setNeedsSort(false);
@ -216,8 +215,7 @@ void FSFloaterAssetBlacklist::onRemoveAllTemporaryBtn()
void FSFloaterAssetBlacklist::onSelectionChanged()
{
bool enabled = false;
size_t num_selected = mResultList->getAllSelected().size();
if (num_selected == 1)
if (size_t num_selected = mResultList->getAllSelected().size(); num_selected == 1)
{
const LLScrollListItem* item = mResultList->getFirstSelected();
S32 name_column = mResultList->getColumn("asset_type")->mIndex;
@ -257,8 +255,7 @@ void FSFloaterAssetBlacklist::onStopBtn()
return;
}
LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID);
if (audio_source && !audio_source->isDone())
if (LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID); audio_source && !audio_source->isDone())
{
audio_source->play(LLUUID::null);
}
@ -307,8 +304,7 @@ BOOL FSFloaterAssetBlacklist::tick()
return FALSE;
}
LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID);
if (!audio_source || audio_source->isDone())
if (LLAudioSource* audio_source = gAudiop->findAudioSource(mAudioSourceID); !audio_source || audio_source->isDone())
{
childSetVisible("play_btn", true);
childSetVisible("stop_btn", false);
@ -348,8 +344,7 @@ namespace FSFloaterAssetBlacklistMenu
if (command == "remove")
{
FSFloaterAssetBlacklist* floater = LLFloaterReg::findTypedInstance<FSFloaterAssetBlacklist>("fs_asset_blacklist");
if (floater)
if (FSFloaterAssetBlacklist* floater = LLFloaterReg::findTypedInstance<FSFloaterAssetBlacklist>("fs_asset_blacklist"); floater)
{
floater->removeElements();
}

View File

@ -81,9 +81,9 @@
#include <boost/regex.hpp> // <FS:Zi> FIRE-24133 - Redirect chat channel messages
const F32 ME_TYPING_TIMEOUT = 4.0f;
const F32 OTHER_TYPING_TIMEOUT = 9.0f;
const F32 NAME_REFRESH_TIMEOUT = 300.0f;
constexpr F32 ME_TYPING_TIMEOUT = 4.0f;
constexpr F32 OTHER_TYPING_TIMEOUT = 9.0f;
constexpr F32 NAME_REFRESH_TIMEOUT = 300.0f;
floater_showed_signal_t FSFloaterIM::sIMFloaterShowedSignal;
@ -192,7 +192,7 @@ BOOL FSFloaterIM::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash)
{
mInputEditor->setFocus(TRUE);
onTabInto();
if(focus_flash)
if (focus_flash)
{
gFocusMgr.triggerFocusFlash();
}
@ -202,7 +202,7 @@ BOOL FSFloaterIM::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash)
void FSFloaterIM::onFocusLost()
{
LLIMModel::getInstance()->resetActiveSessionID();
LLChicletBar::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, false);
}
@ -230,8 +230,8 @@ void FSFloaterIM::onClose(bool app_quitting)
//
// Last change:
// EXT-3516 X Button should end IM session, _ button should hide
// AO: Make sure observers are removed on close
mVoiceChannelStateChangeConnection.disconnect();
if(LLVoiceClient::instanceExists())
@ -250,7 +250,7 @@ void FSFloaterIM::onSnooze()
{
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID);
if (session == NULL)
if (!session)
{
LL_WARNS("FSFloaterIM") << "Empty session." << LL_ENDL;
return;
@ -261,7 +261,7 @@ void FSFloaterIM::onSnooze()
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
if (is_call_with_chat && voice_channel != NULL && voice_channel->isActive())
if (is_call_with_chat && voice_channel && voice_channel->isActive())
{
LLSD payload;
payload["session_id"] = mSessionID;
@ -289,8 +289,7 @@ void FSFloaterIM::confirmSnooze()
void FSFloaterIM::snoozeDurationCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
if (S32 option = LLNotificationsUtil::getSelectedOption(notification, response); 0 == option)
{
std::istringstream duration_str(response["duration"].asString());
S32 duration(-1);
@ -329,7 +328,8 @@ void FSFloaterIM::newIMCallback(const LLSD& data){
LLUUID session_id = data["session_id"].asUUID();
FSFloaterIM* floater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
if (floater == NULL) return;
if (!floater)
return;
// update if visible or max pending messages exceeded, otherwise will be updated when opened
static LLCachedControl<S32> fsMaxPendingIMMessages(gSavedSettings, "FSMaxPendingIMMessages");
@ -374,9 +374,9 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
LLWString text = mInputEditor->getWText();
LLWStringUtil::trim(text);
LLWStringUtil::replaceChar(text,182,'\n'); // Convert paragraph symbols back into newlines.
if(!text.empty())
if (!text.empty())
{
if(type == CHAT_TYPE_OOC)
if (type == CHAT_TYPE_OOC)
{
std::string tempText = wstring_to_utf8str( text );
tempText = gSavedSettings.getString("FSOOCPrefix") + " " + tempText + " " + gSavedSettings.getString("FSOOCPostfix");
@ -421,20 +421,20 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
skin_indicator = skin_indicator.substr(0, 1); // "FS 4.4.1f os", "FS 4.4.1v", "FS 4.4.1a", "FS 4.4.1s os", "FS 4.4.1m os" etc.
}
// </FS:PP>
//Address size check
#if ADDRESS_SIZE == 32
std::string str_address_size_tag = "32";
#else
std::string str_address_size_tag = "";
#endif
//OpenSim check
std::string str_opensim_tag;
#ifdef OPENSIM
str_opensim_tag = " os";
#endif
//Operating System check
#if LL_WINDOWS
std::string str_operating_system_tag = "W";
@ -443,31 +443,29 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
#elif LL_DARWIN
std::string str_operating_system_tag = "M";
#endif
//RLV check
std::string str_rlv_enabled = "";
if(RlvHandler::isEnabled())
if (RlvHandler::isEnabled())
str_rlv_enabled = "*";
// Text mode check
std::string str_viewer_mode = "";
// Unfortunately, we have to cheat a little here. Ideally we'd have
// a method defined to check if the viewer is running in Text Mode.
// For now, we will use the same method as used in llappviewer.cpp(LLAppViewer::getViewerInfo())
static LLCachedControl<std::string> FSViewerMode(gSavedSettings, "SessionSettingsFile");
std::string viewer_mode(FSViewerMode);
LLStringUtil::toLower(viewer_mode);
if(viewer_mode == "settings_text.xml")
if (viewer_mode == "settings_text.xml")
str_viewer_mode = "T";
//Build it up
size_t insert_pos = is_irc_me_prefix(utf8_text) ? 4 : 0;
//For testing/beta groups, we display the build version since it doesn't speed by and this might change often
if(FSData::getInstance()->isTestingGroup(mSessionID))
if (FSData::getInstance()->isTestingGroup(mSessionID))
{
if(chat_prefix_testing)
utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getBuildVersion() + skin_indicator + str_viewer_mode + str_rlv_enabled + str_opensim_tag + ") "));
@ -479,7 +477,7 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getShortVersion() + skin_indicator + str_viewer_mode + str_rlv_enabled + str_opensim_tag + ") "));
}
}
// <FS:Techwolf Lupindo> Allow user to send system info.
if (mDialog == IM_NOTHING_SPECIAL && utf8_text.find("/sysinfo") == 0)
{
@ -487,9 +485,9 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
utf8_text = system_info["Part1"].asString() + system_info["Part2"].asString();
}
// </FS:Techwolf Lupindo>
sendMsg(utf8_text);
mInputEditor->setText(LLStringUtil::null);
}
}
@ -515,12 +513,12 @@ void FSFloaterIM::sendMsg(const std::string& msg)
//std::string utf8_text = utf8str_truncate(msg, MAX_MSG_BUF_SIZE - 1);
std::string utf8_text = msg;
// </FS:CR>
if ( (RlvActions::hasBehaviour(RLV_BHVR_SENDIM)) || (RlvActions::hasBehaviour(RLV_BHVR_SENDIMTO)) )
{
const LLIMModel::LLIMSession* pIMSession = LLIMModel::instance().findIMSession(mSessionID);
RLV_ASSERT(pIMSession);
bool fRlvFilter = !pIMSession;
if (pIMSession)
{
@ -539,13 +537,11 @@ void FSFloaterIM::sendMsg(const std::string& msg)
fRlvFilter = true;
break;
}
LLSpeakerMgr::speaker_list_t speakers;
pIMSession->mSpeakers->getSpeakerList(&speakers, TRUE);
for (LLSpeakerMgr::speaker_list_t::const_iterator itSpeaker = speakers.begin();
itSpeaker != speakers.end(); ++itSpeaker)
for (const auto& pSpeaker : speakers)
{
const LLSpeaker* pSpeaker = *itSpeaker;
if ( (gAgent.getID() != pSpeaker->mID) && (!RlvActions::canSendIM(pSpeaker->mID)) )
{
fRlvFilter = true;
@ -559,14 +555,14 @@ void FSFloaterIM::sendMsg(const std::string& msg)
break;
}
}
if (fRlvFilter)
{
utf8_text = RlvStrings::getString(RlvStringKeys::Blocked::SendIm);
}
}
// [/RLVa:KB]
if (mSessionInitialized)
{
LLIMModel::sendMessage(utf8_text, mSessionID, mOtherParticipantUUID, mDialog);
@ -576,7 +572,7 @@ void FSFloaterIM::sendMsg(const std::string& msg)
//queue up the message to send once the session is initialized
mQueuedMsgsForInit.append(utf8_text);
}
updateMessages();
}
@ -588,17 +584,17 @@ FSFloaterIM::~FSFloaterIM()
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, (LLView*)this);
mVoiceChannelStateChangeConnection.disconnect();
if(LLVoiceClient::instanceExists())
if (LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
}
LLIMModel::LLIMSession* pIMSession = LLIMModel::instance().findIMSession(mSessionID);
if ((pIMSession) && (pIMSession->mSessionType == LLIMModel::LLIMSession::P2P_SESSION))
{
LLAvatarTracker::instance().removeParticularFriendObserver(mOtherParticipantUUID, this);
}
// Clean up any stray name cache connections
if (mAvatarNameCacheConnection.connected())
{
@ -755,7 +751,7 @@ void FSFloaterIM::onChange(EStatusType status, const std::string &channelURI, bo
{
return;
}
updateCallButton();
}
@ -764,13 +760,13 @@ void FSFloaterIM::updateCallButton()
// hide/show call button
bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID);
if (!session)
{
getChild<LLButton>("call_btn")->setEnabled(FALSE);
return;
}
bool session_initialized = session->mSessionInitialized;
bool callback_enabled = session->mCallBackEnabled;
@ -793,7 +789,7 @@ void FSFloaterIM::updateButtons(bool is_call_started)
void FSFloaterIM::changed(U32 mask)
{
LL_DEBUGS("FSFloaterIM") << "FSFloaterIM::changed(U32 mask)" << LL_ENDL;
if(LLAvatarActions::isFriend(mOtherParticipantUUID))
{
bool is_online = LLAvatarTracker::instance().isBuddyOnline(mOtherParticipantUUID);
@ -841,7 +837,7 @@ BOOL FSFloaterIM::postBuild()
// support sysinfo button -Zi
mSysinfoButton = getChild<LLButton>("send_sysinfo_btn");
onSysinfoButtonVisibilityChanged(FALSE);
// type-specfic controls
LLIMModel::LLIMSession* pIMSession = LLIMModel::instance().findIMSession(mSessionID);
if (pIMSession)
@ -859,11 +855,11 @@ BOOL FSFloaterIM::postBuild()
LL_DEBUGS("FSFloaterIM") << "adding FSFloaterIM removing/adding particularfriendobserver" << LL_ENDL;
LLAvatarTracker::instance().removeParticularFriendObserver(mOtherParticipantUUID, this);
LLAvatarTracker::instance().addParticularFriendObserver(mOtherParticipantUUID, this);
// Disable "Add friend" button for friends.
LL_DEBUGS("FSFloaterIM") << "add_friend_btn check start" << LL_ENDL;
getChild<LLButton>("add_friend_btn")->setEnabled(!LLAvatarActions::isFriend(mOtherParticipantUUID));
// Disable "Teleport" button if friend is offline
if(LLAvatarActions::isFriend(mOtherParticipantUUID))
{
@ -931,7 +927,7 @@ BOOL FSFloaterIM::postBuild()
LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
// </AO>
mInputEditor = getChild<LLChatEntry>("chat_editor");
mChatHistory = getChild<FSChatHistory>("chat_history");
mChatLayoutPanel = getChild<LLLayoutPanel>("chat_layout_panel");
@ -977,7 +973,7 @@ BOOL FSFloaterIM::postBuild()
{
// if not, give the user a choice, whether to enable the version prefix or not
LLSD args;
LLNotificationsUtil::add("FirstJoinSupportGroup2", args, LLSD(),boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2));
LLNotificationsUtil::add("FirstJoinSupportGroup2", args, LLSD(), boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2));
}
}
// </FS:Zi> Viewer version popup
@ -1009,7 +1005,7 @@ BOOL FSFloaterIM::postBuild()
std::string session_name(LLIMModel::instance().getName(mSessionID));
updateSessionName(session_name, session_name);
}
//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
//see LLFloaterIMPanel for how it is done (IB)
@ -1177,7 +1173,8 @@ FSFloaterIM* FSFloaterIM::show(const LLUUID& session_id)
{
closeHiddenIMToasts();
if (!gIMMgr->hasSession(session_id)) return NULL;
if (!gIMMgr->hasSession(session_id))
return nullptr;
if (!isChatMultiTab())
{
@ -1199,7 +1196,7 @@ FSFloaterIM* FSFloaterIM::show(const LLUUID& session_id)
FSFloaterIM* floater = getInstance(session_id);
if (!floater)
{
return NULL;
return nullptr;
}
if (isChatMultiTab())
@ -1274,7 +1271,7 @@ void FSFloaterIM::setDocked(bool docked, bool pop_on_undock)
LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
if(!isChatMultiTab())
{
LLTransientDockableFloater::setDocked(docked, pop_on_undock);
@ -1296,7 +1293,7 @@ void FSFloaterIM::setVisible(BOOL visible)
LLTransientDockableFloater::setVisible(visible);
// update notification channel state
if(channel)
if (channel)
{
channel->updateShowToastsState();
channel->redrawToasts();
@ -1321,10 +1318,9 @@ void FSFloaterIM::setVisible(BOOL visible)
}
}
if(!visible)
if (!visible)
{
LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID);
if(chiclet)
if (LLIMChiclet* chiclet = LLChicletBar::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(mSessionID); chiclet)
{
chiclet->setToggleState(false);
}
@ -1350,7 +1346,7 @@ void FSFloaterIM::setMinimized(BOOL b)
BOOL FSFloaterIM::getVisible()
{
if(isChatMultiTab())
if (isChatMultiTab())
{
FSFloaterIMContainer* im_container = FSFloaterIMContainer::getInstance();
@ -1375,7 +1371,7 @@ BOOL FSFloaterIM::getVisible()
//static
bool FSFloaterIM::toggle(const LLUUID& session_id)
{
if(!isChatMultiTab())
if (!isChatMultiTab())
{
FSFloaterIM* floater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
if (floater && floater->getVisible() && floater->hasFocus())
@ -1385,7 +1381,7 @@ bool FSFloaterIM::toggle(const LLUUID& session_id)
floater->setVisible(false);
return false;
}
else if(floater && (!floater->isDocked() || (floater->getVisible() && !floater->hasFocus())))
else if (floater && (!floater->isDocked() || (floater->getVisible() && !floater->hasFocus())))
{
floater->setVisible(TRUE);
floater->setFocus(TRUE);
@ -1422,8 +1418,7 @@ void FSFloaterIM::sessionInitReplyReceived(const LLUUID& im_session_id)
}
// updating "Call" button from group/ad-hoc control panel here to enable it without placing into draw() (EXT-4796)
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(im_session_id);
if (session)
if (LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(im_session_id); session)
{
if ((session->isGroupSessionType() && gAgent.isInGroup(im_session_id)) || session->isAdHocSessionType())
{
@ -1433,7 +1428,6 @@ void FSFloaterIM::sessionInitReplyReceived(const LLUUID& im_session_id)
//*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB)
//need to send delayed messaged collected while waiting for session initialization
if (mQueuedMsgsForInit.size())
{
@ -1454,7 +1448,6 @@ void FSFloaterIM::updateMessages()
//<FS:HG> FS-1734 seperate name and text styles for moderator
bool highlight_mods_chat = gSavedSettings.getBOOL("FSHighlightGroupMods");
std::list<LLSD> messages;
// we shouldn't reset unread message counters if IM floater doesn't have focus
@ -1483,7 +1476,7 @@ void FSFloaterIM::updateMessages()
LLUUID from_id = msg["from_id"].asUUID();
std::string from = msg["from"].asString();
std::string message = msg["message"].asString();
bool is_history = msg["is_history"].asBoolean();
S32 is_history = msg["is_history"].asInteger();
bool is_region_msg = msg["is_region_msg"].asBoolean();
LLChat chat;
@ -1491,7 +1484,10 @@ void FSFloaterIM::updateMessages()
chat.mSessionID = mSessionID;
chat.mFromName = from;
chat.mTimeStr = time;
chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
if (is_history)
{
chat.mChatStyle = (EChatStyle) is_history;
}
if (is_region_msg)
{
chat.mSourceType = CHAT_SOURCE_REGION;
@ -1537,7 +1533,7 @@ void FSFloaterIM::updateMessages()
{
chat.mText = message;
}
mChatHistory->appendMessage(chat, chat_args);
mLastMessageIndex = msg["index"].asInteger();
@ -1596,8 +1592,7 @@ void FSFloaterIM::onInputEditorFocusLost()
void FSFloaterIM::onInputEditorKeystroke()
{
std::string text = mInputEditor->getText();
if (!text.empty())
if (!mInputEditor->getText().empty())
{
setTyping(true);
}
@ -1610,13 +1605,13 @@ void FSFloaterIM::onInputEditorKeystroke()
void FSFloaterIM::setTyping(bool typing)
{
if ( typing )
if (typing)
{
// Started or proceeded typing, reset the typing timeout timer
mTypingTimeoutTimer.reset();
}
if ( mMeTyping != typing )
if (mMeTyping != typing)
{
// Typing state is changed
mMeTyping = typing;
@ -1633,7 +1628,7 @@ void FSFloaterIM::setTyping(bool typing)
if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL && !(FSData::instance().isSupport(mOtherParticipantUUID) && FSData::instance().isAgentFlag(gAgentID, FSData::NO_SUPPORT)))
// </FS:Techwolf Lupindo>
{
if ( mMeTyping )
if (mMeTyping)
{
if ( mTypingTimer.getElapsedTimeF32() > 1.f )
{
@ -1654,12 +1649,11 @@ void FSFloaterIM::setTyping(bool typing)
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
}
void FSFloaterIM::processIMTyping(const LLUUID& from_id, BOOL typing)
{
if ( typing )
if (typing)
{
// other user started typing
addTypingIndicator(from_id);
@ -1681,7 +1675,7 @@ void FSFloaterIM::processAgentListUpdates(const LLSD& body)
if (body.isMap() && body.has("agent_updates") && body["agent_updates"].isMap())
{
LLSD::map_const_iterator update_it;
for(update_it = body["agent_updates"].beginMap();
for (update_it = body["agent_updates"].beginMap();
update_it != body["agent_updates"].endMap();
++update_it)
{
@ -1724,7 +1718,7 @@ void FSFloaterIM::processAgentListUpdates(const LLSD& body)
joined_uuids.begin(), joined_uuids.end(),
std::back_inserter(intersection));
if (intersection.size() > 0)
if (!intersection.empty())
{
sendParticipantsAddedNotification(intersection);
}
@ -1776,30 +1770,6 @@ void FSFloaterIM::processChatHistoryStyleUpdate(const LLSD& newvalue)
}
}
void FSFloaterIM::processSessionUpdate(const LLSD& session_update)
{
// *TODO : verify following code when moderated mode will be implemented
if ( false && session_update.has("moderated_mode") &&
session_update["moderated_mode"].has("voice") )
{
BOOL voice_moderated = session_update["moderated_mode"]["voice"];
const std::string session_label = LLIMModel::instance().getName(mSessionID);
if (voice_moderated)
{
setTitle(session_label + std::string(" ") + LLTrans::getString("IM_moderated_chat_label"));
}
else
{
setTitle(session_label);
}
// *TODO : uncomment this when/if LLPanelActiveSpeakers panel will be added
//update the speakers dropdown too
//mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
}
}
BOOL FSFloaterIM::handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop, EDragAndDropType cargo_type,
void *cargo_data, EAcceptance *accept,
@ -1849,7 +1819,7 @@ BOOL FSFloaterIM::handleDragAndDrop(S32 x, S32 y, MASK mask,
bool FSFloaterIM::dropCallingCard(LLInventoryItem* item, bool drop)
{
bool rv = true;
if(item && item->getCreatorUUID().notNull())
if (item && item->getCreatorUUID().notNull())
{
uuid_vec_t ids;
ids.push_back(item->getCreatorUUID());
@ -1877,7 +1847,7 @@ bool FSFloaterIM::dropCallingCard(LLInventoryItem* item, bool drop)
bool FSFloaterIM::dropCategory(LLInventoryCategory* category, bool drop)
{
bool rv = true;
if(category)
if (category)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@ -1888,7 +1858,7 @@ bool FSFloaterIM::dropCategory(LLInventoryCategory* category, bool drop)
LLInventoryModel::EXCLUDE_TRASH,
buddies);
S32 count = items.size();
if(count == 0)
if (count == 0)
{
rv = false;
}
@ -1921,13 +1891,13 @@ bool FSFloaterIM::dropCategory(LLInventoryCategory* category, bool drop)
bool FSFloaterIM::dropPerson(LLUUID* person_id, bool drop)
{
bool res = person_id && person_id->notNull();
if(res)
if (res)
{
uuid_vec_t ids;
ids.push_back(*person_id);
res = canAddSelectedToChat(ids);
if(res && drop)
if (res && drop)
{
// these people will be added during the next draw() call
// (so they can be added all at once)
@ -2067,7 +2037,7 @@ void FSFloaterIM::addTypingIndicator(const LLUUID& from_id)
void FSFloaterIM::removeTypingIndicator(const LLUUID& from_id)
{
if ( mOtherTyping )
if (mOtherTyping)
{
mOtherTyping = false;
@ -2112,7 +2082,7 @@ void FSFloaterIM::closeHiddenIMToasts()
};
LLNotificationsUI::LLScreenChannel* channel = LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
if (channel != NULL)
if (channel)
{
channel->closeHiddenToasts(IMToastMatcher());
}
@ -2126,7 +2096,7 @@ void FSFloaterIM::confirmLeaveCallCallback(const LLSD& notification, const LLSD&
bool snooze = payload["snooze"].asBoolean();
FSFloaterIM* im_floater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
if (option == 0 && im_floater != NULL)
if (option == 0 && im_floater)
{
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
if (session)
@ -2165,15 +2135,19 @@ void FSFloaterIM::initIMFloater()
void FSFloaterIM::sRemoveTypingIndicator(const LLSD& data)
{
LLUUID session_id = data["session_id"];
if (session_id.isNull()) return;
if (session_id.isNull())
return;
LLUUID from_id = data["from_id"];
if (gAgentID == from_id || LLUUID::null == from_id) return;
if (gAgentID == from_id || LLUUID::null == from_id)
return;
FSFloaterIM* floater = FSFloaterIM::findInstance(session_id);
if (!floater) return;
if (!floater)
return;
if (IM_NOTHING_SPECIAL != floater->mDialog) return;
if (IM_NOTHING_SPECIAL != floater->mDialog)
return;
floater->removeTypingIndicator();
}
@ -2197,7 +2171,7 @@ void FSFloaterIM::onClickCloseBtn(bool app_quitting)
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
mSessionID);
if (session == NULL)
if (!session)
{
LL_WARNS("FSFloaterIM") << "Empty session." << LL_ENDL;
return;
@ -2225,16 +2199,16 @@ void FSFloaterIM::onClickCloseBtn(bool app_quitting)
// <FS:Zi> Viewer version popup
BOOL FSFloaterIM::enableViewerVersionCallback(const LLSD& notification,const LLSD& response)
{
S32 option=LLNotificationsUtil::getSelectedOption(notification,response);
S32 option = LLNotificationsUtil::getSelectedOption(notification,response);
BOOL result=FALSE;
if(option==0) // "yes"
BOOL result = FALSE;
if (option == 0) // "yes"
{
result=TRUE;
result = TRUE;
}
gSavedSettings.setBOOL("FSSupportGroupChatPrefix3",result);
gSavedSettings.setBOOL("FSSupportGroupChatPrefixTesting",result);
gSavedSettings.setBOOL("FSSupportGroupChatPrefix3", result);
gSavedSettings.setBOOL("FSSupportGroupChatPrefixTesting", result);
return result;
}
// </FS:Zi>
@ -2334,45 +2308,14 @@ bool FSFloaterIM::canAddSelectedToChat(const uuid_vec_t& uuids)
{
// For a P2P session just check if we are not adding the other participant.
for (uuid_vec_t::const_iterator id = uuids.begin();
id != uuids.end(); ++id)
for (const auto& uuid : uuids)
{
if (*id == mOtherParticipantUUID)
if (uuid == mOtherParticipantUUID)
{
return false;
}
}
}
else
{
// For a conference session we need to check against the list from LLSpeakerMgr,
// because this list may change when participants join or leave the session.
// Ansariel: Disabled the check because the sim doesn't clear somebody off the
// speaker list if they crash or relog and they can't be re-added in that case.
/*
LLSpeakerMgr::speaker_list_t speaker_list;
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
speaker_mgr->getSpeakerList(&speaker_list, true);
}
for (uuid_vec_t::const_iterator id = uuids.begin();
id != uuids.end(); ++id)
{
for (LLSpeakerMgr::speaker_list_t::const_iterator it = speaker_list.begin();
it != speaker_list.end(); ++it)
{
const LLPointer<LLSpeaker>& speaker = *it;
if (*id == speaker->mID)
{
return false;
}
}
}
*/
}
return true;
}
@ -2389,7 +2332,7 @@ void FSFloaterIM::addSessionParticipants(const uuid_vec_t& uuids)
}
else
{
if(findInstance(mSessionID))
if (findInstance(mSessionID))
{
// remember whom we have invited, to notify others later, when the invited ones actually join
mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
@ -2410,7 +2353,7 @@ void FSFloaterIM::addP2PSessionParticipants(const LLSD& notification, const LLSD
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
// first check whether this is a voice session
bool is_voice_call = voice_channel != NULL && voice_channel->isActive();
bool is_voice_call = voice_channel && voice_channel->isActive();
uuid_vec_t temp_ids;
uuid_vec_t invited_ids;
@ -2422,12 +2365,11 @@ void FSFloaterIM::addP2PSessionParticipants(const LLSD& notification, const LLSD
LLUUID session_id = mSessionID;
// then we can close the current session
if(findInstance(mSessionID))
if (findInstance(mSessionID))
{
// remember whom we have invited, to notify others later, when the invited ones actually join
mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
invited_ids.insert(invited_ids.end(), mInvitedParticipants.begin(), mInvitedParticipants.end());
std::copy(uuids.begin(), uuids.end(), std::back_inserter(mInvitedParticipants));
std::copy(mInvitedParticipants.begin(), mInvitedParticipants.end(), std::back_inserter(invited_ids));
// Ansariel: This will result in the floater actually being closed as opposed in CHUI!
onClose(false);

View File

@ -113,7 +113,6 @@ public:
void onVisibilityChange(BOOL new_visibility);
void processIMTyping(const LLUUID& from_id, BOOL typing);
void processAgentListUpdates(const LLSD& body);
void processSessionUpdate(const LLSD& session_update);
void updateChatHistoryStyle();
static void processChatHistoryStyleUpdate(const LLSD& newvalue);

View File

@ -40,14 +40,14 @@
#include "lltoolbarview.h"
#include "llvoiceclient.h"
static const F32 VOICE_STATUS_UPDATE_INTERVAL = 1.0f;
constexpr F32 VOICE_STATUS_UPDATE_INTERVAL = 1.0f;
//
// FSFloaterIMContainer
//
FSFloaterIMContainer::FSFloaterIMContainer(const LLSD& seed)
: LLMultiFloater(seed),
mActiveVoiceFloater(NULL),
mActiveVoiceFloater(nullptr),
mCurrentVoiceState(VOICE_STATE_NONE),
mForceVoiceStateUpdate(false),
mIsAddingNewSession(false)
@ -186,7 +186,8 @@ void FSFloaterIMContainer::addFloater(LLFloater* floaterp,
BOOL select_added_floater,
LLTabContainer::eInsertionPoint insertion_point)
{
if(!floaterp) return;
if (!floaterp)
return;
// already here
if (floaterp->getHost() == this)
@ -385,14 +386,12 @@ void FSFloaterIMContainer::setMinimized(BOOL b)
{
if (mTabContainer)
{
FSFloaterNearbyChat* nearby_floater = dynamic_cast<FSFloaterNearbyChat*>(mTabContainer->getCurrentPanel());
if (nearby_floater)
if (FSFloaterNearbyChat* nearby_floater = dynamic_cast<FSFloaterNearbyChat*>(mTabContainer->getCurrentPanel()); nearby_floater)
{
nearby_floater->handleMinimized(b);
}
FSFloaterIM* im_floater = dynamic_cast<FSFloaterIM*>(mTabContainer->getCurrentPanel());
if (im_floater)
if (FSFloaterIM* im_floater = dynamic_cast<FSFloaterIM*>(mTabContainer->getCurrentPanel()); im_floater)
{
im_floater->handleMinimized(b);
}
@ -405,7 +404,8 @@ void FSFloaterIMContainer::setMinimized(BOOL b)
void FSFloaterIMContainer::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg)
{
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
if (!session) return;
if (!session)
return;
FSFloaterIM::onNewIMReceived(session_id);
}
@ -413,8 +413,7 @@ void FSFloaterIMContainer::sessionAdded(const LLUUID& session_id, const std::str
//virtual
void FSFloaterIMContainer::sessionRemoved(const LLUUID& session_id)
{
FSFloaterIM* iMfloater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id);
if (iMfloater != NULL)
if (FSFloaterIM* iMfloater = LLFloaterReg::findTypedInstance<FSFloaterIM>("fs_impanel", session_id); iMfloater)
{
iMfloater->closeFloater();
}
@ -535,7 +534,7 @@ LLFloater* FSFloaterIMContainer::getCurrentVoiceFloater()
{
if (!LLVoiceClient::instance().voiceEnabled())
{
return NULL;
return nullptr;
}
if (LLVoiceChannelProximal::getInstance() == LLVoiceChannel::getCurrentVoiceChannel())
@ -551,7 +550,7 @@ LLFloater* FSFloaterIMContainer::getCurrentVoiceFloater()
return im_floater;
}
}
return NULL;
return nullptr;
}
void FSFloaterIMContainer::addFlashingSession(const LLUUID& session_id)
@ -573,8 +572,7 @@ void FSFloaterIMContainer::checkFlashing()
void FSFloaterIMContainer::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id)
{
avatarID_panel_map_t::iterator found = mSessions.find(old_session_id);
if (found != mSessions.end())
if (avatarID_panel_map_t::iterator found = mSessions.find(old_session_id); found != mSessions.end())
{
LLFloater* floaterp = found->second;
mSessions.erase(found);

View File

@ -183,25 +183,35 @@ BOOL FSFloaterStreamTitle::postBuild()
mUpdateConnection = instance.setUpdateCallback([this](std::string_view streamtitle) { updateStreamTitle(streamtitle); });
updateStreamTitle(instance.getCurrentStreamTitle());
mHistoryBtn->setCommitCallback(std::bind(&FSFloaterStreamTitle::openHistory, this));
mHistoryBtn->setCommitCallback(std::bind(&FSFloaterStreamTitle::toggleHistory, this));
mHistoryBtn->setIsToggledCallback([](LLUICtrl*, const LLSD&) { return LLFloaterReg::instanceVisible("fs_streamtitlehistory"); });
setVisibleCallback(boost::bind(&FSFloaterStreamTitle::closeHistory, this));
return TRUE;
}
void FSFloaterStreamTitle::openHistory() noexcept
void FSFloaterStreamTitle::toggleHistory() noexcept
{
LLFloater* root_floater = gFloaterView->getParentFloater(this);
FSFloaterStreamTitleHistory* history_floater = LLFloaterReg::showTypedInstance<FSFloaterStreamTitleHistory>("fs_streamtitlehistory");
FSFloaterStreamTitleHistory* history_floater = LLFloaterReg::findTypedInstance<FSFloaterStreamTitleHistory>("fs_streamtitlehistory");
if (root_floater)
if (!history_floater)
{
root_floater->addDependentFloater(history_floater);
history_floater->setOwnerOrigin(root_floater);
history_floater = LLFloaterReg::showTypedInstance<FSFloaterStreamTitleHistory>("fs_streamtitlehistory");
if (root_floater && history_floater)
{
root_floater->addDependentFloater(history_floater);
history_floater->setOwnerOrigin(root_floater);
mHistory = history_floater->getHandle();
}
}
else
{
closeHistory();
}
mHistory = history_floater->getHandle();
}
void FSFloaterStreamTitle::closeHistory() noexcept

View File

@ -108,7 +108,7 @@ private:
BOOL tick() override;
void updateStreamTitle(std::string_view streamtitle) noexcept;
void openHistory() noexcept;
void toggleHistory() noexcept;
void closeHistory() noexcept;
void checkTitleWidth() noexcept;

View File

@ -51,17 +51,16 @@ void FSLSLBridgeRequest_Failure(LLSD const &aData)
void FSLSLBridgeRequestRadarPos_Success(LLSD const &aData)
{
FSRadar* radar = FSRadar::getInstance();
LL_DEBUGS("FSLSLBridge") << ll_pretty_print_sd(aData) << LL_ENDL;
if (radar && aData.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT))
if (aData.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT))
{
std::string strContent = aData[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT].asString();
//LL_INFOS("FSLSLBridge") << "Got info: " << strContent << LL_ENDL;
// AO: parse content into pairs of [agent UUID,agent zHeight] , update our radar for each one
LLUUID targetAv;
F32 targetZ;
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep(", ");
tokenizer tokens(strContent, sep);
@ -69,9 +68,8 @@ void FSLSLBridgeRequestRadarPos_Success(LLSD const &aData)
{
targetAv = LLUUID(*(tok_iter++));
targetZ = (F32)::atof((*tok_iter).c_str());
FSRadarEntry* entry = radar->getEntry(targetAv);
if (entry)
if (auto entry = FSRadar::getInstance()->getEntry(targetAv); entry)
{
entry->setZOffset(targetZ);
//LL_INFOS("FSLSLBridge") << targetAv << " ::: " << targetZ << LL_ENDL;

View File

@ -60,7 +60,7 @@
#include "rlvactions.h"
#include "rlvhandler.h"
static const F32 FS_RADAR_LIST_UPDATE_INTERVAL = 1.f;
constexpr F32 FS_RADAR_LIST_UPDATE_INTERVAL = 1.f;
/**
* Periodically updates the nearby people list while the Nearby tab is active.
@ -98,7 +98,7 @@ FSRadar::FSRadar() :
mNameFormatCallbackConnection(),
mAgeAlertCallbackConnection()
{
mRadarListUpdater = new FSRadarListUpdater(boost::bind(&FSRadar::updateRadarList, this));
mRadarListUpdater = std::make_unique<FSRadarListUpdater>(std::bind(&FSRadar::updateRadarList, this));
// Use the callback from LLAvatarNameCache here or we might update the names too early!
LLAvatarNameCache::getInstance()->addUseDisplayNamesCallback(boost::bind(&FSRadar::updateNames, this));
@ -110,13 +110,6 @@ FSRadar::FSRadar() :
FSRadar::~FSRadar()
{
delete mRadarListUpdater;
for (const auto& [av_id, entry] : mEntryList)
{
delete entry;
}
if (mShowUsernamesCallbackConnection.connected())
{
mShowUsernamesCallbackConnection.disconnect();
@ -216,14 +209,13 @@ void FSRadar::updateRadarList()
F32 drawRadius(sRenderFarClip);
const LLVector3d& posSelf = gAgent.getPositionGlobal();
LLViewerRegion* own_reg = gAgent.getRegion();
LLUUID regionSelf;
if (own_reg)
if (LLViewerRegion* own_reg = gAgent.getRegion(); own_reg)
{
regionSelf = own_reg->getRegionID();
}
bool alertScripts = mRadarAlertRequest; // save the current value, so it doesn't get changed out from under us by another thread
time_t now = time(NULL);
time_t now = time(nullptr);
//STEP 0: Clear model data
mRadarEnterAlerts.clear();
@ -259,10 +251,8 @@ void FSRadar::updateRadarList()
// Remove old avatars from our list
for (const auto& avid : removed_vec)
{
entry_map_t::iterator found = mEntryList.find(avid);
if (found != mEntryList.end())
if (entry_map_t::iterator found = mEntryList.find(avid); found != mEntryList.end())
{
delete found->second;
mEntryList.erase(found);
}
}
@ -270,18 +260,18 @@ void FSRadar::updateRadarList()
// Add new avatars
for (const auto& avid : added_vec)
{
mEntryList[avid] = new FSRadarEntry(avid);
mEntryList.emplace(avid, std::make_shared<FSRadarEntry>(avid));
}
speakermgr->update(TRUE);
//STEP 2: Transform detected model list data into more flexible multimap data structure;
//TS: Count avatars in chat range and in the same region
U32 inChatRange = 0;
U32 inSameRegion = 0;
U32 inChatRange{ 0 };
U32 inSameRegion{ 0 };
std::vector<LLVector3d>::const_iterator
pos_it = positions.begin(),
pos_end = positions.end();
pos_end = positions.end();
uuid_vec_t::const_iterator
item_it = avatar_ids.begin(),
item_end = avatar_ids.end();
@ -290,7 +280,6 @@ void FSRadar::updateRadarList()
//
//2a. For each detected av, gather up all data we would want to display or use to drive alerts
//
LLUUID avId = static_cast<LLUUID>(*item_it);
LLVector3d avPos = static_cast<LLVector3d>(*pos_it);
@ -300,7 +289,7 @@ void FSRadar::updateRadarList()
}
// Skip modelling this avatar if its basic data is either inaccessible, or it's a dummy placeholder
FSRadarEntry* ent = getEntry(avId);
auto ent = getEntry(avId);
LLViewerRegion* reg = world->getRegionFromPosGlobal(avPos);
if (!ent) // don't update this radar listing if data is inaccessible
{
@ -311,12 +300,9 @@ void FSRadar::updateRadarList()
LLVOAvatar* avVo = (LLVOAvatar*)gObjectList.findObject(avId);
static LLUICachedControl<bool> sFSShowDummyAVsinRadar("FSShowDummyAVsinRadar");
if (!sFSShowDummyAVsinRadar)
if (!sFSShowDummyAVsinRadar && avVo && avVo->mIsDummy)
{
if (avVo && avVo->mIsDummy)
{
continue;
}
continue;
}
bool is_muted = mutelist->isMuted(avId);
@ -654,7 +640,7 @@ void FSRadar::updateRadarList()
if (mRadarOffsetRequests.size() > 0)
{
static const std::string prefix = "getZOffsets|";
std::string msg = "";
std::string msg {};
U32 updatesPerRequest = 0;
while (mRadarOffsetRequests.size() > 0)
{
@ -666,7 +652,7 @@ void FSRadar::updateRadarList()
msg = msg.substr(0, msg.size() - 1);
bridge.viewerToLSL(prefix + msg, FSLSLBridgeRequestRadarPos_Success);
//LL_INFOS() << " OFFSET REQUEST SEGMENT"<< prefix << msg << LL_ENDL;
msg = "";
msg.clear();
updatesPerRequest = 0;
}
}
@ -832,31 +818,27 @@ void FSRadar::updateRadarList()
void FSRadar::requestRadarChannelAlertSync()
{
F32 timeNow = gFrameTimeSeconds;
if ((timeNow - FSRADAR_CHAT_MIN_SPACING) > mRadarLastRequestTime)
if (F32 timeNow = gFrameTimeSeconds; (timeNow - FSRADAR_CHAT_MIN_SPACING) > mRadarLastRequestTime)
{
mRadarLastRequestTime = timeNow;
mRadarAlertRequest = true;
}
}
FSRadarEntry* FSRadar::getEntry(const LLUUID& avatar_id)
std::shared_ptr<FSRadarEntry> FSRadar::getEntry(const LLUUID& avatar_id)
{
entry_map_t::iterator found = mEntryList.find(avatar_id);
if (found == mEntryList.end())
if (entry_map_t::iterator found = mEntryList.find(avatar_id); found != mEntryList.end())
{
return nullptr;
return found->second;
}
return found->second;
return nullptr;
}
void FSRadar::teleportToAvatar(const LLUUID& targetAv)
// Teleports user to last scanned location of nearby avatar
// Note: currently teleportViaLocation is disrupted by enforced landing points set on a parcel.
{
LLWorld* world = LLWorld::getInstance();
FSRadarEntry* entry = getEntry(targetAv);
if (entry)
if (auto entry = getEntry(targetAv); entry)
{
LLVector3d avpos = entry->mGlobalPos;
if (avpos.mdV[VZ] == AVATAR_UNKNOWN_Z_OFFSET)
@ -867,7 +849,7 @@ void FSRadar::teleportToAvatar(const LLUUID& targetAv)
{
// <FS:TS> FIRE-20862: Teleport the configured offset toward the center of the region from the
// avatar's reported position
LLViewerRegion* avreg = world->getRegionFromPosGlobal(avpos);
LLViewerRegion* avreg = LLWorld::getInstance()->getRegionFromPosGlobal(avpos);
if (avreg)
{
LLVector3d region_center = avreg->getCenterGlobal();
@ -964,8 +946,7 @@ void FSRadar::onRadarReportToClicked(const LLSD& userdata)
bool FSRadar::radarReportToCheck(const LLSD& userdata)
{
const std::string menu_item = userdata.asString();
bool report_to = gSavedSettings.getBOOL("FSMilkshakeRadarToasts");
if (report_to)
if (gSavedSettings.getBOOL("FSMilkshakeRadarToasts"))
{
return (menu_item == "radar_toasts");
}
@ -1000,8 +981,7 @@ void FSRadar::checkTracking()
void FSRadar::updateTracking()
{
FSRadarEntry* entry = getEntry(mTrackedAvatarId);
if (entry)
if (auto entry = getEntry(mTrackedAvatarId); entry)
{
if (LLTracker::getTrackedPositionGlobal() != entry->mGlobalPos)
{
@ -1039,8 +1019,7 @@ void FSRadar::updateNames()
void FSRadar::updateName(const LLUUID& avatar_id)
{
FSRadarEntry* entry = getEntry(avatar_id);
if (entry)
if (auto entry = getEntry(avatar_id); entry)
{
entry->updateName();
}
@ -1056,8 +1035,7 @@ void FSRadar::updateAgeAlertCheck()
void FSRadar::updateNotes(const LLUUID& avatar_id, std::string_view notes)
{
FSRadarEntry* entry = getEntry(avatar_id);
if (entry)
if (auto entry = getEntry(avatar_id); entry)
{
entry->setNotes(notes);
}

View File

@ -30,14 +30,14 @@
#include "llsingleton.h"
#include "fsradarentry.h"
#include <boost/unordered_map.hpp>
#include <unordered_map>
class LLAvatarName;
const U32 FSRADAR_MAX_AVATARS_PER_ALERT = 6; // maximum number of UUIDs we can cram into a single channel radar alert message
const U32 FSRADAR_COARSE_OFFSET_INTERVAL = 7; // seconds after which we query the bridge for a coarse location adjustment
const U32 FSRADAR_MAX_OFFSET_REQUESTS = 60; // 2048 / UUID size, leaving overhead space
const U32 FSRADAR_CHAT_MIN_SPACING = 6; // minimum delay between radar chat messages
constexpr U32 FSRADAR_MAX_AVATARS_PER_ALERT{ 6 }; // maximum number of UUIDs we can cram into a single channel radar alert message
constexpr U32 FSRADAR_COARSE_OFFSET_INTERVAL{ 7 }; // seconds after which we query the bridge for a coarse location adjustment
constexpr U32 FSRADAR_MAX_OFFSET_REQUESTS{ 60 }; // 2048 / UUID size, leaving overhead space
constexpr U32 FSRADAR_CHAT_MIN_SPACING{ 6 }; // minimum delay between radar chat messages
typedef enum e_radar_name_format
{
@ -63,7 +63,7 @@ class FSRadar
virtual ~FSRadar();
public:
typedef boost::unordered_map<const LLUUID, FSRadarEntry*, FSUUIDHash> entry_map_t;
typedef std::unordered_map<const LLUUID, std::shared_ptr<FSRadarEntry>, FSUUIDHash> entry_map_t;
entry_map_t getRadarList() { return mEntryList; }
void startTracking(const LLUUID& avatar_id);
@ -80,13 +80,13 @@ public:
static bool radarReportToCheck(const LLSD& userdata);
void getCurrentData(std::vector<LLSD>& entries, LLSD& stats) const { entries = mRadarEntriesData; stats = mAvatarStats; }
FSRadarEntry* getEntry(const LLUUID& avatar_id);
std::shared_ptr<FSRadarEntry> getEntry(const LLUUID& avatar_id);
// internals
class Updater
{
public:
typedef boost::function<void()> callback_t;
typedef std::function<void()> callback_t;
Updater(callback_t cb)
: mCallback(cb)
{ }
@ -100,7 +100,7 @@ public:
mCallback();
}
callback_t mCallback;
callback_t mCallback;
};
typedef boost::signals2::signal<void(const std::vector<LLSD>& entries, const LLSD& stats)> radar_update_callback_t;
@ -110,13 +110,13 @@ public:
}
private:
void updateRadarList();
void updateTracking();
void checkTracking();
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg);
void updateAgeAlertCheck();
void updateRadarList();
void updateTracking();
void checkTracking();
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg);
void updateAgeAlertCheck();
Updater* mRadarListUpdater;
std::unique_ptr<Updater> mRadarListUpdater;
struct RadarFields
{
@ -125,7 +125,7 @@ private:
bool lastIgnore;
};
typedef boost::unordered_map<LLUUID, RadarFields, FSUUIDHash> radarfields_map_t;
typedef std::unordered_map<LLUUID, RadarFields, FSUUIDHash> radarfields_map_t;
radarfields_map_t mLastRadarSweep;
entry_map_t mEntryList;

View File

@ -418,8 +418,7 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, const LLColor4& cur_color,
}
else
{
FSRadarEntry* entry = FSRadar::getInstance()->getEntry(uuid);
if ( (entry && entry->getIsLinden()) || (!entry && FSCommon::isLinden(uuid)) )
if (auto entry = FSRadar::getInstance()->getEntry(uuid); (entry && entry->getIsLinden()) || (!entry && FSCommon::isLinden(uuid)) )
{
switch (type)
{

View File

@ -3892,8 +3892,10 @@ LLSD LLAppViewer::getViewerInfo() const
}
// CPU
LLMemory::updateMemoryInfo();
info["CPU"] = gSysCPU.getCPUString();
info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().valueInUnits<LLUnits::Megabytes>());
info["USED_RAM"] = LLSD::Real(LLMemory::getAllocatedMemKB().valueInUnits<LLUnits::Megabytes>());
info["CONCURRENCY"] = LLSD::Integer((S32)boost::thread::hardware_concurrency()); // <FS:Beq> Add hardware concurrency to info
// Moved hack adjustment to Windows memory size into llsys.cpp
info["OS_VERSION"] = LLOSInfo::instance().getOSString();
@ -5195,7 +5197,10 @@ bool LLAppViewer::initCache()
// </FS:Ansariel>
const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name);
LLDiskCache::initParamSingleton(cache_dir, disk_cache_size, enable_cache_debug_info);
// <FS:Beq> Improve cache purge triggering
// LLDiskCache::initParamSingleton(cache_dir, disk_cache_size, enable_cache_debug_info);
LLDiskCache::initParamSingleton(cache_dir, disk_cache_size, enable_cache_debug_info, gSavedSettings.getF32("FSDiskCacheHighWaterPercent"), gSavedSettings.getF32("FSDiskCacheLowWaterPercent"));
// </FS:Beq>
if (!read_only)
{

View File

@ -1196,7 +1196,7 @@ DWORD WINAPI purgeThread( LPVOID lpParameter )
for( auto dir : vctDirs )
{
LL_INFOS("CachePurge") << "Removing an old cache" << LL_ENDL;
LL_INFOS("LLDiskCache") << "Removing an old cache" << LL_ENDL; // <FS:Beq/> consistent tagging to help searching log files
deleteCacheDirectory( dir );
}
@ -1214,7 +1214,7 @@ void LLAppViewerWin32::startCachePurge()
if( !hThread )
{
LL_WARNS("CachePurge") << "CreateThread failed: " << GetLastError() << LL_ENDL;
LL_WARNS("LLDiskCache") << "CreateThread failed: " << GetLastError() << LL_ENDL; // <FS:Beq/> consistent tagging to help searching log files
}
else
SetThreadPriority( hThread, THREAD_MODE_BACKGROUND_BEGIN );

View File

@ -1862,7 +1862,7 @@ bool LLAvatarActions::canZoomIn(const LLUUID& idAgent)
else
{
// Special case for SL since interest list changes
FSRadarEntry* entry = FSRadar::getInstance()->getEntry(idAgent);
auto entry = FSRadar::getInstance()->getEntry(idAgent);
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInOpenSim())
{
@ -1871,7 +1871,7 @@ bool LLAvatarActions::canZoomIn(const LLUUID& idAgent)
else
#endif
{
return (entry != NULL);
return (entry != nullptr);
}
}
// </FS:Ansariel>
@ -1882,8 +1882,7 @@ void LLAvatarActions::zoomIn(const LLUUID& idAgent)
// <FS:Ansariel> Firestorm radar support
//handle_zoom_to_object(idAgent);
FSRadarEntry* entry = FSRadar::getInstance()->getEntry(idAgent);
if (entry)
if (auto entry = FSRadar::getInstance()->getEntry(idAgent); entry)
{
handle_zoom_to_object(idAgent, entry->getGlobalPos());
}

View File

@ -444,6 +444,7 @@ void inventory_offer_handler(LLOfferInfo* info)
}
report_to_nearby_chat(LLTrans::getString(message_type, chat_args));
make_ui_sound("UISndInventoryOffer");
}
// </FS:Ansariel>

View File

@ -1032,7 +1032,9 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from,
const LLUUID& from_id,
const std::string& utf8_text,
const std::string& time,
const bool is_history, // comes from a history file or chat server
// <FS:Zi> Add a distinct color for server side group chat replay
// const bool is_history, // comes from a history file or chat server
const S32 is_history, // comes from a history file or chat server
const bool is_region_msg,
const U32 timestamp) // may be zero
{
@ -1101,7 +1103,9 @@ void LLIMModel::LLIMSession::addMessagesFromHistoryCache(const chat_message_list
LL_DEBUGS("ChatHistory") << mSessionID << ": Adding history cache message: " << msg << LL_ENDL;
// Add message from history cache to the display
addMessage(from, from_id, msg[LL_IM_TEXT], msg[LL_IM_TIME], true, false, 0); // from history data, not region message, no timestamp
// <FS:Zi> Add a distinct color for server side group chat replay
// addMessage(from, from_id, msg[LL_IM_TEXT], msg[LL_IM_TIME], true, false, 0); // from history data, not region message, no timestamp
addMessage(from, from_id, msg[LL_IM_TEXT], msg[LL_IM_TIME], CHAT_STYLE_HISTORY, false, 0); // from history data, not region message, no timestamp
}
}
@ -1309,7 +1313,9 @@ void LLIMModel::LLIMSession::addMessagesFromServerHistory(const LLSD& history,
message["time"] = chat_time_str;
message["timestamp"] = (S32)history_msg_timestamp;
message["index"] = (LLSD::Integer)mMsgs.size();
message["is_history"] = true;
// <FS:Zi> Add a distinct color for server side group chat replay
// message["is_history"] = true;
message["is_history"] = CHAT_STYLE_SERVER_HISTORY;
mMsgs.push_front(message);
LL_DEBUGS("ChatHistory") << mSessionID << ": push_front() adding group chat history message " << message << LL_ENDL;
@ -1356,12 +1362,16 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const
if (type == LLLogChat::LOG_LINE)
{
LL_DEBUGS("ChatHistory") << "chatFromLogFile() adding LOG_LINE message from " << msg << LL_ENDL;
self->addMessage("", LLSD(), msg["message"].asString(), "", true, false, 0); // from history data, not region message, no timestamp
// <FS:Zi> Add a distinct color for server side group chat replay
// self->addMessage("", LLSD(), msg["message"].asString(), "", true, false, 0); // from history data, not region message, no timestamp
self->addMessage("", LLSD(), msg["message"].asString(), "", CHAT_STYLE_HISTORY, false, 0); // from history data, not region message, no timestamp
}
else if (type == LLLogChat::LOG_LLSD)
{
LL_DEBUGS("ChatHistory") << "chatFromLogFile() adding LOG_LLSD message from " << msg << LL_ENDL;
self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true, false, 0); // from history data, not region message, no timestamp
// <FS:Zi> Add a distinct color for server side group chat replay
// self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true, false, 0); // from history data, not region message, no timestamp
self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), CHAT_STYLE_HISTORY, false, 0); // from history data, not region message, no timestamp
}
}
@ -1717,7 +1727,9 @@ bool LLIMModel::addToHistory(const LLUUID& session_id,
// <FS:Ansariel> Forward IM to nearby chat if wanted
std::string timestr = LLLogChat::timestamp2LogString(timestamp, false);
session->addMessage(from, from_id, utf8_text, timestr, false, is_region_msg, timestamp); //might want to add date separately
// <FS:Zi> Add a distinct color for server side group chat replay
// session->addMessage(from, from_id, utf8_text, timestr, false, is_region_msg, timestamp); //might want to add date separately
session->addMessage(from, from_id, utf8_text, timestr, CHAT_STYLE_NORMAL, is_region_msg, timestamp); //might want to add date separately
static LLCachedControl<bool> show_im_in_chat(gSavedSettings, "FSShowIMInChatHistory");
if (show_im_in_chat && !is_announcement)
@ -4650,7 +4662,7 @@ public:
{
if ( body.has("session_info") )
{
im_floater->processSessionUpdate(body["session_info"]);
//im_floater->processSessionUpdate(body["session_info"]); // <FS:Ansariel> Method does nothing
// Send request for chat history, if enabled.
if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory"))
@ -4747,14 +4759,15 @@ public:
const LLSD& input) const
{
LLUUID session_id = input["body"]["session_id"].asUUID();
// <FS:Ansariel> [FS communication UI]
//LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
FSFloaterIM* im_floater = FSFloaterIM::findInstance(session_id);
// </FS:Ansariel> [FS communication UI]
if ( im_floater )
{
im_floater->processSessionUpdate(input["body"]["info"]);
}
// <FS:Ansariel> Method does nothing
//// <FS:Ansariel> [FS communication UI]
////LLFloaterIMSession* im_floater = LLFloaterIMSession::findInstance(session_id);
//FSFloaterIM* im_floater = FSFloaterIM::findInstance(session_id);
//// </FS:Ansariel> [FS communication UI]
//if ( im_floater )
//{
// im_floater->processSessionUpdate(input["body"]["info"]);
//}
LLIMSpeakerMgr* im_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
if (im_mgr)
{

View File

@ -99,7 +99,9 @@ public:
const LLUUID& from_id,
const std::string& utf8_text,
const std::string& time,
const bool is_history,
// <FS:Zi> Add a distinct color for server side group chat replay
// const bool is_history,
const S32 is_history,
const bool is_region_msg,
U32 timestamp);

View File

@ -1353,19 +1353,12 @@ BOOL LLNetMap::handleToolTipAgent(const LLUUID& avatar_id)
// aka radar when above 1020m.
if (isHigher1020mBug)
{
FSRadar* radar = FSRadar::getInstance();
if (radar)
if (auto entry = FSRadar::getInstance()->getEntry(avatar_id); entry)
{
FSRadarEntry* entry = radar->getEntry(avatar_id);
if (entry)
if (F32 radar_distance = entry->getRange(); radar_distance > AVATAR_UNKNOWN_RANGE)
{
F32 radar_distance = entry->getRange();
if (radar_distance > AVATAR_UNKNOWN_RANGE)
{
distance = radar_distance;
isHigher1020mBug = false;
}
distance = radar_distance;
isHigher1020mBug = false;
}
}
}

View File

@ -1176,6 +1176,13 @@ void LLPanelProfileSecondLife::apply(LLAvatarData* data)
void LLPanelProfileSecondLife::processProperties(void* data, EAvatarProcessorType type)
{
// discard UDP replies for profile data if profile capability is available
// otherwise we will truncate profile descriptions to the old UDP limits
if (!gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty())
{
return;
}
if (APT_PROPERTIES == type)
{
const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
@ -2990,6 +2997,13 @@ void LLPanelProfileFirstLife::onDiscardDescriptionChanges()
// <FS:Beq> Restore UDP profiles
void LLPanelProfileFirstLife::processProperties(void * data, EAvatarProcessorType type)
{
// discard UDP replies for profile data if profile capability is available
// otherwise we will truncate profile first life descriptions to the old UDP limits
if (!gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty())
{
return;
}
if (APT_PROPERTIES == type)
{
const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
@ -3204,6 +3218,13 @@ void LLPanelProfileNotes::processProperties(LLAvatarNotes* avatar_notes)
// <FS:Beq> Restore UDP profiles
void LLPanelProfileNotes::processProperties(void * data, EAvatarProcessorType type)
{
// discard UDP replies for profile data if profile capability is available
// otherwise we will truncate profile notes to the old UDP limits
if (!gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty())
{
return;
}
if (APT_NOTES == type)
{
LLAvatarNotes* avatar_notes = static_cast<LLAvatarNotes*>(data);

View File

@ -76,6 +76,7 @@ static LLPanelInjector<LLSidepanelInventory> t_inventory("sidepanel_inventory");
static const char * const INBOX_BUTTON_NAME = "inbox_btn";
static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";
static const char * const INBOX_RELOAD_BUTTON_NAME = "reload_received_items_btn"; // <FS:Zi> Add reload button to inventory inbox
static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";
static const char * const MARKETPLACE_INBOX_PANEL = "marketplace_inbox";
@ -198,6 +199,12 @@ BOOL LLSidepanelInventory::postBuild()
LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
// <FS:Zi> Add reload button to inventory inbox
if (LLButton* reload_inbox_btn = getChild<LLButton>(INBOX_RELOAD_BUTTON_NAME) ; reload_inbox_btn)
{
reload_inbox_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onReloadInboxClicked, this));
}
// </FS:Zi>
/*
EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?"
Deferring this until 2.1.
@ -834,3 +841,16 @@ void LLSidepanelInventory::cleanup()
}
// </FS:Ansariel>
}
// <FS:Zi> Add reload button to inventory inbox
void LLSidepanelInventory::onReloadInboxClicked()
{
const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, true);
if (LLViewerInventoryCategory* cat = gInventory.getCategory(inbox_id); cat)
{
cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN);
cat->fetch();
}
}
// </FS:Zi>

View File

@ -117,6 +117,7 @@ protected:
void onWearButtonClicked();
void onPlayButtonClicked();
void onTeleportButtonClicked();
void onReloadInboxClicked(); // <FS:Zi> Add reload button to inventory inbox
public:
void onBackButtonClicked();

View File

@ -1087,6 +1087,20 @@ void handleDiskCacheSizeChanged(const LLSD& newValue)
}
// </FS:Ansariel>
// <FS:Beq> Better asset cache purge control
void handleDiskCacheHighWaterPctChanged(const LLSD& newValue)
{
const auto new_high = newValue.asReal();
LLDiskCache::getInstance()->setHighWaterPercentage(new_high);
}
void handleDiskCacheLowWaterPctChanged(const LLSD& newValue)
{
const auto new_low = newValue.asReal();
LLDiskCache::getInstance()->setLowWaterPercentage(new_low);
}
// </FS:Beq>
void handleTargetFPSChanged(const LLSD& newValue)
{
const auto targetFPS = gSavedSettings.getU32("TargetFPS");
@ -1464,7 +1478,10 @@ void settings_setup_listeners()
// <FS:Ansariel> Better asset cache size control
setting_setup_signal_listener(gSavedSettings, "FSDiskCacheSize", handleDiskCacheSizeChanged);
// <FS:Beq> Better asset cache purge control
setting_setup_signal_listener(gSavedSettings, "FSDiskCacheHighWaterPercent", handleDiskCacheHighWaterPctChanged);
setting_setup_signal_listener(gSavedSettings, "FSDiskCacheLowWaterPercent", handleDiskCacheLowWaterPctChanged);
// </FS:Beq>
// <FS:Zi> Handle IME text input getting enabled or disabled
#if LL_SDL2

View File

@ -5220,6 +5220,16 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i);
mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i);
// <FS:Zi> Asset blacklist
if (FSAssetBlacklist::getInstance()->isBlacklisted(animation_id, LLAssetType::AT_ANIMATION))
{
// stop animation for onlookers; this won't help with deformers, but at least the
// user themselves doesn't see it, and everyone who comes in after this won't either
gAgent.sendAnimationRequest(animation_id, ANIM_REQUEST_STOP);
continue;
}
// </FS:Zi>
avatarp->mSignaledAnimations[animation_id] = anim_sequence_id;
// *HACK: Disabling flying mode if it has been enabled shortly before the agent

View File

@ -106,6 +106,7 @@
const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
bool LLViewerRegion::sFSAreaSearchActive = false; // <FS:Beq/> FIRE-32688 Area Search improvements
BOOL LLViewerRegion::sVOCacheCullingEnabled = FALSE;
S32 LLViewerRegion::sLastCameraUpdated = 0;
S32 LLViewerRegion::sNewObjectCreationThrottle = -1;

View File

@ -478,6 +478,7 @@ public:
std::vector<U32> mMapAvatars;
std::vector<LLUUID> mMapAvatarIDs;
static bool sFSAreaSearchActive; // <FS:Beq/> FIRE-32688 Area Search improvements
static BOOL sVOCacheCullingEnabled; //vo cache culling enabled or not.
static S32 sLastCameraUpdated;

View File

@ -432,6 +432,7 @@ F32 LLVOCacheEntry::getSquaredPixelThreshold(bool is_front)
bool LLVOCacheEntry::isAnyVisible(const LLVector4a& camera_origin, const LLVector4a& local_camera_origin, F32 dist_threshold)
{
if( LLViewerRegion::sFSAreaSearchActive ) { return true; } // <FS:Beq/> FIRE-32688 Area Search improvements
LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)getGroup();
if(!group)
{
@ -928,7 +929,10 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
//process back objects selection
selectBackObjects(camera, LLVOCacheEntry::getSquaredPixelThreshold(mFrontCull),
do_occlusion && use_object_cache_occlusion);
// <FS:Beq> FIRE-32688 Area Search improvements
// do_occlusion && use_object_cache_occlusion);
do_occlusion && use_object_cache_occlusion && !LLViewerRegion::sFSAreaSearchActive);
// </FS:Beq>
return 0; //nothing changed, reduce frequency of culling
}
}
@ -942,7 +946,10 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
camera.calcRegionFrustumPlanes(region_agent, gAgentCamera.mDrawDistance);
mFrontCull = TRUE;
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion,
// <FS:Beq> FIRE-32688 Area Search improvements
// LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion,
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion && !LLViewerRegion::sFSAreaSearchActive,
// </FS:Beq>
LLVOCacheEntry::getSquaredPixelThreshold(mFrontCull), this);
culler.traverse(mOctree);

View File

@ -77,7 +77,7 @@
font="SansSerifMedium"
name="inbox_btn"
height="35"
width="308"
width="270"
image_unselected="MarketplaceBtn_Off"
image_selected="MarketplaceBtn_Selected"
halign="left"
@ -88,6 +88,14 @@
pad_left="35"
top="0"
left="10" />
<button
name="reload_received_items_btn"
height="35"
width="35"
left_pad="3"
follows="top|right"
image_overlay="Refresh_Off"
tool_tip="Reload the received items list." />
<text
type="string"
length="1"
@ -95,7 +103,7 @@
layout="topleft"
height="13"
top="10"
right="-20"
right="-58"
name="inbox_fresh_new_count"
font="SansSerifMedium"
halign="right"

View File

@ -1358,6 +1358,11 @@
<color
name="ChatHistoryMessageFromLog"
reference="Gray" />
<!-- <FS:Zi> Add a distinct color for server side group chat replay -->
<color
name="ChatHistoryMessageFromServerLog"
value=".37 .51 .38 1" />
<!-- </FS:Zi> -->
<color
name="AreaSearchBeaconColor"
reference="Blue_80" />

View File

@ -32,9 +32,6 @@
<panel.string name="area_text">
Sahə
</panel.string>
<panel.string name="area_size_text">
[AREA] m²
</panel.string>
<panel.string name="auction_id_text">
Hərrac ID-si: [ID]
</panel.string>
@ -132,9 +129,6 @@
<text name="PriceLabel">
Sahə:
</text>
<text name="PriceText">
4048 m²
</text>
<text name="Traffic:">
Trafik:
</text>
@ -180,9 +174,6 @@
<text name="covenant_timestamp_text">
Axırınci dəyişiklər: 31 dekabr 1969 il., cümə, 16:00:00
</text>
<text name="region_section_lbl">
Region:
</text>
<text name="region_name_text">
Yüklənir...
</text>

View File

@ -28,7 +28,7 @@
<text name="scale_label">Ölçü:</text>
<text name="glow_focus_label">Parlaqlığın fokusu:</text>
<text name="glow_size_label">Parlaqlığın ölçüsü:</text>
<text name="star_brightness_label">Ulduzların parlaqlığı:</text>
<text name="star_brightness_label" width="140">Ulduzların parlaqlığı:</text>
</layout_panel>
<layout_panel name="lp_4">
<text name="label">Ay:</text>

View File

@ -99,7 +99,8 @@ Maksimum animasiya uzunluğu: [MAX_LENGTH] sn.
</floater.string>
<floater.string name="E_ST_NO_XLT_EASEOUT">
EaseOut dəyərləri alınmadı.
</floater.string name="E_ST_NO_XLT_HAND">
</floater.string>
<floater.string name="E_ST_NO_XLT_HAND">
Hand morph dəyəri alınmadı.
</floater.string>
<floater.string name="E_ST_NO_XLT_EMOTE">
@ -128,10 +129,10 @@ Maksimum animasiya uzunluğu: [MAX_LENGTH] sn.
<combo_box.item label="Sərbəst" name="Relaxed"/>
<combo_box.item label="Göstərir" name="PointBoth"/>
<combo_box.item label="Qapalı" name="Fist"/>
<combo_box.item label="Sol xash" name="RelaxedLeft"/>
<combo_box.item label="Sol sərbəst" name="RelaxedLeft"/>
<combo_box.item label="Sol göstərir" name="PointLeft"/>
<combo_box.item label="Sol qapalı" name="FistLeft"/>
<combo_box.item label="Sağ xaş" name="RelaxedRight"/>
<combo_box.item label="Sağ sərbəst" name="RelaxedRight"/>
<combo_box.item label="Sağ göstərir" name="PointRight"/>
<combo_box.item label="Sağ qapalı" name="FistRight"/>
<combo_box.item label="Sağ salam verir" name="SaluteRight"/>

View File

@ -66,6 +66,6 @@
</fs_scroll_list>
</panel>
</tab_container>
<button label="ОК" label_selected="ОК" name="ok_btn"/>
<button label="OK" label_selected="OK" name="ok_btn"/>
<button label="Ləğv et" label_selected="Ləğv et" name="cancel_btn"/>
</floater>

View File

@ -14,6 +14,6 @@
<text name="hours_textbox">
saat
</text>
<button label="ОК" name="ok_btn"/>
<button label="OK" name="ok_btn"/>
<button label="Ləğv et" name="cancel_btn"/>
</floater>

View File

@ -8,9 +8,9 @@
</floater.string>
<text name="beamcolor_text">
Hansı rəng ilkin və hansı son olduğunu
göstərmək üçün siçandan istifadə edin
Başlanğıc üçün sol düyməni istifadə edin.
Son üçün sağ düyməni istifadə edin.
göstərmək üçün siçandan istifadə edin.
Başlanğıc üçün sol düyməni istifadə edin.
Son üçün sağ düyməni istifadə edin.
</text>
<color_swatch name="BeamColor_Preview" tool_tip="Rəng seçimini açmaq üçün toxunun" />
<text name="beamcolor_text2">

View File

@ -30,11 +30,11 @@
<text name="GroupLabel">
Qrup:
</text>
<check_box label="Paylaş" name="share_with_group" tool_tip="Позволить всем участникам выбранной группы получить установленные вам права на этот объект. Для включения ролевых ограничений необходимо произвести сделку."/>
<check_box label="Paylaş" name="share_with_group" tool_tip="Seçilmiş qrupun bütün üzvlərinə bu obyektdə təyin etdiyiniz hüquqları almağa icazə verin. Rol məhdudiyyətlərini aktivləşdirmək üçün müqavilə bağlamalısınız."/>
<text name="AnyoneLabel">
Hamısı:
</text>
<check_box label="Köçürt" name="everyone_copy" tool_tip="Копию объекта может взять любой желающий. Объект и все его содержимое должны копироваться и передаваться."/>
<check_box label="Köçürt" name="everyone_copy" tool_tip="Hər kəs obyektin köçürtməsin götürə bilər. Obyekt və onun bütün məzmunu köçürülə və paylaşıla bilməlidir."/>
<text left="200" name="NextOwnerLabel">
Yeni Sahibi:
</text>

View File

@ -103,7 +103,7 @@ Daha kiçik bir sahə seçməyə çalışın.
</floater.string>
<floater.string name="info_price_string">
L$ [PRICE]
(L$ [PRICE_PER_SQM]/м²)
(L$ [PRICE_PER_SQM]/m²)
[SOLD_WITH_OBJECTS]
</floater.string>
<floater.string name="insufficient_land_credits">
@ -181,7 +181,7 @@ Daha kiçik bir sahə seçməyə çalışın.
</text>
<text name="info_price">
L$ 1500
(L$ 1,1/м²)
(L$ 1,1/m²)
obyektlər daxil satılıb
</text>
<text name="info_action">

View File

@ -41,7 +41,7 @@
<check_box label="İndi t. et" name="apply_immediate" width="100" />
<button label="LSL köç."
tool_tip="Rəng dəyərini &lt;r, g, b&gt;. formatda LSL rəng vektoruna köçürdür" name="copy_lsl_btn" width="80" />
<button label="ОК" label_selected="ОК" name="select_btn"/>
<button label="OK" label_selected="OK" name="select_btn"/>
<button label="Ləğv et" label_selected="Ləğv et" name="cancel_btn"/>
<text name="Current color:">
^ Cari rəng ^

View File

@ -4,7 +4,7 @@
Qrafikanın öncədən təyinini sil
</string>
<string name="title_camera">
Камеры Kameranın öncədən təyinini sil
Kameranın öncədən təyinini sil
</string>
<text name="Preset">
Öncədən təyini seçin

View File

@ -63,7 +63,7 @@
<panel name="edit_scrolling_panel">
<text name="edit_experience_title_label" value="Adı:"/>
<text name="edit_experience_desc_label" value="Təsviri:"/>
<button name="Group_btn" label="Группа"/>
<button name="Group_btn" label="Qrup"/>
<text name="edit_ContentRating">
Reytinq:
</text>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="avatarrendersettings" title="Исключения отображения аватара">
<floater name="avatarrendersettings" title="Avatar göstərmə istisnaları">
<floater.string name="av_render_never">Heç vaxt</floater.string>
<floater.string name="av_render_always">Tam olaraq</floater.string>
<filter_editor label="Фильтр аватаров" name="filter_input" />
<filter_editor label="Avatar süzgəci" name="filter_input" />
<menu_button name="plus_btn" tool_tip="Siyahıya yeni şəxs əlavə et"/>
<name_list name="avatar_list">
<name_list.columns label="Ad" name="name" />

View File

@ -18,7 +18,7 @@
<menu_button name="gear_btn" tool_tip="Əlavə seçimlər"/>
<button name="new_gesture_btn" tool_tip="Yeni jest yarat"/>
<button name="activate_btn" tool_tip="Seçilmiş jesti aktivləşdirin/deaktiv et"/>
<check_box label="Только активные" name="FSShowOnlyActiveGestures" width="150"/>
<check_box label="Yalnız aktiv" name="FSShowOnlyActiveGestures" width="150"/>
<button name="del_btn" tool_tip="Bu jesti sil"/>
</panel>
<button label="Dəyişdir" name="edit_btn" tool_tip="Seçilmiş jesti dəyişdirmək üçün pəncərəni açır."/>

View File

@ -63,12 +63,12 @@
<text name="target_avatar_name">
(xarakter yoxdur)
</text>
<button label="Xarici torpaqda skriptlərlə xarakter obyektlərini silin" label_selected="Xarici ölkədə skriptlərlə xarakter obyektlərini silin" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, на земле, не принадлежащей персонажу. «Не копируемые» объекты будут возвращены."/>
<button label="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" label_selected="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, в этом регионе. «Не копируемые» объекты будут возвращены."/>
<button label="*BÜTÜN* xarakter obyektlərini silin" label_selected="*BÜTÜN* xarakter obyektlərini silin" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Удаление всех объектов, принадлежащих персонажу, в этом регионе. «Не копируемые» объекты будут возвращены."/>
<button label="Toqquşmaların ən fəal iştirakçıları" label_selected="Toqquşmaların ən fəal iştirakçıları" name="Get Top Colliders" tool_tip="Список объектов, для которых наблюдается больше всего детализированных обратных вызовов" width="260"/>
<button label="Ən yaxşı skriptləri yükləyin" label_selected="Ən yaxşı skriptləri yükləyin" name="Get Top Scripts" tool_tip="Список объектов, в которых скрипты выполняются дольше всего" width="200"/>
<button label="Skript Xülasəsi" label_selected="Skript Xülasəsi" name="Scripts digest" tool_tip="Список всех скриптов с числом использований по каждому из них" width="160"/>
<button label="Xarici torpaqda skriptlərlə xarakter obyektlərini silin" label_selected="Xarici regionda skriptlərlə xarakter obyektlərini silin" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Hədəfin sahibi olmayan torpaqda hədəfə məxsus bütün skript obyektlərini silin. Köçürülə bilməyən obyektlər geri qaytarılacaq."/>
<button label="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" label_selected="*Bütün* ərazilərdə skriptlərlə simvol obyektlərini silin" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Bu bölgədəki hədəfə məxsus bütün skript obyektlərini silin. Köçürülə bilməyən obyektlər geri qaytarılacaq."/>
<button label="*BÜTÜN* xarakter obyektlərini silin" label_selected="*BÜTÜN* xarakter obyektlərini silin" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Bu bölgədəki hədəfə məxsus bütün obyektləri silin. Köçürülə bilməyən obyektlər geri qaytarılacaq."/>
<button label="Toqquşmaların ən fəal iştirakçıları" label_selected="Toqquşmaların ən fəal iştirakçıları" name="Get Top Colliders" tool_tip="Ən çox ətraflı geri çağırışlı obyekt siyahısı" width="260"/>
<button label="Ən yaxşı skriptləri yükləyin" label_selected="Ən yaxşı skriptləri yükləyin" name="Get Top Scripts" tool_tip="Skriptlərin ən uzun müddət işlədiyi obyektlərin siyahısı" width="200"/>
<button label="Skript Xülasəsi" label_selected="Skript Xülasəsi" name="Scripts digest" tool_tip="Bütün skriptlərin siyahısını və hər birinin baş vermə sayını alır" width="160"/>
</panel>
<panel label="Sorğu" name="request">
<text name="Destination:">

View File

@ -1,17 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="panel_im">
<floater.string name="call_btn_start">
Conv_toolbar_open_call
</floater.string>
<floater.string name="call_btn_stop">
Conv_toolbar_hang_up
</floater.string>
<floater.string name="collapseline_icon" value="Conv_collapse_to_one_line"/>
<floater.string name="expandline_icon" value="Conv_expand_one_line"/>
<floater.string name="collapse_icon" value="Conv_toolbar_collapse"/>
<floater.string name="expand_icon" value="Conv_toolbar_expand"/>
<floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/>
<floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/>
<floater.string name="participant_added" value="[NAME] dəvət edildi."/>
<floater.string name="multiple_participants_added" value="[NAME] dəvət edildilər."/>
<floater.string name="tooltip_to_separate_window" value="Bu söhbəti ayrı bir pəncərədə aç"/>

View File

@ -7,7 +7,7 @@
Təsviri:
</text>
<text name="preview_label">
Şəkilin göstərmə üsulu:
Göstərmə üsulu:
</text>
<combo_box label="Geyim növü" name="clothing_type_combo">
<item label="Şəkil" name="Image" value="Şəkil"/>
@ -23,9 +23,11 @@
</combo_box>
<text name="bad_image_text">
Şəkil oxudula bilmədi.
Şəkili 24-bit TGA faylı olaraq saxlayıb yenidən yoxlayın.
</text>
<check_box label="İtkisiz sıxlaşdırmadan istifadə et" name="lossless_check"/>
<check_box label="İtkisiz şıxlaşdırma" name="lossless_check"/>
<check_box name="temp_check" label="Müvəqqəti. (pulsuz)" tool_tip="O, serverdəki şəkli müvəqqəti və buna görə də pulsuz olaraq təyin edir, lakin o, yalnız qısa müddət ərzində mövcud olacaq - bundan sonra o, silinəcək." />
<button label="Ləğv et" name="cancel_btn"/>
<button label="Yüklə (L$[AMOUNT])" name="ok_btn"/>
</floater>

View File

@ -8,9 +8,9 @@
<text name="LabelItemNameTitle">Adı:</text>
<text name="LabelItemDescTitle">Təsviri:</text>
<text name="LabelCreatorTitle">Yaradıcı:</text>
<button label="Профиль…" name="BtnCreator"/>
<button label="Profil…" name="BtnCreator"/>
<text name="LabelOwnerTitle">Sahibi:</text>
<button label="Профиль…" name="BtnOwner"/>
<button label="Profil…" name="BtnOwner"/>
<text name="LabelAcquiredTitle">Alınıb:</text>
<text name="LabelAcquiredDate">Ç. 24 May 12:50:46 2006</text>
<text name="LabelItemExperienceTitle">Macəra:</text>

View File

@ -14,8 +14,8 @@
<spinner label="Fırlanma oxu" name="JoystickAxis3"/>
<spinner label="Miqyas oxu" name="JoystickAxis6"/>
<check_box label="Miqyaslama" name="ZoomDirect"/>
<check_box label="3D kursoru" name="Cursor3D" left="320" />
<check_box label="Avtomatik səviyyələndirmə" name="AutoLeveling"/>
<check_box label="3D kursor" name="Cursor3D" left="280" />
<check_box label="Avtomatik səviyyələndirmə" name="AutoLeveling" left="370"/>
<text name="Control Modes:">
Idarə etmə rejimləri:
</text>

View File

@ -265,7 +265,7 @@
<panel name="weights_and_warning_panel">
<button label="Çəki və haqqı hesablayın" name="calculate_btn" tool_tip="Çəki və haqqı hesablayın"/>
<button label="Ləğv et" name="cancel_btn"/>
<button label="Yüklə" name="ok_btn" tool_tip="Загрузить в симулятор"/>
<button label="Yüklə" name="ok_btn" tool_tip="Simulyatora yüklə"/>
<button label="Seçimləri silin və formanı sıfırlayın" name="reset_btn"/>
<!-- ========== WEIGHTS ==========-->
<text name="upload_fee">Qiymət: L$ [FEE]</text>

View File

@ -103,10 +103,10 @@
</panel>
<panel label="Yolu yoxla" name="test_panel">
<text name="ctrl_click_label">
Başlanqıc nöqtəsini seçmək üçün Ctrl-toxunuş
Başlanqıc nöqtəsi üçün Ctrl-toxunuş
</text>
<text name="shift_click_label">
Sonuncu nöqtəni seçmək üçün Shift-toxunuş
Son nöqtəsi üçün Shift-toxunuş
</text>
<text name="character_width_label">
Avatar genişliyi

View File

@ -165,7 +165,7 @@
D
</text>
<line_editor name="edit_d_value" tool_tip="D növlü xarakterlər üçün keçilə bilməsi. Xarakter nümunəsi - fərqli."/>
<button label="Применить изменения" name="apply_edit_values"/>
<button label="Dəyişikləri tətbiq et" name="apply_edit_values"/>
<text name="suggested_use_a_label">
(Humanoid)
</text>

View File

@ -10,6 +10,6 @@
<check_box label="köçürtmək" name="next_owner_copy"/>
<check_box initial_value="true" label="satmaq/paylaşmaq" name="next_owner_transfer"/>
</panel>
<button label="ОК" label_selected="ОК" name="ok"/>
<button label="OK" label_selected="OK" name="ok"/>
<button label="Ləğv et" label_selected="Ləğv et" name="cancel"/>
</floater>

View File

@ -459,8 +459,8 @@
</text>
<slider_bar name="SB_Roll" width="110"/>
<button name="Reset_Roll" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<text name="T_Zoom_Speed" tool_tip="Ölçünün sürət həssaslığını tənzimləyir. Əgər dəqiqliklə hərəkət etmək çətindirsə, daha aşağı dəyərlər istifadə edin." width="100">
Yaxınlaşdırma tezliyi
<text name="T_Zoom_Speed" tool_tip="Yaxınlaşdırmanın sürət həssaslığını tənzimləyir. Əgər dəqiqliklə hərəkət etmək çətindirsə, daha aşağı dəyərlər istifadə edin." width="100">
Yaxınlaşdır.sürəti
</text>
<slider_bar name="SB_Zoom_Speed" width="110"/>
<button name="Reset_Zoom_Speed" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
@ -533,11 +533,11 @@
</panel>
</panel>
<panel name="P_Misc" label="Разное">
<panel name="P_Misc" label="Əlavə">
<panel name="P_Misc_Settings">
<check_box label="Avatar kliklənməsi kameranın yerləşməsini saxlayır" name="clickonavatarkeepscamera"
<check_box label="Avatar kliklənməsi kameranın yerləşməsini saxla" name="clickonavatarkeepscamera"
tool_tip="Adətən avatar üzərinə basmaqla kameranın yerləşməsi sıfırlanır. Bu seçim bu davranışı düzəldir."/>
<check_box label="Teleportdan sonra kamera yerləşməsini sıfırla" name="FSResetCameraOnTP"
<check_box label="Tp-dan sonra kamera yerləşməsini sıfırla" name="FSResetCameraOnTP"
tool_tip="Bir qayda olaraq, teleportasiya zamanı (region daxilində) kamera yerləşməsi sıfırlanır. Bu seçim bu davranışın qarşısını alır."/>
<check_box label="Minimum kamera məsafəsini deaktiv edin" name="disableminzoomdist"
tool_tip="Kamera və obyekt arasında ən yaxın məsafə məhdudiyyətini söndürür."/>

View File

@ -78,23 +78,23 @@
<text name="T_Zoom" tool_tip="Real mənada bu, yaxınlaşdırma funksiyasıdır. Bu, görünüş pəncərəsindəki baxış sahəsini dəyişəcək. Bu, Ctrl+0 və ya Ctrl+8 düymələrini basmaqla eynidir. QEYD. Əgər siz flycam-ı (3D SpacenNavigator) aktiv etmisinizsə, bu işləməyəcək.">
Baxış bucağı
</text>
<button name="Reset_Camera_Angle" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<button name="Reset_Camera_Angle" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<text name="T_Zoom_Speed" tool_tip="Controls how fast/slow the camera will zoom in and out. Higher values produce slower and smother zoom.">
Sür. miqyas
</text>
<button name="Reset_Zoom_Time" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<button name="Reset_Zoom_Time" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<text name="T_Camera_Lag" tool_tip="Avatar hərəkətindən kamera gecikməsi dəyəri (0 = heç biri, 30 = avatar sürəti).">
Gecikmə
</text>
<button name="Reset_Camera_Lag" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<button name="Reset_Camera_Lag" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<text name="T_Camera_Offset" tool_tip="Kameranın defolt baxış nöqtəsindən nə qədər uzaqlaşdığına/sürüşdürülməsinə nəzarət edir.">
Sürüşdürmə
</text>
<button name="Reset_Camera_Offset" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<button name="Reset_Camera_Offset" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<text name="T_Camera_Smoothing" tool_tip="Kameranın nə qədər hamar sürətlənməsinə və dayanmasına nəzarət edir. Daha yüksək dəyərlər daha hamar (və bir qədər yavaş) hərəkət verir.">
Hamalaşdırma
</text>
<button name="Reset_Camera_Smoothing" label="С" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
<button name="Reset_Camera_Smoothing" label="S" tool_tip="Susmaya görə olan vəziyyətə qaytarın."/>
</panel>
</panel>
@ -123,7 +123,7 @@
<panel name="P_Add_Cam_Opt_Settings">
<check_box name="clickonavatarkeepscamera" label="Kamera yerləşməsini yadda saxlayın"
tool_tip="Adətən avatarın üzərinə basmaqla kameranın yerləşməsi sıfırlanır. Bu seçim bu davranışı düzəldir."/>
<check_box name="FSResetCameraOnTP" label="Teleportdan sonra kamera yerləşməsini sıfırlayın"
<check_box name="FSResetCameraOnTP" label="Tp-dan sonra kamera yerləşməsini sıfırlayın"
tool_tip="Bir qayda olaraq, teleportasiya zamanı (region daxilində) kameranın yerləşməsi sıfırlanır. Bu seçim bu davranışın qarşısını alır."/>
<check_box name="disableminzoomdist" label="Minimum məsafəni söndürün"
tool_tip="Obyektə ən yaxın kamera məsafəsi ilə bağlı məhdudiyyəti söndürür."/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="prefs_graphics_advanced" title="Расширенные настройки графики">
<floater name="prefs_graphics_advanced" title="Əlavə qrafika seçimləri">
<text name="GeneralText">
Ümumi
</text>
@ -20,7 +20,7 @@
<text name="IndirectMaxComplexityText">
0
</text>
<slider label="Maksimum Həcmli Sayı:" name="IndirectMaxNonImpostors"/>
<slider label="Maksimum Avatar Sayı:" name="IndirectMaxNonImpostors"/>
<text name="IndirectMaxNonImpostorsText">
0
</text>
@ -42,8 +42,8 @@
(az = daha parlaq, 0 susmaya görə parlaqlıq)
</text>
<check_box label="Anizatrop filtrasiya (aktiv olanda daha gec olur)" name="ani"/>
<check_box label="Разрешить сжатие текстур (yenidən başlatmalar tələb olunur)" name="texture compression" tool_tip="Сжатие текстур в видеопамяти, что позволяет загружать текстуры большего размера за счет некоторого падения качества цвета."/>
<check_box label="Включить поддержку HiDPI дисплея (yenidən başlatma tələb olunur)" name="use HiDPI" tool_tip="Разрешить OpenGL отображение с высоким разрешением."/>
<check_box label="Tekstur sıxlaşdırması (yen.başlatma tələb olunur)" name="texture compression" tool_tip="Video yaddaşda teksturların sıxılması. Rəng keyfiyyətində müəyyən itkilər hesabına daha böyük teksturaları yükləməyə imkan verir."/>
<check_box label="HiDPI displey dəstəyi (yen. başlatma tələb olunur)" name="use HiDPI" tool_tip="OpenGL-in yüksək nisbət ilə göstərilməsinə icazə verir."/>
<text name="antialiasing label">
Hamarlaşdırma:
</text>
@ -72,7 +72,7 @@
<text name="ObjectMeshDetailText">
Aşağı
</text>
<slider label="Гибкие примитивы:" name="FlexibleMeshDetail"/>
<slider label="Çevik primitivlər:" name="FlexibleMeshDetail"/>
<text name="FlexibleMeshDetailText">
Aşağı
</text>

View File

@ -35,7 +35,7 @@
<radio_item label="HTTP proxy istifadə et" name="OtherHTTPProxy" tool_tip="Veb səhifələrə daxil olarkən HTTP proxy istifadə edilsin." value="Veb"/>
<radio_item label="SOCKS 5 server istifadə et" name="OtherSocksProxy" tool_tip="Veb saytlarla bağlı olmayan HTTP trafiki SOCKS 5 serverindən keçirilsin." value="SOCKS"/>
</radio_group>
<button label="ОК" label_selected="ОК" name="OK"/>
<button label="OK" label_selected="OK" name="OK"/>
<button label="Ləğv et" label_selected="Ləğv et" name="Cancel"/>
</floater>

View File

@ -24,7 +24,7 @@
<text right="-128" name="aspect_ratio" width="128">
Önizləmə
</text>
<combo_box width="100" name="combo_aspect_ratio" tool_tip="Предварительный просмотр с фиксированным соотношением сторон">
<combo_box width="100" name="combo_aspect_ratio" tool_tip="Sabit aspekt nisbətində önizləmə">
</combo_box>
</panel>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="search replace" title="Axtar / Əvəz et">
<check_box label="Böyük kiçik hərflərə diqqət etmə" left="50" name="case_text" width="140" />
<check_box label="Registeri nəzərə al" left="18" name="case_text" width="120" />
<check_box label="Yuxarıdan aşağıya axtar" name="find_previous" />
<button label="Axtar" label_selected="Axtar" name="search_btn" />
<button label="Əvəz et" label_selected="Əvəz et" name="replace_btn" />

View File

@ -72,7 +72,7 @@
</panel>
</view>
<text name="image_res_text">
[WIDTH] (en) x [HEIGHT] (hündürlük) пикс.
[WIDTH] (en) x [HEIGHT] (hündürlük) piks.
</text>
<text name="file_size_label">
[SIZE] KB

View File

@ -8,22 +8,21 @@
Telehub qoşulmamışdır.
</text>
<text name="help_text_connected">
Qaldırmaq üçün "Qoşulmamış" düyməsini basın.
Ayırılmaq üçün "Ayır" düyməsini basın.
</text>
<text name="help_text_not_connected">
Obyekti seçin və "Telehuba qoşul" düyməsini basın.
</text>
<button label="Telehuba qoşul" name="connect_btn"/>
<button label="Qoşulmamış" name="disconnect_btn"/>
<button label="Ayır" name="disconnect_btn"/>
<text name="spawn_points_text">
Görünmə nöqtələri (obyektlər deyil, ancaq mövqeylər):
liş nöqtələri (obyektlər deyil, ancaq mövqeylər):
</text>
<button label="Görünmə nöqtəsi əlavə et" name="add_spawn_point_btn"/>
<button label="Görünmə nöqtəsini sil" name="remove_spawn_point_btn"/>
<button label="Gəliş nöqtəsi əlavə et" name="add_spawn_point_btn" width="140"/>
<button label="Gəliş nöqtəsini sil" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
Pozisiyayı göstərmək üçün obyekti seçin və "Görünmə nöqtəsi əlavə et" düyməsini basın.
Sonra obyekti köçürə və ya silə bilərsiniz.
Pozisiyalar telehubun mərkəzi ilə əlaqəlidir.
Seçilmiş bir şeyi dünyada vurğulamaq üçün siyahıdan elementi seçin.
Yerləşməni göstərmək üçün obyekti seçin və "Əlavə et" düyməsini basın. Sonra obyekti köçürə və ya silə bilərsiniz.
Yerləşmələr telehubun mərkəzi ilə əlaqəlidir.
Seçilmiş bir şeyi dünyada vurğulamaq üçün bir obyekt seçin.
</text>
</floater>

View File

@ -277,21 +277,21 @@
<text name="label position">
Yerləşim (metr)
</text>
<button name="copy_pos_btn" label="К" tool_tip="Yerləşməni köçürt"/>
<button name="paste_pos_btn" label="В" tool_tip="Yerləşməni yapışdır"/>
<button name="paste_pos_clip_btn" label="в" tool_tip="Yerləşməni buferdən daxil et"/>
<button name="copy_pos_btn" label="K" tool_tip="Yerləşməni köçürt"/>
<button name="paste_pos_btn" label="Y" tool_tip="Yerləşməni yapışdır"/>
<button name="paste_pos_clip_btn" label="y" tool_tip="Yerləşməni buferdən daxil et"/>
<text name="label size">
Ölçü (metr)
</text>
<button name="copy_size_btn" label="К" tool_tip="Ölçünü köçürt"/>
<button name="paste_size_btn" label="В" tool_tip="Ölçünü yapışdır"/>
<button name="paste_size_clip_btn" label="в" tool_tip="Ölçünü buferdən daxil et"/>
<button name="copy_size_btn" label="K" tool_tip="Ölçünü köçürt"/>
<button name="paste_size_btn" label="Y" tool_tip="Ölçünü yapışdır"/>
<button name="paste_size_clip_btn" label="y" tool_tip="Ölçünü buferdən daxil et"/>
<text name="label rotation">
Döngə (dərəcə)
</text>
<button name="copy_rot_btn" label="К" tool_tip="Döngəni köçürt"/>
<button name="paste_rot_btn" label="В" tool_tip="Döngəni yapışdır"/>
<button name="paste_rot_clip_btn" label="в" tool_tip="Döngəni buferdən daxil et"/>
<button name="copy_rot_btn" label="K" tool_tip="Döngəni köçürt"/>
<button name="paste_rot_btn" label="Y" tool_tip="Döngəni yapışdır"/>
<button name="paste_rot_clip_btn" label="y" tool_tip="Döngəni buferdən daxil et"/>
<button label="Köçürt" name="copy_params_btn" tool_tip="Seçimləri buferə köçürt"/>
<button label="Yapışdır" name="paste_params_btn" tool_tip="Seçimləri buferdən yapışdır"/>
<combo_box name="comboBaseType">
@ -577,7 +577,7 @@ Aşğ. ↔ Əaşğ.
Sahə: [AREA] m²
</text>
<button label="Torpaq haqqında" label_selected="Torpaq haqqında" name="button about land"/>
<check_box label="Показать владельцев" name="checkbox show owners" tool_tip="Цвет участка в зависимости от типа владения: &#10;&#10;Зеленый = ваша земля &#10;Голубой = земля вашей группы &#10;Красный = чужая земля &#10;Желтый = для продажи &#10;Фиолетовый = для аукциона &#10;Серый = общая"/>
<check_box label="Sahibləri göstər" name="checkbox show owners" tool_tip="Mülkiyyət növündən asılı olaraq sahə rəngi: &#10;&#10;Yaşıl = torpağınızdır &#10;Göy = qrupunuzun torpağı &#10;Qırmızı = yad torpaq &#10;Sarı = satış üçün &#10;Bənövşəyi = hərrac üçün &#10;Boz = ümumi"/>
<text name="label_parcel_modify">
Sahəni dəyişdir
</text>

View File

@ -25,7 +25,7 @@
URL-ünvanlar
</floater.string>
<floater.string name="memory">
Yaddaş (КБ)
Yaddaş (KB)
</floater.string>
<text name="title_text">
Yüklənir...

View File

@ -12,7 +12,7 @@
<text name="external_tos_required">
Davam etmək üçün https://my.secondlife.com saytına daxil olun, hesabınıza giriş edin və Xidmət Şərtlərini qəbul edin. Təşəkkürlər!
</text>
<check_box label="" name="agree_chk"/>
<check_box label="Oxudum və razılaşdım" name="agree_chk"/>
<text name="agree_list">
Mən Second Life istifadəçi müqaviləsinin, münaqişələrin həllinə dair şərtlərin və konfidensiallığa dair tələblərinin, həmçinin qrup və ya sinif tələblərinin münaqişələrin həlli üçün imtina edilməsini qəbul edirəm.
</text>

View File

@ -4,7 +4,7 @@
Bing appID açarı təsdiqlənməyib. Yenidən cəhd edin.
</string>
<string name="google_api_key_not_verified">
Ключ Google API açarı təsdiqlənməyib. Yenidən cəhd edin.
Google API açarı təsdiqlənməyib. Yenidən cəhd edin.
</string>
<string name="bing_api_key_verified">
Bing appID açarı təsdiqlənib.
@ -45,11 +45,11 @@
<text name="bing_api_key_label">
Bing [http://www.bing.com/developers/createapp.aspx AppID]:
</text>
<!-- <button label="Подтвердить" name="verify_bing_api_key_btn"/> -->
<button label="Təsdiq et" name="verify_bing_api_key_btn"/>
<text name="google_api_key_label">
Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API açarı]:
</text>
<!-- <button label="Подтвердить" name="verify_google_api_key_btn"/> -->
<button label="Təsdiq et" name="verify_google_api_key_btn"/>
<text name="google_links_text">
[http://code.google.com/apis/language/translate/v2/pricing.html Qiymətlər] | [https://code.google.com/apis/console Statistika]
</text>

View File

@ -106,7 +106,7 @@
Roxanne
</string>
<string name="effect_Rumble">
Урчание
Bozarma
</string>
<string name="effect_Sabrina">
Sabrina

View File

@ -10,7 +10,7 @@
<menu_item_call label="Skeleti sıfırla" name="Reset Skeleton"/>
<menu_item_call label="Skelet və animasiyanı sıfırla" name="Reset Skeleton And Animations"/>
<menu_item_call label="Meş LOD sıfırlanması" name="Reset Mesh LOD" />
<context_menu label="Управление" name="Annoyance">
<context_menu label="İdarə" name="Annoyance">
<menu_item_call label="Blokla" name="Avatar Mute"/>
<menu_item_call label="Blokdan çıxart" name="Avatar Unmute"/>
<menu_item_call label="Şikayət" name="abuse"/>

View File

@ -23,7 +23,7 @@
<context_menu label="Moderator seçimləri" name="Moderator Options">
<menu_item_call label="Mətni söhbətə icazə ver" name="AllowTextChat"/>
<menu_item_call label="Mətni söhbəti qadağan et" name="ForbidTextChat"/>
<menu_item_call label="Səsli söhbəti qadağan et"name="ModerateVoiceMuteSelected"/>
<menu_item_call label="Səsli söhbəti qadağan et" name="ModerateVoiceMuteSelected"/>
<menu_item_call label="Səsli söhbətə icazə ver" name="ModerateVoiceUnMuteSelected"/>
</context_menu>
<menu_item_call label="Qadağan et" name="BanMember"/>

View File

@ -24,5 +24,5 @@
<menu_item_check label="Tam adı: Göstərilən adı (İstifadəçi adı) kimi" name="format_displayname_username" />
<menu_item_check label="Axtarış filterini göstər" name="friend_filter" />
</menu>
<menu_item_check label="Статус онлайн для друзей" name="GlobalOnlineStatusToggle" />
<menu_item_check label="Dostlar üçün daxilolma statusu" name="GlobalOnlineStatusToggle" />
</context_menu>

View File

@ -17,7 +17,7 @@
<menu_item_call label="Yeni əlcəklər" name="New Gloves"/>
<menu_item_call label="Yeni mayka" name="New Undershirt"/>
<menu_item_call label="Yenu tuman" name="New Underpants"/>
<menu_item_call label="Yeni alfaа" name="New Alpha"/>
<menu_item_call label="Yeni alfa" name="New Alpha"/>
<menu_item_call label="Yeni fizika" name="New Physics"/>
<menu_item_call label="Yeni döymə" name="New Tattoo"/>
</menu>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="IMChiclet P2P Menu">
<menu_item_call label="Profili göstər" name="Show Profile"/>
<menu_item_call label="Dost əlavə et"name="Add Friend"/>
<menu_item_call label="Dost əlavə et" name="Add Friend"/>
<menu_item_call label="Sessiyanı göstər" name="Send IM"/>
<menu_item_call label="Sessiyanı bitir" name="End Session"/>
</menu>

View File

@ -9,7 +9,7 @@
<menu_item_call label="Don" name="Skirt"/>
<menu_item_call label="Ayaqqabı" name="Shoes"/>
<menu_item_call label="Corablar" name="Socks"/>
<menu_item_call label="Куртку" name="Jacket"/>
<menu_item_call label="Pencək" name="Jacket"/>
<menu_item_call label="Əlcəklər" name="Gloves"/>
<menu_item_call label="Mayka" name="Self Undershirt"/>
<menu_item_call label="Tuman" name="Self Underpants"/>
@ -18,7 +18,7 @@
<menu_item_call label="Bütün paltarı" name="All Clothes"/>
</context_menu>
<context_menu label="Ayır" name="Inspect Self Detach"/>
<menu_item_call label="Отделить все" name="Detach All"/>
<menu_item_call label="Hamısını ayır" name="Detach All"/>
</context_menu>
<menu_item_call label="Geyimi dəyiş" name="Chenge Outfit"/>
<menu_item_call label="Geyimi dəyişdir" name="Edit Outfit"/>

View File

@ -111,7 +111,7 @@
<menu_item_call label="İM Göndər" name="Send Instant Message"/>
<menu_item_call label="Teleport təklif et" name="Offer Teleport..."/>
<menu_item_call label="Teleport tələb et" name="Request Teleport..."/>
<menu_item_call label="Начать конференц чат" name="Conference Chat"/>
<menu_item_call label="Konfrans söhbətə başla" name="Conference Chat"/>
<menu_item_call label="Aktivləşdirm" name="Activate"/>
<menu_item_call label="Deaktivləşdir" name="Deactivate"/>
<menu_item_call label="Ayrı saxla" name="Save As"/>
@ -125,8 +125,8 @@
<menu_item_call label="Teksturasını yenilə" name="Texture Refresh Attachment" />
<menu_item_call label="Özündən ayır" name="Detach From Yourself"/>
<menu_item_call label=ıxart" name="Take Off"/>
<menu_item_call name="Settings Apply Local" label="Применить только к себе"/>
<menu_item_call name="Settings Apply Parcel" label="Применить к Участку"/>
<menu_item_call name="Settings Apply Local" label="Yalnız özümə tətbiq et"/>
<menu_item_call name="Settings Apply Parcel" label="Sahəyə tətbiq et"/>
<menu_item_call label="Ticarət mərkəzinin məhsul siyahılarına köçürt" name="Marketplace Copy"/>
<menu_item_call label="Ticarət mərkəzinin məhsul siyahılarına daşı" name="Marketplace Move"/>
<menu_item_call label="--seçim yoxdur--" name="--no options--"/>

View File

@ -40,5 +40,4 @@
<menu_item_check label="Heçbiri" name="None"/>
</menu>
</menu>
</menu>
</menu_bar>

View File

@ -8,7 +8,7 @@
<menu_item_call label="Şəkil çək" name="take_snapshot"/>
<menu_item_call label="Şəkili sil" name="remove_photo"/>
<context_menu label="Yeni paltar" name="New Clothes">
<menu_item_call label="Yeni köynəkа" name="New Shirt"/>
<menu_item_call label="Yeni köynək" name="New Shirt"/>
<menu_item_call label="Yeni şalvar" name="New Pants"/>
<menu_item_call label="Yeni ayaqqabı" name="New Shoes"/>
<menu_item_call label="Yeni corablar" name="New Socks"/>

View File

@ -17,7 +17,7 @@
<menu_item_call label="Qrupdan çıxart" name="EjectSelected"/>
<menu_item_call label="Mətni söhbətə icazə ver" name="AllowTextChat"/>
<menu_item_call label="Mətni söhbəti qadağan et" name="ForbidTextChat"/>
<menu_item_call label="Səsli söhbəti qadağan et"name="ModerateVoiceMuteSelected"/>
<menu_item_call label="Səsli söhbəti qadağan et" name="ModerateVoiceMuteSelected"/>
<menu_item_call label="Səsli söhbətə icazə ver" name="ModerateVoiceUnMuteSelected"/>
<menu_item_call label="Hamının səsli söhbətini qadağan et" name="ModerateVoiceMute"/>
<menu_item_call label="Hamının səsli söhbətinə icazə ver" name="ModerateVoiceUnmute"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu name="menu_blocked_plus">
<menu_item_call label="Sakini adı ilə blokla..." name="block_resident_by_name" />
<menu_item_call label="Obyekti adına görə blokla..."name="block_object_by_name" />
<menu_item_call label="Obyekti adına görə blokla..." name="block_object_by_name" />
</toggleable_menu>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu name="menu_people_contact_sets_add">
<menu_item_call label="Dəst əlavə et..." name="add_set" />
<menu_item_call label="Kontakt əlavə et..."name="add_contact" />
<menu_item_call label="Kontakt əlavə et..." name="add_contact" />
</toggleable_menu>

View File

@ -2,5 +2,5 @@
<toggleable_menu name="menu_group_plus">
<menu_item_check label="Tarixə görə sırala" name="sort_most" />
<menu_item_check label="Adına görə sırala" name="sort_name" />
<menu_item_check name="view_icons" label="Показать иконки" />
<menu_item_check name="view_icons" label="Nişanları göstər" />
</toggleable_menu>

View File

@ -18,7 +18,7 @@
<pie_slice label="Fizika" name="Self Physics"/>
<pie_slice label="Alfa" name="Self Alpha"/>
</pie_menu>
<pie_slice label="Юбку" name="Skirt"/>
<pie_slice label="Don" name="Skirt"/>
</pie_menu>
<pie_menu name="Pie Object Detach HUD"/>
<pie_menu label="Ayır &gt;" name="Pie Object Detach">
@ -50,7 +50,7 @@
<pie_slice label="Jestlər..." name="Gestures"/>
<pie_menu label="Görünüş &gt;" name="Appearance &gt;">
<pie_slice label="Forma" name="Edit My Shape"/>
<pie_menu name="ResetMenu" label="Сброс &gt;">
<pie_menu name="ResetMenu" label="Sıfırla &gt;">
<pie_slice label="Skel. &amp; Anim." name="Reset Skeleton And Animations"/>
<pie_slice label="Skelet" name="Reset Skeleton"/>
<pie_slice label="Mesh LOD" name="Reset Mesh LOD"/>

View File

@ -40,7 +40,7 @@
<pie_slice label="Tekstur.yenilə" name="Texture Refresh"/>
<pie_slice label="Skelet" name="Reset Skeleton"/>
</pie_menu>
<pie_menu name="DerenderMenu" label="Неотображать &gt;">
<pie_menu name="DerenderMenu" label="Göstərmə &gt;">
<pie_slice label="Həmişə" name="DerenderPermanent"/>
<pie_slice label="Müvəqqəti" name="Derender"/>
</pie_menu>

View File

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu name="Avatar Profile Menu">
<menu_item_call label="İM" name="im"/>
<menu_item_call label="Teleport təklif et" name="offer_teleport"/>
<menu_item_call label="Teleport sorğula" name="request_teleport"/>
<menu_item_call label="Səsli zəng" name="voice_call"/>
<menu_item_call label="Söhbət jurnalına bax..." name="chat_history"/>
<menu_item_call label="Dost əlavə et"name="add_friend"/>
<menu_item_call label="Dostluqdan sil" name="remove_friend"/>
<menu_item_call label="Qrupa dəvət et..." name="invite_to_group"/>
<menu_item_call label="İcazələr" name="agent_permissions"/>
<menu_item_call label="Xəritə" name="map"/>
<menu_item_call label="Paylaş" name="share"/>
<menu_item_call label="Ödə" name="pay"/>
<menu_item_check label="Blokla/Blokdan çıxart" name="block_unblock"/>
<menu_item_call label="Göstərilən adı köçürt" name="copy_display_name"/>
<menu_item_call label="İstifadəçi adını köçürt" name="copy_name"/>
<menu_item_call label="İdentifikasiyasını köçürt" name="copy_id"/>
<menu_item_call label="İM" name="im" />
<menu_item_call label="Teleport təklif et" name="offer_teleport" />
<menu_item_call label="Teleport sorğula" name="request_teleport" />
<menu_item_call label="Səsli zəng" name="voice_call" />
<menu_item_call label="Söhbət jurnalına bax..." name="chat_history" />
<menu_item_call label="Dost əlavə et" name="add_friend" />
<menu_item_call label="Dostluqdan sil" name="remove_friend" />
<menu_item_call label="Qrupa dəvət et..." name="invite_to_group" />
<menu_item_call label="İcazələr" name="agent_permissions" />
<menu_item_call label="Xəritə" name="map" />
<menu_item_call label="Paylaş" name="share" />
<menu_item_call label="Ödə" name="pay" />
<menu_item_check label="Blokla/Blokdan çıxart" name="block_unblock" />
<menu_item_call label="Göstərilən adı köçürt" name="copy_display_name" />
<menu_item_call label="İstifadəçi adını köçürt" name="copy_name" />
<menu_item_call label="İdentifikasiyasını köçürt" name="copy_id" />
</toggleable_menu>

View File

@ -163,32 +163,6 @@
</menu>
</menu>
<!-- <menu label="Положение солнца" name="Environment Settings">
<menu_item_check label="Восход" name="Sunrise"/>
<menu_item_check label="Полдень" name="Noon"/>
<menu_item_check label="Закат" name="Sunset"/>
<menu_item_check label="Полночь" name="Midnight"/>
<menu_item_check label="Время острова" name="Revert to Region Default"/>
</menu>
<menu label="Редактор окружающей среды" name="Environment Editor">
<menu_item_call label="Параметры среды..." name="Environment Settings"/>
<menu name="Water Presets" label="Предустановки воды">
<menu_item_call label="Новая предустановка..." name="new_water_preset"/>
<menu_item_call label="Редактировать предустановку..." name="edit_water_preset"/>
<menu_item_call label="Удалить предустановку..." name="delete_water_preset"/>
</menu>
<menu name="Sky Presets" label="Предустановки неба">
<menu_item_call label="Новая предустановка..." name="new_sky_preset"/>
<menu_item_call label="Редактировать предустановку..." name="edit_sky_preset"/>
<menu_item_call label="Удалить предустановку..." name="delete_sky_preset"/>
</menu>
<menu name="Day Presets" label="Предустановки дня">
<menu_item_call label="Новая предустановка..." name="new_day_preset"/>
<menu_item_call label="Редактировать предустановку..." name="edit_day_preset"/>
<menu_item_call label="Удалить предустановку..." name="delete_day_preset"/>
</menu>
</menu> -->
<menu name="photo_and_video" label="Şəkil və video">
<menu_item_call label="Şəkil alətləri" name="phototools_item_call"/>
<menu_item_call label="Kamera alətləri" name="cameratools_item_call"/>

View File

@ -94,7 +94,7 @@
</mimetype>
<mimetype name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
Видео (QuickTime)
Video (QuickTime)
</label>
</mimetype>
<mimetype name="application/javascript">

View File

@ -26,16 +26,10 @@ Xəta təfərrüatları: &quot;[_NAME]&quot; adlı bildiriş notifications.xml f
<notification name="TutorialNotFound">
Hazırda heç bir dərslik yoxdur
</notification>
<notification name="GenericAlert">
[MESSAGE]
</notification>
<notification name="GenericAlertYesCancel">
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Ləğv et" yestext="Bəli"/>
</notification>
<notification name="GenericAlertOK">
[MESSAGE]
</notification>
<notification name="BadInstallation">
[APP_NAME] yenilənərkən xəta baş verdi. Klientin [https://www.firestormviewer.org/downloads ən son versiyasını yükləyin].
</notification>
@ -195,7 +189,7 @@ Zəhmət olmasa, bir element seçin və yenidən cəhd edin.
</notification>
<notification name="AllowMultipleViewers">
Birdən çox tətbiqin [APP_NAME] icrası dəstəklənmir. Bu, tekstur keşinin münaqişələrinə, zədələnmə, performans və vizual yavaşlamaya səbəb ola bilər.
<usetemplate name="okbutton" yestext="ОК"/>
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="GrantModifyRights">
Başqa sakinə dəyişdirmə hüquqlarının verilməsi ona HƏR obyektinizi dəyişdirməyə, silməyə və ya götürməyə imkan verəcək. Bu icazənin verilməsində ÇOX diqqətli olun.
@ -421,7 +415,7 @@ Silahın işləməsi üçün skriptlər icra edilməlidir.
Birdən çox üz seçildi.
Bu hərəkəti davam etdirsəniz, obyektin hər seçilmiş üzünə ayrıca media nümunəsi yerləşdiriləcək.
Medianı yalnız bir üzdə yerləşdirmək üçün &quot;Üzü seçmək&quot; əmrini seçin və obyektin istədiyiniz üzünə basın, sonra &quot;Əlavə et&quot; düyməsini basın.
<usetemplate ignoretext="Медиа будет помещено на несколько выбранных граней" name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
<usetemplate ignoretext="Media bir neçə seçilmiş üzün üstünə tətbiq olunacaq" name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
</notification>
<notification name="MustBeInParcel">
Teleportasiya nöqtəsini təyin etmək üçün siz sahədə olmalısınız.
@ -651,7 +645,7 @@ Obyekt əhatə dairəsindən kənarda ola və ya silinə bilər.
</notification>
<notification name="MediaFileDownloadUnsupported">
Siz [APP_NAME] tərəfindən dəstəklənməyən fayl endirilməsi üçün sorğu göndərmisiniz.
<usetemplate ignoretext="Предупреждать о загрузке неподдерживаемых файлов" name="okignore" yestext="Bəli"/>
<usetemplate ignoretext="Dəstəklənməyən faylları endirmək barədə xəbərdarlıq edin" name="okignore" yestext="Bəli"/>
</notification>
<notification name="CannotWriteFile">
[[FILE]] faylını yazmaq mümkün deyil
@ -777,7 +771,7 @@ Bütün satın alınan əşyaları eyni bölgəyə köçürün.
<notification name="PromptGoToCurrencyPage">
[EXTRA]
Перейти на [_URL] для получения информации о покупке L$?
L$ almaq haqqında məlumat üçün [_URL] ünvanına keçmək istədiyinə əminsiniz?
<url name="url">
http://secondlife.com/app/currency/
</url>
@ -1196,7 +1190,7 @@ Bu, adətən müvəqqəti bir problemdir. Seçimləri düzəldin və bir neçə
Qrup üçün torpaq almaq mümkün deyil:
Sizin aktiv qrupunuz üçün torpaq almaq hüququnuz yoxdur.
</notification>
<notification label="Добавить друга" name="AddFriendWithMessage">
<notification label="Dost əlavə et" name="AddFriendWithMessage">
Dostlar xəritədə bir-birlərini izləmək və onlayn statuslarını görmək üçün icazə verə bilərlər.
[NAME] adlı şəxsə dostluq sorğusu göndərilsin?
@ -1421,9 +1415,9 @@ Bu [AREA] m² torpaq &quot;[GROUP_NAME]&quot; qrupuna ötürülsün?
Ekran seçimləri səviyyəsi təhlükəsiz olaraq təyin edilib, çünki -safe seçimi müəyyən edilib.
</notification>
<notification name="DisplaySetToRecommendedGPUChange">
Установлен рекомендуемый уровень настроек отображения, так как графическая карта изменена:
с &quot;[LAST_GPU]&quot;
на &quot;[THIS_GPU]&quot;
Qrafik kartı dəyişdirildiyinə görə tövsiyə olunmuş göstərmə profili təyin olunub:
əvvəlki &quot;[LAST_GPU]&quot;
cari &quot;[THIS_GPU]&quot;
</notification>
<notification name="DisplaySetToRecommendedFeatureChange">
Göstərmə alt sistemi dəyişdirildiyi üçün tövsiyə olunan displey seçimləri səviyyəsi təyin edilir.
@ -1635,7 +1629,7 @@ Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
[AGENT] torpaq sahibini bloklananlar siyahısına əlavə etmək mümkün deyil.
</notification>
<notification name="GroupIsAlreadyInList">
&lt;nolink&gt;[GROUP]&lt;/nolink&gt; уже находится в списке допущенных групп.
&lt;nolink&gt;[GROUP]&lt;/nolink&gt; artıq icazə verilən qruplar siyahısındadır.
</notification>
<notification name="AgentIsAlreadyInList">
[AGENT] artıq [LIST_TYPE] siyahınızdadır.
@ -1816,12 +1810,12 @@ Bütün gələn dostluq sorğularını rədd et rejimi aktivdir.
</notification>
<notification name="RejectAllGroupInvitesModeSet">
Bütün gələn qrup dəvətlərini rədd et rejimi aktivdir.
Входящие групповые приглашения от кого-либо теперь будут отклоняться автоматически. Bu səbəbə görə sizə məlumat verilməyəcək.
Hər kəsdən gələn qrup dəvətləri indi avtomatik olaraq rədd ediləcək. Bu səbəbə görə sizə məlumat verilməyəcək.
<usetemplate ignoretext="Bütün qrup dəvətlərini rədd etmək üçün statusumu dəyişirəm" name="okignore" yestext="Bəli"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
Qrupların maksimum sayına çatdınız. Qoşulmazdan əvvəl hər hansı bir qrupdan ayrılın və ya təklifi rədd edin.
[NAME] пригласил вас вступить в группу как участник.
[NAME] qrupa üzv kimi qoşulmaq təklif etdi.
<usetemplate name="okcancelbuttons" notext="Rədd edt" yestext="Qoşul"/>
</notification>
<notification name="JoinedTooManyGroups">
@ -1979,7 +1973,7 @@ Onu silmək istərdinizmi?
[HISTORY_ENTRY] yerinə teleport etmək istədiyinizə əminsiniz?
<usetemplate ignoretext="Tarixçədə bir yerə teleportasiyanı təsdiqləyin" name="okcancelignore" notext="Ləğv et" yestext="Teleport ol"/>
</notification>
<notification label="Сообщение всем в моем землевладении" name="MessageEstate">
<notification label="Torpaq mülkiyyətimdə hər kəsə mesaj" name="MessageEstate">
Hazırda mülkünüzdə olan bütün sakinlər üçün qısa bir elan daxil edin.
<form name="form">
<button name="OK" text="OK"/>
@ -2296,7 +2290,7 @@ Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
Eyni zamanda bir neçə obyektin məzmununu ala bilməzsiniz.
Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
</notification>
<notification label="Нельзя купить содержимое" name="BuyContentsOneOwner">
<notification label="Məzmunu almaq mümkün deyil" name="BuyContentsOneOwner">
Eyni zamanda müxtəlif sahiblərdən obyektləri ala bilməzsiniz.
Zəhmət olmasa, bir obyekt seçin və yenidən cəhd edin.
</notification>
@ -2407,7 +2401,7 @@ Element(lər) daşınılsın?
</notification>
<notification name="ConfirmAddingChatParticipants">
Mövcud söhbətə iştirakçı əlavə etdiyiniz zaman yeni söhbət yaradılacaq. Bütün iştirakçılar yeni söhbət haqqında bildirişlər alacaqlar.
<usetemplate ignoretext="Söhbət iştirakçılarının əlavə edilməsini təsdiqləyin" name="okcancelignore" notext="Ləğv et" yestext="ОК"/>
<usetemplate ignoretext="Söhbət iştirakçılarının əlavə edilməsini təsdiqləyin" name="okcancelignore" notext="Ləğv et" yestext="OK"/>
</notification>
<notification name="ConfirmQuit">
Çıxmaq istədiyinizdə əminsiniz?
@ -2680,8 +2674,8 @@ Domen: [MEDIADOMAIN]
URL: [MEDIAURL]
<form name="form">
<button name="Do Now" text="İndi [ACTION]"/>
<button name="RememberDomain" text="[CONDITION] Разрешить этому домену"/>
<button name="RememberURL" text="[CONDITION] Разрешить этому URL"/>
<button name="RememberDomain" text="[CONDITION] Bu domenə icazə ver"/>
<button name="RememberURL" text="[CONDITION] Bu URL üçün icazə ver"/>
</form>
</notification>
<notification name="MediaAlertSingle">
@ -2712,9 +2706,9 @@ URL: [AUDIOURL]
Domen: [AUDIODOMAIN]
URL: [AUDIOURL]
<form name="form">
<button name="Do Now" text="[ACTION] Сейчас"/>
<button name="RememberDomain" text="[CONDITION] Разрешить этому домену"/>
<button name="RememberURL" text="[CONDITION] Разрешить этому URL"/>
<button name="Do Now" text="[ACTION] İndi"/>
<button name="RememberDomain" text="[CONDITION] Bu domenə icazə ver"/>
<button name="RememberURL" text="[CONDITION] Bu URL üçün icazə ver"/>
</form>
</notification>
<notification name="AudioAlertSingle">
@ -2808,7 +2802,7 @@ Mövzu: [SUBJECT], Mesaj: [MESSAGE]
Əsas əmlaklar arasında avadanlıq siyahısı göndərmək mümkün deyil.
</notification>
<notification name="UnableToLoadNotecard">
Невозможно загрузить заметку.
Qeydi yükləmək mümkün deyil.
Yenidən cəhd edin.
</notification>
<notification name="ScriptMissing">
@ -2893,21 +2887,6 @@ Daha kiçik bir sahə seçməyə çalışın.
<notification name="NoContentToSearch">
Axtarmaq üçün ən azı bir növ məzmun seçin (&quot;Ümumi&quot;, &quot;Ortam&quot; vəya &quot;Yetkin&quot;).
</notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
<notification name="FlickrConnect">
[MESSAGE]
</notification>
<notification name="PaymentReceived">
[MESSAGE]
</notification>
<notification name="PaymentSent">
[MESSAGE]
</notification>
<notification name="PaymentFailure">
[MESSAGE]
</notification>
<notification name="EventNotification">
Hadisə bildirişi:
@ -2993,7 +2972,7 @@ Burada uça bilməzsiniz.
<usetemplate name="okbutton" yestext="Regionu bərpa et"/>
</notification>
<notification name="DynamicPathfindingDisabled">
В этом регионе не разрешен динамический поиск пути. Возможны нарушения работы скриптовых объектов с использованием вызовов LSL поиска пути.
Bu regionda dinamik yol axtarışı söndürülüb. Yol axtaran LSL çağırışlarından istifadə edən skriptli obyektlər bu regionda gözlənildiyi kimi işləməyə bilər.
</notification>
<notification name="PathfindingCannotRebakeNavmesh">
Bir xəta baş verdi. Şəbəkə və ya server problemi ola bilər və ya sizin tikinti icazəniz yoxdur. Bəzən sistemdən çıxmaq və yenidən daxil olmaq bu problemi həll edə bilər.
@ -3662,7 +3641,7 @@ Aşağıdakı sakinlərlə:
Aşağıdakı əşyalarla paylaşmaq istədiyinizə əminsiniz?
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
<usetemplate name="okcancelbuttons" notext="Ləğv et" yestext="ОК"/>
<usetemplate name="okcancelbuttons" notext="Ləğv et" yestext="OK"/>
</notification>
<notification name="ItemsShared">
Əşyalar uğurla paylaşıldı.
@ -3740,10 +3719,10 @@ https://wiki.firestormviewer.org/fs_voice
<usetemplate ignoretext="Səs serverinə qoşulma zamanı problemlər yarandı" name="okignore" yestext="Bəli"/>
</notification>
<notification name="NoVoiceConnect-GIAB">
Проблемы соединения с речевым сервером:
Səs serverinə qoşulmaq mümkün deyil:
Голосовое общение будет недоступно.
Проверьте настройки сети и брандмауэра.
Səsli rabitə mövcud olmayacaq.
Zəhmət olmasa şəbəkənizi və təhlükəsizlik divarı quraşdırmanızı yoxlayın.
[https://wiki.firestormviewer.org/fs_voice]
</notification>
<notification name="AvatarRezLeftNotification">
@ -3811,8 +3790,7 @@ Görünüş sahəsini fırlatmaq üçün dünyanın istənilən yerinə basın v
Burada fərdiləşdirilə bilən görünülən adınızı təyin edin. Bu, dəyişdirilə bilməyən unikal istifadəçi adınıza əlavədir. Siz seçimlərdə digər insanların adlarını necə gördüyünüzü dəyişə bilərsiniz.
</notification>
<notification label="Kamera" name="HintView">
Для изменения вида из камеры используйте инструменты &quot;Вращение&quot; и &quot;Сдвиг&quot;. При нажатии клавиши Esc или переходе вид из камеры возвращается к исходному состоянию.
Kamera görünüşünüzü dəyişdirmək üçün Fırlatma və Sürüşdürmə idarəetmə elementlərindən istifadə edin. Esc düyməsinə basmaqla və ya gəzməklə görünüşünüzü sıfırlayın.
Kamera görünüşünüzü dəyişdirmək üçün &quot;Döndər&quot;&quot;Sürüşdür&quot; idarəetmə elementlərindən istifadə edin. Esc düyməsinə basmaqla və ya gəzməklə görünüşünüzü sıfırlayın.
</notification>
<notification label="Avadanlıq siyahısı" name="HintInventory">
Elementləri tapmaq üçün avadanlıq siyahınızı yoxlayın. Ən yeni elementləri Son pəncərəsində asanlıqla tapmaq olar.
@ -3863,7 +3841,6 @@ Görünüş sahəsini fırlatmaq üçün dünyanın istənilən yerinə basın v
Proksi seçimləri [APP_NAME] tətbiqini yenidən başlatdıqdan sonra qüvvəyə minir.
</notification>
<notification name="AuthRequest">
Сайт по адресу &quot;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&quot; в царстве &quot;in realm &quot;[REALM]&quot; требует имени пользователя и пароля.
&quot;[REALM]&quot; &quot; sahəsində &quot; &quot;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&quot; saytı istifadəçi adı və parol tələb edir.
<form name="form">
<input name="username" text="İstifadəçi adı"/>
@ -3961,7 +3938,7 @@ Davam edilsin?
<notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
Bəzi seçilmiş keçid dəstləri keçiddə icazə məhdudiyyətlərinə görə '[REQUESTED_TYPE]' olaraq təyin edilə bilməz. Bu keçid dəstləri əvəzinə "[RESTRICTED_TYPE]" olaraq təyin ediləcək.
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Тип использования этих наборов связей не изменится.
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Bu keçid dəstlərinin istifadə növü dəyişilməyəcək.
Davam edilsin?
<usetemplate ignoretext="Bəzi seçilmiş link dəstləri keçidlər dəstində icazə məhdudiyyətləri və forma qeyri-qabarıq olduğu üçün təyin edilə bilməz." name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
@ -3971,7 +3948,7 @@ Davam edilsin?
Bəzi seçilmiş keçid dəstləri keçiddə icazə məhdudiyyətlərinə görə '[REQUESTED_TYPE]' olaraq təyin edilə bilməz. Bu keçid dəstləri əvəzinə "[RESTRICTED_TYPE]" olaraq təyin ediləcək.
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Тип использования этих наборов связей не изменится.
Bəzi seçilmiş keçid dəstləri '[REQUESTED_TYPE]' olaraq təyin edilə bilməz, çünki forma qabarıq deyil. Bu keçid dəstlərinin istifadə növü dəyişilməyəcək.
Davam edilsin?
<usetemplate ignoretext="Bəzi seçilmiş keçid dəstlərinin fantom bayrağı dəyişdiriləcək, digərləri isə keçid setindəki icazə məhdudiyyətləri və forma qeyri-qabarıq olduğu üçün təyin edilə bilməz." name="okcancelignore" notext="Ləğv et" yestext="Bəli"/>
@ -4094,9 +4071,6 @@ Intel drayver veb-saytını yoxlamaq istəyirsiniz?
[SYSINFO]
<usetemplate name="okcancelbuttons" yestext="Göndər" notext="Ləğv et"/>
</notification>
<notification name="BlockLoginInfo">
[REASON]
</notification>
<notification name="TestversionExpired">
[APP_NAME] tətbiqinin bu sınaq versiyasının vaxtı keçib və daha istifadə edilə bilməz.
</notification>
@ -4247,11 +4221,11 @@ Cəhd ləğv edildi.
</notification>
<notification name="PathfindingReturnMultipleItems">
Siz [NUM_ITEMS] elementi qaytarırsınız. Davam etmək istədiyinizə əminsiniz?
<usetemplate ignoretext="Вы уверены, что хотите вернуть несколько объектов?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
<usetemplate ignoretext="Bir neçə obyekti qaytarmaq istədiyiniə əminsiniz?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
</notification>
<notification name="PathfindingDeleteMultipleItems">
Siz [NUM_ITEMS] elementi silirsiniz. Davam etmək istədiyinizə əminsiniz?
<usetemplate ignoretext="Вы уверены, что хотите удалить несколько объектов?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
<usetemplate ignoretext="Bir neçə obyekti silmək istədiyiniə əminsiniz?" name="okcancelignore" notext="Xeyr" yestext="Bəli"/>
</notification>
<notification name="AvatarFrozen">
[AV_FREEZER] sizi dondurdu. Siz hərəkət edə və ya dünya ilə əlaqə saxlaya bilməzsiniz.
@ -4391,7 +4365,7 @@ O, dolu ola və ya tezliklə yenidən başlaya bilər.
Seçilmiş obyekti saxlamaq mümkün deyil: &quot;[OBJ_NAME]&quot; obyekti köçürülmür.
</notification>
<notification name="NoModNoTaking">
Нельзя забрать выбранное: вам не разрешено изменять объект &quot;[OBJ_NAME]&quot;.
Seçilmişləri götürmək mümkün deyil: &quot;[OBJ_NAME]&quot; obyektinə dəyişiklik etmək icazəniz yoxdur
</notification>
<notification name="RezDestInternalError">
Daxili xəta: naməlum növ təyinat yeri.
@ -4594,7 +4568,7 @@ daşımaq mümkün deyil, çünki siz navigasiya şəbəkəsini region sərhədl
Tələb olunan obyekti yaratmaq mümkün deyil. Region artıq doludur.
</notification>
<notification name="CantCreateAnimatedObjectTooLarge">
НевTələb olunan animasiya obyektini yaratmaq mümkün deyil, çünki o, rig üçbucaq limitini keçib.
Tələb olunan animasiya obyektini yaratmaq mümkün deyil, çünki o, rig üçbucaq limitini keçib.
</notification>
<notification name="CantAttackMultipleObjOneSpot">
Eyni nöqtəyə birdən çox obyekt əlavə edə bilməzsiniz.
@ -4702,10 +4676,10 @@ daşımaq mümkün deyil, çünki siz navigasiya şəbəkəsini region sərhədl
Əlavə edilmiş obyekti yerə atmaq alınmadı: burada yerə atmaq icazəniz yoxdur.
</notification>
<notification name="CantDropAttachmentInsufficientLandResources">
Əlavə edilmiş obyekti yerə atmaq alınmadı: не хватает свободных земельных ресурсов.
Əlavə edilmiş obyekti yerə atmaq alınmadı: boş torpaq resursları çatışmır.
</notification>
<notification name="CantDropAttachmentInsufficientResources">
Əlavə edilmiş obyektləri yerə atmaq alınmadı:: не хватает свободных ресурсов.
Əlavə edilmiş obyektləri yerə atmaq alınmadı: boş resurslar çatışmır.
</notification>
<notification name="CantDropObjectFullParcel">
Obyekti bura atmaq olmaz. Sahə artıq doludur.
@ -4806,7 +4780,7 @@ Daha kiçik bir sahə seçməyə çalışın.
Regionda reklamlara icazə verilmir.
</notification>
<notification name="LandPassExpireSoon">
Ваш пропуск на эту землю скоро закончится.
Bu torpağa icazənamənin müddəti tezliklə bitəcək
</notification>
<notification name="CantSitNoSuitableSurface">
Oturmaq üçün uyğun səth yoxdur. Başqa yerdə cəhd edin.
@ -4964,9 +4938,6 @@ Onlar xətaları həll etmək üçün http://opensimulator.org/wiki/inventory is
<notification name="DefaultObjectPermissions">
Defolt obyekt icazələrini yadda saxlayarkən problem baş verdi: [REASON]. Lütfən, defolt icazələri daha sonra təyin etməyə cəhd edin.
</notification>
<notification name="OutfitPhotoLoadError">
[REASON]
</notification>
<notification name="AddPaymentMethod">
Növbəti səhifədə L$ məbləği seçin və
Sifariş yerləşdir düyməsini basın. Ödəniş zamanı
@ -5203,14 +5174,14 @@ hansı nişandan istifadə etmək istərdiniz?
<usetemplate ignoretext="Mənə bildirin ki, onlayn statusun görünməsinə keçid bir qədər vaxt apara bilər" name="okignore" yestext="Bəli"/>
</notification>
<notification name="RenderVolumeLODFactorWarning">
ВНИМАНИЕ: уровень детализации (LOD) установлен на высокий
XƏBƏRDARLIQ: Dətallaşdırma səviyyəsi (LOD) yüksək olaraq təyin edilib
Для повседневного использования достаточно уровня в диапазоне 1-3.
Попробуйте заменить объекты, которые выглядят деформированными при таких значениях.
Gündəlik istifadə üçün 1-3 aralığında səviyyə kifayətdir.
Bu səviyyələrdə əyri görünən obyektləri əvəz etməyə çalışın.
Уровень LOD > 3: добавляет задержки. Рекомендуется только для фотографии.
Уровень LOD > 4: использовать в особых случаях. Возврат после relog.
Уровень LOD > 8: не имеет реального эффекта. Может вызвать ошибки.
LOD > 3 səviyyəsi: gecikmə əlavə edir. Yalnız şəkil üçün tövsiyə olunur.
LOD > 4 səviyyəsi: xüsusi hallarda istifadə edin. Yenidən daxil olduqdan sonra geri qayıdır.
LOD > 8 səviyyəsi: real təsiri yoxdur. Səhvlərə səbəb ola bilər.
</notification>
<notification name="CurrencyURIOverrideReceived">
Bu bölgə üçüncü tərəf valyuta portalını təyin etməyi seçdi.

View File

@ -7,10 +7,10 @@
<check_box name="ao_default" label="Susmaya görə" tool_tip="Bu animasiya dəstini sistemə daxil olanda başlatmaq." width="20" />
<button name="ao_add" tool_tip="Yeni animasiya qrupu yaratmaq." />
<button name="ao_remove" tool_tip="Bu animasiya dəstini silmək." />
<check_box name="ao_sit_override" label="Oturmaq" tool_tip="Oturma animasiyasını yenidən təyin etmək istəyirsinizsə işarələyin." width="100" />
<check_box name="ao_sit_override" label="Otur" tool_tip="Oturma animasiyasını yenidən təyin etmək istəyirsinizsə işarələyin." width="100" />
<check_box name="ao_smart" label="Ağıllı" tool_tip="Ağıllı rejim, oturmaq animasiyasının obyektin öz animasiyası ilə münaqişə edib-etməyəcəyini müəyyən etməyə çalışır və təyinatını müvəqqəti olaraq söndürür."
left_pad="4" right="-1" height="16" />
<check_box name="ao_disable_stands_in_mouselook" label="Mouselookda Duruşlarını Aradan Qaldır" tool_tip="Əgər öz duruş animasiyanızı saxlamaq istəyirsinizsə, bu nişanı qoyun." width="100" />
<check_box name="ao_disable_stands_in_mouselook" label="Mouselook-da duruşları söndür" tool_tip="Əgər öz duruş animasiyanızı saxlamaq istəyirsinizsə, bu nişanı qoyun." width="100" />
<combo_box name="ao_state_selection_combo" tool_tip="Düzəliş üçün animasiya vəziyyətini seçin." />
<panel name="ao_animation_move_trash_panel" >
<button name="ao_move_up" tool_tip="Seçilmiş animasiyanı siyahıda yuxarıya doğru daşıyın." />

View File

@ -2,5 +2,5 @@
<panel name="camera_preset_item">
<text name="preset_name" value="Susmaya görə"/>
<button name="delete_btn" tool_tip="Öncədən təyini sil"/>
<button name="reset_btn" tool_tip="Susmaya görə olan öncədən təyini sıfırla">
<button name="reset_btn" tool_tip="Susmaya görə olan öncədən təyini sıfırla"/>
</panel>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_eyes_panel">
<panel name="avatar_eye_color_panel">
<texture_picker label="Göz bəbəyi" name="Iris" tool_tip="Şəkil seçmək üçün klikləyin"/>
<texture_picker label="Göz bəbəyi" name="Iris" tool_tip="Şəkil seçmək üçün basın"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">

Some files were not shown because too many files have changed in this diff Show More