summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorLeslie Linden <leslie@lindenlab.com>2011-08-19 16:20:29 -0700
committerLeslie Linden <leslie@lindenlab.com>2011-08-19 16:20:29 -0700
commit7b09592bf9968dfda5c4cedf4b55e0459e6bd764 (patch)
treeda1bc3376313d21c290ae330f7eebfbaa082f4ae /indra/newview
parent38aa19614e1242e02c23a5dd2fbf5fae49783ed9 (diff)
EXP-840 FIX -- Create outbox panels to help the user get started on the marketplace and to indicate drag and drop targets.
EXP-858 PROGRESS -- Outbox sync failure error handling EXP-908 FIX -- Hide outbox when appropriate EXP-1062 FIX -- Add modal dialog for outbox sync complete EXP-1096 FIX -- Extra space below Received Items panel for an account that does not have a Merchant Account setup, no outbox display EXP-1104 FIX -- User can activate Merchant Outbox synch button when outbox is empty * Added separate class for outbox view to support error tag rendering * Added confirmation for sync complete. * Added different outbox messages for empty outbox, non-merchant and error: merchant but no outbox * Progress on a bunch of other fronts.
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/app_settings/settings.xml11
-rw-r--r--indra/newview/llpanelmarketplaceoutbox.cpp36
-rw-r--r--indra/newview/llpanelmarketplaceoutbox.h2
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.cpp172
-rw-r--r--indra/newview/llpanelmarketplaceoutboxinventory.h82
-rw-r--r--indra/newview/llsidepanelinventory.cpp125
-rw-r--r--indra/newview/llsidepanelinventory.h3
-rw-r--r--indra/newview/llviewermedia.cpp6
-rw-r--r--indra/newview/skins/default/textures/textures.xml7
-rw-r--r--indra/newview/skins/default/textures/widgets/Error_Tag_Background.pngbin0 -> 1354 bytes
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml26
-rw-r--r--indra/newview/skins/default/xui/en/panel_outbox_inventory.xml5
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml52
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml28
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml19
-rw-r--r--indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml2
18 files changed, 525 insertions, 57 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index f3fea87849..f13e435a74 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -368,6 +368,7 @@ set(viewer_SOURCE_FILES
llpanelmarketplaceinbox.cpp
llpanelmarketplaceinboxinventory.cpp
llpanelmarketplaceoutbox.cpp
+ llpanelmarketplaceoutboxinventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
llpanelmediasettingssecurity.cpp
@@ -924,6 +925,7 @@ set(viewer_HEADER_FILES
llpanelmarketplaceinbox.h
llpanelmarketplaceinboxinventory.h
llpanelmarketplaceoutbox.h
+ llpanelmarketplaceoutboxinventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
llpanelmediasettingssecurity.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 33541b559b..781431d4de 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4226,6 +4226,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>InventoryMarketplaceUserStatus</key>
+ <map>
+ <key>Comment</key>
+ <string>Marketplace user status.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
<key>InventorySortOrder</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llpanelmarketplaceoutbox.cpp b/indra/newview/llpanelmarketplaceoutbox.cpp
index 913a62b897..221420985a 100644
--- a/indra/newview/llpanelmarketplaceoutbox.cpp
+++ b/indra/newview/llpanelmarketplaceoutbox.cpp
@@ -34,6 +34,7 @@
#include "lleventcoro.h"
#include "llinventorypanel.h"
#include "llloadingindicator.h"
+#include "llnotificationsutil.h"
#include "llpanelmarketplaceinbox.h"
#include "llsidepanelinventory.h"
#include "llsidetray.h"
@@ -100,7 +101,7 @@ void LLPanelMarketplaceOutbox::onSelectionChange()
LLInventoryPanel * LLPanelMarketplaceOutbox::setupInventoryPanel()
{
- LLView * outbox_inventory_placeholder = getChild<LLView>("outbox_inventory_placeholder");
+ LLView * outbox_inventory_placeholder = getChild<LLView>("outbox_inventory_placeholder_panel");
LLView * outbox_inventory_parent = outbox_inventory_placeholder->getParent();
mInventoryPanel =
@@ -150,9 +151,7 @@ BOOL LLPanelMarketplaceOutbox::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL d
bool LLPanelMarketplaceOutbox::isOutboxEmpty() const
{
- // TODO: Check for contents of outbox
-
- return false;
+ return (getTotalItemCount() == 0);
}
bool LLPanelMarketplaceOutbox::isSyncInProgress() const
@@ -176,7 +175,7 @@ void timeDelay(LLCoros::self& self, LLPanelMarketplaceOutbox* outboxPanel)
waitForEventOn(self, "mainloop");
}
- outboxPanel->onSyncComplete();
+ outboxPanel->onSyncComplete(true, LLSD::emptyMap());
gTimeDelayDebugFunc = "";
}
@@ -193,7 +192,7 @@ public:
void completed(U32 status, const std::string& reason, const LLSD& content)
{
- llinfos << "inventory_import complete status: " << status << llendl;
+ llinfos << "inventory_import complete status: " << status << ", reason: " << reason << llendl;
if (isGoodStatus(status))
{
@@ -212,7 +211,7 @@ public:
llwarns << "failed" << llendl;
}
- mOutboxPanel->onSyncComplete();
+ mOutboxPanel->onSyncComplete(isGoodStatus(status), content);
}
private:
@@ -248,10 +247,19 @@ void LLPanelMarketplaceOutbox::onSyncButtonClicked()
//gTimeDelayDebugFunc = LLCoros::instance().launch("LLPanelMarketplaceOutbox timeDelay", boost::bind(&timeDelay, _1, this));
}
-void LLPanelMarketplaceOutbox::onSyncComplete()
+void LLPanelMarketplaceOutbox::onSyncComplete(bool goodStatus, const LLSD& content)
{
mSyncInProgress = false;
updateSyncButtonStatus();
+
+ if (goodStatus)
+ {
+ LLNotificationsUtil::add("OutboxUploadComplete", LLSD::emptyMap(), LLSD::emptyMap());
+ }
+ else
+ {
+ LLNotificationsUtil::add("OutboxUploadHadErrors", LLSD::emptyMap(), LLSD::emptyMap());
+ }
}
void LLPanelMarketplaceOutbox::updateSyncButtonStatus()
@@ -293,9 +301,10 @@ U32 LLPanelMarketplaceOutbox::getTotalItemCount() const
void LLPanelMarketplaceOutbox::draw()
{
- U32 item_count = getTotalItemCount();
+ const U32 item_count = getTotalItemCount();
+ const bool not_empty = (item_count > 0);
- if (item_count > 0)
+ if (not_empty)
{
std::string item_count_str = llformat("%d", item_count);
@@ -307,6 +316,11 @@ void LLPanelMarketplaceOutbox::draw()
{
getChild<LLButton>("outbox_btn")->setLabel(getString("OutboxLabelNoArg"));
}
-
+
+ if (!isSyncInProgress())
+ {
+ mSyncButton->setEnabled(not_empty);
+ }
+
LLPanel::draw();
}
diff --git a/indra/newview/llpanelmarketplaceoutbox.h b/indra/newview/llpanelmarketplaceoutbox.h
index c2f368ea7b..2cf5b77569 100644
--- a/indra/newview/llpanelmarketplaceoutbox.h
+++ b/indra/newview/llpanelmarketplaceoutbox.h
@@ -63,7 +63,7 @@ public:
bool isOutboxEmpty() const;
bool isSyncInProgress() const;
- void onSyncComplete();
+ void onSyncComplete(bool goodStatus, const LLSD& content);
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.cpp b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
new file mode 100644
index 0000000000..638d3c5150
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceoutboxinventory.cpp
@@ -0,0 +1,172 @@
+/**
+ * @file llpanelmarketplaceoutboxinventory.cpp
+ * @brief LLOutboxInventoryPanel class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelmarketplaceoutboxinventory.h"
+
+#include "llfolderview.h"
+#include "llfoldervieweventlistener.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llpanellandmarks.h"
+#include "llplacesinventorybridge.h"
+#include "llviewerfoldertype.h"
+
+
+//
+// statics
+//
+
+static LLDefaultChildRegistry::Register<LLOutboxInventoryPanel> r1("outbox_inventory_panel");
+static LLDefaultChildRegistry::Register<LLOutboxFolderViewFolder> r2("outbox_folder_view_folder");
+
+
+//
+// LLOutboxInventoryPanel Implementation
+//
+
+LLOutboxInventoryPanel::LLOutboxInventoryPanel(const LLOutboxInventoryPanel::Params& p)
+ : LLInventoryPanel(p)
+{
+}
+
+LLOutboxInventoryPanel::~LLOutboxInventoryPanel()
+{
+}
+
+// virtual
+void LLOutboxInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
+{
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
+
+ LLUUID root_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false);
+
+ // leslie -- temporary HACK to work around sim not creating outbox with proper system folder type
+ if (root_id.isNull())
+ {
+ std::string start_folder_name(params.start_folder());
+
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+
+ gInventory.getDirectDescendentsOf(gInventory.getRootFolderID(), cats, items);
+
+ if (cats)
+ {
+ for (LLInventoryModel::cat_array_t::const_iterator cat_it = cats->begin(); cat_it != cats->end(); ++cat_it)
+ {
+ LLInventoryCategory* cat = *cat_it;
+
+ if (cat->getName() == start_folder_name)
+ {
+ root_id = cat->getUUID();
+ break;
+ }
+ }
+ }
+
+ if (root_id == LLUUID::null)
+ {
+ llwarns << "No category found that matches outbox inventory panel start_folder: " << start_folder_name << llendl;
+ }
+ }
+ // leslie -- end temporary HACK
+
+ if (root_id == LLUUID::null)
+ {
+ llwarns << "Outbox inventory panel has no root folder!" << llendl;
+ root_id = LLUUID::generateNewID();
+ }
+
+ LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
+ LLAssetType::AT_CATEGORY,
+ LLInventoryType::IT_CATEGORY,
+ this,
+ NULL,
+ root_id);
+
+ mFolderRoot = createFolderView(new_listener, params.use_label_suffix());
+}
+
+LLFolderViewFolder * LLOutboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
+{
+ LLOutboxFolderViewFolder::Params params;
+
+ params.name = bridge->getDisplayName();
+ params.icon = bridge->getIcon();
+ params.icon_open = bridge->getOpenIcon();
+
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+
+ params.root = mFolderRoot;
+ params.listener = bridge;
+ params.tool_tip = params.name;
+
+ return LLUICtrlFactory::create<LLOutboxFolderViewFolder>(params);
+}
+
+
+//
+// LLOutboxFolderViewFolder Implementation
+//
+
+LLOutboxFolderViewFolder::LLOutboxFolderViewFolder(const Params& p)
+ : LLFolderViewFolder(p)
+ , LLBadgeOwner(getHandle())
+ , mError(false)
+{
+ initBadgeParams(p.error_badge());
+}
+
+LLOutboxFolderViewFolder::~LLOutboxFolderViewFolder()
+{
+}
+
+// virtual
+void LLOutboxFolderViewFolder::draw()
+{
+ if (!badgeHasParent())
+ {
+ addBadgeToParentPanel();
+ }
+
+ setBadgeVisibility(mError);
+
+ LLFolderViewFolder::draw();
+}
+
+void LLOutboxFolderViewFolder::setCreationDate(time_t creation_date_utc) const
+{
+ mCreationDate = creation_date_utc;
+}
+
+
+// eof
diff --git a/indra/newview/llpanelmarketplaceoutboxinventory.h b/indra/newview/llpanelmarketplaceoutboxinventory.h
new file mode 100644
index 0000000000..ba68654ad7
--- /dev/null
+++ b/indra/newview/llpanelmarketplaceoutboxinventory.h
@@ -0,0 +1,82 @@
+/**
+ * @file llpanelmarketplaceoutboxinventory.h
+ * @brief LLOutboxInventoryPanel class declaration
+ *
+ * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_OUTBOXINVENTORYPANEL_H
+#define LL_OUTBOXINVENTORYPANEL_H
+
+
+#include "llbadgeowner.h"
+#include "llinventorypanel.h"
+#include "llfolderviewitem.h"
+
+
+class LLOutboxInventoryPanel : public LLInventoryPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {
+ Params() {}
+ };
+
+ LLOutboxInventoryPanel(const Params& p);
+ ~LLOutboxInventoryPanel();
+
+ // virtual
+ void buildFolderView(const LLInventoryPanel::Params& params);
+
+ // virtual
+ class LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge);
+};
+
+
+class LLOutboxFolderViewFolder : public LLFolderViewFolder, public LLBadgeOwner
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
+ {
+ Optional<LLBadge::Params> error_badge;
+
+ Params()
+ : error_badge("error_badge")
+ {
+ }
+ };
+
+ LLOutboxFolderViewFolder(const Params& p);
+ ~LLOutboxFolderViewFolder();
+
+ void draw();
+
+ bool hasError() const { return mError; }
+
+protected:
+ void setCreationDate(time_t creation_date_utc) const;
+
+ bool mError;
+};
+
+
+#endif //LL_OUTBOXINVENTORYPANEL_H
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 5bbd6a2d01..5ae3a30fd5 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -52,7 +52,10 @@
#include "llsidepaneltaskinfo.h"
#include "llstring.h"
#include "lltabcontainer.h"
+#include "lltextbox.h"
+#include "lltrans.h"
#include "llviewermedia.h"
+#include "llviewernetwork.h"
#include "llweb.h"
static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
@@ -394,22 +397,48 @@ void LLSidepanelInventory::observeOutboxModifications(const LLUUID& outboxID)
void LLSidepanelInventory::enableInbox(bool enabled)
{
mInboxEnabled = enabled;
- getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME)->setVisible(enabled);
+
+ LLLayoutPanel * inbox_layout_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+ inbox_layout_panel->setVisible(enabled);
if (mInboxEnabled)
{
- getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME)->setVisible(TRUE);
+ LLLayoutPanel * inout_layout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME);
+
+ inout_layout_panel->setVisible(TRUE);
+
+ if (mOutboxEnabled)
+ {
+ S32 inbox_min_dim = inbox_layout_panel->getMinDim();
+ S32 outbox_min_dim = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME)->getMinDim();
+
+ inout_layout_panel->setMinDim(inbox_min_dim + outbox_min_dim);
+ }
}
}
void LLSidepanelInventory::enableOutbox(bool enabled)
{
mOutboxEnabled = enabled;
- getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME)->setVisible(enabled);
+
+ LLLayoutPanel * outbox_layout_panel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
+ outbox_layout_panel->setVisible(enabled);
if (mOutboxEnabled)
{
- getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME)->setVisible(TRUE);
+ LLLayoutPanel * inout_layout_panel = getChild<LLLayoutPanel>(INBOX_OUTBOX_LAYOUT_PANEL_NAME);
+
+ inout_layout_panel->setVisible(TRUE);
+
+ if (mInboxEnabled)
+ {
+ S32 inbox_min_dim = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME)->getMinDim();
+ S32 outbox_min_dim = outbox_layout_panel->getMinDim();
+
+ inout_layout_panel->setMinDim(inbox_min_dim + outbox_min_dim);
+ }
+
+ updateOutboxUserStatus();
}
}
@@ -417,10 +446,18 @@ void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
{
// Trigger a load of the entire inbox so we always know the contents and their creation dates for sorting
LLInventoryModelBackgroundFetch::instance().start(inbox_id);
+
+ // If the outbox is expanded, don't auto-expand the inbox
+ if (mOutboxEnabled)
+ {
+ if (getChild<LLButton>(OUTBOX_BUTTON_NAME)->getToggleState())
+ {
+ return;
+ }
+ }
- // Expand the inbox since we have fresh items
- LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL);
- if (inbox)
+ // Expand the inbox since we have fresh items and the outbox is not expanded
+ if (mInboxEnabled)
{
getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true);
onToggleInboxBtn();
@@ -430,8 +467,7 @@ void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
void LLSidepanelInventory::onOutboxChanged(const LLUUID& outbox_id)
{
// Expand the outbox since we have new items in it
- LLPanelMarketplaceInbox * outbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_OUTBOX_PANEL);
- if (outbox)
+ if (mOutboxEnabled)
{
getChild<LLButton>(OUTBOX_BUTTON_NAME)->setToggleState(true);
onToggleOutboxBtn();
@@ -675,6 +711,77 @@ void LLSidepanelInventory::showInventoryPanel()
updateVerbs();
}
+void LLSidepanelInventory::updateOutboxUserStatus()
+{
+ const bool isMerchant = (gSavedSettings.getString("InventoryMarketplaceUserStatus") == "merchant");
+ const bool hasOutbox = !gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false, false).isNull();
+
+ LLView * outbox_placeholder = getChild<LLView>("outbox_inventory_placeholder_panel");
+ LLView * outbox_placeholder_parent = outbox_placeholder->getParent();
+
+ LLTextBox * outbox_title_box = outbox_placeholder->getChild<LLTextBox>("outbox_inventory_placeholder_title");
+ LLTextBox * outbox_text_box = outbox_placeholder->getChild<LLTextBox>("outbox_inventory_placeholder_text");
+
+ std::string outbox_text;
+ std::string outbox_title;
+ std::string outbox_tooltip;
+
+ if (isMerchant)
+ {
+ if (hasOutbox)
+ {
+ outbox_text = LLTrans::getString("InventoryOutboxNoItems");
+ outbox_title = LLTrans::getString("InventoryOutboxNoItemsTitle");
+ outbox_tooltip = LLTrans::getString("InventoryOutboxNoItemsTooltip");
+ }
+ else
+ {
+ outbox_text = LLTrans::getString("InventoryOutboxCreationError");
+ outbox_title = LLTrans::getString("InventoryOutboxCreationErrorTitle");
+ outbox_tooltip = LLTrans::getString("InventoryOutboxCreationErrorTooltip");
+ }
+ }
+ else
+ {
+ //
+ // The string to become a merchant contains 3 URL's which need the domain name patched in.
+ //
+
+ std::string domain = "secondlife.com";
+
+ if (!LLGridManager::getInstance()->isInProductionGrid())
+ {
+ std::string gridLabel = LLGridManager::getInstance()->getGridLabel();
+ domain = llformat("%s.lindenlab.com", utf8str_tolower(gridLabel).c_str());
+ }
+
+ LLStringUtil::format_map_t domain_arg;
+ domain_arg["[DOMAIN_NAME]"] = domain;
+
+ std::string marketplace_url = LLTrans::getString("MarketplaceURL", domain_arg);
+ std::string marketplace_url_create = LLTrans::getString("MarketplaceURL_CreateStore", domain_arg);
+ std::string marketplace_url_info = LLTrans::getString("MarketplaceURL_LearnMore", domain_arg);
+
+ LLStringUtil::format_map_t args1, args2, args3;
+ args1["[MARKETPLACE_URL]"] = marketplace_url;
+ args2["[LEARN_MORE_URL]"] = marketplace_url_info;
+ args3["[CREATE_STORE_URL]"] = marketplace_url_create;
+
+ // NOTE: This is dumb, ridiculous and very finicky. The order of these is very important
+ // to have these three string substitutions work properly.
+ outbox_text = LLTrans::getString("InventoryOutboxNotMerchant", args1);
+ LLStringUtil::format(outbox_text, args2);
+ LLStringUtil::format(outbox_text, args3);
+
+ outbox_title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
+ outbox_tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
+ }
+
+ outbox_text_box->setValue(outbox_text);
+ outbox_title_box->setValue(outbox_title);
+ outbox_placeholder_parent->setToolTip(outbox_tooltip);
+}
+
void LLSidepanelInventory::updateVerbs()
{
mInfoBtn->setEnabled(FALSE);
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index ebbb10936a..b7d11f7f9b 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -76,10 +76,11 @@ public:
void enableInbox(bool enabled);
void enableOutbox(bool enabled);
-
+
bool isInboxEnabled() const { return mInboxEnabled; }
bool isOutboxEnabled() const { return mOutboxEnabled; }
+ void updateOutboxUserStatus();
void updateVerbs();
protected:
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index fc71e19a7d..e403034eaf 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1381,15 +1381,17 @@ public:
std::string merchantStatus = content[gAgent.getID().getString()].asString();
llinfos << "Marketplace merchant status: " << merchantStatus << llendl;
+ // Save the merchant status before turning on the display
+ gSavedSettings.setString("InventoryMarketplaceUserStatus", merchantStatus);
+
// Complete success
gSavedSettings.setBOOL("InventoryDisplayInbox", true);
- gSavedSettings.setBOOL("InventoryDisplayOutbox", (merchantStatus == "merchant"));
+ gSavedSettings.setBOOL("InventoryDisplayOutbox", true);
}
else if (status == 401)
{
// API is available for use but OpenID authorization failed
gSavedSettings.setBOOL("InventoryDisplayInbox", true);
- //gSavedSettings.setBOOL("InventoryDisplayOutbox", true);
}
else
{
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 392a6309c3..4d83ec2902 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -72,10 +72,11 @@ with the same filename but different name
<texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
<texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" scale.left="22" scale.top="12" scale.right="25" scale.bottom="12" />
- <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
- <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="Error_Tag_Background" file_name="widgets/Error_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Background" file_name="widgets/New_Tag_Background.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
+ <texture name="New_Tag_Border" file_name="widgets/New_Tag_Border.png" preload="true" scale.left="12" scale.top="2" scale.right="36" scale.bottom="2" />
- <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="Badge_Background" file_name="widgets/Badge_Background.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="Badge_Border" file_name="widgets/Badge_Border.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="Blank" file_name="Blank.png" preload="false" />
diff --git a/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png b/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png
new file mode 100644
index 0000000000..c8dbc8e87a
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Error_Tag_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ded52d580c..1dda0b3235 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -211,6 +211,26 @@ Save changes to current clothing/body part?
yestext="Yes"/>
</notification>
+ <notification
+ icon="alertmodal.tga"
+ name="OutboxUploadComplete"
+ type="alertmodal">
+Marketplace upload complete.
+ <usetemplate
+ name="okbutton"
+ yestext="Hooray!"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="OutboxUploadHadErrors"
+ type="alertmodal">
+Marketplace upload completed with errors! Please correct the problems in your outbox and retry. Thanks.
+ <usetemplate
+ name="okbutton"
+ yestext="Boo!"/>
+ </notification>
+
<notification
@@ -5103,7 +5123,7 @@ Topic: [SUBJECT], Message: [MESSAGE]
name="FriendOnline"
type="notifytip">
<tag>friendship</tag>
-&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Online
+[NAME] is Online
</notification>
<notification
@@ -5111,7 +5131,7 @@ Topic: [SUBJECT], Message: [MESSAGE]
name="FriendOffline"
type="notifytip">
<tag>friendship</tag>
-&lt;nolink&gt;[NAME]&lt;/nolink&gt; is Offline
+[NAME] is Offline
</notification>
<notification
@@ -6848,7 +6868,7 @@ Are you sure you want to share the following items:
With the following Residents:
-&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
+[RESIDENTS]
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
diff --git a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
index 396d5cf2f5..66117615e4 100644
--- a/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outbox_inventory.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<inventory_panel
+<outbox_inventory_panel
name="inventory_outbox"
start_folder="Outbox"
follows="all" layout="topleft"
@@ -12,6 +12,7 @@
border="false"
bevel_style="none"
show_item_link_overlays="true"
+ tool_tip="Drag and drop items here to prepare them for sale on your storefront"
>
<scroll reserve_scroll_corner="false" />
-</inventory_panel>
+</outbox_inventory_panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 1d0fb58a73..7a176ff367 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -56,7 +56,7 @@
follows="bottom|left|right"
name="inbox_outbox_layout_panel"
visible="false"
- min_dim="70"
+ min_dim="35"
max_dim="235"
expanded_min_dim="125"
height="235">
@@ -153,7 +153,7 @@
</layout_panel>
<layout_panel
width="330"
- layout="topleft"
+ layout="topleft"
auto_resize="true"
user_resize="false"
follows="all"
@@ -162,7 +162,7 @@
min_dim="35"
max_dim="200"
expanded_min_dim="90"
- height="35">
+ height="200">
<panel
follows="all"
layout="topleft"
@@ -171,13 +171,13 @@
class="panel_marketplace_outbox"
top="0"
label=""
- height="35"
+ height="200"
width="330">
<string name="OutboxLabelWithArg">Merchant Outbox ([NUM])</string>
<string name="OutboxLabelNoArg">Merchant Outbox</string>
<button
label="Merchant Outbox"
- font="SansSerifMedium"
+ font="SansSerifMedium"
name="outbox_btn"
height="35"
width="308"
@@ -240,21 +240,45 @@
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
- tool_tip="Drag and drop items here to prepare them for sale on your storefront"
>
- <text
- name="outbox_inventory_placeholder"
- type="string"
+ <panel
+ name="outbox_inventory_placeholder_panel"
follows="all"
layout="topleft"
top="0"
left="0"
width="308"
- height="0"
- wrap="true"
- halign="center">
- Set up your merchant account to use this feature.
- </text>
+ height="165"
+ bg_opaque_color="InventoryBackgroundColor"
+ background_visible="true"
+ background_opaque="true"
+ >
+ <text
+ name="outbox_inventory_placeholder_title"
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="10"
+ left="0"
+ width="308"
+ height="25"
+ wrap="true"
+ halign="center"
+ font="SansSerifBold">
+ Loading...
+ </text>
+ <text
+ name="outbox_inventory_placeholder_text"
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="35"
+ left="0"
+ width="308"
+ height="130"
+ wrap="true"
+ halign="left" />
+ </panel>
</panel>
</panel>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index ced1826a03..2eff3f2290 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -164,17 +164,16 @@ Please try logging in again in a minute.</string>
<string name="TooltipLand">Land:</string>
<string name="TooltipMustSingleDrop">Only a single item can be dragged here</string>
<string name="TooltipPrice" value="L$[AMOUNT]: "/>
-
- <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred to another user.</string>
- <string name="TooltipOutboxWorn">ou are wearing one or more of these objects. Remove them from your avatar and try moving them again.</string>
- <string name="TooltipOutboxFolderLevels">This folder has too many levels of subfolders. Rearrange the interior folders to a maximum of 4 levels deep (Root Folder contains A contains B contains C).</string>
- <string name="TooltipOutboxTooManyObjects">This folder contains more than 200 objects. Box some of the items to reduce the object count.</string>
-
- <!-- tooltips for Urls -->
+ <string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred to another user.</string>
+ <string name="TooltipOutboxWorn">ou are wearing one or more of these objects. Remove them from your avatar and try moving them again.</string>
+ <string name="TooltipOutboxFolderLevels">This folder has too many levels of subfolders. Rearrange the interior folders to a maximum of 4 levels deep (Root Folder contains A contains B contains C).</string>
+ <string name="TooltipOutboxTooManyObjects">This folder contains more than 200 objects. Box some of the items to reduce the object count.</string>
+
+ <!-- tooltips for Urls -->
<string name="TooltipHttpUrl">Click to view this web page</string>
<string name="TooltipSLURL">Click to view this location's information</string>
<string name="TooltipAgentUrl">Click to view this Resident's profile</string>
- <string name="TooltipAgentInspect">Learn more about this Resident</string>
+ <string name="TooltipAgentInspect">Learn more about this Resident</string>
<string name="TooltipAgentMute">Click to mute this Resident</string>
<string name="TooltipAgentUnmute">Click to unmute this Resident</string>
<string name="TooltipAgentIM">Click to IM this Resident</string>
@@ -2030,7 +2029,18 @@ Returns a string with the requested data about the region
<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
<string name="InventoryInboxNoItems">Items purchased through the marketplace will be delivered here.</string>
- <string name="InventoryOutboxNoItems">Drag items here in preparation for listing on your marketplace storefront.</string>
+ <string name="MarketplaceURL">http://marketplace.[DOMAIN_NAME]</string>
+ <string name="MarketplaceURL_CreateStore">http://marketplace.[DOMAIN_NAME]/create_store</string>
+ <string name="MarketplaceURL_LearnMore">http://marketplace.[DOMAIN_NAME]/learn_more</string>
+ <string name="InventoryOutboxCreationErrorTitle">Your Merchant Outbox is not properly configured</string>
+ <string name="InventoryOutboxCreationErrorTooltip">Merchant Outbox configuration error</string>
+ <string name="InventoryOutboxCreationError">Please contact Customer Service to correct the problem.</string>
+ <string name="InventoryOutboxNotMerchantTitle">Anyone can sell items on the Marketplace</string>
+ <string name="InventoryOutboxNotMerchantTooltip">Become a merchant!</string>
+ <string name="InventoryOutboxNotMerchant">[[MARKETPLACE_URL] The Second Life Marketplace] offers more than one million virtual products for sale, all of them created by Residents. You, too, can sell items you create, as well as some of the items you have purchased. It’s easy and setup is free. [[LEARN_MORE_URL] Learn more] or [[CREATE_STORE_URL] create a store] on the Marketplace to get started.</string>
+ <string name="InventoryOutboxNoItemsTitle">A new way to send items to the Marketplace</string>
+ <string name="InventoryOutboxNoItemsTooltip">Drag and drop items here to prepare them for sale on the Marketplace</string>
+ <string name="InventoryOutboxNoItems">Drag items or folders that you wish to sell into this area. A copy of the item will appear, leaving your inventory unchanged, unless you have dragged a no-copy item. When you are ready to send the items to the Marketplace, click the Upload button. Once your items have been moved to your Marketplace Inventory, they will disappear from this folder.</string>
<!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
<string name="no_modify" value=" (no modify)" />
diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
index aeea8616b0..77d8024cb2 100644
--- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml
@@ -14,8 +14,8 @@
padding_vert="2"
location_offset_hcenter="-23"
border_image="New_Tag_Border"
- border_color="DkGray2"
+ border_color="DkGray2"
image="New_Tag_Background"
- image_color="Black"
+ image_color="Black"
/>
</inbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
new file mode 100644
index 0000000000..0792996107
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/outbox_folder_view_folder.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<outbox_folder_view_folder
+ folder_arrow_image="Folder_Arrow"
+ folder_indentation="8"
+ item_height="20"
+ item_top_pad="4"
+ selection_image="Rounded_Square"
+ >
+ <error_badge
+ label=" "
+ label_offset_horiz="-1"
+ location="right"
+ padding_horiz="12.5"
+ padding_vert="2"
+ location_offset_hcenter="-23"
+ image="Error_Tag_Background"
+ image_color="Black"
+ />
+</outbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
new file mode 100644
index 0000000000..e3f2072819
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/outbox_inventory_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<outbox_inventory_panel show_load_status="false" />