Tooltip improvements and bug fixes

* Disabled tooltips on android devices
* Improved screen boundary detection to avoid overflow
* Improved readability and padding
* Fixed the existence of tooltip parameter causing massive lag spikes on hover/unhover events (even when tooltips were disabled) by patching the related engine focus function
This commit is contained in:
LoafyLemon 2023-03-23 21:25:38 +00:00
parent 2e0dbeb8c4
commit f29f8aecfe
3 changed files with 63 additions and 25 deletions

View File

@ -1,20 +1,20 @@
default _tooltip = None
screen tooltip(): screen tooltip():
layer "interface" layer "interface"
tag tooltip tag tooltip
zorder 5 zorder 5
style_prefix "tooltip" style_prefix "tooltip"
$ tooltip = GetTooltip() if settings.get("tooltip") and _tooltip:
if settings.get("tooltip") and tooltip:
window: window:
id tooltip id "tooltip"
at tooltip_follow at tooltip_follow
text "[tooltip]" text "[_tooltip]"
style tooltip_window is empty: style tooltip_window is empty:
background "#00000080" background "#00000080"
padding (12, 6) padding (18, 12)
xmaximum 300 xmaximum 300
style tooltip_text is default: style tooltip_text is default:
@ -30,12 +30,22 @@ init python:
def tooltip_func(trans, st, at): def tooltip_func(trans, st, at):
x, y = renpy.get_mouse_pos() x, y = renpy.get_mouse_pos()
xanchor = 1.0 if (x > 980) else 0.0
yanchor = 1.0 if (y > 500) else 0.0
xoffset = 11 if xanchor else 0
yoffset = 14 if yanchor else 0
trans.pos = (x, y)
trans.anchor = (xanchor, yanchor)
trans.offset = (xoffset, yoffset)
return 0 if trans.pos is not (x, y):
cw, ch = trans.child.window_size
xanchor = 1.0 if (x + int(cw)) > (config.screen_width) else 0.0
yanchor = 1.0 if (y + int(ch)) > (config.screen_height) else 0.0
xoffset = 18 if xanchor else 0
yoffset = 24 if yanchor else 0
trans.pos = (x, y)
trans.anchor = (xanchor, yanchor)
trans.offset = (xoffset, yoffset)
return 0
if not renpy.android:
config.always_shown_screens.append("tooltip")
config.per_frame_screens.append("tooltip")

View File

@ -1,21 +1,14 @@
# The game starts here
label start: label start:
if not renpy.android:
show screen tooltip
python: python:
version = version_float() version = version_float()
renpy.block_rollback() renpy.block_rollback()
jump start_wt jump start_wt
label start_quick: label start_quick:
if not renpy.android:
show screen tooltip
python: python:
version = version_float()
game.difficulty = 2 game.difficulty = 2
ton_friendship = 5 ton_friendship = 5
sna_friendship = 5 sna_friendship = 5
@ -27,10 +20,8 @@ label start_quick:
jump skip_to_hermione jump skip_to_hermione
label start_dev: label start_dev:
if not renpy.android:
show screen tooltip
python: python:
version = version_float()
game.difficulty = 2 game.difficulty = 2
game.cheats = True game.cheats = True
game.gold = 100000 game.gold = 100000

View File

@ -86,3 +86,40 @@ python early hide:
return rv return rv
renpy.list_files = _list_files renpy.list_files = _list_files
# Default focus behaviour restarts the interaction whenever
# any element that contains a tooltip is being hovered or unhovered.
# Restarting interactions in a short timespan causes massive lag spikes,
# in order to fix it, we'll refresh just the tooltip screen and skip the rest.
def set_focused(widget, arg, screen):
global _tooltip
renpy.display.focus.argument = arg
renpy.display.focus.screen_of_focused = screen
if screen is not None:
renpy.display.focus.screen_of_focused_names = { screen.screen_name[0], screen.tag }
else:
renpy.display.focus.screen_of_focused_names = set()
renpy.game.context().scene_lists.focused = widget
renpy.display.tts.displayable(widget)
# Figure out the tooltip.
_tooltip = widget._get_tooltip() if widget else None
# setattr(renpy.store, "widget", widget) # DEBUG
# if renpy.display.focus.tooltip != new_tooltip:
# renpy.display.focus.tooltip = new_tooltip
# renpy.display.focus.capture_focus("tooltip")
# renpy.exports.restart_interaction()
# if renpy.display.focus.tooltip is not None:
# renpy.display.focus.last_tooltip = renpy.display.focus.tooltip
# renpy.display.focus.screen_of_last_focused_names = renpy.display.focus.screen_of_focused_names
renpy.display.focus.set_focused = set_focused