Files
audioeditor/Scripts/AudioClip.gd

108 lines
2.6 KiB
GDScript

class_name AudioClip
extends Panel
@export var clip_name: String = "New Audio Clip"
@export var start_time: float = 0.0
@export var end_time: float = 0.0
@export var track_idx: int = 0
signal on_selected
signal on_deselected
signal on_double_click
var timeline: Timeline
var dragging: bool
var selected: bool
var accumulated_movement := 0.0
var was_snapping := false
func _ready():
timeline = get_parent()
%ClipName.text = clip_name
func _input(event):
var rect = get_global_rect()
var mouse_position = get_global_mouse_position()
if event is InputEventMouseButton:
if selected and event.double_click:
print("double clicked!")
on_double_click.emit()
return
if event.pressed and event.button_mask == MOUSE_BUTTON_LEFT:
if selected:
Input.set_default_cursor_shape(Input.CursorShape.CURSOR_MOVE)
dragging = true
else:
dragging = false
Input.set_default_cursor_shape(Input.CursorShape.CURSOR_ARROW)
if rect.has_point(mouse_position):
selected = true
make_selected()
return
else:
selected = false
make_deselected()
return
if !event.pressed and dragging:
dragging = false
Input.set_default_cursor_shape(Input.CursorShape.CURSOR_ARROW)
if selected and dragging:
if event is InputEventMouseMotion:
var movement_time = event.relative.x / timeline.get_pixels_per_unit() * timeline.time_interval
var track = timeline.get_track_idx_by_y(event.position.y)
if track != -1:
track_idx = track
var clip_length = end_time - start_time
if event.is_command_or_control_pressed():
if not was_snapping:
start_time = snapped(start_time, timeline.time_interval)
end_time = start_time + clip_length
accumulated_movement = 0
was_snapping = true
accumulated_movement += movement_time
var snapped_movement = snapped(accumulated_movement, timeline.time_interval)
if snapped_movement != 0:
if start_time + snapped_movement < 0:
start_time = 0
end_time = start_time + clip_length
return
start_time += snapped_movement
end_time += snapped_movement
accumulated_movement -= snapped_movement
else:
if start_time + movement_time < 0:
start_time = 0
end_time = start_time + clip_length
return
start_time += movement_time
end_time += movement_time
was_snapping = false
timeline.queue_sort()
pass
func make_selected():
on_selected.emit()
var color = get_theme_color("selected_modulate", "AudioClip")
z_index = 1
modulate = color
pass
func make_deselected():
on_deselected.emit()
var color = get_theme_color("deselected_modulate", "AudioClip")
z_index = 0
modulate = color
pass