//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: An arbitrary picker // //============================================================================= #ifndef PICKER_H #define PICKER_H #ifdef _WIN32 #pragma once #endif #include "vgui_controls/EditablePanel.h" #include "vgui_controls/Frame.h" #include "tier1/utlstring.h" //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- namespace vgui { class Panel; } //----------------------------------------------------------------------------- // List of strings to appear in the picker //----------------------------------------------------------------------------- enum PickerChoiceType_t { PICKER_CHOICE_STRING = 0, PICKER_CHOICE_PTR, }; struct PickerInfo_t { const char *m_pChoiceString; // This is what displays in the dialog union { const char *m_pChoiceValue; void *m_pChoiceValuePtr; }; }; struct PickerList_t { PickerList_t() : m_Type( PICKER_CHOICE_STRING ) {} PickerList_t( int nGrowSize, int nInitSize ) : m_Choices( nGrowSize, nInitSize ), m_Type( PICKER_CHOICE_STRING ) {} int Count() const { return m_Choices.Count(); } PickerInfo_t& operator[]( int i ) { return m_Choices[i]; } const PickerInfo_t& operator[]( int i ) const { return m_Choices[i]; } int AddToTail() { return m_Choices.AddToTail(); } void RemoveAll() { return m_Choices.RemoveAll(); } PickerChoiceType_t m_Type; CUtlVector< PickerInfo_t > m_Choices; }; //----------------------------------------------------------------------------- // Purpose: Base class for choosing raw assets //----------------------------------------------------------------------------- class CPicker : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CPicker, vgui::EditablePanel ); public: CPicker( vgui::Panel *pParent, const char *pColumnHeader, const char *pTextType ); ~CPicker(); // Sets the list of strings to display void SetStringList( const PickerList_t &list ); // Purpose: virtual void OnKeyCodePressed( vgui::KeyCode code ); // Returns the selected string PickerChoiceType_t GetSelectionType() const; const char *GetSelectedString( ) const; void *GetSelectedPtr( ) const; // Returns the index of the selected string int GetSelectedIndex(); private: void RefreshChoiceList( ); MESSAGE_FUNC( OnTextChanged, "TextChanged" ); vgui::TextEntry *m_pFilterList; vgui::ListPanel *m_pPickerBrowser; CUtlString m_Filter; const char *m_pPickerType; const char *m_pPickerTextType; const char *m_pPickerExt; const char *m_pPickerSubDir; PickerChoiceType_t m_Type; friend class CPickerFrame; }; //----------------------------------------------------------------------------- // Purpose: Modal dialog for picker //----------------------------------------------------------------------------- class CPickerFrame : public vgui::Frame { DECLARE_CLASS_SIMPLE( CPickerFrame, vgui::Frame ); public: CPickerFrame( vgui::Panel *pParent, const char *pTitle, const char *pColumnHeader, const char *pTextType ); ~CPickerFrame(); // Inherited from Frame virtual void OnCommand( const char *pCommand ); // Purpose: Activate the dialog // The message "Picked" will be sent if something is picked. // You can pass in keyvalues to get added to the message also. void DoModal( const PickerList_t &list, KeyValues *pContextKeyValues = NULL ); private: void CleanUpMessage(); CPicker *m_pPicker; vgui::Button *m_pOpenButton; vgui::Button *m_pCancelButton; KeyValues *m_pContextKeyValues; }; #endif // PICKER_H