summaryrefslogtreecommitdiff
path: root/public/panorama/controls/dropdown.h
blob: f756bd5c2cddfd449dbe81a12975f2d93996b6a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//=========== Copyright Valve Corporation, All rights reserved. ===============//
//
// Purpose: 
//=============================================================================//

#ifndef PANORAMA_DROPDOWN_H
#define PANORAMA_DROPDOWN_H

#ifdef _WIN32
#pragma once
#endif

#include "panel2d.h"

namespace panorama
{

DECLARE_PANEL_EVENT0( DropDownSelectionChanged );
DECLARE_PANORAMA_EVENT2( DropDownMenuClosed, bool, CPanelPtr< CPanel2D > );

class CDropDownMenu;

//-----------------------------------------------------------------------------
// Purpose: Drop Down Control
//-----------------------------------------------------------------------------
class CDropDown : public CPanel2D
{
	DECLARE_PANEL2D( CDropDown, CPanel2D );

public:
	CDropDown( CPanel2D *parent, const char * pchPanelID );
	virtual ~CDropDown();

	virtual void SetupJavascriptObjectTemplate() OVERRIDE;

	virtual bool BSetProperty( CPanoramaSymbol symName, const char *pchValue ) OVERRIDE;
	virtual void OnLayoutTraverse( float flFinalWidth, float flFinalHeight );
	void AddOption( CPanel2D *pPanel );
	bool HasOption( const char *pchID );
	void RemoveOption( const char *pchID );
	void RemoveAllOptions();

	void FindOptionIDsByClass( const char *pchClassName, CUtlVector< CUtlString > &vecIDsOut );
	void SortOptions( int( __cdecl *pfnCompare )(const ClientPanelPtr_t *, const ClientPanelPtr_t *) );

	CPanel2D *GetSelected() { return m_pSelected.Get(); }
	void SetSelected( const char *pchID, bool bNotify );
	void SetSelected( const char *pchID ) { return SetSelected( pchID, true ); }
	void SetDefault( const char *pchID ) { m_strDefaultSelection.Set( pchID ); }
	void ResetToDefault( bool bNotify );

	CPanel2D *AccessDropDownMenu() { return (CPanel2D*)m_pMenu.Get(); }

	virtual bool OnMouseButtonDown( const MouseData_t &mouseData );
	virtual bool OnClick( IUIPanel *pPanel, const MouseData_t &code );
	virtual void OnResetToDefaultValue();
	
	// Call if you know you've changed the contents of one of the option panels
	void InvalidateOptions( bool bForceReload );

	CPanel2D *FindDropDownMenuChild( const char *pchID );
	virtual bool BIsClientPanelEvent( CPanoramaSymbol symProperty ) OVERRIDE;

#ifdef DBGFLAG_VALIDATE
	virtual void ValidateClientPanel( CValidator &validator, const tchar *pchName ) OVERRIDE;
#endif

protected:
	bool EventPanelActivated( const CPanelPtr< IUIPanel > &pPanel, EPanelEventSource_t eSource );
	bool EventDropDownMenuClosed( bool bSelectionChanged, CPanelPtr< CPanel2D > pPanel );
	bool EventResetToDefault( const panorama::CPanelPtr< panorama::IUIPanel > &pPanel );

	virtual void OnInitializedFromLayout();
	void ShowMenu();
	void UpdateSelectedChild( bool bSuppressChangedEvent, bool bInvalidateAlways = false );

	virtual void OnStylesChanged() OVERRIDE;

	CPanelPtr< CDropDownMenu > GetMenu() { return m_pMenu; }

private:
	CPanelPtr< CDropDownMenu >m_pMenu;
	CPanelPtr<CPanel2D> m_pSelected;
	bool m_bSuppressClick;

	CUtlString m_strInitialSelection;
	CUtlString m_strDefaultSelection;
};


//-----------------------------------------------------------------------------
// Purpose: Drop Down Menu (shown when activated)
//-----------------------------------------------------------------------------
class CDropDownMenu : public CPanel2D
{
	DECLARE_PANEL2D( CDropDownMenu, CPanel2D );

public:
	CDropDownMenu( CDropDown *pDropDown, const char * pchPanelID );
	virtual ~CDropDownMenu();

	void Show();
	void Close() { Hide( false ); }

	CPanel2D *GetSelectedChild();
	void SetSelected( const char *pchID );
	void AddOption( CPanel2D *pPanel );
	bool HasOption( const char *pchID );
	void RemoveOption( const char *pchID );
	void RemoveAll();

	virtual void OnLayoutTraverse( float flFinalWidth, float flFinalHeight );
	virtual void OnResetToDefaultValue();
	virtual IUIPanel *GetLocalizationParent() const { return m_pDropDown->UIPanel(); }

#ifdef DBGFLAG_VALIDATE
	virtual void ValidateClientPanel( CValidator &validator, const tchar *pchName ) OVERRIDE;
#endif

protected:
	bool EventPanelActivated( const CPanelPtr< IUIPanel > &ptrPanel, EPanelEventSource_t eSource );
	bool EventCancelled( const CPanelPtr< IUIPanel > &pPanel, EPanelEventSource_t eSource );
	bool EventInputFocusTopLevelChanged( CPanelPtr< CPanel2D > ptrPanel );
	bool EventResetToDefault( const panorama::CPanelPtr< panorama::IUIPanel > &pPanel );
	bool EventInputFocusSet( const panorama::CPanelPtr< IUIPanel > &ptrPanel );

private:
	void Hide( bool bSelectionChanged );

	CDropDown *m_pDropDown;
	CPanel2D *m_pSelectedChild;
};


} // namespace panorama

#endif // PANORAMA_DROPDOWN_H