From 9df87dd36575597d4c522b99a1f706e4861a416e Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Thu, 27 May 2021 23:51:59 +0300
Subject: [PATCH] SL-13179 FIXED Sorting residents banned on the parcel by
 duration is incorrect

---
 indra/llui/llscrolllistcell.cpp  | 23 ++++++++++++++++++++++-
 indra/llui/llscrolllistcell.h    |  7 +++++++
 indra/llui/llscrolllistctrl.cpp  | 18 ++++++++++++++----
 indra/llui/llscrolllistctrl.h    |  4 ++++
 indra/llui/llscrolllistitem.cpp  |  3 ++-
 indra/llui/llscrolllistitem.h    |  4 ++++
 indra/newview/llfloaterland.cpp  |  5 ++++-
 indra/newview/llnamelistctrl.cpp |  1 +
 8 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 13839da400e..8dd552d2ade 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -79,6 +79,14 @@ const LLSD LLScrollListCell::getValue() const
 	return LLStringUtil::null;
 }
 
+
+// virtual
+const LLSD LLScrollListCell::getAltValue() const
+{
+	return LLStringUtil::null;
+}
+
+
 //
 // LLScrollListIcon
 //
@@ -173,6 +181,7 @@ U32 LLScrollListText::sCount = 0;
 LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
 :	LLScrollListCell(p),
 	mText(p.label.isProvided() ? p.label() : p.value().asString()),
+	mAltText(p.alt_value().asString()),
 	mFont(p.font),
 	mColor(p.color),
 	mUseColor(p.color.isProvided()),
@@ -275,10 +284,22 @@ void LLScrollListText::setValue(const LLSD& text)
 	setText(text.asString());
 }
 
+//virtual
+void LLScrollListText::setAltValue(const LLSD& text)
+{
+	mAltText = text.asString();
+}
+
 //virtual 
 const LLSD LLScrollListText::getValue() const		
 { 
-	return LLSD(mText.getString()); 
+	return LLSD(mText.getString());  
+}
+
+//virtual 
+const LLSD LLScrollListText::getAltValue() const		
+{ 
+	return LLSD(mAltText.getString());
 }
 
 
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index 19576fb247a..ede8d847d9e 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -60,6 +60,7 @@ class LLScrollListCell
 
 		Optional<void*>				userdata;
 		Optional<LLSD>				value; // state of checkbox, icon id/name, date
+		Optional<LLSD>				alt_value;
 		Optional<std::string>		label; // description or text
 		Optional<std::string>		tool_tip;
 
@@ -76,6 +77,7 @@ class LLScrollListCell
 			enabled("enabled", true),
 			visible("visible", true),
 			value("value"),
+			alt_value("alt_value", ""),
 			label("label"),
 			tool_tip("tool_tip", ""),
 			font("font", LLFontGL::getFontSansSerifSmall()),
@@ -98,7 +100,9 @@ class LLScrollListCell
 	virtual S32				getContentWidth() const { return 0; }
 	virtual S32				getHeight() const { return 0; }
 	virtual const LLSD		getValue() const;
+	virtual const LLSD		getAltValue() const;
 	virtual void			setValue(const LLSD& value) { }
+	virtual void			setAltValue(const LLSD& value) { }
 	virtual const std::string &getToolTip() const { return mToolTip; }
 	virtual void			setToolTip(const std::string &str) { mToolTip = str; }
 	virtual BOOL			getVisible() const { return TRUE; }
@@ -138,7 +142,9 @@ class LLScrollListText : public LLScrollListCell
 	/*virtual*/ S32		getContentWidth() const;
 	/*virtual*/ S32		getHeight() const;
 	/*virtual*/ void	setValue(const LLSD& value);
+	/*virtual*/ void	setAltValue(const LLSD& value);
 	/*virtual*/ const LLSD getValue() const;
+	/*virtual*/ const LLSD getAltValue() const;
 	/*virtual*/ BOOL	getVisible() const;
 	/*virtual*/ void	highlightText(S32 offset, S32 num_chars);
 
@@ -156,6 +162,7 @@ class LLScrollListText : public LLScrollListCell
 
 protected:
 	LLUIString		mText;
+	LLUIString		mAltText;
 	S32				mTextWidth;
 	const LLFontGL*	mFont;
 	LLColor4		mColor;
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index be85f1cb6a1..10591907128 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -66,9 +66,10 @@ static LLDefaultChildRegistry::Register<LLScrollListCtrl> r("scroll_list");
 // local structures & classes.
 struct SortScrollListItem
 {
-	SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders,const LLScrollListCtrl::sort_signal_t*	sort_signal)
+	SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders,const LLScrollListCtrl::sort_signal_t*	sort_signal, bool alternate_sort)
 	:	mSortOrders(sort_orders)
 	,   mSortSignal(sort_signal)
+	,	mAltSort(alternate_sort)
 	{}
 
 	bool operator()(const LLScrollListItem* i1, const LLScrollListItem* i2)
@@ -93,7 +94,14 @@ struct SortScrollListItem
 				}
 				else
 				{
-					sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString());
+					if (mAltSort && !cell1->getAltValue().asString().empty() && !cell2->getAltValue().asString().empty())
+					{
+						sort_result = order * LLStringUtil::compareDict(cell1->getAltValue().asString(), cell2->getAltValue().asString());
+					}
+					else
+					{
+						sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString());
+					}
 				}
 				if (sort_result != 0)
 				{
@@ -109,6 +117,7 @@ struct SortScrollListItem
 	typedef std::vector<std::pair<S32, BOOL> > sort_order_t;
 	const LLScrollListCtrl::sort_signal_t* mSortSignal;
 	const sort_order_t& mSortOrders;
+	const bool mAltSort;
 };
 
 //---------------------------------------------------------------------------
@@ -213,6 +222,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
 	mSearchColumn(p.search_column),
 	mColumnPadding(p.column_padding),
 	mRowPadding(p.row_padding),
+	mAlternateSort(false),
 	mContextMenuType(MENU_NONE),
 	mIsFriendSignal(NULL)
 {
@@ -2680,7 +2690,7 @@ void LLScrollListCtrl::updateSort() const
 		std::stable_sort(
 			mItemList.begin(), 
 			mItemList.end(), 
-			SortScrollListItem(mSortColumns,mSortCallback));
+			SortScrollListItem(mSortColumns,mSortCallback, mAlternateSort));
 
 		mSorted = true;
 	}
@@ -2696,7 +2706,7 @@ void LLScrollListCtrl::sortOnce(S32 column, BOOL ascending)
 	std::stable_sort(
 		mItemList.begin(), 
 		mItemList.end(), 
-		SortScrollListItem(sort_column,mSortCallback));
+		SortScrollListItem(sort_column,mSortCallback,mAlternateSort));
 }
 
 void LLScrollListCtrl::dirtyColumns() 
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 0cc481b113b..08134bbfc83 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -398,6 +398,8 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 	BOOL			hasSortOrder() const;
 	void			clearSortOrder();
 
+	void			setAlternateSort() { mAlternateSort = true; }
+
 	S32		selectMultiple( uuid_vec_t ids );
 	// conceptually const, but mutates mItemList
 	void			updateSort() const;
@@ -482,6 +484,8 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 	bool			mColumnsDirty;
 	bool			mColumnWidthsDirty;
 
+	bool			mAlternateSort;
+
 	mutable item_list	mItemList;
 
 	LLScrollListItem *mLastSelected;
diff --git a/indra/llui/llscrolllistitem.cpp b/indra/llui/llscrolllistitem.cpp
index 51c615dd003..e1360f80cda 100644
--- a/indra/llui/llscrolllistitem.cpp
+++ b/indra/llui/llscrolllistitem.cpp
@@ -44,7 +44,8 @@ LLScrollListItem::LLScrollListItem( const Params& p )
 	mSelectedIndex(-1),
 	mEnabled(p.enabled),
 	mUserdata(p.userdata),
-	mItemValue(p.value)
+	mItemValue(p.value),
+	mItemAltValue(p.alt_value)
 {
 }
 
diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h
index d2c3dd7721b..a3398305b17 100644
--- a/indra/llui/llscrolllistitem.h
+++ b/indra/llui/llscrolllistitem.h
@@ -55,6 +55,7 @@ class LLScrollListItem
 		Optional<bool>		enabled;
 		Optional<void*>		userdata;
 		Optional<LLSD>		value;
+		Optional<LLSD>		alt_value;
 		
 		Ignored				name; // use for localization tools
 		Ignored				type; 
@@ -65,6 +66,7 @@ class LLScrollListItem
 		Params()
 		:	enabled("enabled", true),
 			value("value"),
+			alt_value("alt_value"),
 			name("name"),
 			type("type"),
 			length("length"),
@@ -97,6 +99,7 @@ class LLScrollListItem
 
 	virtual LLUUID	getUUID() const			{ return mItemValue.asUUID(); }
 	LLSD	getValue() const				{ return mItemValue; }
+	LLSD	getAltValue() const				{ return mItemAltValue; }
 	
 	void	setRect(LLRect rect)			{ mRectangle = rect; }
 	LLRect	getRect() const					{ return mRectangle; }
@@ -131,6 +134,7 @@ class LLScrollListItem
 	BOOL	mEnabled;
 	void*	mUserdata;
 	LLSD	mItemValue;
+	LLSD	mItemAltValue;
 	std::vector<LLScrollListCell *> mColumns;
 	LLRect  mRectangle;
 };
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index af0e56e4480..04133f27109 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2468,6 +2468,7 @@ BOOL LLPanelLandAccess::postBuild()
 	{
 		mListBanned->sortByColumnIndex(0, TRUE); // ascending
 		mListBanned->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+		mListBanned->setAlternateSort();
 	}
 
 	return TRUE;
@@ -2570,11 +2571,12 @@ void LLPanelLandAccess::refresh()
 			{
 				const LLAccessEntry& entry = (*cit).second;
 				std::string duration;
+				S32 seconds = -1;
 				if (entry.mTime != 0)
 				{
 					LLStringUtil::format_map_t args;
 					S32 now = time(NULL);
-					S32 seconds = entry.mTime - now;					
+					seconds = entry.mTime - now;					
 					if (seconds < 0) seconds = 0;
 
 					if (seconds >= 7200)
@@ -2611,6 +2613,7 @@ void LLPanelLandAccess::refresh()
 				columns[0]["column"] = "name"; // to be populated later
 				columns[1]["column"] = "duration";
 				columns[1]["value"] = duration;
+				columns[1]["alt_value"] = entry.mTime != 0 ? std::to_string(seconds) : "Always";
 				mListBanned->addElement(item);
 			}
 			mListBanned->sortByName(TRUE);
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 3209d23e430..5215126789a 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -398,6 +398,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
 	if (cell)
 	{
 		cell->setValue(prefix + fullname);
+		cell->setAltValue(name_item.alt_value());
 	}
 
 	dirtyColumns();
-- 
GitLab