Merge branch 'develop' of https://github.com/secondlife/viewer
# Conflicts: # indra/newview/llinventorybridge.cpp # indra/newview/llinventoryfilter.cpp # indra/newview/llpanelmaininventory.cpp # indra/newview/llpanelobjectinventory.cpp # indra/newview/llviewerregion.cpp # indra/newview/llworldmapview.cpp # indra/newview/skins/default/xui/en/floater_tools.xml # indra/newview/skins/default/xui/en/menu_viewer.xmlmaster
commit
64b6587eec
|
|
@ -226,7 +226,7 @@ bool LLApp::parseCommandOptions(int argc, wchar_t** wargv)
|
|||
if(wargv[ii][0] != '-')
|
||||
{
|
||||
LL_INFOS() << "Did not find option identifier while parsing token: "
|
||||
<< wargv[ii] << LL_ENDL;
|
||||
<< (intptr_t)wargv[ii] << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
int offset = 1;
|
||||
|
|
|
|||
|
|
@ -89,10 +89,10 @@ private:
|
|||
}
|
||||
// Given arbitrary CALLABLE, which might be a lambda, how are we
|
||||
// supposed to obtain its signature for std::packaged_task? It seems
|
||||
// redundant to have to add an argument list to engage result_of, then
|
||||
// redundant to have to add an argument list to engage invoke_result_t, then
|
||||
// add the argument list again to complete the signature. At least we
|
||||
// only support a nullary CALLABLE.
|
||||
std::packaged_task<typename std::result_of<CALLABLE()>::type()> mTask;
|
||||
std::packaged_task<std::invoke_result_t<CALLABLE>()> mTask;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -418,6 +418,17 @@ private:
|
|||
bool mStayUnique;
|
||||
};
|
||||
|
||||
template<typename Type>
|
||||
bool operator!=(Type* lhs, const LLPointer<Type>& rhs)
|
||||
{
|
||||
return (lhs != rhs.get());
|
||||
}
|
||||
|
||||
template<typename Type>
|
||||
bool operator==(Type* lhs, const LLPointer<Type>& rhs)
|
||||
{
|
||||
return (lhs == rhs.get());
|
||||
}
|
||||
|
||||
// boost hash adapter
|
||||
template <class Type>
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ namespace LLPredicate
|
|||
Rule()
|
||||
{}
|
||||
|
||||
void require(ENUM e, bool match)
|
||||
void mandate(ENUM e, bool match)
|
||||
{
|
||||
mRule.set(e, match);
|
||||
}
|
||||
|
|
@ -154,7 +154,7 @@ namespace LLPredicate
|
|||
return (mRule && value).someSet();
|
||||
}
|
||||
|
||||
bool requires(const Value<ENUM> value) const
|
||||
bool mandates(const Value<ENUM> value) const
|
||||
{
|
||||
return (mRule && value).someSet() && (!mRule && value).noneSet();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ namespace tut
|
|||
op->setReplyPath(LLCore::HttpOperation::HttpReplyQueuePtr_t(), h1);
|
||||
|
||||
// Check ref count
|
||||
ensure(op.unique() == 1);
|
||||
ensure(op.use_count() == 1);
|
||||
|
||||
// release the reference, releasing the operation but
|
||||
// not the handlers.
|
||||
|
|
|
|||
|
|
@ -281,7 +281,7 @@ S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 r
|
|||
S32 height = (h > 0) ? h : 2048;
|
||||
S32 max_dimension = llmax(width, height); // Find largest dimension
|
||||
S32 block_area = MAX_BLOCK_SIZE * MAX_BLOCK_SIZE; // Calculated initial block area from established max block size (currently 64)
|
||||
block_area *= (max_dimension / MAX_BLOCK_SIZE / max_components); // Adjust initial block area by ratio of largest dimension to block size per component
|
||||
block_area *= llmax((max_dimension / MAX_BLOCK_SIZE / max_components), 1); // Adjust initial block area by ratio of largest dimension to block size per component
|
||||
S32 totalbytes = (S32) (block_area * max_components * precision); // First block layer computed before loop without compression rate
|
||||
S32 block_layers = 1; // Start at layer 1 since first block layer is computed outside loop
|
||||
while (block_layers < 6) // Walk five layers for the five discards in JPEG2000
|
||||
|
|
|
|||
|
|
@ -326,6 +326,7 @@ void LLFolderViewItem::refresh()
|
|||
LLFolderViewModelItem& vmi = *getViewModelItem();
|
||||
|
||||
mLabel = utf8str_to_wstring(vmi.getDisplayName());
|
||||
mLabelFontBuffer.reset();
|
||||
setToolTip(vmi.getName());
|
||||
// icons are slightly expensive to get, can be optimized
|
||||
// see LLInventoryIcon::getIcon()
|
||||
|
|
@ -339,6 +340,7 @@ void LLFolderViewItem::refresh()
|
|||
// Can do a number of expensive checks, like checking active motions, wearables or friend list
|
||||
mLabelStyle = vmi.getLabelStyle();
|
||||
mLabelSuffix = utf8str_to_wstring(vmi.getLabelSuffix());
|
||||
mSuffixFontBuffer.reset();
|
||||
}
|
||||
|
||||
// Dirty the filter flag of the model from the view (CHUI-849)
|
||||
|
|
@ -844,8 +846,9 @@ void LLFolderViewItem::drawOpenFolderArrow(const Params& default_params, const L
|
|||
return mIsItemCut;
|
||||
}
|
||||
|
||||
void LLFolderViewItem::drawHighlight(const bool showContent, const bool hasKeyboardFocus, const LLUIColor &selectColor, const LLUIColor &flashColor,
|
||||
const LLUIColor &focusOutlineColor, const LLUIColor &mouseOverColor)
|
||||
void LLFolderViewItem::drawHighlight(bool showContent, bool hasKeyboardFocus,
|
||||
const LLUIColor& selectColor, const LLUIColor& flashColor,
|
||||
const LLUIColor& focusOutlineColor, const LLUIColor& mouseOverColor)
|
||||
{
|
||||
const S32 focus_top = getRect().getHeight();
|
||||
const S32 focus_bottom = getRect().getHeight() - mItemHeight;
|
||||
|
|
@ -853,7 +856,7 @@ void LLFolderViewItem::drawHighlight(const bool showContent, const bool hasKeybo
|
|||
const S32 FOCUS_LEFT = 1;
|
||||
|
||||
// Determine which background color to use for highlighting
|
||||
const LLUIColor& bgColor = (isFlashing() ? flashColor : selectColor);
|
||||
const LLUIColor& bgColor = isFlashing() ? flashColor : selectColor;
|
||||
|
||||
//--------------------------------------------------------------------------------//
|
||||
// Draw highlight for selected items
|
||||
|
|
@ -861,7 +864,6 @@ void LLFolderViewItem::drawHighlight(const bool showContent, const bool hasKeybo
|
|||
// items if mShowSingleSelection is false.
|
||||
//
|
||||
if (isHighlightAllowed())
|
||||
|
||||
{
|
||||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
|
||||
|
|
@ -870,7 +872,7 @@ void LLFolderViewItem::drawHighlight(const bool showContent, const bool hasKeybo
|
|||
{
|
||||
LLColor4 bg_color = bgColor;
|
||||
// do time-based fade of extra objects
|
||||
F32 fade_time = (getRoot() ? getRoot()->getSelectionFadeElapsedTime() : 0.0f);
|
||||
F32 fade_time = getRoot() ? getRoot()->getSelectionFadeElapsedTime() : 0.f;
|
||||
if (getRoot() && getRoot()->getShowSingleSelection())
|
||||
{
|
||||
// fading out
|
||||
|
|
@ -959,7 +961,7 @@ void LLFolderViewItem::drawLabel(const LLFontGL * font, const F32 x, const F32 y
|
|||
//--------------------------------------------------------------------------------//
|
||||
// Draw the actual label text
|
||||
//
|
||||
font->render(mLabel, 0, x, y, color,
|
||||
mLabelFontBuffer.render(font, mLabel, 0, x, y, color,
|
||||
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
|
||||
S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, /*use_ellipses*/true);
|
||||
}
|
||||
|
|
@ -978,7 +980,7 @@ void LLFolderViewItem::draw()
|
|||
|
||||
getViewModelItem()->update();
|
||||
|
||||
if(!mSingleFolderMode)
|
||||
if (!mSingleFolderMode)
|
||||
{
|
||||
drawOpenFolderArrow(default_params, sFgColor);
|
||||
}
|
||||
|
|
@ -1011,7 +1013,7 @@ void LLFolderViewItem::draw()
|
|||
return;
|
||||
}
|
||||
|
||||
auto filter_string_length = mViewModelItem->hasFilterStringMatch() ? static_cast<S32>(mViewModelItem->getFilterStringSize()) : 0;
|
||||
S32 filter_string_length = mViewModelItem->hasFilterStringMatch() ? (S32)mViewModelItem->getFilterStringSize() : 0;
|
||||
F32 right_x = 0;
|
||||
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
|
||||
F32 text_left = (F32)getLabelXPos();
|
||||
|
|
@ -1090,9 +1092,9 @@ void LLFolderViewItem::draw()
|
|||
//
|
||||
if (!mLabelSuffix.empty())
|
||||
{
|
||||
suffix_font->render( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : sSuffixColor.get(),
|
||||
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
|
||||
S32_MAX, S32_MAX, &right_x);
|
||||
mSuffixFontBuffer.render(suffix_font, mLabelSuffix, 0, right_x, y, isFadeItem() ? color : sSuffixColor.get(),
|
||||
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
|
||||
S32_MAX, S32_MAX, &right_x);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------//
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "llflashtimer.h"
|
||||
#include "llview.h"
|
||||
#include "lluiimage.h"
|
||||
#include "llfontvertexbuffer.h"
|
||||
|
||||
class LLFolderView;
|
||||
class LLFolderViewModelItem;
|
||||
|
|
@ -307,8 +308,8 @@ public:
|
|||
// virtual void handleDropped();
|
||||
virtual void draw();
|
||||
void drawOpenFolderArrow(const Params& default_params, const LLUIColor& fg_color);
|
||||
void drawHighlight(const bool showContent, const bool hasKeyboardFocus, const LLUIColor &selectColor, const LLUIColor &flashColor, const LLUIColor &outlineColor, const LLUIColor &mouseOverColor);
|
||||
void drawLabel(const LLFontGL * font, const F32 x, const F32 y, const LLColor4& color, F32 &right_x);
|
||||
void drawHighlight(bool showContent, bool hasKeyboardFocus, const LLUIColor& selectColor, const LLUIColor& flashColor, const LLUIColor& outlineColor, const LLUIColor& mouseOverColor);
|
||||
void drawLabel(const LLFontGL* font, const F32 x, const F32 y, const LLColor4& color, F32 &right_x);
|
||||
virtual bool handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
|
||||
EDragAndDropType cargo_type,
|
||||
void* cargo_data,
|
||||
|
|
@ -322,6 +323,9 @@ public:
|
|||
|
||||
private:
|
||||
static std::map<U8, LLFontGL*> sFonts; // map of styles to fonts
|
||||
|
||||
LLFontVertexBuffer mLabelFontBuffer;
|
||||
LLFontVertexBuffer mSuffixFontBuffer;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
|
|||
|
|
@ -302,6 +302,7 @@ public:
|
|||
dirtyFilter();
|
||||
requestSort();
|
||||
}
|
||||
|
||||
virtual void removeChild(LLFolderViewModelItem* child)
|
||||
{
|
||||
mChildren.remove(child);
|
||||
|
|
|
|||
|
|
@ -3695,7 +3695,6 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
|
||||
const LLWString& text = getWText();
|
||||
S32 text_gen = mEditor.getTextGeneration();
|
||||
bool is_text_read_only = mEditor.getReadOnly();
|
||||
|
||||
if (text_gen != mLastGeneration)
|
||||
{
|
||||
|
|
@ -3707,8 +3706,8 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
}
|
||||
|
||||
const LLFontGL* font = mStyle->getFont();
|
||||
|
||||
LLColor4 color = (is_text_read_only ? mStyle->getReadOnlyColor() : mStyle->getColor()) % (alpha * mStyle->getAlpha());
|
||||
LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % (alpha * mStyle->getAlpha());
|
||||
bool use_font_buffers = useFontBuffers();
|
||||
|
||||
if( selection_start > seg_start )
|
||||
{
|
||||
|
|
@ -3716,7 +3715,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
S32 start = seg_start;
|
||||
S32 end = llmin( selection_start, seg_end );
|
||||
S32 length = end - start;
|
||||
if (is_text_read_only)
|
||||
if (use_font_buffers)
|
||||
{
|
||||
mFontBufferPreSelection.render(
|
||||
font,
|
||||
|
|
@ -3760,7 +3759,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
S32 end = llmin( selection_end, seg_end );
|
||||
S32 length = end - start;
|
||||
|
||||
if (is_text_read_only)
|
||||
if (use_font_buffers)
|
||||
{
|
||||
mFontBufferSelection.render(
|
||||
font,
|
||||
|
|
@ -3797,7 +3796,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
|
|||
S32 start = llmax( selection_end, seg_start );
|
||||
S32 end = seg_end;
|
||||
S32 length = end - start;
|
||||
if (is_text_read_only)
|
||||
if (use_font_buffers)
|
||||
{
|
||||
mFontBufferPostSelection.render(
|
||||
font,
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ public:
|
|||
/*virtual*/ bool handleToolTip(S32 x, S32 y, MASK mask);
|
||||
|
||||
protected:
|
||||
virtual bool useFontBuffers() const { return true; }
|
||||
F32 drawClippedSegment(S32 seg_start, S32 seg_end, S32 selection_start, S32 selection_end, LLRectf rect);
|
||||
|
||||
virtual const LLWString& getWText() const;
|
||||
|
|
@ -511,7 +512,7 @@ public:
|
|||
LLRect getDocRectFromDocIndex(S32 pos) const;
|
||||
|
||||
void setReadOnly(bool read_only) { mReadOnly = read_only; }
|
||||
bool getReadOnly() { return mReadOnly; }
|
||||
bool getReadOnly() const { return mReadOnly; }
|
||||
|
||||
void setSkipLinkUnderline(bool skip_link_underline) { mSkipLinkUnderline = skip_link_underline; }
|
||||
bool getSkipLinkUnderline() { return mSkipLinkUnderline; }
|
||||
|
|
|
|||
|
|
@ -286,6 +286,8 @@ protected:
|
|||
virtual bool getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect *bounds, LLRect *control) const;
|
||||
virtual S32 getPreeditFontSize() const;
|
||||
virtual LLWString getPreeditString() const { return getWText(); }
|
||||
|
||||
virtual bool useFontBuffers() const { return getReadOnly(); }
|
||||
//
|
||||
// Protected data
|
||||
//
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ void LLViewerEventRecorder::logKeyUnicodeEvent(llwchar uni_char) {
|
|||
|
||||
event.insert("event",LLSD("keyDown"));
|
||||
|
||||
LL_DEBUGS() << "[VITA] unicode key: " << uni_char << LL_ENDL;
|
||||
LL_DEBUGS() << "[VITA] unicode key: " << (int)uni_char << LL_ENDL;
|
||||
LL_DEBUGS() << "[VITA] dumpxml " << LLSDXMLStreamer(event) << "\n" << LL_ENDL;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -391,6 +391,20 @@ bool LLAgent::isMicrophoneOn(const LLSD& sdname)
|
|||
return LLVoiceClient::getInstance()->getUserPTTState();
|
||||
}
|
||||
|
||||
//static
|
||||
void LLAgent::toggleHearMediaSoundFromAvatar()
|
||||
{
|
||||
const S32 mediaSoundsEarLocation = gSavedSettings.getS32("MediaSoundsEarLocation");
|
||||
gSavedSettings.setS32("MediaSoundsEarLocation", !mediaSoundsEarLocation);
|
||||
}
|
||||
|
||||
//static
|
||||
void LLAgent::toggleHearVoiceFromAvatar()
|
||||
{
|
||||
const S32 voiceEarLocation = gSavedSettings.getS32("VoiceEarLocation");
|
||||
gSavedSettings.setS32("VoiceEarLocation", !voiceEarLocation);
|
||||
}
|
||||
|
||||
// ************************************************************
|
||||
// Enabled this definition to compile a 'hacked' viewer that
|
||||
// locally believes the end user has godlike powers.
|
||||
|
|
|
|||
|
|
@ -396,6 +396,13 @@ public:
|
|||
private:
|
||||
bool mVoiceConnected;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Sound
|
||||
//--------------------------------------------------------------------
|
||||
public:
|
||||
static void toggleHearMediaSoundFromAvatar();
|
||||
static void toggleHearVoiceFromAvatar();
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Chat
|
||||
//--------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -321,10 +321,7 @@ static void on_avatar_name_cache_start_call(const LLUUID& agent_id,
|
|||
{
|
||||
std::string name = av_name.getDisplayName();
|
||||
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, agent_id, LLSD());
|
||||
if (session_id != LLUUID::null)
|
||||
{
|
||||
gIMMgr->startCall(session_id);
|
||||
}
|
||||
gIMMgr->autoStartCallOnStartup(session_id);
|
||||
make_ui_sound("UISndStartIM");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,8 +29,6 @@
|
|||
|
||||
#include "lldeferredsounds.h"
|
||||
|
||||
#include "llaudioengine.h"
|
||||
|
||||
void LLDeferredSounds::deferSound(SoundData& sound)
|
||||
{
|
||||
soundVector.push_back(sound);
|
||||
|
|
|
|||
|
|
@ -28,8 +28,7 @@
|
|||
#define LL_LLDEFERREDSOUNDS_H
|
||||
|
||||
#include "llsingleton.h"
|
||||
|
||||
struct SoundData;
|
||||
#include "llaudioengine.h"
|
||||
|
||||
class LLDeferredSounds : public LLSingleton<LLDeferredSounds>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -785,7 +785,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, bool depth_only, bool rigged)
|
|||
|
||||
if (current_shader)
|
||||
{
|
||||
current_shader->uniform4f(LLShaderMgr::SPECULAR_COLOR, spec_color.mV[0], spec_color.mV[1], spec_color.mV[2], spec_color.mV[3]);
|
||||
current_shader->uniform4f(LLShaderMgr::SPECULAR_COLOR, spec_color.mV[VRED], spec_color.mV[VGREEN], spec_color.mV[VBLUE], spec_color.mV[VALPHA]);
|
||||
current_shader->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, env_intensity);
|
||||
current_shader->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, brightness);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -310,6 +310,9 @@ bool LLFloaterIMContainer::postBuild()
|
|||
mParticipantRefreshTimer.setTimerExpirySec(0);
|
||||
mParticipantRefreshTimer.start();
|
||||
|
||||
mGeneralTitleInUse = true; // avoid reseting strings on idle
|
||||
setTitle(mGeneralTitle);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -525,7 +528,12 @@ void LLFloaterIMContainer::idleUpdate()
|
|||
|
||||
// Update floater's title as required by the currently selected session or use the default title
|
||||
LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID());
|
||||
setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle);
|
||||
bool needs_override = conversation_floaterp && conversation_floaterp->needsTitleOverwrite();
|
||||
if (mGeneralTitleInUse == needs_override)
|
||||
{
|
||||
mGeneralTitleInUse = !needs_override;
|
||||
setTitle(needs_override ? conversation_floaterp->getTitle() : mGeneralTitle);
|
||||
}
|
||||
}
|
||||
|
||||
mParticipantRefreshTimer.setTimerExpirySec(1.0f);
|
||||
|
|
|
|||
|
|
@ -236,6 +236,7 @@ private:
|
|||
conversations_items_deque mConversationEventQueue;
|
||||
|
||||
LLTimer mParticipantRefreshTimer;
|
||||
bool mGeneralTitleInUse = true;
|
||||
};
|
||||
|
||||
#endif // LL_LLFLOATERIMCONTAINER_H
|
||||
|
|
|
|||
|
|
@ -1966,8 +1966,8 @@ void LLFloaterWorldMap::onCommitSearchResult()
|
|||
}
|
||||
LLStringUtil::toLower(sim_name);
|
||||
|
||||
std::map<U64, LLSimInfo*>::const_iterator it;
|
||||
for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
|
||||
LLWorldMap::sim_info_map_t::const_iterator end = LLWorldMap::instance().getRegionMap().end();
|
||||
for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); it != end; ++it)
|
||||
{
|
||||
LLSimInfo* info = it->second;
|
||||
|
||||
|
|
|
|||
|
|
@ -234,7 +234,7 @@ bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* ite
|
|||
return continue_filtering;
|
||||
}
|
||||
|
||||
bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
|
||||
bool LLFolderViewModelItemInventory::filter(LLFolderViewFilter& filter)
|
||||
{
|
||||
const S32 filter_generation = filter.getCurrentGeneration();
|
||||
const S32 must_pass_generation = filter.getFirstRequiredGeneration();
|
||||
|
|
|
|||
|
|
@ -2048,20 +2048,24 @@ void LLItemBridge::selectItem()
|
|||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLItemBridge::restoreItem()
|
||||
{
|
||||
LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
|
||||
if(item)
|
||||
if (LLViewerInventoryItem* item = getItem())
|
||||
{
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
bool is_snapshot = (item->getInventoryType() == LLInventoryType::IT_SNAPSHOT);
|
||||
bool is_snapshot = item->getInventoryType() == LLInventoryType::IT_SNAPSHOT;
|
||||
LLFolderType::EType preferred_type = is_snapshot ?
|
||||
LLFolderType::FT_SNAPSHOT_CATEGORY :
|
||||
LLFolderType::assetTypeToFolderType(item->getType());
|
||||
|
||||
const LLUUID new_parent = model->findCategoryUUIDForType(is_snapshot? LLFolderType::FT_SNAPSHOT_CATEGORY : LLFolderType::assetTypeToFolderType(item->getType()));
|
||||
// do not restamp on restore.
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
LLUUID new_parent = model->findCategoryUUIDForType(preferred_type);
|
||||
// Do not restamp on restore.
|
||||
LLInvFVBridge::changeItemParent(model, item, new_parent, false);
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLItemBridge::restoreToWorld()
|
||||
{
|
||||
//Similar functionality to the drag and drop rez logic
|
||||
|
|
@ -2129,26 +2133,27 @@ void LLItemBridge::restoreToWorld()
|
|||
|
||||
//remove local inventory copy, sim will deal with permissions and removing the item
|
||||
//from the actual inventory if its a no-copy etc
|
||||
if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
|
||||
if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
|
||||
{
|
||||
remove_from_inventory = true;
|
||||
}
|
||||
|
||||
// Check if it's in the trash. (again similar to the normal rez logic)
|
||||
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
|
||||
if (gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
|
||||
{
|
||||
remove_from_inventory = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(remove_from_inventory)
|
||||
if (remove_from_inventory)
|
||||
{
|
||||
gInventory.deleteObject(itemp->getUUID());
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLItemBridge::gotoItem()
|
||||
{
|
||||
LLInventoryObject *obj = getInventoryObject();
|
||||
|
|
@ -2158,39 +2163,43 @@ void LLItemBridge::gotoItem()
|
|||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
LLUIImagePtr LLItemBridge::getIcon() const
|
||||
{
|
||||
LLInventoryObject *obj = getInventoryObject();
|
||||
if (obj)
|
||||
if (LLInventoryObject* obj = getInventoryObject())
|
||||
{
|
||||
return LLInventoryIcon::getIcon(obj->getType(),
|
||||
LLInventoryType::IT_NONE,
|
||||
mIsLink);
|
||||
return LLInventoryIcon::getIcon(obj->getType(), LLInventoryType::IT_NONE, mIsLink);
|
||||
}
|
||||
|
||||
return LLInventoryIcon::getIcon(LLInventoryType::ICONNAME_OBJECT);
|
||||
}
|
||||
|
||||
// virtual
|
||||
LLUIImagePtr LLItemBridge::getIconOverlay() const
|
||||
{
|
||||
if (getItem() && getItem()->getIsLinkType())
|
||||
{
|
||||
return LLUI::getUIImage("Inv_Link");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// virtual
|
||||
PermissionMask LLItemBridge::getPermissionMask() const
|
||||
{
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
PermissionMask perm_mask = 0;
|
||||
if (item) perm_mask = item->getPermissionMask();
|
||||
return perm_mask;
|
||||
if (LLViewerInventoryItem* item = getItem())
|
||||
{
|
||||
return item->getPermissionMask();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLItemBridge::buildDisplayName() const
|
||||
{
|
||||
if(getItem())
|
||||
if (getItem())
|
||||
{
|
||||
mDisplayName.assign(getItem()->getName());
|
||||
}
|
||||
|
|
@ -2203,14 +2212,15 @@ void LLItemBridge::buildDisplayName() const
|
|||
mSearchableName.append(getLabelSuffix());
|
||||
LLStringUtil::toUpper(mSearchableName);
|
||||
|
||||
//Name set, so trigger a sort
|
||||
// Name set, so trigger a sort
|
||||
LLInventorySort sorter = static_cast<LLFolderViewModelInventory&>(mRootViewModel).getSorter();
|
||||
if(mParent && !sorter.isByDate())
|
||||
if (mParent && !sorter.isByDate())
|
||||
{
|
||||
mParent->requestSort();
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
|
||||
{
|
||||
U8 font = LLFontGL::NORMAL;
|
||||
|
|
@ -2221,7 +2231,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
|
|||
// LL_INFOS() << "BOLD" << LL_ENDL;
|
||||
font |= LLFontGL::BOLD;
|
||||
}
|
||||
else if(item && item->getIsLinkType())
|
||||
else if (item && item->getIsLinkType())
|
||||
{
|
||||
font |= LLFontGL::ITALIC;
|
||||
}
|
||||
|
|
@ -2229,6 +2239,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
|
|||
return (LLFontGL::StyleFlags)font;
|
||||
}
|
||||
|
||||
// virtual
|
||||
std::string LLItemBridge::getLabelSuffix() const
|
||||
{
|
||||
// String table is loaded before login screen and inventory items are
|
||||
|
|
@ -2243,19 +2254,19 @@ std::string LLItemBridge::getLabelSuffix() const
|
|||
// </FS:Ansariel>
|
||||
static std::string LINK = LLTrans::getString("link");
|
||||
static std::string BROKEN_LINK = LLTrans::getString("broken_link");
|
||||
|
||||
std::string suffix;
|
||||
LLInventoryItem* item = getItem();
|
||||
if(item)
|
||||
if (LLInventoryItem* item = getItem())
|
||||
{
|
||||
// Any type can have the link suffix...
|
||||
bool broken_link = LLAssetType::lookupIsLinkType(item->getType());
|
||||
if (broken_link) return BROKEN_LINK;
|
||||
if (LLAssetType::lookupIsLinkType(item->getType()))
|
||||
return BROKEN_LINK;
|
||||
|
||||
bool link = item->getIsLinkType();
|
||||
if (link) return LINK;
|
||||
if (item->getIsLinkType())
|
||||
return LINK;
|
||||
|
||||
// ...but it's a bit confusing to put nocopy/nomod/etc suffixes on calling cards.
|
||||
if(LLAssetType::AT_CALLINGCARD != item->getType()
|
||||
if (LLAssetType::AT_CALLINGCARD != item->getType()
|
||||
&& item->getPermissions().getOwner() == gAgent.getID())
|
||||
{
|
||||
bool copy = item->getPermissions().allowCopyBy(gAgent.getID());
|
||||
|
|
@ -2270,8 +2281,7 @@ std::string LLItemBridge::getLabelSuffix() const
|
|||
//suffix += suffix.empty() ? " " : ","; // <FS:Ansariel> Keep it the old way please
|
||||
suffix += NO_MOD;
|
||||
}
|
||||
bool xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
|
||||
gAgent.getID());
|
||||
bool xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
|
||||
if (!xfer)
|
||||
{
|
||||
//suffix += suffix.empty() ? " " : ","; // <FS:Ansariel> Keep it the old way please
|
||||
|
|
@ -2279,24 +2289,25 @@ std::string LLItemBridge::getLabelSuffix() const
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
return suffix;
|
||||
}
|
||||
|
||||
// virtual
|
||||
time_t LLItemBridge::getCreationDate() const
|
||||
{
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if (item)
|
||||
if (LLViewerInventoryItem* item = getItem())
|
||||
{
|
||||
return item->getCreationDate();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
bool LLItemBridge::isItemRenameable() const
|
||||
{
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if(item)
|
||||
if (LLViewerInventoryItem* item = getItem())
|
||||
{
|
||||
// (For now) Don't allow calling card rename since that may confuse users as to
|
||||
// what the calling card points to.
|
||||
|
|
@ -2322,50 +2333,62 @@ bool LLItemBridge::isItemRenameable() const
|
|||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
return (item->getPermissions().allowModifyBy(gAgent.getID()));
|
||||
return item->getPermissions().allowModifyBy(gAgent.getID());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool LLItemBridge::renameItem(const std::string& new_name)
|
||||
{
|
||||
if(!isItemRenameable())
|
||||
if (!isItemRenameable())
|
||||
return false;
|
||||
|
||||
LLPreview::dirty(mUUID);
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
if(!model)
|
||||
if (!model)
|
||||
return false;
|
||||
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if(item && (item->getName() != new_name))
|
||||
if (item && (item->getName() != new_name))
|
||||
{
|
||||
LLSD updates;
|
||||
updates["name"] = new_name;
|
||||
update_inventory_item(item->getUUID(),updates, NULL);
|
||||
}
|
||||
// return false because we either notified observers (& therefore
|
||||
// rebuilt) or we didn't update.
|
||||
|
||||
// return false because we either notified observers
|
||||
// (& therefore rebuilt) or we didn't update.
|
||||
return false;
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool LLItemBridge::removeItem()
|
||||
{
|
||||
if(!isItemRemovable())
|
||||
if (!isItemRemovable())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// move it to the trash
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
if(!model) return false;
|
||||
if (!model)
|
||||
return false;
|
||||
|
||||
const LLUUID& trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if (!item) return false;
|
||||
if (!item)
|
||||
return false;
|
||||
|
||||
if (item->getType() != LLAssetType::AT_LSL_TEXT)
|
||||
{
|
||||
LLPreview::hide(mUUID, true);
|
||||
}
|
||||
|
||||
// Already in trash
|
||||
if (model->isObjectDescendentOf(mUUID, trash_id)) return false;
|
||||
if (model->isObjectDescendentOf(mUUID, trash_id))
|
||||
return false;
|
||||
|
||||
LLNotification::Params params("ConfirmItemDeleteHasLinks");
|
||||
params.functor.function(boost::bind(&LLItemBridge::confirmRemoveItem, this, _1, _2));
|
||||
|
|
@ -2400,26 +2423,31 @@ bool LLItemBridge::removeItem()
|
|||
bool LLItemBridge::confirmRemoveItem(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (option != 0) return false;
|
||||
if (option != 0)
|
||||
return false;
|
||||
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
if (!model) return false;
|
||||
if (!model)
|
||||
return false;
|
||||
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if (!item) return false;
|
||||
if (!item)
|
||||
return false;
|
||||
|
||||
const LLUUID& trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
// if item is not already in trash
|
||||
if(item && !model->isObjectDescendentOf(mUUID, trash_id))
|
||||
if (item && !model->isObjectDescendentOf(mUUID, trash_id))
|
||||
{
|
||||
// move to trash, and restamp
|
||||
LLInvFVBridge::changeItemParent(model, item, trash_id, true);
|
||||
// delete was successful
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool LLItemBridge::isItemCopyable(bool can_copy_as_link) const
|
||||
{
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
|
|
@ -2427,6 +2455,7 @@ bool LLItemBridge::isItemCopyable(bool can_copy_as_link) const
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
// Can't copy worn objects.
|
||||
// Worn objects are tied to their inworld conterparts
|
||||
|
|
@ -2469,37 +2498,36 @@ bool LLItemBridge::isItemLinkable() const
|
|||
|
||||
LLViewerInventoryItem* LLItemBridge::getItem() const
|
||||
{
|
||||
LLViewerInventoryItem* item = NULL;
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
if(model)
|
||||
if (LLInventoryModel* model = getInventoryModel())
|
||||
{
|
||||
item = (LLViewerInventoryItem*)model->getItem(mUUID);
|
||||
return model->getItem(mUUID);
|
||||
}
|
||||
return item;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// virtual
|
||||
const LLUUID& LLItemBridge::getThumbnailUUID() const
|
||||
{
|
||||
LLViewerInventoryItem* item = NULL;
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
if(model)
|
||||
if (LLInventoryModel* model = getInventoryModel())
|
||||
{
|
||||
item = (LLViewerInventoryItem*)model->getItem(mUUID);
|
||||
}
|
||||
if (item)
|
||||
{
|
||||
return item->getThumbnailUUID();
|
||||
if (LLViewerInventoryItem* item = model->getItem(mUUID))
|
||||
{
|
||||
return item->getThumbnailUUID();
|
||||
}
|
||||
}
|
||||
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool LLItemBridge::isItemPermissive() const
|
||||
{
|
||||
LLViewerInventoryItem* item = getItem();
|
||||
if(item)
|
||||
if (LLViewerInventoryItem* item = getItem())
|
||||
{
|
||||
return item->getIsFullPerm();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -2858,19 +2886,25 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
|
|||
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
|
||||
if (!inv_cat) return false; // shouldn't happen, but in case item is incorrectly parented in which case inv_cat will be NULL
|
||||
if (!model) return false;
|
||||
if (!isAgentAvatarValid()) return false;
|
||||
if (!isAgentInventory()) return false; // cannot drag categories into library
|
||||
if (!inv_cat) // shouldn't happen, but in case item is incorrectly parented in which case inv_cat will be NULL
|
||||
return false;
|
||||
if (!model)
|
||||
return false;
|
||||
if (!isAgentAvatarValid())
|
||||
return false;
|
||||
if (!isAgentInventory())
|
||||
return false; // cannot drag categories into library
|
||||
// <FS:TT> Client LSL Bridge (also for #AO)
|
||||
if (isLockedFolder()) return false;
|
||||
// </FS:TT>
|
||||
|
||||
LLInventoryPanel* destination_panel = mInventoryPanel.get();
|
||||
if (!destination_panel) return false;
|
||||
if (!destination_panel)
|
||||
return false;
|
||||
|
||||
LLInventoryFilter* filter = getInventoryFilter();
|
||||
if (!filter) return false;
|
||||
if (!filter)
|
||||
return false;
|
||||
|
||||
const LLUUID &cat_id = inv_cat->getUUID();
|
||||
const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
|
|
@ -2967,7 +3001,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
|
|||
is_movable = false;
|
||||
}
|
||||
}
|
||||
if(is_movable && move_is_into_current_outfit && is_link)
|
||||
if (is_movable && move_is_into_current_outfit && is_link)
|
||||
{
|
||||
is_movable = false;
|
||||
}
|
||||
|
|
@ -2995,7 +3029,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
|
|||
for (S32 i=0; i < descendent_categories.size(); ++i)
|
||||
{
|
||||
LLInventoryCategory* category = descendent_categories[i];
|
||||
if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
|
||||
if (LLFolderType::lookupIsProtectedType(category->getPreferredType()))
|
||||
{
|
||||
// Can't move "special folders" (e.g. Textures Folder).
|
||||
is_movable = false;
|
||||
|
|
@ -3027,9 +3061,8 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
|
|||
}
|
||||
if (is_movable && move_is_into_trash)
|
||||
{
|
||||
for (S32 i=0; i < descendent_items.size(); ++i)
|
||||
for (LLViewerInventoryItem* item : descendent_items)
|
||||
{
|
||||
LLInventoryItem* item = descendent_items[i];
|
||||
if (get_is_item_worn(item->getUUID()))
|
||||
{
|
||||
is_movable = false;
|
||||
|
|
@ -3040,10 +3073,8 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
|
|||
// <FS:Ansariel> FIRE-1392: Allow dragging all asset types into Landmarks folder
|
||||
//if (is_movable && move_is_into_landmarks)
|
||||
//{
|
||||
// for (S32 i=0; i < descendent_items.size(); ++i)
|
||||
// for (LLViewerInventoryItem* item : descendent_items)
|
||||
// {
|
||||
// LLViewerInventoryItem* item = descendent_items[i];
|
||||
|
||||
// // Don't move anything except landmarks and categories into Landmarks folder.
|
||||
// // We use getType() instead of getActua;Type() to allow links to landmarks and folders.
|
||||
// if (LLAssetType::AT_LANDMARK != item->getType() && LLAssetType::AT_CATEGORY != item->getType())
|
||||
|
|
@ -3344,7 +3375,7 @@ bool move_inv_category_world_to_agent(const LLUUID& object_id,
|
|||
// permissions.
|
||||
// content category has same ID as object itself
|
||||
LLViewerObject* object = gObjectList.findObject(object_id);
|
||||
if(!object)
|
||||
if (!object)
|
||||
{
|
||||
LL_INFOS() << "Object not found for drop." << LL_ENDL;
|
||||
return false;
|
||||
|
|
@ -3372,11 +3403,9 @@ bool move_inv_category_world_to_agent(const LLUUID& object_id,
|
|||
|
||||
// coming from a task. Need to figure out if the person can
|
||||
// move/copy this item.
|
||||
LLInventoryObject::object_list_t::iterator it = inventory_objects.begin();
|
||||
LLInventoryObject::object_list_t::iterator end = inventory_objects.end();
|
||||
for ( ; it != end; ++it)
|
||||
for (LLPointer<LLInventoryObject> obj : inventory_objects)
|
||||
{
|
||||
LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(it->get());
|
||||
LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(obj.get());
|
||||
if (!item)
|
||||
{
|
||||
LL_WARNS() << "Invalid inventory item for drop" << LL_ENDL;
|
||||
|
|
@ -3386,13 +3415,13 @@ bool move_inv_category_world_to_agent(const LLUUID& object_id,
|
|||
// coming from a task. Need to figure out if the person can
|
||||
// move/copy this item.
|
||||
LLPermissions perm(item->getPermissions());
|
||||
if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
|
||||
if ((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
|
||||
&& perm.allowTransferTo(gAgent.getID())))
|
||||
// || gAgent.isGodlike())
|
||||
{
|
||||
accept = true;
|
||||
}
|
||||
else if(object->permYouOwner())
|
||||
else if (object->permYouOwner())
|
||||
{
|
||||
// If the object cannot be copied, but the object the
|
||||
// inventory is owned by the agent, then the item can be
|
||||
|
|
@ -3412,22 +3441,21 @@ bool move_inv_category_world_to_agent(const LLUUID& object_id,
|
|||
}
|
||||
}
|
||||
|
||||
if(drop && accept)
|
||||
if (drop && accept)
|
||||
{
|
||||
it = inventory_objects.begin();
|
||||
std::shared_ptr<LLMoveInv> move_inv(new LLMoveInv);
|
||||
move_inv->mObjectID = object_id;
|
||||
move_inv->mCategoryID = category_id;
|
||||
move_inv->mCallback = callback;
|
||||
move_inv->mUserData = user_data;
|
||||
|
||||
for ( ; it != end; ++it)
|
||||
for (LLPointer<LLInventoryObject> obj : inventory_objects)
|
||||
{
|
||||
two_uuids_t two(category_id, (*it)->getUUID());
|
||||
two_uuids_t two(category_id, obj->getUUID());
|
||||
move_inv->mMoveList.push_back(two);
|
||||
}
|
||||
|
||||
if(is_move)
|
||||
if (is_move)
|
||||
{
|
||||
// Callback called from within here.
|
||||
warn_move_inventory(object, move_inv);
|
||||
|
|
@ -3445,13 +3473,13 @@ bool move_inv_category_world_to_agent(const LLUUID& object_id,
|
|||
void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
|
||||
{
|
||||
// Bail out immediately if no descendents
|
||||
if( mComplete.empty() )
|
||||
if (mComplete.empty())
|
||||
{
|
||||
LL_WARNS() << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << LL_ENDL;
|
||||
if (clear_observer)
|
||||
{
|
||||
gInventory.removeObserver(this);
|
||||
delete this;
|
||||
gInventory.removeObserver(this);
|
||||
delete this;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -3475,13 +3503,13 @@ void LLRightClickInventoryFetchDescendentsObserver::execute(bool clear_observer)
|
|||
gInventory.getDirectDescendentsOf(*current_folder, cat_array, item_array);
|
||||
|
||||
size_t item_count(0);
|
||||
if( item_array )
|
||||
if (item_array)
|
||||
{
|
||||
item_count = item_array->size();
|
||||
}
|
||||
|
||||
size_t cat_count(0);
|
||||
if( cat_array )
|
||||
if (cat_array)
|
||||
{
|
||||
cat_count = cat_array->size();
|
||||
}
|
||||
|
|
@ -3580,20 +3608,16 @@ protected:
|
|||
};
|
||||
|
||||
|
||||
|
||||
void LLInventoryCopyAndWearObserver::changed(U32 mask)
|
||||
{
|
||||
if((mask & (LLInventoryObserver::ADD)) != 0)
|
||||
if ((mask & (LLInventoryObserver::ADD)) != 0)
|
||||
{
|
||||
if (!mFolderAdded)
|
||||
{
|
||||
const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
|
||||
|
||||
std::set<LLUUID>::const_iterator id_it = changed_items.begin();
|
||||
std::set<LLUUID>::const_iterator id_end = changed_items.end();
|
||||
for (;id_it != id_end; ++id_it)
|
||||
for (const LLUUID& item_id : changed_items)
|
||||
{
|
||||
if ((*id_it) == mCatID)
|
||||
if (item_id == mCatID)
|
||||
{
|
||||
mFolderAdded = true;
|
||||
break;
|
||||
|
|
@ -3611,8 +3635,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (category->getDescendentCount() ==
|
||||
mContentsCount)
|
||||
if (category->getDescendentCount() == mContentsCount)
|
||||
{
|
||||
gInventory.removeObserver(this);
|
||||
LLAppearanceMgr::instance().wearInventoryCategory(category, false, !mReplace);
|
||||
|
|
@ -3624,8 +3647,6 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
|
||||
{
|
||||
if ("open" == action)
|
||||
|
|
@ -3735,19 +3756,19 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
|
|||
LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
|
||||
version_folder_id,
|
||||
[this](bool result)
|
||||
{
|
||||
// todo: might need to ensure bridge/mUUID exists or this will cause crashes
|
||||
if (!result)
|
||||
{
|
||||
LLSD subs;
|
||||
subs["[ERROR_CODE]"] = mMessage;
|
||||
LLNotificationsUtil::add("MerchantListingFailed", subs);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMarketplaceData::instance().activateListing(mUUID, true);
|
||||
}
|
||||
},
|
||||
// todo: might need to ensure bridge/mUUID exists or this will cause crashes
|
||||
if (!result)
|
||||
{
|
||||
LLSD subs;
|
||||
subs["[ERROR_CODE]"] = mMessage;
|
||||
LLNotificationsUtil::add("MerchantListingFailed", subs);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMarketplaceData::instance().activateListing(mUUID, true);
|
||||
}
|
||||
},
|
||||
boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3)
|
||||
);
|
||||
}
|
||||
|
|
@ -3762,19 +3783,19 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
|
|||
LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
|
||||
mUUID,
|
||||
[this](bool result)
|
||||
{
|
||||
if (!result)
|
||||
{
|
||||
LLSD subs;
|
||||
subs["[ERROR_CODE]"] = mMessage;
|
||||
LLNotificationsUtil::add("MerchantFolderActivationFailed", subs);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLInventoryCategory* category = gInventory.getCategory(mUUID);
|
||||
LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), mUUID);
|
||||
}
|
||||
},
|
||||
if (!result)
|
||||
{
|
||||
LLSD subs;
|
||||
subs["[ERROR_CODE]"] = mMessage;
|
||||
LLNotificationsUtil::add("MerchantFolderActivationFailed", subs);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLInventoryCategory* category = gInventory.getCategory(mUUID);
|
||||
LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), mUUID);
|
||||
}
|
||||
},
|
||||
boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),
|
||||
false,
|
||||
2);
|
||||
|
|
@ -3806,35 +3827,35 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
|
|||
LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
|
||||
mUUID,
|
||||
[this](bool result)
|
||||
{
|
||||
if (!result)
|
||||
{
|
||||
mMessage = "";
|
||||
|
||||
LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
|
||||
mUUID,
|
||||
[this](bool result)
|
||||
if (!result)
|
||||
{
|
||||
if (result)
|
||||
mMessage = "";
|
||||
|
||||
LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
|
||||
mUUID,
|
||||
[this](bool result)
|
||||
{
|
||||
LLNotificationsUtil::add("MerchantForceValidateListing");
|
||||
LLMarketplaceData::instance().createListing(mUUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSD subs;
|
||||
subs["[ERROR_CODE]"] = mMessage;
|
||||
LLNotificationsUtil::add("MerchantListingFailed", subs);
|
||||
}
|
||||
},
|
||||
boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),
|
||||
true);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMarketplaceData::instance().createListing(mUUID);
|
||||
}
|
||||
},
|
||||
if (result)
|
||||
{
|
||||
LLNotificationsUtil::add("MerchantForceValidateListing");
|
||||
LLMarketplaceData::instance().createListing(mUUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSD subs;
|
||||
subs["[ERROR_CODE]"] = mMessage;
|
||||
LLNotificationsUtil::add("MerchantListingFailed", subs);
|
||||
}
|
||||
},
|
||||
boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),
|
||||
true);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMarketplaceData::instance().createListing(mUUID);
|
||||
}
|
||||
},
|
||||
boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),
|
||||
false);
|
||||
|
||||
|
|
@ -3970,7 +3991,7 @@ void LLFolderBridge::copyOutfitToClipboard()
|
|||
gInventory.getDirectDescendentsOf(mUUID, cat_array, item_array);
|
||||
|
||||
size_t item_count(0);
|
||||
if( item_array )
|
||||
if (item_array)
|
||||
{
|
||||
item_count = item_array->size();
|
||||
}
|
||||
|
|
@ -4062,8 +4083,7 @@ void LLFolderBridge::restoreItem()
|
|||
LLFolderType::EType LLFolderBridge::getPreferredType() const
|
||||
{
|
||||
LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
|
||||
LLViewerInventoryCategory* cat = getCategory();
|
||||
if(cat)
|
||||
if (LLViewerInventoryCategory* cat = getCategory())
|
||||
{
|
||||
// <FS:Ansariel> Special virtual system folder icons; Since these folders can be user-created
|
||||
// and not protected, we will assign the folder type here instead of in
|
||||
|
|
@ -4117,7 +4137,6 @@ LLUIImagePtr LLFolderBridge::getIconOverlay() const
|
|||
|
||||
bool LLFolderBridge::renameItem(const std::string& new_name)
|
||||
{
|
||||
|
||||
LLScrollOnRenameObserver *observer = new LLScrollOnRenameObserver(mUUID, mRoot);
|
||||
gInventory.addObserver(observer);
|
||||
|
||||
|
|
@ -4130,7 +4149,7 @@ bool LLFolderBridge::renameItem(const std::string& new_name)
|
|||
|
||||
bool LLFolderBridge::removeItem()
|
||||
{
|
||||
if(!isItemRemovable())
|
||||
if (!isItemRemovable())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -4146,7 +4165,6 @@ bool LLFolderBridge::removeItem()
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool LLFolderBridge::removeSystemFolder()
|
||||
{
|
||||
const LLViewerInventoryCategory *cat = getCategory();
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
|
|||
}
|
||||
|
||||
std::string desc = listener->getSearchableCreatorName();
|
||||
switch(mSearchType)
|
||||
switch (mSearchType)
|
||||
{
|
||||
case SEARCHTYPE_CREATOR:
|
||||
desc = listener->getSearchableCreatorName();
|
||||
|
|
@ -145,7 +145,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
|
|||
boost::char_separator<char> sep(" ");
|
||||
tokenizer tokens(desc, sep);
|
||||
|
||||
for (auto token_iter : tokens)
|
||||
for (const auto& token_iter : tokens)
|
||||
{
|
||||
if (token_iter == mExactToken)
|
||||
{
|
||||
|
|
@ -155,11 +155,11 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
|
|||
}
|
||||
}
|
||||
// <FS:Ansariel> Allow searching by all
|
||||
//else if ((mFilterTokens.size() > 0) && (mSearchType == SEARCHTYPE_NAME))
|
||||
else if ((mFilterTokens.size() > 0) && ((mSearchType == SEARCHTYPE_NAME) || (mSearchType == SEARCHTYPE_ALL)))
|
||||
//else if (mFilterTokens.size() > 0 && mSearchType == SEARCHTYPE_NAME)
|
||||
else if (mFilterTokens.size() > 0 && (mSearchType == SEARCHTYPE_NAME || mSearchType == SEARCHTYPE_ALL))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
for (auto token_iter : mFilterTokens)
|
||||
for (const auto& token_iter : mFilterTokens)
|
||||
{
|
||||
if (desc.find(token_iter) == std::string::npos)
|
||||
{
|
||||
|
|
@ -169,7 +169,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
|
|||
}
|
||||
else
|
||||
{
|
||||
passed = (mFilterSubString.size() ? desc.find(mFilterSubString) != std::string::npos : true);
|
||||
passed = checkAgainstFilterSubString(desc);
|
||||
}
|
||||
|
||||
passed = passed && checkAgainstFilterType(listener);
|
||||
|
|
@ -185,7 +185,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
|
|||
|
||||
bool LLInventoryFilter::check(const LLInventoryItem* item)
|
||||
{
|
||||
const bool passed_string = (mFilterSubString.size() ? item->getName().find(mFilterSubString) != std::string::npos : true);
|
||||
const bool passed_string = checkAgainstFilterSubString(item->getName());
|
||||
const bool passed_filtertype = checkAgainstFilterType(item);
|
||||
const bool passed_permissions = checkAgainstPermissions(item);
|
||||
|
||||
|
|
@ -322,9 +322,19 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLInventoryFilter::checkAgainstFilterSubString(const std::string& desc) const
|
||||
{
|
||||
if (mFilterSubString.empty())
|
||||
return true;
|
||||
|
||||
size_t pos = desc.find(mFilterSubString);
|
||||
return pos != std::string::npos;
|
||||
}
|
||||
|
||||
bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInventory* listener) const
|
||||
{
|
||||
if (!listener) return false;
|
||||
if (!listener)
|
||||
return false;
|
||||
|
||||
LLInventoryType::EType object_type = listener->getInventoryType();
|
||||
const LLUUID object_id = listener->getUUID();
|
||||
|
|
@ -381,7 +391,7 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
|
|||
}
|
||||
|
||||
// <FS>
|
||||
//if(filterTypes & FILTERTYPE_WORN)
|
||||
//if (filterTypes & FILTERTYPE_WORN)
|
||||
//{
|
||||
// if (!get_is_item_worn(object_id))
|
||||
// {
|
||||
|
|
@ -411,7 +421,8 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
|
|||
// Pass if this item is the target UUID or if it links to the target UUID
|
||||
if (filterTypes & FILTERTYPE_UUID)
|
||||
{
|
||||
if (!object) return false;
|
||||
if (!object)
|
||||
return false;
|
||||
|
||||
if (object->getLinkedUUID() != mFilterOps.mFilterUUID)
|
||||
return false;
|
||||
|
|
@ -423,7 +434,7 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent
|
|||
if (filterTypes & FILTERTYPE_DATE)
|
||||
{
|
||||
const U16 HOURS_TO_SECONDS = 3600;
|
||||
time_t earliest = time_corrected() - mFilterOps.mHoursAgo * HOURS_TO_SECONDS;
|
||||
time_t earliest = time_corrected() - (U64)mFilterOps.mHoursAgo * HOURS_TO_SECONDS;
|
||||
|
||||
if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest)
|
||||
{
|
||||
|
|
@ -554,7 +565,8 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) cons
|
|||
// Pass if this item is the target UUID or if it links to the target UUID
|
||||
if (filterTypes & FILTERTYPE_UUID)
|
||||
{
|
||||
if (!item) return false;
|
||||
if (!item)
|
||||
return false;
|
||||
|
||||
if (item->getLinkedUUID() != mFilterOps.mFilterUUID)
|
||||
return false;
|
||||
|
|
@ -600,7 +612,8 @@ bool LLInventoryFilter::checkAgainstClipboard(const LLUUID& object_id) const
|
|||
|
||||
bool LLInventoryFilter::checkAgainstPermissions(const LLFolderViewModelItemInventory* listener) const
|
||||
{
|
||||
if (!listener) return false;
|
||||
if (!listener)
|
||||
return false;
|
||||
|
||||
PermissionMask perm = listener->getPermissionMask();
|
||||
const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(listener);
|
||||
|
|
@ -616,7 +629,8 @@ bool LLInventoryFilter::checkAgainstPermissions(const LLFolderViewModelItemInven
|
|||
|
||||
bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) const
|
||||
{
|
||||
if (!item) return false;
|
||||
if (!item)
|
||||
return false;
|
||||
|
||||
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
|
||||
PermissionMask perm = new_item->getPermissionMask();
|
||||
|
|
@ -627,11 +641,13 @@ bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) con
|
|||
|
||||
bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInventory* listener) const
|
||||
{
|
||||
if (!listener) return true;
|
||||
if (!listener)
|
||||
return true;
|
||||
|
||||
const LLUUID object_id = listener->getUUID();
|
||||
const LLInventoryObject *object = gInventory.getObject(object_id);
|
||||
if (!object) return true;
|
||||
if (!object)
|
||||
return true;
|
||||
|
||||
const bool is_link = object->getIsLinkType();
|
||||
if (is_link && (mFilterOps.mFilterLinks == FILTERLINK_EXCLUDE_LINKS))
|
||||
|
|
@ -644,7 +660,8 @@ bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInven
|
|||
bool LLInventoryFilter::checkAgainstFilterThumbnails(const LLUUID& object_id) const
|
||||
{
|
||||
const LLInventoryObject *object = gInventory.getObject(object_id);
|
||||
if (!object) return true;
|
||||
if (!object)
|
||||
return true;
|
||||
|
||||
const bool is_thumbnail = object->getThumbnailUUID().notNull();
|
||||
if (is_thumbnail && (mFilterOps.mFilterThumbnails == FILTER_EXCLUDE_THUMBNAILS))
|
||||
|
|
@ -656,16 +673,20 @@ bool LLInventoryFilter::checkAgainstFilterThumbnails(const LLUUID& object_id) co
|
|||
|
||||
bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory* listener) const
|
||||
{
|
||||
if (!listener) return true;
|
||||
if (!listener)
|
||||
return true;
|
||||
|
||||
const bool is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY;
|
||||
switch (mFilterOps.mFilterCreatorType)
|
||||
{
|
||||
case FILTERCREATOR_SELF:
|
||||
if(is_folder) return false;
|
||||
return (listener->getSearchableCreatorName() == mUsername);
|
||||
if (is_folder)
|
||||
return false;
|
||||
return listener->getSearchableCreatorName() == mUsername;
|
||||
case FILTERCREATOR_OTHERS:
|
||||
if(is_folder) return false;
|
||||
return (listener->getSearchableCreatorName() != mUsername);
|
||||
if (is_folder)
|
||||
return false;
|
||||
return listener->getSearchableCreatorName() != mUsername;
|
||||
case FILTERCREATOR_ALL:
|
||||
default:
|
||||
return true;
|
||||
|
|
@ -678,7 +699,8 @@ bool LLInventoryFilter::checkAgainstSearchVisibility(const LLFolderViewModelItem
|
|||
|
||||
const LLUUID object_id = listener->getUUID();
|
||||
const LLInventoryObject *object = gInventory.getObject(object_id);
|
||||
if (!object) return true;
|
||||
if (!object)
|
||||
return true;
|
||||
|
||||
const bool is_link = object->getIsLinkType();
|
||||
if (is_link && ((mFilterOps.mSearchVisibility & VISIBILITY_LINKS) == 0))
|
||||
|
|
@ -710,10 +732,8 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset(LLFolderViewModel
|
|||
{
|
||||
return mFilterSubString.size() ? item->getSearchableName().find(mFilterSubString) : std::string::npos;
|
||||
}
|
||||
else
|
||||
{
|
||||
return std::string::npos;
|
||||
}
|
||||
|
||||
return std::string::npos;
|
||||
}
|
||||
|
||||
bool LLInventoryFilter::isDefault() const
|
||||
|
|
@ -791,7 +811,7 @@ void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)
|
|||
|
||||
void LLInventoryFilter::setSearchType(ESearchType type)
|
||||
{
|
||||
if(mSearchType != type)
|
||||
if (mSearchType != type)
|
||||
{
|
||||
mSearchType = type;
|
||||
setModified();
|
||||
|
|
@ -1007,6 +1027,7 @@ void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
|
|||
{
|
||||
setModified(FILTER_RESTART);
|
||||
}
|
||||
|
||||
mFilterOps.mFilterUUID = object_id;
|
||||
mFilterOps.mFilterTypes = FILTERTYPE_UUID;
|
||||
}
|
||||
|
|
@ -1020,7 +1041,6 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
|
|||
|
||||
if (mFilterSubString != filter_sub_string_new)
|
||||
{
|
||||
|
||||
mFilterTokens.clear();
|
||||
if (filter_sub_string_new.find_first_of("+") != std::string::npos)
|
||||
{
|
||||
|
|
@ -1363,7 +1383,7 @@ void LLInventoryFilter::setFindAllLinksMode(const std::string &search_name, cons
|
|||
{
|
||||
// Save a copy of settings so that we will be able to restore it later
|
||||
// but make sure we are not searching for links already
|
||||
//if(mFilterOps.mFilterLinks != FILTERLINK_ONLY_LINKS) // <FS:Ansariel> Find all links unhiding hidden empty system folders
|
||||
//if (mFilterOps.mFilterLinks != FILTERLINK_ONLY_LINKS) // <FS:Ansariel> Find all links unhiding hidden empty system folders
|
||||
{
|
||||
mBackupFilterOps = mFilterOps;
|
||||
}
|
||||
|
|
@ -1403,7 +1423,7 @@ void LLInventoryFilter::setModified(EFilterModified behavior)
|
|||
}
|
||||
|
||||
// if not keeping current filter results, update last valid as well
|
||||
switch(mFilterModified)
|
||||
switch (mFilterModified)
|
||||
{
|
||||
case FILTER_RESTART:
|
||||
mFirstRequiredGeneration = mCurrentGeneration;
|
||||
|
|
@ -1655,11 +1675,11 @@ const std::string& LLInventoryFilter::getFilterText()
|
|||
{
|
||||
mFilterText += LLTrans::getString("Since Logoff");
|
||||
}
|
||||
|
||||
return mFilterText;
|
||||
}
|
||||
|
||||
|
||||
LLInventoryFilter& LLInventoryFilter::operator=( const LLInventoryFilter& other )
|
||||
LLInventoryFilter& LLInventoryFilter::operator =(const LLInventoryFilter& other)
|
||||
{
|
||||
setFilterObjectTypes(other.getFilterObjectTypes());
|
||||
setDateRange(other.getMinDate(), other.getMaxDate());
|
||||
|
|
@ -1674,7 +1694,6 @@ LLInventoryFilter& LLInventoryFilter::operator=( const LLInventoryFilter& othe
|
|||
return *this;
|
||||
}
|
||||
|
||||
|
||||
void LLInventoryFilter::toParams(Params& params) const
|
||||
{
|
||||
params.filter_ops.types = (U32)getFilterObjectTypes();
|
||||
|
|
@ -1901,14 +1920,13 @@ std::string LLInventoryFilter::getEmptyLookupMessage(bool is_empty_folder) const
|
|||
|
||||
return LLTrans::getString(mEmptyLookupMessage, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool LLInventoryFilter::areDateLimitsSet()
|
||||
{
|
||||
return mFilterOps.mMinDate != time_min()
|
||||
|| mFilterOps.mMaxDate != time_max()
|
||||
|| mFilterOps.mHoursAgo != 0;
|
||||
return mFilterOps.mMinDate != time_min()
|
||||
|| mFilterOps.mMaxDate != time_max()
|
||||
|| mFilterOps.mHoursAgo != 0;
|
||||
}
|
||||
|
||||
bool LLInventoryFilter::showAllResults() const
|
||||
|
|
@ -1916,8 +1934,6 @@ bool LLInventoryFilter::showAllResults() const
|
|||
return hasFilterString() && !mSingleFolderMode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool LLInventoryFilter::FilterOps::DateRange::validateBlock( bool emit_errors /*= true*/ ) const
|
||||
{
|
||||
bool valid = LLInitParam::Block<DateRange>::validateBlock(emit_errors);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ public:
|
|||
SHOW_NO_FOLDERS
|
||||
};
|
||||
|
||||
enum EFilterType {
|
||||
enum EFilterType
|
||||
{
|
||||
FILTERTYPE_NONE = 0,
|
||||
FILTERTYPE_OBJECT = 0x1 << 0, // normal default search-by-object-type
|
||||
FILTERTYPE_CATEGORY = 0x1 << 1, // search by folder type
|
||||
|
|
@ -296,9 +297,9 @@ public:
|
|||
// +-------------------------------------------------------------------+
|
||||
// + Execution And Results
|
||||
// +-------------------------------------------------------------------+
|
||||
bool check(const LLFolderViewModelItem* listener);
|
||||
bool check(const LLFolderViewModelItem* item);
|
||||
bool check(const LLInventoryItem* item);
|
||||
bool checkFolder(const LLFolderViewModelItem* listener) const;
|
||||
bool checkFolder(const LLFolderViewModelItem* item) const;
|
||||
bool checkFolder(const LLUUID& folder_id) const;
|
||||
|
||||
bool showAllResults() const;
|
||||
|
|
@ -363,6 +364,7 @@ public:
|
|||
|
||||
private:
|
||||
bool areDateLimitsSet();
|
||||
bool checkAgainstFilterSubString(const std::string& desc) const;
|
||||
bool checkAgainstFilterType(const class LLFolderViewModelItemInventory* listener) const;
|
||||
bool checkAgainstFilterType(const LLInventoryItem* item) const;
|
||||
bool checkAgainstPermissions(const class LLFolderViewModelItemInventory* listener) const;
|
||||
|
|
|
|||
|
|
@ -2555,18 +2555,16 @@ void ungroup_folder_items(const LLUUID& folder_id)
|
|||
LLInventoryModel::cat_array_t cats = *cat_array;
|
||||
LLInventoryModel::item_array_t items = *item_array;
|
||||
|
||||
for (LLInventoryModel::cat_array_t::const_iterator cat_iter = cats.begin(); cat_iter != cats.end(); ++cat_iter)
|
||||
for (const LLPointer<LLViewerInventoryCategory>& cat : cats)
|
||||
{
|
||||
LLViewerInventoryCategory* cat = *cat_iter;
|
||||
if (cat)
|
||||
{
|
||||
gInventory.changeCategoryParent(cat, new_cat_uuid, false);
|
||||
}
|
||||
}
|
||||
for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); item_iter != items.end(); ++item_iter)
|
||||
for (const LLPointer<LLViewerInventoryItem>& item : items)
|
||||
{
|
||||
LLViewerInventoryItem* item = *item_iter;
|
||||
if(item)
|
||||
if (item)
|
||||
{
|
||||
gInventory.changeItemParent(item, new_cat_uuid, false);
|
||||
}
|
||||
|
|
@ -2581,8 +2579,7 @@ std::string get_searchable_description(LLInventoryModel* model, const LLUUID& it
|
|||
{
|
||||
if (model)
|
||||
{
|
||||
const LLInventoryItem *item = model->getItem(item_id);
|
||||
if(item)
|
||||
if (const LLInventoryItem* item = model->getItem(item_id))
|
||||
{
|
||||
std::string desc = item->getDescription();
|
||||
LLStringUtil::toUpper(desc);
|
||||
|
|
@ -2596,8 +2593,7 @@ std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& i
|
|||
{
|
||||
if (model)
|
||||
{
|
||||
const LLInventoryItem *item = model->getItem(item_id);
|
||||
if(item)
|
||||
if (const LLInventoryItem* item = model->getItem(item_id))
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
// <FS:Beq> Avoid null id requests entering name cache
|
||||
|
|
|
|||
|
|
@ -2655,7 +2655,8 @@ bool LLInventoryGallery::hasDescendents(const LLUUID& cat_id)
|
|||
bool LLInventoryGallery::checkAgainstFilterType(const LLUUID& object_id)
|
||||
{
|
||||
const LLInventoryObject *object = gInventory.getObject(object_id);
|
||||
if(!object) return false;
|
||||
if (!object)
|
||||
return false;
|
||||
|
||||
LLInventoryType::EType object_type = LLInventoryType::IT_CATEGORY;
|
||||
LLInventoryItem* inv_item = gInventory.getItem(object_id);
|
||||
|
|
@ -2663,8 +2664,8 @@ bool LLInventoryGallery::checkAgainstFilterType(const LLUUID& object_id)
|
|||
{
|
||||
object_type = inv_item->getInventoryType();
|
||||
}
|
||||
const U32 filterTypes = (U32)mFilter->getFilterTypes();
|
||||
|
||||
const U32 filterTypes = (U32)mFilter->getFilterTypes();
|
||||
if ((filterTypes & LLInventoryFilter::FILTERTYPE_OBJECT) && inv_item)
|
||||
{
|
||||
switch (object_type)
|
||||
|
|
@ -2732,7 +2733,7 @@ bool LLInventoryGallery::hasVisibleItems()
|
|||
|
||||
void LLInventoryGallery::handleModifiedFilter()
|
||||
{
|
||||
if(mFilter->isModified())
|
||||
if (mFilter->isModified())
|
||||
{
|
||||
reArrangeRows();
|
||||
}
|
||||
|
|
@ -2743,7 +2744,7 @@ void LLInventoryGallery::setSortOrder(U32 order, bool update)
|
|||
bool dirty = (mSortOrder != order);
|
||||
|
||||
mSortOrder = order;
|
||||
if(update && dirty)
|
||||
if (update && dirty)
|
||||
{
|
||||
mNeedsArrange = true;
|
||||
gIdleCallbacks.addFunction(onIdle, (void*)this);
|
||||
|
|
@ -2795,11 +2796,11 @@ void LLInventoryGalleryItem::setType(LLAssetType::EType type, LLInventoryType::E
|
|||
mIsLink = is_link;
|
||||
|
||||
std::string icon_name = LLInventoryIcon::getIconName(mType, inventory_type, flags);
|
||||
if(mIsFolder)
|
||||
if (mIsFolder)
|
||||
{
|
||||
mSortGroup = SG_NORMAL_FOLDER;
|
||||
LLUUID folder_id = mUUID;
|
||||
if(mIsLink)
|
||||
if (mIsLink)
|
||||
{
|
||||
LLInventoryObject* obj = gInventory.getObject(mUUID);
|
||||
if (obj)
|
||||
|
|
@ -2826,7 +2827,7 @@ void LLInventoryGalleryItem::setType(LLAssetType::EType type, LLInventoryType::E
|
|||
else
|
||||
{
|
||||
const LLInventoryItem *item = gInventory.getItem(mUUID);
|
||||
if(item && (LLAssetType::AT_CALLINGCARD != item->getType()) && !mIsLink)
|
||||
if (item && (LLAssetType::AT_CALLINGCARD != item->getType()) && !mIsLink)
|
||||
{
|
||||
std::string delim(" --");
|
||||
bool copy = item->getPermissions().allowCopyBy(gAgent.getID());
|
||||
|
|
@ -2857,7 +2858,7 @@ void LLInventoryGalleryItem::setType(LLAssetType::EType type, LLInventoryType::E
|
|||
void LLInventoryGalleryItem::setThumbnail(LLUUID id)
|
||||
{
|
||||
mDefaultImage = id.isNull();
|
||||
if(mDefaultImage)
|
||||
if (mDefaultImage)
|
||||
{
|
||||
mThumbnailCtrl->clearTexture();
|
||||
}
|
||||
|
|
@ -2906,10 +2907,10 @@ void LLInventoryGalleryItem::setSelected(bool value)
|
|||
mSelected = value;
|
||||
mTextBgPanel->setBackgroundVisible(value);
|
||||
|
||||
if(mSelected)
|
||||
if (mSelected)
|
||||
{
|
||||
LLViewerInventoryItem* item = gInventory.getItem(mUUID);
|
||||
if(item && !item->isFinished())
|
||||
if (item && !item->isFinished())
|
||||
{
|
||||
LLInventoryModelBackgroundFetch::instance().start(mUUID, false);
|
||||
}
|
||||
|
|
@ -2932,6 +2933,7 @@ bool LLInventoryGalleryItem::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
{
|
||||
mGallery->changeItemSelection(mUUID, false);
|
||||
}
|
||||
|
||||
setFocus(true);
|
||||
mGallery->claimEditHandler();
|
||||
|
||||
|
|
@ -2964,7 +2966,7 @@ bool LLInventoryGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
|
||||
bool LLInventoryGalleryItem::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if(hasMouseCapture())
|
||||
if (hasMouseCapture())
|
||||
{
|
||||
gFocusMgr.setMouseCapture(NULL);
|
||||
return true;
|
||||
|
|
@ -2974,13 +2976,13 @@ bool LLInventoryGalleryItem::handleMouseUp(S32 x, S32 y, MASK mask)
|
|||
|
||||
bool LLInventoryGalleryItem::handleHover(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if(hasMouseCapture())
|
||||
if (hasMouseCapture())
|
||||
{
|
||||
S32 screen_x;
|
||||
S32 screen_y;
|
||||
localPointToScreen(x, y, &screen_x, &screen_y );
|
||||
|
||||
if(LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y) && mGallery)
|
||||
if (LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y) && mGallery)
|
||||
{
|
||||
mGallery->startDrag();
|
||||
return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask);
|
||||
|
|
@ -2999,13 +3001,13 @@ bool LLInventoryGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
|
|||
LLHandle<LLPanel> handle = mGallery->getHandle();
|
||||
LLUUID navigate_to = mUUID;
|
||||
doOnIdleOneTime([handle, navigate_to]()
|
||||
{
|
||||
LLInventoryGallery* gallery = (LLInventoryGallery*)handle.get();
|
||||
if (gallery)
|
||||
{
|
||||
gallery->setRootFolder(navigate_to);
|
||||
}
|
||||
});
|
||||
{
|
||||
LLInventoryGallery* gallery = (LLInventoryGallery*)handle.get();
|
||||
if (gallery)
|
||||
{
|
||||
gallery->setRootFolder(navigate_to);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3084,7 +3086,7 @@ void LLInventoryGalleryItem::setWorn(bool value)
|
|||
{
|
||||
mWorn = value;
|
||||
|
||||
if(mWorn)
|
||||
if (mWorn)
|
||||
{
|
||||
mWornSuffix = (mType == LLAssetType::AT_GESTURE) ? LLTrans::getString("active") : LLTrans::getString("worn");
|
||||
}
|
||||
|
|
@ -3098,7 +3100,7 @@ void LLInventoryGalleryItem::setWorn(bool value)
|
|||
|
||||
LLFontGL* LLInventoryGalleryItem::getTextFont()
|
||||
{
|
||||
if(mWorn)
|
||||
if (mWorn)
|
||||
{
|
||||
return LLFontGL::getFontSansSerifSmallBold();
|
||||
}
|
||||
|
|
@ -3133,12 +3135,10 @@ bool LLInventoryGalleryItem::isFadeItem()
|
|||
void LLThumbnailsObserver::changed(U32 mask)
|
||||
{
|
||||
std::vector<LLUUID> deleted_ids;
|
||||
for (item_map_t::iterator iter = mItemMap.begin();
|
||||
iter != mItemMap.end();
|
||||
++iter)
|
||||
for (item_map_t::value_type& it : mItemMap)
|
||||
{
|
||||
const LLUUID& obj_id = (*iter).first;
|
||||
LLItemData& data = (*iter).second;
|
||||
const LLUUID& obj_id = it.first;
|
||||
LLItemData& data = it.second;
|
||||
|
||||
LLInventoryObject* obj = gInventory.getObject(obj_id);
|
||||
if (!obj)
|
||||
|
|
@ -3164,8 +3164,7 @@ void LLThumbnailsObserver::changed(U32 mask)
|
|||
|
||||
bool LLThumbnailsObserver::addItem(const LLUUID& obj_id, callback_t cb)
|
||||
{
|
||||
LLInventoryObject* obj = gInventory.getObject(obj_id);
|
||||
if (obj)
|
||||
if (LLInventoryObject* obj = gInventory.getObject(obj_id))
|
||||
{
|
||||
mItemMap.insert(item_map_value_t(obj_id, LLItemData(obj_id, obj->getThumbnailUUID(), cb)));
|
||||
return true;
|
||||
|
|
@ -3196,79 +3195,74 @@ bool LLInventoryGallery::baseHandleDragAndDrop(LLUUID dest_id, bool drop,
|
|||
}
|
||||
|
||||
bool accepted = false;
|
||||
switch(cargo_type)
|
||||
switch (cargo_type)
|
||||
{
|
||||
case DAD_TEXTURE:
|
||||
case DAD_SOUND:
|
||||
case DAD_CALLINGCARD:
|
||||
case DAD_LANDMARK:
|
||||
case DAD_SCRIPT:
|
||||
case DAD_CLOTHING:
|
||||
case DAD_OBJECT:
|
||||
case DAD_NOTECARD:
|
||||
case DAD_BODYPART:
|
||||
case DAD_ANIMATION:
|
||||
case DAD_GESTURE:
|
||||
case DAD_MESH:
|
||||
case DAD_SETTINGS:
|
||||
case DAD_TEXTURE:
|
||||
case DAD_SOUND:
|
||||
case DAD_CALLINGCARD:
|
||||
case DAD_LANDMARK:
|
||||
case DAD_SCRIPT:
|
||||
case DAD_CLOTHING:
|
||||
case DAD_OBJECT:
|
||||
case DAD_NOTECARD:
|
||||
case DAD_BODYPART:
|
||||
case DAD_ANIMATION:
|
||||
case DAD_GESTURE:
|
||||
case DAD_MESH:
|
||||
case DAD_SETTINGS:
|
||||
accepted = dragItemIntoFolder(dest_id, inv_item, drop, tooltip_msg, true);
|
||||
if (accepted && drop)
|
||||
{
|
||||
// Don't select immediately, wait for item to arrive
|
||||
mItemsToSelect.push_back(inv_item->getUUID());
|
||||
}
|
||||
break;
|
||||
case DAD_LINK:
|
||||
// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER.
|
||||
// If we have an item of AT_LINK_FOLDER type we should process the linked
|
||||
// category being dragged or dropped into folder.
|
||||
if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType())
|
||||
{
|
||||
LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());
|
||||
if (linked_category)
|
||||
{
|
||||
accepted = dragCategoryIntoFolder(dest_id, (LLInventoryCategory*)linked_category, drop, tooltip_msg, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
accepted = dragItemIntoFolder(dest_id, inv_item, drop, tooltip_msg, true);
|
||||
}
|
||||
if (accepted && drop && inv_item)
|
||||
{
|
||||
mItemsToSelect.push_back(inv_item->getUUID());
|
||||
}
|
||||
break;
|
||||
case DAD_CATEGORY:
|
||||
if (LLFriendCardsManager::instance().isAnyFriendCategory(dest_id))
|
||||
{
|
||||
accepted = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLInventoryCategory* cat_ptr = (LLInventoryCategory*)cargo_data;
|
||||
accepted = dragCategoryIntoFolder(dest_id, cat_ptr, drop, tooltip_msg, false);
|
||||
if (accepted && drop)
|
||||
{
|
||||
// Don't select immediately, wait for item to arrive
|
||||
mItemsToSelect.push_back(inv_item->getUUID());
|
||||
mItemsToSelect.push_back(cat_ptr->getUUID());
|
||||
}
|
||||
break;
|
||||
case DAD_LINK:
|
||||
// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER.
|
||||
// If we have an item of AT_LINK_FOLDER type we should process the linked
|
||||
// category being dragged or dropped into folder.
|
||||
if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType())
|
||||
{
|
||||
LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());
|
||||
if (linked_category)
|
||||
{
|
||||
accepted = dragCategoryIntoFolder(dest_id, (LLInventoryCategory*)linked_category, drop, tooltip_msg, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
accepted = dragItemIntoFolder(dest_id, inv_item, drop, tooltip_msg, true);
|
||||
}
|
||||
if (accepted && drop && inv_item)
|
||||
{
|
||||
mItemsToSelect.push_back(inv_item->getUUID());
|
||||
}
|
||||
break;
|
||||
case DAD_CATEGORY:
|
||||
if (LLFriendCardsManager::instance().isAnyFriendCategory(dest_id))
|
||||
{
|
||||
accepted = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLInventoryCategory* cat_ptr = (LLInventoryCategory*)cargo_data;
|
||||
accepted = dragCategoryIntoFolder(dest_id, cat_ptr, drop, tooltip_msg, false);
|
||||
if (accepted && drop)
|
||||
{
|
||||
mItemsToSelect.push_back(cat_ptr->getUUID());
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DAD_ROOT_CATEGORY:
|
||||
case DAD_NONE:
|
||||
break;
|
||||
default:
|
||||
LL_WARNS() << "Unhandled cargo type for drag&drop " << cargo_type << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
if (accepted)
|
||||
{
|
||||
*accept = ACCEPT_YES_MULTI;
|
||||
}
|
||||
else
|
||||
{
|
||||
*accept = ACCEPT_NO;
|
||||
}
|
||||
break;
|
||||
case DAD_ROOT_CATEGORY:
|
||||
case DAD_NONE:
|
||||
break;
|
||||
default:
|
||||
LL_WARNS() << "Unhandled cargo type for drag&drop " << cargo_type << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
|
||||
*accept = accepted ? ACCEPT_YES_MULTI : ACCEPT_NO;
|
||||
|
||||
return accepted;
|
||||
}
|
||||
|
||||
|
|
@ -3280,16 +3274,20 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop,
|
|||
{
|
||||
return false;
|
||||
}
|
||||
LLInventoryModel* model = &gInventory;
|
||||
|
||||
if (!model || !inv_item) return false;
|
||||
LLInventoryModel* model = &gInventory;
|
||||
if (!model || !inv_item)
|
||||
return false;
|
||||
|
||||
// cannot drag into library
|
||||
if((gInventory.getRootFolderID() != folder_id) && !model->isObjectDescendentOf(folder_id, gInventory.getRootFolderID()))
|
||||
if (gInventory.getRootFolderID() != folder_id &&
|
||||
!model->isObjectDescendentOf(folder_id, gInventory.getRootFolderID()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!isAgentAvatarValid()) return false;
|
||||
|
||||
if (!isAgentAvatarValid())
|
||||
return false;
|
||||
|
||||
const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
|
|
@ -3308,7 +3306,7 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop,
|
|||
LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
|
||||
bool accept = false;
|
||||
LLViewerObject* object = NULL;
|
||||
if(LLToolDragAndDrop::SOURCE_AGENT == source)
|
||||
if (LLToolDragAndDrop::SOURCE_AGENT == source)
|
||||
{
|
||||
const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
|
||||
|
|
@ -3323,21 +3321,24 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop,
|
|||
|
||||
switch (inv_item->getActualType())
|
||||
{
|
||||
case LLAssetType::AT_CATEGORY:
|
||||
is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case LLAssetType::AT_CATEGORY:
|
||||
is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Can't explicitly drag things out of the COF.
|
||||
if (move_is_outof_current_outfit)
|
||||
{
|
||||
is_movable = false;
|
||||
}
|
||||
|
||||
if (move_is_into_trash)
|
||||
{
|
||||
is_movable &= inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
|
||||
}
|
||||
|
||||
if (is_movable)
|
||||
{
|
||||
// Don't allow creating duplicates in the Calling Card/Friends
|
||||
|
|
@ -3546,7 +3547,7 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop,
|
|||
move_inv->mMoveList.push_back(item_pair);
|
||||
move_inv->mCallback = NULL;
|
||||
move_inv->mUserData = NULL;
|
||||
if(is_move)
|
||||
if (is_move)
|
||||
{
|
||||
warn_move_inventory(object, move_inv);
|
||||
}
|
||||
|
|
@ -3561,7 +3562,7 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop,
|
|||
}
|
||||
}
|
||||
}
|
||||
else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
|
||||
else if (LLToolDragAndDrop::SOURCE_NOTECARD == source)
|
||||
{
|
||||
if (move_is_into_marketplacelistings)
|
||||
{
|
||||
|
|
@ -3588,7 +3589,7 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop,
|
|||
inv_item);
|
||||
}
|
||||
}
|
||||
else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
|
||||
else if (LLToolDragAndDrop::SOURCE_LIBRARY == source)
|
||||
{
|
||||
LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item;
|
||||
if(item && item->isFinished())
|
||||
|
|
@ -3671,11 +3672,14 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!inv_cat) return false; // shouldn't happen, but in case item is incorrectly parented in which case inv_cat will be NULL
|
||||
if (!inv_cat) // shouldn't happen, but in case item is incorrectly parented in which case inv_cat will be NULL
|
||||
return false;
|
||||
|
||||
if (!isAgentAvatarValid())
|
||||
return false;
|
||||
|
||||
if (!isAgentAvatarValid()) return false;
|
||||
// cannot drag into library
|
||||
if((gInventory.getRootFolderID() != dest_id) && !model->isObjectDescendentOf(dest_id, gInventory.getRootFolderID()))
|
||||
if ((gInventory.getRootFolderID() != dest_id) && !model->isObjectDescendentOf(dest_id, gInventory.getRootFolderID()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -3764,7 +3768,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
|
|||
is_movable = false;
|
||||
}
|
||||
}
|
||||
else if(dest_cat && dest_cat->getPreferredType() == LLFolderType::FT_NONE)
|
||||
else if (dest_cat && dest_cat->getPreferredType() == LLFolderType::FT_NONE)
|
||||
{
|
||||
is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT));
|
||||
}
|
||||
|
|
@ -3773,7 +3777,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
|
|||
is_movable = false;
|
||||
}
|
||||
}
|
||||
if(is_movable && move_is_into_current_outfit && is_link)
|
||||
if (is_movable && move_is_into_current_outfit && is_link)
|
||||
{
|
||||
is_movable = false;
|
||||
}
|
||||
|
|
@ -3801,7 +3805,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
|
|||
for (S32 i=0; i < descendent_categories.size(); ++i)
|
||||
{
|
||||
LLInventoryCategory* category = descendent_categories[i];
|
||||
if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
|
||||
if (LLFolderType::lookupIsProtectedType(category->getPreferredType()))
|
||||
{
|
||||
// Can't move "special folders" (e.g. Textures Folder).
|
||||
is_movable = false;
|
||||
|
|
@ -4006,7 +4010,6 @@ void outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id)
|
|||
|
||||
LLInventoryObject::const_object_list_t link_array;
|
||||
|
||||
|
||||
LLInventoryModel::item_array_t::iterator iter = items->begin();
|
||||
LLInventoryModel::item_array_t::iterator end = items->end();
|
||||
while (iter!=end)
|
||||
|
|
@ -4044,4 +4047,3 @@ void dropToMyOutfits(LLInventoryCategory* inv_cat)
|
|||
inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1);
|
||||
gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -451,8 +451,10 @@ void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType
|
|||
{
|
||||
getFilter().setFilterObjectTypes(types);
|
||||
}
|
||||
if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY)
|
||||
else if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY)
|
||||
{
|
||||
getFilter().setFilterCategoryTypes(types);
|
||||
}
|
||||
}
|
||||
|
||||
void LLInventoryPanel::setFilterWorn()
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
// linden library includes
|
||||
#include "llerror.h"
|
||||
#include "llfiltereditor.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfontgl.h"
|
||||
#include "llinventorydefines.h"
|
||||
|
|
@ -90,8 +91,14 @@ bool LLPanelContents::postBuild()
|
|||
childSetAction("btn_reset_scripts", &LLPanelContents::onClickResetScripts, this); // <FS> Script reset in edit floater
|
||||
childSetAction("button refresh",&LLPanelContents::onClickRefresh, this);
|
||||
|
||||
mFilterEditor = getChild<LLFilterEditor>("contents_filter");
|
||||
mFilterEditor->setCommitCallback([&](LLUICtrl*, const LLSD&) { onFilterEdit(); });
|
||||
|
||||
mPanelInventoryObject = getChild<LLPanelObjectInventory>("contents_inventory");
|
||||
|
||||
// update permission filter once UI is fully initialized
|
||||
mSavedFolderState.setApply(false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -167,6 +174,38 @@ void LLPanelContents::getState(LLViewerObject *objectp )
|
|||
mPanelInventoryObject->setEnabled(!objectp->isPermanentEnforced());
|
||||
}
|
||||
|
||||
void LLPanelContents::onFilterEdit()
|
||||
{
|
||||
const std::string& filter_substring = mFilterEditor->getText();
|
||||
if (filter_substring.empty())
|
||||
{
|
||||
if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
|
||||
{
|
||||
// The current filter and the new filter are empty, nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
mSavedFolderState.setApply(true);
|
||||
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
|
||||
|
||||
// Add a folder with the current item to the list of previously opened folders
|
||||
LLOpenFoldersWithSelection opener;
|
||||
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(opener);
|
||||
mPanelInventoryObject->getRootFolder()->scrollToShowSelection();
|
||||
}
|
||||
else if (mPanelInventoryObject->getFilter().getFilterSubString().empty())
|
||||
{
|
||||
// The first letter in search term, save existing folder open state
|
||||
if (!mPanelInventoryObject->getFilter().isNotDefault())
|
||||
{
|
||||
mSavedFolderState.setApply(false);
|
||||
mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState);
|
||||
}
|
||||
}
|
||||
|
||||
mPanelInventoryObject->getFilter().setFilterSubString(filter_substring);
|
||||
}
|
||||
|
||||
void LLPanelContents::refresh()
|
||||
{
|
||||
const bool children_ok = true;
|
||||
|
|
@ -187,7 +226,6 @@ void LLPanelContents::clearContents()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Static functions
|
||||
//
|
||||
|
|
@ -252,7 +290,6 @@ void LLPanelContents::onClickNewScript(void *userdata)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLPanelContents::onClickPermissions(void *userdata)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,12 +27,13 @@
|
|||
#ifndef LL_LLPANELCONTENTS_H
|
||||
#define LL_LLPANELCONTENTS_H
|
||||
|
||||
#include "v3math.h"
|
||||
#include "llpanel.h"
|
||||
#include "llfolderview.h"
|
||||
#include "llinventory.h"
|
||||
#include "llpanel.h"
|
||||
#include "lluuid.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llvoinventorylistener.h"
|
||||
#include "v3math.h"
|
||||
|
||||
class LLButton;
|
||||
class LLPanelObjectInventory;
|
||||
|
|
@ -68,9 +69,12 @@ public:
|
|||
static const char* PERMS_ANYONE_CONTROL_KEY;
|
||||
|
||||
protected:
|
||||
void getState(LLViewerObject *object);
|
||||
void getState(LLViewerObject *object);
|
||||
void onFilterEdit();
|
||||
|
||||
public:
|
||||
class LLFilterEditor* mFilterEditor;
|
||||
LLSaveFolderState mSavedFolderState;
|
||||
LLPanelObjectInventory* mPanelInventoryObject;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1232,11 +1232,11 @@ bool LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
|
|||
EAcceptance* accept,
|
||||
std::string& tooltip_msg)
|
||||
{
|
||||
// Check to see if we are auto scrolling from the last frame
|
||||
// LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
|
||||
// bool needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);
|
||||
// if(mFilterTabs)
|
||||
// if (mFilterTabs)
|
||||
// {
|
||||
// // Check to see if we are auto scrolling from the last frame
|
||||
// LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
|
||||
// bool needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);
|
||||
// if(needsToScroll)
|
||||
// {
|
||||
// mFilterTabs->startDragAndDropDelayTimer();
|
||||
|
|
@ -1261,9 +1261,9 @@ void LLPanelMainInventory::changed(U32)
|
|||
updateItemcountText();
|
||||
}
|
||||
|
||||
void LLPanelMainInventory::setFocusFilterEditor()
|
||||
void LLPanelMainInventory::setFocusOnFilterEditor()
|
||||
{
|
||||
if(mFilterEditor)
|
||||
if (mFilterEditor)
|
||||
{
|
||||
mFilterEditor->setFocus(true);
|
||||
}
|
||||
|
|
@ -1339,6 +1339,22 @@ void LLPanelMainInventory::updateItemcountText()
|
|||
mCategoryCount = gInventory.getCategoryCount();
|
||||
update = true;
|
||||
}
|
||||
|
||||
EFetchState currentFetchState{ EFetchState::Unknown };
|
||||
if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())
|
||||
{
|
||||
currentFetchState = EFetchState::Fetching;
|
||||
}
|
||||
else if (LLInventoryModelBackgroundFetch::instance().isEverythingFetched())
|
||||
{
|
||||
currentFetchState = EFetchState::Complete;
|
||||
}
|
||||
|
||||
if (mLastFetchState != currentFetchState)
|
||||
{
|
||||
mLastFetchState = currentFetchState;
|
||||
update = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mLastFilterText != getFilterText())
|
||||
|
|
@ -1374,17 +1390,17 @@ void LLPanelMainInventory::updateItemcountText()
|
|||
}
|
||||
else
|
||||
{
|
||||
if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())
|
||||
switch (mLastFetchState)
|
||||
{
|
||||
case EFetchState::Fetching:
|
||||
text = getString("ItemcountFetching", string_args);
|
||||
}
|
||||
else if (LLInventoryModelBackgroundFetch::instance().isEverythingFetched())
|
||||
{
|
||||
break;
|
||||
case EFetchState::Complete:
|
||||
text = getString("ItemcountCompleted", string_args);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
default:
|
||||
text = getString("ItemcountUnknown", string_args);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1632,7 +1648,6 @@ void LLFloaterInventoryFinder::draw()
|
|||
filtered_by_all_types = false;
|
||||
}
|
||||
|
||||
|
||||
if (!getChild<LLUICtrl>("check_calling_card")->getValue())
|
||||
{
|
||||
filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
|
||||
|
|
@ -1652,8 +1667,6 @@ void LLFloaterInventoryFinder::draw()
|
|||
}
|
||||
|
||||
if (!getChild<LLUICtrl>("check_landmark")->getValue())
|
||||
|
||||
|
||||
{
|
||||
filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
|
||||
filtered_by_all_types = false;
|
||||
|
|
@ -1714,9 +1727,8 @@ void LLFloaterInventoryFinder::draw()
|
|||
filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
|
||||
}
|
||||
|
||||
|
||||
bool is_sf_mode = mPanelMainInventory->isSingleFolderMode();
|
||||
if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
|
||||
if (is_sf_mode && mPanelMainInventory->isGalleryViewMode())
|
||||
{
|
||||
mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
|
||||
LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
|
||||
|
|
@ -1724,7 +1736,7 @@ void LLFloaterInventoryFinder::draw()
|
|||
}
|
||||
else
|
||||
{
|
||||
if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
|
||||
if (is_sf_mode && mPanelMainInventory->isCombinationViewMode())
|
||||
{
|
||||
mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
|
||||
LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
|
||||
|
|
@ -1756,9 +1768,8 @@ void LLFloaterInventoryFinder::draw()
|
|||
}
|
||||
hours += days * 24;
|
||||
|
||||
|
||||
mPanelMainInventory->setFilterTextFromFilter();
|
||||
if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
|
||||
if (is_sf_mode && mPanelMainInventory->isGalleryViewMode())
|
||||
{
|
||||
mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
|
||||
mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
|
||||
|
|
@ -1766,7 +1777,7 @@ void LLFloaterInventoryFinder::draw()
|
|||
}
|
||||
else
|
||||
{
|
||||
if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
|
||||
if (is_sf_mode && mPanelMainInventory->isCombinationViewMode())
|
||||
{
|
||||
mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
|
||||
mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ public:
|
|||
|
||||
void onFilterEdit(const std::string& search_string );
|
||||
|
||||
void setFocusFilterEditor();
|
||||
void setFocusOnFilterEditor();
|
||||
|
||||
static LLFloaterSidePanelContainer* newWindow();
|
||||
static void newFolderWindow(LLUUID folder_id = LLUUID(), LLUUID item_to_select = LLUUID());
|
||||
|
|
@ -208,6 +208,13 @@ protected:
|
|||
LLSidepanelInventory* getParentSidepanelInventory();
|
||||
|
||||
private:
|
||||
enum class EFetchState
|
||||
{
|
||||
Unknown,
|
||||
Fetching,
|
||||
Complete
|
||||
};
|
||||
|
||||
LLFloaterInventoryFinder* getFinder();
|
||||
|
||||
LLFilterEditor* mFilterEditor;
|
||||
|
|
@ -228,6 +235,7 @@ private:
|
|||
S32 mCategoryCount = 0;
|
||||
std::string mCategoryCountString;
|
||||
LLComboBox* mSearchTypeCombo;
|
||||
EFetchState mLastFetchState{ EFetchState::Unknown };
|
||||
|
||||
LLButton* mBackBtn;
|
||||
LLButton* mForwardBtn;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -73,6 +73,8 @@ public:
|
|||
void startRenamingSelectedItem();
|
||||
|
||||
LLFolderView* getRootFolder() const { return mFolders; }
|
||||
LLInventoryFilter& getFilter() { return mInventoryViewModel.getFilter(); }
|
||||
const LLInventoryFilter& getFilter() const { return mInventoryViewModel.getFilter(); }
|
||||
|
||||
virtual void draw();
|
||||
virtual void deleteAllChildren();
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ bool LLFloaterSettingsPicker::postBuild()
|
|||
setTitle(prefix + " " + label);
|
||||
|
||||
mFilterEdit = getChild<LLFilterEditor>(FLT_INVENTORY_SEARCH);
|
||||
mFilterEdit->setCommitCallback([this](LLUICtrl*, const LLSD& param){ onFilterEdit(param.asString()); });
|
||||
mFilterEdit->setCommitCallback([this](LLUICtrl*, const LLSD& param) { onFilterEdit(param.asString()); });
|
||||
|
||||
mInventoryPanel = getChild<LLInventoryPanel>(PNL_INVENTORY);
|
||||
if (mInventoryPanel)
|
||||
|
|
@ -203,7 +203,6 @@ void LLFloaterSettingsPicker::draw()
|
|||
LLFloater::draw();
|
||||
}
|
||||
|
||||
|
||||
//=========================================================================
|
||||
void LLFloaterSettingsPicker::onFilterEdit(const std::string& search_string)
|
||||
{
|
||||
|
|
@ -224,7 +223,6 @@ void LLFloaterSettingsPicker::onFilterEdit(const std::string& search_string)
|
|||
LLOpenFoldersWithSelection opener;
|
||||
mInventoryPanel->getRootFolder()->applyFunctorRecursively(opener);
|
||||
mInventoryPanel->getRootFolder()->scrollToShowSelection();
|
||||
|
||||
}
|
||||
else if (mInventoryPanel->getFilterSubString().empty())
|
||||
{
|
||||
|
|
@ -269,6 +267,7 @@ void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::i
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool track_picker_enabled = mTrackMode != TRACK_NONE;
|
||||
|
||||
getChild<LLView>(CMB_TRACK_SELECTION)->setEnabled(is_item && track_picker_enabled && mSettingAssetID == asset_id);
|
||||
|
|
@ -304,13 +303,14 @@ void LLFloaterSettingsPicker::onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr
|
|||
LLComboBox* track_selection = getChild<LLComboBox>(CMB_TRACK_SELECTION);
|
||||
track_selection->clear();
|
||||
track_selection->removeall();
|
||||
|
||||
if (!settings)
|
||||
{
|
||||
LL_WARNS() << "Failed to load asset " << asset_id << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
LLSettingsDay::ptr_t pday = std::dynamic_pointer_cast<LLSettingsDay>(settings);
|
||||
|
||||
LLSettingsDay::ptr_t pday = std::dynamic_pointer_cast<LLSettingsDay>(settings);
|
||||
if (!pday)
|
||||
{
|
||||
LL_WARNS() << "Wrong asset type received by id " << asset_id << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -469,7 +469,7 @@ void LLSidepanelInventory::onToggleInboxBtn()
|
|||
void LLSidepanelInventory::onOpen(const LLSD& key)
|
||||
{
|
||||
LLFirstUse::newInventory(false);
|
||||
mPanelMainInventory->setFocusFilterEditor();
|
||||
mPanelMainInventory->setFocusOnFilterEditor();
|
||||
#if AUTO_EXPAND_INBOX
|
||||
// Expand the inbox if we have fresh items
|
||||
LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
|
||||
|
|
|
|||
|
|
@ -306,7 +306,7 @@ bool LLSpatialGroup::addObject(LLDrawable *drawablep)
|
|||
}
|
||||
{
|
||||
drawablep->setGroup(this);
|
||||
setState(OBJECT_DIRTY | GEOM_DIRTY);
|
||||
setState(static_cast<U32>(OBJECT_DIRTY) | static_cast<U32>(GEOM_DIRTY));
|
||||
setOcclusionState(LLSpatialGroup::DISCARD_QUERY, LLSpatialGroup::STATE_MODE_ALL_CAMERAS);
|
||||
gPipeline.markRebuild(this);
|
||||
if (drawablep->isSpatialBridge())
|
||||
|
|
@ -738,7 +738,7 @@ bool LLSpatialGroup::changeLOD()
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;
|
||||
|
||||
if (hasState(ALPHA_DIRTY | OBJECT_DIRTY))
|
||||
if (hasState(static_cast<U32>(ALPHA_DIRTY) | static_cast<U32>(OBJECT_DIRTY)))
|
||||
{
|
||||
//a rebuild is going to happen, update distance and LoD
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
#include <unordered_map>
|
||||
|
||||
#define SG_STATE_INHERIT_MASK (OCCLUDED)
|
||||
#define SG_INITIAL_STATE_MASK (DIRTY | GEOM_DIRTY)
|
||||
#define SG_INITIAL_STATE_MASK (static_cast<U32>(DIRTY) | static_cast<U32>(GEOM_DIRTY))
|
||||
|
||||
class LLViewerOctreePartition;
|
||||
class LLSpatialPartition;
|
||||
|
|
|
|||
|
|
@ -12546,6 +12546,8 @@ void initialize_menus()
|
|||
commit.add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2));
|
||||
enable.add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2));
|
||||
enable.add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2));
|
||||
commit.add("Agent.ToggleHearMediaSoundFromAvatar", boost::bind(&LLAgent::toggleHearMediaSoundFromAvatar));
|
||||
commit.add("Agent.ToggleHearVoiceFromAvatar", boost::bind(&LLAgent::toggleHearVoiceFromAvatar));
|
||||
|
||||
// File menu
|
||||
init_menu_file();
|
||||
|
|
|
|||
|
|
@ -288,15 +288,16 @@ extern LLViewerObjectList gObjectList;
|
|||
*/
|
||||
inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
|
||||
{
|
||||
if (id.isNull())
|
||||
return NULL;
|
||||
|
||||
auto iter = mUUIDObjectMap.find(id);
|
||||
if(iter != mUUIDObjectMap.end())
|
||||
if (iter != mUUIDObjectMap.end())
|
||||
{
|
||||
return iter->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
inline LLViewerObject *LLViewerObjectList::getObject(const S32 index)
|
||||
|
|
|
|||
|
|
@ -352,12 +352,10 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
|
|||
|
||||
impl = regionp->getRegionImplNC();
|
||||
|
||||
// <FS:Ansariel> Fix seed cap retry count
|
||||
//++(impl->mSeedCapAttempts);
|
||||
|
||||
if (!result.isMap() || result.has("error"))
|
||||
{
|
||||
LL_WARNS("AppInit", "Capabilities") << "Malformed response" << LL_ENDL;
|
||||
++(impl->mSeedCapAttempts);
|
||||
// setup for retry.
|
||||
continue;
|
||||
}
|
||||
|
|
@ -367,6 +365,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
|
|||
if (!status)
|
||||
{
|
||||
LL_WARNS("AppInit", "Capabilities") << "HttpStatus error " << LL_ENDL;
|
||||
++(impl->mSeedCapAttempts);
|
||||
// setup for retry.
|
||||
continue;
|
||||
}
|
||||
|
|
@ -377,8 +376,8 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
|
|||
if (id != impl->mHttpResponderID) // region is no longer referring to this request
|
||||
{
|
||||
LL_WARNS("AppInit", "Capabilities") << "Received results for a stale capabilities request!" << LL_ENDL;
|
||||
++(impl->mSeedCapAttempts);
|
||||
// setup for retry.
|
||||
++(impl->mSeedCapAttempts); // <FS:Ansariel> Fix seed cap retry count
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -586,7 +586,7 @@ S32 LLEmbeddedItems::getIndexFromEmbeddedChar(llwchar wch)
|
|||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Embedded char " << wch << " not found, using 0" << LL_ENDL;
|
||||
LL_WARNS() << "Embedded char " << (int)wch << " not found, using 0" << LL_ENDL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9358,14 +9358,14 @@ bool LLVOAvatar::isFullyLoaded() const
|
|||
bool LLVOAvatar::isTooComplex() const
|
||||
{
|
||||
bool too_complex;
|
||||
static LLCachedControl<S32> compelxity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
|
||||
bool render_friend = (isBuddy() && compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY);
|
||||
static LLCachedControl<S32> complexity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
|
||||
bool render_friend = (isBuddy() && complexity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY);
|
||||
|
||||
if (isSelf() || render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
|
||||
{
|
||||
too_complex = false;
|
||||
}
|
||||
else if (compelxity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS && !mIsControlAvatar)
|
||||
else if (complexity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS && !mIsControlAvatar)
|
||||
{
|
||||
too_complex = true;
|
||||
}
|
||||
|
|
@ -9393,16 +9393,16 @@ bool LLVOAvatar::isTooSlow() const
|
|||
return mTooSlow;
|
||||
}
|
||||
|
||||
static LLCachedControl<S32> compelxity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
|
||||
static LLCachedControl<S32> complexity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
|
||||
static LLCachedControl<bool> friends_only(gSavedSettings, "RenderAvatarFriendsOnly", false);
|
||||
bool is_friend = isBuddy();
|
||||
bool render_friend = is_friend && compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY;
|
||||
bool render_friend = is_friend && complexity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY;
|
||||
|
||||
if (render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (compelxity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS)
|
||||
else if (complexity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
@ -9418,7 +9418,7 @@ bool LLVOAvatar::isTooSlow() const
|
|||
void LLVOAvatar::updateTooSlow()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
|
||||
static LLCachedControl<S32> compelxity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
|
||||
static LLCachedControl<S32> complexity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
|
||||
static LLCachedControl<bool> allowSelfImpostor(gSavedSettings, "AllowSelfImpostor");
|
||||
const auto id = getID();
|
||||
bool changed_slow_state{false}; // <FS:Beq> Post LL merge, force dirty when slowness state changes
|
||||
|
|
@ -9452,14 +9452,14 @@ void LLVOAvatar::updateTooSlow()
|
|||
|
||||
if(!mTooSlowWithoutShadows) // if we were not previously above the full impostor cap
|
||||
{
|
||||
bool always_render_friends = compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY;
|
||||
bool always_render_friends = complexity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY;
|
||||
bool render_friend_or_exception = (always_render_friends && isBuddy()) ||
|
||||
( getVisualMuteSettings() == LLVOAvatar::AV_ALWAYS_RENDER );
|
||||
if( (!isSelf() || allowSelfImpostor) && !render_friend_or_exception)
|
||||
{
|
||||
// Note: slow rendering Friends still get their shadows zapped.
|
||||
mTooSlowWithoutShadows = (getGPURenderTime()*2.f >= max_art_ms) // NOTE: assumes shadow rendering doubles render time
|
||||
|| (compelxity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS && !mIsControlAvatar);
|
||||
|| (complexity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS && !mIsControlAvatar);
|
||||
}
|
||||
if(mTooSlowWithoutShadows)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -606,7 +606,7 @@ U32 LLVOGrass::getPartitionType() const
|
|||
}
|
||||
|
||||
LLGrassPartition::LLGrassPartition(LLViewerRegion* regionp)
|
||||
: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK | LLVertexBuffer::MAP_TEXTURE_INDEX, true, regionp)
|
||||
: LLSpatialPartition(static_cast<U32>(LLDrawPoolAlpha::VERTEX_DATA_MASK) | static_cast<U32>(LLVertexBuffer::MAP_TEXTURE_INDEX), true, regionp)
|
||||
{
|
||||
mDrawableType = LLPipeline::RENDER_TYPE_GRASS;
|
||||
mPartitionType = LLViewerRegion::PARTITION_GRASS;
|
||||
|
|
|
|||
|
|
@ -264,8 +264,8 @@ void LLVoiceClient::setSpatialVoiceModule(const std::string &voice_server_type)
|
|||
if (inProximalChannel())
|
||||
{
|
||||
mSpatialVoiceModule->processChannels(false);
|
||||
module->processChannels(true);
|
||||
}
|
||||
module->processChannels(true);
|
||||
mSpatialVoiceModule = module;
|
||||
mSpatialVoiceModule->updateSettings();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -716,7 +716,7 @@ U32 LLVOPartGroup::getPartitionType() const
|
|||
}
|
||||
|
||||
LLParticlePartition::LLParticlePartition(LLViewerRegion* regionp)
|
||||
: LLSpatialPartition(LLDrawPoolAlpha::VERTEX_DATA_MASK | LLVertexBuffer::MAP_TEXTURE_INDEX, true, regionp)
|
||||
: LLSpatialPartition(static_cast<U32>(LLDrawPoolAlpha::VERTEX_DATA_MASK) | static_cast<U32>(LLVertexBuffer::MAP_TEXTURE_INDEX), true, regionp)
|
||||
{
|
||||
mRenderPass = LLRenderPass::PASS_ALPHA;
|
||||
mDrawableType = LLPipeline::RENDER_TYPE_PARTICLES;
|
||||
|
|
|
|||
|
|
@ -201,6 +201,7 @@ LLWorldMapView::LLWorldMapView() :
|
|||
mMouseDownY(0),
|
||||
mSelectIDStart(0),
|
||||
mMapScale(0.f),
|
||||
mMapRatio(0.5),
|
||||
mTargetMapScale(0.f),
|
||||
mMapIterpTime(MAP_ITERP_TIME_CONSTANT)
|
||||
{
|
||||
|
|
@ -300,7 +301,9 @@ void LLWorldMapView::setScale(F32 scale, bool snap)
|
|||
{
|
||||
mMapScale = 0.1f;
|
||||
}
|
||||
mMapRatio = mMapScale / REGION_WIDTH_METERS;
|
||||
mMapIterpTime = MAP_ITERP_TIME_CONSTANT;
|
||||
|
||||
F32 ratio = (scale / old_scale);
|
||||
mPanX *= ratio;
|
||||
mPanY *= ratio;
|
||||
|
|
@ -374,16 +377,10 @@ bool is_agent_in_region(LLViewerRegion* region, LLSimInfo* info)
|
|||
|
||||
void LLWorldMapView::draw()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white);
|
||||
|
||||
// Ansariel: Replaced slow calls to gSavedSettings with faster LLCachedControl
|
||||
static LLCachedControl<bool> mapShowInfohubs(gSavedSettings, "MapShowInfohubs");
|
||||
static LLCachedControl<bool> mapShowTelehubs(gSavedSettings, "MapShowTelehubs");
|
||||
static LLCachedControl<bool> mapShowLandForSale(gSavedSettings, "MapShowLandForSale");
|
||||
static LLCachedControl<bool> mapShowEvents(gSavedSettings, "MapShowEvents");
|
||||
static LLCachedControl<bool> mapShowPeople(gSavedSettings, "MapShowPeople");
|
||||
static LLCachedControl<bool> showMatureEvents(gSavedSettings, "ShowMatureEvents");
|
||||
static LLCachedControl<bool> showAdultEvents(gSavedSettings, "ShowAdultEvents");
|
||||
static LLCachedControl<bool> drawAdvancedRegionInfo(gSavedSettings, "FSAdvancedWorldmapRegionInfo");
|
||||
static LLCachedControl<bool> sDrawRegionGridCoordinates(gSavedSettings, "FSShowRegionGridCoordinates", false);
|
||||
|
||||
|
|
@ -446,13 +443,9 @@ void LLWorldMapView::draw()
|
|||
// </FS:CR> Aurora Sim
|
||||
|
||||
// Draw per sim overlayed information (names, mature, offline...)
|
||||
// <FS:Ansariel> Performance tweak
|
||||
//for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin();
|
||||
// it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
|
||||
LLWorldMap::sim_info_map_t::const_iterator end_it = LLWorldMap::instance().getRegionMap().end();
|
||||
for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::instance().getRegionMap().begin();
|
||||
it != end_it; ++it)
|
||||
// </FS:Ansariel>
|
||||
static LLCachedControl<bool> show_for_sale(gSavedSettings, "MapShowLandForSale");
|
||||
LLWorldMap::sim_info_map_t::const_iterator end = LLWorldMap::instance().getRegionMap().end();
|
||||
for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); it != end; ++it)
|
||||
{
|
||||
U64 handle = it->first;
|
||||
LLSimInfo* info = it->second;
|
||||
|
|
@ -461,8 +454,8 @@ void LLWorldMapView::draw()
|
|||
|
||||
// Find x and y position relative to camera's center.
|
||||
LLVector3d rel_region_pos = origin_global - camera_global;
|
||||
F32 relative_x = (F32)(rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * mMapScale;
|
||||
F32 relative_y = (F32)(rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * mMapScale;
|
||||
F32 relative_x = (F32)(rel_region_pos.mdV[0] * mMapRatio);
|
||||
F32 relative_y = (F32)(rel_region_pos.mdV[1] * mMapRatio);
|
||||
|
||||
// Coordinates of the sim in pixels in the UI panel
|
||||
// When the view isn't panned, 0,0 = center of rectangle
|
||||
|
|
@ -522,9 +515,9 @@ void LLWorldMapView::draw()
|
|||
}
|
||||
// <FS:CR> Aurora Sim
|
||||
#ifdef OPENSIM
|
||||
else if ((mapShowLandForSale && (level <= DRAW_LANDFORSALE_THRESHOLD)) || LLGridManager::getInstance()->isInAuroraSim())
|
||||
else if ((show_for_sale && (level <= DRAW_LANDFORSALE_THRESHOLD)) || LLGridManager::getInstance()->isInAuroraSim())
|
||||
#else
|
||||
else if (mapShowLandForSale && (level <= DRAW_LANDFORSALE_THRESHOLD))
|
||||
else if (show_for_sale && (level <= DRAW_LANDFORSALE_THRESHOLD))
|
||||
#endif //OPENSIM
|
||||
|
||||
{
|
||||
|
|
@ -589,7 +582,6 @@ void LLWorldMapView::draw()
|
|||
// Draw the region name in the lower left corner
|
||||
if (mMapScale >= DRAW_TEXT_THRESHOLD)
|
||||
{
|
||||
LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Small", LLFontGL::BOLD));
|
||||
std::string mesg;
|
||||
{
|
||||
mesg = info->getName();
|
||||
|
|
@ -599,7 +591,7 @@ void LLWorldMapView::draw()
|
|||
if ( (!mesg.empty()) && (RlvActions::canShowLocation()) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
font->renderUTF8(
|
||||
LLFontGL::getFontSansSerifSmallBold()->renderUTF8(
|
||||
mesg, 0,
|
||||
//(F32)llfloor(left + 3), (F32)llfloor(bottom + 2),
|
||||
(F32)llfloor(left + 3.f), (F32)llfloor(bottom + (drawAdvancedRegionInfo ? 16.f : 2.f)),
|
||||
|
|
@ -631,7 +623,7 @@ void LLWorldMapView::draw()
|
|||
|
||||
advanced_info += llformat("%s)", info->getAccessString().c_str());
|
||||
|
||||
font->renderUTF8(
|
||||
LLFontGL::getFontSansSerifSmallBold()->renderUTF8(
|
||||
advanced_info, 0,
|
||||
(F32)llfloor(left + 3.f), (F32)llfloor(bottom + 2.f),
|
||||
LLColor4::white,
|
||||
|
|
@ -649,20 +641,26 @@ void LLWorldMapView::draw()
|
|||
LLVector3d origin = info->getGlobalOrigin();
|
||||
std::ostringstream coords;
|
||||
coords << "(" << origin.mdV[VX] / REGION_WIDTH_METERS << "," << origin.mdV[VY] / REGION_WIDTH_METERS << ")";
|
||||
font->renderUTF8(coords.str(), 0, llfloor(left + 3), llfloor(bottom + (drawAdvancedRegionInfo ? 30.f : 16.f)), LLColor4::white,
|
||||
LLFontGL::getFontSansSerifSmallBold()->renderUTF8(coords.str(), 0, llfloor(left + 3), llfloor(bottom + (drawAdvancedRegionInfo ? 30.f : 16.f)), LLColor4::white,
|
||||
LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW);
|
||||
}
|
||||
// </FS:CR>
|
||||
}
|
||||
}
|
||||
|
||||
static LLCachedControl<bool> show_infohubs(gSavedSettings, "MapShowInfohubs");
|
||||
static LLCachedControl<bool> show_telehubs(gSavedSettings, "MapShowTelehubs");
|
||||
static LLCachedControl<bool> show_events(gSavedSettings, "MapShowEvents");
|
||||
static LLCachedControl<bool> show_mature_events(gSavedSettings, "ShowMatureEvents");
|
||||
static LLCachedControl<bool> show_adult_events(gSavedSettings, "ShowAdultEvents");
|
||||
|
||||
// Draw item infos if we're not zoomed out too much and there's something to draw
|
||||
if ((level <= DRAW_SIMINFO_THRESHOLD) && (mapShowInfohubs ||
|
||||
mapShowTelehubs ||
|
||||
mapShowLandForSale ||
|
||||
mapShowEvents ||
|
||||
showMatureEvents ||
|
||||
showAdultEvents))
|
||||
if ((level <= DRAW_SIMINFO_THRESHOLD) && (show_infohubs ||
|
||||
show_telehubs ||
|
||||
show_for_sale ||
|
||||
show_events ||
|
||||
show_mature_events ||
|
||||
show_adult_events))
|
||||
{
|
||||
drawItems();
|
||||
}
|
||||
|
|
@ -694,6 +692,7 @@ void LLWorldMapView::draw()
|
|||
|
||||
// Draw icons for the avatars in each region.
|
||||
// Drawn this after the current agent avatar so one can see nearby people
|
||||
static LLCachedControl<bool> mapShowPeople(gSavedSettings, "MapShowPeople");
|
||||
if (mapShowPeople && (level <= DRAW_SIMINFO_THRESHOLD))
|
||||
{
|
||||
drawAgents();
|
||||
|
|
@ -982,18 +981,12 @@ void LLWorldMapView::drawImageStack(const LLVector3d& global_pos, LLUIImagePtr i
|
|||
|
||||
void LLWorldMapView::drawItems()
|
||||
{
|
||||
bool mature_enabled = gAgent.canAccessMature();
|
||||
bool adult_enabled = gAgent.canAccessAdult();
|
||||
|
||||
// Ansariel: Replaced slow calls to gSavedSettings with faster LLCachedControl
|
||||
static LLCachedControl<bool> mapShowInfohubs(gSavedSettings, "MapShowInfohubs");
|
||||
static LLCachedControl<bool> mapShowTelehubs(gSavedSettings, "MapShowTelehubs");
|
||||
static LLCachedControl<bool> mapShowLandForSale(gSavedSettings, "MapShowLandForSale");
|
||||
static LLCachedControl<bool> mapShowEvents(gSavedSettings, "MapShowEvents");
|
||||
static LLCachedControl<bool> showMatureEvents(gSavedSettings, "ShowMatureEvents");
|
||||
static LLCachedControl<bool> showAdultEvents(gSavedSettings, "ShowAdultEvents");
|
||||
bool show_mature = mature_enabled && showMatureEvents;
|
||||
bool show_adult = adult_enabled && showAdultEvents;
|
||||
static LLCachedControl<bool> show_infohubs(gSavedSettings, "MapShowInfohubs");
|
||||
static LLCachedControl<bool> show_telehubs(gSavedSettings, "MapShowTelehubs");
|
||||
static LLCachedControl<bool> show_events(gSavedSettings, "MapShowEvents");
|
||||
static LLCachedControl<bool> show_mature_events(gSavedSettings, "ShowMatureEvents");
|
||||
static LLCachedControl<bool> show_adult_events(gSavedSettings, "ShowAdultEvents");
|
||||
static LLCachedControl<bool> show_for_sale(gSavedSettings, "MapShowLandForSale");
|
||||
|
||||
// <FS:Ansariel> Performance tweak
|
||||
LLWorldMap* world_map = LLWorldMap::getInstance();
|
||||
|
|
@ -1010,17 +1003,17 @@ void LLWorldMapView::drawItems()
|
|||
continue;
|
||||
}
|
||||
// Infohubs
|
||||
if (mapShowInfohubs)
|
||||
if (show_infohubs)
|
||||
{
|
||||
drawGenericItems(info->getInfoHub(), sInfohubImage);
|
||||
}
|
||||
// Telehubs
|
||||
if (mapShowTelehubs)
|
||||
if (show_telehubs)
|
||||
{
|
||||
drawGenericItems(info->getTeleHub(), sTelehubImage);
|
||||
}
|
||||
// Land for sale
|
||||
if (mapShowLandForSale)
|
||||
if (show_for_sale)
|
||||
{
|
||||
drawGenericItems(info->getLandForSale(), sForSaleImage);
|
||||
// for 1.23, we're showing normal land and adult land in the same UI; you don't
|
||||
|
|
@ -1032,17 +1025,17 @@ void LLWorldMapView::drawItems()
|
|||
}
|
||||
}
|
||||
// PG Events
|
||||
if (mapShowEvents)
|
||||
if (show_events)
|
||||
{
|
||||
drawGenericItems(info->getPGEvent(), sEventImage);
|
||||
}
|
||||
// Mature Events
|
||||
if (show_mature)
|
||||
if (show_mature_events && gAgent.canAccessMature())
|
||||
{
|
||||
drawGenericItems(info->getMatureEvent(), sEventMatureImage);
|
||||
}
|
||||
// Adult Events
|
||||
if (show_adult)
|
||||
if (show_adult_events && gAgent.canAccessAdult())
|
||||
{
|
||||
drawGenericItems(info->getAdultEvent(), sEventAdultImage);
|
||||
}
|
||||
|
|
@ -1083,14 +1076,12 @@ void LLWorldMapView::drawAgents()
|
|||
void LLWorldMapView::drawFrustum()
|
||||
{
|
||||
// Draw frustum
|
||||
F32 meters_to_pixels = mMapScale/ REGION_WIDTH_METERS;
|
||||
|
||||
F32 horiz_fov = LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect();
|
||||
F32 far_clip_meters = LLViewerCamera::getInstance()->getFar();
|
||||
F32 far_clip_pixels = far_clip_meters * meters_to_pixels;
|
||||
F32 far_clip_pixels = far_clip_meters * mMapRatio;
|
||||
|
||||
F32 half_width_meters = far_clip_meters * tan( horiz_fov / 2 );
|
||||
F32 half_width_pixels = half_width_meters * meters_to_pixels;
|
||||
F32 half_width_pixels = half_width_meters * mMapRatio;
|
||||
|
||||
// Compute the frustum coordinates. Take the UI scale into account.
|
||||
F32 ctr_x = ((getLocalRect().getWidth() * 0.5f + mPanX) * LLUI::getScaleFactor().mV[VX]);
|
||||
|
|
@ -1151,8 +1142,8 @@ LLVector3 LLWorldMapView::globalPosToView( const LLVector3d& global_pos )
|
|||
LLVector3 pos_local;
|
||||
pos_local.setVec(relative_pos_global); // convert to floats from doubles
|
||||
|
||||
pos_local.mV[VX] *= mMapScale / REGION_WIDTH_METERS;
|
||||
pos_local.mV[VY] *= mMapScale / REGION_WIDTH_METERS;
|
||||
pos_local.mV[VX] *= mMapRatio;
|
||||
pos_local.mV[VY] *= mMapRatio;
|
||||
// leave Z component in meters
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -210,6 +210,7 @@ private:
|
|||
|
||||
F32 mMapScale;
|
||||
F32 mTargetMapScale;
|
||||
F32 mMapRatio;
|
||||
static F32 sMapScaleSetting;
|
||||
static LLVector2 sZoomPivot;
|
||||
static LLFrameTimer sZoomTimer;
|
||||
|
|
|
|||
|
|
@ -3336,16 +3336,27 @@ Low ↔ Lwst
|
|||
top_pad="1"
|
||||
name="btn_reset_scripts"
|
||||
width="90" />
|
||||
<panel_inventory_object
|
||||
<filter_editor
|
||||
follows="left|top|right"
|
||||
label="Enter filter text"
|
||||
layout="topleft"
|
||||
top="45"
|
||||
left="10"
|
||||
max_length_chars="300"
|
||||
highlight_text_field="true"
|
||||
name="contents_filter"
|
||||
height="23"
|
||||
width="275" />
|
||||
<panel_inventory_object
|
||||
border="true"
|
||||
border_visible="true"
|
||||
bevel_style="in"
|
||||
follows="left|top|right"
|
||||
height="345"
|
||||
height="325"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
name="contents_inventory"
|
||||
top="50"
|
||||
top="70"
|
||||
width="275" />
|
||||
</panel>
|
||||
</tab_container>
|
||||
|
|
|
|||
|
|
@ -467,6 +467,27 @@
|
|||
|
||||
<menu_item_separator/>
|
||||
|
||||
<menu_item_check
|
||||
label="Hear Media and Sound from Avatar"
|
||||
name="Hear Media and Sound from Avatar">
|
||||
<menu_item_check.on_check
|
||||
control="MediaSoundsEarLocation" />
|
||||
<menu_item_check.on_click
|
||||
function="Agent.ToggleHearMediaSoundFromAvatar" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Hear Voice from Avatar"
|
||||
name="Hear Voice from Avatar">
|
||||
<menu_item_check.on_check
|
||||
control="VoiceEarLocation" />
|
||||
<menu_item_check.on_click
|
||||
function="Agent.ToggleHearVoiceFromAvatar" />
|
||||
<menu_item_call.on_enable
|
||||
control="EnableVoiceChat" />
|
||||
</menu_item_check>
|
||||
|
||||
<menu_item_separator/>
|
||||
|
||||
<menu
|
||||
create_jump_keys="true"
|
||||
label="Avatar Health"
|
||||
|
|
|
|||
Loading…
Reference in New Issue