From 0a73840dd8e350cd936b681c0cc5131905eb3b09 Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Thu, 5 May 2016 16:30:41 +0300
Subject: MAINT-6381 Right click on Outfit Folder behavior

---
 indra/newview/lloutfitgallery.cpp                  | 103 ++++++++++++++++++++-
 indra/newview/lloutfitgallery.h                    |  27 ++++++
 .../default/xui/en/panel_outfit_gallery_item.xml   |   3 +-
 3 files changed, 130 insertions(+), 3 deletions(-)

diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index b351be8de9..a36728e6ac 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -44,6 +44,7 @@
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
 #include "lllocalbitmaps.h"
+#include "llnotificationsutil.h"
 #include "lltexturectrl.h"
 #include "llviewermenufile.h"
 #include "llwearableitemslist.h"
@@ -98,6 +99,7 @@ BOOL LLOutfitGallery::postBuild()
     BOOL rv = LLOutfitListBase::postBuild();
     mScrollPanel = getChild<LLScrollContainer>("gallery_scroll_panel");
     mGalleryPanel = getChild<LLPanel>("gallery_panel");
+    mOutfitGalleryMenu = new LLOutfitGalleryContextMenu(this);
     return rv;
 }
 
@@ -352,6 +354,8 @@ void LLOutfitGallery::moveRowPanel(LLPanel* stack, int left, int bottom)
 
 LLOutfitGallery::~LLOutfitGallery()
 {
+    delete mOutfitGalleryMenu;
+    
     if (gInventory.containsObserver(mTexturesObserver))
     {
         gInventory.removeObserver(mTexturesObserver);
@@ -486,7 +490,7 @@ void LLOutfitGallery::onOutfitRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLU
     {
         uuid_vec_t selected_uuids;
         selected_uuids.push_back(cat_id);
-        mOutfitMenu->show(ctrl, selected_uuids, x, y);
+        mOutfitGalleryMenu->show(ctrl, selected_uuids, x, y);
     }
 }
 
@@ -604,6 +608,12 @@ BOOL LLOutfitGalleryItem::handleMouseDown(S32 x, S32 y, MASK mask)
     return LLUICtrl::handleMouseDown(x, y, mask);
 }
 
+BOOL LLOutfitGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+    setFocus(TRUE);
+    return LLUICtrl::handleRightMouseDown(x, y, mask);
+}
+
 void LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
 {
     mImageAssetId = image_asset_id;
@@ -626,6 +636,97 @@ void LLOutfitGalleryItem::setDefaultImage()
     mDefaultImage = true;
 }
 
+LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
+{
+    LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+    LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+    LLUUID selected_id = mUUIDs.front();
+    
+    registrar.add("Outfit.WearReplace",
+                  boost::bind(&LLAppearanceMgr::replaceCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
+    registrar.add("Outfit.WearAdd",
+                  boost::bind(&LLAppearanceMgr::addCategoryToCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
+    registrar.add("Outfit.TakeOff",
+                  boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id));
+    registrar.add("Outfit.Edit", boost::bind(editOutfit));
+    registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id));
+    registrar.add("Outfit.Delete", boost::bind(&LLOutfitGalleryContextMenu::onRemoveOutfit, this, selected_id));
+    registrar.add("Outfit.Create", boost::bind(&LLOutfitGalleryContextMenu::onCreate, this, _2));
+    registrar.add("Outfit.UploadPhoto", boost::bind(&LLOutfitGalleryContextMenu::onUploadPhoto, this, selected_id));
+    registrar.add("Outfit.SelectPhoto", boost::bind(&LLOutfitGalleryContextMenu::onSelectPhoto, this, selected_id));
+    registrar.add("Outfit.TakeSnapshot", boost::bind(&LLOutfitGalleryContextMenu::onTakeSnapshot, this, selected_id));
+    
+    enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitGalleryContextMenu::onEnable, this, _2));
+    enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitGalleryContextMenu::onVisible, this, _2));
+    
+    return createFromFile("menu_gallery_outfit_tab.xml");
+}
+
+void LLOutfitGalleryContextMenu::onUploadPhoto(const LLUUID& outfit_cat_id)
+{
+    LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
+    if (gallery && outfit_cat_id.notNull())
+    {
+        gallery->uploadPhoto(outfit_cat_id);
+    }
+}
+
+void LLOutfitGalleryContextMenu::onSelectPhoto(const LLUUID& outfit_cat_id)
+{
+    LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
+    if (gallery && outfit_cat_id.notNull())
+    {
+        gallery->onSelectPhoto(outfit_cat_id);
+    }
+}
+
+void LLOutfitGalleryContextMenu::onTakeSnapshot(const LLUUID& outfit_cat_id)
+{
+    LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
+    if (gallery && outfit_cat_id.notNull())
+    {
+        gallery->onTakeSnapshot(outfit_cat_id);
+    }
+}
+
+void LLOutfitGalleryContextMenu::onRemoveOutfit(const LLUUID& outfit_cat_id)
+{
+    LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLOutfitGalleryContextMenu::onOutfitsRemovalConfirmation, this, _1, _2, outfit_cat_id));
+}
+
+void LLOutfitGalleryContextMenu::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id)
+{
+    S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+    if (option != 0) return; // canceled
+    
+    if (outfit_cat_id.notNull())
+    {
+        gInventory.removeCategory(outfit_cat_id);
+    }
+}
+
+void LLOutfitGalleryContextMenu::onCreate(const LLSD& data)
+{
+    LLWearableType::EType type = LLWearableType::typeNameToType(data.asString());
+    if (type == LLWearableType::WT_NONE)
+    {
+        LL_WARNS() << "Invalid wearable type" << LL_ENDL;
+        return;
+    }
+    
+    LLAgentWearables::createWearable(type, true);
+}
+
+bool LLOutfitGalleryContextMenu::onEnable(LLSD::String param)
+{
+    return LLOutfitContextMenu::onEnable(param);
+}
+
+bool LLOutfitGalleryContextMenu::onVisible(LLSD::String param)
+{
+    return LLOutfitContextMenu::onVisible(param);
+}
+
 LLOutfitGalleryGearMenu::LLOutfitGalleryGearMenu(LLOutfitListBase* olist)
     : LLOutfitListGearMenuBase(olist)
 {
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index dbf891142d..b8c7d66406 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -43,6 +43,7 @@ class LLOutfitGallery;
 class LLOutfitGalleryItem;
 class LLOutfitListGearMenuBase;
 class LLOutfitGalleryGearMenu;
+class LLOutfitGalleryContextMenu;
 
 class LLUpdateGalleryOnPhotoLinked : public LLInventoryCallback
 {
@@ -57,6 +58,7 @@ class LLOutfitGallery : public LLOutfitListBase
 {
 public:
     friend class LLOutfitGalleryGearMenu;
+    friend class LLOutfitGalleryContextMenu;
     friend class LLUpdateGalleryOnPhotoLinked;
 
     struct Params
@@ -169,6 +171,8 @@ private:
     int mGalleryWidth;
     int mRowPanWidthFactor;
     int mGalleryWidthFactor;
+    
+    LLListContextMenu* mOutfitGalleryMenu;
 
     LLHandle<LLFloater> mFloaterHandle;
 
@@ -183,6 +187,28 @@ private:
     LLInventoryCategoriesObserver* 	mTexturesObserver;
     LLInventoryCategoriesObserver* 	mOutfitsObserver;
 };
+class LLOutfitGalleryContextMenu : public LLOutfitContextMenu
+{
+public:
+    
+    friend class LLOutfitGallery;
+    LLOutfitGalleryContextMenu(LLOutfitListBase* outfit_list)
+    : LLOutfitContextMenu(outfit_list),
+    mOutfitList(outfit_list){}
+protected:
+    /* virtual */ LLContextMenu* createMenu();
+    bool onEnable(LLSD::String param);
+    bool onVisible(LLSD::String param);
+    void onUploadPhoto(const LLUUID& outfit_cat_id);
+    void onSelectPhoto(const LLUUID& outfit_cat_id);
+    void onTakeSnapshot(const LLUUID& outfit_cat_id);
+    void onCreate(const LLSD& data);
+    void onRemoveOutfit(const LLUUID& outfit_cat_id);
+    void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id);
+private:
+    LLOutfitListBase*	mOutfitList;
+};
+
 
 class LLOutfitGalleryGearMenu : public LLOutfitListGearMenuBase
 {
@@ -210,6 +236,7 @@ public:
     /*virtual*/ BOOL postBuild();
     /*virtual*/ void draw();
     /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+    /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
     void setDefaultImage();
     void setImageAssetId(LLUUID asset_id);
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_gallery_item.xml b/indra/newview/skins/default/xui/en/panel_outfit_gallery_item.xml
index eede209e91..77c546c6e7 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_gallery_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery_item.xml
@@ -3,8 +3,7 @@
    background_visible="false"
    background_opaque="false"
    bg_alpha_color="FrogGreen"
-   bg_opaque_color="FrogGreen"
-   border_color="Red"
+   bg_opaque_color="FrogGreen"   
    border="false"
    bevel_style="none"
    follows="left|top"
-- 
cgit v1.2.3