summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2014-04-10 18:55:07 -0700
committerMerov Linden <merov@lindenlab.com>2014-04-10 18:55:07 -0700
commit253781f87c1653ee203ba3e7bf340747b894140d (patch)
treeee5de566c200ace16c7357d1f6753307ac87e44f
parenta0f5a63a661d3ebc03e82463897c63dd35918749 (diff)
DD-16 : Implement sort by stock count in merketplace
-rwxr-xr-xindra/newview/llfloatermarketplacelistings.cpp2
-rwxr-xr-xindra/newview/llfolderviewmodelinventory.cpp32
-rwxr-xr-xindra/newview/llfolderviewmodelinventory.h2
-rwxr-xr-xindra/newview/llinventoryfunctions.cpp5
4 files changed, 39 insertions, 2 deletions
diff --git a/indra/newview/llfloatermarketplacelistings.cpp b/indra/newview/llfloatermarketplacelistings.cpp
index 10c6045f87..9bbe63de72 100755
--- a/indra/newview/llfloatermarketplacelistings.cpp
+++ b/indra/newview/llfloatermarketplacelistings.cpp
@@ -95,7 +95,7 @@ void LLPanelMarketplaceListings::onViewSortMenuItemClicked(const LLSD& userdata)
if (chosen_item == "sort_by_stock_amount")
{
mSortOrder = (mSortOrder == LLInventoryFilter::SO_FOLDERS_BY_NAME ? LLInventoryFilter::SO_FOLDERS_BY_WEIGHT : LLInventoryFilter::SO_FOLDERS_BY_NAME);
- mAllPanel->getFolderViewModel()->setSorter(mSortOrder);
+ mAllPanel->setSortOrder(mSortOrder);
}
// View/filter options
else if (chosen_item == "show_all")
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index aac3a41b9e..c31b40b179 100755
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -27,6 +27,7 @@
#include "llviewerprecompiledheaders.h"
#include "llfolderviewmodelinventory.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llinventoryfunctions.h"
#include "llinventorypanel.h"
#include "lltooldraganddrop.h"
#include "llfavoritesbar.h"
@@ -269,7 +270,7 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,
// We sort by name if we aren't sorting by date
// OR if these are folders and we are sorting folders by name.
- bool by_name = (!mByDate || (mFoldersByName && (a->getSortGroup() != SG_ITEM)));
+ bool by_name = ((!mByDate || (mFoldersByName && (a->getSortGroup() != SG_ITEM))) && !mFoldersByWeight);
if (a->getSortGroup() != b->getSortGroup())
{
@@ -301,6 +302,35 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,
return (compare < 0);
}
}
+ else if (mFoldersByWeight)
+ {
+ S32 weight_a = compute_stock_count(a->getUUID());
+ S32 weight_b = compute_stock_count(b->getUUID());
+ if ((weight_a != -1) || (weight_b != -1))
+ {
+ llinfos << "Merov : sort by weight, a = " << a->getName() << ", " << weight_a << ", b = " << b->getName() << ", " << weight_b << llendl;
+ }
+ if (weight_a == weight_b)
+ {
+ // Equal weight -> use alphabetical order
+ return (LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()) < 0);
+ }
+ else if (weight_a == -1)
+ {
+ // No weight -> move a at the end of the list
+ return false;
+ }
+ else if (weight_b == -1)
+ {
+ // No weight -> move b at the end of the list
+ return true;
+ }
+ else
+ {
+ // Lighter is first (sorted in increasing order of weight)
+ return (weight_a < weight_b);
+ }
+ }
else
{
time_t first_create = a->getCreationDate();
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 9dcfdfa185..b6d2c8502b 100755
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -89,6 +89,7 @@ public:
mByDate = (mSortOrder & LLInventoryFilter::SO_DATE);
mSystemToTop = (mSortOrder & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP);
mFoldersByName = (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ mFoldersByWeight = (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_WEIGHT);
}
bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const;
@@ -97,6 +98,7 @@ private:
bool mByDate;
bool mSystemToTop;
bool mFoldersByName;
+ bool mFoldersByWeight;
};
class LLFolderViewModelInventory
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index ff38017d6f..57e1b6d9bc 100755
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -796,6 +796,11 @@ S32 compute_stock_count(LLUUID cat_uuid)
{
// Handle the case of the folder being a stock folder immediately
LLViewerInventoryCategory* cat = gInventory.getCategory(cat_uuid);
+ if (!cat)
+ {
+ // Not a category so no stock count to speak of
+ return -1;
+ }
if (cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
{
// Note: stock folders are *not* supposed to have nested subfolders so we stop recursion here