merge from PE's viewer-trunk

meow-7.2.2
Tofu Linden 2010-05-07 11:33:32 +01:00
commit b941d3ddc3
4 changed files with 40 additions and 163 deletions

View File

@ -92,8 +92,7 @@ LLPanelGroup::LLPanelGroup()
: LLPanel(),
LLGroupMgrObserver( LLUUID() ),
mSkipRefresh(FALSE),
mButtonJoin(NULL),
mShowingNotifyDialog(false)
mButtonJoin(NULL)
{
// Set up the factory callbacks.
// Roles sub tabs
@ -629,69 +628,4 @@ void LLPanelGroup::showNotice(const std::string& subject,
}
bool LLPanelGroup::canClose()
{
if(getVisible() == false)
return true;
bool need_save = false;
std::string mesg;
for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
if(need_save|=(*it)->needsApply(mesg))
break;
if(!need_save)
return false;
// If no message was provided, give a generic one.
if (mesg.empty())
{
mesg = mDefaultNeedsApplyMesg;
}
// Create a notify box, telling the user about the unapplied tab.
LLSD args;
args["NEEDS_APPLY_MESSAGE"] = mesg;
args["WANT_APPLY_MESSAGE"] = mWantApplyMesg;
LLNotificationsUtil::add("SaveChanges", args, LLSD(), boost::bind(&LLPanelGroup::handleNotifyCallback,this, _1, _2));
mShowingNotifyDialog = true;
return false;
}
bool LLPanelGroup::notifyChildren(const LLSD& info)
{
if(info.has("request") && mID.isNull() )
{
std::string str_action = info["request"];
if (str_action == "quit" )
{
canClose();
return true;
}
if(str_action == "wait_quit")
return mShowingNotifyDialog;
}
return false;
}
bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
mShowingNotifyDialog = false;
switch (option)
{
case 0: // "Apply Changes"
apply();
break;
case 1: // "Ignore Changes"
break;
case 2: // "Cancel"
default:
// Do nothing. The user is canceling the action.
// If we were quitting, we didn't really mean it.
LLAppViewer::instance()->abortQuit();
break;
}
return false;
}

View File

@ -95,9 +95,6 @@ public:
LLOfferInfo* inventory_offer);
bool notifyChildren (const LLSD& info);
bool handleNotifyCallback(const LLSD&, const LLSD&);
protected:
virtual void update(LLGroupChange gc);
@ -117,9 +114,6 @@ protected:
protected:
bool apply(LLPanelGroupTab* tab);
bool canClose();
bool mShowingNotifyDialog;
LLTimer mRefreshTimer;

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;