Merge viewer-neko
commit
c764079389
|
|
@ -116,14 +116,14 @@ void LLThread::registerThreadID()
|
|||
//
|
||||
// Handed to the APR thread creation function
|
||||
//
|
||||
void LLThread::threadRun()
|
||||
void LLThread::threadRun()
|
||||
{
|
||||
#ifdef LL_WINDOWS
|
||||
set_thread_name(-1, mName.c_str());
|
||||
set_thread_name(-1, mName.c_str());
|
||||
#endif
|
||||
|
||||
// for now, hard code all LLThreads to report to single master thread recorder, which is known to be running on main thread
|
||||
mRecorder = new LLTrace::ThreadRecorder( *LLTrace::get_master_thread_recorder() );
|
||||
mRecorder = new LLTrace::ThreadRecorder(*LLTrace::get_master_thread_recorder());
|
||||
|
||||
sThreadID = mID;
|
||||
|
||||
|
|
@ -152,15 +152,13 @@ void LLThread::threadRun()
|
|||
|
||||
|
||||
delete mRecorder;
|
||||
mRecorder = nullptr;
|
||||
mRecorder = NULL;
|
||||
|
||||
// We're done with the run function, this thread is done executing now.
|
||||
//NB: we are using this flag to sync across threads...we really need memory barriers here
|
||||
// Todo: add LLMutex per thread instead of flag?
|
||||
// We are using "while (mStatus != STOPPED) {ms_sleep();}" everywhere.
|
||||
mStatus = STOPPED;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
|
||||
|
|
@ -172,7 +170,6 @@ LLThread::LLThread(const std::string& name, apr_pool_t *poolp) :
|
|||
{
|
||||
|
||||
mID = ++sIDIter;
|
||||
|
||||
mRunCondition = new LLCondition();
|
||||
mDataLock = new LLMutex();
|
||||
mLocalAPRFilePoolp = NULL ;
|
||||
|
|
@ -235,10 +232,13 @@ void LLThread::shutdown()
|
|||
{
|
||||
// This thread just wouldn't stop, even though we gave it time
|
||||
//LL_WARNS() << "LLThread::~LLThread() exiting thread before clean exit!" << LL_ENDL;
|
||||
// Put a stake in its heart.
|
||||
// ND: There is no such thing as to terminate a std::thread, we detach it so no wait will happen.
|
||||
// Otherwise craft something platform specific with std::thread::native_handle
|
||||
mThreadp->detach();
|
||||
// Put a stake in its heart. (A very hostile method to force a thread to quit)
|
||||
#if LL_WINDOWS
|
||||
TerminateThread(mNativeHandle, 0);
|
||||
#else
|
||||
pthread_cancel(mNativeHandle);
|
||||
#endif
|
||||
|
||||
delete mRecorder;
|
||||
mRecorder = NULL;
|
||||
mStatus = STOPPED;
|
||||
|
|
@ -252,7 +252,7 @@ void LLThread::shutdown()
|
|||
|
||||
delete mDataLock;
|
||||
mDataLock = NULL;
|
||||
|
||||
|
||||
if (mRecorder)
|
||||
{
|
||||
// missed chance to properly shut down recorder (needs to be done in thread context)
|
||||
|
|
@ -272,14 +272,15 @@ void LLThread::start()
|
|||
|
||||
try
|
||||
{
|
||||
mThreadp = new std::thread( std::bind( &LLThread::threadRun, this ) );
|
||||
//mThreadp->detach();
|
||||
mThreadp = new std::thread(std::bind(&LLThread::threadRun, this));
|
||||
mNativeHandle = mThreadp->native_handle();
|
||||
}
|
||||
catch( std::system_error& ex )
|
||||
catch (std::system_error& ex)
|
||||
{
|
||||
mStatus = STOPPED;
|
||||
LL_WARNS() << "failed to start thread " << mName << " " << ex.what() << LL_ENDL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
|
@ -354,7 +355,7 @@ U32 LLThread::currentID()
|
|||
// static
|
||||
void LLThread::yield()
|
||||
{
|
||||
std::this_thread::yield();
|
||||
std::this_thread::yield();
|
||||
}
|
||||
|
||||
void LLThread::wake()
|
||||
|
|
@ -395,7 +396,7 @@ void LLThreadSafeRefCount::initThreadSafeRefCount()
|
|||
void LLThreadSafeRefCount::cleanupThreadSafeRefCount()
|
||||
{
|
||||
delete sMutex;
|
||||
sMutex = nullptr;
|
||||
sMutex = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -29,11 +29,9 @@
|
|||
|
||||
#include "llapp.h"
|
||||
#include "llapr.h"
|
||||
#include "apr_thread_cond.h"
|
||||
#include "boost/intrusive_ptr.hpp"
|
||||
#include "llmutex.h"
|
||||
#include "llrefcount.h"
|
||||
|
||||
#include <thread>
|
||||
|
||||
LL_COMMON_API void assert_main_thread();
|
||||
|
|
@ -99,15 +97,17 @@ public:
|
|||
|
||||
private:
|
||||
bool mPaused;
|
||||
std::thread::native_handle_type mNativeHandle; // for termination in case of issues
|
||||
|
||||
void threadRun( );
|
||||
// static function passed to APR thread creation routine
|
||||
void threadRun();
|
||||
|
||||
protected:
|
||||
std::string mName;
|
||||
class LLCondition* mRunCondition;
|
||||
LLMutex* mDataLock;
|
||||
|
||||
std::thread *mThreadp;
|
||||
std::thread *mThreadp;
|
||||
EThreadStatus mStatus;
|
||||
U32 mID;
|
||||
LLTrace::ThreadRecorder* mRecorder;
|
||||
|
|
|
|||
|
|
@ -26,3 +26,4 @@
|
|||
//#include "linden_common.h"
|
||||
//#include "llthreadsafequeue.h"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -28,10 +28,20 @@
|
|||
#define LL_LLTHREADSAFEQUEUE_H
|
||||
|
||||
#include "llexception.h"
|
||||
#include "llmutex.h"
|
||||
#include "lltimer.h"
|
||||
#include <string>
|
||||
#include <deque>
|
||||
#include <string>
|
||||
|
||||
#if LL_WINDOWS
|
||||
#pragma warning (push)
|
||||
#pragma warning (disable:4265)
|
||||
#endif
|
||||
// 'std::_Pad' : class has virtual functions, but destructor is not virtual
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
#if LL_WINDOWS
|
||||
#pragma warning (pop)
|
||||
#endif
|
||||
|
||||
//
|
||||
// A general queue exception.
|
||||
|
|
@ -62,8 +72,6 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Implements a thread safe FIFO.
|
||||
//
|
||||
|
|
@ -104,99 +112,102 @@ public:
|
|||
|
||||
private:
|
||||
std::deque< ElementT > mStorage;
|
||||
LLCondition mLock;;
|
||||
U32 mCapacity; // Really needed?
|
||||
U32 mCapacity;
|
||||
|
||||
std::mutex mLock;
|
||||
std::condition_variable mCapacityCond;
|
||||
std::condition_variable mEmptyCond;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// LLThreadSafeQueue
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
template<typename ElementT>
|
||||
LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(U32 capacity):
|
||||
mCapacity(capacity)
|
||||
LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(U32 capacity) :
|
||||
mCapacity(capacity)
|
||||
{
|
||||
; // No op.
|
||||
}
|
||||
|
||||
|
||||
template<typename ElementT>
|
||||
void LLThreadSafeQueue<ElementT>::pushFront(ElementT const & element)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
{
|
||||
LLMutexLock lck(&mLock);
|
||||
if (mStorage.size() < mCapacity)
|
||||
{
|
||||
mStorage.push_front(element);
|
||||
mLock.signal();
|
||||
return;
|
||||
}
|
||||
}
|
||||
ms_sleep(100);
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
std::unique_lock<std::mutex> lock1(mLock);
|
||||
|
||||
if (mStorage.size() < mCapacity)
|
||||
{
|
||||
mStorage.push_front(element);
|
||||
mEmptyCond.notify_one();
|
||||
return;
|
||||
}
|
||||
|
||||
// Storage Full. Wait for signal.
|
||||
mCapacityCond.wait(lock1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<typename ElementT>
|
||||
bool LLThreadSafeQueue<ElementT>::tryPushFront(ElementT const & element)
|
||||
{
|
||||
LLMutexTrylock lck(&mLock);
|
||||
if (!lck.isLocked())
|
||||
return false;
|
||||
std::unique_lock<std::mutex> lock1(mLock, std::defer_lock);
|
||||
if (!lock1.try_lock())
|
||||
return false;
|
||||
|
||||
if (mStorage.size() >= mCapacity)
|
||||
return false;
|
||||
if (mStorage.size() >= mCapacity)
|
||||
return false;
|
||||
|
||||
mStorage.push_front(element);
|
||||
mLock.signal();
|
||||
return true;
|
||||
mStorage.push_front(element);
|
||||
mEmptyCond.notify_one();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template<typename ElementT>
|
||||
ElementT LLThreadSafeQueue<ElementT>::popBack(void)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
mLock.wait();
|
||||
if (!mStorage.empty())
|
||||
{
|
||||
ElementT value = mStorage.back();
|
||||
mStorage.pop_back();
|
||||
return value;
|
||||
}
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
std::unique_lock<std::mutex> lock1(mLock);
|
||||
|
||||
if (!mStorage.empty())
|
||||
{
|
||||
ElementT value = mStorage.back();
|
||||
mStorage.pop_back();
|
||||
mCapacityCond.notify_one();
|
||||
return value;
|
||||
}
|
||||
|
||||
// Storage empty. Wait for signal.
|
||||
mEmptyCond.wait(lock1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<typename ElementT>
|
||||
bool LLThreadSafeQueue<ElementT>::tryPopBack(ElementT & element)
|
||||
{
|
||||
LLMutexTrylock lck(&mLock);
|
||||
std::unique_lock<std::mutex> lock1(mLock, std::defer_lock);
|
||||
if (!lock1.try_lock())
|
||||
return false;
|
||||
|
||||
if (!lck.isLocked())
|
||||
return false;
|
||||
if (mStorage.empty())
|
||||
return false;
|
||||
if (mStorage.empty())
|
||||
return false;
|
||||
|
||||
element = mStorage.back();
|
||||
mStorage.pop_back();
|
||||
return true;
|
||||
element = mStorage.back();
|
||||
mStorage.pop_back();
|
||||
mCapacityCond.notify_one();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template<typename ElementT>
|
||||
size_t LLThreadSafeQueue<ElementT>::size(void)
|
||||
{
|
||||
// Nicky: apr_queue_size is/was NOT threadsafe. I still play it safe here and rather lock the storage
|
||||
|
||||
LLMutexLock lck(&mLock);
|
||||
return mStorage.size();
|
||||
std::lock_guard<std::mutex> lock(mLock);
|
||||
return mStorage.size();
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -565,6 +565,11 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)
|
|||
// about 700 or so requests and starts issuing TCP RSTs to
|
||||
// new connections. Reuse the DNS lookups for even a few
|
||||
// seconds and no RSTs.
|
||||
//
|
||||
// -1 stores forever
|
||||
// 0 never stores
|
||||
// any other positive number specifies seconds
|
||||
// supposedly curl 7.62.0 can use TTL by default, otherwise default is 60 seconds
|
||||
check_curl_easy_setopt(mCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, dnsCacheTimeout);
|
||||
|
||||
if (gpolicy.mUseLLProxy)
|
||||
|
|
|
|||
|
|
@ -2903,6 +2903,9 @@ void HttpRequestTestObjectType::test<22>()
|
|||
|
||||
set_test_name("BUG-2295");
|
||||
|
||||
#if LL_WINDOWS && ADDRESS_SIZE == 64
|
||||
skip("BUG-2295 - partial load on W64 causes freeze");
|
||||
#endif
|
||||
// Handler can be stack-allocated *if* there are no dangling
|
||||
// references to it after completion of this method.
|
||||
// Create before memory record as the string copy will bump numbers.
|
||||
|
|
@ -2921,6 +2924,7 @@ void HttpRequestTestObjectType::test<22>()
|
|||
// options set
|
||||
options = HttpOptions::ptr_t(new HttpOptions());
|
||||
options->setRetries(1); // Partial_File is retryable and can timeout in here
|
||||
options->setDNSCacheTimeout(30);
|
||||
|
||||
// Get singletons created
|
||||
HttpRequest::createService();
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "llchatitemscontainerctrl.h"
|
||||
#include "lltextbox.h"
|
||||
|
||||
#include "llavataractions.h"
|
||||
#include "llavatariconctrl.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llfloaterreg.h"
|
||||
|
|
@ -220,6 +221,7 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification)
|
|||
|
||||
mMsgText = getChild<LLChatMsgBox>("msg_text", false);
|
||||
mMsgText->setContentTrusted(false);
|
||||
mMsgText->setIsFriendCallback(LLAvatarActions::isFriend);
|
||||
|
||||
mMsgText->setText(std::string(""));
|
||||
|
||||
|
|
|
|||
|
|
@ -353,7 +353,7 @@ void LLConversationItemSession::setParticipantIsMuted(const LLUUID& participant_
|
|||
LLConversationItemParticipant* participant = findParticipant(participant_id);
|
||||
if (participant)
|
||||
{
|
||||
participant->muteVoice(is_muted);
|
||||
participant->moderateVoice(is_muted);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -500,6 +500,7 @@ void LLConversationItemSession::onAvatarNameCache(const LLAvatarName& av_name)
|
|||
|
||||
LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
|
||||
LLConversationItem(display_name,uuid,root_view_model),
|
||||
mIsModeratorMuted(false),
|
||||
mIsModerator(false),
|
||||
mDisplayModeratorLabel(false),
|
||||
mDistToAgent(-1.0)
|
||||
|
|
@ -510,6 +511,7 @@ LLConversationItemParticipant::LLConversationItemParticipant(std::string display
|
|||
|
||||
LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) :
|
||||
LLConversationItem(uuid,root_view_model),
|
||||
mIsModeratorMuted(false),
|
||||
mIsModerator(false),
|
||||
mDisplayModeratorLabel(false),
|
||||
mDistToAgent(-1.0)
|
||||
|
|
@ -599,7 +601,7 @@ void LLConversationItemParticipant::setDisplayModeratorRole(bool displayRole)
|
|||
|
||||
bool LLConversationItemParticipant::isVoiceMuted()
|
||||
{
|
||||
return LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat);
|
||||
return mIsModeratorMuted || LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat);
|
||||
}
|
||||
|
||||
void LLConversationItemParticipant::muteVoice(bool mute_voice)
|
||||
|
|
@ -607,16 +609,16 @@ void LLConversationItemParticipant::muteVoice(bool mute_voice)
|
|||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get(mUUID, &av_name);
|
||||
LLMuteList * mute_listp = LLMuteList::getInstance();
|
||||
bool voice_already_muted = mute_listp->isMuted(mUUID, av_name.getUserName());
|
||||
bool voice_already_muted = mute_listp->isMuted(mUUID, av_name.getUserName(), LLMute::flagVoiceChat);
|
||||
|
||||
LLMute mute(mUUID, av_name.getUserName(), LLMute::AGENT);
|
||||
if (voice_already_muted && !mute_voice)
|
||||
{
|
||||
mute_listp->remove(mute);
|
||||
mute_listp->remove(mute, LLMute::flagVoiceChat);
|
||||
}
|
||||
else if (!voice_already_muted && mute_voice)
|
||||
{
|
||||
mute_listp->add(mute);
|
||||
mute_listp->add(mute, LLMute::flagVoiceChat);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -197,8 +197,10 @@ public:
|
|||
virtual const std::string& getDisplayName() const { return mDisplayName; }
|
||||
|
||||
bool isVoiceMuted();
|
||||
bool isModeratorMuted() { return mIsModeratorMuted; }
|
||||
bool isModerator() const { return mIsModerator; }
|
||||
void muteVoice(bool mute_voice);
|
||||
void moderateVoice(bool mute_voice) { mIsModeratorMuted = mute_voice; }
|
||||
void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; mNeedsRefresh = true; }
|
||||
void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); mNeedsRefresh = true; }
|
||||
void setDistance(F64 dist) { mDistToAgent = dist; mNeedsRefresh = true; }
|
||||
|
|
@ -219,6 +221,7 @@ private:
|
|||
void onAvatarNameCache(const LLAvatarName& av_name); // callback used by fetchAvatarName
|
||||
void updateName(const LLAvatarName& av_name);
|
||||
|
||||
bool mIsModeratorMuted; // default is false
|
||||
bool mIsModerator; // default is false
|
||||
bool mDisplayModeratorLabel; // default is false
|
||||
std::string mDisplayName;
|
||||
|
|
|
|||
|
|
@ -607,6 +607,20 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height)
|
|||
return arranged;
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLConversationViewParticipant::refresh()
|
||||
{
|
||||
// Refresh the participant view from its model data
|
||||
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem());
|
||||
participant_model->resetRefresh();
|
||||
|
||||
// *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat
|
||||
mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted());
|
||||
|
||||
// Do the regular upstream refresh
|
||||
LLFolderViewItem::refresh();
|
||||
}
|
||||
|
||||
void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder)
|
||||
{
|
||||
// Add the item to the folder (conversation)
|
||||
|
|
|
|||
|
|
@ -138,6 +138,7 @@ public:
|
|||
virtual ~LLConversationViewParticipant( void );
|
||||
|
||||
bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); }
|
||||
/*virtual*/ void refresh();
|
||||
void addToFolder(LLFolderViewFolder* folder);
|
||||
void addToSession(const LLUUID& session_id);
|
||||
|
||||
|
|
|
|||
|
|
@ -436,6 +436,7 @@ BOOL LLPanelLandGeneral::postBuild()
|
|||
mTextSalePending = getChild<LLTextBox>("SalePending");
|
||||
mTextOwnerLabel = getChild<LLTextBox>("Owner:");
|
||||
mTextOwner = getChild<LLTextBox>("OwnerText");
|
||||
mTextOwner->setIsFriendCallback(LLAvatarActions::isFriend);
|
||||
|
||||
mContentRating = getChild<LLTextBox>("ContentRatingText");
|
||||
mLandType = getChild<LLTextBox>("LandTypeText");
|
||||
|
|
@ -1269,6 +1270,7 @@ BOOL LLPanelLandObjects::postBuild()
|
|||
mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga", 0);
|
||||
|
||||
mOwnerList = getChild<LLNameListCtrl>("owner list");
|
||||
mOwnerList->setIsFriendCallback(LLAvatarActions::isFriend);
|
||||
mOwnerList->sortByColumnIndex(3, FALSE);
|
||||
childSetCommitCallback("owner list", onCommitList, this);
|
||||
mOwnerList->setDoubleClickCallback(onDoubleClickOwner, this);
|
||||
|
|
|
|||
|
|
@ -310,10 +310,10 @@ BOOL LLFloaterModelPreview::postBuild()
|
|||
getChild<LLSpinCtrl>("lod_triangle_limit_" + lod_name[lod])->setCommitCallback(boost::bind(&LLFloaterModelPreview::onLODParamCommit, this, lod, true));
|
||||
}
|
||||
|
||||
childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
|
||||
childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
|
||||
childSetCommitCallback("lock_scale_if_joint_position", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
|
||||
childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);
|
||||
childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
|
||||
childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
|
||||
childSetCommitCallback("lock_scale_if_joint_position", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
|
||||
childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::onUploadOptionChecked, this, _1), NULL);
|
||||
|
||||
childSetTextArg("status", "[STATUS]", getString("status_idle"));
|
||||
|
||||
|
|
@ -487,6 +487,16 @@ void LLFloaterModelPreview::initModelPreview()
|
|||
mModelPreview->setModelUpdatedCallback(boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this, _1));
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::onUploadOptionChecked(LLUICtrl* ctrl)
|
||||
{
|
||||
if (mModelPreview)
|
||||
{
|
||||
auto name = ctrl->getName();
|
||||
mModelPreview->mViewOption[name] = !mModelPreview->mViewOption[name];
|
||||
}
|
||||
toggleCalculateButton(true);
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::onViewOptionChecked(LLUICtrl* ctrl)
|
||||
{
|
||||
if (mModelPreview)
|
||||
|
|
@ -686,6 +696,7 @@ void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userda
|
|||
void LLFloaterModelPreview::toggleGenarateNormals()
|
||||
{
|
||||
bool enabled = childGetValue("gen_normals").asBoolean();
|
||||
mModelPreview->mViewOption["gen_normals"] = enabled;
|
||||
childSetEnabled("crease_angle", enabled);
|
||||
if(enabled) {
|
||||
mModelPreview->generateNormals();
|
||||
|
|
@ -1255,10 +1266,8 @@ void LLFloaterModelPreview::initDecompControls()
|
|||
std::string label = llformat("%.1f", value);
|
||||
combo_box->add(label, value, ADD_BOTTOM, true);
|
||||
}
|
||||
combo_box->setValue(param[i].mDefault.mFloat);
|
||||
|
||||
}
|
||||
|
||||
combo_box->setValue(param[i].mDefault.mFloat);
|
||||
combo_box->setCommitCallback(onPhysicsParamCommit, (void*) ¶m[i]);
|
||||
}
|
||||
}
|
||||
|
|
@ -1330,7 +1339,7 @@ void LLFloaterModelPreview::initDecompControls()
|
|||
//LL_INFOS() << "-----------------------------" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
mDefaultDecompParams = mDecompParams;
|
||||
childSetCommitCallback("physics_explode", LLFloaterModelPreview::onExplodeCommit, this);
|
||||
}
|
||||
|
||||
|
|
@ -4768,6 +4777,7 @@ void LLFloaterModelPreview::onReset(void* user_data)
|
|||
std::string filename = mp->mLODFile[LLModel::LOD_HIGH];
|
||||
|
||||
fmp->resetDisplayOptions();
|
||||
fmp->resetUploadOptions();
|
||||
//reset model preview
|
||||
fmp->initModelPreview();
|
||||
|
||||
|
|
@ -4881,11 +4891,6 @@ void LLFloaterModelPreview::setStatusMessage(const std::string& msg)
|
|||
mStatusMessage = msg;
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::toggleCalculateButton()
|
||||
{
|
||||
toggleCalculateButton(true);
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::toggleCalculateButton(bool visible)
|
||||
{
|
||||
mCalculateBtn->setVisible(visible);
|
||||
|
|
@ -4947,6 +4952,37 @@ void LLFloaterModelPreview::resetDisplayOptions()
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::resetUploadOptions()
|
||||
{
|
||||
childSetValue("import_scale", 1);
|
||||
childSetValue("pelvis_offset", 0);
|
||||
childSetValue("physics_explode", 0);
|
||||
childSetValue("physics_file", "");
|
||||
childSetVisible("Retain%", false);
|
||||
childSetVisible("Retain%_label", false);
|
||||
childSetVisible("Detail Scale", true);
|
||||
childSetVisible("Detail Scale label", true);
|
||||
|
||||
getChild<LLComboBox>("lod_source_" + lod_name[NUM_LOD - 1])->setCurrentByIndex(LLModelPreview::LOD_FROM_FILE);
|
||||
for (S32 lod = 0; lod < NUM_LOD - 1; ++lod)
|
||||
{
|
||||
getChild<LLComboBox>("lod_source_" + lod_name[lod])->setCurrentByIndex(LLModelPreview::GENERATE);
|
||||
childSetValue("lod_file_" + lod_name[lod], "");
|
||||
}
|
||||
|
||||
getChild<LLComboBox>("physics_lod_combo")->setCurrentByIndex(0);
|
||||
|
||||
for(auto& p : mDefaultDecompParams)
|
||||
{
|
||||
std::string ctrl_name(p.first);
|
||||
LLUICtrl* ctrl = getChild<LLUICtrl>(ctrl_name);
|
||||
if (ctrl)
|
||||
{
|
||||
ctrl->setValue(p.second);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterModelPreview::onModelPhysicsFeeReceived(const LLSD& result, std::string upload_url)
|
||||
{
|
||||
mModelPhysicsFee = result;
|
||||
|
|
|
|||
|
|
@ -109,6 +109,7 @@ public:
|
|||
void loadModel(S32 lod, const std::string& file_name, bool force_disable_slm = false);
|
||||
|
||||
void onViewOptionChecked(LLUICtrl* ctrl);
|
||||
void onUploadOptionChecked(LLUICtrl* ctrl);
|
||||
bool isViewOptionChecked(const LLSD& userdata);
|
||||
bool isViewOptionEnabled(const LLSD& userdata);
|
||||
void setViewOptionEnabled(const std::string& option, bool enabled);
|
||||
|
|
@ -179,6 +180,7 @@ protected:
|
|||
LLModelPreview* mModelPreview;
|
||||
|
||||
LLPhysicsDecomp::decomp_params mDecompParams;
|
||||
LLPhysicsDecomp::decomp_params mDefaultDecompParams;
|
||||
|
||||
S32 mLastMouseX;
|
||||
S32 mLastMouseY;
|
||||
|
|
@ -203,7 +205,6 @@ protected:
|
|||
|
||||
private:
|
||||
void onClickCalculateBtn();
|
||||
void toggleCalculateButton();
|
||||
|
||||
void onLoDSourceCommit(S32 lod);
|
||||
|
||||
|
|
@ -213,6 +214,8 @@ private:
|
|||
// resets display options of model preview to their defaults.
|
||||
void resetDisplayOptions();
|
||||
|
||||
void resetUploadOptions();
|
||||
|
||||
void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
|
||||
|
||||
LLButton* mUploadBtn;
|
||||
|
|
|
|||
|
|
@ -83,8 +83,6 @@ LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key)
|
|||
mCommitCallbackRegistrar.add("TopObjects.ShowBeacon", boost::bind(&LLFloaterTopObjects::onClickShowBeacon, this));
|
||||
mCommitCallbackRegistrar.add("TopObjects.ReturnSelected", boost::bind(&LLFloaterTopObjects::onReturnSelected, this));
|
||||
mCommitCallbackRegistrar.add("TopObjects.ReturnAll", boost::bind(&LLFloaterTopObjects::onReturnAll, this));
|
||||
mCommitCallbackRegistrar.add("TopObjects.DisableSelected", boost::bind(&LLFloaterTopObjects::onDisableSelected, this));
|
||||
mCommitCallbackRegistrar.add("TopObjects.DisableAll", boost::bind(&LLFloaterTopObjects::onDisableAll, this));
|
||||
mCommitCallbackRegistrar.add("TopObjects.Refresh", boost::bind(&LLFloaterTopObjects::onRefresh, this));
|
||||
mCommitCallbackRegistrar.add("TopObjects.GetByObjectName", boost::bind(&LLFloaterTopObjects::onGetByObjectName, this));
|
||||
mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName", boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this));
|
||||
|
|
@ -159,6 +157,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
|
|||
{
|
||||
U32 request_flags;
|
||||
U32 total_count;
|
||||
U64 total_memory = 0;
|
||||
|
||||
msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags);
|
||||
msg->getU32Fast(_PREHASH_RequestData, _PREHASH_TotalObjectCount, total_count);
|
||||
|
|
@ -206,6 +205,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
|
|||
{
|
||||
parcel_buf = parcel_name;
|
||||
script_memory = script_size;
|
||||
total_memory += script_size;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -279,8 +279,10 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
|
|||
{
|
||||
setTitle(getString("top_scripts_title"));
|
||||
list->setColumnLabel("score", getString("scripts_score_label"));
|
||||
|
||||
|
||||
LLUIString format = getString("top_scripts_text");
|
||||
total_memory /= 1024;
|
||||
format.setArg("[MEMORY]", llformat("%ld", total_memory));
|
||||
format.setArg("[COUNT]", llformat("%d", total_count));
|
||||
format.setArg("[TIME]", llformat("%0.3f", mtotalScore));
|
||||
getChild<LLUICtrl>("title_text")->setValue(LLSD(format));
|
||||
|
|
@ -364,7 +366,7 @@ void LLFloaterTopObjects::onClickShowBeacon()
|
|||
showBeacon();
|
||||
}
|
||||
|
||||
void LLFloaterTopObjects::doToObjects(int action, bool all)
|
||||
void LLFloaterTopObjects::returnObjects(bool all)
|
||||
{
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
|
||||
|
|
@ -388,14 +390,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all)
|
|||
}
|
||||
if (start_message)
|
||||
{
|
||||
if (action == ACTION_RETURN)
|
||||
{
|
||||
msg->newMessageFast(_PREHASH_ParcelReturnObjects);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg->newMessageFast(_PREHASH_ParcelDisableObjects);
|
||||
}
|
||||
msg->newMessageFast(_PREHASH_ParcelReturnObjects);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
|
||||
|
|
@ -429,7 +424,7 @@ bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD
|
|||
if(!instance) return false;
|
||||
if (option == 0)
|
||||
{
|
||||
instance->doToObjects(ACTION_RETURN, true);
|
||||
instance->returnObjects(true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -442,31 +437,7 @@ void LLFloaterTopObjects::onReturnAll()
|
|||
|
||||
void LLFloaterTopObjects::onReturnSelected()
|
||||
{
|
||||
doToObjects(ACTION_RETURN, false);
|
||||
}
|
||||
|
||||
|
||||
//static
|
||||
bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
|
||||
if(!instance) return false;
|
||||
if (option == 0)
|
||||
{
|
||||
instance->doToObjects(ACTION_DISABLE, true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLFloaterTopObjects::onDisableAll()
|
||||
{
|
||||
LLNotificationsUtil::add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll);
|
||||
}
|
||||
|
||||
void LLFloaterTopObjects::onDisableSelected()
|
||||
{
|
||||
doToObjects(ACTION_DISABLE, false);
|
||||
returnObjects(false);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -79,12 +79,10 @@ private:
|
|||
static void onDoubleClickObjectsList(void* data);
|
||||
void onClickShowBeacon();
|
||||
|
||||
void doToObjects(int action, bool all);
|
||||
void returnObjects(bool all);
|
||||
|
||||
void onReturnAll();
|
||||
void onReturnSelected();
|
||||
void onDisableAll();
|
||||
void onDisableSelected();
|
||||
|
||||
// <FS:Ansariel> TP to object
|
||||
void onTeleportToObject();
|
||||
|
|
@ -99,7 +97,6 @@ private:
|
|||
void onAvatarCheck(const LLUUID& avatar_id, const LLAvatarName av_name);
|
||||
|
||||
static bool callbackReturnAll(const LLSD& notification, const LLSD& response);
|
||||
static bool callbackDisableAll(const LLSD& notification, const LLSD& response);
|
||||
|
||||
void onGetByOwnerName();
|
||||
void onGetByObjectName();
|
||||
|
|
@ -121,12 +118,6 @@ private:
|
|||
|
||||
F32 mtotalScore;
|
||||
|
||||
enum
|
||||
{
|
||||
ACTION_RETURN = 0,
|
||||
ACTION_DISABLE
|
||||
};
|
||||
|
||||
static LLFloaterTopObjects* sInstance;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1572,7 +1572,7 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
|
|||
break;
|
||||
|
||||
default:
|
||||
LL_INFOS() << "Unhandled asset type (llassetstorage.h): "
|
||||
LL_INFOS_ONCE() << "Unhandled asset type (llassetstorage.h): "
|
||||
<< (S32)asset_type << " (" << LLAssetType::lookup(asset_type) << ")" << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1975,9 +1975,19 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
|
|||
|
||||
if (LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName()
|
||||
<< " type: " << item->getType()
|
||||
<< " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL;
|
||||
if (item->getType() >= LLAssetType::AT_COUNT)
|
||||
{
|
||||
// Not yet supported.
|
||||
LL_DEBUGS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName()
|
||||
<< " type: " << item->getType()
|
||||
<< " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName()
|
||||
<< " type: " << item->getType()
|
||||
<< " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
// This condition means that we tried to add a link without the baseobj being in memory.
|
||||
|
|
|
|||
|
|
@ -943,7 +943,8 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
|
|||
|
||||
if (objectp->getType() >= LLAssetType::AT_COUNT)
|
||||
{
|
||||
LL_WARNS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : "
|
||||
// Example: Happens when we add assets of new, not yet supported type to library
|
||||
LL_DEBUGS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : "
|
||||
<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
|
||||
<< LL_ENDL;
|
||||
|
||||
|
|
|
|||
|
|
@ -660,43 +660,10 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string
|
|||
while (iter.next(filename))
|
||||
{
|
||||
std::string fullname = gDirUtilp->add(dirname, filename);
|
||||
|
||||
LLFILE * filep = LLFile::fopen(fullname, "rb");
|
||||
if (NULL != filep)
|
||||
if (isTranscriptFileFound(fullname))
|
||||
{
|
||||
if(makeLogFileName("chat")== fullname)
|
||||
{
|
||||
//Add Nearby chat history to the list of transcriptions
|
||||
list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
|
||||
LLFile::close(filep);
|
||||
continue;
|
||||
}
|
||||
char buffer[LOG_RECALL_SIZE];
|
||||
|
||||
fseek(filep, 0, SEEK_END); // seek to end of file
|
||||
S32 bytes_to_read = ftell(filep); // get current file pointer
|
||||
fseek(filep, 0, SEEK_SET); // seek back to beginning of file
|
||||
|
||||
// limit the number characters to read from file
|
||||
if (bytes_to_read >= LOG_RECALL_SIZE)
|
||||
{
|
||||
bytes_to_read = LOG_RECALL_SIZE - 1;
|
||||
}
|
||||
|
||||
if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep))
|
||||
{
|
||||
//matching a timestamp
|
||||
boost::match_results<std::string::const_iterator> matches;
|
||||
// <FS:Ansariel> Seconds in timestamp
|
||||
//if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
|
||||
if (boost::regex_match(std::string(buffer), matches, TIMESTAMP) || boost::regex_match(std::string(buffer), matches, TIMESTAMP_AND_SEC))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
|
||||
}
|
||||
}
|
||||
LLFile::close(filep);
|
||||
}
|
||||
list_of_transcriptions.push_back(fullname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -849,57 +816,13 @@ void LLLogChat::deleteTranscripts()
|
|||
// static
|
||||
bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group)
|
||||
{
|
||||
// <FS:Ansariel> FIRE-13725 / CHUIBUG-222: Viewer freezes when opening preferences or right-clicking on friends' names
|
||||
//std::vector<std::string> list_of_transcriptions;
|
||||
//LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
|
||||
|
||||
//if (list_of_transcriptions.size() > 0)
|
||||
//{
|
||||
// LLAvatarName avatar_name;
|
||||
// LLAvatarNameCache::get(avatar_id, &avatar_name);
|
||||
// // <FS:Ansariel> [Legacy IM logfile names]
|
||||
// //std::string avatar_user_name = avatar_name.getAccountName();
|
||||
// std::string avatar_user_name;
|
||||
// if (gSavedSettings.getBOOL("UseLegacyIMLogNames"))
|
||||
// {
|
||||
// avatar_user_name = avatar_name.getUserName();
|
||||
// avatar_user_name = avatar_user_name.substr(0, avatar_user_name.find(" Resident"));;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// avatar_user_name = avatar_name.getAccountName();
|
||||
// std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
|
||||
// }
|
||||
// // <//FS:Ansariel> [Legacy IM logfile names]
|
||||
// if(!is_group)
|
||||
// {
|
||||
// //std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
|
||||
// BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
|
||||
// {
|
||||
// if (std::string::npos != transcript_file_name.find(avatar_user_name))
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// std::string file_name;
|
||||
// gCacheName->getGroupName(avatar_id, file_name);
|
||||
// file_name = makeLogFileName(file_name);
|
||||
// BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
|
||||
// {
|
||||
// if (transcript_file_name == file_name)
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//}
|
||||
std::string file_name;
|
||||
if (!is_group)
|
||||
//LLAvatarName avatar_name;
|
||||
//LLAvatarNameCache::get(avatar_id, &avatar_name);
|
||||
//std::string avatar_user_name = avatar_name.getAccountName();
|
||||
if(!is_group)
|
||||
{
|
||||
// <FS:Ansariel> [Legacy IM logfile names]
|
||||
//std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
|
||||
LLAvatarName avatar_name;
|
||||
LLAvatarNameCache::get(avatar_id, &avatar_name);
|
||||
std::string avatar_user_name;
|
||||
|
|
@ -913,60 +836,68 @@ bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group)
|
|||
avatar_user_name = avatar_name.getAccountName();
|
||||
std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_');
|
||||
}
|
||||
file_name = makeLogFileName(avatar_user_name);
|
||||
// </FS:Ansariel> [Legacy IM logfile names]
|
||||
return isTranscriptFileFound(makeLogFileName(avatar_user_name));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string file_name;
|
||||
gCacheName->getGroupName(avatar_id, file_name);
|
||||
file_name = makeLogFileName(file_name);
|
||||
return isTranscriptFileFound(makeLogFileName(file_name));
|
||||
}
|
||||
if ( (!file_name.empty()) && (LLFile::isfile(file_name)) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLLogChat::isNearbyTranscriptExist()
|
||||
{
|
||||
// <FS:Ansariel> FIRE-13725 / CHUIBUG-222: Viewer freezes when opening preferences or right-clicking on friends' names
|
||||
//std::vector<std::string> list_of_transcriptions;
|
||||
//LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
|
||||
|
||||
//std::string file_name;
|
||||
//file_name = makeLogFileName("chat");
|
||||
//BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
|
||||
//{
|
||||
// if (transcript_file_name == file_name)
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
//}
|
||||
std::string strFilePath = makeLogFileName("chat");
|
||||
if ( (!strFilePath.empty()) && (LLFile::isfile(strFilePath)) )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
return false;
|
||||
return isTranscriptFileFound(makeLogFileName("chat"));;
|
||||
}
|
||||
|
||||
bool LLLogChat::isAdHocTranscriptExist(std::string file_name)
|
||||
{
|
||||
std::vector<std::string> list_of_transcriptions;
|
||||
LLLogChat::getListOfTranscriptFiles(list_of_transcriptions);
|
||||
return isTranscriptFileFound(makeLogFileName(file_name));;
|
||||
}
|
||||
|
||||
file_name = makeLogFileName(file_name);
|
||||
BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions)
|
||||
// static
|
||||
bool LLLogChat::isTranscriptFileFound(std::string fullname)
|
||||
{
|
||||
bool result = false;
|
||||
LLFILE * filep = LLFile::fopen(fullname, "rb");
|
||||
if (NULL != filep)
|
||||
{
|
||||
if (transcript_file_name == file_name)
|
||||
{
|
||||
return true;
|
||||
if (makeLogFileName("chat") == fullname)
|
||||
{
|
||||
LLFile::close(filep);
|
||||
return true;
|
||||
}
|
||||
char buffer[LOG_RECALL_SIZE];
|
||||
|
||||
fseek(filep, 0, SEEK_END); // seek to end of file
|
||||
S32 bytes_to_read = ftell(filep); // get current file pointer
|
||||
fseek(filep, 0, SEEK_SET); // seek back to beginning of file
|
||||
|
||||
// limit the number characters to read from file
|
||||
if (bytes_to_read >= LOG_RECALL_SIZE)
|
||||
{
|
||||
bytes_to_read = LOG_RECALL_SIZE - 1;
|
||||
}
|
||||
|
||||
if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep))
|
||||
{
|
||||
//matching a timestamp
|
||||
boost::match_results<std::string::const_iterator> matches;
|
||||
// <FS:Ansariel> Seconds in timestamp
|
||||
//if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
|
||||
if (boost::regex_match(std::string(buffer), matches, TIMESTAMP) || boost::regex_match(std::string(buffer), matches, TIMESTAMP_AND_SEC))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
LLFile::close(filep);
|
||||
}
|
||||
return false;
|
||||
return result;
|
||||
}
|
||||
|
||||
//*TODO mark object's names in a special way so that they will be distinguishable form avatar name
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ public:
|
|||
static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);
|
||||
static bool isNearbyTranscriptExist();
|
||||
static bool isAdHocTranscriptExist(std::string file_name);
|
||||
static bool isTranscriptFileFound(std::string fullname);
|
||||
|
||||
static bool historyThreadsFinished(LLUUID session_id);
|
||||
static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id);
|
||||
|
|
|
|||
|
|
@ -63,6 +63,9 @@
|
|||
#include <sstream>
|
||||
|
||||
const S32 LOGIN_MAX_RETRIES = 3;
|
||||
const F32 LOGIN_SRV_TIMEOUT_MIN = 10;
|
||||
const F32 LOGIN_SRV_TIMEOUT_MAX = 120;
|
||||
const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time
|
||||
|
||||
class LLLoginInstance::Disposable {
|
||||
public:
|
||||
|
|
@ -247,8 +250,10 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
|
|||
|
||||
// Specify desired timeout/retry options
|
||||
LLSD http_params;
|
||||
http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
|
||||
F32 srv_timeout = llclamp(gSavedSettings.getF32("LoginSRVTimeout"), LOGIN_SRV_TIMEOUT_MIN, LOGIN_SRV_TIMEOUT_MAX);
|
||||
http_params["timeout"] = srv_timeout;
|
||||
http_params["retries"] = LOGIN_MAX_RETRIES;
|
||||
http_params["DNSCacheTimeout"] = srv_timeout * LOGIN_DNS_TIMEOUT_FACTOR; //Default: indefinite
|
||||
|
||||
mRequestData.clear();
|
||||
mRequestData["method"] = "login_to_simulator";
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ void LLMainLoopRepeater::start(void)
|
|||
{
|
||||
if(mQueue != 0) return;
|
||||
|
||||
mQueue = new LLThreadSafeQueue<LLSD>( 1024);
|
||||
mQueue = new LLThreadSafeQueue<LLSD>(1024);
|
||||
mMainLoopConnection = LLEventPumps::instance().
|
||||
obtain("mainloop").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMainLoop, this, _1));
|
||||
mRepeaterConnection = LLEventPumps::instance().
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
|
|||
mImageLevel3(p.image_level_3),
|
||||
mAutoUpdate(p.auto_update),
|
||||
mSpeakerId(p.speaker_id),
|
||||
mIsModeratorMuted(false),
|
||||
mIsAgentControl(false),
|
||||
mIndicatorToggled(false),
|
||||
mShowParticipantsSpeaking(false)
|
||||
|
|
@ -128,7 +129,7 @@ void LLOutputMonitorCtrl::draw()
|
|||
//const F32 LEVEL_2 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
|
||||
// </FS:Ansariel> Centralized voice power level
|
||||
|
||||
if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull())
|
||||
if (getVisible() && mAutoUpdate && !getIsMuted() && mSpeakerId.notNull())
|
||||
{
|
||||
setPower(LLVoiceClient::getInstance()->getCurrentPower(mSpeakerId));
|
||||
if(mIsAgentControl)
|
||||
|
|
@ -161,7 +162,7 @@ void LLOutputMonitorCtrl::draw()
|
|||
|
||||
LLPointer<LLUIImage> icon;
|
||||
// <FS:Ansariel> Centralized voice power level
|
||||
//if (mIsMuted)
|
||||
//if (getIsMuted())
|
||||
//{
|
||||
// icon = mImageMute;
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -72,9 +72,11 @@ public:
|
|||
|
||||
void setPower(F32 val);
|
||||
F32 getPower(F32 val) const { return mPower; }
|
||||
|
||||
|
||||
bool getIsMuted() const { return (mIsMuted || mIsModeratorMuted); }
|
||||
void setIsModeratorMuted(bool val) { mIsModeratorMuted = val; }
|
||||
|
||||
// <FS:CR> FS Communications UI
|
||||
bool getIsMuted() const { return mIsMuted; }
|
||||
void setIsMuted(bool val) { mIsMuted = val; }
|
||||
// </FS:CR>
|
||||
|
||||
|
|
@ -136,6 +138,7 @@ private:
|
|||
|
||||
F32 mPower;
|
||||
bool mIsAgentControl;
|
||||
bool mIsModeratorMuted;
|
||||
bool mIsMuted;
|
||||
bool mIsTalking;
|
||||
bool mShowParticipantsSpeaking;
|
||||
|
|
|
|||
|
|
@ -6966,17 +6966,6 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
|
|||
|
||||
void script_question_mute(const LLUUID& item_id, const std::string& object_name);
|
||||
|
||||
bool unknown_script_question_cb(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
// Only care if they muted the object here.
|
||||
if ( response["Mute"] ) // mute
|
||||
{
|
||||
LLUUID task_id = notification["payload"]["task_id"].asUUID();
|
||||
script_question_mute(task_id,notification["payload"]["object_name"].asString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void experiencePermissionBlock(LLUUID experience, LLSD result)
|
||||
{
|
||||
LLSD permission;
|
||||
|
|
@ -7092,8 +7081,7 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name)
|
|||
bool matches(const LLNotificationPtr notification) const
|
||||
{
|
||||
if (notification->getName() == "ScriptQuestionCaution"
|
||||
|| notification->getName() == "ScriptQuestion"
|
||||
|| notification->getName() == "UnknownScriptQuestion")
|
||||
|| notification->getName() == "ScriptQuestion")
|
||||
{
|
||||
return (notification->getPayload()["task_id"].asUUID() == blocked_id);
|
||||
}
|
||||
|
|
@ -7110,7 +7098,6 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name)
|
|||
static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb);
|
||||
static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb);
|
||||
static LLNotificationFunctorRegistration script_question_cb_reg_3("ScriptQuestionExperience", script_question_cb);
|
||||
static LLNotificationFunctorRegistration unknown_script_question_cb_reg("UnknownScriptQuestion", unknown_script_question_cb);
|
||||
|
||||
void process_script_experience_details(const LLSD& experience_details, LLSD args, LLSD payload)
|
||||
{
|
||||
|
|
@ -7232,14 +7219,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
|
|||
args["QUESTIONS"] = script_question;
|
||||
|
||||
if (known_questions != questions)
|
||||
{ // This is in addition to the normal dialog.
|
||||
LLSD payload;
|
||||
payload["task_id"] = taskid;
|
||||
payload["item_id"] = itemid;
|
||||
payload["object_name"] = object_name;
|
||||
|
||||
args["DOWNLOADURL"] = LLTrans::getString("ViewerDownloadURL");
|
||||
LLNotificationsUtil::add("UnknownScriptQuestion",args,payload);
|
||||
{
|
||||
// This is in addition to the normal dialog.
|
||||
// Viewer got a request for not supported/implemented permission
|
||||
LL_WARNS("Messaging") << "Object \"" << object_name << "\" requested " << script_question
|
||||
<< " permission. Permission is unknown and can't be granted. Item id: " << itemid
|
||||
<< " taskid:" << taskid << LL_ENDL;
|
||||
make_ui_sound("UISndScriptFloaterOpen"); // <FS:PP> FIRE-16958: Incoming script permission request doesn't trigger a sound
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -362,6 +362,10 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const
|
|||
{
|
||||
httpOpts->setRetries(httpParams["retries"].asInteger());
|
||||
}
|
||||
if (httpParams.has("DNSCacheTimeout"))
|
||||
{
|
||||
httpOpts->setDNSCacheTimeout(httpParams["DNSCacheTimeout"].asInteger());
|
||||
}
|
||||
|
||||
bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
|
||||
mCertStore = gSavedSettings.getString("CertStore");
|
||||
|
|
|
|||
|
|
@ -213,6 +213,7 @@
|
|||
layout="topleft"
|
||||
top_pad="0"
|
||||
name="share_with_group"
|
||||
tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
|
||||
width="92" />
|
||||
<text
|
||||
type="string"
|
||||
|
|
@ -234,6 +235,7 @@
|
|||
layout="topleft"
|
||||
top_pad="0"
|
||||
name="everyone_copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive"
|
||||
width="92" />
|
||||
<text
|
||||
type="string"
|
||||
|
|
@ -254,6 +256,7 @@
|
|||
label="Modify"
|
||||
layout="topleft"
|
||||
name="next_owner_modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
top_pad="0"
|
||||
width="92" />
|
||||
<check_box
|
||||
|
|
@ -263,6 +266,7 @@
|
|||
layout="topleft"
|
||||
top_pad="0"
|
||||
name="next_owner_copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="92">
|
||||
<check_box.commit_callback
|
||||
function="BulkPermission.CommitCopy"/>
|
||||
|
|
@ -276,7 +280,7 @@
|
|||
label="Transfer"
|
||||
layout="topleft"
|
||||
name="next_owner_transfer"
|
||||
tool_tip="Next owner can give away or resell this object"
|
||||
tool_tip="Next owner can give away or resell this object."
|
||||
width="92" />
|
||||
<scroll_list
|
||||
enabled="false"
|
||||
|
|
|
|||
|
|
@ -1313,6 +1313,7 @@ even though the user gets a free copy.
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left="10"
|
||||
width="85" />
|
||||
<check_box
|
||||
|
|
@ -1321,6 +1322,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
width="80" />
|
||||
<check_box
|
||||
height="19"
|
||||
|
|
@ -1345,6 +1347,7 @@ even though the user gets a free copy.
|
|||
left="10"
|
||||
height="10"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="85" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1353,6 +1356,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="80" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1362,7 +1366,7 @@ even though the user gets a free copy.
|
|||
name="checkbox next owner can transfer"
|
||||
left_pad="0"
|
||||
top_delta="0"
|
||||
tool_tip="Next owner can give away or resell this object"
|
||||
tool_tip="Next owner can give away or resell this object."
|
||||
width="100" />
|
||||
<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above,
|
||||
but that's OK, this is used only for debugging. -->
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<floater
|
||||
legacy_header_height="18"
|
||||
can_resize="true"
|
||||
height="372"
|
||||
height="350"
|
||||
layout="topleft"
|
||||
min_height="300"
|
||||
min_width="545"
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
</floater.string>
|
||||
<floater.string
|
||||
name="top_scripts_text">
|
||||
[COUNT] scripts taking a total of [TIME] ms
|
||||
[COUNT] scripts taking a total of [TIME] ms and using [MEMORY] KB
|
||||
</floater.string>
|
||||
<floater.string
|
||||
name="scripts_score_label">
|
||||
|
|
@ -298,30 +298,6 @@
|
|||
<button.commit_callback
|
||||
function="TopObjects.Profile" />
|
||||
</button>
|
||||
<button
|
||||
follows="bottom|left"
|
||||
height="23"
|
||||
label="Disable Selected"
|
||||
layout="topleft"
|
||||
|
||||
left="5"
|
||||
name="disable_selected_btn"
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
function="TopObjects.DisableSelected" />
|
||||
</button>
|
||||
<button
|
||||
follows="bottom|left"
|
||||
height="23"
|
||||
label="Disable All"
|
||||
layout="topleft"
|
||||
left_pad="10"
|
||||
name="disable_all_btn"
|
||||
top_delta="0"
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
function="TopObjects.DisableAll" />
|
||||
</button>
|
||||
<button
|
||||
enabled_control="UseLSLBridge"
|
||||
follows="bottom|left"
|
||||
|
|
|
|||
|
|
@ -8406,28 +8406,6 @@ Before allowing this access, make sure you know what the object is and why it is
|
|||
</footer>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notify.tga"
|
||||
name="UnknownScriptQuestion"
|
||||
persist="false"
|
||||
type="notify">
|
||||
The runtime script permission requested by '<nolink>[OBJECTNAME]</nolink>', an object owned by '[NAME]', isn't recognized by the viewer and can't be granted.
|
||||
|
||||
To grant this permission please update your viewer to the latest version from [DOWNLOADURL].
|
||||
<tag>confirm</tag>
|
||||
<form name="form">
|
||||
<button
|
||||
default="true"
|
||||
index="1"
|
||||
name="Deny"
|
||||
text="OK"/>
|
||||
<button
|
||||
index="2"
|
||||
name="Mute"
|
||||
text="Block"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notify.tga"
|
||||
name="ScriptDialog"
|
||||
|
|
|
|||
|
|
@ -351,6 +351,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="CheckEveryoneCopy"
|
||||
tool_tip="Anyone can take a copy of the object . Object and all of its contents must be copy and transfer permissive."
|
||||
top_delta="-2"
|
||||
width="150" />
|
||||
<text
|
||||
|
|
@ -394,6 +395,7 @@
|
|||
left="20"
|
||||
top_pad="0"
|
||||
name="CheckNextOwnerModify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
@ -401,6 +403,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="CheckNextOwnerCopy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
@ -408,7 +411,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="CheckNextOwnerTransfer"
|
||||
tool_tip="Next owner can give away or resell this object"
|
||||
tool_tip="Next owner can give away or resell this object."
|
||||
width="106" />
|
||||
</panel>
|
||||
<check_box
|
||||
|
|
|
|||
|
|
@ -355,6 +355,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
top_delta="-2"
|
||||
width="90" />
|
||||
<check_box
|
||||
|
|
@ -362,6 +363,7 @@
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left_pad="0"
|
||||
width="150" />
|
||||
<text
|
||||
|
|
@ -405,6 +407,7 @@
|
|||
left="20"
|
||||
top_pad="0"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
@ -412,6 +415,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
|
|||
|
|
@ -1311,6 +1311,7 @@ even though the user gets a free copy.
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left="10"
|
||||
width="85" />
|
||||
<check_box
|
||||
|
|
@ -1319,6 +1320,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
width="80" />
|
||||
<check_box
|
||||
height="19"
|
||||
|
|
@ -1343,6 +1345,7 @@ even though the user gets a free copy.
|
|||
left="10"
|
||||
height="10"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="85" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1351,6 +1354,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="80" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1360,7 +1364,7 @@ even though the user gets a free copy.
|
|||
name="checkbox next owner can transfer"
|
||||
left_pad="0"
|
||||
top_delta="0"
|
||||
tool_tip="Next owner can give away or resell this object"
|
||||
tool_tip="Next owner can give away or resell this object."
|
||||
width="100" />
|
||||
<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above,
|
||||
but that's OK, this is used only for debugging. -->
|
||||
|
|
|
|||
|
|
@ -354,6 +354,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
top_delta="-2"
|
||||
width="90" />
|
||||
<check_box
|
||||
|
|
@ -361,6 +362,7 @@
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left_pad="0"
|
||||
width="150" />
|
||||
<text
|
||||
|
|
@ -404,6 +406,7 @@
|
|||
left="20"
|
||||
top_pad="0"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
@ -411,6 +414,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
|
|||
|
|
@ -1311,6 +1311,7 @@ even though the user gets a free copy.
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left="10"
|
||||
width="85" />
|
||||
<check_box
|
||||
|
|
@ -1319,6 +1320,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
width="80" />
|
||||
<check_box
|
||||
height="19"
|
||||
|
|
@ -1343,6 +1345,7 @@ even though the user gets a free copy.
|
|||
left="10"
|
||||
height="10"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="85" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1351,6 +1354,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="80" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1360,7 +1364,7 @@ even though the user gets a free copy.
|
|||
name="checkbox next owner can transfer"
|
||||
left_pad="0"
|
||||
top_delta="0"
|
||||
tool_tip="Next owner can give away or resell this object"
|
||||
tool_tip="Next owner can give away or resell this object."
|
||||
width="100" />
|
||||
<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above,
|
||||
but that's OK, this is used only for debugging. -->
|
||||
|
|
|
|||
|
|
@ -354,6 +354,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
top_delta="-2"
|
||||
width="90" />
|
||||
<check_box
|
||||
|
|
@ -361,6 +362,7 @@
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left_pad="0"
|
||||
width="150" />
|
||||
<text
|
||||
|
|
@ -404,6 +406,7 @@
|
|||
left="20"
|
||||
top_pad="0"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
@ -411,6 +414,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
|
|||
|
|
@ -1312,6 +1312,7 @@ even though the user gets a free copy.
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left="10"
|
||||
width="85" />
|
||||
<check_box
|
||||
|
|
@ -1320,6 +1321,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
width="90" />
|
||||
<text
|
||||
type="string"
|
||||
|
|
@ -1337,6 +1339,7 @@ even though the user gets a free copy.
|
|||
left="10"
|
||||
height="10"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="85" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1345,6 +1348,7 @@ even though the user gets a free copy.
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="80" />
|
||||
<check_box
|
||||
follows="left|top|right"
|
||||
|
|
@ -1354,7 +1358,7 @@ even though the user gets a free copy.
|
|||
name="checkbox next owner can transfer"
|
||||
left_pad="0"
|
||||
top_delta="0"
|
||||
tool_tip="Next owner can give away or resell this object"
|
||||
tool_tip="Next owner can give away or resell this object."
|
||||
width="100" />
|
||||
<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above,
|
||||
but that's OK, this is used only for debugging. -->
|
||||
|
|
|
|||
|
|
@ -355,6 +355,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox allow everyone copy"
|
||||
tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive."
|
||||
top_delta="-2"
|
||||
width="90" />
|
||||
<check_box
|
||||
|
|
@ -362,6 +363,7 @@
|
|||
label="Move"
|
||||
layout="topleft"
|
||||
name="checkbox allow everyone move"
|
||||
tool_tip="Anyone can move the object."
|
||||
left_pad="0"
|
||||
width="150" />
|
||||
<text
|
||||
|
|
@ -405,6 +407,7 @@
|
|||
left="20"
|
||||
top_pad="0"
|
||||
name="checkbox next owner can modify"
|
||||
tool_tip="Next owner can edit properties like item name or scale of this object."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
@ -412,6 +415,7 @@
|
|||
layout="topleft"
|
||||
left_pad="0"
|
||||
name="checkbox next owner can copy"
|
||||
tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
|
||||
width="90" />
|
||||
<check_box
|
||||
height="18"
|
||||
|
|
|
|||
Loading…
Reference in New Issue