diff --git a/addons/godot_test_scene/icon.svg b/addons/godot_test_scene/icon.svg new file mode 100644 index 00000000..86695686 --- /dev/null +++ b/addons/godot_test_scene/icon.svg @@ -0,0 +1,37 @@ + + + + + + diff --git a/addons/godot_test_scene/icon.svg.import b/addons/godot_test_scene/icon.svg.import new file mode 100644 index 00000000..abc49ffc --- /dev/null +++ b/addons/godot_test_scene/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://njcc6c8v1kun" +path="res://.godot/imported/icon.svg-d1d1f081d7c5acf717aa1e16720054d7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/godot_test_scene/icon.svg" +dest_files=["res://.godot/imported/icon.svg-d1d1f081d7c5acf717aa1e16720054d7.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/godot_test_scene/plugin.cfg b/addons/godot_test_scene/plugin.cfg new file mode 100644 index 00000000..0796292b --- /dev/null +++ b/addons/godot_test_scene/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Test scene" +description="A simple Godot addon that adds a extra run mode to the editor. This extra mode allows you to run a test scene linked to the current scene your are editing." +author="Douwe Ravers" +version="1.0" +script="plugin.gd" diff --git a/addons/godot_test_scene/plugin.gd b/addons/godot_test_scene/plugin.gd new file mode 100644 index 00000000..58276d71 --- /dev/null +++ b/addons/godot_test_scene/plugin.gd @@ -0,0 +1,25 @@ +@tool +extends EditorPlugin + +var play_test_button:Button + +func _enter_tree() -> void: + add_play_test_scene_button() + +func _exit_tree() -> void: + play_test_button.queue_free() + +func add_play_test_scene_button()->void: + var play_current_button := search_play_current_button(EditorInterface.get_base_control()) + var play_test_button_scene := load("res://addons/godot_test_scene/test_scene_button.tscn") as PackedScene + play_test_button = play_test_button_scene.instantiate() + play_current_button.add_sibling(play_test_button) + +func search_play_current_button(node:Node)->Button: + if node is Button and (node as Button).tooltip_text == "Play the edited scene.": + return (node as Button) + for child in node.get_children(): + var button := search_play_current_button(child) + if button is Button: + return button as Button + return null diff --git a/addons/godot_test_scene/test_scene_button.gd b/addons/godot_test_scene/test_scene_button.gd new file mode 100644 index 00000000..a89c07a6 --- /dev/null +++ b/addons/godot_test_scene/test_scene_button.gd @@ -0,0 +1,40 @@ +@tool +extends Button + +const META_NAME := "test_scene" + +func _on_pressed() -> void: + var current_scene := EditorInterface.get_edited_scene_root() + if current_scene.has_meta(META_NAME): + run_test_scene() + else: + show_selection_window("Select test scene path") + +func _on_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton\ + and event.pressed\ + and event.button_index == MOUSE_BUTTON_RIGHT: + show_selection_window("Select test scene path") + +func run_test_scene(): + var current_scene := EditorInterface.get_edited_scene_root() + var test_scene_path := current_scene.get_meta(META_NAME) + if ResourceLoader.exists(test_scene_path): + EditorInterface.play_custom_scene(test_scene_path) + else: + current_scene.remove_meta(META_NAME) + show_selection_window("No scene exists at saved path, select new path") + +func show_selection_window(message:String): + var file_dialog := FileDialog.new() + file_dialog.mode_overrides_title = true + file_dialog.title = message + file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + file_dialog.filters = ["*.tscn","*.scn"] + file_dialog.connect("file_selected", set_test_scene_path) + EditorInterface.popup_dialog_centered(file_dialog, Vector2i(300, 400)) + +func set_test_scene_path(path:String): + var current_scene := EditorInterface.get_edited_scene_root() + current_scene.set_meta(META_NAME, path) + run_test_scene() diff --git a/addons/godot_test_scene/test_scene_button.tscn b/addons/godot_test_scene/test_scene_button.tscn new file mode 100644 index 00000000..e151fb20 --- /dev/null +++ b/addons/godot_test_scene/test_scene_button.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=6 format=3 uid="uid://dbjvqwv7nf7e"] + +[ext_resource type="Texture2D" uid="uid://njcc6c8v1kun" path="res://addons/godot_test_scene/icon.svg" id="1_aa2ip"] +[ext_resource type="Script" path="res://addons/godot_test_scene/test_scene_button.gd" id="2_78f3v"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_k6kmm"] +bg_color = Color(0.239216, 0.258824, 0.290196, 1) + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_opnre"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ocjw8"] + +[node name="TestSceneButton" type="Button"] +physics_interpolation_mode = 0 +offset_right = 16.0 +offset_bottom = 16.0 +tooltip_text = "Run Test Scene +Play the linked test scene." +focus_mode = 0 +theme_override_colors/icon_pressed_color = Color(0.435294, 0.717647, 0.960784, 1) +theme_override_styles/hover = SubResource("StyleBoxFlat_k6kmm") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_opnre") +theme_override_styles/normal = SubResource("StyleBoxEmpty_ocjw8") +icon = ExtResource("1_aa2ip") +script = ExtResource("2_78f3v") + +[connection signal="gui_input" from="." to="." method="_on_gui_input"] +[connection signal="pressed" from="." to="." method="_on_pressed"]