generated from krampus/template-godot4
	
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			GDScript
		
	
	
	
	
	
| @tool
 | |
| class_name FormatOnSave extends EditorPlugin
 | |
| 
 | |
| const SUCCESS: int = 0
 | |
| const AUTO_RELOAD_SETTING: String = "text_editor/behavior/files/auto_reload_scripts_on_external_change"
 | |
| var original_auto_reload_setting: bool
 | |
| 
 | |
| 
 | |
| # LIFECYCLE EVENTS
 | |
| func _enter_tree():
 | |
| 	activate_auto_reload_setting()
 | |
| 	resource_saved.connect(on_resource_saved)
 | |
| 
 | |
| 
 | |
| func _exit_tree():
 | |
| 	resource_saved.disconnect(on_resource_saved)
 | |
| 	restore_original_auto_reload_setting()
 | |
| 
 | |
| 
 | |
| # CALLED WHEN A SCRIPT IS SAVED
 | |
| func on_resource_saved(resource: Resource):
 | |
| 	if resource is Script:
 | |
| 		var script: Script = resource
 | |
| 		var current_script = get_editor_interface().get_script_editor().get_current_script()
 | |
| 		var text_edit: CodeEdit = (
 | |
| 			get_editor_interface().get_script_editor().get_current_editor().get_base_editor()
 | |
| 		)
 | |
| 
 | |
| 		# Prevents other unsaved scripts from overwriting the active one
 | |
| 		if current_script == script:
 | |
| 			var filepath: String = ProjectSettings.globalize_path(resource.resource_path)
 | |
| 
 | |
| 			# Run gdformat
 | |
| 			var exit_code = OS.execute("gdformat", [filepath])
 | |
| 
 | |
| 			# Replace source_code with formatted source_code
 | |
| 			if exit_code == SUCCESS:
 | |
| 				var formatted_source = FileAccess.get_file_as_string(resource.resource_path)
 | |
| 				FormatOnSave.reload_script(text_edit, formatted_source)
 | |
| 
 | |
| 
 | |
| # Workaround until this PR is merged:
 | |
| # https://github.com/godotengine/godot/pull/83267
 | |
| # Thanks, @KANAjetzt 💖
 | |
| static func reload_script(text_edit: TextEdit, source_code: String) -> void:
 | |
| 	var column := text_edit.get_caret_column()
 | |
| 	var row := text_edit.get_caret_line()
 | |
| 	var scroll_position_h := text_edit.get_h_scroll_bar().value
 | |
| 	var scroll_position_v := text_edit.get_v_scroll_bar().value
 | |
| 
 | |
| 	text_edit.text = source_code
 | |
| 	text_edit.set_caret_column(column)
 | |
| 	text_edit.set_caret_line(row)
 | |
| 	text_edit.scroll_horizontal = scroll_position_h
 | |
| 	text_edit.scroll_vertical = scroll_position_v
 | |
| 
 | |
| 	text_edit.tag_saved_version()
 | |
| 
 | |
| 
 | |
| # For this workaround to work, we need to disable the "Reload/Resave" pop-up
 | |
| func activate_auto_reload_setting():
 | |
| 	var settings := get_editor_interface().get_editor_settings()
 | |
| 	original_auto_reload_setting = settings.get(AUTO_RELOAD_SETTING)
 | |
| 	settings.set(AUTO_RELOAD_SETTING, true)
 | |
| 
 | |
| 
 | |
| # If the plugin is disabled, let's attempt to restore the original editor setting
 | |
| func restore_original_auto_reload_setting():
 | |
| 	var settings := get_editor_interface().get_editor_settings()
 | |
| 	settings.set(AUTO_RELOAD_SETTING, original_auto_reload_setting)
 |