Merge Firestorm LGPL

master
Ansariel 2018-01-16 22:55:49 +01:00
commit 6d6111814a
71 changed files with 1117 additions and 160 deletions

View File

@ -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

View File

@ -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>

View File

@ -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)

View File

@ -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)

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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

View File

@ -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();

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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")

View File

@ -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.";

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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);

View File

@ -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;
}

View File

@ -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

View File

@ -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);
}
}
}
}

View File

@ -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

View File

@ -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!

View File

@ -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

View File

@ -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);
}

View File

@ -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;

View File

@ -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()

View File

@ -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);
}

View File

@ -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>

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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>);

View File

@ -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;

View File

@ -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);

View File

@ -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;
};

View File

@ -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}"

View File

@ -1373,4 +1373,7 @@
<color
name="UploadDialogBackground"
reference="SL-Background_66" />
<color
name="ChatHistoryMessageFromLog"
reference="Gray" />
</colors>

View File

@ -1373,4 +1373,7 @@
<color
name="UploadDialogBackground"
reference="SL-Background_66" />
<color
name="ChatHistoryMessageFromLog"
reference="Gray" />
</colors>

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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"/>

View File

@ -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>

View File

@ -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"

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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>

View File

@ -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">

View File

@ -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>

View File

@ -25,7 +25,7 @@
layout="topleft"
left="0"
name="item_icon"
top="0"
top="2"
width="16" />
<item_name
follows="left|right"

View File

@ -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>

View File

@ -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>

View File

@ -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">

View File

@ -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>

View File

@ -1163,4 +1163,7 @@
<color
name="OutfitGalleryItemUnselected"
value="0.4 0.4 0.4 1" />
<color
name="ChatHistoryMessageFromLog"
reference="White_50" />
</colors>

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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")

View File

@ -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