# Conflicts:
#	indra/llmessage/llregionflags.h
#	indra/newview/llfloaterregioninfo.cpp
master
Ansariel 2023-08-24 00:32:15 +02:00
commit 9c098fb132
28 changed files with 209 additions and 169 deletions

View File

@ -2,8 +2,9 @@ name: Build viewer
on:
push:
branches:
- "*release"
- master
- "Firestorm*.*.*"
tags:
- "preview"
schedule:
- cron: '00 03 * * *' # Run every day at 3am UTC
env:
@ -74,14 +75,14 @@ jobs:
- name: find channel from Branch name
run: |
if [[ "${{ github.ref_name }}" == *Release* ]]; then
if [[ "${{ github.ref_name }}" == Firestorm* ]]; then
FS_RELEASE_TYPE=Release
elif [[ "${{ github.ref_name }}" == *review* ]]; then
FS_RELEASE_TYPE=Beta
elif [[ "${{ github.event_name }}" == 'schedule' ]]; then
FS_RELEASE_TYPE=Nightly
else
if [[ "${{github.event_name}}" == 'schedule' ]]; then
FS_RELEASE_TYPE=Nightly
else
FS_RELEASE_TYPE=Beta
fi
FS_RELEASE_TYPE=Unknown
fi
if [[ "${{ matrix.addrsize }}" == "64" ]]; then
FS_RELEASE_CHAN="${FS_RELEASE_TYPE}x64"
@ -118,7 +119,11 @@ jobs:
shell: bash
- name: rclone the private 3p packages for this platform (both 64 & 32)
run: 'rclone copy fs_bundles: --include "*${{ env.fallback_platform }}*bz2" .'
run: 'rclone copy fs_bundles: --filter "- Alpha/*" --filter "+ *${{ env.fallback_platform }}*bz2" .'
- name: rclone any extra private 3p packages for Alpha (allows library updates not in the main repo)
if: env.FS_BUILD_TYPE == 'Alpha'
run: 'rclone copy fs_bundles:Alpha --include "*${{ env.fallback_platform }}*bz2" .'
- name: set VSVER for Windows builds
if: runner.os == 'Windows'
@ -255,17 +260,17 @@ jobs:
- name: find channel and webhook from Branch name
run: |
if [[ "${{ github.ref_name }}" == *Release* ]]; then
if [[ "${{ github.ref_name }}" == Firestorm* ]]; then
FS_RELEASE_FOLDER=release
FS_BUILD_WEBHOOK_URL=${{ secrets.RELEASE_WEBHOOK_URL }}
else
if [[ "${{github.event_name}}" == 'schedule' ]]; then
FS_RELEASE_FOLDER=nightly
FS_BUILD_WEBHOOK_URL=${{ secrets.NIGHTLY_WEBHOOK_URL }}
else
elif [[ "${{ github.ref_name }}" == *review* ]]; then
FS_RELEASE_FOLDER=preview
FS_BUILD_WEBHOOK_URL=${{ secrets.BETA_WEBHOOK_URL }}
fi
elif [[ "${{ github.event_name }}" == 'schedule' ]]; then
FS_RELEASE_FOLDER=nightly
FS_BUILD_WEBHOOK_URL=${{ secrets.NIGHTLY_WEBHOOK_URL }}
else
FS_RELEASE_TYPE=Unknown
fi
echo "FS_RELEASE_FOLDER=${FS_RELEASE_FOLDER}" >> $GITHUB_ENV
echo "FS_BUILD_WEBHOOK_URL=${FS_BUILD_WEBHOOK_URL}" >> $GITHUB_ENV

View File

@ -172,8 +172,10 @@ const U32 ESTATE_ACCESS_NO_REPLY = 1U << 10;
const U32 ESTATE_ACCESS_FAILED_BAN_ESTATE_MANAGER = 1U << 11;
const S32 ESTATE_MAX_MANAGERS = 20;
const S32 ESTATE_MAX_MANAGERS_OS = 15; // <FS:Ansariel> OpenSim
const S32 ESTATE_MAX_ACCESS_IDS = 500; // max for access
const S32 ESTATE_MAX_BANNED_IDS = 750; // max for banned
const S32 ESTATE_MAX_BANNED_IDS_OS = 500; // max for banned // <FS:Ansariel> OpenSim
const S32 ESTATE_MAX_GROUP_IDS = (S32) ESTATE_ACCESS_MAX_ENTRIES_PER_PACKET;
// 'Sim Wide Delete' flags

View File

@ -26427,5 +26427,16 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FSSortAttachmentSpotsAlphabetically</key>
<map>
<key>Comment</key>
<string>Sorts the attachment spots in the "Attach to" menus alphabetically</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
</map>
</llsd>

View File

@ -23,7 +23,7 @@
FSFloaterPoseStand::FSFloaterPoseStand(const LLSD& key)
: LLFloater(key),
mComboPose(NULL),
mComboPose(nullptr),
mPoseStandLock(false),
mAOPaused(false)
{

View File

@ -30,7 +30,7 @@
FSFloaterRadar::FSFloaterRadar(const LLSD& key)
: LLFloater(key),
mRadarPanel(NULL)
mRadarPanel(nullptr)
{
}

View File

@ -135,8 +135,7 @@ BOOL FSFloaterWearableFavorites::postBuild()
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)
if (LLToggleableMenu* options_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_fs_wearable_favorites.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); options_menu)
{
mOptionsMenuHandle = options_menu->getHandle();
mOptionsButton->setMenu(options_menu, LLMenuButton::MP_BOTTOM_LEFT);
@ -204,8 +203,7 @@ BOOL FSFloaterWearableFavorites::handleKeyHere(KEY key, MASK mask)
// static
std::optional<LLUUID> FSFloaterWearableFavorites::getWearableFavoritesFolderID()
{
LLUUID fs_root_cat_id = gInventory.findCategoryByName(ROOT_FIRESTORM_FOLDER);
if (!fs_root_cat_id.isNull())
if (LLUUID fs_root_cat_id = gInventory.findCategoryByName(ROOT_FIRESTORM_FOLDER); !fs_root_cat_id.isNull())
{
LLInventoryModel::item_array_t* items;
LLInventoryModel::cat_array_t* cats;
@ -339,8 +337,7 @@ bool FSFloaterWearableFavorites::onOptionsMenuItemChecked(const LLSD& userdata)
void FSFloaterWearableFavorites::onDoubleClick()
{
LLUUID selected_item_id = mItemsList->getSelectedUUID();
if (selected_item_id.notNull())
if (LLUUID selected_item_id = mItemsList->getSelectedUUID(); selected_item_id.notNull())
{
uuid_vec_t ids;
ids.push_back(selected_item_id);

View File

@ -120,9 +120,9 @@ bool FSKeywords::chatContainsKeyword(const LLChat& chat, bool is_local)
if (sFSKeywordMatchWholeWords)
{
for (std::vector<std::string>::iterator it = mWordList.begin(); it != mWordList.end(); ++it)
for (const auto& word : mWordList)
{
if (boost::regex_search(source, boost::regex("\\b" + (*it) + "\\b")))
if (boost::regex_search(source, boost::regex("\\b" + word + "\\b")))
{
return true;
}
@ -130,9 +130,9 @@ bool FSKeywords::chatContainsKeyword(const LLChat& chat, bool is_local)
}
else
{
for (std::vector<std::string>::iterator it = mWordList.begin(); it != mWordList.end(); ++it)
for (const auto& word : mWordList)
{
if (source.find((*it)) != std::string::npos)
if (source.find(word) != std::string::npos)
{
return true;
}
@ -145,30 +145,27 @@ bool FSKeywords::chatContainsKeyword(const LLChat& chat, bool is_local)
// <FS:PP> FIRE-10178: Keyword Alerts in group IM do not work unless the group is in the foreground
void FSKeywords::notify(const LLChat& chat)
{
if (chat.mFromID != gAgentID || chat.mFromName == SYSTEM_FROM)
if ((chat.mFromID != gAgentID || chat.mFromName == SYSTEM_FROM) && !chat.mMuted && !LLMuteList::getInstance()->isMuted(chat.mFromID))
{
if (!chat.mMuted && !LLMuteList::getInstance()->isMuted(chat.mFromID))
static LLCachedControl<bool> PlayModeUISndFSKeywordSound(gSavedPerAccountSettings, "PlayModeUISndFSKeywordSound");
if (PlayModeUISndFSKeywordSound)
{
static LLCachedControl<bool> PlayModeUISndFSKeywordSound(gSavedPerAccountSettings, "PlayModeUISndFSKeywordSound");
if (PlayModeUISndFSKeywordSound)
{
LLUI::getInstance()->mAudioCallback(LLUUID(gSavedPerAccountSettings.getString("UISndFSKeywordSound")));
}
LLUI::getInstance()->mAudioCallback(LLUUID(gSavedPerAccountSettings.getString("UISndFSKeywordSound")));
}
static LLCachedControl<bool> FSEnableGrowl(gSavedSettings, "FSEnableGrowl");
if (FSEnableGrowl)
static LLCachedControl<bool> FSEnableGrowl(gSavedSettings, "FSEnableGrowl");
if (FSEnableGrowl)
{
std::string msg = chat.mFromName;
if (is_irc_me_prefix(chat.mText))
{
std::string msg = chat.mFromName;
if (is_irc_me_prefix(chat.mText))
{
msg = msg + chat.mText.substr(3);
}
else
{
msg = msg + ": " + chat.mText;
}
GrowlManager::notify("Keyword Alert", msg, GROWL_KEYWORD_ALERT_TYPE);
msg = msg + chat.mText.substr(3);
}
else
{
msg = msg + ": " + chat.mText;
}
GrowlManager::notify("Keyword Alert", msg, GROWL_KEYWORD_ALERT_TYPE);
}
}
}

View File

@ -148,16 +148,13 @@ void FSMoneyTrackerListMenu::onContextMenuItemClick(const LLSD& userdata)
if (option == "copy")
{
FSMoneyTracker* floater = LLFloaterReg::findTypedInstance<FSMoneyTracker>("money_tracker");
if (floater)
if (FSMoneyTracker* floater = LLFloaterReg::findTypedInstance<FSMoneyTracker>("money_tracker"); floater)
{
std::string copy_text;
LLNameListCtrl* list = floater->getChild<LLNameListCtrl>("payment_list");
std::vector<LLScrollListItem*> selected = list->getAllSelected();
for (std::vector<LLScrollListItem*>::iterator it = selected.begin(); it != selected.end(); ++it)
for (auto item : list->getAllSelected())
{
const LLScrollListItem* item = *it;
copy_text += ( (copy_text.empty() ? "" : "\n")
+ item->getColumn(0)->getValue().asString() + ";"
+ item->getColumn(1)->getValue().asString() + ";"

View File

@ -48,10 +48,10 @@
#include "rlvactions.h"
#include "rlvhandler.h"
static const U32 NAME_PREDICTION_MINIMUM_LENGTH = 3;
constexpr U32 NAME_PREDICTION_MINIMUM_LENGTH = 3;
// *HACK* chat bar cannot return its correct height for some reason
static const S32 MAGIC_CHAT_BAR_PAD = 5;
constexpr S32 MAGIC_CHAT_BAR_PAD = 5;
struct LLChatTypeTrigger {
std::string name;
@ -237,8 +237,8 @@ bool matchChatTypeTrigger(const std::string& in_str, std::string* out_str)
S32 FSNearbyChat::sLastSpecialChatChannel = 0;
FSNearbyChat::FSNearbyChat() :
mDefaultChatBar(NULL),
mFocusedInputEditor(NULL)
mDefaultChatBar(nullptr),
mFocusedInputEditor(nullptr)
{
gSavedSettings.getControl("MainChatbarVisible")->getSignal()->connect(boost::bind(&FSNearbyChat::onDefaultChatBarButtonClicked, this));
}

View File

@ -132,12 +132,11 @@ BOOL FSPanelBlockList::handleKeyHere(KEY key, MASK mask)
void FSPanelBlockList::selectBlocked(const LLUUID& mute_id)
{
mBlockedList->deselectAllItems();
std::vector<LLScrollListItem*> items = mBlockedList->getAllData();
for (std::vector<LLScrollListItem*>::iterator it = items.begin(); it != items.end(); it++)
for (auto item : mBlockedList->getAllData())
{
if ((*it)->getColumn(3)->getValue().asUUID() == mute_id)
if (item->getColumn(3)->getValue().asUUID() == mute_id)
{
(*it)->setSelected(TRUE);
item->setSelected(TRUE);
break;
}
}
@ -171,17 +170,15 @@ void FSPanelBlockList::refreshBlockedList()
{
mBlockedList->deleteAllItems();
std::vector<LLMute> mutes = LLMuteList::getInstance()->getMutes();
std::vector<LLMute>::iterator it;
for (it = mutes.begin(); it != mutes.end(); ++it)
for (const auto& mute : LLMuteList::getInstance()->getMutes())
{
LLScrollListItem::Params item_p;
item_p.enabled(TRUE);
item_p.enabled(true);
item_p.value(LLUUID::generateNewID()); // can't link UUID of blocked item directly because of mutes by name
item_p.columns.add().column("item_name").value(it->mName);
item_p.columns.add().column("item_type").value(it->getDisplayType());
item_p.columns.add().column("item_mute_type").value(it->mType);
item_p.columns.add().column("item_mute_uuid").value(it->mID);
item_p.columns.add().column("item_name").value(mute.mName);
item_p.columns.add().column("item_type").value(mute.getDisplayType());
item_p.columns.add().column("item_mute_type").value(mute.mType);
item_p.columns.add().column("item_mute_uuid").value(mute.mID);
mBlockedList->addRow(item_p, ADD_BOTTOM);
}
@ -208,11 +205,10 @@ void FSPanelBlockList::removeMutes()
// list after each removal, sending us straight into a crash!
LLMuteList::getInstance()->removeObserver(this);
std::vector<LLScrollListItem*> selected_items = mBlockedList->getAllSelected();
for (std::vector<LLScrollListItem*>::iterator it = selected_items.begin(); it != selected_items.end(); it++)
for (auto item : mBlockedList->getAllSelected())
{
std::string name = (*it)->getColumn(COL_NAME)->getValue().asString();
LLUUID id = (*it)->getColumn(COL_UUID)->getValue().asUUID();
std::string name = item->getColumn(COL_NAME)->getValue().asString();
LLUUID id = item->getColumn(COL_UUID)->getValue().asUUID();
LLMute mute(id, name);
LLMuteList::getInstance()->remove(mute);
}

View File

@ -89,7 +89,7 @@ FSPanelRadar::FSPanelRadar()
mFSRadarColumnConfigConnection(),
mLastResizeDelta(0)
{
mButtonsUpdater = new FSButtonsUpdater(boost::bind(&FSPanelRadar::updateButtons, this));
mButtonsUpdater = std::make_unique<FSButtonsUpdater>(boost::bind(&FSPanelRadar::updateButtons, this));
mCommitCallbackRegistrar.add("Radar.AddFriend", boost::bind(&FSPanelRadar::onAddFriendButtonClicked, this));
mCommitCallbackRegistrar.add("Radar.Gear", boost::bind(&FSPanelRadar::onGearButtonClicked, this, _1));
@ -117,9 +117,8 @@ FSPanelRadar::~FSPanelRadar()
mFSRadarColumnConfigConnection.disconnect();
}
delete mButtonsUpdater;
if (mOptionsMenuHandle.get()) mOptionsMenuHandle.get()->die();
if (mOptionsMenuHandle.get())
mOptionsMenuHandle.get()->die();
}
BOOL FSPanelRadar::postBuild()
@ -152,8 +151,7 @@ BOOL FSPanelRadar::postBuild()
mRadarGearButton = getChild<LLButton>("gear_btn");
mOptionsButton = getChild<LLMenuButton>("options_btn");
LLToggleableMenu* options_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_fs_radar_options.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (options_menu)
if (LLToggleableMenu* options_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_fs_radar_options.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); options_menu)
{
mOptionsMenuHandle = options_menu->getHandle();
mOptionsButton->setMenu(options_menu, LLMenuButton::MP_BOTTOM_LEFT);
@ -204,8 +202,7 @@ void FSPanelRadar::updateButtons()
LLUUID FSPanelRadar::getCurrentItemID() const
{
LLScrollListItem* item = mRadarList->getFirstSelected();
if (item)
if (LLScrollListItem* item = mRadarList->getFirstSelected(); item)
{
return item->getUUID();
}
@ -251,21 +248,14 @@ void FSPanelRadar::onRadarListDoubleClicked()
LLUUID clicked_id = item->getUUID();
std::string name = item->getColumn(mRadarList->getColumn("name")->mIndex)->getValue().asString();
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
radar->zoomAvatar(clicked_id, name);
}
FSRadar::getInstance()->zoomAvatar(clicked_id, name);
}
void FSPanelRadar::onRadarListCommitted()
{
uuid_vec_t selected_uuids;
LLUUID sVal = mRadarList->getSelectedValue().asUUID();
if (sVal.notNull())
if (LLUUID sVal = mRadarList->getSelectedValue().asUUID(); sVal.notNull())
{
selected_uuids.push_back(sVal);
mMiniMap->setSelected(selected_uuids);
mMiniMap->setSelected({ sVal });
}
updateButtons();
@ -274,8 +264,7 @@ void FSPanelRadar::onRadarListCommitted()
void FSPanelRadar::onAddFriendButtonClicked()
{
LLUUID id = getCurrentItemID();
if (id.notNull())
if (LLUUID id = getCurrentItemID(); id.notNull())
{
LLAvatarActions::requestFriendshipDialog(id);
}
@ -301,14 +290,10 @@ void FSPanelRadar::onGearButtonClicked(LLUICtrl* btn)
void FSPanelRadar::requestUpdate()
{
FSRadar* radar = FSRadar::getInstance();
if (radar)
{
std::vector<LLSD> entries;
LLSD stats;
radar->getCurrentData(entries, stats);
updateList(entries, stats);
}
std::vector<LLSD> entries;
LLSD stats;
FSRadar::getInstance()->getCurrentData(entries, stats);
updateList(entries, stats);
}
void FSPanelRadar::updateList(const std::vector<LLSD>& entries, const LLSD& stats)
@ -422,21 +407,21 @@ void FSPanelRadar::updateList(const std::vector<LLSD>& entries, const LLSD& stat
radarNameCell->setColor(LLColor4(options["name_color"]));
}
LLScrollListText* voiceLevelCell = (LLScrollListText*)row->getColumn(voiceLevelColumnIndex);
if (entry.has("voice_level_icon"))
{
LLScrollListText* voiceLevelCell = (LLScrollListText*)row->getColumn(voiceLevelColumnIndex);
voiceLevelCell->setValue(entry["voice_level_icon"].asString());
}
LLScrollListText* flagsCell = (LLScrollListText*)row->getColumn(flagsColumnIndex);
if (entry.has("flags"))
{
LLScrollListText* flagsCell = (LLScrollListText*)row->getColumn(flagsColumnIndex);
flagsCell->setValue(flagsColumnValues[entry["flags"].asInteger()]);
}
LLScrollListText* ageCell = (LLScrollListText*)row->getColumn(ageColumnIndex);
if (options.has("age_color"))
{
LLScrollListText* ageCell = (LLScrollListText*)row->getColumn(ageColumnIndex);
ageCell->setColor(LLColor4(options["age_color"]));
}
}
@ -477,7 +462,7 @@ void FSPanelRadar::onColumnDisplayModeChanged()
std::vector<LLScrollListColumn::Params> column_params = mRadarList->getColumnInitParams();
S32 column_padding = mRadarList->getColumnPadding();
LLFloater* parent_floater = nullptr;
LLFloater* parent_floater{ nullptr };
LLView* parent = getParent();
while (parent)
{
@ -493,8 +478,8 @@ void FSPanelRadar::onColumnDisplayModeChanged()
return;
}
S32 default_width = 0;
S32 new_width = 0;
S32 default_width{ 0 };
S32 new_width{ 0 };
S32 min_width, min_height;
parent_floater->getResizeLimits(&min_width, &min_height);
@ -558,8 +543,7 @@ void FSPanelRadar::onColumnVisibilityChecked(const LLSD& userdata)
U32 column_config = gSavedSettings.getU32("FSRadarColumnConfig");
U32 new_value;
U32 enabled = (mColumnBits[column] & column_config);
if (enabled)
if (U32 enabled = (mColumnBits[column] & column_config); enabled)
{
new_value = (column_config & ~mColumnBits[column]);
}

View File

@ -92,7 +92,7 @@ private:
LLHandle<LLView> mOptionsMenuHandle;
FSRadar::Updater* mButtonsUpdater;
std::unique_ptr<FSRadar::Updater> mButtonsUpdater;
std::string mFilterSubString;
std::string mFilterSubStringOrig;

View File

@ -290,14 +290,13 @@ void FSRadar::updateRadarList()
// Skip modelling this avatar if its basic data is either inaccessible, or it's a dummy placeholder
auto ent = getEntry(avId);
LLViewerRegion* reg = world->getRegionFromPosGlobal(avPos);
if (!ent) // don't update this radar listing if data is inaccessible
{
continue;
}
// Try to get the avatar's viewer object - we will need it anyway later
LLVOAvatar* avVo = (LLVOAvatar*)gObjectList.findObject(avId);
LLVOAvatar* avVo = static_cast<LLVOAvatar*>(gObjectList.findObject(avId));
static LLUICachedControl<bool> sFSShowDummyAVsinRadar("FSShowDummyAVsinRadar");
if (!sFSShowDummyAVsinRadar && avVo && avVo->mIsDummy)
@ -315,7 +314,7 @@ void FSRadar::updateRadarList()
}
LLUUID avRegion;
if (reg)
if (LLViewerRegion* reg = world->getRegionFromPosGlobal(avPos); reg)
{
avRegion = reg->getRegionID();
}
@ -595,11 +594,10 @@ void FSRadar::updateRadarList()
// Voice power level indicator
if (voice_client->voiceEnabled() && voice_client->isVoiceWorking())
{
LLSpeaker* speaker = speakermgr->findSpeaker(avId);
if (speaker && speaker->isInVoiceChannel())
if (LLSpeaker* speaker = speakermgr->findSpeaker(avId); speaker && speaker->isInVoiceChannel())
{
EVoicePowerLevel power_level = voice_client->getPowerLevel(avId);
switch (power_level)
{
case VPL_PTT_Off:
@ -703,8 +701,7 @@ void FSRadar::updateRadarList()
}
static LLCachedControl<S32> sRadarAlertChannel(gSavedSettings, "RadarAlertChannel");
U32 num_entering = (U32)mRadarEnterAlerts.size();
if (num_entering > 0)
if (U32 num_entering = (U32)mRadarEnterAlerts.size(); num_entering > 0)
{
mRadarFrameCount++;
U32 num_this_pass = llmin(FSRADAR_MAX_AVATARS_PER_ALERT, num_entering);
@ -732,8 +729,8 @@ void FSRadar::updateRadarList()
msg = llformat("%d,%d", mRadarFrameCount, num_this_pass);
}
}
U32 num_leaving = (U32)mRadarLeaveAlerts.size();
if (num_leaving > 0)
if (U32 num_leaving = (U32)mRadarLeaveAlerts.size(); num_leaving > 0)
{
mRadarFrameCount++;
U32 num_this_pass = llmin(FSRADAR_MAX_AVATARS_PER_ALERT, num_leaving);
@ -1010,10 +1007,9 @@ void FSRadar::zoomAvatar(const LLUUID& avatar_id, std::string_view name)
void FSRadar::updateNames()
{
const entry_map_t::iterator it_end = mEntryList.end();
for (entry_map_t::iterator it = mEntryList.begin(); it != it_end; ++it)
for (auto& [av_id, entry] : mEntryList)
{
it->second->updateName();
entry->updateName();
}
}

View File

@ -43,25 +43,23 @@ BOOL FSRadarListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
if ( (mContextMenu) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
{
std::vector<LLScrollListItem*> selected_items = getAllSelected();
if (selected_items.size() > 1)
if (std::vector<LLScrollListItem*> selected_items = getAllSelected(); selected_items.size() > 1)
{
uuid_vec_t selected_uuids;
for (std::vector<LLScrollListItem*>::iterator it = selected_items.begin(); it != selected_items.end(); ++it)
for (auto selected_item : selected_items)
{
selected_uuids.push_back((*it)->getUUID());
selected_uuids.emplace_back(selected_item->getUUID());
}
mContextMenu->show(this, selected_uuids, x, y);
}
else
{
LLScrollListItem* hit_item = hitItem(x, y);
if (hit_item)
if (LLScrollListItem* hit_item = hitItem(x, y); hit_item)
{
selectByID(hit_item->getValue());
LLUUID av = hit_item->getValue();
uuid_vec_t selected_uuids;
selected_uuids.push_back(av);
selected_uuids.emplace_back(av);
mContextMenu->show(this, selected_uuids, x, y);
}
}

View File

@ -3031,7 +3031,7 @@ BOOL LLPanelEstateAccess::postBuild()
if (banned_name_list)
{
banned_name_list->setCommitOnSelectionChange(TRUE);
banned_name_list->setMaxItemCount(ESTATE_MAX_BANNED_IDS);
banned_name_list->setMaxItemCount(LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_BANNED_IDS : ESTATE_MAX_BANNED_IDS_OS); // <FS:Ansariel> OpenSim
}
getChild<LLUICtrl>("banned_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onBannedSearchEdit, this, _2));
@ -3044,7 +3044,7 @@ BOOL LLPanelEstateAccess::postBuild()
if (manager_name_list)
{
manager_name_list->setCommitOnSelectionChange(TRUE);
manager_name_list->setMaxItemCount(ESTATE_MAX_MANAGERS * 4); // Allow extras for dupe issue
manager_name_list->setMaxItemCount((LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_MANAGERS : ESTATE_MAX_MANAGERS_OS) * 4); // Allow extras for dupe issue // <FS:Ansariel> OpenSim
}
childSetAction("add_estate_manager_btn", boost::bind(&LLPanelEstateAccess::onClickAddEstateManager, this));
@ -3175,10 +3175,10 @@ void LLPanelEstateAccess::onClickAddBannedAgent()
{
LLCtrlListInterface *list = childGetListInterface("banned_avatar_name_list");
if (!list) return;
if (list->getItemCount() >= ESTATE_MAX_BANNED_IDS)
if (list->getItemCount() >= (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_BANNED_IDS : ESTATE_MAX_BANNED_IDS_OS)) // <FS:Ansariel> OpenSim
{
LLSD args;
args["MAX_BANNED"] = llformat("%d", ESTATE_MAX_BANNED_IDS);
args["MAX_BANNED"] = llformat("%d", (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_BANNED_IDS : ESTATE_MAX_BANNED_IDS_OS)); // <FS:Ansariel> OpenSim
LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args);
return;
}
@ -3210,10 +3210,10 @@ void LLPanelEstateAccess::onClickAddEstateManager()
{
LLCtrlListInterface *list = childGetListInterface("estate_manager_name_list");
if (!list) return;
if (list->getItemCount() >= ESTATE_MAX_MANAGERS)
if (list->getItemCount() >= (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_MANAGERS : ESTATE_MAX_MANAGERS_OS)) // <FS:Ansariel> OpenSim
{ // Tell user they can't add more managers
LLSD args;
args["MAX_MANAGER"] = llformat("%d", ESTATE_MAX_MANAGERS);
args["MAX_MANAGER"] = llformat("%d", (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_MANAGERS : ESTATE_MAX_MANAGERS_OS)); // <FS:Ansariel> OpenSim
LLNotificationsUtil::add("MaxManagersOnRegion", args);
}
else
@ -3416,13 +3416,13 @@ void LLPanelEstateAccess::accessAddCore3(const uuid_vec_t& ids, std::vector<LLAv
LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list");
LLNameListCtrl* em_list = panel->getChild<LLNameListCtrl>("estate_manager_name_list");
int currentCount = (name_list ? name_list->getItemCount() : 0);
if (ids.size() + currentCount > ESTATE_MAX_BANNED_IDS)
if (ids.size() + currentCount > (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_BANNED_IDS : ESTATE_MAX_BANNED_IDS_OS)) // <FS:Ansariel> OpenSim
{
LLSD args;
args["NUM_ADDED"] = llformat("%d", ids.size());
args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_BANNED_IDS);
args["MAX_AGENTS"] = llformat("%d", (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_BANNED_IDS : ESTATE_MAX_BANNED_IDS_OS)); // <FS:Ansariel> OpenSim
args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents");
args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - ESTATE_MAX_BANNED_IDS);
args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_BANNED_IDS : ESTATE_MAX_BANNED_IDS_OS)); // <FS:Ansariel> OpenSim
LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
delete change_info;
return;
@ -3801,7 +3801,7 @@ void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url)
{
LLStringUtil::format_map_t args;
args["[BANNEDAGENTS]"] = llformat("%d", result["BannedAgents"].size());
args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_BANNED_IDS);
args["[MAXBANNED]"] = llformat("%d", (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_BANNED_IDS : ESTATE_MAX_BANNED_IDS_OS)); // <FS:Ansariel> OpenSim
std::string msg = LLTrans::getString("RegionInfoBannedResidents", args);
panel->getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg));
@ -3863,7 +3863,7 @@ void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url)
{
LLStringUtil::format_map_t args;
args["[ESTATEMANAGERS]"] = llformat("%d", result["Managers"].size());
args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS);
args["[MAXMANAGERS]"] = llformat("%d", (LLGridManager::instance().isInSecondLife() ? ESTATE_MAX_MANAGERS : ESTATE_MAX_MANAGERS_OS)); // <FS:Ansariel> OpenSim
std::string msg = LLTrans::getString("RegionInfoEstateManagers", args);
panel->getChild<LLUICtrl>("estate_manager_label")->setValue(LLSD(msg));

View File

@ -7514,8 +7514,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
// <FS:Ansariel> FIRE-21200: Attachment Points List in Alphabetical Order
attach_menu->getItems()->sort(LLViewerAttachMenu::sort());
attach_hud_menu->getItems()->sort(LLViewerAttachMenu::sort());
if (gSavedSettings.getBOOL("FSSortAttachmentSpotsAlphabetically"))
{
attach_menu->getItems()->sort(LLViewerAttachMenu::sort());
attach_hud_menu->getItems()->sort(LLViewerAttachMenu::sort());
}
// </FS:Ansariel>
}
}

View File

@ -1500,25 +1500,23 @@ void LLPanelObject::deactivateStandardFields()
getChildView("advanced_slice")->setVisible(FALSE);
}
void LLPanelObject::activateMeshFields(LLViewerObject * objectp)
void LLPanelObject::activateMeshFields(LLViewerObject* objectp)
{
LLStringUtil::format_map_t args;
static const char * dataFields[4] = { "LOWESTTRIS", "LOWTRIS", "MIDTRIS", "HIGHTRIS" };
LLTextBox *num_tris = getChild<LLTextBox>("mesh_lod_num_tris");
if (num_tris)
LLTextBox* num_tris = getChild<LLTextBox>("mesh_lod_num_tris");
for (int i = 0; i < 4; i++)
{
for (int i = 0; i < 4; i++)
{
args[dataFields[i]] = llformat("%d", objectp->mDrawable->getVOVolume()->getLODTriangleCount(i));
}
num_tris->setText(getString("mesh_lod_num_tris_values",args));
num_tris->setVisible(TRUE);
args[dataFields[i]] = llformat("%d", objectp->mDrawable->getVOVolume()->getLODTriangleCount(i));
}
childSetVisible("mesh_info_label", TRUE);
childSetVisible("lod_label", TRUE);
childSetVisible("lod_num_tris", TRUE);
childSetVisible("mesh_lod_label", TRUE);
num_tris->setText(getString("mesh_lod_num_tris_values",args));
num_tris->setVisible(TRUE);
childSetVisible("mesh_info_label", true);
childSetVisible("lod_label", true);
childSetVisible("lod_num_tris", true);
childSetVisible("mesh_lod_label", true);
// Mesh specific display
mComboLOD->setEnabled(TRUE);
mComboLOD->setVisible(TRUE);
@ -1541,7 +1539,7 @@ void LLPanelObject::activateMeshFields(LLViewerObject * objectp)
radius = objectp->getVolume() ? objectp->getVolume()->mLODScaleBias.scaledVec(objectp->getScale()).length() : objectp->getScale().length();
}
static const F32 max_distance = 512.f;
constexpr F32 max_distance = 512.f;
F32 factor;
F32 dlowest = llmin(radius / 0.03f, max_distance);
F32 dlow = llmin(radius / 0.06f, max_distance);
@ -1591,7 +1589,7 @@ void LLPanelObject::activateMeshFields(LLViewerObject * objectp)
setLODDistValues(tb, factor, dmid, dlow, dlowest);
}
void LLPanelObject::setLODDistValues(LLTextBox * tb, F32 factor, F32 dmid, F32 dlow, F32 dlowest)
void LLPanelObject::setLODDistValues(LLTextBox* tb, F32 factor, F32 dmid, F32 dlow, F32 dlowest)
{
if (tb)
{
@ -1607,11 +1605,11 @@ void LLPanelObject::setLODDistValues(LLTextBox * tb, F32 factor, F32 dmid, F32 d
void LLPanelObject::deactivateMeshFields()
{
childSetVisible("mesh_info_label", FALSE);
childSetVisible("lod_label", FALSE);
childSetVisible("lod_num_tris", FALSE);
childSetVisible("mesh_lod_num_tris", FALSE);
childSetVisible("mesh_lod_label", FALSE);
childSetVisible("mesh_info_label", false);
childSetVisible("lod_label", false);
childSetVisible("lod_num_tris", false);
childSetVisible("mesh_lod_num_tris", false);
childSetVisible("mesh_lod_label", false);
// reset the debug setting as we are editing a new object
gSavedSettings.setS32("ShowSpecificLODInEdit", -1);
// </FS:Beq>
@ -1620,7 +1618,7 @@ void LLPanelObject::deactivateMeshFields()
mComboLOD->setEnabled(FALSE);
mComboLOD->setVisible(FALSE);
childSetVisible("object_radius", FALSE);
childSetVisible("object_radius", false);
LLTextBox* tb = getChild<LLTextBox>("object_radius_value");
tb->setVisible(FALSE);

View File

@ -90,8 +90,11 @@ void LLViewerAttachMenu::populateMenus(const std::string& attach_to_menu_name, c
}
// <FS:Ansariel> FIRE-21200: Attachment Points List in Alphabetical Order
attach_menu->getItems()->sort(LLViewerAttachMenu::sort());
attach_hud_menu->getItems()->sort(LLViewerAttachMenu::sort());
if (gSavedSettings.getBOOL("FSSortAttachmentSpotsAlphabetically"))
{
attach_menu->getItems()->sort(LLViewerAttachMenu::sort());
attach_hud_menu->getItems()->sort(LLViewerAttachMenu::sort());
}
// </FS:Ansariel>
}

View File

@ -11950,7 +11950,7 @@ void LLPipeline::handleShadowDetailChanged()
{
skipRenderingShadows();
}
else
// else <FS:Beq/> Ghosting fix for Whirly to try. just remove this for now.
{
LLViewerShaderMgr::instance()->setShaders();
}

View File

@ -3,7 +3,7 @@
<button label="OK" label_selected="OK" name="OK"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<panel name="search_panel">
<search_editor label="Sucheinstellungen" name="search_prefs_edit" tool_tip="Geben Sie hier den gewünschten Suchbegriff ein. Die Ergebnisse werden für teilweise Volltext-Treffer innerhalb des Einstellungsnamens oder Kommentars angezeigt."/>
<search_editor label="Einstellungen durchsuchen" name="search_prefs_edit" tool_tip="Geben Sie hier den gewünschten Suchbegriff ein. Die Ergebnisse werden für teilweise Volltext-Treffer innerhalb des Einstellungsnamens oder Kommentars angezeigt."/>
<button name="copy_search_slurl_btn" tool_tip="Suchbegriff als SLURL kopieren"/>
</panel>
<tab_container name="pref core">

View File

@ -40,6 +40,9 @@
<context_menu label="Abnehmen" name="Detach Self"/>
<menu_item_call label="Alles abnehmen" name="Detach All"/>
</context_menu>
<menu_item_call label="Hinsetzen / Aufstehen" name="Sit stand"/>
<menu_item_call label="Fliegen / Landen" name="Fly land"/>
<menu_item_call label="Animationen stoppen" name="Stop Animating My Avatar"/>
<context_menu label="Gemeinschaft" name="CommunitySubmenu">
<menu_item_call label="Freunde" name="Friends..."/>
<menu_item_call label="Gruppen" name="Groups..."/>

View File

@ -136,7 +136,7 @@
<text left="370" name="text_box_objprams3">
Textur
</text>
<view_border name="TextureBorder" width="270"/>
<view_border name="TextureBorder" width="270"/>
<spinner label="X-Größe" name="X size" label_width="50" width="120"/>
<spinner label="Y-Größe" name="Y size" label_width="50" width="120"/>
<spinner label="Z-Größe" name="Z size" label_width="50" width="120"/>
@ -162,7 +162,7 @@
<combo_item name="Low" label="Niedrid"/>
<combo_item name="Medium" label="Mittel"/>
<combo_item name="High" label="Hoch"/>
</combo_box>
</combo_box>
<check_box name="FSBuildPrefs_EmbedItem" label="Objekt zu neuem Prim hinzufügen"/>
<fs_embedded_item_drop_target name="embed_item" tool_tip="Gegenstand aus Inventar hier ablegen">
Gegenstand aus Inventar hier ablegen
@ -239,6 +239,7 @@
<check_box label="Vorschau von Animation beim Upload am eigenen Avatar" tool_tip="Falls aktiviert, werden Animationen in der Vorschau am eigenen Avatar abgespielt" name="FSUploadAnimationOnOwnAvatar"/>
<check_box label="Immer erweiterte Informationen zu Animationen anzeigen" tool_tip="Erweiterte Informationen zu Animation im Eigentschaftsfenster anzeigen" name="FSAnimationPreviewExpanded"/>
<check_box label="Erweiterte Skript-Informationen aktivieren" tool_tip="Falls aktiviert, werden die Skript-Informationen um weitergehende Details ergänzt." name="FSScriptInfoExtended"/>
<check_box label="Anhänge-Punkte in „Anhängen an“-Menüs alphabetisch sortieren (Erfordert Neustart)" tool_tip="Falls aktiviert, werden die Einträge in den „Anhängen an“-Menüs alphabetisch sortiert." name="FSSortAttachmentSpotsAlphabetically"/>
</panel>
<!--Uploads-->

View File

@ -1646,6 +1646,14 @@
name="FSScriptInfoExtended"
enabled_control="UseLSLBridge"
control_name="FSScriptInfoExtended"/>
<check_box
top_pad="8"
follows="left|top"
height="16"
label="Sort attachment spots in &quot;Attach to&quot; menus alphabetically (requires restart)"
tool_tip="If enabled, the list of attachments spots in the &amp;Attach to&amp; menus will be sorted alphabetically"
name="FSSortAttachmentSpotsAlphabetically"
control_name="FSSortAttachmentSpotsAlphabetically"/>
</panel>
<!--Uploads-->

View File

@ -11,19 +11,46 @@
<menu_item_call label="S'asseoir" name="Sit Down Here"/>
<menu_item_call label="Se lever" name="Stand Up"/>
<context_menu label="Apparence" name="AppearanceSubmenu">
<menu_item_call label="Tenue actuelle" name="NowWearing" />
<menu_item_call label="Changer de tenue" name="Change Outfit" />
<menu_item_call label="Modifier la silhouette" name="Edit Shape" />
<menu_item_call label="Modifier la tenue" name="Edit Outfit Parts" />
<menu_item_call label="Voltigement" name="Hover Height"/>
<menu_item_call label="Réinitialiser le squelette" name="Reset Skeleton"/>
<menu_item_call label="Réinitialiser le squelette et les animations" name="Reset Skeleton And Animations"/>
<menu_item_call label="Réinitialiser le LOD du maillage" name="Reset Mesh LOD"/>
</context_menu>
<context_menu label="Enlever" name="Take Off &gt;">
<context_menu label="Vêtements" name="Clothes &gt;">
<menu_item_call label="Chemise" name="Shirt"/>
<menu_item_call label="Pantalon" name="Pants"/>
<menu_item_call label="Jupe" name="Skirt"/>
<menu_item_call label="Chaussures" name="Shoes"/>
<menu_item_call label="Chaussettes" name="Socks"/>
<menu_item_call label="Veste" name="Jacket"/>
<menu_item_call label="Gants" name="Gloves"/>
<menu_item_call label="Maillot de corps" name="Self Undershirt"/>
<menu_item_call label="Caleçon" name="Self Underpants"/>
<menu_item_call label="Tatouage" name="Self Tattoo"/>
<menu_item_call label="Physique" name="Self Physics"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Tous les vêtements" name="All Clothes"/>
</context_menu>
<context_menu label="HUD" name="Detach Self HUD"/>
<context_menu label="Enlever" name="Detach Self"/>
<menu_item_call label="Tout enlever" name="Detach All"/>
</context_menu>
<menu_item_call label="S'asseoir / Se lever" name="Sit stand"/>
<menu_item_call label="Voler / Atterrir" name="Fly land"/>
<menu_item_call label="Arrêter les animations" name="Stop Animating My Avatar"/>
<context_menu label="Communauté" name="CommunitySubmenu">
<menu_item_call label="Amis" name="Friends..."/>
<menu_item_call label="Groupes" name="Groups..."/>
<menu_item_call label="Profil" name="Profile..."/>
</context_menu>
<menu_item_call label="Dump XML" name="Dump XML"/>
<menu_item_call label="Profil de l'objet" name="Object Inspect"/>
<menu_item_call label="Examiner" name="Object_Inspect_Floater"/>
<menu_item_call label="Informations sur les scripts" name="ScriptInfo"/>
<menu_item_call label="Faire disparaitre temporairement" name="Derender"/>
<menu_item_call label="Faire disparaitre &amp; Blacklister" name="DerenderPermanent"/>

View File

@ -23,11 +23,21 @@
<pie_slice label="Appel audio" name="Call"/>
<pie_slice label="Zoomer" name="Zoom In"/>
<pie_slice label="Actualiser les textures" name="Texture Refresh"/>
<pie_menu name="ResetMenu" label="Réinitialiser &gt;">
<pie_slice label="Squelette et animations" name="Reset Skeleton And Animations"/>
<pie_slice label="Squelette" name="Reset Skeleton"/>
<pie_slice label="LOD du mesh" name="Reset Mesh LOD" />
</pie_menu>
<pie_menu name="ExportMenu" label="Enregistrer sous &gt;">
<pie_slice label="Sauvegarde" name="Backup"/>
<pie_slice label="Collada" name="Collada"/>
<pie_slice label="Dump XML" name="Dump XML"/>
</pie_menu>
<pie_menu name="RenderMenu" label="Afficher &gt;">
<pie_slice name="RenderNormally" label="Normalement" />
<pie_slice name="DoNotRender" label="Jamais" />
<pie_slice name="AlwaysRenderFully" label="Complètement" />
</pie_menu>
</pie_menu>
<pie_slice label="Inspecter" name="Avatar Inspect"/>
<pie_menu name="DerenderMenu" label="Faire disparaitre &gt;">

View File

@ -155,6 +155,7 @@
<check_box label="Prévisualiser les animations sur son avatar pendant le téléchargement sur le serveur" tool_tip="Si activé, vous pouvez prévisualiser les animations sur votre propre avatar pendant le téléchargement sur le serveur" name="FSUploadAnimationOnOwnAvatar"/>
<check_box label="Toujours développer les informations détaillées de la prévisualisation de l'animation" tool_tip="Développer par défaut les informations détaillées sur l'animation dans le flotteur de l'aperçu de l'animation" name="FSAnimationPreviewExpanded"/>
<check_box label="Active les informations détaillées pour les script" tool_tip="Activée, ajoute aux informations de base sur les scripts des détails utiles aux créateurs" name="FSScriptInfoExtended"/>
<check_box label="Trier par ordre alphabétique les points d'attachement dans les menus &quot;Attacher à&quot; (redémarrage requis)" tool_tip="Si cette option est activée, la liste des points d'attachement dans les menus &amp;Attacher à&amp; sera triée par ordre alphabétique." name="FSSortAttachmentSpotsAlphabetically"/>
</panel>
<panel label="Chargements" name="UploadsTab">
<text name="title">Dossiers de destination pour les chargements :</text>

View File

@ -213,6 +213,7 @@
<check_box label="Podgląd animacji na własnym awatarze podczas przesyłania ich na serwer" tool_tip="Gdy zaznaczysz tą opcję, to będziesz w stanie oglądać animacje na swoim własnym awatarze podczas przesyłania ich na serwer" name="FSUploadAnimationOnOwnAvatar" />
<check_box label="Zawsze rozwijaj zaawansowane informacje o podglądzie animacji" tool_tip="Domyślnie rozwiń zaawansowane informacje o animacji w oknie podglądu animacji" name="FSAnimationPreviewExpanded" />
<check_box label="Włącz rozszerzanie funkcjonalności informacji o skryptach" tool_tip="Gdy zaznaczysz tą opcję, to podstawowa funkcjonalność informacji o skryptach zostanie rozszerzona za pomocą różnych szczegółów przydatnych dla budowniczych" name="FSScriptInfoExtended" />
<check_box label="Sortuj miejsca dodatków w sekcjach menu &quot;Dołącz do&quot; alfabetycznie (wymaga restartu)" tool_tip="Jeśli ta opcja jest włączona, to lista miejsc dla doczepienia dodatków pojawiająca się w menusach &quot;Dołącz do&quot; będzie posortowana alfabetycznie" name="FSSortAttachmentSpotsAlphabetically" />
</panel>
<panel label="Nowe pliki" name="UploadsTab">
<text name="title">

View File

@ -218,7 +218,9 @@
<check_box label="Используйте Ctrl + мышь, чтобы захватить и манипулировать объектами" tool_tip="Используйте Ctrl + мышь, чтобы захватить и манипулировать объектами" name="FSEnableGrab" />
<check_box label="Масштабирование при нажатии (вместе с caps lock) для текстур при строительстве" tool_tip="При включении, позволяет тянуть при нажатии или масштаб при нажатии (вместе с caps lock) для текстур в режиме строительства. Эта функция эксперементальная и ее следует использовать с осторожностью." name="FSExperimentalDragTexture" />
<check_box label="Предварительный просмотр анимации на собственном аватара во время загрузки" tool_tip="Предварительный просмотр анимации на собственном аватара во время загрузки" name="FSUploadAnimationOnOwnAvatar" />
<check_box label="Всегда раскрывать расширенную информацию в предпросмотре анимации" tool_tip="Развернуть расширенную информацию об анимации в всплывающем окне предварительного просмотра анимации по умолчанию." name="FSAnimationPreviewExpanded"/>
<check_box label="Включить расширенную информацию скрипта" name="FSScriptInfoExtended" tool_tip="Если включено, расширяет базовую функцию информации скрипта с различными деталями, полезными для строителей"/>
<check_box label="Сортировка мест прикрепления в &quot;Прикрепить к&quot; меню по алфавиту (требуется перезагрузка)" tool_tip="Если этот параметр включен, список прикреплений в &amp;Прикрепить к&amp; меню будут отсортированы по алфавиту" name="FSSortAttachmentSpotsAlphabetically"/>
</panel>
<!--Uploads-->
<panel label="Загрузки" name="UploadsTab">