DD-339 : Adding loading indicator to marketplace floater when the listings data and inventory data are being fetched

master
Merov Linden 2015-03-05 21:58:57 -08:00
parent 50a5aefb6f
commit df918447b7
4 changed files with 54 additions and 18 deletions

View File

@ -357,7 +357,7 @@ BOOL LLFloaterMarketplaceListings::postBuild()
mCategoryAddedObserver = new LLMarketplaceListingsAddedObserver(this);
gInventory.addObserver(mCategoryAddedObserver);
// Debug : fetch aggressively so we can create test data right onOpen()
// Fetch aggressively so we can interact with listings right onOpen()
fetchContents();
return TRUE;
@ -389,10 +389,13 @@ void LLFloaterMarketplaceListings::onFocusReceived()
void LLFloaterMarketplaceListings::fetchContents()
{
if (mRootFolderId.notNull())
if (mRootFolderId.notNull() &&
(LLMarketplaceData::instance().getSLMDataFetched() != MarketplaceFetchCodes::MARKET_FETCH_LOADING) &&
(LLMarketplaceData::instance().getSLMDataFetched() != MarketplaceFetchCodes::MARKET_FETCH_DONE))
{
LLMarketplaceData::instance().setDataFetchedSignal(boost::bind(&LLFloaterMarketplaceListings::updateView, this));
LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_LOADING);
LLInventoryModelBackgroundFetch::instance().start(mRootFolderId);
// Get all the SLM Listings
LLMarketplaceData::instance().getSLMListings();
}
}
@ -492,6 +495,7 @@ void LLFloaterMarketplaceListings::setStatusString(const std::string& statusStri
void LLFloaterMarketplaceListings::updateView()
{
U32 mkt_status = LLMarketplaceData::instance().getSLMStatus();
U32 data_fetched = LLMarketplaceData::instance().getSLMDataFetched();
// Get or create the root folder if we are a merchant and it hasn't been done already
if (mRootFolderId.isNull() && (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT))
@ -500,14 +504,18 @@ void LLFloaterMarketplaceListings::updateView()
}
// Update the bottom initializing status and progress dial
if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING)
if ((mkt_status == MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING) ||
(data_fetched == MarketplaceFetchCodes::MARKET_FETCH_NOT_DONE) ||
(data_fetched == MarketplaceFetchCodes::MARKET_FETCH_LOADING))
{
setStatusString(getString("MarketplaceListingsInitializing"));
// Just show the loading indicator in that case and fetch the data (fetch will be skipped if it's already loading)
mInventoryInitializationInProgress->setVisible(true);
mPanelListings->setVisible(FALSE);
fetchContents();
return;
}
else
{
setStatusString("");
mInventoryInitializationInProgress->setVisible(false);
}

View File

@ -154,10 +154,6 @@ void log_SLM_infos(const std::string& request, const std::string& url, const std
}
}
// Merov: This is a temporary hack used by dev while secondlife-staging is down...
// *TODO : Suppress that before shipping!
static bool sBypassMerchant = false;
class LLSLMGetMerchantResponder : public LLHTTPClient::Responder
{
LOG_CLASS(LLSLMGetMerchantResponder);
@ -168,13 +164,7 @@ public:
protected:
virtual void httpFailure()
{
if (sBypassMerchant)
{
// *TODO : Suppress that before shipping!
log_SLM_infos("Get /merchant", getStatus(), "SLM Connection error bypassed (debug only)");
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_MERCHANT);
}
else if (HTTP_NOT_FOUND == getStatus())
if (HTTP_NOT_FOUND == getStatus())
{
log_SLM_infos("Get /merchant", getStatus(), "User is not a merchant");
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT);
@ -222,6 +212,7 @@ public:
if (!isGoodStatus())
{
log_SLM_warning("Get /listings", getStatus(), getReason(), "", body);
LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_FAILED);
update_marketplace_category(mExpectedFolderId, false);
gInventory.notifyObservers();
return;
@ -232,6 +223,7 @@ public:
if (!reader.parse(body,root))
{
log_SLM_warning("Get /listings", getStatus(), "Json parsing failed", reader.getFormatedErrorMessages(), body);
LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_FAILED);
update_marketplace_category(mExpectedFolderId, false);
gInventory.notifyObservers();
return;
@ -263,6 +255,7 @@ public:
}
// Update all folders under the root
LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_DONE);
update_marketplace_category(mExpectedFolderId, false);
gInventory.notifyObservers();
}
@ -1194,7 +1187,9 @@ LLMarketplaceTuple::LLMarketplaceTuple(const LLUUID& folder_id, S32 listing_id,
// Data map
LLMarketplaceData::LLMarketplaceData() :
mMarketPlaceStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED),
mMarketPlaceDataFetched(MarketplaceFetchCodes::MARKET_FETCH_NOT_DONE),
mStatusUpdatedSignal(NULL),
mDataFetchedSignal(NULL),
mDirtyCount(false)
{
mInventoryObserver = new LLMarketplaceInventoryObserver;
@ -1232,6 +1227,15 @@ void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type&
}
}
void LLMarketplaceData::setDataFetchedSignal(const status_updated_signal_t::slot_type& cb)
{
if (mDataFetchedSignal == NULL)
{
mDataFetchedSignal = new status_updated_signal_t();
}
mDataFetchedSignal->connect(cb);
}
// Get/Post/Put requests to the SLM Server using the SLM API
void LLMarketplaceData::getSLMListings()
{
@ -1397,6 +1401,15 @@ void LLMarketplaceData::setSLMStatus(U32 status)
}
}
void LLMarketplaceData::setSLMDataFetched(U32 status)
{
mMarketPlaceDataFetched = status;
if (mDataFetchedSignal)
{
(*mDataFetchedSignal)();
}
}
// Creation / Deletion / Update
// Methods publicly called
bool LLMarketplaceData::createListing(const LLUUID& folder_id)

View File

@ -73,6 +73,17 @@ namespace MarketplaceStatusCodes
};
}
namespace MarketplaceFetchCodes
{
enum sCode
{
MARKET_FETCH_NOT_DONE = 0,
MARKET_FETCH_LOADING = 1,
MARKET_FETCH_FAILED = 2,
MARKET_FETCH_DONE = 3
};
}
class LLMarketplaceInventoryImporter
: public LLSingleton<LLMarketplaceInventoryImporter>
@ -190,6 +201,9 @@ public:
void setSLMStatus(U32 status);
void getSLMListings();
bool isEmpty() { return (mMarketplaceItems.size() == 0); }
void setDataFetchedSignal(const status_updated_signal_t::slot_type& cb);
void setSLMDataFetched(U32 status);
U32 getSLMDataFetched() { return mMarketPlaceDataFetched; }
// High level create/delete/set Marketplace data: each method returns true if the function succeeds, false if error
bool createListing(const LLUUID& folder_id);
@ -253,6 +267,8 @@ private:
bool mDirtyCount; // If true, stock count value need to be updated at the next check
// Update data
U32 mMarketPlaceDataFetched;
status_updated_signal_t* mDataFetchedSignal;
std::set<LLUUID> mPendingUpdateSet;
// Listing folders waiting for validation

View File

@ -13,7 +13,6 @@
save_rect="true"
save_visibility="false"
reuse_instance="true">
<string name="MarketplaceListingsInitializing">Initializing...</string>
<panel
name="marketplace_listings_panel"
follows="all"