Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
8d84dcd
Base rework
atomic-junky Jul 28, 2025
93e50b4
ListEditorSection
atomic-junky Jul 28, 2025
9af9ed0
[BUGGED] Placing characters and variables in the GraphEdit
atomic-junky Jul 30, 2025
83f2739
Fix characters/variables things
atomic-junky Jul 30, 2025
c615468
Dockable interface
atomic-junky Aug 1, 2025
ddef959
[WIP] Refactor editor UI and add new node/field system
atomic-junky Oct 16, 2025
4f7727b
Refactor graph node and property system
atomic-junky Oct 17, 2025
644bc80
Update monologue_graph_edit.gd
atomic-junky Oct 18, 2025
d14127a
Refactor graph node row and node view rendering
atomic-junky Oct 18, 2025
dca6ad3
Add property exposure UI and logic to inspector
atomic-junky Oct 23, 2025
0775408
Added field in the inspector
atomic-junky Oct 23, 2025
53b6bac
Refactor property options to settings and improve node updates and ex…
atomic-junky Oct 24, 2025
9ce2765
Refactor row type handling
atomic-junky Oct 25, 2025
cf5df7b
Implement command-based undo/redo system
atomic-junky Oct 30, 2025
7cd7939
Add display property to node property settings
atomic-junky Oct 30, 2025
1700d8c
Update autoloads/storyline_manager.gd
atomic-junky Oct 30, 2025
a92ff1d
Update autoloads/storyline_manager.gd
atomic-junky Oct 30, 2025
4a0d689
Update autoloads/storyline_manager.gd
atomic-junky Oct 30, 2025
328cffd
Add TextNode and improve inspector and graph edit
atomic-junky Oct 30, 2025
2a9e4e6
Initial plan
Copilot Oct 30, 2025
fef488e
Add get_title_type() method to allow nodes to define their own title …
Copilot Oct 30, 2025
0b0cb7d
Refactor title to be a property instead of a method
Copilot Oct 30, 2025
620e102
Add setup_main_property() abstract method and control editability
Copilot Oct 30, 2025
64110d1
Refactor node property system and main property handling
atomic-junky Oct 31, 2025
2b50d5e
Refactor property settings: rename and clarify, add connection tracking
Copilot Oct 31, 2025
eb05b1f
Add ConnectionManager for tracking and managing property connections
Copilot Oct 31, 2025
1b11642
Refactor property port settings and exposure logic
atomic-junky Oct 31, 2025
4370676
Merge branch 'copilot/refactor-title-property-type' of https://github…
atomic-junky Oct 31, 2025
aa6fa29
Update command manager
atomic-junky Oct 31, 2025
6f698e4
Use property names instead of port indices for connections
Copilot Oct 31, 2025
4c9c161
Fix property port lookup logic and use exposed/export names
Copilot Oct 31, 2025
e2d772b
Refactor node connection logic to use node names
atomic-junky Oct 31, 2025
347b6b2
Add connection refresh logic to disconnect and reconnect all slots
Copilot Oct 31, 2025
13bad73
Refactor connection tracking to use node names
atomic-junky Oct 31, 2025
263c551
Add inspect connected node button to inspector panel
Copilot Oct 31, 2025
d67451e
Add textarea property type and editor support
atomic-junky Nov 3, 2025
37cb084
Improve node selection and change notification in inspector
atomic-junky Nov 3, 2025
09e8e47
Implement @coderabbitai suggestions
atomic-junky Nov 3, 2025
cc817c5
Merge pull request #65 from monologue-tool/copilot/refactor-title-pro…
atomic-junky Nov 3, 2025
0242ed3
Refactor field system and migrate to new Field class
atomic-junky Nov 3, 2025
58bd5cc
Refactor property field binding and validation system
atomic-junky Nov 3, 2025
acaf79b
Refactor graph edit logic and improve connection handling
atomic-junky Nov 3, 2025
56cb311
Update field_descriptor.gd
atomic-junky Nov 3, 2025
e785031
Refactor node system to use dynamic descriptors
atomic-junky Nov 3, 2025
c37b97f
Improve node picker
atomic-junky Nov 3, 2025
d333a09
Update monologue_graph_edit.gd
atomic-junky Nov 3, 2025
26ad8cb
Fix things
atomic-junky Nov 4, 2025
c0d94c9
Bette Undo/Redo for nodes
atomic-junky Nov 4, 2025
3b9754e
Initial plan
Copilot Nov 4, 2025
a85afff
Create modular theme architecture with semantic color palette
Copilot Nov 4, 2025
960792c
Add documentation for new modular theme system
Copilot Nov 4, 2025
4f4bf96
Add explicit preloads for proper dependency loading
Copilot Nov 4, 2025
64dc20d
Refine color palette for better visual harmony
Copilot Nov 4, 2025
c23da1d
Fix things
atomic-junky Nov 4, 2025
827ab56
Update theme colors and panel backgrounds
atomic-junky Nov 4, 2025
c211926
Update color palette and graph background usage
atomic-junky Nov 4, 2025
a5d5520
Refactor SVG imports to use DPITexture and update theme
atomic-junky Nov 5, 2025
b34e2ec
Add light theme support and theme cache refresh
Copilot Nov 5, 2025
b6223c5
Add ThemeManager autoload for global theme application
Copilot Nov 5, 2025
37f3088
Made some changes
atomic-junky Nov 5, 2025
ea7e464
Refactor theme architecture for cleaner separation of concerns
Copilot Nov 5, 2025
6aa62f2
Update theme system and remove legacy theme files
atomic-junky Nov 6, 2025
be7463e
Update FoldableContainer ui
atomic-junky Nov 7, 2025
9dcb063
Update TabBar style
atomic-junky Nov 7, 2025
c7533d5
Refactor theme system with clean architecture: Theme Palettes, Builde…
atomic-junky Nov 7, 2025
568fa85
Initial plan
Copilot Nov 7, 2025
6a5d375
Add list and dropdown field types, integrate with storyline
Copilot Nov 7, 2025
6283e32
Fix initialization order for StorylineDocument and InspectableStoryli…
Copilot Nov 7, 2025
c9685f0
Add tests for list, dropdown fields and storyline properties, add uid…
Copilot Nov 7, 2025
004c9f7
Add storyline settings button to inspector panel for editing characte…
Copilot Nov 7, 2025
e4b7415
Add dynamic update of dropdown options when source list changes
Copilot Nov 7, 2025
0db038f
Add comment clarifying backward compatibility for name field
Copilot Nov 7, 2025
d492e8d
Use get_value() method instead of direct property access in dropdown …
Copilot Nov 7, 2025
f62c7fa
Fix some copilot mistakes
atomic-junky Nov 7, 2025
f0f160c
Wire EditorListSection to storyline properties and fix inspector focu…
Copilot Nov 7, 2025
d0e1388
Hide list field add button when used in EditorListSection
Copilot Nov 7, 2025
ecb3227
Update save/load logic to use storyline properties for characters and…
Copilot Nov 7, 2025
9277d51
Add format conversion between simple editor format and complex save f…
Copilot Nov 7, 2025
f9bcc6e
Add null checks and readiness validation for list_field nodes
Copilot Nov 7, 2025
15aed17
Update list_field.gd
atomic-junky Nov 7, 2025
de3beb8
Add edit button support for characters and type field for variables
Copilot Nov 7, 2025
23ebb2e
Refactor list fields: remove add buttons, use editor_only button fiel…
Copilot Nov 7, 2025
b92de5b
Fix dropdown field initialization in list items by deferring bind_fie…
Copilot Nov 7, 2025
aba7d17
Fix undo/redo to work one item at a time by properly duplicating arrays
Copilot Nov 7, 2025
76d977a
Improve list field
atomic-junky Nov 28, 2025
00edcde
New schema/layout logic for list fields + items property
atomic-junky Dec 17, 2025
3138f95
Update list item to use InspectableObject
atomic-junky Dec 18, 2025
25a3d2e
Introduce dynamic fields
atomic-junky Dec 19, 2025
d106cf5
Harmonize safe field creation
atomic-junky Dec 19, 2025
59e9017
Support unique properties
atomic-junky Dec 19, 2025
ef5c8ce
Fix potential issues
atomic-junky Dec 19, 2025
4527e06
Make property list work
atomic-junky Dec 19, 2025
3cd118e
Fix incoming/outgoing position bad logic
atomic-junky Dec 20, 2025
35ebbe2
Fix exposed property not showing up
atomic-junky Dec 20, 2025
a37d475
Better connection handling
atomic-junky Dec 20, 2025
c12739a
Save logic
atomic-junky Dec 20, 2025
fbda8fc
Better property settings handling
atomic-junky Dec 20, 2025
be48eac
Make node id property visible in the inspector
atomic-junky Dec 20, 2025
d3feb7b
Fix list field items + graph node color
atomic-junky Dec 21, 2025
530d452
"""fix""" list properties
atomic-junky Dec 21, 2025
cf9665e
Add the default narrator
atomic-junky Dec 23, 2025
e4a8595
Force unique values to be unique
atomic-junky Dec 24, 2025
8f813f6
better lists
atomic-junky Dec 24, 2025
fcba6ab
Document tabs
atomic-junky Dec 24, 2025
c63b57b
Too much things
atomic-junky Dec 24, 2025
d526354
copy/cut/paste nodes
atomic-junky Dec 25, 2025
180a47b
Refactor node connection logic to use node IDs
atomic-junky Jan 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/Instruct1.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/Instruct1.png-698c6faa3ef3ac4960807faa3e028bd
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/Instruct2.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/Instruct2.png-4e8664e49d00a397bbd539f7dee976f
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/Instruct3.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/Instruct3.png-3cc62ed99bf29d90b803cb8eb40881e
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/Instruct4.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/Instruct4.png-bf5aa1cffc066175cecf9281b077480
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/Instruct5.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/Instruct5.png-001538ed8b5682dcf232de08035aab3
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/TODO_Manager_Logo.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/TODO_Manager_Logo.png-e07d7ec75201c66b732ef87
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/example1.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/example1.png-6386c332ca46e1e62ea061b956a901cd
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
6 changes: 6 additions & 0 deletions addons/Todo_Manager/doc/images/example2.png.import
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,19 @@ dest_files=["res://.godot/imported/example2.png-2e3a8f9cd1e178daf22b83dc0513f37a
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
Expand Down
7 changes: 7 additions & 0 deletions addons/beautify_code_on_save/plugin.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[plugin]

name="Beautify Code on Save"
description="Automatically formats and lints GDScript files on save using gdformat and gdlint."
author="nuevocharrua"
version="1.1.1"
script="plugin.gd"
210 changes: 210 additions & 0 deletions addons/beautify_code_on_save/plugin.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
@tool
extends EditorPlugin

const SUCCESS: int = 0
const AUTO_RELOAD_SETTING = "text_editor/behavior/files/auto_reload_scripts_on_external_change"
const ENABLE_EXTERNAL_EDITOR = "text_editor/external/use_external_editor"
# Plugin custom settings
const GDFORMAT_PATH_SETTING = "beautify_code_on_save/paths/gdformat_path"
const GDLINT_PATH_SETTING = "beautify_code_on_save/paths/gdlint_path"

var original_reload_setting: bool
var original_external_editor: bool


func _enter_tree() -> void:
var settings = get_editor_interface().get_editor_settings()

# Save original settings
original_reload_setting = settings.get_setting(AUTO_RELOAD_SETTING)
original_external_editor = settings.get_setting(ENABLE_EXTERNAL_EDITOR)

# Configure auto-reload and external editor
settings.set_setting(AUTO_RELOAD_SETTING, true)
settings.set_setting(ENABLE_EXTERNAL_EDITOR, false)
settings.set_initial_value(AUTO_RELOAD_SETTING, true, false)
settings.set_initial_value(ENABLE_EXTERNAL_EDITOR, false, false)

# Register plugin settings
_setup_plugin_settings(settings)

resource_saved.connect(_on_resource_saved_deferred)


func _exit_tree() -> void:
resource_saved.disconnect(_on_resource_saved_deferred)

var settings = get_editor_interface().get_editor_settings()
settings.set_setting(AUTO_RELOAD_SETTING, original_reload_setting)
settings.set_setting(ENABLE_EXTERNAL_EDITOR, original_external_editor)


func _setup_plugin_settings(settings: EditorSettings) -> void:
# Detect default paths
var default_gdformat = _detect_default_path("gdformat")
var default_gdlint = _detect_default_path("gdlint")

# Register settings
if not settings.has_setting(GDFORMAT_PATH_SETTING):
settings.set_setting(GDFORMAT_PATH_SETTING, default_gdformat)
if not settings.has_setting(GDLINT_PATH_SETTING):
settings.set_setting(GDLINT_PATH_SETTING, default_gdlint)

# Configure settings metadata
(
settings
.add_property_info(
{
"name": GDFORMAT_PATH_SETTING,
"type": TYPE_STRING,
"hint": PROPERTY_HINT_GLOBAL_FILE,
"hint_string": "",
}
)
)
(
settings
.add_property_info(
{
"name": GDLINT_PATH_SETTING,
"type": TYPE_STRING,
"hint": PROPERTY_HINT_GLOBAL_FILE,
"hint_string": "",
}
)
)


func _detect_default_path(command: String) -> String:
# Try to detect command path using 'which'
var output = []
var exit_code = OS.execute("which", [command], output, true)

if exit_code == SUCCESS and not output.is_empty():
return output[0].strip_edges()

# Common paths as fallback
var common_paths = [
"/usr/local/bin/" + command,
"/usr/bin/" + command,
OS.get_environment("HOME") + "/.local/bin/" + command
]

for path in common_paths:
if FileAccess.file_exists(path):
return path

return ""


func _on_resource_saved_deferred(script: Resource) -> void:
call_deferred("_on_resource_saved", script)


func _on_resource_saved(script: Resource) -> void:
if not script is Script:
return

var current_script = get_editor_interface().get_script_editor().get_current_script()
if current_script != script:
return

var text_edit = (
get_editor_interface().get_script_editor().get_current_editor().get_base_editor()
)
var file_path = ProjectSettings.globalize_path(script.resource_path)

# Get paths from settings
var settings = get_editor_interface().get_editor_settings()
var gdformat_path = settings.get_setting(GDFORMAT_PATH_SETTING)
var gdlint_path = settings.get_setting(GDLINT_PATH_SETTING)

# Add date time
var date_time = Time.get_datetime_string_from_system()
print("\n%s" % date_time)

# First run gdformat
if not gdformat_path or not FileAccess.file_exists(gdformat_path):
push_warning("❌ GDFormat not found. Please configure the path in Editor Settings.")
else:
var gdformat_output = []
var gdformat_exit_code = OS.execute(gdformat_path, [file_path], gdformat_output, true)

if gdformat_exit_code == SUCCESS:
await get_tree().process_frame
var formatted_source = FileAccess.get_file_as_string(script.resource_path)
_reload_script(text_edit, formatted_source)
print("✓ GDFormat: Successfully formatted: '%s'" % script.resource_path)
else:
push_error("❌ GDFormat Error: " + str(gdformat_output))
return # If formatting fails, don't continue with linting

# Then run gdlint on the formatted code
if not gdlint_path or not FileAccess.file_exists(gdlint_path):
push_warning("❌ GDLint not found. Please configure the path in Editor Settings.")
else:
var gdlint_output = []
var gdlint_exit_code = OS.execute(gdlint_path, [file_path], gdlint_output, true)

if gdlint_exit_code != SUCCESS:
_show_lint_errors(gdlint_output[0], file_path)
else:
print("✓ GDLint : Successfully linted : '%s'" % script.resource_path)


func _reload_script(text_edit: TextEdit, source_code: String) -> void:
# Save cursor and scroll position
var column = text_edit.get_caret_column()
var row = text_edit.get_caret_line()
var scroll_position_h = text_edit.scroll_horizontal
var scroll_position_v = text_edit.scroll_vertical

# Update text
text_edit.text = source_code

# Restore cursor and scroll position

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

# Mark as saved
text_edit.tag_saved_version()


func _show_lint_errors(output: String, path: String) -> void:
print("\n⚠ GDLint found the following issues:")
print("File: %s" % _get_res_path(path))
push_error("❌ GDLint Error: Please see output with more information.")
var lines = output.split("\n")
var error_count := 0

for line in lines:
if line.is_empty() or line.begins_with("Failure:"):
continue

var error_parts = line.split(": Error: ")
if error_parts.size() >= 2:
error_count += 1
var location = error_parts[0].get_file()
var line_number = (
error_parts[0].split(":")[2]
if OS.get_name() == "Windows"
else error_parts[0].split(":")[1]
)
var error_msg = error_parts[1]

print("%d) Line %s: %s" % [error_count, line_number, error_msg])

print("\nTotal: %d issues found" % error_count)


func _get_res_path(absolute_path: String) -> String:
var project_root = ProjectSettings.globalize_path("res://")
if absolute_path.begins_with(project_root):
return "res://" + absolute_path.substr(project_root.length())
var addons_pos = absolute_path.find("/addons/")
if addons_pos != -1:
return "res://" + absolute_path.substr(addons_pos + 1)
return absolute_path
1 change: 1 addition & 0 deletions addons/beautify_code_on_save/plugin.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://bd1mkvvfjhvfr
Loading
Loading