File: uipopupmenu.h

package info (click to toggle)
openmohaa 0.81.1%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: trixie
  • size: 29,124 kB
  • sloc: ansic: 270,865; cpp: 250,173; sh: 234; asm: 141; xml: 64; makefile: 7
file content (134 lines) | stat: -rw-r--r-- 4,028 bytes parent folder | download
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
/*
===========================================================================
Copyright (C) 2024 the OpenMoHAA team

This file is part of OpenMoHAA source code.

OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

OpenMoHAA source code 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 General Public License for more details.

You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/

#pragma once

typedef enum { UIP_NONE, UIP_EVENT, UIP_EVENT_STRING, UIP_SUBMENU, UIP_CMD, UIP_CVAR, UIP_SEPARATOR } uipopup_type;
typedef enum { UIP_WHERE_RIGHT, UIP_WHERE_DOWN } uipopup_where;

class uipopup_describe {
public:
	str title;
	UIReggedMaterial *material;
	uipopup_type type;
	void *data;

	uipopup_describe();
	uipopup_describe( str title, uipopup_type type, void *data, UIReggedMaterial *material );
	~uipopup_describe();
};

inline
uipopup_describe::uipopup_describe()
{
	title = "";
	material = NULL;
	type = UIP_NONE;
	data = NULL;
}

inline
uipopup_describe::uipopup_describe
	(
	str title,
	uipopup_type type,
	void *data,
	UIReggedMaterial *material
	)

{
	this->title = title;
	this->type = type;
	this->data = data;
	this->material = material;
}

// NOTE: this is not part of the original game!
// Added in OPM to properly clean up memory.
inline
uipopup_describe::~uipopup_describe()
{
    if (this->data == NULL) {
        // nothing to clean up
        return;
    }

    // only clean up these types of uipds, because:
    //  - UIP_EVENT types point to static Event instances,
    //  - UIP_EVENT_STRING types point to already freed Event instances
    if (this->type == UIP_CMD || this->type == UIP_CVAR) {
        // clean up strdup'd C-string from memory
        free(this->data);
        this->data = NULL;
    }
}

class UIPopupMenu : public UIWidget {
	friend class UIPulldownMenu; // so that m_submenuptr, m_submenu and m_parentMenu can be accessed
protected:
	Container<uipopup_describe *> *m_describe;
	int m_selected;
	Listener *m_listener;
	class UIPopupMenu *m_parentMenu;
	class UIPopupMenu *m_submenuptr;
	int m_submenu;
	UIFont m_marlett;
	bool m_autodismiss;
	UColor m_highlightFGColor;
	UColor m_highlightBGColor;

public:
	CLASS_PROTOTYPE( UIPopupMenu );

protected:
	uipopup_describe	*getDescribeFromPoint( const UIPoint2D& p );
	void				MakeSubMenu( void );
	virtual float		getDescribeHeight( uipopup_describe *d );
	virtual float		getDescribeWidth( uipopup_describe *d );
	bool				MouseInSubmenus( void );

public:
	UIPopupMenu();
	~UIPopupMenu();

	void				Create( Container<uipopup_describe*> *describe, Listener *listener, const UIPoint2D& where );
	void				Create( Container<uipopup_describe*> *describe, Listener *listener, const UIRect2D& createRect, uipopup_where where, qboolean bVirtualSize, float width );
	void				YouAreASubmenu( UIPopupMenu *me );
	void				Draw( void ) override;
	void				MouseReleased( Event *ev );
	void				MouseMoved( Event *ev );
	void				MouseExited( Event *ev );
	void				Dismiss( void );
	void				DismissEvent( Event *ev );
	void				setAutoDismiss( bool b );
	void				setNextSelection( void );
	void				setPrevSelection( void );
	uipopup_describe	*getSelectedDescribe( void );
	void				setSelection( int sel );
	void				setHighlightFGColor( UColor c );
	void				setHighlightBGColor( UColor c );
	void				setPopupHighlightBGColor( str menu, UColor c );
	void				setPopupHighlightFGColor( str menu, UColor c );
	void				getPulldown( str title );
};

uipopup_type UI_PopupTypeStringToInt(str type);