EXP-859 FIX -- Save setting for last time inbox expanded

EXP-841 PROGRESS -- Create outbox sync button with basic enable/disable logic and animation
EXP-866 PROGRESS -- Create inbox observer to dynamically update inbox item count and badge value
EXP-872 PROGRESS -- Hide inbox and outbox unless applicable

Inbox expansion time is now saved as setting variable "LastInventoryInboxExpand".

New outbox sync button art.

Observers for items and categories are now implemented in the LLSidepanelInventory but the exact
method of use is still to be determined.

Functions are in place to show and hide the inbox and outbox panels but the logic around the
decision is TBD.

The resize bar for the inbox/outbox is now disabled when both inbox and outbox are collapsed.

Reviewed by Leyla.
meow-7.2.2
Leslie Linden 2011-06-06 17:00:59 -07:00
parent 0c0f755878
commit 98bcd9e2ef
26 changed files with 319 additions and 93 deletions

View File

@ -86,6 +86,8 @@ public:
*/
void start();
void reset() { mCurImageIdx = 0; }
private:
LLLoadingIndicator(const Params&);
void initFromParams(const Params&);

View File

@ -364,8 +364,8 @@ LLOutfitsList::~LLOutfitsList()
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
delete mCategoriesObserver;
}
delete mCategoriesObserver;
}
BOOL LLOutfitsList::postBuild()

View File

@ -68,7 +68,17 @@ void LLPanelMarketplaceInbox::draw()
model->getDirectDescendentsOf(model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false, false), cats, items);
S32 item_count = cats->size() + items->size();
S32 item_count = 0;
if (cats)
{
item_count += cats->size();
}
if (items)
{
item_count += items->size();
}
if (item_count)
{

View File

@ -81,7 +81,7 @@ std::string gTimeDelayDebugFunc = "";
void timeDelay(LLCoros::self& self, LLPanelMarketplaceOutbox* outboxPanel)
{
waitForEventOn(self, "mainloop");
waitForEventOn(self, "mainloop");
LLTimer delayTimer;
delayTimer.reset();
@ -89,7 +89,7 @@ void timeDelay(LLCoros::self& self, LLPanelMarketplaceOutbox* outboxPanel)
while (!delayTimer.hasExpired())
{
waitForEventOn(self, "mainloop");
waitForEventOn(self, "mainloop");
}
outboxPanel->onSyncComplete();
@ -123,6 +123,7 @@ void LLPanelMarketplaceOutbox::updateSyncButtonStatus()
mSyncButton->setVisible(false);
mSyncIndicator->setVisible(true);
mSyncIndicator->reset();
mSyncIndicator->start();
}
else

View File

@ -174,8 +174,8 @@ LLPanelWearing::~LLPanelWearing()
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
delete mCategoriesObserver;
}
delete mCategoriesObserver;
}
BOOL LLPanelWearing::postBuild()

View File

@ -31,32 +31,116 @@
#include "llappearancemgr.h"
#include "llavataractions.h"
#include "llbutton.h"
#include "lldate.h"
#include "llfirstuse.h"
#include "llfoldertype.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "lllayoutstack.h"
#include "lloutfitobserver.h"
#include "llpanelmaininventory.h"
#include "llselectmgr.h"
#include "llsidepaneliteminfo.h"
#include "llsidepaneltaskinfo.h"
#include "lltabcontainer.h"
#include "llselectmgr.h"
#include "llweb.h"
#include "lllayoutstack.h"
static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
LLSidepanelInventory::LLSidepanelInventory()
: LLPanel(),
mItemPanel(NULL),
mPanelMainInventory(NULL)
{
//
// Constants
//
static const char * const INBOX_EXPAND_TIME_SETTING = "LastInventoryInboxExpand";
static const char * const INBOX_BUTTON_NAME = "inbox_btn";
static const char * const OUTBOX_BUTTON_NAME = "outbox_btn";
static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";
static const char * const OUTBOX_LAYOUT_PANEL_NAME = "outbox_layout_panel";
static const char * const MAIN_INVENTORY_LAYOUT_PANEL = "main_inventory_layout_panel";
static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";
//
// Helpers
//
class LLInboxOutboxInventoryAddedObserver : public LLInventoryAddedObserver
{
public:
LLInboxOutboxInventoryAddedObserver(LLSidepanelInventory * sidepanelInventory)
: LLInventoryAddedObserver()
, mSidepanelInventory(sidepanelInventory)
{}
protected:
virtual void done()
{
uuid_vec_t::const_iterator it = mAdded.begin();
uuid_vec_t::const_iterator it_end = mAdded.end();
for(; it != it_end; ++it)
{
LLInventoryObject* item = gInventory.getObject(*it);
// NOTE: This doesn't actually work because folder creation does not trigger this observer
if (item && item->getType() == LLAssetType::AT_CATEGORY)
{
// Check for FolderType FT_INBOX or FT_OUTBOX and report back to mSidepanelInventory
LLInventoryCategory * item_cat = static_cast<LLInventoryCategory *>(item);
LLFolderType::EType folderType = item_cat->getPreferredType();
if (folderType == LLFolderType::FT_INBOX)
{
mSidepanelInventory->enableInbox(true);
}
else if (folderType == LLFolderType::FT_OUTBOX)
{
mSidepanelInventory->enableOutbox(true);
}
}
}
mAdded.clear();
}
private:
LLSidepanelInventory * mSidepanelInventory;
};
//
// Implementation
//
LLSidepanelInventory::LLSidepanelInventory()
: LLPanel()
, mItemPanel(NULL)
, mPanelMainInventory(NULL)
, mInventoryFetched(false)
, mCategoriesObserver(NULL)
, mInboxOutboxAddedObserver(NULL)
{
//buildFromFile( "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
}
LLSidepanelInventory::~LLSidepanelInventory()
{
if (mInboxOutboxAddedObserver && gInventory.containsObserver(mInboxOutboxAddedObserver))
{
gInventory.removeObserver(mInboxOutboxAddedObserver);
}
delete mInboxOutboxAddedObserver;
if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
}
delete mCategoriesObserver;
}
BOOL LLSidepanelInventory::postBuild()
@ -122,32 +206,110 @@ BOOL LLSidepanelInventory::postBuild()
// Marketplace inbox/outbox setup
{
LLButton * inboxButton = getChild<LLButton>("inbox_btn");
LLButton * outboxButton = getChild<LLButton>("outbox_btn");
LLButton * inbox_button = getChild<LLButton>(INBOX_BUTTON_NAME);
LLButton * outbox_button = getChild<LLButton>(OUTBOX_BUTTON_NAME);
inboxButton->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleInboxBtn, this));
outboxButton->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleOutboxBtn, this));
LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
LLLayoutStack* stack = getChild<LLLayoutStack>("inventory_layout_stack");
LLLayoutPanel * inbox_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
LLLayoutPanel * outbox_panel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
stack->collapsePanel(getChild<LLLayoutPanel>("inbox_layout_panel"), true);
stack->collapsePanel(getChild<LLLayoutPanel>("outbox_layout_panel"), true);
stack->collapsePanel(inbox_panel, true);
stack->collapsePanel(outbox_panel, true);
inboxButton->setToggleState(false);
outboxButton->setToggleState(false);
inbox_button->setToggleState(false);
outbox_button->setToggleState(false);
inbox_button->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleInboxBtn, this));
outbox_button->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleOutboxBtn, this));
// TODO: Hide inbox/outbox panels until we determine the status of the feature
//inbox_panel->setVisible(false);
//outbox_panel->setVisible(false);
// Track added items
mInboxOutboxAddedObserver = new LLInboxOutboxInventoryAddedObserver(this);
gInventory.addObserver(mInboxOutboxAddedObserver);
// Track inbox and outbox folder changes
const bool do_not_create_folder = false;
const bool do_not_find_in_library = false;
const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder, do_not_find_in_library);
const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder, do_not_find_in_library);
mCategoriesObserver = new LLInventoryCategoriesObserver();
gInventory.addObserver(mCategoriesObserver);
mCategoriesObserver->addCategory(inbox_id, boost::bind(&LLSidepanelInventory::onInboxChanged, this, inbox_id));
mCategoriesObserver->addCategory(outbox_id, boost::bind(&LLSidepanelInventory::onOutboxChanged, this, outbox_id));
}
return TRUE;
}
void LLSidepanelInventory::draw()
{
if (!mInventoryFetched && LLInventoryModelBackgroundFetch::instance().isEverythingFetched())
{
mInventoryFetched = true;
updateInboxOutboxPanels();
}
void manageInboxOutboxPanels(LLLayoutStack * stack,
LLPanel::draw();
}
void LLSidepanelInventory::updateInboxOutboxPanels()
{
// Iterate through gInventory looking for inbox and outbox
const bool do_not_create_folder = false;
const bool do_not_find_in_library = false;
const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, do_not_create_folder, do_not_find_in_library);
const LLUUID outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, do_not_create_folder, do_not_find_in_library);
enableInbox(inbox_id.notNull());
enableOutbox(outbox_id.notNull());
}
void LLSidepanelInventory::enableInbox(bool enabled)
{
getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME)->setVisible(enabled);
}
void LLSidepanelInventory::enableOutbox(bool enabled)
{
getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME)->setVisible(enabled);
}
void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
{
// Perhaps use this to track inbox changes?
}
void LLSidepanelInventory::onOutboxChanged(const LLUUID& outbox_id)
{
// Perhaps use this to track outbox changes?
}
bool manageInboxOutboxPanels(LLLayoutStack * stack,
LLButton * pressedButton, LLLayoutPanel * pressedPanel,
LLButton * otherButton, LLLayoutPanel * otherPanel)
{
bool expand = pressedButton->getToggleState();
bool otherExpanded = otherButton->getToggleState();
//
// NOTE: Ideally we could have two panel sizes stored for a collapsed and expanded minimum size.
// For now, leave this code disabled because it creates some bad artifacts when expanding
// and collapsing the inbox/outbox.
//
//S32 smallMinSize = (expand ? pressedPanel->getMinDim() : otherPanel->getMinDim());
//S32 pressedMinSize = (expand ? 2 * smallMinSize : smallMinSize);
//otherPanel->setMinDim(smallMinSize);
//pressedPanel->setMinDim(pressedMinSize);
if (expand && otherExpanded)
{
// Reshape pressedPanel to the otherPanel's height so we preserve the marketplace panel size
@ -159,33 +321,46 @@ void manageInboxOutboxPanels(LLLayoutStack * stack,
stack->collapsePanel(pressedPanel, !expand);
// Enable user_resize on main inventory panel when at least one marketplace box is expanded
stack->setPanelUserResize("main_inventory_layout_panel", expand);
// Enable user_resize on main inventory panel only when a marketplace box is expanded
stack->setPanelUserResize(MAIN_INVENTORY_LAYOUT_PANEL, expand);
return expand;
}
void LLSidepanelInventory::onToggleInboxBtn()
{
LLLayoutStack* stack = getChild<LLLayoutStack>("inventory_layout_stack");
LLButton* pressedButton = getChild<LLButton>("inbox_btn");
LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>("inbox_layout_panel");
LLButton* otherButton = getChild<LLButton>("outbox_btn");
LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>("outbox_layout_panel");
LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
LLButton* pressedButton = getChild<LLButton>(INBOX_BUTTON_NAME);
LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
LLButton* otherButton = getChild<LLButton>(OUTBOX_BUTTON_NAME);
LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel);
bool inboxExpanded = manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel);
if (inboxExpanded)
{
// Save current time as a setting for future new-ness tests
gSavedSettings.setString(INBOX_EXPAND_TIME_SETTING, LLDate::now().asString());
// TODO: Hide inbox badge
}
else
{
// TODO: Show inbox badge
}
}
void LLSidepanelInventory::onToggleOutboxBtn()
{
LLLayoutStack* stack = getChild<LLLayoutStack>("inventory_layout_stack");
LLButton* pressedButton = getChild<LLButton>("outbox_btn");
LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>("outbox_layout_panel");
LLButton* otherButton = getChild<LLButton>("inbox_btn");
LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>("inbox_layout_panel");
LLLayoutStack* stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
LLButton* pressedButton = getChild<LLButton>(OUTBOX_BUTTON_NAME);
LLLayoutPanel* pressedPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME);
LLButton* otherButton = getChild<LLButton>(INBOX_BUTTON_NAME);
LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel);
}
void LLSidepanelInventory::onOpen(const LLSD& key)
{
LLFirstUse::newInventory(false);

View File

@ -30,6 +30,8 @@
#include "llpanel.h"
class LLFolderViewItem;
class LLInboxOutboxInventoryAddedObserver;
class LLInventoryCategoriesObserver;
class LLInventoryItem;
class LLInventoryPanel;
class LLPanelMainInventory;
@ -59,6 +61,12 @@ public:
void onToggleInboxBtn();
void onToggleOutboxBtn();
void updateInboxOutboxPanels();
void enableInbox(bool enabled);
void enableOutbox(bool enabled);
virtual void draw();
protected:
// Tracks highlighted (selected) item in inventory panel.
LLInventoryItem *getSelectedItem();
@ -70,6 +78,9 @@ protected:
bool canWearSelected(); // check whether selected items can be worn
void onInboxChanged(const LLUUID& inbox_id);
void onOutboxChanged(const LLUUID& outbox_id);
//
// UI Elements
//
@ -88,6 +99,7 @@ protected:
void onTeleportButtonClicked();
void onOverflowButtonClicked();
void onBackButtonClicked();
private:
LLButton* mInfoBtn;
LLButton* mShareBtn;
@ -97,6 +109,10 @@ private:
LLButton* mOverflowBtn;
LLButton* mShopBtn;
bool mInventoryFetched;
LLInventoryCategoriesObserver* mCategoriesObserver;
LLInboxOutboxInventoryAddedObserver* mInboxOutboxAddedObserver;
};
#endif //LL_LLSIDEPANELINVENTORY_H

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -332,6 +332,23 @@ with the same filename but different name
<texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
<texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" />
<texture name="OutboxPush_Disabled" file_name="icons/OutboxPush_Disabled.png" preload="true" />
<texture name="OutboxPush_Off" file_name="icons/OutboxPush_Off.png" preload="true" />
<texture name="OutboxPush_On" file_name="icons/OutboxPush_On.png" preload="true" />
<texture name="OutboxPush_On_Over" file_name="icons/OutboxPush_On_Over.png" preload="true" />
<texture name="OutboxPush_Over" file_name="icons/OutboxPush_Over.png" preload="true" />
<texture name="OutboxPush_Press" file_name="icons/OutboxPush_Press.png" preload="true" />
<texture name="OutboxPush_Progress_1" file_name="icons/OutboxPush_Progress_1.png" preload="true" />
<texture name="OutboxPush_Progress_2" file_name="icons/OutboxPush_Progress_2.png" preload="true" />
<texture name="OutboxPush_Progress_3" file_name="icons/OutboxPush_Progress_3.png" preload="true" />
<texture name="OutboxPush_Progress_4" file_name="icons/OutboxPush_Progress_4.png" preload="true" />
<texture name="OutboxPush_Progress_5" file_name="icons/OutboxPush_Progress_5.png" preload="true" />
<texture name="OutboxPush_Progress_6" file_name="icons/OutboxPush_Progress_6.png" preload="true" />
<texture name="OutboxPush_Selected" file_name="icons/OutboxPush_Selected.png" preload="true" />
<texture name="OutboxPush_Selected_Disabled" file_name="icons/OutboxPush_Selected_Disabled.png" preload="true" />
<texture name="OutboxPush_Selected_Over" file_name="icons/OutboxPush_Selected_Over.png" preload="true" />
<texture name="OutboxPush_Selected_Press" file_name="icons/OutboxPush_Selected_Press.png" preload="true" />
<texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
<texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
@ -488,7 +505,7 @@ with the same filename but different name
<texture name="Sync_Progress_5" file_name="icons/Sync_Progress_5.png" preload="true" />
<texture name="Sync_Progress_6" file_name="icons/Sync_Progress_6.png" preload="true" />
<texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
<texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
<texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" />
<texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
<texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" />

View File

@ -89,21 +89,21 @@
width="308"
top="35"
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
background_visible="true"
background_opaque="true"
>
<text
type="string"
length="1"
follows="top|left|right"
font="SansSerifSmall"
length="1"
follows="top|left|right"
font="SansSerifSmall"
use_ellipses="true"
name="move_items_text"
top="10"
left="4"
height="20"
width="304"
>Move items to your inventory to manage and use them.</text>
top="10"
left="4"
height="20"
width="304"
>Move items to your inventory to manage and use them.</text>
<inventory_panel
bg_opaque_color="DkGray2"
bg_alpha_color="DkGray2"
@ -125,14 +125,14 @@
</panel>
</layout_panel>
<layout_panel
width="330"
auto_resize="true"
width="330"
auto_resize="true"
user_resize="false"
follows="bottom|left|right"
name="outbox_layout_panel"
min_dim="35"
max_dim="125"
height="35">
follows="bottom|left|right"
name="outbox_layout_panel"
min_dim="35"
max_dim="125"
height="35">
<panel
follows="all"
layout="topleft"
@ -144,52 +144,57 @@
height="125"
width="310">
<button
label="MARKETPLACE OUTBOX"
is_toggle="true"
name="outbox_btn"
follows="top|left|right"
image_unselected="MarketplaceBtn_Off"
image_selected="MarketplaceBtn_Selected"
height="35"
tab_stop="false"
width="308"
halign="left"
pad_left="35"
top="0"
left="0" />
<button
image_disabled="Sync_Disabled"
image_disabled_selected="Sync_Disabled"
image_unselected="Sync_Enabled"
image_selected="Sync_Enabled"
label=""
is_toggle="false"
name="outbox_sync_btn"
follows="top|right"
height="16"
label="MARKETPLACE OUTBOX"
is_toggle="true"
name="outbox_btn"
follows="top|left|right"
image_unselected="MarketplaceBtn_Off"
image_selected="MarketplaceBtn_Selected"
height="35"
tab_stop="false"
width="16"
halign="center"
top="10"
left="-40"
enabled="false" />
width="308"
halign="left"
pad_left="35"
top="0"
left="0" />
<button
image_unselected="OutboxPush_Off"
image_selected="OutboxPush_Selected"
image_hover_selected="OutboxPush_Selected_Over"
image_hover_unselected="OutboxPush_Over"
image_disabled_selected="OutboxPush_Selected_Disabled"
image_disabled="OutboxPush_Disabled"
image_pressed="OutboxPush_Press"
image_pressed_selected="OutboxPush_Selected_Press"
label=""
tool_tip="Push to my Marketplace Storefront"
is_toggle="false"
name="outbox_sync_btn"
follows="top|right"
tab_stop="false"
halign="center"
top="6"
left="-50"
height="23"
width="32"
enabled="false" />
<loading_indicator
follows="top|right"
name="outbox_sync_indicator"
top="10"
left="-40"
height="16"
width="16"
images_per_sec="1.0"
top="6"
left="-50"
height="23"
width="32"
images_per_sec="1.15"
tab_stop="false"
visible="false">
<images>
<image name="Sync_Progress_1"/>
<image name="Sync_Progress_2"/>
<image name="Sync_Progress_3"/>
<image name="Sync_Progress_4"/>
<image name="Sync_Progress_5"/>
<image name="Sync_Progress_6"/>
<image name="OutboxPush_Progress_1"/>
<image name="OutboxPush_Progress_2"/>
<image name="OutboxPush_Progress_3"/>
<image name="OutboxPush_Progress_4"/>
<image name="OutboxPush_Progress_5"/>
<image name="OutboxPush_Progress_6"/>
</images>
</loading_indicator>
<panel