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 if event.is_command_or_control_pressed(): if not was_snapping: var clip_length = end_time - start_time 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: return start_time += snapped_movement end_time += snapped_movement accumulated_movement -= snapped_movement else: if start_time + movement_time < 0: 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") modulate = color pass func make_deselected(): on_deselected.emit() var color = get_theme_color("deselected_modulate", "AudioClip") modulate = color pass