touchscreengui.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /*
  2. Copyright (C) 2014 sapier
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 2.1 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License along
  12. with this program; if not, write to the Free Software Foundation, Inc.,
  13. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  14. */
  15. #include "touchscreengui.h"
  16. #include "irrlichttypes.h"
  17. #include "irr_v2d.h"
  18. #include "log.h"
  19. #include "keycode.h"
  20. #include "settings.h"
  21. #include "gettime.h"
  22. #include "util/numeric.h"
  23. #include "porting.h"
  24. #include <iostream>
  25. #include <algorithm>
  26. #include <ISceneCollisionManager.h>
  27. using namespace irr::core;
  28. extern Settings *g_settings;
  29. const char** touchgui_button_imagenames = (const char*[]) {
  30. "up_arrow.png",
  31. "down_arrow.png",
  32. "left_arrow.png",
  33. "right_arrow.png",
  34. "jump_btn.png",
  35. "down.png",
  36. "inventory_btn.png",
  37. "chat_btn.png"
  38. };
  39. static irr::EKEY_CODE id2keycode(touch_gui_button_id id)
  40. {
  41. std::string key = "";
  42. switch (id) {
  43. case forward_id:
  44. key = "forward";
  45. break;
  46. case left_id:
  47. key = "left";
  48. break;
  49. case right_id:
  50. key = "right";
  51. break;
  52. case backward_id:
  53. key = "backward";
  54. break;
  55. case jump_id:
  56. key = "jump";
  57. break;
  58. case inventory_id:
  59. key = "inventory";
  60. break;
  61. case chat_id:
  62. key = "chat";
  63. break;
  64. case crunch_id:
  65. key = "sneak";
  66. break;
  67. }
  68. assert(key != "");
  69. return keyname_to_keycode(g_settings->get("keymap_" + key).c_str());
  70. }
  71. TouchScreenGUI *g_touchscreengui;
  72. TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver* receiver):
  73. m_device(device),
  74. m_guienv(device->getGUIEnvironment()),
  75. m_camera_yaw(0.0),
  76. m_camera_pitch(0.0),
  77. m_visible(false),
  78. m_move_id(-1),
  79. m_receiver(receiver)
  80. {
  81. for (unsigned int i=0; i < after_last_element_id; i++) {
  82. m_buttons[i].guibutton = 0;
  83. m_buttons[i].repeatcounter = -1;
  84. }
  85. m_screensize = m_device->getVideoDriver()->getScreenSize();
  86. }
  87. void TouchScreenGUI::loadButtonTexture(button_info* btn, const char* path)
  88. {
  89. unsigned int tid;
  90. video::ITexture *texture = m_texturesource->getTexture(path,&tid);
  91. if (texture) {
  92. btn->guibutton->setUseAlphaChannel(true);
  93. btn->guibutton->setImage(texture);
  94. btn->guibutton->setPressedImage(texture);
  95. btn->guibutton->setScaleImage(true);
  96. btn->guibutton->setDrawBorder(false);
  97. btn->guibutton->setText(L"");
  98. }
  99. }
  100. void TouchScreenGUI::initButton(touch_gui_button_id id, rect<s32> button_rect,
  101. std::wstring caption, bool immediate_release )
  102. {
  103. button_info* btn = &m_buttons[id];
  104. btn->guibutton = m_guienv->addButton(button_rect, 0, id, caption.c_str());
  105. btn->guibutton->grab();
  106. btn->repeatcounter = -1;
  107. btn->keycode = id2keycode(id);
  108. btn->immediate_release = immediate_release;
  109. btn->ids.clear();
  110. loadButtonTexture(btn,touchgui_button_imagenames[id]);
  111. }
  112. static int getMaxControlPadSize(float density) {
  113. return 200 * density * g_settings->getFloat("gui_scaling");
  114. }
  115. void TouchScreenGUI::init(ISimpleTextureSource* tsrc, float density)
  116. {
  117. assert(tsrc != 0);
  118. u32 control_pad_size =
  119. MYMIN((2 * m_screensize.Y) / 3,getMaxControlPadSize(density));
  120. u32 button_size = control_pad_size / 3;
  121. m_visible = true;
  122. m_texturesource = tsrc;
  123. m_control_pad_rect = rect<s32>(0, m_screensize.Y - 3 * button_size,
  124. 3 * button_size, m_screensize.Y);
  125. /*
  126. draw control pad
  127. 0 1 2
  128. 3 4 5
  129. for now only 0, 1, 2, and 4 are used
  130. */
  131. int number = 0;
  132. for (int y = 0; y < 2; ++y)
  133. for (int x = 0; x < 3; ++x, ++number) {
  134. rect<s32> button_rect(
  135. x * button_size, m_screensize.Y - button_size * (2 - y),
  136. (x + 1) * button_size, m_screensize.Y - button_size * (1 - y)
  137. );
  138. touch_gui_button_id id = after_last_element_id;
  139. std::wstring caption;
  140. switch (number) {
  141. case 0:
  142. id = left_id;
  143. caption = L"<";
  144. break;
  145. case 1:
  146. id = forward_id;
  147. caption = L"^";
  148. break;
  149. case 2:
  150. id = right_id;
  151. caption = L">";
  152. break;
  153. case 4:
  154. id = backward_id;
  155. caption = L"v";
  156. break;
  157. }
  158. if (id != after_last_element_id) {
  159. initButton(id, button_rect, caption, false);
  160. }
  161. }
  162. /* init inventory button */
  163. initButton(inventory_id,
  164. rect<s32>(0, m_screensize.Y - (button_size/2),
  165. (button_size/2), m_screensize.Y), L"inv", true);
  166. /* init jump button */
  167. initButton(jump_id,
  168. rect<s32>(m_screensize.X-(1.75*button_size),
  169. m_screensize.Y - (0.5*button_size),
  170. m_screensize.X-(0.25*button_size),
  171. m_screensize.Y),
  172. L"x",false);
  173. /* init crunch button */
  174. initButton(crunch_id,
  175. rect<s32>(m_screensize.X-(3.25*button_size),
  176. m_screensize.Y - (0.5*button_size),
  177. m_screensize.X-(1.75*button_size),
  178. m_screensize.Y),
  179. L"H",false);
  180. /* init chat button */
  181. initButton(chat_id,
  182. rect<s32>(m_screensize.X-(1.5*button_size), 0,
  183. m_screensize.X, button_size),
  184. L"Chat", true);
  185. }
  186. touch_gui_button_id TouchScreenGUI::getButtonID(s32 x, s32 y)
  187. {
  188. IGUIElement* rootguielement = m_guienv->getRootGUIElement();
  189. if (rootguielement != NULL) {
  190. gui::IGUIElement *element =
  191. rootguielement->getElementFromPoint(core::position2d<s32>(x,y));
  192. if (element) {
  193. for (unsigned int i=0; i < after_last_element_id; i++) {
  194. if (element == m_buttons[i].guibutton) {
  195. return (touch_gui_button_id) i;
  196. }
  197. }
  198. }
  199. }
  200. return after_last_element_id;
  201. }
  202. touch_gui_button_id TouchScreenGUI::getButtonID(int eventID)
  203. {
  204. for (unsigned int i=0; i < after_last_element_id; i++) {
  205. button_info* btn = &m_buttons[i];
  206. std::vector<int>::iterator id =
  207. std::find(btn->ids.begin(),btn->ids.end(), eventID);
  208. if (id != btn->ids.end())
  209. return (touch_gui_button_id) i;
  210. }
  211. return after_last_element_id;
  212. }
  213. bool TouchScreenGUI::isHUDButton(const SEvent &event)
  214. {
  215. // check if hud item is pressed
  216. for (std::map<int,rect<s32> >::iterator iter = m_hud_rects.begin();
  217. iter != m_hud_rects.end(); iter++) {
  218. if (iter->second.isPointInside(
  219. v2s32(event.TouchInput.X,
  220. event.TouchInput.Y)
  221. )) {
  222. if ( iter->first < 8) {
  223. SEvent* translated = new SEvent();
  224. memset(translated,0,sizeof(SEvent));
  225. translated->EventType = irr::EET_KEY_INPUT_EVENT;
  226. translated->KeyInput.Key = (irr::EKEY_CODE) (KEY_KEY_1 + iter->first);
  227. translated->KeyInput.Control = false;
  228. translated->KeyInput.Shift = false;
  229. translated->KeyInput.PressedDown = true;
  230. m_receiver->OnEvent(*translated);
  231. m_hud_ids[event.TouchInput.ID] = translated->KeyInput.Key;
  232. delete translated;
  233. return true;
  234. }
  235. }
  236. }
  237. return false;
  238. }
  239. bool TouchScreenGUI::isReleaseHUDButton(int eventID)
  240. {
  241. std::map<int,irr::EKEY_CODE>::iterator iter = m_hud_ids.find(eventID);
  242. if (iter != m_hud_ids.end()) {
  243. SEvent* translated = new SEvent();
  244. memset(translated,0,sizeof(SEvent));
  245. translated->EventType = irr::EET_KEY_INPUT_EVENT;
  246. translated->KeyInput.Key = iter->second;
  247. translated->KeyInput.PressedDown = false;
  248. translated->KeyInput.Control = false;
  249. translated->KeyInput.Shift = false;
  250. m_receiver->OnEvent(*translated);
  251. m_hud_ids.erase(iter);
  252. delete translated;
  253. return true;
  254. }
  255. return false;
  256. }
  257. void TouchScreenGUI::ButtonEvent(touch_gui_button_id button,
  258. int eventID, bool action)
  259. {
  260. button_info* btn = &m_buttons[button];
  261. SEvent* translated = new SEvent();
  262. memset(translated,0,sizeof(SEvent));
  263. translated->EventType = irr::EET_KEY_INPUT_EVENT;
  264. translated->KeyInput.Key = btn->keycode;
  265. translated->KeyInput.Control = false;
  266. translated->KeyInput.Shift = false;
  267. translated->KeyInput.Char = 0;
  268. /* add this event */
  269. if (action) {
  270. assert(std::find(btn->ids.begin(),btn->ids.end(), eventID) == btn->ids.end());
  271. btn->ids.push_back(eventID);
  272. if (btn->ids.size() > 1) return;
  273. btn->repeatcounter = 0;
  274. translated->KeyInput.PressedDown = true;
  275. translated->KeyInput.Key = btn->keycode;
  276. m_receiver->OnEvent(*translated);
  277. }
  278. /* remove event */
  279. if ((!action) || (btn->immediate_release)) {
  280. std::vector<int>::iterator pos =
  281. std::find(btn->ids.begin(),btn->ids.end(), eventID);
  282. /* has to be in touch list */
  283. assert(pos != btn->ids.end());
  284. btn->ids.erase(pos);
  285. if (btn->ids.size() > 0) { return; }
  286. translated->KeyInput.PressedDown = false;
  287. btn->repeatcounter = -1;
  288. m_receiver->OnEvent(*translated);
  289. }
  290. delete translated;
  291. }
  292. void TouchScreenGUI::translateEvent(const SEvent &event)
  293. {
  294. if (!m_visible) {
  295. infostream << "TouchScreenGUI::translateEvent got event but not visible?!" << std::endl;
  296. return;
  297. }
  298. if (event.EventType != EET_TOUCH_INPUT_EVENT) {
  299. return;
  300. }
  301. if (event.TouchInput.Event == ETIE_PRESSED_DOWN) {
  302. /* add to own copy of eventlist ...
  303. * android would provide this information but irrlicht guys don't
  304. * wanna design a efficient interface
  305. */
  306. id_status toadd;
  307. toadd.id = event.TouchInput.ID;
  308. toadd.X = event.TouchInput.X;
  309. toadd.Y = event.TouchInput.Y;
  310. m_known_ids.push_back(toadd);
  311. int eventID = event.TouchInput.ID;
  312. touch_gui_button_id button =
  313. getButtonID(event.TouchInput.X, event.TouchInput.Y);
  314. /* handle button events */
  315. if (button != after_last_element_id) {
  316. ButtonEvent(button,eventID,true);
  317. }
  318. else if (isHUDButton(event))
  319. {
  320. /* already handled in isHUDButton() */
  321. }
  322. /* handle non button events */
  323. else {
  324. /* if we don't already have a moving point make this the moving one */
  325. if (m_move_id == -1) {
  326. m_move_id = event.TouchInput.ID;
  327. m_move_has_really_moved = false;
  328. m_move_downtime = getTimeMs();
  329. m_move_downlocation = v2s32(event.TouchInput.X, event.TouchInput.Y);
  330. m_move_sent_as_mouse_event = false;
  331. }
  332. }
  333. m_pointerpos[event.TouchInput.ID] = v2s32(event.TouchInput.X, event.TouchInput.Y);
  334. }
  335. else if (event.TouchInput.Event == ETIE_LEFT_UP) {
  336. verbosestream << "Up event for pointerid: " << event.TouchInput.ID << std::endl;
  337. touch_gui_button_id button = getButtonID(event.TouchInput.ID);
  338. /* handle button events */
  339. if (button != after_last_element_id) {
  340. ButtonEvent(button,event.TouchInput.ID,false);
  341. }
  342. /* handle hud button events */
  343. else if (isReleaseHUDButton(event.TouchInput.ID)) {
  344. /* nothing to do here */
  345. }
  346. /* handle the point used for moving view */
  347. else if (event.TouchInput.ID == m_move_id) {
  348. m_move_id = -1;
  349. /* if this pointer issued a mouse event issue symmetric release here */
  350. if (m_move_sent_as_mouse_event) {
  351. SEvent* translated = new SEvent;
  352. memset(translated,0,sizeof(SEvent));
  353. translated->EventType = EET_MOUSE_INPUT_EVENT;
  354. translated->MouseInput.X = m_move_downlocation.X;
  355. translated->MouseInput.Y = m_move_downlocation.Y;
  356. translated->MouseInput.Shift = false;
  357. translated->MouseInput.Control = false;
  358. translated->MouseInput.ButtonStates = 0;
  359. translated->MouseInput.Event = EMIE_LMOUSE_LEFT_UP;
  360. m_receiver->OnEvent(*translated);
  361. delete translated;
  362. }
  363. else {
  364. /* do double tap detection */
  365. doubleTapDetection();
  366. }
  367. }
  368. else {
  369. infostream
  370. << "TouchScreenGUI::translateEvent released unknown button: "
  371. << event.TouchInput.ID << std::endl;
  372. }
  373. for (std::vector<id_status>::iterator iter = m_known_ids.begin();
  374. iter != m_known_ids.end(); iter++) {
  375. if (iter->id == event.TouchInput.ID) {
  376. m_known_ids.erase(iter);
  377. break;
  378. }
  379. }
  380. }
  381. else {
  382. assert(event.TouchInput.Event == ETIE_MOVED);
  383. int move_idx = event.TouchInput.ID;
  384. if (m_pointerpos[event.TouchInput.ID] ==
  385. v2s32(event.TouchInput.X, event.TouchInput.Y)) {
  386. return;
  387. }
  388. if (m_move_id != -1) {
  389. if ((event.TouchInput.ID == m_move_id) &&
  390. (!m_move_sent_as_mouse_event)) {
  391. double distance = sqrt(
  392. (m_pointerpos[event.TouchInput.ID].X - event.TouchInput.X) *
  393. (m_pointerpos[event.TouchInput.ID].X - event.TouchInput.X) +
  394. (m_pointerpos[event.TouchInput.ID].Y - event.TouchInput.Y) *
  395. (m_pointerpos[event.TouchInput.ID].Y - event.TouchInput.Y));
  396. if ((distance > g_settings->getU16("touchscreen_threshold")) ||
  397. (m_move_has_really_moved)) {
  398. m_move_has_really_moved = true;
  399. s32 X = event.TouchInput.X;
  400. s32 Y = event.TouchInput.Y;
  401. // update camera_yaw and camera_pitch
  402. s32 dx = X - m_pointerpos[event.TouchInput.ID].X;
  403. s32 dy = Y - m_pointerpos[event.TouchInput.ID].Y;
  404. /* adapt to similar behaviour as pc screen */
  405. double d = g_settings->getFloat("mouse_sensitivity") *4;
  406. double old_yaw = m_camera_yaw;
  407. double old_pitch = m_camera_pitch;
  408. m_camera_yaw -= dx * d;
  409. m_camera_pitch = MYMIN(MYMAX( m_camera_pitch + (dy * d),-180),180);
  410. while (m_camera_yaw < 0)
  411. m_camera_yaw += 360;
  412. while (m_camera_yaw > 360)
  413. m_camera_yaw -= 360;
  414. // update shootline
  415. m_shootline = m_device
  416. ->getSceneManager()
  417. ->getSceneCollisionManager()
  418. ->getRayFromScreenCoordinates(v2s32(X, Y));
  419. m_pointerpos[event.TouchInput.ID] = v2s32(X, Y);
  420. }
  421. }
  422. else if ((event.TouchInput.ID == m_move_id) &&
  423. (m_move_sent_as_mouse_event)) {
  424. m_shootline = m_device
  425. ->getSceneManager()
  426. ->getSceneCollisionManager()
  427. ->getRayFromScreenCoordinates(
  428. v2s32(event.TouchInput.X,event.TouchInput.Y));
  429. }
  430. }
  431. else {
  432. handleChangedButton(event);
  433. }
  434. }
  435. }
  436. void TouchScreenGUI::handleChangedButton(const SEvent &event)
  437. {
  438. for (unsigned int i = 0; i < after_last_element_id; i++) {
  439. if (m_buttons[i].ids.empty()) {
  440. continue;
  441. }
  442. for(std::vector<int>::iterator iter = m_buttons[i].ids.begin();
  443. iter != m_buttons[i].ids.end(); iter++) {
  444. if (event.TouchInput.ID == *iter) {
  445. int current_button_id =
  446. getButtonID(event.TouchInput.X, event.TouchInput.Y);
  447. if (current_button_id == i) {
  448. continue;
  449. }
  450. /* remove old button */
  451. ButtonEvent((touch_gui_button_id) i,*iter,false);
  452. if (current_button_id == after_last_element_id) {
  453. return;
  454. }
  455. ButtonEvent((touch_gui_button_id) current_button_id,*iter,true);
  456. return;
  457. }
  458. }
  459. }
  460. int current_button_id = getButtonID(event.TouchInput.X, event.TouchInput.Y);
  461. if (current_button_id == after_last_element_id) {
  462. return;
  463. }
  464. button_info* btn = &m_buttons[current_button_id];
  465. if (std::find(btn->ids.begin(),btn->ids.end(), event.TouchInput.ID) == btn->ids.end()) {
  466. ButtonEvent((touch_gui_button_id) current_button_id,event.TouchInput.ID,true);
  467. }
  468. }
  469. bool TouchScreenGUI::doubleTapDetection()
  470. {
  471. m_key_events[0].down_time = m_key_events[1].down_time;
  472. m_key_events[0].x = m_key_events[1].x;
  473. m_key_events[0].y = m_key_events[1].y;
  474. m_key_events[1].down_time = m_move_downtime;
  475. m_key_events[1].x = m_move_downlocation.X;
  476. m_key_events[1].y = m_move_downlocation.Y;
  477. u32 delta = porting::getDeltaMs(m_key_events[0].down_time,getTimeMs());
  478. if (delta > 400)
  479. return false;
  480. double distance = sqrt(
  481. (m_key_events[0].x - m_key_events[1].x) * (m_key_events[0].x - m_key_events[1].x) +
  482. (m_key_events[0].y - m_key_events[1].y) * (m_key_events[0].y - m_key_events[1].y));
  483. if (distance >(20 + g_settings->getU16("touchscreen_threshold")))
  484. return false;
  485. SEvent* translated = new SEvent();
  486. memset(translated,0,sizeof(SEvent));
  487. translated->EventType = EET_MOUSE_INPUT_EVENT;
  488. translated->MouseInput.X = m_key_events[0].x;
  489. translated->MouseInput.Y = m_key_events[0].y;
  490. translated->MouseInput.Shift = false;
  491. translated->MouseInput.Control = false;
  492. translated->MouseInput.ButtonStates = EMBSM_RIGHT;
  493. // update shootline
  494. m_shootline = m_device
  495. ->getSceneManager()
  496. ->getSceneCollisionManager()
  497. ->getRayFromScreenCoordinates(v2s32(m_key_events[0].x, m_key_events[0].y));
  498. translated->MouseInput.Event = EMIE_RMOUSE_PRESSED_DOWN;
  499. verbosestream << "TouchScreenGUI::translateEvent right click press" << std::endl;
  500. m_receiver->OnEvent(*translated);
  501. translated->MouseInput.ButtonStates = 0;
  502. translated->MouseInput.Event = EMIE_RMOUSE_LEFT_UP;
  503. verbosestream << "TouchScreenGUI::translateEvent right click release" << std::endl;
  504. m_receiver->OnEvent(*translated);
  505. delete translated;
  506. return true;
  507. }
  508. TouchScreenGUI::~TouchScreenGUI()
  509. {
  510. for (unsigned int i=0; i < after_last_element_id; i++) {
  511. button_info* btn = &m_buttons[i];
  512. if (btn->guibutton != 0) {
  513. btn->guibutton->drop();
  514. btn->guibutton = NULL;
  515. }
  516. }
  517. }
  518. void TouchScreenGUI::step(float dtime)
  519. {
  520. /* simulate keyboard repeats */
  521. for (unsigned int i=0; i < after_last_element_id; i++) {
  522. button_info* btn = &m_buttons[i];
  523. if (btn->ids.size() > 0) {
  524. btn->repeatcounter += dtime;
  525. if (btn->repeatcounter < 0.2) continue;
  526. btn->repeatcounter = 0;
  527. SEvent translated;
  528. memset(&translated,0,sizeof(SEvent));
  529. translated.EventType = irr::EET_KEY_INPUT_EVENT;
  530. translated.KeyInput.Key = btn->keycode;
  531. translated.KeyInput.PressedDown = false;
  532. m_receiver->OnEvent(translated);
  533. translated.KeyInput.PressedDown = true;
  534. m_receiver->OnEvent(translated);
  535. }
  536. }
  537. /* if a new placed pointer isn't moved for some time start digging */
  538. if ((m_move_id != -1) &&
  539. (!m_move_has_really_moved) &&
  540. (!m_move_sent_as_mouse_event)) {
  541. u32 delta = porting::getDeltaMs(m_move_downtime,getTimeMs());
  542. if (delta > MIN_DIG_TIME_MS) {
  543. m_shootline = m_device
  544. ->getSceneManager()
  545. ->getSceneCollisionManager()
  546. ->getRayFromScreenCoordinates(
  547. v2s32(m_move_downlocation.X,m_move_downlocation.Y));
  548. SEvent translated;
  549. memset(&translated,0,sizeof(SEvent));
  550. translated.EventType = EET_MOUSE_INPUT_EVENT;
  551. translated.MouseInput.X = m_move_downlocation.X;
  552. translated.MouseInput.Y = m_move_downlocation.Y;
  553. translated.MouseInput.Shift = false;
  554. translated.MouseInput.Control = false;
  555. translated.MouseInput.ButtonStates = EMBSM_LEFT;
  556. translated.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN;
  557. verbosestream << "TouchScreenGUI::step left click press" << std::endl;
  558. m_receiver->OnEvent(translated);
  559. m_move_sent_as_mouse_event = true;
  560. }
  561. }
  562. }
  563. void TouchScreenGUI::resetHud()
  564. {
  565. m_hud_rects.clear();
  566. }
  567. void TouchScreenGUI::registerHudItem(int index, const rect<s32> &rect)
  568. {
  569. m_hud_rects[index] = rect;
  570. }
  571. void TouchScreenGUI::Toggle(bool visible)
  572. {
  573. m_visible = visible;
  574. for (unsigned int i=0; i < after_last_element_id; i++) {
  575. button_info* btn = &m_buttons[i];
  576. if (btn->guibutton != 0) {
  577. btn->guibutton->setVisible(visible);
  578. }
  579. }
  580. }
  581. void TouchScreenGUI::Hide()
  582. {
  583. Toggle(false);
  584. }
  585. void TouchScreenGUI::Show()
  586. {
  587. Toggle(true);
  588. }