EXT-7165 FIXED panel outfit edit now observes all changes in COF (incl. wearables order changes)

- added observing changes in the COF (based on version changes of the COF category, COF's version is also updated when order of COF items is changed)
- got rid of outfit fetcher, cause the only used outfit is COF which is always in a fetched state
- minor cleanup

Reviewed by Mike Antipov and Neal Orman at https://codereview.productengine.com/secondlife/r/356/

--HG--
branch : product-engine
master
Igor Borovkov 2010-05-07 13:17:11 +03:00
parent 78b3419fc8
commit f00aad0123
2 changed files with 39 additions and 90 deletions

View File

@ -77,11 +77,16 @@ const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK;
static const std::string SAVE_BTN("save_btn");
static const std::string REVERT_BTN("revert_btn");
class LLInventoryLookObserver : public LLInventoryObserver
class LLCOFObserver : public LLInventoryObserver
{
public:
LLInventoryLookObserver(LLPanelOutfitEdit *panel) : mPanel(panel) {}
virtual ~LLInventoryLookObserver()
LLCOFObserver(LLPanelOutfitEdit *panel) : mPanel(panel),
mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)
{
gInventory.addObserver(this);
}
virtual ~LLCOFObserver()
{
if (gInventory.containsObserver(this))
{
@ -91,51 +96,43 @@ public:
virtual void changed(U32 mask)
{
if (mask & (LLInventoryObserver::ADD | LLInventoryObserver::REMOVE))
{
mPanel->updateLookInfo();
}
if (!gInventory.isInventoryUsable()) return;
LLUUID cof = LLAppearanceMgr::getInstance()->getCOF();
if (cof.isNull()) return;
LLViewerInventoryCategory* cat = gInventory.getCategory(cof);
if (!cat) return;
S32 cof_version = cat->getVersion();
if (cof_version == mCOFLastVersion) return;
mCOFLastVersion = cof_version;
mPanel->update();
}
protected:
LLPanelOutfitEdit *mPanel;
};
class LLLookFetchObserver : public LLInventoryFetchDescendentsObserver
{
public:
LLLookFetchObserver(LLPanelOutfitEdit *panel) :
mPanel(panel)
{}
LLLookFetchObserver() {}
virtual void done()
{
mPanel->lookFetched();
if(gInventory.containsObserver(this))
{
gInventory.removeObserver(this);
}
}
private:
LLPanelOutfitEdit *mPanel;
//last version number of a COF category
S32 mCOFLastVersion;
};
LLPanelOutfitEdit::LLPanelOutfitEdit()
: LLPanel(),
mCurrentOutfitID(),
mFetchLook(NULL),
mSearchFilter(NULL),
mCOFWearables(NULL),
mInventoryItemsPanel(NULL),
mLookObserver(NULL)
mCOFObserver(NULL)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
mFetchLook = new LLLookFetchObserver(this);
mLookObserver = new LLInventoryLookObserver(this);
gInventory.addObserver(mLookObserver);
mCOFObserver = new LLCOFObserver(this);
mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES);
for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++)
@ -149,17 +146,8 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
LLPanelOutfitEdit::~LLPanelOutfitEdit()
{
delete mSavedFolderState;
if (gInventory.containsObserver(mFetchLook))
{
gInventory.removeObserver(mFetchLook);
}
delete mFetchLook;
if (gInventory.containsObserver(mLookObserver))
{
gInventory.removeObserver(mLookObserver);
}
delete mLookObserver;
delete mCOFObserver;
}
BOOL LLPanelOutfitEdit::postBuild()
@ -242,9 +230,6 @@ void LLPanelOutfitEdit::moveWearable(bool closer_to_body)
LLViewerInventoryItem* wearable_to_move = gInventory.getItem(item_id);
LLAppearanceMgr::getInstance()->moveWearable(wearable_to_move, closer_to_body);
//*TODO why not to listen to inventory?
updateLookInfo();
}
void LLPanelOutfitEdit::toggleAddWearablesPanel()
@ -360,10 +345,7 @@ void LLPanelOutfitEdit::onAddToOutfitClicked(void)
LLFolderViewEventListener* listenerp = curr_item->getListener();
if (!listenerp) return;
if (LLAppearanceMgr::getInstance()->wearItemOnAvatar(listenerp->getUUID()))
{
updateLookInfo();
}
LLAppearanceMgr::getInstance()->wearItemOnAvatar(listenerp->getUUID());
}
@ -372,8 +354,6 @@ void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void)
LLUUID id_to_remove = mCOFWearables->getSelectedUUID();
LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove);
updateLookInfo();
}
@ -465,34 +445,13 @@ void LLPanelOutfitEdit::onOutfitItemSelectionChange(void)
}
}
void LLPanelOutfitEdit::changed(U32 mask)
{
}
void LLPanelOutfitEdit::lookFetched(void)
void LLPanelOutfitEdit::update()
{
mCOFWearables->refresh();
updateVerbs();
}
void LLPanelOutfitEdit::updateLookInfo()
{
if (getVisible())
{
mFetchLook->setFetchID(mCurrentOutfitID);
mFetchLook->startFetch();
if (mFetchLook->isFinished())
{
mFetchLook->done();
}
else
{
gInventory.addObserver(mFetchLook);
}
}
}
void LLPanelOutfitEdit::displayCurrentOutfit()
{
if (!getVisible())
@ -500,8 +459,6 @@ void LLPanelOutfitEdit::displayCurrentOutfit()
setVisible(TRUE);
}
mCurrentOutfitID = LLAppearanceMgr::getInstance()->getCOF();
std::string current_outfit_name;
if (LLAppearanceMgr::getInstance()->getBaseOutfitName(current_outfit_name))
{
@ -512,12 +469,15 @@ void LLPanelOutfitEdit::displayCurrentOutfit()
mCurrentOutfitName->setText(getString("No Outfit"));
}
updateLookInfo();
update();
}
//private
void LLPanelOutfitEdit::updateVerbs()
{
//*TODO implement better handling of COF dirtiness
LLAppearanceMgr::getInstance()->updateIsDirty();
bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();
childSetEnabled(SAVE_BTN, outfit_is_dirty);

View File

@ -48,13 +48,12 @@ class LLButton;
class LLCOFWearables;
class LLTextBox;
class LLInventoryCategory;
class LLInventoryLookObserver;
class LLCOFObserver;
class LLInventoryPanel;
class LLSaveFolderState;
class LLFolderViewItem;
class LLScrollListCtrl;
class LLToggleableMenu;
class LLLookFetchObserver;
class LLFilterEditor;
class LLFilteredWearableListManager;
@ -82,11 +81,6 @@ public:
/*virtual*/ ~LLPanelOutfitEdit();
/*virtual*/ BOOL postBuild();
/*virtual*/ void changed(U32 mask);
/*virtual*/ void setParcelID(const LLUUID& parcel_id);
// Sends a request for data about the given parcel, which will
// only update the location if there is none already available.
void moveWearable(bool closer_to_body);
@ -106,16 +100,12 @@ public:
void displayCurrentOutfit();
void lookFetched(void);
void updateLookInfo(void);
void update();
private:
void updateVerbs();
//*TODO got rid of mCurrentOutfitID
LLUUID mCurrentOutfitID;
LLTextBox* mCurrentOutfitName;
LLInventoryPanel* mInventoryItemsPanel;
@ -127,8 +117,7 @@ private:
LLFilteredWearableListManager* mWearableListManager;
LLLookFetchObserver* mFetchLook;
LLInventoryLookObserver* mLookObserver;
LLCOFObserver* mCOFObserver;
std::vector<LLLookItemType> mLookItemTypes;
LLCOFWearables* mCOFWearables;