Expand Up
@@ -34,19 +34,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include < ISceneCollisionManager.h>
// Very slow button repeat frequency (in seconds)
#define SLOW_BUTTON_REPEAT (1 .0f )
using namespace irr ::core;
const char **touchgui_button_imagenames = (const char *[]) {
const char **button_imagenames = (const char *[]) {
" jump_btn.png" ,
" down.png" ,
" zoom.png" ,
" aux_btn.png"
};
const char **touchgui_joystick_imagenames = (const char *[]) {
const char **joystick_imagenames = (const char *[]) {
" joystick_off.png" ,
" joystick_bg.png" ,
" joystick_center.png"
Expand Down
Expand Up
@@ -113,15 +110,17 @@ static irr::EKEY_CODE id2keycode(touch_gui_button_id id)
case range_id:
key = " rangeselect" ;
break ;
default :
break ;
}
assert (key != " " );
assert (!key. empty () );
return keyname_to_keycode (g_settings->get (" keymap_" + key).c_str ());
}
TouchScreenGUI *g_touchscreengui;
static void load_button_texture (button_info *btn, const char *path,
rect<s32> button_rect, ISimpleTextureSource *tsrc, video::IVideoDriver *driver)
const rect<s32> & button_rect, ISimpleTextureSource *tsrc, video::IVideoDriver *driver)
{
unsigned int tid;
video::ITexture *texture = guiScalingImageButton (driver,
Expand All
@@ -141,7 +140,7 @@ static void load_button_texture(button_info *btn, const char *path,
}
btn->guibutton ->setDrawBorder (false );
btn->guibutton ->setText (L" " );
}
}
}
AutoHideButtonBar::AutoHideButtonBar (IrrlichtDevice *device,
Expand All
@@ -153,8 +152,8 @@ AutoHideButtonBar::AutoHideButtonBar(IrrlichtDevice *device,
}
void AutoHideButtonBar::init (ISimpleTextureSource *tsrc,
const char *starter_img, int button_id, v2s32 UpperLeft,
v2s32 LowerRight, autohide_button_bar_dir dir, float timeout)
const char *starter_img, int button_id, const v2s32 & UpperLeft,
const v2s32 & LowerRight, autohide_button_bar_dir dir, float timeout)
{
m_texturesource = tsrc;
Expand All
@@ -166,7 +165,7 @@ void AutoHideButtonBar::init(ISimpleTextureSource *tsrc,
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 = m_guienv->addButton (current_button, nullptr , button_id, L" " , nullptr );
m_starter.guibutton ->grab ();
m_starter.repeatcounter = -1 ;
m_starter.keycode = KEY_OEM_8; // use invalid keycode as it's not relevant
Expand Down
Expand Up
@@ -201,16 +200,14 @@ void AutoHideButtonBar::addButton(touch_gui_button_id button_id,
}
int button_size = 0 ;
if ((m_dir == AHBB_Dir_Top_Bottom) || (m_dir == AHBB_Dir_Bottom_Top)) {
if ((m_dir == AHBB_Dir_Top_Bottom) || (m_dir == AHBB_Dir_Bottom_Top))
button_size = m_lower_right.X - m_upper_left.X ;
} else {
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 ;
Expand All
@@ -227,8 +224,8 @@ void AutoHideButtonBar::addButton(touch_gui_button_id button_id,
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 ;
double y_start = 0 ;
double y_end = 0 ;
if (m_dir == AHBB_Dir_Top_Bottom) {
y_start = m_lower_right.X + (button_size * 1.25 * m_buttons.size ())
Expand All
@@ -240,12 +237,13 @@ void AutoHideButtonBar::addButton(touch_gui_button_id button_id,
y_start = y_end - button_size;
}
current_button = rect<s32>(m_upper_left.X , y_start, m_lower_right. Y ,
y_end);
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 );
auto *btn = new button_info ();
btn->guibutton = m_guienv->addButton (current_button,
nullptr , button_id, caption, nullptr );
btn->guibutton ->grab ();
btn->guibutton ->setVisible (false );
btn->guibutton ->setEnabled (false );
Expand Down
Expand Up
@@ -275,26 +273,23 @@ bool AutoHideButtonBar::isButton(const SEvent &event)
{
IGUIElement *rootguielement = m_guienv->getRootGUIElement ();
if (rootguielement == NULL ) {
if (rootguielement == nullptr )
return false ;
}
gui::IGUIElement *element = rootguielement->getElementFromPoint (
core::position2d<s32>(event.TouchInput .X , event.TouchInput .Y ));
if (element == NULL ) {
if (element == nullptr )
return false ;
}
if (m_active) {
// check for all buttons in vector
std::vector<button_info *>::iterator iter = m_buttons.begin ();
auto iter = m_buttons.begin ();
while (iter != m_buttons.end ()) {
if ((*iter)->guibutton == element) {
SEvent *translated = new SEvent ();
auto *translated = new SEvent ();
memset (translated, 0 , sizeof (SEvent));
translated->EventType = irr::EET_KEY_INPUT_EVENT;
translated->KeyInput .Key = (*iter)->keycode ;
Expand Down
Expand Up
@@ -341,7 +336,7 @@ bool AutoHideButtonBar::isButton(const SEvent &event)
m_active = true ;
m_timeout = 0 ;
std::vector<button_info*>::iterator iter = m_buttons.begin ();
auto iter = m_buttons.begin ();
while (iter != m_buttons.end ()) {
(*iter)->guibutton ->setVisible (true );
Expand All
@@ -355,41 +350,13 @@ bool AutoHideButtonBar::isButton(const SEvent &event)
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) {
if (m_timeout > m_timeout_value)
deactivate ();
}
}
}
Expand All
@@ -401,11 +368,11 @@ void AutoHideButtonBar::deactivate()
}
m_active = false ;
std::vector<button_info *>::iterator iter = m_buttons.begin ();
auto iter = m_buttons.begin ();
while (iter != m_buttons.end ()) {
(*iter)->guibutton ->setVisible (false );
(*iter)->guibutton ->setEnabled (false );
(*iter)->guibutton ->setVisible (false );
(*iter)->guibutton ->setEnabled (false );
++iter;
}
}
Expand All
@@ -416,7 +383,7 @@ void AutoHideButtonBar::hide()
m_starter.guibutton ->setVisible (false );
m_starter.guibutton ->setEnabled (false );
std::vector<button_info *>::iterator iter = m_buttons.begin ();
auto iter = m_buttons.begin ();
while (iter != m_buttons.end ()) {
(*iter)->guibutton ->setVisible (false );
Expand All
@@ -430,7 +397,7 @@ void AutoHideButtonBar::show()
m_visible = true ;
if (m_active) {
std::vector<button_info *>::iterator iter = m_buttons.begin ();
auto iter = m_buttons.begin ();
while (iter != m_buttons.end ()) {
(*iter)->guibutton ->setVisible (true );
Expand All
@@ -450,67 +417,56 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver)
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;
for (auto &button : m_buttons ) {
button .guibutton = nullptr ;
button .repeatcounter = -1 ;
button .repeatdelay = BUTTON_REPEAT_DELAY;
}
m_touchscreen_threshold = g_settings->getU16 (" touchscreen_threshold" );
m_fixed_joystick = g_settings->getBool (" fixed_virtual_joystick" );
m_joystick_triggers_special1 = g_settings->getBool (" virtual_joystick_triggers_aux" );
m_screensize = m_device->getVideoDriver ()->getScreenSize ();
button_size = MYMIN (m_screensize.Y / 4 .5f ,
porting::getDisplayDensity () *
g_settings->getFloat (" hud_scaling" ) * 65 .0f );
}
void TouchScreenGUI::initButton (touch_gui_button_id id, rect<s32> button_rect,
std::wstring caption, bool immediate_release, float repeat_delay)
void TouchScreenGUI::initButton (touch_gui_button_id id, const rect<s32> & button_rect,
const std::wstring & caption, bool immediate_release, float repeat_delay)
{
button_info *btn = &m_buttons[id];
btn->guibutton = m_guienv->addButton (button_rect, 0 , id, caption.c_str ());
btn->guibutton = m_guienv->addButton (button_rect, nullptr , id, caption.c_str ());
btn->guibutton ->grab ();
btn->repeatcounter = -1 ;
btn->repeatdelay = repeat_delay;
btn->keycode = id2keycode (id);
btn->immediate_release = immediate_release;
btn->ids .clear ();
load_button_texture (btn, touchgui_button_imagenames [id], button_rect,
load_button_texture (btn, button_imagenames [id], button_rect,
m_texturesource, m_device->getVideoDriver ());
}
button_info *TouchScreenGUI::initJoystickButton (touch_gui_button_id id, rect<s32> button_rect,
int texture_id, bool visible)
button_info *TouchScreenGUI::initJoystickButton (touch_gui_button_id id,
const rect<s32> &button_rect, int texture_id, bool visible)
{
button_info *btn = new button_info ();
btn->guibutton = m_guienv->addButton (button_rect, 0 , id, L" O" );
auto *btn = new button_info ();
btn->guibutton = m_guienv->addButton (button_rect, nullptr , id, L" O" );
btn->guibutton ->setVisible (visible);
btn->guibutton ->grab ();
btn->ids .clear ();
load_button_texture (btn, touchgui_joystick_imagenames [texture_id], button_rect ,
m_texturesource, m_device->getVideoDriver ());
load_button_texture (btn, joystick_imagenames [texture_id],
button_rect, m_texturesource, m_device->getVideoDriver ());
return btn;
}
static int getMaxControlPadSize (float density) {
return 200 * density * g_settings->getFloat (" hud_scaling" );
}
int TouchScreenGUI::getGuiButtonSize ()
{
u32 control_pad_size = MYMIN ((2 * m_screensize.Y ) / 3 ,
getMaxControlPadSize (porting::getDisplayDensity ()));
return control_pad_size / 3 ;
}
void TouchScreenGUI::init (ISimpleTextureSource *tsrc)
{
assert (tsrc);
u32 button_size = getGuiButtonSize ();
m_visible = true ;
m_texturesource = tsrc;
Expand Down
Expand Up
@@ -608,35 +564,31 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc)
m_rarecontrolsbar.addButton (chat_id, L" Chat" , " chat_btn.png" );
m_rarecontrolsbar.addButton (inventory_id, L" inv" , " inventory_btn.png" );
m_rarecontrolsbar.addButton (drop_id, L" drop" , " drop_btn.png" );
}
touch_gui_button_id TouchScreenGUI::getButtonID (s32 x, s32 y)
{
IGUIElement *rootguielement = m_guienv->getRootGUIElement ();
if (rootguielement != NULL ) {
if (rootguielement != nullptr ) {
gui::IGUIElement *element =
rootguielement->getElementFromPoint (core::position2d<s32>(x, y));
if (element) {
for (unsigned int i= 0 ; i < after_last_element_id; i++) {
if (element == m_buttons[i].guibutton ) {
if (element)
for (unsigned int i = 0 ; i < after_last_element_id; i++)
if (element == m_buttons[i].guibutton )
return (touch_gui_button_id) i;
}
}
}
}
return after_last_element_id;
}
touch_gui_button_id TouchScreenGUI::getButtonID (int eventID)
touch_gui_button_id TouchScreenGUI::getButtonID (size_t eventID)
{
for (unsigned int i= 0 ; i < after_last_element_id; i++) {
for (unsigned int i = 0 ; i < after_last_element_id; i++) {
button_info *btn = &m_buttons[i];
std::vector<int >::iterator id =
std::find (btn->ids .begin (), btn->ids .end (), eventID);
auto id = std::find (btn->ids .begin (), btn->ids .end (), eventID);
if (id != btn->ids .end ())
return (touch_gui_button_id) i;
Expand All
@@ -648,55 +600,30 @@ touch_gui_button_id TouchScreenGUI::getButtonID(int eventID)
bool TouchScreenGUI::isHUDButton (const SEvent &event)
{
// check if hud item is pressed
for (std::map<int , rect<s32> >::iterator iter = m_hud_rects.begin ();
iter != m_hud_rects.end (); ++iter) {
if (iter->second .isPointInside (
v2s32 (event.TouchInput .X ,
event.TouchInput .Y )
)) {
if ( iter->first < 8 ) {
SEvent *translated = new SEvent ();
memset (translated, 0 , sizeof (SEvent));
translated->EventType = irr::EET_KEY_INPUT_EVENT;
translated->KeyInput .Key = (irr::EKEY_CODE) (KEY_KEY_1 + iter->first );
translated->KeyInput .Control = false ;
translated->KeyInput .Shift = false ;
translated->KeyInput .PressedDown = true ;
m_receiver->OnEvent (*translated);
m_hud_ids[event.TouchInput .ID ] = translated->KeyInput .Key ;
delete translated;
return true ;
}
for (auto &hud_rect : m_hud_rects) {
if (hud_rect.second .isPointInside (v2s32 (event.TouchInput .X ,
event.TouchInput .Y ))) {
auto *translated = new SEvent ();
memset (translated, 0 , sizeof (SEvent));
translated->EventType = irr::EET_KEY_INPUT_EVENT;
translated->KeyInput .Key = (irr::EKEY_CODE) (KEY_KEY_1 + hud_rect.first );
translated->KeyInput .Control = false ;
translated->KeyInput .Shift = false ;
translated->KeyInput .PressedDown = true ;
m_receiver->OnEvent (*translated);
m_hud_ids[event.TouchInput .ID ] = translated->KeyInput .Key ;
delete translated;
return true ;
}
}
return false ;
}
bool TouchScreenGUI::isReleaseHUDButton (int eventID)
{
std::map<int , irr::EKEY_CODE>::iterator iter = m_hud_ids.find (eventID);
if (iter != m_hud_ids.end ()) {
SEvent *translated = new SEvent ();
memset (translated, 0 , sizeof (SEvent));
translated->EventType = irr::EET_KEY_INPUT_EVENT;
translated->KeyInput .Key = iter->second ;
translated->KeyInput .PressedDown = false ;
translated->KeyInput .Control = false ;
translated->KeyInput .Shift = false ;
m_receiver->OnEvent (*translated);
m_hud_ids.erase (iter);
delete translated;
return true ;
}
return false ;
}
void TouchScreenGUI::handleButtonEvent (touch_gui_button_id button,
int eventID, bool action)
size_t eventID, bool action)
{
button_info *btn = &m_buttons[button];
SEvent *translated = new SEvent ();
auto *translated = new SEvent ();
memset (translated, 0 , sizeof (SEvent));
translated->EventType = irr::EET_KEY_INPUT_EVENT;
translated->KeyInput .Key = btn->keycode ;
Expand All
@@ -717,16 +644,16 @@ void TouchScreenGUI::handleButtonEvent(touch_gui_button_id button,
translated->KeyInput .Key = btn->keycode ;
m_receiver->OnEvent (*translated);
}
// remove event
if ((!action) || (btn->immediate_release )) {
std::vector<int >::iterator pos =
std::find (btn->ids .begin (), btn->ids .end (), eventID);
auto pos = std::find (btn->ids .begin (), btn->ids .end (), eventID);
// has to be in touch list
assert (pos != btn->ids .end ());
btn->ids .erase (pos);
if (btn->ids .size () > 0 ) { return ; }
if (!btn->ids .empty ())
return ;
translated->KeyInput .PressedDown = false ;
btn->repeatcounter = -1 ;
Expand All
@@ -735,30 +662,21 @@ void TouchScreenGUI::handleButtonEvent(touch_gui_button_id button,
delete translated;
}
void TouchScreenGUI::handleReleaseEvent (int evt_id)
void TouchScreenGUI::handleReleaseEvent (size_t evt_id)
{
touch_gui_button_id button = getButtonID (evt_id);
// handle button events
if (button != after_last_element_id) {
// handle button events
handleButtonEvent (button, evt_id, false );
}
// handle hud button events
else if (isReleaseHUDButton (evt_id)) {
// nothing to do here
} else if (m_settingsbar.isReleaseButton (evt_id)) {
// nothing to do here
} else if (m_rarecontrolsbar.isReleaseButton (evt_id)) {
// nothing to do here
}
// handle the point used for moving view
else if (evt_id == m_move_id) {
} else if (evt_id == m_move_id) {
// handle the point used for moving view
m_move_id = -1 ;
// if this pointer issued a mouse event issue symmetric release here
if (m_move_sent_as_mouse_event) {
SEvent *translated = new SEvent;
auto *translated = new SEvent;
memset (translated, 0 , sizeof (SEvent));
translated->EventType = EET_MOUSE_INPUT_EVENT;
translated->MouseInput .X = m_move_downlocation.X ;
Expand All
@@ -769,32 +687,31 @@ void TouchScreenGUI::handleReleaseEvent(int evt_id)
translated->MouseInput .Event = EMIE_LMOUSE_LEFT_UP;
m_receiver->OnEvent (*translated);
delete translated;
}
else {
} else {
// do double tap detection
doubleTapDetection ();
}
}
// handle joystick
else if (evt_id == m_joystick_id) {
m_joystick_id = -1 ;
// reset joystick
for (unsigned int i = 0 ; i < 4 ; i ++)
for (unsigned int i = 0 ; i < 4 ; i++)
m_joystick_status[i] = false ;
applyJoystickStatus ();
m_joystick_btn_off->guibutton ->setVisible (true );
m_joystick_btn_bg->guibutton ->setVisible (false );
m_joystick_btn_center->guibutton ->setVisible (false );
}
else {
} else {
infostream
<< " TouchScreenGUI::translateEvent released unknown button: "
<< evt_id << std::endl;
}
for (std::vector<id_status>::iterator iter = m_known_ids.begin ();
for (auto iter = m_known_ids.begin ();
iter != m_known_ids.end (); ++iter) {
if (iter->id == evt_id) {
m_known_ids.erase (iter);
Expand All
@@ -806,18 +723,19 @@ void TouchScreenGUI::handleReleaseEvent(int evt_id)
void TouchScreenGUI::translateEvent (const SEvent &event)
{
if (!m_visible) {
infostream << " TouchScreenGUI::translateEvent got event but not visible?!" << std::endl;
infostream
<< " TouchScreenGUI::translateEvent got event but not visible!"
<< std::endl;
return ;
}
if (event.EventType != EET_TOUCH_INPUT_EVENT) {
if (event.EventType != EET_TOUCH_INPUT_EVENT)
return ;
}
if (event.TouchInput .Event == ETIE_PRESSED_DOWN) {
/* add to own copy of eventlist ...
* android would provide this information but irrlicht guys don't
/*
* Add to own copy of event list ...
* android would provide this information but Irrlicht guys don't
* wanna design a efficient interface
*/
id_status toadd;
Expand All
@@ -826,7 +744,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
toadd.Y = event.TouchInput .Y ;
m_known_ids.push_back (toadd);
int eventID = event.TouchInput .ID ;
size_t eventID = event.TouchInput .ID ;
touch_gui_button_id button =
getButtonID (event.TouchInput .X , event.TouchInput .Y );
Expand All
@@ -846,21 +764,19 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
} else if (m_rarecontrolsbar.isButton (event)) {
m_settingsbar.deactivate ();
// already handled in isSettingsBarButton()
}
// handle non button events
else {
} else {
// handle non button events
m_settingsbar.deactivate ();
m_rarecontrolsbar.deactivate ();
u32 button_size = getGuiButtonSize ();
s32 dxj = event.TouchInput .X - button_size * 5 / 2 ;
s32 dyj = event.TouchInput .Y - m_screensize.Y + button_size * 5 / 2 ;
s32 dxj = event.TouchInput .X - button_size * 5 .0f / 2 .0f ;
s32 dyj = event.TouchInput .Y - m_screensize.Y + button_size * 5 .0f / 2 .0f ;
/* Select joystick when left 1/3 of screen dragged or
* when joystick tapped (fixed joystick position)
*/
if ((m_fixed_joystick && dxj * dxj + dyj * dyj <= button_size * button_size * 1.5 * 1.5 ) ||
(!m_fixed_joystick && event.TouchInput .X < m_screensize.X / 3 )) {
(!m_fixed_joystick && event.TouchInput .X < m_screensize.X / 3 . 0f )) {
// If we don't already have a starting point for joystick make this the one.
if (m_joystick_id == -1 ) {
m_joystick_id = event.TouchInput .ID ;
Expand All
@@ -871,14 +787,14 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
m_joystick_btn_center->guibutton ->setVisible (true );
// If it's a fixed joystick, don't move the joystick "button".
if (!m_fixed_joystick) {
if (!m_fixed_joystick)
m_joystick_btn_bg->guibutton ->setRelativePosition (v2s32 (
event.TouchInput .X - button_size * 3 / 2 ,
event.TouchInput .Y - button_size * 3 / 2 ));
}
event.TouchInput .X - button_size * 3 . 0f / 2 . 0f ,
event.TouchInput .Y - button_size * 3 . 0f / 2 . 0f ));
m_joystick_btn_center->guibutton ->setRelativePosition (v2s32 (
event.TouchInput .X - button_size / 2 ,
event.TouchInput .Y - button_size / 2 ));
event.TouchInput .X - button_size / 2 . 0f ,
event.TouchInput .Y - button_size / 2 . 0f ));
}
} else {
// If we don't already have a moving point make this the moving one.
Expand All
@@ -895,17 +811,15 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
m_pointerpos[event.TouchInput .ID ] = v2s32 (event.TouchInput .X , event.TouchInput .Y );
}
else if (event.TouchInput .Event == ETIE_LEFT_UP) {
verbosestream << " Up event for pointerid: " << event.TouchInput .ID << std::endl;
verbosestream
<< " Up event for pointerid: " << event.TouchInput .ID << std::endl;
handleReleaseEvent (event.TouchInput .ID );
}
else {
} else {
assert (event.TouchInput .Event == ETIE_MOVED);
int move_idx = event.TouchInput .ID ;
if (m_pointerpos[event.TouchInput .ID ] ==
v2s32 (event.TouchInput .X , event.TouchInput .Y )) {
v2s32 (event.TouchInput .X , event.TouchInput .Y ))
return ;
}
if (m_move_id != -1 ) {
if ((event.TouchInput .ID == m_move_id) &&
Expand All
@@ -928,9 +842,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
s32 dy = Y - m_pointerpos[event.TouchInput .ID ].Y ;
// adapt to similar behaviour as pc screen
double d = g_settings->getFloat (" mouse_sensitivity" ) * 4 ;
double old_yaw = m_camera_yaw_change;
double old_pitch = m_camera_pitch;
double d = g_settings->getFloat (" mouse_sensitivity" ) * 3 .0f ;
m_camera_yaw_change -= dx * d;
m_camera_pitch = MYMIN (MYMAX (m_camera_pitch + (dy * d), -180 ), 180 );
Expand All
@@ -942,8 +854,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
->getRayFromScreenCoordinates (v2s32 (X, Y));
m_pointerpos[event.TouchInput .ID ] = v2s32 (X, Y);
}
}
else if ((event.TouchInput .ID == m_move_id) &&
} else if ((event.TouchInput .ID == m_move_id) &&
(m_move_sent_as_mouse_event)) {
m_shootline = m_device
->getSceneManager ()
Expand All
@@ -954,7 +865,6 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
}
if (m_joystick_id != -1 && event.TouchInput .ID == m_joystick_id) {
u32 button_size = getGuiButtonSize ();
s32 X = event.TouchInput .X ;
s32 Y = event.TouchInput .Y ;
Expand All
@@ -967,8 +877,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
double distance_sq = dx * dx + dy * dy;
s32 dxj = event.TouchInput .X - button_size * 5 / 2 ;
s32 dyj = event.TouchInput .Y - m_screensize.Y + button_size * 5 / 2 ;
s32 dxj = event.TouchInput .X - button_size * 5 . 0f / 2 . 0f ;
s32 dyj = event.TouchInput .Y - m_screensize.Y + button_size * 5 . 0f / 2 . 0f ;
bool inside_joystick = (dxj * dxj + dyj * dyj <= button_size * button_size * 1.5 * 1.5 );
if (m_joystick_has_really_moved ||
Expand All
@@ -986,8 +896,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
angle = fmod (angle + 180 + 22.5 , 360 );
// reset state before applying
for (unsigned int i = 0 ; i < 5 ; i ++ )
m_joystick_status[i] = false ;
for (bool & joystick_status : m_joystick_status )
joystick_status = false ;
if (distance <= m_touchscreen_threshold) {
// do nothing
Expand Down
Expand Up
@@ -1016,8 +926,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
if (distance > button_size) {
m_joystick_status[j_special1] = true ;
// move joystick "button"
s32 ndx = (s32) button_size * dx / distance - (s32) button_size / 2 ;
s32 ndy = (s32) button_size * dy / distance - (s32) button_size / 2 ;
s32 ndx = button_size * dx / distance - button_size / 2 . 0f ;
s32 ndy = button_size * dy / distance - button_size / 2 . 0f ;
if (m_fixed_joystick) {
m_joystick_btn_center->guibutton ->setRelativePosition (v2s32 (
button_size * 5 / 2 + ndx,
Expand All
@@ -1028,64 +938,54 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
m_pointerpos[event.TouchInput .ID ].Y + ndy));
}
} else {
m_joystick_btn_center->guibutton ->setRelativePosition (v2s32 (
X - button_size / 2 , Y - button_size / 2 ));
m_joystick_btn_center->guibutton ->setRelativePosition (
v2s32 ( X - button_size / 2 , Y - button_size / 2 ));
}
}
}
if (m_move_id == -1 && m_joystick_id == -1 ) {
if (m_move_id == -1 && m_joystick_id == -1 )
handleChangedButton (event);
}
}
}
void TouchScreenGUI::handleChangedButton (const SEvent &event)
{
for (unsigned int i = 0 ; i < after_last_element_id; i++) {
if (m_buttons[i].ids .empty ()) {
if (m_buttons[i].ids .empty ())
continue ;
}
for (std::vector<int >::iterator iter = m_buttons[i].ids .begin ();
iter != m_buttons[i].ids .end (); ++iter) {
for (auto iter = m_buttons[i].ids .begin ();
iter != m_buttons[i].ids .end (); ++iter) {
if (event.TouchInput .ID == *iter) {
int current_button_id =
getButtonID (event.TouchInput .X , event.TouchInput .Y );
if (current_button_id == i) {
if (current_button_id == i)
continue ;
}
// remove old button
handleButtonEvent ((touch_gui_button_id) i, *iter, false );
if (current_button_id == after_last_element_id) {
if (current_button_id == after_last_element_id)
return ;
}
handleButtonEvent ((touch_gui_button_id) current_button_id, *iter, true );
return ;
}
}
}
int current_button_id = getButtonID (event.TouchInput .X , event.TouchInput .Y );
if (current_button_id == after_last_element_id) {
if (current_button_id == after_last_element_id)
return ;
}
button_info *btn = &m_buttons[current_button_id];
if (std::find (btn->ids .begin (), btn->ids .end (), event.TouchInput .ID )
== btn->ids .end ())
{
handleButtonEvent ((touch_gui_button_id) current_button_id,
event.TouchInput .ID , true );
}
}
bool TouchScreenGUI::doubleTapDetection ()
Expand All
@@ -1102,14 +1002,15 @@ bool TouchScreenGUI::doubleTapDetection()
return false ;
double distance = sqrt (
(m_key_events[0 ].x - m_key_events[1 ].x ) * (m_key_events[0 ].x - m_key_events[1 ].x ) +
(m_key_events[0 ].y - m_key_events[1 ].y ) * (m_key_events[0 ].y - m_key_events[1 ].y ));
(m_key_events[0 ].x - m_key_events[1 ].x ) *
(m_key_events[0 ].x - m_key_events[1 ].x ) +
(m_key_events[0 ].y - m_key_events[1 ].y ) *
(m_key_events[0 ].y - m_key_events[1 ].y ));
if (distance > (20 + m_touchscreen_threshold))
return false ;
SEvent *translated = new SEvent ();
auto *translated = new SEvent ();
memset (translated, 0 , sizeof (SEvent));
translated->EventType = EET_MOUSE_INPUT_EVENT;
translated->MouseInput .X = m_key_events[0 ].x ;
Expand All
@@ -1129,21 +1030,20 @@ bool TouchScreenGUI::doubleTapDetection()
m_receiver->OnEvent (*translated);
translated->MouseInput .ButtonStates = 0 ;
translated->MouseInput .Event = EMIE_RMOUSE_LEFT_UP;
translated->MouseInput .Event = EMIE_RMOUSE_LEFT_UP;
verbosestream << " TouchScreenGUI::translateEvent right click release" << std::endl;
m_receiver->OnEvent (*translated);
delete translated;
return true ;
}
void TouchScreenGUI::applyJoystickStatus ()
{
for (unsigned int i = 0 ; i < 5 ; i ++) {
for (unsigned int i = 0 ; i < 5 ; i++) {
if (i == 4 && !m_joystick_triggers_special1)
continue ;
SEvent translated{} ;
SEvent translated;
translated.EventType = irr::EET_KEY_INPUT_EVENT;
translated.KeyInput .Key = id2keycode (m_joystick_names[i]);
translated.KeyInput .PressedDown = false ;
Expand All
@@ -1158,50 +1058,48 @@ void TouchScreenGUI::applyJoystickStatus()
TouchScreenGUI::~TouchScreenGUI ()
{
for (unsigned int i = 0 ; i < after_last_element_id; i++) {
button_info *btn = &m_buttons[i];
if (btn->guibutton ) {
btn->guibutton ->drop ();
btn->guibutton = NULL ;
for (auto &button : m_buttons) {
if (button.guibutton ) {
button.guibutton ->drop ();
button.guibutton = nullptr ;
}
}
if (m_joystick_btn_off->guibutton ) {
m_joystick_btn_off->guibutton ->drop ();
m_joystick_btn_off->guibutton = NULL ;
m_joystick_btn_off->guibutton = nullptr ;
}
if (m_joystick_btn_bg->guibutton ) {
m_joystick_btn_bg->guibutton ->drop ();
m_joystick_btn_bg->guibutton = NULL ;
m_joystick_btn_bg->guibutton = nullptr ;
}
if (m_joystick_btn_center->guibutton ) {
m_joystick_btn_center->guibutton ->drop ();
m_joystick_btn_center->guibutton = NULL ;
m_joystick_btn_center->guibutton = nullptr ;
}
}
void TouchScreenGUI::step (float dtime)
{
// simulate keyboard repeats
for (unsigned int i = 0 ; i < after_last_element_id; i++) {
button_info *btn = &m_buttons[i];
if (btn->ids .size () > 0 ) {
btn->repeatcounter += dtime;
for (auto &button : m_buttons) {
if (!button.ids .empty ()) {
button.repeatcounter += dtime;
// in case we're moving around digging does not happen
if (m_move_id != -1 )
m_move_has_really_moved = true ;
if (btn->repeatcounter < btn->repeatdelay ) continue ;
if (button.repeatcounter < button.repeatdelay )
continue ;
btn-> repeatcounter = 0 ;
button. repeatcounter = 0 ;
SEvent translated;
memset (&translated, 0 , sizeof (SEvent));
translated.EventType = irr::EET_KEY_INPUT_EVENT;
translated.KeyInput .Key = btn-> keycode ;
translated.KeyInput .Key = button. keycode ;
translated.KeyInput .PressedDown = false ;
m_receiver->OnEvent (translated);
Expand Down
Expand Up
@@ -1264,22 +1162,18 @@ void TouchScreenGUI::registerHudItem(int index, const rect<s32> &rect)
void TouchScreenGUI::Toggle (bool visible)
{
m_visible = visible;
for (unsigned int i = 0 ; i < after_last_element_id; i++) {
button_info *btn = &m_buttons[i];
if (btn->guibutton ) {
btn->guibutton ->setVisible (visible);
}
for (auto &button : m_buttons) {
if (button.guibutton )
button.guibutton ->setVisible (visible);
}
if (m_joystick_btn_off->guibutton ) {
if (m_joystick_btn_off->guibutton )
m_joystick_btn_off->guibutton ->setVisible (visible);
}
// clear all active buttons
if (!visible) {
while (m_known_ids.size () > 0 ) {
while (! m_known_ids.empty ())
handleReleaseEvent (m_known_ids.begin ()->id );
}
m_settingsbar.hide ();
m_rarecontrolsbar.hide ();
Expand Down