/** * @file llpaneloutfitedit.h * @brief Displays outfit edit information in Side Tray. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * * Copyright (c) 2004-2009, Linden Research, Inc. * * 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 * * 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 * * 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. * * 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$ */ #ifndef LL_LLPANELOUTFITEDIT_H #define LL_LLPANELOUTFITEDIT_H #include "llpanel.h" #include "v3dmath.h" #include "lluuid.h" #include "lliconctrl.h" #include "llremoteparcelrequest.h" #include "llinventory.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "llwearableitemslist.h" class LLButton; class LLCOFWearables; class LLComboBox; class LLTextBox; class LLInventoryCategory; class LLOutfitObserver; class LLCOFDragAndDropObserver; class LLInventoryPanel; class LLSaveFolderState; class LLFolderViewItem; class LLScrollListCtrl; class LLToggleableMenu; class LLFilterEditor; class LLFilteredWearableListManager; class LLMenuGL; class LLFindNonLinksByMask; class LLFindWearablesOfType; class LLSaveOutfitComboBtn; class LLPanelOutfitEdit : public LLPanel { LOG_CLASS(LLPanelOutfitEdit); public: // NOTE: initialize mFolderViewItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor typedef enum e_folder_view_item_type { FVIT_ALL = 0, FVIT_WEARABLE, // clothing or shape FVIT_ATTACHMENT, NUM_FOLDER_VIEW_ITEM_TYPES } EFolderViewItemType; //should reflect order from LLWearableType::EType typedef enum e_list_view_item_type { LVIT_ALL = 0, LVIT_CLOTHING, LVIT_BODYPART, LVIT_ATTACHMENT, LVIT_SHAPE, LVIT_SKIN, LVIT_HAIR, LVIT_EYES, LVIT_SHIRT, LVIT_PANTS, LVIT_SHOES, LVIT_SOCKS, LVIT_JACKET, LVIT_GLOVES, LVIT_UNDERSHIRT, LVIT_UNDERPANTS, LVIT_SKIRT, LVIT_ALPHA, LVIT_TATTOO, NUM_LIST_VIEW_ITEM_TYPES } EListViewItemType; struct LLLookItemType { std::string displayName; U64 inventoryMask; LLLookItemType() : displayName("NONE"), inventoryMask(0) {} LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {} }; struct LLFilterItem { std::string displayName; LLInventoryCollectFunctor* collector; LLFilterItem() : displayName("NONE"), collector(NULL) {} LLFilterItem(std::string name, LLInventoryCollectFunctor* _collector) : displayName(name), collector(_collector) {} ~LLFilterItem() { delete collector; } //the struct is not supposed to by copied, either way the destructor kills collector //LLPointer is not used as it requires LLInventoryCollectFunctor to extend LLRefCount what it doesn't do private: LLFilterItem(const LLFilterItem& filter_item) {}; }; LLPanelOutfitEdit(); /*virtual*/ ~LLPanelOutfitEdit(); /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); void moveWearable(bool closer_to_body); void toggleAddWearablesPanel(); void showAddWearablesPanel(bool show__add_wearables); //following methods operate with "add wearables" panel void showWearablesFilter(); void showWearablesListView(); void showWearablesFolderView(); /** * Method preserves selection while switching between folder/list view modes */ void saveListSelection(); void updateWearablesPanelVerbButtons(); void updateFiltersVisibility(); void onFolderViewFilterCommitted(LLUICtrl* ctrl); void onListViewFilterCommitted(LLUICtrl* ctrl); void onSearchEdit(const std::string& string); void updatePlusButton(); void onPlusBtnClicked(void); void onVisibilityChange(const LLSD &in_visible_chain); void applyFolderViewFilter(EFolderViewItemType type); void applyListViewFilter(EListViewItemType type); /** * Filter items in views of Add Wearables Panel and show appropriate view depending on currently selected COF item(s) * No COF items selected - shows the folder view, reset filter * 1 COF item selected - shows the list view and filters wearables there by a wearable type of the selected item * More than 1 COF item selected - shows the list view and filters it by a type of the selected item (attachment or clothing) */ void filterWearablesBySelectedItem(void); void onRemoveFromOutfitClicked(void); void onEditWearableClicked(void); void onAddWearableClicked(void); void onReplaceBodyPartMenuItemClicked(LLUUID selected_item_id); void onShopButtonClicked(); void displayCurrentOutfit(); void updateCurrentOutfitName(); void update(); void updateVerbs(); /** * @brief Helper function. Shows one panel instead of another. * If panels already switched does nothing and returns false. * @param switch_from_panel panel to hide * @param switch_to_panel panel to show * @retun returns true if switching happened, false if not. */ bool switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel); virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); private: void onGearButtonClick(LLUICtrl* clicked_button); void onAddMoreButtonClicked(); void showFilteredWearablesListView(LLWearableType::EType type); void onOutfitChanging(bool started); void getSelectedItemsUUID(uuid_vec_t& uuid_list); void getCurrentItemUUID(LLUUID& selected_id); void onCOFChanged(); LLWearableType::EType getCOFWearablesSelectionType() const; LLWearableType::EType getAddMorePanelSelectionType() const; LLWearableType::EType getWearableTypeByItemUUID(const LLUUID& item_uuid) const; LLTextBox* mCurrentOutfitName; LLTextBox* mStatus; LLInventoryPanel* mInventoryItemsPanel; LLFilterEditor* mSearchFilter; LLSaveFolderState* mSavedFolderState; std::string mSearchString; LLButton* mEditWearableBtn; LLButton* mFolderViewBtn; LLButton* mListViewBtn; LLButton* mPlusBtn; LLPanel* mAddWearablesPanel; LLComboBox* mFolderViewFilterCmbBox; LLComboBox* mListViewFilterCmbBox; LLFilteredWearableListManager* mWearableListManager; LLWearableItemsList* mWearableItemsList; LLPanel* mWearablesListViewPanel; LLCOFDragAndDropObserver* mCOFDragAndDropObserver; std::vector mFolderViewItemTypes; std::vector mListViewItemTypes; LLCOFWearables* mCOFWearables; LLMenuGL* mGearMenu; LLMenuGL* mAddWearablesGearMenu; bool mInitialized; std::auto_ptr mSaveComboBtn; }; #endif // LL_LLPANELOUTFITEDIT_H