source-engine/public/matsys_controls/picker.h

134 lines
3.6 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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