mirror of
https://github.com/luanti-org/luanti.git
synced 2025-10-17 18:35:20 +02:00
Touch UI support for desktop builds (#10729)
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
set(extra_gui_SRCS "")
|
||||
if(ENABLE_TOUCH)
|
||||
set(extra_gui_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/touchscreengui.cpp)
|
||||
endif()
|
||||
|
||||
set(gui_SRCS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/guiAnimatedImage.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/guiBackgroundImage.cpp
|
||||
@@ -25,5 +30,6 @@ set(gui_SRCS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/guiVolumeChange.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/modalMenu.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/profilergraph.cpp
|
||||
${extra_gui_SRCS}
|
||||
PARENT_SCOPE
|
||||
)
|
||||
|
@@ -28,6 +28,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "guiEditBoxWithScrollbar.h"
|
||||
#include "porting.h"
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
#include "client/renderingengine.h"
|
||||
#endif
|
||||
|
||||
#include "gettext.h"
|
||||
|
||||
// Continuing from guiPasswordChange.cpp
|
||||
@@ -45,7 +49,7 @@ GUIConfirmRegistration::GUIConfirmRegistration(gui::IGUIEnvironment *env,
|
||||
m_client(client), m_playername(playername), m_password(password),
|
||||
m_aborted(aborted), m_tsrc(tsrc)
|
||||
{
|
||||
#ifdef __ANDROID__
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
m_touchscreen_visible = false;
|
||||
#endif
|
||||
}
|
||||
@@ -73,8 +77,8 @@ void GUIConfirmRegistration::regenerateGui(v2u32 screensize)
|
||||
/*
|
||||
Calculate new sizes and positions
|
||||
*/
|
||||
#ifdef __ANDROID__
|
||||
const float s = m_gui_scale * porting::getDisplayDensity() / 2;
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
const float s = m_gui_scale * RenderingEngine::getDisplayDensity() / 2;
|
||||
#else
|
||||
const float s = m_gui_scale;
|
||||
#endif
|
||||
|
@@ -308,7 +308,7 @@ void GUIFormSpecMenu::parseSize(parserData* data, const std::string &element)
|
||||
data->invsize.Y = MYMAX(0, stof(parts[1]));
|
||||
|
||||
lockSize(false);
|
||||
#ifndef __ANDROID__
|
||||
#ifndef HAVE_TOUCHSCREENGUI
|
||||
if (parts.size() == 3) {
|
||||
if (parts[2] == "true") {
|
||||
lockSize(true,v2u32(800,600));
|
||||
@@ -3278,7 +3278,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
|
||||
((15.0 / 13.0) * (0.85 + mydata.invsize.Y));
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
// In Android, the preferred imgsize should be larger to accommodate the
|
||||
// smaller screensize.
|
||||
double prefer_imgsize = padded_screensize.Y / 10 * gui_scaling;
|
||||
@@ -3741,7 +3741,7 @@ void GUIFormSpecMenu::showTooltip(const std::wstring &text,
|
||||
v2u32 screenSize = Environment->getVideoDriver()->getScreenSize();
|
||||
int tooltip_offset_x = m_btn_height;
|
||||
int tooltip_offset_y = m_btn_height;
|
||||
#ifdef __ANDROID__
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
tooltip_offset_x *= 3;
|
||||
tooltip_offset_y = 0;
|
||||
if (m_pointer.X > (s32)screenSize.X / 2)
|
||||
|
@@ -25,6 +25,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
#include <IGUIStaticText.h>
|
||||
#include <IGUIFont.h>
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
#include "client/renderingengine.h"
|
||||
#endif
|
||||
|
||||
#include "porting.h"
|
||||
#include "gettext.h"
|
||||
|
||||
@@ -79,8 +83,8 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize)
|
||||
/*
|
||||
Calculate new sizes and positions
|
||||
*/
|
||||
#ifdef __ANDROID__
|
||||
const float s = m_gui_scale * porting::getDisplayDensity() / 2;
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
const float s = m_gui_scale * RenderingEngine::getDisplayDensity() / 2;
|
||||
#else
|
||||
const float s = m_gui_scale;
|
||||
#endif
|
||||
|
@@ -77,9 +77,10 @@ GUITable::GUITable(gui::IGUIEnvironment *env,
|
||||
setTabStop(true);
|
||||
setTabOrder(-1);
|
||||
updateAbsolutePosition();
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
float density = 1; // dp scaling is applied by the skin
|
||||
#else
|
||||
float density = RenderingEngine::getDisplayDensity();
|
||||
#ifdef __ANDROID__
|
||||
density = 1; // dp scaling is applied by the skin
|
||||
#endif
|
||||
core::rect<s32> relative_rect = m_scrollbar->getRelativePosition();
|
||||
s32 width = (relative_rect.getWidth() / (2.0 / 3.0)) * density *
|
||||
|
@@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
#include "touchscreengui.h"
|
||||
#include "client/renderingengine.h"
|
||||
#endif
|
||||
|
||||
// clang-format off
|
||||
@@ -40,8 +41,8 @@ GUIModalMenu::GUIModalMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent,
|
||||
m_remap_dbl_click(remap_dbl_click)
|
||||
{
|
||||
m_gui_scale = g_settings->getFloat("gui_scaling");
|
||||
#ifdef __ANDROID__
|
||||
float d = porting::getDisplayDensity();
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
float d = RenderingEngine::getDisplayDensity();
|
||||
m_gui_scale *= 1.1 - 0.3 * d + 0.2 * d * d;
|
||||
#endif
|
||||
setVisible(true);
|
||||
@@ -183,7 +184,7 @@ static bool isChild(gui::IGUIElement *tocheck, gui::IGUIElement *parent)
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
|
||||
bool GUIModalMenu::simulateMouseEvent(
|
||||
gui::IGUIElement *target, ETOUCH_INPUT_EVENT touch_event)
|
||||
@@ -217,6 +218,8 @@ bool GUIModalMenu::simulateMouseEvent(
|
||||
|
||||
void GUIModalMenu::enter(gui::IGUIElement *hovered)
|
||||
{
|
||||
if (!hovered)
|
||||
return;
|
||||
sanity_check(!m_hovered);
|
||||
m_hovered.grab(hovered);
|
||||
SEvent gui_event{};
|
||||
@@ -286,7 +289,9 @@ bool GUIModalMenu::preprocessEvent(const SEvent &event)
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
if (event.EventType == EET_TOUCH_INPUT_EVENT) {
|
||||
irr_ptr<GUIModalMenu> holder;
|
||||
holder.grab(this); // keep this alive until return (it might be dropped downstream [?])
|
||||
|
@@ -75,10 +75,10 @@ protected:
|
||||
v2u32 m_screensize_old;
|
||||
float m_gui_scale;
|
||||
#ifdef __ANDROID__
|
||||
v2s32 m_down_pos;
|
||||
std::string m_jni_field_name;
|
||||
#endif
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
v2s32 m_down_pos;
|
||||
bool m_touchscreen_visible = true;
|
||||
#endif
|
||||
|
||||
@@ -102,7 +102,7 @@ private:
|
||||
// wants to launch other menus
|
||||
bool m_allow_focus_removal = false;
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
irr_ptr<gui::IGUIElement> m_hovered;
|
||||
|
||||
bool simulateMouseEvent(gui::IGUIElement *target, ETOUCH_INPUT_EVENT touch_event);
|
||||
|
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "util/numeric.h"
|
||||
#include "porting.h"
|
||||
#include "client/guiscalingfilter.h"
|
||||
#include "client/renderingengine.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
@@ -426,7 +427,7 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver)
|
||||
m_joystick_triggers_aux1 = g_settings->getBool("virtual_joystick_triggers_aux1");
|
||||
m_screensize = m_device->getVideoDriver()->getScreenSize();
|
||||
button_size = MYMIN(m_screensize.Y / 4.5f,
|
||||
porting::getDisplayDensity() *
|
||||
RenderingEngine::getDisplayDensity() *
|
||||
g_settings->getFloat("hud_scaling") * 65.0f);
|
||||
}
|
||||
|
||||
@@ -668,9 +669,9 @@ void TouchScreenGUI::handleReleaseEvent(size_t evt_id)
|
||||
if (button != after_last_element_id) {
|
||||
// handle button events
|
||||
handleButtonEvent(button, evt_id, false);
|
||||
} else if (evt_id == m_move_id) {
|
||||
} else if (m_has_move_id && evt_id == m_move_id) {
|
||||
// handle the point used for moving view
|
||||
m_move_id = -1;
|
||||
m_has_move_id = false;
|
||||
|
||||
// if this pointer issued a mouse event issue symmetric release here
|
||||
if (m_move_sent_as_mouse_event) {
|
||||
@@ -692,8 +693,8 @@ void TouchScreenGUI::handleReleaseEvent(size_t evt_id)
|
||||
}
|
||||
|
||||
// handle joystick
|
||||
else if (evt_id == m_joystick_id) {
|
||||
m_joystick_id = -1;
|
||||
else if (m_has_joystick_id && evt_id == m_joystick_id) {
|
||||
m_has_joystick_id = false;
|
||||
|
||||
// reset joystick
|
||||
for (unsigned int i = 0; i < 4; i++)
|
||||
@@ -776,7 +777,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
|
||||
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.0f)) {
|
||||
// If we don't already have a starting point for joystick make this the one.
|
||||
if (m_joystick_id == -1) {
|
||||
if (!m_has_joystick_id) {
|
||||
m_has_joystick_id = true;
|
||||
m_joystick_id = event.TouchInput.ID;
|
||||
m_joystick_has_really_moved = false;
|
||||
|
||||
@@ -796,7 +798,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
|
||||
}
|
||||
} else {
|
||||
// If we don't already have a moving point make this the moving one.
|
||||
if (m_move_id == -1) {
|
||||
if (!m_has_move_id) {
|
||||
m_has_move_id = true;
|
||||
m_move_id = event.TouchInput.ID;
|
||||
m_move_has_really_moved = false;
|
||||
m_move_downtime = porting::getTimeMs();
|
||||
@@ -819,7 +822,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
|
||||
v2s32(event.TouchInput.X, event.TouchInput.Y))
|
||||
return;
|
||||
|
||||
if (m_move_id != -1) {
|
||||
if (m_has_move_id) {
|
||||
if ((event.TouchInput.ID == m_move_id) &&
|
||||
(!m_move_sent_as_mouse_event)) {
|
||||
|
||||
@@ -862,7 +865,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
|
||||
}
|
||||
}
|
||||
|
||||
if (m_joystick_id != -1 && event.TouchInput.ID == m_joystick_id) {
|
||||
if (m_has_joystick_id && event.TouchInput.ID == m_joystick_id) {
|
||||
s32 X = event.TouchInput.X;
|
||||
s32 Y = event.TouchInput.Y;
|
||||
|
||||
@@ -941,7 +944,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
|
||||
}
|
||||
}
|
||||
|
||||
if (m_move_id == -1 && m_joystick_id == -1)
|
||||
if (!m_has_move_id && !m_has_joystick_id)
|
||||
handleChangedButton(event);
|
||||
}
|
||||
}
|
||||
@@ -1086,7 +1089,7 @@ void TouchScreenGUI::step(float dtime)
|
||||
button.repeatcounter += dtime;
|
||||
|
||||
// in case we're moving around digging does not happen
|
||||
if (m_move_id != -1)
|
||||
if (m_has_move_id)
|
||||
m_move_has_really_moved = true;
|
||||
|
||||
if (button.repeatcounter < button.repeatdelay)
|
||||
@@ -1114,7 +1117,7 @@ void TouchScreenGUI::step(float dtime)
|
||||
}
|
||||
|
||||
// if a new placed pointer isn't moved for some time start digging
|
||||
if ((m_move_id != -1) &&
|
||||
if (m_has_move_id &&
|
||||
(!m_move_has_really_moved) &&
|
||||
(!m_move_sent_as_mouse_event)) {
|
||||
|
||||
|
@@ -228,13 +228,15 @@ private:
|
||||
*/
|
||||
line3d<f32> m_shootline;
|
||||
|
||||
int m_move_id = -1;
|
||||
bool m_has_move_id = false;
|
||||
size_t m_move_id;
|
||||
bool m_move_has_really_moved = false;
|
||||
u64 m_move_downtime = 0;
|
||||
bool m_move_sent_as_mouse_event = false;
|
||||
v2s32 m_move_downlocation = v2s32(-10000, -10000);
|
||||
|
||||
int m_joystick_id = -1;
|
||||
bool m_has_joystick_id = false;
|
||||
size_t m_joystick_id;
|
||||
bool m_joystick_has_really_moved = false;
|
||||
bool m_fixed_joystick = false;
|
||||
bool m_joystick_triggers_aux1 = false;
|
||||
|
Reference in New Issue
Block a user