85 lines
2.1 KiB
GDScript
85 lines
2.1 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
|
|
|
|
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 = event.relative / timeline.get_pixels_per_unit() * timeline.time_interval
|
|
|
|
var mouse_position_timeline = (timeline.get_local_mouse_position().x / timeline.get_pixels_per_unit()) * timeline.time_interval
|
|
var mouse_position_snapped = snapped(mouse_position_timeline, timeline.time_interval)
|
|
|
|
var track = timeline.get_track_idx_by_y(event.position.y)
|
|
|
|
if track != -1:
|
|
track_idx = track
|
|
|
|
if event.is_command_or_control_pressed():
|
|
var clip_length = end_time - start_time
|
|
start_time = mouse_position_snapped
|
|
end_time = start_time + clip_length
|
|
else:
|
|
start_time += movement.x
|
|
end_time += movement.x
|
|
|
|
timeline.queue_sort()
|
|
pass
|
|
|
|
func make_selected():
|
|
on_selected.emit()
|
|
var color = get_theme_color("selected_modulate", "AudioClip")
|
|
modulate = color
|
|
pass
|
|
|
|
func make_deselected():
|
|
on_deselected.emit()
|
|
var color = get_theme_color("deselected_modulate", "AudioClip")
|
|
modulate = color
|
|
pass
|