summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorpavelkproductengine <pavelkproductengine@lindenlab.com>2016-01-27 17:21:25 +0200
committerpavelkproductengine <pavelkproductengine@lindenlab.com>2016-01-27 17:21:25 +0200
commit81ecf0c0f304aef72f8b558c732b5ed62acfb946 (patch)
treee817e6e970459982d5e789bc80780b2322e12897 /indra/newview
parent5d576df19047ec45070f6571ebcada26e5c20756 (diff)
MAINT-5194 Visual Outfit Browser
1) Changed algorithm for building gallery, which fixed item cropping when switching between tabs in Appearance floater 2) Fixed gap between items in partially fille row
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/lloutfitgallery.cpp232
-rw-r--r--indra/newview/lloutfitgallery.h45
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_gallery.xml15
3 files changed, 202 insertions, 90 deletions
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index dc6db3307f..92827a7b6f 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -51,22 +51,40 @@ static LLOutfitGallery* gOutfitGallery = NULL;
LLOutfitGallery::LLOutfitGallery()
: LLOutfitListBase(),
- mTexturesObserver(NULL)
+ mTexturesObserver(NULL),
+ mScrollPanel(NULL),
+ mGalleryPanel(NULL),
+ galleryCreated(false),
+ mRowCount(0),
+ mItemsAddedCount(0)
{
-// mGearMenu = new LLOutfitGalleryGearMenu(this);
}
BOOL LLOutfitGallery::postBuild()
{
BOOL rv = LLOutfitListBase::postBuild();
+ mScrollPanel = getChild<LLScrollContainer>("gallery_scroll_panel");
+ mGalleryPanel = getChild<LLPanel>("gallery_panel");
return rv;
}
void LLOutfitGallery::onOpen(const LLSD& info)
{
LLOutfitListBase::onOpen(info);
- rebuildGallery();
- loadPhotos();
+ if (!galleryCreated)
+ {
+ loadPhotos();
+ uuid_vec_t cats;
+ getCurrentCategories(cats);
+ int n = cats.size();
+ buildGalleryPanel(n);
+ mScrollPanel->addChild(mGalleryPanel);
+ for (int i = 0; i < n; i++)
+ {
+ addToGallery(mOutfitMap[cats[i]]);
+ }
+ galleryCreated = true;
+ }
}
#define LAYOUT_STACK_HEIGHT 180
@@ -79,67 +97,126 @@ void LLOutfitGallery::onOpen(const LLSD& info)
#define LAYOUT_STACK_WIDTH 166 * ITEMS_IN_ROW//498
#define GALLERY_WIDTH 163 * ITEMS_IN_ROW//485//290
-void LLOutfitGallery::rebuildGallery()
+LLPanel* LLOutfitGallery::addLastRow()
{
- LLView::child_list_t child_list(*getChild<LLPanel>("gallery_panel")->getChildList());
- BOOST_FOREACH(LLView* view, child_list)
+ mRowCount++;
+ int row = 0;
+ int vgap = GALLERY_VERTICAL_GAP * row;
+ LLPanel* result = buildLayoutStak(0, row * LAYOUT_STACK_HEIGHT + vgap);
+ mGalleryPanel->addChild(result);
+ return result;
+}
+
+void LLOutfitGallery::moveRowUp(int row)
+{
+ moveRow(row, mRowCount - 1 - row + 1);
+}
+
+void LLOutfitGallery::moveRowDown(int row)
+{
+ moveRow(row, mRowCount - 1 - row - 1);
+}
+
+void LLOutfitGallery::moveRow(int row, int pos)
+{
+ int vgap = GALLERY_VERTICAL_GAP * pos;
+ moveLayoutStak(mStacks[row], 0, pos * LAYOUT_STACK_HEIGHT + vgap);
+}
+
+void LLOutfitGallery::removeLastRow()
+{
+ mRowCount--;
+ mGalleryPanel->removeChild(mLastRowStack);
+ mStacks.pop_back();
+ mLastRowStack = mStacks.back();
+}
+
+LLPanel* LLOutfitGallery::addToRow(LLPanel* row_stack, LLOutfitGalleryItem* item, int pos, int hgap)
+{
+ LLPanel* lpanel = buildLayoutPanel(pos * GALLERY_ITEM_WIDTH + hgap);
+ lpanel->addChild(item);
+ row_stack->addChild(lpanel);
+ mPanels.push_back(lpanel);
+ return lpanel;
+}
+
+void LLOutfitGallery::addToGallery(LLOutfitGalleryItem* item)
+{
+ mItemsAddedCount++;
+ mItemIndexMap[item] = mItemsAddedCount - 1;
+ int n = mItemsAddedCount;
+ int row_count = (n % ITEMS_IN_ROW) == 0 ? n / ITEMS_IN_ROW : n / ITEMS_IN_ROW + 1;
+ int n_prev = n - 1;
+ int row_count_prev = (n_prev % ITEMS_IN_ROW) == 0 ? n_prev / ITEMS_IN_ROW : n_prev / ITEMS_IN_ROW + 1;
+
+ bool add_row = row_count != row_count_prev;
+ int pos = 0;
+ if (add_row)
{
- LLLayoutStack* lstack = dynamic_cast<LLLayoutStack*>(view);
- if (lstack != NULL)
+ for (int i = 0; i < row_count_prev; i++)
{
- LLView::child_list_t panel_list(*lstack->getChildList());
- BOOST_FOREACH(LLView* panel, panel_list)
- {
- //LLLayoutPanel* lpanel = dynamic_cast<LLLayoutPanel*>(panel);
- //if (!lpanel)
- // continue;
- LLView::child_list_t panel_children(*panel->getChildList());
- if (panel_children.size() > 0)
- {
- //Assume OutfitGalleryItem is the only one child of layout panel
- LLView* view_item = panel_children.back();
- LLOutfitGalleryItem* gallery_item = dynamic_cast<LLOutfitGalleryItem*>(view_item);
- if (gallery_item != NULL)
- panel->removeChild(gallery_item);
- }
- lstack->removeChild(panel);
- //delete panel;
- }
- getChild<LLPanel>("gallery_panel")->removeChild(lstack);
- delete lstack;
- }
- else
- {
- getChild<LLPanel>("gallery_panel")->removeChild(view);
+ moveRowUp(i);
}
+ mLastRowStack = addLastRow();
+ mStacks.push_back(mLastRowStack);
}
- uuid_vec_t cats;
- getCurrentCategories(cats);
- int n = cats.size();
+ pos = (n - 1) % ITEMS_IN_ROW;
+ mItems.push_back(item);
+ addToRow(mLastRowStack, item, pos, GALLERY_HORIZONTAL_GAP * pos);
+ reshapeGalleryPanel(row_count);
+}
+
+
+void LLOutfitGallery::removeFromGalleryLast(LLOutfitGalleryItem* item)
+{
+ int n_prev = mItemsAddedCount;
+ int n = mItemsAddedCount - 1;
int row_count = (n % ITEMS_IN_ROW) == 0 ? n / ITEMS_IN_ROW : n / ITEMS_IN_ROW + 1;
- getChild<LLPanel>("gallery_panel")->reshape(
- GALLERY_WIDTH, row_count * (LAYOUT_STACK_HEIGHT + GALLERY_VERTICAL_GAP));
- int vgap = 0;
- uuid_vec_t::reverse_iterator rit = cats.rbegin();
- for (int i = row_count - 1; i >= 0; i--)
+ int row_count_prev = (n_prev % ITEMS_IN_ROW) == 0 ? n_prev / ITEMS_IN_ROW : n_prev / ITEMS_IN_ROW + 1;
+ mItemsAddedCount--;
+
+ bool remove_row = row_count != row_count_prev;
+ //int pos = (n_prev - 1) % ITEMS_IN_ROW;
+ removeFromLastRow(mItems[mItemsAddedCount]);
+ mItems.pop_back();
+ if (remove_row)
{
- LLLayoutStack* stack = buildLayoutStak(0, (row_count - 1 - i) * LAYOUT_STACK_HEIGHT + vgap);
- getChild<LLPanel>("gallery_panel")->addChild(stack);
- int items_in_cur_row = (n % ITEMS_IN_ROW) == 0 ? ITEMS_IN_ROW : (i == row_count - 1 ? n % ITEMS_IN_ROW : ITEMS_IN_ROW);
- int hgap = 0;
- for (int j = 0; j < items_in_cur_row && rit != cats.rend(); j++)
+ for (int i = 0; i < row_count_prev - 1; i++)
{
- LLLayoutPanel* lpanel = buildLayoutPanel(j * GALLERY_ITEM_WIDTH + hgap);
- LLOutfitGalleryItem* item = mOutfitMap[*rit];
- lpanel->addChild(item);
- stack->addChild(lpanel);
- rit++;
- hgap += GALLERY_HORIZONTAL_GAP;
+ moveRowDown(i);
}
- vgap += GALLERY_VERTICAL_GAP;
+ removeLastRow();
+ }
+ reshapeGalleryPanel(row_count);
+}
+
+
+void LLOutfitGallery::removeFromGalleryMiddle(LLOutfitGalleryItem* item)
+{
+ int n = mItemIndexMap[item];
+ mItemIndexMap.erase(item);
+ std::vector<LLOutfitGalleryItem*> saved;
+ for (int i = mItemsAddedCount - 1; i > n; i--)
+ {
+ saved.push_back(mItems[i]);
+ removeFromGalleryLast(mItems[i]);
+ }
+ removeFromGalleryLast(mItems[n]);
+ int saved_count = saved.size();
+ for (int i = 0; i < saved_count; i++)
+ {
+ addToGallery(saved.back());
+ saved.pop_back();
}
}
+void LLOutfitGallery::removeFromLastRow(LLOutfitGalleryItem* item)
+{
+ mPanels.back()->removeChild(item);
+ mLastRowStack->removeChild(mPanels.back());
+ mPanels.pop_back();
+}
+
LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name)
{
LLOutfitGalleryItem::Params giparams;
@@ -155,11 +232,31 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name)
return gitem;
}
-LLLayoutPanel* LLOutfitGallery::buildLayoutPanel(int left)
+void LLOutfitGallery::buildGalleryPanel(int row_count)
+{
+ LLPanel::Params params;
+ mGalleryPanel = LLUICtrlFactory::create<LLPanel>(params);
+ reshapeGalleryPanel(row_count);
+}
+
+void LLOutfitGallery::reshapeGalleryPanel(int row_count)
{
- LLLayoutPanel::Params lpparams;
+ int bottom = 0;
+ int left = 0;
+ int height = row_count * (LAYOUT_STACK_HEIGHT + GALLERY_VERTICAL_GAP);
+ LLRect rect = LLRect(left, bottom + height, left + GALLERY_WIDTH, bottom);
+ mGalleryPanel->setRect(rect);
+ mGalleryPanel->reshape(GALLERY_WIDTH, height);
+ mGalleryPanel->setVisible(true);
+ mGalleryPanel->setFollowsLeft();
+ mGalleryPanel->setFollowsTop();
+}
+
+LLPanel* LLOutfitGallery::buildLayoutPanel(int left)
+{
+ LLPanel::Params lpparams;
int top = 0;
- LLLayoutPanel* lpanel = LLUICtrlFactory::create<LLLayoutPanel>(lpparams);
+ LLPanel* lpanel = LLUICtrlFactory::create<LLPanel>(lpparams);
LLRect rect = LLRect(left, top + GALLERY_ITEM_HEIGHT, left + GALLERY_ITEM_WIDTH + GALLERY_ITEM_HGAP, top);
lpanel->setRect(rect);
lpanel->reshape(GALLERY_ITEM_WIDTH + GALLERY_ITEM_HGAP, GALLERY_ITEM_HEIGHT);
@@ -169,20 +266,24 @@ LLLayoutPanel* LLOutfitGallery::buildLayoutPanel(int left)
return lpanel;
}
-LLLayoutStack* LLOutfitGallery::buildLayoutStak(int left, int top)
+LLPanel* LLOutfitGallery::buildLayoutStak(int left, int bottom)
+{
+ LLPanel::Params sparams;
+ LLPanel* stack = LLUICtrlFactory::create<LLPanel>(sparams);
+ moveLayoutStak(stack, left, bottom);
+ return stack;
+}
+
+void LLOutfitGallery::moveLayoutStak(LLPanel* stack, int left, int bottom)
{
- LLLayoutStack::Params sparams;
- LLLayoutStack* stack = LLUICtrlFactory::create<LLLayoutStack>(sparams);
- LLRect rect = LLRect(left, top + LAYOUT_STACK_HEIGHT, left + LAYOUT_STACK_WIDTH, top);
+ LLRect rect = LLRect(left, bottom + LAYOUT_STACK_HEIGHT, left + LAYOUT_STACK_WIDTH, bottom);
stack->setRect(rect);
stack->reshape(LAYOUT_STACK_WIDTH, LAYOUT_STACK_HEIGHT);
stack->setVisible(true);
stack->setFollowsLeft();
stack->setFollowsTop();
- return stack;
}
-
LLOutfitGallery::~LLOutfitGallery()
{
if (gInventory.containsObserver(mTexturesObserver))
@@ -240,7 +341,10 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
_1, _2, _3, cat_id));
LLWearableItemsList* list = NULL;
item->setFocusReceivedCallback(boost::bind(&LLOutfitListBase::ñhangeOutfitSelection, this, list, cat_id));
-
+ if (galleryCreated)
+ {
+ addToGallery(item);
+ }
}
void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id)
@@ -259,7 +363,7 @@ void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id)
mOutfitMap.erase(outfits_iter);
// 4. Remove outfit from gallery.
- rebuildGallery();
+ removeFromGalleryMiddle(item);
// kill removed item
if (item != NULL)
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 81a019f416..01d56d917f 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -78,11 +78,20 @@ protected:
/*virtual*/ LLOutfitListGearMenuBase* createGearMenu();
private:
- void rebuildGallery();
void loadPhotos();
void uploadPhoto(LLUUID outfit_id);
bool checkRemovePhoto(LLUUID outfit_id);
void setUploadedPhoto(LLUUID outfit_id, LLUUID asset_id);
+ void addToGallery(LLOutfitGalleryItem* item);
+ void removeFromGalleryLast(LLOutfitGalleryItem* item);
+ void removeFromGalleryMiddle(LLOutfitGalleryItem* item);
+ LLPanel* addLastRow();
+ void removeLastRow();
+ void moveRowUp(int row);
+ void moveRowDown(int row);
+ void moveRow(int row, int pos);
+ LLPanel* addToRow(LLPanel* row_stack, LLOutfitGalleryItem* item, int pos, int hgap);
+ void removeFromLastRow(LLOutfitGalleryItem* item);
static void onLoadComplete(LLVFS *vfs,
const LLUUID& asset_uuid,
@@ -90,20 +99,32 @@ private:
void* user_data, S32 status, LLExtStat ext_status);
LLOutfitGalleryItem* buildGalleryItem(std::string name);
- LLLayoutPanel* buildLayoutPanel(int left);
- LLLayoutStack* buildLayoutStak(int left, int top);
-
+ void buildGalleryPanel(int row_count);
+ void reshapeGalleryPanel(int row_count);
+ LLPanel* buildLayoutPanel(int left);
+ LLPanel* buildLayoutStak(int left, int bottom);
+ void moveLayoutStak(LLPanel* stack, int left, int bottom);
LLView* mView;
- std::vector<LLLayoutStack*> mLayouts;
- std::vector<LLLayoutPanel*> mPanels;
+ std::vector<LLPanel*> mStacks;
+ std::vector<LLPanel*> mPanels;
std::vector<LLOutfitGalleryItem*> mItems;
+ LLScrollContainer* mScrollPanel;
+ LLPanel* mGalleryPanel;
+ LLPanel* mLastRowStack;
+ bool galleryCreated;
+ int mRowCount;
+ int mItemsAddedCount;
+
+ typedef std::map<LLUUID, LLOutfitGalleryItem*> outfit_map_t;
+ typedef outfit_map_t::value_type outfit_map_value_t;
+ outfit_map_t mOutfitMap;
+ typedef std::map<LLUUID, LLViewerInventoryItem*> texture_map_t;
+ typedef texture_map_t::value_type texture_map_value_t;
+ texture_map_t mTextureMap;
+ typedef std::map<LLOutfitGalleryItem*, int> item_num_map_t;
+ typedef item_num_map_t::value_type item_numb_map_value_t;
+ item_num_map_t mItemIndexMap;
- typedef std::map<LLUUID, LLOutfitGalleryItem*> outfit_map_t;
- typedef outfit_map_t::value_type outfit_map_value_t;
- outfit_map_t mOutfitMap;
- typedef std::map<LLUUID, LLViewerInventoryItem*> texture_map_t;
- typedef texture_map_t::value_type texture_map_value_t;
- texture_map_t mTextureMap;
LLInventoryCategoriesObserver* mTexturesObserver;
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
index 6146514f98..2a06b35942 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
@@ -26,19 +26,6 @@
name="gallery_scroll_panel"
opaque="false"
top_pad="0">
- <panel
- background_visible="true"
- border="true"
- bevel_style="none"
- follows="all"
- height="560"
- width="312"
- layout="topleft"
- top="0"
- left="4"
- top_pad="0"
- visible="true"
- name="gallery_panel">
<!--outfit_gallery_item
layout="topleft"
left="10"
@@ -79,7 +66,7 @@
<outfit_gallery_item layout="topleft" left="10" name="preview_outfit2" height="175" width="150" follows="left|top"/>
</layout_panel>
</layout_stack-->
- </panel>
+ <!--</panel>-->
</scroll_container>
<panel
background_visible="true"