From 7301a65acdf0ef60dd11e7855976a2b800521229 Mon Sep 17 00:00:00 2001 From: dnesov Date: Sun, 16 Feb 2025 22:12:22 +0100 Subject: [PATCH] Finalize audio clip movement, fix being able to drag audio clips out of bounds. --- Scripts/AudioClip.gd | 34 +++++++++++++++++++++++++--------- Scripts/Timeline.gd | 10 +++++++--- Views/TrackView.tscn | 1 + 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Scripts/AudioClip.gd b/Scripts/AudioClip.gd index a91919e..33a27fb 100644 --- a/Scripts/AudioClip.gd +++ b/Scripts/AudioClip.gd @@ -15,6 +15,9 @@ 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 @@ -50,10 +53,7 @@ func _input(event): 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 movement_time = event.relative.x / timeline.get_pixels_per_unit() * timeline.time_interval var track = timeline.get_track_idx_by_y(event.position.y) @@ -61,12 +61,28 @@ func _input(event): 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 + 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: - start_time += movement.x - end_time += movement.x + if start_time + movement_time < 0: + return + start_time += movement_time + end_time += movement_time + was_snapping = false timeline.queue_sort() pass diff --git a/Scripts/Timeline.gd b/Scripts/Timeline.gd index bdf94a2..cd2bc39 100644 --- a/Scripts/Timeline.gd +++ b/Scripts/Timeline.gd @@ -35,6 +35,11 @@ func format_time_ms_minutes(ms: float) -> String: var milliseconds = fmod(ms, 1000.0) return "%02d:%02d.%03d" % [minutes, seconds, milliseconds] +func _ready(): + await get_tree().process_frame + queue_redraw() + pass + func get_track_idx_by_y(y: float): var idx = 0 @@ -133,14 +138,13 @@ func _gui_input(event): time_offset = max(0.0, time_offset) func local_x_to_timeline(x: float) -> float: - return (x / get_pixels_per_unit()) * time_interval + time_offset + return (x + time_offset) / get_pixels_per_unit() * time_interval func clip_dropped(at_position: Vector2, clip_name: String, clip_start_time: float, clip_end_time: float): var local_position = at_position - global_position var timeline_position = local_x_to_timeline(local_position.x) - print(timeline_position) - print(time_offset) + var track_idx = get_track_idx_by_y(at_position.y) add_audio_clip(clip_name, track_idx, timeline_position + clip_start_time, timeline_position + clip_end_time) pass diff --git a/Views/TrackView.tscn b/Views/TrackView.tscn index fddcf83..7da74d5 100644 --- a/Views/TrackView.tscn +++ b/Views/TrackView.tscn @@ -31,6 +31,7 @@ layout_mode = 2 script = null [node name="Track2" parent="VBoxContainer/TrackList" instance=ExtResource("1_ueogm")] +custom_minimum_size = Vector2(128, 74) layout_mode = 2 script = null