phoenix-firestorm/indra/newview/llpaneloutfitedit.h

261 lines
8.6 KiB
C++

/**
* @file llpaneloutfitedit.h
* @brief Displays outfit edit information in Side Tray.
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, 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.
*
* 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.
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/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 LLMenuButton;
class LLMenuGL;
class LLFindNonLinksByMask;
class LLFindWearablesOfType;
class LLWearableItemTypeNameComparator;
class LLLoadingIndicator;
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,
LVIT_PHYSICS,
LVIT_UNIVERSAL,
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();
void updateFiltersVisibility();
void onFolderViewFilterCommitted(LLUICtrl* ctrl);
void onListViewFilterCommitted(LLUICtrl* ctrl);
void onSearchEdit(const std::string& string);
void updatePlusButton();
void onPlusBtnClicked(void);
void onVisibilityChanged(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 onReplaceMenuItemClicked(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);
void resetAccordionState();
virtual bool handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
// <FS:Ansariel> Show avatar complexity in appearance floater
void updateAvatarComplexity(U32 complexity);
private:
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();
void saveOutfit(bool as_new = false);
/**
* Method preserves selection while switching between folder/list view modes
*/
void saveListSelection();
void updateWearablesPanelVerbButtons();
typedef std::pair<LLWearableType::EType, size_t> selection_info_t;
LLWearableType::EType getCOFWearablesSelectionType() const;
selection_info_t getAddMorePanelSelectionType() const;
LLWearableType::EType getWearableTypeByItemUUID(const LLUUID& item_uuid) const;
LLTextBox* mCurrentOutfitName;
LLTextBox* mStatus;
LLInventoryPanel* mInventoryItemsPanel;
LLFilterEditor* mSearchFilter;
LLSaveFolderState* mSavedFolderState;
std::string mSearchString;
LLButton* mFolderViewBtn;
LLButton* mListViewBtn;
LLButton* mPlusBtn;
LLButton* mShowAddWearablesBtn = nullptr;
LLButton* mFilterBtn = nullptr;
LLPanel* mAddWearablesPanel;
LLPanel* mOutfitNameStatusPanel = nullptr;
LLLoadingIndicator* mLoadingIndicator = nullptr;
LLView* mFilterPanel = nullptr;
LLUICtrl* mNoAddWearablesButtonBar = nullptr;
LLUICtrl* mAddWearablesButtonBar = nullptr;
// <FS:Ansariel> Show avatar complexity in appearance floater
LLTextBox* mAvatarComplexityLabel;
LLTextBox* mAvatarComplexityAddingLabel;
LLComboBox* mFolderViewFilterCmbBox;
LLComboBox* mListViewFilterCmbBox;
LLFilteredWearableListManager* mWearableListManager;
LLWearableItemsList* mWearableItemsList;
LLPanel* mWearablesListViewPanel;
LLWearableItemTypeNameComparator* mWearableListViewItemsComparator;
LLCOFDragAndDropObserver* mCOFDragAndDropObserver;
std::vector<LLLookItemType> mFolderViewItemTypes;
std::vector<LLFilterItem*> mListViewItemTypes;
LLCOFWearables* mCOFWearables;
LLToggleableMenu* mGearMenu;
LLToggleableMenu* mAddWearablesGearMenu;
bool mInitialized;
LLMenuButton* mWearablesGearMenuBtn;
LLMenuButton* mGearMenuBtn;
};
#endif // LL_LLPANELOUTFITEDIT_H