diff options
Diffstat (limited to 'indra/newview/llpaneloutfitedit.cpp')
-rw-r--r-- | indra/newview/llpaneloutfitedit.cpp | 217 |
1 files changed, 131 insertions, 86 deletions
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index daa41e1467..c04be85174 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -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,92 @@ public: virtual void changed(U32 mask) { - if (mask & (LLInventoryObserver::ADD | LLInventoryObserver::REMOVE)) + if (!gInventory.isInventoryUsable()) return; + + bool panel_updated = checkCOF(); + + if (!panel_updated) { - mPanel->updateLookInfo(); + checkBaseOutfit(); } } + protected: - LLPanelOutfitEdit *mPanel; -}; -class LLLookFetchObserver : public LLInventoryFetchDescendentsObserver -{ -public: - LLLookFetchObserver(LLPanelOutfitEdit *panel) : - mPanel(panel) - {} - LLLookFetchObserver() {} - virtual void done() + /** Get a version of an inventory category specified by its UUID */ + static S32 getCategoryVersion(const LLUUID& cat_id) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (!cat) return LLViewerInventoryCategory::VERSION_UNKNOWN; + + return cat->getVersion(); + } + + bool checkCOF() + { + LLUUID cof = LLAppearanceMgr::getInstance()->getCOF(); + if (cof.isNull()) return false; + + S32 cof_version = getCategoryVersion(cof); + + if (cof_version == mCOFLastVersion) return false; + + mCOFLastVersion = cof_version; + + mPanel->update(); + + return true; + } + + void checkBaseOutfit() { - mPanel->lookFetched(); - if(gInventory.containsObserver(this)) + LLUUID baseoutfit_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID(); + + if (baseoutfit_id == mBaseOutfitId) { - gInventory.removeObserver(this); + if (baseoutfit_id.isNull()) return; + + const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id); + + if (baseoutfit_ver == mBaseOutfitLastVersion) return; } + else + { + mBaseOutfitId = baseoutfit_id; + if (baseoutfit_id.isNull()) return; + + mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId); + } + + mPanel->updateVerbs(); } -private: + + + + LLPanelOutfitEdit *mPanel; + + //last version number of a COF category + S32 mCOFLastVersion; + + LLUUID mBaseOutfitId; + + S32 mBaseOutfitLastVersion; }; 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 +195,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() @@ -171,8 +208,13 @@ BOOL LLPanelOutfitEdit::postBuild() mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name"); + mStatus = getChild<LLTextBox>("status"); + + mFolderViewBtn = getChild<LLButton>("folder_view_btn"); + mListViewBtn = getChild<LLButton>("list_view_btn"); childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL); + childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredFolderWearablesPanel, this), NULL); childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredWearablesPanel, this), NULL); mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); @@ -204,15 +246,7 @@ BOOL LLPanelOutfitEdit::postBuild() mSearchFilter = getChild<LLFilterEditor>("look_item_filter"); mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2)); - /* Removing add to look inline button (not part of mvp for viewer 2) - LLButton::Params add_params; - add_params.name("add_to_look"); - add_params.click_callback.function(boost::bind(&LLPanelOutfitEdit::onAddToLookClicked, this)); - add_params.label("+"); - - mAddToLookBtn = LLUICtrlFactory::create<LLButton>(add_params); - mAddToLookBtn->setEnabled(FALSE); - mAddToLookBtn->setVisible(FALSE); */ + childSetAction("add_to_outfit_btn", boost::bind(&LLPanelOutfitEdit::onAddToOutfitClicked, this)); mEditWearableBtn = getChild<LLButton>("edit_wearable_btn"); mEditWearableBtn->setEnabled(FALSE); @@ -229,8 +263,9 @@ BOOL LLPanelOutfitEdit::postBuild() save_registar.add("Outfit.SaveAsNew.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true)); mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_save_outfit.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - mWearableListManager = new LLFilteredWearableListManager( - getChild<LLInventoryItemsList>("filtered_wearables_list"), ALL_ITEMS_MASK); + mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel"); + mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list"); + mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, ALL_ITEMS_MASK); return TRUE; } @@ -242,9 +277,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() @@ -254,12 +286,33 @@ void LLPanelOutfitEdit::toggleAddWearablesPanel() void LLPanelOutfitEdit::showWearablesFilter() { - childSetVisible("filter_combobox_panel", childGetValue("filter_button")); + bool filter_visible = childGetValue("filter_button"); + + childSetVisible("filter_panel", filter_visible); + + if(!filter_visible) + { + mSearchFilter->clear(); + onSearchEdit(LLStringUtil::null); + } } void LLPanelOutfitEdit::showFilteredWearablesPanel() { - childSetVisible("filtered_wearables_panel", !childIsVisible("filtered_wearables_panel")); + if(switchPanels(mInventoryItemsPanel, mWearableItemsPanel)) + { + mFolderViewBtn->setToggleState(FALSE); + } + mListViewBtn->setToggleState(TRUE); +} + +void LLPanelOutfitEdit::showFilteredFolderWearablesPanel() +{ + if(switchPanels(mWearableItemsPanel, mInventoryItemsPanel)) + { + mListViewBtn->setToggleState(FALSE); + } + mFolderViewBtn->setToggleState(TRUE); } void LLPanelOutfitEdit::saveOutfit(bool as_new) @@ -324,7 +377,7 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string) if (mSearchString == "") { mInventoryItemsPanel->setFilterSubString(LLStringUtil::null); - + mWearableItemsList->setFilterSubString(LLStringUtil::null); // re-open folders that were initially open mSavedFolderState->setApply(TRUE); mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); @@ -350,6 +403,8 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string) // set new filter string mInventoryItemsPanel->setFilterSubString(mSearchString); + mWearableItemsList->setFilterSubString(mSearchString); + } void LLPanelOutfitEdit::onAddToOutfitClicked(void) @@ -360,10 +415,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 +424,6 @@ void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void) LLUUID id_to_remove = mCOFWearables->getSelectedUUID(); LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove); - - updateLookInfo(); } @@ -465,34 +515,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 +529,6 @@ void LLPanelOutfitEdit::displayCurrentOutfit() setVisible(TRUE); } - mCurrentOutfitID = LLAppearanceMgr::getInstance()->getCOF(); - std::string current_outfit_name; if (LLAppearanceMgr::getInstance()->getBaseOutfitName(current_outfit_name)) { @@ -512,18 +539,36 @@ 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(); - + bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull(); + childSetEnabled(SAVE_BTN, outfit_is_dirty); - childSetEnabled(REVERT_BTN, outfit_is_dirty); + childSetEnabled(REVERT_BTN, outfit_is_dirty && has_baseoutfit); mSaveMenu->setItemEnabled("save_outfit", outfit_is_dirty); + + mStatus->setText(outfit_is_dirty ? getString("unsaved_changes") : getString("now_editing")); + +} + +bool LLPanelOutfitEdit::switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel) +{ + if(switch_from_panel && switch_to_panel && !switch_to_panel->getVisible()) + { + switch_from_panel->setVisible(FALSE); + switch_to_panel->setVisible(TRUE); + return true; + } + return false; } // EOF |