Timeline enhancements
This commit is contained in:
@@ -2,21 +2,70 @@
|
||||
class_name Timeline
|
||||
extends Control
|
||||
|
||||
@export var track_list: VBoxContainer
|
||||
|
||||
@export var font_scale: float = 1.0
|
||||
@export var time_offset: float = 0.0
|
||||
@export var grid_space_seconds: float = 0.25
|
||||
@export var label_interval_seconds: float = 1.0
|
||||
@export var time_interval: float = 1000.0 # 1 second
|
||||
@export var grid_space_ms: float = 250 # 0.25 seconds
|
||||
@export var label_interval_ms: float = 1000.0 # 1 second
|
||||
@export var line_thickness: int = 1
|
||||
@export var primary_line_step: int = 4
|
||||
@export var major_line_step: int = 4
|
||||
@export var cursor_width: int = 8
|
||||
@export var base_scale: float = 2.0
|
||||
@export var zoom: float = 1.0
|
||||
|
||||
@export var start_time: float = 0.0
|
||||
@export var end_time: float = 10000.0 # 10 seconds
|
||||
|
||||
@export var min_zoom: float = 0.1
|
||||
|
||||
func format_time_ms_hours(ms: float) -> String:
|
||||
var total_seconds = ms / 1000
|
||||
var hours = int(total_seconds / 3600)
|
||||
var minutes = int(total_seconds / 60) % 60
|
||||
var seconds = int(total_seconds) % 60
|
||||
var milliseconds = fmod(ms, 1000.0)
|
||||
return "%02d:%02d:%02d.%03d" % [hours, minutes, seconds, milliseconds]
|
||||
|
||||
func format_time_ms_minutes(ms: float) -> String:
|
||||
var total_seconds = ms / 1000
|
||||
var minutes = int(total_seconds / 60) % 60
|
||||
var seconds = int(total_seconds) % 60
|
||||
var milliseconds = fmod(ms, 1000.0)
|
||||
return "%02d:%02d.%03d" % [minutes, seconds, milliseconds]
|
||||
|
||||
func _draw():
|
||||
draw_intervals()
|
||||
# draw_top_time_labels()
|
||||
var primary_color = get_theme_color("line_primary_color", "Timeline")
|
||||
var secondary_color = get_theme_color("line_secondary_color", "Timeline")
|
||||
|
||||
var font = get_theme_default_font()
|
||||
var font_size = get_theme_default_font_size()
|
||||
|
||||
var time_label_offset_x = get_theme_constant("time_label_offset_x", "Timeline")
|
||||
var time_label_offset_y = get_theme_constant("time_label_offset_y", "Timeline")
|
||||
|
||||
# top panel
|
||||
var stylebox = get_theme_stylebox("top_panel", "Timeline")
|
||||
draw_style_box(stylebox, Rect2(0.0, 0.0, size.x, 28.0))
|
||||
|
||||
var timeline_y := size.y
|
||||
var screen_width := size.x
|
||||
|
||||
var pixels_per_unit := 50.0 * zoom
|
||||
|
||||
var start := (time_offset / pixels_per_unit) - 1
|
||||
var end := start + (screen_width / pixels_per_unit) + 2
|
||||
|
||||
for t in range(int(start), int(end) + 1):
|
||||
var x := t * pixels_per_unit - time_offset
|
||||
|
||||
if x >= 0 and x <= screen_width:
|
||||
if t % 4 == 0:
|
||||
draw_line(Vector2(x, 28.0), Vector2(x, size.y), primary_color, 2)
|
||||
var time = t * int(time_interval)
|
||||
draw_string(font, Vector2(x - time_label_offset_x, time_label_offset_y), format_time_ms_minutes(time), HORIZONTAL_ALIGNMENT_CENTER, -1, font_size, primary_color)
|
||||
else:
|
||||
draw_line(Vector2(x, 28.0), Vector2(x, timeline_y), secondary_color, 1)
|
||||
pass
|
||||
|
||||
func _gui_input(event):
|
||||
@@ -28,44 +77,11 @@ func _gui_input(event):
|
||||
zoom *= zoom_factor
|
||||
queue_redraw()
|
||||
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_WHEEL_LEFT:
|
||||
time_offset -= 0.1 / zoom
|
||||
time_offset -= 50 / zoom
|
||||
queue_redraw()
|
||||
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_WHEEL_RIGHT:
|
||||
time_offset += 0.1 / zoom
|
||||
time_offset += 50 / zoom
|
||||
queue_redraw()
|
||||
|
||||
zoom = max(min_zoom, zoom)
|
||||
time_offset = max(0.0, time_offset)
|
||||
|
||||
func draw_intervals():
|
||||
var font = get_theme_default_font()
|
||||
var font_size = get_theme_default_font_size()
|
||||
|
||||
var current_width = size.x
|
||||
var current_height = size.y
|
||||
|
||||
var primary_color = get_theme_color("line_primary_color", "Timeline")
|
||||
var secondary_color = get_theme_color("line_secondary_color", "Timeline")
|
||||
|
||||
var interval = grid_space_seconds * base_scale * zoom * current_width
|
||||
|
||||
var first_line_index = roundi(time_offset / grid_space_seconds)
|
||||
var first_line_position = -(time_offset - (first_line_index * grid_space_seconds)) * interval
|
||||
|
||||
var line_count = ceil(current_width / interval) + 4
|
||||
|
||||
var current_position = first_line_position
|
||||
|
||||
for i in range(first_line_index, first_line_index + line_count):
|
||||
if current_position > current_width:
|
||||
break
|
||||
|
||||
if current_position >= -interval:
|
||||
var color = secondary_color
|
||||
if i % primary_line_step == 0:
|
||||
draw_string(font, Vector2(current_position, 0), str(i * grid_space_seconds), HORIZONTAL_ALIGNMENT_CENTER, -1, font_size * font_scale)
|
||||
color = primary_color
|
||||
|
||||
draw_line(Vector2(current_position, 0), Vector2(current_position, current_height), color, line_thickness)
|
||||
|
||||
current_position += interval
|
||||
|
||||
Reference in New Issue
Block a user