EXT-8164 FIXED (Accordions should be reset to default state after Edit Outfit panel reopening)

Now accordion on panels 'Edit Outfit', 'Editing Shape', 'Editing Hair', 'Editing Eyes', 'Editing Skin', 'Group Profile' and 'Place Profile' are reset when the panels are closed and then opened again.

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/782/

--HG--
branch : product-engine
master
Andrew Polunin 2010-07-21 19:00:57 +03:00
parent 258f67cd02
commit a96f47db68
13 changed files with 159 additions and 13 deletions

View File

@ -811,6 +811,31 @@ void LLAccordionCtrl::reset ()
mScrollbar->setDocPos(0);
}
void LLAccordionCtrl::expandDefaultTab()
{
if (mAccordionTabs.size() > 0)
{
LLAccordionCtrlTab* tab = mAccordionTabs.front();
if (!tab->getDisplayChildren())
{
tab->setDisplayChildren(true);
}
for (size_t i = 1; i < mAccordionTabs.size(); ++i)
{
tab = mAccordionTabs[i];
if (tab->getDisplayChildren())
{
tab->setDisplayChildren(false);
}
}
arrange();
}
}
void LLAccordionCtrl::sort()
{
if (!mTabComparator)

View File

@ -122,6 +122,7 @@ public:
S32 notifyParent(const LLSD& info);
void reset ();
void expandDefaultTab();
void setComparator(const LLTabComparator* comp) { mTabComparator = comp; }
void sort();

View File

@ -284,7 +284,8 @@ LLCOFWearables::LLCOFWearables() : LLPanel(),
mAttachmentsTab(NULL),
mBodyPartsTab(NULL),
mLastSelectedTab(NULL),
mCOFVersion(-1)
mCOFVersion(-1),
mAccordionCtrl(NULL)
{
mClothingMenu = new CofClothingContextMenu(this);
mAttachmentMenu = new CofAttachmentContextMenu(this);
@ -336,6 +337,8 @@ BOOL LLCOFWearables::postBuild()
mTab2AssetType[mAttachmentsTab] = LLAssetType::AT_OBJECT;
mTab2AssetType[mBodyPartsTab] = LLAssetType::AT_BODYPART;
mAccordionCtrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
return LLPanel::postBuild();
}
@ -652,18 +655,35 @@ LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()
typedef std::map<std::string, LLAssetType::EType> type_map_t;
static type_map_t type_map;
static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
const LLAccordionCtrlTab* expanded_tab = accordion_ctrl->getExpandedTab();
return get_if_there(mTab2AssetType, expanded_tab, LLAssetType::AT_NONE);
if (mAccordionCtrl != NULL)
{
const LLAccordionCtrlTab* expanded_tab = mAccordionCtrl->getExpandedTab();
return get_if_there(mTab2AssetType, expanded_tab, LLAssetType::AT_NONE);
}
LLAssetType::EType LLCOFWearables::getSelectedAccordionAssetType()
{
static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
const LLAccordionCtrlTab* selected_tab = accordion_ctrl->getSelectedTab();
return LLAssetType::AT_NONE;
}
return get_if_there(mTab2AssetType, selected_tab, LLAssetType::AT_NONE);
LLAssetType::EType LLCOFWearables::getSelectedAccordionAssetType()
{
if (mAccordionCtrl != NULL)
{
const LLAccordionCtrlTab* selected_tab = mAccordionCtrl->getSelectedTab();
return get_if_there(mTab2AssetType, selected_tab, LLAssetType::AT_NONE);
}
return LLAssetType::AT_NONE;
}
void LLCOFWearables::expandDefaultAccordionTab()
{
if (mAccordionCtrl != NULL)
{
mAccordionCtrl->expandDefaultTab();
}
}
void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu)

View File

@ -40,6 +40,7 @@
#include "llappearancemgr.h"
#include "llinventorymodel.h"
class LLAccordionCtrl;
class LLAccordionCtrlTab;
class LLListContextMenu;
class LLPanelClothingListItem;
@ -87,6 +88,7 @@ public:
LLAssetType::EType getExpandedAccordionAssetType();
LLAssetType::EType getSelectedAccordionAssetType();
void expandDefaultAccordionTab();
LLCOFCallbacks& getCOFCallbacks() { return mCOFCallbacks; }
@ -125,6 +127,8 @@ protected:
LLListContextMenu* mAttachmentMenu;
LLListContextMenu* mBodyPartMenu;
LLAccordionCtrl* mAccordionCtrl;
/* COF category version since last refresh */
S32 mCOFVersion;
};

View File

@ -47,6 +47,7 @@
#include "llvoavatarself.h"
#include "lltexteditor.h"
#include "lltextbox.h"
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llscrollingpanelparam.h"
@ -666,6 +667,35 @@ void LLPanelEditWearable::updateAvatarHeightLabel()
mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param);
}
void LLPanelEditWearable::onWearablePanelVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl)
{
if (in_visible_chain.asBoolean() && accordion_ctrl != NULL)
{
accordion_ctrl->expandDefaultTab();
}
}
void LLPanelEditWearable::setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel)
{
if (bodypart_panel != NULL)
{
LLAccordionCtrl* accordion_ctrl = bodypart_panel->getChild<LLAccordionCtrl>("wearable_accordion");
if (accordion_ctrl != NULL)
{
bodypart_panel->setVisibleCallback(
boost::bind(&LLPanelEditWearable::onWearablePanelVisibilityChange, this, _2, accordion_ctrl));
}
else
{
llwarns << "accordion_ctrl is NULL" << llendl;
}
}
else
{
llwarns << "bodypart_panel is NULL" << llendl;
}
}
// virtual
BOOL LLPanelEditWearable::postBuild()
@ -695,6 +725,14 @@ BOOL LLPanelEditWearable::postBuild()
mPanelEyes = getChild<LLPanel>("edit_eyes_panel");
mPanelHair = getChild<LLPanel>("edit_hair_panel");
// Setting the visibility callback is applied only to the bodyparts panel
// because currently they are the only ones whose 'wearable_accordion' has
// multiple accordion tabs (see EXT-8164 for details).
setWearablePanelVisibilityChangeCallback(mPanelShape);
setWearablePanelVisibilityChangeCallback(mPanelSkin);
setWearablePanelVisibilityChangeCallback(mPanelEyes);
setWearablePanelVisibilityChangeCallback(mPanelHair);
//clothes
mPanelShirt = getChild<LLPanel>("edit_shirt_panel");
mPanelPants = getChild<LLPanel>("edit_pants_panel");

View File

@ -39,6 +39,7 @@
#include "llvoavatardefines.h"
#include "llwearabletype.h"
class LLAccordionCtrl;
class LLCheckBoxCtrl;
class LLWearable;
class LLTextBox;
@ -113,6 +114,10 @@ private:
// updates avatar height label
void updateAvatarHeightLabel();
void onWearablePanelVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl);
void setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel);
// the pointer to the wearable we're editing. NULL means we're not editing a wearable.
LLWearable *mWearablePtr;
LLViewerInventoryItem* mWearableItem;

View File

@ -182,6 +182,11 @@ BOOL LLPanelGroup::postBuild()
LLPanelGroupTab* panel_notices = findChild<LLPanelGroupTab>("group_notices_tab_panel");
LLPanelGroupTab* panel_land = findChild<LLPanelGroupTab>("group_land_tab_panel");
if (LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("groups_accordion"))
{
setVisibleCallback(boost::bind(&LLPanelGroup::onVisibilityChange, this, _2, accordion_ctrl));
}
if(panel_general) mTabs.push_back(panel_general);
if(panel_roles) mTabs.push_back(panel_roles);
if(panel_notices) mTabs.push_back(panel_notices);
@ -305,6 +310,13 @@ void LLPanelGroup::onBtnCancel()
onBackBtnClick();
}
void LLPanelGroup::onVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl)
{
if (in_visible_chain.asBoolean() && accordion_ctrl != NULL)
{
accordion_ctrl->expandDefaultTab();
}
}
void LLPanelGroup::changed(LLGroupChange gc)
{

View File

@ -42,6 +42,7 @@ class LLOfferInfo;
const S32 UPDATE_MEMBERS_PER_FRAME = 500;
// Forward declares
class LLAccordionCtrl;
class LLPanelGroupTab;
class LLTabContainer;
class LLAgent;
@ -102,6 +103,7 @@ protected:
void onBackBtnClick();
void onBtnJoin();
void onBtnCancel();
void onVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl);
static void onBtnApply(void*);
static void onBtnRefresh(void*);
@ -126,7 +128,6 @@ protected:
LLButton* mButtonJoin;
LLUICtrl* mJoinText;
};
class LLPanelGroupTab : public LLPanel

View File

@ -1027,6 +1027,18 @@ bool LLPanelOutfitEdit::switchPanels(LLPanel* switch_from_panel, LLPanel* switch
return false;
}
void LLPanelOutfitEdit::resetAccordionState()
{
if (mCOFWearables != NULL)
{
mCOFWearables->expandDefaultAccordionTab();
}
else
{
llwarns << "mCOFWearables is NULL" << llendl;
}
}
void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button)
{
if(!mGearMenu)

View File

@ -183,6 +183,8 @@ public:
*/
bool switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel);
void resetAccordionState();
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,

View File

@ -79,7 +79,8 @@ LLPanelPlaceProfile::LLPanelPlaceProfile()
: LLPanelPlaceInfo(),
mForSalePanel(NULL),
mYouAreHerePanel(NULL),
mSelectedParcelID(-1)
mSelectedParcelID(-1),
mAccordionCtrl(NULL)
{}
// virtual
@ -139,6 +140,7 @@ BOOL LLPanelPlaceProfile::postBuild()
mSubdivideText = getChild<LLTextEditor>("subdivide");
mResaleText = getChild<LLTextEditor>("resale");
mSaleToText = getChild<LLTextBox>("sale_to");
mAccordionCtrl = getChild<LLAccordionCtrl>("advanced_info_accordion");
icon_pg = getString("icon_PG");
icon_m = getString("icon_M");
@ -278,6 +280,11 @@ void LLPanelPlaceProfile::handleVisibilityChange(BOOL new_visibility)
parcel_mgr->deselectUnused();
}
}
if (mAccordionCtrl != NULL)
{
mAccordionCtrl->expandDefaultTab();
}
}
void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,

View File

@ -35,6 +35,7 @@
#include "llpanelplaceinfo.h"
class LLAccordionCtrl;
class LLIconCtrl;
class LLTextEditor;
@ -118,6 +119,7 @@ private:
LLTextEditor* mSubdivideText;
LLTextEditor* mResaleText;
LLTextBox* mSaleToText;
LLAccordionCtrl* mAccordionCtrl;
};
#endif // LL_LLPANELPLACEPROFILE_H

View File

@ -190,13 +190,16 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)
{
if (new_visibility.asBoolean())
{
if ((mOutfitEdit && mOutfitEdit->getVisible()) || (mEditWearable && mEditWearable->getVisible()))
bool is_outfit_edit_visible = mOutfitEdit && mOutfitEdit->getVisible();
bool is_wearable_edit_visible = mEditWearable && mEditWearable->getVisible();
if (is_outfit_edit_visible || is_wearable_edit_visible)
{
if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))
{
gAgentCamera.changeCameraToCustomizeAvatar();
}
if (mEditWearable && mEditWearable->getVisible())
if (is_wearable_edit_visible)
{
LLWearable *wearable_ptr = mEditWearable->getWearable();
if (gAgentWearables.getWearableIndex(wearable_ptr) == LLAgentWearables::MAX_CLOTHING_PER_TYPE)
@ -205,6 +208,11 @@ void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)
showOutfitEditPanel();
}
}
if (is_outfit_edit_visible)
{
mOutfitEdit->resetAccordionState();
}
}
}
else
@ -283,6 +291,15 @@ void LLSidepanelAppearance::showOutfitsInventoryPanel()
void LLSidepanelAppearance::showOutfitEditPanel()
{
// Accordion's state must be reset in all cases except the one when user
// is returning back to the mOutfitEdit panel from the mEditWearable panel.
// The simplest way to control this is to check the visibility state of the mEditWearable
// BEFORE it is changed by the call to the toggleWearableEditPanel(FALSE, NULL, TRUE).
if (mEditWearable != NULL && !mEditWearable->getVisible() && mOutfitEdit != NULL)
{
mOutfitEdit->resetAccordionState();
}
togglMyOutfitsPanel(FALSE);
toggleWearableEditPanel(FALSE, NULL, TRUE); // don't switch out of edit appearance mode
toggleOutfitEditPanel(TRUE);