Merge Firestorm LGPL
commit
6d6111814a
|
|
@ -2,9 +2,9 @@
|
|||
* @file
|
||||
* @brief
|
||||
*
|
||||
* $LicenseInfo:firstyear=2017&license=fsviewerlgpl$
|
||||
* $LicenseInfo:firstyear=2018&license=fsviewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (C) 2017, The Phoenix Firestorm Project, Inc.
|
||||
* Copyright (C) 2018, The Phoenix Firestorm Project, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
|
|
|||
|
|
@ -1005,15 +1005,29 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>1331456a3df95294eaf44fab990f62cd</string>
|
||||
<string>eccdcb4a1e96bb829284d01255f4f913</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-1.10.02-linux-.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-1.10.02-linux-201801091647.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
</map>
|
||||
<key>linux64</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>8787b777a49d41ccbb3cbd6c4a1d768d</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-1.10.02-linux-x64-201801091648.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
</map>
|
||||
<key>windows</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
|
|
@ -3885,7 +3899,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>package_description</key>
|
||||
<map>
|
||||
<key>copyright</key>
|
||||
<string>Copyright (c) 2017, The Phoenix Firestorm Project, Inc.</string>
|
||||
<string>Copyright (c) 2018, The Phoenix Firestorm Project, Inc.</string>
|
||||
<key>description</key>
|
||||
<string>Firestorm Viewer</string>
|
||||
<key>license</key>
|
||||
|
|
@ -4501,7 +4515,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>options</key>
|
||||
<array>
|
||||
<string>--kdu</string>
|
||||
<string>--fmodex</string>
|
||||
<string>--fmodstudio</string>
|
||||
<string>--platform linux32</string>
|
||||
<string>--package</string>
|
||||
<string>--btype RelWithDebInfo</string>
|
||||
|
|
@ -4555,7 +4569,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>options</key>
|
||||
<array>
|
||||
<string>--kdu</string>
|
||||
<string>--fmodex</string>
|
||||
<string>--fmodstudio</string>
|
||||
<string>--platform linux32</string>
|
||||
</array>
|
||||
</map>
|
||||
|
|
|
|||
|
|
@ -251,13 +251,8 @@ elseif(LINUX)
|
|||
)
|
||||
|
||||
if (FMODSTUDIO)
|
||||
if(ADDRESS_SIZE EQUAL 32)
|
||||
set(debug_files ${debug_files} "libfmodL.so")
|
||||
set(release_files ${release_files} "libfmod.so")
|
||||
else(ADDRESS_SIZE EQUAL 32)
|
||||
set(debug_files ${debug_files} "libfmodL64.so")
|
||||
set(release_files ${release_files} "libfmod64.so")
|
||||
endif(ADDRESS_SIZE EQUAL 32)
|
||||
set(debug_files ${debug_files} "libfmodL.so")
|
||||
set(release_files ${release_files} "libfmod.so")
|
||||
endif (FMODSTUDIO)
|
||||
|
||||
#if (FMODEX)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,10 @@ if (INSTALL_PROPRIETARY)
|
|||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
if (FMODEX)
|
||||
if (FMODSTUDIO)
|
||||
MESSAGE(FATAL_ERROR "You cannot use FMOD Ex if you are already using FMOD Studio.")
|
||||
endif (FMODSTUDIO)
|
||||
|
||||
if (USESYSTEMLIBS)
|
||||
# In that case, we use the version of the library installed on the system
|
||||
set(FMODEX_FIND_REQUIRED ON)
|
||||
|
|
|
|||
|
|
@ -126,9 +126,8 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata)
|
|||
break;
|
||||
}
|
||||
|
||||
// In this case, all sounds, PLUS wind and stream will be software.
|
||||
result = mSystem->setSoftwareChannels(num_channels + 2);
|
||||
Check_FMOD_Error(result,"FMOD::System::setSoftwareChannels");
|
||||
result = mSystem->setAdvancedSettings(&adv_settings);
|
||||
Check_FMOD_Error(result, "FMOD::System::setAdvancedSettings");
|
||||
|
||||
U32 fmod_flags = FMOD_INIT_NORMAL | FMOD_INIT_3D_RIGHTHANDED | FMOD_INIT_THREAD_UNSAFE;
|
||||
if(mEnableProfiler)
|
||||
|
|
@ -239,6 +238,11 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata)
|
|||
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::init() FMOD Studio initialized correctly" << LL_ENDL;
|
||||
|
||||
FMOD_ADVANCEDSETTINGS adv_settings_dump = { };
|
||||
mSystem->getAdvancedSettings(&adv_settings_dump);
|
||||
|
||||
LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::init(): resampler=" << adv_settings.resamplerMethod << " bytes" << LL_ENDL;
|
||||
|
||||
int r_numbuffers, r_samplerate, r_channels;
|
||||
unsigned int r_bufferlength;
|
||||
mSystem->getDSPBufferSize(&r_bufferlength, &r_numbuffers);
|
||||
|
|
|
|||
|
|
@ -947,13 +947,7 @@ void LLFloater::applyControlsAndPosition(LLFloater* other)
|
|||
{
|
||||
if (!applyRectControl())
|
||||
{
|
||||
// <FS:Ansariel> Don't apply position to undocked IM floater (FIRE-5459)
|
||||
//applyPositioning(other);
|
||||
if (getName() != "panel_im")
|
||||
{
|
||||
applyPositioning(other, true);
|
||||
}
|
||||
// </FS:Ansariel> Don't apply position to undocked IM floater (FIRE-5459)
|
||||
applyPositioning(other, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -464,6 +464,9 @@ protected:
|
|||
LLResizeHandle* mResizeHandle[4];
|
||||
|
||||
LLButton* mButtons[BUTTON_COUNT];
|
||||
|
||||
// <FS:Ansariel> Make this accessible from child classes
|
||||
std::string mInstanceName; // Store the instance name so we can remove ourselves from the list
|
||||
private:
|
||||
LLRect mExpandedRect;
|
||||
|
||||
|
|
@ -473,7 +476,8 @@ private:
|
|||
BOOL mSingleInstance; // TRUE if there is only ever one instance of the floater
|
||||
bool mReuseInstance; // true if we want to hide the floater when we close it instead of destroying it
|
||||
bool mIsReuseInitialized; // true if mReuseInstance already set from parameters
|
||||
std::string mInstanceName; // Store the instance name so we can remove ourselves from the list
|
||||
// <FS:Ansariel> Make this accessible from child classes
|
||||
//std::string mInstanceName; // Store the instance name so we can remove ourselves from the list
|
||||
|
||||
BOOL mDropShadow; // ## Zi: Optional Drop Shadows
|
||||
S32 mLabelVPadding; // <FS:Zi> Make vertical label padding a per-skin option
|
||||
|
|
|
|||
|
|
@ -983,6 +983,9 @@ void LLFolderView::cut()
|
|||
LLClipboard::instance().reset();
|
||||
if(getVisible() && getEnabled() && (mSelectedItems.size() > 0))
|
||||
{
|
||||
// <FS:Ansariel> Next item gets selected if cutting in inventory
|
||||
bool cut_to_clipboard = true;
|
||||
|
||||
// Find out which item will be selected once the selection will be cut
|
||||
LLFolderViewItem* item_to_select = getNextUnselectedItem();
|
||||
|
||||
|
|
@ -997,10 +1000,12 @@ void LLFolderView::cut()
|
|||
if (listener)
|
||||
{
|
||||
listener->cutToClipboard();
|
||||
cut_to_clipboard &= listener->isCutToClipboard(); // <FS:Ansariel> Next item gets selected if cutting in inventory
|
||||
}
|
||||
}
|
||||
|
||||
// Update the selection
|
||||
if (!cut_to_clipboard) // <FS:Ansariel> Next item gets selected if cutting in inventory
|
||||
setSelection(item_to_select, item_to_select ? item_to_select->isOpen() : false, mParentPanel.get()->hasFocus());
|
||||
}
|
||||
mSearchString.clear();
|
||||
|
|
|
|||
|
|
@ -122,10 +122,6 @@ LLFolderViewItem::Params::Params()
|
|||
// <FS:Ansariel> Inventory specials
|
||||
for_inventory("for_inventory", false)
|
||||
{
|
||||
// <FS:Ansariel> User-definable item height in folder views
|
||||
static LLCachedControl<S32> FolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
item_height = (S32)FolderViewItemHeight;
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
// Default constructor
|
||||
|
|
@ -164,7 +160,8 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
|
|||
mArrowSize(p.arrow_size),
|
||||
mMaxFolderItemOverlap(p.max_folder_item_overlap),
|
||||
// <FS:Ansariel> Inventory specials
|
||||
mForInventory(p.for_inventory)
|
||||
mForInventory(p.for_inventory),
|
||||
mItemTopPad(p.item_top_pad)
|
||||
{
|
||||
if (!sColorSetInitialized)
|
||||
{
|
||||
|
|
@ -745,7 +742,9 @@ void LLFolderViewItem::drawOpenFolderArrow(const Params& default_params, const L
|
|||
//--------------------------------------------------------------------------------//
|
||||
// Draw open folder arrow
|
||||
//
|
||||
const S32 TOP_PAD = default_params.item_top_pad;
|
||||
// <FS:Ansariel> Inventory specials
|
||||
//const S32 TOP_PAD = default_params.item_top_pad;
|
||||
const S32 TOP_PAD = mItemTopPad;
|
||||
|
||||
if (hasVisibleChildren() || !isFolderComplete())
|
||||
{
|
||||
|
|
@ -905,7 +904,9 @@ void LLFolderViewItem::draw()
|
|||
const BOOL filled = show_context || (getRoot() ? getRoot()->getParentPanel()->hasFocus() : FALSE); // If we have keyboard focus, draw selection filled
|
||||
|
||||
const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
const S32 TOP_PAD = default_params.item_top_pad;
|
||||
// <FS:Ansariel> Inventory specials
|
||||
//const S32 TOP_PAD = default_params.item_top_pad;
|
||||
const S32 TOP_PAD = mItemTopPad;
|
||||
|
||||
const LLFontGL* font = getLabelFontForStyle(mLabelStyle);
|
||||
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@ protected:
|
|||
|
||||
// <FS:Ansariel> Inventory specials
|
||||
bool mForInventory;
|
||||
S32 mItemTopPad;
|
||||
|
||||
// For now assuming all colors are the same in derived classes.
|
||||
static bool sColorSetInitialized;
|
||||
|
|
|
|||
|
|
@ -193,16 +193,6 @@ void LLMultiFloater::addFloater(LLFloater* floaterp, BOOL select_added_floater,
|
|||
floater_data.mCanResize = floaterp->isResizable();
|
||||
floater_data.mSaveRect = floaterp->mSaveRect;
|
||||
|
||||
// <FS> Update torn off status and add title bar
|
||||
if (getName() == IM_CONTAINER)
|
||||
{
|
||||
floaterp->getDragHandle()->setTitleVisible(FALSE);
|
||||
LLRect rect = floaterp->getRect();
|
||||
rect.mTop -= floaterp->getHeaderHeight();
|
||||
floaterp->setRect(rect);
|
||||
}
|
||||
// </FS>
|
||||
|
||||
// remove minimize and close buttons
|
||||
floaterp->setCanMinimize(FALSE);
|
||||
floaterp->setCanResize(FALSE);
|
||||
|
|
@ -212,6 +202,16 @@ void LLMultiFloater::addFloater(LLFloater* floaterp, BOOL select_added_floater,
|
|||
// avoid double rendering of floater background (makes it more opaque)
|
||||
floaterp->setBackgroundVisible(FALSE);
|
||||
|
||||
// <FS> Update torn off status and add title bar; Do this AFTER we stored the original rect!
|
||||
if (getName() == IM_CONTAINER)
|
||||
{
|
||||
floaterp->getDragHandle()->setTitleVisible(FALSE);
|
||||
LLRect rect = floaterp->getRect();
|
||||
rect.mTop -= floaterp->getHeaderHeight();
|
||||
floaterp->setRect(rect);
|
||||
}
|
||||
// </FS>
|
||||
|
||||
if (mAutoResize)
|
||||
{
|
||||
growToFit(floater_data.mWidth, floater_data.mHeight);
|
||||
|
|
|
|||
|
|
@ -166,6 +166,7 @@ set(viewer_SOURCE_FILES
|
|||
fsfloatervoicecontrols.cpp
|
||||
fsfloatervolumecontrols.cpp
|
||||
fsfloatervramusage.cpp
|
||||
fsfloaterwearablefavorites.cpp
|
||||
fskeywords.cpp
|
||||
fslightshare.cpp
|
||||
fslslbridge.cpp
|
||||
|
|
@ -914,6 +915,7 @@ set(viewer_HEADER_FILES
|
|||
fsfloatervoicecontrols.h
|
||||
fsfloatervolumecontrols.h
|
||||
fsfloatervramusage.h
|
||||
fsfloaterwearablefavorites.h
|
||||
fsgridhandler.h
|
||||
fskeywords.h
|
||||
fslightshare.h
|
||||
|
|
@ -2462,7 +2464,7 @@ if (DARWIN)
|
|||
set(MACOSX_BUNDLE_BUNDLE_NAME "Firestorm")
|
||||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}")
|
||||
set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}")
|
||||
set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2017 The Phoenix Firestorm Project, Inc.")
|
||||
set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2018 The Phoenix Firestorm Project, Inc.")
|
||||
set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "Firestorm.nib")
|
||||
set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "LLNSApplication")
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,4 @@
|
|||
CFBundleName = "Firestorm";
|
||||
|
||||
CFBundleShortVersionString = "Firestorm version %%VERSION%%";
|
||||
CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2017 The Phoenix Firestorm Project, Inc.";
|
||||
CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2018 The Phoenix Firestorm Project, Inc.";
|
||||
|
|
|
|||
|
|
@ -598,4 +598,14 @@
|
|||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="fs_group_titles"
|
||||
/>
|
||||
<command name="wearable_favorites"
|
||||
available_in_toybox="true"
|
||||
icon="Wearable_Favorites_Icon"
|
||||
label_ref="Command_Wearable_Favorites_Label"
|
||||
tooltip_ref="Command_Wearable_Favorites_Tooltip"
|
||||
execute_function="Floater.Toggle"
|
||||
execute_parameters="fs_wearable_favorites"
|
||||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="fs_wearable_favorites"
|
||||
/>
|
||||
</commands>
|
||||
|
|
|
|||
|
|
@ -6842,7 +6842,7 @@
|
|||
<key>InventoryDisplayInbox</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Override received items inventory inbox display</string>
|
||||
<string>UNUSED - Controlled via FSShowInboxFolder and FSAlwaysShowInboxButton: Override received items inventory inbox display</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -24521,6 +24521,17 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FSWearableFavoritesSortOrder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The sort order for the wearable favorites item list</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>3</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
||||
|
|
|
|||
|
|
@ -734,7 +734,16 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
|
||||
<key>ProtectWearableFavoritesFolders</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Keep the Wearable Favorites folder in Inventory safe from manual changes.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
|
||||
<key>FSKeywordOn</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -1295,7 +1295,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
// We graying out chat history by graying out messages that contains full date in a time string
|
||||
if (message_from_log && !is_conversation_log)
|
||||
{
|
||||
txt_color = LLColor4::grey;
|
||||
txt_color = LLUIColorTable::instance().getColor("ChatHistoryMessageFromLog");
|
||||
body_message_params.color(txt_color);
|
||||
body_message_params.readonly_color(txt_color);
|
||||
name_params.color(txt_color);
|
||||
|
|
|
|||
|
|
@ -107,7 +107,8 @@ FSFloaterIM::FSFloaterIM(const LLUUID& session_id)
|
|||
mMeTypingTimer(),
|
||||
mOtherTypingTimer(),
|
||||
mUnreadMessagesNotificationPanel(NULL),
|
||||
mUnreadMessagesNotificationTextBox(NULL)
|
||||
mUnreadMessagesNotificationTextBox(NULL),
|
||||
mApplyRect(true)
|
||||
{
|
||||
initIMSession(session_id);
|
||||
|
||||
|
|
@ -1121,7 +1122,9 @@ FSFloaterIM* FSFloaterIM::show(const LLUUID& session_id)
|
|||
}
|
||||
}
|
||||
|
||||
floater->mApplyRect = false;
|
||||
floater->openFloater(floater->getKey());
|
||||
floater->mApplyRect = true;
|
||||
floater->setFocus(TRUE);
|
||||
}
|
||||
else
|
||||
|
|
@ -2370,3 +2373,31 @@ void FSFloaterIM::handleMinimized(bool minimized)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool FSFloaterIM::applyRectControl()
|
||||
{
|
||||
bool res = true;
|
||||
|
||||
// We need to do some sort of hack here to prevent torn-off floaters from
|
||||
// jumping around if clicking on the IM chiclets: Clicking on a chiclet to
|
||||
// switch to a particular IM floater will call FSFloaterIM::show() and in
|
||||
// the process LLFloater::applyControlsAndPosition(). Depending on the result
|
||||
// of the call to applyRectControl(), applyPositioning() positioning is
|
||||
// called that will ultimately set the position of the floater depending
|
||||
// of the position of the last floater in the group. However, this doesn't
|
||||
// work properly and will cause floaters to jump. To prevent this, we only
|
||||
// apply the rect if not called by FSFloaterIM::show(). To prevent an
|
||||
// additionally misplaced floater caused by cascading a group of IM floaters,
|
||||
// we force LLFloater::applyRectControl() into the path where no cascaded
|
||||
// position is going to be applied by temporarily clear the instance name
|
||||
// of the floater. -AH
|
||||
if (mApplyRect)
|
||||
{
|
||||
std::string name = mInstanceName;
|
||||
mInstanceName.clear();
|
||||
res = LLFloater::applyRectControl();
|
||||
mInstanceName = name;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -161,6 +161,7 @@ public:
|
|||
protected:
|
||||
/* virtual */
|
||||
void onClickCloseBtn(bool app_quitting = false);
|
||||
/*virtual*/ bool applyRectControl();
|
||||
|
||||
// support sysinfo button -Zi
|
||||
void onSysinfoButtonVisibilityChanged(const LLSD& yes);
|
||||
|
|
@ -276,6 +277,8 @@ private:
|
|||
uuid_vec_t mPendingParticipants;
|
||||
|
||||
boost::signals2::connection mAvatarNameCacheConnection;
|
||||
|
||||
bool mApplyRect;
|
||||
};
|
||||
|
||||
#endif // FS_FLOATERIM_H
|
||||
|
|
|
|||
|
|
@ -0,0 +1,376 @@
|
|||
/**
|
||||
* @file fsfloaterwearablefavorites.cpp
|
||||
* @brief Class for the favorite wearables floater
|
||||
*
|
||||
* $LicenseInfo:firstyear=2018&license=viewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (c) 2018 Ansariel Hiller @ Second Life
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "fsfloaterwearablefavorites.h"
|
||||
#include "fscommon.h"
|
||||
#include "llappearancemgr.h"
|
||||
#include "llbutton.h"
|
||||
#include "llfiltereditor.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventoryobserver.h"
|
||||
#include "llmenugl.h"
|
||||
#include "llmenubutton.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "llviewercontrol.h" // for gSavedSettings
|
||||
#include "llviewermenu.h" // for gMenuHolder
|
||||
#include "rlvactions.h"
|
||||
#include "rlvlocks.h"
|
||||
|
||||
#define FS_WEARABLE_FAVORITES_FOLDER "#Wearable Favorites"
|
||||
|
||||
static LLDefaultChildRegistry::Register<FSWearableFavoritesItemsList> r("fs_wearable_favorites_items_list");
|
||||
|
||||
FSWearableFavoritesItemsList::FSWearableFavoritesItemsList(const Params& p)
|
||||
: LLWearableItemsList(p)
|
||||
{
|
||||
}
|
||||
|
||||
BOOL FSWearableFavoritesItemsList::handleDragAndDrop(S32 x, S32 y, MASK mask,
|
||||
BOOL drop,
|
||||
EDragAndDropType cargo_type,
|
||||
void* cargo_data,
|
||||
EAcceptance* accept,
|
||||
std::string& tooltip_msg)
|
||||
{
|
||||
// Scroll folder view if needed. Never accepts a drag or drop.
|
||||
*accept = ACCEPT_NO;
|
||||
autoScroll(x, y);
|
||||
|
||||
if (cargo_type == DAD_BODYPART || cargo_type == DAD_CLOTHING || cargo_type == DAD_OBJECT)
|
||||
{
|
||||
if (drop)
|
||||
{
|
||||
LLInventoryItem* item = (LLInventoryItem*)cargo_data;
|
||||
if (!mDADSignal.empty())
|
||||
{
|
||||
mDADSignal(item->getUUID());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*accept = ACCEPT_YES_SINGLE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LLUUID FSFloaterWearableFavorites::sFolderID = LLUUID();
|
||||
|
||||
FSFloaterWearableFavorites::FSFloaterWearableFavorites(const LLSD& key)
|
||||
: LLFloater(key),
|
||||
mItemsList(NULL),
|
||||
mInitialized(false),
|
||||
mDADCallbackConnection()
|
||||
{
|
||||
mCategoriesObserver = new LLInventoryCategoriesObserver();
|
||||
}
|
||||
|
||||
FSFloaterWearableFavorites::~FSFloaterWearableFavorites()
|
||||
{
|
||||
if (gInventory.containsObserver(mCategoriesObserver))
|
||||
{
|
||||
gInventory.removeObserver(mCategoriesObserver);
|
||||
}
|
||||
delete mCategoriesObserver;
|
||||
|
||||
if (mDADCallbackConnection.connected())
|
||||
{
|
||||
mDADCallbackConnection.disconnect();
|
||||
}
|
||||
|
||||
if (mOptionsMenuHandle.get())
|
||||
{
|
||||
mOptionsMenuHandle.get()->die();
|
||||
}
|
||||
}
|
||||
|
||||
//virtual
|
||||
BOOL FSFloaterWearableFavorites::postBuild()
|
||||
{
|
||||
mItemsList = getChild<FSWearableFavoritesItemsList>("favorites_list");
|
||||
mItemsList->setNoFilteredItemsMsg(getString("search_no_items"));
|
||||
mItemsList->setDoubleClickCallback(boost::bind(&FSFloaterWearableFavorites::onDoubleClick, this));
|
||||
|
||||
mRemoveItemBtn = getChild<LLButton>("remove_btn");
|
||||
mRemoveItemBtn->setCommitCallback(boost::bind(&FSFloaterWearableFavorites::handleRemove, this));
|
||||
|
||||
mFilterEditor = getChild<LLFilterEditor>("wearable_filter_input");
|
||||
mFilterEditor->setCommitCallback(boost::bind(&FSFloaterWearableFavorites::onFilterEdit, this, _2));
|
||||
|
||||
// Create menus.
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
|
||||
|
||||
registrar.add("FavWearables.Action", boost::bind(&FSFloaterWearableFavorites::onOptionsMenuItemClicked, this, _2));
|
||||
enable_registrar.add("FavWearables.CheckAction", boost::bind(&FSFloaterWearableFavorites::onOptionsMenuItemChecked, this, _2));
|
||||
|
||||
mOptionsButton = getChild<LLMenuButton>("options_btn");
|
||||
|
||||
LLToggleableMenu* options_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_fs_wearable_favorites.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (options_menu)
|
||||
{
|
||||
mOptionsMenuHandle = options_menu->getHandle();
|
||||
mOptionsButton->setMenu(options_menu, LLMenuButton::MP_BOTTOM_LEFT);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void FSFloaterWearableFavorites::onOpen(const LLSD& /*info*/)
|
||||
{
|
||||
if (!mInitialized)
|
||||
{
|
||||
if (!gInventory.isInventoryUsable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
initCategory();
|
||||
|
||||
LLViewerInventoryCategory* category = gInventory.getCategory(sFolderID);
|
||||
if (!category)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
LLViewerInventoryCategory* category_cof = gInventory.getCategory(cof);
|
||||
if (!category_cof)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
gInventory.addObserver(mCategoriesObserver);
|
||||
mCategoriesObserver->addCategory(sFolderID, boost::bind(&FSFloaterWearableFavorites::updateList, this, sFolderID));
|
||||
mCategoriesObserver->addCategory(cof, boost::bind(&FSFloaterWearableFavorites::updateList, this, sFolderID));
|
||||
category->fetch();
|
||||
|
||||
mItemsList->setSortOrder((LLWearableItemsList::ESortOrder)gSavedSettings.getU32("FSWearableFavoritesSortOrder"));
|
||||
updateList(sFolderID);
|
||||
mItemsList->setDADCallback(boost::bind(&FSFloaterWearableFavorites::onItemDAD, this, _1));
|
||||
|
||||
mInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
//virtual
|
||||
void FSFloaterWearableFavorites::draw()
|
||||
{
|
||||
LLFloater::draw();
|
||||
|
||||
mRemoveItemBtn->setEnabled(mItemsList->numSelected() > 0);
|
||||
}
|
||||
|
||||
//virtual
|
||||
BOOL FSFloaterWearableFavorites::handleKeyHere(KEY key, MASK mask)
|
||||
{
|
||||
if (FSCommon::isFilterEditorKeyCombo(key, mask))
|
||||
{
|
||||
mFilterEditor->setFocus(TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return LLFloater::handleKeyHere(key, mask);
|
||||
}
|
||||
|
||||
void FSFloaterWearableFavorites::initCategory()
|
||||
{
|
||||
LLUUID fs_favs_id;
|
||||
|
||||
LLUUID fs_root_cat_id = gInventory.findCategoryByName(ROOT_FIRESTORM_FOLDER);
|
||||
if (!fs_root_cat_id.isNull())
|
||||
{
|
||||
LLInventoryModel::item_array_t* items;
|
||||
LLInventoryModel::cat_array_t* cats;
|
||||
gInventory.getDirectDescendentsOf(fs_root_cat_id, cats, items);
|
||||
if (cats)
|
||||
{
|
||||
for (LLInventoryModel::cat_array_t::iterator it = cats->begin(); it != cats->end(); ++it)
|
||||
{
|
||||
if ((*it)->getName() == FS_WEARABLE_FAVORITES_FOLDER)
|
||||
{
|
||||
fs_favs_id = (*it)->getUUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fs_root_cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(), LLFolderType::FT_NONE, ROOT_FIRESTORM_FOLDER);
|
||||
}
|
||||
|
||||
if (fs_favs_id.isNull())
|
||||
{
|
||||
fs_favs_id = gInventory.createNewCategory(fs_root_cat_id, LLFolderType::FT_NONE, FS_WEARABLE_FAVORITES_FOLDER);
|
||||
}
|
||||
|
||||
sFolderID = fs_favs_id;
|
||||
}
|
||||
|
||||
//static
|
||||
LLUUID FSFloaterWearableFavorites::getFavoritesFolder()
|
||||
{
|
||||
if (sFolderID.notNull())
|
||||
{
|
||||
return sFolderID;
|
||||
}
|
||||
|
||||
LLUUID fs_root_cat_id = gInventory.findCategoryByName(ROOT_FIRESTORM_FOLDER);
|
||||
if (!fs_root_cat_id.isNull())
|
||||
{
|
||||
LLInventoryModel::item_array_t* items;
|
||||
LLInventoryModel::cat_array_t* cats;
|
||||
gInventory.getDirectDescendentsOf(fs_root_cat_id, cats, items);
|
||||
if (cats)
|
||||
{
|
||||
for (LLInventoryModel::cat_array_t::iterator it = cats->begin(); it != cats->end(); ++it)
|
||||
{
|
||||
if ((*it)->getName() == FS_WEARABLE_FAVORITES_FOLDER)
|
||||
{
|
||||
sFolderID = (*it)->getUUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sFolderID;
|
||||
}
|
||||
|
||||
void FSFloaterWearableFavorites::updateList(const LLUUID& folder_id)
|
||||
{
|
||||
mItemsList->updateList(folder_id);
|
||||
|
||||
if (gInventory.isCategoryComplete(folder_id))
|
||||
{
|
||||
mItemsList->setNoItemsCommentText(getString("empty_list")); // Have to reset it here because LLWearableItemsList::updateList might override it
|
||||
}
|
||||
}
|
||||
|
||||
void FSFloaterWearableFavorites::onItemDAD(const LLUUID& item_id)
|
||||
{
|
||||
link_inventory_object(sFolderID, item_id, LLPointer<LLInventoryCallback>(NULL));
|
||||
}
|
||||
|
||||
void FSFloaterWearableFavorites::handleRemove()
|
||||
{
|
||||
uuid_vec_t selected_item_ids;
|
||||
mItemsList->getSelectedUUIDs(selected_item_ids);
|
||||
|
||||
for (uuid_vec_t::iterator it = selected_item_ids.begin(); it != selected_item_ids.end(); ++it)
|
||||
{
|
||||
remove_inventory_item(*it, LLPointer<LLInventoryCallback>(NULL));
|
||||
}
|
||||
}
|
||||
|
||||
void FSFloaterWearableFavorites::onFilterEdit(const std::string& search_string)
|
||||
{
|
||||
mItemsList->setFilterSubString(search_string);
|
||||
mItemsList->setNoItemsCommentText(getString("empty_list"));
|
||||
}
|
||||
|
||||
void FSFloaterWearableFavorites::onOptionsMenuItemClicked(const LLSD& userdata)
|
||||
{
|
||||
const std::string action = userdata.asString();
|
||||
|
||||
if (action == "sort_by_name")
|
||||
{
|
||||
mItemsList->setSortOrder(LLWearableItemsList::E_SORT_BY_NAME);
|
||||
gSavedSettings.setU32("FSWearableFavoritesSortOrder", LLWearableItemsList::E_SORT_BY_NAME);
|
||||
}
|
||||
else if (action == "sort_by_most_recent")
|
||||
{
|
||||
mItemsList->setSortOrder(LLWearableItemsList::E_SORT_BY_MOST_RECENT);
|
||||
gSavedSettings.setU32("FSWearableFavoritesSortOrder", LLWearableItemsList::E_SORT_BY_MOST_RECENT);
|
||||
}
|
||||
else if (action == "sort_by_type_name")
|
||||
{
|
||||
mItemsList->setSortOrder(LLWearableItemsList::E_SORT_BY_TYPE_NAME);
|
||||
gSavedSettings.setU32("FSWearableFavoritesSortOrder", LLWearableItemsList::E_SORT_BY_TYPE_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
bool FSFloaterWearableFavorites::onOptionsMenuItemChecked(const LLSD& userdata)
|
||||
{
|
||||
const std::string action = userdata.asString();
|
||||
|
||||
if (action == "sort_by_name")
|
||||
{
|
||||
return mItemsList->getSortOrder() == LLWearableItemsList::E_SORT_BY_NAME;
|
||||
}
|
||||
else if (action == "sort_by_most_recent")
|
||||
{
|
||||
return mItemsList->getSortOrder() == LLWearableItemsList::E_SORT_BY_MOST_RECENT;
|
||||
}
|
||||
else if (action == "sort_by_type_name")
|
||||
{
|
||||
return mItemsList->getSortOrder() == LLWearableItemsList::E_SORT_BY_TYPE_NAME;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void FSFloaterWearableFavorites::onDoubleClick()
|
||||
{
|
||||
LLUUID selected_item_id = mItemsList->getSelectedUUID();
|
||||
if (selected_item_id.notNull())
|
||||
{
|
||||
uuid_vec_t ids;
|
||||
ids.push_back(selected_item_id);
|
||||
LLViewerInventoryItem* item = gInventory.getItem(selected_item_id);
|
||||
|
||||
if (get_is_item_worn(selected_item_id))
|
||||
{
|
||||
if ((item->getType() == LLAssetType::AT_CLOTHING && (!RlvActions::isRlvEnabled() || gRlvWearableLocks.canRemove(item))) ||
|
||||
(item->getType() == LLAssetType::AT_OBJECT) && (!RlvActions::isRlvEnabled() || gRlvAttachmentLocks.canDetach(item)))
|
||||
{
|
||||
LLAppearanceMgr::instance().removeItemsFromAvatar(ids);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item->getType() == LLAssetType::AT_BODYPART && (!RlvActions::isRlvEnabled() || (gRlvWearableLocks.canWear(item) & RLV_WEAR_REPLACE) == RLV_WEAR_REPLACE))
|
||||
{
|
||||
wear_multiple(ids, true);
|
||||
}
|
||||
else if (item->getType() == LLAssetType::AT_CLOTHING && LLAppearanceMgr::instance().canAddWearables(ids) && (!RlvActions::isRlvEnabled() || (gRlvWearableLocks.canWear(item) & RLV_WEAR_ADD) == RLV_WEAR_ADD))
|
||||
{
|
||||
wear_multiple(ids, false);
|
||||
}
|
||||
else if (item->getType() == LLAssetType::AT_OBJECT && LLAppearanceMgr::instance().canAddWearables(ids) && (!RlvActions::isRlvEnabled() || (gRlvAttachmentLocks.canAttach(item) & RLV_WEAR_ADD) == RLV_WEAR_ADD))
|
||||
{
|
||||
wear_multiple(ids, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
/**
|
||||
* @file fsfloaterwearablefavorites.h
|
||||
* @brief Class for the favorite wearables floater
|
||||
*
|
||||
* $LicenseInfo:firstyear=2018&license=viewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (c) 2018 Ansariel Hiller @ Second Life
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef FS_FLOATERWEARABLEFAVORITES_H
|
||||
#define FS_FLOATERWEARABLEFAVORITES_H
|
||||
|
||||
#include "llfloater.h"
|
||||
#include "llwearableitemslist.h"
|
||||
|
||||
class LLButton;
|
||||
class LLFilterEditor;
|
||||
class LLMenuButton;
|
||||
class LLInventoryCategoriesObserver;
|
||||
|
||||
class FSWearableFavoritesItemsList : public LLWearableItemsList
|
||||
{
|
||||
public:
|
||||
struct Params : public LLInitParam::Block<Params, LLWearableItemsList::Params>
|
||||
{
|
||||
Params()
|
||||
{}
|
||||
};
|
||||
|
||||
virtual ~FSWearableFavoritesItemsList() {}
|
||||
|
||||
/* virtual */ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
|
||||
EDragAndDropType cargo_type,
|
||||
void* cargo_data,
|
||||
EAcceptance* accept,
|
||||
std::string& tooltip_msg);
|
||||
|
||||
typedef boost::signals2::signal<void(const LLUUID& id)> item_dad_callback_t;
|
||||
boost::signals2::connection setDADCallback(const item_dad_callback_t::slot_type& cb)
|
||||
{
|
||||
return mDADSignal.connect(cb);
|
||||
}
|
||||
|
||||
protected:
|
||||
friend class LLUICtrlFactory;
|
||||
FSWearableFavoritesItemsList(const Params&);
|
||||
|
||||
item_dad_callback_t mDADSignal;
|
||||
};
|
||||
|
||||
class FSFloaterWearableFavorites : public LLFloater
|
||||
{
|
||||
public:
|
||||
FSFloaterWearableFavorites(const LLSD& key);
|
||||
virtual ~FSFloaterWearableFavorites();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void onOpen(const LLSD& info);
|
||||
/*virtual*/ void draw();
|
||||
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
|
||||
/*virtual*/ bool hasAccelerators() const { return true; }
|
||||
|
||||
static LLUUID getFavoritesFolder();
|
||||
|
||||
private:
|
||||
void initCategory();
|
||||
void updateList(const LLUUID& folder_id);
|
||||
|
||||
void onItemDAD(const LLUUID& item_id);
|
||||
void handleRemove();
|
||||
void onFilterEdit(const std::string& search_string);
|
||||
void onDoubleClick();
|
||||
|
||||
void onOptionsMenuItemClicked(const LLSD& userdata);
|
||||
bool onOptionsMenuItemChecked(const LLSD& userdata);
|
||||
|
||||
bool mInitialized;
|
||||
|
||||
boost::signals2::connection mDADCallbackConnection;
|
||||
|
||||
LLInventoryCategoriesObserver* mCategoriesObserver;
|
||||
|
||||
FSWearableFavoritesItemsList* mItemsList;
|
||||
LLButton* mRemoveItemBtn;
|
||||
LLFilterEditor* mFilterEditor;
|
||||
LLMenuButton* mOptionsButton;
|
||||
LLHandle<LLView> mOptionsMenuHandle;
|
||||
|
||||
static LLUUID sFolderID;
|
||||
};
|
||||
|
||||
#endif // FS_FLOATERWEARABLEFAVORITES_H
|
||||
|
|
@ -383,6 +383,8 @@ BOOL gCrashOnStartup = FALSE;
|
|||
BOOL gLLErrorActivated = FALSE;
|
||||
BOOL gLogoutInProgress = FALSE;
|
||||
|
||||
BOOL gSimulateMemLeak = FALSE;
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// Internal globals... that should be removed.
|
||||
|
||||
|
|
@ -1529,6 +1531,35 @@ static LLTrace::BlockTimerStatHandle FTM_AGENT_UPDATE("Update");
|
|||
LLTrace::BlockTimerStatHandle FTM_FRAME("Frame");
|
||||
|
||||
bool LLAppViewer::frame()
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (gSimulateMemLeak)
|
||||
{
|
||||
try
|
||||
{
|
||||
ret = doFrame();
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
{
|
||||
LLMemory::logMemoryInfo(TRUE);
|
||||
LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
|
||||
if (mem_leak_instance)
|
||||
{
|
||||
mem_leak_instance->stop();
|
||||
}
|
||||
LL_WARNS() << "Bad memory allocation in LLAppViewer::frame()!" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = doFrame();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool LLAppViewer::doFrame()
|
||||
{
|
||||
LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
|
||||
LLSD newFrame;
|
||||
|
|
@ -1557,7 +1588,7 @@ bool LLAppViewer::frame()
|
|||
//check memory availability information
|
||||
checkMemory() ;
|
||||
|
||||
try
|
||||
try // <FS:Ansariel> Don't crash on LLContinueError
|
||||
{
|
||||
// <FS:Ansariel> MaxFPS Viewer-Chui merge error
|
||||
// Check if we need to restore rendering masks.
|
||||
|
|
@ -1606,12 +1637,15 @@ bool LLAppViewer::frame()
|
|||
}
|
||||
|
||||
//memory leaking simulation
|
||||
LLFloaterMemLeak* mem_leak_instance =
|
||||
LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
|
||||
if(mem_leak_instance)
|
||||
if (gSimulateMemLeak)
|
||||
{
|
||||
mem_leak_instance->idle() ;
|
||||
}
|
||||
LLFloaterMemLeak* mem_leak_instance =
|
||||
LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
|
||||
if (mem_leak_instance)
|
||||
{
|
||||
mem_leak_instance->idle();
|
||||
}
|
||||
}
|
||||
|
||||
// canonical per-frame event
|
||||
mainloop.post(newFrame);
|
||||
|
|
@ -1798,60 +1832,19 @@ bool LLAppViewer::frame()
|
|||
pingMainloopTimeout("Main:End");
|
||||
}
|
||||
}
|
||||
// <FS:Ansariel> Don't crash on LLContinueError
|
||||
catch (const LLContinueError&)
|
||||
{
|
||||
LOG_UNHANDLED_EXCEPTION("");
|
||||
}
|
||||
catch(std::bad_alloc)
|
||||
{
|
||||
LLMemory::logMemoryInfo(TRUE) ;
|
||||
|
||||
//stop memory leaking simulation
|
||||
LLFloaterMemLeak* mem_leak_instance =
|
||||
LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
|
||||
if(mem_leak_instance)
|
||||
{
|
||||
mem_leak_instance->stop() ;
|
||||
LL_WARNS() << "Bad memory allocation in LLAppViewer::frame()!" << LL_ENDL ;
|
||||
}
|
||||
else
|
||||
{
|
||||
//output possible call stacks to log file.
|
||||
LLError::LLCallStacks::print() ;
|
||||
|
||||
LL_ERRS() << "Bad memory allocation in LLAppViewer::frame()!" << LL_ENDL ;
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
CRASH_ON_UNHANDLED_EXCEPTION("");
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
// Save snapshot for next time, if we made it through initialization
|
||||
if (STATE_STARTED == LLStartUp::getStartupState())
|
||||
{
|
||||
try
|
||||
{
|
||||
saveFinalSnapshot();
|
||||
}
|
||||
catch(std::bad_alloc)
|
||||
{
|
||||
LL_WARNS() << "Bad memory allocation when saveFinalSnapshot() is called!" << LL_ENDL ;
|
||||
|
||||
//stop memory leaking simulation
|
||||
LLFloaterMemLeak* mem_leak_instance =
|
||||
LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
|
||||
if(mem_leak_instance)
|
||||
{
|
||||
mem_leak_instance->stop() ;
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
CRASH_ON_UNHANDLED_EXCEPTION("saveFinalSnapshot()");
|
||||
}
|
||||
saveFinalSnapshot();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Cut down wait on logout; Need to terminate voice here because we need gServicePump!
|
||||
|
|
|
|||
|
|
@ -233,6 +233,8 @@ protected:
|
|||
|
||||
private:
|
||||
|
||||
bool doFrame();
|
||||
|
||||
void initMaxHeapSize();
|
||||
bool initThreads(); // Initialize viewer threads, return false on failure.
|
||||
bool initConfiguration(); // Initialize settings from the command line/config file.
|
||||
|
|
@ -425,4 +427,6 @@ extern LLUUID gBlackSquareID;
|
|||
extern BOOL gRandomizeFramerate;
|
||||
extern BOOL gPeriodicSlowFrame;
|
||||
|
||||
extern BOOL gSimulateMemLeak;
|
||||
|
||||
#endif // LL_LLAPPVIEWER_H
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@
|
|||
#include "llviewercontrol.h" // for gSavedSettings
|
||||
#include "llvoavatarself.h"
|
||||
|
||||
S32 LLFloaterBvhPreview::sOwnAvatarInstanceCount = 0; // <FS> Preview on own avatar
|
||||
|
||||
const S32 PREVIEW_BORDER_WIDTH = 2;
|
||||
const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
|
||||
const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
|
||||
|
|
@ -127,6 +129,11 @@ LLFloaterBvhPreview::LLFloaterBvhPreview(const std::string& filename) :
|
|||
|
||||
// <FS> Preview on own avatar
|
||||
mUseOwnAvatar = gSavedSettings.getBOOL("FSUploadAnimationOnOwnAvatar");
|
||||
if (mUseOwnAvatar)
|
||||
{
|
||||
sOwnAvatarInstanceCount++;
|
||||
}
|
||||
// </FS>
|
||||
|
||||
mIDList["Standing"] = ANIM_AGENT_STAND;
|
||||
mIDList["Walking"] = ANIM_AGENT_FEMALE_WALK;
|
||||
|
|
@ -404,8 +411,8 @@ BOOL LLFloaterBvhPreview::loadBVH()
|
|||
onBtnPlay();
|
||||
// </FS>
|
||||
|
||||
getChild<LLSlider>("playback_slider")->setMinValue(0.0);
|
||||
getChild<LLSlider>("playback_slider")->setMaxValue(1.0);
|
||||
getChild<LLSliderCtrl>("playback_slider")->setMinValue(0.0);
|
||||
getChild<LLSliderCtrl>("playback_slider")->setMaxValue(1.0);
|
||||
|
||||
//<FS:Sei> FIRE-17251: Use defaults from XUI, not from the JointMotionList constructor
|
||||
//getChild<LLUICtrl>("loop_check")->setValue(LLSD(motionp->getLoop()));
|
||||
|
|
@ -508,6 +515,18 @@ LLFloaterBvhPreview::~LLFloaterBvhPreview()
|
|||
unloadMotion();
|
||||
// </FS>
|
||||
|
||||
// <FS> Preview on own avatar
|
||||
if (mUseOwnAvatar)
|
||||
{
|
||||
sOwnAvatarInstanceCount--;
|
||||
|
||||
if (sOwnAvatarInstanceCount == 0 && isAgentAvatarValid())
|
||||
{
|
||||
gAgentAvatarp->startDefaultMotions();
|
||||
}
|
||||
}
|
||||
// </FS>
|
||||
|
||||
setEnabled(FALSE);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -150,7 +150,8 @@ protected:
|
|||
std::map<std::string, LLUUID> mIDList;
|
||||
|
||||
// <FS> Preview on own avatar
|
||||
bool mUseOwnAvatar;
|
||||
bool mUseOwnAvatar;
|
||||
static S32 sOwnAvatarInstanceCount;
|
||||
|
||||
// <FS:Ansariel> FIRE-2083: Slider in upload animation floater doesn't work
|
||||
LLFrameTimer mTimer;
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ U32 LLFloaterMemLeak::sTotalLeaked = 0 ;
|
|||
S32 LLFloaterMemLeak::sStatus = LLFloaterMemLeak::STOP ;
|
||||
BOOL LLFloaterMemLeak::sbAllocationFailed = FALSE ;
|
||||
|
||||
extern BOOL gSimulateMemLeak;
|
||||
|
||||
LLFloaterMemLeak::LLFloaterMemLeak(const LLSD& key)
|
||||
: LLFloater(key)
|
||||
{
|
||||
|
|
@ -104,6 +106,7 @@ void LLFloaterMemLeak::release()
|
|||
sStatus = STOP ;
|
||||
sTotalLeaked = 0 ;
|
||||
sbAllocationFailed = FALSE ;
|
||||
gSimulateMemLeak = FALSE;
|
||||
}
|
||||
|
||||
void LLFloaterMemLeak::stop()
|
||||
|
|
@ -140,8 +143,7 @@ void LLFloaterMemLeak::idle()
|
|||
}
|
||||
if(!p)
|
||||
{
|
||||
sStatus = STOP ;
|
||||
sbAllocationFailed = TRUE ;
|
||||
stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -181,6 +183,7 @@ void LLFloaterMemLeak::onChangeMaxMemLeaking()
|
|||
void LLFloaterMemLeak::onClickStart()
|
||||
{
|
||||
sStatus = START ;
|
||||
gSimulateMemLeak = TRUE;
|
||||
}
|
||||
|
||||
void LLFloaterMemLeak::onClickStop()
|
||||
|
|
|
|||
|
|
@ -536,7 +536,10 @@ void LLGroupListItem::onProfileBtnClick()
|
|||
void LLGroupListItem::changed(LLGroupChange gc)
|
||||
{
|
||||
LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID);
|
||||
if(group_data)
|
||||
// <FS:Ansariel> FIRE-22148: Only update group icon if the received group data actually contains group icon info
|
||||
//if (group_data)
|
||||
if ((gc == GC_ALL || gc == GC_PROPERTIES) && group_data)
|
||||
// </FS:Ansariel>
|
||||
setGroupIconID(group_data->mInsigniaID);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@
|
|||
#endif
|
||||
// </FS:Zi>
|
||||
#include "fsfloaterplacedetails.h"
|
||||
#include "fsfloaterwearablefavorites.h"
|
||||
#include "llviewerattachmenu.h"
|
||||
#include "llresmgr.h"
|
||||
|
||||
|
|
@ -1374,6 +1375,13 @@ BOOL LLInvFVBridge::isProtectedFolder(bool ignore_setting /*= false*/) const
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
if ((mUUID == FSFloaterWearableFavorites::getFavoritesFolder()
|
||||
|| model->isObjectDescendentOf(mUUID, FSFloaterWearableFavorites::getFavoritesFolder()))
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
// </FS:TT>
|
||||
|
|
@ -5653,9 +5661,11 @@ bool LLFolderBridge::isProtected() const
|
|||
{
|
||||
static LLCachedControl<bool> protectAOFolders(gSavedPerAccountSettings, "ProtectAOFolders");
|
||||
static LLCachedControl<bool> protectBridgeFolder(gSavedPerAccountSettings, "ProtectBridgeFolder");
|
||||
static LLCachedControl<bool> WearableFavoritesprotectBridgeFolder(gSavedPerAccountSettings, "ProtectWearableFavoritesFolders");
|
||||
|
||||
return ((mUUID == AOEngine::instance().getAOFolder() && protectAOFolders) ||
|
||||
(mUUID == FSLSLBridge::instance().getBridgeFolder() && protectBridgeFolder));
|
||||
(mUUID == FSLSLBridge::instance().getBridgeFolder() && protectBridgeFolder) ||
|
||||
(mUUID == FSFloaterWearableFavorites::getFavoritesFolder() && WearableFavoritesprotectBridgeFolder));
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@
|
|||
|
||||
// Firestorm includes
|
||||
#include "aoengine.h"
|
||||
#include "fsfloaterwearablefavorites.h"
|
||||
#include "fslslbridge.h"
|
||||
|
||||
BOOL LLInventoryState::sWearNewClothing = FALSE;
|
||||
|
|
@ -433,7 +434,10 @@ void copy_inventory_category(LLInventoryModel* model,
|
|||
LLInventoryItem* item = *iter;
|
||||
LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(update_folder_cb, new_cat_uuid));
|
||||
|
||||
if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
|
||||
// <FS:Ansariel> FIRE-21719: Copy-pasting a folder doesn't copy contained links
|
||||
//if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
|
||||
if (!item->getIsLinkType() && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
// If the item is nocopy, we do nothing or, optionally, move it
|
||||
if (move_no_copy_items)
|
||||
|
|
@ -445,6 +449,12 @@ void copy_inventory_category(LLInventoryModel* model,
|
|||
// Decrement the count in root_id since that one item won't be copied over
|
||||
LLMarketplaceData::instance().decrementValidationWaiting(root_id);
|
||||
}
|
||||
// <FS:Ansariel> FIRE-21719: Copy-pasting a folder doesn't copy contained links
|
||||
else if (item->getIsLinkType())
|
||||
{
|
||||
link_inventory_object(new_cat_uuid, item->getLinkedUUID(), cb);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
else
|
||||
{
|
||||
copy_inventory_item(
|
||||
|
|
@ -640,6 +650,9 @@ BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id)
|
|||
||
|
||||
(model->isObjectDescendentOf(id, FSLSLBridge::instance().getBridgeFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder"))
|
||||
||
|
||||
(model->isObjectDescendentOf(id, FSFloaterWearableFavorites::getFavoritesFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
|
|
@ -707,6 +720,9 @@ BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id)
|
|||
||
|
||||
((id == FSLSLBridge::instance().getBridgeFolder() || model->isObjectDescendentOf(id, FSLSLBridge::instance().getBridgeFolder()))
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder"))
|
||||
||
|
||||
((id == FSFloaterWearableFavorites::getFavoritesFolder() || model->isObjectDescendentOf(id, FSFloaterWearableFavorites::getFavoritesFolder()))
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
|
|
@ -762,6 +778,9 @@ BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id)
|
|||
||
|
||||
((id == FSLSLBridge::instance().getBridgeFolder() || model->isObjectDescendentOf(id, FSLSLBridge::instance().getBridgeFolder()))
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder"))
|
||||
||
|
||||
((id == FSFloaterWearableFavorites::getFavoritesFolder() || model->isObjectDescendentOf(id, FSFloaterWearableFavorites::getFavoritesFolder()))
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
|
|
|
|||
|
|
@ -64,11 +64,11 @@
|
|||
#include "rlvhandler.h"
|
||||
#include "rlvlocks.h"
|
||||
// [/RLVa:KB]
|
||||
//-TT Patch: ReplaceWornItemsOnly
|
||||
// <FS:TT> Patch: ReplaceWornItemsOnly
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llgesturemgr.h"
|
||||
//-TT
|
||||
// </FS:TT>
|
||||
|
||||
//#define DIFF_INVENTORY_FILES
|
||||
#ifdef DIFF_INVENTORY_FILES
|
||||
|
|
@ -76,6 +76,7 @@
|
|||
#endif
|
||||
|
||||
#include "aoengine.h"
|
||||
#include "fsfloaterwearablefavorites.h"
|
||||
#include "fslslbridge.h"
|
||||
#ifdef OPENSIM
|
||||
#include "llviewernetwork.h"
|
||||
|
|
@ -1310,7 +1311,9 @@ void LLInventoryModel::changeItemParent(LLViewerInventoryItem* item,
|
|||
if ((isObjectDescendentOf(item->getUUID(), AOEngine::instance().getAOFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectAOFolders")) ||
|
||||
(isObjectDescendentOf(item->getUUID(), FSLSLBridge::instance().getBridgeFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder")))
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder")) ||
|
||||
(isObjectDescendentOf(item->getUUID(), FSFloaterWearableFavorites::getFavoritesFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders")))
|
||||
{
|
||||
LL_INFOS("Inventory") << "Cannot move item because it is descendent of a protected folder" << LL_ENDL;
|
||||
return;
|
||||
|
|
@ -1352,7 +1355,9 @@ void LLInventoryModel::changeCategoryParent(LLViewerInventoryCategory* cat,
|
|||
if ((isObjectDescendentOf(cat->getUUID(), AOEngine::instance().getAOFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectAOFolders")) ||
|
||||
(isObjectDescendentOf(cat->getUUID(), FSLSLBridge::instance().getBridgeFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder")))
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder")) ||
|
||||
(isObjectDescendentOf(cat->getUUID(), FSFloaterWearableFavorites::getFavoritesFolder())
|
||||
&& gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders")))
|
||||
{
|
||||
LL_INFOS("Inventory") << "Cannot move category because it is descendent of a protected folder" << LL_ENDL;
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -211,6 +211,12 @@ LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
|
|||
// <FS:Ansariel> Inventory specials
|
||||
p.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
p.item_height = fsFolderViewItemHeight;
|
||||
p.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
return LLUICtrlFactory::create<LLFolderView>(p);
|
||||
}
|
||||
|
||||
|
|
@ -857,6 +863,12 @@ LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * br
|
|||
// <FS:Ansariel> Inventory specials
|
||||
params.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
params.item_height = fsFolderViewItemHeight;
|
||||
params.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
return LLUICtrlFactory::create<LLFolderViewFolder>(params);
|
||||
}
|
||||
|
||||
|
|
@ -876,6 +888,12 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge
|
|||
|
||||
// <FS:Ansariel> Inventory specials
|
||||
params.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
params.item_height = fsFolderViewItemHeight;
|
||||
params.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
return LLUICtrlFactory::create<LLFolderViewItem>(params);
|
||||
}
|
||||
|
|
@ -1607,10 +1625,12 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
|
|||
void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel)
|
||||
{
|
||||
LLInventoryPanel *active_panel;
|
||||
if (main_panel)
|
||||
{
|
||||
LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory")->selectAllItemsPanel();
|
||||
}
|
||||
// <FS:Ansariel> FIRE-22167: Make "Show in Main View" work properly
|
||||
//if (main_panel)
|
||||
//{
|
||||
// LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory")->selectAllItemsPanel();
|
||||
//}
|
||||
// </FS:Ansariel>
|
||||
active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
|
||||
|
||||
if (active_panel)
|
||||
|
|
@ -1656,7 +1676,15 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
|
|||
}
|
||||
else
|
||||
{
|
||||
LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
|
||||
// <FS:Ansariel> FIRE-22167: Make "Show in Main View" work properly
|
||||
//LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
|
||||
if (main_panel)
|
||||
{
|
||||
active_panel->getParentByType<LLTabContainer>()->selectFirstTab();
|
||||
active_panel = getActiveInventoryPanel(FALSE);
|
||||
}
|
||||
LLFloater* floater_inventory = active_panel->getParentByType<LLFloater>();
|
||||
// </FS:Ansariel>
|
||||
if (floater_inventory)
|
||||
{
|
||||
floater_inventory->setFocus(TRUE);
|
||||
|
|
|
|||
|
|
@ -77,6 +77,15 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge
|
|||
params.font_color = item_color;
|
||||
params.font_highlight_color = item_color;
|
||||
params.allow_drop = allow_drop;
|
||||
|
||||
// <FS:Ansariel> Inventory specials
|
||||
params.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
params.item_height = fsFolderViewItemHeight;
|
||||
params.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
return LLUICtrlFactory::create<LLInboxFolderViewFolder>(params);
|
||||
}
|
||||
|
|
@ -96,6 +105,15 @@ LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * b
|
|||
params.font_color = item_color;
|
||||
params.font_highlight_color = item_color;
|
||||
|
||||
// <FS:Ansariel> Inventory specials
|
||||
params.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
params.item_height = fsFolderViewItemHeight;
|
||||
params.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
return LLUICtrlFactory::create<LLInboxFolderViewItem>(params);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1736,6 +1736,12 @@ void LLPanelObjectInventory::reset()
|
|||
// <FS:Ansariel> Inventory specials
|
||||
p.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
p.item_height = fsFolderViewItemHeight;
|
||||
p.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
|
||||
|
||||
mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
|
||||
|
|
@ -1900,6 +1906,12 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root
|
|||
// <FS:Ansariel> Inventory specials
|
||||
p.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
p.item_height = fsFolderViewItemHeight;
|
||||
p.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
LLFolderViewFolder* new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
|
||||
new_folder->addToFolder(mFolders);
|
||||
new_folder->toggleOpen();
|
||||
|
|
@ -1950,6 +1962,12 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li
|
|||
// <FS:Ansariel> Inventory specials
|
||||
p.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
p.item_height = fsFolderViewItemHeight;
|
||||
p.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
|
||||
child_categories.push_back(new obj_folder_pair(obj,
|
||||
(LLFolderViewFolder*)view));
|
||||
|
|
@ -1969,6 +1987,12 @@ void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_li
|
|||
// <FS:Ansariel> Inventory specials
|
||||
params.for_inventory = true;
|
||||
|
||||
static LLCachedControl<S32> fsFolderViewItemHeight(*LLUI::sSettingGroups["config"], "FSFolderViewItemHeight");
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
params.item_height = fsFolderViewItemHeight;
|
||||
params.item_top_pad = default_params.item_top_pad - (default_params.item_height - fsFolderViewItemHeight) / 2 - 1;
|
||||
// </FS:Ansariel>
|
||||
|
||||
view = LLUICtrlFactory::create<LLFolderViewItem> (params);
|
||||
}
|
||||
view->addToFolder(folder);
|
||||
|
|
|
|||
|
|
@ -79,6 +79,8 @@ static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";
|
|||
static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";
|
||||
static const char * const MARKETPLACE_INBOX_PANEL = "marketplace_inbox";
|
||||
|
||||
bool LLSidepanelInventory::sInboxInitalized = false; // <FS:Ansariel> Inbox panel randomly shown on secondary inventory windows
|
||||
|
||||
//
|
||||
// Helpers
|
||||
//
|
||||
|
|
@ -231,6 +233,7 @@ BOOL LLSidepanelInventory::postBuild()
|
|||
}
|
||||
|
||||
// Received items inbox setup
|
||||
if (!sInboxInitalized) // <FS:Ansariel> Inbox panel randomly shown on secondary inventory window
|
||||
{
|
||||
// <FS:Ansariel> FIRE-17603: Received Items button sometimes vanishing
|
||||
//LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
|
||||
|
|
@ -256,20 +259,24 @@ BOOL LLSidepanelInventory::postBuild()
|
|||
}
|
||||
|
||||
// Set the inbox visible based on debug settings (final setting comes from http request below)
|
||||
enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
|
||||
// <FS:Ansariel> FIRE-17603: Received Items button sometimes vanishing
|
||||
//enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
|
||||
enableInbox(!gSavedSettings.getBOOL("FSShowInboxFolder") || gSavedSettings.getBOOL("FSAlwaysShowInboxButton"));
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Trigger callback for after login so we can setup to track inbox changes after initial inventory load
|
||||
LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::updateInbox, this));
|
||||
|
||||
// <FS:Ansariel> Optional hiding of Received Items folder aka Inbox
|
||||
gSavedSettings.getControl("FSShowInboxFolder")->getSignal()->connect(boost::bind(&LLSidepanelInventory::refreshInboxVisibility, this));
|
||||
gSavedSettings.getControl("FSAlwaysShowInboxButton")->getSignal()->connect(boost::bind(&LLSidepanelInventory::refreshInboxVisibility, this));
|
||||
|
||||
sInboxInitalized = true; // <FS:Ansariel> Inbox panel randomly shown on secondary inventory window
|
||||
}
|
||||
|
||||
gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));
|
||||
|
||||
// <FS:Ansariel> Optional hiding of Received Items folder aka Inbox
|
||||
gSavedSettings.getControl("FSShowInboxFolder")->getSignal()->connect(boost::bind(&LLSidepanelInventory::refreshInboxVisibility, this));
|
||||
gSavedSettings.getControl("FSAlwaysShowInboxButton")->getSignal()->connect(boost::bind(&LLSidepanelInventory::refreshInboxVisibility, this));
|
||||
//gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));
|
||||
|
||||
// Update the verbs buttons state.
|
||||
updateVerbs();
|
||||
|
|
|
|||
|
|
@ -134,6 +134,8 @@ private:
|
|||
|
||||
LLInventoryCategoriesObserver* mCategoriesObserver;
|
||||
LLInboxAddedObserver* mInboxAddedObserver;
|
||||
|
||||
static bool sInboxInitalized; // <FS:Ansariel> Inbox panel randomly shown on secondary inventory windows
|
||||
};
|
||||
|
||||
#endif //LL_LLSIDEPANELINVENTORY_H
|
||||
|
|
|
|||
|
|
@ -137,7 +137,10 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
// don't pick transparent so users can't "pay" transparent objects
|
||||
mPick = gViewerWindow->pickImmediate(x, y, /*BOOL pick_transparent*/ FALSE, /*BOOL pick_rigged*/ TRUE, /*BOOL pick_particle*/ TRUE);
|
||||
// <FS:Ansariel> FIRE-1396: Allow selecting transparent objects
|
||||
//mPick = gViewerWindow->pickImmediate(x, y, /*BOOL pick_transparent*/ FALSE, /*BOOL pick_rigged*/ TRUE, /*BOOL pick_particle*/ TRUE);
|
||||
mPick = gViewerWindow->pickImmediate(x, y, /*BOOL pick_transparent*/ TRUE, /*BOOL pick_rigged*/ TRUE, /*BOOL pick_particle*/ TRUE);
|
||||
// </FS:Ansariel>
|
||||
mPick.mKeyMask = mask;
|
||||
|
||||
// claim not handled so UI focus stays same
|
||||
|
|
|
|||
|
|
@ -194,6 +194,7 @@
|
|||
#include "fsfloatervoicecontrols.h"
|
||||
#include "fsfloatervolumecontrols.h"
|
||||
#include "fsfloatervramusage.h"
|
||||
#include "fsfloaterwearablefavorites.h"
|
||||
#include "fsmoneytracker.h"
|
||||
#include "fspanelclassified.h"
|
||||
#include "lggbeamcolormapfloater.h"
|
||||
|
|
@ -466,6 +467,7 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("fs_teleporthistory", "floater_fs_teleporthistory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterTeleportHistory>);
|
||||
LLFloaterReg::add("fs_voice_controls", "floater_fs_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterVoiceControls>);
|
||||
LLFloaterReg::add("fs_volume_controls", "floater_fs_volume_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterVolumeControls>);
|
||||
LLFloaterReg::add("fs_wearable_favorites", "floater_fs_wearable_favorites.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterWearableFavorites>);
|
||||
LLFloaterReg::add("imcontacts", "floater_fs_contacts.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterContacts>);
|
||||
LLFloaterReg::add("lgg_beamcolormap", "floater_beamcolor.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<lggBeamColorMapFloater>);
|
||||
LLFloaterReg::add("lgg_beamshape", "floater_beamshape.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<lggBeamMapFloater>);
|
||||
|
|
|
|||
|
|
@ -2026,6 +2026,12 @@ void LLVOAvatar::resetSkeleton(bool reset_animations)
|
|||
// Local viewer-side reset for non-self avatars.
|
||||
resetAnimations();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-22135: Try to re-register LLPhysicsMotionController to see if that unfreezes stuck physics
|
||||
removeMotion(ANIM_AGENT_PHYSICS_MOTION);
|
||||
registerMotion(ANIM_AGENT_PHYSICS_MOTION, LLPhysicsMotionController::create);
|
||||
startMotion(ANIM_AGENT_PHYSICS_MOTION);
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
LL_DEBUGS("Avatar") << avString() << " reset ends" << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -663,6 +663,7 @@ static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_i
|
|||
LLWearableItemsList::Params::Params()
|
||||
: standalone("standalone", true)
|
||||
, worn_indication_enabled("worn_indication_enabled", true)
|
||||
, show_create_new("show_create_new", true) // <FS:Ansariel> Optional "Create new" menu item
|
||||
{}
|
||||
|
||||
LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
|
||||
|
|
@ -676,6 +677,7 @@ LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
|
|||
setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3));
|
||||
}
|
||||
mWornIndicationEnabled = p.worn_indication_enabled;
|
||||
mShowCreateNew = p.show_create_new; // <FS:Ansariel> Optional "Create new" menu item
|
||||
setNoItemsCommentText(LLTrans::getString("LoadingData"));
|
||||
}
|
||||
|
||||
|
|
@ -950,8 +952,16 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
|
|||
// [/RLVa:KB]
|
||||
} // for
|
||||
|
||||
bool standalone = mParent ? mParent->isStandalone() : false;
|
||||
// <FS:Ansariel> Standalone check doesn't make sense here as the context
|
||||
// menu is only shown if standalone is true. If not, this
|
||||
// method isn't called at all and it is assumed you provide
|
||||
// your own right-click handler (LLWearableItemsList::ContextMenu
|
||||
// is only used in LLWearableItemsList::onRightClick handler
|
||||
// method which in return is only set as event handler if
|
||||
// standalone is true).
|
||||
bool standalone = /*mParent ? mParent->isStandalone() :*/ false;
|
||||
bool wear_add_visible = mask & (MASK_CLOTHING|MASK_ATTACHMENT) && n_worn == 0 && can_be_worn && (n_already_worn != 0 || mask & MASK_ATTACHMENT);
|
||||
bool show_create_new = mParent ? mParent->showCreateNew() : true; // <FS:Ansariel> Optional "Create new" menu item
|
||||
|
||||
// *TODO: eliminate multiple traversals over the menu items
|
||||
setMenuItemVisible(menu, "wear_wear", n_already_worn == 0 && n_worn == 0 && can_be_worn);
|
||||
|
|
@ -970,7 +980,10 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu
|
|||
setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART|MASK_ATTACHMENT) && n_worn == n_items && n_worn == 1);
|
||||
// [/SL:KB]
|
||||
setMenuItemEnabled(menu, "edit", n_editable == 1 && n_worn == 1 && n_items == 1);
|
||||
setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
|
||||
// <FS:Ansariel> Optional "Create new" menu item
|
||||
//setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
|
||||
setMenuItemVisible(menu, "create_new", show_create_new && mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
|
||||
// </FS:Ansariel>
|
||||
setMenuItemEnabled(menu, "create_new", LLAppearanceMgr::instance().canAddWearables(ids));
|
||||
setMenuItemVisible(menu, "show_original", !standalone);
|
||||
setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items);
|
||||
|
|
|
|||
|
|
@ -439,6 +439,7 @@ public:
|
|||
{
|
||||
Optional<bool> standalone;
|
||||
Optional<bool> worn_indication_enabled;
|
||||
Optional<bool> show_create_new; // <FS:Ansariel> Optional "Create new" menu item
|
||||
|
||||
Params();
|
||||
};
|
||||
|
|
@ -469,6 +470,8 @@ public:
|
|||
|
||||
void setSortOrder(ESortOrder sort_order, bool sort_now = true);
|
||||
|
||||
bool showCreateNew() const { return mShowCreateNew; } // <FS:Ansariel> Optional "Create new" menu item
|
||||
|
||||
protected:
|
||||
friend class LLUICtrlFactory;
|
||||
LLWearableItemsList(const LLWearableItemsList::Params& p);
|
||||
|
|
@ -477,6 +480,7 @@ protected:
|
|||
|
||||
bool mIsStandalone;
|
||||
bool mWornIndicationEnabled;
|
||||
bool mShowCreateNew; // <FS:Ansariel> Optional "Create new" menu item
|
||||
|
||||
ESortOrder mSortOrder;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ BEGIN
|
|||
VALUE "FileDescription", "Firestorm"
|
||||
VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"
|
||||
VALUE "InternalName", "Firestorm"
|
||||
VALUE "LegalCopyright", "Copyright \251 2010-2017, The Phoenix Firestorm Project, Inc."
|
||||
VALUE "LegalCopyright", "Copyright \251 2010-2018, The Phoenix Firestorm Project, Inc."
|
||||
VALUE "OriginalFilename", "Firestorm.exe"
|
||||
VALUE "ProductName", "Firestorm"
|
||||
VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"
|
||||
|
|
|
|||
|
|
@ -1373,4 +1373,7 @@
|
|||
<color
|
||||
name="UploadDialogBackground"
|
||||
reference="SL-Background_66" />
|
||||
<color
|
||||
name="ChatHistoryMessageFromLog"
|
||||
reference="Gray" />
|
||||
</colors>
|
||||
|
|
|
|||
|
|
@ -1373,4 +1373,7 @@
|
|||
<color
|
||||
name="UploadDialogBackground"
|
||||
reference="SL-Background_66" />
|
||||
<color
|
||||
name="ChatHistoryMessageFromLog"
|
||||
reference="Gray" />
|
||||
</colors>
|
||||
|
|
|
|||
|
|
@ -1327,4 +1327,7 @@
|
|||
<color
|
||||
name="UploadDialogBackground"
|
||||
reference="DkGray" />
|
||||
<color
|
||||
name="ChatHistoryMessageFromLog"
|
||||
reference="Gray" />
|
||||
</colors>
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 547 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 610 B |
|
|
@ -793,6 +793,7 @@ with the same filename but different name
|
|||
<texture name="block_list" file_name="toolbar_icons/blocklist.png" preload="true" />
|
||||
<texture name="resync_animations" file_name="toolbar_icons/resync_animations.png" preload="true" />
|
||||
<texture name="Group_Titles_Icon" file_name="toolbar_icons/group_titles.png" preload="true" />
|
||||
<texture name="Wearable_Favorites_Icon" file_name="toolbar_icons/wearable_favorites.png" preload="true" />
|
||||
|
||||
<texture name="skin ansastorm blood" file_name="skinspreview/ansa_blood.jpg" preload="true" />
|
||||
<texture name="skin ansastorm bright blue" file_name="skinspreview/ansa_blue.jpg" preload="true" />
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 536 B |
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_fs_wearable_favorites" title="Kleidungsfavoriten">
|
||||
<floater.string name="empty_list">
|
||||
Kleidung oder Objekt hier hinziehen, um zur Liste hinzuzufügen.
|
||||
</floater.string>
|
||||
<floater.string name="search_no_items">
|
||||
Keine treffenden Objekte gefunden.
|
||||
</floater.string>
|
||||
<panel name="buttons_panel">
|
||||
<filter_editor label="Kleidungsfavoriten filtern" name="wearable_filter_input"/>
|
||||
<menu_button name="options_btn" tool_tip="Kleidungsfavoriten-Optionen"/>
|
||||
<button name="remove_btn" tool_tip="Kleidung aus Kleidungsfavoriten löschen"/>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="menu_wearable_favorites">
|
||||
<menu_item_check label="Sortierung nach Name..." name="sort_by_name"/>
|
||||
<menu_item_check label="Sortierung nach Aktualität..." name="sort_by_most_recent"/>
|
||||
<menu_item_check label="Sortierung nach Typname..." name="sort_by_type_name"/>
|
||||
</toggleable_menu>
|
||||
|
|
@ -8,6 +8,7 @@
|
|||
<menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
|
||||
<menu_item_check label="Inventar" name="Inventory"/>
|
||||
<menu_item_check label="Inventar" name="ShowSidetrayInventory"/>
|
||||
<menu_item_check label="Kleidungsfavoriten" name="WearableFavorites"/>
|
||||
<menu_item_call label="Auswahlen" name="Picks"/>
|
||||
<menu_item_call label="Erlebnisse" name="Experiences"/>
|
||||
<menu_item_call label="Profil" name="Profile"/>
|
||||
|
|
|
|||
|
|
@ -5827,6 +5827,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
|
|||
<string name="Command_Group_Titles_Label">
|
||||
Gruppentitel
|
||||
</string>
|
||||
<string name="Command_Wearable_Favorites_Label">
|
||||
Kleidungsfavoriten
|
||||
</string>
|
||||
<string name="Command_Appearance_Tooltip">
|
||||
Avatar ändern
|
||||
</string>
|
||||
|
|
@ -6007,6 +6010,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
|
|||
<string name="Command_Group_Titles_Tooltip">
|
||||
Aktuellen Gruppentitel ändern
|
||||
</string>
|
||||
<string name="Command_Wearable_Favorites_Tooltip">
|
||||
Liste der Kleidungsfavoriten öffnen
|
||||
</string>
|
||||
<string name="Toolbar_Bottom_Tooltip">
|
||||
gegenwärtig in der unteren Symbolleiste
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -534,7 +534,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
|
|||
height="23"
|
||||
image_overlay="Play_Over"
|
||||
image_unselected="SegmentedBtn_Left_Off"
|
||||
image_selected="SegmentedBtn_Left_On_Selected"
|
||||
image_selected="SegmentedBtn_Left_Selected"
|
||||
image_disabled_selected="SegmentedBtn_Left_Selected_Disabled"
|
||||
image_disabled="SegmentedBtn_Left_Disabled"
|
||||
image_pressed="SegmentedBtn_Left_Press"
|
||||
|
|
@ -551,7 +551,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
|
|||
height="23"
|
||||
image_overlay="Pause_Over"
|
||||
image_unselected="SegmentedBtn_Left_Off"
|
||||
image_selected="SegmentedBtn_Left_On_Selected"
|
||||
image_selected="SegmentedBtn_Left_Selected"
|
||||
image_disabled_selected="SegmentedBtn_Left_Selected_Disabled"
|
||||
image_disabled="SegmentedBtn_Left_Disabled"
|
||||
image_pressed="SegmentedBtn_Left_Press"
|
||||
|
|
@ -567,7 +567,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
|
|||
height="23"
|
||||
image_overlay="StopReload_Over"
|
||||
image_unselected="SegmentedBtn_Right_Off"
|
||||
image_selected="SegmentedBtn_Right_On_Selected"
|
||||
image_selected="SegmentedBtn_Right_Selected"
|
||||
image_disabled_selected="SegmentedBtn_Right_Selected_Disabled"
|
||||
image_disabled="SegmentedBtn_Right_Disabled"
|
||||
image_pressed="SegmentedBtn_Right_Press"
|
||||
|
|
|
|||
|
|
@ -479,7 +479,6 @@
|
|||
left="10"
|
||||
name="edit_experience_title"
|
||||
max_length_bytes="63"
|
||||
text_color="black"
|
||||
right="-10"/>
|
||||
<text
|
||||
follows="left|top|right"
|
||||
|
|
@ -498,7 +497,6 @@
|
|||
left="11"
|
||||
name="edit_experience_description"
|
||||
max_length="2048"
|
||||
text_color="black"
|
||||
right="-11"
|
||||
word_wrap="true"/>
|
||||
<button
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
positioning="centered"
|
||||
legacy_header_height="18"
|
||||
background_visible="true"
|
||||
default_tab_group="1"
|
||||
show_title="true"
|
||||
follows="all"
|
||||
height="350"
|
||||
height="332"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="panel_im"
|
||||
|
|
@ -38,7 +37,7 @@
|
|||
layout="topleft"
|
||||
orientation="horizontal"
|
||||
name="ls_control_panel"
|
||||
top="20"
|
||||
top="2"
|
||||
left="3">
|
||||
<layout_panel
|
||||
auto_resize="false"
|
||||
|
|
@ -484,7 +483,7 @@
|
|||
layout="topleft"
|
||||
orientation="horizontal"
|
||||
name="chat_stack"
|
||||
top="40"
|
||||
top="22"
|
||||
left="0">
|
||||
<layout_panel
|
||||
name="im_control_panel_holder"
|
||||
|
|
|
|||
|
|
@ -1,10 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
legacy_header_height="18"
|
||||
background_visible="true"
|
||||
default_tab_group="1"
|
||||
follows="all"
|
||||
height="350"
|
||||
height="332"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="nearby_chat"
|
||||
|
|
@ -35,7 +34,7 @@
|
|||
layout="topleft"
|
||||
orientation="horizontal"
|
||||
name="ls_control_panel"
|
||||
top="20"
|
||||
top="2"
|
||||
left="3">
|
||||
<layout_panel
|
||||
name="lp_translate_btn"
|
||||
|
|
@ -157,7 +156,7 @@
|
|||
layout="topleft"
|
||||
orientation="horizontal"
|
||||
name="ls_chat"
|
||||
top="40"
|
||||
top="22"
|
||||
left="0">
|
||||
<layout_panel
|
||||
name="panel_im_control_lp"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,93 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
positioning="cascading"
|
||||
can_close="true"
|
||||
can_resize="true"
|
||||
height="350"
|
||||
help_topic="fs_wearable_favorites"
|
||||
min_height="150"
|
||||
min_width="175"
|
||||
layout="topleft"
|
||||
name="floater_fs_wearable_favorites"
|
||||
save_rect="true"
|
||||
save_visibility="true"
|
||||
single_instance="true"
|
||||
reuse_instance="true"
|
||||
title="Favorite Wearables"
|
||||
width="310">
|
||||
|
||||
<floater.string name="empty_list">
|
||||
Drag wearable items here to add to list.
|
||||
</floater.string>
|
||||
<floater.string name="search_no_items">
|
||||
No matching items found.
|
||||
</floater.string>
|
||||
|
||||
<panel
|
||||
follows="left|top|right"
|
||||
height="27"
|
||||
layout="topleft"
|
||||
left="2"
|
||||
name="buttons_panel"
|
||||
right="-1"
|
||||
top="2">
|
||||
<filter_editor
|
||||
follows="left|top|right"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
label="Filter Wearables"
|
||||
max_length_chars="300"
|
||||
name="wearable_filter_input"
|
||||
top="1"
|
||||
right="-70" />
|
||||
<menu_button
|
||||
follows="right"
|
||||
height="25"
|
||||
image_hover_unselected="Toolbar_Middle_Over"
|
||||
image_overlay="Conv_toolbar_sort"
|
||||
image_selected="Toolbar_Middle_Selected"
|
||||
image_unselected="Toolbar_Middle_Off"
|
||||
layout="topleft"
|
||||
left_pad="2"
|
||||
name="options_btn"
|
||||
tool_tip="Wearable favorites options"
|
||||
top_delta="0"
|
||||
width="31" />
|
||||
<button
|
||||
follows="right"
|
||||
height="25"
|
||||
image_hover_unselected="Toolbar_Middle_Over"
|
||||
image_overlay="TrashItem_Off"
|
||||
image_selected="Toolbar_Middle_Selected"
|
||||
image_unselected="Toolbar_Middle_Off"
|
||||
left_pad="2"
|
||||
layout="topleft"
|
||||
name="remove_btn"
|
||||
tool_tip="Remove wearable from favorites list"
|
||||
top_delta="0"
|
||||
width="31"/>
|
||||
</panel>
|
||||
|
||||
<panel
|
||||
layout="topleft"
|
||||
follows="all"
|
||||
name="panel_fs_wearable_favorites"
|
||||
top="32"
|
||||
left="2"
|
||||
bottom="-2"
|
||||
right="-1">
|
||||
<fs_wearable_favorites_items_list
|
||||
layout="topleft"
|
||||
follows="all"
|
||||
name="favorites_list"
|
||||
multi_select="true"
|
||||
standalone="true"
|
||||
show_create_new="false"
|
||||
top="0"
|
||||
left="0"
|
||||
bottom="-1"
|
||||
right="-1"
|
||||
worn_indication_enabled="true" />
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="menu_wearable_favorites">
|
||||
<menu_item_check
|
||||
label="Sort by name..."
|
||||
name="sort_by_name">
|
||||
<on_click
|
||||
function="FavWearables.Action"
|
||||
parameter="sort_by_name"/>
|
||||
<on_check
|
||||
function="FavWearables.CheckAction"
|
||||
parameter="sort_by_name"/>
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Sort by most recent..."
|
||||
name="sort_by_most_recent">
|
||||
<on_click
|
||||
function="FavWearables.Action"
|
||||
parameter="sort_by_most_recent"/>
|
||||
<on_check
|
||||
function="FavWearables.CheckAction"
|
||||
parameter="sort_by_most_recent"/>
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Sort by type name..."
|
||||
name="sort_by_type_name">
|
||||
<on_click
|
||||
function="FavWearables.Action"
|
||||
parameter="sort_by_type_name"/>
|
||||
<on_check
|
||||
function="FavWearables.CheckAction"
|
||||
parameter="sort_by_type_name"/>
|
||||
</menu_item_check>
|
||||
</toggleable_menu>
|
||||
|
|
@ -64,6 +64,17 @@
|
|||
parameter="inventory" />
|
||||
</menu_item_check>
|
||||
|
||||
<menu_item_check
|
||||
label="Favorite Wearables"
|
||||
name="WearableFavorites">
|
||||
<menu_item_check.on_click
|
||||
function="Floater.Toggle"
|
||||
parameter="fs_wearable_favorites" />
|
||||
<menu_item_check.on_check
|
||||
function="Floater.Visible"
|
||||
parameter="fs_wearable_favorites" />
|
||||
</menu_item_check>
|
||||
|
||||
<menu_item_call
|
||||
label="Picks"
|
||||
name="Picks">
|
||||
|
|
|
|||
|
|
@ -2630,6 +2630,7 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="Command_ResyncAnimations_Label">Resync animations</string>
|
||||
<string name="Command_RegionTracker_Label">Region Tracker</string>
|
||||
<string name="Command_Group_Titles_Label">Group Titles</string>
|
||||
<string name="Command_Wearable_Favorites_Label">Favorite Wearables</string>
|
||||
|
||||
<string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
|
||||
<string name="Command_Appearance_Tooltip">Change your avatar</string>
|
||||
|
|
@ -2693,6 +2694,7 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="Command_ResyncAnimations_Tooltip">Synchronizes avatar animations</string>
|
||||
<string name="Command_RegionTracker_Tooltip">Track various regions status</string>
|
||||
<string name="Command_Group_Titles_Tooltip">Change active group tag</string>
|
||||
<string name="Command_Wearable_Favorites_Tooltip">Open the list of favorite wearables</string>
|
||||
|
||||
<string name="Toolbar_Bottom_Tooltip">currently in your bottom toolbar</string>
|
||||
<string name="Toolbar_Left_Tooltip" >currently in your left toolbar</string>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
layout="topleft"
|
||||
left="0"
|
||||
name="item_icon"
|
||||
top="0"
|
||||
top="2"
|
||||
width="16" />
|
||||
<item_name
|
||||
follows="left|right"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_fs_wearable_favorites" title="Ulubione rzeczy">
|
||||
<floater.string name="empty_list">
|
||||
Przeciągnij rzeczy tutaj aby dodać je do listy.
|
||||
</floater.string>
|
||||
<floater.string name="search_no_items">
|
||||
Nie znaleziono pasujących rzeczy.
|
||||
</floater.string>
|
||||
<panel name="buttons_panel">
|
||||
<filter_editor label="Filtruj rzeczy" name="wearable_filter_input" />
|
||||
<menu_button name="options_btn" tool_tip="Opcje ulubionych rzeczy" />
|
||||
<button name="remove_btn" tool_tip="Usuń rzecz z listy ulubionych" />
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="menu_wearable_favorites">
|
||||
<menu_item_check label="Porządkuj według nazwy" name="sort_by_name" />
|
||||
<menu_item_check label="Porządkuj według daty" name="sort_by_most_recent" />
|
||||
<menu_item_check label="Porządkuj według typu" name="sort_by_type_name" />
|
||||
</toggleable_menu>
|
||||
|
|
@ -4,11 +4,12 @@
|
|||
<menu_item_call label="Zarządzaj kontem" name="Manage Account"/>
|
||||
<menu_item_call label="Moje rzeczy na Marketplace" name="MarketplaceListings"/>
|
||||
<menu_item_call label="Kup L$" name="Buy and Sell L$"/>
|
||||
<menu_item_check label="Moja Szafa" name="Inventory"/>
|
||||
<menu_item_check label="Moja Szafa" name="ShowSidetrayInventory"/>
|
||||
<menu_item_check label="Moja szafa" name="Inventory"/>
|
||||
<menu_item_check label="Moja szafa" name="ShowSidetrayInventory"/>
|
||||
<menu_item_check label="Ulubione rzeczy" name="WearableFavorites"/>
|
||||
<menu_item_call label="Miejsca" name="Picks"/>
|
||||
<menu_item_call label="Przygody" name="Experiences"/>
|
||||
<menu_item_call label="Mój Profil" name="Profile"/>
|
||||
<menu_item_call label="Mój profil" name="Profile"/>
|
||||
<menu_item_check label="Mój wygląd" name="ChangeOutfit"/>
|
||||
<menu_item_call label="Biblioteka awatarów" name="Avatar Picker"/>
|
||||
<menu label="Ruch" name="Movement">
|
||||
|
|
|
|||
|
|
@ -5217,11 +5217,14 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
|
|||
Synchronizuj animacje
|
||||
</string>
|
||||
<string name="Command_RegionTracker_Label">
|
||||
Śledzenie Regionów
|
||||
Śledzenie regionów
|
||||
</string>
|
||||
<string name="Command_Group_Titles_Label">
|
||||
Tytuły grup
|
||||
</string>
|
||||
<string name="Command_Wearable_Favorites_Label">
|
||||
Ulubione rzeczy
|
||||
</string>
|
||||
<string name="Command_AboutLand_Tooltip">
|
||||
Informacje o miejscu, które odwiedzasz
|
||||
</string>
|
||||
|
|
@ -5396,6 +5399,9 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
|
|||
<string name="Command_Group_Titles_Tooltip">
|
||||
Zmień aktywny tag grupy
|
||||
</string>
|
||||
<string name="Command_Wearable_Favorites_Tooltip">
|
||||
Otwiera listę ulubionych rzeczy
|
||||
</string>
|
||||
<string name="Toolbar_Bottom_Tooltip">
|
||||
obecnie na Twoim dolnym pasku
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -1163,4 +1163,7 @@
|
|||
<color
|
||||
name="OutfitGalleryItemUnselected"
|
||||
value="0.4 0.4 0.4 1" />
|
||||
<color
|
||||
name="ChatHistoryMessageFromLog"
|
||||
reference="White_50" />
|
||||
</colors>
|
||||
|
|
|
|||
|
|
@ -11,13 +11,13 @@
|
|||
<default_style
|
||||
font="SansSerifSmall"
|
||||
font.style="NORMAL"
|
||||
color="DkGray"/>
|
||||
color="White"/>
|
||||
|
||||
<!-- styles for avatar item INVITED to voice call -->
|
||||
<voice_call_invited_style
|
||||
font="SansSerifSmall"
|
||||
font.style="NORMAL"
|
||||
color="SL-MidDkGray_50"/>
|
||||
color="White_50"/>
|
||||
|
||||
<!-- styles for avatar item JOINED to voice call -->
|
||||
<voice_call_joined_style
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
<offline_style
|
||||
font="SansSerifSmall"
|
||||
font.style="NORMAL"
|
||||
color="SL-MidDkGray"/>
|
||||
color="White_70"/>
|
||||
|
||||
<!-- TS: styles for GROUP MODERATOR avatar item (FIRE-984)-->
|
||||
<group_moderator_style
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
positioning="centered"
|
||||
legacy_header_height="18"
|
||||
background_visible="true"
|
||||
default_tab_group="1"
|
||||
show_title="true"
|
||||
follows="all"
|
||||
height="350"
|
||||
height="332"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="panel_im"
|
||||
|
|
@ -26,7 +25,7 @@
|
|||
<floater.string
|
||||
name="multiple_participants_added"
|
||||
value="[NAME] were invited to the conversation."/>
|
||||
|
||||
|
||||
<layout_stack
|
||||
border_size="0"
|
||||
animate="false"
|
||||
|
|
@ -38,7 +37,7 @@
|
|||
layout="topleft"
|
||||
orientation="horizontal"
|
||||
name="ls_control_panel"
|
||||
top="20"
|
||||
top="2"
|
||||
left="3">
|
||||
<layout_panel
|
||||
auto_resize="false"
|
||||
|
|
@ -384,9 +383,9 @@
|
|||
name="send_sysinfo_btn"
|
||||
top="0"
|
||||
width="24" />
|
||||
</layout_panel>
|
||||
|
||||
<layout_panel
|
||||
</layout_panel>
|
||||
|
||||
<layout_panel
|
||||
name="lp_options_btn"
|
||||
auto_resize="false"
|
||||
user_resize="false"
|
||||
|
|
@ -444,7 +443,7 @@
|
|||
layout="topleft"
|
||||
orientation="horizontal"
|
||||
name="chat_stack"
|
||||
top="40"
|
||||
top="22"
|
||||
left="0">
|
||||
<layout_panel
|
||||
name="im_control_panel_holder"
|
||||
|
|
|
|||
|
|
@ -1,10 +1,9 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
legacy_header_height="18"
|
||||
background_visible="true"
|
||||
default_tab_group="1"
|
||||
follows="all"
|
||||
height="350"
|
||||
height="332"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="nearby_chat"
|
||||
|
|
@ -29,7 +28,7 @@
|
|||
animate="false"
|
||||
follows="top|left"
|
||||
clip="false"
|
||||
height="27"
|
||||
height="9"
|
||||
width="200"
|
||||
left_pad="0"
|
||||
layout="topleft"
|
||||
|
|
@ -137,7 +136,7 @@
|
|||
layout="topleft"
|
||||
orientation="horizontal"
|
||||
name="ls_chat"
|
||||
top="40"
|
||||
top="22"
|
||||
left="0">
|
||||
<layout_panel
|
||||
name="panel_im_control_lp"
|
||||
|
|
|
|||
|
|
@ -2199,6 +2199,15 @@ class Linux_i686_Manifest(LinuxManifest):
|
|||
print "Skipping libfmodex.so - not found"
|
||||
pass
|
||||
|
||||
try:
|
||||
self.path("libfmod-*.so")
|
||||
self.path("libfmod.so")
|
||||
self.path("libfmod.so*")
|
||||
pass
|
||||
except:
|
||||
print "Skipping libfmodstudio.so - not found"
|
||||
pass
|
||||
|
||||
|
||||
# Vivox runtimes
|
||||
with self.prefix(src=relpkgdir, dst="bin"):
|
||||
|
|
@ -2232,14 +2241,21 @@ class Linux_x86_64_Manifest(LinuxManifest):
|
|||
try:
|
||||
self.path("libfmodex64-*.so")
|
||||
self.path("libfmodex64.so")
|
||||
self.path("libfmod64.so")
|
||||
self.path("libfmod.so")
|
||||
self.path("libfmod.so*")
|
||||
self.path("libfmodex64.so*")
|
||||
pass
|
||||
except:
|
||||
print "Skipping libfmodex.so - not found"
|
||||
pass
|
||||
|
||||
try:
|
||||
self.path("libfmod-*.so")
|
||||
self.path("libfmod.so")
|
||||
self.path("libfmod.so*")
|
||||
pass
|
||||
except:
|
||||
print "Skipping libfmod.so - not found"
|
||||
pass
|
||||
|
||||
self.prefix(src="../packages/lib/release/x64", dst="lib")
|
||||
try:
|
||||
self.path("libLeap.so")
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
[firestorm]
|
||||
linux = build_directory|build-linux-x86_64
|
||||
|
||||
[fmodstudio]
|
||||
linux = file:///opt/firestorm/fmodstudio-1.10.02-linux-x64-201801091648.tar.bz2|8787b777a49d41ccbb3cbd6c4a1d768d
|
||||
|
||||
[gstreamer]
|
||||
linux = http://downloads.phoenixviewer.com/gstreamer-0.10.6.201505150224-r5-linux-x64-201505150224-r5.tar.bz2|22d197890dd99756250912f396cb1abb
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue