File: uipopupmenu.h

package info (click to toggle)
openmohaa 0.82.1%2Bdfsg-1
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid
  • size: 34,192 kB
  • sloc: cpp: 315,720; ansic: 275,789; sh: 312; xml: 246; asm: 141; makefile: 7
file content (146 lines) | stat: -rw-r--r-- 4,749 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
135
136
137
138
139
140
141
142
143
144
145
146
/*
===========================================================================
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);