mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Support both mouse and touch input in GUIs in a single binary (#14146)
This commit is contained in:
parent
4f1dbb127a
commit
32e492837c
5 changed files with 95 additions and 83 deletions
|
@ -3656,22 +3656,18 @@ void GUIFormSpecMenu::drawMenu()
|
|||
NULL, m_client, IT_ROT_HOVERED);
|
||||
}
|
||||
|
||||
// On touchscreens, m_pointer is set by GUIModalMenu::preprocessEvent instead.
|
||||
#ifndef HAVE_TOUCHSCREENGUI
|
||||
m_pointer = RenderingEngine::get_raw_device()->getCursorControl()->getPosition();
|
||||
#endif
|
||||
|
||||
/*
|
||||
Draw fields/buttons tooltips and update the mouse cursor
|
||||
*/
|
||||
gui::IGUIElement *hovered =
|
||||
Environment->getRootGUIElement()->getElementFromPoint(m_pointer);
|
||||
|
||||
#ifndef HAVE_TOUCHSCREENGUI
|
||||
gui::ICursorControl *cursor_control = RenderingEngine::get_raw_device()->
|
||||
getCursorControl();
|
||||
gui::ECURSOR_ICON current_cursor_icon = cursor_control->getActiveIcon();
|
||||
#endif
|
||||
gui::ECURSOR_ICON current_cursor_icon = gui::ECI_NORMAL;
|
||||
if (cursor_control)
|
||||
current_cursor_icon = cursor_control->getActiveIcon();
|
||||
|
||||
bool hovered_element_found = false;
|
||||
|
||||
if (hovered) {
|
||||
|
@ -3715,11 +3711,10 @@ void GUIFormSpecMenu::drawMenu()
|
|||
m_tooltips[field.fname].bgcolor);
|
||||
}
|
||||
|
||||
#ifndef HAVE_TOUCHSCREENGUI
|
||||
if (field.ftype != f_HyperText && // Handled directly in guiHyperText
|
||||
if (cursor_control &&
|
||||
field.ftype != f_HyperText && // Handled directly in guiHyperText
|
||||
current_cursor_icon != field.fcursor_icon)
|
||||
cursor_control->setActiveIcon(field.fcursor_icon);
|
||||
#endif
|
||||
|
||||
hovered_element_found = true;
|
||||
|
||||
|
@ -3730,10 +3725,8 @@ void GUIFormSpecMenu::drawMenu()
|
|||
|
||||
if (!hovered_element_found) {
|
||||
// no element is hovered
|
||||
#ifndef HAVE_TOUCHSCREENGUI
|
||||
if (current_cursor_icon != ECI_NORMAL)
|
||||
if (cursor_control && current_cursor_icon != ECI_NORMAL)
|
||||
cursor_control->setActiveIcon(ECI_NORMAL);
|
||||
#endif
|
||||
}
|
||||
|
||||
m_tooltip_element->draw();
|
||||
|
@ -3764,16 +3757,13 @@ 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 HAVE_TOUCHSCREENGUI
|
||||
tooltip_offset_x *= 3;
|
||||
tooltip_offset_y = 0;
|
||||
if (m_pointer.X > (s32)screenSize.X / 2)
|
||||
tooltip_offset_x = -(tooltip_offset_x + tooltip_width);
|
||||
|
||||
// Hide tooltip after ETIE_LEFT_UP
|
||||
if (m_pointer.X == 0)
|
||||
return;
|
||||
#endif
|
||||
if (m_pointer_type == PointerType::Touch) {
|
||||
tooltip_offset_x *= 3;
|
||||
tooltip_offset_y = 0;
|
||||
if (m_pointer.X > (s32)screenSize.X / 2)
|
||||
tooltip_offset_x = -(tooltip_offset_x + tooltip_width);
|
||||
}
|
||||
|
||||
// Calculate and set the tooltip position
|
||||
s32 tooltip_x = m_pointer.X + tooltip_offset_x;
|
||||
|
@ -4070,6 +4060,11 @@ void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode)
|
|||
|
||||
bool GUIFormSpecMenu::preprocessEvent(const SEvent& event)
|
||||
{
|
||||
// This must be done first so that GUIModalMenu can set m_pointer_type
|
||||
// correctly.
|
||||
if (GUIModalMenu::preprocessEvent(event))
|
||||
return true;
|
||||
|
||||
// The IGUITabControl renders visually using the skin's selected
|
||||
// font, which we override for the duration of form drawing,
|
||||
// but computes tab hotspots based on how it would have rendered
|
||||
|
@ -4147,7 +4142,7 @@ bool GUIFormSpecMenu::preprocessEvent(const SEvent& event)
|
|||
return handled;
|
||||
}
|
||||
|
||||
return GUIModalMenu::preprocessEvent(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void GUIFormSpecMenu::tryClose()
|
||||
|
@ -4326,14 +4321,12 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
// The second touch (see GUIModalMenu::preprocessEvent() function)
|
||||
ButtonEventType touch = BET_OTHER;
|
||||
if (event.EventType == EET_TOUCH_INPUT_EVENT) {
|
||||
if (event.TouchInput.Event == ETIE_LEFT_UP)
|
||||
touch = BET_RIGHT;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Set this number to a positive value to generate a move action
|
||||
// from m_selected_item to s.
|
||||
|
@ -4678,7 +4671,6 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
|
|||
break;
|
||||
}
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
if (touch == BET_RIGHT && m_selected_item && !m_left_dragging) {
|
||||
if (!s.isValid()) {
|
||||
// Not a valid slot
|
||||
|
@ -4698,7 +4690,6 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Update left-dragged slots
|
||||
if (m_left_dragging && m_left_drag_stacks.size() > 1) {
|
||||
|
@ -5067,10 +5058,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_TOUCHSCREENGUI
|
||||
if (m_second_touch)
|
||||
return true; // Stop propagating the event
|
||||
#endif
|
||||
|
||||
return Parent ? Parent->OnEvent(event) : false;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue