Browse Source

various bug fixes and small features

Jonathan Higgins 7 months ago
parent
commit
ad942a3600

+ 2 - 2
.gitattributes

@@ -1,2 +1,2 @@
-# Auto detect text files and perform LF normalization
-* text=auto
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf

+ 4 - 3
.gitignore

@@ -1,5 +1,6 @@
+# Godot 4+ specific ignores
 .godot/
-.tmp_audio/
-/export_presets.cfg
-/splash.xcf
+/android/
+/.tmp_audio
+splash.xcf
 /theme/images/icon.xcf

+ 4 - 4
examples/navigating.thd

@@ -12,7 +12,7 @@
 				"y": 316.363647460938
 			},
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@1520/@MarginContainer@1560/Tree/@Popup@1546/@VBoxContainer@1547/@HSlider@1555": 0.0
+				"AudioPlayer/FileDialog/@VBoxContainer@1166/@MarginContainer@1206/Tree/@Popup@1192/@VBoxContainer@1193/@HSlider@1201": 0.0
 			}
 		},
 		{
@@ -33,7 +33,7 @@
 			"command": "notes",
 			"name": "notes",
 			"notes": {
-				"CodeEdit": "Right click anywhere in SoundThread to bring up the main menu.\n\nThis menu lists all the available processes in SoundThread. Click the + next to a process to add it to your Thread.\n\nNodes can be dragged around to rearrange and you can copy and paste nodes with ctrl/cmd+c and ctrl/cmd+v.\n\n"
+				"CodeEdit": "Right click anywhere in SoundThread to bring up the main menu.\n\nThis menu lists the available processes in SoundThread. Click the + next to a process to add it to your Thread.\n\nNodes can be dragged around to rearrange and you can copy and paste nodes with ctrl/cmd+c and ctrl/cmd+v."
 			},
 			"offset": {
 				"x": 479.373718261719,
@@ -47,7 +47,7 @@
 			"command": "notes",
 			"name": "notes2",
 			"notes": {
-				"CodeEdit": "Click and drag on the background to select multiple nodes at once.\n\nPressing Delete on your keyboard will remove any selected nodes. Note: \"Input File\" and \"Output File\" can't be deleted.\n\nSoundThread allows you to undo most major changes with ctrl/cmd+z. Please note this not yet fully implemented."
+				"CodeEdit": "Click and drag on the background to select multiple nodes at once.\n\nPressing Backspace/Delete will remove selected nodes. Note: \"Input File\" and \"Output File\" can't be deleted.\n\nSoundThread allows you to undo most major changes with ctrl/cmd+z. Please note this not yet fully implemented."
 			},
 			"offset": {
 				"x": 934.262573242188,
@@ -68,7 +68,7 @@
 				"y": 100.202033996582
 			},
 			"slider_values": {
-				"AudioPlayer/FileDialog/@VBoxContainer@1412/@MarginContainer@1452/Tree/@Popup@1438/@VBoxContainer@1439/@HSlider@1447": 0.0
+				"AudioPlayer/FileDialog/@VBoxContainer@1298/@MarginContainer@1338/Tree/@Popup@1324/@VBoxContainer@1325/@HSlider@1333": 0.0
 			}
 		}
 	]

+ 362 - 0
export_presets.cfg

@@ -0,0 +1,362 @@
+[preset.0]
+
+name="Windows Desktop"
+platform="Windows Desktop"
+runnable=true
+advanced_options=true
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter="*.thd, export_presets.cfg"
+exclude_filter=""
+export_path="../SoundThread_Exports/SoundThread.exe"
+patches=PackedStringArray()
+encryption_include_filters=""
+encryption_exclude_filters=""
+seed=0
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.0.options]
+
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=0
+binary_format/embed_pck=true
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
+binary_format/architecture="x86_64"
+codesign/enable=false
+codesign/timestamp=true
+codesign/timestamp_server_url=""
+codesign/digest_algorithm=1
+codesign/description=""
+codesign/custom_options=PackedStringArray()
+application/modify_resources=true
+application/icon=""
+application/console_wrapper_icon=""
+application/icon_interpolation=4
+application/file_version="0.1.1"
+application/product_version="0.1.1"
+application/company_name=""
+application/product_name="SoundThread"
+application/file_description="Node Based UI for CDP"
+application/copyright=""
+application/trademarks=""
+application/export_angle=0
+application/export_d3d12=0
+application/d3d12_agility_sdk_multiarch=true
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
+$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
+$trigger = New-ScheduledTaskTrigger -Once -At 00:00
+$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
+$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
+Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
+Start-ScheduledTask -TaskName godot_remote_debug
+while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
+ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
+Remove-Item -Recurse -Force '{temp_dir}'"
+
+[preset.1]
+
+name="macOS"
+platform="macOS"
+runnable=true
+advanced_options=false
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter="*.thd, export_presets.cfg"
+exclude_filter=""
+export_path="../SoundThread_Exports/SoundThread-hidpicheck.zip"
+patches=PackedStringArray()
+encryption_include_filters=""
+encryption_exclude_filters=""
+seed=0
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.1.options]
+
+export/distribution_type=1
+binary_format/architecture="universal"
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=0
+application/icon=""
+application/icon_interpolation=4
+application/bundle_identifier="com.jphiggins.soundthread"
+application/signature=""
+application/app_category="Music"
+application/short_version=""
+application/version=""
+application/copyright=""
+application/copyright_localized={}
+application/min_macos_version_x86_64="10.12"
+application/min_macos_version_arm64="11.00"
+application/export_angle=0
+display/high_res=true
+application/additional_plist_content=""
+xcode/platform_build="14C18"
+xcode/sdk_version="13.1"
+xcode/sdk_build="22C55"
+xcode/sdk_name="macosx13.1"
+xcode/xcode_version="1420"
+xcode/xcode_build="14C18"
+codesign/codesign=1
+codesign/installer_identity=""
+codesign/apple_team_id=""
+codesign/identity=""
+codesign/entitlements/custom_file=""
+codesign/entitlements/allow_jit_code_execution=false
+codesign/entitlements/allow_unsigned_executable_memory=false
+codesign/entitlements/allow_dyld_environment_variables=false
+codesign/entitlements/disable_library_validation=true
+codesign/entitlements/audio_input=false
+codesign/entitlements/camera=false
+codesign/entitlements/location=false
+codesign/entitlements/address_book=false
+codesign/entitlements/calendars=false
+codesign/entitlements/photos_library=false
+codesign/entitlements/apple_events=true
+codesign/entitlements/debugging=false
+codesign/entitlements/app_sandbox/enabled=false
+codesign/entitlements/app_sandbox/network_server=false
+codesign/entitlements/app_sandbox/network_client=false
+codesign/entitlements/app_sandbox/device_usb=false
+codesign/entitlements/app_sandbox/device_bluetooth=false
+codesign/entitlements/app_sandbox/files_downloads=0
+codesign/entitlements/app_sandbox/files_pictures=0
+codesign/entitlements/app_sandbox/files_music=0
+codesign/entitlements/app_sandbox/files_movies=0
+codesign/entitlements/app_sandbox/files_user_selected=0
+codesign/entitlements/app_sandbox/helper_executables=[]
+codesign/entitlements/additional=""
+codesign/custom_options=PackedStringArray()
+notarization/notarization=0
+privacy/microphone_usage_description=""
+privacy/microphone_usage_description_localized={}
+privacy/camera_usage_description=""
+privacy/camera_usage_description_localized={}
+privacy/location_usage_description=""
+privacy/location_usage_description_localized={}
+privacy/address_book_usage_description=""
+privacy/address_book_usage_description_localized={}
+privacy/calendar_usage_description=""
+privacy/calendar_usage_description_localized={}
+privacy/photos_library_usage_description=""
+privacy/photos_library_usage_description_localized={}
+privacy/desktop_folder_usage_description=""
+privacy/desktop_folder_usage_description_localized={}
+privacy/documents_folder_usage_description=""
+privacy/documents_folder_usage_description_localized={}
+privacy/downloads_folder_usage_description=""
+privacy/downloads_folder_usage_description_localized={}
+privacy/network_volumes_usage_description=""
+privacy/network_volumes_usage_description_localized={}
+privacy/removable_volumes_usage_description=""
+privacy/removable_volumes_usage_description_localized={}
+privacy/tracking_enabled=false
+privacy/tracking_domains=PackedStringArray()
+privacy/collected_data/name/collected=false
+privacy/collected_data/name/linked_to_user=false
+privacy/collected_data/name/used_for_tracking=false
+privacy/collected_data/name/collection_purposes=0
+privacy/collected_data/email_address/collected=false
+privacy/collected_data/email_address/linked_to_user=false
+privacy/collected_data/email_address/used_for_tracking=false
+privacy/collected_data/email_address/collection_purposes=0
+privacy/collected_data/phone_number/collected=false
+privacy/collected_data/phone_number/linked_to_user=false
+privacy/collected_data/phone_number/used_for_tracking=false
+privacy/collected_data/phone_number/collection_purposes=0
+privacy/collected_data/physical_address/collected=false
+privacy/collected_data/physical_address/linked_to_user=false
+privacy/collected_data/physical_address/used_for_tracking=false
+privacy/collected_data/physical_address/collection_purposes=0
+privacy/collected_data/other_contact_info/collected=false
+privacy/collected_data/other_contact_info/linked_to_user=false
+privacy/collected_data/other_contact_info/used_for_tracking=false
+privacy/collected_data/other_contact_info/collection_purposes=0
+privacy/collected_data/health/collected=false
+privacy/collected_data/health/linked_to_user=false
+privacy/collected_data/health/used_for_tracking=false
+privacy/collected_data/health/collection_purposes=0
+privacy/collected_data/fitness/collected=false
+privacy/collected_data/fitness/linked_to_user=false
+privacy/collected_data/fitness/used_for_tracking=false
+privacy/collected_data/fitness/collection_purposes=0
+privacy/collected_data/payment_info/collected=false
+privacy/collected_data/payment_info/linked_to_user=false
+privacy/collected_data/payment_info/used_for_tracking=false
+privacy/collected_data/payment_info/collection_purposes=0
+privacy/collected_data/credit_info/collected=false
+privacy/collected_data/credit_info/linked_to_user=false
+privacy/collected_data/credit_info/used_for_tracking=false
+privacy/collected_data/credit_info/collection_purposes=0
+privacy/collected_data/other_financial_info/collected=false
+privacy/collected_data/other_financial_info/linked_to_user=false
+privacy/collected_data/other_financial_info/used_for_tracking=false
+privacy/collected_data/other_financial_info/collection_purposes=0
+privacy/collected_data/precise_location/collected=false
+privacy/collected_data/precise_location/linked_to_user=false
+privacy/collected_data/precise_location/used_for_tracking=false
+privacy/collected_data/precise_location/collection_purposes=0
+privacy/collected_data/coarse_location/collected=false
+privacy/collected_data/coarse_location/linked_to_user=false
+privacy/collected_data/coarse_location/used_for_tracking=false
+privacy/collected_data/coarse_location/collection_purposes=0
+privacy/collected_data/sensitive_info/collected=false
+privacy/collected_data/sensitive_info/linked_to_user=false
+privacy/collected_data/sensitive_info/used_for_tracking=false
+privacy/collected_data/sensitive_info/collection_purposes=0
+privacy/collected_data/contacts/collected=false
+privacy/collected_data/contacts/linked_to_user=false
+privacy/collected_data/contacts/used_for_tracking=false
+privacy/collected_data/contacts/collection_purposes=0
+privacy/collected_data/emails_or_text_messages/collected=false
+privacy/collected_data/emails_or_text_messages/linked_to_user=false
+privacy/collected_data/emails_or_text_messages/used_for_tracking=false
+privacy/collected_data/emails_or_text_messages/collection_purposes=0
+privacy/collected_data/photos_or_videos/collected=false
+privacy/collected_data/photos_or_videos/linked_to_user=false
+privacy/collected_data/photos_or_videos/used_for_tracking=false
+privacy/collected_data/photos_or_videos/collection_purposes=0
+privacy/collected_data/audio_data/collected=false
+privacy/collected_data/audio_data/linked_to_user=false
+privacy/collected_data/audio_data/used_for_tracking=false
+privacy/collected_data/audio_data/collection_purposes=0
+privacy/collected_data/gameplay_content/collected=false
+privacy/collected_data/gameplay_content/linked_to_user=false
+privacy/collected_data/gameplay_content/used_for_tracking=false
+privacy/collected_data/gameplay_content/collection_purposes=0
+privacy/collected_data/customer_support/collected=false
+privacy/collected_data/customer_support/linked_to_user=false
+privacy/collected_data/customer_support/used_for_tracking=false
+privacy/collected_data/customer_support/collection_purposes=0
+privacy/collected_data/other_user_content/collected=false
+privacy/collected_data/other_user_content/linked_to_user=false
+privacy/collected_data/other_user_content/used_for_tracking=false
+privacy/collected_data/other_user_content/collection_purposes=0
+privacy/collected_data/browsing_history/collected=false
+privacy/collected_data/browsing_history/linked_to_user=false
+privacy/collected_data/browsing_history/used_for_tracking=false
+privacy/collected_data/browsing_history/collection_purposes=0
+privacy/collected_data/search_hhistory/collected=false
+privacy/collected_data/search_hhistory/linked_to_user=false
+privacy/collected_data/search_hhistory/used_for_tracking=false
+privacy/collected_data/search_hhistory/collection_purposes=0
+privacy/collected_data/user_id/collected=false
+privacy/collected_data/user_id/linked_to_user=false
+privacy/collected_data/user_id/used_for_tracking=false
+privacy/collected_data/user_id/collection_purposes=0
+privacy/collected_data/device_id/collected=false
+privacy/collected_data/device_id/linked_to_user=false
+privacy/collected_data/device_id/used_for_tracking=false
+privacy/collected_data/device_id/collection_purposes=0
+privacy/collected_data/purchase_history/collected=false
+privacy/collected_data/purchase_history/linked_to_user=false
+privacy/collected_data/purchase_history/used_for_tracking=false
+privacy/collected_data/purchase_history/collection_purposes=0
+privacy/collected_data/product_interaction/collected=false
+privacy/collected_data/product_interaction/linked_to_user=false
+privacy/collected_data/product_interaction/used_for_tracking=false
+privacy/collected_data/product_interaction/collection_purposes=0
+privacy/collected_data/advertising_data/collected=false
+privacy/collected_data/advertising_data/linked_to_user=false
+privacy/collected_data/advertising_data/used_for_tracking=false
+privacy/collected_data/advertising_data/collection_purposes=0
+privacy/collected_data/other_usage_data/collected=false
+privacy/collected_data/other_usage_data/linked_to_user=false
+privacy/collected_data/other_usage_data/used_for_tracking=false
+privacy/collected_data/other_usage_data/collection_purposes=0
+privacy/collected_data/crash_data/collected=false
+privacy/collected_data/crash_data/linked_to_user=false
+privacy/collected_data/crash_data/used_for_tracking=false
+privacy/collected_data/crash_data/collection_purposes=0
+privacy/collected_data/performance_data/collected=false
+privacy/collected_data/performance_data/linked_to_user=false
+privacy/collected_data/performance_data/used_for_tracking=false
+privacy/collected_data/performance_data/collection_purposes=0
+privacy/collected_data/other_diagnostic_data/collected=false
+privacy/collected_data/other_diagnostic_data/linked_to_user=false
+privacy/collected_data/other_diagnostic_data/used_for_tracking=false
+privacy/collected_data/other_diagnostic_data/collection_purposes=0
+privacy/collected_data/environment_scanning/collected=false
+privacy/collected_data/environment_scanning/linked_to_user=false
+privacy/collected_data/environment_scanning/used_for_tracking=false
+privacy/collected_data/environment_scanning/collection_purposes=0
+privacy/collected_data/hands/collected=false
+privacy/collected_data/hands/linked_to_user=false
+privacy/collected_data/hands/used_for_tracking=false
+privacy/collected_data/hands/collection_purposes=0
+privacy/collected_data/head/collected=false
+privacy/collected_data/head/linked_to_user=false
+privacy/collected_data/head/used_for_tracking=false
+privacy/collected_data/head/collection_purposes=0
+privacy/collected_data/other_data_types/collected=false
+privacy/collected_data/other_data_types/linked_to_user=false
+privacy/collected_data/other_data_types/used_for_tracking=false
+privacy/collected_data/other_data_types/collection_purposes=0
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="#!/usr/bin/env bash
+unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
+open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
+ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
+kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
+rm -rf \"{temp_dir}\""
+
+[preset.2]
+
+name="Linux"
+platform="Linux"
+runnable=true
+advanced_options=true
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter=""
+exclude_filter=""
+export_path=""
+patches=PackedStringArray()
+encryption_include_filters=""
+encryption_exclude_filters=""
+seed=0
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.2.options]
+
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=1
+binary_format/embed_pck=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
+binary_format/architecture="x86_64"
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="#!/usr/bin/env bash
+export DISPLAY=:0
+unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
+\"{temp_dir}/{exe_name}\" {cmd_args}"
+ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
+kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
+rm -rf \"{temp_dir}\""

+ 1 - 0
project.godot

@@ -12,6 +12,7 @@ config_version=5
 
 config/name="SoundThread"
 config/description="Node based interface for the Composers Desktop Project"
+config/version="0.1.1-alpha"
 run/main_scene="uid://bcs87y7ptx3ke"
 config/features=PackedStringArray("4.4", "Forward Plus")
 boot_splash/bg_color=Color(0.160784, 0.25098, 0.247059, 1)

+ 34 - 0
readmeimages/logo.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://o40um0470wvm"
+path="res://.godot/imported/logo.png-32b1ce9a3d691ac1874e55f69fad46d0.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://readmeimages/logo.png"
+dest_files=["res://.godot/imported/logo.png-32b1ce9a3d691ac1874e55f69fad46d0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

+ 34 - 0
readmeimages/main_screenshot.png.import

@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cx3p1udunugkb"
+path="res://.godot/imported/main_screenshot.png-377a4acb99bd8e337af226e23571e304.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://readmeimages/main_screenshot.png"
+dest_files=["res://.godot/imported/main_screenshot.png-377a4acb99bd8e337af226e23571e304.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1

+ 1 - 1
scenes/Nodes/audioplayer.tscn

@@ -72,10 +72,10 @@ title = "Wrong File Type"
 initial_position = 2
 size = Vector2i(350, 100)
 visible = false
+transient = true
 exclusive = true
 unresizable = true
 borderless = true
-always_on_top = true
 popup_window = true
 
 [node name="Label" type="Label" parent="WavError"]

+ 42 - 15
scenes/main/control.gd

@@ -50,8 +50,22 @@ func _ready() -> void:
 	new_patch()
 	get_tree().set_auto_accept_quit(false)
 	
-	#link output file to input file to enable audio output file loopback
-	#$GraphEdit/outputfile/AudioPlayer.recycle_outfile_trigger.connect($GraphEdit/inputfile/AudioPlayer.recycle_outfile)
+	#Check export config for version number and set about menu to current version
+	#Assumes version of mac + linux builds is the same as windows
+	#Requires manual update for alpha and beta builds but once the -beta is removed will be fully automatic so long as version is updated on export
+	var export_config = ConfigFile.new()
+	export_config.load("res://export_presets.cfg")
+	$MenuBar/About.set_item_text(0, "SoundThread v" + export_config.get_value("preset.0.options", "application/product_version", "version unknown") + "-alpha") 
+	
+	#checks if display is hidpi and scales ui accordingly
+	if DisplayServer.screen_get_dpi(0) >= 144:
+		get_window().content_scale_factor = 2.0
+		#goes through popup_windows group and scales all popups and resizes them
+		for window in get_tree().get_nodes_in_group("popup_windows"):
+			window.size = window.size * 2
+			window.content_scale_factor = 2
+	
+	
 	
 	
 func new_patch():
@@ -73,6 +87,7 @@ func new_patch():
 	_register_node_movement() #link nodes for tracking position changes for changes tracking
 	
 	changesmade = false #so it stops trying to save unchanged empty files
+	Global.infile = "no_file" #resets input to stop processes running with old files
 	get_window().title = "SoundThread"
 	link_output()
 	
@@ -235,6 +250,12 @@ func _on_graph_edit_node_selected(node: Node) -> void:
 func _on_graph_edit_node_deselected(node: Node) -> void:
 	selected_nodes[node] = false
 
+func _unhandled_key_input(event: InputEvent) -> void:
+	if event is InputEventKey and event.pressed and not event.echo:
+		if event.keycode == KEY_BACKSPACE:
+			_on_graph_edit_delete_nodes_request(PackedStringArray(selected_nodes.keys().filter(func(k): return selected_nodes[k])))
+			pass
+
 func _on_graph_edit_delete_nodes_request(nodes: Array[StringName]) -> void:
 	var graph_edit = get_node("GraphEdit")
 	undo_redo.create_action("Delete Nodes (Undo only)")
@@ -473,7 +494,7 @@ func _on_file_dialog_dir_selected(dir: String) -> void:
 	var minute = str(time_dict.minute).pad_zeros(2)
 	var second = str(time_dict.second).pad_zeros(2)
 	var time_str = hour + "-" + minute + "-" + second
-	Global.outfile = dir + "/" + outfilename.text + "_" + Time.get_date_string_from_system() + "_" + time_str
+	Global.outfile = dir + "/" + outfilename.text.get_basename() + "_" + Time.get_date_string_from_system() + "_" + time_str
 	log_console("Output directory and file name(s):" + Global.outfile, true)
 	await get_tree().process_frame
 	
@@ -1075,18 +1096,24 @@ func run_batch_file():
 		error_str += item + "\n"
 
 	if exit_code == 0:
-		console_output.append_text("[color=green]Processes ran successfully[/color]\n\n")
-		console_output.append_text("[b]Output:[/b]\n")
-		console_output.scroll_to_line(console_output.get_line_count() - 1)
-		console_output.append_text(output_str + "\n")
-		
-		if final_output_dir.ends_with(".wav"):
-			output_audio_player.play_outfile(final_output_dir)
-			outfile = final_output_dir
-		
-		var interface_settings = ConfigHandler.load_interface_settings()
-		if interface_settings.auto_close_console:
-			$Console.hide()
+		if output_str.contains("ERROR:"): #checks if CDP reported an error but passed exit code 0 anyway
+			console_output.append_text("[color=red][b]Processes failed[/b][/color]\n\n")
+			console_output.append_text("[b]Error:[/b]\n")
+			console_output.scroll_to_line(console_output.get_line_count() - 1)
+			console_output.append_text(output_str + "\n")
+		else:
+			console_output.append_text("[color=green]Processes ran successfully[/color]\n\n")
+			console_output.append_text("[b]Output:[/b]\n")
+			console_output.scroll_to_line(console_output.get_line_count() - 1)
+			console_output.append_text(output_str + "\n")
+			
+			if final_output_dir.ends_with(".wav"):
+				output_audio_player.play_outfile(final_output_dir)
+				outfile = final_output_dir
+			
+			var interface_settings = ConfigHandler.load_interface_settings() #checks if close console is enabled and closes console on a success
+			if interface_settings.auto_close_console:
+				$Console.hide()
 	else:
 		console_output.append_text("[color=red][b]Processes failed with exit code: %d[/b][/color]\n\n" % exit_code)
 		console_output.append_text("[b]Error:[/b]\n")

+ 15 - 9
scenes/main/control.tscn

@@ -35,14 +35,15 @@ visible = false
 layout_mode = 1
 offset_top = 35.0
 
-[node name="NoLocationPopup" type="Window" parent="."]
+[node name="NoLocationPopup" type="Window" parent="." groups=["popup_windows"]]
 auto_translate_mode = 1
 title = "Wrong File Type"
 initial_position = 2
 size = Vector2i(450, 500)
+transient = true
+exclusive = true
 unresizable = true
 borderless = true
-always_on_top = true
 popup_window = true
 
 [node name="TextureRect" type="TextureRect" parent="NoLocationPopup"]
@@ -80,16 +81,16 @@ offset_right = 457.0
 offset_bottom = 500.0
 text = "Click to locate _cdprogs"
 
-[node name="NoInputPopup" type="Window" parent="."]
+[node name="NoInputPopup" type="Window" parent="." groups=["popup_windows"]]
 auto_translate_mode = 1
 title = "No Input Selected"
 initial_position = 2
 size = Vector2i(380, 140)
 visible = false
+transient = true
 exclusive = true
 unresizable = true
 borderless = true
-always_on_top = true
 popup_window = true
 
 [node name="Label" type="Label" parent="NoInputPopup"]
@@ -112,16 +113,16 @@ offset_right = 390.0
 offset_bottom = 141.0
 text = "Ok"
 
-[node name="MultipleConnectionsPopup" type="Window" parent="."]
+[node name="MultipleConnectionsPopup" type="Window" parent="." groups=["popup_windows"]]
 auto_translate_mode = 1
 title = "No Input Selected"
 initial_position = 2
 size = Vector2i(380, 160)
 visible = false
+transient = true
 exclusive = true
 unresizable = true
 borderless = true
-always_on_top = true
 popup_window = true
 
 [node name="Label" type="Label" parent="MultipleConnectionsPopup"]
@@ -150,7 +151,7 @@ file_mode = 2
 access = 2
 use_native_dialog = true
 
-[node name="Console" type="Window" parent="."]
+[node name="Console" type="Window" parent="." groups=["popup_windows"]]
 title = "Generating Output"
 initial_position = 5
 size = Vector2i(600, 400)
@@ -246,6 +247,11 @@ item_6/separator = true
 item_7/text = "CDP Documentation"
 item_7/id = 7
 
+[node name="About" type="PopupMenu" parent="MenuBar"]
+item_count = 1
+item_0/id = 0
+item_0/disabled = true
+
 [node name="SaveDialog" type="FileDialog" parent="."]
 use_native_dialog = true
 
@@ -253,16 +259,16 @@ use_native_dialog = true
 auto_translate_mode = 1
 use_native_dialog = true
 
-[node name="SaveChangesPopup" type="Window" parent="."]
+[node name="SaveChangesPopup" type="Window" parent="." groups=["popup_windows"]]
 auto_translate_mode = 1
 title = "No Input Selected"
 initial_position = 2
 size = Vector2i(350, 100)
 visible = false
+transient = true
 exclusive = true
 unresizable = true
 borderless = true
-always_on_top = true
 popup_window = true
 
 [node name="Label" type="Label" parent="SaveChangesPopup"]