aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/menu.h
blob: 1781704996e5d50f23cdb44d70191320b22d481f (plain)
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program 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.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef AGI_MENU_H
#define AGI_MENU_H

namespace Agi {

struct GuiMenuEntry {
	Common::String text;
	int16 textLen;

	int16 row;
	int16 column;

	int16 itemCount;
	int16 firstItemNr;
	int16 selectedItemNr;

	int16 maxItemTextLen;
};
typedef Common::Array<GuiMenuEntry *> GuiMenuArray;

struct GuiMenuItemEntry {
	Common::String text;
	int16 textLen;

	int16 row;
	int16 column;

	bool enabled;
	uint16 controllerSlot;
};
typedef Common::Array<GuiMenuItemEntry *> GuiMenuItemArray;

class GfxMenu {
public:
	GfxMenu(AgiEngine *vm, GfxMgr *gfx, PictureMgr *picture, TextMgr *text);
	~GfxMenu();

	void addMenu(const char *menuText);
	void addMenuItem(const char *menuText, uint16 controlCode);
	void submit();
	void itemEnable(uint16 controllerSlot);
	void itemDisable(uint16 controllerSlot);
	void itemEnableAll();
	void charPress(int16 newChar);

	bool isAvailable();

	void accessAllow();
	void accessDeny();

	void delayedExecute();
	bool delayedExecuteActive();
	void execute();

private:
	void itemEnableDisable(uint16 controllerSlot, bool enabled);

	void drawMenuName(int16 menuNr, bool inverted);
	void drawItemName(int16 itemNr, bool inverted);
	void drawActiveMenu();
	void removeActiveMenu();

	AgiEngine *_vm;
	GfxMgr *_gfx;
	PictureMgr *_picture;
	TextMgr *_text;

	bool _allowed;
	bool _submitted;
	bool _delayedExecute;

	// for initial setup of the menu
	int16 _setupMenuColumn;
	int16 _setupMenuItemColumn;

	GuiMenuArray _array;
	GuiMenuItemArray _itemArray;

	int16 _selectedMenuNr;

	uint16 _selectedMenuHeight;
	uint16 _selectedMenuWidth;
	int16  _selectedMenuRow;
	int16  _selectedMenuColumn;
};

#if 0
#define MENU_BG		0x0f	// White
#define MENU_DISABLED	0x07	// Grey

#define MENU_FG		0x00	// Black
#define MENU_LINE	0x00	// Black

struct AgiMenu;
struct AgiMenuOption;
typedef Common::List<AgiMenu *> MenuList;
typedef Common::List<AgiMenuOption *> MenuOptionList;

class GfxMgr;
class PictureMgr;

class Menu {
private:
	AgiEngine *_vm;
	GfxMgr *_gfx;
	PictureMgr *_picture;
	TextMgr *_text;

public:
	Menu(AgiEngine *vm, GfxMgr *gfx, PictureMgr *picture);
	~Menu();

	void add(const char *s);
	void addItem(const char *s, int code);
	void submit();
	void setItem(int event, int state);
	bool keyhandler(int key);
	void enableAll();

private:
	MenuList _menubar;

	int _hCurMenu;
	int _vCurMenu;

	int _hIndex;
	int _vIndex;
	int _hCol;
	int _hMaxMenu;
	int _vMaxMenu[10];

	AgiMenu* getMenu(int i);
	AgiMenuOption *getMenuOption(int i, int j);
	void drawMenuBar();
	void drawMenuHilite(int curMenu);
	void drawMenuOption(int hMenu);
	void drawMenuOptionHilite(int hMenu, int vMenu);
	void newMenuSelected(int i);
	bool mouseOverText(int line, int col, char *s);

};
#endif

} // End of namespace Agi

#endif /* AGI_MENU_H */