From ca40971e53fc57834963630cbac4c541551b2e25 Mon Sep 17 00:00:00 2001 From: ChaoticByte Date: Wed, 25 Dec 2024 00:07:51 +0100 Subject: [PATCH] Add a 'New' and 'Save As' button and improve save behaviour, additional minor improvements - fix #20 --- project.godot | 4 +- scenes/main.tscn | 158 ++-------------------------------- scenes/ui_container.tscn | 178 +++++++++++++++++++++++++++++++++++++++ src/Editor.gd | 44 +++++++--- src/Filesystem.gd | 15 +++- src/ImageViewport.gd | 1 + src/Main.gd | 2 + 7 files changed, 232 insertions(+), 170 deletions(-) create mode 100644 scenes/ui_container.tscn diff --git a/project.godot b/project.godot index 6c19409..b65f388 100644 --- a/project.godot +++ b/project.godot @@ -24,8 +24,8 @@ ShaderDirectiveParser="*res://src/ShaderDirectiveParser.gd" [display] -window/size/viewport_width=700 -window/size/viewport_height=700 +window/size/viewport_width=704 +window/size/viewport_height=704 window/energy_saving/keep_screen_on=false window/subwindows/embed_subwindows=false window/vsync/vsync_mode=0 diff --git a/scenes/main.tscn b/scenes/main.tscn index 8ea5038..f114719 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,12 +1,11 @@ -[gd_scene load_steps=11 format=3 uid="uid://bjah7k4bxo044"] +[gd_scene load_steps=10 format=3 uid="uid://bjah7k4bxo044"] [ext_resource type="Script" path="res://src/Main.gd" id="1_2625y"] [ext_resource type="Script" path="res://src/ImageViewport.gd" id="2_hvo65"] [ext_resource type="Shader" path="res://src/shader/ivd_outline.gdshader" id="3_6xihe"] [ext_resource type="Script" path="res://src/ImageViewportDisplay.gd" id="3_n4itb"] -[ext_resource type="Script" path="res://src/UIAppVersion.gd" id="5_o1ggv"] [ext_resource type="Script" path="res://src/UIWindow.gd" id="6_8k0ha"] -[ext_resource type="Script" path="res://src/Editor.gd" id="7_g8bap"] +[ext_resource type="PackedScene" uid="uid://btgits2mfup0h" path="res://scenes/ui_container.tscn" id="7_5ci0e"] [ext_resource type="Script" path="res://src/Camera.gd" id="8_mls06"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_y2ea0"] @@ -43,158 +42,11 @@ script = ExtResource("8_mls06") [node name="EditorWindow" type="Window" parent="."] unique_name_in_owner = true disable_3d = true -position = Vector2i(50, 100) -size = Vector2i(600, 700) +position = Vector2i(48, 80) +size = Vector2i(704, 704) script = ExtResource("6_8k0ha") -[node name="UserInterfaceContainer" type="Control" parent="EditorWindow"] +[node name="UserInterfaceContainer" parent="EditorWindow" instance=ExtResource("7_5ci0e")] unique_name_in_owner = true -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="AppName" type="Label" parent="EditorWindow/UserInterfaceContainer"] -layout_mode = 0 -offset_left = 24.0 -offset_top = 16.0 -offset_right = 208.0 -offset_bottom = 48.0 -theme_override_font_sizes/font_size = 20 -text = "Fragmented" -vertical_alignment = 2 - -[node name="AppVersion" type="Label" parent="EditorWindow/UserInterfaceContainer"] -layout_mode = 0 -offset_left = 152.0 -offset_top = 17.0 -offset_right = 208.0 -offset_bottom = 47.0 -theme_override_font_sizes/font_size = 14 -text = "v0 -" -vertical_alignment = 2 -script = ExtResource("5_o1ggv") - -[node name="Editor" type="Control" parent="EditorWindow/UserInterfaceContainer"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 24.0 -offset_top = 64.0 -offset_right = -24.0 -offset_bottom = -24.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("7_g8bap") - -[node name="OpenShaderDialog" type="FileDialog" parent="EditorWindow/UserInterfaceContainer/Editor"] -unique_name_in_owner = true -title = "Load Shader" -size = Vector2i(521, 175) -ok_button_text = "Open" -mode_overrides_title = false -file_mode = 0 -access = 2 -filters = PackedStringArray("*.gdshader") -use_native_dialog = true - -[node name="SaveShaderDialog" type="FileDialog" parent="EditorWindow/UserInterfaceContainer/Editor"] -unique_name_in_owner = true -title = "Save Shader" -size = Vector2i(661, 175) -ok_button_text = "Save" -mode_overrides_title = false -access = 2 -filters = PackedStringArray("*.gdshader") -use_native_dialog = true - -[node name="SaveImageDialog" type="FileDialog" parent="EditorWindow/UserInterfaceContainer/Editor"] -unique_name_in_owner = true -title = "Export Image" -size = Vector2i(661, 175) -ok_button_text = "Save" -mode_overrides_title = false -access = 2 -filters = PackedStringArray("*.png") -use_native_dialog = true - -[node name="CodeEdit" type="CodeEdit" parent="EditorWindow/UserInterfaceContainer/Editor"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = 48.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_font_sizes/font_size = 14 -placeholder_text = "// Test" -wrap_mode = 1 -minimap_draw = true -minimap_width = 40 -caret_blink = true -draw_control_chars = true -draw_tabs = true -draw_spaces = true -line_length_guidelines = Array[int]([80]) -gutters_draw_line_numbers = true -code_completion_enabled = true -indent_automatic = true -auto_brace_completion_enabled = true -auto_brace_completion_highlight_matching = true - -[node name="OpenShaderButton" type="Button" parent="EditorWindow/UserInterfaceContainer/Editor"] -layout_mode = 1 -offset_right = 56.0 -offset_bottom = 32.0 -text = "Open" - -[node name="SaveShaderButton" type="Button" parent="EditorWindow/UserInterfaceContainer/Editor"] -layout_mode = 1 -offset_left = 64.0 -offset_right = 120.0 -offset_bottom = 32.0 -text = "Save" - -[node name="ApplyShaderButton" type="Button" parent="EditorWindow/UserInterfaceContainer/Editor"] -layout_mode = 1 -offset_left = 128.0 -offset_right = 216.0 -offset_bottom = 32.0 -text = "Apply (F5)" - -[node name="SaveImageButton" type="Button" parent="EditorWindow/UserInterfaceContainer/Editor"] -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -120.0 -offset_bottom = 32.0 -grow_horizontal = 0 -text = "Export Image" - -[node name="FitImageButton" type="Button" parent="EditorWindow/UserInterfaceContainer/Editor"] -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -216.0 -offset_right = -128.0 -offset_bottom = 32.0 -grow_horizontal = 0 -text = "Fit Image" [connection signal="close_requested" from="EditorWindow" to="EditorWindow" method="_on_close_requested"] -[connection signal="file_selected" from="EditorWindow/UserInterfaceContainer/Editor/OpenShaderDialog" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_open_shader_dialog_file_selected"] -[connection signal="file_selected" from="EditorWindow/UserInterfaceContainer/Editor/SaveShaderDialog" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_save_shader_dialog_file_selected"] -[connection signal="file_selected" from="EditorWindow/UserInterfaceContainer/Editor/SaveImageDialog" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_save_image_dialog_file_selected"] -[connection signal="code_completion_requested" from="EditorWindow/UserInterfaceContainer/Editor/CodeEdit" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_code_edit_code_completion_requested"] -[connection signal="pressed" from="EditorWindow/UserInterfaceContainer/Editor/OpenShaderButton" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_open_shader_button_pressed"] -[connection signal="pressed" from="EditorWindow/UserInterfaceContainer/Editor/SaveShaderButton" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_save_shader_button_pressed"] -[connection signal="pressed" from="EditorWindow/UserInterfaceContainer/Editor/ApplyShaderButton" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_apply_shader_button_pressed"] -[connection signal="pressed" from="EditorWindow/UserInterfaceContainer/Editor/SaveImageButton" to="EditorWindow/UserInterfaceContainer/Editor" method="_on_save_image_button_pressed"] -[connection signal="pressed" from="EditorWindow/UserInterfaceContainer/Editor/FitImageButton" to="Camera" method="_on_fit_image_button_pressed"] diff --git a/scenes/ui_container.tscn b/scenes/ui_container.tscn new file mode 100644 index 0000000..b804125 --- /dev/null +++ b/scenes/ui_container.tscn @@ -0,0 +1,178 @@ +[gd_scene load_steps=3 format=3 uid="uid://btgits2mfup0h"] + +[ext_resource type="Script" path="res://src/UIAppVersion.gd" id="1_5qvnb"] +[ext_resource type="Script" path="res://src/Editor.gd" id="2_haub5"] + +[node name="UserInterfaceContainer" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="AppName" type="Label" parent="."] +layout_mode = 0 +offset_left = 24.0 +offset_top = 16.0 +offset_right = 208.0 +offset_bottom = 48.0 +theme_override_font_sizes/font_size = 20 +text = "Fragmented" +vertical_alignment = 2 + +[node name="AppVersion" type="Label" parent="."] +layout_mode = 0 +offset_left = 152.0 +offset_top = 17.0 +offset_right = 208.0 +offset_bottom = 47.0 +theme_override_font_sizes/font_size = 14 +text = "v0 +" +vertical_alignment = 2 +script = ExtResource("1_5qvnb") + +[node name="Editor" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 24.0 +offset_top = 64.0 +offset_right = -24.0 +offset_bottom = -16.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("2_haub5") + +[node name="OpenShaderDialog" type="FileDialog" parent="Editor"] +unique_name_in_owner = true +auto_translate_mode = 1 +title = "Load Shader" +size = Vector2i(521, 175) +ok_button_text = "Open" +mode_overrides_title = false +file_mode = 0 +access = 2 +filters = PackedStringArray("*.gdshader") +use_native_dialog = true + +[node name="SaveShaderDialog" type="FileDialog" parent="Editor"] +unique_name_in_owner = true +auto_translate_mode = 1 +title = "Save Shader" +size = Vector2i(661, 175) +ok_button_text = "Save" +mode_overrides_title = false +access = 2 +filters = PackedStringArray("*.gdshader") +use_native_dialog = true + +[node name="SaveImageDialog" type="FileDialog" parent="Editor"] +unique_name_in_owner = true +auto_translate_mode = 1 +title = "Export Image" +size = Vector2i(661, 175) +ok_button_text = "Save" +mode_overrides_title = false +access = 2 +filters = PackedStringArray("*.png") +use_native_dialog = true + +[node name="CodeEdit" type="CodeEdit" parent="Editor"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = 48.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_font_sizes/font_size = 14 +placeholder_text = "// Test" +wrap_mode = 1 +minimap_draw = true +minimap_width = 40 +caret_blink = true +draw_control_chars = true +draw_tabs = true +draw_spaces = true +line_length_guidelines = Array[int]([80]) +gutters_draw_line_numbers = true +code_completion_enabled = true +indent_automatic = true +auto_brace_completion_enabled = true +auto_brace_completion_highlight_matching = true + +[node name="NewShaderButton" type="Button" parent="Editor"] +layout_mode = 1 +offset_right = 48.0 +offset_bottom = 32.0 +text = "New" + +[node name="OpenShaderButton" type="Button" parent="Editor"] +layout_mode = 1 +offset_left = 56.0 +offset_right = 112.0 +offset_bottom = 32.0 +text = "Open" + +[node name="SaveShaderButton" type="Button" parent="Editor"] +layout_mode = 1 +offset_left = 120.0 +offset_top = -1.0 +offset_right = 176.0 +offset_bottom = 31.0 +text = "Save" + +[node name="SaveShaderAsButton" type="Button" parent="Editor"] +layout_mode = 1 +offset_left = 184.0 +offset_right = 263.0 +offset_bottom = 32.0 +text = "Save As" + +[node name="SaveImageButton" type="Button" parent="Editor"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -72.0 +offset_bottom = 32.0 +grow_horizontal = 0 +text = "Export" + +[node name="FitImageButton" type="Button" parent="Editor"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -128.0 +offset_right = -80.0 +offset_bottom = 32.0 +grow_horizontal = 0 +text = "Fit" + +[node name="ApplyShaderButton" type="Button" parent="Editor"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -232.0 +offset_right = -136.0 +offset_bottom = 31.0 +grow_horizontal = 0 +text = "Apply (F5)" + +[connection signal="file_selected" from="Editor/OpenShaderDialog" to="Editor" method="_on_open_shader_dialog_file_selected"] +[connection signal="file_selected" from="Editor/SaveShaderDialog" to="Editor" method="_on_save_shader_dialog_file_selected"] +[connection signal="file_selected" from="Editor/SaveImageDialog" to="Editor" method="_on_save_image_dialog_file_selected"] +[connection signal="code_completion_requested" from="Editor/CodeEdit" to="Editor" method="_on_code_edit_code_completion_requested"] +[connection signal="pressed" from="Editor/NewShaderButton" to="Editor" method="_on_new_shader_button_pressed"] +[connection signal="pressed" from="Editor/OpenShaderButton" to="Editor" method="_on_open_shader_button_pressed"] +[connection signal="pressed" from="Editor/SaveShaderButton" to="Editor" method="_on_save_shader_button_pressed"] +[connection signal="pressed" from="Editor/SaveShaderAsButton" to="Editor" method="_on_save_shader_as_button_pressed"] +[connection signal="pressed" from="Editor/SaveImageButton" to="Editor" method="_on_save_image_button_pressed"] +[connection signal="pressed" from="Editor/FitImageButton" to="Editor" method="_on_fit_image_button_pressed"] +[connection signal="pressed" from="Editor/ApplyShaderButton" to="Editor" method="_on_apply_shader_button_pressed"] diff --git a/src/Editor.gd b/src/Editor.gd index 24d0e62..cad4f38 100644 --- a/src/Editor.gd +++ b/src/Editor.gd @@ -1,12 +1,14 @@ extends Control @onready var code_editor = %CodeEdit + @onready var open_shader_dialog = %OpenShaderDialog @onready var save_shader_dialog = %SaveShaderDialog - -@onready var image_viewport = %ImageViewport @onready var ui_control_filesave = %SaveImageDialog +@onready var image_viewport = get_tree().root.get_node("Main/%ImageViewport") +@onready var camera = get_tree().root.get_node("Main/%Camera") + # # # # # # # # # # # # GDShader keywords # # https://github.com/godotengine/godot/blob/e96ad5af98547df71b50c4c4695ac348638113e0/servers/rendering/shader_language.cpp @@ -183,28 +185,36 @@ func _input(event): func update(): code_editor.text = Filesystem.shader.code +# + +func _on_new_shader_button_pressed(): + Filesystem.reset() + self.update() + image_viewport.update() + func _on_open_shader_button_pressed(): open_shader_dialog.show() func _on_save_shader_button_pressed(): + Filesystem.shader.code = code_editor.text + if Filesystem.last_shader_savepath == "": + _on_save_shader_as_button_pressed() + else: + _on_save_shader_dialog_file_selected(Filesystem.last_shader_savepath) + +func _on_save_shader_as_button_pressed() -> void: + Filesystem.shader.code = code_editor.text if Filesystem.last_shader_savepath == "": save_shader_dialog.current_file = "filter.gdshader" else: save_shader_dialog.current_path = Filesystem.last_shader_savepath save_shader_dialog.show() -func _on_open_shader_dialog_file_selected(path: String): - Filesystem.load_shader(path) - image_viewport.update() - self.update() - -func _on_save_shader_dialog_file_selected(path): - Filesystem.save_shader(path, code_editor.text) +func _on_fit_image_button_pressed(): + camera.fit_image() func _on_apply_shader_button_pressed(): - var shader = Shader.new() - shader.code = code_editor.text - Filesystem.shader = shader + Filesystem.shader.code = code_editor.text image_viewport.update() func _on_save_image_button_pressed(): @@ -212,5 +222,15 @@ func _on_save_image_button_pressed(): ui_control_filesave.current_path = Filesystem.last_image_savepath ui_control_filesave.show() +# + +func _on_open_shader_dialog_file_selected(path: String): + Filesystem.load_shader(path) + image_viewport.update() + self.update() + +func _on_save_shader_dialog_file_selected(path): + Filesystem.save_shader(path) + func _on_save_image_dialog_file_selected(path): Filesystem.save_result(path) diff --git a/src/Filesystem.gd b/src/Filesystem.gd index 9530b39..18fd3d4 100644 --- a/src/Filesystem.gd +++ b/src/Filesystem.gd @@ -1,6 +1,7 @@ extends Node -@onready var shader: Shader = load("res://src/shader/template.gdshader") +@onready var template_shader: Shader = load("res://src/shader/template.gdshader") +@onready var shader: Shader = template_shader.duplicate() var original_image: ImageTexture var result: Image @@ -9,6 +10,14 @@ var last_image_savepath = "" var last_shader_savepath = "" var last_original_image_path = "" +func reset(): + self.shader = self.template_shader.duplicate() + self.last_image_savepath = "" + self.last_shader_savepath = "" + self.last_original_image_path = "" + self.original_image = null + self.result = null + func get_absolute_path(p: String) -> String: # this only works on Linux! if !p.begins_with("/"): @@ -50,10 +59,10 @@ func load_shader(path: String): self.cwd = path.substr(0, path.rfind("/")) self.last_shader_savepath = path -func save_shader(path: String, content: String): +func save_shader(path: String): print("Save ", path) var file = FileAccess.open(path, FileAccess.WRITE) - file.store_string(content) + file.store_string(self.shader.code) if "/" in path: # update current working directory self.cwd = path.substr(0, path.rfind("/")) self.last_shader_savepath = path diff --git a/src/ImageViewport.gd b/src/ImageViewport.gd index 5f95fe6..d327ce8 100644 --- a/src/ImageViewport.gd +++ b/src/ImageViewport.gd @@ -15,6 +15,7 @@ func update(): fit_image = true Filesystem.load_original_image(original_image_path) if Filesystem.original_image == null: + image_viewport_display.hide() return image_sprite.texture = Filesystem.original_image image_sprite.offset = Filesystem.original_image.get_size() / 2 diff --git a/src/Main.gd b/src/Main.gd index 459ffee..5b98454 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -8,4 +8,6 @@ func _ready(): editor_window.position.x + editor_window.size.x + 50, editor_window.position.y) get_window().title = ProjectSettings.get_setting("application/config/name") + " - Viewer" + get_window().min_size = Vector2i(400, 400) editor_window.title = ProjectSettings.get_setting("application/config/name") + " - Editor" + editor_window.min_size = Vector2i(560, 400)