# Conflicts:
#	indra/newview/lloutfitslist.cpp
#	indra/newview/llpaneldirbrowser.cpp
#	indra/newview/llpanelprofile.cpp
#	indra/newview/llstatusbar.cpp
#	indra/newview/llviewermenu.cpp
#	indra/newview/llviewerwindow.cpp
#	indra/newview/llvoavatar.cpp
#	indra/newview/skins/default/xui/da/panel_status_bar.xml
#	indra/newview/skins/default/xui/de/panel_status_bar.xml
#	indra/newview/skins/default/xui/en/menu_viewer.xml
#	indra/newview/skins/default/xui/en/panel_status_bar.xml
#	indra/newview/skins/default/xui/es/panel_status_bar.xml
#	indra/newview/skins/default/xui/fr/panel_status_bar.xml
#	indra/newview/skins/default/xui/it/panel_status_bar.xml
#	indra/newview/skins/default/xui/ja/panel_status_bar.xml
#	indra/newview/skins/default/xui/pl/panel_status_bar.xml
#	indra/newview/skins/default/xui/pt/panel_status_bar.xml
#	indra/newview/skins/default/xui/ru/panel_status_bar.xml
#	indra/newview/skins/default/xui/zh/panel_status_bar.xml
This commit is contained in:
Ansariel
2025-11-28 13:42:16 +01:00
35 changed files with 297 additions and 125 deletions
+34 -5
View File
@@ -47,6 +47,8 @@ static constexpr F32 AUTO_SCROLL_RATE_ACCEL = 120.f;
static LLDefaultChildRegistry::Register<LLAccordionCtrl> t2("accordion");
std::set<LLAccordionCtrl*> LLAccordionCtrl::sPendingArrange;
LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
, mFitParent(params.fit_parent)
, mNoVisibleTabsOrigString(params.no_visible_tabs_text.initial_value().asString())
@@ -163,7 +165,11 @@ bool LLAccordionCtrl::postBuild()
//---------------------------------------------------------------------------------
LLAccordionCtrl::~LLAccordionCtrl()
{
mAccordionTabs.clear();
if (mArrangePending)
{
sPendingArrange.erase(this);
}
mAccordionTabs.clear();
}
//---------------------------------------------------------------------------------
@@ -184,7 +190,7 @@ void LLAccordionCtrl::reshape(S32 width, S32 height, bool called_from_parent)
// necessary text paddings can be set via h_pad and v_pad
mNoVisibleTabsHelpText->setRect(getLocalRect());
arrange();
scheduleArrange();
}
//---------------------------------------------------------------------------------
@@ -328,7 +334,7 @@ void LLAccordionCtrl::addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab)
mAccordionTabs.push_back(accordion_tab);
accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLAccordionCtrl::onCollapseCtrlCloseOpen, this, (S16)(mAccordionTabs.size() - 1)) );
arrange();
scheduleArrange();
}
void LLAccordionCtrl::removeCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab)
@@ -685,8 +691,9 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
std::string str_action = info["action"];
if (str_action == "size_changes")
{
//
arrange();
// Multiple children can request an arrange,
// but only need to do it once so schedule it for later.
scheduleArrange();
return 1;
}
if (str_action == "select_next")
@@ -928,3 +935,25 @@ void LLAccordionCtrl::collapseAllTabs()
arrange();
}
}
void LLAccordionCtrl::scheduleArrange()
{
if (!mArrangePending)
{
mArrangePending = true;
sPendingArrange.insert(this);
}
}
void LLAccordionCtrl::updateClass()
{
for (LLAccordionCtrl* inst : sPendingArrange)
{
if (inst)
{
inst->mArrangePending = false;
inst->arrange();
}
}
sPendingArrange.clear();
}
+6
View File
@@ -142,6 +142,9 @@ public:
void setSkipScrollToChild(bool skip) { mSkipScrollToChild = skip; }
void scheduleArrange();
static void updateClass();
private:
void initNoTabsWidget(const LLTextBox::Params& tb_params);
void updateNoTabsHelpTextVisibility();
@@ -188,12 +191,15 @@ private:
LLTextBox* mNoVisibleTabsHelpText = nullptr;
bool mSkipScrollToChild = false;
bool mArrangePending = false;
std::string mNoMatchedTabsOrigString;
std::string mNoVisibleTabsOrigString;
LLAccordionCtrlTab* mSelectedTab = nullptr;
const LLTabComparator* mTabComparator = nullptr;
static std::set<LLAccordionCtrl*> sPendingArrange;
};
+5 -1
View File
@@ -553,6 +553,7 @@ bool LLFlatListView::postBuild()
void LLFlatListView::rearrangeItems()
{
LL_PROFILE_ZONE_SCOPED;
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
setNoItemsCommentVisible(0==size());
@@ -1154,6 +1155,7 @@ bool LLFlatListView::removeItemPair(item_pair_t* item_pair, bool rearrange)
void LLFlatListView::notifyParentItemsRectChanged()
{
LL_PROFILE_ZONE_SCOPED;
S32 comment_height = 0;
// take into account comment text height if exists
@@ -1425,7 +1427,7 @@ bool LLFlatListViewEx::updateItemVisibility(LLPanel* item, const LLSD &action)
return false;
}
void LLFlatListViewEx::filterItems(bool re_sort, bool notify_parent)
bool LLFlatListViewEx::filterItems(bool re_sort, bool notify_parent)
{
std::string cur_filter = mFilterSubString;
LLStringUtil::toUpper(cur_filter);
@@ -1450,7 +1452,9 @@ void LLFlatListViewEx::filterItems(bool re_sort, bool notify_parent)
{
rearrangeItems();
notifyParentItemsRectChanged();
return true;
}
return false;
}
bool LLFlatListViewEx::hasMatchedItems()
+2 -1
View File
@@ -513,8 +513,9 @@ public:
/**
* Filters the list, rearranges and notifies parent about shape changes.
* Derived classes may want to overload rearrangeItems() to exclude repeated separators after filtration.
* Returns true in case of changes
*/
void filterItems(bool re_sort, bool notify_parent);
bool filterItems(bool re_sort, bool notify_parent);
/**
* Returns true if last call of filterItems() found at least one matching item
-3
View File
@@ -1268,9 +1268,6 @@ bool LLWindowMacOSX::setCursorPosition(const LLCoordWindow position)
// trigger mouse move callback
LLCoordGL gl_pos;
convertCoords(position, &gl_pos);
float scale = getSystemUISize();
gl_pos.mX *= scale;
gl_pos.mY *= scale;
mCallbacks->handleMouseMove(this, gl_pos, (MASK)0);
return result;
+25 -14
View File
@@ -2219,6 +2219,20 @@
<key>Value</key>
<string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/vawp/index.html</string>
</map>
<!--AvatarBakedTextureUploadTimeout is in use by QA-->
<key>AvatarBakedTextureUploadTimeout</key>
<map>
<key>Comment</key>
<string>Specifies the maximum time in seconds to wait before sending your baked textures for avatar appearance. Set to 0 to disable and wait until all baked textures are at highest resolution.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>70</integer>
<key>Backup</key>
<integer>0</integer>
</map>
<key>AvatarRotateThresholdSlow</key>
<map>
<key>Comment</key>
@@ -2241,20 +2255,6 @@
<key>Value</key>
<integer>2</integer>
</map>
<!--AvatarBakedTextureUploadTimeout is in use by QA-->
<key>AvatarBakedTextureUploadTimeout</key>
<map>
<key>Comment</key>
<string>Specifies the maximum time in seconds to wait before sending your baked textures for avatar appearance. Set to 0 to disable and wait until all baked textures are at highest resolution.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>70</integer>
<key>Backup</key>
<integer>0</integer>
</map>
<key>AvatarPhysics</key>
<map>
<key>Comment</key>
@@ -12585,6 +12585,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>16</integer>
</map>
<key>RenderReflectionProbeShowTransparent</key>
<map>
<key>Comment</key>
<string>Show reflection probes in the transparency debug view</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderReflectionProbeVolumes</key>
<map>
<key>Comment</key>
+2
View File
@@ -226,8 +226,10 @@
- (void) setBugsplatValue:(nullable NSString *)value forAttribute:(NSString *)attribute
{
#if defined(LL_BUGSPLAT)
//[[BugSplat shared] setValue:@"Value of not so plain <value> Attribute" forAttribute:@"NotSoPlainAttribute"];
[[BugSplat shared] setValue:value forAttribute:attribute];
#endif // LL_BUGSPLAT
}
#if defined(LL_BUGSPLAT)
+3
View File
@@ -42,6 +42,9 @@
std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::string>* allowed_types,
unsigned int flags);
// doLoadDialogModeless if window does not exists creates a modeless
// window, if it does exist, creates a 'sheet' that does not block
// thead but blocks window interractions
void doLoadDialogModeless(const std::vector<std::string>* allowed_types,
unsigned int flags,
void (*callback)(bool, std::vector<std::string>&, void*),
+55 -20
View File
@@ -114,38 +114,73 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,
@autoreleasepool
{
// Note: might need to return and save this panel
// so that it does not close immediately
NSOpenPanel *panel = init_panel(allowed_types,flags);
NSWindow *mainWindow = [NSApp mainWindow];
[panel beginWithCompletionHandler:^(NSModalResponse result)
if (mainWindow)
{
std::vector<std::string> outfiles;
if (result == NSModalResponseOK)
[panel beginSheetModalForWindow:mainWindow
completionHandler:^(NSModalResponse result)
{
NSArray *filesToOpen = [panel URLs];
int i, count = [filesToOpen count];
if (count > 0)
std::vector<std::string> outfiles;
if (result == NSModalResponseOK)
{
NSArray *filesToOpen = [panel URLs];
int i, count = [filesToOpen count];
for (i=0; i<count; i++) {
NSString *aFile = [[filesToOpen objectAtIndex:i] path];
std::string *afilestr = new std::string([aFile UTF8String]);
outfiles.push_back(*afilestr);
if (count > 0)
{
for (i=0; i<count; i++) {
NSString *aFile = [[filesToOpen objectAtIndex:i] path];
std::string *afilestr = new std::string([aFile UTF8String]);
outfiles.push_back(*afilestr);
}
callback(true, outfiles, userdata);
}
else // no valid result
{
callback(false, outfiles, userdata);
}
callback(true, outfiles, userdata);
}
else // no valid result
else // cancel
{
callback(false, outfiles, userdata);
}
}
else // cancel
}];
}
else
{
//present as modeless window
[panel beginWithCompletionHandler:^(NSModalResponse result)
{
callback(false, outfiles, userdata);
}
}];
std::vector<std::string> outfiles;
if (result == NSModalResponseOK)
{
NSArray *filesToOpen = [panel URLs];
int i, count = [filesToOpen count];
if (count > 0)
{
for (i=0; i<count; i++) {
NSString *aFile = [[filesToOpen objectAtIndex:i] path];
std::string *afilestr = new std::string([aFile UTF8String]);
outfiles.push_back(*afilestr);
}
callback(true, outfiles, userdata);
}
else // no valid result
{
callback(false, outfiles, userdata);
}
}
else // cancel
{
callback(false, outfiles, userdata);
}
}];
}
}
}
+1 -1
View File
@@ -970,7 +970,7 @@ class LLChatCommandHandler : public LLCommandHandler
{
public:
// not allowed from outside the app
LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_CLICK_ONLY) { }
// Your code here
bool handle(const LLSD& tokens,
+45 -9
View File
@@ -51,6 +51,7 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p
: LLFlatListViewEx(p)
, mRefreshState(REFRESH_COMPLETE)
, mForceRefresh(false)
, mNeedsArrange(true)
{
// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
// but reset to true in all derived classes. This settings might need to
@@ -144,6 +145,7 @@ void LLInventoryItemsList::updateSelection()
bool LLInventoryItemsList::doIdle()
{
if (mRefreshState == REFRESH_COMPLETE) return true; // done
LL_PROFILE_ZONE_SCOPED;
if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty())
{
@@ -165,7 +167,7 @@ void LLInventoryItemsList::idle(void* user_data)
using namespace std::chrono;
auto start = steady_clock::now();
const milliseconds time_limit = milliseconds(3);
const milliseconds time_limit = milliseconds(2);
const auto end_time = start + time_limit;
S32 max_update_count = 50;
@@ -218,8 +220,6 @@ void LLInventoryItemsList::refresh()
mRefreshState = REFRESH_LIST_SORT;
}
rearrangeItems();
notifyParentItemsRectChanged();
break;
}
case REFRESH_LIST_ERASE:
@@ -229,10 +229,21 @@ void LLInventoryItemsList::refresh()
for (; mRemovedItems.end() != it; ++it)
{
// don't filter items right away
removeItemByUUID(*it, false);
removeItemByUUID(*it, false /*don't rearrange*/);
}
mRemovedItems.clear();
mRefreshState = REFRESH_LIST_SORT; // fix visibility and arrange
mRefreshState = REFRESH_LIST_SORT; // fix visibility
// Assume that visible items were removed.
if (getVisible())
{
rearrangeItems();
notifyParentItemsRectChanged();
}
else
{
mNeedsArrange = true;
}
break;
}
case REFRESH_LIST_APPEND:
@@ -275,18 +286,25 @@ void LLInventoryItemsList::refresh()
LLSD action;
action.with("match_filter", cur_filter);
bool new_visible_items = false;
pairs_const_iterator_t pair_it = panel_list.begin();
for (; pair_it != panel_list.end(); ++pair_it)
{
item_pair_t* item_pair = *pair_it;
if (item_pair->first->getParent() != NULL)
{
updateItemVisibility(item_pair->first, action);
new_visible_items |= updateItemVisibility(item_pair->first, action);
}
}
rearrangeItems();
notifyParentItemsRectChanged();
mNeedsArrange |= new_visible_items;
if (mNeedsArrange && getVisible())
{
// show changes now
rearrangeItems();
notifyParentItemsRectChanged();
mNeedsArrange = false;
}
if (mAddedItems.size() > 0)
{
@@ -304,16 +322,33 @@ void LLInventoryItemsList::refresh()
{
LL_PROFILE_ZONE_NAMED("items_refresh_sort");
// Filter, sort, rearrange and notify parent about shape changes
filterItems(true, true);
if (filterItems(true, true))
{
mNeedsArrange = false; // just rearranged
}
if (mAddedItems.size() == 0)
{
if (mNeedsArrange)
{
// Done, last chance to rearrange
rearrangeItems();
notifyParentItemsRectChanged();
mNeedsArrange = false;
}
// After list building completed, select items that had been requested to select before list was build
updateSelection();
mRefreshState = REFRESH_COMPLETE;
}
else
{
if (mNeedsArrange && getVisible())
{
// show changes now
rearrangeItems();
notifyParentItemsRectChanged();
mNeedsArrange = false;
}
mRefreshState = REFRESH_LIST_APPEND;
}
break;
@@ -347,6 +382,7 @@ void LLInventoryItemsList::computeDifference(
LLPanel* LLInventoryItemsList::createNewItem(LLViewerInventoryItem* item)
{
LL_PROFILE_ZONE_SCOPED;
if (!item)
{
LL_WARNS() << "No inventory item. Couldn't create flat list item." << LL_ENDL;
+1
View File
@@ -117,6 +117,7 @@ protected:
};
ERefreshStates mRefreshState;
bool mNeedsArrange = true;
private:
uuid_vec_t mIDs; // IDs of items that were added in refreshList().
+2
View File
@@ -74,6 +74,7 @@ LLPanelInventoryListItemBase::Params::Params()
LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInventoryItem* item)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
LLPanelInventoryListItemBase* list_item = NULL;
if (item)
{
@@ -194,6 +195,7 @@ void LLPanelInventoryListItemBase::setShowWidget(LLUICtrl* ctrl, bool show)
bool LLPanelInventoryListItemBase::postBuild()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
LLViewerInventoryItem* inv_item = getItem();
if (inv_item)
{
+32 -29
View File
@@ -62,7 +62,7 @@
#include "rlvactions.h"
#include "rlvlocks.h"
static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y);
static bool is_tab_header_clicked(LLOutfitAccordionCtrlTab* tab, S32 y);
static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR;
static const LLOutfitTabFavComparator OUTFIT_TAB_FAV_COMPARATOR;
@@ -255,7 +255,10 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
list->setCommitCallback(boost::bind(&LLOutfitsList::onListSelectionChange, this, _1));
// Setting list refresh callback to apply filter on list change.
list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onRefreshComplete, this, _1));
list->setRefreshCompleteCallback([this, tab](LLUICtrl* ctrl, const LLSD& sd)
{
onRefreshComplete(ctrl, tab);
});
list->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onWearableItemsListRightClick, this, _1, _2, _3));
@@ -303,7 +306,7 @@ void LLOutfitsList::updateRemovedCategory(LLUUID cat_id)
if (outfits_iter != mOutfitsMap.end())
{
const LLUUID& outfit_id = outfits_iter->first;
LLAccordionCtrlTab* tab = outfits_iter->second;
LLOutfitAccordionCtrlTab* tab = outfits_iter->second;
// An outfit is removed from the list. Do the following:
// 1. Remove outfit category from observer to stop monitoring its changes.
@@ -384,11 +387,11 @@ void LLOutfitsList::onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id)
{
if (mOutfitsMap[prev_id])
{
((LLOutfitAccordionCtrlTab*)mOutfitsMap[prev_id])->setOutfitSelected(false);
mOutfitsMap[prev_id]->setOutfitSelected(false);
}
if (mOutfitsMap[base_id])
{
((LLOutfitAccordionCtrlTab*)mOutfitsMap[base_id])->setOutfitSelected(true);
mOutfitsMap[base_id]->setOutfitSelected(true);
}
}
@@ -436,7 +439,7 @@ void LLOutfitsList::onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid)
{
if (outfit_uuid == iter->first)
{
LLAccordionCtrlTab* tab = iter->second;
LLOutfitAccordionCtrlTab* tab = iter->second;
if (!tab) continue;
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
@@ -530,7 +533,7 @@ void LLOutfitsList::onCollapseAllFolders()
iter != mOutfitsMap.end();
++iter)
{
LLAccordionCtrlTab* tab = iter->second;
LLOutfitAccordionCtrlTab* tab = iter->second;
if(tab && tab->isExpanded())
{
tab->changeOpenClose(true);
@@ -544,7 +547,7 @@ void LLOutfitsList::onExpandAllFolders()
iter != mOutfitsMap.end();
++iter)
{
LLAccordionCtrlTab* tab = iter->second;
LLOutfitAccordionCtrlTab* tab = iter->second;
if(tab && !tab->isExpanded())
{
tab->changeOpenClose(false);
@@ -567,7 +570,7 @@ void LLOutfitsList::updateChangedCategoryName(LLViewerInventoryCategory *cat, st
if (outfits_iter != mOutfitsMap.end())
{
// Update tab name with the new category name.
LLOutfitAccordionCtrlTab* tab = (LLOutfitAccordionCtrlTab*) outfits_iter->second;
LLOutfitAccordionCtrlTab* tab = outfits_iter->second;
if (tab)
{
tab->setName(name);
@@ -620,7 +623,7 @@ void LLOutfitsList::deselectOutfit(const LLUUID& category_id)
LLOutfitListBase::deselectOutfit(category_id);
}
void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id)
void LLOutfitsList::restoreOutfitSelection(LLOutfitAccordionCtrlTab* tab, const LLUUID& category_id)
{
// Try restoring outfit selection after filtering.
if (mAccordion->getSelectedTab() == tab)
@@ -629,23 +632,21 @@ void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID
}
}
void LLOutfitsList::onRefreshComplete(LLUICtrl* ctrl)
void LLOutfitsList::onRefreshComplete(LLUICtrl* ctrl, LLOutfitAccordionCtrlTab* tab)
{
if (!ctrl || getFilterSubString().empty())
return;
for (outfits_map_t::iterator
iter = mOutfitsMap.begin(),
iter_end = mOutfitsMap.end();
iter != iter_end; ++iter)
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
if (list != ctrl)
{
LLAccordionCtrlTab* tab = iter->second;
if (!tab) continue;
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
if (list != ctrl) continue;
applyFilterToTab(iter->first, tab, getFilterSubString());
llassert(false);
LL_WARNS() << "LLOutfitsList::onRefreshComplete: ctrl does not match tab's list!" << LL_ENDL;
return;
}
if (tab->getFilterGeneration() != getFilterGeneration())
{
applyFilterToTab(tab->getFolderID(), tab, getFilterSubString());
}
}
@@ -658,7 +659,7 @@ void LLOutfitsList::onFilterSubStringChanged(const std::string& new_string, cons
while (iter != iter_end)
{
const LLUUID& category_id = iter->first;
LLAccordionCtrlTab* tab = iter++->second;
LLOutfitAccordionCtrlTab* tab = iter++->second;
if (!tab) continue;
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
@@ -697,9 +698,10 @@ void LLOutfitsList::onFilterSubStringChanged(const std::string& new_string, cons
void LLOutfitsList::applyFilterToTab(
const LLUUID& category_id,
LLAccordionCtrlTab* tab,
LLOutfitAccordionCtrlTab* tab,
const std::string& filter_substring)
{
LL_PROFILE_ZONE_SCOPED;
if (!tab) return;
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
if (!list) return;
@@ -711,6 +713,7 @@ void LLOutfitsList::applyFilterToTab(
LLStringUtil::toUpper(cur_filter);
tab->setTitle(tab->getTitle(), cur_filter);
tab->setFilterGeneration(getFilterGeneration());
if (std::string::npos == title.find(cur_filter))
{
@@ -834,7 +837,7 @@ void LLOutfitsList::onCOFChanged()
outfits_map_t::iterator map_iter = mOutfitsMap.begin(), map_end = mOutfitsMap.end();
while (map_iter != map_end)
{
LLAccordionCtrlTab* tab = (map_iter++)->second;
LLOutfitAccordionCtrlTab* tab = (map_iter++)->second;
if (!tab) continue;
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
@@ -865,7 +868,7 @@ void LLOutfitsList::sortOutfits()
void LLOutfitsList::onOutfitRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)
{
LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
LLOutfitAccordionCtrlTab* tab = dynamic_cast<LLOutfitAccordionCtrlTab*>(ctrl);
if (mOutfitMenu && is_tab_header_clicked(tab, y) && cat_id.notNull())
{
// Focus tab header to trigger tab selection change.
@@ -888,7 +891,7 @@ void LLOutfitsList::handleInvFavColorChange()
++iter)
{
if (!iter->second) continue;
LLOutfitAccordionCtrlTab* tab = (LLOutfitAccordionCtrlTab*)iter->second;
LLOutfitAccordionCtrlTab* tab = iter->second;
// refresh font color
tab->setFavorite(tab->getFavorite());
@@ -915,7 +918,7 @@ void LLOutfitsList::onChangeSortOrder(const LLSD& userdata)
{
for (outfits_map_t::value_type& outfit : mOutfitsMap)
{
LLAccordionCtrlTab* tab = outfit.second;
LLOutfitAccordionCtrlTab* tab = outfit.second;
const LLUUID& category_id = outfit.first;
if (!tab) continue;
@@ -956,7 +959,7 @@ LLOutfitListGearMenuBase* LLOutfitsList::createGearMenu()
}
bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y)
bool is_tab_header_clicked(LLOutfitAccordionCtrlTab* tab, S32 y)
{
if(!tab || !tab->getHeaderVisible()) return false;
+9 -6
View File
@@ -38,7 +38,7 @@
#include "lltoggleablemenu.h"
#include "llviewermenu.h"
class LLAccordionCtrlTab;
class LLOutfitAccordionCtrlTab;
class LLInventoryCategoriesObserver;
class LLOutfitListGearMenuBase;
class LLOutfitListSortMenuBase;
@@ -46,7 +46,6 @@ class LLWearableItemsList;
class LLListContextMenu;
class LLTextBox;
/**
* @class LLOutfitTabNameComparator
*
@@ -273,7 +272,10 @@ public:
void setFavorite(bool is_favorite);
bool getFavorite() const { return mIsFavorite; }
LLUUID getFolderID() const { return mFolderID; }
void setOutfitSelected(bool val);
U32 getFilterGeneration() const { return mFilterGeneration; }
void setFilterGeneration(U32 generation) { mFilterGeneration = generation; }
static LLUIImage* sFavoriteIcon;
static LLUIColor sFgColor;
@@ -291,6 +293,7 @@ public:
LLUUID mFolderID;
bool mIsFavorite = false;
bool mIsSelected = false;
U32 mFilterGeneration = 0;
};
/**
* @class LLOutfitsList
@@ -394,20 +397,20 @@ private:
*
* A tab may be hidden if it doesn't match current filter.
*/
void restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id);
void restoreOutfitSelection(LLOutfitAccordionCtrlTab* tab, const LLUUID& category_id);
/**
* Called upon list refresh event to update tab visibility depending on
* the results of applying filter to the title and list items of the tab.
*/
void onRefreshComplete(LLUICtrl* ctrl);
void onRefreshComplete(LLUICtrl* ctrl, LLOutfitAccordionCtrlTab* tab);
/**
* Applies filter to the given tab
*
* @see applyFilter()
*/
void applyFilterToTab(const LLUUID& category_id, LLAccordionCtrlTab* tab, const std::string& filter_substring);
void applyFilterToTab(const LLUUID& category_id, LLOutfitAccordionCtrlTab* tab, const std::string& filter_substring);
/**
* Returns true if all selected items can be worn.
@@ -437,7 +440,7 @@ private:
typedef wearables_lists_map_t::value_type wearables_lists_map_value_t;
wearables_lists_map_t mSelectedListsMap;
typedef std::map<LLUUID, LLAccordionCtrlTab*> outfits_map_t;
typedef std::map<LLUUID, LLOutfitAccordionCtrlTab*> outfits_map_t;
typedef outfits_map_t::value_type outfits_map_value_t;
outfits_map_t mOutfitsMap;
+2
View File
@@ -44,6 +44,7 @@ void LLPanelAppearanceTab::setFilterSubString(const std::string& new_string)
{
std::string old_string = mFilterSubString;
mFilterSubString = new_string;
mFilterGeneration++;
onFilterSubStringChanged(mFilterSubString, old_string);
}
@@ -56,6 +57,7 @@ void LLPanelAppearanceTab::checkFilterSubString()
{
std::string old_string = mFilterSubString;
mFilterSubString = sRecentFilterSubString;
mFilterGeneration++;
onFilterSubStringChanged(mFilterSubString, old_string);
}
}
+2
View File
@@ -48,6 +48,7 @@ public:
virtual void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const {}
const std::string& getFilterSubString() { return mFilterSubString; }
U32 getFilterGeneration() { return mFilterGeneration; }
virtual void updateMenuItemsVisibility() = 0;
virtual LLToggleableMenu* getGearMenu() = 0;
@@ -63,6 +64,7 @@ protected:
private:
std::string mFilterSubString;
U32 mFilterGeneration = 0;
static std::string sRecentFilterSubString;
};
+15 -15
View File
@@ -426,7 +426,7 @@ void LLPanelDirBrowser::processDirPeopleReply(LLMessageSystem *msg, void**)
for (S32 i = 0; i < rows; i++)
{
msg->getStringFast(_PREHASH_QueryReplies,_PREHASH_FirstName, first_name, i);
msg->getStringFast(_PREHASH_QueryReplies,_PREHASH_LastName, last_name, i);
msg->getStringFast(_PREHASH_QueryReplies,_PREHASH_LastName, last_name, i);
msg->getUUIDFast( _PREHASH_QueryReplies,_PREHASH_AgentID, agent_id, i);
// msg->getU8Fast( _PREHASH_QueryReplies,_PREHASH_Online, online, i);
// unused
@@ -475,10 +475,10 @@ void LLPanelDirBrowser::processDirPlacesReply(LLMessageSystem* msg, void**)
{
FSPanelSearchPlaces::processSearchReply(msg, nullptr); // <FS:Ansariel> FS legacy search
LLUUID agent_id;
LLUUID query_id;
LLUUID parcel_id;
std::string name;
LLUUID agent_id;
LLUUID query_id;
LLUUID parcel_id;
std::string name;
bool is_for_sale = false;
bool is_auction = false;
F32 dwell;
@@ -565,8 +565,8 @@ void LLPanelDirBrowser::processDirEventsReply(LLMessageSystem* msg, void**)
LLUUID agent_id;
LLUUID query_id;
LLUUID owner_id;
std::string name;
std::string date;
std::string name;
std::string date;
bool show_pg = gSavedSettings.getBOOL("ShowPGEvents");
bool show_mature = gSavedSettings.getBOOL("ShowMatureEvents");
bool show_adult = gSavedSettings.getBOOL("ShowAdultEvents");
@@ -713,7 +713,7 @@ void LLPanelDirBrowser::processDirGroupsReply(LLMessageSystem* msg, void**)
LLUUID query_id;
LLUUID group_id;
std::string group_name;
std::string group_name;
S32 members;
F32 search_order;
@@ -743,10 +743,10 @@ void LLPanelDirBrowser::processDirGroupsReply(LLMessageSystem* msg, void**)
for (i = 0; i < rows; i++)
{
msg->getUUIDFast(_PREHASH_QueryReplies, _PREHASH_GroupID, group_id, i );
msg->getStringFast(_PREHASH_QueryReplies, _PREHASH_GroupName, group_name, i);
msg->getS32Fast(_PREHASH_QueryReplies, _PREHASH_Members, members, i );
msg->getF32Fast(_PREHASH_QueryReplies, _PREHASH_SearchOrder, search_order, i );
msg->getUUIDFast(_PREHASH_QueryReplies, _PREHASH_GroupID, group_id, i );
msg->getStringFast(_PREHASH_QueryReplies, _PREHASH_GroupName, group_name, i);
msg->getS32Fast(_PREHASH_QueryReplies, _PREHASH_Members, members, i );
msg->getF32Fast(_PREHASH_QueryReplies, _PREHASH_SearchOrder, search_order, i );
if (group_id.isNull())
{
@@ -843,8 +843,8 @@ void LLPanelDirBrowser::processDirClassifiedReply(LLMessageSystem* msg, void**)
{
LLUUID classified_id;
std::string name;
U32 creation_date = 0; // unix timestamp
U32 expiration_date = 0; // future use
U32 creation_date = 0; // unix timestamp
U32 expiration_date = 0; // future use
S32 price_for_listing = 0;
msg->getUUID("QueryReplies", "ClassifiedID", classified_id, i);
msg->getString("QueryReplies", "Name", name, i);
@@ -877,7 +877,7 @@ void LLPanelDirBrowser::processDirLandReply(LLMessageSystem *msg, void**)
LLUUID agent_id;
LLUUID query_id;
LLUUID parcel_id;
std::string name;
std::string name;
std::string land_sku;
std::string land_type;
bool auction = false;
+1 -1
View File
@@ -157,7 +157,7 @@ const S32 AUCTION_CODE = 7; // for auction place
const S32 POPULAR_CODE = 8; // popular by dwell
// mask values for search flags
const S32 SEARCH_NONE = 0; // should try not to send this to the search engine
const S32 SEARCH_NONE = 0; // should try not to send this to the search engine
const S32 SEARCH_PG = 1;
const S32 SEARCH_MATURE = 2;
const S32 SEARCH_ADULT = 4;
+4 -4
View File
@@ -100,8 +100,8 @@ void LLPanelDirEvents::setDay(S32 day)
internal_time = utc_to_pacific_time(utc_time, is_daylight_savings());
std::string buffer = llformat("%d/%d",
1 + internal_time->tm_mon, // Jan = 0
internal_time->tm_mday); // 2001 = 101
1 + internal_time->tm_mon, // Jan = 0
internal_time->tm_mday); // 2001 = 101
childSetValue("date_text", buffer);
}
@@ -132,8 +132,8 @@ void LLPanelDirEvents::performQueryOrDelete(U32 event_id)
internal_time = utc_to_pacific_time(utc_time, is_daylight_savings());
std::string buffer = llformat("%d/%d",
1 + internal_time->tm_mon, // Jan = 0
internal_time->tm_mday); // 2001 = 101
1 + internal_time->tm_mon, // Jan = 0
internal_time->tm_mday); // 2001 = 101
childSetValue("date_text", buffer);
// Record the relative day so back and forward buttons
+1 -1
View File
@@ -1361,7 +1361,7 @@ void LLPanelProfileSecondLife::fillCommonData(const LLAvatarData* avatar_data)
{
mAllowPublish = avatar_data->flags & AVATAR_ALLOW_PUBLISH;
// <FS:Ansariel> Fix LL UI/UX design accident
//mShowInSearchCombo->setValue(mAllowPublish);
//mShowInSearchCombo->setValue(mAllowPublish ? LLSD::Integer(1) : LLSD::Integer(0));
mShowInSearchCheckbox->setValue(mAllowPublish);
// </FS:Ansariel>
}
+3
View File
@@ -672,6 +672,9 @@ void LLStatusBar::refresh()
// time_t utc_time;
// utc_time = time_corrected();
// static bool use_24h = gSavedSettings.getBOOL("Use24HourClock");
// std::string timeStr = use_24h ? getString("time") : getString("time_ampm");
// std::string timeStr = getString("time");
// LLSD substitution;
// substitution["datetime"] = (S32) utc_time;
+12
View File
@@ -11508,6 +11508,17 @@ class LLViewHighlightTransparent : public view_listener_t
}
};
class LLViewHighlightTransparentProbe : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
gSavedSettings.setBOOL("RenderReflectionProbeShowTransparent", !gSavedSettings.getBOOL("RenderReflectionProbeShowTransparent"));
// invisible objects skip building their render batches unless sShowDebugAlpha is true, so rebuild batches whenever toggling this flag
gPipeline.rebuildDrawInfo();
return true;
}
};
class LLViewCheckHighlightTransparent : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -12664,6 +12675,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter");
view_listener_t::addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips");
view_listener_t::addMenu(new LLViewHighlightTransparent(), "View.HighlightTransparent");
view_listener_t::addMenu(new LLViewHighlightTransparentProbe(), "View.HighlightTransparentProbe");
view_listener_t::addMenu(new LLViewHighlightTransparentRigged(), "View.HighlightTransparentRigged"); // <FS:Beq/> FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
view_listener_t::addMenu(new LLViewToggleRenderType(), "View.ToggleRenderType");
view_listener_t::addMenu(new LLViewShowHUDAttachments(), "View.ShowHUDAttachments");
+3
View File
@@ -1736,6 +1736,7 @@ void LLOfferInfo::sendReceiveResponse(bool accept, const LLUUID &destination_fol
if (mTransactionID.isNull())
{
// Not provided, message won't work
LL_WARNS("Messaging") << "Missing transaction id, response for " << mIM << " won't work" << LL_ENDL;
return;
}
@@ -1778,6 +1779,8 @@ void LLOfferInfo::sendReceiveResponse(bool accept, const LLUUID &destination_fol
msg->addU8Fast(_PREHASH_Dialog, (U8)(im + 1));
msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(destination_folder_id.mData),
sizeof(destination_folder_id.mData));
LL_DEBUGS("Messaging") << "Processing" << (U8)(im + 1) << " with transaction id " << mTransactionID << LL_ENDL;
}
else
{
+3
View File
@@ -92,6 +92,7 @@
// newview includes
#include "fscommon.h"
#include "llaccordionctrl.h"
#include "llbox.h"
#include "llchicletbar.h"
#include "llconsole.h"
@@ -3905,6 +3906,8 @@ void LLViewerWindow::updateUI()
LLConsole::updateClass();
// execute postponed arrange calls
LLAccordionCtrl::updateClass();
// animate layout stacks so we have up to date rect for world view
LLLayoutStack::updateClass();
+3 -7
View File
@@ -5303,14 +5303,10 @@ void LLVOAvatar::updateOrientation(LLAgent& agent, F32 speed, F32 delta_time)
LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV );
// <FS:Beq> FIRE-34196 Restore the pelvis rotation threshold config removed by LL as "unused"
// const F32 AVATAR_PELVIS_ROTATE_THRESHOLD_SLOW = 60.0f;
// const F32 AVATAR_PELVIS_ROTATE_THRESHOLD_FAST = 2.0f;
static LLCachedControl<F32> AVATAR_PELVIS_ROTATE_THRESHOLD_SLOW(gSavedSettings, "AvatarRotateThresholdSlow", 60.0);
static LLCachedControl<F32> AVATAR_PELVIS_ROTATE_THRESHOLD_FAST(gSavedSettings, "AvatarRotateThresholdFast", 2.0);
// </FS:Beq>
static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow", 60.0);
static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast", 2.0);
F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, AVATAR_PELVIS_ROTATE_THRESHOLD_SLOW, AVATAR_PELVIS_ROTATE_THRESHOLD_FAST);
F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast);
if (self_in_mouselook)
{
+2 -1
View File
@@ -6224,6 +6224,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{
static LLCachedControl<bool> render_reflection_object(gSavedSettings, "RenderReflectionProbeShowTransparent", false);
F32 alpha;
if (is_pbr)
{
@@ -6242,7 +6243,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
drawablep->setState(LLDrawable::HAS_ALPHA);
add_face(sAlphaFaces, alpha_count, facep);
}
else if (LLDrawPoolAlpha::sShowDebugAlpha ||
else if ((LLDrawPoolAlpha::sShowDebugAlpha && (render_reflection_object || !vobj->isReflectionProbe())) ||
(gPipeline.sRenderHighlight && !drawablep->getParent() &&
//only root objects are highlighted with red color in this case
drawablep->getVObj() && drawablep->getVObj()->flagScripted() &&
@@ -12,7 +12,7 @@
<panel.string name="bandwidth_tooltip">
Båndbredde
</panel.string>
<panel.string name="time">
<panel.string name="time_ampm">
[hour12, datetime, slt]:[min, datetime, slt]:[second, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string name="timeTooltip">
@@ -247,6 +247,7 @@
<menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/>
<menu_item_check label="Durchsichtig hervorheben" name="Highlight Transparent"/>
<menu_item_check label="- Durchsichtige geriggte Netze einschließen" name="Include Transparent Rigged"/>
<menu_item_check label="Durchsichtig Reflexionstests hervorheben" name="Highlight Transparent Probes"/>
<menu_item_check label="Keine Nachverabeitung" name="No Post"/>
<menu label="Detaillevel auswählen" name="Selection level of detail">
<menu_item_check label="Standard" name="Default lod setting"/>
@@ -575,7 +575,7 @@
parameter="snapshot" />
</menu_item_call>
<menu_item_call
label="360° Snapshot"
label="360° Snapshot"
name="Capture 360">
<menu_item_call.on_click
function="Floater.Show"
@@ -2214,6 +2214,18 @@
<menu_item_check.on_click
function="View.HighlightTransparentRigged" />
</menu_item_check>
<menu_item_check
label="Highlight Transparent Probes"
name="Highlight Transparent Probes"
shortcut="alt|shift|T">
<menu_item_check.on_check
function="CheckControl"
parameter="RenderReflectionProbeShowTransparent" />
<menu_item_check.on_click
function="View.HighlightTransparentProbe" />
<menu_item_check.on_enable
function="View.CheckHighlightTransparent"/>
</menu_item_check>
<menu_item_separator/>
<menu_item_check
@@ -193,9 +193,13 @@
Bandwidth
</panel.string>
<panel.string
name="time">
name="time_ampm">
[hour12, datetime, slt]:[min, datetime, slt]:[second, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string
name="time">
[hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string
name="timeTooltip">
[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
@@ -10,7 +10,7 @@
<panel.string name="bandwidth_tooltip">
帯域幅
</panel.string>
<panel.string name="time">
<panel.string name="time_ampm">
[ampm, datetime, slt] [hour12, datetime, slt][min, datetime, slt][second, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string name="timeTooltip">
@@ -6,7 +6,7 @@
<panel.string name="bandwidth_tooltip">
Banda
</panel.string>
<panel.string name="time">
<panel.string name="time_ampm">
[hour12, datetime, slt]:[min, datetime, slt]:[second, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string name="timeTooltip">
@@ -6,7 +6,7 @@
<panel.string name="bandwidth_tooltip">
Bant geniÅŸliÄŸi
</panel.string>
<panel.string name="time">
<panel.string name="time_ampm">
[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string name="timeTooltip">
@@ -6,7 +6,7 @@
<panel.string name="bandwidth_tooltip">
頻寬
</panel.string>
<panel.string name="time">
<panel.string name="time_ampm">
[hour, datetime, slt]:[min, datetime, slt]:[second, datetime, slt] [timezone, datetime, slt]
</panel.string>
<panel.string name="timeTooltip">