QAR-758 1.20 Viewer RC 12, 13, 14, 15 -> Release

merge Branch_1-20-14-Viewer-merge -> release
Includes Branch_1-20-Viewer-2 through 92456
master
Steven Bennetts 2008-07-22 19:01:52 +00:00
parent ed386ae547
commit 0c0391cc71
572 changed files with 29496 additions and 430 deletions

View File

@ -200,6 +200,7 @@ Matthew Dowd
VWR-1761
McCabe Maxsted
VWR-1318
VWR-7893
Michelle2 Zenovka
VWR-2652
VWR-2834

View File

@ -34,7 +34,7 @@
const S32 LL_VERSION_MAJOR = 1;
const S32 LL_VERSION_MINOR = 20;
const S32 LL_VERSION_PATCH = 11;
const S32 LL_VERSION_PATCH = 15;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Release";

View File

@ -145,7 +145,6 @@ U8* LLImageBase::allocateData(S32 size)
mData = new U8[size];
if (!mData)
{
//llerrs << "allocate image data: " << size << llendl;
llwarns << "allocate image data: " << size << llendl;
size = 0 ;
mWidth = mHeight = 0 ;
@ -243,8 +242,10 @@ LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components)
: LLImageBase()
{
mMemType = LLMemType::MTYPE_IMAGERAW;
allocateDataSize(width, height, components);
memcpy(getData(), data, width*height*components);
if(allocateDataSize(width, height, components))
{
memcpy(getData(), data, width*height*components);
}
++sRawImageCount;
}
@ -795,7 +796,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
}
void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
{
LLMemType mt1((LLMemType::EMemType)mMemType);
llassert((1 == getComponents()) || (3 == getComponents()) || (4 == getComponents()) );
@ -805,7 +806,7 @@ void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
if( (old_width == new_width) && (old_height == new_height) )
{
return; // Nothing to do.
return TRUE; // Nothing to do.
}
// Reallocate the data buffer.
@ -840,8 +841,10 @@ void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
U8* temp_buffer = new U8[ temp_data_size ];
if (!temp_buffer)
{
llerrs << "Out of memory in LLImageRaw::scale: old (w, h, c) = (" << old_width << ", " << old_height << ", " << (S32)getComponents() <<
llwarns << "Out of memory in LLImageRaw::scale: old (w, h, c) = (" << old_width << ", " << old_height << ", " << (S32)getComponents() <<
") ; new (w, h, c) = (" << new_width << ", " << new_height << ", " << (S32)getComponents() << ")" << llendl;
return FALSE ;
}
memcpy(temp_buffer, getData(), temp_data_size); /* Flawfinder: ignore */
@ -869,6 +872,8 @@ void LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
// Clean up
delete[] temp_buffer;
}
return TRUE ;
}
void LLImageRaw::copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step )

View File

@ -176,7 +176,7 @@ public:
void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
void scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
// Fill the buffer with a constant color
void fill( const LLColor4U& color );

View File

@ -552,7 +552,10 @@ BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
int file_bytes = line_bytes*getHeight() + header_bytes;
// Allocate the new buffer for the data.
allocateData(file_bytes);
if(!allocateData(file_bytes)) //memory allocation failed
{
return FALSE ;
}
magic[0] = 'B'; magic[1] = 'M';
magic[2] = (U8) file_bytes;

View File

@ -736,7 +736,7 @@ void LLXferManager::processFileRequest (LLMessageSystem *mesgsys, void ** /*user
U8 local_path_u8;
mesgsys->getU8("XferID", "FilePath", local_path_u8);
if( local_path_u8 < (U8)LL_PATH_COUNT )
if( local_path_u8 < (U8)LL_PATH_LAST )
{
local_path = (ELLPath)local_path_u8;
}

View File

@ -765,9 +765,17 @@ U8* LLVertexBuffer::mapBuffer(S32 access)
{
llerrs << "Mapped two VBOs at the same time!" << llendl;
}
sMapped = TRUE;*/
sMapped = TRUE;*/
if (!mMappedData)
{
//--------------------
//print out more debug info before crash
llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
GLint size ;
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
//--------------------
GLint buff;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
if (buff != mGLBuffer)

View File

@ -257,6 +257,10 @@ public:
{
mFontAlignment = (LLFontGL::HAlign)llclamp(sd.get("halign").asInteger(), (S32)LLFontGL::LEFT, (S32)LLFontGL::HCENTER);
}
else
{
mFontAlignment = LLFontGL::LEFT;
}
mIndex = -1;
mParentCtrl = NULL;

View File

@ -1666,13 +1666,13 @@ std::string LLUI::locateSkin(const std::string& filename)
localization = sConfigGroup->getString("SystemLanguage");
}
std::string local_skin = "xui" + slash + localization + slash + filename;
found_file = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, local_skin);
found_file = gDirUtilp->findSkinnedFilename(local_skin);
}
}
if (!gDirUtilp->fileExists(found_file))
{
std::string local_skin = "xui" + slash + "en-us" + slash + filename;
found_file = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, local_skin);
found_file = gDirUtilp->findSkinnedFilename(local_skin);
}
if (!gDirUtilp->fileExists(found_file))
{

View File

@ -76,7 +76,7 @@ const S32 VPAD = 4;
const S32 FLOATER_H_MARGIN = 15;
const S32 MIN_WIDGET_HEIGHT = 10;
std::vector<std::string> LLUICtrlFactory::mXUIPaths;
std::vector<std::string> LLUICtrlFactory::sXUIPaths;
// UI Ctrl class for padding
class LLUICtrlLocate : public LLUICtrl
@ -121,12 +121,11 @@ void LLUICtrlFactory::setupPaths()
LLXMLNodePtr root;
BOOL success = LLXMLNode::parseFile(filename, root, NULL);
mXUIPaths.clear();
sXUIPaths.clear();
if (success)
{
LLXMLNodePtr path;
std::string app_dir = gDirUtilp->getAppRODataDir();
for (path = root->getFirstChild(); path.notNull(); path = path->getNextSibling())
{
@ -140,21 +139,20 @@ void LLUICtrlFactory::setupPaths()
language = LLUI::sConfigGroup->getString("SystemLanguage");
}
}
path_val_ui.setArg("[Language]", language);
std::string fullpath = app_dir + path_val_ui.getString();
path_val_ui.setArg("[LANGUAGE]", language);
if (std::find(mXUIPaths.begin(), mXUIPaths.end(), fullpath) == mXUIPaths.end())
if (std::find(sXUIPaths.begin(), sXUIPaths.end(), path_val_ui.getString()) == sXUIPaths.end())
{
mXUIPaths.push_back(app_dir + path_val_ui.getString());
sXUIPaths.push_back(path_val_ui.getString());
}
}
}
else // parsing failed
{
std::string slash = gDirUtilp->getDirDelimiter();
std::string dir = gDirUtilp->getAppRODataDir() + slash + "skins" + slash + "xui" + slash + "en-us" + slash;
llwarns << "XUI::config file unable to open." << llendl;
mXUIPaths.push_back(dir);
std::string dir = "xui" + slash + "en-us";
llwarns << "XUI::config file unable to open: " << filename << llendl;
sXUIPaths.push_back(dir);
}
}
@ -163,14 +161,22 @@ void LLUICtrlFactory::setupPaths()
//-----------------------------------------------------------------------------
// getLayeredXMLNode()
//-----------------------------------------------------------------------------
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &filename, LLXMLNodePtr& root)
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root)
{
if (!LLXMLNode::parseFile(mXUIPaths.front() + filename, root, NULL))
{
if (!LLXMLNode::parseFile(filename, root, NULL))
std::string full_filename = gDirUtilp->findSkinnedFilename(sXUIPaths.front(), xui_filename);
if (full_filename.empty())
{
llwarns << "Couldn't find UI description file: " << sXUIPaths.front() + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
return false;
}
if (!LLXMLNode::parseFile(full_filename, root, NULL))
{
// try filename as passed in since sometimes we load an xml file from a user-supplied path
if (!LLXMLNode::parseFile(xui_filename, root, NULL))
{
llwarns << "Problem reading UI description file: " << mXUIPaths.front() + filename << llendl;
return FALSE;
llwarns << "Problem reading UI description file: " << xui_filename << llendl;
return false;
}
}
@ -178,13 +184,24 @@ bool LLUICtrlFactory::getLayeredXMLNode(const std::string &filename, LLXMLNodePt
std::vector<std::string>::const_iterator itor;
for (itor = mXUIPaths.begin(), ++itor; itor != mXUIPaths.end(); ++itor)
for (itor = sXUIPaths.begin(), ++itor; itor != sXUIPaths.end(); ++itor)
{
std::string nodeName;
std::string updateName;
LLXMLNode::parseFile((*itor) + filename, updateRoot, NULL);
std::string layer_filename = gDirUtilp->findSkinnedFilename((*itor), xui_filename);
if(layer_filename.empty())
{
// no localized version of this file, that's ok, keep looking
continue;
}
if (!LLXMLNode::parseFile(layer_filename, updateRoot, NULL))
{
llwarns << "Problem reading localized UI description file: " << (*itor) + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
return false;
}
updateRoot->getAttributeString("name", updateName);
root->getAttributeString("name", nodeName);
@ -194,7 +211,7 @@ bool LLUICtrlFactory::getLayeredXMLNode(const std::string &filename, LLXMLNodePt
}
}
return TRUE;
return true;
}

View File

@ -87,8 +87,7 @@ private:
std::deque<const LLCallbackMap::map_t*> mFactoryStack;
static std::vector<std::string> mXUIPaths;
static std::vector<std::string> sXUIPaths;
LLPanel* mDummyPanel;
};

View File

@ -59,18 +59,8 @@ LLDir_Linux gDirUtil;
LLDir *gDirUtilp = (LLDir *)&gDirUtil;
LLDir::LLDir()
: mAppName(""),
mExecutablePathAndName(""),
mExecutableFilename(""),
mExecutableDir(""),
mAppRODataDir(""),
mOSUserDir(""),
mOSUserAppDir(""),
mLindenUserDir(""),
mCAFile(""),
mTempDir(""),
mDirDelimiter("")
LLDir::LLDir()
: mDirDelimiter("/") // fallback to forward slash if not overridden
{
}
@ -125,7 +115,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
const std::string LLDir::findFile(const std::string &filename,
const std::string searchPath1,
const std::string searchPath2,
const std::string searchPath3)
const std::string searchPath3) const
{
std::vector<std::string> search_paths;
search_paths.push_back(searchPath1);
@ -246,12 +236,37 @@ const std::string &LLDir::getSkinDir() const
return mSkinDir;
}
const std::string &LLDir::getUserSkinDir() const
{
return mUserSkinDir;
}
const std::string& LLDir::getDefaultSkinDir() const
{
return mDefaultSkinDir;
}
const std::string LLDir::getSkinBaseDir() const
{
std::string dir = getAppRODataDir();
dir += mDirDelimiter;
dir += "skins";
return dir;
}
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& filename) const
{
return getExpandedFilename(location, "", filename);
}
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subdir, const std::string& in_filename) const
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subdir, const std::string& filename) const
{
return getExpandedFilename(location, "", subdir, filename);
}
std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subdir1, const std::string& subdir2, const std::string& in_filename) const
{
std::string prefix;
switch (location)
@ -324,13 +339,11 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
prefix += "skins";
break;
case LL_PATH_HTML:
prefix = getAppRODataDir();
prefix += mDirDelimiter;
prefix += "skins";
prefix += mDirDelimiter;
prefix += "html";
break;
//case LL_PATH_HTML:
// prefix = getSkinDir();
// prefix += mDirDelimiter;
// prefix += "html";
// break;
case LL_PATH_MOZILLA_PROFILE:
prefix = getOSUserAppDir();
@ -343,15 +356,16 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
}
std::string filename = in_filename;
if (!subdir.empty())
if (!subdir2.empty())
{
filename = subdir + mDirDelimiter + in_filename;
filename = subdir2 + mDirDelimiter + filename;
}
else
if (!subdir1.empty())
{
filename = in_filename;
filename = subdir1 + mDirDelimiter + filename;
}
std::string expanded_filename;
if (!filename.empty())
{
@ -415,6 +429,30 @@ std::string LLDir::getExtension(const std::string& filepath) const
return exten;
}
std::string LLDir::findSkinnedFilename(const std::string &filename) const
{
return findSkinnedFilename("", "", filename);
}
std::string LLDir::findSkinnedFilename(const std::string &subdir, const std::string &filename) const
{
return findSkinnedFilename("", subdir, filename);
}
std::string LLDir::findSkinnedFilename(const std::string &subdir1, const std::string &subdir2, const std::string &filename) const
{
// generate subdirectory path fragment, e.g. "/foo/bar", "/foo", ""
std::string subdirs = ((subdir1.empty() ? "" : mDirDelimiter) + subdir1)
+ ((subdir2.empty() ? "" : mDirDelimiter) + subdir2);
std::string found_file = findFile(filename,
getUserSkinDir() + subdirs, // first look in user skin override
getSkinDir() + subdirs, // then in current skin
getDefaultSkinDir() + subdirs); // and last in default skin
return found_file;
}
std::string LLDir::getTempFilename() const
{
LLUUID random_uuid;
@ -498,6 +536,22 @@ void LLDir::setSkinFolder(const std::string &skin_folder)
mSkinDir += "skins";
mSkinDir += mDirDelimiter;
mSkinDir += skin_folder;
// user modifications to current skin
// e.g. c:\documents and settings\users\username\application data\second life\skins\dazzle
mUserSkinDir = getOSUserAppDir();
mUserSkinDir += mDirDelimiter;
mUserSkinDir += "skins";
mUserSkinDir += mDirDelimiter;
mUserSkinDir += skin_folder;
// base skin which is used as fallback for all skinned files
// e.g. c:\program files\secondlife\skins\default
mDefaultSkinDir = getAppRODataDir();
mDefaultSkinDir += mDirDelimiter;
mDefaultSkinDir += "skins";
mDefaultSkinDir += mDirDelimiter;
mDefaultSkinDir += "default";
}
bool LLDir::setCacheDir(const std::string &path)

View File

@ -32,6 +32,7 @@
#ifndef LL_LLDIR_H
#define LL_LLDIR_H
// these numbers *may* get serialized, so we need to be explicit
typedef enum ELLPath
{
LL_PATH_NONE = 0,
@ -49,8 +50,8 @@ typedef enum ELLPath
LL_PATH_CHAT_LOGS = 12,
LL_PATH_PER_ACCOUNT_CHAT_LOGS = 13,
LL_PATH_MOZILLA_PROFILE = 14,
LL_PATH_HTML = 15,
LL_PATH_COUNT = 16
// LL_PATH_HTML = 15,
LL_PATH_LAST = 16
} ELLPath;
@ -69,9 +70,9 @@ class LLDir
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0;
virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0;
virtual std::string getCurPath() = 0;
virtual BOOL fileExists(const std::string &filename) = 0;
virtual BOOL fileExists(const std::string &filename) const = 0;
const std::string findFile(const std::string &filename, const std::string searchPath1 = "", const std::string searchPath2 = "", const std::string searchPath3 = "");
const std::string findFile(const std::string &filename, const std::string searchPath1 = "", const std::string searchPath2 = "", const std::string searchPath3 = "") const;
const std::string &getExecutablePathAndName() const; // Full pathname of the executable
const std::string &getAppName() const; // install directory under progams/ ie "SecondLife"
const std::string &getExecutableDir() const; // Directory where the executable is located
@ -88,16 +89,26 @@ class LLDir
const std::string &getCAFile() const; // File containing TLS certificate authorities
const std::string &getDirDelimiter() const; // directory separator for platform (ie. '\' or '/' or ':')
const std::string &getSkinDir() const; // User-specified skin folder.
const std::string &getUserSkinDir() const; // User-specified skin folder with user modifications. e.g. c:\documents and settings\username\application data\second life\skins\curskin
const std::string &getDefaultSkinDir() const; // folder for default skin. e.g. c:\program files\second life\skins\default
const std::string getSkinBaseDir() const; // folder that contains all installed skins (not user modifications). e.g. c:\program files\second life\skins
// Expanded filename
std::string getExpandedFilename(ELLPath location, const std::string &filename) const;
std::string getExpandedFilename(ELLPath location, const std::string &subdir, const std::string &filename) const;
std::string getExpandedFilename(ELLPath location, const std::string &subdir1, const std::string &subdir2, const std::string &filename) const;
// Base and Directory name extraction
std::string getBaseFileName(const std::string& filepath, bool strip_exten = false) const;
std::string getDirName(const std::string& filepath) const;
std::string getExtension(const std::string& filepath) const; // Excludes '.', e.g getExtension("foo.wav") == "wav"
// these methods search the various skin paths for the specified file in the following order:
// getUserSkinDir(), getSkinDir(), getDefaultSkinDir()
std::string findSkinnedFilename(const std::string &filename) const;
std::string findSkinnedFilename(const std::string &subdir, const std::string &filename) const;
std::string findSkinnedFilename(const std::string &subdir1, const std::string &subdir2, const std::string &filename) const;
// random filename in common temporary directory
std::string getTempFilename() const;
@ -125,7 +136,9 @@ protected:
std::string mTempDir;
std::string mCacheDir;
std::string mDirDelimiter;
std::string mSkinDir; // Location for u ser-specified skin info.
std::string mSkinDir; // Location for current skin info.
std::string mDefaultSkinDir; // Location for default skin info.
std::string mUserSkinDir; // Location for user-modified skin info.
};
void dir_exists_or_crash(const std::string &dir_name);

View File

@ -353,7 +353,7 @@ std::string LLDir_Linux::getCurPath()
}
BOOL LLDir_Linux::fileExists(const std::string &filename)
BOOL LLDir_Linux::fileExists(const std::string &filename) const
{
struct stat stat_data;
// Check the age of the file

View File

@ -49,7 +49,7 @@ public:
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
private:
DIR *mDirp;

View File

@ -361,7 +361,7 @@ std::string LLDir_Mac::getCurPath()
BOOL LLDir_Mac::fileExists(const std::string &filename)
BOOL LLDir_Mac::fileExists(const std::string &filename) const
{
struct stat stat_data;
// Check the age of the file

View File

@ -49,7 +49,7 @@ public:
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
virtual void getRandomFileInDir(const std::string &dirname, const std::string &ask, std::string &fname);
virtual BOOL fileExists(const std::string &filename);
virtual BOOL fileExists(const std::string &filename) const;
private:
int mCurrentDirIndex;

View File

@ -344,7 +344,7 @@ std::string LLDir_Win32::getCurPath()
}
BOOL LLDir_Win32::fileExists(const std::string &filename)
BOOL LLDir_Win32::fileExists(const std::string &filename) const
{
llstat stat_data;
// Check the age of the file

View File

@ -46,7 +46,7 @@ public:
/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask);
/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap);
/*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
/*virtual*/ BOOL fileExists(const std::string &filename);
/*virtual*/ BOOL fileExists(const std::string &filename) const;
private:
BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap);

View File

@ -101,7 +101,7 @@ bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)
LLControlVariable::LLControlVariable(const std::string& name, eControlType type,
LLSD initial, const std::string& comment,
BOOL persist)
bool persist)
: mName(name),
mComment(comment),
mType(type),
@ -121,7 +121,7 @@ LLControlVariable::~LLControlVariable()
{
}
void LLControlVariable::setValue(const LLSD& value, bool saved_value)
LLSD LLControlVariable::getComparableValue(const LLSD& value)
{
// *FIX:MEP - The following is needed to make the LLSD::ImplString
// work with boolean controls...
@ -131,11 +131,11 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)
BOOL temp;
if(LLStringUtil::convertToBOOL(value.asString(), temp))
{
storable_value = temp;
storable_value = (bool)temp;
}
else
{
storable_value = FALSE;
storable_value = false;
}
}
else
@ -143,6 +143,12 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)
storable_value = value;
}
return storable_value;
}
void LLControlVariable::setValue(const LLSD& value, bool saved_value)
{
LLSD storable_value = getComparableValue(value);
bool value_changed = llsd_compare(getValue(), storable_value) == FALSE;
if(saved_value)
{
@ -184,12 +190,46 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)
}
}
void LLControlVariable::setDefaultValue(const LLSD& value)
{
// Set the control variables value and make it
// the default value. If the active value is changed,
// send the signal.
// *NOTE: Default values are not saved, only read.
LLSD comparable_value = getComparableValue(value);
bool value_changed = (llsd_compare(getValue(), comparable_value) == FALSE);
resetToDefault(false);
mValues[0] = comparable_value;
if(value_changed)
{
firePropertyChanged();
}
}
void LLControlVariable::setPersist(bool state)
{
mPersist = state;
}
void LLControlVariable::setComment(const std::string& comment)
{
mComment = comment;
}
void LLControlVariable::resetToDefault(bool fire_signal)
{
//The first setting is always the default
//Pop to it and fire off the listener
while(mValues.size() > 1) mValues.pop_back();
if(fire_signal) firePropertyChanged();
while(mValues.size() > 1)
{
mValues.pop_back();
}
if(fire_signal)
{
firePropertyChanged();
}
}
bool LLControlVariable::isSaveValueDefault()
@ -206,10 +246,10 @@ LLSD LLControlVariable::getSaveValue() const
return mValues[0];
}
LLControlVariable* LLControlGroup::getControl(const std::string& name)
LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name)
{
ctrl_name_table_t::iterator iter = mNameTable.find(name);
return iter == mNameTable.end() ? NULL : iter->second;
return iter == mNameTable.end() ? LLPointer<LLControlVariable>() : iter->second;
}
@ -238,7 +278,6 @@ LLControlGroup::~LLControlGroup()
void LLControlGroup::cleanup()
{
for_each(mNameTable.begin(), mNameTable.end(), DeletePairedPointer());
mNameTable.clear();
}
@ -264,6 +303,7 @@ BOOL LLControlGroup::declareControl(const std::string& name, eControlType type,
mNameTable[name]->setValue(initial_val);
return TRUE;
}
// if not, create the control and add it to the name table
LLControlVariable* control = new LLControlVariable(name, type, initial_val, comment, persist);
mNameTable[name] = control;
@ -979,7 +1019,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
return num_saved;
}
U32 LLControlGroup::loadFromFile(const std::string& filename)
U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values)
{
std::string name;
LLSD settings;
@ -1002,7 +1042,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename)
}
U32 validitems = 0;
int persist = 1;
bool persist = false;
for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr)
{
name = (*itr).first;
@ -1017,11 +1057,31 @@ U32 LLControlGroup::loadFromFile(const std::string& filename)
LLControlVariable* existing_control = getControl(name);
if(existing_control)
{
// Check persistence. If not persisted, we shouldn't be loading.
if(existing_control->isPersisted())
if(set_default_values)
{
// Override all previously set properties of this control.
// ... except for type. The types must match.
eControlType new_type = typeStringToEnum(control_map["Type"].asString());
if(existing_control->isType(new_type))
{
existing_control->setDefaultValue(control_map["Value"]);
existing_control->setPersist(persist);
existing_control->setComment(control_map["Comment"].asString());
}
else
{
llerrs << "Mismatched type of control variable '"
<< name << "' found while loading '"
<< filename << "'." << llendl;
}
}
else if(existing_control->isPersisted())
{
existing_control->setValue(control_map["Value"]);
}
// *NOTE: If not persisted and not setting defaults,
// the value should not get loaded.
}
else
{

View File

@ -83,7 +83,7 @@ typedef enum e_control_type
TYPE_COUNT
} eControlType;
class LLControlVariable
class LLControlVariable : public LLRefCount
{
friend class LLControlGroup;
typedef boost::signal<void(const LLSD&)> signal_t;
@ -92,7 +92,7 @@ private:
std::string mName;
std::string mComment;
eControlType mType;
BOOL mPersist;
bool mPersist;
std::vector<LLSD> mValues;
signal_t mSignal;
@ -100,7 +100,7 @@ private:
public:
LLControlVariable(const std::string& name, eControlType type,
LLSD initial, const std::string& comment,
BOOL persist = TRUE);
bool persist = true);
virtual ~LLControlVariable();
@ -108,33 +108,41 @@ public:
const std::string& getComment() const { return mComment; }
eControlType type() { return mType; }
BOOL isType(eControlType tp) { return tp == mType; }
bool isType(eControlType tp) { return tp == mType; }
void resetToDefault(bool fire_signal = TRUE);
void resetToDefault(bool fire_signal = false);
signal_t* getSignal() { return &mSignal; }
bool isDefault() { return (mValues.size() == 1); }
bool isSaveValueDefault();
bool isPersisted() { return mPersist; }
void set(const LLSD& val) { setValue(val); }
LLSD get() const { return getValue(); }
LLSD getDefault() const { return mValues.front(); }
LLSD getValue() const { return mValues.back(); }
LLSD getDefault() const { return mValues.front(); }
LLSD getSaveValue() const;
void set(const LLSD& val) { setValue(val); }
void setValue(const LLSD& value, bool saved_value = TRUE);
void setDefaultValue(const LLSD& value);
void setPersist(bool state);
void setComment(const std::string& comment);
void firePropertyChanged()
{
mSignal(mValues.back());
}
bool llsd_compare(const LLSD& a, const LLSD& b);
private:
LLSD getComparableValue(const LLSD& value);
bool llsd_compare(const LLSD& a, const LLSD & b);
};
//const U32 STRING_CACHE_SIZE = 10000;
class LLControlGroup
{
protected:
typedef std::map<std::string, LLControlVariable* > ctrl_name_table_t;
typedef std::map<std::string, LLPointer<LLControlVariable> > ctrl_name_table_t;
ctrl_name_table_t mNameTable;
std::set<std::string> mWarnings;
std::string mTypeString[TYPE_COUNT];
@ -146,7 +154,7 @@ public:
~LLControlGroup();
void cleanup();
LLControlVariable* getControl(const std::string& name);
LLPointer<LLControlVariable> getControl(const std::string& name);
struct ApplyFunctor
{
@ -213,7 +221,7 @@ public:
// as the given type.
U32 loadFromFileLegacy(const std::string& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
U32 saveToFile(const std::string& filename, BOOL nondefault_only);
U32 loadFromFile(const std::string& filename);
U32 loadFromFile(const std::string& filename, bool default_values = false);
void resetToDefaults();

View File

@ -277,6 +277,7 @@ set(viewer_SOURCE_FILES
llpanelpermissions.cpp
llpanelpick.cpp
llpanelplace.cpp
llpanelskins.cpp
llpanelvolume.cpp
llpanelweb.cpp
llparcelselection.cpp
@ -665,6 +666,7 @@ set(viewer_HEADER_FILES
llpanelpermissions.h
llpanelpick.h
llpanelplace.h
llpanelskins.h
llpanelvolume.h
llpanelweb.h
llparcelselection.h
@ -1003,180 +1005,182 @@ endif (WINDOWS)
# Add the xui files. This is handy for searching for xui elements
# from within the IDE
set(viewer_XUI_FILES
skins/xui/en-us/alerts.xml
skins/xui/en-us/floater_about_land.xml
skins/xui/en-us/floater_about.xml
skins/xui/en-us/floater_active_speakers.xml
skins/xui/en-us/floater_animation_preview.xml
skins/xui/en-us/floater_auction.xml
skins/xui/en-us/floater_audio_volume.xml
skins/xui/en-us/floater_avatar_picker.xml
skins/xui/en-us/floater_avatar_textures.xml
skins/xui/en-us/floater_build_options.xml
skins/xui/en-us/floater_bumps.xml
skins/xui/en-us/floater_buy_contents.xml
skins/xui/en-us/floater_buy_currency.xml
skins/xui/en-us/floater_buy_land.xml
skins/xui/en-us/floater_buy_object.xml
skins/xui/en-us/floater_camera.xml
skins/xui/en-us/floater_chat_history.xml
skins/xui/en-us/floater_chatterbox.xml
skins/xui/en-us/floater_choose_group.xml
skins/xui/en-us/floater_clothing.xml
skins/xui/en-us/floater_color_picker.xml
skins/xui/en-us/floater_critical.xml
skins/xui/en-us/floater_customize.xml
skins/xui/en-us/floater_day_cycle_options.xml
skins/xui/en-us/floater_device_settings.xml
skins/xui/en-us/floater_directory.xml
skins/xui/en-us/floater_env_settings.xml
skins/xui/en-us/floater_gesture.xml
skins/xui/en-us/floater_god_tools.xml
skins/xui/en-us/floater_group_info.xml
skins/xui/en-us/floater_hardware_settings.xml
skins/xui/en-us/floater_html.xml
skins/xui/en-us/floater_hud.xml
skins/xui/en-us/floater_image_preview.xml
skins/xui/en-us/floater_import.xml
skins/xui/en-us/floater_im.xml
skins/xui/en-us/floater_inspect.xml
skins/xui/en-us/floater_instant_message_ad_hoc.xml
skins/xui/en-us/floater_instant_message_group.xml
skins/xui/en-us/floater_instant_message.xml
skins/xui/en-us/floater_inventory_item_properties.xml
skins/xui/en-us/floater_inventory_view_finder.xml
skins/xui/en-us/floater_inventory.xml
skins/xui/en-us/floater_joystick.xml
skins/xui/en-us/floater_lagmeter.xml
skins/xui/en-us/floater_land_holdings.xml
skins/xui/en-us/floater_landmark_ctrl.xml
skins/xui/en-us/floater_live_lsleditor.xml
skins/xui/en-us/floater_lsl_guide.xml
skins/xui/en-us/floater_media_browser.xml
skins/xui/en-us/floater_moveview.xml
skins/xui/en-us/floater_mute_object.xml
skins/xui/en-us/floater_mute.xml
skins/xui/en-us/floater_my_friends.xml
skins/xui/en-us/floater_name_description.xml
skins/xui/en-us/floater_new_im.xml
skins/xui/en-us/floater_new_outfit_dialog.xml
skins/xui/en-us/floater_openobject.xml
skins/xui/en-us/floater_pay_object.xml
skins/xui/en-us/floater_pay.xml
skins/xui/en-us/floater_postcard.xml
skins/xui/en-us/floater_post_process.xml
skins/xui/en-us/floater_preferences.xml
skins/xui/en-us/floater_preview_animation.xml
skins/xui/en-us/floater_preview_classified.xml
skins/xui/en-us/floater_preview_embedded_texture.xml
skins/xui/en-us/floater_preview_event.xml
skins/xui/en-us/floater_preview_existing_landmark.xml
skins/xui/en-us/floater_preview_gesture.xml
skins/xui/en-us/floater_preview_notecard_keep_discard.xml
skins/xui/en-us/floater_preview_notecard.xml
skins/xui/en-us/floater_preview_sound.xml
skins/xui/en-us/floater_preview_texture_keep_discard.xml
skins/xui/en-us/floater_preview_texture.xml
skins/xui/en-us/floater_preview_url.xml
skins/xui/en-us/floater_price_for_listing.xml
skins/xui/en-us/floater_profile.xml
skins/xui/en-us/floater_region_info.xml
skins/xui/en-us/floater_report_abuse.xml
skins/xui/en-us/floater_report_bug.xml
skins/xui/en-us/floater_script_debug.xml
skins/xui/en-us/floater_script_ed_panel.xml
skins/xui/en-us/floater_script_preview.xml
skins/xui/en-us/floater_script_queue.xml
skins/xui/en-us/floater_script_search.xml
skins/xui/en-us/floater_select_key.xml
skins/xui/en-us/floater_sell_land.xml
skins/xui/en-us/floater_settings_debug.xml
skins/xui/en-us/floater_sim_release_message.xml
skins/xui/en-us/floater_snapshot.xml
skins/xui/en-us/floater_sound_preview.xml
skins/xui/en-us/floater_telehub.xml
skins/xui/en-us/floater_test.xml
skins/xui/en-us/floater_texture_ctrl.xml
skins/xui/en-us/floater_tools.xml
skins/xui/en-us/floater_top_objects.xml
skins/xui/en-us/floater_tos.xml
skins/xui/en-us/floater_url_entry.xml
skins/xui/en-us/floater_voice_wizard.xml
skins/xui/en-us/floater_water.xml
skins/xui/en-us/floater_wearable_save_as.xml
skins/xui/en-us/floater_windlight_options.xml
skins/xui/en-us/floater_world_map.xml
skins/xui/en-us/menu_inventory.xml
skins/xui/en-us/menu_login.xml
skins/xui/en-us/menu_pie_attachment.xml
skins/xui/en-us/menu_pie_avatar.xml
skins/xui/en-us/menu_pie_land.xml
skins/xui/en-us/menu_pie_object.xml
skins/xui/en-us/menu_pie_self.xml
skins/xui/en-us/menu_slurl.xml
skins/xui/en-us/menu_viewer.xml
skins/xui/en-us/mime_types.xml
skins/xui/en-us/notify.xml
skins/xui/en-us/panel_audio_device.xml
skins/xui/en-us/panel_audio.xml
skins/xui/en-us/panel_avatar_classified.xml
skins/xui/en-us/panel_avatar_pick.xml
skins/xui/en-us/panel_avatar.xml
skins/xui/en-us/panel_bars.xml
skins/xui/en-us/panel_bg_tab.xml
skins/xui/en-us/panel_bg_toolbar.xml
skins/xui/en-us/panel_chat_bar.xml
skins/xui/en-us/panel_classified.xml
skins/xui/en-us/panel_event.xml
skins/xui/en-us/panel_friends.xml
skins/xui/en-us/panel_group_finder.xml
skins/xui/en-us/panel_group_general.xml
skins/xui/en-us/panel_group_invite.xml
skins/xui/en-us/panel_group_land_money.xml
skins/xui/en-us/panel_group_notices.xml
skins/xui/en-us/panel_group_roles.xml
skins/xui/en-us/panel_groups.xml
skins/xui/en-us/panel_group_voting.xml
skins/xui/en-us/panel_group.xml
skins/xui/en-us/panel_land_covenant.xml
skins/xui/en-us/panel_login.xml
skins/xui/en-us/panel_master_volume.xml
skins/xui/en-us/panel_media_controls.xml
skins/xui/en-us/panel_media_remote_expanded.xml
skins/xui/en-us/panel_media_remote.xml
skins/xui/en-us/panel_overlaybar.xml
skins/xui/en-us/panel_place_small.xml
skins/xui/en-us/panel_place.xml
skins/xui/en-us/panel_preferences_audio.xml
skins/xui/en-us/panel_preferences_chat.xml
skins/xui/en-us/panel_preferences_general.xml
skins/xui/en-us/panel_preferences_graphics1.xml
skins/xui/en-us/panel_preferences_im.xml
skins/xui/en-us/panel_preferences_input.xml
skins/xui/en-us/panel_preferences_network.xml
skins/xui/en-us/panel_preferences_popups.xml
skins/xui/en-us/panel_preferences_voice.xml
skins/xui/en-us/panel_preferences_web.xml
skins/xui/en-us/panel_region_covenant.xml
skins/xui/en-us/panel_region_debug.xml
skins/xui/en-us/panel_region_estate.xml
skins/xui/en-us/panel_region_general.xml
skins/xui/en-us/panel_region_terrain.xml
skins/xui/en-us/panel_region_texture.xml
skins/xui/en-us/panel_scrolling_param.xml
skins/xui/en-us/panel_speaker_controls.xml
skins/xui/en-us/panel_status_bar.xml
skins/xui/en-us/panel_toolbar.xml
skins/xui/en-us/panel_top_pick.xml
skins/xui/en-us/panel_voice_controls.xml
skins/xui/en-us/panel_voice_enable.xml
skins/xui/en-us/panel_voice_options.xml
skins/xui/en-us/panel_voice_remote_expanded.xml
skins/xui/en-us/panel_voice_remote.xml
skins/xui/en-us/role_actions.xml
skins/xui/en-us/strings.xml
skins/xui/en-us/teleport_strings.xml
skins/xui/en-us/xui_version.xml
skins/default/colors.xml
skins/default/colors_base.xml
skins/default/xui/en-us/alerts.xml
skins/default/xui/en-us/floater_about_land.xml
skins/default/xui/en-us/floater_about.xml
skins/default/xui/en-us/floater_active_speakers.xml
skins/default/xui/en-us/floater_animation_preview.xml
skins/default/xui/en-us/floater_auction.xml
skins/default/xui/en-us/floater_audio_volume.xml
skins/default/xui/en-us/floater_avatar_picker.xml
skins/default/xui/en-us/floater_avatar_textures.xml
skins/default/xui/en-us/floater_build_options.xml
skins/default/xui/en-us/floater_bumps.xml
skins/default/xui/en-us/floater_buy_contents.xml
skins/default/xui/en-us/floater_buy_currency.xml
skins/default/xui/en-us/floater_buy_land.xml
skins/default/xui/en-us/floater_buy_object.xml
skins/default/xui/en-us/floater_camera.xml
skins/default/xui/en-us/floater_chat_history.xml
skins/default/xui/en-us/floater_chatterbox.xml
skins/default/xui/en-us/floater_choose_group.xml
skins/default/xui/en-us/floater_clothing.xml
skins/default/xui/en-us/floater_color_picker.xml
skins/default/xui/en-us/floater_critical.xml
skins/default/xui/en-us/floater_customize.xml
skins/default/xui/en-us/floater_day_cycle_options.xml
skins/default/xui/en-us/floater_device_settings.xml
skins/default/xui/en-us/floater_directory.xml
skins/default/xui/en-us/floater_env_settings.xml
skins/default/xui/en-us/floater_gesture.xml
skins/default/xui/en-us/floater_god_tools.xml
skins/default/xui/en-us/floater_group_info.xml
skins/default/xui/en-us/floater_hardware_settings.xml
skins/default/xui/en-us/floater_html.xml
skins/default/xui/en-us/floater_hud.xml
skins/default/xui/en-us/floater_image_preview.xml
skins/default/xui/en-us/floater_import.xml
skins/default/xui/en-us/floater_im.xml
skins/default/xui/en-us/floater_inspect.xml
skins/default/xui/en-us/floater_instant_message_ad_hoc.xml
skins/default/xui/en-us/floater_instant_message_group.xml
skins/default/xui/en-us/floater_instant_message.xml
skins/default/xui/en-us/floater_inventory_item_properties.xml
skins/default/xui/en-us/floater_inventory_view_finder.xml
skins/default/xui/en-us/floater_inventory.xml
skins/default/xui/en-us/floater_joystick.xml
skins/default/xui/en-us/floater_lagmeter.xml
skins/default/xui/en-us/floater_land_holdings.xml
skins/default/xui/en-us/floater_landmark_ctrl.xml
skins/default/xui/en-us/floater_live_lsleditor.xml
skins/default/xui/en-us/floater_lsl_guide.xml
skins/default/xui/en-us/floater_media_browser.xml
skins/default/xui/en-us/floater_moveview.xml
skins/default/xui/en-us/floater_mute_object.xml
skins/default/xui/en-us/floater_mute.xml
skins/default/xui/en-us/floater_my_friends.xml
skins/default/xui/en-us/floater_name_description.xml
skins/default/xui/en-us/floater_new_im.xml
skins/default/xui/en-us/floater_new_outfit_dialog.xml
skins/default/xui/en-us/floater_openobject.xml
skins/default/xui/en-us/floater_pay_object.xml
skins/default/xui/en-us/floater_pay.xml
skins/default/xui/en-us/floater_postcard.xml
skins/default/xui/en-us/floater_post_process.xml
skins/default/xui/en-us/floater_preferences.xml
skins/default/xui/en-us/floater_preview_animation.xml
skins/default/xui/en-us/floater_preview_classified.xml
skins/default/xui/en-us/floater_preview_embedded_texture.xml
skins/default/xui/en-us/floater_preview_event.xml
skins/default/xui/en-us/floater_preview_existing_landmark.xml
skins/default/xui/en-us/floater_preview_gesture.xml
skins/default/xui/en-us/floater_preview_notecard_keep_discard.xml
skins/default/xui/en-us/floater_preview_notecard.xml
skins/default/xui/en-us/floater_preview_sound.xml
skins/default/xui/en-us/floater_preview_texture_keep_discard.xml
skins/default/xui/en-us/floater_preview_texture.xml
skins/default/xui/en-us/floater_preview_url.xml
skins/default/xui/en-us/floater_price_for_listing.xml
skins/default/xui/en-us/floater_profile.xml
skins/default/xui/en-us/floater_region_info.xml
skins/default/xui/en-us/floater_report_abuse.xml
skins/default/xui/en-us/floater_report_bug.xml
skins/default/xui/en-us/floater_script_debug.xml
skins/default/xui/en-us/floater_script_ed_panel.xml
skins/default/xui/en-us/floater_script_preview.xml
skins/default/xui/en-us/floater_script_queue.xml
skins/default/xui/en-us/floater_script_search.xml
skins/default/xui/en-us/floater_select_key.xml
skins/default/xui/en-us/floater_sell_land.xml
skins/default/xui/en-us/floater_settings_debug.xml
skins/default/xui/en-us/floater_sim_release_message.xml
skins/default/xui/en-us/floater_snapshot.xml
skins/default/xui/en-us/floater_sound_preview.xml
skins/default/xui/en-us/floater_telehub.xml
skins/default/xui/en-us/floater_test.xml
skins/default/xui/en-us/floater_texture_ctrl.xml
skins/default/xui/en-us/floater_tools.xml
skins/default/xui/en-us/floater_top_objects.xml
skins/default/xui/en-us/floater_tos.xml
skins/default/xui/en-us/floater_url_entry.xml
skins/default/xui/en-us/floater_voice_wizard.xml
skins/default/xui/en-us/floater_water.xml
skins/default/xui/en-us/floater_wearable_save_as.xml
skins/default/xui/en-us/floater_windlight_options.xml
skins/default/xui/en-us/floater_world_map.xml
skins/default/xui/en-us/menu_inventory.xml
skins/default/xui/en-us/menu_login.xml
skins/default/xui/en-us/menu_pie_attachment.xml
skins/default/xui/en-us/menu_pie_avatar.xml
skins/default/xui/en-us/menu_pie_land.xml
skins/default/xui/en-us/menu_pie_object.xml
skins/default/xui/en-us/menu_pie_self.xml
skins/default/xui/en-us/menu_slurl.xml
skins/default/xui/en-us/menu_viewer.xml
skins/default/xui/en-us/mime_types.xml
skins/default/xui/en-us/notify.xml
skins/default/xui/en-us/panel_audio_device.xml
skins/default/xui/en-us/panel_audio.xml
skins/default/xui/en-us/panel_avatar_classified.xml
skins/default/xui/en-us/panel_avatar_pick.xml
skins/default/xui/en-us/panel_avatar.xml
skins/default/xui/en-us/panel_bars.xml
skins/default/xui/en-us/panel_bg_tab.xml
skins/default/xui/en-us/panel_bg_toolbar.xml
skins/default/xui/en-us/panel_chat_bar.xml
skins/default/xui/en-us/panel_classified.xml
skins/default/xui/en-us/panel_event.xml
skins/default/xui/en-us/panel_friends.xml
skins/default/xui/en-us/panel_group_finder.xml
skins/default/xui/en-us/panel_group_general.xml
skins/default/xui/en-us/panel_group_invite.xml
skins/default/xui/en-us/panel_group_land_money.xml
skins/default/xui/en-us/panel_group_notices.xml
skins/default/xui/en-us/panel_group_roles.xml
skins/default/xui/en-us/panel_groups.xml
skins/default/xui/en-us/panel_group_voting.xml
skins/default/xui/en-us/panel_group.xml
skins/default/xui/en-us/panel_land_covenant.xml
skins/default/xui/en-us/panel_login.xml
skins/default/xui/en-us/panel_master_volume.xml
skins/default/xui/en-us/panel_media_controls.xml
skins/default/xui/en-us/panel_media_remote_expanded.xml
skins/default/xui/en-us/panel_media_remote.xml
skins/default/xui/en-us/panel_overlaybar.xml
skins/default/xui/en-us/panel_place_small.xml
skins/default/xui/en-us/panel_place.xml
skins/default/xui/en-us/panel_preferences_audio.xml
skins/default/xui/en-us/panel_preferences_chat.xml
skins/default/xui/en-us/panel_preferences_general.xml
skins/default/xui/en-us/panel_preferences_graphics1.xml
skins/default/xui/en-us/panel_preferences_im.xml
skins/default/xui/en-us/panel_preferences_input.xml
skins/default/xui/en-us/panel_preferences_network.xml
skins/default/xui/en-us/panel_preferences_popups.xml
skins/default/xui/en-us/panel_preferences_voice.xml
skins/default/xui/en-us/panel_preferences_web.xml
skins/default/xui/en-us/panel_region_covenant.xml
skins/default/xui/en-us/panel_region_debug.xml
skins/default/xui/en-us/panel_region_estate.xml
skins/default/xui/en-us/panel_region_general.xml
skins/default/xui/en-us/panel_region_terrain.xml
skins/default/xui/en-us/panel_region_texture.xml
skins/default/xui/en-us/panel_scrolling_param.xml
skins/default/xui/en-us/panel_speaker_controls.xml
skins/default/xui/en-us/panel_status_bar.xml
skins/default/xui/en-us/panel_toolbar.xml
skins/default/xui/en-us/panel_top_pick.xml
skins/default/xui/en-us/panel_voice_controls.xml
skins/default/xui/en-us/panel_voice_enable.xml
skins/default/xui/en-us/panel_voice_options.xml
skins/default/xui/en-us/panel_voice_remote_expanded.xml
skins/default/xui/en-us/panel_voice_remote.xml
skins/default/xui/en-us/role_actions.xml
skins/default/xui/en-us/strings.xml
skins/default/xui/en-us/teleport_strings.xml
skins/default/xui/en-us/xui_version.xml
)
source_group("XUI Files" FILES ${viewer_XUI_FILES})
@ -1189,8 +1193,6 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})
set(viewer_APPSETTINGS_FILES
app_settings/anim.ini
app_settings/cmd_line.xml
app_settings/colors.xml
app_settings/colors_base.xml
app_settings/grass.xml
app_settings/high_graphics.xml
app_settings/keys.ini

View File

@ -187,6 +187,8 @@
</string>
<key>count</key>
<integer>2</integer>
<key>compose</key>
<boolean>true</boolean>
<!-- Special case. Mapped to settings procedurally. -->
</map>

View File

@ -2868,7 +2868,7 @@
<integer>0</integer>
</array>
</map>
<key>FloaterHUDRect</key>
<key>FloaterHUDRect2</key>
<map>
<key>Comment</key>
<string>Rectangle for HUD Floater window</string>
@ -2877,10 +2877,13 @@
<key>Type</key>
<string>Rect</string>
<key>Value</key>
<!-- NOTE: Height and width must match values in settings.xml for
FloaterHUDRect because this floater is resized to those values
in LLViewerWindow initialization. JC -->
<array>
<integer>0</integer>
<integer>282</integer>
<integer>342</integer>
<integer>292</integer>
<integer>362</integer>
<integer>0</integer>
</array>
</map>
@ -7185,16 +7188,16 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>SkinFolder</key>
<key>SkinCurrent</key>
<map>
<key>Comment</key>
<string>The skin folder to use.</string>
<string>The currently selected skin.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string />
<string>default</string>
</map>
<key>SkyAmbientScale</key>
<map>
@ -7766,6 +7769,17 @@
<integer>4</integer>
</array>
</map>
<key>TutorialURL</key>
<map>
<key>Comment</key>
<string>URL for tutorial menu item, set automatically during login</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string />
</map>
<key>TypeAheadTimeout</key>
<map>
<key>Comment</key>

View File

@ -75,6 +75,7 @@ ATI Radeon HD 2900 .*ATI.*Radeon HD 29.* 3 1
ATI Radeon HD 3400 .*ATI.*Radeon HD 34.* 1 1
ATI Radeon HD 3600 .*ATI.*Radeon HD 36.* 3 1
ATI Radeon HD 3800 .*ATI.*Radeon HD 38.* 3 1
ATI Radeon HD 4800 .*ATI.*Radeon HD 48.* 3 1
ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
ATI Radeon 7xxx .*ATI.*Radeon 7.* 0 1
ATI Radeon 8xxx .*ATI.*Radeon 8.* 0 1

View File

@ -110,6 +110,10 @@ Call RemoveNSIS ; Check for old NSIS install to remove
;;; Need to clean out shader files from previous installs to fix DEV-5663
Call RemoveOldShaders
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Need to clean out old XUI files that predate skinning
Call RemoveOldXUI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Files
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -488,6 +492,22 @@ RMDir /r "$INSTDIR\app_settings\shaders\*"
FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Delete the installed XUI files
;;; We've changed the directory hierarchy for skins, putting all XUI and texture
;;; files under a specific skin directory, i.e. skins/default/xui/en-us as opposed
;;; to skins/xui/en-us. Need to clean up the old path when upgrading
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function RemoveOldXUI
;; remove old XUI and texture files
RmDir /r "$INSTDIR\skins\html"
RmDir /r "$INSTDIR\skins\xui"
RmDir /r "$INSTDIR\skins\textures"
Delete "$INSTDIR\skins\*.txt"
FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Delete files in Documents and Settings\<user>\SecondLife
; Delete files in Documents and Settings\All Users\SecondLife

View File

@ -623,6 +623,9 @@ bool LLAppViewer::init()
// Need to do this initialization before we do anything else, since anything
// that touches files should really go through the lldir API
gDirUtilp->initAppDirs("SecondLife");
// set skin search path to default, will be overridden later
// this allows simple skinned file lookups to work
gDirUtilp->setSkinFolder("default");
initLogging();
@ -686,6 +689,8 @@ bool LLAppViewer::init()
*/
#endif
//test_cached_control();
// track number of times that app has run
mNumSessions = gSavedSettings.getS32("NumSessions");
mNumSessions++;
@ -699,12 +704,12 @@ bool LLAppViewer::init()
}
// Load art UUID information, don't require these strings to be declared in code.
std::string colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml");
std::string colors_base_filename = gDirUtilp->findSkinnedFilename("colors_base.xml");
LL_DEBUGS("InitInfo") << "Loading base colors from " << colors_base_filename << LL_ENDL;
gColors.loadFromFileLegacy(colors_base_filename, FALSE, TYPE_COL4U);
// Load overrides from user colors file
std::string user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml");
std::string user_colors_filename = gDirUtilp->findSkinnedFilename("colors.xml");
LL_DEBUGS("InitInfo") << "Loading user colors from " << user_colors_filename << LL_ENDL;
if (gColors.loadFromFileLegacy(user_colors_filename, FALSE, TYPE_COL4U) == 0)
{
@ -1475,7 +1480,7 @@ bool LLAppViewer::initLogging()
return true;
}
void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index)
void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index, bool set_defaults)
{
for(LLSD::map_iterator itr = mSettingsFileList.beginMap(); itr != mSettingsFileList.endMap(); ++itr)
{
@ -1508,7 +1513,7 @@ void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index)
llwarns << "Cannot load " << settings_file << " - No matching settings group for name " << settings_name << llendl;
continue;
}
if(!gSettings[settings_name]->loadFromFile(full_settings_path))
if(!gSettings[settings_name]->loadFromFile(full_settings_path, set_defaults))
{
llwarns << "Cannot load " << full_settings_path << " - No settings found." << llendl;
}
@ -1557,7 +1562,8 @@ bool LLAppViewer::initConfiguration()
// - load per account settings (happens in llstartup
// - load defaults
loadSettingsFromDirectory(LL_PATH_APP_SETTINGS);
bool set_defaults = true;
loadSettingsFromDirectory(LL_PATH_APP_SETTINGS, set_defaults);
// - set procedural settings
gSavedSettings.setString("ClientSettingsFile",
@ -1821,7 +1827,7 @@ bool LLAppViewer::initConfiguration()
}
}
const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinFolder");
const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
{
gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
@ -1833,33 +1839,33 @@ bool LLAppViewer::initConfiguration()
gSecondLife = "Second Life";
// Read skin/branding settings if specified.
if (! gDirUtilp->getSkinDir().empty() )
{
std::string skin_def_file = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "skin.xml");
LLXmlTree skin_def_tree;
//if (! gDirUtilp->getSkinDir().empty() )
//{
// std::string skin_def_file = gDirUtilp->findSkinnedFilename("skin.xml");
// LLXmlTree skin_def_tree;
if (!skin_def_tree.parseFile(skin_def_file))
{
llerrs << "Failed to parse skin definition." << llendl;
}
// if (!skin_def_tree.parseFile(skin_def_file))
// {
// llerrs << "Failed to parse skin definition." << llendl;
// }
LLXmlTreeNode* rootp = skin_def_tree.getRoot();
LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
if (disabled_message_node)
{
gDisabledMessage = disabled_message_node->getContents();
}
// LLXmlTreeNode* rootp = skin_def_tree.getRoot();
// LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
// if (disabled_message_node)
// {
// gDisabledMessage = disabled_message_node->getContents();
// }
static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
// static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
// rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
// Legacy string. This flag really meant we didn't want to expose references to "Second Life".
// Just set gHideLinks instead.
static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
BOOL silent_update;
rootp->getFastAttributeBOOL(silent_string, silent_update);
gHideLinks = (gHideLinks || silent_update);
}
// // Legacy string. This flag really meant we didn't want to expose references to "Second Life".
// // Just set gHideLinks instead.
// static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
// BOOL silent_update;
// rootp->getFastAttributeBOOL(silent_string, silent_update);
// gHideLinks = (gHideLinks || silent_update);
//}
#if LL_DARWIN
// Initialize apple menubar and various callbacks

View File

@ -122,7 +122,7 @@ public:
static const std::string sPerAccountSettingsName;
static const std::string sCrashSettingsName;
void loadSettingsFromDirectory(ELLPath path_index);
void loadSettingsFromDirectory(ELLPath path_index, bool set_defaults = false);
std::string getSettingsFileName(const std::string& file);

View File

@ -17,7 +17,6 @@
// statics
LLFloaterHUD* LLFloaterHUD::sInstance = 0;
std::string LLFloaterHUD::sTutorialUrl = "";
///----------------------------------------------------------------------------
/// Class LLFloaterHUD
@ -44,7 +43,7 @@ LLFloaterHUD::LLFloaterHUD()
setBackgroundOpaque(TRUE);
// Position floater based on saved location
LLRect saved_position_rect = gSavedSettings.getRect("FloaterHUDRect");
LLRect saved_position_rect = gSavedSettings.getRect("FloaterHUDRect2");
reshape(saved_position_rect.getWidth(), saved_position_rect.getHeight(), FALSE);
setRect(saved_position_rect);
@ -65,7 +64,9 @@ LLFloaterHUD::LLFloaterHUD()
language = gSavedSettings.getString("SystemLanguage");
}
std::string url = sTutorialUrl + language + "/";
std::string base_url = gSavedSettings.getString("TutorialURL");
std::string url = base_url + language + "/";
mWebBrowser->navigateTo(url);
}
@ -87,7 +88,7 @@ LLFloaterHUD* LLFloaterHUD::getInstance()
LLFloaterHUD::~LLFloaterHUD()
{
// Save floater position
gSavedSettings.setRect("FloaterHUDRect", getRect() );
gSavedSettings.setRect("FloaterHUDRect2", getRect() );
// Clear out the one instance if it's ours
if (sInstance == this)
@ -100,7 +101,7 @@ LLFloaterHUD::~LLFloaterHUD()
void LLFloaterHUD::showHUD()
{
// do not build the floater if there the url is empty
if (sTutorialUrl == "")
if (gSavedSettings.getString("TutorialURL") == "")
{
LLAlertDialog::showXml("TutorialNotFound");
return;

View File

@ -27,8 +27,6 @@ public:
static LLFloaterHUD* getInstance(); ///< get instance creating if necessary
virtual ~LLFloaterHUD(); ///< virtual destructor
static std::string sTutorialUrl;
static void showHUD(); ///< show the HUD
static void closeHUD(); ///< close the HUD (destroys floater)

View File

@ -393,6 +393,8 @@ void LLFloaterPostcard::sendPostcard()
gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE);
}
// give user feedback of the event
gViewerWindow->playSnapshotAnimAndSound();
LLUploadDialog::modalUploadDialog("Uploading...\n\nPostcard");
// don't destroy the window until the upload is done

View File

@ -60,6 +60,7 @@
#include "llpanelLCD.h"
#include "llpanelmsgs.h"
#include "llpanelweb.h"
#include "llpanelskins.h"
#include "llprefschat.h"
#include "llprefsvoice.h"
#include "llprefsim.h"
@ -128,6 +129,7 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
mDisplayPanel(NULL),
mAudioPanel(NULL),
mMsgPanel(NULL),
mSkinsPanel(NULL),
mLCDPanel(NULL)
{
mGeneralPanel = new LLPanelGeneral();
@ -183,6 +185,10 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
mMsgPanel = new LLPanelMsgs();
mTabContainer->addTabPanel(mMsgPanel, mMsgPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mMsgPanel->setDefaultBtn(default_btn);
mSkinsPanel = new LLPanelSkins();
mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
mSkinsPanel->setDefaultBtn(default_btn);
if (!mTabContainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
{
@ -238,6 +244,12 @@ LLPreferenceCore::~LLPreferenceCore()
delete mWebPanel;
mWebPanel = NULL;
}
if (mSkinsPanel)
{
delete mSkinsPanel;
mSkinsPanel = NULL;
}
}
@ -251,6 +263,7 @@ void LLPreferenceCore::apply()
mPrefsVoice->apply();
mPrefsIM->apply();
mMsgPanel->apply();
mSkinsPanel->apply();
// hardware menu apply
LLFloaterHardwareSettings::instance()->apply();
@ -278,6 +291,7 @@ void LLPreferenceCore::cancel()
mPrefsVoice->cancel();
mPrefsIM->cancel();
mMsgPanel->cancel();
mSkinsPanel->cancel();
// cancel hardware menu
LLFloaterHardwareSettings::instance()->cancel();

View File

@ -54,6 +54,7 @@ class LLPrefsChat;
class LLPrefsVoice;
class LLPrefsIM;
class LLPanelMsgs;
class LLPanelSkins;
class LLScrollListCtrl;
class LLPreferenceCore
@ -78,6 +79,7 @@ public:
private:
LLTabContainer *mTabContainer;
LLPanelGeneral *mGeneralPanel;
LLPanelSkins *mSkinsPanel;
LLPanelInput *mInputPanel;
LLPanelNetwork *mNetworkPanel;
LLPanelDisplay *mDisplayPanel;

View File

@ -155,7 +155,7 @@ public:
private:
LLColor4 mColor;
LLPointer<LLImageGL> mViewerImage[2];
LLPointer<LLImageGL> mViewerImage[2]; //used to represent the scene when the frame is frozen.
LLRect mImageRect[2];
S32 mWidth[2];
S32 mHeight[2];
@ -190,7 +190,6 @@ private:
LLQuaternion mCameraRot;
BOOL mSnapshotActive;
LLViewerWindow::ESnapshotType mSnapshotBufferType;
bool mSnapshotSoundPlayed;
public:
static std::set<LLSnapshotLivePreview*> sList;
@ -217,8 +216,7 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLRect& rect) :
mCameraPos(LLViewerCamera::getInstance()->getOrigin()),
mCameraRot(LLViewerCamera::getInstance()->getQuaternion()),
mSnapshotActive(FALSE),
mSnapshotBufferType(LLViewerWindow::SNAPSHOT_TYPE_COLOR),
mSnapshotSoundPlayed(false)
mSnapshotBufferType(LLViewerWindow::SNAPSHOT_TYPE_COLOR)
{
setSnapshotQuality(gSavedSettings.getS32("SnapshotQuality"));
mSnapshotDelayTimer.setTimerExpirySec(0.0f);
@ -403,6 +401,7 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y)
}
}
//called when the frame is frozen.
void LLSnapshotLivePreview::draw()
{
if (mViewerImage[mCurImageIndex].notNull() &&
@ -781,19 +780,6 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mPreviewImage->getHeight(),
previewp->mPreviewImage->getComponents());
if (!gSavedSettings.getBOOL("QuietSnapshotsToDisk"))
{
// Always play the sound once, on window open.
// Don't keep playing if automatic
// updates are enabled. It's too invasive. JC
if (!previewp->mSnapshotSoundPlayed
|| !gSavedSettings.getBOOL("AutoSnapshot") )
{
gViewerWindow->playSnapshotAnimAndSound();
previewp->mSnapshotSoundPlayed = true;
}
}
if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE)
{
LLPointer<LLImageJ2C> formatted = new LLImageJ2C;
@ -852,29 +838,32 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mPreviewImageEncoded->getHeight(),
previewp->mPreviewImageEncoded->getComponents());
// leave original image dimensions, just scale up texture buffer
if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024)
if(!scaled->isBufferInvalid())
{
// go ahead and shrink image to appropriate power of 2 for display
scaled->biasedScaleToPowerOfTwo(1024);
previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
// leave original image dimensions, just scale up texture buffer
if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024)
{
// go ahead and shrink image to appropriate power of 2 for display
scaled->biasedScaleToPowerOfTwo(1024);
previewp->mImageScaled[previewp->mCurImageIndex] = TRUE;
}
else
{
// expand image but keep original image data intact
scaled->expandToPowerOfTwo(1024, FALSE);
}
previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE);
previewp->mViewerImage[previewp->mCurImageIndex]->setMipFilterNearest(previewp->getSnapshotType() != SNAPSHOT_TEXTURE);
LLViewerImage::bindTexture(previewp->mViewerImage[previewp->mCurImageIndex]);
previewp->mViewerImage[previewp->mCurImageIndex]->setClamp(TRUE, TRUE);
previewp->mSnapshotUpToDate = TRUE;
previewp->generateThumbnailImage(TRUE) ;
previewp->mPosTakenGlobal = gAgent.getCameraPositionGlobal();
previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
}
else
{
// expand image but keep original image data intact
scaled->expandToPowerOfTwo(1024, FALSE);
}
previewp->mViewerImage[previewp->mCurImageIndex] = new LLImageGL(scaled, FALSE);
previewp->mViewerImage[previewp->mCurImageIndex]->setMipFilterNearest(previewp->getSnapshotType() != SNAPSHOT_TEXTURE);
LLViewerImage::bindTexture(previewp->mViewerImage[previewp->mCurImageIndex]);
previewp->mViewerImage[previewp->mCurImageIndex]->setClamp(TRUE, TRUE);
previewp->mSnapshotUpToDate = TRUE;
previewp->generateThumbnailImage(TRUE) ;
previewp->mPosTakenGlobal = gAgent.getCameraPositionGlobal();
previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
}
previewp->getWindow()->decBusyCount();
// only show fullscreen preview when in freeze frame mode
@ -955,6 +944,7 @@ void LLSnapshotLivePreview::saveTexture()
LLInventoryType::IT_SNAPSHOT,
PERM_ALL,
"Snapshot : " + pos_string);
gViewerWindow->playSnapshotAnimAndSound();
}
else
{
@ -967,7 +957,12 @@ void LLSnapshotLivePreview::saveTexture()
BOOL LLSnapshotLivePreview::saveLocal()
{
return gViewerWindow->saveImageNumbered(mFormattedImage);
BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage);
if(success)
{
gViewerWindow->playSnapshotAnimAndSound();
}
return success;
}
///----------------------------------------------------------------------------
@ -1134,10 +1129,6 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
}
bool use_freeze_frame = floaterp->childGetValue("freeze_frame_check").asBoolean();
// For now, auto-snapshot only works in freeze frame mode.
// This can be changed in the future by taking the FreezeTime check
// out of the onIdle() camera movement detection. JC
floaterp->childSetEnabled("auto_snapshot_check", use_freeze_frame);
if (use_freeze_frame)
{
@ -1174,9 +1165,6 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)
}
else // turning off freeze frame mode
{
// Force off auto-snapshot, see comment above about onIdle. JC
gSavedSettings.setBOOL("AutoSnapshot", FALSE);
floaterp->getParent()->setMouseOpaque(FALSE);
floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);
if (previewp)
@ -1348,8 +1336,6 @@ void LLFloaterSnapshot::Impl::onClickKeep(void* data)
if (previewp)
{
BOOL succeeded = TRUE; // Only used for saveLocal for now
if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_POSTCARD)
{
LLFloaterPostcard* floater = previewp->savePostcard();
@ -1368,7 +1354,7 @@ void LLFloaterSnapshot::Impl::onClickKeep(void* data)
}
else
{
succeeded = previewp->saveLocal();
previewp->saveLocal();
}
if (gSavedSettings.getBOOL("CloseSnapshotOnKeep"))
@ -1535,13 +1521,16 @@ void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data)
void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 index)
{
LLSnapshotLivePreview *previewp = getPreviewView(view) ;
// Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
#if 0
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getTypeIndex(view))
{
previewp->mKeepAspectRatio = FALSE ;
return ;
}
#endif
if(!index) //current window size
{
sAspectRatioCheckOff = TRUE ;
@ -1555,7 +1544,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde
else if(-1 == index) //custom
{
sAspectRatioCheckOff = FALSE ;
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
//if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType"))
{
view->childSetEnabled("keep_aspect_check", TRUE) ;
@ -1708,6 +1697,7 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
S32 h = height ;
//if texture, ignore aspect ratio setting, round image size to power of 2.
#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
{
if(width > max_value)
@ -1735,7 +1725,9 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3
height = get_lower_power_two(height, MAX_TEXTURE_SIZE) ;
}
}
else if(previewp && previewp->mKeepAspectRatio)
else
#endif
if(previewp && previewp->mKeepAspectRatio)
{
if(gViewerWindow->getWindowDisplayWidth() < 1 || gViewerWindow->getWindowDisplayHeight() < 1)
{
@ -1815,6 +1807,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
{
BOOL update_ = FALSE ;
//if to upload a snapshot, process spinner input in a special way.
#if 0 // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here
if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == gSavedSettings.getS32("LastSnapshotType"))
{
S32 spinner_increment = (S32)((LLSpinCtrl*)ctrl)->getIncrement() ;
@ -1834,7 +1827,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat
update_ = TRUE ;
}
}
#endif
previewp->setMaxImageSize((S32)((LLSpinCtrl *)ctrl)->getMaxValue()) ;
// Check image size changes the value of height and width

View File

@ -1899,9 +1899,27 @@ void deliver_message(const std::string& utf8_text,
im_session_id);
gAgent.sendReliableMessage();
if (LLMuteList::getInstance())
// If there is a mute list and this is not a group chat...
if ( LLMuteList::getInstance() )
{
LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
// ... the target should not be in our mute list for some message types.
// Auto-remove them if present.
switch( dialog )
{
case IM_NOTHING_SPECIAL:
case IM_GROUP_INVITATION:
case IM_INVENTORY_OFFERED:
case IM_SESSION_INVITE:
case IM_SESSION_P2P_INVITE:
case IM_SESSION_CONFERENCE_START:
case IM_SESSION_SEND: // This one is marginal - erring on the side of hearing.
case IM_LURE_USER:
case IM_GODLIKE_LURE_USER:
case IM_FRIENDSHIP_OFFERED:
LLMuteList::getInstance()->autoRemove(other_participant_id, LLMuteList::AR_IM);
break;
default: ; // do nothing
}
}
}

View File

@ -69,9 +69,6 @@
#include "llfirstuse.h"
const EInstantMessage GROUP_DIALOG = IM_SESSION_GROUP_START;
const EInstantMessage DEFAULT_DIALOG = IM_NOTHING_SPECIAL;
//
// Globals
//
@ -158,11 +155,12 @@ LLFloaterIM::LLFloaterIM()
BOOL LLFloaterIM::postBuild()
{
// IM session initiation warnings
sOnlyUserMessage = getString("only_user_message");
sOfflineMessage = getUIString("offline_message");
sMutedMessage = getUIString("muted_message");
sInviteMessage = getUIString("invite_message");
sMutedMessage = childGetText("muted_message");
if ( sErrorStringsMap.find("generic") == sErrorStringsMap.end() )
{
@ -617,7 +615,12 @@ LLUUID LLIMMgr::addSession(
noteOfflineUsers(floater, ids);
LLFloaterChatterBox::showInstance(session_id);
noteMutedUsers(floater, ids);
// Only warn for regular IMs - not group IMs
if( dialog == IM_NOTHING_SPECIAL )
{
noteMutedUsers(floater, ids);
}
LLFloaterChatterBox::getInstance(LLSD())->showFloater(floater);
}
else
@ -663,7 +666,12 @@ LLUUID LLIMMgr::addSession(
noteOfflineUsers(floater, ids);
LLFloaterChatterBox::showInstance(session_id);
noteMutedUsers(floater, ids);
// Only warn for regular IMs - not group IMs
if( dialog == IM_NOTHING_SPECIAL )
{
noteMutedUsers(floater, ids);
}
}
else
{
@ -1240,22 +1248,23 @@ void LLIMMgr::noteOfflineUsers(
void LLIMMgr::noteMutedUsers(LLFloaterIMPanel* floater,
const LLDynamicArray<LLUUID>& ids)
{
// Don't do this if we don't have a mute list.
LLMuteList *ml = LLMuteList::getInstance();
if( !ml )
{
return;
}
S32 count = ids.count();
if(count > 0)
{
const LLRelationship* info = NULL;
LLAvatarTracker& at = LLAvatarTracker::instance();
for(S32 i = 0; i < count; ++i)
{
info = at.getBuddyInfo(ids.get(i));
std::string first, last;
if(info && LLMuteList::getInstance() && LLMuteList::getInstance()->isMuted(ids.get(i))
&& gCacheName->getName(ids.get(i), first, last))
if( ml->isMuted(ids.get(i)) )
{
LLUIString muted = sMutedMessage;
muted.setArg("[FIRST]", first);
muted.setArg("[LAST]", last);
floater->addHistoryLine(muted);
break;
}
}
}

View File

@ -111,6 +111,7 @@ const char* NEW_CATEGORY_NAMES[LLAssetType::AT_COUNT] =
"Uncompressed Images", // AT_IMAGE_JPEG
"Animations", // AT_ANIMATION
"Gestures", // AT_GESTURE
"New Folder" // AT_SIMSTATE
};
struct InventoryIDPtrLess
@ -352,6 +353,12 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
return id;
}
if(preferred_type == LLAssetType::AT_SIMSTATE)
{
lldebugs << "Attempt to create simstate category." << llendl;
return id;
}
id.generate();
std::string name = pname;
if(!pname.empty())
@ -359,7 +366,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
name.assign(pname);
}
else if((preferred_type >= LLAssetType::AT_TEXTURE) &&
(preferred_type < LLAssetType::AT_COUNT))
(preferred_type < LLAssetType::AT_SIMSTATE))
{
name.assign(NEW_CATEGORY_NAMES[preferred_type]);
}

View File

@ -406,7 +406,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
combo->setCommitCallback( &LLPanelGeneral::set_start_location );
childSetCommitCallback("server_combo", onSelectServer, this);
LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
server_choice_combo->setCommitCallback(onSelectServer);
server_choice_combo->setFocusLostCallback(onServerComboLostFocus);
childSetAction("connect_btn", onClickConnect, this);
@ -1141,6 +1143,10 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
// static
void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
{
// *NOTE: The paramters for this method are ignored.
// LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
// calls this method.
// The user twiddled with the grid choice ui.
// apply the selection to the grid setting.
std::string grid_label;
@ -1183,3 +1189,12 @@ void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
// grid changed so show new splash screen (possibly)
loadLoginPage();
}
void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
{
LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
if(fe == combo)
{
onSelectServer(combo, NULL);
}
}

View File

@ -114,6 +114,7 @@ private:
static void onClickForgotPassword(void*);
static void onPassKey(LLLineEditor* caller, void* user_data);
static void onSelectServer(LLUICtrl*, void*);
static void onServerComboLostFocus(LLFocusableElement*, void*);
private:
LLPointer<LLUIImage> mLogoImage;

View File

@ -1940,7 +1940,8 @@ BOOL idle_startup()
option_it = (*it).find("tutorial_url");
if(option_it != (*it).end())
{
LLFloaterHUD::sTutorialUrl = option_it->second;
// Tutorial floater will append language code
gSavedSettings.setString("TutorialURL", option_it->second);
}
option_it = (*it).find("use_tutorial");
if(option_it != (*it).end())

View File

@ -927,12 +927,13 @@ S32 LLTextureCache::update(U32 max_time_ms)
}
//////////////////////////////////////////////////////////////////////////////
// search for local copy of UUID-based image file
std::string LLTextureCache::getLocalFileName(const LLUUID& id)
{
// Does not include extension
std::string idstr = id.asString();
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", idstr);
// TODO: should we be storing cached textures in skin directory?
std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "default", "textures", idstr);
return filename;
}

View File

@ -566,3 +566,125 @@ void settings_setup_listeners()
gSavedSettings.getControl("LipSyncEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
}
template <> eControlType get_control_type<U32>(const U32& in, LLSD& out)
{
out = (LLSD::Integer)in;
return TYPE_U32;
}
template <> eControlType get_control_type<S32>(const S32& in, LLSD& out)
{
out = in;
return TYPE_S32;
}
template <> eControlType get_control_type<F32>(const F32& in, LLSD& out)
{
out = in;
return TYPE_F32;
}
template <> eControlType get_control_type<bool> (const bool& in, LLSD& out)
{
out = in;
return TYPE_BOOLEAN;
}
/*
// Yay BOOL, its really an S32.
template <> eControlType get_control_type<BOOL> (const BOOL& in, LLSD& out)
{
out = in;
return TYPE_BOOLEAN;
}
*/
template <> eControlType get_control_type<std::string>(const std::string& in, LLSD& out)
{
out = in;
return TYPE_STRING;
}
template <> eControlType get_control_type<LLVector3>(const LLVector3& in, LLSD& out)
{
out = in.getValue();
return TYPE_VEC3;
}
template <> eControlType get_control_type<LLVector3d>(const LLVector3d& in, LLSD& out)
{
out = in.getValue();
return TYPE_VEC3D;
}
template <> eControlType get_control_type<LLRect>(const LLRect& in, LLSD& out)
{
out = in.getValue();
return TYPE_RECT;
}
template <> eControlType get_control_type<LLColor4>(const LLColor4& in, LLSD& out)
{
out = in.getValue();
return TYPE_COL4;
}
template <> eControlType get_control_type<LLColor3>(const LLColor3& in, LLSD& out)
{
out = in.getValue();
return TYPE_COL3;
}
template <> eControlType get_control_type<LLColor4U>(const LLColor4U& in, LLSD& out)
{
out = in.getValue();
return TYPE_COL4U;
}
template <> eControlType get_control_type<LLSD>(const LLSD& in, LLSD& out)
{
out = in;
return TYPE_LLSD;
}
#if TEST_CACHED_CONTROL
#define DECL_LLCC(T, V) static LLCachedControl<T> mySetting_##T("TestCachedControl"#T, V)
DECL_LLCC(U32, (U32)666);
DECL_LLCC(S32, (S32)-666);
DECL_LLCC(F32, (F32)-666.666);
DECL_LLCC(bool, true);
DECL_LLCC(BOOL, FALSE);
static LLCachedControl<std::string> mySetting_string("TestCachedControlstring", "Default String Value");
DECL_LLCC(LLVector3, LLVector3(1.0f, 2.0f, 3.0f));
DECL_LLCC(LLVector3d, LLVector3d(6.0f, 5.0f, 4.0f));
DECL_LLCC(LLRect, LLRect(0, 0, 100, 500));
DECL_LLCC(LLColor4, LLColor4(0.0f, 0.5f, 1.0f));
DECL_LLCC(LLColor3, LLColor3(1.0f, 0.f, 0.5f));
DECL_LLCC(LLColor4U, LLColor4U(255, 200, 100, 255));
LLSD test_llsd = LLSD()["testing1"] = LLSD()["testing2"];
DECL_LLCC(LLSD, test_llsd);
static LLCachedControl<std::string> test_BrowserHomePage("BrowserHomePage", "hahahahahha", "Not the real comment");
void test_cached_control()
{
#define TEST_LLCC(T, V) if((T)mySetting_##T != V) llerrs << "Fail "#T << llendl
TEST_LLCC(U32, 666);
TEST_LLCC(S32, (S32)-666);
TEST_LLCC(F32, (F32)-666.666);
TEST_LLCC(bool, true);
TEST_LLCC(BOOL, FALSE);
if((std::string)mySetting_string != "Default String Value") llerrs << "Fail string" << llendl;
TEST_LLCC(LLVector3, LLVector3(1.0f, 2.0f, 3.0f));
TEST_LLCC(LLVector3d, LLVector3d(6.0f, 5.0f, 4.0f));
TEST_LLCC(LLRect, LLRect(0, 0, 100, 500));
TEST_LLCC(LLColor4, LLColor4(0.0f, 0.5f, 1.0f));
TEST_LLCC(LLColor3, LLColor3(1.0f, 0.f, 0.5f));
TEST_LLCC(LLColor4U, LLColor4U(255, 200, 100, 255));
//There's no LLSD comparsion for LLCC yet. TEST_LLCC(LLSD, test_llsd);
if((std::string)test_BrowserHomePage != "http://www.secondlife.com") llerrs << "Fail BrowserHomePage" << llendl;
}
#endif // TEST_CACHED_CONTROL

View File

@ -65,4 +65,114 @@ extern LLControlGroup gCrashSettings;
extern std::string gLastRunVersion;
extern std::string gCurrentVersion;
//! Helper function for LLCachedControl
template <class T>
eControlType get_control_type(const T& in, LLSD& out)
{
llerrs << "Usupported control type: " << typeid(T).name() << "." << llendl;
return TYPE_COUNT;
}
//! Publish/Subscribe object to interact with LLControlGroups.
//! An LLCachedControl instance to connect to a LLControlVariable
//! without have to manually create and bind a listener to a local
//! object.
template <class T>
class LLCachedControl
{
T mCachedValue;
LLPointer<LLControlVariable> mControl;
boost::signals::connection mConnection;
public:
LLCachedControl(const std::string& name,
const T& default_value,
const std::string& comment = "Declared In Code")
{
mControl = gSavedSettings.getControl(name);
if(mControl.isNull())
{
declareTypedControl(gSavedSettings, name, default_value, comment);
mControl = gSavedSettings.getControl(name);
if(mControl.isNull())
{
llerrs << "The control could not be created!!!" << llendl;
}
mCachedValue = default_value;
}
else
{
mCachedValue = (const T&)mControl->getValue();
}
// Add a listener to the controls signal...
mControl->getSignal()->connect(
boost::bind(&LLCachedControl<T>::handleValueChange, this, _1)
);
}
~LLCachedControl()
{
if(mConnection.connected())
{
mConnection.disconnect();
}
}
LLCachedControl& operator =(const T& newvalue)
{
setTypeValue(*mControl, newvalue);
}
operator const T&() { return mCachedValue; }
private:
void declareTypedControl(LLControlGroup& group,
const std::string& name,
const T& default_value,
const std::string& comment)
{
LLSD init_value;
eControlType type = get_control_type<T>(default_value, init_value);
if(type < TYPE_COUNT)
{
group.declareControl(name, type, init_value, comment, FALSE);
}
}
bool handleValueChange(const LLSD& newvalue)
{
mCachedValue = (const T &)newvalue;
return true;
}
void setTypeValue(LLControlVariable& c, const T& v)
{
// Implicit conversion from T to LLSD...
c.set(v);
}
};
template <> eControlType get_control_type<U32>(const U32& in, LLSD& out);
template <> eControlType get_control_type<S32>(const S32& in, LLSD& out);
template <> eControlType get_control_type<F32>(const F32& in, LLSD& out);
template <> eControlType get_control_type<bool> (const bool& in, LLSD& out);
// Yay BOOL, its really an S32.
//template <> eControlType get_control_type<BOOL> (const BOOL& in, LLSD& out)
template <> eControlType get_control_type<std::string>(const std::string& in, LLSD& out);
template <> eControlType get_control_type<LLVector3>(const LLVector3& in, LLSD& out);
template <> eControlType get_control_type<LLVector3d>(const LLVector3d& in, LLSD& out);
template <> eControlType get_control_type<LLRect>(const LLRect& in, LLSD& out);
template <> eControlType get_control_type<LLColor4>(const LLColor4& in, LLSD& out);
template <> eControlType get_control_type<LLColor3>(const LLColor3& in, LLSD& out);
template <> eControlType get_control_type<LLColor4U>(const LLColor4U& in, LLSD& out);
template <> eControlType get_control_type<LLSD>(const LLSD& in, LLSD& out);
//#define TEST_CACHED_CONTROL 1
#ifdef TEST_CACHED_CONTROL
void test_cached_control();
#endif // TEST_CACHED_CONTROL
#endif // LL_LLVIEWERCONTROL_H

View File

@ -44,6 +44,10 @@
#include "llmediamanager.h"
#include "lluuid.h"
#include <boost/bind.hpp> // for SkinFolder listener
#include <boost/signal.hpp>
// Implementation functions not exported into header file
class LLViewerMediaImpl
: public LLMediaObserver
@ -55,8 +59,6 @@ class LLViewerMediaImpl
mMovieImageHasMips(false)
{ }
void initControlListeners();
void destroyMediaSource();
void play(const std::string& media_url,
@ -79,6 +81,15 @@ class LLViewerMediaImpl
void updateImagesMediaStreams();
LLUUID getMediaTextureID();
// Internally set our desired browser user agent string, including
// the Second Life version and skin name. Used because we can
// switch skins without restarting the app.
static void updateBrowserUserAgent();
// Callback for when the SkinCurrent control is changed to
// switch the user agent string to indicate the new skin.
static bool handleSkinCurrentChanged(const LLSD& newvalue);
public:
// a single media url with some data and an impl.
@ -93,6 +104,8 @@ class LLViewerMediaImpl
static LLViewerMediaImpl sViewerMediaImpl;
//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::destroyMediaSource()
{
LLMediaManager* mgr = LLMediaManager::getInstance();
@ -405,12 +418,44 @@ void LLViewerMediaImpl::onMediaSizeChange(const EventType& event_in)
*/
//////////////////////////////////////////////////////////////////////////////////////////
LLUUID LLViewerMediaImpl::getMediaTextureID()
{
return mMovieImageID;
}
// static
void LLViewerMediaImpl::updateBrowserUserAgent()
{
// Don't use user-visible string to avoid
// punctuation and strange characters.
std::string skin_name = gSavedSettings.getString("SkinCurrent");
// Just in case we need to check browser differences in A/B test
// builds.
std::string channel = gSavedSettings.getString("VersionChannelName");
// append our magic version number string to the browser user agent id
// See the HTTP 1.0 and 1.1 specifications for allowed formats:
// http://www.ietf.org/rfc/rfc1945.txt section 10.15
// http://www.ietf.org/rfc/rfc2068.txt section 3.8
// This was also helpful:
// http://www.mozilla.org/build/revised-user-agent-strings.html
std::ostringstream codec;
codec << "SecondLife/";
codec << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
codec << " (" << channel << "; " << skin_name << " skin)";
llinfos << codec.str() << llendl;
LLMediaManager::setBrowserUserAgent( codec.str() );
}
// static
bool LLViewerMediaImpl::handleSkinCurrentChanged(const LLSD& /*newvalue*/)
{
// gSavedSettings is already updated when this function is called.
updateBrowserUserAgent();
return true;
}
//////////////////////////////////////////////////////////////////////////////////////////
// Wrapper class
//////////////////////////////////////////////////////////////////////////////////////////
@ -434,6 +479,7 @@ void LLViewerMedia::initBrowser()
// static
void LLViewerMedia::initClass()
{
// *TODO: This looks like a memory leak to me. JC
LLMediaManagerData* init_data = new LLMediaManagerData;
buildMediaManagerData( init_data );
LLMediaManager::initClass( init_data );
@ -482,14 +528,6 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )
component_dir += "mozilla";
#endif
// append our magic version number string to the browser user agent id
std::ostringstream codec;
codec << "[Second Life ";
codec << "(" << gSavedSettings.getString("VersionChannelName") << ")";
codec << " - " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
codec << "]";
init_data->setBrowserUserAgentId( codec.str() );
std::string application_dir = gDirUtilp->getExecutableDir();
init_data->setBrowserApplicationDir( application_dir );
@ -499,6 +537,15 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )
std::string profile_name("Second Life");
init_data->setBrowserProfileName( profile_name );
init_data->setBrowserParentWindow( gViewerWindow->getPlatformWindow() );
// We use a custom user agent with viewer version and skin name.
LLViewerMediaImpl::updateBrowserUserAgent();
// Users can change skins while client is running, so make sure
// we pick up on changes.
gSavedSettings.getControl("SkinCurrent")->getSignal()->connect(
boost::bind( LLViewerMediaImpl::handleSkinCurrentChanged, _1 ) );
}
//////////////////////////////////////////////////////////////////////////////////////////

View File

@ -432,10 +432,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
gSavedSettings.getBOOL("RenderUIInSnapshot"),
FALSE))
{
if (!gSavedSettings.getBOOL("QuietSnapshotsToDisk"))
{
gViewerWindow->playSnapshotAnimAndSound();
}
gViewerWindow->playSnapshotAnimAndSound();
LLImageBase::setSizeOverride(TRUE);
LLPointer<LLImageFormatted> formatted;

View File

@ -517,11 +517,11 @@ public:
ypos += y_inc;
}
if (LLViewerJoystick::getInstance()->getOverrideCamera())
/*if (LLViewerJoystick::getInstance()->getOverrideCamera())
{
addText(xpos + 200, ypos, llformat("Flycam"));
ypos += y_inc;
}
}*/
if (gSavedSettings.getBOOL("DebugShowRenderInfo"))
{
@ -1853,6 +1853,10 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
{
LLRect r;
// *NOTE: The width and height of these floaters must be
// identical in settings.xml and their relevant floater.xml
// files, otherwise the window construction will get
// confused. JC
adjust_rect_bottom_center("FloaterMoveRect2", window);
adjust_rect_top_center("FloaterCameraRect3", window);
@ -1861,7 +1865,7 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
adjust_rect_top_left("FloaterLandRect5", window);
adjust_rect_top_left("FloaterHUDRect", window);
adjust_rect_top_left("FloaterHUDRect2", window);
adjust_rect_top_left("FloaterFindRect2", window);
@ -4187,6 +4191,10 @@ BOOL LLViewerWindow::saveSnapshot( const std::string& filepath, S32 image_width,
void LLViewerWindow::playSnapshotAnimAndSound()
{
if (gSavedSettings.getBOOL("QuietSnapshotsToDisk"))
{
return;
}
gAgent.sendAnimationRequest(ANIM_AGENT_SNAPSHOT, ANIM_REQUEST_START);
send_sound_trigger(LLUUID(gSavedSettings.getString("UISndSnapshot")), 1.0f);
}
@ -4557,14 +4565,15 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// Note: this formula depends on the number of components being 3. Not obvious, but it's correct.
image_width += (image_width * 3) % 4;
BOOL ret = TRUE ;
// Resize image
if(llabs(image_width - image_buffer_x) > 4 || llabs(image_height - image_buffer_y) > 4)
{
raw->scale( image_width, image_height );
ret = raw->scale( image_width, image_height );
}
else if(image_width != image_buffer_x || image_height != image_buffer_y)
{
raw->scale( image_width, image_height, FALSE );
ret = raw->scale( image_width, image_height, FALSE );
}
@ -4585,7 +4594,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
send_agent_resume();
}
return TRUE;
return ret;
}
void LLViewerWindow::destroyWindow()

View File

@ -696,7 +696,7 @@ void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop
// Since there is exception info... Release the hounds.
gEmergencyMemoryReserve.release();
if(gSavedSettings.getControl("SaveMinidump") != NULL && gSavedSettings.getBOOL("SaveMinidump"))
if(gSavedSettings.getControl("SaveMinidump").isNull() && gSavedSettings.getBOOL("SaveMinidump"))
{
_MINIDUMP_EXCEPTION_INFORMATION ExInfo;

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings version = "101">
</settings>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Verbindung nicht möglich</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
<p> Second Life kann keine Verbindung mit dem Anmeldeserver herstellen.
</p>
<p> Überprüfen Sie Ihre Internetverbindung. Falls Ihr Computer oder Netzwerk durch eine Firewall oder einen Proxy geschützt ist, so müssen Sie dafür sorgen, dass Second Life auf das Internet zugreifen darf.
</p> <div id="submitbtn">
<input class="input_over" type="submit" value="Erneut versuchen" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
</div>
</body>

View File

@ -0,0 +1,32 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Unable to Connect</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
</head>
<body>
<div id="infobox">
<img src="../../unabletoconnect.png"><br/>
<p>
Second Life can't establish a connection to the login server.
</p>
<p>
Please check your internet connection. If your computer or network is protected by a firewall or proxy, make sure that Second Life is permitted to access the network.
</p>
<div id="submitbtn">
<input class="input_over" type="submit" value="Try Again" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" />
</div>
</div>
</div>
</body>

View File

@ -0,0 +1,9 @@
<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
<table width="100%" height="100%" border="0">
<tr>
<td align="center" valign="middle" style="font-size:0.8em;">
<img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
</td>
</tr>
</table>
</body>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>No se puede establecer una conexión</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
<p> Second Life no puede establecer una conexión con el servidor de inicio de sesión.
</p>
<p> Compruebe la conexión a Internet. Si su computadora o red están protegidas con un firewall o proxy, asegúrese de permitirle el acceso a Second Life a la red.
</p> <div id="submitbtn">
<input class="input_over" type="submit" value="Volver a intentarlo" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
</div>
</body>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Connexion impossible</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
<p> Second Life ne peut pas établir de connexion avec le serveur.
</p>
<p> Vérifiez votre connexion Internet. Si votre ordinateur ou votre réseau est protégé par un.pare-feu ou un proxy, assurez-vous que Second Life a l'autorisation d'accéder au réseau.
</p> <div id="submitbtn">
<input class="input_over" type="submit" value="Essayer à nouveau" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
</div>
</body>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>接続できません</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
<p> Second Lifeによるログインサーバーへの接続が確立できません。
</p>
<p> インターネット接続を確認してください。 お使いのコンピュータやネットワークがファイヤウォールまたはプロキシにより保護されている場合は、Second Lifeによるネットワークへのアクセスが許可されていることを確認してください。
</p> <div id="submitbtn">
<input class="input_over" type="submit" value="もう一度試す" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
</div>
</body>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>연결할 수 없습니다.</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
<p> Second Life에서 로그인 서버에 대한 보안 연결을 설정할 수 없습니다.
</p>
<p> 인터넷 연결을 확인하십시오. 사용 중인 컴퓨터 또는 네트워크가 방화벽이나 프록시에 의해 보호된 경우 Second Life가 네트워크에 액세스할 수 있도록 허가되었는지 확인하십시오.
</p> <div id="submitbtn">
<input class="input_over" type="submit" value="다시 시도" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
</div>
</body>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Não é Possível Conectar</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
<p> O Second Life não consegue estabelecer uma conexão com o servidor de login.
</p>
<p> Verifique a sua conexão com a Internet. Se o seu computador ou sua rede estiverem protegidos por um firewall ou um proxy, verifique se o Second Life tem permissão de acesso na rede.
</p> <div id="submitbtn">
<input class="input_over" type="submit" value="Tentar Novamente" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
</div>
</body>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>无法连接</title>
<style>
body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
a {color:#93a9d5;}
a:active {color:#50607C;text-decoration:underline;}
a:hover {color:#ff7900;text-decoration:underline;}
#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
<p> 第二人生无法与登录服务器连接。
</p>
<p> 请检查您的因特网连接 如果您的计算机或网络由防火墙或代理器保护,请确认第二人生能在该网络里访问因特网。
</p> <div id="submitbtn">
<input class="input_over" type="submit" value="请再试一次" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
</div>
</body>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

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