summaryrefslogtreecommitdiff
path: root/indra/newview/llpaneloutfitsinventory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llpaneloutfitsinventory.cpp')
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp156
1 files changed, 130 insertions, 26 deletions
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index e058b3b326..c2f2d32142 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -35,6 +35,7 @@
#include "llagent.h"
#include "llagentwearables.h"
+#include "llappearancemgr.h"
#include "llbutton.h"
#include "llfloaterreg.h"
@@ -44,6 +45,8 @@
#include "llinventoryfunctions.h"
#include "llinventorypanel.h"
#include "lllandmark.h"
+#include "lllineeditor.h"
+#include "llmodaldialog.h"
#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltabcontainer.h"
@@ -58,15 +61,81 @@
#include "llviewercontrol.h"
+static const std::string OUTFITS_TAB_NAME = "outfitslist_tab";
+static const std::string COF_TAB_NAME = "cof_tab";
+
static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
bool LLPanelOutfitsInventory::sShowDebugEditor = false;
+class LLOutfitSaveAsDialog : public LLModalDialog
+{
+private:
+ std::string mItemName;
+ std::string mTempItemName;
+
+ boost::signals2::signal<void (const std::string&)> mSaveAsSignal;
+
+public:
+ LLOutfitSaveAsDialog( const LLSD& key )
+ : LLModalDialog( key ),
+ mTempItemName(key.asString())
+ {
+ }
+
+ BOOL postBuild()
+ {
+ getChild<LLUICtrl>("Save")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onSave, this ));
+ getChild<LLUICtrl>("Cancel")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onCancel, this ));
+
+ childSetTextArg("name ed", "[DESC]", mTempItemName);
+ return TRUE;
+ }
+
+ void setSaveAsCommit( const boost::signals2::signal<void (const std::string&)>::slot_type& cb )
+ {
+ mSaveAsSignal.connect(cb);
+ }
+
+ virtual void onOpen(const LLSD& key)
+ {
+ LLLineEditor* edit = getChild<LLLineEditor>("name ed");
+ if (edit)
+ {
+ edit->setFocus(TRUE);
+ edit->selectAll();
+ }
+ }
+
+ void onSave()
+ {
+ mItemName = childGetValue("name ed").asString();
+ LLStringUtil::trim(mItemName);
+ if( !mItemName.empty() )
+ {
+ mSaveAsSignal(mItemName);
+ closeFloater(); // destroys this object
+ }
+ }
+
+ void onCancel()
+ {
+ closeFloater(); // destroys this object
+ }
+};
+
LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
mActivePanel(NULL),
mParent(NULL)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
+
+ static bool registered_dialog = false;
+ if (!registered_dialog)
+ {
+ LLFloaterReg::add("outfit_save_as", "floater_outfit_save_as.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutfitSaveAsDialog>);
+ registered_dialog = true;
+ }
}
LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
@@ -90,6 +159,27 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)
// Make sure we know which tab is selected, update the filter,
// and update verbs.
onTabChange();
+
+ // Auto open the first outfit newly created so new users can see sample outfit contents
+ static bool should_open_outfit = true;
+ if (should_open_outfit && gAgent.isFirstLogin())
+ {
+ LLInventoryPanel* outfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME);
+ if (outfits_panel)
+ {
+ LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLFolderViewFolder* my_outfits_folder = outfits_panel->getRootFolder()->getFolderByID(my_outfits_id);
+ if (my_outfits_folder)
+ {
+ LLFolderViewFolder* first_outfit = dynamic_cast<LLFolderViewFolder*>(my_outfits_folder->getFirstChild());
+ if (first_outfit)
+ {
+ first_outfit->setOpen(TRUE);
+ }
+ }
+ }
+ }
+ should_open_outfit = false;
}
void LLPanelOutfitsInventory::updateVerbs()
@@ -177,13 +267,31 @@ void LLPanelOutfitsInventory::onEdit()
{
}
-void LLPanelOutfitsInventory::onNew()
+void LLPanelOutfitsInventory::onSave()
+{
+ std::string outfit_name;
+
+ if (!LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name))
+ {
+ outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);
+ }
+
+ LLOutfitSaveAsDialog* save_as_dialog = LLFloaterReg::showTypedInstance<LLOutfitSaveAsDialog>("outfit_save_as", LLSD(outfit_name), TRUE);
+ if (save_as_dialog)
+ {
+ save_as_dialog->setSaveAsCommit(boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1 ));
+ }
+}
+
+void LLPanelOutfitsInventory::onSaveCommit(const std::string& outfit_name)
{
- const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);
LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+
if (mAppearanceTabs)
{
- mAppearanceTabs->selectTabByName("outfitslist_tab");
+ mAppearanceTabs->selectTabByName(OUTFITS_TAB_NAME);
}
}
@@ -291,7 +399,7 @@ void LLPanelOutfitsInventory::onGearButtonClick()
void LLPanelOutfitsInventory::onAddButtonClick()
{
- onNew();
+ onSave();
}
void LLPanelOutfitsInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
@@ -330,7 +438,7 @@ void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
const std::string command_name = userdata.asString();
if (command_name == "new")
{
- onNew();
+ onSave();
}
if (command_name == "edit")
{
@@ -419,8 +527,7 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "wear")
{
- const BOOL is_my_outfits = (mActivePanel->getName() == "outfitslist_tab");
- if (!is_my_outfits)
+ if (isCOFPanelActive())
{
return FALSE;
}
@@ -474,19 +581,15 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy
void LLPanelOutfitsInventory::initTabPanels()
{
- mTabPanels.resize(2);
-
- LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>("cof_tab");
+ LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>(COF_TAB_NAME);
cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mTabPanels[0] = cof_panel;
-
- LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>("outfitslist_tab");
+ mTabPanels.push_back(cof_panel);
+
+ LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME);
myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY);
myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mTabPanels[1] = myoutfits_panel;
-
- mActivePanel = mTabPanels[0];
-
+ mTabPanels.push_back(myoutfits_panel);
+
for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
iter != mTabPanels.end();
++iter)
@@ -497,6 +600,7 @@ void LLPanelOutfitsInventory::initTabPanels()
mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");
mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));
+ mActivePanel = (LLInventoryPanel*)mAppearanceTabs->getCurrentPanel();
}
void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
@@ -532,19 +636,19 @@ void LLPanelOutfitsInventory::onTabChange()
updateVerbs();
}
-LLInventoryPanel* LLPanelOutfitsInventory::getActivePanel()
+BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const
{
- return mActivePanel;
-}
-
-bool LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel)
-{
- for(tabpanels_vec_t::iterator it = mTabPanels.begin();
+ for(tabpanels_vec_t::const_iterator it = mTabPanels.begin();
it != mTabPanels.end();
++it)
{
if (*it == panel)
- return true;
+ return TRUE;
}
- return false;
+ return FALSE;
+}
+
+BOOL LLPanelOutfitsInventory::isCOFPanelActive() const
+{
+ return (getActivePanel()->getName() == COF_TAB_NAME);
}