mirror of
https://github.com/Cuteminded/jellyframe.git
synced 2026-10-18 23:00:29 +02:00
This change replaces the old playback button strip with a transparent overlay attached to the movie screen. It adds a seekable timeline, duration reporting, and proper seek routing for resumed/transcoded streams while preserving paused state and overlay behavior across settings and recenter actions. Pointer and scroll handling were also hardened to improve controller input stability, including hover tracking, exit handling, aim smoothing, and synthetic wheel release events. Regression tests and testing notes were extended to cover overlay toggling, timeline formatting, seek flows, recenter behavior, and pointer/scroll edge cases.
72 lines
2.1 KiB
GDScript
72 lines
2.1 KiB
GDScript
class_name PointerInput
|
|
extends RefCounted
|
|
|
|
var viewport: SubViewport
|
|
var trigger_down := false
|
|
var just_pressed := false
|
|
var mouse_down := false
|
|
var previous := Vector2(-1, -1)
|
|
var hovering := false
|
|
|
|
func sample_trigger(value: float) -> void:
|
|
var next := value > 0.15 if trigger_down else value >= 0.35
|
|
just_pressed = next and not trigger_down
|
|
trigger_down = next
|
|
|
|
func aim(point: Vector2, inside: bool) -> void:
|
|
if not inside:
|
|
cancel()
|
|
return
|
|
if not hovering:
|
|
hovering = true
|
|
viewport.notify_mouse_entered()
|
|
_move(point)
|
|
if just_pressed:
|
|
if OS.is_debug_build() and OS.get_name() == "Android":
|
|
var hovered := viewport.gui_get_hovered_control()
|
|
print("Jellyframe input: press at ", point.round(), " target=", hovered.get_class() if hovered else "none")
|
|
mouse_down = true
|
|
_button(true)
|
|
elif mouse_down and not trigger_down:
|
|
mouse_down = false
|
|
_button(false)
|
|
|
|
func scroll(point: Vector2, amount: float) -> void:
|
|
var wheel := InputEventMouseButton.new()
|
|
wheel.button_index = MOUSE_BUTTON_WHEEL_UP if amount > 0 else MOUSE_BUTTON_WHEEL_DOWN
|
|
wheel.pressed = true
|
|
wheel.position = point
|
|
wheel.global_position = point
|
|
wheel.factor = absf(amount)
|
|
viewport.push_input(wheel, true)
|
|
var release := wheel.duplicate() as InputEventMouseButton
|
|
release.pressed = false
|
|
viewport.push_input(release, true)
|
|
|
|
func cancel() -> void:
|
|
if previous != Vector2(-1, -1): _move(Vector2(-1, -1))
|
|
if mouse_down:
|
|
mouse_down = false
|
|
_button(false)
|
|
if hovering:
|
|
hovering = false
|
|
viewport.notify_mouse_exited()
|
|
|
|
func _move(point: Vector2) -> void:
|
|
var motion := InputEventMouseMotion.new()
|
|
motion.position = point
|
|
motion.global_position = point
|
|
motion.relative = point - previous
|
|
motion.button_mask = MOUSE_BUTTON_MASK_LEFT if mouse_down else 0
|
|
previous = point
|
|
viewport.push_input(motion, true)
|
|
|
|
func _button(pressed: bool) -> void:
|
|
var event := InputEventMouseButton.new()
|
|
event.button_index = MOUSE_BUTTON_LEFT
|
|
event.pressed = pressed
|
|
event.button_mask = MOUSE_BUTTON_MASK_LEFT if pressed else 0
|
|
event.position = previous
|
|
event.global_position = previous
|
|
viewport.push_input(event, true)
|