Automated merge up from viewer-development into mesh-development
commit
fbc6e5d639
14
.hgtags
14
.hgtags
|
|
@ -53,3 +53,17 @@ a82e5b1e22c7f90e3c7977d146b80588f004ed0d 2.5.0-start
|
|||
345b17e7cf630db77e840b4fe3451bd476d750a3 2.5.0-beta1
|
||||
345b17e7cf630db77e840b4fe3451bd476d750a3 76f586a8e22b
|
||||
0000000000000000000000000000000000000000 76f586a8e22b
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f 2.5.0-beta2
|
||||
7076e22f9f43f479a4ea75eac447a36364bead5a DRTVWR-5_2.2.0-beta1
|
||||
9822eb3e25f7fe0c28ffd8aba45c507caa383cbc DRTVWR-3_2.2.0-beta2
|
||||
b0cd7e150009809a0b5b0a9d5785cd4bb230413a DRTVWR-7_2.2.0-beta3
|
||||
1415e6538d54fd5d568ee88343424d57c6803c2c DRTVWR-8_2.2.0-release
|
||||
a3c12342b1af0951b8aa3b828aacef17fcea8178 DRTVWR-14_2.3.0-beta1
|
||||
db0fe9bb65187f365e58a717dd23d0f4754a9c1d DRTVWR-17_2.3.0-beta2
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-20_2.3.0-beta3
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 DRTVWR-13_2.3.0-release
|
||||
3bc1f50a72e117f4d4ad8d555f0c785ea8cc201e DRTVWR-26_2.4.0-beta1
|
||||
25bd6007e3d2fc15db9326ed4b18a24a5969a46a DRTVWR-27_2.4.0-beta2
|
||||
1ed382c6a08ba3850b6ce9061bc551ddece0ea07 DRTVWR-25_2.4.0-release
|
||||
345b17e7cf630db77e840b4fe3451bd476d750a3 DRTVWR-32_2.5.0-beta1
|
||||
54d772d8687c69b1d773f6ce14bbc7bdc9d6c05f DRTVWR-33_2.5.0-beta2
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ viewer-development.show_changes_since = last_sprint
|
|||
|
||||
# Build Settings
|
||||
viewer-development_coverity.coverity_product = viewer
|
||||
viewer-development_coverity.run_tests = false
|
||||
viewer-development.build_debug_release_separately = true
|
||||
|
||||
# Notifications - to configure email notices, add a setting like this:
|
||||
|
|
|
|||
3
build.sh
3
build.sh
|
|
@ -66,7 +66,8 @@ pre_build()
|
|||
-DRELEASE_CRASH_REPORTING:BOOL=ON \
|
||||
-DLOCALIZESETUP:BOOL=ON \
|
||||
-DPACKAGE:BOOL=ON
|
||||
-DCMAKE_VERBOSE_MAKEFILE:BOOL=TRUE
|
||||
-DCMAKE_VERBOSE_MAKEFILE:BOOL=TRUE \
|
||||
-DLL_TESTS:BOOL="$run_tests"
|
||||
end_section "Pre$variant"
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ Aleric Inglewood
|
|||
VWR-24315
|
||||
VWR-24317
|
||||
VWR-24320
|
||||
VWR-24321
|
||||
VWR-24354
|
||||
VWR-24519
|
||||
SNOW-84
|
||||
|
|
@ -385,9 +386,11 @@ Jonathan Yap
|
|||
STORM-869
|
||||
STORM-785
|
||||
STORM-812
|
||||
STORM-829
|
||||
VWR-17801
|
||||
VWR-24347
|
||||
STORM-844
|
||||
STORM-643
|
||||
Kage Pixel
|
||||
VWR-11
|
||||
Ken March
|
||||
|
|
@ -770,6 +773,7 @@ Twisted Laws
|
|||
STORM-466
|
||||
STORM-467
|
||||
STORM-844
|
||||
STORM-643
|
||||
Vadim Bigbear
|
||||
VWR-2681
|
||||
Vector Hastings
|
||||
|
|
|
|||
|
|
@ -26,6 +26,12 @@
|
|||
|
||||
#include "linden_common.h"
|
||||
|
||||
#include "llmemory.h"
|
||||
|
||||
#if MEM_TRACK_MEM
|
||||
#include "llthread.h"
|
||||
#endif
|
||||
|
||||
#if defined(LL_WINDOWS)
|
||||
# include <windows.h>
|
||||
# include <psapi.h>
|
||||
|
|
@ -37,8 +43,6 @@
|
|||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "llmemory.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
//static
|
||||
|
|
@ -86,6 +90,20 @@ U64 LLMemory::getCurrentRSS()
|
|||
return counters.WorkingSetSize;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLMemory::getWorkingSetSize()
|
||||
{
|
||||
PROCESS_MEMORY_COUNTERS pmc ;
|
||||
U32 ret = 0 ;
|
||||
|
||||
if (GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)) )
|
||||
{
|
||||
ret = pmc.WorkingSetSize ;
|
||||
}
|
||||
|
||||
return ret ;
|
||||
}
|
||||
|
||||
#elif defined(LL_DARWIN)
|
||||
|
||||
/*
|
||||
|
|
@ -132,6 +150,11 @@ U64 LLMemory::getCurrentRSS()
|
|||
return residentSize;
|
||||
}
|
||||
|
||||
U32 LLMemory::getWorkingSetSize()
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
#elif defined(LL_LINUX)
|
||||
|
||||
U64 LLMemory::getCurrentRSS()
|
||||
|
|
@ -166,6 +189,11 @@ bail:
|
|||
return rss;
|
||||
}
|
||||
|
||||
U32 LLMemory::getWorkingSetSize()
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
#elif LL_SOLARIS
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
|
@ -194,6 +222,12 @@ U64 LLMemory::getCurrentRSS()
|
|||
|
||||
return((U64)proc_psinfo.pr_rssize * 1024);
|
||||
}
|
||||
|
||||
U32 LLMemory::getWorkingSetSize()
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
U64 LLMemory::getCurrentRSS()
|
||||
|
|
@ -201,4 +235,144 @@ U64 LLMemory::getCurrentRSS()
|
|||
return 0;
|
||||
}
|
||||
|
||||
U32 LLMemory::getWorkingSetSize()
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
#if MEM_TRACK_MEM
|
||||
#include "llframetimer.h"
|
||||
|
||||
//static
|
||||
LLMemTracker* LLMemTracker::sInstance = NULL ;
|
||||
|
||||
LLMemTracker::LLMemTracker()
|
||||
{
|
||||
mLastAllocatedMem = LLMemory::getWorkingSetSize() ;
|
||||
mCapacity = 128 ;
|
||||
mCurIndex = 0 ;
|
||||
mCounter = 0 ;
|
||||
mDrawnIndex = 0 ;
|
||||
mPaused = FALSE ;
|
||||
|
||||
mMutexp = new LLMutex(NULL) ;
|
||||
mStringBuffer = new char*[128] ;
|
||||
mStringBuffer[0] = new char[mCapacity * 128] ;
|
||||
for(S32 i = 1 ; i < mCapacity ; i++)
|
||||
{
|
||||
mStringBuffer[i] = mStringBuffer[i-1] + 128 ;
|
||||
}
|
||||
}
|
||||
|
||||
LLMemTracker::~LLMemTracker()
|
||||
{
|
||||
delete[] mStringBuffer[0] ;
|
||||
delete[] mStringBuffer;
|
||||
delete mMutexp ;
|
||||
}
|
||||
|
||||
//static
|
||||
LLMemTracker* LLMemTracker::getInstance()
|
||||
{
|
||||
if(!sInstance)
|
||||
{
|
||||
sInstance = new LLMemTracker() ;
|
||||
}
|
||||
return sInstance ;
|
||||
}
|
||||
|
||||
//static
|
||||
void LLMemTracker::release()
|
||||
{
|
||||
if(sInstance)
|
||||
{
|
||||
delete sInstance ;
|
||||
sInstance = NULL ;
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void LLMemTracker::track(const char* function, const int line)
|
||||
{
|
||||
static const S32 MIN_ALLOCATION = 0 ; //1KB
|
||||
|
||||
if(mPaused)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
U32 allocated_mem = LLMemory::getWorkingSetSize() ;
|
||||
|
||||
LLMutexLock lock(mMutexp) ;
|
||||
|
||||
S32 delta_mem = allocated_mem - mLastAllocatedMem ;
|
||||
mLastAllocatedMem = allocated_mem ;
|
||||
|
||||
if(delta_mem <= 0)
|
||||
{
|
||||
return ; //occupied memory does not grow
|
||||
}
|
||||
|
||||
if(delta_mem < MIN_ALLOCATION)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
char* buffer = mStringBuffer[mCurIndex++] ;
|
||||
F32 time = (F32)LLFrameTimer::getElapsedSeconds() ;
|
||||
S32 hours = (S32)(time / (60*60));
|
||||
S32 mins = (S32)((time - hours*(60*60)) / 60);
|
||||
S32 secs = (S32)((time - hours*(60*60) - mins*60));
|
||||
strcpy(buffer, function) ;
|
||||
sprintf(buffer + strlen(function), " line: %d DeltaMem: %d (bytes) Time: %d:%02d:%02d", line, delta_mem, hours,mins,secs) ;
|
||||
|
||||
if(mCounter < mCapacity)
|
||||
{
|
||||
mCounter++ ;
|
||||
}
|
||||
if(mCurIndex >= mCapacity)
|
||||
{
|
||||
mCurIndex = 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//static
|
||||
void LLMemTracker::preDraw(BOOL pause)
|
||||
{
|
||||
mMutexp->lock() ;
|
||||
|
||||
mPaused = pause ;
|
||||
mDrawnIndex = mCurIndex - 1;
|
||||
mNumOfDrawn = 0 ;
|
||||
}
|
||||
|
||||
//static
|
||||
void LLMemTracker::postDraw()
|
||||
{
|
||||
mMutexp->unlock() ;
|
||||
}
|
||||
|
||||
//static
|
||||
const char* LLMemTracker::getNextLine()
|
||||
{
|
||||
if(mNumOfDrawn >= mCounter)
|
||||
{
|
||||
return NULL ;
|
||||
}
|
||||
mNumOfDrawn++;
|
||||
|
||||
if(mDrawnIndex < 0)
|
||||
{
|
||||
mDrawnIndex = mCapacity - 1 ;
|
||||
}
|
||||
|
||||
return mStringBuffer[mDrawnIndex--] ;
|
||||
}
|
||||
|
||||
#endif //MEM_TRACK_MEM
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
|
|
|
|||
|
|
@ -26,9 +26,8 @@
|
|||
#ifndef LLMEMORY_H
|
||||
#define LLMEMORY_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "llmemtype.h"
|
||||
|
||||
// A not necessarily efficient, but general, aligned malloc http://stackoverflow.com/questions/196329/osx-lacks-memalign
|
||||
#if 0 //DON'T use ll_aligned_foo now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals)
|
||||
inline void* ll_aligned_malloc( size_t size, int align )
|
||||
{
|
||||
|
|
@ -107,10 +106,55 @@ public:
|
|||
// Return the resident set size of the current process, in bytes.
|
||||
// Return value is zero if not known.
|
||||
static U64 getCurrentRSS();
|
||||
static U32 getWorkingSetSize();
|
||||
private:
|
||||
static char* reserveMem;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
#if MEM_TRACK_MEM
|
||||
class LLMutex ;
|
||||
class LL_COMMON_API LLMemTracker
|
||||
{
|
||||
private:
|
||||
LLMemTracker() ;
|
||||
~LLMemTracker() ;
|
||||
|
||||
public:
|
||||
static void release() ;
|
||||
static LLMemTracker* getInstance() ;
|
||||
|
||||
void track(const char* function, const int line) ;
|
||||
void preDraw(BOOL pause) ;
|
||||
void postDraw() ;
|
||||
const char* getNextLine() ;
|
||||
|
||||
private:
|
||||
static LLMemTracker* sInstance ;
|
||||
|
||||
char** mStringBuffer ;
|
||||
S32 mCapacity ;
|
||||
U32 mLastAllocatedMem ;
|
||||
S32 mCurIndex ;
|
||||
S32 mCounter;
|
||||
S32 mDrawnIndex;
|
||||
S32 mNumOfDrawn;
|
||||
BOOL mPaused;
|
||||
LLMutex* mMutexp ;
|
||||
};
|
||||
|
||||
#define MEM_TRACK_RELEASE LLMemTracker::release() ;
|
||||
#define MEM_TRACK LLMemTracker::getInstance()->track(__FUNCTION__, __LINE__) ;
|
||||
|
||||
#else // MEM_TRACK_MEM
|
||||
|
||||
#define MEM_TRACK_RELEASE
|
||||
#define MEM_TRACK
|
||||
|
||||
#endif // MEM_TRACK_MEM
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
// LLRefCount moved to llrefcount.h
|
||||
|
||||
// LLPointer moved to llpointer.h
|
||||
|
|
|
|||
|
|
@ -229,3 +229,4 @@ char const * LLMemType::getNameFromID(S32 id)
|
|||
return DeclareMemType::mNameList[id];
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -274,11 +274,11 @@ LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components)
|
|||
++sRawImageCount;
|
||||
}
|
||||
|
||||
LLImageRaw::LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only)
|
||||
: LLImageBase()
|
||||
{
|
||||
createFromFile(filename, j2c_lowest_mip_only);
|
||||
}
|
||||
//LLImageRaw::LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only)
|
||||
// : LLImageBase()
|
||||
//{
|
||||
// createFromFile(filename, j2c_lowest_mip_only);
|
||||
//}
|
||||
|
||||
LLImageRaw::~LLImageRaw()
|
||||
{
|
||||
|
|
@ -1178,7 +1178,7 @@ file_extensions[] =
|
|||
{ "png", IMG_CODEC_PNG }
|
||||
};
|
||||
#define NUM_FILE_EXTENSIONS LL_ARRAY_SIZE(file_extensions)
|
||||
|
||||
#if 0
|
||||
static std::string find_file(std::string &name, S8 *codec)
|
||||
{
|
||||
std::string tname;
|
||||
|
|
@ -1196,7 +1196,7 @@ static std::string find_file(std::string &name, S8 *codec)
|
|||
}
|
||||
return std::string("");
|
||||
}
|
||||
|
||||
#endif
|
||||
EImageCodec LLImageBase::getCodecFromExtension(const std::string& exten)
|
||||
{
|
||||
for (int i=0; i<(int)(NUM_FILE_EXTENSIONS); i++)
|
||||
|
|
@ -1206,7 +1206,7 @@ EImageCodec LLImageBase::getCodecFromExtension(const std::string& exten)
|
|||
}
|
||||
return IMG_CODEC_INVALID;
|
||||
}
|
||||
|
||||
#if 0
|
||||
bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip_only)
|
||||
{
|
||||
std::string name = filename;
|
||||
|
|
@ -1313,7 +1313,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
//---------------------------------------------------------------------------
|
||||
// LLImageFormatted
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ public:
|
|||
LLImageRaw(U16 width, U16 height, S8 components);
|
||||
LLImageRaw(U8 *data, U16 width, U16 height, S8 components);
|
||||
// Construct using createFromFile (used by tools)
|
||||
LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
|
||||
//LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
|
||||
|
||||
/*virtual*/ void deleteData();
|
||||
/*virtual*/ U8* allocateData(S32 size = -1);
|
||||
|
|
@ -226,7 +226,7 @@ public:
|
|||
|
||||
protected:
|
||||
// Create an image from a local file (generally used in tools)
|
||||
bool createFromFile(const std::string& filename, bool j2c_lowest_mip_only = false);
|
||||
//bool createFromFile(const std::string& filename, bool j2c_lowest_mip_only = false);
|
||||
|
||||
void copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step );
|
||||
void compositeRowScaled4onto3( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len );
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -403,7 +403,7 @@ S32 LLTextureEntry::setOffsetT(F32 t)
|
|||
|
||||
S32 LLTextureEntry::setRotation(F32 theta)
|
||||
{
|
||||
if (mRotation != theta)
|
||||
if (mRotation != theta && llfinite(theta))
|
||||
{
|
||||
mRotation = theta;
|
||||
return TEM_CHANGE_TEXTURE;
|
||||
|
|
|
|||
|
|
@ -1063,16 +1063,6 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_
|
|||
{
|
||||
if (gGL.getTexUnit(0)->bind(this, false, true))
|
||||
{
|
||||
if(gGLManager.mDebugGPU)
|
||||
{
|
||||
llinfos << "Calling glCopyTexSubImage2D(...)" << llendl ;
|
||||
checkTexSize(true) ;
|
||||
llcallstacks << fb_x << " : " << fb_y << " : " << x_pos << " : " << y_pos << " : " << width << " : " << height <<
|
||||
" : " << (S32)mComponents << llcallstacksendl ;
|
||||
|
||||
log_glerror() ;
|
||||
}
|
||||
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);
|
||||
mGLTextureCreated = true;
|
||||
stop_glerror();
|
||||
|
|
|
|||
|
|
@ -101,10 +101,18 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
|
|||
{
|
||||
if (0 != LLFile::remove(fullpath))
|
||||
{
|
||||
retry_count++;
|
||||
result = errno;
|
||||
llwarns << "Problem removing " << fullpath << " - errorcode: "
|
||||
<< result << " attempt " << retry_count << llendl;
|
||||
ms_sleep(1000);
|
||||
|
||||
if(retry_count >= 5)
|
||||
{
|
||||
llwarns << "Failed to remove " << fullpath << llendl ;
|
||||
return count ;
|
||||
}
|
||||
|
||||
ms_sleep(100);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -113,8 +121,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
|
|||
llwarns << "Successfully removed " << fullpath << llendl;
|
||||
}
|
||||
break;
|
||||
}
|
||||
retry_count++;
|
||||
}
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -697,28 +697,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>BrowserUseDefaultCAFile</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Tell the built-in web browser to use the CA.pem file shipped with the client.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>BrowserCAFilePath</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Tell the built-in web browser the path to an alternative CA.pem file (only used if BrowserUseDefaultCAFile is false).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>BlockAvatarAppearanceMessages</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -1179,7 +1157,7 @@
|
|||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>20000</integer>
|
||||
<integer>128</integer>
|
||||
</map>
|
||||
<key>CacheSize</key>
|
||||
<map>
|
||||
|
|
@ -1901,6 +1879,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DebugShowMemory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show Total Allocated Memory</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DebugShowRenderInfo</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -1934,10 +1923,21 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DebugShowTextureInfo</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show inertested texture info</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DebugShowTime</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show depth buffer contents</string>
|
||||
<string>Show time info</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
|
|||
|
|
@ -1314,7 +1314,7 @@ bool LLAppViewer::mainLoop()
|
|||
resumeMainloopTimeout();
|
||||
|
||||
pingMainloopTimeout("Main:End");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(std::bad_alloc)
|
||||
{
|
||||
|
|
@ -1817,6 +1817,8 @@ bool LLAppViewer::cleanup()
|
|||
|
||||
ll_close_fail_log();
|
||||
|
||||
MEM_TRACK_RELEASE
|
||||
|
||||
llinfos << "Goodbye!" << llendflush;
|
||||
|
||||
// return 0;
|
||||
|
|
@ -2515,15 +2517,23 @@ namespace {
|
|||
|
||||
if(data["required"].asBoolean())
|
||||
{
|
||||
apply_callback = &apply_update_ok_callback;
|
||||
if(LLStartUp::getStartupState() <= STATE_LOGIN_WAIT)
|
||||
{
|
||||
// The user never saw the progress bar.
|
||||
apply_callback = &apply_update_ok_callback;
|
||||
notification_name = "RequiredUpdateDownloadedVerboseDialog";
|
||||
}
|
||||
else if(LLStartUp::getStartupState() < STATE_WORLD_INIT)
|
||||
{
|
||||
// The user is logging in but blocked.
|
||||
apply_callback = &apply_update_ok_callback;
|
||||
notification_name = "RequiredUpdateDownloadedDialog";
|
||||
}
|
||||
else
|
||||
{
|
||||
notification_name = "RequiredUpdateDownloadedDialog";
|
||||
// The user is already logged in; treat like an optional update.
|
||||
apply_callback = &apply_update_callback;
|
||||
notification_name = "DownloadBackgroundTip";
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public:
|
|||
/**
|
||||
* Get host to which to send that capability request.
|
||||
*/
|
||||
virtual LLHost getHost() const = 0;
|
||||
virtual const LLHost& getHost() const = 0;
|
||||
/**
|
||||
* Describe this LLCapabilityProvider for logging etc.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -177,10 +177,6 @@ void LLViewerDynamicTexture::postRender(BOOL success)
|
|||
generateGLTexture() ;
|
||||
}
|
||||
|
||||
if(gGLManager.mDebugGPU)
|
||||
{
|
||||
LLGLState::dumpStates() ;
|
||||
}
|
||||
success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
|
||||
}
|
||||
}
|
||||
|
|
@ -220,12 +216,6 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
|
|||
LLViewerDynamicTexture *dynamicTexture = *iter;
|
||||
if (dynamicTexture->needsRender())
|
||||
{
|
||||
if(gGLManager.mDebugGPU)
|
||||
{
|
||||
llinfos << "class type: " << (S32)dynamicTexture->getType() << llendl;
|
||||
LLGLState::dumpStates() ;
|
||||
}
|
||||
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
gDepthDirty = TRUE;
|
||||
|
||||
|
|
|
|||
|
|
@ -1374,7 +1374,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
LLVector4a& norm = vf.mNormals[i];
|
||||
|
||||
LLVector4a& center = *(vf.mCenter);
|
||||
|
||||
|
||||
if (texgen != LLTextureEntry::TEX_GEN_DEFAULT)
|
||||
{
|
||||
LLVector4a vec = vf.mPositions[i];
|
||||
|
|
@ -1598,7 +1598,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
mTexExtents[0].setVec(0,0);
|
||||
mTexExtents[1].setVec(1,1);
|
||||
xform(mTexExtents[0], cos_ang, sin_ang, os, ot, ms, mt);
|
||||
xform(mTexExtents[1], cos_ang, sin_ang, os, ot, ms, mt);
|
||||
xform(mTexExtents[1], cos_ang, sin_ang, os, ot, ms, mt);
|
||||
|
||||
F32 es = vf.mTexCoordExtents[1].mV[0] - vf.mTexCoordExtents[0].mV[0] ;
|
||||
F32 et = vf.mTexCoordExtents[1].mV[1] - vf.mTexCoordExtents[0].mV[1] ;
|
||||
mTexExtents[0][0] *= es ;
|
||||
mTexExtents[1][0] *= es ;
|
||||
mTexExtents[0][1] *= et ;
|
||||
mTexExtents[1][1] *= et ;
|
||||
}
|
||||
|
||||
mLastVertexBuffer = mVertexBuffer;
|
||||
|
|
|
|||
|
|
@ -83,7 +83,8 @@ LLFloaterMap::~LLFloaterMap()
|
|||
BOOL LLFloaterMap::postBuild()
|
||||
{
|
||||
mMap = getChild<LLNetMap>("Net Map");
|
||||
mMap->setToolTipMsg(getString("ToolTipMsg"));
|
||||
mMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
|
||||
getString("AltToolTipMsg") : getString("ToolTipMsg"));
|
||||
sendChildToBack(mMap);
|
||||
|
||||
mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");
|
||||
|
|
|
|||
|
|
@ -1854,31 +1854,9 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
|
|||
{
|
||||
if (mCallbackRegistrar)
|
||||
mCallbackRegistrar->pushScope();
|
||||
//menu->empty();
|
||||
const LLView::child_list_t *list = menu->getChildList();
|
||||
|
||||
LLView::child_list_t::const_iterator menu_itor;
|
||||
for (menu_itor = list->begin(); menu_itor != list->end(); ++menu_itor)
|
||||
{
|
||||
(*menu_itor)->setVisible(FALSE);
|
||||
(*menu_itor)->pushVisible(TRUE);
|
||||
(*menu_itor)->setEnabled(TRUE);
|
||||
}
|
||||
|
||||
// Successively filter out invalid options
|
||||
|
||||
U32 flags = FIRST_SELECTED_ITEM;
|
||||
for (selected_items_t::iterator item_itor = mSelectedItems.begin();
|
||||
item_itor != mSelectedItems.end();
|
||||
++item_itor)
|
||||
{
|
||||
LLFolderViewItem* selected_item = (*item_itor);
|
||||
selected_item->buildContextMenu(*menu, flags);
|
||||
flags = 0x0;
|
||||
}
|
||||
updateMenuOptions(menu);
|
||||
|
||||
addNoOptions(menu);
|
||||
|
||||
menu->updateParent(LLMenuGL::sMenuContainer);
|
||||
LLMenuGL::showPopup(this, menu, x, y);
|
||||
if (mCallbackRegistrar)
|
||||
|
|
@ -2365,6 +2343,45 @@ void LLFolderView::updateRenamerPosition()
|
|||
}
|
||||
}
|
||||
|
||||
// Update visibility and availability (i.e. enabled/disabled) of context menu items.
|
||||
void LLFolderView::updateMenuOptions(LLMenuGL* menu)
|
||||
{
|
||||
const LLView::child_list_t *list = menu->getChildList();
|
||||
|
||||
LLView::child_list_t::const_iterator menu_itor;
|
||||
for (menu_itor = list->begin(); menu_itor != list->end(); ++menu_itor)
|
||||
{
|
||||
(*menu_itor)->setVisible(FALSE);
|
||||
(*menu_itor)->pushVisible(TRUE);
|
||||
(*menu_itor)->setEnabled(TRUE);
|
||||
}
|
||||
|
||||
// Successively filter out invalid options
|
||||
|
||||
U32 flags = FIRST_SELECTED_ITEM;
|
||||
for (selected_items_t::iterator item_itor = mSelectedItems.begin();
|
||||
item_itor != mSelectedItems.end();
|
||||
++item_itor)
|
||||
{
|
||||
LLFolderViewItem* selected_item = (*item_itor);
|
||||
selected_item->buildContextMenu(*menu, flags);
|
||||
flags = 0x0;
|
||||
}
|
||||
|
||||
addNoOptions(menu);
|
||||
}
|
||||
|
||||
// Refresh the context menu (that is already shown).
|
||||
void LLFolderView::updateMenu()
|
||||
{
|
||||
LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
|
||||
if (menu && menu->getVisible())
|
||||
{
|
||||
updateMenuOptions(menu);
|
||||
menu->needsArrange(); // update menu height if needed
|
||||
}
|
||||
}
|
||||
|
||||
bool LLFolderView::selectFirstItem()
|
||||
{
|
||||
for (folders_t::iterator iter = mFolders.begin();
|
||||
|
|
|
|||
|
|
@ -269,7 +269,10 @@ public:
|
|||
virtual S32 notify(const LLSD& info) ;
|
||||
|
||||
bool useLabelSuffix() { return mUseLabelSuffix; }
|
||||
void updateMenu();
|
||||
|
||||
private:
|
||||
void updateMenuOptions(LLMenuGL* menu);
|
||||
void updateRenamerPosition();
|
||||
|
||||
protected:
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include "llvoiceclient.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "lltransientfloatermgr.h"
|
||||
#include "llnotificationsutil.h"
|
||||
|
||||
// Linden libraries
|
||||
#include "llfloater.h"
|
||||
|
|
@ -126,16 +127,20 @@ private:
|
|||
void onClickReport();
|
||||
void onClickFreeze();
|
||||
void onClickEject();
|
||||
void onClickKick();
|
||||
void onClickCSR();
|
||||
void onClickZoomIn();
|
||||
void onClickFindOnMap();
|
||||
bool onVisibleFindOnMap();
|
||||
bool onVisibleFreezeEject();
|
||||
bool onVisibleEject();
|
||||
bool onVisibleFreeze();
|
||||
bool onVisibleZoomIn();
|
||||
void onClickMuteVolume();
|
||||
void onVolumeChange(const LLSD& data);
|
||||
bool enableMute();
|
||||
bool enableUnmute();
|
||||
bool enableTeleportOffer();
|
||||
bool godModeEnabled();
|
||||
|
||||
// Is used to determine if "Add friend" option should be enabled in gear menu
|
||||
bool isNotFriend();
|
||||
|
|
@ -214,20 +219,21 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
|
|||
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Share", boost::bind(&LLInspectAvatar::onClickShare, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
|
||||
boost::bind(&LLInspectAvatar::onClickFreeze, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Eject",
|
||||
boost::bind(&LLInspectAvatar::onClickEject, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Freeze", boost::bind(&LLInspectAvatar::onClickFreeze, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Eject", boost::bind(&LLInspectAvatar::onClickEject, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Kick", boost::bind(&LLInspectAvatar::onClickKick, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.CSR", boost::bind(&LLInspectAvatar::onClickCSR, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Report", boost::bind(&LLInspectAvatar::onClickReport, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap", boost::bind(&LLInspectAvatar::onClickFindOnMap, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.DisableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, false));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.EnableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, true));
|
||||
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.EnableGod", boost::bind(&LLInspectAvatar::godModeEnabled, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject",
|
||||
boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn",
|
||||
boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleEject", boost::bind(&LLInspectAvatar::onVisibleEject, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreeze", boost::bind(&LLInspectAvatar::onVisibleFreeze, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this));
|
||||
|
|
@ -656,11 +662,18 @@ bool LLInspectAvatar::onVisibleFindOnMap()
|
|||
return gAgent.isGodlike() || is_agent_mappable(mAvatarID);
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::onVisibleFreezeEject()
|
||||
bool LLInspectAvatar::onVisibleEject()
|
||||
{
|
||||
return enable_freeze_eject( LLSD(mAvatarID) );
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::onVisibleFreeze()
|
||||
{
|
||||
// either user is a god and can do long distance freeze
|
||||
// or check for target proximity and permissions
|
||||
return gAgent.isGodlike() || enable_freeze_eject(LLSD(mAvatarID));
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::onVisibleZoomIn()
|
||||
{
|
||||
return gObjectList.findObject(mAvatarID);
|
||||
|
|
@ -704,7 +717,7 @@ void LLInspectAvatar::onClickShare()
|
|||
|
||||
void LLInspectAvatar::onToggleMute()
|
||||
{
|
||||
LLMute mute(mAvatarID, mAvatarName.getLegacyName(), LLMute::AGENT);
|
||||
LLMute mute(mAvatarID, mAvatarName.mDisplayName, LLMute::AGENT);
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
|
||||
{
|
||||
|
|
@ -725,9 +738,41 @@ void LLInspectAvatar::onClickReport()
|
|||
closeFloater();
|
||||
}
|
||||
|
||||
bool godlike_freeze(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
||||
switch (option)
|
||||
{
|
||||
case 0:
|
||||
LLAvatarActions::freeze(avatar_id);
|
||||
break;
|
||||
case 1:
|
||||
LLAvatarActions::unfreeze(avatar_id);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickFreeze()
|
||||
{
|
||||
handle_avatar_freeze( LLSD(mAvatarID) );
|
||||
if (gAgent.isGodlike())
|
||||
{
|
||||
// use godlike freeze-at-a-distance, with confirmation
|
||||
LLNotificationsUtil::add("FreezeAvatar",
|
||||
LLSD(),
|
||||
LLSD().with("avatar_id", mAvatarID),
|
||||
godlike_freeze);
|
||||
}
|
||||
else
|
||||
{
|
||||
// use default "local" version of freezing that requires avatar to be in range
|
||||
handle_avatar_freeze( LLSD(mAvatarID) );
|
||||
}
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
|
|
@ -737,6 +782,20 @@ void LLInspectAvatar::onClickEject()
|
|||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickKick()
|
||||
{
|
||||
LLAvatarActions::kick(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickCSR()
|
||||
{
|
||||
std::string name;
|
||||
gCacheName->getFullName(mAvatarID, name);
|
||||
LLAvatarActions::csr(mAvatarID, name);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickZoomIn()
|
||||
{
|
||||
handle_zoom_to_object(mAvatarID);
|
||||
|
|
@ -785,6 +844,11 @@ bool LLInspectAvatar::enableTeleportOffer()
|
|||
return LLAvatarActions::canOfferTeleport(mAvatarID);
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::godModeEnabled()
|
||||
{
|
||||
return gAgent.isGodlike();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// LLInspectAvatarUtil
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -393,18 +393,22 @@ void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
|
|||
|
||||
void LLInventoryFilter::setFilterSubString(const std::string& string)
|
||||
{
|
||||
if (mFilterSubString != string)
|
||||
std::string filter_sub_string_new = string;
|
||||
mFilterSubStringOrig = string;
|
||||
LLStringUtil::trimHead(filter_sub_string_new);
|
||||
LLStringUtil::toUpper(filter_sub_string_new);
|
||||
|
||||
if (mFilterSubString != filter_sub_string_new)
|
||||
{
|
||||
// hitting BACKSPACE, for example
|
||||
const BOOL less_restrictive = mFilterSubString.size() >= string.size() && !mFilterSubString.substr(0, string.size()).compare(string);
|
||||
const BOOL less_restrictive = mFilterSubString.size() >= filter_sub_string_new.size()
|
||||
&& !mFilterSubString.substr(0, filter_sub_string_new.size()).compare(filter_sub_string_new);
|
||||
|
||||
// appending new characters
|
||||
const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString);
|
||||
const BOOL more_restrictive = mFilterSubString.size() < filter_sub_string_new.size()
|
||||
&& !filter_sub_string_new.substr(0, mFilterSubString.size()).compare(mFilterSubString);
|
||||
|
||||
mFilterSubStringOrig = string;
|
||||
LLStringUtil::trimHead(mFilterSubStringOrig);
|
||||
mFilterSubString = mFilterSubStringOrig;
|
||||
LLStringUtil::toUpper(mFilterSubString);
|
||||
mFilterSubString = filter_sub_string_new;
|
||||
if (less_restrictive)
|
||||
{
|
||||
setModified(FILTER_LESS_RESTRICTIVE);
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
|
|||
//
|
||||
// Bridge to support knowing when the inventory has changed.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
class LLInventoryPanelObserver : public LLInventoryObserver
|
||||
{
|
||||
public:
|
||||
|
|
@ -73,9 +74,57 @@ protected:
|
|||
LLInventoryPanel* mIP;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLInvPanelComplObserver
|
||||
//
|
||||
// Calls specified callback when all specified items become complete.
|
||||
//
|
||||
// Usage:
|
||||
// observer = new LLInvPanelComplObserver(boost::bind(onComplete));
|
||||
// inventory->addObserver(observer);
|
||||
// observer->reset(); // (optional)
|
||||
// observer->watchItem(incomplete_item1_id);
|
||||
// observer->watchItem(incomplete_item2_id);
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
class LLInvPanelComplObserver : public LLInventoryCompletionObserver
|
||||
{
|
||||
public:
|
||||
typedef boost::function<void()> callback_t;
|
||||
|
||||
LLInvPanelComplObserver(callback_t cb)
|
||||
: mCallback(cb)
|
||||
{
|
||||
}
|
||||
|
||||
void reset();
|
||||
|
||||
private:
|
||||
/*virtual*/ void done();
|
||||
|
||||
/// Called when all the items are complete.
|
||||
callback_t mCallback;
|
||||
};
|
||||
|
||||
void LLInvPanelComplObserver::reset()
|
||||
{
|
||||
mIncomplete.clear();
|
||||
mComplete.clear();
|
||||
}
|
||||
|
||||
void LLInvPanelComplObserver::done()
|
||||
{
|
||||
mCallback();
|
||||
}
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLInventoryPanel
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
|
||||
LLPanel(p),
|
||||
mInventoryObserver(NULL),
|
||||
mCompletionObserver(NULL),
|
||||
mFolderRoot(NULL),
|
||||
mScroller(NULL),
|
||||
mSortOrderSetting(p.sort_order_setting),
|
||||
|
|
@ -152,6 +201,9 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
|
|||
mInventoryObserver = new LLInventoryPanelObserver(this);
|
||||
mInventory->addObserver(mInventoryObserver);
|
||||
|
||||
mCompletionObserver = new LLInvPanelComplObserver(boost::bind(&LLInventoryPanel::onItemsCompletion, this));
|
||||
mInventory->addObserver(mCompletionObserver);
|
||||
|
||||
// Build view of inventory if we need default full hierarchy and inventory ready,
|
||||
// otherwise wait for idle callback.
|
||||
if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mViewsInitialized)
|
||||
|
|
@ -189,7 +241,10 @@ LLInventoryPanel::~LLInventoryPanel()
|
|||
|
||||
// LLView destructor will take care of the sub-views.
|
||||
mInventory->removeObserver(mInventoryObserver);
|
||||
mInventory->removeObserver(mCompletionObserver);
|
||||
delete mInventoryObserver;
|
||||
delete mCompletionObserver;
|
||||
|
||||
mScroller = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -654,6 +709,11 @@ void LLInventoryPanel::openStartFolderOrMyInventory()
|
|||
}
|
||||
}
|
||||
|
||||
void LLInventoryPanel::onItemsCompletion()
|
||||
{
|
||||
if (mFolderRoot) mFolderRoot->updateMenu();
|
||||
}
|
||||
|
||||
void LLInventoryPanel::openSelected()
|
||||
{
|
||||
LLFolderViewItem* folder_item = mFolderRoot->getCurSelectedItem();
|
||||
|
|
@ -757,6 +817,19 @@ void LLInventoryPanel::clearSelection()
|
|||
|
||||
void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
|
||||
{
|
||||
// Schedule updating the folder view context menu when all selected items become complete (STORM-373).
|
||||
mCompletionObserver->reset();
|
||||
for (std::deque<LLFolderViewItem*>::const_iterator it = items.begin(); it != items.end(); ++it)
|
||||
{
|
||||
LLUUID id = (*it)->getListener()->getUUID();
|
||||
LLViewerInventoryItem* inv_item = mInventory->getItem(id);
|
||||
|
||||
if (inv_item && !inv_item->isFinished())
|
||||
{
|
||||
mCompletionObserver->watchItem(id);
|
||||
}
|
||||
}
|
||||
|
||||
LLFolderView* fv = getRootFolder();
|
||||
if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
|
||||
{
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ class LLIconCtrl;
|
|||
class LLSaveFolderState;
|
||||
class LLFilterEditor;
|
||||
class LLTabContainer;
|
||||
class LLInvPanelComplObserver;
|
||||
|
||||
class LLInventoryPanel : public LLPanel
|
||||
{
|
||||
|
|
@ -167,9 +168,11 @@ public:
|
|||
|
||||
protected:
|
||||
void openStartFolderOrMyInventory(); // open the first level of inventory
|
||||
void onItemsCompletion(); // called when selected items are complete
|
||||
|
||||
LLInventoryModel* mInventory;
|
||||
LLInventoryObserver* mInventoryObserver;
|
||||
LLInvPanelComplObserver* mCompletionObserver;
|
||||
BOOL mAllowMultiSelect;
|
||||
BOOL mShowItemLinkOverlays; // Shows link graphic over inventory item icons
|
||||
|
||||
|
|
|
|||
|
|
@ -37,9 +37,11 @@
|
|||
#include <sstream>
|
||||
#include <boost/algorithm/string/split.hpp>
|
||||
|
||||
#include "llmemory.h"
|
||||
|
||||
LLMemoryView::LLMemoryView(const LLMemoryView::Params& p)
|
||||
: LLView(p),
|
||||
mPaused(FALSE),
|
||||
//mDelay(120),
|
||||
mAlloc(NULL)
|
||||
{
|
||||
|
|
@ -59,6 +61,7 @@ BOOL LLMemoryView::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
}
|
||||
else
|
||||
{
|
||||
mPaused = !mPaused;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -148,13 +151,14 @@ void LLMemoryView::draw()
|
|||
|
||||
// cut off lines on bottom
|
||||
U32 max_lines = U32((height - 2 * line_height) / line_height);
|
||||
std::vector<LLWString>::const_iterator end = mLines.end();
|
||||
y_pos = height - MARGIN_AMT - line_height;
|
||||
y_off = 0.f;
|
||||
|
||||
#if !MEM_TRACK_MEM
|
||||
std::vector<LLWString>::const_iterator end = mLines.end();
|
||||
if(mLines.size() > max_lines) {
|
||||
end = mLines.begin() + max_lines;
|
||||
}
|
||||
|
||||
y_pos = height - MARGIN_AMT - line_height;
|
||||
y_off = 0.f;
|
||||
for (std::vector<LLWString>::const_iterator i = mLines.begin(); i != end; ++i)
|
||||
{
|
||||
font->render(*i, 0, MARGIN_AMT, y_pos - y_off,
|
||||
|
|
@ -169,6 +173,47 @@ void LLMemoryView::draw()
|
|||
y_off += line_height;
|
||||
}
|
||||
|
||||
#else
|
||||
LLMemTracker::getInstance()->preDraw(mPaused) ;
|
||||
|
||||
{
|
||||
F32 x_pos = MARGIN_AMT ;
|
||||
U32 lines = 0 ;
|
||||
const char* str = LLMemTracker::getInstance()->getNextLine() ;
|
||||
while(str != NULL)
|
||||
{
|
||||
lines++ ;
|
||||
font->renderUTF8(str, 0, x_pos, y_pos - y_off,
|
||||
LLColor4::white,
|
||||
LLFontGL::LEFT,
|
||||
LLFontGL::BASELINE,
|
||||
LLFontGL::NORMAL,
|
||||
LLFontGL::DROP_SHADOW,
|
||||
S32_MAX,
|
||||
target_width,
|
||||
NULL, FALSE);
|
||||
|
||||
str = LLMemTracker::getInstance()->getNextLine() ;
|
||||
y_off += line_height;
|
||||
|
||||
if(lines >= max_lines)
|
||||
{
|
||||
lines = 0 ;
|
||||
x_pos += 512.f ;
|
||||
if(x_pos + 512.f > target_width)
|
||||
{
|
||||
break ;
|
||||
}
|
||||
|
||||
y_pos = height - MARGIN_AMT - line_height;
|
||||
y_off = 0.f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLMemTracker::getInstance()->postDraw() ;
|
||||
#endif
|
||||
|
||||
#if MEM_TRACK_TYPE
|
||||
|
||||
S32 left, top, right, bottom;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ public:
|
|||
private:
|
||||
std::vector<LLWString> mLines;
|
||||
LLAllocator* mAlloc;
|
||||
BOOL mPaused ;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include "llagentcamera.h"
|
||||
#include "llappviewer.h" // for gDisconnected
|
||||
#include "llcallingcard.h" // LLAvatarTracker
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "lltracker.h"
|
||||
#include "llsurface.h"
|
||||
#include "llviewercamera.h"
|
||||
|
|
@ -91,7 +92,8 @@ LLNetMap::LLNetMap (const Params & p)
|
|||
mObjectImagep(),
|
||||
mClosestAgentToCursor(),
|
||||
mClosestAgentAtLastRightClick(),
|
||||
mToolTipMsg()
|
||||
mToolTipMsg(),
|
||||
mPopupMenu(NULL)
|
||||
{
|
||||
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
|
||||
setScale(gSavedSettings.getF32("MiniMapScale"));
|
||||
|
|
@ -102,6 +104,21 @@ LLNetMap::~LLNetMap()
|
|||
gSavedSettings.setF32("MiniMapScale", mScale);
|
||||
}
|
||||
|
||||
BOOL LLNetMap::postBuild()
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
|
||||
registrar.add("Minimap.Zoom", boost::bind(&LLNetMap::handleZoom, this, _2));
|
||||
registrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));
|
||||
|
||||
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (mPopupMenu && !LLTracker::isTracking(0))
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", false);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLNetMap::setScale( F32 scale )
|
||||
{
|
||||
scale = llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX);
|
||||
|
|
@ -354,16 +371,49 @@ void LLNetMap::draw()
|
|||
|
||||
pos_map = globalPosToView(pos_global);
|
||||
|
||||
LLUUID uuid(NULL);
|
||||
BOOL show_as_friend = FALSE;
|
||||
if( i < regionp->mMapAvatarIDs.count())
|
||||
{
|
||||
show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(regionp->mMapAvatarIDs.get(i)) != NULL);
|
||||
uuid = regionp->mMapAvatarIDs.get(i);
|
||||
show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL);
|
||||
}
|
||||
|
||||
LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color;
|
||||
LLWorldMapView::drawAvatar(
|
||||
pos_map.mV[VX], pos_map.mV[VY],
|
||||
show_as_friend ? map_avatar_friend_color : map_avatar_color,
|
||||
color,
|
||||
pos_map.mV[VZ], mDotRadius);
|
||||
|
||||
if(uuid.notNull())
|
||||
{
|
||||
bool selected = false;
|
||||
uuid_vec_t::iterator sel_iter = gmSelected.begin();
|
||||
for (; sel_iter != gmSelected.end(); sel_iter++)
|
||||
{
|
||||
if(*sel_iter == uuid)
|
||||
{
|
||||
selected = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(selected)
|
||||
{
|
||||
if( (pos_map.mV[VX] < 0) ||
|
||||
(pos_map.mV[VY] < 0) ||
|
||||
(pos_map.mV[VX] >= getRect().getWidth()) ||
|
||||
(pos_map.mV[VY] >= getRect().getHeight()) )
|
||||
{
|
||||
S32 x = llround( pos_map.mV[VX] );
|
||||
S32 y = llround( pos_map.mV[VY] );
|
||||
LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10);
|
||||
} else
|
||||
{
|
||||
LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
|
||||
LLVector2(local_mouse_x,local_mouse_y));
|
||||
if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
|
||||
|
|
@ -460,6 +510,13 @@ void LLNetMap::draw()
|
|||
gGL.popUIMatrix();
|
||||
|
||||
LLUICtrl::draw();
|
||||
|
||||
if (LLTracker::isTracking(0))
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
|
|
@ -600,7 +657,6 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
|
|||
args["[REGION]"] = region_name;
|
||||
std::string msg = mToolTipMsg;
|
||||
LLStringUtil::format(msg, args);
|
||||
|
||||
LLToolTipMgr::instance().show(LLToolTip::Params()
|
||||
.message(msg)
|
||||
.sticky_rect(sticky_rect));
|
||||
|
|
@ -793,6 +849,9 @@ BOOL LLNetMap::handleMouseDown( S32 x, S32 y, MASK mask )
|
|||
|
||||
BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
|
||||
{
|
||||
if(abs(mMouseDown.mX-x)<3 && abs(mMouseDown.mY-y)<3)
|
||||
handleClick(x,y,mask);
|
||||
|
||||
if (hasMouseCapture())
|
||||
{
|
||||
if (mPanning)
|
||||
|
|
@ -821,6 +880,53 @@ BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if (mPopupMenu)
|
||||
{
|
||||
mPopupMenu->buildDrawLabels();
|
||||
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
LLMenuGL::showPopup(this, mPopupMenu, x, y);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLNetMap::handleClick(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
// TODO: allow clicking an avatar on minimap to select avatar in the nearby avatar list
|
||||
// if(mClosestAgentToCursor.notNull())
|
||||
// mNearbyList->selectUser(mClosestAgentToCursor);
|
||||
// Needs a registered observer i guess to accomplish this without using
|
||||
// globals to tell the mNearbyList in llpeoplepanel to select the user
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLNetMap::handleDoubleClick(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLVector3d pos_global = viewPosToGlobal(x, y);
|
||||
|
||||
// If we're not tracking a beacon already, double-click will set one
|
||||
if (!LLTracker::isTracking(NULL))
|
||||
{
|
||||
LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
|
||||
if (world_map)
|
||||
{
|
||||
world_map->trackLocation(pos_global);
|
||||
}
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("DoubleClickTeleport"))
|
||||
{
|
||||
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
|
||||
gAgent.teleportViaLocationLookAt(pos_global);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterReg::showInstance("world_map");
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLNetMap::outsideSlop( S32 x, S32 y, S32 start_x, S32 start_y, S32 slop )
|
||||
{
|
||||
|
|
@ -871,3 +977,38 @@ BOOL LLNetMap::handleHover( S32 x, S32 y, MASK mask )
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLNetMap::handleZoom(const LLSD& userdata)
|
||||
{
|
||||
std::string level = userdata.asString();
|
||||
|
||||
F32 scale = 0.0f;
|
||||
if (level == std::string("default"))
|
||||
{
|
||||
LLControlVariable *pvar = gSavedSettings.getControl("MiniMapScale");
|
||||
if(pvar)
|
||||
{
|
||||
pvar->resetToDefault();
|
||||
scale = gSavedSettings.getF32("MiniMapScale");
|
||||
}
|
||||
}
|
||||
else if (level == std::string("close"))
|
||||
scale = LLNetMap::MAP_SCALE_MAX;
|
||||
else if (level == std::string("medium"))
|
||||
scale = LLNetMap::MAP_SCALE_MID;
|
||||
else if (level == std::string("far"))
|
||||
scale = LLNetMap::MAP_SCALE_MIN;
|
||||
if (scale != 0.0f)
|
||||
{
|
||||
setScale(scale);
|
||||
}
|
||||
}
|
||||
|
||||
void LLNetMap::handleStopTracking (const LLSD& userdata)
|
||||
{
|
||||
if (mPopupMenu)
|
||||
{
|
||||
mPopupMenu->setItemEnabled ("Stop Tracking", false);
|
||||
LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ class LLCoordGL;
|
|||
class LLImageRaw;
|
||||
class LLViewerTexture;
|
||||
class LLFloaterMap;
|
||||
class LLMenuGL;
|
||||
|
||||
class LLNetMap : public LLUICtrl
|
||||
{
|
||||
|
|
@ -72,7 +73,12 @@ public:
|
|||
/*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
|
||||
/*virtual*/ BOOL handleToolTip( S32 x, S32 y, MASK mask);
|
||||
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
|
||||
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
|
||||
/*virtual*/ BOOL handleClick(S32 x, S32 y, MASK mask);
|
||||
/*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
|
||||
|
||||
void setScale( F32 scale );
|
||||
void setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; }
|
||||
void renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius );
|
||||
|
|
@ -120,6 +126,16 @@ private:
|
|||
LLUUID mClosestAgentAtLastRightClick;
|
||||
|
||||
std::string mToolTipMsg;
|
||||
|
||||
public:
|
||||
void setSelected(uuid_vec_t uuids) { gmSelected=uuids; };
|
||||
|
||||
private:
|
||||
void handleZoom(const LLSD& userdata);
|
||||
void handleStopTracking (const LLSD& userdata);
|
||||
|
||||
LLMenuGL* mPopupMenu;
|
||||
uuid_vec_t gmSelected;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -625,10 +625,15 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
|
|||
getChild<LLUICtrl>("sl_groups")->setValue(groups);
|
||||
}
|
||||
|
||||
void LLPanelAvatarProfile::got_full_name_callback( const LLUUID& id, const std::string& full_name, bool is_group )
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
|
||||
static void got_full_name_callback( LLHandle<LLPanel> profile_panel_handle, const std::string& full_name )
|
||||
{
|
||||
if (profile_panel_handle.isDead() ) return;
|
||||
|
||||
LLPanelAvatarProfile* profile_panel = dynamic_cast<LLPanelAvatarProfile*>(profile_panel_handle.get());
|
||||
if ( ! profile_panel ) return;
|
||||
|
||||
LLStringUtil::format_map_t args;
|
||||
|
||||
std::string name;
|
||||
if (LLAvatarNameCache::useDisplayNames())
|
||||
{
|
||||
|
|
@ -637,21 +642,21 @@ void LLPanelAvatarProfile::got_full_name_callback( const LLUUID& id, const std::
|
|||
else
|
||||
{
|
||||
name = full_name;
|
||||
}
|
||||
|
||||
args["[NAME]"] = name;
|
||||
|
||||
std::string linden_name = getString("name_text_args", args);
|
||||
getChild<LLUICtrl>("name_descr_text")->setValue(linden_name);
|
||||
}
|
||||
}
|
||||
|
||||
args["[NAME]"] = name;
|
||||
|
||||
std::string linden_name = profile_panel->getString("name_text_args", args);
|
||||
profile_panel->getChild<LLUICtrl>("name_descr_text")->setValue(linden_name);
|
||||
}
|
||||
|
||||
void LLPanelAvatarProfile::onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[DISPLAY_NAME]"] = av_name.mDisplayName;
|
||||
|
||||
std::string display_name = getString("display_name_text_args", args);
|
||||
getChild<LLUICtrl>("display_name_descr_text")->setValue(display_name);
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[DISPLAY_NAME]"] = av_name.mDisplayName;
|
||||
|
||||
std::string display_name = getString("display_name_text_args", args);
|
||||
getChild<LLUICtrl>("display_name_descr_text")->setValue(display_name);
|
||||
}
|
||||
|
||||
void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
|
||||
|
|
@ -667,22 +672,23 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
|
|||
}
|
||||
|
||||
// ask (asynchronously) for the avatar name
|
||||
std::string full_name;
|
||||
if (gCacheName->getFullName(avatar_data->agent_id, full_name))
|
||||
{
|
||||
// name in cache, call callback directly
|
||||
got_full_name_callback( avatar_data->agent_id, full_name, false );
|
||||
}
|
||||
else
|
||||
{
|
||||
// not in cache, lookup name
|
||||
gCacheName->get(avatar_data->agent_id, false, boost::bind( &LLPanelAvatarProfile::got_full_name_callback, this, _1, _2, _3 ));
|
||||
}
|
||||
|
||||
// get display name
|
||||
LLHandle<LLPanel> profile_panel_handle = getHandle();
|
||||
std::string full_name;
|
||||
if (gCacheName->getFullName(avatar_data->agent_id, full_name))
|
||||
{
|
||||
// name in cache, call callback directly
|
||||
got_full_name_callback( profile_panel_handle, full_name );
|
||||
}
|
||||
else
|
||||
{
|
||||
// not in cache, lookup name
|
||||
gCacheName->get(avatar_data->agent_id, false, boost::bind( got_full_name_callback, profile_panel_handle, _2 ));
|
||||
}
|
||||
|
||||
// get display name
|
||||
LLAvatarNameCache::get(avatar_data->avatar_id,
|
||||
boost::bind(&LLPanelAvatarProfile::onNameCache, this, _1, _2));
|
||||
|
||||
boost::bind(&LLPanelAvatarProfile::onNameCache, this, _1, _2));
|
||||
|
||||
args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
|
||||
std::string register_date = getString("RegisterDateFormat", args);
|
||||
getChild<LLUICtrl>("register_date")->setValue(register_date );
|
||||
|
|
|
|||
|
|
@ -1,298 +1,297 @@
|
|||
/**
|
||||
* @file llpanelavatar.h
|
||||
* @brief LLPanelAvatar and related class definitions
|
||||
*
|
||||
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLPANELAVATAR_H
|
||||
#define LL_LLPANELAVATAR_H
|
||||
|
||||
#include "llpanel.h"
|
||||
#include "llavatarpropertiesprocessor.h"
|
||||
#include "llcallingcard.h"
|
||||
#include "llvoiceclient.h"
|
||||
#include "llavatarnamecache.h"
|
||||
|
||||
class LLComboBox;
|
||||
class LLLineEditor;
|
||||
|
||||
enum EOnlineStatus
|
||||
{
|
||||
ONLINE_STATUS_NO = 0,
|
||||
ONLINE_STATUS_YES = 1
|
||||
};
|
||||
|
||||
/**
|
||||
* Base class for any Profile View or My Profile Panel.
|
||||
*/
|
||||
class LLPanelProfileTab
|
||||
: public LLPanel
|
||||
, public LLAvatarPropertiesObserver
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Sets avatar ID, sets panel as observer of avatar related info replies from server.
|
||||
*/
|
||||
virtual void setAvatarId(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* Returns avatar ID.
|
||||
*/
|
||||
virtual const LLUUID& getAvatarId() { return mAvatarId; }
|
||||
|
||||
/**
|
||||
* Sends update data request to server.
|
||||
*/
|
||||
virtual void updateData() = 0;
|
||||
|
||||
/**
|
||||
* Clears panel data if viewing avatar info for first time and sends update data request.
|
||||
*/
|
||||
virtual void onOpen(const LLSD& key);
|
||||
|
||||
/**
|
||||
* Profile tabs should close any opened panels here.
|
||||
*
|
||||
* Called from LLPanelProfile::onOpen() before opening new profile.
|
||||
* See LLPanelPicks::onClosePanel for example. LLPanelPicks closes picture info panel
|
||||
* before new profile is displayed, otherwise new profile will
|
||||
* be hidden behind picture info panel.
|
||||
*/
|
||||
virtual void onClosePanel() {}
|
||||
|
||||
/**
|
||||
* Resets controls visibility, state, etc.
|
||||
*/
|
||||
virtual void resetControls(){};
|
||||
|
||||
/**
|
||||
* Clears all data received from server.
|
||||
*/
|
||||
virtual void resetData(){};
|
||||
|
||||
/*virtual*/ ~LLPanelProfileTab();
|
||||
|
||||
protected:
|
||||
|
||||
LLPanelProfileTab();
|
||||
|
||||
/**
|
||||
* Scrolls panel to top when viewing avatar info for first time.
|
||||
*/
|
||||
void scrollToTop();
|
||||
|
||||
virtual void onMapButtonClick();
|
||||
|
||||
virtual void updateButtons();
|
||||
|
||||
private:
|
||||
|
||||
LLUUID mAvatarId;
|
||||
};
|
||||
|
||||
/**
|
||||
* Panel for displaying Avatar's first and second life related info.
|
||||
*/
|
||||
class LLPanelAvatarProfile
|
||||
: public LLPanelProfileTab
|
||||
, public LLFriendObserver
|
||||
, public LLVoiceClientStatusObserver
|
||||
{
|
||||
public:
|
||||
LLPanelAvatarProfile();
|
||||
/*virtual*/ ~LLPanelAvatarProfile();
|
||||
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
|
||||
/**
|
||||
* LLFriendObserver trigger
|
||||
*/
|
||||
virtual void changed(U32 mask);
|
||||
|
||||
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
|
||||
// button when voice is available
|
||||
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
|
||||
|
||||
/*virtual*/ void setAvatarId(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* Processes data received from server.
|
||||
*/
|
||||
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
/*virtual*/ void updateData();
|
||||
|
||||
/*virtual*/ void resetControls();
|
||||
|
||||
/*virtual*/ void resetData();
|
||||
|
||||
protected:
|
||||
|
||||
/**
|
||||
* Process profile related data received from server.
|
||||
*/
|
||||
virtual void processProfileProperties(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Processes group related data received from server.
|
||||
*/
|
||||
virtual void processGroupProperties(const LLAvatarGroups* avatar_groups);
|
||||
|
||||
/**
|
||||
* Fills common for Avatar profile and My Profile fields.
|
||||
*/
|
||||
virtual void fillCommonData(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Fills partner data.
|
||||
*/
|
||||
virtual void fillPartnerData(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Fills account status.
|
||||
*/
|
||||
virtual void fillAccountStatus(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Opens "Pay Resident" dialog.
|
||||
*/
|
||||
void pay();
|
||||
|
||||
/**
|
||||
* opens inventory and IM for sharing items
|
||||
*/
|
||||
void share();
|
||||
|
||||
/**
|
||||
* Add/remove resident to/from your block list.
|
||||
*/
|
||||
void toggleBlock();
|
||||
|
||||
void kick();
|
||||
void freeze();
|
||||
void unfreeze();
|
||||
void csr();
|
||||
|
||||
bool enableShowOnMap();
|
||||
bool enableBlock();
|
||||
bool enableUnblock();
|
||||
bool enableGod();
|
||||
|
||||
void onSeeProfileBtnClick();
|
||||
void onAddFriendButtonClick();
|
||||
void onIMButtonClick();
|
||||
void onCallButtonClick();
|
||||
void onTeleportButtonClick();
|
||||
void onShareButtonClick();
|
||||
|
||||
private:
|
||||
void got_full_name_callback( const LLUUID& id, const std::string& full_name, bool is_group );
|
||||
void onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
|
||||
|
||||
typedef std::map< std::string,LLUUID> group_map_t;
|
||||
group_map_t mGroups;
|
||||
};
|
||||
|
||||
/**
|
||||
* Panel for displaying own first and second life related info.
|
||||
*/
|
||||
class LLPanelMyProfile
|
||||
: public LLPanelAvatarProfile
|
||||
{
|
||||
public:
|
||||
LLPanelMyProfile();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
protected:
|
||||
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
|
||||
/*virtual*/ void processProfileProperties(const LLAvatarData* avatar_data);
|
||||
|
||||
/*virtual*/ void resetControls();
|
||||
|
||||
protected:
|
||||
void onStatusMessageChanged();
|
||||
};
|
||||
|
||||
/**
|
||||
* Panel for displaying Avatar's notes and modifying friend's rights.
|
||||
*/
|
||||
class LLPanelAvatarNotes
|
||||
: public LLPanelProfileTab
|
||||
, public LLFriendObserver
|
||||
, public LLVoiceClientStatusObserver
|
||||
{
|
||||
public:
|
||||
LLPanelAvatarNotes();
|
||||
/*virtual*/ ~LLPanelAvatarNotes();
|
||||
|
||||
virtual void setAvatarId(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* LLFriendObserver trigger
|
||||
*/
|
||||
virtual void changed(U32 mask);
|
||||
|
||||
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
|
||||
// button when voice is available
|
||||
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
|
||||
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
|
||||
|
||||
/*virtual*/ void updateData();
|
||||
|
||||
protected:
|
||||
|
||||
/*virtual*/ void resetControls();
|
||||
|
||||
/*virtual*/ void resetData();
|
||||
|
||||
/**
|
||||
* Fills rights data for friends.
|
||||
*/
|
||||
void fillRightsData();
|
||||
|
||||
void rightsConfirmationCallback(const LLSD& notification,
|
||||
const LLSD& response, S32 rights);
|
||||
void confirmModifyRights(bool grant, S32 rights);
|
||||
void onCommitRights();
|
||||
void onCommitNotes();
|
||||
|
||||
void onAddFriendButtonClick();
|
||||
void onIMButtonClick();
|
||||
void onCallButtonClick();
|
||||
void onTeleportButtonClick();
|
||||
void onShareButtonClick();
|
||||
void enableCheckboxes(bool enable);
|
||||
};
|
||||
|
||||
#endif // LL_LLPANELAVATAR_H
|
||||
/**
|
||||
* @file llpanelavatar.h
|
||||
* @brief LLPanelAvatar and related class definitions
|
||||
*
|
||||
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLPANELAVATAR_H
|
||||
#define LL_LLPANELAVATAR_H
|
||||
|
||||
#include "llpanel.h"
|
||||
#include "llavatarpropertiesprocessor.h"
|
||||
#include "llcallingcard.h"
|
||||
#include "llvoiceclient.h"
|
||||
#include "llavatarnamecache.h"
|
||||
|
||||
class LLComboBox;
|
||||
class LLLineEditor;
|
||||
|
||||
enum EOnlineStatus
|
||||
{
|
||||
ONLINE_STATUS_NO = 0,
|
||||
ONLINE_STATUS_YES = 1
|
||||
};
|
||||
|
||||
/**
|
||||
* Base class for any Profile View or My Profile Panel.
|
||||
*/
|
||||
class LLPanelProfileTab
|
||||
: public LLPanel
|
||||
, public LLAvatarPropertiesObserver
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Sets avatar ID, sets panel as observer of avatar related info replies from server.
|
||||
*/
|
||||
virtual void setAvatarId(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* Returns avatar ID.
|
||||
*/
|
||||
virtual const LLUUID& getAvatarId() { return mAvatarId; }
|
||||
|
||||
/**
|
||||
* Sends update data request to server.
|
||||
*/
|
||||
virtual void updateData() = 0;
|
||||
|
||||
/**
|
||||
* Clears panel data if viewing avatar info for first time and sends update data request.
|
||||
*/
|
||||
virtual void onOpen(const LLSD& key);
|
||||
|
||||
/**
|
||||
* Profile tabs should close any opened panels here.
|
||||
*
|
||||
* Called from LLPanelProfile::onOpen() before opening new profile.
|
||||
* See LLPanelPicks::onClosePanel for example. LLPanelPicks closes picture info panel
|
||||
* before new profile is displayed, otherwise new profile will
|
||||
* be hidden behind picture info panel.
|
||||
*/
|
||||
virtual void onClosePanel() {}
|
||||
|
||||
/**
|
||||
* Resets controls visibility, state, etc.
|
||||
*/
|
||||
virtual void resetControls(){};
|
||||
|
||||
/**
|
||||
* Clears all data received from server.
|
||||
*/
|
||||
virtual void resetData(){};
|
||||
|
||||
/*virtual*/ ~LLPanelProfileTab();
|
||||
|
||||
protected:
|
||||
|
||||
LLPanelProfileTab();
|
||||
|
||||
/**
|
||||
* Scrolls panel to top when viewing avatar info for first time.
|
||||
*/
|
||||
void scrollToTop();
|
||||
|
||||
virtual void onMapButtonClick();
|
||||
|
||||
virtual void updateButtons();
|
||||
|
||||
private:
|
||||
|
||||
LLUUID mAvatarId;
|
||||
};
|
||||
|
||||
/**
|
||||
* Panel for displaying Avatar's first and second life related info.
|
||||
*/
|
||||
class LLPanelAvatarProfile
|
||||
: public LLPanelProfileTab
|
||||
, public LLFriendObserver
|
||||
, public LLVoiceClientStatusObserver
|
||||
{
|
||||
public:
|
||||
LLPanelAvatarProfile();
|
||||
/*virtual*/ ~LLPanelAvatarProfile();
|
||||
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
|
||||
/**
|
||||
* LLFriendObserver trigger
|
||||
*/
|
||||
virtual void changed(U32 mask);
|
||||
|
||||
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
|
||||
// button when voice is available
|
||||
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
|
||||
|
||||
/*virtual*/ void setAvatarId(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* Processes data received from server.
|
||||
*/
|
||||
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
/*virtual*/ void updateData();
|
||||
|
||||
/*virtual*/ void resetControls();
|
||||
|
||||
/*virtual*/ void resetData();
|
||||
|
||||
protected:
|
||||
|
||||
/**
|
||||
* Process profile related data received from server.
|
||||
*/
|
||||
virtual void processProfileProperties(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Processes group related data received from server.
|
||||
*/
|
||||
virtual void processGroupProperties(const LLAvatarGroups* avatar_groups);
|
||||
|
||||
/**
|
||||
* Fills common for Avatar profile and My Profile fields.
|
||||
*/
|
||||
virtual void fillCommonData(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Fills partner data.
|
||||
*/
|
||||
virtual void fillPartnerData(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Fills account status.
|
||||
*/
|
||||
virtual void fillAccountStatus(const LLAvatarData* avatar_data);
|
||||
|
||||
/**
|
||||
* Opens "Pay Resident" dialog.
|
||||
*/
|
||||
void pay();
|
||||
|
||||
/**
|
||||
* opens inventory and IM for sharing items
|
||||
*/
|
||||
void share();
|
||||
|
||||
/**
|
||||
* Add/remove resident to/from your block list.
|
||||
*/
|
||||
void toggleBlock();
|
||||
|
||||
void kick();
|
||||
void freeze();
|
||||
void unfreeze();
|
||||
void csr();
|
||||
|
||||
bool enableShowOnMap();
|
||||
bool enableBlock();
|
||||
bool enableUnblock();
|
||||
bool enableGod();
|
||||
|
||||
void onSeeProfileBtnClick();
|
||||
void onAddFriendButtonClick();
|
||||
void onIMButtonClick();
|
||||
void onCallButtonClick();
|
||||
void onTeleportButtonClick();
|
||||
void onShareButtonClick();
|
||||
|
||||
private:
|
||||
void onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
|
||||
|
||||
typedef std::map< std::string,LLUUID> group_map_t;
|
||||
group_map_t mGroups;
|
||||
};
|
||||
|
||||
/**
|
||||
* Panel for displaying own first and second life related info.
|
||||
*/
|
||||
class LLPanelMyProfile
|
||||
: public LLPanelAvatarProfile
|
||||
{
|
||||
public:
|
||||
LLPanelMyProfile();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
protected:
|
||||
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
|
||||
/*virtual*/ void processProfileProperties(const LLAvatarData* avatar_data);
|
||||
|
||||
/*virtual*/ void resetControls();
|
||||
|
||||
protected:
|
||||
void onStatusMessageChanged();
|
||||
};
|
||||
|
||||
/**
|
||||
* Panel for displaying Avatar's notes and modifying friend's rights.
|
||||
*/
|
||||
class LLPanelAvatarNotes
|
||||
: public LLPanelProfileTab
|
||||
, public LLFriendObserver
|
||||
, public LLVoiceClientStatusObserver
|
||||
{
|
||||
public:
|
||||
LLPanelAvatarNotes();
|
||||
/*virtual*/ ~LLPanelAvatarNotes();
|
||||
|
||||
virtual void setAvatarId(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* LLFriendObserver trigger
|
||||
*/
|
||||
virtual void changed(U32 mask);
|
||||
|
||||
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
|
||||
// button when voice is available
|
||||
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
|
||||
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
|
||||
|
||||
/*virtual*/ void updateData();
|
||||
|
||||
protected:
|
||||
|
||||
/*virtual*/ void resetControls();
|
||||
|
||||
/*virtual*/ void resetData();
|
||||
|
||||
/**
|
||||
* Fills rights data for friends.
|
||||
*/
|
||||
void fillRightsData();
|
||||
|
||||
void rightsConfirmationCallback(const LLSD& notification,
|
||||
const LLSD& response, S32 rights);
|
||||
void confirmModifyRights(bool grant, S32 rights);
|
||||
void onCommitRights();
|
||||
void onCommitNotes();
|
||||
|
||||
void onAddFriendButtonClick();
|
||||
void onIMButtonClick();
|
||||
void onCallButtonClick();
|
||||
void onTeleportButtonClick();
|
||||
void onShareButtonClick();
|
||||
void enableCheckboxes(bool enable);
|
||||
};
|
||||
|
||||
#endif // LL_LLPANELAVATAR_H
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
#include "llgroupactions.h"
|
||||
#include "llgrouplist.h"
|
||||
#include "llinventoryobserver.h"
|
||||
#include "llnetmap.h"
|
||||
#include "llpanelpeoplemenus.h"
|
||||
#include "llsidetray.h"
|
||||
#include "llsidetraypanelcontainer.h"
|
||||
|
|
@ -494,7 +495,8 @@ LLPanelPeople::LLPanelPeople()
|
|||
mNearbyGearButton(NULL),
|
||||
mFriendsGearButton(NULL),
|
||||
mGroupsGearButton(NULL),
|
||||
mRecentGearButton(NULL)
|
||||
mRecentGearButton(NULL),
|
||||
mMiniMap(NULL)
|
||||
{
|
||||
mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this));
|
||||
mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this));
|
||||
|
|
@ -567,6 +569,9 @@ BOOL LLPanelPeople::postBuild()
|
|||
mNearbyList->setNoItemsMsg(getString("no_one_near"));
|
||||
mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
|
||||
mNearbyList->setShowIcons("NearbyListShowIcons");
|
||||
mMiniMap = (LLNetMap*)getChildView("Net Map",true);
|
||||
mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
|
||||
getString("AltMiniMapToolTipMsg") : getString("MiniMapToolTipMsg"));
|
||||
|
||||
mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
|
||||
mRecentList->setNoItemsCommentText(getString("no_recent_people"));
|
||||
|
|
@ -1088,6 +1093,12 @@ void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
|
|||
|
||||
void LLPanelPeople::onAvatarListCommitted(LLAvatarList* list)
|
||||
{
|
||||
if (getActiveTabName() == NEARBY_TAB_NAME)
|
||||
{
|
||||
uuid_vec_t selected_uuids;
|
||||
getCurrentItemIDs(selected_uuids);
|
||||
mMiniMap->setSelected(selected_uuids);
|
||||
} else
|
||||
// Make sure only one of the friends lists (online/all) has selection.
|
||||
if (getActiveTabName() == FRIENDS_TAB_NAME)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -142,6 +142,7 @@ private:
|
|||
LLAvatarList* mNearbyList;
|
||||
LLAvatarList* mRecentList;
|
||||
LLGroupList* mGroupList;
|
||||
LLNetMap* mMiniMap;
|
||||
|
||||
LLHandle<LLView> mGroupPlusMenuHandle;
|
||||
LLHandle<LLView> mNearbyViewSortMenuHandle;
|
||||
|
|
|
|||
|
|
@ -273,6 +273,8 @@ void LLPreviewTexture::saveAs()
|
|||
mSaveFileName = file_picker.getFirstFile();
|
||||
mLoadingFullImage = TRUE;
|
||||
getWindow()->incBusyCount();
|
||||
|
||||
mImage->forceToSaveRawImage(0) ;//re-fetch the raw image if the old one is removed.
|
||||
mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave,
|
||||
0, TRUE, FALSE, new LLUUID( mItemUUID ), &mCallbackTextureList );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,6 +141,8 @@ public:
|
|||
|
||||
void toggleTabDocked();
|
||||
|
||||
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
|
||||
|
||||
LLPanel *getPanel();
|
||||
private:
|
||||
std::string mTabTitle;
|
||||
|
|
@ -269,6 +271,15 @@ void LLSideTrayTab::toggleTabDocked()
|
|||
LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
|
||||
}
|
||||
|
||||
BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
||||
{
|
||||
// Let children handle the event
|
||||
LLUICtrl::handleScrollWheel(x, y, clicks);
|
||||
|
||||
// and then eat it to prevent in-world scrolling (STORM-351).
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLSideTrayTab::dock(LLFloater* floater_tab)
|
||||
{
|
||||
LLSideTray* side_tray = getSideTray();
|
||||
|
|
|
|||
|
|
@ -326,6 +326,7 @@ bool LLTextureCacheRemoteWorker::doRead()
|
|||
// First state / stage : find out if the file is local
|
||||
if (mState == INIT)
|
||||
{
|
||||
#if 0
|
||||
std::string filename = mCache->getLocalFileName(mID);
|
||||
// Is it a JPEG2000 file?
|
||||
{
|
||||
|
|
@ -360,6 +361,11 @@ bool LLTextureCacheRemoteWorker::doRead()
|
|||
}
|
||||
// Determine the next stage: if we found a file, then LOCAL else CACHE
|
||||
mState = (local_size > 0 ? LOCAL : CACHE);
|
||||
|
||||
llassert_always(mState == CACHE) ;
|
||||
#else
|
||||
mState = CACHE;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Second state / stage : if the file is local, load it and leave
|
||||
|
|
@ -1592,7 +1598,7 @@ void LLTextureCache::purgeTextures(bool validate)
|
|||
if (validate)
|
||||
{
|
||||
validate_idx = gSavedSettings.getU32("CacheValidateCounter");
|
||||
U32 next_idx = (++validate_idx) % 256;
|
||||
U32 next_idx = (validate_idx + 1) % 256;
|
||||
gSavedSettings.setU32("CacheValidateCounter", next_idx);
|
||||
LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Validating: " << validate_idx << LL_ENDL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1141,7 +1141,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
//1, not openning too many file descriptors at the same time;
|
||||
//2, control the traffic of http so udp gets bandwidth.
|
||||
//
|
||||
static const S32 MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE = 32 ;
|
||||
static const S32 MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE = 8 ;
|
||||
if(mFetcher->getNumHTTPRequests() > MAX_NUM_OF_HTTP_REQUESTS_IN_QUEUE)
|
||||
{
|
||||
return false ; //wait.
|
||||
|
|
@ -1822,6 +1822,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
|
|||
mImageDecodeThread(imagedecodethread),
|
||||
mTextureBandwidth(0),
|
||||
mHTTPTextureBits(0),
|
||||
mTotalHTTPRequests(0),
|
||||
mCurlGetRequest(NULL),
|
||||
mQAMode(qa_mode)
|
||||
{
|
||||
|
|
@ -1973,6 +1974,7 @@ void LLTextureFetch::addToHTTPQueue(const LLUUID& id)
|
|||
{
|
||||
LLMutexLock lock(&mNetworkQueueMutex);
|
||||
mHTTPTextureQueue.insert(id);
|
||||
mTotalHTTPRequests++;
|
||||
}
|
||||
|
||||
void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id, S32 received_size)
|
||||
|
|
@ -2035,6 +2037,15 @@ S32 LLTextureFetch::getNumHTTPRequests()
|
|||
return size ;
|
||||
}
|
||||
|
||||
U32 LLTextureFetch::getTotalNumHTTPRequests()
|
||||
{
|
||||
mNetworkQueueMutex.lock() ;
|
||||
U32 size = mTotalHTTPRequests ;
|
||||
mNetworkQueueMutex.unlock() ;
|
||||
|
||||
return size ;
|
||||
}
|
||||
|
||||
// call lockQueue() first!
|
||||
LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ public:
|
|||
void dump();
|
||||
S32 getNumRequests() ;
|
||||
S32 getNumHTTPRequests() ;
|
||||
U32 getTotalNumHTTPRequests() ;
|
||||
|
||||
// Public for access by callbacks
|
||||
S32 getPending();
|
||||
|
|
@ -183,6 +184,9 @@ private:
|
|||
|
||||
U32 mHTTPTextureBits;
|
||||
|
||||
//debug use
|
||||
U32 mTotalHTTPRequests ;
|
||||
|
||||
// Out-of-band cross-thread command queue. This command queue
|
||||
// is logically tied to LLQueuedThread's list of
|
||||
// QueuedRequest instances and so must be covered by the
|
||||
|
|
|
|||
|
|
@ -516,6 +516,7 @@ void LLGLTexMemBar::draw()
|
|||
S32 v_offset = (S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);
|
||||
F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024);
|
||||
F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024);
|
||||
U32 total_http_requests = LLAppViewer::getTextureFetch()->getTotalNumHTTPRequests() ;
|
||||
//----------------------------------------------------------------------------
|
||||
LLGLSUIDefault gls_ui;
|
||||
LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
|
||||
|
|
@ -526,13 +527,13 @@ void LLGLTexMemBar::draw()
|
|||
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
|
||||
text_color, LLFontGL::LEFT, LLFontGL::TOP);
|
||||
|
||||
text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB",
|
||||
text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d",
|
||||
total_mem,
|
||||
max_total_mem,
|
||||
bound_mem,
|
||||
max_bound_mem,
|
||||
LLImageRaw::sGlobalRawMemory >> 20, discard_bias,
|
||||
cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded);
|
||||
cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded, total_http_requests);
|
||||
//, cache_entries, cache_max_entries
|
||||
|
||||
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,
|
||||
|
|
|
|||
|
|
@ -1832,16 +1832,17 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
|
|||
media_source->ignore_ssl_cert_errors(true);
|
||||
}
|
||||
|
||||
// start by assuming the default CA file will be used
|
||||
std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "lindenlab.pem" );
|
||||
|
||||
// default turned off so pick up the user specified path
|
||||
if( ! gSavedSettings.getBOOL("BrowserUseDefaultCAFile"))
|
||||
{
|
||||
ca_path = gSavedSettings.getString("BrowserCAFilePath");
|
||||
}
|
||||
// set the path to the CA.pem file
|
||||
media_source->addCertificateFilePath( ca_path );
|
||||
// NOTE: Removed as per STORM-927 - SSL handshake failed - setting local self-signed certs like this
|
||||
// seems to screw things up big time. For now, devs will need to add these certs locally and Qt will pick them up.
|
||||
// // start by assuming the default CA file will be used
|
||||
// std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "lindenlab.pem" );
|
||||
// // default turned off so pick up the user specified path
|
||||
// if( ! gSavedSettings.getBOOL("BrowserUseDefaultCAFile"))
|
||||
// {
|
||||
// ca_path = gSavedSettings.getString("BrowserCAFilePath");
|
||||
// }
|
||||
// // set the path to the CA.pem file
|
||||
// media_source->addCertificateFilePath( ca_path );
|
||||
|
||||
media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort"));
|
||||
|
||||
|
|
|
|||
|
|
@ -2721,6 +2721,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
|
|||
LLSD args;
|
||||
args["slurl"] = location;
|
||||
args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
|
||||
|
||||
// Look for IRC-style emotes here so object name formatting is correct
|
||||
std::string prefix = message.substr(0, 4);
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
{
|
||||
chat.mChatStyle = CHAT_STYLE_IRC;
|
||||
}
|
||||
|
||||
LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -161,19 +161,13 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,
|
|||
return (((U64)index) << 32) | (U64)local_id;
|
||||
}
|
||||
|
||||
BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
|
||||
BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)
|
||||
{
|
||||
if(object.getRegion())
|
||||
if(objectp && objectp->getRegion())
|
||||
{
|
||||
U32 local_id = object.mLocalID;
|
||||
LLHost region_host = object.getRegion()->getHost();
|
||||
if(!region_host.isOk())
|
||||
{
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
U32 ip = region_host.getAddress();
|
||||
U32 port = region_host.getPort();
|
||||
U32 local_id = objectp->mLocalID;
|
||||
U32 ip = objectp->getRegion()->getHost().getAddress();
|
||||
U32 port = objectp->getRegion()->getHost().getPort();
|
||||
U64 ipport = (((U64)ip) << 32) | (U64)port;
|
||||
U32 index = sIPAndPortToIndex[ipport];
|
||||
|
||||
|
|
@ -188,7 +182,7 @@ BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object)
|
|||
}
|
||||
|
||||
// Found existing entry
|
||||
if (iter->second == object.getID())
|
||||
if (iter->second == objectp->getID())
|
||||
{ // Full UUIDs match, so remove the entry
|
||||
sIndexAndLocalIDToUUID.erase(iter);
|
||||
return TRUE;
|
||||
|
|
@ -478,7 +472,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
|
|||
// << ", regionp " << (U32) regionp << ", object region " << (U32) objectp->getRegion()
|
||||
// << llendl;
|
||||
//}
|
||||
removeFromLocalIDTable(*objectp);
|
||||
removeFromLocalIDTable(objectp);
|
||||
setUUIDAndLocal(fullid,
|
||||
local_id,
|
||||
gMessageSystem->getSenderIP(),
|
||||
|
|
@ -1210,7 +1204,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
|
|||
// << objectp->getRegion()->getHost().getPort() << llendl;
|
||||
//}
|
||||
|
||||
removeFromLocalIDTable(*objectp);
|
||||
removeFromLocalIDTable(objectp);
|
||||
|
||||
if (objectp->onActiveList())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ public:
|
|||
const U32 ip,
|
||||
const U32 port); // Requires knowledge of message system info!
|
||||
|
||||
static BOOL removeFromLocalIDTable(const LLViewerObject &object);
|
||||
static BOOL removeFromLocalIDTable(const LLViewerObject* objectp);
|
||||
// Used ONLY by the orphaned object code.
|
||||
static U64 getIndex(const U32 local_id, const U32 ip, const U32 port);
|
||||
|
||||
|
|
|
|||
|
|
@ -322,6 +322,12 @@ LLViewerRegion::~LLViewerRegion()
|
|||
std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer());
|
||||
}
|
||||
|
||||
/*virtual*/
|
||||
const LLHost& LLViewerRegion::getHost() const
|
||||
{
|
||||
return mHost;
|
||||
}
|
||||
|
||||
void LLViewerRegion::loadObjectCache()
|
||||
{
|
||||
if (mCacheLoaded)
|
||||
|
|
|
|||
|
|
@ -245,7 +245,7 @@ public:
|
|||
LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); }
|
||||
|
||||
/// implements LLCapabilityProvider
|
||||
virtual LLHost getHost() const { return mHost; }
|
||||
/*virtual*/ const LLHost& getHost() const;
|
||||
const U64 &getHandle() const { return mHandle; }
|
||||
|
||||
LLSurface &getLand() const { return *mLandp; }
|
||||
|
|
|
|||
|
|
@ -1214,12 +1214,15 @@ void LLViewerFetchedTexture::cleanup()
|
|||
|
||||
void LLViewerFetchedTexture::setForSculpt()
|
||||
{
|
||||
static const S32 MAX_INTERVAL = 8 ; //frames
|
||||
|
||||
mForSculpt = TRUE ;
|
||||
if(isForSculptOnly() && !getBoundRecently())
|
||||
{
|
||||
destroyGLTexture() ; //sculpt image does not need gl texture.
|
||||
}
|
||||
checkCachedRawSculptImage() ;
|
||||
setMaxVirtualSizeResetInterval(MAX_INTERVAL) ;
|
||||
}
|
||||
|
||||
BOOL LLViewerFetchedTexture::isForSculptOnly() const
|
||||
|
|
|
|||
|
|
@ -298,13 +298,15 @@ private:
|
|||
line_list_t mLineList;
|
||||
LLColor4 mTextColor;
|
||||
|
||||
public:
|
||||
LLDebugText(LLViewerWindow* window) : mWindow(window) {}
|
||||
|
||||
void addText(S32 x, S32 y, const std::string &text)
|
||||
{
|
||||
mLineList.push_back(Line(text, x, y));
|
||||
}
|
||||
|
||||
void clearText() { mLineList.clear(); }
|
||||
|
||||
public:
|
||||
LLDebugText(LLViewerWindow* window) : mWindow(window) {}
|
||||
|
||||
void update()
|
||||
{
|
||||
|
|
@ -325,6 +327,8 @@ public:
|
|||
U32 ypos = 64;
|
||||
const U32 y_inc = 20;
|
||||
|
||||
clearText();
|
||||
|
||||
if (gSavedSettings.getBOOL("DebugShowTime"))
|
||||
{
|
||||
const U32 y_inc2 = 15;
|
||||
|
|
@ -349,6 +353,14 @@ public:
|
|||
addText(xpos, ypos, llformat("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc;
|
||||
}
|
||||
|
||||
#if LL_WINDOWS
|
||||
if (gSavedSettings.getBOOL("DebugShowMemory"))
|
||||
{
|
||||
addText(xpos, ypos, llformat("Memory: %d (KB)", LLMemory::getWorkingSetSize() / 1024));
|
||||
ypos += y_inc;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (gDisplayCameraPos)
|
||||
{
|
||||
std::string camera_view_text;
|
||||
|
|
@ -676,6 +688,50 @@ public:
|
|||
|
||||
ypos += y_inc;
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("DebugShowTextureInfo"))
|
||||
{
|
||||
LLViewerObject* objectp = NULL ;
|
||||
//objectp = = gAgentCamera.getFocusObject();
|
||||
|
||||
LLSelectNode* nodep = LLSelectMgr::instance().getHoverNode();
|
||||
if (nodep)
|
||||
{
|
||||
objectp = nodep->getObject();
|
||||
}
|
||||
if (objectp && !objectp->isDead())
|
||||
{
|
||||
S32 num_faces = objectp->mDrawable->getNumFaces() ;
|
||||
|
||||
for(S32 i = 0 ; i < num_faces; i++)
|
||||
{
|
||||
LLFace* facep = objectp->mDrawable->getFace(i) ;
|
||||
if(facep)
|
||||
{
|
||||
//addText(xpos, ypos, llformat("ts_min: %.3f ts_max: %.3f tt_min: %.3f tt_max: %.3f", facep->mTexExtents[0].mV[0], facep->mTexExtents[1].mV[0],
|
||||
// facep->mTexExtents[0].mV[1], facep->mTexExtents[1].mV[1]));
|
||||
//ypos += y_inc;
|
||||
|
||||
addText(xpos, ypos, llformat("v_size: %.3f: p_size: %.3f", facep->getVirtualSize(), facep->getPixelArea()));
|
||||
ypos += y_inc;
|
||||
|
||||
//const LLTextureEntry *tep = facep->getTextureEntry();
|
||||
//if(tep)
|
||||
//{
|
||||
// addText(xpos, ypos, llformat("scale_s: %.3f: scale_t: %.3f", tep->mScaleS, tep->mScaleT)) ;
|
||||
// ypos += y_inc;
|
||||
//}
|
||||
|
||||
LLViewerTexture* tex = facep->getTexture() ;
|
||||
if(tex)
|
||||
{
|
||||
addText(xpos, ypos, llformat("ID: %s v_size: %.3f", tex->getID().asString().c_str(), tex->getMaxVirtualSize()));
|
||||
ypos += y_inc;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw()
|
||||
|
|
|
|||
|
|
@ -225,8 +225,9 @@ BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const
|
|||
// Format string used to construct filename for the object cache
|
||||
static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc";
|
||||
|
||||
// Throw out 1/20 (5%) of our cache entries if we run out of room.
|
||||
const U32 ENTRIES_PURGE_FACTOR = 20;
|
||||
const U32 MAX_NUM_OBJECT_ENTRIES = 128 ;
|
||||
const U32 MIN_ENTRIES_TO_PURGE = 16 ;
|
||||
const U32 INVALID_TIME = 0 ;
|
||||
const char* object_cache_dirname = "objectcache";
|
||||
const char* header_filename = "object.cache";
|
||||
|
||||
|
|
@ -261,6 +262,7 @@ void LLVOCache::destroyClass()
|
|||
LLVOCache::LLVOCache():
|
||||
mInitialized(FALSE),
|
||||
mReadOnly(TRUE),
|
||||
mNumEntries(0),
|
||||
mCacheSize(1)
|
||||
{
|
||||
mEnabled = gSavedSettings.getBOOL("ObjectCacheEnabled");
|
||||
|
|
@ -298,17 +300,16 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
|
|||
llwarns << "Cache already initialized." << llendl;
|
||||
return ;
|
||||
}
|
||||
mInitialized = TRUE ;
|
||||
|
||||
setDirNames(location);
|
||||
if (!mReadOnly)
|
||||
{
|
||||
LLFile::mkdir(mObjectCacheDirName);
|
||||
}
|
||||
|
||||
mCacheSize = size;
|
||||
|
||||
readCacheHeader();
|
||||
mInitialized = TRUE ;
|
||||
mCacheSize = llclamp(size, MIN_ENTRIES_TO_PURGE, MAX_NUM_OBJECT_ENTRIES);
|
||||
mMetaInfo.mVersion = cache_version;
|
||||
readCacheHeader();
|
||||
|
||||
if(mMetaInfo.mVersion != cache_version)
|
||||
{
|
||||
|
|
@ -332,6 +333,8 @@ void LLVOCache::removeCache(ELLPath location)
|
|||
return ;
|
||||
}
|
||||
|
||||
llinfos << "about to remove the object cache due to settings." << llendl ;
|
||||
|
||||
std::string delem = gDirUtilp->getDirDelimiter();
|
||||
std::string mask = delem + "*";
|
||||
std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
|
||||
|
|
@ -352,6 +355,8 @@ void LLVOCache::removeCache()
|
|||
return ;
|
||||
}
|
||||
|
||||
llinfos << "about to remove the object cache due to some error." << llendl ;
|
||||
|
||||
std::string delem = gDirUtilp->getDirDelimiter();
|
||||
std::string mask = delem + "*";
|
||||
llinfos << "Removing cache at " << mObjectCacheDirName << llendl;
|
||||
|
|
@ -361,10 +366,54 @@ void LLVOCache::removeCache()
|
|||
writeCacheHeader();
|
||||
}
|
||||
|
||||
void LLVOCache::removeEntry(HeaderEntryInfo* entry)
|
||||
{
|
||||
llassert_always(mInitialized) ;
|
||||
if(mReadOnly)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
if(!entry)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
header_entry_queue_t::iterator iter = mHeaderEntryQueue.find(entry) ;
|
||||
if(iter != mHeaderEntryQueue.end())
|
||||
{
|
||||
mHandleEntryMap.erase(entry->mHandle) ;
|
||||
mHeaderEntryQueue.erase(iter) ;
|
||||
removeFromCache(entry) ;
|
||||
delete entry ;
|
||||
|
||||
mNumEntries = mHandleEntryMap.size() ;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVOCache::removeEntry(U64 handle)
|
||||
{
|
||||
handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ;
|
||||
if(iter == mHandleEntryMap.end()) //no cache
|
||||
{
|
||||
return ;
|
||||
}
|
||||
HeaderEntryInfo* entry = iter->second ;
|
||||
removeEntry(entry) ;
|
||||
}
|
||||
|
||||
void LLVOCache::clearCacheInMemory()
|
||||
{
|
||||
std::for_each(mHandleEntryMap.begin(), mHandleEntryMap.end(), DeletePairedPointer());
|
||||
mHandleEntryMap.clear();
|
||||
if(!mHeaderEntryQueue.empty())
|
||||
{
|
||||
for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin(); iter != mHeaderEntryQueue.end(); ++iter)
|
||||
{
|
||||
delete *iter ;
|
||||
}
|
||||
mHeaderEntryQueue.clear();
|
||||
mHandleEntryMap.clear();
|
||||
mNumEntries = 0 ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLVOCache::getObjectCacheFilename(U64 handle, std::string& filename)
|
||||
|
|
@ -378,45 +427,19 @@ void LLVOCache::getObjectCacheFilename(U64 handle, std::string& filename)
|
|||
return ;
|
||||
}
|
||||
|
||||
void LLVOCache::removeFromCache(U64 handle)
|
||||
void LLVOCache::removeFromCache(HeaderEntryInfo* entry)
|
||||
{
|
||||
if(mReadOnly)
|
||||
{
|
||||
llwarns << "Not removing cache for handle " << handle << ": Cache is currently in read-only mode." << llendl;
|
||||
llwarns << "Not removing cache for handle " << entry->mHandle << ": Cache is currently in read-only mode." << llendl;
|
||||
return ;
|
||||
}
|
||||
|
||||
std::string filename;
|
||||
getObjectCacheFilename(handle, filename);
|
||||
LLAPRFile::remove(filename, mLocalAPRFilePoolp);
|
||||
}
|
||||
|
||||
BOOL LLVOCache::checkRead(LLAPRFile* apr_file, void* src, S32 n_bytes, bool remove_cache_on_error)
|
||||
{
|
||||
if(!check_read(apr_file, src, n_bytes))
|
||||
{
|
||||
if (remove_cache_on_error)
|
||||
{
|
||||
removeCache() ;
|
||||
}
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
BOOL LLVOCache::checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes, bool remove_cache_on_error)
|
||||
{
|
||||
if(!check_write(apr_file, src, n_bytes))
|
||||
{
|
||||
if (remove_cache_on_error)
|
||||
{
|
||||
removeCache() ;
|
||||
}
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
return TRUE ;
|
||||
getObjectCacheFilename(entry->mHandle, filename);
|
||||
LLAPRFile::remove(filename, mLocalAPRFilePoolp);
|
||||
entry->mTime = INVALID_TIME ;
|
||||
updateEntry(entry) ; //update the head file.
|
||||
}
|
||||
|
||||
void LLVOCache::readCacheHeader()
|
||||
|
|
@ -430,45 +453,76 @@ void LLVOCache::readCacheHeader()
|
|||
//clear stale info.
|
||||
clearCacheInMemory();
|
||||
|
||||
bool success = true ;
|
||||
if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp))
|
||||
{
|
||||
LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_FOPEN_READ|APR_FOPEN_BINARY, mLocalAPRFilePoolp);
|
||||
LLAPRFile apr_file(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
|
||||
|
||||
//read the meta element
|
||||
bool remove_cache_on_error = false;
|
||||
if(!checkRead(apr_file, &mMetaInfo, sizeof(HeaderMetaInfo), remove_cache_on_error))
|
||||
success = check_read(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ;
|
||||
|
||||
if(success)
|
||||
{
|
||||
llwarns << "Error reading meta information from cache header." << llendl;
|
||||
delete apr_file;
|
||||
return;
|
||||
}
|
||||
|
||||
HeaderEntryInfo* entry ;
|
||||
for(U32 entry_index = 0; entry_index < mCacheSize; ++entry_index)
|
||||
{
|
||||
entry = new HeaderEntryInfo() ;
|
||||
if(!checkRead(apr_file, entry, sizeof(HeaderEntryInfo), remove_cache_on_error))
|
||||
HeaderEntryInfo* entry = NULL ;
|
||||
mNumEntries = 0 ;
|
||||
U32 num_read = 0 ;
|
||||
while(num_read++ < MAX_NUM_OBJECT_ENTRIES)
|
||||
{
|
||||
llwarns << "Error reading cache header entry. (entry_index=" << entry_index << ")" << llendl;
|
||||
delete entry ;
|
||||
break;
|
||||
if(!entry)
|
||||
{
|
||||
entry = new HeaderEntryInfo() ;
|
||||
}
|
||||
success = check_read(&apr_file, entry, sizeof(HeaderEntryInfo));
|
||||
|
||||
if(!success) //failed
|
||||
{
|
||||
llwarns << "Error reading cache header entry. (entry_index=" << mNumEntries << ")" << llendl;
|
||||
delete entry ;
|
||||
entry = NULL ;
|
||||
break ;
|
||||
}
|
||||
else if(entry->mTime == INVALID_TIME)
|
||||
{
|
||||
continue ; //an empty entry
|
||||
}
|
||||
|
||||
entry->mIndex = mNumEntries++ ;
|
||||
mHeaderEntryQueue.insert(entry) ;
|
||||
mHandleEntryMap[entry->mHandle] = entry ;
|
||||
entry = NULL ;
|
||||
}
|
||||
else if(!entry->mTime) //end of the cache.
|
||||
if(entry)
|
||||
{
|
||||
delete entry ;
|
||||
break;
|
||||
}
|
||||
|
||||
entry->mIndex = entry_index;
|
||||
mHandleEntryMap[entry->mHandle] = entry;
|
||||
}
|
||||
|
||||
delete apr_file ;
|
||||
//---------
|
||||
//debug code
|
||||
//----------
|
||||
//std::string name ;
|
||||
//for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter)
|
||||
//{
|
||||
// getObjectCacheFilename((*iter)->mHandle, name) ;
|
||||
// llinfos << name << llendl ;
|
||||
//}
|
||||
//-----------
|
||||
}
|
||||
else
|
||||
{
|
||||
writeCacheHeader() ;
|
||||
}
|
||||
|
||||
if(!success)
|
||||
{
|
||||
removeCache() ; //failed to read header, clear the cache
|
||||
}
|
||||
else if(mNumEntries >= mCacheSize)
|
||||
{
|
||||
purgeEntries(mCacheSize) ;
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
void LLVOCache::writeCacheHeader()
|
||||
|
|
@ -485,60 +539,50 @@ void LLVOCache::writeCacheHeader()
|
|||
return;
|
||||
}
|
||||
|
||||
LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_FOPEN_CREATE|APR_FOPEN_WRITE|APR_FOPEN_BINARY|APR_FOPEN_TRUNCATE, mLocalAPRFilePoolp);
|
||||
|
||||
//write the meta element
|
||||
if(!checkWrite(apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)))
|
||||
bool success = true ;
|
||||
{
|
||||
llwarns << "Error writing meta information to cache header." << llendl;
|
||||
delete apr_file;
|
||||
return;
|
||||
}
|
||||
LLAPRFile apr_file(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
|
||||
|
||||
U32 entry_index = 0;
|
||||
handle_entry_map_t::iterator iter_end = mHandleEntryMap.end();
|
||||
for(handle_entry_map_t::iterator iter = mHandleEntryMap.begin();
|
||||
iter != iter_end;
|
||||
++iter)
|
||||
{
|
||||
HeaderEntryInfo* entry = iter->second;
|
||||
entry->mIndex = entry_index++;
|
||||
if(!checkWrite(apr_file, (void*)entry, sizeof(HeaderEntryInfo)))
|
||||
//write the meta element
|
||||
success = check_write(&apr_file, &mMetaInfo, sizeof(HeaderMetaInfo)) ;
|
||||
|
||||
|
||||
mNumEntries = 0 ;
|
||||
for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; success && iter != mHeaderEntryQueue.end(); ++iter)
|
||||
{
|
||||
llwarns << "Failed to write cache header for entry " << entry->mHandle << " (entry_index = " << entry_index << ")" << llendl;
|
||||
delete apr_file;
|
||||
return;
|
||||
(*iter)->mIndex = mNumEntries++ ;
|
||||
success = check_write(&apr_file, (void*)*iter, sizeof(HeaderEntryInfo));
|
||||
}
|
||||
}
|
||||
|
||||
// Why do we need to fill the cache header with default entries? DK 2010-12-14
|
||||
// It looks like we currently rely on the file being pre-allocated so we can seek during updateEntry().
|
||||
if(entry_index < mCacheSize)
|
||||
{
|
||||
HeaderEntryInfo* entry = new HeaderEntryInfo() ;
|
||||
for(; entry_index < mCacheSize; ++entry_index)
|
||||
|
||||
mNumEntries = mHeaderEntryQueue.size() ;
|
||||
if(success && mNumEntries < MAX_NUM_OBJECT_ENTRIES)
|
||||
{
|
||||
//fill the cache with the default entry.
|
||||
if(!checkWrite(apr_file, entry, sizeof(HeaderEntryInfo)))
|
||||
HeaderEntryInfo* entry = new HeaderEntryInfo() ;
|
||||
entry->mTime = INVALID_TIME ;
|
||||
for(S32 i = mNumEntries ; success && i < MAX_NUM_OBJECT_ENTRIES ; i++)
|
||||
{
|
||||
llwarns << "Failed to fill cache header with default entries (entry_index = " << entry_index << "). Switching to read-only mode." << llendl;
|
||||
mReadOnly = TRUE ; //disable the cache.
|
||||
break;
|
||||
//fill the cache with the default entry.
|
||||
success = check_write(&apr_file, entry, sizeof(HeaderEntryInfo)) ;
|
||||
|
||||
}
|
||||
delete entry ;
|
||||
}
|
||||
delete entry ;
|
||||
}
|
||||
delete apr_file ;
|
||||
|
||||
if(!success)
|
||||
{
|
||||
clearCacheInMemory() ;
|
||||
mReadOnly = TRUE ; //disable the cache.
|
||||
}
|
||||
return ;
|
||||
}
|
||||
|
||||
BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry)
|
||||
{
|
||||
LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_FOPEN_WRITE|APR_FOPEN_BINARY, mLocalAPRFilePoolp);
|
||||
apr_file->seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ;
|
||||
LLAPRFile apr_file(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
|
||||
apr_file.seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ;
|
||||
|
||||
BOOL result = checkWrite(apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ;
|
||||
delete apr_file;
|
||||
return result;
|
||||
return check_write(&apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ;
|
||||
}
|
||||
|
||||
void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map)
|
||||
|
|
@ -557,76 +601,66 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
|
|||
return ;
|
||||
}
|
||||
|
||||
std::string filename;
|
||||
getObjectCacheFilename(handle, filename);
|
||||
LLAPRFile* apr_file = new LLAPRFile(filename, APR_FOPEN_READ|APR_FOPEN_BINARY, mLocalAPRFilePoolp);
|
||||
bool success = true ;
|
||||
{
|
||||
std::string filename;
|
||||
getObjectCacheFilename(handle, filename);
|
||||
LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
|
||||
|
||||
LLUUID cache_id ;
|
||||
success = check_read(&apr_file, cache_id.mData, UUID_BYTES) ;
|
||||
|
||||
if(success)
|
||||
{
|
||||
if(cache_id != id)
|
||||
{
|
||||
llinfos << "Cache ID doesn't match for this region, discarding"<< llendl;
|
||||
success = false ;
|
||||
}
|
||||
|
||||
LLUUID cache_id ;
|
||||
if(!checkRead(apr_file, cache_id.mData, UUID_BYTES))
|
||||
{
|
||||
llwarns << "Error reading cache_id from " << filename << llendl;
|
||||
delete apr_file;
|
||||
return ;
|
||||
}
|
||||
if(cache_id != id)
|
||||
{
|
||||
llwarns << "Cache ID (" << cache_id << ") doesn't match id for this region (" << id << "), discarding. handle = " << handle << llendl;
|
||||
delete apr_file ;
|
||||
return ;
|
||||
}
|
||||
|
||||
S32 num_entries;
|
||||
if(!checkRead(apr_file, &num_entries, sizeof(S32)))
|
||||
{
|
||||
llwarns << "Error reading num_entries from " << filename << llendl;
|
||||
delete apr_file;
|
||||
return ;
|
||||
if(success)
|
||||
{
|
||||
S32 num_entries;
|
||||
success = check_read(&apr_file, &num_entries, sizeof(S32)) ;
|
||||
|
||||
for (S32 i = 0; success && i < num_entries; i++)
|
||||
{
|
||||
LLVOCacheEntry* entry = new LLVOCacheEntry(&apr_file);
|
||||
if (!entry->getLocalID())
|
||||
{
|
||||
llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl;
|
||||
delete entry ;
|
||||
success = false ;
|
||||
}
|
||||
cache_entry_map[entry->getLocalID()] = entry;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (S32 i = 0; i < num_entries; i++)
|
||||
if(!success)
|
||||
{
|
||||
LLVOCacheEntry* entry = new LLVOCacheEntry(apr_file);
|
||||
if (!entry->getLocalID())
|
||||
if(cache_entry_map.empty())
|
||||
{
|
||||
llwarns << "Aborting cache file load for " << filename << ", cache file corruption! (entry number = " << i << ")" << llendl;
|
||||
delete entry ;
|
||||
break;
|
||||
removeEntry(iter->second) ;
|
||||
}
|
||||
cache_entry_map[entry->getLocalID()] = entry;
|
||||
}
|
||||
|
||||
delete apr_file ;
|
||||
return ;
|
||||
}
|
||||
|
||||
void LLVOCache::purgeEntries()
|
||||
void LLVOCache::purgeEntries(U32 size)
|
||||
{
|
||||
U32 limit = mCacheSize - (mCacheSize / ENTRIES_PURGE_FACTOR);
|
||||
limit = llclamp(limit, (U32)1, mCacheSize);
|
||||
// Construct a vector of entries out of the map so we can sort by time.
|
||||
std::vector<HeaderEntryInfo*> header_vector;
|
||||
handle_entry_map_t::iterator iter_end = mHandleEntryMap.end();
|
||||
for (handle_entry_map_t::iterator iter = mHandleEntryMap.begin();
|
||||
iter != iter_end;
|
||||
++iter)
|
||||
while(mHeaderEntryQueue.size() >= size)
|
||||
{
|
||||
header_vector.push_back(iter->second);
|
||||
}
|
||||
// Sort by time, oldest first.
|
||||
std::sort(header_vector.begin(), header_vector.end(), header_entry_less());
|
||||
while(header_vector.size() > limit)
|
||||
{
|
||||
HeaderEntryInfo* entry = header_vector.front();
|
||||
|
||||
removeFromCache(entry->mHandle);
|
||||
header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ;
|
||||
HeaderEntryInfo* entry = *iter ;
|
||||
mHandleEntryMap.erase(entry->mHandle);
|
||||
header_vector.erase(header_vector.begin());
|
||||
mHeaderEntryQueue.erase(iter) ;
|
||||
removeFromCache(entry) ;
|
||||
delete entry;
|
||||
}
|
||||
|
||||
writeCacheHeader() ;
|
||||
// *TODO: Verify that we can avoid re-reading the cache header. DK 2010-12-14
|
||||
readCacheHeader() ;
|
||||
mNumEntries = mHandleEntryMap.size() ;
|
||||
}
|
||||
|
||||
void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache)
|
||||
|
|
@ -642,31 +676,34 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
|
|||
{
|
||||
llwarns << "Not writing cache for handle " << handle << "): Cache is currently in read-only mode." << llendl;
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
U32 num_handle_entries = mHandleEntryMap.size();
|
||||
|
||||
HeaderEntryInfo* entry;
|
||||
handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ;
|
||||
if(iter == mHandleEntryMap.end()) //new entry
|
||||
{
|
||||
if(num_handle_entries >= mCacheSize)
|
||||
{
|
||||
if(mNumEntries >= mCacheSize - 1)
|
||||
{
|
||||
purgeEntries() ;
|
||||
num_handle_entries = mHandleEntryMap.size();
|
||||
purgeEntries(mCacheSize - 1) ;
|
||||
}
|
||||
|
||||
|
||||
entry = new HeaderEntryInfo();
|
||||
entry->mHandle = handle ;
|
||||
entry->mTime = time(NULL) ;
|
||||
entry->mIndex = num_handle_entries++;
|
||||
entry->mIndex = mNumEntries++;
|
||||
mHeaderEntryQueue.insert(entry) ;
|
||||
mHandleEntryMap[handle] = entry ;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Update access time.
|
||||
entry = iter->second ;
|
||||
entry = iter->second ;
|
||||
|
||||
//resort
|
||||
mHeaderEntryQueue.erase(entry) ;
|
||||
|
||||
entry->mTime = time(NULL) ;
|
||||
mHeaderEntryQueue.insert(entry) ;
|
||||
}
|
||||
|
||||
//update cache header
|
||||
|
|
@ -683,37 +720,33 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
|
|||
}
|
||||
|
||||
//write to cache file
|
||||
std::string filename;
|
||||
getObjectCacheFilename(handle, filename);
|
||||
LLAPRFile* apr_file = new LLAPRFile(filename, APR_FOPEN_CREATE|APR_FOPEN_WRITE|APR_FOPEN_BINARY|APR_FOPEN_TRUNCATE, mLocalAPRFilePoolp);
|
||||
bool success = true ;
|
||||
{
|
||||
std::string filename;
|
||||
getObjectCacheFilename(handle, filename);
|
||||
LLAPRFile apr_file(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp);
|
||||
|
||||
if(!checkWrite(apr_file, (void*)id.mData, UUID_BYTES))
|
||||
{
|
||||
llwarns << "Error writing id to " << filename << llendl;
|
||||
delete apr_file;
|
||||
return ;
|
||||
}
|
||||
success = check_write(&apr_file, (void*)id.mData, UUID_BYTES) ;
|
||||
|
||||
S32 num_entries = cache_entry_map.size() ;
|
||||
if(!checkWrite(apr_file, &num_entries, sizeof(S32)))
|
||||
{
|
||||
llwarns << "Error writing num_entries to " << filename << llendl;
|
||||
delete apr_file;
|
||||
return ;
|
||||
}
|
||||
|
||||
for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); iter != cache_entry_map.end(); ++iter)
|
||||
{
|
||||
if(!iter->second->writeToFile(apr_file))
|
||||
|
||||
if(success)
|
||||
{
|
||||
llwarns << "Aborting cache file write for " << filename << ", error writing to file!" << llendl;
|
||||
//failed
|
||||
removeCache() ;
|
||||
break;
|
||||
S32 num_entries = cache_entry_map.size() ;
|
||||
success = check_write(&apr_file, &num_entries, sizeof(S32));
|
||||
|
||||
for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); success && iter != cache_entry_map.end(); ++iter)
|
||||
{
|
||||
success = iter->second->writeToFile(&apr_file) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete apr_file ;
|
||||
if(!success)
|
||||
{
|
||||
removeEntry(entry) ;
|
||||
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -95,13 +95,15 @@ private:
|
|||
{
|
||||
bool operator()(const HeaderEntryInfo* lhs, const HeaderEntryInfo* rhs) const
|
||||
{
|
||||
if (lhs->mTime == rhs->mTime)
|
||||
if(lhs->mTime == rhs->mTime)
|
||||
{
|
||||
return lhs->mHandle < rhs->mHandle;
|
||||
return lhs < rhs ;
|
||||
}
|
||||
return lhs->mTime < rhs->mTime; // older entry in front
|
||||
|
||||
return lhs->mTime < rhs->mTime ; // older entry in front of queue (set)
|
||||
}
|
||||
};
|
||||
typedef std::set<HeaderEntryInfo*, header_entry_less> header_entry_queue_t;
|
||||
typedef std::map<U64, HeaderEntryInfo*> handle_entry_map_t;
|
||||
private:
|
||||
LLVOCache() ;
|
||||
|
|
@ -114,6 +116,7 @@ public:
|
|||
|
||||
void readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) ;
|
||||
void writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) ;
|
||||
void removeEntry(U64 handle) ;
|
||||
|
||||
void setReadOnly(BOOL read_only) {mReadOnly = read_only;}
|
||||
|
||||
|
|
@ -121,15 +124,14 @@ private:
|
|||
void setDirNames(ELLPath location);
|
||||
// determine the cache filename for the region from the region handle
|
||||
void getObjectCacheFilename(U64 handle, std::string& filename);
|
||||
void removeFromCache(U64 handle);
|
||||
void removeFromCache(HeaderEntryInfo* entry);
|
||||
void readCacheHeader();
|
||||
void writeCacheHeader();
|
||||
void clearCacheInMemory();
|
||||
void removeCache() ;
|
||||
void purgeEntries();
|
||||
void removeEntry(HeaderEntryInfo* entry) ;
|
||||
void purgeEntries(U32 size);
|
||||
BOOL updateEntry(const HeaderEntryInfo* entry);
|
||||
BOOL checkRead(LLAPRFile* apr_file, void* src, S32 n_bytes, bool remove_cache_on_error = true) ;
|
||||
BOOL checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes, bool remove_cache_on_error = true) ;
|
||||
|
||||
private:
|
||||
BOOL mEnabled;
|
||||
|
|
@ -137,9 +139,11 @@ private:
|
|||
BOOL mReadOnly ;
|
||||
HeaderMetaInfo mMetaInfo;
|
||||
U32 mCacheSize;
|
||||
U32 mNumEntries;
|
||||
std::string mHeaderFileName ;
|
||||
std::string mObjectCacheDirName;
|
||||
LLVolatileAPRPool* mLocalAPRFilePoolp ;
|
||||
header_entry_queue_t mHeaderEntryQueue;
|
||||
handle_entry_map_t mHandleEntryMap;
|
||||
|
||||
static LLVOCache* sInstance ;
|
||||
|
|
|
|||
|
|
@ -399,10 +399,12 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
|
|||
// There's something bogus in the data that we're unpacking.
|
||||
dp->dumpBufferToLog();
|
||||
llwarns << "Flushing cache files" << llendl;
|
||||
std::string mask;
|
||||
mask = gDirUtilp->getDirDelimiter() + "*.slc";
|
||||
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""), mask);
|
||||
// llerrs << "Bogus TE data in " << getID() << ", crashing!" << llendl;
|
||||
|
||||
if(LLVOCache::hasInstance() && getRegion())
|
||||
{
|
||||
LLVOCache::getInstance()->removeEntry(getRegion()->getHandle()) ;
|
||||
}
|
||||
|
||||
llwarns << "Bogus TE data in " << getID() << llendl;
|
||||
}
|
||||
else
|
||||
|
|
@ -678,12 +680,33 @@ void LLVOVolume::updateTextures()
|
|||
}
|
||||
}
|
||||
|
||||
BOOL LLVOVolume::isVisible() const
|
||||
{
|
||||
if(mDrawable.notNull() && mDrawable->isVisible())
|
||||
{
|
||||
return TRUE ;
|
||||
}
|
||||
|
||||
if(isAttachment())
|
||||
{
|
||||
LLViewerObject* objp = (LLViewerObject*)getParent() ;
|
||||
while(objp && !objp->isAvatar())
|
||||
{
|
||||
objp = (LLViewerObject*)objp->getParent() ;
|
||||
}
|
||||
|
||||
return objp && objp->mDrawable.notNull() && objp->mDrawable->isVisible() ;
|
||||
}
|
||||
|
||||
return FALSE ;
|
||||
}
|
||||
|
||||
void LLVOVolume::updateTextureVirtualSize()
|
||||
{
|
||||
LLFastTimer ftm(FTM_VOLUME_TEXTURES);
|
||||
// Update the pixel area of all faces
|
||||
|
||||
if(mDrawable.isNull() || !mDrawable->isVisible())
|
||||
if(!isVisible())
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
|
@ -2882,14 +2905,7 @@ void LLVOVolume::updateRadius()
|
|||
|
||||
BOOL LLVOVolume::isAttachment() const
|
||||
{
|
||||
if (mState == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
return mState != 0 ;
|
||||
}
|
||||
|
||||
BOOL LLVOVolume::isHUDAttachment() const
|
||||
|
|
|
|||
|
|
@ -116,6 +116,7 @@ public:
|
|||
void animateTextures();
|
||||
/*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
|
||||
|
||||
BOOL isVisible() const ;
|
||||
/*virtual*/ BOOL isActive() const;
|
||||
/*virtual*/ BOOL isAttachment() const;
|
||||
/*virtual*/ BOOL isRootEdit() const; // overridden for sake of attachments treating themselves as a root object
|
||||
|
|
|
|||
|
|
@ -287,6 +287,9 @@ BOOL LLPanelBodyPartsListItem::postBuild()
|
|||
addWidgetToRightSide("btn_lock");
|
||||
addWidgetToRightSide("btn_edit_panel");
|
||||
|
||||
setWidgetsVisible(false);
|
||||
reshapeWidgets();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2295,7 +2295,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
|
|||
const LLDrawable* root = ((LLSpatialBridge*) drawablep)->mDrawable;
|
||||
llassert(root); // trying to catch a bad assumption
|
||||
if (root && // // this test may not be needed, see above
|
||||
root->getVObj()->isAttachment())
|
||||
root->getVObj()->isAttachment())
|
||||
{
|
||||
LLDrawable* rootparent = root->getParent();
|
||||
if (rootparent) // this IS sometimes NULL
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@ with the same filename but different name
|
|||
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
|
||||
<texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
|
||||
<texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
|
||||
<texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
|
||||
<texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
|
||||
<texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
|
||||
<texture name="Container" file_name="containers/Container.png" preload="false" />
|
||||
|
|
|
|||
|
|
@ -1,23 +1,23 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<!-- Side tray panel -->
|
||||
<panel label="Personer" name="people_panel">
|
||||
<string name="no_recent_people" value="Ingen tidligere personer. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/>
|
||||
<string name="no_filtered_recent_people" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
|
||||
<string name="no_one_near" value="Ingen i nærheden. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/>
|
||||
<string name="no_one_filtered_near" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
|
||||
<string name="no_recent_people" value="Ingen tidligere personer. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Søg] eller [secondlife:///app/worldmap Verdenskort]."/>
|
||||
<string name="no_filtered_recent_people" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Søg]."/>
|
||||
<string name="no_one_near" value="Ingen i nærheden. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Søg] eller [secondlife:///app/worldmap Verdenskort]."/>
|
||||
<string name="no_one_filtered_near" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Søg]."/>
|
||||
<string name="no_friends_online" value="Ingen venner online"/>
|
||||
<string name="no_friends" value="Ingen venner"/>
|
||||
<string name="no_friends_msg">
|
||||
Find venner via [secondlife:///app/search/people Search] eller højre-klik på en beboer og tilføj dem som venner.
|
||||
Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap World Map].
|
||||
Find venner via [secondlife:///app/search/people Søg] eller højre-klik på en beboer og tilføj dem som venner.
|
||||
Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Verdenskort].
|
||||
</string>
|
||||
<string name="no_filtered_friends_msg">
|
||||
Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search].
|
||||
Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Søg].
|
||||
</string>
|
||||
<string name="people_filter_label" value="Filtrér personer"/>
|
||||
<string name="groups_filter_label" value="Filtrér grupper"/>
|
||||
<string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
|
||||
<string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Search]."/>
|
||||
<string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Søg]."/>
|
||||
<string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Søg]."/>
|
||||
<filter_editor label="Filtrér" name="filter_input"/>
|
||||
<tab_container name="tabs">
|
||||
<panel label="TÆT PÅ" name="nearby_panel">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="floater_web_content" title="">
|
||||
<layout_stack name="stack1">
|
||||
<layout_panel name="nav_controls">
|
||||
<button name="back" tool_tip="Rückwärts"/>
|
||||
<button name="forward" tool_tip="Vorwärts"/>
|
||||
<button name="stop" tool_tip="Navigation stoppen"/>
|
||||
<button name="reload" tool_tip="Seite neu laden"/>
|
||||
<combo_box name="address" tool_tip="URL hier eingeben"/>
|
||||
<icon name="media_secure_lock_flag" tool_tip="Sicheres Browsen"/>
|
||||
<button name="popexternal" tool_tip="Aktuelle URL im Desktop-Browser öffnen"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</floater>
|
||||
|
|
@ -17,7 +17,8 @@
|
|||
<menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/>
|
||||
<menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
|
||||
<menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
|
||||
<menu_item_call label="Web-Browser-Test" name="Web Browser Test"/>
|
||||
<menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
|
||||
<menu_item_call label="Test Webinhalt-Floater" name="Web Content Floater Test"/>
|
||||
<menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/>
|
||||
<menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/>
|
||||
</menu>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
<menu_item_call label="Zoom Nah" name="Zoom Close"/>
|
||||
<menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
|
||||
<menu_item_call label="Zoom Weit" name="Zoom Far"/>
|
||||
<menu_item_call label="Zoom-Standard" name="Zoom Default"/>
|
||||
<menu_item_check label="Karte drehen" name="Rotate Map"/>
|
||||
<menu_item_check label="Automatisch zentrieren" name="Auto Center"/>
|
||||
<menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/>
|
||||
|
|
|
|||
|
|
@ -121,13 +121,15 @@
|
|||
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
|
||||
<menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
|
||||
</menu>
|
||||
<menu_item_call label="Rückgängig" name="Undo"/>
|
||||
<menu_item_call label="Wiederholen" name="Redo"/>
|
||||
</menu>
|
||||
<menu label="Hilfe" name="Help">
|
||||
<menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
|
||||
<menu_item_check label="Hinweise aktivieren" name="Enable Hints"/>
|
||||
<menu_item_call label="Missbrauch melden" name="Report Abuse"/>
|
||||
<menu_item_call label="Fehler melden" name="Report Bug"/>
|
||||
<menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
|
||||
<menu_item_check label="Hinweise aktivieren" name="Enable Hints"/>
|
||||
</menu>
|
||||
<menu label="Erweitert" name="Advanced">
|
||||
<menu_item_call label="Textur neu laden" name="Rebake Texture"/>
|
||||
|
|
@ -308,7 +310,8 @@
|
|||
<menu_item_call label="Regionsobjekt-Cache ausgeben" name="Dump Region Object Cache"/>
|
||||
</menu>
|
||||
<menu label="UI" name="UI">
|
||||
<menu_item_call label="Web-Browser-Test" name="Web Browser Test"/>
|
||||
<menu_item_call label="Test Medienbrowser" name="Web Browser Test"/>
|
||||
<menu_item_call label="Webinhaltsbrowser" name="Web Content Browser"/>
|
||||
<menu_item_call label="SelectMgr ausgeben" name="Dump SelectMgr"/>
|
||||
<menu_item_call label="Inventarinfo ausgeben" name="Dump Inventory"/>
|
||||
<menu_item_call label="Timer ausgeben" name="Dump Timers"/>
|
||||
|
|
|
|||
|
|
@ -109,6 +109,10 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
|
|||
Leute, die nicht auf Ihrer Freundesliste stehen, werden nicht wissen, dass Sie deren Anrufe oder Sofortnachrichten ignoriert haben.
|
||||
<usetemplate name="okbutton" yestext="Ja"/>
|
||||
</notification>
|
||||
<notification name="FavoritesOnLogin">
|
||||
Hinweis: Bei Aktivierung dieser Option sehen alle Personen, die diesen Computer benutzen, Ihre Lieblingsorte.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="GrantModifyRights">
|
||||
Wenn Sie einem anderen Einwohner Änderungsrechte gewähren, dann kann dieser JEDES Objekt, das Sie inworld besitzen, ändern, löschen oder an sich nehmen. Seien Sie daher beim Gewähren dieser Rechte sehr vorsichtig!
|
||||
Möchten Sie [NAME] Änderungsrechte gewähren?
|
||||
|
|
@ -957,7 +961,7 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
|
|||
<input name="message">
|
||||
[DESC] (neu)
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -967,7 +971,7 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
|
|||
<input name="message">
|
||||
[DESC] (neu)
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -977,7 +981,7 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
|
|||
<input name="new_name">
|
||||
[NAME]
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -1355,9 +1359,39 @@ In Ihren Anwendungsordner herunterladen?
|
|||
Laden Sie den neuesten Viewer von http://secondlife.com/download herunter und installieren Sie ihn.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackground">
|
||||
Eine aktualisierte Version von [APP_NAME] wurde heruntergeladen.
|
||||
Sie wird beim nächsten Neustart von [APP_NAME] verwendet.
|
||||
<notification name="FailedRequiredUpdateInstall">
|
||||
Ein erforderliches Update konnte nicht installiert werden.
|
||||
Sie können sich erst anmelden, wenn [APP_NAME] aktualisiert wurde.
|
||||
|
||||
Laden Sie den neuesten Viewer von http://secondlife.com/download herunter und installieren Sie ihn.
|
||||
<usetemplate name="okbutton" yestext="Beenden"/>
|
||||
</notification>
|
||||
<notification name="UpdaterServiceNotRunning">
|
||||
Für Ihre SecondLife-Installation ist ein Update erforderlich.
|
||||
|
||||
Sie können dieses Update von http://www.secondlife.com/downloads herunterladen oder jetzt installieren.
|
||||
<usetemplate name="okcancelbuttons" notext="Second Life beenden" yestext="Jetzt herunterladen und installieren"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackgroundTip">
|
||||
Für Ihre [APP_NAME]-Installation wurde ein Update heruntergeladen.
|
||||
Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informationen zu diesem Update]
|
||||
<usetemplate name="okcancelbuttons" notext="Später..." yestext="Jetzt installieren und [APP_NAME] neu starten"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackgroundDialog">
|
||||
Für Ihre [APP_NAME]-Installation wurde ein Update heruntergeladen.
|
||||
Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informationen zu diesem Update]
|
||||
<usetemplate name="okcancelbuttons" notext="Später..." yestext="Jetzt installieren und [APP_NAME] neu starten"/>
|
||||
</notification>
|
||||
<notification name="RequiredUpdateDownloadedVerboseDialog">
|
||||
Ein erforderliches Softwareupdate wurde heruntergeladen.
|
||||
Version [VERSION]
|
||||
|
||||
Zur Installation des Updates muss [APP_NAME] neu gestartet werden.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="RequiredUpdateDownloadedDialog">
|
||||
Zur Installation des Updates muss [APP_NAME] neu gestartet werden.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="DeedObjectToGroup">
|
||||
Bei Übertragung dieses Objekts erhält die Gruppe:
|
||||
|
|
@ -2225,14 +2259,6 @@ Wählen Sie eine kleinere Landfläche.
|
|||
<notification name="NoContentToSearch">
|
||||
Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (Generell, Moderat oder Adult).
|
||||
</notification>
|
||||
<notification name="GroupVote">
|
||||
[NAME] hat eine Abstimmung vorgeschlagen über:
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="VoteNow" text="Abstimmen"/>
|
||||
<button name="Later" text="Später"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="SystemMessage">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
|
|
@ -2793,9 +2819,7 @@ Avatar '[NAME]' hat Modus „Aussehen bearbeiten" verlassen.
|
|||
<notification name="NoConnect">
|
||||
Es gibt Probleme mit der Verbindung mit [PROTOCOL] [HOSTID].
|
||||
Bitte überprüfen Sie Ihre Netzwerk- und Firewalleinstellungen.
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
</form>
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="NoVoiceConnect">
|
||||
Verbindung mit Voice-Server ist leider nicht möglich:
|
||||
|
|
@ -2804,9 +2828,7 @@ Bitte überprüfen Sie Ihre Netzwerk- und Firewalleinstellungen.
|
|||
|
||||
Voice-Kommunikation ist leider nicht verfügbar.
|
||||
Bitte überprüfen Sie Ihr Netzwerk- und Firewall-Setup.
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
</form>
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="AvatarRezLeftNotification">
|
||||
(Seit [EXISTENCE] Sekunden inworld )
|
||||
|
|
@ -2841,6 +2863,9 @@ Alle stummschalten?
|
|||
<notification label="Welt erkunden" name="HintDestinationGuide">
|
||||
Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“.
|
||||
</notification>
|
||||
<notification label="Aussehen ändern" name="HintAvatarPicker">
|
||||
Möchten Sie einen neuen Look ausprobieren? Klicken Sie auf die Schaltfläche unten, um mehr Avatare zu sehen.
|
||||
</notification>
|
||||
<notification label="Seitenleiste" name="HintSidePanel">
|
||||
In der Seitenleiste können Sie schnell auf Ihr Inventar, Ihre Outfits, Ihre Profile u. ä. zugreifen.
|
||||
</notification>
|
||||
|
|
@ -2850,6 +2875,12 @@ Alle stummschalten?
|
|||
<notification label="Anzeigename" name="HintDisplayName">
|
||||
Hier können Sie Ihren anpassbaren Anzeigenamen festlegen. Der Anzeigename unterscheidet sich von Ihrem eindeutigen Benutzernamen, der nicht geändert werden kann. In den Einstellungen können Sie festlegen, welcher Name von anderen Einwohnern angezeigt wird.
|
||||
</notification>
|
||||
<notification label="Bewegen" name="HintMoveArrows">
|
||||
Verwenden Sie zum Gehen die Pfeiltasten auf Ihrer Tastatur. Drücken Sie die Nach-oben-Taste zweimal, um zu rennen.
|
||||
</notification>
|
||||
<notification label="Ansicht" name="HintView">
|
||||
Um die Kameraansicht zu ändern, verwenden Sie die Schwenk- und Kreissteuerungen. Um die Ansicht zurückzusetzen, drücken Sie die Esc-Taste oder laufen Sie einfach.
|
||||
</notification>
|
||||
<notification label="Inventar" name="HintInventory">
|
||||
In Ihrem Inventar befinden sich verschiedene Objekte. Die neuesten Objekte finden Sie in der Registerkarte „Aktuell“.
|
||||
</notification>
|
||||
|
|
@ -2863,6 +2894,15 @@ Alle stummschalten?
|
|||
<button name="open" text="Popup-Fenster öffnen"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="AuthRequest">
|
||||
Für die Site „<nolink>[HOST_NAME]</nolink>“ in der Domäne „[REALM]“ ist ein Benutzername und Kennwort erforderlich.
|
||||
<form name="form">
|
||||
<input name="username" text="Benutzername"/>
|
||||
<input name="password" text="Kennwort"/>
|
||||
<button name="ok" text="Senden"/>
|
||||
<button name="cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
<global name="UnsupportedCPU">
|
||||
- Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
|
||||
</global>
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
<string name="FormatYears">
|
||||
[COUNT]J
|
||||
</string>
|
||||
<text name="avatar_name" value="Unbekannt"/>
|
||||
<text name="avatar_name" value="(laden)"/>
|
||||
<text name="last_interaction" value="0s"/>
|
||||
<icon name="permission_edit_theirs_icon" tool_tip="Sie können die Objekte dieses Freunds bearbeiten"/>
|
||||
<icon name="permission_edit_mine_icon" tool_tip="Dieser Freund kann Ihre Objekte bearbeiten, löschen und an sich nehmen"/>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="edit_alpha_panel">
|
||||
<panel name="avatar_alpha_color_panel">
|
||||
<texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
|
||||
<texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
|
||||
<texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
|
||||
<texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
|
||||
<texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
|
||||
</panel>
|
||||
<scroll_container name="avatar_alpha_color_panel_scroll">
|
||||
<panel name="avatar_alpha_color_panel">
|
||||
<texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
|
||||
<texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
|
||||
<texture_picker label="Alpha: Kopf" name="Head Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
|
||||
<texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
|
||||
<texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Klicken, um ein Bild auszuwählen"/>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
<text name="username_text">
|
||||
Benutzername:
|
||||
</text>
|
||||
<line_editor label="berndschmidt12 oder Liebe Sonne" name="username_edit" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
|
||||
<combo_box name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
|
||||
<text name="password_text">
|
||||
Kennwort:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -16,34 +16,27 @@
|
|||
<string name="RegisterDateFormat">
|
||||
[REG_DATE] ([AGE])
|
||||
</string>
|
||||
<string name="name_text_args">
|
||||
[NAME]
|
||||
</string>
|
||||
<string name="display_name_text_args">
|
||||
[DISPLAY_NAME]
|
||||
</string>
|
||||
<layout_stack name="layout">
|
||||
<layout_panel name="profile_stack">
|
||||
<scroll_container name="profile_scroll">
|
||||
<panel name="scroll_content_panel">
|
||||
<panel name="second_life_image_panel">
|
||||
<icon label="" name="2nd_life_edit_icon" tool_tip="Klicken Sie unten auf die Schaltfläche Profil bearbeiten, um das Bild zu ändern."/>
|
||||
<text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
|
||||
<text name="display_name_descr_text">
|
||||
Benutzername
|
||||
</text>
|
||||
<text name="name_descr_text">
|
||||
Anzeigename
|
||||
</text>
|
||||
<button label="Profil" name="see_profile_btn" tool_tip="Profil zu diesem Avatar anzeigen"/>
|
||||
</panel>
|
||||
<panel name="first_life_image_panel">
|
||||
<icon label="" name="real_world_edit_icon" tool_tip="Klicken Sie unten auf die Schaltfläche Profil bearbeiten, um das Bild zu ändern."/>
|
||||
<text name="title_rw_descr_text" value="Echtes Leben:"/>
|
||||
</panel>
|
||||
<text name="title_member_text" value="Einwohner seit:"/>
|
||||
<text name="title_acc_status_text" value="Kontostatus:"/>
|
||||
<text_editor name="acc_status_text">
|
||||
Einwohner. Keine Zahlungsinfo archiviert.
|
||||
Linden.
|
||||
</text_editor>
|
||||
<text name="title_partner_text" value="Partner:"/>
|
||||
<panel name="partner_data_panel">
|
||||
<name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
|
||||
</panel>
|
||||
<text name="title_groups_text" value="Gruppen:"/>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
<panel name="profile_me_buttons_panel">
|
||||
<button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@
|
|||
<string name="message_max_lines_count" value="7"/>
|
||||
<panel label="info_panel" name="info_panel">
|
||||
<text_editor name="message" value="message"/>
|
||||
parse_urls="false"
|
||||
<button label="Senden" name="btn_submit"/>
|
||||
</panel>
|
||||
<panel label="control_panel" name="control_panel"/>
|
||||
<panel label="control_panel" name="control_panel">
|
||||
<button label="Senden" name="btn_submit"/>
|
||||
<button label="Ignorieren" name="ignore_btn"/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -29,10 +29,10 @@
|
|||
URLs
|
||||
</text>
|
||||
<text name="bubble_chat">
|
||||
Hintergrund für Blasen-Chat:
|
||||
Hintergrundfarbe für Avatarnamen (wirkt sich auch auf Blasen-Chat aus):
|
||||
</text>
|
||||
<color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen"/>
|
||||
<slider label="Deckkraft:" name="bubble_chat_opacity"/>
|
||||
<color_swatch name="background" tool_tip="Farbe für Avatarnamen auswählen"/>
|
||||
<slider label="Deckkraft:" name="bubble_chat_opacity" tool_tip="Deckkraft für Avatarnamen auswählen"/>
|
||||
<text name="floater_opacity">
|
||||
Floater-Deckkraft:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||
<text name="cache_size_label_l">
|
||||
(Standorte, Bilder, Web, Suchverlauf)
|
||||
</text>
|
||||
<check_box label="In Suchergebnissen anzeigen" name="online_searchresults"/>
|
||||
<check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/>
|
||||
<check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>
|
||||
<check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/>
|
||||
<check_box label="Meine Lieblingslandmarken bei Anmeldung anzeigen (im Dropdown-Menü „Hier anfangen“)" name="favorites_on_login_check"/>
|
||||
<text name="Logs:">
|
||||
Chatprotokolle:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -39,5 +39,11 @@
|
|||
</text>
|
||||
<line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/>
|
||||
<spinner label="Portnummer:" name="web_proxy_port"/>
|
||||
<check_box initial_value="true" label="Updates für [APP_NAME] automatisch herunterladen und installieren" name="updater_service_active"/>
|
||||
<text name="Software updates:">
|
||||
Softwareupdates:
|
||||
</text>
|
||||
<combo_box name="updater_service_combobox">
|
||||
<combo_box.item label="Automatisch installieren" name="Install_automatically"/>
|
||||
<combo_box.item label="Updates manuell herunterladen und installieren" name="Install_manual"/>
|
||||
</combo_box>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
[AMT] L$
|
||||
</panel.string>
|
||||
<panel name="balance_bg">
|
||||
<text name="balance" tool_tip="Mein Kontostand" value="20 L$"/>
|
||||
<text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/>
|
||||
<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
|
||||
</panel>
|
||||
<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
|
||||
|
|
|
|||
|
|
@ -22,7 +22,11 @@
|
|||
name="ToolTipMsg">
|
||||
[REGION](Double-click to open Map, shift-drag to pan)
|
||||
</floater.string>
|
||||
<floater.string name="mini_map_caption">
|
||||
<floater.string
|
||||
name="AltToolTipMsg">
|
||||
[REGION](Double-click to teleport, shift-drag to pan)
|
||||
</floater.string>
|
||||
<floater.string name="mini_map_caption">
|
||||
MINIMAP
|
||||
</floater.string>
|
||||
<net_map
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
auto_tile="true"
|
||||
title=""
|
||||
initial_mime_type="text/html"
|
||||
width="735">
|
||||
width="780">
|
||||
<layout_stack
|
||||
bottom="775"
|
||||
follows="left|right|top|bottom"
|
||||
|
|
@ -21,7 +21,7 @@
|
|||
name="stack1"
|
||||
orientation="vertical"
|
||||
top="20"
|
||||
width="725">
|
||||
width="770">
|
||||
<layout_panel
|
||||
auto_resize="false"
|
||||
default_tab_group="1"
|
||||
|
|
@ -32,7 +32,7 @@
|
|||
name="nav_controls"
|
||||
top="400"
|
||||
user_resize="false"
|
||||
width="725">
|
||||
width="770">
|
||||
<button
|
||||
image_overlay="Arrow_Left_Off"
|
||||
image_disabled="PushButton_Disabled"
|
||||
|
|
@ -115,7 +115,7 @@
|
|||
combo_editor.select_on_focus="true"
|
||||
tool_tip="Enter URL here"
|
||||
top_delta="0"
|
||||
width="627">
|
||||
width="672">
|
||||
<combo_box.commit_callback
|
||||
function="WebContent.EnterAddress" />
|
||||
</combo_box>
|
||||
|
|
@ -125,7 +125,7 @@
|
|||
follows="top|right"
|
||||
image_name="Lock2"
|
||||
layout="topleft"
|
||||
left_delta="575"
|
||||
left_delta="620"
|
||||
top_delta="2"
|
||||
visible="false"
|
||||
tool_tip="Secured Browsing"
|
||||
|
|
@ -142,7 +142,7 @@
|
|||
height="22"
|
||||
layout="topleft"
|
||||
name="popexternal"
|
||||
right="725"
|
||||
right="770"
|
||||
top_delta="-2"
|
||||
width="22">
|
||||
<button.commit_callback
|
||||
|
|
@ -156,7 +156,7 @@
|
|||
name="external_controls"
|
||||
top_delta="0"
|
||||
user_resize="false"
|
||||
width="540">
|
||||
width="585">
|
||||
<web_browser
|
||||
bottom="-22"
|
||||
follows="all"
|
||||
|
|
@ -175,7 +175,7 @@
|
|||
parse_urls="false"
|
||||
text_color="0.4 0.4 0.4 1"
|
||||
top_pad="5"
|
||||
width="520"/>
|
||||
width="495"/>
|
||||
<progress_bar
|
||||
color_bar="0.3 1.0 0.3 1"
|
||||
follows="bottom|right"
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@
|
|||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Freeze"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.VisibleFreezeEject"/>
|
||||
function="InspectAvatar.VisibleFreeze"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Eject"
|
||||
|
|
@ -86,7 +86,23 @@
|
|||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Eject"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.VisibleFreezeEject"/>
|
||||
function="InspectAvatar.VisibleEject"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Kick"
|
||||
name="kick">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Kick"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.EnableGod"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="CSR"
|
||||
name="csr">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.CSR" />
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.EnableGod" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Debug Textures"
|
||||
|
|
|
|||
|
|
@ -1994,6 +1994,16 @@
|
|||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="DebugShowRenderInfo" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Show Texture Info"
|
||||
name="Show Texture Info">
|
||||
<menu_item_check.on_check
|
||||
function="CheckControl"
|
||||
parameter="DebugShowTextureInfo" />
|
||||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="DebugShowTextureInfo" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Show Matrices"
|
||||
|
|
@ -2015,6 +2025,16 @@
|
|||
function="ToggleControl"
|
||||
parameter="DebugShowColor" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Show Memory"
|
||||
name="Show Memory">
|
||||
<menu_item_check.on_check
|
||||
function="CheckControl"
|
||||
parameter="DebugShowMemory" />
|
||||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="DebugShowMemory" />
|
||||
</menu_item_check>
|
||||
|
||||
<menu_item_separator/>
|
||||
|
||||
|
|
|
|||
|
|
@ -45,9 +45,9 @@
|
|||
left_pad="4"
|
||||
image_disabled="ComboButton_UpOff"
|
||||
image_unselected="ComboButton_UpOff"
|
||||
image_selected="ComboButton_Up_On_Selected"
|
||||
image_selected="ComboButton_On"
|
||||
image_pressed="ComboButton_UpSelected"
|
||||
image_pressed_selected="ComboButton_Up_On_Selected"
|
||||
image_pressed_selected="ComboButton_Selected"
|
||||
height="23"
|
||||
name="show_nearby_chat"
|
||||
tool_tip="Shows/hides nearby chat log">
|
||||
|
|
|
|||
|
|
@ -54,7 +54,13 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
<string
|
||||
name="no_groups_msg"
|
||||
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
|
||||
<filter_editor
|
||||
<string
|
||||
name="MiniMapToolTipMsg"
|
||||
value="[REGION](Double-click to open Map, shift-drag to pan)"/>
|
||||
<string
|
||||
name="AltMiniMapToolTipMsg"
|
||||
value="[REGION](Double-click to teleport, shift-drag to pan)"/>
|
||||
<filter_editor
|
||||
follows="left|top|right"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
|
|
@ -93,16 +99,26 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
|
|||
name="nearby_panel"
|
||||
top="0"
|
||||
width="313">
|
||||
<avatar_list
|
||||
<net_map
|
||||
bg_color="NetMapBackgroundColor"
|
||||
follows="top|left|right"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
mouse_opaque="false"
|
||||
name="Net Map"
|
||||
width="307"
|
||||
height="140"
|
||||
top="0"/>
|
||||
<avatar_list
|
||||
allow_select="true"
|
||||
follows="all"
|
||||
height="356"
|
||||
follows="top|left|bottom|right"
|
||||
height="216"
|
||||
ignore_online_status="true"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
multi_select="true"
|
||||
name="avatar_list"
|
||||
top="0"
|
||||
top="145"
|
||||
width="307" />
|
||||
<panel
|
||||
background_visible="true"
|
||||
|
|
|
|||
|
|
@ -34,6 +34,14 @@
|
|||
name="RegisterDateFormat">
|
||||
[REG_DATE] ([AGE])
|
||||
</string>
|
||||
<string
|
||||
name="name_text_args">
|
||||
[NAME]
|
||||
</string>
|
||||
<string
|
||||
name="display_name_text_args">
|
||||
[DISPLAY_NAME]
|
||||
</string>
|
||||
<layout_stack
|
||||
name="layout"
|
||||
orientation="vertical"
|
||||
|
|
|
|||
|
|
@ -23,11 +23,11 @@
|
|||
bottom="0"
|
||||
tab_stop="false"
|
||||
is_toggle="true"
|
||||
image_selected="SegmentedBtn_Right_Selected_Press"
|
||||
image_unselected="SegmentedBtn_Right_Off"
|
||||
image_pressed="SegmentedBtn_Right_Press"
|
||||
image_pressed_selected="SegmentedBtn_Right_Selected_Press"
|
||||
image_overlay="Arrow_Small_Up"
|
||||
image_disabled="ComboButton_UpOff"
|
||||
image_unselected="ComboButton_UpOff"
|
||||
image_selected="ComboButton_On"
|
||||
image_pressed="ComboButton_UpSelected"
|
||||
image_pressed_selected="ComboButton_Selected"
|
||||
/>
|
||||
<monitor
|
||||
follows="right"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="floater_web_content" title="">
|
||||
<layout_stack name="stack1">
|
||||
<layout_panel name="nav_controls">
|
||||
<button name="back" tool_tip="Navegar hacia atrás"/>
|
||||
<button name="forward" tool_tip="Navegar hacia adelante"/>
|
||||
<button name="stop" tool_tip="Detener la navegación"/>
|
||||
<button name="reload" tool_tip="Recargar página"/>
|
||||
<combo_box name="address" tool_tip="Introducir URL aquí"/>
|
||||
<icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
|
||||
<button name="popexternal" tool_tip="Abrir URL actual en tu navegador de escritorio"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</floater>
|
||||
|
|
@ -16,7 +16,8 @@
|
|||
<menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
|
||||
<menu_item_call label="Mostrar los 'TOS'" name="TOS"/>
|
||||
<menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
|
||||
<menu_item_call label="Web Browser Test" name="Web Browser Test"/>
|
||||
<menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
|
||||
<menu_item_call label="Prueba de ventanas de contenidos web" name="Web Content Floater Test"/>
|
||||
<menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/>
|
||||
<menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/>
|
||||
</menu>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
<menu_item_call label="Zoom cerca" name="Zoom Close"/>
|
||||
<menu_item_call label="Zoom medio" name="Zoom Medium"/>
|
||||
<menu_item_call label="Zoom lejos" name="Zoom Far"/>
|
||||
<menu_item_call label="Zoom por defecto" name="Zoom Default"/>
|
||||
<menu_item_check label="Girar el mapa" name="Rotate Map"/>
|
||||
<menu_item_check label="Centrar automáticamente" name="Auto Center"/>
|
||||
<menu_item_call label="Parar la búsqueda" name="Stop Tracking"/>
|
||||
|
|
|
|||
|
|
@ -121,13 +121,15 @@
|
|||
<menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
|
||||
<menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
|
||||
</menu>
|
||||
<menu_item_call label="Deshacer" name="Undo"/>
|
||||
<menu_item_call label="Rehacer" name="Redo"/>
|
||||
</menu>
|
||||
<menu label="Ayuda" name="Help">
|
||||
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
|
||||
<menu_item_check label="Permitir consejos" name="Enable Hints"/>
|
||||
<menu_item_call label="Denunciar una infracción" name="Report Abuse"/>
|
||||
<menu_item_call label="Informar de un fallo" name="Report Bug"/>
|
||||
<menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>
|
||||
<menu_item_check label="Permitir consejos" name="Enable Hints"/>
|
||||
</menu>
|
||||
<menu label="Avanzado" name="Advanced">
|
||||
<menu_item_call label="Recargar las texturas" name="Rebake Texture"/>
|
||||
|
|
@ -268,7 +270,8 @@
|
|||
<menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
|
||||
</menu>
|
||||
<menu label="UI" name="UI">
|
||||
<menu_item_call label="Web Browser Test" name="Web Browser Test"/>
|
||||
<menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/>
|
||||
<menu_item_call label="Navegador de contenido web" name="Web Content Browser"/>
|
||||
<menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
|
||||
<menu_item_call label="Memory Stats" name="Memory Stats"/>
|
||||
<menu_item_check label="Consola de depuración de región" name="Region Debug Console"/>
|
||||
|
|
|
|||
|
|
@ -108,6 +108,10 @@ Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
|
|||
Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="FavoritesOnLogin">
|
||||
Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="GrantModifyRights">
|
||||
Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
|
||||
¿Quieres conceder permisos de modificación a [NAME]?
|
||||
|
|
@ -946,7 +950,7 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual
|
|||
<input name="message">
|
||||
[DESC] (nuevo)
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Cancelar"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -956,7 +960,7 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual
|
|||
<input name="message">
|
||||
[DESC] (nuevo)
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Cancelar"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -966,7 +970,7 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual
|
|||
<input name="new_name">
|
||||
[NAME]
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Cancelar"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -1347,9 +1351,41 @@ Descarga e instala el último visor a través de
|
|||
http://secondlife.com/download.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackground">
|
||||
Se ha descargado una versión actualizada de [APP_NAME].
|
||||
Se aplicará la próxima vez que reinicies [APP_NAME]
|
||||
<notification name="FailedRequiredUpdateInstall">
|
||||
No hemos podido instalar una actualización necesaria.
|
||||
No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado.
|
||||
|
||||
Descarga e instala el último visor a través de
|
||||
http://secondlife.com/download.
|
||||
<usetemplate name="okbutton" yestext="Salir"/>
|
||||
</notification>
|
||||
<notification name="UpdaterServiceNotRunning">
|
||||
Hay una actualización necesaria para la instalación de Second Life.
|
||||
|
||||
Puedes descargar esta actualización de http://www.secondlife.com/downloads
|
||||
o instalarla ahora.
|
||||
<usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackgroundTip">
|
||||
Hemos descargado una actualización para la instalación de [APP_NAME].
|
||||
Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
|
||||
<usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackgroundDialog">
|
||||
Hemos descargado una actualización para la instalación de [APP_NAME].
|
||||
Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
|
||||
<usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/>
|
||||
</notification>
|
||||
<notification name="RequiredUpdateDownloadedVerboseDialog">
|
||||
Hemos descargado una actualización de software necesaria.
|
||||
Versión [VERSION]
|
||||
|
||||
Debemos reiniciar [APP_NAME] para instalar la actualización.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="RequiredUpdateDownloadedDialog">
|
||||
Debemos reiniciar [APP_NAME] para instalar la actualización.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="DeedObjectToGroup">
|
||||
Transferir este objeto al grupo hará que:
|
||||
|
|
@ -2217,14 +2253,6 @@ Inténtalo seleccionando un trozo más pequeño de terreno.
|
|||
<notification name="NoContentToSearch">
|
||||
Por favor, elige al menos un tipo de contenido a buscar ('PG', 'Mature', o 'Adult').
|
||||
</notification>
|
||||
<notification name="GroupVote">
|
||||
[NAME] ha propuesto votar:
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="VoteNow" text="Votar ahora"/>
|
||||
<button name="Later" text="Más tarde"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="SystemMessage">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
|
|
@ -2780,9 +2808,7 @@ El avatar '[NAME]' desactivó el modo de apariencia.
|
|||
<notification name="NoConnect">
|
||||
Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
|
||||
Comprueba la configuración de la red y del servidor de seguridad.
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
</form>
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="NoVoiceConnect">
|
||||
Tenemos problemas de conexión con tu servidor de voz:
|
||||
|
|
@ -2791,9 +2817,7 @@ Comprueba la configuración de la red y del servidor de seguridad.
|
|||
|
||||
No podrás establecer comunicaciones de voz.
|
||||
Comprueba la configuración de la red y del servidor de seguridad.
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
</form>
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="AvatarRezLeftNotification">
|
||||
( [EXISTENCE] segundos vivo)
|
||||
|
|
@ -2827,6 +2851,9 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
|
|||
<notification label="Explora el mundo" name="HintDestinationGuide">
|
||||
La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
|
||||
</notification>
|
||||
<notification label="Cambiar de apariencia" name="HintAvatarPicker">
|
||||
¿Te gustaría cambiar de apariencia? Haz clic en el botón que aparece a continuación para ver más avatares.
|
||||
</notification>
|
||||
<notification label="Panel lateral" name="HintSidePanel">
|
||||
Accede de manera rápida a tu inventario, así como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral.
|
||||
</notification>
|
||||
|
|
@ -2836,6 +2863,12 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
|
|||
<notification label="Nombre mostrado" name="HintDisplayName">
|
||||
Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
|
||||
</notification>
|
||||
<notification label="Mover" name="HintMoveArrows">
|
||||
Para caminar, utiliza las flechas de dirección del teclado. Para correr, pulsa dos veces la flecha hacia arriba.
|
||||
</notification>
|
||||
<notification label="Visión" name="HintView">
|
||||
Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
|
||||
</notification>
|
||||
<notification label="Inventario" name="HintInventory">
|
||||
Accede a tu inventario para buscar ítems. Los ítems más recientes se pueden encontrar fácilmente en la pestaña Recientes.
|
||||
</notification>
|
||||
|
|
@ -2849,6 +2882,15 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambi
|
|||
<button name="open" text="Abrir ventana emergente"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="AuthRequest">
|
||||
El sitio en '<nolink>[HOST_NAME]</nolink>' de la plataforma '[REALM]' requiere un nombre de usuario y una contraseña.
|
||||
<form name="form">
|
||||
<input name="username" text="Nombre de usuario"/>
|
||||
<input name="password" text="Contraseña"/>
|
||||
<button name="ok" text="Enviar"/>
|
||||
<button name="cancel" text="Cancelar"/>
|
||||
</form>
|
||||
</notification>
|
||||
<global name="UnsupportedCPU">
|
||||
- La velocidad de tu CPU no cumple los requerimientos mínimos.
|
||||
</global>
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
<string name="FormatYears">
|
||||
[COUNT] año/s
|
||||
</string>
|
||||
<text name="avatar_name" value="Desconocido"/>
|
||||
<text name="avatar_name" value="(cargando...)"/>
|
||||
<icon name="permission_edit_theirs_icon" tool_tip="Puedes editar los objetos de este amigo"/>
|
||||
<icon name="permission_edit_mine_icon" tool_tip="Este amigo puede editar, eliminar o manipular tus objetos"/>
|
||||
<icon name="permission_map_icon" tool_tip="Este amigo puede encontrarte en el mapa"/>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="edit_alpha_panel">
|
||||
<panel name="avatar_alpha_color_panel">
|
||||
<texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
</panel>
|
||||
<scroll_container name="avatar_alpha_color_panel_scroll">
|
||||
<panel name="avatar_alpha_color_panel">
|
||||
<texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
<texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
<text name="username_text">
|
||||
Nombre de usuario:
|
||||
</text>
|
||||
<line_editor label="bobsmith12 o Steller Sunshine" name="username_edit" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
|
||||
<combo_box name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/>
|
||||
<text name="password_text">
|
||||
Contraseña:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -5,30 +5,27 @@
|
|||
<string name="RegisterDateFormat">
|
||||
[REG_DATE] ([AGE])
|
||||
</string>
|
||||
<string name="name_text_args">
|
||||
[NAME]
|
||||
</string>
|
||||
<string name="display_name_text_args">
|
||||
[DISPLAY_NAME]
|
||||
</string>
|
||||
<layout_stack name="layout">
|
||||
<layout_panel name="profile_stack">
|
||||
<scroll_container name="profile_scroll">
|
||||
<panel name="scroll_content_panel">
|
||||
<panel name="second_life_image_panel">
|
||||
<icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
|
||||
<text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
|
||||
<text name="display_name_descr_text">
|
||||
Nombre de usuario
|
||||
</text>
|
||||
<text name="name_descr_text">
|
||||
Nombre mostrado
|
||||
</text>
|
||||
<button label="Perfil" name="see_profile_btn" tool_tip="Ver el perfil de este avatar"/>
|
||||
</panel>
|
||||
<panel name="first_life_image_panel">
|
||||
<icon label="" name="real_world_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
|
||||
<text name="title_rw_descr_text" value="Mundo real:"/>
|
||||
</panel>
|
||||
<text name="title_member_text" value="Residente desde:"/>
|
||||
<text name="title_acc_status_text" value="Estado de la cuenta:"/>
|
||||
<text name="title_partner_text" value="Compañero/a:"/>
|
||||
<panel name="partner_data_panel">
|
||||
<name_box initial_value="(obteniendo)" name="partner_text"/>
|
||||
</panel>
|
||||
<text name="title_groups_text" value="Grupos:"/>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
<panel name="profile_me_buttons_panel">
|
||||
<button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@
|
|||
<string name="message_max_lines_count" value="7"/>
|
||||
<panel label="info_panel" name="info_panel">
|
||||
<text_editor name="message" value="message"/>
|
||||
parse_urls="false"
|
||||
<button label="Enviar" name="btn_submit"/>
|
||||
</panel>
|
||||
<panel label="control_panel" name="control_panel"/>
|
||||
<panel label="control_panel" name="control_panel">
|
||||
<button label="Enviar" name="btn_submit"/>
|
||||
<button label="Ignorar" name="ignore_btn"/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -29,10 +29,10 @@
|
|||
URL
|
||||
</text>
|
||||
<text name="bubble_chat">
|
||||
Fondo de los bocadillos del chat:
|
||||
Color de fondo de la etiqueta del nombre (afectará también a los bocadillos del chat):
|
||||
</text>
|
||||
<color_swatch name="background" tool_tip="Elegir el color de los bocadillos del chat"/>
|
||||
<slider label="Opacidad:" name="bubble_chat_opacity"/>
|
||||
<color_swatch name="background" tool_tip="Seleccionar el color de la etiqueta del nombre"/>
|
||||
<slider label="Opacidad:" name="bubble_chat_opacity" tool_tip="Seleccionar opacidad de la etiqueta del nombre"/>
|
||||
<text name="floater_opacity">
|
||||
Opacidad de la ventana:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -7,9 +7,11 @@
|
|||
<text name="cache_size_label_l">
|
||||
(Localizaciones, imágenes, web, historial de búsqueda)
|
||||
</text>
|
||||
<check_box label="Mostrarme en los resultados de la búsqueda" name="online_searchresults"/>
|
||||
<check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
|
||||
<check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
|
||||
<check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
|
||||
<check_box label="Mostrar mis Hitos favoritos en Inicio de sesión (mediante el menú desplegable "Empezar en")" name="favorites_on_login_check"/>
|
||||
<text name="Logs:">
|
||||
Registros de chat:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -39,5 +39,11 @@
|
|||
</text>
|
||||
<line_editor name="web_proxy_editor" tool_tip="Nombre o dirección IP del proxy que quieres usar"/>
|
||||
<spinner label="Nº del puerto:" name="web_proxy_port"/>
|
||||
<check_box initial_value="verdadero" label="Descargar e instalar automáticamente actualizaciones de [APP_NAME]" name="updater_service_active"/>
|
||||
<text name="Software updates:">
|
||||
Actualizaciones de software:
|
||||
</text>
|
||||
<combo_box name="updater_service_combobox">
|
||||
<combo_box.item label="Instalar automáticamente" name="Install_automatically"/>
|
||||
<combo_box.item label="Descargar e instalar actualizaciones manualmente" name="Install_manual"/>
|
||||
</combo_box>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
[AMT] L$
|
||||
</panel.string>
|
||||
<panel name="balance_bg">
|
||||
<text name="balance" tool_tip="Mi saldo" value="20 L$"/>
|
||||
<text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/>
|
||||
<button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
|
||||
</panel>
|
||||
<text name="TimeText" tool_tip="Hora actual (Pacífico)">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="floater_web_content" title="">
|
||||
<layout_stack name="stack1">
|
||||
<layout_panel name="nav_controls">
|
||||
<button name="back" tool_tip="Précédente"/>
|
||||
<button name="forward" tool_tip="Suivante"/>
|
||||
<button name="stop" tool_tip="Arrêt de la navigation"/>
|
||||
<button name="reload" tool_tip="Recharger la page"/>
|
||||
<combo_box name="address" tool_tip="Entrer une URL ici"/>
|
||||
<icon name="media_secure_lock_flag" tool_tip="Navigation sécurisée"/>
|
||||
<button name="popexternal" tool_tip="Ouvrir l'URL actuelle dans votre navigateur de bureau"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</floater>
|
||||
|
|
@ -17,7 +17,8 @@
|
|||
<menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/>
|
||||
<menu_item_call label="Afficher les conditions d'utilisation" name="TOS"/>
|
||||
<menu_item_call label="Afficher le message critique" name="Critical"/>
|
||||
<menu_item_call label="Test du navigateur Web" name="Web Browser Test"/>
|
||||
<menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
|
||||
<menu_item_call label="Test de la fenêtre flottante du contenu Web" name="Web Content Floater Test"/>
|
||||
<menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/>
|
||||
<menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/>
|
||||
</menu>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
<menu_item_call label="Zoom rapproché" name="Zoom Close"/>
|
||||
<menu_item_call label="Zoom moyen" name="Zoom Medium"/>
|
||||
<menu_item_call label="Zoom éloigné" name="Zoom Far"/>
|
||||
<menu_item_call label="Zoom par défaut" name="Zoom Default"/>
|
||||
<menu_item_check label="Faire pivoter la carte" name="Rotate Map"/>
|
||||
<menu_item_check label="Centrage auto" name="Auto Center"/>
|
||||
<menu_item_call label="Arrêter de suivre" name="Stop Tracking"/>
|
||||
|
|
|
|||
|
|
@ -121,13 +121,15 @@
|
|||
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
|
||||
<menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
|
||||
</menu>
|
||||
<menu_item_call label="Annuler" name="Undo"/>
|
||||
<menu_item_call label="Refaire" name="Redo"/>
|
||||
</menu>
|
||||
<menu label="Aide" name="Help">
|
||||
<menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
|
||||
<menu_item_check label="Activer les astuces" name="Enable Hints"/>
|
||||
<menu_item_call label="Signaler une infraction" name="Report Abuse"/>
|
||||
<menu_item_call label="Signaler un bug" name="Report Bug"/>
|
||||
<menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
|
||||
<menu_item_check label="Activer les astuces" name="Enable Hints"/>
|
||||
</menu>
|
||||
<menu label="Avancé" name="Advanced">
|
||||
<menu_item_call label="Refixer les textures" name="Rebake Texture"/>
|
||||
|
|
@ -307,7 +309,8 @@
|
|||
<menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
|
||||
</menu>
|
||||
<menu label="Interface" name="UI">
|
||||
<menu_item_call label="Test du navigateur Web" name="Web Browser Test"/>
|
||||
<menu_item_call label="Test du navigateur de médias" name="Web Browser Test"/>
|
||||
<menu_item_call label="Navigateur du contenu Web" name="Web Content Browser"/>
|
||||
<menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"/>
|
||||
<menu_item_call label="Dump inventaire" name="Dump Inventory"/>
|
||||
<menu_item_call label="Dump Timers" name="Dump Timers"/>
|
||||
|
|
|
|||
|
|
@ -109,6 +109,10 @@ Veuillez ne sélectionner qu'un seul objet.
|
|||
Les résidents qui ne sont pas vos amis ne sauront pas que vous avez choisi d'ignorer leurs appels et leurs messages instantanés.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="FavoritesOnLogin">
|
||||
Remarque : si vous activez cette option, toutes les personnes utilisant cet ordinateur pourront voir votre liste d'endroits favoris.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="GrantModifyRights">
|
||||
Lorsque vous accordez des droits de modification à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans Second Life. Réfléchissez bien avant d'accorder ces droits.
|
||||
Voulez-vous vraiment accorder des droits de modification à [NAME] ?
|
||||
|
|
@ -945,7 +949,7 @@ Proposer à [NAME] de devenir votre ami(e) ?
|
|||
<input name="message">
|
||||
[DESC] (nouv.)
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Annuler"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -955,7 +959,7 @@ Proposer à [NAME] de devenir votre ami(e) ?
|
|||
<input name="message">
|
||||
[DESC] (nouv.)
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Annuler"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -965,7 +969,7 @@ Proposer à [NAME] de devenir votre ami(e) ?
|
|||
<input name="new_name">
|
||||
[NAME]
|
||||
</input>
|
||||
<button name="Offer" text="OK"/>
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Annuler"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
|
@ -1338,9 +1342,41 @@ Veuillez télécharger et installer la dernière version du client à la page We
|
|||
http://secondlife.com/download.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackground">
|
||||
Une mise à jour de [APP_NAME] a été téléchargée.
|
||||
Elle sera appliquée au prochain redémarrage de [APP_NAME].
|
||||
<notification name="FailedRequiredUpdateInstall">
|
||||
Impossible d'installer une mise à jour requise.
|
||||
Vous ne pourrez pas vous connecter tant que [APP_NAME] ne sera pas mis à jour.
|
||||
|
||||
Veuillez télécharger et installer la dernière version du client à la page Web
|
||||
http://secondlife.com/download.
|
||||
<usetemplate name="okbutton" yestext="Quitter"/>
|
||||
</notification>
|
||||
<notification name="UpdaterServiceNotRunning">
|
||||
Une mise à jour requise pour votre installation Second Life existe.
|
||||
|
||||
Pour la télécharger, accédez à http://www.secondlife.com/downloads.
|
||||
Vous pouvez également l'installer dès maintenant.
|
||||
<usetemplate name="okcancelbuttons" notext="Quitter Second Life" yestext="Télécharger et installer maintenant"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackgroundTip">
|
||||
Nous avons téléchargé une mise à jour de votre installation [APP_NAME].
|
||||
Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informations relatives à cette mise à jour]
|
||||
<usetemplate name="okcancelbuttons" notext="Ultérieurement..." yestext="Installer maintenant et redémarrer [APP_NAME]"/>
|
||||
</notification>
|
||||
<notification name="DownloadBackgroundDialog">
|
||||
Nous avons téléchargé une mise à jour de votre installation [APP_NAME].
|
||||
Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informations relatives à cette mise à jour]
|
||||
<usetemplate name="okcancelbuttons" notext="Ultérieurement..." yestext="Installer maintenant et redémarrer [APP_NAME]"/>
|
||||
</notification>
|
||||
<notification name="RequiredUpdateDownloadedVerboseDialog">
|
||||
Nous avons téléchargé une mise à jour logicielle requise.
|
||||
Version [VERSION]
|
||||
|
||||
[APP_NAME] doit être redémarré pour que la mise à jour soit installée.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="RequiredUpdateDownloadedDialog">
|
||||
[APP_NAME] doit être redémarré pour que la mise à jour soit installée.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="DeedObjectToGroup">
|
||||
Si vous cédez cet objet, le groupe :
|
||||
|
|
@ -2209,14 +2245,6 @@ Veuillez sélectionner un terrain plus petit.
|
|||
<notification name="NoContentToSearch">
|
||||
Veuillez sélectionner au moins un type de contenu à rechercher (Général, Modéré ou Adulte)
|
||||
</notification>
|
||||
<notification name="GroupVote">
|
||||
[NAME] a proposé un vote pour :
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="VoteNow" text="Voter"/>
|
||||
<button name="Later" text="Plus tard"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="SystemMessage">
|
||||
[MESSAGE]
|
||||
</notification>
|
||||
|
|
@ -2776,9 +2804,7 @@ L'avatar [NAME] a quitté le mode Apparence.
|
|||
<notification name="NoConnect">
|
||||
Problèmes de connexion via [PROTOCOL] [HOSTID].
|
||||
Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
</form>
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="NoVoiceConnect">
|
||||
Problèmes de connexion à votre serveur vocal :
|
||||
|
|
@ -2787,9 +2813,7 @@ Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
|
|||
|
||||
Aucune communication vocale n'est disponible.
|
||||
Veuillez vérifier la configuration de votre réseau et de votre pare-feu.
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
</form>
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="AvatarRezLeftNotification">
|
||||
([EXISTENCE] secondes d'existence)
|
||||
|
|
@ -2824,6 +2848,9 @@ Ignorer les autres ?
|
|||
<notification label="Explorer le monde" name="HintDestinationGuide">
|
||||
Le Guide des destinations comprend des milliers d'endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l'explorer.
|
||||
</notification>
|
||||
<notification label="Changer d'apparence" name="HintAvatarPicker">
|
||||
Vous souhaitez changer de look ? Cliquez sur le bouton ci-dessous pour voir plus d'avatars.
|
||||
</notification>
|
||||
<notification label="Panneau latéral" name="HintSidePanel">
|
||||
Obtenir un accès rapide à votre inventaire, à vos habits, à vos profils et bien plus encore dans le panneau latéral.
|
||||
</notification>
|
||||
|
|
@ -2833,6 +2860,12 @@ Ignorer les autres ?
|
|||
<notification label="Nom d'affichage" name="HintDisplayName">
|
||||
Définissez ici votre nom d'affichage personnalisable. Cette fonctionnalité vous est fournie en plus de votre nom d'utilisateur unique qui, lui, ne peut être changé. Vous pouvez modifier l'apparence des noms des autres résidents dans vos préférences.
|
||||
</notification>
|
||||
<notification label="Bouger" name="HintMoveArrows">
|
||||
Pour marcher, utilisez les touches fléchées de votre clavier. Pour courir, appuyez deux fois sur la flèche vers le haut.
|
||||
</notification>
|
||||
<notification label="Affichage" name="HintView">
|
||||
Pour changer d'angle de vision, utilisez les contrôles Faire tourner et Faire un panoramique. Pour réinitialiser la vue, appuyez sur Échap ou marchez.
|
||||
</notification>
|
||||
<notification label="Inventaire" name="HintInventory">
|
||||
Permet de rechercher des articles dans l'inventaire. Pour accéder aux derniers articles ajoutés, cliquez sur l'onglet Récent.
|
||||
</notification>
|
||||
|
|
@ -2846,6 +2879,15 @@ Ignorer les autres ?
|
|||
<button name="open" text="Ouvrir la fenêtre popup"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="AuthRequest">
|
||||
Nom d'utilisateur et mot de passe requis pour le site se trouvant à l'emplacement suivant : '<nolink>[HOST_NAME]</nolink>', domaine '[REALM]'.
|
||||
<form name="form">
|
||||
<input name="username" text="Nom d'utilisateur"/>
|
||||
<input name="password" text="Mot de passe"/>
|
||||
<button name="ok" text="Soumettre"/>
|
||||
<button name="cancel" text="Annuler"/>
|
||||
</form>
|
||||
</notification>
|
||||
<global name="UnsupportedCPU">
|
||||
- Votre processeur ne remplit pas les conditions minimum requises.
|
||||
</global>
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
<string name="FormatYears">
|
||||
[COUNT] a
|
||||
</string>
|
||||
<text name="avatar_name" value="Inconnu"/>
|
||||
<text name="avatar_name" value="(chargement)"/>
|
||||
<text name="last_interaction" value="0s"/>
|
||||
<icon name="permission_edit_theirs_icon" tool_tip="Vous pouvez modifier les objets de cet(te) ami(e)."/>
|
||||
<icon name="permission_edit_mine_icon" tool_tip="Cet(te) ami(e) peut modifier, supprimer ou prendre vos objets."/>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="edit_alpha_panel">
|
||||
<panel name="avatar_alpha_color_panel">
|
||||
<texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
|
||||
<texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
|
||||
<texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
|
||||
<texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
|
||||
<texture_picker label="Alpha cheveux" width="80" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
|
||||
</panel>
|
||||
<scroll_container name="avatar_alpha_color_panel_scroll">
|
||||
<panel name="avatar_alpha_color_panel">
|
||||
<texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquer pour sélectionner une image."/>
|
||||
<texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquer pour sélectionner une image."/>
|
||||
<texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquer pour sélectionner une image."/>
|
||||
<texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquer pour sélectionner une image."/>
|
||||
<texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquer pour sélectionner une image."/>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
<text name="username_text">
|
||||
Nom d'utilisateur :
|
||||
</text>
|
||||
<line_editor label="bobsmith12 ou Steller Sunshine" name="username_edit" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
|
||||
<combo_box name="username_combo" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
|
||||
<text name="password_text">
|
||||
Mot de passe :
|
||||
</text>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue