File: qd_interface_element.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 (266 lines) | stat: -rw-r--r-- 9,074 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
/* 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_ELEMENT_H
#define QDENGINE_QDCORE_QD_INTERFACE_ELEMENT_H

#include "common/keyboard.h"

#include "qdengine/system/sound/snd_sound.h"
#include "qdengine/system/input/mouse_input.h"
#include "qdengine/system/graphics/gr_screen_region.h"
#include "qdengine/qdcore/qd_animation.h"
#include "qdengine/qdcore/qd_interface_object_base.h"
#include "qdengine/qdcore/qd_sound_handle.h"


namespace QDEngine {

//class qdInterfaceScreen;
class qdInterfaceElementState;

//! Базовый класс для элементов GUI.
class qdInterfaceElement : public qdInterfaceObjectBase {
public:
	qdInterfaceElement();
	qdInterfaceElement(const qdInterfaceElement &el);
	virtual ~qdInterfaceElement() = 0;

	qdInterfaceElement &operator = (const qdInterfaceElement &el);

	//! Идентификаторы настроек игры.
	enum option_ID_t {
		OPTION_NONE = 0,
		/// звук вкл/выкл, 1/0
		OPTION_SOUND,
		/// громкость звука, [0, 255]
		OPTION_SOUND_VOLUME,
		/// музыка вкл/выкл, 1/0
		OPTION_MUSIC,
		/// громкость музыки, [0, 255]
		OPTION_MUSIC_VOLUME,
		/// определенный персонаж персонаж активен/неактивен, 1/0
		OPTION_ACTIVE_PERSONAGE
	};

	//! Типы элементов интерфейса.
	enum element_type {
		//! фон
		EL_BACKGROUND,
		//! кнопка
		EL_BUTTON,
		//! слайдер
		EL_SLIDER,
		//! сэйв
		EL_SAVE,
		//! окно с текстами
		EL_TEXT_WINDOW,
		//! счётчик
		EL_COUNTER
	};

	//! Статус состояния.
	enum state_status_t {
		//! состояние неактивно
		STATE_INACTIVE,
		//! состояние активно
		STATE_ACTIVE,
		//! работа состояния закончилась
		STATE_DONE
	};

	//! Создание элемента интерфейса заданного типа.
	static qdInterfaceElement *create_element(element_type tp);
	//! Уничтожение элемента интерфейса.
	static void destroy_element(qdInterfaceElement *p);
	//! Возвращает тип элемента.
	virtual element_type get_element_type() const = 0;

	//! Возвращает идентификатор настройки игры, связанной с элементом.
	option_ID_t option_ID() const {
		return _option_ID;
	}
	//! Устанавливает идентификатор настройки игры, связанной с элементом.
	void set_option_ID(option_ID_t id) {
		_option_ID = id;
	}
	//! Возвращает true, если с элементом связана настройка игры.
	bool linked_to_option() const {
		return (_option_ID != OPTION_NONE);
	}
	//! Возвращает значение настройки игры, связанной с элементом.
	virtual int option_value() const {
		return -1;
	}
	//! Устанавливает значение настройки игры, связанной с элементом.
	virtual bool set_option_value(int value) {
		return false;
	}

	//! Возвращает экранные координаты центра элемента.
	virtual const Vect2i r() const {
		return _r + g_engine->screen_offset();
	}
	//! Устанавливает экранные координаты центра элемента.
	void set_r(const Vect2i &v) {
		_r = v;
	}

	//! Возвращает размер элемента по горизонтали в пикселах.
	virtual int size_x() const {
		return _animation.size_x();
	}
	//! Возвращает размер элемента по вертикали в пикселах.
	virtual int size_y() const {
		return _animation.size_y();
	}

	virtual grScreenRegion screen_region() const;
	const grScreenRegion &last_screen_region() const {
		return _last_screen_region;
	}

	//! Устанавливает экранную глубину элемента.
	void set_screen_depth(int v) {
		_screen_depth = v;
	}
	//! Возвращает экранную глубину эелмента.
	int screen_depth() const {
		return _screen_depth;
	}

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

	//! Загрузка данных из скрипта.
	bool load_script(const xml::tag *p);

	//! Отрисовка элемента.
	virtual bool redraw() const;
	virtual bool need_redraw() const;
	virtual bool post_redraw();

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

	virtual void hover_clear() { }

	//! Инициализация элемента.
	/**
	Вызывается каждый раз при заходе на экран, которому принадлежит элемент.
	*/
	virtual bool init(bool is_game_active = true) = 0;

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

	const qdAnimation &animation() const {
		return _animation;
	}

	//! Устанавливает анимацию для элемента.
	bool set_animation(const qdAnimation *anm, int anm_flags = 0);
	//! Включает состояние элемента.
	bool set_state(const qdInterfaceElementState *p);

	//! Добавляет ресурс file_name с владельцем owner.
	qdResource *add_resource(const Common::Path file_name, const qdInterfaceElementState *res_owner);
	//! Удаляет ресурс file_name с владельцем owner.
	bool remove_resource(const Common::Path file_name, const qdInterfaceElementState *res_owner);

	//! Возвращает true, если точка с экранными координатами (x,у) попадает в элемент.
	virtual bool hit_test(int x, int y) const;

	//! Возвращает статус состояния.
	state_status_t state_status(const qdInterfaceElementState *p) const;

	//! Прячет элемент.
	void hide() {
		_is_visible = false;
	}
	//! Показывает элемент.
	void show() {
		_is_visible = true;
	}
	//! Возвращает true, если элемент не спрятан.
	bool is_visible() const {
		return _is_visible;
	}

	//! Возвращает true, если элемент заблокирован.
	bool is_locked() const {
		return _is_locked;
	}
	//! Блокировка/разблокировка элемента.
	void set_lock(bool state) {
		_is_locked = state;
	}

protected:

	//! Запись данных в скрипт.
	virtual bool save_script_body(Common::WriteStream &fh, int indent = 0) const = 0;

	//! Загрузка данных из скрипта.
	virtual bool load_script_body(const xml::tag *p) = 0;

	void clear_screen_region() {
		_last_screen_region = grScreenRegion_EMPTY;
	}

private:

	//! Идентификатор настройки игры, связанной с элементом.
	option_ID_t _option_ID;
	//! Данные для настройки игры, связанной с элементом.
	Common::String _option_data;

	//! Экранные координаты центра элемента.
	Vect2i _r;

	//! Экранная глубина. Чем больше значение - тем дальше элемент.
	int _screen_depth;

	//! Анимация элемента.
	qdAnimation _animation;

	//! Хэндл для управления звуками.
	qdSoundHandle _sound_handle;

	//! Равно false, если элемент спрятан.
	bool _is_visible;

	//! Равно true, если элемент заблокирован (не реагирует на клавиатуру/мышь).
	bool _is_locked;

	grScreenRegion _last_screen_region;
	const qdAnimationFrame *_last_animation_frame;
};

} // namespace QDEngine

#endif // QDENGINE_QDCORE_QD_INTERFACE_ELEMENT_H