summaryrefslogtreecommitdiff
path: root/public/panorama/controls/panelptr.h
blob: 79a18388c54e90b76bdebe2fb37558ce3933651b (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//=========== Copyright Valve Corporation, All rights reserved. ===============//
//
// Purpose: 
//=============================================================================//

#ifndef PANELPTR_H
#define PANELPTR_H

#ifdef _WIN32
#pragma once
#endif

#include "panelhandle.h"
#include "../iuiengine.h"
#include "../iuipanelclient.h"
#include "panorama/panoramacxx.h"
#include "generichash.h"

namespace panorama
{

class CPanel2D;

//
// Safe pointer to a panel
//
template < class T >
class CPanelPtr
{
public:
	CPanelPtr() { Clear(); }
	CPanelPtr( const CPanelPtr &rhs ) { *this = rhs; }
	CPanelPtr( const IUIPanel *pPanel ) { Set( pPanel ); }
	CPanelPtr( const IUIPanelClient *pPanel ) { Set( pPanel ? pPanel->UIPanel() : (IUIPanel*)NULL ); }

	CPanelPtr< T > &operator=( const CPanelPtr< T > &ptr ) { m_handle = ptr.m_handle; return *this; }
	T *operator=( T *pPanel ) { Set( pPanel ); return pPanel; }

	void Clear()
	{
		m_handle = PanelHandle_t::InvalidHandle();
	}

	void Set( const IUIPanel *pPanel )
	{
		if( pPanel )
			m_handle = UIEngine()->GetPanelHandle( pPanel );
		else
			Clear();
	}

	void Set( const IUIPanelClient *pPanel )
	{
		if( pPanel )
			m_handle = UIEngine()->GetPanelHandle( pPanel->UIPanel() );
		else
			Clear();
	}

	T * Get() const
	{
		if ( m_handle == PanelHandle_t::InvalidHandle() )
			return NULL;

		// allow us to be called to return NULL pointers early
		if( UIEngine() == NULL )
		{
			return NULL;
		}

		if( panorama_is_base_of< IUIPanel, T >::value )
		{ 
			T* pPanel = (T *)UIEngine()->GetPanelPtr( m_handle );
			if ( pPanel )
			{
				return pPanel;
			}
			else 
			{
				m_handle = PanelHandle_t::InvalidHandle();
				return NULL;
			}
		}
		else
		{
			IUIPanel *pPanel = UIEngine()->GetPanelPtr( m_handle );
			if( pPanel )
				return (T*)(pPanel->ClientPtr());
			else
			{
				m_handle = PanelHandle_t::InvalidHandle();
				return NULL;
			}
		}
	}

	T *operator->() const
	{
		return Get();
	}

	template < class U >
	bool operator==( const CPanelPtr< U > &rhs ) const
	{
		return ( m_handle == rhs.GetPanelHandle() );
	}

	template < class U >
	bool operator!=( const CPanelPtr< U > &rhs ) const
	{
		return !operator==( rhs );
	}
	
	template < class U >
	bool operator<( const CPanelPtr< U > &rhs) const
	{
		return m_handle < rhs.m_handle;
	}

	uint64 GetHandleAsUInt64() const
	{
		uint64 val = 0;
		val = ((uint64)m_handle.m_unSerialNumber)<<32 | m_handle.m_iPanelIndex;
		return val;
	}

	void SetFromUInt64( uint64 ulValue )
	{
		m_handle.m_unSerialNumber = ulValue>>32;
		m_handle.m_iPanelIndex = 0xFFFFFFFF & ulValue;
	}

	const PanelHandle_t &GetPanelHandle() const { return m_handle; }
	bool BPreviouslySet() { return ( m_handle != PanelHandle_t::InvalidHandle() ); }

private:
	mutable PanelHandle_t m_handle;
};

template< class T > 
inline uint32 HashItem( const CPanelPtr<T> &item )
{
#if defined( SOURCE2_PANORAMA )
	return ::HashItem( item );
#else
	return HashItemAsBytes( item );
#endif
}

} // namespace panorama


#endif // PANELPTR_H