diff options
Diffstat (limited to 'indra/newview/llpaneleditwearable.cpp')
-rw-r--r-- | indra/newview/llpaneleditwearable.cpp | 1117 |
1 files changed, 121 insertions, 996 deletions
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 85bddab02c..da74295f9e 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -2,25 +2,31 @@ * @file llpaneleditwearable.cpp * @brief UI panel for editing of a particular wearable item. * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009-2009, Linden Research, Inc. * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ @@ -41,24 +47,9 @@ #include "llvoavatarself.h" #include "lltexteditor.h" #include "lltextbox.h" -#include "llaccordionctrl.h" #include "llaccordionctrltab.h" #include "llagentwearables.h" #include "llscrollingpanelparam.h" -#include "llradiogroup.h" -#include "llnotificationsutil.h" - -#include "llcolorswatch.h" -#include "lltexturectrl.h" -#include "lltextureentry.h" -#include "llviewercontrol.h" // gSavedSettings -#include "llviewertexturelist.h" -#include "llagentcamera.h" -#include "llmorphview.h" - -#include "llcommandhandler.h" -#include "lltextutil.h" -#include "llappearancemgr.h" // register panel with appropriate XML static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_edit_wearable"); @@ -97,8 +88,6 @@ enum ESubpart { SUBPART_TATTOO }; -using namespace LLVOAvatarDefines; - typedef std::vector<ESubpart> subpart_vec_t; // Locally defined classes @@ -118,28 +107,25 @@ public: public: struct WearableEntry : public LLDictionaryEntry { - WearableEntry(LLWearableType::EType type, + WearableEntry(EWearableType type, const std::string &title, const std::string &desc_title, - U8 num_color_swatches, // number of 'color_swatches' - U8 num_texture_pickers, // number of 'texture_pickers' - U8 num_subparts, ... ); // number of subparts followed by a list of ETextureIndex and ESubparts + U8 num_subparts, ... ); // number of subparts followed by a list of ESubparts - const LLWearableType::EType mWearableType; + const EWearableType mWearableType; const std::string mTitle; const std::string mDescTitle; subpart_vec_t mSubparts; - texture_vec_t mColorSwatchCtrls; - texture_vec_t mTextureCtrls; + }; - struct Wearables : public LLDictionary<LLWearableType::EType, WearableEntry> + struct Wearables : public LLDictionary<EWearableType, WearableEntry> { Wearables(); } mWearables; - const WearableEntry* getWearable(LLWearableType::EType type) const { return mWearables.lookup(type); } + const WearableEntry* getWearable(EWearableType type) const { return mWearables.lookup(type); } //-------------------------------------------------------------------- // Subparts @@ -172,35 +158,6 @@ public: } mSubparts; const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); } - - //-------------------------------------------------------------------- - // Picker Control Entries - //-------------------------------------------------------------------- -public: - struct PickerControlEntry : public LLDictionaryEntry - { - PickerControlEntry(ETextureIndex tex_index, - const std::string name, - const LLUUID default_image_id = LLUUID::null, - const bool allow_no_texture = false); - ETextureIndex mTextureIndex; - const std::string mControlName; - const LLUUID mDefaultImageId; - const bool mAllowNoTexture; - }; - - struct ColorSwatchCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> - { - ColorSwatchCtrls(); - } mColorSwatchCtrls; - - struct TextureCtrls : public LLDictionary<ETextureIndex, PickerControlEntry> - { - TextureCtrls(); - } mTextureCtrls; - - const PickerControlEntry* getTexturePicker(ETextureIndex index) const { return mTextureCtrls.lookup(index); } - const PickerControlEntry* getColorSwatch(ETextureIndex index) const { return mColorSwatchCtrls.lookup(index); } }; LLEditWearableDictionary::LLEditWearableDictionary() @@ -215,31 +172,26 @@ LLEditWearableDictionary::~LLEditWearableDictionary() LLEditWearableDictionary::Wearables::Wearables() { - // note the subpart that is listed first is treated as "default", regardless of what order is in enum. - // Please match the order presented in XUI. -Nyx - // this will affect what camera angle is shown when first editing a wearable - addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS )); - addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL)); - addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL)); - addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES)); - addEntry(LLWearableType::WT_SHIRT, new WearableEntry(LLWearableType::WT_SHIRT,"edit_shirt_title","shirt_desc_text",1,1,1, TEX_UPPER_SHIRT, TEX_UPPER_SHIRT, SUBPART_SHIRT)); - addEntry(LLWearableType::WT_PANTS, new WearableEntry(LLWearableType::WT_PANTS,"edit_pants_title","pants_desc_text",1,1,1, TEX_LOWER_PANTS, TEX_LOWER_PANTS, SUBPART_PANTS)); - addEntry(LLWearableType::WT_SHOES, new WearableEntry(LLWearableType::WT_SHOES,"edit_shoes_title","shoes_desc_text",1,1,1, TEX_LOWER_SHOES, TEX_LOWER_SHOES, SUBPART_SHOES)); - addEntry(LLWearableType::WT_SOCKS, new WearableEntry(LLWearableType::WT_SOCKS,"edit_socks_title","socks_desc_text",1,1,1, TEX_LOWER_SOCKS, TEX_LOWER_SOCKS, SUBPART_SOCKS)); - addEntry(LLWearableType::WT_JACKET, new WearableEntry(LLWearableType::WT_JACKET,"edit_jacket_title","jacket_desc_text",1,2,1, TEX_UPPER_JACKET, TEX_UPPER_JACKET, TEX_LOWER_JACKET, SUBPART_JACKET)); - addEntry(LLWearableType::WT_GLOVES, new WearableEntry(LLWearableType::WT_GLOVES,"edit_gloves_title","gloves_desc_text",1,1,1, TEX_UPPER_GLOVES, TEX_UPPER_GLOVES, SUBPART_GLOVES)); - addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(LLWearableType::WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1,1,1, TEX_UPPER_UNDERSHIRT, TEX_UPPER_UNDERSHIRT, SUBPART_UNDERSHIRT)); - addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(LLWearableType::WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1,1,1, TEX_LOWER_UNDERPANTS, TEX_LOWER_UNDERPANTS, SUBPART_UNDERPANTS)); - addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT)); - addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA)); - addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO)); -} - -LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, + addEntry(WT_SHAPE, new WearableEntry(WT_SHAPE,"edit_shape_title","shape_desc_text",9, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_WHOLE)); + addEntry(WT_SKIN, new WearableEntry(WT_SKIN,"edit_skin_title","skin_desc_text",4, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL)); + addEntry(WT_HAIR, new WearableEntry(WT_HAIR,"edit_hair_title","hair_desc_text",4, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL)); + addEntry(WT_EYES, new WearableEntry(WT_EYES,"edit_eyes_title","eyes_desc_text",1, SUBPART_EYES)); + addEntry(WT_SHIRT, new WearableEntry(WT_SHIRT,"edit_shirt_title","shirt_desc_text",1, SUBPART_SHIRT)); + addEntry(WT_PANTS, new WearableEntry(WT_PANTS,"edit_pants_title","pants_desc_text",1, SUBPART_PANTS)); + addEntry(WT_SHOES, new WearableEntry(WT_SHOES,"edit_shoes_title","shoes_desc_text",1, SUBPART_SHOES)); + addEntry(WT_SOCKS, new WearableEntry(WT_SOCKS,"edit_socks_title","socks_desc_text",1, SUBPART_SOCKS)); + addEntry(WT_JACKET, new WearableEntry(WT_JACKET,"edit_jacket_title","jacket_desc_text",1, SUBPART_JACKET)); + addEntry(WT_GLOVES, new WearableEntry(WT_GLOVES,"edit_gloves_title","gloves_desc_text",1, SUBPART_GLOVES)); + addEntry(WT_UNDERSHIRT, new WearableEntry(WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1, SUBPART_UNDERSHIRT)); + addEntry(WT_UNDERPANTS, new WearableEntry(WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1, SUBPART_UNDERPANTS)); + addEntry(WT_SKIRT, new WearableEntry(WT_SKIRT,"edit_skirt_title","skirt_desc_text",1, SUBPART_SKIRT)); + addEntry(WT_ALPHA, new WearableEntry(WT_ALPHA,"edit_alpha_title","alpha_desc_text",1, SUBPART_ALPHA)); + addEntry(WT_TATTOO, new WearableEntry(WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1, SUBPART_TATTOO)); +} + +LLEditWearableDictionary::WearableEntry::WearableEntry(EWearableType type, const std::string &title, const std::string &desc_title, - U8 num_color_swatches, - U8 num_texture_pickers, U8 num_subparts, ... ) : LLDictionaryEntry(title), mWearableType(type), @@ -249,18 +201,6 @@ LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType typ va_list argp; va_start(argp, num_subparts); - for (U8 i = 0; i < num_color_swatches; ++i) - { - ETextureIndex index = (ETextureIndex)va_arg(argp,int); - mColorSwatchCtrls.push_back(index); - } - - for (U8 i = 0; i < num_texture_pickers; ++i) - { - ETextureIndex index = (ETextureIndex)va_arg(argp,int); - mTextureCtrls.push_back(index); - } - for (U8 i = 0; i < num_subparts; ++i) { ESubpart part = (ESubpart)va_arg(argp,int); @@ -325,295 +265,6 @@ LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part, { } -LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls() -{ - addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Color/Tint" )); - addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Color/Tint" )); - addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Color/Tint" )); - addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Color/Tint" )); - addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Color/Tint" )); - addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Color/Tint" )); - addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Color/Tint" )); - addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" )); - addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" )); - addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" )); -} - -LLEditWearableDictionary::TextureCtrls::TextureCtrls() -{ - addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head Tattoos", LLUUID::null, TRUE )); - addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Tattoos", LLUUID::null, TRUE )); - addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Tattoos", LLUUID::null, TRUE )); - addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE )); - addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultPantsUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShoesUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSocksUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Upper Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_JACKET, new PickerControlEntry (TEX_LOWER_JACKET, "Lower Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE )); - addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSkirtUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultGlovesUUID" ) ), FALSE )); - addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE )); - addEntry ( TEX_LOWER_ALPHA, new PickerControlEntry (TEX_LOWER_ALPHA, "Lower Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_UPPER_ALPHA, new PickerControlEntry (TEX_UPPER_ALPHA, "Upper Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_HEAD_ALPHA, new PickerControlEntry (TEX_HEAD_ALPHA, "Head Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_EYES_ALPHA, new PickerControlEntry (TEX_EYES_ALPHA, "Eye Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_HAIR_ALPHA, new PickerControlEntry (TEX_HAIR_ALPHA, "Hair Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE )); - addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE )); - addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE )); - addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE )); -} - -LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex tex_index, - const std::string name, - const LLUUID default_image_id, - const bool allow_no_texture) : - LLDictionaryEntry(name), - mTextureIndex(tex_index), - mControlName(name), - mDefaultImageId(default_image_id), - mAllowNoTexture(allow_no_texture) -{ -} - -/** - * Class to prevent hack in LLButton's constructor and use paddings declared in xml. - */ -class LLLabledBackButton : public LLButton -{ -public: - struct Params : public LLInitParam::Block<Params, LLButton::Params> - { - Params() {} - }; -protected: - friend class LLUICtrlFactory; - LLLabledBackButton(const Params&); -}; - -static LLDefaultChildRegistry::Register<LLLabledBackButton> labeled_back_btn("labeled_back_button"); - -LLLabledBackButton::LLLabledBackButton(const Params& params) -: LLButton(params) -{ - // override hack in LLButton's constructor to use paddings have been set in xml - setLeftHPad(params.pad_left); - setRightHPad(params.pad_right); -} - -// Helper functions. -static const texture_vec_t null_texture_vec; - -// Specializations of this template function return a vector of texture indexes of particular control type -// (i.e. LLColorSwatchCtrl or LLTextureCtrl) which are contained in given WearableEntry. -template <typename T> -const texture_vec_t& -get_pickers_indexes(const LLEditWearableDictionary::WearableEntry *wearable_entry) { return null_texture_vec; } - -// Specializations of this template function return picker control entry for particular control type. -template <typename T> -const LLEditWearableDictionary::PickerControlEntry* -get_picker_entry (const ETextureIndex index) { return NULL; } - -typedef boost::function<void(LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry*)> function_t; - -typedef struct PickerControlEntryNamePredicate -{ - PickerControlEntryNamePredicate(const std::string name) : mName (name) {}; - bool operator()(const LLEditWearableDictionary::PickerControlEntry* entry) const - { - return (entry && entry->mName == mName); - } -private: - const std::string mName; -} PickerControlEntryNamePredicate; - -// A full specialization of get_pickers_indexes for LLColorSwatchCtrl -template <> -const texture_vec_t& -get_pickers_indexes<LLColorSwatchCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry) -{ - if (!wearable_entry) - { - llwarns << "could not get LLColorSwatchCtrl indexes for null wearable entry." << llendl; - return null_texture_vec; - } - return wearable_entry->mColorSwatchCtrls; -} - -// A full specialization of get_pickers_indexes for LLTextureCtrl -template <> -const texture_vec_t& -get_pickers_indexes<LLTextureCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry) -{ - if (!wearable_entry) - { - llwarns << "could not get LLTextureCtrl indexes for null wearable entry." << llendl; - return null_texture_vec; - } - return wearable_entry->mTextureCtrls; -} - -// A full specialization of get_picker_entry for LLColorSwatchCtrl -template <> -const LLEditWearableDictionary::PickerControlEntry* -get_picker_entry<LLColorSwatchCtrl> (const ETextureIndex index) -{ - return LLEditWearableDictionary::getInstance()->getColorSwatch(index); -} - -// A full specialization of get_picker_entry for LLTextureCtrl -template <> -const LLEditWearableDictionary::PickerControlEntry* -get_picker_entry<LLTextureCtrl> (const ETextureIndex index) -{ - return LLEditWearableDictionary::getInstance()->getTexturePicker(index); -} - -template <typename CtrlType, class Predicate> -const LLEditWearableDictionary::PickerControlEntry* -find_picker_ctrl_entry_if(LLWearableType::EType type, const Predicate pred) -{ - const LLEditWearableDictionary::WearableEntry *wearable_entry - = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) - { - llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; - return NULL; - } - const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); - for (texture_vec_t::const_iterator - iter = indexes.begin(), - iter_end = indexes.end(); - iter != iter_end; ++iter) - { - const ETextureIndex te = *iter; - const LLEditWearableDictionary::PickerControlEntry* entry - = get_picker_entry<CtrlType>(te); - if (!entry) - { - llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; - continue; - } - if (pred(entry)) - { - return entry; - } - } - return NULL; -} - -template <typename CtrlType> -void -for_each_picker_ctrl_entry(LLPanel* panel, LLWearableType::EType type, function_t fun) -{ - if (!panel) - { - llwarns << "the panel wasn't passed for wearable of type: " << type << llendl; - return; - } - const LLEditWearableDictionary::WearableEntry *wearable_entry - = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) - { - llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; - return; - } - const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry); - for (texture_vec_t::const_iterator - iter = indexes.begin(), - iter_end = indexes.end(); - iter != iter_end; ++iter) - { - const ETextureIndex te = *iter; - const LLEditWearableDictionary::PickerControlEntry* entry - = get_picker_entry<CtrlType>(te); - if (!entry) - { - llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl; - continue; - } - fun (panel, entry); - } -} - -// The helper functions for pickers management -static void init_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) -{ - LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); - if (color_swatch_ctrl) - { - // Can't get the color from the wearable here, since the wearable may not be set when this is called. - color_swatch_ctrl->setOriginal(LLColor4::white); - } -} - -static void init_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) -{ - LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); - if (texture_ctrl) - { - texture_ctrl->setDefaultImageAssetID(entry->mDefaultImageId); - texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture); - // Don't allow (no copy) or (notransfer) textures to be selected. - texture_ctrl->setImmediateFilterPermMask(PERM_NONE); - texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE); - } -} - -static void update_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) -{ - LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); - if (color_swatch_ctrl) - { - color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex)); - } -} - -static void update_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) -{ - LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); - if (texture_ctrl) - { - LLUUID new_id; - LLLocalTextureObject *lto = self->getWearable()->getLocalTextureObject(entry->mTextureIndex); - if( lto && (lto->getID() != IMG_DEFAULT_AVATAR) ) - { - new_id = lto->getID(); - } - else - { - new_id = LLUUID::null; - } - LLUUID old_id = texture_ctrl->getImageAssetID(); - if (old_id != new_id) - { - // texture has changed, close the floater to avoid DEV-22461 - texture_ctrl->closeDependentFloater(); - } - texture_ctrl->setImageAssetID(new_id); - } -} - -static void set_enabled_color_swatch_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) -{ - LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName); - if (color_swatch_ctrl) - { - color_swatch_ctrl->setEnabled(enabled); - } -} - -static void set_enabled_texture_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry) -{ - LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName); - if (texture_ctrl) - { - texture_ctrl->setEnabled(enabled); - } -} // LLPanelEditWearable @@ -622,8 +273,6 @@ LLPanelEditWearable::LLPanelEditWearable() , mWearablePtr(NULL) , mWearableItem(NULL) { - mCommitCallbackRegistrar.add("ColorSwatch.Commit", boost::bind(&LLPanelEditWearable::onColorSwatchCommit, this, _1)); - mCommitCallbackRegistrar.add("TexturePicker.Commit", boost::bind(&LLPanelEditWearable::onTexturePickerCommit, this, _1)); } //virtual @@ -632,65 +281,6 @@ LLPanelEditWearable::~LLPanelEditWearable() } -bool LLPanelEditWearable::changeHeightUnits(const LLSD& new_value) -{ - updateMetricLayout( new_value.asBoolean() ); - updateTypeSpecificControls(LLWearableType::WT_SHAPE); - return true; -} - -void LLPanelEditWearable::updateMetricLayout(BOOL new_value) -{ - LLUIString current_metric, replacment_metric; - current_metric = new_value ? mMeters : mFeet; - replacment_metric = new_value ? mFeet : mMeters; - mHeigthValue.setArg( "[METRIC1]", current_metric.getString() ); - mReplacementMetricUrl.setArg( "[URL_METRIC2]", std::string("[secondlife:///app/metricsystem ") + replacment_metric.getString() + std::string("]")); -} - -void LLPanelEditWearable::updateAvatarHeightLabel() -{ - mTxtAvatarHeight->setText(LLStringUtil::null); - LLStyle::Params param; - param.color = mAvatarHeigthLabelColor; - mTxtAvatarHeight->appendText(mHeigth, false, param); - param.color = mAvatarHeigthValueLabelColor; - mTxtAvatarHeight->appendText(mHeigthValue, false, param); - param.color = mAvatarHeigthLabelColor; // using mAvatarHeigthLabelColor for '/' separator - mTxtAvatarHeight->appendText(" / ", false, param); - mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param); -} - -void LLPanelEditWearable::onWearablePanelVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl) -{ - if (in_visible_chain.asBoolean() && accordion_ctrl != NULL) - { - accordion_ctrl->expandDefaultTab(); - } -} - -void LLPanelEditWearable::setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel) -{ - if (bodypart_panel != NULL) - { - LLAccordionCtrl* accordion_ctrl = bodypart_panel->getChild<LLAccordionCtrl>("wearable_accordion"); - - if (accordion_ctrl != NULL) - { - bodypart_panel->setVisibleCallback( - boost::bind(&LLPanelEditWearable::onWearablePanelVisibilityChange, this, _2, accordion_ctrl)); - } - else - { - llwarns << "accordion_ctrl is NULL" << llendl; - } - } - else - { - llwarns << "bodypart_panel is NULL" << llendl; - } -} - // virtual BOOL LLPanelEditWearable::postBuild() { @@ -699,19 +289,14 @@ BOOL LLPanelEditWearable::postBuild() mBtnRevert->setClickedCallback(boost::bind(&LLPanelEditWearable::onRevertButtonClicked, this)); mBtnBack = getChild<LLButton>("back_btn"); - mBackBtnLabel = mBtnBack->getLabelUnselected(); - mBtnBack->setLabel(LLStringUtil::null); // handled at appearance panel level? //mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this)); - mNameEditor = getChild<LLLineEditor>("description"); + mTextEditor = getChild<LLTextEditor>("description"); mPanelTitle = getChild<LLTextBox>("edit_wearable_title"); mDescTitle = getChild<LLTextBox>("description_text"); - getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this)); - getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this)); - // The following panels will be shown/hidden based on what wearable we're editing // body parts mPanelShape = getChild<LLPanel>("edit_shape_panel"); @@ -719,14 +304,6 @@ BOOL LLPanelEditWearable::postBuild() mPanelEyes = getChild<LLPanel>("edit_eyes_panel"); mPanelHair = getChild<LLPanel>("edit_hair_panel"); - // Setting the visibility callback is applied only to the bodyparts panel - // because currently they are the only ones whose 'wearable_accordion' has - // multiple accordion tabs (see EXT-8164 for details). - setWearablePanelVisibilityChangeCallback(mPanelShape); - setWearablePanelVisibilityChangeCallback(mPanelSkin); - setWearablePanelVisibilityChangeCallback(mPanelEyes); - setWearablePanelVisibilityChangeCallback(mPanelHair); - //clothes mPanelShirt = getChild<LLPanel>("edit_shirt_panel"); mPanelPants = getChild<LLPanel>("edit_pants_panel"); @@ -740,73 +317,8 @@ BOOL LLPanelEditWearable::postBuild() mPanelAlpha = getChild<LLPanel>("edit_alpha_panel"); mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel"); - mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height"); - mWearablePtr = NULL; - configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible"); - configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible"); - - // configure tab expanded callbacks - for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index) - { - LLWearableType::EType type = (LLWearableType::EType) type_index; - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) - { - llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; - continue; - } - U8 num_subparts = wearable_entry->mSubparts.size(); - - for (U8 index = 0; index < num_subparts; ++index) - { - // dive into data structures to get the panel we need - ESubpart subpart_e = wearable_entry->mSubparts[index]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - - if (!subpart_entry) - { - llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; - continue; - } - - const std::string accordion_tab = subpart_entry->mAccordionTab; - - LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); - - if (!tab) - { - llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; - continue; - } - - // initialize callback to ensure camera view changes appropriately. - tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index)); - } - - // initialize texture and color picker controls - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2)); - } - - // init all strings - mMeters = mPanelShape->getString("meters"); - mFeet = mPanelShape->getString("feet"); - mHeigth = mPanelShape->getString("height") + " "; - mHeigthValue = "[HEIGHT] [METRIC1]"; - mReplacementMetricUrl = "[URL_METRIC2]"; - - std::string color = mPanelShape->getString("heigth_label_color"); - mAvatarHeigthLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); - color = mPanelShape->getString("heigth_value_label_color"); - mAvatarHeigthValueLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green); - gSavedSettings.getControl("HeightUnits")->getSignal()->connect(boost::bind(&LLPanelEditWearable::changeHeightUnits, this, _2)); - updateMetricLayout(gSavedSettings.getBOOL("HeightUnits")); - return TRUE; } @@ -818,7 +330,7 @@ BOOL LLPanelEditWearable::isDirty() const if (mWearablePtr) { if (mWearablePtr->isDirty() || - mWearableItem->getName().compare(mNameEditor->getText()) != 0) + mWearablePtr->getName().compare(mTextEditor->getText()) != 0) { isDirty = TRUE; } @@ -829,11 +341,6 @@ BOOL LLPanelEditWearable::isDirty() const void LLPanelEditWearable::draw() { updateVerbs(); - if (getWearable() && getWearable()->getType() == LLWearableType::WT_SHAPE) - { - //updating avatar height - updateTypeSpecificControls(LLWearableType::WT_SHAPE); - } LLPanel::draw(); } @@ -843,8 +350,9 @@ void LLPanelEditWearable::setWearable(LLWearable *wearable) showWearable(mWearablePtr, FALSE); mWearablePtr = wearable; showWearable(mWearablePtr, TRUE); -} + initializePanel(); +} //static void LLPanelEditWearable::onRevertButtonClicked(void* userdata) @@ -853,157 +361,8 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata) panel->revertChanges(); } -void LLPanelEditWearable::onSaveAsButtonClicked() -{ - LLSD args; - args["DESC"] = mNameEditor->getText(); - - LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2)); -} -void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (0 == option) - { - std::string wearable_name = response["message"].asString(); - LLStringUtil::trim(wearable_name); - if( !wearable_name.empty() ) - { - mNameEditor->setText(wearable_name); - saveChanges(true); - } - } -} - -void LLPanelEditWearable::onCommitSexChange() -{ - if (!isAgentAvatarValid()) return; - - LLWearableType::EType type = mWearablePtr->getType(); - U32 index = gAgentWearables.getWearableIndex(mWearablePtr); - - if( !gAgentWearables.isWearableModifiable(type, index)) - { - return; - } - - LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" )); - if( !param ) - { - return; - } - - bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE; - LLWearable* wearable = gAgentWearables.getWearable(type, index); - if (wearable) - { - wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE); - } - param->setWeight( is_new_sex_male, FALSE ); - - gAgentAvatarp->updateSexDependentLayerSets( FALSE ); - - gAgentAvatarp->updateVisualParams(); - - updateScrollingPanelUI(); -} - -void LLPanelEditWearable::onTexturePickerCommit(const LLUICtrl* ctrl) -{ - const LLTextureCtrl* texture_ctrl = dynamic_cast<const LLTextureCtrl*>(ctrl); - if (!texture_ctrl) - { - llwarns << "got commit signal from not LLTextureCtrl." << llendl; - return; - } - - if (getWearable()) - { - LLWearableType::EType type = getWearable()->getType(); - const PickerControlEntryNamePredicate name_pred(texture_ctrl->getName()); - const LLEditWearableDictionary::PickerControlEntry* entry - = find_picker_ctrl_entry_if<LLTextureCtrl, PickerControlEntryNamePredicate>(type, name_pred); - if (entry) - { - // Set the new version - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_ctrl->getImageAssetID()); - if( image->getID() == IMG_DEFAULT ) - { - image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); - } - if (getWearable()) - { - U32 index = gAgentWearables.getWearableIndex(getWearable()); - gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index); - LLVisualParamHint::requestHintUpdates(); - gAgentAvatarp->wearableUpdated(type, FALSE); - } - } - else - { - llwarns << "could not get texture picker dictionary entry for wearable of type: " << type << llendl; - } - } -} - -void LLPanelEditWearable::onColorSwatchCommit(const LLUICtrl* ctrl) -{ - if (getWearable()) - { - LLWearableType::EType type = getWearable()->getType(); - const PickerControlEntryNamePredicate name_pred(ctrl->getName()); - const LLEditWearableDictionary::PickerControlEntry* entry - = find_picker_ctrl_entry_if<LLColorSwatchCtrl, PickerControlEntryNamePredicate>(type, name_pred); - if (entry) - { - const LLColor4& old_color = getWearable()->getClothesColor(entry->mTextureIndex); - const LLColor4& new_color = LLColor4(ctrl->getValue()); - if( old_color != new_color ) - { - getWearable()->setClothesColor(entry->mTextureIndex, new_color, TRUE); - LLVisualParamHint::requestHintUpdates(); - gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); - } - } - else - { - llwarns << "could not get color swatch dictionary entry for wearable of type: " << type << llendl; - } - } -} - -void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type) -{ - LLPanel* panel = getPanel(type); - if (!panel) - return; - - bool is_modifiable = false; - bool is_copyable = false; - - if(mWearableItem) - { - const LLPermissions& perm = mWearableItem->getPermissions(); - is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID()); - is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()); - } - - if (is_modifiable) - { - // Update picker controls - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(update_color_swatch_ctrl, this, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(update_texture_ctrl, this, _1, _2)); - } - else - { - // Disable controls - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(set_enabled_color_swatch_ctrl, false, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(set_enabled_texture_ctrl, false, _1, _2)); - } -} - -void LLPanelEditWearable::saveChanges(bool force_save_as) +void LLPanelEditWearable::saveChanges() { if (!mWearablePtr || !isDirty()) { @@ -1012,18 +371,15 @@ void LLPanelEditWearable::saveChanges(bool force_save_as) } U32 index = gAgentWearables.getWearableIndex(mWearablePtr); - - std::string new_name = mNameEditor->getText(); - if (force_save_as) + + if (mWearablePtr->getName().compare(mTextEditor->getText()) != 0) { // the name of the wearable has changed, re-save wearable with new name - LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false); - gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE); - mNameEditor->setText(mWearableItem->getName()); + gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mTextEditor->getText(), FALSE); } else { - gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name); + gAgentWearables.saveWearable(mWearablePtr->getType(), index); } } @@ -1036,10 +392,7 @@ void LLPanelEditWearable::revertChanges() } mWearablePtr->revertValues(); - mNameEditor->setText(mWearableItem->getName()); - updatePanelPickerControls(mWearablePtr->getType()); - updateTypeSpecificControls(mWearablePtr->getType()); - gAgentAvatarp->wearableUpdated(mWearablePtr->getType(), FALSE); + mTextEditor->setText(mWearablePtr->getName()); } void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) @@ -1052,195 +405,95 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show) mWearableItem = gInventory.getItem(mWearablePtr->getItemID()); llassert(mWearableItem); - LLWearableType::EType type = wearable->getType(); + EWearableType type = wearable->getType(); LLPanel *targetPanel = NULL; std::string title; std::string description_title; - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); - if (!wearable_entry) + const LLEditWearableDictionary::WearableEntry *entry = LLEditWearableDictionary::getInstance()->getWearable(type); + if (!entry) { llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl; return; } targetPanel = getPanel(type); - title = getString(wearable_entry->mTitle); - description_title = getString(wearable_entry->mDescTitle); - - // Update picker controls state - for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2)); - for_each_picker_ctrl_entry <LLTextureCtrl> (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2)); + title = getString(entry->mTitle); + description_title = getString(entry->mDescTitle); targetPanel->setVisible(show); - toggleTypeSpecificControls(type); - if (show) { mPanelTitle->setText(title); - mPanelTitle->setToolTip(title); mDescTitle->setText(description_title); - - // set name - mNameEditor->setText(mWearableItem->getName()); - - updatePanelPickerControls(type); - updateTypeSpecificControls(type); - - // clear and rebuild visual param list - U8 num_subparts = wearable_entry->mSubparts.size(); - - for (U8 index = 0; index < num_subparts; ++index) - { - // dive into data structures to get the panel we need - ESubpart subpart_e = wearable_entry->mSubparts[index]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - - if (!subpart_entry) - { - llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; - continue; - } - - const std::string scrolling_panel = subpart_entry->mParamList; - const std::string accordion_tab = subpart_entry->mAccordionTab; - - LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); - LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); - - if (!panel_list) - { - llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; - continue; - } - - if (!tab) - { - llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; - continue; - } - - // what edit group do we want to extract params for? - const std::string edit_group = subpart_entry->mEditGroup; - - // storage for ordered list of visual params - value_map_t sorted_params; - getSortedParams(sorted_params, edit_group); - - LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ); - if (!jointp) - { - jointp = gAgentAvatarp->getJoint("mHead"); - } - - buildParamList(panel_list, sorted_params, tab, jointp); - - updateScrollingPanelUI(); - } - showDefaultSubpart(); - - updateVerbs(); } -} -void LLPanelEditWearable::showDefaultSubpart() -{ - changeCamera(0); } -void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index) +void LLPanelEditWearable::initializePanel() { - bool expanded = param.asBoolean(); - - if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar()) + if (!mWearablePtr) { - // we don't have a valid wearable we're editing, or we've left the wearable editor + // cannot initialize with a null reference. return; } - if (expanded) - { - changeCamera(index); - } + EWearableType type = mWearablePtr->getType(); -} + // set name + mTextEditor->setText(mWearablePtr->getName()); -void LLPanelEditWearable::changeCamera(U8 subpart) -{ - const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType()); + // clear and rebuild visual param list + const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); if (!wearable_entry) { - llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl; + llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl; return; } + U8 num_subparts = wearable_entry->mSubparts.size(); - if (subpart >= wearable_entry->mSubparts.size()) + for (U8 index = 0; index < num_subparts; ++index) { - llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl; - return; - } - - ESubpart subpart_e = wearable_entry->mSubparts[subpart]; - const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); + // dive into data structures to get the panel we need + ESubpart subpart_e = wearable_entry->mSubparts[index]; + const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e); - if (!subpart_entry) - { - llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; - return; - } + if (!subpart_entry) + { + llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl; + continue; + } - // Update the camera - gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) ); - gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset ); - gMorphView->setCameraOffset( subpart_entry->mCameraOffset ); - if (gSavedSettings.getBOOL("AppearanceCameraMovement")) - { - gMorphView->updateCamera(); - } -} + const std::string scrolling_panel = subpart_entry->mParamList; + const std::string accordion_tab = subpart_entry->mAccordionTab; -void LLPanelEditWearable::updateScrollingPanelList() -{ - updateScrollingPanelUI(); -} + LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel); + LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab); -void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type) -{ - // Toggle controls specific to shape editing panel. - { - bool is_shape = (type == LLWearableType::WT_SHAPE); - childSetVisible("sex_radio", is_shape); - childSetVisible("female_icon", is_shape); - childSetVisible("male_icon", is_shape); - } -} + if (!panel_list) + { + llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; + continue; + } -void LLPanelEditWearable::updateTypeSpecificControls(LLWearableType::EType type) -{ - const F32 ONE_METER = 1.0; - const F32 ONE_FOOT = 0.3048 * ONE_METER; // in meters - // Update controls specific to shape editing panel. - if (type == LLWearableType::WT_SHAPE) - { - // Update avatar height - F32 new_size = gAgentAvatarp->mBodySize.mV[VZ]; - if (gSavedSettings.getBOOL("HeightUnits") == FALSE) + if (!tab) { - // convert meters to feet - new_size = new_size / ONE_FOOT; + llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; + continue; } - std::string avatar_height_str = llformat("%.2f", new_size); - mHeigthValue.setArg("[HEIGHT]", avatar_height_str); - updateAvatarHeightLabel(); - } + // what edit group do we want to extract params for? + const std::string edit_group = subpart_entry->mEditGroup; - if (LLWearableType::WT_ALPHA == type) - { - updateAlphaCheckboxes(); + // storage for ordered list of visual params + value_map_t sorted_params; + getSortedParams(sorted_params, edit_group); + + buildParamList(panel_list, sorted_params, tab); - initPreviousAlphaTextures(); + updateScrollingPanelUI(); } + updateVerbs(); } void LLPanelEditWearable::updateScrollingPanelUI() @@ -1251,14 +504,12 @@ void LLPanelEditWearable::updateScrollingPanelUI() return; } - LLWearableType::EType type = mWearablePtr->getType(); + EWearableType type = mWearablePtr->getType(); LLPanel *panel = getPanel(type); if(panel && (mWearablePtr->getItemID().notNull())) { const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); - llassert(wearable_entry); - if (!wearable_entry) return; U8 num_subparts = wearable_entry->mSubparts.size(); LLScrollingPanelParam::sUpdateDelayFrames = 0; @@ -1283,67 +534,67 @@ void LLPanelEditWearable::updateScrollingPanelUI() } } -LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type) +LLPanel* LLPanelEditWearable::getPanel(EWearableType type) { switch (type) { - case LLWearableType::WT_SHAPE: + case WT_SHAPE: return mPanelShape; break; - case LLWearableType::WT_SKIN: + case WT_SKIN: return mPanelSkin; break; - case LLWearableType::WT_HAIR: + case WT_HAIR: return mPanelHair; break; - case LLWearableType::WT_EYES: + case WT_EYES: return mPanelEyes; break; - case LLWearableType::WT_SHIRT: + case WT_SHIRT: return mPanelShirt; break; - case LLWearableType::WT_PANTS: + case WT_PANTS: return mPanelPants; break; - case LLWearableType::WT_SHOES: + case WT_SHOES: return mPanelShoes; break; - case LLWearableType::WT_SOCKS: + case WT_SOCKS: return mPanelSocks; break; - case LLWearableType::WT_JACKET: + case WT_JACKET: return mPanelJacket; break; - case LLWearableType::WT_GLOVES: + case WT_GLOVES: return mPanelGloves; break; - case LLWearableType::WT_UNDERSHIRT: + case WT_UNDERSHIRT: return mPanelUndershirt; break; - case LLWearableType::WT_UNDERPANTS: + case WT_UNDERPANTS: return mPanelUnderpants; break; - case LLWearableType::WT_SKIRT: + case WT_SKIRT: return mPanelSkirt; break; - case LLWearableType::WT_ALPHA: + case WT_ALPHA: return mPanelAlpha; break; - case LLWearableType::WT_TATTOO: + case WT_TATTOO: return mPanelTattoo; break; default: @@ -1365,8 +616,8 @@ void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std: { LLViewerVisualParam *param = (LLViewerVisualParam*) *iter; - if (param->getID() == -1 - || !param->isTweakable() + if (param->getID() == -1 + || param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE || param->getEditGroup() != edit_group || !(param->getSex() & avatar_sex)) { @@ -1379,7 +630,7 @@ void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std: } } -void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp) +void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab) { // sorted_params is sorted according to magnitude of effect from // least to greatest. Adding to the front of the child list @@ -1393,7 +644,7 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value { LLPanel::Params p; p.name("LLScrollingPanelParam"); - LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp); + LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable()); height = panel_list->addPanel( panel_param ); } } @@ -1412,132 +663,6 @@ void LLPanelEditWearable::updateVerbs() mBtnRevert->setEnabled(is_dirty); childSetEnabled("save_as_button", is_dirty && can_copy); - - if(isAgentAvatarValid()) - { - // Update viewer's radio buttons (of RadioGroup with control_name="AvatarSex") of Avatar's gender - // with value from "AvatarSex" setting - gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) ); - } - - // update back button and title according to dirty state. - static BOOL was_dirty = FALSE; - if (was_dirty != is_dirty) // to avoid redundant changes because this method is called from draw - { - static S32 label_width = mBtnBack->getFont()->getWidth(mBackBtnLabel); - const std::string& label = is_dirty ? mBackBtnLabel : LLStringUtil::null; - const S32 delta_width = is_dirty ? label_width : -label_width; - - mBtnBack->setLabel(label); - - // update rect according to label width - LLRect rect = mBtnBack->getRect(); - rect.mRight += delta_width; - mBtnBack->setShape(rect); - - // update title rect according to back button width - rect = mPanelTitle->getRect(); - rect.mLeft += delta_width; - mPanelTitle->setShape(rect); - - was_dirty = is_dirty; - } -} - -void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name) -{ - LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name); - checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te)); - - mAlphaCheckbox2Index[name] = te; -} - -void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te) -{ - if (!checkbox_ctrl) return; - if (!getWearable()) return; - - llinfos << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << llendl; - - bool new_invis_state = checkbox_ctrl->get(); - if (new_invis_state) - { - LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); - mPreviousAlphaTexture[te] = lto->getID(); - - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE ); - U32 index = gAgentWearables.getWearableIndex(getWearable()); - gAgentAvatarp->setLocalTexture(te, image, FALSE, index); - gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); - } - else - { - // Try to restore previous texture, if any. - LLUUID prev_id = mPreviousAlphaTexture[te]; - if (prev_id.isNull() || (prev_id == IMG_INVISIBLE)) - { - prev_id = LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ); - } - if (prev_id.isNull()) return; - - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id); - if (!image) return; - - U32 index = gAgentWearables.getWearableIndex(getWearable()); - gAgentAvatarp->setLocalTexture(te, image, FALSE, index); - gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE); - } - - updatePanelPickerControls(getWearable()->getType()); } -void LLPanelEditWearable::updateAlphaCheckboxes() -{ - for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin(); - iter != mAlphaCheckbox2Index.end(); ++iter ) - { - LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second; - LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first); - if (ctrl) - { - ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr)); - } - } -} - -void LLPanelEditWearable::initPreviousAlphaTextures() -{ - initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); - initPreviousAlphaTextureEntry(TEX_UPPER_ALPHA); - initPreviousAlphaTextureEntry(TEX_HEAD_ALPHA); - initPreviousAlphaTextureEntry(TEX_EYES_ALPHA); - initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA); -} - -void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te) -{ - LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te); - if (lto) - { - mPreviousAlphaTexture[te] = lto->getID(); - } -} - -// handle secondlife:///app/metricsystem -class LLMetricSystemHandler : public LLCommandHandler -{ -public: - LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { } - - bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) - { - // change height units TRUE for meters and FALSE for feet - BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE; - gSavedSettings.setBOOL("HeightUnits", new_value); - return true; - } -}; - -LLMetricSystemHandler gMetricSystemHandler; - // EOF |