+AutoHideButtonBar::AutoHideButtonBar(IrrlichtDevice *device,
+ IEventReceiver* receiver) :
+ m_texturesource(NULL),
+ m_driver(device->getVideoDriver()),
+ m_guienv(device->getGUIEnvironment()),
+ m_receiver(receiver),
+ m_active(false),
+ m_visible(true),
+ m_timeout(0),
+ m_timeout_value(3),
+ m_initialized(false),
+ m_dir(AHBB_Dir_Right_Left)
+{
+ m_screensize = device->getVideoDriver()->getScreenSize();
+
+}
+
+void AutoHideButtonBar::init(ISimpleTextureSource* tsrc,
+ const char* starter_img, int button_id, v2s32 UpperLeft,
+ v2s32 LowerRight, autohide_button_bar_dir dir, float timeout)
+{
+ m_texturesource = tsrc;
+
+ m_upper_left = UpperLeft;
+ m_lower_right = LowerRight;
+
+ /* init settings bar */
+
+ irr::core::rect<int> current_button = rect<s32>(UpperLeft.X, UpperLeft.Y,
+ LowerRight.X, LowerRight.Y);
+
+ m_starter.guibutton = m_guienv->addButton(current_button, 0, button_id, L"", 0);
+ m_starter.guibutton->grab();
+ m_starter.repeatcounter = -1;
+ m_starter.keycode = KEY_OEM_8; // use invalid keycode as it's not relevant
+ m_starter.immediate_release = true;
+ m_starter.ids.clear();
+
+ load_button_texture(&m_starter, starter_img, current_button,
+ m_texturesource, m_driver);
+
+ m_dir = dir;
+ m_timeout_value = timeout;
+
+ m_initialized = true;
+}
+
+AutoHideButtonBar::~AutoHideButtonBar()
+{
+ m_starter.guibutton->setVisible(false);
+ m_starter.guibutton->drop();
+}
+
+void AutoHideButtonBar::addButton(touch_gui_button_id button_id,
+ const wchar_t* caption, const char* btn_image)
+{
+
+ if (!m_initialized) {
+ errorstream << "AutoHideButtonBar::addButton not yet initialized!"
+ << std::endl;
+ return;
+ }
+ int button_size = 0;
+
+ if ((m_dir == AHBB_Dir_Top_Bottom) || (m_dir == AHBB_Dir_Bottom_Top)) {
+ button_size = m_lower_right.X - m_upper_left.X;
+ } else {
+ button_size = m_lower_right.Y - m_upper_left.Y;
+ }
+
+ irr::core::rect<int> current_button;
+
+ if ((m_dir == AHBB_Dir_Right_Left) || (m_dir == AHBB_Dir_Left_Right)) {
+
+ int x_start = 0;
+ int x_end = 0;
+
+ if (m_dir == AHBB_Dir_Left_Right) {
+ x_start = m_lower_right.X + (button_size * 1.25 * m_buttons.size())
+ + (button_size * 0.25);
+ x_end = x_start + button_size;
+ } else {
+ x_end = m_upper_left.X - (button_size * 1.25 * m_buttons.size())
+ - (button_size * 0.25);
+ x_start = x_end - button_size;
+ }
+
+ current_button = rect<s32>(x_start, m_upper_left.Y, x_end,
+ m_lower_right.Y);
+ } else {
+ int y_start = 0;
+ int y_end = 0;
+
+ if (m_dir == AHBB_Dir_Top_Bottom) {
+ y_start = m_lower_right.X + (button_size * 1.25 * m_buttons.size())
+ + (button_size * 0.25);
+ y_end = y_start + button_size;
+ } else {
+ y_end = m_upper_left.X - (button_size * 1.25 * m_buttons.size())
+ - (button_size * 0.25);
+ y_start = y_end - button_size;
+ }
+
+ current_button = rect<s32>(m_upper_left.X, y_start, m_lower_right.Y,
+ y_end);
+ }
+
+ button_info* btn = new button_info();
+ btn->guibutton = m_guienv->addButton(current_button, 0, button_id, caption, 0);
+ btn->guibutton->grab();
+ btn->guibutton->setVisible(false);
+ btn->guibutton->setEnabled(false);
+ btn->repeatcounter = -1;
+ btn->keycode = id2keycode(button_id);
+ btn->immediate_release = true;
+ btn->ids.clear();
+
+ load_button_texture(btn, btn_image, current_button, m_texturesource,
+ m_driver);
+
+ m_buttons.push_back(btn);
+}
+
+bool AutoHideButtonBar::isButton(const SEvent &event)
+{
+ IGUIElement* rootguielement = m_guienv->getRootGUIElement();
+
+ if (rootguielement == NULL) {
+ return false;
+ }
+
+ gui::IGUIElement *element = rootguielement->getElementFromPoint(
+ core::position2d<s32>(event.TouchInput.X, event.TouchInput.Y));
+
+ if (element == NULL) {
+ return false;
+ }
+
+ if (m_active) {
+ /* check for all buttons in vector */
+
+ std::vector<button_info*>::iterator iter = m_buttons.begin();
+
+ while (iter != m_buttons.end()) {
+ if ((*iter)->guibutton == element) {
+
+ SEvent* translated = new SEvent();
+ memset(translated, 0, sizeof(SEvent));
+ translated->EventType = irr::EET_KEY_INPUT_EVENT;
+ translated->KeyInput.Key = (*iter)->keycode;
+ translated->KeyInput.Control = false;
+ translated->KeyInput.Shift = false;
+ translated->KeyInput.Char = 0;
+
+ /* add this event */
+ translated->KeyInput.PressedDown = true;
+ m_receiver->OnEvent(*translated);
+
+ /* remove this event */
+ translated->KeyInput.PressedDown = false;
+ m_receiver->OnEvent(*translated);
+
+ delete translated;
+
+ (*iter)->ids.push_back(event.TouchInput.ID);
+
+ m_timeout = 0;
+
+ return true;
+ }
+ ++iter;
+ }
+ } else {
+ /* check for starter button only */
+ if (element == m_starter.guibutton) {
+ m_starter.ids.push_back(event.TouchInput.ID);
+ m_starter.guibutton->setVisible(false);
+ m_starter.guibutton->setEnabled(false);
+ m_active = true;
+ m_timeout = 0;
+
+ std::vector<button_info*>::iterator iter = m_buttons.begin();
+
+ while (iter != m_buttons.end()) {
+ (*iter)->guibutton->setVisible(true);
+ (*iter)->guibutton->setEnabled(true);
+ ++iter;
+ }
+
+ return true;
+ }
+ }
+ return false;
+}
+
+bool AutoHideButtonBar::isReleaseButton(int eventID)
+{
+ std::vector<int>::iterator id = std::find(m_starter.ids.begin(),
+ m_starter.ids.end(), eventID);
+
+ if (id != m_starter.ids.end()) {
+ m_starter.ids.erase(id);
+ return true;
+ }
+
+ std::vector<button_info*>::iterator iter = m_buttons.begin();
+
+ while (iter != m_buttons.end()) {
+ std::vector<int>::iterator id = std::find((*iter)->ids.begin(),
+ (*iter)->ids.end(), eventID);
+
+ if (id != (*iter)->ids.end()) {
+ (*iter)->ids.erase(id);
+ // TODO handle settings button release
+ return true;
+ }
+ ++iter;
+ }
+
+ return false;
+}
+
+void AutoHideButtonBar::step(float dtime)
+{
+ if (m_active) {
+ m_timeout += dtime;
+
+ if (m_timeout > m_timeout_value) {
+ deactivate();
+ }
+ }
+}
+
+void AutoHideButtonBar::deactivate()
+{
+ if (m_visible == true) {
+ m_starter.guibutton->setVisible(true);
+ m_starter.guibutton->setEnabled(true);
+ }
+ m_active = false;
+
+ std::vector<button_info*>::iterator iter = m_buttons.begin();
+
+ while (iter != m_buttons.end()) {
+ (*iter)->guibutton->setVisible(false);
+ (*iter)->guibutton->setEnabled(false);
+ ++iter;
+ }
+}
+
+void AutoHideButtonBar::hide()
+{
+ m_visible = false;
+ m_starter.guibutton->setVisible(false);
+ m_starter.guibutton->setEnabled(false);
+
+ std::vector<button_info*>::iterator iter = m_buttons.begin();
+
+ while (iter != m_buttons.end()) {
+ (*iter)->guibutton->setVisible(false);
+ (*iter)->guibutton->setEnabled(false);
+ ++iter;
+ }
+}
+
+void AutoHideButtonBar::show()
+{
+ m_visible = true;
+
+ if (m_active) {
+ std::vector<button_info*>::iterator iter = m_buttons.begin();
+
+ while (iter != m_buttons.end()) {
+ (*iter)->guibutton->setVisible(true);
+ (*iter)->guibutton->setEnabled(true);
+ ++iter;
+ }
+ } else {
+ m_starter.guibutton->setVisible(true);
+ m_starter.guibutton->setEnabled(true);
+ }
+}
+
+TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver* receiver):
+ m_device(device),
+ m_guienv(device->getGUIEnvironment()),
+ m_camera_yaw(0.0),
+ m_camera_pitch(0.0),
+ m_visible(false),
+ m_move_id(-1),
+ m_receiver(receiver),
+ m_move_has_really_moved(false),
+ m_move_downtime(0),
+ m_move_sent_as_mouse_event(false),
+ // use some downlocation way off screen as init value to avoid invalid behaviour
+ m_move_downlocation(v2s32(-10000, -10000)),
+ m_settingsbar(device, receiver),
+ m_rarecontrolsbar(device, receiver)
+{
+ for (unsigned int i=0; i < after_last_element_id; i++) {
+ m_buttons[i].guibutton = 0;
+ m_buttons[i].repeatcounter = -1;
+ m_buttons[i].repeatdelay = BUTTON_REPEAT_DELAY;
+ }
+
+ m_screensize = m_device->getVideoDriver()->getScreenSize();
+}
+