Automated merge up from viewer-development into mesh-development

master
Loren Shih 2011-02-01 11:28:22 -05:00
commit fbc6e5d639
158 changed files with 8974 additions and 9457 deletions

14
.hgtags
View File

@ -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

View File

@ -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:

View File

@ -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"
}

View File

@ -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

View File

@ -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
//--------------------------------------------------------------------------------------------------

View File

@ -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

View File

@ -229,3 +229,4 @@ char const * LLMemType::getNameFromID(S32 id)
return DeclareMemType::mNameList[id];
}
//--------------------------------------------------------------------------------------------------

View File

@ -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
//---------------------------------------------------------------------------

View File

@ -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

View File

@ -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;

View File

@ -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();

View File

@ -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++;
}

View File

@ -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>

View File

@ -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

View File

@ -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.
*/

View File

@ -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;

View File

@ -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;

View File

@ -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");

View File

@ -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();

View File

@ -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:

View File

@ -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
//////////////////////////////////////////////////////////////////////////////

View File

@ -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);

View File

@ -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
{

View File

@ -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

View File

@ -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;

View File

@ -55,6 +55,7 @@ public:
private:
std::vector<LLWString> mLines;
LLAllocator* mAlloc;
BOOL mPaused ;
};

View File

@ -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));
}
}

View File

@ -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;
};

View File

@ -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 );

View File

@ -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

View File

@ -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)
{

View File

@ -142,6 +142,7 @@ private:
LLAvatarList* mNearbyList;
LLAvatarList* mRecentList;
LLGroupList* mGroupList;
LLNetMap* mMiniMap;
LLHandle<LLView> mGroupPlusMenuHandle;
LLHandle<LLView> mNearbyViewSortMenuHandle;

View File

@ -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 );
}

View File

@ -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();

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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

View File

@ -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,

View File

@ -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"));

View File

@ -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);
}

View File

@ -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())
{

View File

@ -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);

View File

@ -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)

View File

@ -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; }

View File

@ -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

View File

@ -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()

View File

@ -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 ;
}

View File

@ -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 ;

View File

@ -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

View File

@ -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

View File

@ -287,6 +287,9 @@ BOOL LLPanelBodyPartsListItem::postBuild()
addWidgetToRightSide("btn_lock");
addWidgetToRightSide("btn_edit_panel");
setWidgetsVisible(false);
reshapeWidgets();
return TRUE;
}

View File

@ -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

View File

@ -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" />

View File

@ -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">

View File

@ -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>

View File

@ -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>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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 &apos;[NAME]&apos; hat Modus „Aussehen bearbeiten&quot; 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 „&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;“ 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>

View File

@ -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"/>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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=&quot;false&quot;
<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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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)">

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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/>

View File

@ -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">

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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 &apos;TOS&apos;" 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>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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 (&apos;PG&apos;, &apos;Mature&apos;, o &apos;Adult&apos;).
</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 &apos;[NAME]&apos; 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 &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; de la plataforma &apos;[REALM]&apos; 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>

View File

@ -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"/>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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=&quot;false&quot;
<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>

View File

@ -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>

View File

@ -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 &quot;Empezar en&quot;)" name="favorites_on_login_check"/>
<text name="Logs:">
Registros de chat:
</text>

View File

@ -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>

View File

@ -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)">

View File

@ -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&apos;URL actuelle dans votre navigateur de bureau"/>
</layout_panel>
</layout_stack>
</floater>

View File

@ -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&apos;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>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -109,6 +109,10 @@ Veuillez ne sélectionner qu&apos;un seul objet.
Les résidents qui ne sont pas vos amis ne sauront pas que vous avez choisi d&apos;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&apos;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&apos;importe lequel de vos objets dans Second Life. Réfléchissez bien avant d&apos;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&apos;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&apos;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&apos;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&apos;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&apos;existence)
@ -2824,6 +2848,9 @@ Ignorer les autres ?
<notification label="Explorer le monde" name="HintDestinationGuide">
Le Guide des destinations comprend des milliers d&apos;endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l&apos;explorer.
</notification>
<notification label="Changer d&apos;apparence" name="HintAvatarPicker">
Vous souhaitez changer de look ? Cliquez sur le bouton ci-dessous pour voir plus d&apos;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&apos;affichage" name="HintDisplayName">
Définissez ici votre nom d&apos;affichage personnalisable. Cette fonctionnalité vous est fournie en plus de votre nom d&apos;utilisateur unique qui, lui, ne peut être changé. Vous pouvez modifier l&apos;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&apos;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&apos;inventaire. Pour accéder aux derniers articles ajoutés, cliquez sur l&apos;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&apos;utilisateur et mot de passe requis pour le site se trouvant à l&apos;emplacement suivant : &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos;, domaine &apos;[REALM]&apos;.
<form name="form">
<input name="username" text="Nom d&apos;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>

View File

@ -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."/>

View File

@ -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>

View File

@ -11,7 +11,7 @@
<text name="username_text">
Nom d&apos;utilisateur :
</text>
<line_editor label="bobsmith12 ou Steller Sunshine" name="username_edit" tool_tip="Nom d&apos;utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/>
<combo_box name="username_combo" tool_tip="Nom d&apos;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