progress.
This commit is contained in:
215
addons/cutscene_editor/CutsceneEditorPlugin.gd
Normal file
215
addons/cutscene_editor/CutsceneEditorPlugin.gd
Normal file
@@ -0,0 +1,215 @@
|
||||
@tool
|
||||
extends EditorPlugin
|
||||
|
||||
# Main plugin script for the cutscene editor
|
||||
|
||||
var dock_panel: Control
|
||||
var graph_edit: GraphEdit
|
||||
|
||||
func _enter_tree() -> void:
|
||||
# Initialize the plugin when it's enabled
|
||||
_setup_plugin()
|
||||
|
||||
# Add custom types for cutscene resources
|
||||
add_custom_type("CutsceneResource", "Resource", preload("res://addons/cutscene_editor/editor/resources/CutsceneResource.gd"),
|
||||
preload("res://addons/cutscene_editor/icons/icon_entry.svg"))
|
||||
|
||||
func _exit_tree() -> void:
|
||||
# Clean up when the plugin is disabled
|
||||
_cleanup_plugin()
|
||||
|
||||
# Remove custom types
|
||||
remove_custom_type("CutsceneResource")
|
||||
|
||||
func _setup_plugin() -> void:
|
||||
# Create the main dock panel
|
||||
dock_panel = _create_dock_panel()
|
||||
|
||||
# Add the dock panel to the editor
|
||||
add_control_to_bottom_panel(dock_panel, "Cutscene Editor")
|
||||
|
||||
# Register the custom inspector plugin
|
||||
#var inspector_plugin = preload("res://addons/cutscene_editor/editor/inspectors/CutsceneInspectorPlugin.gd").new()
|
||||
#add_inspector_plugin(inspector_plugin)
|
||||
|
||||
func _cleanup_plugin() -> void:
|
||||
# Remove the dock panel from the editor
|
||||
if dock_panel:
|
||||
remove_control_from_bottom_panel(dock_panel)
|
||||
dock_panel.queue_free()
|
||||
|
||||
# Remove inspector plugin
|
||||
# Note: Inspector plugins are automatically removed when the plugin is disabled
|
||||
|
||||
func _create_dock_panel() -> Control:
|
||||
# Create the main dock panel UI
|
||||
var panel = PanelContainer.new()
|
||||
|
||||
# Create a main container for the editor
|
||||
var main_vbox = VBoxContainer.new()
|
||||
main_vbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
main_vbox.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||||
panel.add_child(main_vbox)
|
||||
|
||||
# Create toolbar
|
||||
var toolbar = _create_toolbar()
|
||||
main_vbox.add_child(toolbar)
|
||||
|
||||
# Create graph edit area
|
||||
graph_edit = _create_graph_edit()
|
||||
main_vbox.add_child(graph_edit)
|
||||
|
||||
# Set up preview system
|
||||
_setup_preview_system()
|
||||
|
||||
# Set up undo/redo system
|
||||
_setup_undo_redo_system()
|
||||
|
||||
return panel
|
||||
|
||||
func _create_toolbar() -> Control:
|
||||
# Create the main toolbar with common actions
|
||||
var toolbar = HBoxContainer.new()
|
||||
|
||||
# New button
|
||||
var new_button = Button.new()
|
||||
new_button.text = "New"
|
||||
new_button.icon = get_editor_interface().get_base_control().get_theme_icon("New", "EditorIcons")
|
||||
new_button.connect("pressed", _on_new_pressed)
|
||||
toolbar.add_child(new_button)
|
||||
|
||||
# Open button
|
||||
var open_button = Button.new()
|
||||
open_button.text = "Open"
|
||||
open_button.icon = get_editor_interface().get_base_control().get_theme_icon("Load", "EditorIcons")
|
||||
open_button.connect("pressed", _on_open_pressed)
|
||||
toolbar.add_child(open_button)
|
||||
|
||||
# Save button
|
||||
var save_button = Button.new()
|
||||
save_button.text = "Save"
|
||||
save_button.icon = get_editor_interface().get_base_control().get_theme_icon("Save", "EditorIcons")
|
||||
save_button.connect("pressed", _on_save_pressed)
|
||||
toolbar.add_child(save_button)
|
||||
|
||||
# Separator
|
||||
var separator1 = VSeparator.new()
|
||||
toolbar.add_child(separator1)
|
||||
|
||||
# Undo button
|
||||
var undo_button = Button.new()
|
||||
undo_button.text = "Undo"
|
||||
undo_button.icon = get_editor_interface().get_base_control().get_theme_icon("Undo", "EditorIcons")
|
||||
undo_button.connect("pressed", _on_undo_pressed)
|
||||
toolbar.add_child(undo_button)
|
||||
|
||||
# Redo button
|
||||
var redo_button = Button.new()
|
||||
redo_button.text = "Redo"
|
||||
redo_button.icon = get_editor_interface().get_base_control().get_theme_icon("Redo", "EditorIcons")
|
||||
redo_button.connect("pressed", _on_redo_pressed)
|
||||
toolbar.add_child(redo_button)
|
||||
|
||||
# Separator
|
||||
var separator2 = VSeparator.new()
|
||||
toolbar.add_child(separator2)
|
||||
|
||||
# Preview button
|
||||
var preview_button = Button.new()
|
||||
preview_button.text = "Preview"
|
||||
preview_button.icon = get_editor_interface().get_base_control().get_theme_icon("Play", "EditorIcons")
|
||||
preview_button.connect("pressed", _on_preview_pressed)
|
||||
toolbar.add_child(preview_button)
|
||||
|
||||
return toolbar
|
||||
|
||||
func _create_graph_edit() -> GraphEdit:
|
||||
# Create the main graph edit component
|
||||
var graph = preload("res://addons/cutscene_editor/editor/CutsceneGraphEdit.gd").new()
|
||||
graph.name = "CutsceneGraphEdit"
|
||||
graph.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
graph.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||||
|
||||
# Set up graph properties
|
||||
graph.set_right_disconnects(true)
|
||||
graph.set_show_grid(true)
|
||||
graph.set_snapping_enabled(true)
|
||||
graph.set_snapping_distance(20)
|
||||
graph.set_minimap_enabled(true)
|
||||
graph.set_minimap_size(Vector2(200, 150))
|
||||
|
||||
# Connect signals
|
||||
graph.connect("connection_request", graph._on_connection_request)
|
||||
graph.connect("disconnection_request", graph._on_disconnection_request)
|
||||
graph.connect("node_selected", graph._on_node_selected)
|
||||
graph.connect("node_unselected", graph._on_node_unselected)
|
||||
graph.connect("popup_request", graph._on_popup_request)
|
||||
graph.connect("connection_to_empty", graph._on_connection_to_empty)
|
||||
graph.connect("connection_from_empty", graph._on_connection_from_empty)
|
||||
|
||||
return graph
|
||||
|
||||
func _setup_preview_system() -> void:
|
||||
# Set up the preview system
|
||||
if graph_edit:
|
||||
graph_edit.setup_preview()
|
||||
|
||||
func _setup_undo_redo_system() -> void:
|
||||
# Set up the undo/redo system
|
||||
if graph_edit:
|
||||
graph_edit._setup_undo_redo()
|
||||
|
||||
# Toolbar button handlers
|
||||
func _on_new_pressed() -> void:
|
||||
if graph_edit:
|
||||
graph_edit.clear_graph()
|
||||
|
||||
func _on_open_pressed() -> void:
|
||||
# Open file dialog to load a cutscene
|
||||
var file_dialog = EditorFileDialog.new()
|
||||
file_dialog.file_mode = EditorFileDialog.FILE_MODE_OPEN_FILE
|
||||
file_dialog.access = EditorFileDialog.ACCESS_RESOURCES
|
||||
file_dialog.filters = ["*.tres", "*.res"]
|
||||
file_dialog.connect("file_selected", _on_file_selected)
|
||||
|
||||
# Add to editor interface
|
||||
get_editor_interface().get_base_control().add_child(file_dialog)
|
||||
file_dialog.popup_centered_ratio()
|
||||
|
||||
func _on_file_selected(path: String) -> void:
|
||||
# Load the selected cutscene file
|
||||
if graph_edit:
|
||||
var cutscene_resource = load(path)
|
||||
if cutscene_resource and cutscene_resource is CutsceneResource: #preload("res://addons/cutscene_editor/editor/resources/CutsceneResource.gd"):
|
||||
graph_edit.load_from_cutscene(cutscene_resource)
|
||||
|
||||
func _on_save_pressed() -> void:
|
||||
# Open file dialog to save a cutscene
|
||||
var file_dialog = EditorFileDialog.new()
|
||||
file_dialog.file_mode = EditorFileDialog.FILE_MODE_SAVE_FILE
|
||||
file_dialog.access = EditorFileDialog.ACCESS_RESOURCES
|
||||
file_dialog.filters = ["*.tres", "*.res"]
|
||||
file_dialog.connect("file_selected", _on_save_file_selected)
|
||||
|
||||
# Add to editor interface
|
||||
get_editor_interface().get_base_control().add_child(file_dialog)
|
||||
file_dialog.popup_centered_ratio()
|
||||
|
||||
func _on_save_file_selected(path: String) -> void:
|
||||
# Save the current cutscene to the selected file
|
||||
if graph_edit:
|
||||
var cutscene_resource = graph_edit.save_to_cutscene()
|
||||
if cutscene_resource:
|
||||
ResourceSaver.save(cutscene_resource, path)
|
||||
|
||||
func _on_undo_pressed() -> void:
|
||||
if graph_edit:
|
||||
graph_edit.undo()
|
||||
|
||||
func _on_redo_pressed() -> void:
|
||||
if graph_edit:
|
||||
graph_edit.redo()
|
||||
|
||||
func _on_preview_pressed() -> void:
|
||||
if graph_edit:
|
||||
graph_edit.start_preview()
|
||||
Reference in New Issue
Block a user