Add a 'New' and 'Save As' button and improve save behaviour, additional minor improvements - fix #20

This commit is contained in:
ChaoticByte 2024-12-25 00:07:51 +01:00
parent 6b748229ed
commit ca40971e53
No known key found for this signature in database
7 changed files with 232 additions and 170 deletions

View file

@ -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

View file

@ -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"]

178
scenes/ui_container.tscn Normal file
View file

@ -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"]

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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)