commit
ee310b4131
|
|
@ -593,6 +593,23 @@ bool LLAppearanceMgr::getBaseOutfitName(std::string& name)
|
|||
return false;
|
||||
}
|
||||
|
||||
const LLUUID LLAppearanceMgr::getBaseOutfitUUID()
|
||||
{
|
||||
const LLViewerInventoryItem* outfit_link = getBaseOutfitLink();
|
||||
if (!outfit_link || !outfit_link->getIsLinkType()) return LLUUID::null;
|
||||
|
||||
const LLViewerInventoryCategory* outfit_cat = outfit_link->getLinkedCategory();
|
||||
if (!outfit_cat) return LLUUID::null;
|
||||
|
||||
if (outfit_cat->getPreferredType() != LLFolderType::FT_OUTFIT)
|
||||
{
|
||||
llwarns << "Expected outfit type:" << LLFolderType::FT_OUTFIT << " but got type:" << outfit_cat->getType() << " for folder name:" << outfit_cat->getName() << llendl;
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
return outfit_cat->getUUID();
|
||||
}
|
||||
|
||||
// Update appearance from outfit folder.
|
||||
void LLAppearanceMgr::changeOutfit(bool proceed, const LLUUID& category, bool append)
|
||||
{
|
||||
|
|
@ -1516,6 +1533,20 @@ void LLAppearanceMgr::onFirstFullyVisible()
|
|||
autopopulateOutfits();
|
||||
}
|
||||
|
||||
bool LLAppearanceMgr::updateBaseOutfit()
|
||||
{
|
||||
const LLUUID base_outfit_id = getBaseOutfitUUID();
|
||||
if (base_outfit_id.isNull()) return false;
|
||||
|
||||
// in a Base Outfit we do not remove items, only links
|
||||
purgeCategory(base_outfit_id, false);
|
||||
|
||||
//COF contains only links so we copy to the Base Outfit only links
|
||||
shallowCopyCategoryContents(getCOF(), base_outfit_id, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//#define DUMP_CAT_VERBOSE
|
||||
|
||||
void LLAppearanceMgr::dumpCat(const LLUUID& cat_id, const std::string& msg)
|
||||
|
|
|
|||
|
|
@ -75,6 +75,9 @@ public:
|
|||
const LLViewerInventoryItem *getBaseOutfitLink();
|
||||
bool getBaseOutfitName(std::string &name);
|
||||
|
||||
// find the UUID of the currently worn outfit (Base Outfit)
|
||||
const LLUUID getBaseOutfitUUID();
|
||||
|
||||
// Update the displayed outfit name in UI.
|
||||
void updatePanelOutfitName(const std::string& name);
|
||||
|
||||
|
|
@ -123,6 +126,10 @@ public:
|
|||
// Create initial outfits from library.
|
||||
void autopopulateOutfits();
|
||||
|
||||
// Overrides the base outfit with the content from COF
|
||||
// @return false if there is no base outfit
|
||||
bool updateBaseOutfit();
|
||||
|
||||
protected:
|
||||
LLAppearanceMgr();
|
||||
~LLAppearanceMgr();
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#include "llfloaterreg.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventorypanel.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llviewerinventory.h"
|
||||
#include "llbutton.h"
|
||||
|
|
@ -54,12 +55,14 @@
|
|||
#include "llinventorybridge.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "llinventorymodelbackgroundfetch.h"
|
||||
#include "llpaneloutfitsinventory.h"
|
||||
#include "lluiconstants.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "lltextbox.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llsdutil.h"
|
||||
#include "llsidepanelappearance.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "llwearablelist.h"
|
||||
|
||||
static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_outfit_edit("panel_outfit_edit");
|
||||
|
|
@ -228,6 +231,15 @@ BOOL LLPanelOutfitEdit::postBuild()
|
|||
|
||||
childSetAction("remove_item_btn", boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this), this);
|
||||
|
||||
childSetAction("save_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
|
||||
childSetAction("save_as_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true));
|
||||
childSetAction("save_flyout_btn", boost::bind(&LLPanelOutfitEdit::showSaveMenu, this));
|
||||
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar save_registar;
|
||||
save_registar.add("Outfit.Save.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
|
||||
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());
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -236,6 +248,31 @@ void LLPanelOutfitEdit::showAddWearablesPanel()
|
|||
childSetVisible("add_wearables_panel", childGetValue("add_btn"));
|
||||
}
|
||||
|
||||
void LLPanelOutfitEdit::saveOutfit(bool as_new)
|
||||
{
|
||||
if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit())
|
||||
{
|
||||
// we don't need to ask for an outfit name, and updateBaseOutfit() successfully saved.
|
||||
// If updateBaseOutfit fails, ask for an outfit name anyways
|
||||
return;
|
||||
}
|
||||
|
||||
LLPanelOutfitsInventory* panel_outfits_inventory = LLPanelOutfitsInventory::findInstance();
|
||||
if (panel_outfits_inventory)
|
||||
{
|
||||
panel_outfits_inventory->onSave();
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelOutfitEdit::showSaveMenu()
|
||||
{
|
||||
S32 x, y;
|
||||
LLUI::getMousePositionLocal(this, &x, &y);
|
||||
|
||||
mSaveMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
LLMenuGL::showPopup(this, mSaveMenu, x, y);
|
||||
}
|
||||
|
||||
void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)
|
||||
{
|
||||
LLComboBox* type_filter = dynamic_cast<LLComboBox*>(ctrl);
|
||||
|
|
@ -301,6 +338,8 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
|
|||
void LLPanelOutfitEdit::onAddToLookClicked(void)
|
||||
{
|
||||
LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
|
||||
if (!curr_item) return;
|
||||
|
||||
LLFolderViewEventListener* listenerp = curr_item->getListener();
|
||||
link_inventory_item(gAgent.getID(), listenerp->getUUID(), mCurrentOutfitID, listenerp->getName(),
|
||||
LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ class LLInventoryPanel;
|
|||
class LLSaveFolderState;
|
||||
class LLFolderViewItem;
|
||||
class LLScrollListCtrl;
|
||||
class LLToggleableMenu;
|
||||
class LLLookFetchObserver;
|
||||
class LLFilterEditor;
|
||||
|
||||
|
|
@ -86,6 +87,8 @@ public:
|
|||
// only update the location if there is none already available.
|
||||
|
||||
void showAddWearablesPanel();
|
||||
void saveOutfit(bool as_new = false);
|
||||
void showSaveMenu();
|
||||
|
||||
void onTypeFilterChanged(LLUICtrl* ctrl);
|
||||
void onSearchEdit(const std::string& string);
|
||||
|
|
@ -117,6 +120,7 @@ private:
|
|||
LLButton* mRemoveFromLookBtn;
|
||||
LLButton* mUpBtn;
|
||||
LLButton* mEditWearableBtn;
|
||||
LLToggleableMenu* mSaveMenu;
|
||||
|
||||
LLLookFetchObserver* mFetchLook;
|
||||
LLInventoryLookObserver* mLookObserver;
|
||||
|
|
|
|||
|
|
@ -217,8 +217,13 @@ bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD&
|
|||
if( !outfit_name.empty() )
|
||||
{
|
||||
LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
|
||||
LLSD key;
|
||||
LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
|
||||
|
||||
LLSidepanelAppearance* panel_appearance =
|
||||
dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
|
||||
if (panel_appearance)
|
||||
{
|
||||
panel_appearance->showOutfitsInventoryPanel();
|
||||
}
|
||||
|
||||
if (mAppearanceTabs)
|
||||
{
|
||||
|
|
@ -309,6 +314,12 @@ LLFolderView *LLPanelOutfitsInventory::getRootFolder()
|
|||
return mActivePanel->getRootFolder();
|
||||
}
|
||||
|
||||
//static
|
||||
LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance()
|
||||
{
|
||||
return dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// List Commands //
|
||||
|
||||
|
|
|
|||
|
|
@ -73,6 +73,8 @@ public:
|
|||
|
||||
LLFolderView* getRootFolder();
|
||||
|
||||
static LLPanelOutfitsInventory* findInstance();
|
||||
|
||||
protected:
|
||||
void updateVerbs();
|
||||
bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ BOOL LLSidepanelAppearance::postBuild()
|
|||
LLButton* back_btn = mOutfitEdit->getChild<LLButton>("back_btn");
|
||||
if (back_btn)
|
||||
{
|
||||
back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
|
||||
back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::showOutfitsInventoryPanel, this));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -176,7 +176,7 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
|
|||
|
||||
if(key.size() == 0)
|
||||
return;
|
||||
|
||||
|
||||
toggleOutfitEditPanel(TRUE);
|
||||
updateVerbs();
|
||||
|
||||
|
|
@ -258,12 +258,6 @@ void LLSidepanelAppearance::onNewOutfitButtonClicked()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void LLSidepanelAppearance::onBackButtonClicked()
|
||||
{
|
||||
toggleOutfitEditPanel(FALSE);
|
||||
}
|
||||
|
||||
void LLSidepanelAppearance::onEditWearBackClicked()
|
||||
{
|
||||
mEditWearable->saveChanges();
|
||||
|
|
@ -271,6 +265,30 @@ void LLSidepanelAppearance::onEditWearBackClicked()
|
|||
toggleOutfitEditPanel(TRUE);
|
||||
}
|
||||
|
||||
void LLSidepanelAppearance::showOutfitsInventoryPanel()
|
||||
{
|
||||
mOutfitEdit->setVisible(FALSE);
|
||||
|
||||
mPanelOutfitsInventory->setVisible(TRUE);
|
||||
|
||||
mFilterEditor->setVisible(TRUE);
|
||||
mEditBtn->setVisible(TRUE);
|
||||
mNewOutfitBtn->setVisible(TRUE);
|
||||
mCurrOutfitPanel->setVisible(TRUE);
|
||||
}
|
||||
|
||||
void LLSidepanelAppearance::showOutfitEditPanel()
|
||||
{
|
||||
mOutfitEdit->setVisible(TRUE);
|
||||
|
||||
mPanelOutfitsInventory->setVisible(FALSE);
|
||||
|
||||
mFilterEditor->setVisible(FALSE);
|
||||
mEditBtn->setVisible(FALSE);
|
||||
mNewOutfitBtn->setVisible(FALSE);
|
||||
mCurrOutfitPanel->setVisible(FALSE);
|
||||
}
|
||||
|
||||
void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible)
|
||||
{
|
||||
if (!mOutfitEdit)
|
||||
|
|
|
|||
|
|
@ -63,14 +63,18 @@ public:
|
|||
void updateVerbs();
|
||||
void onNewOutfitButtonClicked();
|
||||
|
||||
void showOutfitsInventoryPanel();
|
||||
void showOutfitEditPanel();
|
||||
|
||||
private:
|
||||
void onFilterEdit(const std::string& search_string);
|
||||
|
||||
void onOpenOutfitButtonClicked();
|
||||
void onEditAppearanceButtonClicked();
|
||||
void onEditButtonClicked();
|
||||
void onBackButtonClicked();
|
||||
void onEditWearBackClicked();
|
||||
|
||||
//@deprecated use showXXX() methods instead
|
||||
void toggleOutfitEditPanel(BOOL visible);
|
||||
void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu
|
||||
height="201"
|
||||
layout="topleft"
|
||||
mouse_opaque="false"
|
||||
name="save_outfit_menu"
|
||||
width="120">
|
||||
<menu_item_call
|
||||
name="save_outfit"
|
||||
label="Save">
|
||||
<menu_item_call.on_click
|
||||
function="Outfit.Save.Action"
|
||||
userdata=""/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
name="save_as_new_outfit"
|
||||
label="Save As New">
|
||||
<menu_item_call.on_click
|
||||
function="Outfit.SaveAsNew.Action"
|
||||
userdata="" />
|
||||
</menu_item_call>
|
||||
</toggleable_menu>
|
||||
|
|
@ -337,6 +337,19 @@
|
|||
layout="topleft"
|
||||
name="save_btn"
|
||||
width="145" />
|
||||
<button
|
||||
follows="bottom|right"
|
||||
height="23"
|
||||
name="save_flyout_btn"
|
||||
label=""
|
||||
left_pad="-20"
|
||||
tab_stop="false"
|
||||
image_selected="SegmentedBtn_Right_Selected_Press"
|
||||
image_unselected="SegmentedBtn_Right_Off"
|
||||
image_pressed="SegmentedBtn_Right_Press"
|
||||
image_pressed_selected="SegmentedBtn_Right_Selected_Press"
|
||||
image_overlay="Arrow_Small_Up"
|
||||
width="20"/>
|
||||
<button
|
||||
follows="bottom|left|right"
|
||||
height="23"
|
||||
|
|
|
|||
Loading…
Reference in New Issue