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
|