Merge with Viewer-VMM

Ansariel 2015-07-15 14:23:19 +02:00
commit ebf54d4b2d
304 changed files with 11509 additions and 4134 deletions

View File

@ -107,6 +107,9 @@ public:
AT_LINK_FOLDER = 25,
// Inventory folder link
AT_MARKETPLACE_FOLDER = 26,
// Marketplace folder. Same as an AT_CATEGORY but different display methods.
AT_WIDGET = 40,
// UI Widget: this is *not* an inventory asset type, only a viewer side asset (e.g. button, other ui items...)

View File

@ -96,6 +96,10 @@ LLFolderDictionary::LLFolderDictionary()
addEntry(LLFolderType::FT_OUTBOX, new FolderEntry("outbox", TRUE));
addEntry(LLFolderType::FT_BASIC_ROOT, new FolderEntry("basic_rt", TRUE));
addEntry(LLFolderType::FT_MARKETPLACE_LISTINGS, new FolderEntry("merchant", FALSE));
addEntry(LLFolderType::FT_MARKETPLACE_STOCK, new FolderEntry("stock", FALSE));
addEntry(LLFolderType::FT_MARKETPLACE_VERSION, new FolderEntry("version", FALSE));
addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE));
};

View File

@ -87,10 +87,14 @@ public:
FT_BASIC_ROOT = 52,
FT_MARKETPLACE_LISTINGS = 53,
FT_MARKETPLACE_STOCK = 54,
FT_MARKETPLACE_VERSION = 55, // Note: We actually *never* create folders with that type. This is used for icon override only.
// <FS:Ansariel> Folder types for our own virtual system folders
FT_FIRESTORM = 53,
FT_PHOENIX = 54,
FT_RLV = 55,
FT_FIRESTORM = 56,
FT_PHOENIX = 57,
FT_RLV = 58,
// </FS:Ansariel> Folder types for our own virtual system folders
FT_COUNT,

View File

@ -585,6 +585,17 @@ void LLHTTPClient::patch(
request(url, HTTP_PATCH, new LLSDInjector(body), responder, timeout, headers);
}
void LLHTTPClient::putRaw(
const std::string& url,
const U8* data,
S32 size,
ResponderPtr responder,
const LLSD& headers,
const F32 timeout)
{
request(url, HTTP_PUT, new RawInjector(data, size), responder, timeout, headers);
}
void LLHTTPClient::post(
const std::string& url,
const LLSD& body,

View File

@ -80,6 +80,14 @@ public:
ResponderPtr,
const LLSD& headers = LLSD(),
const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
static void putRaw(
const std::string& url,
const U8* data,
S32 size,
ResponderPtr responder,
const LLSD& headers = LLSD(),
const F32 timeout=HTTP_REQUEST_EXPIRY_SECS);
static void patch(
const std::string& url,

View File

@ -135,6 +135,25 @@ LLCommand * LLCommandManager::getCommand(const LLCommandId& commandId)
return command_match;
}
LLCommand * LLCommandManager::getCommand(const std::string& name)
{
LLCommand * command_match = NULL;
CommandVector::const_iterator it = mCommands.begin();
while (it != mCommands.end())
{
if ((*it)->name() == name)
{
command_match = *it;
break;
}
it++;
}
return command_match;
}
void LLCommandManager::addCommand(LLCommand * command)
{
LLCommandId command_id = command->id();

View File

@ -206,6 +206,7 @@ public:
U32 commandCount() const;
LLCommand * getCommand(U32 commandIndex);
LLCommand * getCommand(const LLCommandId& commandId);
LLCommand * getCommand(const std::string& name);
static bool load();

View File

@ -978,9 +978,6 @@ void LLFolderView::cut()
if (listener)
{
listener->cutToClipboard();
// <FS:Ansariel> Re-apply FIRE-6714: Don't move objects to trash during cut&paste
//listener->removeItem();
// </FS:Ansariel> Re-apply FIRE-6714: Don't move objects to trash during cut&paste
}
}

View File

@ -108,7 +108,8 @@ LLFolderViewItem::Params::Params()
item_height("item_height"),
item_top_pad("item_top_pad"),
creation_date(),
allow_open("allow_open", true),
allow_wear("allow_wear", true),
allow_drop("allow_drop", true),
font_color("font_color"),
font_highlight_color("font_highlight_color"),
left_pad("left_pad", 0),
@ -148,7 +149,8 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mRoot(p.root),
mViewModelItem(p.listener),
mIsMouseOverTitle(false),
mAllowOpen(p.allow_open),
mAllowWear(p.allow_wear),
mAllowDrop(p.allow_drop),
mFontColor(p.font_color),
mFontHighlightColor(p.font_highlight_color),
mLeftPad(p.left_pad),
@ -508,7 +510,7 @@ void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)
void LLFolderViewItem::openItem( void )
{
if (mAllowOpen)
if (mAllowWear || !getViewModelItem()->isItemWearable())
{
getViewModelItem()->openItem();
}
@ -1446,7 +1448,7 @@ void LLFolderViewFolder::gatherChildRangeExclusive(LLFolderViewItem* start, LLFo
{
return;
}
if (selecting)
if (selecting && (*it)->getVisible())
{
items.push_back(*it);
}
@ -1465,7 +1467,7 @@ void LLFolderViewFolder::gatherChildRangeExclusive(LLFolderViewItem* start, LLFo
return;
}
if (selecting)
if (selecting && (*it)->getVisible())
{
items.push_back(*it);
}
@ -1487,7 +1489,7 @@ void LLFolderViewFolder::gatherChildRangeExclusive(LLFolderViewItem* start, LLFo
return;
}
if (selecting)
if (selecting && (*it)->getVisible())
{
items.push_back(*it);
}
@ -1506,7 +1508,7 @@ void LLFolderViewFolder::gatherChildRangeExclusive(LLFolderViewItem* start, LLFo
return;
}
if (selecting)
if (selecting && (*it)->getVisible())
{
items.push_back(*it);
}
@ -1603,12 +1605,14 @@ void LLFolderViewFolder::destroyView()
while (!mItems.empty())
{
LLFolderViewItem *itemp = mItems.back();
mItems.pop_back();
itemp->destroyView(); // LLFolderViewItem::destroyView() removes entry from mItems
}
while (!mFolders.empty())
{
LLFolderViewFolder *folderp = mFolders.back();
mFolders.pop_back();
folderp->destroyView(); // LLFolderVievFolder::destroyView() removes entry from mFolders
}
@ -1906,9 +1910,16 @@ BOOL LLFolderViewFolder::handleDragAndDropToThisFolder(MASK mask,
EAcceptance* accept,
std::string& tooltip_msg)
{
if (!mAllowDrop)
{
*accept = ACCEPT_NO;
tooltip_msg = LLTrans::getString("TooltipOutboxCannotDropOnRoot");
return TRUE;
}
BOOL accepted = getViewModelItem()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);
if (accepted)
if (accepted)
{
mDragAndDropTarget = TRUE;
*accept = ACCEPT_YES_MULTI;

View File

@ -59,7 +59,8 @@ public:
item_top_pad;
Optional<time_t> creation_date;
Optional<bool> allow_open;
Optional<bool> allow_wear;
Optional<bool> allow_drop;
Optional<LLUIColor> font_color;
Optional<LLUIColor> font_highlight_color;
@ -121,7 +122,8 @@ protected:
mIsCurSelection,
mDragAndDropTarget,
mIsMouseOverTitle,
mAllowOpen,
mAllowWear,
mAllowDrop,
mSelectPending;
LLUIColor mFontColor;

View File

@ -174,6 +174,8 @@ public:
virtual void openItem( void ) = 0;
virtual void closeItem( void ) = 0;
virtual void selectItem(void) = 0;
virtual BOOL isItemWearable() const { return FALSE; }
virtual BOOL isItemRenameable() const = 0;
virtual BOOL renameItem(const std::string& new_name) = 0;
@ -187,7 +189,7 @@ public:
virtual BOOL isItemCopyable() const = 0;
virtual BOOL copyToClipboard() const = 0;
virtual BOOL cutToClipboard() const = 0;
virtual BOOL cutToClipboard() = 0;
virtual BOOL isClipboardPasteable() const = 0;
virtual void pasteFromClipboard() = 0;

View File

@ -378,6 +378,7 @@ set(viewer_SOURCE_FILES
llfloaterlagmeter.cpp
llfloaterland.cpp
llfloaterlandholdings.cpp
llfloatermarketplacelistings.cpp
llfloatermap.cpp
llfloatermediasettings.cpp
llfloatermemleak.cpp
@ -1122,6 +1123,7 @@ set(viewer_HEADER_FILES
llfloaterland.h
llfloaterlandholdings.h
llfloatermap.h
llfloatermarketplacelistings.h
llfloatermediasettings.h
llfloatermemleak.h
llfloatermodelpreview.h

View File

@ -124,6 +124,18 @@
tooltip_ref="Command_Marketplace_Tooltip"
execute_function="Avatar.OpenMarketplace"
/>
<command name="marketplacelistings"
available_in_toybox="true"
icon="Command_MktListings_Icon"
label_ref="Command_MarketplaceListings_Label"
tooltip_ref="Command_MarketplaceListings_Tooltip"
execute_function="Marketplace.Toggle"
execute_parameters="marketplace"
is_enabled_function="Marketplace.Enabled"
is_enabled_parameters="marketplace"
is_running_function="Floater.IsOpen"
is_running_parameters="marketplace_listings"
/>
<command name="minimap"
available_in_toybox="true"
icon="Command_MiniMap_Icon"

View File

@ -6740,17 +6740,6 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>InventoryDisplayOutbox</key>
<map>
<key>Comment</key>
<string>Override merchant inventory outbox display</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>InventoryInboxToggleState</key>
<map>
<key>Comment</key>
@ -6775,6 +6764,17 @@
<key>Backup</key>
<integer>0</integer>
</map>
<key>InventoryOutboxDisplayBoth</key>
<map>
<key>Comment</key>
<string>Show the legacy Merchant Outbox UI as well as the Marketplace Listings UI</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>InventoryOutboxLogging</key>
<map>
<key>Comment</key>
@ -6808,7 +6808,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>21</integer>
<integer>20</integer>
</map>
<key>InventoryOutboxMaxFolderDepth</key>
<map>
@ -6832,6 +6832,17 @@
<key>Value</key>
<integer>200</integer>
</map>
<key>InventoryOutboxMaxStockItemCount</key>
<map>
<key>Comment</key>
<string>Maximum number of items allowed in a stock folder.</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>200</integer>
</map>
<key>InventorySortOrder</key>
<map>
<key>Comment</key>
@ -6843,6 +6854,17 @@
<key>Value</key>
<integer>7</integer>
</map>
<key>MarketplaceListingsSortOrder</key>
<map>
<key>Comment</key>
<string>Specifies sort for marketplace listings</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>2</integer>
</map>
<key>InvertMouse</key>
<map>
<key>Comment</key>
@ -7885,6 +7907,17 @@
<key>Value</key>
<string />
</map>
<key>MarketplaceListingsLogging</key>
<map>
<key>Comment</key>
<string>Enable debug output associated with the Marketplace Listings (SLM) API.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>MarketplaceURL</key>
<map>
<key>Comment</key>

View File

@ -4484,6 +4484,12 @@ void LLAgent::handleTeleportFinished()
LLNotificationsUtil::add("PreferredMaturityChanged", args);
mIsMaturityRatingChangingDuringTeleport = false;
}
// Init SLM Marketplace connection so we know which UI should be used for the user as a merchant
// Note: Eventually, all merchant will be migrated to the new SLM system and there will be no reason to show the old UI at all.
// Note: Some regions will not support the SLM cap for a while so we need to do that check for each teleport.
// *TODO : Suppress that line from here once the whole grid migrated to SLM and move it to idle_startup() (llstartup.cpp)
check_merchant_status();
}
void LLAgent::handleTeleportFailed()

View File

@ -88,7 +88,7 @@ public:
virtual void move( LLFolderViewModelItem* parent_listener ) { }
virtual BOOL isItemCopyable() const { return FALSE; }
virtual BOOL copyToClipboard() const { return FALSE; }
virtual BOOL cutToClipboard() const { return FALSE; }
virtual BOOL cutToClipboard() { return FALSE; }
virtual BOOL isClipboardPasteable() const { return FALSE; }
virtual void pasteFromClipboard() { }
virtual void pasteLinkFromClipboard() { }

View File

@ -0,0 +1,949 @@
/**
* @file llfloatermarketplacelistings.cpp
* @brief Implementation of the marketplace listings floater and panels
* @author merov@lindenlab.com
*
* $LicenseInfo:firstyear=2001&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 "llfloatermarketplacelistings.h"
#include "llfloaterreg.h"
#include "llfiltereditor.h"
#include "llfolderview.h"
#include "llinventorybridge.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "llinventoryfunctions.h"
#include "llmarketplacefunctions.h"
#include "llnotificationhandler.h"
#include "llnotificationmanager.h"
#include "llnotificationsutil.h"
#include "llsidepaneliteminfo.h"
#include "lltextbox.h"
#include "lltrans.h"
///----------------------------------------------------------------------------
/// LLPanelMarketplaceListings
///----------------------------------------------------------------------------
static LLPanelInjector<LLPanelMarketplaceListings> t_panel_status("llpanelmarketplacelistings");
LLPanelMarketplaceListings::LLPanelMarketplaceListings()
: mRootFolder(NULL)
, mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME)
, mFilterListingFoldersOnly(false)
{
mCommitCallbackRegistrar.add("Marketplace.ViewSort.Action", boost::bind(&LLPanelMarketplaceListings::onViewSortMenuItemClicked, this, _2));
mEnableCallbackRegistrar.add("Marketplace.ViewSort.CheckItem", boost::bind(&LLPanelMarketplaceListings::onViewSortMenuItemCheck, this, _2));
}
BOOL LLPanelMarketplaceListings::postBuild()
{
childSetAction("add_btn", boost::bind(&LLPanelMarketplaceListings::onAddButtonClicked, this));
childSetAction("audit_btn", boost::bind(&LLPanelMarketplaceListings::onAuditButtonClicked, this));
mFilterEditor = getChild<LLFilterEditor>("filter_editor");
mFilterEditor->setCommitCallback(boost::bind(&LLPanelMarketplaceListings::onFilterEdit, this, _2));
mAuditBtn = getChild<LLButton>("audit_btn");
mAuditBtn->setEnabled(FALSE);
return LLPanel::postBuild();
}
BOOL LLPanelMarketplaceListings::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg)
{
LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
BOOL handled = (handled_view != NULL);
// Special case the drop zone
if (handled && (handled_view->getName() == "marketplace_drop_zone"))
{
LLFolderView* root_folder = getRootFolder();
handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
}
return handled;
}
void LLPanelMarketplaceListings::buildAllPanels()
{
// Build the All panel first
LLInventoryPanel* panel_all_items;
panel_all_items = buildInventoryPanel("All Items", "panel_marketplace_listings_inventory.xml");
panel_all_items->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
panel_all_items->getFilter().markDefault();
// Build the other panels
LLInventoryPanel* panel;
panel = buildInventoryPanel("Active Items", "panel_marketplace_listings_listed.xml");
panel->getFilter().setFilterMarketplaceActiveFolders();
panel->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
panel->getFilter().markDefault();
panel = buildInventoryPanel("Inactive Items", "panel_marketplace_listings_unlisted.xml");
panel->getFilter().setFilterMarketplaceInactiveFolders();
panel->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
panel->getFilter().markDefault();
panel = buildInventoryPanel("Unassociated Items", "panel_marketplace_listings_unassociated.xml");
panel->getFilter().setFilterMarketplaceUnassociatedFolders();
panel->getFilter().setEmptyLookupMessage("MarketplaceNoMatchingItems");
panel->getFilter().markDefault();
// Set the tab panel
LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
tabs_panel->setCommitCallback(boost::bind(&LLPanelMarketplaceListings::onTabChange, this));
tabs_panel->selectTabPanel(panel_all_items); // All panel selected by default
mRootFolder = panel_all_items->getRootFolder(); // Keep the root of the all panel
// Set the default sort order
setSortOrder(gSavedSettings.getU32("MarketplaceListingsSortOrder"));
}
LLInventoryPanel* LLPanelMarketplaceListings::buildInventoryPanel(const std::string& childname, const std::string& filename)
{
LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
LLInventoryPanel* panel = LLUICtrlFactory::createFromFile<LLInventoryPanel>(filename, tabs_panel, LLInventoryPanel::child_registry_t::instance());
llassert(panel != NULL);
// Set sort order and callbacks
panel = getChild<LLInventoryPanel>(childname);
panel->getFolderViewModel()->setSorter(LLInventoryFilter::SO_FOLDERS_BY_NAME);
panel->setSelectCallback(boost::bind(&LLPanelMarketplaceListings::onSelectionChange, this, panel, _1, _2));
return panel;
}
void LLPanelMarketplaceListings::setSortOrder(U32 sort_order)
{
mSortOrder = sort_order;
gSavedSettings.setU32("MarketplaceListingsSortOrder", sort_order);
// Set each panel with that sort order
LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
LLInventoryPanel* panel = (LLInventoryPanel*)tabs_panel->getPanelByName("All Items");
panel->setSortOrder(mSortOrder);
panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Active Items");
panel->setSortOrder(mSortOrder);
panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Inactive Items");
panel->setSortOrder(mSortOrder);
panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Unassociated Items");
panel->setSortOrder(mSortOrder);
}
void LLPanelMarketplaceListings::onFilterEdit(const std::string& search_string)
{
// Find active panel
LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
if (panel)
{
// Save filter string (needed when switching tabs)
mFilterSubString = search_string;
// Set filter string on active panel
panel->setFilterSubString(mFilterSubString);
}
}
void LLPanelMarketplaceListings::draw()
{
if (LLMarketplaceData::instance().checkDirtyCount())
{
update_all_marketplace_count();
}
// Get the audit button enabled only after the whole inventory is fetched
if (!mAuditBtn->getEnabled())
{
mAuditBtn->setEnabled(LLInventoryModelBackgroundFetch::instance().isEverythingFetched());
}
LLPanel::draw();
}
void LLPanelMarketplaceListings::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action)
{
panel->onSelectionChange(items, user_action);
}
bool LLPanelMarketplaceListings::allowDropOnRoot()
{
LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
return (panel ? panel->getAllowDropOnRoot() : false);
}
void LLPanelMarketplaceListings::onTabChange()
{
// Find active panel
LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
if (panel)
{
// If the panel doesn't allow drop on root, it doesn't allow the creation of new folder on root either
LLButton* add_btn = getChild<LLButton>("add_btn");
add_btn->setEnabled(panel->getAllowDropOnRoot());
// Set filter string on active panel
panel->setFilterSubString(mFilterSubString);
// Show/hide the drop zone and resize the inventory tabs panel accordingly
LLPanel* drop_zone = (LLPanel*)getChild<LLPanel>("marketplace_drop_zone");
bool drop_zone_visible = drop_zone->getVisible();
if (drop_zone_visible != panel->getAllowDropOnRoot())
{
LLPanel* tabs = (LLPanel*)getChild<LLPanel>("tab_container_panel");
S32 delta_height = drop_zone->getRect().getHeight();
delta_height = (drop_zone_visible ? delta_height : -delta_height);
tabs->reshape(tabs->getRect().getWidth(),tabs->getRect().getHeight() + delta_height);
tabs->translate(0,-delta_height);
}
drop_zone->setVisible(panel->getAllowDropOnRoot());
}
}
void LLPanelMarketplaceListings::onAddButtonClicked()
{
// Find active panel
LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
if (panel)
{
LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
llassert(marketplacelistings_id.notNull());
LLFolderType::EType preferred_type = LLFolderType::lookup("category");
LLUUID category = gInventory.createNewCategory(marketplacelistings_id, preferred_type, LLStringUtil::null);
gInventory.notifyObservers();
panel->setSelectionByID(category, TRUE);
panel->getRootFolder()->setNeedsAutoRename(TRUE);
}
}
void LLPanelMarketplaceListings::onAuditButtonClicked()
{
LLSD data(LLSD::emptyMap());
LLFloaterReg::showInstance("marketplace_validation", data);
}
void LLPanelMarketplaceListings::onViewSortMenuItemClicked(const LLSD& userdata)
{
std::string chosen_item = userdata.asString();
// Sort options
if ((chosen_item == "sort_by_stock_amount") || (chosen_item == "sort_by_name") || (chosen_item == "sort_by_recent"))
{
// We're making sort options exclusive, default is SO_FOLDERS_BY_NAME
if (chosen_item == "sort_by_stock_amount")
{
setSortOrder(LLInventoryFilter::SO_FOLDERS_BY_WEIGHT);
}
else if (chosen_item == "sort_by_name")
{
setSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME);
}
else if (chosen_item == "sort_by_recent")
{
setSortOrder(LLInventoryFilter::SO_DATE);
}
}
// Filter option
else if (chosen_item == "show_only_listing_folders")
{
mFilterListingFoldersOnly = !mFilterListingFoldersOnly;
// Set each panel with that filter flag
LLTabContainer* tabs_panel = getChild<LLTabContainer>("marketplace_filter_tabs");
LLInventoryPanel* panel = (LLInventoryPanel*)tabs_panel->getPanelByName("All Items");
panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Active Items");
panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Inactive Items");
panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
panel = (LLInventoryPanel*)tabs_panel->getPanelByName("Unassociated Items");
panel->getFilter().setFilterMarketplaceListingFolders(mFilterListingFoldersOnly);
}
}
bool LLPanelMarketplaceListings::onViewSortMenuItemCheck(const LLSD& userdata)
{
std::string chosen_item = userdata.asString();
if ((chosen_item == "sort_by_stock_amount") || (chosen_item == "sort_by_name") || (chosen_item == "sort_by_recent"))
{
if (chosen_item == "sort_by_stock_amount")
{
return (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_WEIGHT);
}
else if (chosen_item == "sort_by_name")
{
return (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME);
}
else if (chosen_item == "sort_by_recent")
{
return (mSortOrder & LLInventoryFilter::SO_DATE);
}
}
else if (chosen_item == "show_only_listing_folders")
{
return mFilterListingFoldersOnly;
}
return false;
}
///----------------------------------------------------------------------------
/// LLMarketplaceListingsAddedObserver helper class
///----------------------------------------------------------------------------
class LLMarketplaceListingsAddedObserver : public LLInventoryCategoryAddedObserver
{
public:
LLMarketplaceListingsAddedObserver(LLFloaterMarketplaceListings * marketplace_listings_floater)
: LLInventoryCategoryAddedObserver()
, mMarketplaceListingsFloater(marketplace_listings_floater)
{
}
void done()
{
for (cat_vec_t::iterator it = mAddedCategories.begin(); it != mAddedCategories.end(); ++it)
{
LLViewerInventoryCategory* added_category = *it;
LLFolderType::EType added_category_type = added_category->getPreferredType();
if (added_category_type == LLFolderType::FT_MARKETPLACE_LISTINGS)
{
mMarketplaceListingsFloater->initializeMarketPlace();
}
}
}
private:
LLFloaterMarketplaceListings * mMarketplaceListingsFloater;
};
///----------------------------------------------------------------------------
/// LLFloaterMarketplaceListings
///----------------------------------------------------------------------------
LLFloaterMarketplaceListings::LLFloaterMarketplaceListings(const LLSD& key)
: LLFloater(key)
, mCategoriesObserver(NULL)
, mCategoryAddedObserver(NULL)
, mRootFolderId(LLUUID::null)
, mInventoryStatus(NULL)
, mInventoryInitializationInProgress(NULL)
, mInventoryPlaceholder(NULL)
, mInventoryText(NULL)
, mInventoryTitle(NULL)
, mPanelListings(NULL)
, mPanelListingsSet(false)
{
}
LLFloaterMarketplaceListings::~LLFloaterMarketplaceListings()
{
if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
}
delete mCategoriesObserver;
if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
{
gInventory.removeObserver(mCategoryAddedObserver);
}
delete mCategoryAddedObserver;
}
BOOL LLFloaterMarketplaceListings::postBuild()
{
mInventoryStatus = getChild<LLTextBox>("marketplace_status");
mInventoryInitializationInProgress = getChild<LLView>("initialization_progress_indicator");
mInventoryPlaceholder = getChild<LLView>("marketplace_listings_inventory_placeholder_panel");
mInventoryText = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_text");
mInventoryTitle = mInventoryPlaceholder->getChild<LLTextBox>("marketplace_listings_inventory_placeholder_title");
mPanelListings = static_cast<LLPanelMarketplaceListings*>(getChild<LLUICtrl>("panel_marketplace_listing"));
LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLFloaterMarketplaceListings::onFocusReceived, this));
// Observe category creation to catch marketplace listings creation (moot if already existing)
mCategoryAddedObserver = new LLMarketplaceListingsAddedObserver(this);
gInventory.addObserver(mCategoryAddedObserver);
// Fetch aggressively so we can interact with listings right onOpen()
fetchContents();
return TRUE;
}
void LLFloaterMarketplaceListings::onClose(bool app_quitting)
{
}
void LLFloaterMarketplaceListings::onOpen(const LLSD& key)
{
//
// Initialize the Market Place or go update the marketplace listings
//
if (LLMarketplaceData::instance().getSLMStatus() <= MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE)
{
initializeMarketPlace();
}
else
{
updateView();
}
}
void LLFloaterMarketplaceListings::onFocusReceived()
{
updateView();
}
void LLFloaterMarketplaceListings::fetchContents()
{
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);
LLMarketplaceData::instance().getSLMListings();
}
}
void LLFloaterMarketplaceListings::setRootFolder()
{
if ((LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_MERCHANT) &&
(LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT))
{
// If we are *not* a merchant or we have no market place connection established yet, do nothing
return;
}
// We are a merchant. Get the Marketplace listings folder, create it if needs be.
LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, true);
if (marketplacelistings_id.isNull())
{
// We should never get there unless the inventory fails badly
LL_ERRS("SLM") << "Inventory problem: failure to create the marketplace listings folder for a merchant!" << LL_ENDL;
return;
}
// No longer need to observe new category creation
if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
{
gInventory.removeObserver(mCategoryAddedObserver);
delete mCategoryAddedObserver;
mCategoryAddedObserver = NULL;
}
llassert(!mCategoryAddedObserver);
if (marketplacelistings_id == mRootFolderId)
{
LL_WARNS("SLM") << "Inventory warning: Marketplace listings folder already set" << LL_ENDL;
return;
}
mRootFolderId = marketplacelistings_id;
}
void LLFloaterMarketplaceListings::setPanels()
{
if (mRootFolderId.isNull())
{
return;
}
// Consolidate Marketplace listings
// We shouldn't have to do that but with a client/server system relying on a "well known folder" convention,
// things get messy and conventions get broken down eventually
gInventory.consolidateForType(mRootFolderId, LLFolderType::FT_MARKETPLACE_LISTINGS);
// Now that we do have a non NULL root, we can build the inventory panels
mPanelListings->buildAllPanels();
// Create observer for marketplace listings modifications
if (!mCategoriesObserver)
{
mCategoriesObserver = new LLInventoryCategoriesObserver();
llassert(mCategoriesObserver);
gInventory.addObserver(mCategoriesObserver);
mCategoriesObserver->addCategory(mRootFolderId, boost::bind(&LLFloaterMarketplaceListings::onChanged, this));
}
// Get the content of the marketplace listings folder
fetchContents();
// Flag that this is done
mPanelListingsSet = true;
}
void LLFloaterMarketplaceListings::initializeMarketPlace()
{
LLMarketplaceData::instance().initializeSLM(boost::bind(&LLFloaterMarketplaceListings::updateView, this));
}
S32 LLFloaterMarketplaceListings::getFolderCount()
{
if (mPanelListings && mRootFolderId.notNull())
{
LLInventoryModel::cat_array_t * cats;
LLInventoryModel::item_array_t * items;
gInventory.getDirectDescendentsOf(mRootFolderId, cats, items);
return (cats->size() + items->size());
}
else
{
return 0;
}
}
void LLFloaterMarketplaceListings::setStatusString(const std::string& statusString)
{
mInventoryStatus->setText(statusString);
}
void LLFloaterMarketplaceListings::updateView()
{
U32 mkt_status = LLMarketplaceData::instance().getSLMStatus();
bool is_merchant = (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT) || (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT);
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() && is_merchant)
{
setRootFolder();
}
// Update the bottom initializing status and progress dial if we are initializing or if we're a merchant and still loading
if ((mkt_status <= MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING) || (is_merchant && (data_fetched <= MarketplaceFetchCodes::MARKET_FETCH_LOADING)) )
{
// 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
{
mInventoryInitializationInProgress->setVisible(false);
}
// Update the middle portion : tabs or messages
if (getFolderCount() > 0)
{
if (!mPanelListingsSet)
{
// We need to rebuild the tabs cleanly the first time we make them visible
setPanels();
}
mPanelListings->setVisible(TRUE);
mInventoryPlaceholder->setVisible(FALSE);
}
else
{
mPanelListings->setVisible(FALSE);
mInventoryPlaceholder->setVisible(TRUE);
std::string text;
std::string title;
std::string tooltip;
const LLSD& subs = getMarketplaceStringSubstitutions();
// Update the top message or flip to the tabs and folders view
// *TODO : check those messages and create better appropriate ones in strings.xml
if (mRootFolderId.notNull())
{
// "Marketplace listings is empty!" message strings
text = LLTrans::getString("InventoryMarketplaceListingsNoItems", subs);
title = LLTrans::getString("InventoryMarketplaceListingsNoItemsTitle");
tooltip = LLTrans::getString("InventoryMarketplaceListingsNoItemsTooltip");
}
else if (mkt_status <= MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING)
{
// "Initializing!" message strings
text = LLTrans::getString("InventoryOutboxInitializing", subs);
title = LLTrans::getString("InventoryOutboxInitializingTitle");
tooltip = LLTrans::getString("InventoryOutboxInitializingTooltip");
}
else if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT)
{
// "Not a merchant!" message strings
text = LLTrans::getString("InventoryOutboxNotMerchant", subs);
title = LLTrans::getString("InventoryOutboxNotMerchantTitle");
tooltip = LLTrans::getString("InventoryOutboxNotMerchantTooltip");
}
else
{
// "Errors!" message strings
text = LLTrans::getString("InventoryMarketplaceError", subs);
title = LLTrans::getString("InventoryOutboxErrorTitle");
tooltip = LLTrans::getString("InventoryOutboxErrorTooltip");
}
mInventoryText->setValue(text);
mInventoryTitle->setValue(title);
mInventoryPlaceholder->getParent()->setToolTip(tooltip);
}
}
bool LLFloaterMarketplaceListings::isAccepted(EAcceptance accept)
{
return (accept >= ACCEPT_YES_COPY_SINGLE);
}
BOOL LLFloaterMarketplaceListings::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg)
{
// If there's no panel to accept drops or no existing marketplace listings folder, we refuse all drop
if (!mPanelListings || mRootFolderId.isNull())
{
return FALSE;
}
tooltip_msg = "";
// Pass to the children
LLView * handled_view = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
BOOL handled = (handled_view != NULL);
// If no one handled it or it was not accepted and we drop on an empty panel, we try to accept it at the floater level
// as if it was dropped on the marketplace listings root folder
if ((!handled || !isAccepted(*accept)) && !mPanelListings->getVisible() && mRootFolderId.notNull())
{
if (!mPanelListingsSet)
{
setPanels();
}
LLFolderView* root_folder = mPanelListings->getRootFolder();
handled = root_folder->handleDragAndDropToThisFolder(mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
}
return handled;
}
BOOL LLFloaterMarketplaceListings::handleHover(S32 x, S32 y, MASK mask)
{
return LLFloater::handleHover(x, y, mask);
}
void LLFloaterMarketplaceListings::onMouseLeave(S32 x, S32 y, MASK mask)
{
LLFloater::onMouseLeave(x, y, mask);
}
void LLFloaterMarketplaceListings::onChanged()
{
LLViewerInventoryCategory* category = gInventory.getCategory(mRootFolderId);
if (mRootFolderId.notNull() && category)
{
updateView();
}
else
{
// Invalidate the marketplace listings data
mRootFolderId.setNull();
}
}
//-----------------------------------------------------------------------------
// LLFloaterAssociateListing
//-----------------------------------------------------------------------------
// Tell if a listing has one only version folder
bool hasUniqueVersionFolder(const LLUUID& folder_id)
{
LLInventoryModel::cat_array_t* categories;
LLInventoryModel::item_array_t* items;
gInventory.getDirectDescendentsOf(folder_id, categories, items);
return (categories->size() == 1);
}
LLFloaterAssociateListing::LLFloaterAssociateListing(const LLSD& key)
: LLFloater(key)
, mUUID()
{
}
LLFloaterAssociateListing::~LLFloaterAssociateListing()
{
gFocusMgr.releaseFocusIfNeeded( this );
}
BOOL LLFloaterAssociateListing::postBuild()
{
getChild<LLButton>("OK")->setCommitCallback(boost::bind(&LLFloaterAssociateListing::apply, this, TRUE));
getChild<LLButton>("Cancel")->setCommitCallback(boost::bind(&LLFloaterAssociateListing::cancel, this));
getChild<LLLineEditor>("listing_id")->setPrevalidate(&LLTextValidate::validateNonNegativeS32);
center();
return LLFloater::postBuild();
}
BOOL LLFloaterAssociateListing::handleKeyHere(KEY key, MASK mask)
{
if (key == KEY_RETURN && mask == MASK_NONE)
{
apply();
return TRUE;
}
else if (key == KEY_ESCAPE && mask == MASK_NONE)
{
cancel();
return TRUE;
}
return LLFloater::handleKeyHere(key, mask);
}
// static
LLFloaterAssociateListing* LLFloaterAssociateListing::show(const LLUUID& folder_id)
{
LLFloaterAssociateListing* floater = LLFloaterReg::showTypedInstance<LLFloaterAssociateListing>("associate_listing");
floater->mUUID = folder_id;
return floater;
}
// Callback for apply if DAMA required...
void LLFloaterAssociateListing::callback_apply(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option == 0) // YES
{
apply(FALSE);
}
}
void LLFloaterAssociateListing::apply(BOOL user_confirm)
{
if (mUUID.notNull())
{
S32 id = (S32)getChild<LLUICtrl>("listing_id")->getValue().asInteger();
if (id > 0)
{
// Check if the id exists in the merchant SLM DB: note that this record might exist in the LLMarketplaceData
// structure even if unseen in the UI, for instance, if its listing_uuid doesn't exist in the merchant inventory
LLUUID listing_uuid = LLMarketplaceData::instance().getListingFolder(id);
if (listing_uuid.notNull() && user_confirm && LLMarketplaceData::instance().getActivationState(listing_uuid) && !hasUniqueVersionFolder(mUUID))
{
// Look for user confirmation before unlisting
LLNotificationsUtil::add("ConfirmMerchantUnlist", LLSD(), LLSD(), boost::bind(&LLFloaterAssociateListing::callback_apply, this, _1, _2));
return;
}
// Associate the id with the user chosen folder
LLMarketplaceData::instance().associateListing(mUUID,listing_uuid,id);
}
else
{
LLNotificationsUtil::add("AlertMerchantListingInvalidID");
}
}
closeFloater();
}
void LLFloaterAssociateListing::cancel()
{
closeFloater();
}
//-----------------------------------------------------------------------------
// LLFloaterMarketplaceValidation
//-----------------------------------------------------------------------------
// Note: The key is the UUID of the folder to validate.
// Validates the whole marketplace listings content if UUID is null.
LLFloaterMarketplaceValidation::LLFloaterMarketplaceValidation(const LLSD& key)
: LLFloater(key),
mEditor(NULL)
{
}
BOOL LLFloaterMarketplaceValidation::postBuild()
{
childSetAction("OK", onOK, this);
// This widget displays the validation messages
mEditor = getChild<LLTextEditor>("validation_text");
mEditor->setEnabled(FALSE);
mEditor->setFocus(TRUE);
mEditor->setValue(LLSD());
return TRUE;
}
LLFloaterMarketplaceValidation::~LLFloaterMarketplaceValidation()
{
}
// virtual
void LLFloaterMarketplaceValidation::draw()
{
// draw children
LLFloater::draw();
}
void LLFloaterMarketplaceValidation::onOpen(const LLSD& key)
{
// Clear the messages
clearMessages();
// Get the folder UUID to validate. Use the whole marketplace listing if none provided.
LLUUID cat_id(key.asUUID());
if (cat_id.isNull())
{
cat_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
}
// Validates the folder
if (cat_id.notNull())
{
LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
validate_marketplacelistings(cat, boost::bind(&LLFloaterMarketplaceValidation::appendMessage, this, _1, _2, _3), false);
}
// Handle the listing folder being processed
handleCurrentListing();
// Dump result to the editor panel
if (mEditor)
{
mEditor->setValue(LLSD());
if (mMessages.empty())
{
// Display a no error message
mEditor->appendText(LLTrans::getString("Marketplace Validation No Error"), false);
}
else
{
// Print out all the messages to the panel
message_list_t::iterator mCurrentLine = mMessages.begin();
bool new_line = false;
while (mCurrentLine != mMessages.end())
{
// Errors are printed in bold, other messages in normal font
LLStyle::Params style;
LLFontDescriptor new_desc(mEditor->getFont()->getFontDesc());
new_desc.setStyle(mCurrentLine->mErrorLevel == LLError::LEVEL_ERROR ? LLFontGL::BOLD : LLFontGL::NORMAL);
LLFontGL* new_font = LLFontGL::getFont(new_desc);
style.font = new_font;
mEditor->appendText(mCurrentLine->mMessage, new_line, style);
new_line = true;
mCurrentLine++;
}
}
}
// We don't need the messages anymore
clearMessages();
}
// static
void LLFloaterMarketplaceValidation::onOK( void* userdata )
{
// destroys this object
LLFloaterMarketplaceValidation* self = (LLFloaterMarketplaceValidation*) userdata;
self->clearMessages();
self->closeFloater();
}
void LLFloaterMarketplaceValidation::appendMessage(std::string& message, S32 depth, LLError::ELevel log_level)
{
// Dump previous listing messages if we're starting a new listing
if (depth == 1)
{
handleCurrentListing();
}
// Store the message in the current listing message list
Message current_message;
current_message.mErrorLevel = log_level;
current_message.mMessage = message;
mCurrentListingMessages.push_back(current_message);
mCurrentListingErrorLevel = (mCurrentListingErrorLevel < log_level ? log_level : mCurrentListingErrorLevel);
}
// Move the current listing messages to the general list if needs be and reset the current listing data
void LLFloaterMarketplaceValidation::handleCurrentListing()
{
// Dump the current folder messages to the general message list if level warrants it
if (mCurrentListingErrorLevel > LLError::LEVEL_INFO)
{
message_list_t::iterator mCurrentLine = mCurrentListingMessages.begin();
while (mCurrentLine != mCurrentListingMessages.end())
{
mMessages.push_back(*mCurrentLine);
mCurrentLine++;
}
}
// Reset the current listing
mCurrentListingMessages.clear();
mCurrentListingErrorLevel = LLError::LEVEL_INFO;
}
void LLFloaterMarketplaceValidation::clearMessages()
{
mMessages.clear();
mCurrentListingMessages.clear();
mCurrentListingErrorLevel = LLError::LEVEL_INFO;
}
//-----------------------------------------------------------------------------
// LLFloaterItemProperties
//-----------------------------------------------------------------------------
LLFloaterItemProperties::LLFloaterItemProperties(const LLSD& key)
: LLFloater(key)
{
}
LLFloaterItemProperties::~LLFloaterItemProperties()
{
}
BOOL LLFloaterItemProperties::postBuild()
{
// On the standalone properties floater, we have no need for a back button...
LLSidepanelItemInfo* panel = getChild<LLSidepanelItemInfo>("item_panel");
LLButton* back_btn = panel->getChild<LLButton>("back_btn");
back_btn->setVisible(FALSE);
return LLFloater::postBuild();
}
void LLFloaterItemProperties::onOpen(const LLSD& key)
{
// Tell the panel which item it needs to visualize
LLSidepanelItemInfo* panel = getChild<LLSidepanelItemInfo>("item_panel");
panel->setItemID(key["id"].asUUID());
}

View File

@ -0,0 +1,226 @@
/**
* @file llfloatermarketplacelistings.h
* @brief Implementation of the marketplace listings floater and panels
* @author merov@lindenlab.com
*
* $LicenseInfo:firstyear=2001&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
* ABILITY 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_LLFLOATERMARKETPLACELISTINGS_H
#define LL_LLFLOATERMARKETPLACELISTINGS_H
#include "llfloater.h"
#include "llinventoryfilter.h"
#include "llinventorypanel.h"
#include "llnotificationptr.h"
#include "llmodaldialog.h"
#include "lltexteditor.h"
class LLInventoryCategoriesObserver;
class LLInventoryCategoryAddedObserver;
class LLTextBox;
class LLView;
class LLFilterEditor;
class LLFloaterMarketplaceListings;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLPanelMarketplaceListings
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLPanelMarketplaceListings : public LLPanel
{
public:
LLPanelMarketplaceListings();
BOOL postBuild();
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
void draw();
LLFolderView* getRootFolder() { return mRootFolder; }
bool allowDropOnRoot();
void buildAllPanels();
private:
LLInventoryPanel* buildInventoryPanel(const std::string& childname, const std::string& filename);
// UI callbacks
void onViewSortMenuItemClicked(const LLSD& userdata);
bool onViewSortMenuItemCheck(const LLSD& userdata);
void onAddButtonClicked();
void onAuditButtonClicked();
void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action);
void onTabChange();
void onFilterEdit(const std::string& search_string);
void setSortOrder(U32 sort_order);
LLFolderView* mRootFolder;
LLButton* mAuditBtn;
LLFilterEditor* mFilterEditor;
std::string mFilterSubString;
bool mFilterListingFoldersOnly;
U32 mSortOrder;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFloaterMarketplaceListings
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFloaterMarketplaceListings : public LLFloater
{
public:
LLFloaterMarketplaceListings(const LLSD& key);
~LLFloaterMarketplaceListings();
void initializeMarketPlace();
// virtuals
BOOL postBuild();
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
void showNotification(const LLNotificationPtr& notification);
BOOL handleHover(S32 x, S32 y, MASK mask);
void onMouseLeave(S32 x, S32 y, MASK mask);
protected:
void setRootFolder();
void setPanels();
void fetchContents();
void setStatusString(const std::string& statusString);
void onClose(bool app_quitting);
void onOpen(const LLSD& key);
void onFocusReceived();
void onChanged();
bool isAccepted(EAcceptance accept);
void updateView();
private:
S32 getFolderCount();
LLInventoryCategoriesObserver * mCategoriesObserver;
LLInventoryCategoryAddedObserver * mCategoryAddedObserver;
LLTextBox * mInventoryStatus;
LLView * mInventoryInitializationInProgress;
LLView * mInventoryPlaceholder;
LLTextBox * mInventoryText;
LLTextBox * mInventoryTitle;
LLUUID mRootFolderId;
LLPanelMarketplaceListings * mPanelListings;
bool mPanelListingsSet;
};
//-----------------------------------------------------------------------------
// LLFloaterAssociateListing
//-----------------------------------------------------------------------------
class LLFloaterAssociateListing : public LLFloater
{
friend class LLFloaterReg;
public:
virtual BOOL postBuild();
virtual BOOL handleKeyHere(KEY key, MASK mask);
static LLFloaterAssociateListing* show(const LLUUID& folder_id);
private:
LLFloaterAssociateListing(const LLSD& key);
virtual ~LLFloaterAssociateListing();
// UI Callbacks
void apply(BOOL user_confirm = TRUE);
void cancel();
void callback_apply(const LLSD& notification, const LLSD& response);
LLUUID mUUID;
};
//-----------------------------------------------------------------------------
// LLFloaterMarketplaceValidation
//-----------------------------------------------------------------------------
// Note: The key is the UUID of the folder to validate. Validates the whole
// marketplace listings content if UUID is null.
// Note: For the moment, we just display the validation text. Eventually, we should
// get the validation triggered on the server and display the html report.
// *TODO : morph into an html/text window using the pattern in llfloatertos
class LLFloaterMarketplaceValidation : public LLFloater
{
public:
LLFloaterMarketplaceValidation(const LLSD& key);
virtual ~LLFloaterMarketplaceValidation();
virtual BOOL postBuild();
virtual void draw();
virtual void onOpen(const LLSD& key);
void clearMessages();
void appendMessage(std::string& message, S32 depth, LLError::ELevel log_level);
static void onOK( void* userdata );
private:
struct Message {
LLError::ELevel mErrorLevel;
std::string mMessage;
};
typedef std::vector<Message> message_list_t;
void handleCurrentListing();
message_list_t mCurrentListingMessages;
LLError::ELevel mCurrentListingErrorLevel;
message_list_t mMessages;
LLTextEditor* mEditor;
};
//-----------------------------------------------------------------------------
// LLFloaterItemProperties
//-----------------------------------------------------------------------------
class LLFloaterItemProperties : public LLFloater
{
public:
LLFloaterItemProperties(const LLSD& key);
virtual ~LLFloaterItemProperties();
BOOL postBuild();
virtual void onOpen(const LLSD& key);
private:
};
#endif // LL_LLFLOATERMARKETPLACELISTINGS_H

View File

@ -160,6 +160,12 @@ BOOL LLFloaterOutbox::postBuild()
mCategoryAddedObserver = new LLOutboxAddedObserver(this);
gInventory.addObserver(mCategoryAddedObserver);
// Setup callbacks for importer
LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
importer.setInitializationErrorCallback(boost::bind(&LLFloaterOutbox::initializationReportError, this, _1, _2));
importer.setStatusChangedCallback(boost::bind(&LLFloaterOutbox::importStatusChanged, this, _1));
importer.setStatusReportCallback(boost::bind(&LLFloaterOutbox::importReportResults, this, _1, _2));
return TRUE;
}
@ -298,12 +304,8 @@ void LLFloaterOutbox::initializeMarketPlace()
// Initialize the marketplace import API
//
LLMarketplaceInventoryImporter& importer = LLMarketplaceInventoryImporter::instance();
if (!importer.isInitialized())
{
importer.setInitializationErrorCallback(boost::bind(&LLFloaterOutbox::initializationReportError, this, _1, _2));
importer.setStatusChangedCallback(boost::bind(&LLFloaterOutbox::importStatusChanged, this, _1));
importer.setStatusReportCallback(boost::bind(&LLFloaterOutbox::importReportResults, this, _1, _2));
importer.initialize();
}
}
@ -516,7 +518,7 @@ void LLFloaterOutbox::onImportButtonClicked()
{
mOutboxInventoryPanel.get()->clearSelection();
}
mImportBusy = LLMarketplaceInventoryImporter::instance().triggerImport();
}
@ -617,3 +619,5 @@ void LLFloaterOutbox::showNotification(const LLNotificationPtr& notification)
notification_handler->processNotification(notification);
}

View File

@ -1,7 +1,6 @@
/**
* @file llfloateroutbox.h
* @brief LLFloaterOutbox
* class definition
* @brief Implementation of the merchant outbox window
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
@ -30,6 +29,7 @@
#include "llfloater.h"
#include "llfoldertype.h"
#include "llinventoryfilter.h"
#include "llnotificationptr.h"

View File

@ -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"
@ -277,7 +278,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())
{
@ -309,6 +310,31 @@ 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 == weight_b)
{
// Equal weight -> use alphabetical order
return (LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()) < 0);
}
else if (weight_a == COMPUTE_STOCK_INFINITE)
{
// No stock -> move a at the end of the list
return false;
}
else if (weight_b == COMPUTE_STOCK_INFINITE)
{
// No stock -> 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();

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -77,6 +77,7 @@ public:
bool canShare() const;
bool canListOnMarketplace() const;
bool canListOnOutboxNow() const;
bool canListOnMarketplaceNow() const;
//--------------------------------------------------------------------
@ -118,7 +119,7 @@ public:
virtual bool isItemLinkable() const { return FALSE; }
// [/SL:KB]
virtual BOOL copyToClipboard() const;
virtual BOOL cutToClipboard() const;
virtual BOOL cutToClipboard();
virtual BOOL isClipboardPasteable() const;
virtual BOOL isClipboardPasteableAsLink() const;
virtual void pasteFromClipboard() {}
@ -150,6 +151,9 @@ protected:
virtual void addOutboxContextMenuOptions(U32 flags,
menuentry_vec_t &items,
menuentry_vec_t &disabled_items);
virtual void addMarketplaceContextMenuOptions(U32 flags,
menuentry_vec_t &items,
menuentry_vec_t &disabled_items);
protected:
LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid);
@ -170,6 +174,7 @@ protected:
// </FS:TT>
BOOL isInboxFolder() const; // true if COF or descendent of marketplace inbox
BOOL isOutboxFolderDirectParent() const;
BOOL isMarketplaceListingsFolder() const; // true if descendant of Marketplace listings folder
const LLUUID getOutboxFolder() const;
// <FS:Ansariel> Inventory Links Replace
@ -188,6 +193,9 @@ protected:
const LLUUID& new_parent,
BOOL restamp);
void removeBatchNoCheck(std::vector<LLFolderViewModelItem*>& batch);
BOOL callback_cutToClipboard(const LLSD& notification, const LLSD& response);
BOOL perform_cutToClipboard();
public:
BOOL isOutboxFolder() const; // true if COF or descendant of marketplace outbox
@ -203,6 +211,7 @@ protected:
mutable std::string mSearchableName;
void purgeItem(LLInventoryModel *model, const LLUUID &uuid);
void removeObject(LLInventoryModel *model, const LLUUID &uuid);
virtual void buildDisplayName() const {}
// <FS:ND> Reintegrate search by uuid/creator/descripting from Zi Ree after CHUI Merge
@ -290,8 +299,10 @@ public:
mIsLoading(false)
{}
BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg);
BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg);
BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg, BOOL user_confirm = TRUE);
BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg, BOOL user_confirm = TRUE);
void callback_dropItemIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryItem* inv_item);
void callback_dropCategoryIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryCategory* inv_category);
virtual void buildDisplayName() const;
@ -306,10 +317,9 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual LLUIImagePtr getIconOpen() const;
virtual LLUIImagePtr getIconOverlay() const;
static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
virtual std::string getLabelSuffix() const;
virtual LLFontGL::StyleFlags getLabelStyle() const;
virtual BOOL renameItem(const std::string& new_name);
@ -390,12 +400,17 @@ public:
static LLHandle<LLFolderBridge> sSelf;
static void staticFolderOptionsMenu();
private:
protected:
void callback_pasteFromClipboard(const LLSD& notification, const LLSD& response);
void perform_pasteFromClipboard();
void gatherMessage(std::string& message, S32 depth, LLError::ELevel log_level);
LLUIImagePtr getFolderIcon(BOOL is_open) const;
bool mCallingCards;
bool mWearables;
bool mIsLoading;
LLTimer mTimeSinceRequestStart;
std::string mMessage;
LLRootHandle<LLFolderBridge> mHandle;
};
@ -476,6 +491,7 @@ public:
const LLUUID& uuid) :
LLItemBridge(inventory, root, uuid) {}
virtual void openItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
};
class LLGestureBridge : public LLItemBridge
@ -519,6 +535,7 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
virtual BOOL isItemWearable() const { return TRUE; }
virtual std::string getLabelSuffix() const;
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual BOOL renameItem(const std::string& new_name);
@ -551,6 +568,7 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
virtual BOOL isItemWearable() const { return TRUE; }
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual std::string getLabelSuffix() const;
virtual BOOL renameItem(const std::string& new_name);
@ -741,6 +759,31 @@ public:
U32 flags = 0x00) const;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Marketplace Inventory Panel related classes
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLMarketplaceFolderBridge : public LLFolderBridge
{
public:
// Overloads some display related methods specific to folders in a marketplace floater context
LLMarketplaceFolderBridge(LLInventoryPanel* inventory,
LLFolderView* root,
const LLUUID& uuid);
virtual LLUIImagePtr getIcon() const;
virtual LLUIImagePtr getIconOpen() const;
virtual std::string getLabelSuffix() const;
virtual LLFontGL::StyleFlags getLabelStyle() const;
private:
LLUIImagePtr getMarketplaceFolderIcon(BOOL is_open) const;
// Those members are mutable because they are cached variablse to speed up display, not a state variables
mutable S32 m_depth;
mutable S32 m_stockCountCache;
};
void rez_attachment(LLViewerInventoryItem* item,
LLViewerJointAttachment* attachment,
bool replace = false);

View File

@ -33,6 +33,8 @@
#include "llfolderviewitem.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryfunctions.h"
#include "llmarketplacefunctions.h"
#include "llviewercontrol.h"
#include "llfolderview.h"
#include "llinventorybridge.h"
@ -44,7 +46,6 @@
#include "lltrans.h"
// Firestorm includes
#include "llinventoryfunctions.h" // needed to query worn status
#include "llappearancemgr.h" // needed to query whether we are in COF
LLTrace::BlockTimerStatHandle FT_FILTER_CLIPBOARD("Filter Clipboard");
@ -237,12 +238,64 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
}
// when applying a filter, matching folders get their contents downloaded first
if (mFilterSubString.size()
if (isNotDefault()
&& !gInventory.isCategoryComplete(folder_id))
{
LLInventoryModelBackgroundFetch::instance().start(folder_id);
}
// Marketplace folder filtering
const U32 filterTypes = mFilterOps.mFilterTypes;
const U32 marketplace_filter = FILTERTYPE_MARKETPLACE_ACTIVE | FILTERTYPE_MARKETPLACE_INACTIVE |
FILTERTYPE_MARKETPLACE_UNASSOCIATED | FILTERTYPE_MARKETPLACE_LISTING_FOLDER |
FILTERTYPE_NO_MARKETPLACE_ITEMS;
if (filterTypes & marketplace_filter)
{
S32 depth = depth_nesting_in_marketplace(folder_id);
if (filterTypes & FILTERTYPE_NO_MARKETPLACE_ITEMS)
{
if (depth >= 0)
{
return false;
}
}
if (filterTypes & FILTERTYPE_MARKETPLACE_LISTING_FOLDER)
{
if (depth > 1)
{
return false;
}
}
if (depth > 0)
{
LLUUID listing_uuid = nested_parent_id(folder_id, depth);
if (filterTypes & FILTERTYPE_MARKETPLACE_ACTIVE)
{
if (!LLMarketplaceData::instance().getActivationState(listing_uuid))
{
return false;
}
}
else if (filterTypes & FILTERTYPE_MARKETPLACE_INACTIVE)
{
if (!LLMarketplaceData::instance().isListed(listing_uuid) || LLMarketplaceData::instance().getActivationState(listing_uuid))
{
return false;
}
}
else if (filterTypes & FILTERTYPE_MARKETPLACE_UNASSOCIATED)
{
if (LLMarketplaceData::instance().isListed(listing_uuid))
{
return false;
}
}
}
}
// show folder links
LLViewerInventoryItem* item = gInventory.getItem(folder_id);
if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER)
@ -633,6 +686,40 @@ void LLInventoryFilter::setFilterEmptySystemFolders()
mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
}
void LLInventoryFilter::setFilterMarketplaceActiveFolders()
{
mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_ACTIVE;
}
void LLInventoryFilter::setFilterMarketplaceInactiveFolders()
{
mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_INACTIVE;
}
void LLInventoryFilter::setFilterMarketplaceUnassociatedFolders()
{
mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_UNASSOCIATED;
}
void LLInventoryFilter::setFilterMarketplaceListingFolders(bool select_only_listing_folders)
{
if (select_only_listing_folders)
{
mFilterOps.mFilterTypes |= FILTERTYPE_MARKETPLACE_LISTING_FOLDER;
setModified(FILTER_MORE_RESTRICTIVE);
}
else
{
mFilterOps.mFilterTypes &= ~FILTERTYPE_MARKETPLACE_LISTING_FOLDER;
setModified(FILTER_LESS_RESTRICTIVE);
}
}
void LLInventoryFilter::setFilterNoMarketplaceFolder()
{
mFilterOps.mFilterTypes |= FILTERTYPE_NO_MARKETPLACE_ITEMS;
}
// <FS:Ansariel> Optional hiding of empty system folders
void LLInventoryFilter::removeFilterEmptySystemFolders()
{

View File

@ -52,8 +52,13 @@ public:
FILTERTYPE_UUID = 0x1 << 2, // find the object with UUID and any links to it
FILTERTYPE_DATE = 0x1 << 3, // search by date range
FILTERTYPE_WEARABLE = 0x1 << 4, // search by wearable type
FILTERTYPE_EMPTYFOLDERS = 0x1 << 5, // pass if folder is not a system folder to be hidden if
FILTERTYPE_WORN = 0x1 << 6, // <FS> search by wearable type
FILTERTYPE_EMPTYFOLDERS = 0x1 << 5, // pass if folder is not a system folder to be hidden if empty
FILTERTYPE_MARKETPLACE_ACTIVE = 0x1 << 6, // pass if folder is a marketplace active folder
FILTERTYPE_MARKETPLACE_INACTIVE = 0x1 << 7, // pass if folder is a marketplace inactive folder
FILTERTYPE_MARKETPLACE_UNASSOCIATED = 0x1 << 8, // pass if folder is a marketplace non associated (no market ID) folder
FILTERTYPE_MARKETPLACE_LISTING_FOLDER = 0x1 << 9, // pass iff folder is a listing folder
FILTERTYPE_NO_MARKETPLACE_ITEMS = 0x1 << 10, // pass iff folder is not under the marketplace
FILTERTYPE_WORN = 0x1 << 11, // <FS> search by wearable type
};
enum EFilterDateDirection
@ -74,7 +79,8 @@ public:
SO_NAME = 0, // Sort inventory by name
SO_DATE = 0x1, // Sort inventory by date
SO_FOLDERS_BY_NAME = 0x1 << 1, // Force folder sort by name
SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2 // Force system folders to be on top
SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2,// Force system folders to be on top
SO_FOLDERS_BY_WEIGHT = 0x1 << 3, // Force folder sort by weight, usually, amount of some elements in their descendents
};
// <FS:Zi> Extended Inventory Search
@ -183,6 +189,11 @@ public:
void setFilterWearableTypes(U64 types);
void setFilterEmptySystemFolders();
void removeFilterEmptySystemFolders(); // <FS:Ansariel> Optional hiding of empty system folders
void setFilterMarketplaceActiveFolders();
void setFilterMarketplaceInactiveFolders();
void setFilterMarketplaceUnassociatedFolders();
void setFilterMarketplaceListingFolders(bool select_only_listing_folders);
void setFilterNoMarketplaceFolder();
void updateFilterTypes(U64 types, U64& current_types);
void setFilterSubString(const std::string& string);

File diff suppressed because it is too large Load Diff

View File

@ -32,9 +32,13 @@
#include "llinventory.h"
#include "llwearabletype.h"
//-TT - Firestorm folder name for use by AO, bridge and possibly others
// compute_stock_count() return error code
const S32 COMPUTE_STOCK_INFINITE = -1;
const S32 COMPUTE_STOCK_NOT_EVALUATED = -2;
// <FS:TT> - Firestorm folder name for use by AO, bridge and possibly others
#define ROOT_FIRESTORM_FOLDER "#Firestorm"
//-TT
// </FS:TT>
/********************************************************************************
** **
@ -62,18 +66,33 @@ void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id);
void show_item_original(const LLUUID& item_uuid);
void reset_inventory_filter();
// Nudge the listing categories in the inventory to signal that their marketplace status changed
void update_marketplace_category(const LLUUID& cat_id, bool perform_consistency_enforcement = true);
// Nudge all listing categories to signal that their marketplace status changed
void update_all_marketplace_count();
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null);
void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false);
// Generates a string containing the path to the item specified by item_id.
void append_path(const LLUUID& id, std::string& path);
void copy_item_to_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, const LLUUID& top_level_folder, S32 operation_id);
void move_item_within_outbox(LLInventoryItem* inv_item, LLUUID dest_folder, S32 operation_id);
void copy_folder_to_outbox(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, const LLUUID& top_level_folder, S32 operation_id);
typedef boost::function<void(std::string& validation_message, S32 depth, LLError::ELevel log_level)> validation_callback_t;
bool can_move_item_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryItem* inv_item, std::string& tooltip_msg, S32 bundle_size = 1, bool from_paste = false);
bool can_move_folder_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryCategory* inv_cat, std::string& tooltip_msg, S32 bundle_size = 1, bool check_items = true, bool from_paste = false);
bool move_item_to_marketplacelistings(LLInventoryItem* inv_item, LLUUID dest_folder, bool copy = false);
bool move_folder_to_marketplacelistings(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, bool copy = false, bool move_no_copy_items = false);
bool validate_marketplacelistings(LLInventoryCategory* inv_cat, validation_callback_t cb = NULL, bool fix_hierarchy = true, S32 depth = -1);
S32 depth_nesting_in_marketplace(LLUUID cur_uuid);
LLUUID nested_parent_id(LLUUID cur_uuid, S32 depth);
S32 compute_stock_count(LLUUID cat_uuid, bool force_count = false);
/** Miscellaneous global functions
** **
*******************************************************************************/
@ -457,10 +476,17 @@ public:
struct LLInventoryAction
{
static void doToSelected(class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void doToSelected(class LLInventoryModel* model, class LLFolderView* root, const std::string& action, BOOL user_confirm = TRUE);
static void callback_doToSelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void callback_copySelected(const LLSD& notification, const LLSD& response, class LLInventoryModel* model, class LLFolderView* root, const std::string& action);
static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLFolderView* root);
static void removeItemFromDND(LLFolderView* root);
private:
static void buildMarketplaceFolders(LLFolderView* root);
static void updateMarketplaceFolders();
static std::list<LLUUID> sMarketplaceFolders; // Marketplace folders that will need update once the action is completed
};

View File

@ -41,6 +41,7 @@
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llnotificationsutil.h"
#include "llmarketplacefunctions.h"
#include "llwindow.h"
#include "llviewercontrol.h"
#include "llpreview.h"
@ -1130,7 +1131,7 @@ LLInventoryModel::item_array_t* LLInventoryModel::getUnlockedItemArray(const LLU
// an existing item with the matching id, or it will add the category.
void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32 mask)
{
if(cat->getUUID().isNull())
if(!cat || cat->getUUID().isNull())
{
return;
}
@ -1144,7 +1145,8 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32
LLPointer<LLViewerInventoryCategory> old_cat = getCategory(cat->getUUID());
if(old_cat)
{
// We already have an old category, modify it's values
// We already have an old category, modify its values
U32 mask = LLInventoryObserver::NONE;
LLUUID old_parent_id = old_cat->getParentUUID();
LLUUID new_parent_id = cat->getParentUUID();
if(old_parent_id != new_parent_id)
@ -1168,7 +1170,13 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32
{
mask |= LLInventoryObserver::LABEL;
}
old_cat->copyViewerCategory(cat);
// Under marketplace, category labels are quite complex and need extra upate
const LLUUID marketplace_id = findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
if (marketplace_id.notNull() && isObjectDescendentOf(cat->getUUID(), marketplace_id))
{
mask |= LLInventoryObserver::LABEL;
}
old_cat->copyViewerCategory(cat);
addChangedMask(mask, cat->getUUID());
}
else
@ -1543,6 +1551,11 @@ void LLInventoryModel::deleteObject(const LLUUID& id, bool fix_broken_links, boo
LLPointer<LLViewerInventoryCategory> cat = (LLViewerInventoryCategory*)((LLInventoryObject*)obj);
vector_replace_with_last(*cat_list, cat);
}
// Note : We need to tell the inventory observers that those things are going to be deleted *before* the tree is cleared or they won't know what to delete (in views and view models)
addChangedMask(LLInventoryObserver::REMOVE, id);
gInventory.notifyObservers();
item_list = getUnlockedItemArray(id);
if(item_list)
{
@ -1690,10 +1703,11 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
}
}
mModifyMask |= mask;
if (referent.notNull())
mModifyMask |= mask;
if (referent.notNull() && (mChangedItemIDs.find(referent) == mChangedItemIDs.end()))
{
mChangedItemIDs.insert(referent);
update_marketplace_category(referent, false);
if (mask & LLInventoryObserver::ADD)
{
@ -2113,17 +2127,22 @@ bool LLInventoryModel::loadSkeleton(
// we can safely ignore anything loaded from file, but
// not sent down in the skeleton. Must have been removed from inventory.
if(cit == not_cached)
if (cit == not_cached)
{
continue;
}
if(cat->getVersion() != tcat->getVersion())
else if (cat->getVersion() != tcat->getVersion())
{
// if the cached version does not match the server version,
// throw away the version we have so we can fetch the
// correct contents the next time the viewer opens the folder.
tcat->setVersion(NO_VERSION);
}
else if (tcat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
{
// Do not trust stock folders being updated
tcat->setVersion(NO_VERSION);
}
else
{
cached_ids.insert(tcat->getUUID());
@ -3198,7 +3217,18 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
LL_DEBUGS("Inventory") << "unpacked folder '" << tfolder->getName() << "' ("
<< tfolder->getUUID() << ") in " << tfolder->getParentUUID()
<< LL_ENDL;
if(tfolder->getUUID().notNull())
// If the folder is a listing or a version folder, all we need to do is update the SLM data
int depth_folder = depth_nesting_in_marketplace(tfolder->getUUID());
if ((depth_folder == 1) || (depth_folder == 2))
{
// Trigger an SLM listing update
LLUUID listing_uuid = (depth_folder == 1 ? tfolder->getUUID() : tfolder->getParentUUID());
S32 listing_id = LLMarketplaceData::instance().getListingID(listing_uuid);
LLMarketplaceData::instance().getListing(listing_id);
// In that case, there is no item to update so no callback -> we skip the rest of the update
}
else if(tfolder->getUUID().notNull())
{
folders.push_back(tfolder);
LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());

View File

@ -203,6 +203,7 @@ LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
p.show_empty_message = mShowEmptyMessage;
p.show_item_link_overlays = mShowItemLinkOverlays;
p.root = NULL;
p.allow_drop = mParams.allow_drop_on_root;
p.options_menu = "menu_inventory.xml";
// <FS:Ansariel> Inventory specials
@ -310,7 +311,12 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
//getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_OUTBOX));
}
// hide marketplace listing box, unless we are a marketplace panel
if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible") && !mParams.use_marketplace_folders)
{
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_MARKETPLACE_LISTINGS));
}
// <FS:Ansariel> Optional hiding of Received Items folder aka Inbox
if (!gSavedSettings.getBOOL("FSShowInboxFolder"))
{
@ -656,13 +662,13 @@ void LLInventoryPanel::modelChanged(U32 mask)
LLUUID LLInventoryPanel::getRootFolderID()
{
LLUUID root_id;
if (mFolderRoot.get() && mFolderRoot.get()->getViewModelItem())
{
return static_cast<LLFolderViewModelItemInventory*>(mFolderRoot.get()->getViewModelItem())->getUUID();
root_id = static_cast<LLFolderViewModelItemInventory*>(mFolderRoot.get()->getViewModelItem())->getUUID();
}
else
{
LLUUID root_id;
if (mParams.start_folder.id.isChosen())
{
root_id = mParams.start_folder.id;
@ -690,8 +696,8 @@ LLUUID LLInventoryPanel::getRootFolderID()
}
}
}
return root_id;
}
return root_id;
}
// static
@ -813,7 +819,7 @@ void LLInventoryPanel::initializeViews()
}
LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop)
{
LLFolderViewFolder::Params params(mParams.folder);
@ -821,6 +827,7 @@ LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * br
params.root = mFolderRoot.get();
params.listener = bridge;
// params.tool_tip = params.name; // <ND/> Don't bother with tooltips in inventory
params.allow_drop = allow_drop;
params.font_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultColor));
params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultHighlightColor));
@ -855,37 +862,56 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
{
LLInventoryObject const* objectp = gInventory.getObject(id);
if (!objectp) return NULL;
if (!objectp)
{
return NULL;
}
LLFolderViewItem* folder_view_item = getItemByID(id);
const LLUUID &parent_id = objectp->getParentUUID();
const LLUUID &parent_id = objectp->getParentUUID();
LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
// Force the creation of an extra root level folder item if required by the inventory panel (default is "false")
bool allow_drop = true;
bool create_root = false;
if (mParams.show_root_folder)
{
LLUUID root_id = getRootFolderID();
if (root_id == id)
{
// We insert an extra level that's seen by the UI but has no influence on the model
parent_folder = dynamic_cast<LLFolderViewFolder*>(folder_view_item);
folder_view_item = NULL;
allow_drop = mParams.allow_drop_on_root;
create_root = true;
}
}
if (!folder_view_item && parent_folder)
{
if (objectp->getType() <= LLAssetType::AT_NONE ||
objectp->getType() >= LLAssetType::AT_COUNT)
{
LL_WARNS() << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
<< LL_ENDL;
<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
<< LL_ENDL;
return NULL;
}
if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
(objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
{
LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
objectp->getType(),
LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(LLAssetType::AT_CATEGORY,
(mParams.use_marketplace_folders ? LLAssetType::AT_MARKETPLACE_FOLDER : LLAssetType::AT_CATEGORY),
LLInventoryType::IT_CATEGORY,
this,
&mInventoryViewModel,
&mInventoryViewModel,
mFolderRoot.get(),
objectp->getUUID());
if (new_listener)
{
folder_view_item = createFolderViewFolder(new_listener);
folder_view_item = createFolderViewFolder(new_listener,allow_drop);
}
}
else
@ -908,11 +934,16 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
}
if (folder_view_item)
{
{
llassert(parent_folder != NULL);
folder_view_item->addToFolder(parent_folder);
addItemID(id, folder_view_item);
}
// In the case of the root folder been shown, open that folder by default once the widget is created
if (create_root)
{
folder_view_item->setOpen(TRUE);
}
}
}
// If this is a folder, add the children of the folder and recursively add any
@ -1025,7 +1056,7 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
// If folder view is empty the (x, y) point won't be in its rect
// so the handler must be called explicitly.
// but only if was not handled before. See EXT-6746.
if (!handled && !mFolderRoot.get()->hasVisibleChildren())
if (!handled && mParams.allow_drop_on_root && !mFolderRoot.get()->hasVisibleChildren())
{
handled = mFolderRoot.get()->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
}
@ -1639,6 +1670,8 @@ public:
LLInventoryPanel::initFromParams(p);
// turn on inbox for recent items
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
// turn off marketplace for recent items
getFilter().setFilterNoMarketplaceFolder();
}
protected:
@ -1714,5 +1747,8 @@ namespace LLInitParam
declare(LLFolderType::lookup(LLFolderType::FT_INBOX) , LLFolderType::FT_INBOX);
declare(LLFolderType::lookup(LLFolderType::FT_OUTBOX) , LLFolderType::FT_OUTBOX);
declare(LLFolderType::lookup(LLFolderType::FT_BASIC_ROOT) , LLFolderType::FT_BASIC_ROOT);
declare(LLFolderType::lookup(LLFolderType::FT_MARKETPLACE_LISTINGS) , LLFolderType::FT_MARKETPLACE_LISTINGS);
declare(LLFolderType::lookup(LLFolderType::FT_MARKETPLACE_STOCK), LLFolderType::FT_MARKETPLACE_STOCK);
declare(LLFolderType::lookup(LLFolderType::FT_MARKETPLACE_VERSION), LLFolderType::FT_MARKETPLACE_VERSION);
}
}

View File

@ -97,6 +97,9 @@ public:
Optional<StartFolder> start_folder;
Optional<bool> use_label_suffix;
Optional<bool> show_empty_message;
Optional<bool> show_root_folder;
Optional<bool> allow_drop_on_root;
Optional<bool> use_marketplace_folders;
Optional<LLScrollContainer::Params> scroll;
Optional<bool> accepts_drag_and_drop;
Optional<LLFolderView::Params> folder_view;
@ -111,7 +114,10 @@ public:
filter("filter"),
start_folder("start_folder"),
use_label_suffix("use_label_suffix", true),
show_empty_message("show_empty_message", true),
show_empty_message("show_empty_message", true),
show_root_folder("show_root_folder", false),
allow_drop_on_root("allow_drop_on_root", true),
use_marketplace_folders("use_marketplace_folders", false),
scroll("scroll"),
accepts_drag_and_drop("accepts_drag_and_drop"),
folder_view("folder_view"),
@ -191,6 +197,7 @@ public:
LLFolderView* getRootFolder() { return mFolderRoot.get(); }
LLUUID getRootFolderID();
LLScrollContainer* getScrollableContainer() { return mScroller; }
bool getAllowDropOnRoot() { return mParams.allow_drop_on_root; }
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
@ -305,7 +312,7 @@ protected:
BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
virtual LLFolderView * createFolderRoot(LLUUID root_id );
virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge);
virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop);
virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
private:
bool mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()

File diff suppressed because it is too large Load Diff

View File

@ -66,8 +66,21 @@ namespace MarketplaceStatusCodes
MARKET_PLACE_NOT_INITIALIZED = 0,
MARKET_PLACE_INITIALIZING = 1,
MARKET_PLACE_CONNECTION_FAILURE = 2,
MARKET_PLACE_MERCHANT = 3,
MARKET_PLACE_NOT_MERCHANT = 4,
MARKET_PLACE_NOT_MERCHANT = 3,
MARKET_PLACE_MERCHANT = 4,
MARKET_PLACE_NOT_MIGRATED_MERCHANT = 5,
MARKET_PLACE_MIGRATED_MERCHANT = 6
};
}
namespace MarketplaceFetchCodes
{
enum sCode
{
MARKET_FETCH_NOT_DONE = 0,
MARKET_FETCH_LOADING = 1,
MARKET_FETCH_FAILED = 2,
MARKET_FETCH_DONE = 3
};
}
@ -109,6 +122,166 @@ private:
};
// Classes handling the data coming from and going to the Marketplace SLM Server DB:
// * implement the Marketplace API
// * cache the current Marketplace data (tuples)
// * provide methods to get Marketplace data on any inventory item
// * set Marketplace data
// * signal Marketplace updates to inventory
namespace SLMErrorCodes
{
enum eCode
{
SLM_SUCCESS = 200,
SLM_RECORD_CREATED = 201,
SLM_MALFORMED_PAYLOAD = 400,
SLM_NOT_FOUND = 404,
};
}
class LLMarketplaceData;
class LLInventoryObserver;
// A Marketplace item is known by its tuple
class LLMarketplaceTuple
{
public:
friend class LLMarketplaceData;
LLMarketplaceTuple();
LLMarketplaceTuple(const LLUUID& folder_id);
LLMarketplaceTuple(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed = false);
private:
// Representation of a marketplace item in the Marketplace DB (well, what we know of it...)
LLUUID mListingFolderId;
S32 mListingId;
LLUUID mVersionFolderId;
bool mIsActive;
S32 mCountOnHand;
std::string mEditURL;
};
// Notes:
// * The mListingFolderId is used as a key to this map. It could therefore be taken off the LLMarketplaceTuple objects themselves.
// * The SLM DB however uses mListingId as its primary key and it shows in its API. In the viewer though, the mListingFolderId is what we use to grab an inventory record.
typedef std::map<LLUUID, LLMarketplaceTuple> marketplace_items_list_t;
typedef std::map<LLUUID, LLUUID> version_folders_list_t;
// Session cache of all Marketplace tuples
// Notes:
// * There's one and only one possible set of Marketplace dataset per agent and per session thus making it an LLSingleton
// * Some of those records might correspond to folders that do not exist in the inventory anymore. We do not clear them out though. They just won't show up in the UI.
class LLSLMGetMerchantResponder;
class LLSLMGetListingsResponder;
class LLSLMCreateListingsResponder;
class LLSLMGetListingResponder;
class LLSLMUpdateListingsResponder;
class LLSLMAssociateListingsResponder;
class LLSLMDeleteListingsResponder;
class LLMarketplaceData
: public LLSingleton<LLMarketplaceData>
{
public:
friend class LLSLMGetMerchantResponder;
friend class LLSLMGetListingsResponder;
friend class LLSLMCreateListingsResponder;
friend class LLSLMGetListingResponder;
friend class LLSLMUpdateListingsResponder;
friend class LLSLMAssociateListingsResponder;
friend class LLSLMDeleteListingsResponder;
LLMarketplaceData();
virtual ~LLMarketplaceData();
// Public SLM API : Initialization and status
typedef boost::signals2::signal<void ()> status_updated_signal_t;
void initializeSLM(const status_updated_signal_t::slot_type& cb);
U32 getSLMStatus() const { return mMarketPlaceStatus; }
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);
bool activateListing(const LLUUID& folder_id, bool activate, S32 depth = -1);
bool clearListing(const LLUUID& folder_id, S32 depth = -1);
bool setVersionFolder(const LLUUID& folder_id, const LLUUID& version_id, S32 depth = -1);
bool associateListing(const LLUUID& folder_id, const LLUUID& source_folder_id, S32 listing_id);
bool updateCountOnHand(const LLUUID& folder_id, S32 depth = -1);
bool getListing(const LLUUID& folder_id, S32 depth = -1);
bool getListing(S32 listing_id);
bool deleteListing(S32 listing_id, bool update = true);
// Probe the Marketplace data set to identify folders
bool isListed(const LLUUID& folder_id); // returns true if folder_id is a Listing folder
bool isListedAndActive(const LLUUID& folder_id); // returns true if folder_id is an active (listed) Listing folder
bool isVersionFolder(const LLUUID& folder_id); // returns true if folder_id is a Version folder
bool isInActiveFolder(const LLUUID& obj_id, S32 depth = -1); // returns true if the obj_id is buried in an active version folder
LLUUID getActiveFolder(const LLUUID& obj_id, S32 depth = -1); // returns the UUID of the active version folder obj_id is in
bool isUpdating(const LLUUID& folder_id, S32 depth = -1); // returns true if we're waiting from SLM incoming data for folder_id
// Access Marketplace data set : each method returns a default value if the argument can't be found
bool getActivationState(const LLUUID& folder_id);
S32 getListingID(const LLUUID& folder_id);
LLUUID getVersionFolder(const LLUUID& folder_id);
std::string getListingURL(const LLUUID& folder_id, S32 depth = -1);
LLUUID getListingFolder(S32 listing_id);
S32 getCountOnHand(const LLUUID& folder_id);
// Used to flag if stock count values for Marketplace have to be updated
bool checkDirtyCount() { if (mDirtyCount) { mDirtyCount = false; return true; } else { return false; } }
void setDirtyCount() { mDirtyCount = true; }
void setUpdating(const LLUUID& folder_id, bool isUpdating);
// Used to decide when to run a validation on listing folders
void setValidationWaiting(const LLUUID& folder_id, S32 count);
void decrementValidationWaiting(const LLUUID& folder_id, S32 count = 1);
private:
// Modify Marketplace data set : each method returns true if the function succeeds, false if error
// Used internally only by SLM Responders when data are received from the SLM Server
bool addListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, const std::string& edit_url, S32 count);
bool deleteListing(const LLUUID& folder_id, bool update = true);
bool setListingID(const LLUUID& folder_id, S32 listing_id, bool update = true);
bool setVersionFolderID(const LLUUID& folder_id, const LLUUID& version_id, bool update = true);
bool setActivationState(const LLUUID& folder_id, bool activate, bool update = true);
bool setListingURL(const LLUUID& folder_id, const std::string& edit_url, bool update = true);
bool setCountOnHand(const LLUUID& folder_id, S32 count, bool update = true);
// Private SLM API : package data and get/post/put requests to the SLM Server through the SLM API
void createSLMListing(const LLUUID& folder_id, const LLUUID& version_id, S32 count);
void getSLMListing(S32 listing_id);
void updateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, S32 count);
void associateSLMListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, const LLUUID& source_folder_id);
void deleteSLMListing(S32 listing_id);
std::string getSLMConnectURL(const std::string& route);
// Handling Marketplace connection and inventory connection
U32 mMarketPlaceStatus;
status_updated_signal_t* mStatusUpdatedSignal;
LLInventoryObserver* mInventoryObserver;
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
typedef std::map<LLUUID,S32> waiting_list_t;
waiting_list_t mValidationWaitingList;
// The cache of SLM data (at last...)
marketplace_items_list_t mMarketplaceItems;
// We need a list (version folder -> listing folder) because such reverse lookups are frequent
version_folders_list_t mVersionFolders;
};
#endif // LL_LLMARKETPLACEFUNCTIONS_H

View File

@ -64,7 +64,7 @@ LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params
LLInboxInventoryPanel::~LLInboxInventoryPanel()
{}
LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge)
LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop)
{
LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
@ -76,6 +76,7 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge
params.tool_tip = params.name;
params.font_color = item_color;
params.font_highlight_color = item_color;
params.allow_drop = allow_drop;
return LLUICtrlFactory::create<LLInboxFolderViewFolder>(params);
}

View File

@ -46,7 +46,7 @@ public:
~LLInboxInventoryPanel();
// virtual
LLFolderViewFolder * createFolderViewFolder(LLInvFVBridge * bridge);
LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop);
LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);
};

View File

@ -135,7 +135,7 @@ public:
virtual void move(LLFolderViewModelItem* parent_listener);
virtual BOOL isItemCopyable() const;
virtual BOOL copyToClipboard() const;
virtual BOOL cutToClipboard() const;
virtual BOOL cutToClipboard();
virtual BOOL isClipboardPasteable() const;
virtual void pasteFromClipboard();
virtual void pasteLinkFromClipboard();
@ -600,7 +600,7 @@ BOOL LLTaskInvFVBridge::copyToClipboard() const
return FALSE;
}
BOOL LLTaskInvFVBridge::cutToClipboard() const
BOOL LLTaskInvFVBridge::cutToClipboard()
{
return FALSE;
}

View File

@ -2428,7 +2428,12 @@ LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim, first_sim_size_x,
}
display_startup();
// *TODO : Uncomment that line once the whole grid migrated to SLM and suppress it from LLAgent::handleTeleportFinished() (llagent.cpp)
//check_merchant_status();
display_startup();
// <FS:CR> Compatibility with old backups
// Put gSavedPerAccountSettings here, put gSavedSettings in llappviewer.cpp
// *TODO: Should we keep these around forever or just three release cycles?

View File

@ -67,19 +67,19 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
mLabel(notification->getName()),
mLineEditor(NULL)
{
// EXP-1822
// save currently focused view, so that return focus to it
// on destroying this toast.
LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
while(current_selection)
{
if (current_selection->isFocusRoot())
{
mPreviouslyFocusedView = current_selection->getHandle();
break;
}
current_selection = current_selection->getParent();
}
// EXP-1822
// save currently focused view, so that return focus to it
// on destroying this toast.
LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
while(current_selection)
{
if (current_selection->isFocusRoot())
{
mPreviouslyFocusedView = current_selection->getHandle();
break;
}
current_selection = current_selection->getParent();
}
const LLFontGL* font = LLFontGL::getFontSansSerif();
const S32 LINE_HEIGHT = font->getLineHeight();
@ -447,7 +447,24 @@ LLToastAlertPanel::~LLToastAlertPanel()
// return focus to the previously focused view if the viewer is not exiting
if (mPreviouslyFocusedView.get() && !LLApp::isExiting())
{
mPreviouslyFocusedView.get()->setFocus(TRUE);
LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus());
while(current_selection)
{
if (current_selection->isFocusRoot())
{
break;
}
current_selection = current_selection->getParent();
}
if (current_selection)
{
// If the focus moved to some other view though, move the focus there
current_selection->setFocus(TRUE);
}
else
{
mPreviouslyFocusedView.get()->setFocus(TRUE);
}
}
}

View File

@ -829,6 +829,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
if (!handled)
{
// *TODO: Suppress the "outbox" case once "marketplace" is used everywhere for everyone
// Disallow drag and drop to 3D from the outbox
const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
if (outbox_id.notNull())
@ -843,6 +844,20 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
}
}
}
// Disallow drag and drop to 3D from the marketplace
const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
if (marketplacelistings_id.notNull())
{
for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++)
{
if (gInventory.isObjectDescendentOf(mCargoIDs[item_index], marketplacelistings_id))
{
*acceptance = ACCEPT_NO;
mToolTipMsg = LLTrans::getString("TooltipOutboxDragToWorld");
return;
}
}
}
dragOrDrop3D( x, y, mask, drop, acceptance );
}

View File

@ -89,6 +89,7 @@ public:
void setCargoCount(U32 count) { mCargoCount = count; }
void resetCargoCount() { mCargoCount = 0; }
U32 getCargoCount() const { return (mCargoCount > 0) ? mCargoCount : mCargoIDs.size(); }
S32 getCargoIndex() const { return mCurItemIndex; }
static S32 getOperationId() { return sOperationId; }

View File

@ -37,6 +37,7 @@
#include "llfloaterinspect.h"
#include "lltool.h"
#include "llmanipscale.h"
#include "llmarketplacefunctions.h"
#include "llselectmgr.h"
#include "lltoolbrush.h"
#include "lltoolcomp.h"
@ -89,6 +90,8 @@ LLToolMgr::LLToolMgr()
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&RlvUIEnabler::isBuildEnabled));
// [/RLVa:KB]
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Marketplace.Enabled", boost::bind(&LLToolMgr::canAccessMarketplace, this));
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Marketplace.Toggle", boost::bind(&LLToolMgr::toggleMarketplace, this, _2));
gToolNull = new LLTool(LLStringUtil::null); // Does nothing
setCurrentTool(gToolNull);
@ -364,6 +367,23 @@ bool LLToolMgr::inBuildMode()
return b;
}
bool LLToolMgr::canAccessMarketplace()
{
return (LLMarketplaceData::instance().getSLMStatus() != MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT) || gSavedSettings.getBOOL("InventoryOutboxDisplayBoth");
}
void LLToolMgr::toggleMarketplace(const LLSD& sdname)
{
const std::string& param = sdname.asString();
if ((param != "marketplace") || !canAccessMarketplace())
{
return;
}
LLFloaterReg::toggleInstanceOrBringToFront("marketplace_listings");
}
void LLToolMgr::setTransientTool(LLTool* tool)
{
if (!tool)

View File

@ -54,10 +54,12 @@ public:
bool inEdit();
bool canEdit();
bool canAccessMarketplace();
// [RLVa:KB] - Checked: 2012-04-26 (RLVa-1.4.6) | Added: RLVa-1.4.6 | Ansa: Changed because of FIRE-5552
void toggleBuildMode(const LLSD& sdname = LLSD());
// [/RLVa:KB]
// void toggleBuildMode(const LLSD& sdname);
void toggleMarketplace(const LLSD& sdname);
/* Determines if we are in Build mode or not. */
bool inBuildMode();

View File

@ -84,6 +84,7 @@
#include "llfloaterland.h"
#include "llfloaterlandholdings.h"
#include "llfloatermap.h"
#include "llfloatermarketplacelistings.h"
#include "llfloatermediasettings.h"
#include "llfloatermemleak.h"
#include "llfloatermodelpreview.h"
@ -230,6 +231,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("block_timers", "floater_fast_timers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFastTimerView>);
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("associate_listing", "floater_associate_listing.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAssociateListing>);
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
@ -290,6 +292,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
LLFloaterReg::add("inventory", "floater_my_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
LLFloaterReg::add("item_properties", "floater_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterItemProperties>);
LLInspectAvatarUtil::registerFloater();
LLInspectGroupUtil::registerFloater();
LLInspectObjectUtil::registerFloater();
@ -308,6 +311,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("tex_fetch_debugger", "floater_texture_fetch_debugger.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTextureFetchDebugger>);
}
LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>);
LLFloaterReg::add("marketplace_listings", "floater_marketplace_listings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceListings>);
LLFloaterReg::add("marketplace_validation", "floater_marketplace_validation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceValidation>);
LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
LLFloaterReg::add("message_tos", "floater_tos.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>);
LLFloaterReg::add("moveview", "floater_moveview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMove>);

View File

@ -167,7 +167,11 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
// </FS:Ansariel> Use individual icons for different folder types
addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "Inv_SysOpen", "Inv_SysClosed", FALSE, true));
addEntry(LLFolderType::FT_MARKETPLACE_LISTINGS, new ViewerFolderEntry("Marketplace Listings", "Inv_SysOpen", "Inv_SysClosed", FALSE, boxes_invisible));
addEntry(LLFolderType::FT_MARKETPLACE_STOCK, new ViewerFolderEntry("New Stock", "Inv_StockFolderOpen", "Inv_StockFolderClosed", FALSE, false, "default"));
addEntry(LLFolderType::FT_MARKETPLACE_VERSION, new ViewerFolderEntry("New Version", "Inv_VersionFolderOpen","Inv_VersionFolderClosed", FALSE, false, "default"));
addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, false, "default"));
// <FS:Ansariel> Special Firestorm folder

View File

@ -820,6 +820,36 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
return true;
}
bool LLViewerInventoryCategory::acceptItem(LLInventoryItem* inv_item)
{
if (!inv_item)
{
return false;
}
// Only stock folders have limitation on which item they will accept
bool accept = true;
if (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
{
// If the item is copyable (i.e. non stock) do not accept the drop in a stock folder
if (inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()))
{
accept = false;
}
else
{
LLInventoryModel::cat_array_t* cat_array;
LLInventoryModel::item_array_t* item_array;
gInventory.getDirectDescendentsOf(getUUID(),cat_array,item_array);
// Destination stock folder must be empty OR types of incoming and existing items must be identical and have the same permissions
accept = (!item_array->size() ||
((item_array->at(0)->getInventoryType() == inv_item->getInventoryType()) &&
(item_array->at(0)->getPermissions().getMaskNextOwner() == inv_item->getPermissions().getMaskNextOwner())));
}
}
return accept;
}
void LLViewerInventoryCategory::determineFolderType()
{
/* Do NOT uncomment this code. This is for future 2.1 support of ensembles.

View File

@ -228,6 +228,9 @@ public:
void changeType(LLFolderType::EType new_folder_type);
virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
virtual BOOL unpackMessage(const LLSD& category);
// returns true if the category object will accept the incoming item
bool acceptItem(LLInventoryItem* inv_item);
private:
friend class LLInventoryModel;

View File

@ -89,6 +89,7 @@
#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
#include "llmarketplacefunctions.h"
#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmoveview.h"
#include "llparcel.h"
@ -99,6 +100,7 @@
#include "llspellcheckmenuhandler.h"
#include "llstatusbar.h"
#include "lltextureview.h"
#include "lltoolbarview.h"
#include "lltoolcomp.h"
#include "lltoolmgr.h"
#include "lltoolpie.h"
@ -453,6 +455,66 @@ void set_underclothes_menu_options()
}
}
void set_merchant_SLM_menu()
{
// DD-170 : SLM Alpha and Beta program : for the moment, we always show the SLM menu and
// tools so that all merchants can try out the UI, even if not migrated.
// *TODO : Keep SLM UI hidden for non migrated merchant in released viewer
//if (LLMarketplaceData::instance().getSLMStatus() == MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT)
//{
// Merchant not migrated: show only the old Merchant Outbox menu
// gMenuHolder->getChild<LLView>("MerchantOutbox")->setVisible(TRUE);
//}
//else
//{
// All other cases (new merchant, not merchant, migrated merchant): show the new Marketplace Listings menu and enable the tool
gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(TRUE);
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
gToolBarView->enableCommand(command->id(), true);
//}
}
void set_merchant_outbox_menu(U32 status, const LLSD& content)
{
// If the merchant is fully migrated, the API is disabled (503) and we won't show the old menu item.
// In all other cases, we show it.
if (status != MarketplaceErrorCodes::IMPORT_SERVER_API_DISABLED)
{
gMenuHolder->getChild<LLView>("MerchantOutbox")->setVisible(TRUE);
}
}
void check_merchant_status()
{
if (!gSavedSettings.getBOOL("InventoryOutboxDisplayBoth"))
{
// Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status()
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED);
// Hide SLM related menu item
gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(FALSE);
// Also disable the toolbar button for Marketplace Listings
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
gToolBarView->enableCommand(command->id(), false);
// Launch an SLM test connection to get the merchant status
LLMarketplaceData::instance().initializeSLM(boost::bind(&set_merchant_SLM_menu));
// Do the Merchant Outbox init only once per session
if (LLMarketplaceInventoryImporter::instance().getMarketPlaceStatus() == MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)
{
// Hide merchant outbox related menu item
gMenuHolder->getChild<LLView>("MerchantOutbox")->setVisible(FALSE);
// Launch a Merchant Outbox test connection to get the migration status
LLMarketplaceInventoryImporter::instance().setStatusReportCallback(boost::bind(&set_merchant_outbox_menu,_1, _2));
LLMarketplaceInventoryImporter::instance().initialize();
}
}
}
void init_menus()
{
// Initialize actions

View File

@ -89,6 +89,7 @@ BOOL enable_god_full(void* user_data);
BOOL enable_god_liaison(void* user_data);
BOOL enable_god_basic(void* user_data);
void set_underclothes_menu_options();
void check_merchant_status();
void exchange_callingcard(const LLUUID& dest_id);

View File

@ -75,6 +75,7 @@
//#include "llfloaterimnearbychat.h"
#include "fsfloaternearbychat.h"
// </FS:Ansariel> [FS communication UI]
#include "llmarketplacefunctions.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llpanelgrouplandmoney.h"
@ -7486,7 +7487,25 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
}
}
// </FS:CR>
// Special Marketplace update notification
if (notificationID == "SLM_UPDATE_FOLDER")
{
std::string state = llsdBlock["state"].asString();
if (state == "deleted")
{
// Perform the deletion viewer side, no alert shown in this case
LLMarketplaceData::instance().deleteListing(llsdBlock["listing_id"].asInteger());
return true;
}
else
{
// In general, no message will be displayed, all we want is to get the listing updated in the marketplace floater
// If getListing() fails though, the message of the alert will be shown by the caller of attempt_standard_notification()
return LLMarketplaceData::instance().getListing(llsdBlock["listing_id"].asInteger());
}
}
LLNotificationsUtil::add(notificationID, llsdBlock);
return true;
}

View File

@ -2881,6 +2881,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("CopyInventoryFromNotecard");
capabilityNames.append("CreateInventoryCategory");
capabilityNames.append("DispatchRegionInfo");
capabilityNames.append("DirectDelivery");
capabilityNames.append("EnvironmentSettings");
// <FS:CR> Aurora Sim
capabilityNames.append("DispatchOpenRegionSettings");

View File

@ -124,6 +124,7 @@ private:
private:
LLUUID mInitialBakeIDs[6];
//bool mInitialBakesLoaded;
/********************************************************************************

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -145,6 +145,7 @@ with the same filename but different name
<texture name="Command_Inventory_Icon" file_name="toolbar_icons/inventory.png" preload="true" />
<texture name="Command_Map_Icon" file_name="toolbar_icons/map.png" preload="true" />
<texture name="Command_Marketplace_Icon" file_name="toolbar_icons/marketplace.png" preload="true" />
<texture name="Command_MktListings_Icon" file_name="toolbar_icons/mktlistings.png" preload="true" />
<texture name="Command_MiniCart_Icon" file_name="toolbar_icons/mini_cart.png" preload="true" />
<texture name="Command_MiniMap_Icon" file_name="toolbar_icons/mini_map.png" preload="true" />
<texture name="Command_Move_Icon" file_name="toolbar_icons/move.png" preload="true" />
@ -319,6 +320,8 @@ with the same filename but different name
<texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" />
<texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" />
<texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" />
<texture name="Inv_StockFolderClosed" file_name="icons/Inv_StockFolderClosed.png" preload="false" />
<texture name="Inv_StockFolderOpen" file_name="icons/Inv_StockFolderOpen.png" preload="false" />
<texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
<texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
<texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
@ -330,6 +333,8 @@ with the same filename but different name
<texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" />
<texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" />
<texture name="Inv_Invalid" file_name="icons/Inv_Invalid.png" preload="false" />
<texture name="Inv_VersionFolderClosed" file_name="icons/Inv_VersionFolderClosed.png" preload="false" />
<texture name="Inv_VersionFolderOpen" file_name="icons/Inv_VersionFolderOpen.png" preload="false" />
<!-- Firstorm specific individual system folder icons -->
<texture name="Inv_TexturesOpen" file_name="icons/Inv_SysOpen.png" />
@ -389,6 +394,7 @@ with the same filename but different name
<texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" />
<texture name="Marketplace_Dropzone_Background" file_name="widgets/Marketplace_Dropzone_Background.png" preload="true" />
<texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />
<texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 B

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="associate listing" title="AUFLISTUNG VERKNÜPFEN">
<text name="message">Auflistungs-ID:</text>
<line_editor name="listing_id">ID hier eingeben</line_editor>
<button label="OK" name="OK"/>
<button label="Abbrechen" name="Cancel"/>
</floater>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="HoverHeight" title="Hover-Höhe einstellen">
<floater name="HoverHeight" title="Schwebehöhe festlegen">
<slider label="Höhe" name="HoverHeightSlider"/>
</floater>

View File

@ -1,75 +1,39 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="Eigenschaften: Inventarobjekt">
<floater.string name="loading_experience">
(laden)
</floater.string>
<floater.string name="unknown">
(unbekannt)
</floater.string>
<floater.string name="public">
(öffentlich)
</floater.string>
<floater.string name="you_can">
Sie können:
</floater.string>
<floater.string name="owner_can">
Eigentümer kann:
</floater.string>
<floater.string name="acquiredDate">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</floater.string>
<text name="LabelItemNameTitle">
Name:
</text>
<text name="LabelItemDescTitle">
Beschreibung:
</text>
<text name="LabelCreatorTitle">
Ersteller:
</text>
<floater.string name="loading_experience">(laden)</floater.string>
<floater.string name="unknown">(unbekannt)</floater.string>
<floater.string name="public">(öffentlich)</floater.string>
<floater.string name="you_can">Sie können:</floater.string>
<floater.string name="owner_can">Eigentümer kann:</floater.string>
<floater.string name="acquiredDate">[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]</floater.string>
<text name="LabelItemNameTitle">Name:</text>
<text name="LabelItemDescTitle">Beschreibung:</text>
<text name="LabelCreatorTitle">Ersteller:</text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Eigentümer:
</text>
<text name="LabelOwnerTitle">Eigentümer:</text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Erworben:
</text>
<text name="LabelAcquiredDate">
Mittwoch, 24. Mai 2006, 12:50:46
</text>
<text name="LabelItemExperienceTitle">
Erlebnis:
</text>
<text name="OwnerLabel">
Sie:
</text>
<text name="LabelAcquiredTitle">Erworben:</text>
<text name="LabelAcquiredDate">Mittwoch, 24. Mai 2006, 12:50:46</text>
<text name="OwnerLabel">Sie:</text>
<text name="LabelItemExperienceTitle">Erlebnis:</text>
<check_box label="Bearbeiten" name="CheckOwnerModify"/>
<check_box label="Kopieren" name="CheckOwnerCopy"/>
<check_box label="Transferieren" name="CheckOwnerTransfer"/>
<check_box label="Exportieren" name="CheckOwnerExport"/>
<text name="AnyoneLabel">
Jeder:
</text>
<text name="AnyoneLabel">Jeder:</text>
<check_box label="Kopieren" name="CheckEveryoneCopy"/>
<text name="GroupLabel">
Gruppe:
</text>
<text name="GroupLabel">Gruppe:</text>
<check_box label="Teilen" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="150">
Nächster Eigentümer:
</text>
<text name="NextOwnerLabel" width="150">Nächster Eigentümer:</text>
<check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
<check_box label="Kopieren" name="CheckNextOwnerCopy"/>
<check_box label="Transferieren" name="CheckNextOwnerTransfer"/>
<check_box label="Zum Verkauf" name="CheckPurchase" width="100"/>
<combo_box name="ComboBoxSaleType" >
<combo_box name="ComboBoxSaleType">
<combo_box.item label="Kopie" name="Copy"/>
<combo_box.item label="Inhalt" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Preis:" name="Edit Cost"/>
<text name="CurrencySymbol">
L$
</text>
<text name="CurrencySymbol">L$</text>
</floater>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Item Properties" title="OBJEKTEIGENSCHAFTEN"/>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_marketplace_listings" title="MARKTPLATZ-AUFLISTUNGEN">
<panel name="marketplace_listings_panel">
<panel>
<panel name="marketplace_listings_inventory_placeholder_panel">
<text name="marketplace_listings_inventory_placeholder_title">Laden...</text>
</panel>
</panel>
</panel>
</floater>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_marketplace_validation" title="Marketplace-Auflistungen prüfen">
<button label="OK" label_selected="OK" name="OK"/>
<text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
</floater>

View File

@ -1,18 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
<string name="payee_group">
Gruppe bezahlen
</string>
<string name="payee_resident">
Einwohner bezahlen
</string>
<text name="payee_label" width="130">
Bezahlen:
</text>
<string name="payee_group">Gruppe bezahlen</string>
<string name="payee_resident">Einwohner bezahlen</string>
<text name="payee_label" width="130">Bezahlen:</text>
<icon name="icon_person" tool_tip="Person"/>
<text name="payee_name">
Extrem langen Namen testen, um zu prüfen, ob er abgeschnitten wird
</text>
<text name="payee_name">Extrem langen Namen testen, um zu prüfen, ob er abgeschnitten wird</text>
<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>

View File

@ -1,22 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
<string name="payee_group" width="105">
Gruppe bezahlen
</string>
<string name="payee_resident" width="118">
Einwohner bezahlen
</string>
<string name="payee_group" width="105">Gruppe bezahlen</string>
<string name="payee_resident" width="118">Einwohner bezahlen</string>
<icon name="icon_person" tool_tip="Person"/>
<text left="10" name="payee_name" width="168">
Ericacita Moostopolison
</text>
<text halign="left" name="object_name_label">
Über Objekt:
</text>
<text left="10" name="payee_name" width="168">Ericacita Moostopolison</text>
<text halign="left" name="object_name_label">Über Objekt:</text>
<icon name="icon_object" tool_tip="Objekte"/>
<text name="object_name_text">
...
</text>
<text name="object_name_text">...</text>
<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>

View File

@ -12,7 +12,7 @@
<menu_item_call label="Mein Aussehen" name="Change Outfit"/>
<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
<menu_item_call label="Hover-Höhe" name="Hover Height"/>
<menu_item_call label="Schwebehöhe" name="Hover Height"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>

View File

@ -25,7 +25,7 @@
<menu_item_call label="Mein Aussehen" name="Chenge Outfit"/>
<menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
<menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
<menu_item_call label="Hover-Höhe" name="Hover Height"/>
<menu_item_call label="Schwebehöhe" name="Hover Height"/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>

View File

@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
<menu_item_call label="Auflistung erstellen" name="Marketplace Create Listing"/>
<menu_item_call label="Auflistung verknüpfen" name="Marketplace Associate Listing"/>
<menu_item_call label="Auflistung abrufen (aktualisieren)" name="Marketplace Get Listing"/>
<menu_item_call label="Auf Fehler prüfen" name="Marketplace Check Listing"/>
<menu_item_call label="Auflistung bearbeiten" name="Marketplace Edit Listing"/>
<menu_item_call label="Auflisten" name="Marketplace List"/>
<menu_item_call label="Entfernen" name="Marketplace Unlist"/>
<menu_item_call label="Aktivieren" name="Marketplace Activate"/>
<menu_item_call label="Deaktivieren" name="Marketplace Deactivate"/>
<menu_item_call label="Teilen" name="Share"/>
<menu_item_call label="Kaufen" name="Task Buy"/>
<menu_item_call label="Öffnen" name="Task Open"/>
@ -97,6 +106,7 @@
<menu_item_call label="Hinzufügen" name="Wearable Add"/>
<menu_item_call label="Ausziehen" name="Take Off"/>
<menu_item_call label="In Händler-Outbox kopieren" name="Merchant Copy"/>
<menu_item_call label="In Marktplatz übertragen" name="Marketplace Send"/>
<menu_item_call label="In Marktplatz-Auflistungen kopieren" name="Marketplace Copy"/>
<menu_item_call label="In Marktplatz-Auflistungen verschieben" name="Marketplace Move"/>
<menu_item_call label="--keine Optionen--" name="--no options--"/>
</menu>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_marketplace_sort">
<menu_item_check label="Nach verfügbarer Menge sortieren (niedrig bis hoch)" name="sort_by_stock_amount"/>
<menu_item_check label="Nur Auflistungsordner anzeigen" name="show_only_listing_folders"/>
</toggleable_menu>

View File

@ -5,15 +5,15 @@
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de"/>
</menu_item_call>
<menu_item_call label="Händler-Outbox..." name="MerchantOutbox"/>
<menu_item_call label="Marktplatz-Auflistungen..." name="MarketplaceListings"/>
<menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
<menu_item_call label="Einstellungen" name="Preferences"/>
<menu_item_call label="Symbolleistenschaltflächen" name="Toolbar Buttons"/>
<menu_item_call label="Profil" name="Profile"/>
<menu_item_call label="Auswahlen" name="Picks"/>
<menu_item_call label="Erlebnisse" name="Experiences"/>
<menu_item_call label="Erlebnisse..." name="Experiences"/>
<menu_item_call label="Auf Facebook posten" name="PostToFacebook"/>
<menu_item_call label="Aussehen" name="ChangeOutfit"/>
<menu_item_call label="Avatar auswählen" name="Avatar Picker"/>
<menu_item_call label="Outfit ändern" name="ChangeOutfit"/>
<menu_item_call label="Foto machen" name="Take Snapshot"/>
<menu_item_check label="Inventar" name="Inventory"/>
<menu_item_check label="Inventar" name="ShowSidetrayInventory"/>
@ -80,7 +80,7 @@
</menu>
<menu_item_check label="Unterhaltungsprotokoll..." name="Conversation Log..."/>
<menu_item_check label="Stimmen in der Nähe" name="Nearby Voice"/>
<menu_item_check label="Blockierliste" name="Block List"/>
<menu_item_call label="Blockierliste" name="Block List"/>
</menu>
<menu label="Welt" name="World">
<menu_item_call label="Animationen synchronisieren" name="Resync Animations"/>
@ -88,7 +88,6 @@
<menu_item_check label="Radar" name="Radar"/>
<menu_item_call label="Teleport-Liste" name="Teleport History"/>
<menu_item_check label="Orte" name="Places"/>
<menu_item_call label="Ziele" name="Destinations"/>
<menu_item_check label="Minikarte" name="Mini-Map"/>
<menu_item_check label="Karte" name="World Map"/>
<menu_item_check label="Regions-Tracker" name="Region Tracker"/>
@ -482,7 +481,7 @@
<menu_item_check label="Positionen der interpolierten Objekte anfragen" name="Ping Interpolate Object Positions"/>
<menu_item_call label="Ein Paket fallenlassen" name="Drop a Packet"/>
</menu>
<menu_item_call label="Geskriptete Kamera ausgeben" name="Dump Scripted Camera"/>
<menu_item_call label="Geskriptete Kamera ausgeben" name="Dump Scripted Camera"/>
<menu label="Rekorder" name="Recorder">
<menu_item_call label="Ereignis-Aufname starten" name="Start event recording"/>
<menu_item_call label="Ereignis-Aufname stoppen" name="Stop event recording"/>

View File

@ -129,6 +129,88 @@ Aufgrund eines System- oder Netzwerkfehlers wurden keine Ordner an den Marktplat
Marktplatzinitialisierung aufgrund eines System- oder Netzwerkfehlers fehlgeschlagen. Versuchen Sie es später erneut.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="StockPasteFailed">
Kopieren oder Verschieben in Bestandsordner fehlgeschlagen mit Fehler:
„[ERROR_CODE]“
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MerchantPasteFailed">
Kopieren oder Verschieben von Marktplatz-Auflistungen fehlgeschlagen mit Fehler:
„[ERROR_CODE]“
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MerchantTransactionFailed">
Marktplatztransaktion fehlgeschlagen mit Fehler:
Grund: „[ERROR_REASON]“
[ERROR_DESCRIPTION]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MerchantUnprocessableEntity">
Wir konnten dieses Produkt nicht auflisten bzw. den Versionsordner nicht aktivieren. Dies liegt meist an fehlenden Informationen im Formular zur Beschreibung der Auflistung, kann aber auch auf eine falsche Ordnerstruktur zurückzuführen sein. Bearbeiten Sie die Auflistung oder überprüfen Sie den Auflistungsordner auf Fehler.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MerchantListingFailed">
Auflistung in Marktplatz fehlgeschlagen mit Fehler:
„[ERROR_CODE]“
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MerchantFolderActivationFailed">
Aktivierung dieses Versionsordners fehlgeschlagen mit Fehler:
„[ERROR_CODE]“
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ConfirmMerchantActiveChange">
Diese Aktion ändert den aktiven Inhalt dieser Auflistung. Möchten Sie fortfahren?
<usetemplate ignoretext="Vor Ändern einer aktiven Auflistung im Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmMerchantMoveInventory">
Objekte, die ins Marktplatz-Auflistungsfenster gezogen werden, werden verschoben, nicht kopiert. Möchten Sie fortfahren?
<usetemplate ignoretext="Vor Verschieben eines Objekts aus dem Inventar in den Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmListingCutOrDelete">
Wenn Sie einen Auflistungsordner verschieben oder löschen, wird Ihre Marktplatz-Auflistung gelöscht. Um die Marktplatz-Auflistung beizubehalten, verschieben oder löschen Sie den Inhalt des Versionsordners, den Sie ändern möchten. Möchten Sie fortfahren?
<usetemplate ignoretext="Bestätigen, bevor ich eine Auflistung aus dem Marktplatz entferne oder verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmCopyToMarketplace">
Sie haben keine Berechtigung, eines oder mehrere dieser Objekte in den Marktplatz zu kopieren. Sie können sie verschieben oder zurücklassen.
<usetemplate canceltext="Abbrechen" ignoretext="Vor Kopieren einer Auswahl mit kopiergeschützten Objekten in den Marktplatz bestätigen" name="yesnocancelbuttons" notext="Artikel nicht verschieben" yestext="Artikel verschieben"/>
</notification>
<notification name="ConfirmMerchantUnlist">
Diese Aktion entfernt diese Auflistung. Möchten Sie fortfahren?
<usetemplate ignoretext="Vor Entfernen einer aktiven Auflistung aus dem Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmMerchantClearVersion">
Diese Aktion deaktiviert den Versionsordner der aktuellen Auflistung. Möchten Sie fortfahren?
<usetemplate ignoretext="Vor Deaktivieren des Versionsordners einer Auflistung im Marktplatz bestätigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="AlertMerchantListingNotUpdated">
Diese Auflistung konnte nicht aktualisiert werden.
[[URL] Klicken Sie hier], um sie im Marktplatz zu bearbeiten.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AlertMerchantListingCannotWear">
Sie können keine Kleidung oder Körperteile tragen, die im Marktplatz-Auflistungsordner enthalten sind
</notification>
<notification name="AlertMerchantListingInvalidID">
Auflistungs-ID ungültig.
</notification>
<notification name="AlertMerchantListingActivateRequired">
In dieser Auflistung gibt es mehrere oder keine Versionsordner. Sie müssen später einen auswählen und aktivieren.
<usetemplate ignoretext="Benachrichtung zur Versionsordneraktivierung, wenn ich eine Auflistung mit mehreren Versionsordnern erstelle" name="okignore" yestext="OK"/>
</notification>
<notification name="AlertMerchantStockFolderSplit">
Wir haben Bestandsobjekte unterschiedlicher Typen in separate Bestandsordner gelegt, damit wir Ihren Ordner auflisten können.
<usetemplate ignoretext="Benachrichtigen,wenn Bestandsordner vor dem Auflisten aufgeteilt wird" name="okignore" yestext="OK"/>
</notification>
<notification name="AlertMerchantStockFolderEmpty">
Wir haben Ihre Auflistung entfernt, da der Bestandsordner leer ist. Um diese Auflistung wieder zu listen, müssen Sie weitere Einheiten zum Bestandsordner hinzufügen.
<usetemplate ignoretext="Benachrichtigen, wenn Auflistung aufgrund eines leeren Bestandsordners nicht aufgelistet wird" name="okignore" yestext="OK"/>
</notification>
<notification name="CompileQueueSaveText">
Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut.
</notification>
@ -1962,6 +2044,9 @@ Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belas
Die Region, die Sie besuchen möchten, enthält Inhalte, die Ihre aktuellen Einstellungen überschreiten. Sie können Ihre Einstellungen unter „Avatar“ &gt; „Einstellungen“ &gt; „Allgemein“ ändern.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="SLM_UPDATE_FOLDER">
[MESSAGE]
</notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
Die Region, die Sie besuchen möchten, enthält [REGIONMATURITY]-Inhalte, die nur für Erwachsene zugänglich sind.
<url name="url">
@ -2252,8 +2337,8 @@ Inventarobjekt(e) verschieben?
</form>
</notification>
<notification name="PayConfirmation">
Bestätigen Sie, dass sie L$[AMOUNT] an [TARGET] zahlen möchten.
<usetemplate ignoretext="Bestätigen, bevor Zahlungen getätigt werden (Summen über L$200)" name="okcancelignore" notext="Abbrechen" yestext="Bezahlen"/>
Bestätigen Sie, dass Sie L$ [AMOUNT] an [TARGET] zahlen möchten.
<usetemplate ignoretext="Vor den Bezahlen bestätigen (Summen über L$ 200)" name="okcancelignore" notext="Abbrechen" yestext="Bezahlen"/>
</notification>
<notification name="PayObjectFailed">
Zahlung fehlgeschlagen: Objekt wurde nicht gefunden.
@ -4021,7 +4106,7 @@ Sie ist voll oder startet in Kürze neu.
</notification>
<notification name="TeleportedByObjectOnParcel">
Sie wurden von Objekt „[OBJECT_NAME]“ auf der Parzelle „[PARCEL_NAME]“ teleportiert
<usetemplate ignoretext="Teleport: Sie wurden von einem Objekt auf einer Parzelle teleportiert." name="notifyignore"/>
<usetemplate ignoretext="Teleport: Sie wurden von einem Objekt in einer Parzelle teleportiert" name="notifyignore"/>
</notification>
<notification name="TeleportedByObjectOwnedBy">
Sie wurden von Objekt „[OBJECT_NAME]“, das [OWNER_ID] gehört, teleportiert
@ -4359,7 +4444,7 @@ Wählen Sie eine kleinere Landfläche aus.
<usetemplate ignoretext="Dateien können nicht verschoben werden. Vorheriger Pfad wurde wiederhergestellt." name="okignore" yestext="OK"/>
</notification>
<notification name="DefaultObjectPermissions">
Es ist ein Problem beim Speichern der Standardberechtigungen aufgetreten. Ursache: [REASON]. Bitte versuchen Sie in ein paar Minuten noch einmal die Standardberechtigungen zu speichern.
Problem beim Speichern der standardmäßigen Objektberechtigungen: [REASON]. Versuchen Sie später, die Standardberechtigungen einzustellen.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ChatHistoryIsBusyAlert">

View File

@ -1,26 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<panel name="panel_login">
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=de
</panel.string>
<panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=de</panel.string>
<layout_stack name="ui_stack">
<layout_panel name="ui_container">
<combo_box label="Benutzername" name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/>
<line_editor label="Kennwort" name="password_edit"/>
<check_box label="Details speichern" name="remember_check"/>
<text name="forgot_password_text">
Kennwort vergessen
</text>
<button label="Anmelden" name="connect_btn"/>
<text name="At_My_Last_Location_Label">
bei letztem Ort
</text>
<combo_box label="Meine Lieblingsorte" name="start_location_combo">
<combo_box.item label="Mein letzter Standort" name="MyLastLocation"/>
<combo_box.item label="Mein Zuhause" name="MyHome"/>
</combo_box>
<button label="Anmelden" name="connect_favorite_btn"/>
<line_editor label="Ort eingeben" name="location_edit"/>
<button label="Anmelden" name="connect_location_btn"/>
<button label="Anmelden" name="connect_btn"/>
<check_box label="Details speichern" name="remember_check"/>
<text name="forgot_password_text">Kennwort vergessen</text>
<combo_box label="Grid auswählen" name="server_combo"/>
</layout_panel>
</layout_stack>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Marktplatz" name="Marketplace Panel">
<panel name="tool_panel">
<menu_button name="sort_btn" tool_tip="Anzeige-/Sortieroptionen"/>
<button name="add_btn" tool_tip="Neuen Auflistungsordner erstellen"/>
<button label="Auf Fehler prüfen" name="audit_btn" tool_tip="Marktplatz-Auflistungen überprüfen"/>
</panel>
<panel name="tab_container_panel">
<filter_editor label="Marktplatz-Auflistungen filtern" name="filter_editor"/>
</panel>
</panel>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<inventory_panel label="ALLE" name="All Items" tool_tip="Objekte zum Auflisten hier ablegen"/>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<inventory_panel label="AUFGELISTET" name="Active Items"/>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<inventory_panel label="NICHT VERKNÜPFT" name="Unassociated Items"/>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<inventory_panel label="NICHT AUFGELISTET" name="Inactive Items"/>

View File

@ -1,20 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
<panel.string name="packet_loss_tooltip">
Paketverlust
</panel.string>
<panel.string name="bandwidth_tooltip">
Bandbreite
</panel.string>
<panel.string name="time">
[hour24, 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]
</panel.string>
<panel.string name="buycurrencylabel">
[AMT] L$
</panel.string>
<panel.string name="packet_loss_tooltip">Paketverlust</panel.string>
<panel.string name="bandwidth_tooltip">Bandbreite</panel.string>
<panel.string name="time">[hour24, 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]</panel.string>
<panel.string name="buycurrencylabel">[AMT] L$</panel.string>
<panel name="menu_search_panel">
<search_editor label="Menü durchs." name="search_menu_edit" tool_tip="Den Suchbegriff hier eingeben. Ergebnisse werden für Treffer im Namen eines Menüeintrags angezeigt."/>
</panel>

View File

@ -72,8 +72,9 @@
<check_box label="Übertragen" name="CheckNextOwnerTransfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
</panel>
<check_box label="Zum Verkauf" name="CheckPurchase"/>
<combo_box name="combobox sale copy">
<combo_box.item label="Kopieren" name="Copy"/>
<combo_box name="ComboBoxSaleType">
<combo_box.item label="Kopie" name="Copy"/>
<combo_box.item label="Inhalt" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Preis: L$" name="Edit Cost"/>

View File

@ -1,72 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="Objektprofil">
<panel.string name="text deed continued">
Übertragung
</panel.string>
<panel.string name="text deed">
Übertragung
</panel.string>
<panel.string name="text modify info 1">
Sie können dieses Objekt bearbeiten.
</panel.string>
<panel.string name="text modify info 2">
Sie können diese Objekte bearbeiten.
</panel.string>
<panel.string name="text modify info 3">
Sie können dieses Objekt nicht bearbeiten.
</panel.string>
<panel.string name="text modify info 4">
Sie können diese Objekte nicht bearbeiten.
</panel.string>
<panel.string name="text modify info 5">
Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden.
</panel.string>
<panel.string name="text modify info 6">
Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden.
</panel.string>
<panel.string name="text modify warning">
Dieses Objekt verfügt über verknüpfte Teile.
</panel.string>
<panel.string name="Cost Default">
Preis: L$
</panel.string>
<panel.string name="Cost Total">
Summe: L$
</panel.string>
<panel.string name="Cost Per Unit">
Stückpreis: L$
</panel.string>
<panel.string name="Cost Mixed">
Mischpreis
</panel.string>
<panel.string name="Sale Mixed">
Mischverkauf
</panel.string>
<panel.string name="text deed continued">Übertragung</panel.string>
<panel.string name="text deed">Übertragung</panel.string>
<panel.string name="text modify info 1">Sie können dieses Objekt bearbeiten.</panel.string>
<panel.string name="text modify info 2">Sie können diese Objekte bearbeiten.</panel.string>
<panel.string name="text modify info 3">Sie können dieses Objekt nicht bearbeiten.</panel.string>
<panel.string name="text modify info 4">Sie können diese Objekte nicht bearbeiten.</panel.string>
<panel.string name="text modify info 5">Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden.</panel.string>
<panel.string name="text modify info 6">Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden.</panel.string>
<panel.string name="text modify warning">Dieses Objekt verfügt über verknüpfte Teile.</panel.string>
<panel.string name="Cost Default">Preis: L$</panel.string>
<panel.string name="Cost Total">Summe: L$</panel.string>
<panel.string name="Cost Per Unit">Stückpreis: L$</panel.string>
<panel.string name="Cost Mixed">Mischpreis</panel.string>
<panel.string name="Sale Mixed">Mischverkauf</panel.string>
<text name="title" value="Objektprofil"/>
<text name="where" value="(Inworld)"/>
<scroll_container name="item_profile_scroll">
<panel label="" name="properties_panel">
<text name="Name:">
Name:
</text>
<text name="Description:">
Beschreibung:
</text>
<text name="CreatorNameLabel">
Ersteller:
</text>
<text name="Owner:">
Eigentümer:
</text>
<text name="Group_label">
Gruppe:
</text>
<text name="Name:">Name:</text>
<text name="Description:">Beschreibung:</text>
<text name="CreatorNameLabel">Ersteller:</text>
<text name="Owner:">Eigentümer:</text>
<text name="Group_label">Gruppe:</text>
<button name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/>
<name_box initial_value="Wird geladen..." name="Group Name Proxy"/>
<button label="Übertragung" label_selected="Übertragung" name="button deed" tool_tip="Eine Übertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/>
<text name="label click action">
Bei Linksklick:
</text>
<text name="label click action">Bei Linksklick:</text>
<combo_box name="clickaction">
<combo_box.item label="Berühren" name="Touch/grab(default)"/>
<combo_box.item label="Sitzen" name="Sitonobject"/>
@ -76,21 +36,13 @@
<combo_box.item label="Zoomen" name="Zoom"/>
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Sie können dieses Objekt bearbeiten.
</text>
<text name="Anyone can:">
Jeder:
</text>
<text name="perm_modify">Sie können dieses Objekt bearbeiten.</text>
<text name="Anyone can:">Jeder:</text>
<check_box label="Kopieren" name="checkbox allow everyone copy"/>
<check_box label="Bewegen" name="checkbox allow everyone move"/>
<text name="GroupLabel">
Gruppe:
</text>
<text name="GroupLabel">Gruppe:</text>
<check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
<text name="NextOwnerLabel">
Nächster Eigentümer:
</text>
<text name="NextOwnerLabel">Nächster Eigentümer:</text>
<check_box label="Bearbeiten" name="checkbox next owner can modify"/>
<check_box label="Kopieren" name="checkbox next owner can copy"/>
<check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/>
@ -103,27 +55,13 @@
</combo_box>
<spinner label="Preis: L$" name="Edit Cost"/>
<check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/>
<text name="pathfinding_attributes_label">
Pathfinding-Attribute:
</text>
<text name="B:">
B:
</text>
<text name="O:">
O:
</text>
<text name="G:">
G:
</text>
<text name="E:">
E:
</text>
<text name="N:">
N:
</text>
<text name="F:">
F:
</text>
<text name="pathfinding_attributes_label">Pathfinding-Attribute:</text>
<text name="B:">B:</text>
<text name="O:">O:</text>
<text name="G:">G:</text>
<text name="E:">E:</text>
<text name="N:">N:</text>
<text name="F:">F:</text>
</panel>
</scroll_container>
<layout_stack name="buttons_ls">

View File

@ -528,58 +528,18 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="TooltipFlagNoScripts">
Skripte aus
</string>
<string name="TooltipLand">
Land:
</string>
<string name="TooltipMustSingleDrop">
Sie können nur ein einzelnes Objekt hierher ziehen
</string>
<string name="TooltipTooManyWearables">
Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ &gt; „Debug-Einstellungen anzeigen“ &gt; „WearFolderLimit“ ändern.
</string>
<string name="TooltipPrice" value="[AMOUNT] L$"/>
<string name="TooltipOutboxDragToWorld">
Sie können Artikel nicht in Ihrer Händler-Outbox rezzen
</string>
<string name="TooltipFlagScript">
Skript
</string>
<string name="TooltipOutboxNoTransfer">
Einer oder mehrere dieser Artikel können nicht verkauft oder übertragen werden.
</string>
<string name="TooltipOutboxNotInInventory">
Nur Artikel direkt aus Ihrem Inventar können in Ihre Händler-Outbox gelegt werden
</string>
<string name="TooltipFlagPhysics">
Physik
</string>
<string name="TooltipOutboxWorn">
Artikel, die Sie tragen, können nicht in Ihre Händler-Outbox gelegt werden.
</string>
<string name="TooltipOutboxCallingCard">
Sie können keine Visitenkarten in Ihre Händler-Outbox legen
</string>
<string name="TooltipFlagTouch">
Berühren
</string>
<string name="TooltipOutboxFolderLevels">
Tiefe der verschachtelten Ordner überschreitet 3
</string>
<string name="TooltipOutboxTooManyFolders">
Anzahl von Unterordnern im obersten Ordner überschreitet 20
</string>
<string name="TooltipFlagL$">
L$
</string>
<string name="TooltipOutboxTooManyObjects">
Anzahl von Artikeln im obersten Ordner überschreitet 200
</string>
<string name="TooltipDragOntoOwnChild">
Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben
</string>
<string name="TooltipDragOntoSelf">
Sie können einen Ordner nicht in sich selbst verschieben
</string>
<string name="TooltipFlagDropInventory">
Inventar fallen lassen
</string>
@ -607,6 +567,64 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="TooltipPosition">
Position: [POSITION]
</string>
<string name="TooltipLand">
Land:
</string>
<string name="TooltipMustSingleDrop">
Sie können nur ein einzelnes Objekt hierher ziehen
</string>
<string name="TooltipTooManyWearables">
Sie können keinen Ordner tragen, der mehr als [AMOUNT] Elemente enthält. Sie können diesen Höchstwert unter „Erweitert“ &gt; „Debug-Einstellungen anzeigen“ &gt; „WearFolderLimit“ ändern.
</string>
<string name="TooltipPrice" value="[AMOUNT] L$"/>
<string name="TooltipOutboxDragToWorld">
Sie können keine Objekte aus dem Marktplatz-Auflistungsordner rezzen
</string>
<string name="TooltipOutboxWorn">
Sie können Objekte, die Sie tragen, nicht in den Marktplatz-Auflistungsordner stellen
</string>
<string name="TooltipOutboxFolderLevels">
Tiefe der verschachtelten Ordner überschreitet [AMOUNT]. Reduzieren Sie die Ordnertiefe. Verpacken Sie ggf. einige Artikel.
</string>
<string name="TooltipOutboxTooManyFolders">
Anzahl von Unterordnern überschreitet [AMOUNT]. Reduzieren Sie die Anzahl von Ordnern in Ihrer Auflistung. Verpacken Sie ggf. einige Artikel.
</string>
<string name="TooltipOutboxTooManyObjects">
Anzahl von Objekten überschreitet [AMOUNT]. Um mehr als [AMOUNT] Objekte in einer Auflistung verkaufen zu können, müssen Sie einige davon verpacken.
</string>
<string name="TooltipOutboxTooManyStockItems">
Anzahl von Bestandsobjekten überschreitet [AMOUNT].
</string>
<string name="TooltipOutboxCannotDropOnRoot">
Sie können Objekte oder Ordner nur in der Registerkarte „Alle“ ablegen. Wählen Sie diese Registerkarte aus und verschieben Sie Ihre Objekte bzw. Ordner noch einmal.
</string>
<string name="TooltipOutboxNoTransfer">
Mindestens eines dieser Objekte kann nicht verkauft oder übertragen werden
</string>
<string name="TooltipOutboxNotInInventory">
Sie können nur Objekte aus Ihrem Inventar in den Marktplatz einstellen
</string>
<string name="TooltipOutboxLinked">
Sie können keine verknüpften Objekte oder Ordner in den Marktplatz einstellen
</string>
<string name="TooltipOutboxCallingCard">
Sie können Visitenkarten nicht in den Marktplatz einstellen
</string>
<string name="TooltipOutboxDragActive">
Sie können keine gelistete Auflistung entfernen
</string>
<string name="TooltipOutboxCannotMoveRoot">
Der Stammordner mit Marktplatz-Auflistungen kann nicht verschoben werden.
</string>
<string name="TooltipOutboxMixedStock">
Alle Objekte in einem Bestandsordner müssen vom gleichen Typ sein und die gleiche Berechtigung haben
</string>
<string name="TooltipDragOntoOwnChild">
Sie können einen Ordner nicht in einen seiner untergeordneten Ordner verschieben
</string>
<string name="TooltipDragOntoSelf">
Sie können einen Ordner nicht in sich selbst verschieben
</string>
<string name="TooltipHttpUrl">
Anklicken, um Webseite anzuzeigen
</string>
@ -1565,6 +1583,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="FavoritesNoMatchingItems">
Landmarke hier hin ziehen, um diese hinzuzufügen.
</string>
<string name="MarketplaceNoMatchingItems">
Keine übereinstimmenden Objekte gefunden. Überprüfen Sie die Schreibweise des Suchbegriffs und versuchen Sie es noch einmal.
</string>
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
@ -1612,29 +1633,95 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InventoryOutboxError">
Der [[MARKETPLACE_CREATE_STORE_URL] Marktplatz-Laden] gibt Fehler zurück.
</string>
<string name="InventoryMarketplaceError">
Diese Funktion befindet sich in der Betaphase. Wenn Sie teilnehmen möchten, tragen Sie sich in dieses [http://goo.gl/forms/FCQ7UXkakz Google-Formular] ein.
</string>
<string name="InventoryMarketplaceListingsNoItemsTitle">
Ihr Ordner mit Marktplatz-Auflistungen ist leer.
</string>
<string name="InventoryMarketplaceListingsNoItems">
Ziehen Sie Ordner in diesen Bereich, um sie im [[MARKETPLACE_DASHBOARD_URL] Marktplatz] zum Verkauf anzubieten.
</string>
<string name="Marketplace Validation Warning Stock">
Bestandsordner müssen in einem Versionsordner gespeichert sein
</string>
<string name="Marketplace Validation Error Mixed Stock">
: Fehler: Alle Objekte in einem Bestandsordner müssen kopiergeschützt und vom gleichen Typ sein.
</string>
<string name="Marketplace Validation Error Subfolder In Stock">
: Fehler: Bestandsordner kann keine Unterordner enthalten
</string>
<string name="Marketplace Validation Warning Empty">
: Warnung: Ordner enthält keine Objekte
</string>
<string name="Marketplace Validation Warning Create Stock">
: Warnung: Bestandsordner wird erstellt
</string>
<string name="Marketplace Validation Warning Create Version">
: Warnung: Versionsordner wird erstellt
</string>
<string name="Marketplace Validation Warning Move">
: Warnung: Objekte werden verschoben
</string>
<string name="Marketplace Validation Warning Delete">
: Warnung: Ordnerinhalte wurden in Bestandsordner übertragen; leerer Ordner wird entfernt
</string>
<string name="Marketplace Validation Error Stock Item">
: Fehler: Kopiergeschützte Objekte müssen in einem Bestandsordner gespeichert sein
</string>
<string name="Marketplace Validation Warning Unwrapped Item">
: Warnung: Objekte müssen in einem Versionsordner gespeichert sein
</string>
<string name="Marketplace Validation Error">
: Fehler:
</string>
<string name="Marketplace Validation Warning">
: Warnung:
</string>
<string name="Marketplace Validation Error Empty Version">
: Warnung: Versionsordner muss mindestens 1 Objekt enthalten
</string>
<string name="Marketplace Validation Error Empty Stock">
: Warnung: Bestandsordner muss mindestens 1 Objekt enthalten
</string>
<string name="Marketplace Validation No Error">
Keine Fehler oder Warnungen
</string>
<string name="Marketplace Error None">
Keine Fehler
</string>
<string name="Marketplace Error Prefix">
Fehler:
</string>
<string name="Marketplace Error Not Merchant">
Fehler: Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).
Bevor Sie Artikel in den Marktplatz übertragen können, müssen Sie sich als Händler registrieren (kostenlos).
</string>
<string name="Marketplace Error Empty Folder">
Fehler: Dieser Ordner ist leer.
</string>
<string name="Marketplace Error Unassociated Products">
Fehler: Dieser Artikel konnte nicht hochgeladen werden, da in Ihrem Händlerkonto zu viele Artikel nicht mit Produkten verknüpft sind. Um diesen Fehler zu beheben, melden Sie sich auf der Marktplatz-Website an und reduzieren Sie die Anzahl von Artikeln, die nicht mit Produkten verknüpft sind.
</string>
<string name="Marketplace Error Object Limit">
Fehler: Dieser Artikel enthält zu viele Objekte. Beheben Sie diesen Fehler, indem Sie Objekte zusammen in Behältern verpacken, um die Objektanzahl auf unter 200 zu verringern.
</string>
<string name="Marketplace Error Folder Depth">
Fehler: Dieser Artikel enthält zu viele verschachtelte Ordnerebenen. Organisieren Sie ihn neu, sodass maximal drei verschachtelte Ordnerebenen vorhanden sind.
<string name="Marketplace Error Not Accepted">
Objekt kann nicht in diesen Ordner verschoben werden.
</string>
<string name="Marketplace Error Unsellable Item">
Fehler: Dieser Artikel kann nicht im Marktplatz verkauft werden.
Dieses Objekt kann nicht im Marktplatz verkauft werden.
</string>
<string name="Marketplace Error Internal Import">
Fehler: Bei diesem Artikel ist ein Problem aufgetreten. Versuchen Sie es später erneut.
<string name="MarketplaceNoID">
keine Mkt-ID
</string>
<string name="MarketplaceLive">
aufgelistet
</string>
<string name="MarketplaceActive">
aktiv
</string>
<string name="MarketplaceMax">
max.
</string>
<string name="MarketplaceStock">
Bestand
</string>
<string name="MarketplaceNoStock">
ausverkauft
</string>
<string name="MarketplaceUpdating">
Aktualisierung läuft...
</string>
<string name="Open landmarks">
Landmarken öffnen
@ -1655,6 +1742,7 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
Keine Inhalte
</string>
<string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
<string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
<string name="PermYes">
Ja
@ -1929,13 +2017,13 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
Ungültige Stelle für Anhang
</string>
<string name="ATTACHMENT_MISSING_ITEM">
Fehler: Fehlender Gegenstand
Fehler: fehlendes Objekt
</string>
<string name="ATTACHMENT_MISSING_BASE_ITEM">
Fehler: Fehlender Basisgegenstand
Fehler: Basisobjekt fehlt
</string>
<string name="ATTACHMENT_NOT_ATTACHED">
Fehler: Objekt ist Teil des aktuellen Outfits, aber wird nicht getragen
Fehler: Objekt ist im aktuellen Outfit, aber nicht angehängt
</string>
<string name="YearsMonthsOld">
[AGEYEARS] [AGEMONTHS]
@ -2057,9 +2145,6 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="CompileQueueServiceUnavailable">
Kein Skriptkompilierungsdienst verfügbar
</string>
<string name="CompileQueueServiceUnavailable">
Kein Skriptkompilierungsdienst verfügbar
</string>
<string name="CompileQueueScriptNotFound">
Skript wurde auf Server nicht gefunden.
</string>
@ -2075,9 +2160,6 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="CompileQueueUnknownFailure">
Unbekannter Fehler beim Herunterladen
</string>
<string name="CompileNoExperiencePerm">
Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen.
</string>
<string name="CompileQueueTitle">
Skripte rekompilieren
</string>
@ -2132,6 +2214,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="GroupsNone">
keine
</string>
<string name="CompileNoExperiencePerm">
Skript „[SCRIPT]“ mit Erlebnis „[EXPERIENCE]“ wird übersprungen.
</string>
<string name="Group" value=" (Gruppe)"/>
<string name="Unknown">
(unbekannt)
@ -5360,6 +5445,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Marketplace_Label">
Marktplatz
</string>
<string name="Command_MarketplaceListings_Label">
Marktplatz
</string>
<string name="Command_MiniMap_Label">
Minikarte
</string>
@ -5532,6 +5620,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="Command_Marketplace_Tooltip">
Einkaufen gehen
</string>
<string name="Command_MarketplaceListings_Tooltip">
Ihre Kreation verkaufen
</string>
<string name="Command_MiniMap_Tooltip">
Leute in der Nähe anzeigen (Strg+Umschalt+M)
</string>
@ -5724,6 +5815,18 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="UserDictionary">
[Benutzer]
</string>
<string name="logging_calls_disabled_log_empty">
Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Chat“.
</string>
<string name="logging_calls_disabled_log_not_empty">
Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Chat“.
</string>
<string name="logging_calls_enabled_log_empty">
Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden.
</string>
<string name="loading_chat_logs">
Laden...
</string>
<string name="experience_tools_experience">
Erlebnis
</string>
@ -5805,18 +5908,6 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="ExperiencePermissionShort12">
Berechtigung
</string>
<string name="logging_calls_disabled_log_empty">
Unterhaltungen werden nicht protokolliert. Um ein Protokoll zu starten, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Privatsphäre“.
</string>
<string name="logging_calls_disabled_log_not_empty">
Es werden keine Unterhaltungen mehr protokolliert. Um weiterhin ein Protokoll zu führen, wählen Sie „Speichern: nur Protokoll“ oder „Speichern: Protokoll und Transkripte“ unter „Einstellungen“ &gt; „Privatsphäre“.
</string>
<string name="logging_calls_enabled_log_empty">
Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden.
</string>
<string name="loading_chat_logs">
Laden...
</string>
<!-- Firestorm-specific translations -->
<string name="MediaFilterActionAllow">

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
can_minimize="false"
height="110"
layout="topleft"
name="associate listing"
help_topic="associate_listing"
title="ASSOCIATE LISTING"
width="375">
<text
type="string"
length="1"
follows="top|left"
font="SansSerifLarge"
height="16"
layout="topleft"
left="10"
top="25"
name="message">
Listing ID:
</text>
<line_editor
type="string"
length="1"
follows="top|right"
font="SansSerif"
height="20"
layout="topleft"
left_delta="0"
name="listing_id"
top_pad="5"
width="350">
Type ID here
</line_editor>
<button
follows="bottom|left"
height="23"
label="OK"
layout="topleft"
left="155"
name="OK"
top_pad="10"
width="100" />
<button
follows="bottom|right"
height="23"
label="Cancel"
layout="topleft"
left_pad="5"
name="Cancel"
width="100" />
</floater>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
height="570"
layout="topleft"
name="Item Properties"
help_topic="item+properties"
title="ITEM PROPERTIES"
width="330">
<panel
follows="all"
layout="topleft"
left="0"
class="sidepanel_item_info"
filename="sidepanel_item_info.xml"
name="item_panel"
top="20"
label=""
height="570"
visible="true"
width="330">
</panel>
</floater>

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<floater
title="MARKETPLACE LISTINGS"
name="floater_marketplace_listings"
help_topic="floater_marketplace_listings"
positioning="cascading"
width="333"
height="445"
min_width="200"
min_height="300"
can_close="true"
can_resize="true"
save_rect="true"
save_visibility="false"
reuse_instance="true">
<panel
name="marketplace_listings_panel"
follows="all"
layout="topleft"
left="0"
top="0"
height="440"
width="333">
<panel
follows="all"
left="10"
height="440"
width="313"
top="0"
bg_opaque_color="InventoryBackgroundColor">
<panel
name="marketplace_listings_inventory_placeholder_panel"
follows="all"
layout="topleft"
top="0"
left="0"
width="313"
height="440"
bg_opaque_color="InventoryBackgroundColor">
<text
name="marketplace_listings_inventory_placeholder_title"
type="string"
follows="top|left|right"
layout="topleft"
top="10"
left="0"
width="313"
height="25"
wrap="true"
halign="center"
font="SansSerifBold">
Loading...
</text>
<text
name="marketplace_listings_inventory_placeholder_text"
type="string"
follows="top|left|right"
layout="topleft"
top="35"
left="0"
width="313"
height="130"
wrap="true"
halign="left" />
</panel>
<panel
name="panel_marketplace_listing"
filename="panel_marketplace_listings.xml"
class="llpanelmarketplacelistings"
top="0"
follows="all"/>
</panel>
<panel
name="marketplace_panel_status"
follows="bottom|left|right"
layout="topleft"
left="10"
width="313"
height="20">
<text
name="marketplace_status"
type="string"
follows="bottom|left|right"
layout="topleft"
top="0"
left="5"
width="150"
height="20"
wrap="true"
halign="left"
valign="center"
font="SansSerif"/>
</panel>
<layout_stack name="initialization_progress_indicator" orientation="vertical" left="0" height="440" top="0" width="333" follows="all" visible="false">
<layout_panel />
<layout_panel height="24" auto_resize="false">
<layout_stack orientation="horizontal" left="0" height="24" top="0" width="333" follows="all">
<layout_panel width="0" />
<layout_panel width="24" auto_resize="false">
<loading_indicator
height="24"
layout="topleft"
left="0"
top="0"
width="24" />
</layout_panel>
<layout_panel width="0" />
</layout_stack>
</layout_panel>
<layout_panel />
</layout_stack>
</panel>
</floater>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
title="Audit Marketplace Listings"
name="floater_marketplace_validation"
help_topic="floater_marketplace_validation"
layout="topleft"
positioning="cascading"
legacy_header_height="18"
width="600"
height="500"
min_width="400"
min_height="200"
can_close="true"
can_resize="true"
can_minimize="true"
save_rect="true"
reuse_instance="true"
save_visibility="false">
<button
name="OK"
label="OK"
label_selected="OK"
layout="topleft"
follows="right|bottom"
top="465"
width="100"
height="20"
left="484"/>
<text_editor
name="validation_text"
type="string"
font="SansSerif"
length="1"
max_length="65536"
layout="topleft"
follows="all"
bg_readonly_color="TextBgReadOnlyColor"
text_readonly_color="TextFgReadOnlyColor"
top="25"
bottom="455"
left="20"
right="-20"
word_wrap="true">
MARKETPLACE_VALIDATION_TEXT
</text_editor>
</floater>

View File

@ -4,6 +4,81 @@
layout="topleft"
name="Popup"
visible="false">
<menu_item_call
label="Create listing"
layout="topleft"
name="Marketplace Create Listing">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_create_listing" />
</menu_item_call>
<menu_item_call
label="Associate listing"
layout="topleft"
name="Marketplace Associate Listing">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_associate_listing" />
</menu_item_call>
<menu_item_call
label="Get (Refresh) listing"
layout="topleft"
name="Marketplace Get Listing">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_get_listing" />
</menu_item_call>
<menu_item_call
label="Check for errors"
layout="topleft"
name="Marketplace Check Listing">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_check_listing" />
</menu_item_call>
<menu_item_call
label="Edit listing"
layout="topleft"
name="Marketplace Edit Listing">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_edit_listing" />
</menu_item_call>
<menu_item_call
label="List"
layout="topleft"
name="Marketplace List">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_list" />
</menu_item_call>
<menu_item_call
label="Unlist"
layout="topleft"
name="Marketplace Unlist">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_unlist" />
</menu_item_call>
<menu_item_call
label="Activate"
layout="topleft"
name="Marketplace Activate">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_activate" />
</menu_item_call>
<menu_item_call
label="Deactivate"
layout="topleft"
name="Marketplace Deactivate">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="marketplace_deactivate" />
</menu_item_call>
<menu_item_separator
layout="topleft"
name="Marketplace Listings Separator" />
<menu_item_call
label="Share"
layout="topleft"
@ -779,12 +854,20 @@
parameter="copy_to_outbox" />
</menu_item_call>
<menu_item_call
label="Send to Marketplace"
layout="topleft"
name="Marketplace Send">
label="Copy to Marketplace Listings"
layout="topleft"
name="Marketplace Copy">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="send_to_marketplace" />
function="Inventory.DoToSelected"
parameter="copy_to_marketplace_listings" />
</menu_item_call>
<menu_item_call
label="Move to Marketplace Listings"
layout="topleft"
name="Marketplace Move">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="move_to_marketplace_listings" />
</menu_item_call>
<menu_item_call
label="--no options--"

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<toggleable_menu
name="menu_marketplace_sort"
left="0" bottom="0" visible="false"
mouse_opaque="false">
<menu_item_check
label="Sort by name"
name="sort_by_name">
<menu_item_check.on_click
function="Marketplace.ViewSort.Action"
parameter="sort_by_name" />
<menu_item_check.on_check
function="Marketplace.ViewSort.CheckItem"
parameter="sort_by_name" />
</menu_item_check>
<menu_item_check
label="Sort by most recent"
name="sort_by_recent">
<menu_item_check.on_click
function="Marketplace.ViewSort.Action"
parameter="sort_by_recent" />
<menu_item_check.on_check
function="Marketplace.ViewSort.CheckItem"
parameter="sort_by_recent" />
</menu_item_check>
<menu_item_check
label="Sort by stock amount (low to high)"
name="sort_by_stock_amount">
<menu_item_check.on_click
function="Marketplace.ViewSort.Action"
parameter="sort_by_stock_amount"/>
<menu_item_check.on_check
function="Marketplace.ViewSort.CheckItem"
parameter="sort_by_stock_amount"/>
</menu_item_check>
<menu_item_separator
layout="topleft" />
<menu_item_check
label="Show only listing folders"
name="show_only_listing_folders">
<menu_item_check.on_click
function="Marketplace.ViewSort.Action"
parameter="show_only_listing_folders"/>
<menu_item_check.on_check
function="Marketplace.ViewSort.CheckItem"
parameter="show_only_listing_folders"/>
</menu_item_check>
</toggleable_menu>

View File

@ -32,6 +32,13 @@
function="GridCheck"
parameter="secondlife"/>
</menu_item_call>
<menu_item_call
label="Marketplace listings..."
name="MarketplaceListings">
<menu_item_call.on_click
function="Floater.ToggleOrBringToFront"
parameter="marketplace_listings" />
</menu_item_call>
<menu_item_call
label="Buy L$"

View File

@ -309,9 +309,251 @@ Initialization with the Marketplace failed because of a system or network error.
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="OutboxStatus_Error"
name="StockPasteFailed"
type="outbox">
Copy or move to Stock Folder failed with error :
&apos;[ERROR_CODE]&apos;
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="OutboxStatus_Error"
name="MerchantPasteFailed"
type="outbox">
Copy or move to Marketplace Listings failed with error :
&apos;[ERROR_CODE]&apos;
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="OutboxStatus_Error"
name="MerchantTransactionFailed"
type="outbox">
The transaction with the Marketplace failed with the following error :
Reason : &apos;[ERROR_REASON]&apos;
[ERROR_DESCRIPTION]
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="OutboxStatus_Error"
name="MerchantUnprocessableEntity"
type="outbox">
We are unable to list this product or activate the version folder. Usually this is caused by missing information in the listing description form, but it may be due to errors in the folder structure. Either edit the listing or check the listing folder for errors.
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="OutboxStatus_Error"
name="MerchantListingFailed"
type="outbox">
Listing to Marketplace failed with error :
&apos;[ERROR_CODE]&apos;
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="OutboxStatus_Error"
name="MerchantFolderActivationFailed"
type="outbox">
Activating this version folder failed with error :
&apos;[ERROR_CODE]&apos;
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="MerchantForceValidateListing"
type="alertmodal">
In order to create your listing, we fixed the hierarchy of your listing contents.
<tag>confirm</tag>
<usetemplate
ignoretext="Warn me that creating a listing fixes the hierarchy of the content"
name="okignore"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmMerchantActiveChange"
type="alertmodal">
This action will change the active content of this listing. Do you want to continue?
<tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I change an active listing on the marketplace"
name="okcancelignore"
notext="Cancel"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmMerchantMoveInventory"
type="alertmodal">
Items dragged to the Marketplace Listings window are moved from their original locations, not copied. Do you want to continue?
<tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I move an item from the inventory to the marketplace"
name="okcancelignore"
notext="Cancel"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmListingCutOrDelete"
type="alertmodal">
Moving or deleting a listing folder will delete your Marketplace listing. If you would like to keep the Marketplace listing, move or delete the contents of the version folder you would like to modify. Do you want to continue?
<tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I move or delete a listing from the marketplace"
name="okcancelignore"
notext="Cancel"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmCopyToMarketplace"
type="alertmodal">
You don't have permission to copy one or more of these items to the Marketplace. You can move them or leave them behind.
<tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I try to copy a selection containing no copy items to the marketplace"
name="yesnocancelbuttons"
yestext="Move item(s)"
notext="Don't move item(s)"
canceltext="Cancel"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmMerchantUnlist"
type="alertmodal">
This action will unlist this listing. Do you want to continue?
<tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I unlist an active listing on the marketplace"
name="okcancelignore"
notext="Cancel"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmMerchantClearVersion"
type="alertmodal">
This action will deactivate the version folder of the current listing. Do you want to continue?
<tag>confirm</tag>
<usetemplate
ignoretext="Confirm before I deactivate the version folder of a listing on the marketplace"
name="okcancelignore"
notext="Cancel"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="AlertMerchantListingNotUpdated"
type="alertmodal">
This listing could not be updated.
[[URL] Click here] to edit it on the Marketplace.
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="AlertMerchantListingCannotWear"
type="alertmodal">
You cannot wear clothes or body parts that are in the Marketplace Listings folder.
<tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="AlertMerchantListingInvalidID"
type="alertmodal">
Invalid listing ID.
<tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
name="AlertMerchantListingActivateRequired"
type="alertmodal">
There are several or no version folders in this listing. You will need to select and activate one independently later.
<tag>confirm</tag>
<usetemplate
ignoretext="Alert about version folder activation when I create a listing with several version folders"
name="okignore"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="AlertMerchantStockFolderSplit"
type="alertmodal">
We have separated stock items of different types into separate stock folders, so your folder is arranged in a way that we can list it.
<tag>confirm</tag>
<usetemplate
ignoretext="Alert when stock folder is being split before being listed"
name="okignore"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="AlertMerchantStockFolderEmpty"
type="alertmodal">
We have unlisted your listing because the stock is empty. You need to add more units to the stock folder to list the listing again.
<tag>confirm</tag>
<usetemplate
ignoretext="Alert when a listing is unlisted because stock folder is empty"
name="okignore"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="AlertMerchantVersionFolderEmpty"
type="alertmodal">
We have unlisted your listing because the version folder is empty. You need to add items to the version folder to list the listing again.
<tag>confirm</tag>
<usetemplate
ignoretext="Alert when a listing is unlisted because version folder is empty"
name="okignore"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="CompileQueueSaveText"
type="alertmodal">
@ -4817,6 +5059,13 @@ Are you sure you want to change the estate covenant?
</notification>
<notification
icon="alertmodal.tga"
name="SLM_UPDATE_FOLDER"
type="alertmodal">
[MESSAGE]
</notification>
<notification
icon="alertmodal.tga"
name="RegionEntryAccessBlocked_AdultsOnlyContent"
type="alertmodal">

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
label="Marketplace"
name="Marketplace Panel"
follows="all"
layout="topleft"
width="308"
height="440">
<panel
name="tool_panel"
follows="left|top|right"
layout="topleft"
height="30"
width="308"
top="0"
left="0">
<menu_button
name="sort_btn"
tool_tip="View/sort options"
layout="topleft"
follows="top|left"
width="31"
height="25"
left="2"
menu_filename="menu_marketplace_view.xml"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="Conv_toolbar_sort"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
menu_position="bottomleft"/>
<button
name="add_btn"
tool_tip="Create a new listing folder"
layout="topleft"
follows="top|left"
width="31"
height="25"
left_pad="2"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay="Conv_toolbar_plus"
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"/>
<button
name="audit_btn"
label="Check for Errors"
tool_tip="Check your marketplace listings"
layout="topleft"
follows="top|right"
width="97"
height="26"
left_pad="143"/>
</panel>
<panel
name="tab_container_panel"
follows="all"
layout="topleft"
default_tab_group="1"
width="308"
height="350">
<filter_editor
text_pad_left="10"
follows="left|top|right"
height="23"
label="Filter Marketplace Listings"
layout="topleft"
left="0"
max_length_chars="300"
name="filter_editor"
top="0"
width="308" />
<tab_container
name="marketplace_filter_tabs"
follows="all"
layout="topleft"
top="30"
left="0"
top_pad="0"
width="308"
height="320"
halign="center"
tab_height="30"
tab_group="1"
tab_position="top"
tab_min_width="50">
</tab_container>
</panel>
<panel
name="marketplace_drop_zone"
mouse_opaque="true"
follows="bottom|left|right"
left="2"
width="306"
height="40"
background_visible="true"
background_opaque="true"
bg_alpha_image="none"
bg_alpha_color="EmphasisColor_35"
bg_opaque_image="Marketplace_Dropzone_Background"
border="true"
bevel_style="in"
visible="true">
<text
type="string"
follows="bottom|left|right"
layout="topleft"
top="13"
height="20"
left="2"
width="306"
halign="center"
font="SansSerifMedium"
font_shadow="hard"
valign="top">
Drop folders here to create new listings
</text>
</panel>
</panel>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<inventory_panel
label="ALL"
name="All Items"
help_topic="marketplace_tab"
layout="topleft"
follows="all"
width="308"
height="370"
top="16"
left="0"
start_folder.name="Marketplace listings"
show_empty_message="true"
show_root_folder="false"
use_marketplace_folders="true"
start_folder.type="merchant"
tool_tip="Drag and drop items here to list them"
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
border="false"
bevel_style="none"
show_item_link_overlays="true">
<item allow_wear="false"/>
</inventory_panel>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<inventory_panel
label="LISTED"
name="Active Items"
help_topic="marketplace_tab"
layout="topleft"
follows="all"
width="308"
height="370"
left_delta="0"
start_folder.name="Marketplace listings"
show_empty_message="true"
show_root_folder="false"
use_marketplace_folders="true"
allow_drop_on_root="false"
start_folder.type="merchant"
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
border="false"
bevel_style="none"
show_item_link_overlays="true">
<item allow_wear="false"/>
</inventory_panel>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<inventory_panel
label="UNASSOCIATED"
name="Unassociated Items"
help_topic="marketplace_tab"
layout="topleft"
follows="all"
width="308"
height="370"
left_delta="0"
start_folder.name="Marketplace listings"
show_empty_message="true"
show_root_folder="false"
use_marketplace_folders="true"
start_folder.type="merchant"
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
border="false"
bevel_style="none"
show_item_link_overlays="true">
<item allow_wear="false"/>
</inventory_panel>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<inventory_panel
label="UNLISTED"
name="Inactive Items"
help_topic="marketplace_tab"
layout="topleft"
follows="all"
width="308"
height="370"
left_delta="0"
start_folder.name="Marketplace listings"
show_empty_message="true"
show_root_folder="false"
use_marketplace_folders="true"
allow_drop_on_root="false"
start_folder.type="merchant"
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
background_visible="true"
border="false"
bevel_style="none"
show_item_link_overlays="true">
<item allow_wear="false"/>
</inventory_panel>

View File

@ -27,5 +27,5 @@
text_pad_right="4"
arrow_size="12"
max_folder_item_overlap="2"/>
<item allow_open="false"/>
<item allow_wear="false"/>
</inventory_panel>

View File

@ -288,14 +288,20 @@ Please try logging in again in a minute.</string>
<string name="TooltipDistance">Distance: [DISTANCE] m</string>
<string name="TooltipPosition">Position: [POSITION]</string>
<string name="TooltipOutboxDragToWorld">You can not rez items in your merchant outbox</string>
<string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred.</string>
<string name="TooltipOutboxNotInInventory">Your merchant outbox can only accept items directly from your inventory</string>
<string name="TooltipOutboxWorn">You can not put items you are wearing into your merchant outbox</string>
<string name="TooltipOutboxCallingCard">You can not put calling cards into your merchant outbox</string>
<string name="TooltipOutboxFolderLevels">Depth of nested folders exceeds 3</string>
<string name="TooltipOutboxTooManyFolders">Subfolder count in top-level folder exceeds 20</string>
<string name="TooltipOutboxTooManyObjects">Item count in top-level folder exceeds 200</string>
<string name="TooltipOutboxDragToWorld">You can't rez items from the Marketplace Listings folder</string>
<string name="TooltipOutboxWorn">You can't put items you are wearing in the Marketplace Listings folder</string>
<string name="TooltipOutboxFolderLevels">Depth of nested folders exceeds [AMOUNT]. Decrease the depth of folders-within-folders; box items if necessary.</string>
<string name="TooltipOutboxTooManyFolders">Subfolder count exceeds [AMOUNT]. Decrease the number of folders in your listing; box items if necessary.</string>
<string name="TooltipOutboxTooManyObjects">Item count exceeds [AMOUNT]. In order to sell more than [AMOUNT] items in one listing, you must box some of them.</string>
<string name="TooltipOutboxTooManyStockItems">Stock items count exceeds [AMOUNT].</string>
<string name="TooltipOutboxCannotDropOnRoot">You can only drop items or folders in the ALL or UNASSOCIATED tabs. Please select one of those tabs and move your item(s) or folder(s) again.</string>
<string name="TooltipOutboxNoTransfer">One or more of these objects cannot be sold or transferred</string>
<string name="TooltipOutboxNotInInventory">You can only put items from your inventory on the marketplace</string>
<string name="TooltipOutboxLinked">You can't put linked items or folders on the marketplace</string>
<string name="TooltipOutboxCallingCard">You can't put calling cards on the marketplace</string>
<string name="TooltipOutboxDragActive">You can't move a listed listing</string>
<string name="TooltipOutboxCannotMoveRoot">You can't move the marketplace listings root folder</string>
<string name="TooltipOutboxMixedStock">All items in a stock folder must have the same type and permission</string>
<string name="TooltipDragOntoOwnChild">You can't move a folder into its child</string>
<string name="TooltipDragOntoSelf">You can't move a folder into itself</string>
@ -700,6 +706,7 @@ Please try logging in again in a minute.</string>
<string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
<string name="MarketplaceNoMatchingItems">No items found. Check the spelling of your search string and try again.</string>
<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
<string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string>
<string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
@ -727,16 +734,45 @@ We are accessing your account on the [[MARKETPLACE_CREATE_STORE_URL] Marketplace
<string name="InventoryOutboxError">
The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.
</string>
<string name="InventoryMarketplaceError">
This feature is currently in Beta. Please add your name to this [http://goo.gl/forms/FCQ7UXkakz Google form] if you would like to participate.
</string>
<string name="InventoryMarketplaceListingsNoItemsTitle">Your Marketplace Listings folder is empty.</string>
<string name="InventoryMarketplaceListingsNoItemsTooltip"></string>
<string name="InventoryMarketplaceListingsNoItems">
Drag folders to this area to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace].
</string>
<string name="Marketplace Validation Log"></string>
<string name="Marketplace Validation Warning Stock">stock folder must be contained by a version folder</string>
<string name="Marketplace Validation Error Mixed Stock">: Error: all items in a stock folder must be no-copy and of the same type</string>
<string name="Marketplace Validation Error Subfolder In Stock">: Error: stock folder cannot contain subfolders</string>
<string name="Marketplace Validation Warning Empty">: Warning: folder doesn't contain any items</string>
<string name="Marketplace Validation Warning Create Stock">: Warning: creating stock folder</string>
<string name="Marketplace Validation Warning Create Version">: Warning: creating version folder</string>
<string name="Marketplace Validation Warning Move">: Warning : moving items</string>
<string name="Marketplace Validation Warning Delete">: Warning: folder content transfered to stock folder, removing empty folder</string>
<string name="Marketplace Validation Error Stock Item">: Error: no-copy items must be contained by a stock folder</string>
<string name="Marketplace Validation Warning Unwrapped Item">: Warning: items must be contained by a version folder</string>
<string name="Marketplace Validation Error">: Error: </string>
<string name="Marketplace Validation Warning">: Warning: </string>
<string name="Marketplace Validation Error Empty Version">: Warning: version folder must contain at least 1 item</string>
<string name="Marketplace Validation Error Empty Stock">: Warning: stock folder must contain at least 1 item</string>
<string name="Marketplace Validation No Error">No errors or warnings to report</string>
<string name="Marketplace Error None">No errors</string>
<string name="Marketplace Error Not Merchant">Error: Before sending items to the Marketplace you will need to set yourself up as a merchant (free of charge).</string>
<string name="Marketplace Error Empty Folder">Error: This folder has no contents.</string>
<string name="Marketplace Error Unassociated Products">Error: This item failed to upload because your merchant account has too many items unassociated with products. To fix this error, log in to the marketplace website and reduce your unassociated item count.</string>
<string name="Marketplace Error Prefix">Error: </string>
<string name="Marketplace Error Not Merchant">Before sending items to the Marketplace you will need to set yourself up as a merchant (free of charge).</string>
<string name="Marketplace Error Not Accepted">Cannot move item in that folder.</string>
<string name="Marketplace Error Unsellable Item">This item cannot be sold on the Marketplace.</string>
<string name="Marketplace Error Object Limit">Error: This item contains too many objects. Fix this error by placing objects together in boxes to reduce the total count to less than 200.</string>
<string name="Marketplace Error Folder Depth">Error: This item contains too many levels of nested folders. Reorganize it to a maximum of 3 levels of nested folders.</string>
<string name="Marketplace Error Unsellable Item">Error: This item can not be sold on the marketplace.</string>
<string name="Marketplace Error Internal Import">Error: There was a problem with this item. Try again later.</string>
<string name="MarketplaceNoID">no Mkt ID</string>
<string name="MarketplaceLive">listed</string>
<string name="MarketplaceActive">active</string>
<string name="MarketplaceMax">max</string>
<string name="MarketplaceStock">stock</string>
<string name="MarketplaceNoStock">out of stock</string>
<string name="MarketplaceUpdating">updating...</string>
<string name="Open landmarks">Open landmarks</string>
<string name="Unconstrained">Unconstrained</string>
@ -2443,6 +2479,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Inventory_Label">Inventory</string>
<string name="Command_Map_Label">Map</string>
<string name="Command_Marketplace_Label">Marketplace</string>
<string name="Command_MarketplaceListings_Label">Marketplace</string>
<string name="Command_MiniMap_Label">Mini-map</string>
<string name="Command_Move_Label">Walk / run / fly</string>
<string name="Command_Outbox_Label">Merchant outbox</string>
@ -2502,6 +2539,7 @@ Try enclosing path to the editor with double quotes.
<string name="Command_Inventory_Tooltip">View and use your belongings (CTRL+I)</string>
<string name="Command_Map_Tooltip">Map of the world (CTRL+M)</string>
<string name="Command_Marketplace_Tooltip">Go shopping</string>
<string name="Command_MarketplaceListings_Tooltip">Sell your creation</string>
<string name="Command_MiniMap_Tooltip">Show nearby people (CTRL+SHIFT+M)</string>
<string name="Command_Move_Tooltip">Moving your avatar</string>
<string name="Command_Outbox_Tooltip">Transfer items to your marketplace for sale</string>

View File

@ -1,3 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<inbox_inventory_panel
start_folder.type="inbox"/>
<inbox_inventory_panel start_folder.type="inbox"/>

View File

@ -323,6 +323,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
</panel.string>
<panel.string name="DirectoryFee">
Mostrar en la Búsqueda ([DIRECTORY_FEE] L$/semana)
</panel.string>
<text name="allow_label">
Permitir a otros Residentes:
</text>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="associate listing" title="ASOCIAR ARTÍCULOS">
<text name="message">Id. de artículos:</text>
<line_editor name="listing_id">Escribe aquí el Id.</line_editor>
<button label="OK" name="OK"/>
<button label="Cancelar" name="Cancel"/>
</floater>

Some files were not shown because too many files have changed in this diff Show More