File: qd_interface_dispatcher.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (341 lines) | stat: -rw-r--r-- 12,327 bytes parent folder | download | duplicates (2)
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
/* 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 3 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, see <http://www.gnu.org/licenses/>.
 *
 */


#ifndef QDENGINE_QDCORE_QD_INTERFACE_DISPATCHER_H
#define QDENGINE_QDCORE_QD_INTERFACE_DISPATCHER_H

#include "common/keyboard.h"

#include "qdengine/qdcore/qd_resource_container.h"
#include "qdengine/qdcore/qd_interface_object_base.h"
#include "qdengine/qdcore/qd_object_list_container.h"


namespace QDEngine {

class qdInterfaceScreen;
class qdInterfaceElementState;

class qdInterfaceDispatcher : public qdInterfaceObjectBase {
public:
	qdInterfaceDispatcher();
	~qdInterfaceDispatcher();

	/// для чего вызван модальный экран
	enum ModalScreenMode {
		MODAL_SCREEN_SAVE_OVERWRITE,
		MODAL_SCREEN_SAVE_NAME_EDIT,
		MODAL_SCREEN_OTHER
	};

	//! Отрисовка интерфейса.
	bool redraw(int dx = 0, int dy = 0) const;
	bool pre_redraw();
	bool post_redraw();

	//! Обсчет логики, параметр - время в секундах.
	bool quant(float dt);

	//! Добавление экрана.
	bool add_screen(qdInterfaceScreen *scr);
	//! Изменение имени экрана.
	bool rename_screen(qdInterfaceScreen *scr, const char *name);
	//! Удаление экрана из списка.
	bool remove_screen(qdInterfaceScreen *scr);
	//! Поиск экрана по имени.
	qdInterfaceScreen *get_screen(const char *screen_name);
	//! Возвращает true, если экран есть в списке.
	bool is_screen_in_list(const qdInterfaceScreen *scr);

	typedef Std::list<qdInterfaceScreen *> screen_list_t;
	//! Возвращает список экранов.
	const screen_list_t &screen_list() const {
		return _screens.get_list();
	}

	//! Установка активного экрана.
	/**
	Имя можно передавать нулевое, для сброса активного экрана.
	*/
	bool select_screen(const char *screen_name, bool lock_resources = false);
	/// Установка фонового экрана.
	bool select_background_screen(qdInterfaceScreen *p);

	//! Включает внутриигровой интерфейс.
	bool select_ingame_screen(bool inventory_state = false);

	//! Включает кнопки, связанные с персонажем p, выключает кнопки остальных персонажей.
	void update_personage_buttons();

	qdInterfaceScreen *selected_screen() const {
		return _cur_screen;
	}

	//! Возвращает true, если экран p в данный момент активен.
	bool is_screen_active(const qdInterfaceScreen *p) const {
		return (_cur_screen == p);
	}

	//! Добавляет ресурс file_name с владельцем owner.
	qdResource *add_resource(const Common::Path file_name, const qdInterfaceElementState *owner);
	//! Удаляет ресурс file_name с владельцем owner.
	bool remove_resource(const Common::Path file_name, const qdInterfaceElementState *owner);
	//! Возвращает указатель на ресурс file_name.
	qdResource *get_resource(const Common::Path file_name) const {
		return _resources.get_resource(file_name);
	}

	//! Обработчик событий мыши.
	bool mouse_handler(int x, int y, mouseDispatcher::mouseEvent ev);
	//! Обработчик ввода с клавиатуры.
	bool keyboard_handler(Common::KeyCode vkey);
	bool char_input_handler(int vkey);

	//! Запись данных в скрипт.
	bool save_script(Common::WriteStream &fh, int indent = 0) const;
	//! Загрузка данных из скрипта.
	bool load_script(const xml::tag *p);

	//! Установка имени экрана с главным меню игры.
	void set_main_menu_screen(const char *name);
	//! Возвращает имя экрана с главным меню игры.
	const char *main_menu_screen_name() const {
		return _main_menu_screen_name.c_str();
	}
	//! Возвращает true, если установлено имя экрана с главным меню игры.
	bool has_main_menu() const {
		return !_main_menu_screen_name.empty();
	}

	//! Установка имени внутриигрового экрана.
	void set_ingame_screen(const char *name, bool inventory_state = false);
	//! Возвращает имя внутриигрового экрана.
	const char *ingame_screen_name(bool inventory_state = false) const {
		return _ingame_screen_names[inventory_state].c_str();
	}
	//! Возвращает true, если установлено имя внутриигрового экрана.
	bool has_ingame_screen(bool inventory_state = false) const {
		return !_ingame_screen_names[inventory_state].empty();
	}

	//! Имя модального экрана подсказки: перезаписывать сэйв или нет.
	const char *save_prompt_screen_name() const {
		return _save_prompt_screen_name.c_str();
	}
	void set_save_prompt_screen_name(const char *str) {
		if (str) _save_prompt_screen_name = str;
		else _save_prompt_screen_name = "";
	}
	bool has_save_prompt_screen() const {
		return !_save_prompt_screen_name.empty();
	}

	const char *save_title_screen_name() const {
		return _save_title_screen_name.c_str();
	}
	void set_save_title_screen_name(const char *name) {
		_save_title_screen_name = name;
	}
	bool has_save_title_screen() const {
		return !_save_title_screen_name.empty();
	}

	//! Нужно ли выводить скриншот к сохраненке
	bool need_save_screenshot() const {
		return _need_save_screenshot;
	}
	void toggle_save_screenshot(bool state) {
		_need_save_screenshot = state;
	}
	//! Нужно ли выводить дату и время при отображении сэйва
	bool need_show_save_time() const {
		return _need_show_save_time;
	}
	void toggle_show_save_time(bool state) {
		_need_show_save_time = state;
	}
	bool need_show_save_title() const {
		return _need_show_save_title;
	}
	void toggle_show_save_title(bool state) {
		_need_show_save_title = state;
	}
	//! Тип шрифт, которым выводится текст сэйва (в частности дата и время)
	int save_font_type() const {
		return _save_font_type;
	}
	void set_save_font_type(int type) {
		_save_font_type = type;
	}
	//! Цвет, которым выводится текст сэйва (в частности дата и время)
	int save_font_color() const {
		return _save_font_color;
	}
	void set_save_font_color(int clr) {
		_save_font_color = clr;
	}

	//! Возвращает true, если интерфейс отрисовывается поверх сцены.
	bool need_scene_redraw() const {
		return _need_scene_redraw;
	}
	//! Устанавливает, надо ли если интерфейсу отрисовываться поверх сцены.
	void set_scene_redraw(bool state) {
		_need_scene_redraw = state;
	}

	static void set_dispatcher(qdInterfaceDispatcher *p) {
		_dispatcher = p;
	}
	static qdInterfaceDispatcher *get_dispatcher() {
		return _dispatcher;
	}

	void activate() {
		_is_active = true;
	}
	void deactivate() {
		_is_active = false;
	}
	bool is_active() const {
		return _is_active;
	}

	bool is_mouse_hover() const {
		return _is_mouse_hover;
	}
	void toggle_mouse_hover() {
		_is_mouse_hover = true;
	}
	bool is_autohide_enabled() const {
		return !_autohide_disable;
	}
	void disable_autohide() {
		_autohide_disable = true;
	}

	ModalScreenMode modalScreenMode() const {
		return _modalScreenMode;
	}
	void setModalScreenMode(ModalScreenMode mode) {
		_modalScreenMode = mode;
	}

	bool set_save_title(const char *title);
	const char *get_save_title() const;

	/**
	Обработка события.
	sender - тот, кто послал событие на выполнение. NULL - sender не известен.
	*/
	bool handle_event(int event_code, const char *event_data, qdInterfaceObjectBase *sender = NULL);

	void toggle_end_game_mode(bool state) {
		_end_game_mode = state;
	}

	//! Устанавливает следующий экран.
	void set_next_screen(const char *screen_name) {
		_next_screen = screen_name;
	}

	static int option_value(int option_id, const char *option_data = NULL);
	static bool set_option_value(int option_id, int value, const char *oprtion_data = NULL);

#ifdef __QD_DEBUG_ENABLE__
	bool get_resources_info(qdResourceInfoContainer &infos) const;
#endif

private:

	//! Активный интерфейсный экран.
	qdInterfaceScreen *_cur_screen;

	/// Фоновый экран, рисуется под активным
	qdInterfaceScreen *_background_screen;
	/// true если ресурсы фонового экрана не надо выгружать
	bool _background_screen_lock;

	ModalScreenMode _modalScreenMode;

	//! Имя экрана с главным меню игры
	Common::String _main_menu_screen_name;

	//! Имена экраноы с внутриигровым интерфейсом.
	/**
	Первый экран показывается когда инвентори спрятано, вотрой - когда оно активно.
	*/
	Common::String _ingame_screen_names[2];

	/// Экран ввода имени сэйва
	Common::String _save_title_screen_name;
	Common::String _save_title;

	//! Экран, вызывающийся при подтверждении перезаписи файла сэйва
	Common::String _save_prompt_screen_name;

	//! Нужно ли выводить скриншот к сохраненке
	bool _need_save_screenshot;
	//! Нужно ли выводить дату и время при отображении сэйва
	bool _need_show_save_time;
	//! Нужно ли выводить имя при отображении сэйва
	bool _need_show_save_title;
	//! Тип шрифта, которым выводится текст сэйва (в частности дата и время)
	int _save_font_type;
	//! Цвет, которым выводится текст сэйва (в частности дата и время)
	int _save_font_color;

	//! Интерфейсные экраны.
	qdObjectListContainer<qdInterfaceScreen> _screens;

	typedef qdResourceContainer<qdInterfaceElementState> resource_container_t;
	//! Интерфейсные ресурсы.
	resource_container_t _resources;

	//! Равно true, если интерфейс активен.
	bool _is_active;

	//! Равно true, если курсор мыши попадает в интерфейс.
	bool _is_mouse_hover;
	/// true если надо показывать
	bool _autohide_disable;

	//! Равно true, если требуется полная отрисовка интерфейса, после отрисовки скидывается.
	bool _need_full_redraw;

	//! Равно true, если отрисовка сцены под интерфейсом.
	bool _need_scene_redraw;

	//! Режим окончания игры - после любого клика возврат с текущего экрана в главное меню.
	//! После загрузки меню скидывается в false.
	bool _end_game_mode;

	//! Имя экрана, на который надо перейти.
	const char *_next_screen;

	//! Текущий диспетчер интерфейса.
	static qdInterfaceDispatcher *_dispatcher;
};

} // namespace QDEngine

#endif // QDENGINE_QDCORE_QD_INTERFACE_DISPATCHER_H