# Conflicts:
#	doc/contributions.txt
#	indra/llprimitive/llmaterial.h
#	indra/newview/VIEWER_VERSION.txt
#	indra/newview/lldrawpool.cpp
#	indra/newview/lldrawpoolalpha.cpp
#	indra/newview/llfilepicker.cpp
#	indra/newview/llfilepicker.h
#	indra/newview/llpanelface.cpp
#	indra/newview/llviewermenufile.cpp
#	indra/newview/llvovolume.cpp
master
Ansariel 2023-07-18 10:59:02 +02:00
commit 289fb458f3
92 changed files with 1889 additions and 914 deletions

View File

@ -1194,6 +1194,7 @@ PanteraPolnocy
SL-18891
SL-18904
SL-18937
SL-19681
Parvati Silverweb
Patric Mills
VWR-2645
@ -1418,6 +1419,7 @@ Sovereign Engineer
SL-18497
SL-18525
SL-18534
SL-19336
SL-19690
SpacedOut Frye
VWR-34

View File

@ -1394,6 +1394,8 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id, boo
// get number of joint motions
//-------------------------------------------------------------------------
U32 num_motions = 0;
S32 rotation_dupplicates = 0;
S32 position_dupplicates = 0;
if (!dp.unpackU32(num_motions, "num_joints"))
{
LL_WARNS() << "can't read number of joints"
@ -1624,6 +1626,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id, boo
rCurve->mKeys[time] = rot_key;
}
if (joint_motion->mRotationCurve.mNumKeys > joint_motion->mRotationCurve.mKeys.size())
{
rotation_dupplicates++;
LL_INFOS() << "Motion: " << asset_id << " had dupplicate rotation keys that were removed" << LL_ENDL;
}
//---------------------------------------------------------------------
// scan position curve header
//---------------------------------------------------------------------
@ -1726,9 +1734,24 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id, boo
}
}
if (joint_motion->mPositionCurve.mNumKeys > joint_motion->mPositionCurve.mKeys.size())
{
position_dupplicates++;
}
joint_motion->mUsage = joint_state->getUsage();
}
if (rotation_dupplicates > 0)
{
LL_INFOS() << "Motion: " << asset_id << " had " << rotation_dupplicates << " dupplicate rotation keys that were removed" << LL_ENDL;
}
if (position_dupplicates > 0)
{
LL_INFOS() << "Motion: " << asset_id << " had " << position_dupplicates << " dupplicate position keys that were removed" << LL_ENDL;
}
//-------------------------------------------------------------------------
// get number of constraints
//-------------------------------------------------------------------------
@ -2008,10 +2031,13 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
JointMotion* joint_motionp = mJointMotionList->getJointMotion(i);
success &= dp.packString(joint_motionp->mJointName, "joint_name");
success &= dp.packS32(joint_motionp->mPriority, "joint_priority");
success &= dp.packS32(joint_motionp->mRotationCurve.mNumKeys, "num_rot_keys");
success &= dp.packS32(joint_motionp->mRotationCurve.mKeys.size(), "num_rot_keys");
LL_DEBUGS("BVH") << "Joint " << joint_motionp->mJointName << LL_ENDL;
for (RotationCurve::key_map_t::value_type& rot_pair : joint_motionp->mRotationCurve.mKeys)
LL_DEBUGS("BVH") << "Joint " << i
<< " name: " << joint_motionp->mJointName
<< " Rotation keys: " << joint_motionp->mRotationCurve.mKeys.size()
<< " Position keys: " << joint_motionp->mPositionCurve.mKeys.size() << LL_ENDL;
for (RotationCurve::key_map_t::value_type& rot_pair : joint_motionp->mRotationCurve.mKeys)
{
RotationKey& rot_key = rot_pair.second;
U16 time_short = F32_to_U16(rot_key.mTime, 0.f, mJointMotionList->mDuration);
@ -2031,7 +2057,7 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
LL_DEBUGS("BVH") << " rot: t " << rot_key.mTime << " angles " << rot_angles.mV[VX] <<","<< rot_angles.mV[VY] <<","<< rot_angles.mV[VZ] << LL_ENDL;
}
success &= dp.packS32(joint_motionp->mPositionCurve.mNumKeys, "num_pos_keys");
success &= dp.packS32(joint_motionp->mPositionCurve.mKeys.size(), "num_pos_keys");
for (PositionCurve::key_map_t::value_type& pos_pair : joint_motionp->mPositionCurve.mKeys)
{
PositionKey& pos_key = pos_pair.second;

View File

@ -40,7 +40,6 @@ set(llcommon_SOURCE_FILES
lldependencies.cpp
lldictionary.cpp
llerror.cpp
llerrorthread.cpp
llevent.cpp
lleventapi.cpp
lleventcoro.cpp
@ -153,7 +152,6 @@ set(llcommon_HEADER_FILES
llendianswizzle.h
llerror.h
llerrorcontrol.h
llerrorthread.h
llevent.h
lleventapi.h
lleventcoro.h

View File

@ -39,7 +39,6 @@
#include "llcommon.h"
#include "llapr.h"
#include "llerrorcontrol.h"
#include "llerrorthread.h"
#include "llframetimer.h"
#include "lllivefile.h"
#include "llmemory.h"
@ -108,12 +107,7 @@ LLAppErrorHandler LLApp::sErrorHandler = NULL;
BOOL LLApp::sErrorThreadRunning = FALSE;
LLApp::LLApp() : mThreadErrorp(NULL)
{
commonCtor();
}
void LLApp::commonCtor()
LLApp::LLApp()
{
// Set our status to running
setStatus(APP_STATUS_RUNNING);
@ -143,12 +137,6 @@ void LLApp::commonCtor()
mCrashReportPipeStr = L"\\\\.\\pipe\\LLCrashReporterPipe";
}
LLApp::LLApp(LLErrorThread *error_thread) :
mThreadErrorp(error_thread)
{
commonCtor();
}
LLApp::~LLApp()
{
@ -158,13 +146,6 @@ LLApp::~LLApp()
mLiveFiles.clear();
setStopped();
// HACK: wait for the error thread to clean itself
ms_sleep(20);
if (mThreadErrorp)
{
delete mThreadErrorp;
mThreadErrorp = NULL;
}
SUBSYSTEM_CLEANUP_DBG(LLCommon);
}
@ -393,27 +374,6 @@ void LLApp::setupErrorHandling(bool second_instance)
#endif // ! LL_BUGSPLAT
#endif // ! LL_WINDOWS
#ifdef LL_BUGSPLAT
// do not start our own error thread
#else // ! LL_BUGSPLAT
startErrorThread();
#endif
}
void LLApp::startErrorThread()
{
//
// Start the error handling thread, which is responsible for taking action
// when the app goes into the APP_STATUS_ERROR state
//
if(!mThreadErrorp)
{
LL_INFOS() << "Starting error thread" << LL_ENDL;
mThreadErrorp = new LLErrorThread();
mThreadErrorp->setUserData((void *) this);
mThreadErrorp->start();
}
}
void LLApp::setErrorHandler(LLAppErrorHandler handler)
@ -476,7 +436,7 @@ void LLApp::setStatus(EAppStatus status)
// static
void LLApp::setError()
{
// set app status to ERROR so that the LLErrorThread notices
// set app status to ERROR
setStatus(APP_STATUS_ERROR);
}

View File

@ -34,7 +34,6 @@
#include <atomic>
#include <chrono>
// Forward declarations
class LLErrorThread;
class LLLiveFile;
#if LL_LINUX
#include <signal.h>
@ -53,7 +52,6 @@ void clear_signals();
class LL_COMMON_API LLApp
{
friend class LLErrorThread;
public:
typedef enum e_app_status
{
@ -67,11 +65,6 @@ public:
LLApp();
virtual ~LLApp();
protected:
LLApp(LLErrorThread* error_thread);
void commonCtor();
public:
/**
* @brief Return the static app instance if one was created.
*/
@ -257,14 +250,14 @@ public:
void setupErrorHandling(bool mSecondInstance=false);
void setErrorHandler(LLAppErrorHandler handler);
static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.
static void runErrorHandler(); // run shortly after we detect an error
//@}
// the maximum length of the minidump filename returned by getMiniDumpFilename()
static const U32 MAX_MINDUMP_PATH_LENGTH = 256;
// change the directory where Breakpad minidump files are written to
void setDebugFileNames(const std::string &path);
void setDebugFileNames(const std::string &path);
// Return the Google Breakpad minidump filename after a crash.
char *getMiniDumpFilename() { return mMinidumpPath; }
@ -310,13 +303,11 @@ protected:
void stepFrame();
private:
void startErrorThread();
// Contains the filename of the minidump file after a crash.
char mMinidumpPath[MAX_MINDUMP_PATH_LENGTH];
std::string mStaticDebugFileName;
std::string mDynamicDebugFileName;
std::string mStaticDebugFileName;
std::string mDynamicDebugFileName;
// *NOTE: On Windows, we need a routine to reset the structured
// exception handler when some evil driver has taken it over for
@ -324,9 +315,6 @@ private:
typedef int(*signal_handler_func)(int signum);
static LLAppErrorHandler sErrorHandler;
// Default application threads
LLErrorThread* mThreadErrorp; // Waits for app to go to status ERROR, then runs the error callback
// This is the application level runnable scheduler.
LLRunner mRunner;

View File

@ -288,7 +288,6 @@ namespace LLError
// used to indicate no class info known for logging
//LLCallStacks keeps track of call stacks and output the call stacks to log file
//when LLAppViewer::handleViewerCrash() is triggered.
//
//Note: to be simple, efficient and necessary to keep track of correct call stacks,
//LLCallStacks is designed not to be thread-safe.

View File

@ -1,135 +0,0 @@
/**
* @file llerrorthread.cpp
*
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "linden_common.h"
#include "llerrorthread.h"
#include "llapp.h"
#include "lltimer.h" // ms_sleep()
LLErrorThread::LLErrorThread()
: LLThread("Error"),
mUserDatap(NULL)
{
}
LLErrorThread::~LLErrorThread()
{
}
void LLErrorThread::setUserData(void* user_data)
{
mUserDatap = user_data;
}
void* LLErrorThread::getUserData() const
{
return mUserDatap;
}
#if !LL_WINDOWS
//
// Various signal/error handling functions that can't be put into the class
//
void get_child_status(const int waitpid_status, int &process_status, bool &exited, bool do_logging)
{
exited = false;
process_status = -1;
// The child process exited. Call its callback, and then clean it up
if (WIFEXITED(waitpid_status))
{
process_status = WEXITSTATUS(waitpid_status);
exited = true;
if (do_logging)
{
LL_INFOS() << "get_child_status - Child exited cleanly with return of " << process_status << LL_ENDL;
}
return;
}
else if (WIFSIGNALED(waitpid_status))
{
process_status = WTERMSIG(waitpid_status);
exited = true;
if (do_logging)
{
LL_INFOS() << "get_child_status - Child died because of uncaught signal " << process_status << LL_ENDL;
#ifdef WCOREDUMP
if (WCOREDUMP(waitpid_status))
{
LL_INFOS() << "get_child_status - Child dumped core" << LL_ENDL;
}
else
{
LL_INFOS() << "get_child_status - Child didn't dump core" << LL_ENDL;
}
#endif
}
return;
}
else if (do_logging)
{
// This is weird. I just dump the waitpid status into the status code,
// not that there's any way of telling what it is...
LL_INFOS() << "get_child_status - Got SIGCHILD but child didn't exit" << LL_ENDL;
process_status = waitpid_status;
}
}
#endif
void LLErrorThread::run()
{
LLApp::sErrorThreadRunning = TRUE;
// This thread sits and waits for the sole purpose
// of waiting for the signal/exception handlers to flag the
// application state as APP_STATUS_ERROR.
// <FS:ND/> Do not log as this can lead to deadlocks during startup.
// LL_INFOS() << "thread_error - Waiting for an error" << LL_ENDL;
S32 counter = 0;
while (! (LLApp::isError() || LLApp::isStopped()))
{
ms_sleep(10);
counter++;
}
if (LLApp::isError())
{
// The app is in an error state, run the application's error handler.
//LL_INFOS() << "thread_error - An error has occurred, running error callback!" << LL_ENDL;
// Run the error handling callback
LLApp::runErrorHandler();
}
else
{
// Everything is okay, a clean exit.
//LL_INFOS() << "thread_error - Application exited cleanly" << LL_ENDL;
}
//LL_INFOS() << "thread_error - Exiting" << LL_ENDL;
LLApp::sErrorThreadRunning = FALSE;
}

View File

@ -1,46 +0,0 @@
/**
* @file llerrorthread.h
* @brief Specialized thread to handle runtime errors.
*
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLERRORTHREAD_H
#define LL_LLERRORTHREAD_H
#include "llthread.h"
class LL_COMMON_API LLErrorThread : public LLThread
{
public:
LLErrorThread();
~LLErrorThread();
/*virtual*/ void run(void);
void setUserData(void *user_data);
void *getUserData() const;
protected:
void* mUserDatap; // User data associated with this thread
};
#endif // LL_LLERRORTHREAD_H

View File

@ -606,7 +606,9 @@ std::string LLCacheName::buildUsername(const std::string& full_name)
// if the input wasn't a correctly formatted legacy name, just return it
// cleaned up from a potential terminal "Resident"
return cleanFullName(full_name);
std::string clean_name = cleanFullName(full_name);
LLStringUtil::toLower(clean_name);
return clean_name;
}
//static

View File

@ -438,18 +438,18 @@ bool LLMaterial::operator != (const LLMaterial& rhs) const
}
U32 LLMaterial::getShaderMask(U32 alpha_mode)
U32 LLMaterial::getShaderMask(U32 alpha_mode, BOOL is_alpha)
{ //NEVER incorporate this value into the message system -- this function will vary depending on viewer implementation
U32 ret = 0;
//two least significant bits are "diffuse alpha mode"
if (alpha_mode != DIFFUSE_ALPHA_MODE_DEFAULT)
//two least significant bits are "diffuse alpha mode"
U32 ret = alpha_mode;
if (ret == DIFFUSE_ALPHA_MODE_DEFAULT)
{
ret = alpha_mode;
}
else
{
ret = getDiffuseAlphaMode();
ret = getDiffuseAlphaMode();
if (ret == DIFFUSE_ALPHA_MODE_BLEND && !is_alpha)
{
ret = DIFFUSE_ALPHA_MODE_NONE;
}
}
llassert(ret < SHADER_COUNT);

View File

@ -133,7 +133,7 @@ public:
bool operator == (const LLMaterial& rhs) const;
bool operator != (const LLMaterial& rhs) const;
U32 getShaderMask(U32 alpha_mode = DIFFUSE_ALPHA_MODE_DEFAULT);
U32 getShaderMask(U32 alpha_mode, BOOL is_alpha);
LLUUID getHash() const;
protected:

View File

@ -520,7 +520,7 @@ F32 LLFontGL::getWidthF32(const std::string& utf8text, S32 begin_offset, S32 max
return getWidthF32(wtext.c_str(), begin_offset, max_chars);
}
F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars) const
F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars, bool no_padding) const
{
const S32 LAST_CHARACTER = LLFontFreetype::LAST_CHAR_FULL;
@ -543,12 +543,15 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
F32 advance = mFontFreetype->getXAdvance(fgi);
// for the last character we want to measure the greater of its width and xadvance values
// so keep track of the difference between these values for the each character we measure
// so we can fix things up at the end
width_padding = llmax( 0.f, // always use positive padding amount
width_padding - advance, // previous padding left over after advance of current character
(F32)(fgi->mWidth + fgi->mXBearing) - advance); // difference between width of this character and advance to next character
if (!no_padding)
{
// for the last character we want to measure the greater of its width and xadvance values
// so keep track of the difference between these values for the each character we measure
// so we can fix things up at the end
width_padding = llmax(0.f, // always use positive padding amount
width_padding - advance, // previous padding left over after advance of current character
(F32)(fgi->mWidth + fgi->mXBearing) - advance); // difference between width of this character and advance to next character
}
cur_x += advance;
llwchar next_char = wchars[i+1];
@ -565,8 +568,11 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
cur_x = (F32)ll_round(cur_x);
}
// add in extra pixels for last character's width past its xadvance
cur_x += width_padding;
if (!no_padding)
{
// add in extra pixels for last character's width past its xadvance
cur_x += width_padding;
}
return cur_x / sScaleX;
}

View File

@ -138,7 +138,7 @@ public:
F32 getWidthF32(const std::string& utf8text) const;
F32 getWidthF32(const llwchar* wchars) const;
F32 getWidthF32(const std::string& text, S32 offset, S32 max_chars ) const;
F32 getWidthF32(const llwchar* wchars, S32 offset, S32 max_chars) const;
F32 getWidthF32(const llwchar* wchars, S32 offset, S32 max_chars, bool no_padding = false) const;
// The following are called often, frequently with large buffers, so do not use a string interface

View File

@ -904,21 +904,18 @@ BOOL LLImageGL::setImage(const U8* data_in, BOOL data_hasmips /* = FALSE */, S32
{
stop_glerror();
// <FS:Zi> Fix use-after-free
// if (prev_mip_data)
// delete[] prev_mip_data;
// if (cur_mip_data)
// delete[] cur_mip_data;
if (prev_mip_data != cur_mip_data)
if (prev_mip_data)
{
delete[] prev_mip_data;
if (prev_mip_data != cur_mip_data)
delete[] prev_mip_data;
prev_mip_data = nullptr;
}
delete[] cur_mip_data;
prev_mip_data = nullptr;
cur_mip_data = nullptr;
// </FS:Zi>
if (cur_mip_data)
{
delete[] cur_mip_data;
cur_mip_data = nullptr;
}
mGLTextureCreated = false;
return FALSE;
}

View File

@ -432,7 +432,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )
// it is purely visual, so it is fine to do at our laisure
refreshSuffix();
}
mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight;
mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight;
mLabelWidthDirty = false;
}

View File

@ -37,6 +37,8 @@
#include "lluiimage.h"
#include "llwindow.h"
#include "llgltexture.h"
static LLDefaultChildRegistry::Register<LLIconCtrl> r("icon");
LLIconCtrl::Params::Params()
@ -94,6 +96,22 @@ BOOL LLIconCtrl::handleHover(S32 x, S32 y, MASK mask)
return LLUICtrl::handleHover(x, y, mask);
}
void LLIconCtrl::onVisibilityChange(BOOL new_visibility)
{
LLUICtrl::onVisibilityChange(new_visibility);
if (mPriority == LLGLTexture::BOOST_ICON)
{
if (new_visibility)
{
loadImage(getValue(), mPriority);
}
else
{
mImagep = nullptr;
}
}
}
// virtual
// value might be a string or a UUID
void LLIconCtrl::setValue(const LLSD& value)
@ -110,6 +128,14 @@ void LLIconCtrl::setValue(const LLSD& value, S32 priority)
tvalue = LLSD(LLUUID(value.asString()));
}
LLUICtrl::setValue(tvalue);
loadImage(tvalue, priority);
}
void LLIconCtrl::loadImage(const LLSD& tvalue, S32 priority)
{
if(mPriority == LLGLTexture::BOOST_ICON && !getVisible()) return;
if (tvalue.isUUID())
{
mImagep = LLUI::getUIImageByID(tvalue.asUUID(), priority);

View File

@ -72,6 +72,7 @@ public:
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
// lluictrl overrides
void onVisibilityChange(BOOL new_visibility);
virtual void setValue(const LLSD& value );
std::string getImageName() const;
@ -95,6 +96,8 @@ protected:
bool mInteractable;
private:
void loadImage(const LLSD& value, S32 priority);
LLUIColor mColor;
LLPointer<LLUIImage> mImagep;
};

View File

@ -320,6 +320,17 @@ void LLLayoutStack::draw()
}
}
void LLLayoutStack::deleteAllChildren()
{
mPanels.clear();
LLView::deleteAllChildren();
// Not really needed since nothing is left to
// display, but for the sake of consistency
updateFractionalSizes();
mNeedsLayout = true;
}
void LLLayoutStack::removeChild(LLView* view)
{
LLLayoutPanel* embedded_panelp = findEmbeddedPanel(dynamic_cast<LLPanel*>(view));
@ -327,21 +338,14 @@ void LLLayoutStack::removeChild(LLView* view)
if (embedded_panelp)
{
mPanels.erase(std::find(mPanels.begin(), mPanels.end(), embedded_panelp));
// delete embedded_panelp; // <FS:Zi> Fix crash when removing layout panels from a stack
LLView::removeChild(view);
updateFractionalSizes();
mNeedsLayout = true;
}
LLView::removeChild(view);
// <FS:Zi> Fix crash when removing layout panels from a stack
if (embedded_panelp)
{
// only delete the panel after it was removed from LLView to prevent
// LLView::removeChild() to run into an already deleted pointer
delete embedded_panelp;
}
// </FS:Zi>
else
{
LLView::removeChild(view);
}
}
BOOL LLLayoutStack::postBuild()

View File

@ -72,6 +72,7 @@ public:
virtual ~LLLayoutStack();
/*virtual*/ void draw();
/*virtual*/ void deleteAllChildren();
/*virtual*/ void removeChild(LLView*);
/*virtual*/ BOOL postBuild();
/*virtual*/ bool addChild(LLView* child, S32 tab_group = 0);

View File

@ -1905,6 +1905,13 @@ bool LLMenuGL::addContextChild(LLView* view, S32 tab_group)
return false;
}
void LLMenuGL::deleteAllChildren()
{
mItems.clear();
LLUICtrl::deleteAllChildren();
}
void LLMenuGL::removeChild( LLView* ctrl)
{
// previously a dynamic_cast with if statement to check validity

View File

@ -443,6 +443,7 @@ public:
/*virtual*/ void drawBackground(LLMenuItemGL* itemp, F32 alpha);
/*virtual*/ void setVisible(BOOL visible);
/*virtual*/ bool addChild(LLView* view, S32 tab_group = 0);
/*virtual*/ void deleteAllChildren();
/*virtual*/ void removeChild( LLView* ctrl);
/*virtual*/ BOOL postBuild();

View File

@ -127,6 +127,7 @@ public:
virtual void clearCtrls(); // overridden in LLPanelObject and LLPanelVolume
// Border controls
const LLViewBorder* getBorder() const { return mBorder; }
void addBorder( LLViewBorder::Params p);
void addBorder();
void removeBorder();

View File

@ -504,7 +504,7 @@ void LLTextBase::drawHighlightsBackground(const highlight_list_t& highlights, co
}
// [/SL:KB]
std::vector<LLRect> LLTextBase::getSelctionRects()
std::vector<LLRect> LLTextBase::getSelectionRects()
{
// Nor supposed to be called without selection
llassert(hasSelection());
@ -601,7 +601,7 @@ void LLTextBase::drawSelectionBackground()
// Draw selection even if we don't have keyboard focus for search/replace
if (hasSelection() && !mLineInfoList.empty())
{
std::vector<LLRect> selection_rects = getSelctionRects();
std::vector<LLRect> selection_rects = getSelectionRects();
// Draw the selection box (we're using a box instead of reversing the colors on the selected text).
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@ -1526,9 +1526,9 @@ void LLTextBase::draw()
drawCursor();
}
mDocumentView->setVisible(FALSE);
mDocumentView->setVisibleDirect(FALSE);
LLUICtrl::draw();
mDocumentView->setVisible(TRUE);
mDocumentView->setVisibleDirect(TRUE);
}
@ -3822,7 +3822,7 @@ bool LLNormalTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& w
height = mFontHeight;
const LLWString &text = getWText();
// if last character is a newline, then return true, forcing line break
width = mStyle->getFont()->getWidthF32(text.c_str(), mStart + first_char, num_chars);
width = mStyle->getFont()->getWidthF32(text.c_str(), mStart + first_char, num_chars, true);
}
return false;
}

View File

@ -685,7 +685,7 @@ protected:
return mLabel.getString() + getToolTip();
}
std::vector<LLRect> getSelctionRects();
std::vector<LLRect> getSelectionRects();
protected:
// text segmentation and flow

View File

@ -177,7 +177,8 @@ void LLTextBox::reshapeToFitText(BOOL called_from_parent)
S32 width = getTextPixelWidth();
S32 height = getTextPixelHeight();
reshape( width + 2 * mHPad, height + 2 * mVPad, called_from_parent );
//consider investigating reflow() to find missing width pixel (see SL-17045 changes)
reshape( width + 2 * mHPad + 1, height + 2 * mVPad, called_from_parent );
}

View File

@ -1915,7 +1915,10 @@ void LLTextEditor::unindentLineBeforeCloseBrace()
LLWString text = getWText();
if( ' ' == text[ mCursorPos - 1 ] )
{
S32 line = getLineNumFromDocIndex(mCursorPos, false);
// <FS:Zi> FIRE-19959: Fix unindent after } when a previous line had a word wrap
//S32 line = getLineNumFromDocIndex(mCursorPos, false);
S32 line = getLineNumFromDocIndex(mCursorPos, true);
// </FS:Zi>
S32 line_start = getLineStart(line);
// Jump over spaces in the current line

View File

@ -226,7 +226,6 @@ LLUIColor LLUIColorTable::getColor( char const *name, const LLColor4& default_co
void LLUIColorTable::setColor(const std::string& name, const LLColor4& color)
{
setColor(name, color, mUserSetColors);
setColor(name, color, mLoadedColors);
}
bool LLUIColorTable::loadFromSettings()
@ -255,6 +254,11 @@ void LLUIColorTable::saveUserSettings() const
it != mUserSetColors.end();
++it)
{
// Compare user color value with the default value, skip if equal
string_color_map_t::const_iterator itd = mLoadedColors.find(it->first);
if(itd != mLoadedColors.end() && itd->second == it->second)
continue;
ColorEntryParams color_entry;
// color_entry.name = it->first;

View File

@ -626,8 +626,10 @@ void LLView::deleteAllChildren()
while (!mChildList.empty())
{
LLView* viewp = mChildList.front();
delete viewp; // will remove the child from mChildList
LLView* viewp = mChildList.front();
viewp->mParentView = NULL;
delete viewp;
mChildList.pop_front();
}
}

View File

@ -293,6 +293,7 @@ public:
void setAllChildrenEnabled(BOOL b);
virtual void setVisible(BOOL visible);
void setVisibleDirect(BOOL visible) { mVisible = visible; }
const BOOL& getVisible() const { return mVisible; }
virtual void setEnabled(BOOL enabled);
BOOL getEnabled() const { return mEnabled; }

View File

@ -118,7 +118,8 @@ public:
// Sets cursor, may set to arrow+hourglass
virtual void setCursor(ECursorType cursor) { mNextCursor = cursor; };
virtual ECursorType getCursor() const;
virtual ECursorType getCursor() const;
virtual ECursorType getNextCursor() const { return mNextCursor; };
virtual void updateCursor() = 0;
virtual void captureMouse() = 0;

View File

@ -16351,13 +16351,13 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>TranslationService</key>
<map>
<key>Comment</key>
<string>Translation API to use. (google|bing)</string>
<string>Translation API to use. (google|azure)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>bing</string>
<string>azure</string>
</map>
<key>GoogleTranslateAPIKey</key>
<map>
@ -16373,7 +16373,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>BingTranslateAPIKey</key>
<map>
<key>Comment</key>
<string>Bing AppID to use with the Microsoft Translator API</string>
<string>(Deprecated) Bing AppID to use with the Microsoft Translator API</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -16381,6 +16381,28 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<string></string>
</map>
<key>AzureTranslateAPIKey</key>
<map>
<key>Comment</key>
<string>Azure Translation service data to use with the MS Azure Translator API</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>LLSD</string>
<key>Value</key>
<string></string>
</map>
<key>DeepLTranslateAPIKey</key>
<map>
<key>Comment</key>
<string>DeepL Translation service data to use with the DeepL Translator API</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>LLSD</string>
<key>Value</key>
<string></string>
</map>
<key>TutorialURL</key>
<map>
<key>Comment</key>

View File

@ -524,8 +524,8 @@ void FSData::processAgents(const LLSD& data)
for (LLSD::map_const_iterator iter = agents.beginMap(); iter != agents.endMap(); ++iter)
{
LLUUID key = LLUUID(iter->first);
mSupportAgents[key] = iter->second.asInteger();
LL_DEBUGS("fsdata") << "Added " << key << " with " << mSupportAgents[key] << " flag mask to mSupportAgentList" << LL_ENDL;
mTeamAgents[key] = iter->second.asInteger();
LL_DEBUGS("fsdata") << "Added " << key << " with " << mTeamAgents[key] << " flag mask to mSupportAgentList" << LL_ENDL;
}
}
else if (data.has("SupportAgents")) // Legacy format
@ -535,19 +535,19 @@ void FSData::processAgents(const LLSD& data)
for (LLSD::map_const_iterator iter = support_agents.beginMap(); iter != support_agents.endMap(); ++iter)
{
LLUUID key = LLUUID(iter->first);
mSupportAgents[key] = 0;
mTeamAgents[key] = 0;
const LLSD& content = iter->second;
if(content.has("support"))
{
mSupportAgents[key] |= SUPPORT;
mTeamAgents[key] |= SUPPORT;
}
if(content.has("developer"))
{
mSupportAgents[key] |= DEVELOPER;
mTeamAgents[key] |= DEVELOPER;
}
LL_DEBUGS("fsdata") << "Added Legacy " << key << " with " << mSupportAgents[key] << " flag mask to mSupportAgentList" << LL_ENDL;
std::string text = llformat("<key>%s</key><!-- %s -->\n <integer>%d</integer>\n", key.asString().c_str(), content["name"].asString().c_str(), mSupportAgents[key]);
LL_DEBUGS("fsdata") << "Added Legacy " << key << " with " << mTeamAgents[key] << " flag mask to mSupportAgentList" << LL_ENDL;
std::string text = llformat("<key>%s</key><!-- %s -->\n <integer>%d</integer>\n", key.asString().c_str(), content["name"].asString().c_str(), mTeamAgents[key]);
newFormat.append(text);
}
LL_DEBUGS("fsdata") << "New format for copy paste:\n" << newFormat << LL_ENDL;
@ -612,7 +612,7 @@ void FSData::selectNextMOTD()
}
//WS: Create a new LLSD based on the data from the mLegacyClientList if
LLSD FSData::resolveClientTag(const LLUUID& id, bool new_system, const LLColor4& color)
LLSD FSData::resolveClientTag(const LLUUID& id, bool new_system, const LLColor4& color) const
{
LLSD curtag;
curtag["uuid"] = id.asString();
@ -762,37 +762,37 @@ void FSData::saveLLSD(const LLSD& data, const std::string& filename, const LLDat
#endif
}
S32 FSData::getAgentFlags(const LLUUID& avatar_id)
S32 FSData::getAgentFlags(const LLUUID& avatar_id) const
{
std::map<LLUUID, S32>::iterator iter = mSupportAgents.find(avatar_id);
if (iter == mSupportAgents.end())
std::map<LLUUID, S32>::const_iterator iter = mTeamAgents.find(avatar_id);
if (iter == mTeamAgents.end())
{
return -1;
}
return iter->second;
}
bool FSData::isSupport(const LLUUID& avatar_id)
bool FSData::isSupport(const LLUUID& avatar_id) const
{
S32 flags = getAgentFlags(avatar_id);
return (flags != -1 && (flags & SUPPORT));
}
bool FSData::isDeveloper(const LLUUID& avatar_id)
bool FSData::isDeveloper(const LLUUID& avatar_id) const
{
S32 flags = getAgentFlags(avatar_id);
return (flags != -1 && (flags & DEVELOPER));
}
bool FSData::isQA(const LLUUID& avatar_id)
bool FSData::isQA(const LLUUID& avatar_id) const
{
S32 flags = getAgentFlags(avatar_id);
return (flags != -1 && (flags & QA));
}
LLSD FSData::allowedLogin()
LLSD FSData::allowedLogin() const
{
std::map<std::string, LLSD>::iterator iter = mBlockedVersions.find(LLVersionInfo::getInstance()->getChannelAndVersionFS());
std::map<std::string, LLSD>::const_iterator iter = mBlockedVersions.find(LLVersionInfo::getInstance()->getChannelAndVersionFS());
if (iter == mBlockedVersions.end())
{
return LLSD();
@ -831,25 +831,25 @@ LLSD FSData::allowedLogin()
}
}
bool FSData::isFirestormGroup(const LLUUID& id)
bool FSData::isFirestormGroup(const LLUUID& id) const
{
return isSupportGroup(id) || isTestingGroup(id);
}
bool FSData::isSupportGroup(const LLUUID& id)
bool FSData::isSupportGroup(const LLUUID& id) const
{
return mSupportGroup.count(id);
}
bool FSData::isTestingGroup(const LLUUID& id)
bool FSData::isTestingGroup(const LLUUID& id) const
{
return mTestingGroup.count(id);
}
bool FSData::isAgentFlag(const LLUUID& agent_id, flags_t flag)
bool FSData::isAgentFlag(const LLUUID& agent_id, flags_t flag) const
{
std::map<LLUUID, S32>::iterator iter = mSupportAgents.find(agent_id);
if (iter == mSupportAgents.end())
std::map<LLUUID, S32>::const_iterator iter = mTeamAgents.find(agent_id);
if (iter == mTeamAgents.end())
{
return false;
}
@ -879,7 +879,7 @@ void FSData::addAgents()
return;
}
for (std::map<LLUUID, S32>::iterator iter = mSupportAgents.begin(); iter != mSupportAgents.end(); ++iter)
for (std::map<LLUUID, S32>::iterator iter = mTeamAgents.begin(); iter != mTeamAgents.end(); ++iter)
{
if (iter->second & NO_SPAM)
{

View File

@ -45,7 +45,7 @@ public:
void processResponder(const LLSD& content, const std::string& url, bool save_to_file, const LLDate& last_modified);
void addAgents();
LLSD resolveClientTag(const LLUUID& id, bool new_system, const LLColor4& new_system_color);
LLSD resolveClientTag(const LLUUID& id, bool new_system, const LLColor4& new_system_color) const;
enum flags_t
{
@ -59,34 +59,31 @@ public:
GATEWAY = (1 << 7), //0x80 128
};
std::set<LLUUID> mSupportGroup;
std::set<LLUUID> mTestingGroup;
bool isDeveloper(const LLUUID& avatar_id);
bool isSupport(const LLUUID& avatar_id);
bool isQA(const LLUUID& avatar_id);
bool isFirestormGroup(const LLUUID& id);
bool isSupportGroup(const LLUUID& id);
bool isTestingGroup(const LLUUID& id);
bool isDeveloper(const LLUUID& avatar_id) const;
bool isSupport(const LLUUID& avatar_id) const;
bool isQA(const LLUUID& avatar_id) const;
bool isFirestormGroup(const LLUUID& id) const;
bool isSupportGroup(const LLUUID& id) const;
bool isTestingGroup(const LLUUID& id) const;
// returns -1 if agent is not found.
S32 getAgentFlags(const LLUUID& avatar_id);
S32 getAgentFlags(const LLUUID& avatar_id) const;
LLSD allowedLogin();
LLSD allowedLogin() const;
bool enableLegacySearch() {return mLegacySearch;}
bool enableLegacySearch() const { return mLegacySearch; }
std::string processRequestForInfo(const LLUUID& requester, const std::string& message, const std::string& name, const LLUUID& sessionid);
static LLSD getSystemInfo();
static void callbackReqInfo(const LLSD &notification, const LLSD &response);
std::string getOpenSimMOTD() { return mOpenSimMOTD; }
std::string getOpenSimMOTD() const { return mOpenSimMOTD; }
void selectNextMOTD();
bool getFSDataDone() { return mFSDataDone; }
bool getAgentsDone() { return mAgentsDone; }
bool getFSDataDone() const { return mFSDataDone; }
bool getAgentsDone() const { return mAgentsDone; }
bool isAgentFlag(const LLUUID& agent_id, FSData::flags_t flag);
bool isAgentFlag(const LLUUID& agent_id, FSData::flags_t flag) const;
private:
static void sendInfo(const LLUUID& destination, const LLUUID& sessionid, const std::string& my_name, EInstantMessage dialog);
@ -99,9 +96,12 @@ private:
void updateClientTagsLocal();
void onNameCache(const LLUUID& av_id, const LLAvatarName& av_name);
std::map<LLUUID, S32> mSupportAgents;
std::map<LLUUID, S32> mTeamAgents;
std::map<std::string, LLSD> mBlockedVersions;
uuid_set_t mSupportGroup;
uuid_set_t mTestingGroup;
LLSD mHeaders;
LLSD mLegacyClientList;
LLSD mRandomMOTDs;

View File

@ -4299,8 +4299,6 @@ void LLAppViewer::writeSystemInfo()
// "CrashNotHandled" is set here, while things are running well,
// in case of a freeze. If there is a freeze, the crash logger will be launched
// and can read this value from the debug_info.log.
// If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze,
// then the value of "CrashNotHandled" will be set to true.
gDebugInfo["CrashNotHandled"] = LLSD::Boolean(true);
#else // LL_BUGSPLAT
// "CrashNotHandled" is obsolete; it used (not very successsfully)
@ -4401,163 +4399,6 @@ void getFileList()
}
#endif
void LLAppViewer::handleViewerCrash()
{
LL_INFOS("CRASHREPORT") << "Handle viewer crash entry." << LL_ENDL;
LL_INFOS("CRASHREPORT") << "Last render pool type: " << LLPipeline::sCurRenderPoolType << LL_ENDL ;
LLMemory::logMemoryInfo(true) ;
//print out recorded call stacks if there are any.
LLError::LLCallStacks::print();
LLAppViewer* pApp = LLAppViewer::instance();
if (pApp->beingDebugged())
{
// This will drop us into the debugger.
abort();
}
if (LLApp::isCrashloggerDisabled())
{
abort();
}
// Returns whether a dialog was shown.
// Only do the logic in here once
if (pApp->mReportedCrash)
{
return;
}
pApp->mReportedCrash = TRUE;
// Insert crash host url (url to post crash log to) if configured.
std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl");
if(crashHostUrl != "")
{
gDebugInfo["Dynamic"]["CrashHostUrl"] = crashHostUrl;
}
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if ( parcel && parcel->getMusicURL()[0])
{
gDebugInfo["Dynamic"]["ParcelMusicURL"] = parcel->getMusicURL();
}
if ( parcel && parcel->getMediaURL()[0])
{
gDebugInfo["Dynamic"]["ParcelMediaURL"] = parcel->getMediaURL();
}
gDebugInfo["Dynamic"]["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
gDebugInfo["Dynamic"]["RAMInfo"]["Allocated"] = LLSD::Integer(LLMemory::getCurrentRSS() / 1024);
if(gLogoutInProgress)
{
gDebugInfo["Dynamic"]["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH;
}
else
{
gDebugInfo["Dynamic"]["LastExecEvent"] = gLLErrorActivated ? LAST_EXEC_LLERROR_CRASH : LAST_EXEC_OTHER_CRASH;
}
if(gAgent.getRegion())
{
gDebugInfo["Dynamic"]["CurrentSimHost"] = gAgent.getRegion()->getSimHostName();
gDebugInfo["Dynamic"]["CurrentRegion"] = gAgent.getRegion()->getName();
const LLVector3& loc = gAgent.getPositionAgent();
gDebugInfo["Dynamic"]["CurrentLocationX"] = loc.mV[0];
gDebugInfo["Dynamic"]["CurrentLocationY"] = loc.mV[1];
gDebugInfo["Dynamic"]["CurrentLocationZ"] = loc.mV[2];
}
if(LLAppViewer::instance()->mMainloopTimeout)
{
gDebugInfo["Dynamic"]["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
}
// The crash is being handled here so set this value to false.
// Otherwise the crash logger will think this crash was a freeze.
gDebugInfo["Dynamic"]["CrashNotHandled"] = LLSD::Boolean(false);
//Write out the crash status file
//Use marker file style setup, as that's the simplest, especially since
//we're already in a crash situation
if (gDirUtilp)
{
std::string crash_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
gLLErrorActivated
? LLERROR_MARKER_FILE_NAME
: ERROR_MARKER_FILE_NAME);
LLAPRFile crash_marker_file ;
crash_marker_file.open(crash_marker_file_name, LL_APR_WB);
if (crash_marker_file.getFileHandle())
{
LL_INFOS("MarkerFile") << "Created crash marker file " << crash_marker_file_name << LL_ENDL;
recordMarkerVersion(crash_marker_file);
}
else
{
LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_marker_file_name << LL_ENDL;
}
}
else
{
LL_WARNS("MarkerFile") << "No gDirUtilp with which to create error marker file name" << LL_ENDL;
}
#ifdef LL_WINDOWS
Sleep(200);
#endif
char *minidump_file = pApp->getMiniDumpFilename();
LL_DEBUGS("CRASHREPORT") << "minidump file name " << minidump_file << LL_ENDL;
if(minidump_file && minidump_file[0] != 0)
{
gDebugInfo["Dynamic"]["MinidumpPath"] = minidump_file;
}
else
{
#ifdef LL_WINDOWS
getFileList();
#else
LL_WARNS("CRASHREPORT") << "no minidump file?" << LL_ENDL;
#endif
}
gDebugInfo["Dynamic"]["CrashType"]="crash";
if (gMessageSystem && gDirUtilp)
{
std::string filename;
filename = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "stats.log");
LL_DEBUGS("CRASHREPORT") << "recording stats " << filename << LL_ENDL;
llofstream file(filename.c_str(), std::ios_base::binary);
if(file.good())
{
gMessageSystem->summarizeLogs(file);
file.close();
}
else
{
LL_WARNS("CRASHREPORT") << "problem recording stats" << LL_ENDL;
}
}
if (gMessageSystem)
{
gMessageSystem->getCircuitInfo(gDebugInfo["CircuitInfo"]);
gMessageSystem->stopLogging();
}
if (LLWorld::instanceExists()) LLWorld::getInstance()->getInfo(gDebugInfo["Dynamic"]);
gDebugInfo["FatalMessage"] = LLError::getFatalMessage();
// Close the debug file
pApp->writeDebugInfo(false); //false answers the isStatic question with the least overhead.
}
// static
void LLAppViewer::recordMarkerVersion(LLAPRFile& marker_file)
{

View File

@ -115,7 +115,6 @@ public:
virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.
// return false if the error trap needed restoration.
static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.
void checkForCrash();
// Thread accessors

View File

@ -128,8 +128,6 @@ int main( int argc, char **argv )
// install unexpected exception handler
gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
// install crash handlers
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
unsetenv( "LD_PRELOAD" ); // <FS:ND/> Get rid of any preloading, we do not want this to happen during startup of plugins.

View File

@ -83,8 +83,6 @@ void constructViewer()
}
gViewerAppPtr = new LLAppViewerMacOSX();
gViewerAppPtr->setErrorHandler(LLAppViewer::handleViewerCrash);
}
bool initViewer()

View File

@ -472,8 +472,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
// Set a debug info flag to indicate if multiple instances are running.
bool found_other_instance = !create_app_mutex();
gDebugInfo["FoundOtherInstanceAtStartup"] = LLSD::Boolean(found_other_instance);

View File

@ -85,6 +85,7 @@ struct LLAvatarData
std::string profile_url;
U8 caption_index;
std::string caption_text;
std::string customer_type;
U32 flags;
BOOL allow_publish;
};

View File

@ -283,6 +283,7 @@ void LLDrawPoolAlpha::renderDebugAlpha()
gGL.diffuseColor4f(1, 0, 0, 1);
gGL.getTexUnit(0)->bindFast(LLViewerFetchedTexture::getSmokeImage());
renderAlphaHighlight();
pushUntexturedBatches(LLRenderPass::PASS_ALPHA_MASK);

View File

@ -118,6 +118,8 @@ LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
mEnableCallbackRegistrar.add("Avatar.EnableGearItem", boost::bind(&cb_do_nothing));
mCommitCallbackRegistrar.add("Avatar.GearDoToSelected", boost::bind(&cb_do_nothing));
mEnableCallbackRegistrar.add("Avatar.CheckGearItem", boost::bind(&cb_do_nothing));
mMinFloaterHeight = EXPANDED_MIN_HEIGHT;
}
//static

View File

@ -94,6 +94,8 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
mEnableCallbackRegistrar.add("Avatar.EnableItem", boost::bind(&LLFloaterIMSessionTab::enableContextMenuItem, this, _2));
mCommitCallbackRegistrar.add("Avatar.DoToSelected", boost::bind(&LLFloaterIMSessionTab::doToSelected, this, _2));
mCommitCallbackRegistrar.add("Group.DoToSelected", boost::bind(&cb_group_do_nothing));
mMinFloaterHeight = getMinHeight();
}
LLFloaterIMSessionTab::~LLFloaterIMSessionTab()
@ -936,10 +938,13 @@ void LLFloaterIMSessionTab::reshapeFloater(bool collapse)
S32 height = mContentPanel->getRect().getHeight() + mToolbarPanel->getRect().getHeight()
+ mChatLayoutPanel->getRect().getHeight() - mChatLayoutPanelHeight + 2;
floater_rect.mTop -= height;
setResizeLimits(getMinWidth(), floater_rect.getHeight());
}
else
{
floater_rect.mTop = floater_rect.mBottom + mFloaterHeight;
setResizeLimits(getMinWidth(), mMinFloaterHeight);
}
enableResizeCtrls(true, true, !collapse);
@ -964,6 +969,7 @@ void LLFloaterIMSessionTab::restoreFloater()
setShape(floater_rect, true);
mBodyStack->updateLayout();
mExpandCollapseLineBtn->setImageOverlay(getString("expandline_icon"));
setResizeLimits(getMinWidth(), mMinFloaterHeight);
setMessagePaneExpanded(true);
saveCollapsedState();
mInputEditor->enableSingleLineMode(false);

View File

@ -154,6 +154,7 @@ protected:
bool mMessagePaneExpanded;
bool mIsParticipantListExpanded;
S32 mMinFloaterHeight;
LLIMModel::LLIMSession* mSession;

View File

@ -336,7 +336,6 @@ void LLFloaterRegionInfo::onOpen(const LLSD& key)
}
refreshFromRegion(gAgent.getRegion());
requestRegionInfo();
requestMeshRezInfo();
if (!mGodLevelChangeSlot.connected())
{
@ -1066,19 +1065,6 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
return false;
}
void LLFloaterRegionInfo::requestMeshRezInfo()
{
std::string sim_console_url = gAgent.getRegionCapability("SimConsoleAsync");
if (!sim_console_url.empty())
{
std::string request_str = "get mesh_rez_enabled";
LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(sim_console_url, LLSD(request_str),
"Requested mesh_rez_enabled", "Error requesting mesh_rez_enabled");
}
}
// setregioninfo
// strings[0] = 'Y' - block terraform, 'N' - not
// strings[1] = 'Y' - block fly, 'N' - not

View File

@ -108,7 +108,6 @@ public:
void onRegionChanged();
void requestRegionInfo();
void requestMeshRezInfo();
void enableTopButtons();
void disableTopButtons();

View File

@ -48,15 +48,9 @@
LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key)
: LLFloater(key)
, mMachineTranslationCB(NULL)
, mLanguageCombo(NULL)
, mTranslationServiceRadioGroup(NULL)
, mBingAPIKeyEditor(NULL)
, mGoogleAPIKeyEditor(NULL)
, mBingVerifyBtn(NULL)
, mGoogleVerifyBtn(NULL)
, mOKBtn(NULL)
, mBingKeyVerified(false)
, mAzureKeyVerified(false)
, mGoogleKeyVerified(false)
, mDeepLKeyVerified(false)
{
}
@ -66,24 +60,54 @@ BOOL LLFloaterTranslationSettings::postBuild()
mMachineTranslationCB = getChild<LLCheckBoxCtrl>("translate_chat_checkbox");
mLanguageCombo = getChild<LLComboBox>("translate_language_combo");
mTranslationServiceRadioGroup = getChild<LLRadioGroup>("translation_service_rg");
mBingAPIKeyEditor = getChild<LLLineEditor>("bing_api_key");
mAzureAPIEndpointEditor = getChild<LLComboBox>("azure_api_endpoint_combo");
mAzureAPIKeyEditor = getChild<LLLineEditor>("azure_api_key");
mAzureAPIRegionEditor = getChild<LLLineEditor>("azure_api_region");
mGoogleAPIKeyEditor = getChild<LLLineEditor>("google_api_key");
mBingVerifyBtn = getChild<LLButton>("verify_bing_api_key_btn");
mDeepLAPIDomainCombo = getChild<LLComboBox>("deepl_api_domain_combo");
mDeepLAPIKeyEditor = getChild<LLLineEditor>("deepl_api_key");
mAzureVerifyBtn = getChild<LLButton>("verify_azure_api_key_btn");
mGoogleVerifyBtn = getChild<LLButton>("verify_google_api_key_btn");
mDeepLVerifyBtn = getChild<LLButton>("verify_deepl_api_key_btn");
mOKBtn = getChild<LLButton>("ok_btn");
mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
mTranslationServiceRadioGroup->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
mOKBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnOK, this));
getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false));
mBingVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnBingVerify, this));
mAzureVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnAzureVerify, this));
mGoogleVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnGoogleVerify, this));
mDeepLVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnDeepLVerify, this));
mAzureAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
mAzureAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this), NULL);
mAzureAPIRegionEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
mAzureAPIRegionEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this), NULL);
mAzureAPIEndpointEditor->setFocusLostCallback([this](LLFocusableElement*)
{
setAzureVerified(false, false, 0);
});
mAzureAPIEndpointEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param)
{
setAzureVerified(false, false, 0);
});
mBingAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
mBingAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onBingKeyEdited, this), NULL);
mGoogleAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
mGoogleAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onGoogleKeyEdited, this), NULL);
mDeepLAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
mDeepLAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onDeepLKeyEdited, this), NULL);
mDeepLAPIDomainCombo->setFocusLostCallback([this](LLFocusableElement*)
{
setDeepLVerified(false, false, 0);
});
mDeepLAPIDomainCombo->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param)
{
setDeepLVerified(false, false, 0);
});
center();
return TRUE;
}
@ -95,17 +119,28 @@ void LLFloaterTranslationSettings::onOpen(const LLSD& key)
mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE);
mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE);
std::string bing_key = gSavedSettings.getString("BingTranslateAPIKey");
if (!bing_key.empty())
LLSD azure_key = gSavedSettings.getLLSD("AzureTranslateAPIKey");
if (azure_key.isMap() && !azure_key["id"].asString().empty())
{
mBingAPIKeyEditor->setText(bing_key);
mBingAPIKeyEditor->setTentative(FALSE);
verifyKey(LLTranslate::SERVICE_BING, bing_key, false);
mAzureAPIKeyEditor->setText(azure_key["id"].asString());
mAzureAPIKeyEditor->setTentative(false);
if (azure_key.has("region") && !azure_key["region"].asString().empty())
{
mAzureAPIRegionEditor->setText(azure_key["region"].asString());
mAzureAPIRegionEditor->setTentative(false);
}
else
{
mAzureAPIRegionEditor->setTentative(true);
}
mAzureAPIEndpointEditor->setValue(azure_key["endpoint"]);
verifyKey(LLTranslate::SERVICE_AZURE, azure_key, false);
}
else
{
mBingAPIKeyEditor->setTentative(TRUE);
mBingKeyVerified = FALSE;
mAzureAPIKeyEditor->setTentative(TRUE);
mAzureAPIRegionEditor->setTentative(true);
mAzureKeyVerified = FALSE;
}
std::string google_key = gSavedSettings.getString("GoogleTranslateAPIKey");
@ -121,39 +156,74 @@ void LLFloaterTranslationSettings::onOpen(const LLSD& key)
mGoogleKeyVerified = FALSE;
}
LLSD deepl_key = gSavedSettings.getLLSD("DeepLTranslateAPIKey");
if (deepl_key.isMap() && !deepl_key["id"].asString().empty())
{
mDeepLAPIKeyEditor->setText(deepl_key["id"].asString());
mDeepLAPIKeyEditor->setTentative(false);
mDeepLAPIDomainCombo->setValue(deepl_key["domain"]);
verifyKey(LLTranslate::SERVICE_DEEPL, deepl_key, false);
}
else
{
mDeepLAPIKeyEditor->setTentative(TRUE);
mDeepLKeyVerified = FALSE;
}
updateControlsEnabledState();
}
void LLFloaterTranslationSettings::setBingVerified(bool ok, bool alert)
void LLFloaterTranslationSettings::setAzureVerified(bool ok, bool alert, S32 status)
{
if (alert)
{
showAlert(ok ? "bing_api_key_verified" : "bing_api_key_not_verified");
showAlert(ok ? "azure_api_key_verified" : "azure_api_key_not_verified", status);
}
mBingKeyVerified = ok;
mAzureKeyVerified = ok;
updateControlsEnabledState();
}
void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert)
void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert, S32 status)
{
if (alert)
{
showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified");
showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified", status);
}
mGoogleKeyVerified = ok;
updateControlsEnabledState();
}
void LLFloaterTranslationSettings::setDeepLVerified(bool ok, bool alert, S32 status)
{
if (alert)
{
showAlert(ok ? "deepl_api_key_verified" : "deepl_api_key_not_verified", status);
}
mDeepLKeyVerified = ok;
updateControlsEnabledState();
}
std::string LLFloaterTranslationSettings::getSelectedService() const
{
return mTranslationServiceRadioGroup->getSelectedValue().asString();
}
std::string LLFloaterTranslationSettings::getEnteredBingKey() const
LLSD LLFloaterTranslationSettings::getEnteredAzureKey() const
{
return mBingAPIKeyEditor->getTentative() ? LLStringUtil::null : mBingAPIKeyEditor->getText();
LLSD key;
if (!mAzureAPIKeyEditor->getTentative())
{
key["endpoint"] = mAzureAPIEndpointEditor->getValue();
key["id"] = mAzureAPIKeyEditor->getText();
if (!mAzureAPIRegionEditor->getTentative())
{
key["region"] = mAzureAPIRegionEditor->getText();
}
}
return key;
}
std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const
@ -161,10 +231,26 @@ std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const
return mGoogleAPIKeyEditor->getTentative() ? LLStringUtil::null : mGoogleAPIKeyEditor->getText();
}
void LLFloaterTranslationSettings::showAlert(const std::string& msg_name) const
LLSD LLFloaterTranslationSettings::getEnteredDeepLKey() const
{
LLSD key;
if (!mDeepLAPIKeyEditor->getTentative())
{
key["domain"] = mDeepLAPIDomainCombo->getValue();
key["id"] = mDeepLAPIKeyEditor->getText();
}
return key;
}
void LLFloaterTranslationSettings::showAlert(const std::string& msg_name, S32 status) const
{
LLStringUtil::format_map_t string_args;
// For now just show an http error code, whole 'reason' string might be added later
string_args["[STATUS]"] = llformat("%d", status);
std::string message = getString(msg_name, string_args);
LLSD args;
args["MESSAGE"] = getString(msg_name);
args["MESSAGE"] = message;
LLNotificationsUtil::add("GenericAlert", args);
}
@ -173,34 +259,51 @@ void LLFloaterTranslationSettings::updateControlsEnabledState()
// Enable/disable controls based on the checkbox value.
bool on = mMachineTranslationCB->getValue().asBoolean();
std::string service = getSelectedService();
bool bing_selected = service == "bing";
bool azure_selected = service == "azure";
bool google_selected = service == "google";
bool deepl_selected = service == "deepl";
mTranslationServiceRadioGroup->setEnabled(on);
mLanguageCombo->setEnabled(on);
getChild<LLTextBox>("bing_api_key_label")->setEnabled(on);
mBingAPIKeyEditor->setEnabled(on);
// MS Azure
getChild<LLTextBox>("azure_api_endoint_label")->setEnabled(on);
mAzureAPIEndpointEditor->setEnabled(on && azure_selected);
getChild<LLTextBox>("azure_api_key_label")->setEnabled(on);
mAzureAPIKeyEditor->setEnabled(on && azure_selected);
getChild<LLTextBox>("azure_api_region_label")->setEnabled(on);
mAzureAPIRegionEditor->setEnabled(on && azure_selected);
getChild<LLTextBox>("google_api_key_label")->setEnabled(on);
mGoogleAPIKeyEditor->setEnabled(on);
mAzureVerifyBtn->setEnabled(on && azure_selected &&
!mAzureKeyVerified && getEnteredAzureKey().isMap());
mBingAPIKeyEditor->setEnabled(on && bing_selected);
mGoogleAPIKeyEditor->setEnabled(on && google_selected);
// Google
getChild<LLTextBox>("google_api_key_label")->setEnabled(on);
mGoogleAPIKeyEditor->setEnabled(on && google_selected);
mBingVerifyBtn->setEnabled(on && bing_selected &&
!mBingKeyVerified && !getEnteredBingKey().empty());
mGoogleVerifyBtn->setEnabled(on && google_selected &&
!mGoogleKeyVerified && !getEnteredGoogleKey().empty());
bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
// DeepL
getChild<LLTextBox>("deepl_api_domain_label")->setEnabled(on);
mDeepLAPIDomainCombo->setEnabled(on && deepl_selected);
getChild<LLTextBox>("deepl_api_key_label")->setEnabled(on);
mDeepLAPIKeyEditor->setEnabled(on && deepl_selected);
mDeepLVerifyBtn->setEnabled(on && deepl_selected &&
!mDeepLKeyVerified && getEnteredDeepLKey().isMap());
bool service_verified =
(azure_selected && mAzureKeyVerified)
|| (google_selected && mGoogleKeyVerified)
|| (deepl_selected && mDeepLKeyVerified);
gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
mOKBtn->setEnabled(!on || service_verified);
}
/*static*/
void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, bool alert)
void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, bool alert, S32 status)
{
LLFloaterTranslationSettings* floater =
LLFloaterReg::getTypedInstance<LLFloaterTranslationSettings>("prefs_translation");
@ -213,20 +316,23 @@ void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, b
switch (service)
{
case LLTranslate::SERVICE_BING:
floater->setBingVerified(ok, alert);
case LLTranslate::SERVICE_AZURE:
floater->setAzureVerified(ok, alert, status);
break;
case LLTranslate::SERVICE_GOOGLE:
floater->setGoogleVerified(ok, alert);
floater->setGoogleVerified(ok, alert, status);
break;
case LLTranslate::SERVICE_DEEPL:
floater->setDeepLVerified(ok, alert, status);
break;
}
}
void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert)
void LLFloaterTranslationSettings::verifyKey(int service, const LLSD& key, bool alert)
{
LLTranslate::verifyKey(static_cast<LLTranslate::EService>(service), key,
boost::bind(&LLFloaterTranslationSettings::setVerificationStatus, _1, _2, alert));
boost::bind(&LLFloaterTranslationSettings::setVerificationStatus, _1, _2, alert, _3));
}
void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control)
@ -242,11 +348,13 @@ void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control)
}
}
void LLFloaterTranslationSettings::onBingKeyEdited()
void LLFloaterTranslationSettings::onAzureKeyEdited()
{
if (mBingAPIKeyEditor->isDirty())
if (mAzureAPIKeyEditor->isDirty()
|| mAzureAPIRegionEditor->isDirty())
{
setBingVerified(false, false);
// todo: verify mAzureAPIEndpointEditor url
setAzureVerified(false, false, 0);
}
}
@ -254,16 +362,24 @@ void LLFloaterTranslationSettings::onGoogleKeyEdited()
{
if (mGoogleAPIKeyEditor->isDirty())
{
setGoogleVerified(false, false);
setGoogleVerified(false, false, 0);
}
}
void LLFloaterTranslationSettings::onBtnBingVerify()
void LLFloaterTranslationSettings::onDeepLKeyEdited()
{
std::string key = getEnteredBingKey();
if (!key.empty())
if (mDeepLAPIKeyEditor->isDirty())
{
setDeepLVerified(false, false, 0);
}
}
void LLFloaterTranslationSettings::onBtnAzureVerify()
{
LLSD key = getEnteredAzureKey();
if (key.isMap())
{
verifyKey(LLTranslate::SERVICE_BING, key);
verifyKey(LLTranslate::SERVICE_AZURE, key);
}
}
@ -272,26 +388,40 @@ void LLFloaterTranslationSettings::onBtnGoogleVerify()
std::string key = getEnteredGoogleKey();
if (!key.empty())
{
verifyKey(LLTranslate::SERVICE_GOOGLE, key);
verifyKey(LLTranslate::SERVICE_GOOGLE, LLSD(key));
}
}
void LLFloaterTranslationSettings::onBtnDeepLVerify()
{
LLSD key = getEnteredDeepLKey();
if (key.isMap())
{
verifyKey(LLTranslate::SERVICE_DEEPL, key);
}
}
void LLFloaterTranslationSettings::onClose(bool app_quitting)
{
std::string service = gSavedSettings.getString("TranslationService");
bool bing_selected = service == "bing";
bool azure_selected = service == "azure";
bool google_selected = service == "google";
bool deepl_selected = service == "deepl";
bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
bool service_verified =
(azure_selected && mAzureKeyVerified)
|| (google_selected && mGoogleKeyVerified)
|| (deepl_selected && mDeepLKeyVerified);
gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
}
void LLFloaterTranslationSettings::onBtnOK()
{
gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean());
gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString());
gSavedSettings.setString("TranslationService", getSelectedService());
gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey());
gSavedSettings.setLLSD("AzureTranslateAPIKey", getEnteredAzureKey());
gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey());
gSavedSettings.setLLSD("DeepLTranslateAPIKey", getEnteredDeepLKey());
closeFloater(false);
}

View File

@ -42,38 +42,48 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
void setBingVerified(bool ok, bool alert);
void setGoogleVerified(bool ok, bool alert);
void setAzureVerified(bool ok, bool alert, S32 status);
void setGoogleVerified(bool ok, bool alert, S32 status);
void setDeepLVerified(bool ok, bool alert, S32 status);
void onClose(bool app_quitting);
private:
std::string getSelectedService() const;
std::string getEnteredBingKey() const;
LLSD getEnteredAzureKey() const;
std::string getEnteredGoogleKey() const;
void showAlert(const std::string& msg_name) const;
LLSD getEnteredDeepLKey() const;
void showAlert(const std::string& msg_name, S32 status) const;
void updateControlsEnabledState();
void verifyKey(int service, const std::string& key, bool alert = true);
void verifyKey(int service, const LLSD& key, bool alert = true);
void onEditorFocused(LLFocusableElement* control);
void onBingKeyEdited();
void onAzureKeyEdited();
void onGoogleKeyEdited();
void onBtnBingVerify();
void onDeepLKeyEdited();
void onBtnAzureVerify();
void onBtnGoogleVerify();
void onBtnDeepLVerify();
void onBtnOK();
static void setVerificationStatus(int service, bool alert, bool ok);
static void setVerificationStatus(int service, bool alert, bool ok, S32 status);
LLCheckBoxCtrl* mMachineTranslationCB;
LLComboBox* mLanguageCombo;
LLLineEditor* mBingAPIKeyEditor;
LLComboBox* mAzureAPIEndpointEditor;
LLLineEditor* mAzureAPIKeyEditor;
LLLineEditor* mAzureAPIRegionEditor;
LLLineEditor* mGoogleAPIKeyEditor;
LLComboBox* mDeepLAPIDomainCombo;
LLLineEditor* mDeepLAPIKeyEditor;
LLRadioGroup* mTranslationServiceRadioGroup;
LLButton* mBingVerifyBtn;
LLButton* mAzureVerifyBtn;
LLButton* mGoogleVerifyBtn;
LLButton* mDeepLVerifyBtn;
LLButton* mOKBtn;
bool mBingKeyVerified;
bool mAzureKeyVerified;
bool mGoogleKeyVerified;
bool mDeepLKeyVerified;
};
#endif // LL_LLFLOATERTRANSLATIONSETTINGS_H

View File

@ -47,6 +47,7 @@ public:
/*virtual*/ void onOpen(const LLSD& notification_id);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
/*virtual*/ void deleteAllChildren();
/*virtual*/ void removeChild(LLView* child);
private:
void onToastDestroy(LLToast * toast);
@ -122,6 +123,12 @@ BOOL LLInspectToast::handleToolTip(S32 x, S32 y, MASK mask)
return LLFloater::handleToolTip(x, y, mask);
}
void LLInspectToast::deleteAllChildren()
{
mPanel = NULL;
LLInspect::deleteAllChildren();
}
// virtual
void LLInspectToast::removeChild(LLView* child)
{

View File

@ -660,7 +660,11 @@ const LLUUID LLInventoryModel::findCategoryUUIDForTypeInRoot(
}
}
if(rv.isNull() && create_folder && root_id.notNull())
if(rv.isNull()
&& root_id.notNull()
&& create_folder
&& preferred_type != LLFolderType::FT_MARKETPLACE_LISTINGS
&& preferred_type != LLFolderType::FT_OUTBOX)
{
if (isInventoryUsable())

View File

@ -30,8 +30,10 @@
#include "llagent.h"
#include "llappviewer.h"
#include "llcallbacklist.h"
#include "llinventorypanel.h"
#include "llinventorymodel.h"
#include "llinventorypanel.h"
#include "llnotificationsutil.h"
#include "llstartup.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewermessage.h"
@ -578,6 +580,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
// *TODO: Think I'd like to get a shared pointer to this and share it
// among all the folder requests.
uuid_vec_t recursive_cats;
uuid_vec_t all_cats; // dupplicate avoidance
LLSD folder_request_body;
LLSD folder_request_body_lib;
@ -608,7 +611,8 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
if (cat)
{
if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()
&& std::find(all_cats.begin(), all_cats.end(), cat_id) == all_cats.end())
{
LLSD folder_sd;
folder_sd["folder_id"] = cat->getUUID();
@ -650,6 +654,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
{
recursive_cats.push_back(cat_id);
}
all_cats.push_back(cat_id);
}
else
{
@ -982,6 +987,63 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http
<< LLCoreHttpUtil::responseToString(response) << "]" << LL_ENDL;
// Could use a 404 test here to try to detect revoked caps...
if(status == LLCore::HttpStatus(HTTP_FORBIDDEN))
{
// Too large, split into two if possible
if (gDisconnected || LLApp::isExiting())
{
return;
}
const std::string url(gAgent.getRegionCapability("FetchInventoryDescendents2"));
if (url.empty())
{
LL_WARNS(LOG_INV) << "Failed to get AIS2 cap" << LL_ENDL;
return;
}
S32 size = mRequestSD["folders"].size();
if (size > 1)
{
// Can split, assume that this isn't the library
LLSD folders;
uuid_vec_t recursive_cats;
LLSD::array_iterator iter = mRequestSD["folders"].beginArray();
LLSD::array_iterator end = mRequestSD["folders"].endArray();
while (iter != end)
{
folders.append(*iter);
LLUUID fodler_id = iter->get("folder_id").asUUID();
if (std::find(mRecursiveCatUUIDs.begin(), mRecursiveCatUUIDs.end(), fodler_id) != mRecursiveCatUUIDs.end())
{
recursive_cats.push_back(fodler_id);
}
if (folders.size() == (S32)(size / 2))
{
LLSD request_body;
request_body["folders"] = folders;
LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats));
gInventory.requestPost(false, url, request_body, handler, "Inventory Folder");
recursive_cats.clear();
folders.clear();
}
iter++;
}
LLSD request_body;
request_body["folders"] = folders;
LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats));
gInventory.requestPost(false, url, request_body, handler, "Inventory Folder");
return;
}
else
{
// Can't split
LLNotificationsUtil::add("InventoryLimitReachedAIS");
}
}
// This was originally the request retry logic for the inventory
// request which tested on HTTP_INTERNAL_ERROR status. This

View File

@ -1356,24 +1356,22 @@ void LLInventoryPanel::unSelectAll()
BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
{
// <FS:AW>
// BOOL handled = LLView::handleHover(x, y, mask);
// if(handled)
// {
// ECursorType cursor = getWindow()->getCursor();
// if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW)
// {
// // replace arrow cursor with arrow and hourglass cursor
// getWindow()->setCursor(UI_CURSOR_WORKING);
// }
// }
// else
// {
// getWindow()->setCursor(UI_CURSOR_ARROW);
// }
LLView::handleHover(x, y, mask);
// </FS:AW>
BOOL handled = LLView::handleHover(x, y, mask);
if(handled)
{
// getCursor gets current cursor, setCursor sets next cursor
// check that children didn't set own 'next' cursor
ECursorType cursor = getWindow()->getNextCursor();
if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW)
{
// replace arrow cursor with arrow and hourglass cursor
getWindow()->setCursor(UI_CURSOR_WORKING);
}
}
else
{
getWindow()->setCursor(UI_CURSOR_ARROW);
}
return TRUE;
}

View File

@ -99,6 +99,7 @@ public:
BOOL isMuted(const LLUUID& id, const std::string& name = LLStringUtil::null, U32 flags = 0) const;
// Workaround for username-based mute search, a lot of string conversions so use cautiously
// Expects lower case username
BOOL isMuted(const std::string& username, U32 flags = 0) const;
// Alternate (convenience) form for places we don't need to pass the name, but do need flags

View File

@ -1113,7 +1113,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
{ //set state of UI to match state of texture entry(ies) (calls setEnabled, setValue, etc, but NOT setVisible)
LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
if( objectp
if (objectp
&& objectp->getPCode() == LL_PCODE_VOLUME
&& objectp->permModify())
{
@ -1187,12 +1187,12 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
{
getChildView("color label")->setEnabled(editable);
}
//LLColorSwatchCtrl* mColorSwatch = findChild<LLColorSwatchCtrl>("colorswatch");
//LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("colorswatch");
LLColor4 color = LLColor4::white;
bool identical_color = false;
LLColor4 color = LLColor4::white;
bool identical_color = false;
if(mColorSwatch)
if (mColorSwatch)
{
LLSelectedTE::getColor(color, identical_color);
LLColor4 prev_color = mColorSwatch->get();
@ -1226,7 +1226,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLCtrlSelectionInterface* combobox_shininess = childGetSelectionInterface("combobox shininess");
if (combobox_shininess)
{
{
combobox_shininess->selectNthItem((S32)shiny);
}
@ -1246,8 +1246,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChild<LLUICtrl>("shinycolorswatch")->setTentative(!identical_spec);
//LLColorSwatchCtrl* mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
if(mShinyColorSwatch)
{
if (mShinyColorSwatch)
{
mShinyColorSwatch->setValid(editable);
mShinyColorSwatch->setEnabled( editable );
mShinyColorSwatch->setCanApplyImmediately( editable );
@ -1265,18 +1265,18 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bumpy = norm_map_id.isNull() ? bumpy : BUMPY_TEXTURE;
if (combobox_bumpiness)
{
{
combobox_bumpiness->selectNthItem((S32)bumpy);
}
}
else
{
{
LL_WARNS() << "failed childGetSelectionInterface for 'combobox bumpiness'" << LL_ENDL;
}
}
getChildView("combobox bumpiness")->setEnabled(editable);
getChild<LLUICtrl>("combobox bumpiness")->setTentative(!identical_bumpy);
getChildView("label bumpiness")->setEnabled(editable);
}
}
// Texture
{
@ -1290,25 +1290,25 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool identical_image_format = false;
LLSelectedTE::getImageFormat(image_format, identical_image_format);
mIsAlpha = FALSE;
switch (image_format)
{
case GL_RGBA:
case GL_ALPHA:
{
mIsAlpha = TRUE;
}
break;
case GL_RGB: break;
default:
{
LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
}
break;
mIsAlpha = FALSE;
switch (image_format)
{
case GL_RGBA:
case GL_ALPHA:
{
mIsAlpha = TRUE;
}
break;
if(LLViewerMedia::getInstance()->textureHasMedia(id))
case GL_RGB: break;
default:
{
LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
}
break;
}
if (LLViewerMedia::getInstance()->textureHasMedia(id))
{
getChildView("button align")->setEnabled(editable);
}
@ -1384,7 +1384,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
mTextureCtrl->setBakeTextureEnabled(TRUE);
}
}
if (mShinyTextureCtrl)
@ -1661,15 +1660,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
combobox_texgen->selectNthItem(((S32)selected_texgen) >> 1);
}
else
{
{
LL_WARNS() << "failed childGetSelectionInterface for 'combobox texgen'" << LL_ENDL;
}
}
getChildView("combobox texgen")->setEnabled(editable);
getChild<LLUICtrl>("combobox texgen")->setTentative(!identical);
getChildView("tex gen")->setEnabled(editable);
}
}
{
U8 fullbright_flag = 0;
@ -1700,7 +1698,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLComboBox* mComboTexGen = getChild<LLComboBox>("combobox texgen");
if (mComboTexGen)
{
{
S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0;
bool enabled = editable && (index != 1);
bool identical_repeats = true;
@ -1803,14 +1801,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (!mIsAlpha)
{ // ... unless there is no alpha channel in the texture, in which case alpha mode MUST ebe none
alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
}
}
combobox_alphamode->selectNthItem(alpha_mode);
}
else
{
}
else
{
LL_WARNS() << "failed childGetSelectionInterface for 'combobox alphamode'" << LL_ENDL;
}
}
getChild<LLUICtrl>("maskcutoff")->setValue(material->getAlphaMaskCutoff());
updateAlphaControls();
@ -1822,15 +1820,15 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
mShinyTextureCtrl->setImageAssetID(material->getSpecularID());
if (!material->getSpecularID().isNull() && (shiny == SHINY_TEXTURE))
{
{
material->getSpecularOffset(offset_x,offset_y);
material->getSpecularRepeat(repeat_x,repeat_y);
if (identical_planar_texgen)
{
{
repeat_x *= 2.0f;
repeat_y *= 2.0f;
}
}
rot = material->getSpecularRotation();
mCtrlShinyScaleU->setValue(repeat_x);
@ -1842,7 +1840,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity());
updateShinyControls(!material->getSpecularID().isNull(), true);
}
}
// Assert desired colorswatch color to match material AFTER updateShinyControls
// to avoid getting overwritten with the default on some UI state changes.
@ -1918,15 +1916,15 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
pbr_ctrl->setImageAssetID(LLUUID::null);
pbr_ctrl->setEnabled(FALSE);
}
LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
if(texture_ctrl)
///LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
if (mTextureCtrl)
{
mTextureCtrl->setImageAssetID( LLUUID::null );
mTextureCtrl->setEnabled( FALSE ); // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl.
// texture_ctrl->setValid(FALSE);
// mTextureCtrl->setValid(FALSE);
}
//LLColorSwatchCtrl* mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
if(mColorSwatch)
if (mColorSwatch)
{
mColorSwatch->setEnabled( FALSE );
mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") );

View File

@ -294,7 +294,6 @@ public:
// </FS>
private:
bool isAlpha() { return mIsAlpha; }
// Convenience funcs to keep the visual flack to a minimum
@ -303,10 +302,10 @@ private:
LLUUID getCurrentSpecularMap();
U32 getCurrentShininess();
U32 getCurrentBumpiness();
U8 getCurrentDiffuseAlphaMode();
U8 getCurrentAlphaMaskCutoff();
U8 getCurrentEnvIntensity();
U8 getCurrentGlossiness();
U8 getCurrentDiffuseAlphaMode();
U8 getCurrentAlphaMaskCutoff();
U8 getCurrentEnvIntensity();
U8 getCurrentGlossiness();
F32 getCurrentBumpyRot();
F32 getCurrentBumpyScaleU();
F32 getCurrentBumpyScaleV();
@ -409,7 +408,7 @@ private:
U32 new_alpha_mode = new_material->getDiffuseAlphaMode();
LLUUID new_normal_map_id = new_material->getNormalID();
LLUUID new_spec_map_id = new_material->getSpecularID();
LLUUID new_spec_map_id = new_material->getSpecularID();
if ((new_alpha_mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) && !is_alpha_face)
{
@ -658,7 +657,6 @@ public:
class LLSelectedTE
{
public:
static void getFace(class LLFace*& face_to_return, bool& identical_face);
static void getImageFormat(LLGLenum& image_format_to_return, bool& identical_face);
static void getTexId(LLUUID& id, bool& identical);

View File

@ -1602,7 +1602,8 @@ void LLPanelObjectInventory::reset()
LLEditMenuHandler::gEditMenuHandler = mFolders;
}
LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
int offset = hasBorder() ? getBorder()->getBorderWidth() << 1 : 0;
LLRect scroller_rect(0, getRect().getHeight() - offset, getRect().getWidth() - offset, 0);
LLScrollContainer::Params scroll_p;
scroll_p.name("task inventory scroller");
scroll_p.rect(scroller_rect);

View File

@ -165,6 +165,7 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id)
avatar_data->fl_about_text = result["fl_about_text"].asString();
avatar_data->born_on = result["member_since"].asDate();
avatar_data->profile_url = getProfileURL(agent_id.asString());
avatar_data->customer_type = result["customer_type"].asString();
avatar_data->flags = 0;
@ -1245,6 +1246,8 @@ void LLPanelProfileSecondLife::resetData()
// <FS:Ansariel> Fix LL UI/UX design accident
//childSetVisible("partner_layout", FALSE);
//childSetVisible("badge_layout", FALSE);
//childSetVisible("partner_spacer_layout", TRUE);
// <FS:Zi> Always show the online status text, just set it to "offline" when a friend is hiding
// mStatusText->setVisible(FALSE);
mCopyMenuButton->setVisible(FALSE);
@ -1579,8 +1582,90 @@ void LLPanelProfileSecondLife::fillAccountStatus(const LLAvatarData* avatar_data
std::string caption_text = getString("CaptionTextAcctInfo", args);
getChild<LLUICtrl>("account_info")->setValue(caption_text);
const S32 LINDEN_EMPLOYEE_INDEX = 3;
LLDate sl_release;
sl_release.fromYMDHMS(2003, 6, 23, 0, 0, 0);
std::string customer_lower = avatar_data->customer_type;
LLStringUtil::toLower(customer_lower);
if (avatar_data->caption_index == LINDEN_EMPLOYEE_INDEX)
{
// <FS:Ansariel> Fix LL UI/UX design accident
//getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Linden");
//getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeLinden"));
//childSetVisible("badge_layout", TRUE);
//childSetVisible("partner_spacer_layout", FALSE);
setBadge("Profile_Badge_Linden", "BadgeLinden");
}
else if (avatar_data->born_on < sl_release)
{
// <FS:Ansariel> Fix LL UI/UX design accident
//getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Beta");
//getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeBeta"));
//childSetVisible("badge_layout", TRUE);
//childSetVisible("partner_spacer_layout", FALSE);
setBadge("Profile_Badge_Beta", "BadgeBeta");
}
else if (customer_lower == "beta_lifetime")
{
// <FS:Ansariel> Fix LL UI/UX design accident
//getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Beta_Lifetime");
//getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeBetaLifetime"));
//childSetVisible("badge_layout", TRUE);
//childSetVisible("partner_spacer_layout", FALSE);
setBadge("Profile_Badge_Beta_Lifetime", "BadgeBetaLifetime");
}
else if (customer_lower == "lifetime")
{
// <FS:Ansariel> Fix LL UI/UX design accident
//getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Lifetime");
//getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeLifetime"));
//childSetVisible("badge_layout", TRUE);
//childSetVisible("partner_spacer_layout", FALSE);
setBadge("Profile_Badge_Lifetime", "BadgeLifetime");
}
else if (customer_lower == "secondlifetime_premium")
{
// <FS:Ansariel> Fix LL UI/UX design accident
//getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Premium_Lifetime");
//getChild<LLUICtrl>("badge_text")->setValue(getString("BadgePremiumLifetime"));
//childSetVisible("badge_layout", TRUE);
//childSetVisible("partner_spacer_layout", FALSE);
setBadge("Profile_Badge_Premium_Lifetime", "BadgePremiumLifetime");
}
else if (customer_lower == "secondlifetime_premium_plus")
{
// <FS:Ansariel> Fix LL UI/UX design accident
//getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Pplus_Lifetime");
//getChild<LLUICtrl>("badge_text")->setValue(getString("BadgePremiumPlusLifetime"));
//childSetVisible("badge_layout", TRUE);
//childSetVisible("partner_spacer_layout", FALSE);
setBadge("Profile_Badge_Pplus_Lifetime", "BadgePremiumPlusLifetime");
}
// <FS:Ansariel> Add Firestorm team badge
else if (FSData::getInstance()->getAgentFlags(avatar_data->avatar_id) != -1)
{
setBadge("Profile_Badge_Team", "BadgeTeam");
}
// </FS:Ansariel>
else
{
childSetVisible("badge_layout", FALSE);
// <FS:Ansariel> Fix LL UI/UX design accident
//childSetVisible("partner_spacer_layout", TRUE);
}
}
// <FS:Ansariel> Fix LL UI/UX design accident
void LLPanelProfileSecondLife::setBadge(std::string_view icon_name, std::string_view tooltip)
{
auto iconctrl = getChild<LLIconCtrl>("badge_icon");
iconctrl->setValue(icon_name.data());
iconctrl->setToolTip(getString(tooltip.data()));
childSetVisible("badge_layout", true);
}
// </FS:Ansariel>
void LLPanelProfileSecondLife::fillRightsData()
{
if (getSelfProfile())
@ -1749,7 +1834,7 @@ void LLPanelProfileSecondLife::updateOnlineStatus()
// <FS:Ansariel> Fix LL UI/UX design accident
//else
//{
// childSetVisible("frind_layout", false);
// childSetVisible("friend_layout", false);
// childSetVisible("online_layout", false);
// childSetVisible("offline_layout", false);
//}
@ -1775,7 +1860,7 @@ void LLPanelProfileSecondLife::processOnlineStatus(bool is_friend, bool show_onl
}
// </FS:Zi>
// <FS:Ansariel> Fix LL UI/UX design accident
//childSetVisible("frind_layout", is_friend);
//childSetVisible("friend_layout", is_friend);
//childSetVisible("online_layout", online && show_online);
//childSetVisible("offline_layout", !online && show_online);
// <FS:Zi> Always show the online status text, just set it to "offline" when a friend is hiding

View File

@ -208,6 +208,7 @@ private:
// <FS:Ansariel> Fix LL UI/UX design accident
void updateButtons();
void setBadge(std::string_view icon_name, std::string_view tooltip);
private:
typedef std::map<std::string, LLUUID> group_map_t;

View File

@ -563,6 +563,7 @@ void LLPanelProfilePick::setAvatarId(const LLUUID& avatar_id)
pick_name = parcel->getName();
pick_desc = parcel->getDesc();
snapshot_id = parcel->getSnapshotID();
mPickDescription->setParseHTML(false);
}
LLViewerRegion* region = gAgent.getRegion();

View File

@ -617,8 +617,6 @@ void LLPanelWearing::onRemoveAttachment()
{
LLSelectMgr::getInstance()->deselectAll();
LLSelectMgr::getInstance()->selectObjectAndFamily(mAttachmentsMap[item->getUUID()]);
// <FS:Ansariel> Can't drop to the ground, so detach instead
//LLSelectMgr::getInstance()->sendDropAttachment();
LLSelectMgr::getInstance()->sendDetach();
}
}

View File

@ -225,7 +225,7 @@ void LLScriptEditor::drawSelectionBackground()
// Draw selection even if we don't have keyboard focus for search/replace
if( hasSelection() && !mLineInfoList.empty())
{
std::vector<LLRect> selection_rects = getSelctionRects();
std::vector<LLRect> selection_rects = getSelectionRects();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
const LLColor4& color = mReadOnly ? mReadOnlyFgColor : mFgColor;

View File

@ -2061,8 +2061,16 @@ bool idle_startup()
}
else if (regionp->capabilitiesError())
{
// Try to connect despite capabilities' error state
LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
LL_WARNS("AppInit") << "Failed to get capabilities. Backing up to login screen!" << LL_ENDL;
if (gRememberPassword)
{
LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
}
else
{
LLNotificationsUtil::add("LoginPacketNeverReceivedNoTP", LLSD(), LLSD(), login_alert_status);
}
reset_login();
}
else
{
@ -2649,6 +2657,7 @@ bool idle_startup()
LLNotificationsUtil::add("InventoryUnusable");
}
LLInventoryModelBackgroundFetch::instance().start();
gInventory.createCommonSystemCategories();
// It's debatable whether this flag is a good idea - sets all

File diff suppressed because it is too large Load Diff

View File

@ -59,11 +59,12 @@ class LLTranslate: public LLSingleton<LLTranslate>
public :
typedef enum e_service {
SERVICE_BING,
SERVICE_AZURE,
SERVICE_GOOGLE,
SERVICE_DEEPL,
} EService;
typedef boost::function<void(EService, bool)> KeyVerificationResult_fn;
typedef boost::function<void(EService, bool, S32)> KeyVerificationResult_fn;
typedef boost::function<void(std::string , std::string )> TranslationSuccess_fn;
typedef boost::function<void(int, std::string)> TranslationFailure_fn;
@ -78,12 +79,12 @@ public :
static void translateMessage(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, TranslationSuccess_fn success, TranslationFailure_fn failure);
/**
* Verify given API key of a translation service.
*
* @param receiver Object to pass verification result to.
* @param key Key to verify.
*/
static void verifyKey(EService service, const std::string &key, KeyVerificationResult_fn fnc);
* Verify given API key of a translation service.
*
* @param receiver Object to pass verification result to.
* @param key Key to verify.
*/
static void verifyKey(EService service, const LLSD &key, KeyVerificationResult_fn fnc);
/**
* @return translation target language

View File

@ -1690,7 +1690,8 @@ bool LLViewerInput::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)
BOOL LLViewerInput::handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down)
{
BOOL handled = gViewerWindow->handleAnyMouseClick(window_impl, pos, mask, clicktype, down);
bool is_toolmgr_action = false;
BOOL handled = gViewerWindow->handleAnyMouseClick(window_impl, pos, mask, clicktype, down, is_toolmgr_action);
if (clicktype != CLICK_NONE)
{
@ -1709,7 +1710,7 @@ BOOL LLViewerInput::handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask,
// If the first LMB click is handled by the menu, skip the following double click
static bool skip_double_click = false;
if (clicktype == CLICK_LEFT && down )
if (clicktype == CLICK_LEFT && down && !is_toolmgr_action)
{
skip_double_click = handled;
}

View File

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

View File

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

View File

@ -228,6 +228,8 @@ void LLViewerTextureList::doPrefetchImages()
LLViewerTextureManager::getFetchedTexture(IMG_SHOT);
LLViewerTextureManager::getFetchedTexture(IMG_SMOKE_POOF);
LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
LLViewerFetchedTexture::sSmokeImagep->setNoDelete();
LLStandardBumpmap::addstandard();

View File

@ -1099,7 +1099,7 @@ void LLViewerWindow::handlePieMenu(S32 x, S32 y, MASK mask)
}
}
BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down)
BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down, bool& is_toolmgr_action)
{
const char* buttonname = "";
const char* buttonstatestr = "";
@ -1248,6 +1248,7 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK m
if(!gDisconnected && LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )
{
LLViewerEventRecorder::instance().clear_xui();
is_toolmgr_action = true;
return TRUE;
}

View File

@ -182,7 +182,7 @@ public:
void reshapeStatusBarContainer();
BOOL handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);
BOOL handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down, bool &is_toolmgr_action);
//
// LLWindowCallback interface implementation

View File

@ -276,13 +276,13 @@ static void killGateway()
///////////////////////////////////////////////////////////////////////////////////////////////
bool LLVivoxVoiceClient::sShuttingDown = false;
bool LLVivoxVoiceClient::sConnected = false;
LLPumpIO *LLVivoxVoiceClient::sPump = nullptr;
LLVivoxVoiceClient::LLVivoxVoiceClient() :
mSessionTerminateRequested(false),
mRelogRequested(false),
mConnected(false),
mTerminateDaemon(false),
mPump(NULL),
mSpatialJoiningNum(0),
mTuningMode(false),
@ -351,7 +351,11 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mIsProcessingChannels(false),
mIsCoroutineActive(false),
mVivoxPump("vivoxClientPump")
{
{
sShuttingDown = false;
sConnected = false;
sPump = nullptr;
mSpeakerVolume = scale_speaker_volume(0);
mVoiceVersion.serverVersion = "";
@ -393,7 +397,7 @@ LLVivoxVoiceClient::~LLVivoxVoiceClient()
void LLVivoxVoiceClient::init(LLPumpIO *pump)
{
// constructor will set up LLVoiceClient::getInstance()
mPump = pump;
sPump = pump;
// LLCoros::instance().launch("LLVivoxVoiceClient::voiceControlCoro",
// boost::bind(&LLVivoxVoiceClient::voiceControlCoro, LLVivoxVoiceClient::getInstance()));
@ -414,10 +418,10 @@ void LLVivoxVoiceClient::terminate()
logoutOfVivox(false);
}
if(mConnected)
if(sConnected)
{
breakVoiceConnection(false);
mConnected = false;
sConnected = false;
}
else
{
@ -426,7 +430,7 @@ void LLVivoxVoiceClient::terminate()
}
sShuttingDown = true;
mPump = NULL;
sPump = NULL;
// <FS:Ansariel> Delete useless Vivox logs on logout
if (gSavedSettings.getString("VivoxDebugLevel") == "0")
@ -482,7 +486,7 @@ bool LLVivoxVoiceClient::writeString(const std::string &str)
bool result = false;
LL_DEBUGS("LowVoice") << "sending:\n" << str << LL_ENDL;
if(mConnected)
if(sConnected)
{
apr_status_t err;
apr_size_t size = (apr_size_t)str.size();
@ -1167,7 +1171,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
int retryCount(0);
LLVoiceVivoxStats::getInstance()->reset();
while (!mConnected && !sShuttingDown && retryCount++ <= DAEMON_CONNECT_RETRY_MAX)
while (!sConnected && !sShuttingDown && retryCount++ <= DAEMON_CONNECT_RETRY_MAX)
{
LLVoiceVivoxStats::getInstance()->connectionAttemptStart();
LL_DEBUGS("Voice") << "Attempting to connect to vivox daemon: " << mDaemonHost << LL_ENDL;
@ -1177,23 +1181,23 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
}
mConnected = mSocket->blockingConnect(mDaemonHost);
LLVoiceVivoxStats::getInstance()->connectionAttemptEnd(mConnected);
if (!mConnected)
sConnected = mSocket->blockingConnect(mDaemonHost);
LLVoiceVivoxStats::getInstance()->connectionAttemptEnd(sConnected);
if (!sConnected)
{
llcoro::suspendUntilTimeout(DAEMON_CONNECT_THROTTLE_SECONDS);
}
}
//---------------------------------------------------------------------
if (sShuttingDown && !mConnected)
if (sShuttingDown && !sConnected)
{
return false;
}
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
while (!mPump && !sShuttingDown)
while (!sPump && !sShuttingDown)
{ // Can't use the pump until we have it available.
llcoro::suspend();
}
@ -1215,7 +1219,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
readChain.push_back(LLIOPipe::ptr_t(new LLVivoxProtocolParser()));
mPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS);
sPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS);
//---------------------------------------------------------------------
@ -1437,9 +1441,9 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
// the message, yet we need to receive "connector shutdown response".
// Either wait a bit and emulate it or check gMessageSystem for specific message
_sleep(1000);
if (mConnected)
if (sConnected)
{
mConnected = false;
sConnected = false;
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
mVivoxPump.post(vivoxevent);
}
@ -1451,7 +1455,7 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
LL_DEBUGS("Voice") << "closing SLVoice socket" << LL_ENDL;
closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
cleanUp();
mConnected = false;
sConnected = false;
return retval;
}
@ -2637,7 +2641,7 @@ bool LLVivoxVoiceClient::performMicTuning()
void LLVivoxVoiceClient::closeSocket(void)
{
mSocket.reset();
mConnected = false;
sConnected = false;
mConnectorEstablished = false;
mAccountLoggedIn = false;
}
@ -3144,7 +3148,7 @@ bool LLVivoxVoiceClient::deviceSettingsAvailable()
{
bool result = true;
if(!mConnected)
if(!sConnected)
result = false;
if(mRenderDevices.empty())
@ -3973,7 +3977,7 @@ void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &
// Should this ever fail? do we care if it does?
}
mConnected = false;
sConnected = false;
mShutdownComplete = true;
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
@ -7568,7 +7572,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
LL_DEBUGS("VivoxProtocolParser") << "at end, mInput is: " << mInput << LL_ENDL;
if(!LLVivoxVoiceClient::getInstance()->mConnected)
if(!LLVivoxVoiceClient::sConnected)
{
// If voice has been disabled, we just want to close the socket. This does so.
LL_INFOS("Voice") << "returning STATUS_STOP" << LL_ENDL;

View File

@ -676,12 +676,10 @@ private:
LLHost mDaemonHost;
LLSocket::ptr_t mSocket;
bool mConnected;
// We should kill the voice daemon in case of connection alert
bool mTerminateDaemon;
LLPumpIO *mPump;
friend class LLVivoxProtocolParser;
std::string mAccountName;
@ -930,7 +928,10 @@ private:
bool mIsProcessingChannels;
bool mIsCoroutineActive;
static bool sShuttingDown; // corutines can last longer than vivox so we need a static variable as a shutdown flag
// This variables can last longer than vivox in coroutines so we need them as static
static bool sShuttingDown;
static bool sConnected;
static LLPumpIO* sPump;
LLEventMailDrop mVivoxPump;
};

View File

@ -5602,13 +5602,14 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
if (mat)
{
BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) || (facep->getTextureEntry()->getColor().mV[3] < 0.999f) ? TRUE : FALSE;
if (type == LLRenderPass::PASS_ALPHA)
{
shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND);
shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND, is_alpha);
}
else
{
shader_mask = mat->getShaderMask();
shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_DEFAULT, is_alpha);
}
}
@ -6146,18 +6147,23 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{
// <FS:ND> Even more crash avoidance ...
// if (te->getColor().mV[3] > 0.f || te->getGlow() > 0.f)
if (te && (te->getColor().mV[3] > 0.f || te->getGlow() > 0.f))
// </FS:ND>
{ //only treat as alpha in the pipeline if < 100% transparent
drawablep->setState(LLDrawable::HAS_ALPHA);
add_face(sAlphaFaces, alpha_count, facep);
}
else if (LLDrawPoolAlpha::sShowDebugAlpha)
{
add_face(sAlphaFaces, alpha_count, facep);
}
// <FS:ND> Even more crash avoidance ...
//if (te->getColor().mV[3] > 0.f || te->getGlow() > 0.f)
if (te && (te->getColor().mV[3] > 0.f || te->getGlow() > 0.f))
// </FS:ND>
{ //only treat as alpha in the pipeline if < 100% transparent
drawablep->setState(LLDrawable::HAS_ALPHA);
add_face(sAlphaFaces, alpha_count, facep);
}
else if (LLDrawPoolAlpha::sShowDebugAlpha ||
(gPipeline.sRenderHighlight && !drawablep->getParent() &&
//only root objects are highlighted with red color in this case
drawablep->getVObj() && drawablep->getVObj()->flagScripted() &&
(LLPipeline::getRenderScriptedBeacons() ||
(LLPipeline::getRenderScriptedTouchBeacons() && drawablep->getVObj()->flagHandleTouch()))))
{ //draw the transparent face for debugging purposes using a custom texture
add_face(sAlphaFaces, alpha_count, facep);
}
}
}
else
@ -6920,7 +6926,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
{ // HACK - this should never happen, but sometimes we get a material that thinks it has alpha blending when it ought not
alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
}
U32 mask = mat->getShaderMask(alpha_mode);
U32 mask = mat->getShaderMask(alpha_mode, is_alpha);
U32 vb_mask = facep->getVertexBuffer()->getTypeMask();

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -608,7 +608,14 @@ with the same filename but different name
<texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
<texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
<texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
<texture name="Profile_Badge_Beta" file_name="icons/profile_badge_beta.png" preload="true"/>
<texture name="Profile_Badge_Beta_Lifetime" file_name="icons/profile_badge_beta_lifetime.png" preload="true"/>
<texture name="Profile_Badge_Lifetime" file_name="icons/profile_badge_lifetime.png" preload="true"/>
<texture name="Profile_Badge_Linden" file_name="icons/profile_badge_linden.png" preload="true"/>
<texture name="Profile_Badge_Pplus_Lifetime" file_name="icons/profile_badge_pplus_lifetime.png" preload="true"/>
<texture name="Profile_Badge_Premium_Lifetime" file_name="icons/profile_badge_premium_lifetime.png" preload="true"/>
<texture name="Profile_Badge_Team" file_name="icons/profile_badge_team.png" preload="true"/>
<texture name="Profile_Group_Visibility_Off" file_name="icons/profile_group_visibility_eye_off.png" preload="true"/>
<texture name="Profile_Group_Visibility_Off_Pressed" file_name="icons/profile_group_visibility_eye_off_pressed.png" preload="true"/>
<texture name="Profile_Group_Visibility_On" file_name="icons/profile_group_visibility_eye_on.png" preload="true"/>

View File

@ -2598,6 +2598,9 @@ Möchten Sie den Nicht-stören-Modus deaktivieren, bevor Sie diese Transaktion a
Ihr Papierkorb läuft über. Dies kann zu Anmeldeproblemen führen.
<usetemplate name="okcancelbuttons" notext="Papierkorb später leeren" yestext="Papierkorb ansehen"/>
</notification>
<notification name="InventoryLimitReachedAIS">
Es gibt Probleme mit Ihrem Inventar. Bitte kontaktieren Sie den Support Ihres Grids.
</notification>
<notification name="ConfirmClearBrowserCache">
Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>

View File

@ -9,6 +9,20 @@
<string name="status_unknown">
Unbekannt
</string>
<string name="BadgeBeta"
value="Original Beta-Tester" />
<string name="BadgeBetaLifetime"
value="Beta Lebenszeit-Mitglied" />
<string name="BadgeLifetime"
value="Lebenszeit-Mitglied" />
<string name="BadgeLinden"
value="Linden Lab-Mitarbeiter" />
<string name="BadgePremiumLifetime"
value="Premium Lebenszeit" />
<string name="BadgePremiumPlusLifetime"
value="Premium Plus Lebenszeit" />
<string name="BadgeTeam"
value="[APP_NAME]-Mitglied" />
<string name="payment_update_link_url">
http://www.secondlife.com/account/billing.php?lang=de
</string>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
height="310"
height="470"
layout="topleft"
name="floater_translation_settings"
help_topic="translation_settings"
@ -9,11 +9,13 @@
title="Chat Translation Settings"
width="485">
<string name="bing_api_key_not_verified">Bing appID not verified. Please try again.</string>
<string name="google_api_key_not_verified">Google API key not verified. Please try again.</string>
<string name="azure_api_key_not_verified">Azure service identifier not verified. Status: [STATUS]. Please check your settings and try again.</string>
<string name="google_api_key_not_verified">Google API key not verified. Status: [STATUS]. Please check your key and try again.</string>
<string name="deepl_api_key_not_verified">DeepL Auth Key key not verified. Status: [STATUS]. Please check your key and try again.</string>
<string name="bing_api_key_verified">Bing appID verified.</string>
<string name="azure_api_key_verified">Azure service identifier verified.</string>
<string name="google_api_key_verified">Google API key verified.</string>
<string name="deepl_api_key_verified">DeepL API key verified.</string>
<check_box
height="16"
@ -128,25 +130,86 @@
<radio_group
follows="top|left"
height="80"
height="260"
layout="topleft"
left_delta="10"
name="translation_service_rg"
top_pad="20"
width="320">
<radio_item
initial_value="bing"
label="Bing Translator"
initial_value="azure"
label="Azure Translator"
layout="topleft"
name="bing" />
name="azure" />
<radio_item
initial_value="google"
label="Google Translate"
layout="topleft"
name="google"
top_pad="55" />
top_pad="115" />
<radio_item
initial_value="deepl"
label="DeepL Translator"
layout="topleft"
name="deepl"
top_pad="61" />
</radio_group>
<text
follows="top|right"
height="20"
layout="topleft"
left="185"
length="1"
name="google_links_text"
top_pad="-262"
type="string"
width="100">
[https://learn.microsoft.com/en-us/azure/cognitive-services/translator/create-translator-resource Setup]
</text>
<text
type="string"
length="1"
follows="top|right"
height="20"
layout="topleft"
left="70"
name="azure_api_endoint_label"
top_pad="8"
width="85">
Endpoint:
</text>
<combo_box
allow_text_entry="true"
follows="left|top"
name="azure_api_endpoint_combo"
height="23"
left_pad="10"
right="-10"
top_delta="-4"
max_chars="512"
value="https://api.cognitive.microsofttranslator.com"
combo_button.scale_image="true">
<combo_box.item
label="https://api.cognitive.microsofttranslator.com"
name="global"
value="https://api.cognitive.microsofttranslator.com" />
<combo_box.item
label="https://api-apc.cognitive.microsofttranslator.com"
name="api-apc"
value="https://api-apc.cognitive.microsofttranslator.com" />
<combo_box.item
label="https://api-eur.cognitive.microsofttranslator.com"
name="api-eur"
value="https://api-eur.cognitive.microsofttranslator.com" />
<combo_box.item
label="https://api-nam.cognitive.microsofttranslator.com"
name="api-nam"
value="https://api-nam.cognitive.microsofttranslator.com" />
</combo_box>
<text
type="string"
length="1"
@ -154,30 +217,52 @@
height="20"
layout="topleft"
left="70"
name="bing_api_key_label"
top_pad="-55"
name="azure_api_key_label"
top_pad="10"
width="85">
Bing [http://www.bing.com/developers/createapp.aspx AppID]:
Azure Key:
</text>
<line_editor
default_text="Enter Bing AppID and click &quot;Verify&quot;"
default_text="Enter Translator Key and click &quot;Verify&quot;"
follows="top|left"
height="20"
layout="topleft"
left_pad="10"
max_length_chars="50"
top_delta="-4"
name="bing_api_key"
name="azure_api_key"
width="210" />
<button
follows="left|top"
height="23"
label="Verify"
layout="topleft"
left_pad="10"
name="verify_bing_api_key_btn"
top_delta="-2"
width="90" />
<text
type="string"
length="1"
follows="top|right"
height="20"
layout="topleft"
left="70"
name="azure_api_region_label"
top_pad="11"
width="85">
Region:
</text>
<line_editor
default_text="Can be left empty for global services"
follows="top|left"
height="20"
layout="topleft"
left_pad="10"
max_length_chars="50"
top_delta="-4"
name="azure_api_region"
width="210" />
<button
follows="left|top"
height="23"
label="Verify"
layout="topleft"
left_pad="10"
name="verify_azure_api_key_btn"
top_delta="-2"
width="90" />
<text
follows="top|right"
@ -186,7 +271,7 @@
left="70"
length="1"
name="google_api_key_label"
top_pad="50"
top_pad="53"
type="string"
width="85">
Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
@ -209,7 +294,7 @@
left_pad="10"
name="verify_google_api_key_btn"
top_delta="-2"
width="90" />
width="90" />
<text
follows="top|right"
@ -224,6 +309,87 @@
[http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Stats]
</text>
<text
type="string"
length="1"
follows="top|right"
height="20"
layout="topleft"
left="70"
name="deepl_api_domain_label"
top_pad="80"
width="85">
Endpoint:
</text>
<combo_box
allow_text_entry="false"
follows="left|top"
name="deepl_api_domain_combo"
height="23"
left_pad="10"
width="140"
top_delta="-4"
max_chars="512"
value="https://api-free.deepl.com"
combo_button.scale_image="true">
<combo_box.item
label="DeepL Free"
name="global"
value="https://api-free.deepl.com" />
<combo_box.item
label="DeepL Pro"
name="api-apc"
value="https://api.deepl.com" />
</combo_box>
<text
follows="top|right"
height="20"
layout="topleft"
left="70"
length="1"
name="deepl_api_key_label"
top_pad="11"
type="string"
width="85">
DeepL API key:
</text>
<line_editor
default_text="Enter DeepL API key and click &quot;Verify&quot;"
follows="top|left"
height="20"
layout="topleft"
left_pad="10"
max_length_chars="50"
top_delta="-4"
name="deepl_api_key"
width="210" />
<button
follows="left|top"
height="23"
label="Verify"
layout="topleft"
left_pad="10"
name="verify_deepl_api_key_btn"
top_delta="-2"
width="90" />
<text
follows="top|right"
height="20"
layout="topleft"
left="185"
length="1"
name="deepl_links_text"
top_delta="-53"
type="string"
width="100">
[https://www.deepl.com/pro/select-country?cta=header-prices Pricing]
</text>
<button
follows="left|top"
height="23"

View File

@ -6676,6 +6676,14 @@ Your trash is overflowing. This may cause problems logging in.
yestext="Check trash folder"/>
</notification>
<notification
icon="notifytip.tga"
name="InventoryLimitReachedAIS"
type="notifytip">
Your inventory is experiencing issues. Please contact support of your grid.
<tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmClearBrowserCache"

View File

@ -31,6 +31,29 @@
[PAYMENTINFO]
[FIRESTORM][FSDEV][FSSUPP][FSQA][FSGW]
</string>
<!--Badges-->
<string
name="BadgeBeta"
value="Original Beta Tester" />
<string
name="BadgeBetaLifetime"
value="Beta Lifetime member" />
<string
name="BadgeLifetime"
value="Lifetime member" />
<string
name="BadgeLinden"
value="Linden Lab employee" />
<string
name="BadgePremiumLifetime"
value="Premium lifetime" />
<string
name="BadgePremiumPlusLifetime"
value="Premium Plus lifetime" />
<string
name="BadgeTeam"
value="[APP_NAME] member" />
<string
name="payment_update_link_url"
>
@ -432,22 +455,59 @@
layout="topleft"
follows="left|top|right"
bevel_style="in"/>
<text_editor
name="account_info"
<layout_stack
name="badgepositioner"
animate="false"
top_delta="0"
left_delta="0"
right="-4"
right="-3"
height="44"
follows="top|left|right"
layout="topleft"
allow_scroll="false"
bg_visible="false"
border_visible="false"
h_pad="3"
read_only="true"
translate="false"
v_pad="2"
word_wrap="true"/>
orientation="horizontal">
<layout_panel
name="badge_layout"
follows="all"
layout="topleft"
width="22"
visible="false"
auto_resize="false"
user_resize="false">
<icon
name="badge_icon"
image_name="Profile_Badge_Linden"
tool_tip="Linden Lab Employee"
layout="topleft"
follows="left|top"
top="4"
left="4"
height="18"
width="18"/>
</layout_panel>
<layout_panel
name="accountinfo_layout"
follows="all"
layout="topleft"
auto_resize="true"
user_resize="false">
<text_editor
name="account_info"
top="0"
left="0"
right="-1"
height="44"
follows="top|left|right"
layout="topleft"
allow_scroll="false"
bg_visible="false"
border_visible="false"
h_pad="3"
read_only="true"
translate="false"
v_pad="2"
word_wrap="true"/>
</layout_panel>
</layout_stack>
<text
name="partner_label"
value="Partner:"

View File

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floater_translation_settings" title="Ustawienia tłumaczenia czatu">
<string name="bing_api_key_not_verified">Nie można zweryfikować Bing appID. Spróbuj ponownie.</string>
<string name="azure_api_key_not_verified">Nie można zweryfikować ID usługi Azure. Spróbuj ponownie.</string>
<string name="google_api_key_not_verified">Nie można zweryfikować klucza Google API. Spróbuj ponownie.</string>
<string name="bing_api_key_verified">Bing appID zweryfikowany.</string>
<string name="deepl_api_key_not_verified">Nie można zweryfikować klucza DeepL. Status: [STATUS]. Spróbuj ponownie.</string>
<string name="azure_api_key_verified">ID usługi Azure zweryfikowany.</string>
<string name="google_api_key_verified">Klucz Google API zweryfikowany.</string>
<string name="deepl_api_key_verified">Klucz DeepL zweryfikowany.</string>
<check_box label="Włącz maszynowe tłumaczenie czatu" name="translate_chat_checkbox" />
<text name="translate_language_label">
Tłumacz czat na:
@ -30,13 +32,28 @@
<text name="tip">
Usługa tłumacząca:
</text>
<line_editor default_text="Wpisz Bing AppID i kliknij na &quot;Weryfikuj&quot;" name="bing_api_key" />
<button label="Weryfikuj" name="verify_bing_api_key_btn" />
<text name="google_links_text">
[https://learn.microsoft.com/en-us/azure/cognitive-services/translator/create-translator-resource Wskazówki]
</text>
<text name="azure_api_key_label">
Klucz Azure:
</text>
<line_editor default_text="Wpisz klucz Azure i kliknij na &quot;Weryfikuj&quot;" name="azure_api_key" />
<line_editor default_text="Może być pusty dla usług globalnych" name="azure_api_region" />
<button label="Weryfikuj" name="verify_azure_api_key_btn" />
<line_editor default_text="Wpisz klucz Google API i kliknij na &quot;Weryfikuj&quot;" name="google_api_key" />
<button label="Weryfikuj" name="verify_google_api_key_btn" />
<text name="google_links_text">
[http://code.google.com/apis/language/translate/v2/pricing.html Koszty] | [https://code.google.com/apis/console Statystyki]
</text>
<text name="deepl_api_key_label">
Klucz DeepL:
</text>
<line_editor default_text="Wpisz klucz DeepL i kliknij na &quot;Weryfikuj&quot;" name="deepl_api_key" />
<button label="Weryfikuj" name="verify_deepl_api_key_btn" />
<text name="deepl_links_text">
[https://www.deepl.com/pro/select-country?cta=header-prices Koszty]
</text>
<button label="Gotowe" name="ok_btn" />
<button label="Anuluj" name="cancel_btn" />
</floater>

View File

@ -2465,6 +2465,9 @@ Czy chcesz je odtworzyć?
Twój kosz się przepełnia. Może to sprawić, że będziesz mieć problemy z zalogowaniem się.
<usetemplate name="okcancelbuttons" notext="Wyczyszczę kosz ręcznie później" yestext="Sprawdź kosz teraz" />
</notification>
<notification name="InventoryLimitReachedAIS">
W Twojej Szafie występują problemy. Skontaktuj się z pomocą techniczną swojego świata.
</notification>
<notification name="ConfirmClearBrowserCache">
Na pewno chcesz wyczyścić bufory przeglądarki internetowej, wyszukiwania i podróży?
<usetemplate name="okcancelbuttons" notext="Anuluj" />

View File

@ -3,6 +3,13 @@
<string name="status_unknown">
Nieznane
</string>
<string name="BadgeBeta" value="Oryginalny beta tester" />
<string name="BadgeBetaLifetime" value="Dożywotni uczestnik Beta" />
<string name="BadgeLifetime" value="Dożywotni uczestnik" />
<string name="BadgeLinden" value="Pracownik Linden Lab" />
<string name="BadgePremiumLifetime" value="Dożywotni uczestnik Premium" />
<string name="BadgePremiumPlusLifetime" value="Dożywotni uczestnik Premium Plus" />
<string name="BadgeTeam" value="Zespół [APP_NAME]" />
<string name="no_partner_text" value="Brak" />
<string name="no_group_text" value="Brak" />
<string name="FSDev" value=" Programista" />
@ -31,6 +38,11 @@
<text name="label" value="Urodziny:" />
<text_editor name="user_age" value="(ładowanie...)" />
<text name="label2" value="Konto:" />
<layout_stack name="badgepositioner">
<layout_panel name="badge_layout">
<icon name="badge_icon" tool_tip="Pracownik Linden Lab" />
</layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>
<text name="About:" value="Info:" />

View File

@ -7,7 +7,7 @@
<accordion name="wearable_accordion">
<accordion_tab name="hair_color_tab" title="Cor"/>
<accordion_tab name="hair_style_tab" title="Estilo"/>
<accordion_tab name="hair_eyebrows_tab" title="Sombrancelhas"/>
<accordion_tab name="hair_eyebrows_tab" title="Sobrancelhas"/>
<accordion_tab name="hair_facial_tab" title="Faciais"/>
</accordion>
</panel>

View File

@ -26,6 +26,30 @@
[PAYMENTINFO]
[FIRESTORM][FSDEV][FSSUPP][FSQA][FSGW]
</string>
<!--Badges-->
<string
name="BadgeBeta"
value="Original Beta Tester" />
<string
name="BadgeBetaLifetime"
value="Beta Lifetime member" />
<string
name="BadgeLifetime"
value="Lifetime member" />
<string
name="BadgeLinden"
value="Linden Lab employee" />
<string
name="BadgePremiumLifetime"
value="Premium lifetime" />
<string
name="BadgePremiumPlusLifetime"
value="Premium Plus lifetime" />
<string
name="BadgeTeam"
value="[APP_NAME] member" />
<string
name="payment_update_link_url">
http://www.secondlife.com/account/billing.php?lang=en
@ -401,9 +425,33 @@
name="info_border_acc_status_text"
bevel_style="in" />
<panel
name="badge_layout"
follows="top|right"
layout="topleft"
width="24"
height="20"
top_delta="0"
right="-1"
visible="false">
<icon
name="badge_icon"
image_name=""
tool_tip=""
layout="topleft"
follows="left|top"
top="2"
left="0"
height="18"
width="18"/>
</panel>
<text_editor
name="account_info"
top_delta="0"
left="0"
right="-4"
height="50"
follows="top|left|right"
@ -414,6 +462,7 @@
h_pad="3"
read_only="true"
translate="false"
mouse_opaque="false"
v_pad="2"
word_wrap="true" />

View File

@ -3,6 +3,13 @@
<string name="status_unknown">
Nieznane
</string>
<string name="BadgeBeta" value="Oryginalny beta tester" />
<string name="BadgeBetaLifetime" value="Dożywotni uczestnik Beta" />
<string name="BadgeLifetime" value="Dożywotni uczestnik" />
<string name="BadgeLinden" value="Pracownik Linden Lab" />
<string name="BadgePremiumLifetime" value="Dożywotni uczestnik Premium" />
<string name="BadgePremiumPlusLifetime" value="Dożywotni uczestnik Premium Plus" />
<string name="BadgeTeam" value="Zespół [APP_NAME]" />
<string name="no_partner_text" value="Brak" />
<string name="no_group_text" value="Brak" />
<string name="age_format">