You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.9 KiB
150 lines
3.9 KiB
6 months ago
|
@tool
|
||
|
extends EditorPlugin
|
||
|
|
||
|
## Preload the main panel scene
|
||
|
const MainPanel := preload("res://addons/dialogic/Editor/editor_main.tscn")
|
||
|
const PLUGIN_NAME := "Dialogic"
|
||
|
const PLUGIN_HANDLER_PATH := "res://addons/dialogic/Core/DialogicGameHandler.gd"
|
||
|
const PLUGIN_ICON_PATH := "res://addons/dialogic/Editor/Images/plugin-icon.svg"
|
||
|
|
||
|
## References used by various other scripts to quickly reference these things
|
||
|
var editor_view: Control # the root of the dialogic editor
|
||
|
|
||
|
|
||
|
## Signal emitted if godot wants us to save
|
||
|
signal dialogic_save
|
||
|
|
||
|
|
||
|
## Initialization
|
||
|
func _init() -> void:
|
||
|
self.name = "DialogicPlugin"
|
||
|
|
||
|
|
||
|
#region ACTIVATION & EDITOR SETUP
|
||
|
################################################################################
|
||
|
|
||
|
## Activation & Editor Setup
|
||
|
func _enable_plugin():
|
||
|
add_autoload_singleton(PLUGIN_NAME, PLUGIN_HANDLER_PATH)
|
||
|
add_dialogic_default_action()
|
||
|
|
||
|
|
||
|
func _disable_plugin():
|
||
|
remove_autoload_singleton(PLUGIN_NAME)
|
||
|
|
||
|
|
||
|
func _enter_tree() -> void:
|
||
|
editor_view = MainPanel.instantiate()
|
||
|
editor_view.plugin_reference = self
|
||
|
editor_view.hide()
|
||
|
get_editor_interface().get_editor_main_screen().add_child(editor_view)
|
||
|
_make_visible(false)
|
||
|
|
||
|
# Auto-update the singleton path for alpha users
|
||
|
# TODO remove at some point during beta or later
|
||
|
remove_autoload_singleton(PLUGIN_NAME)
|
||
|
add_autoload_singleton(PLUGIN_NAME, PLUGIN_HANDLER_PATH)
|
||
|
|
||
|
|
||
|
func _exit_tree() -> void:
|
||
|
if editor_view:
|
||
|
remove_control_from_bottom_panel(editor_view)
|
||
|
editor_view.queue_free()
|
||
|
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
|
||
|
#region PLUGIN_INFO
|
||
|
################################################################################
|
||
|
|
||
|
func _has_main_screen() -> bool:
|
||
|
return true
|
||
|
|
||
|
|
||
|
func _get_plugin_name() -> String:
|
||
|
return PLUGIN_NAME
|
||
|
|
||
|
|
||
|
func _get_plugin_icon():
|
||
|
return load(PLUGIN_ICON_PATH)
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
|
||
|
#region EDITOR INTERACTION
|
||
|
################################################################################
|
||
|
|
||
|
## Editor Interaction
|
||
|
func _make_visible(visible:bool) -> void:
|
||
|
if not editor_view:
|
||
|
return
|
||
|
|
||
|
if editor_view.get_parent() is Window:
|
||
|
if visible:
|
||
|
get_editor_interface().set_main_screen_editor("Script")
|
||
|
editor_view.show()
|
||
|
editor_view.get_parent().grab_focus()
|
||
|
else:
|
||
|
editor_view.visible = visible
|
||
|
|
||
|
|
||
|
func _save_external_data() -> void:
|
||
|
if _editor_view_and_manager_exist():
|
||
|
editor_view.editors_manager.save_current_resource()
|
||
|
|
||
|
|
||
|
func _get_unsaved_status(for_scene:String) -> String:
|
||
|
if for_scene.is_empty():
|
||
|
_save_external_data()
|
||
|
return ""
|
||
|
|
||
|
|
||
|
func _handles(object) -> bool:
|
||
|
if _editor_view_and_manager_exist() and object is Resource:
|
||
|
return editor_view.editors_manager.can_edit_resource(object)
|
||
|
return false
|
||
|
|
||
|
|
||
|
func _edit(object) -> void:
|
||
|
if object == null:
|
||
|
return
|
||
|
_make_visible(true)
|
||
|
if _editor_view_and_manager_exist():
|
||
|
editor_view.editors_manager.edit_resource(object)
|
||
|
|
||
|
|
||
|
## Helper function to check if editor_view and its manager exist
|
||
|
func _editor_view_and_manager_exist() -> bool:
|
||
|
return editor_view and editor_view.editors_manager
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
|
||
|
#region PROJECT SETUP
|
||
|
################################################################################
|
||
|
|
||
|
## Special Setup/Updates
|
||
|
## Methods that adds a dialogic_default_action if non exists
|
||
|
func add_dialogic_default_action() -> void:
|
||
|
if ProjectSettings.has_setting('input/dialogic_default_action'):
|
||
|
return
|
||
|
|
||
|
var input_enter: InputEventKey = InputEventKey.new()
|
||
|
input_enter.keycode = KEY_ENTER
|
||
|
var input_left_click: InputEventMouseButton = InputEventMouseButton.new()
|
||
|
input_left_click.button_index = MOUSE_BUTTON_LEFT
|
||
|
input_left_click.pressed = true
|
||
|
input_left_click.device = -1
|
||
|
var input_space: InputEventKey = InputEventKey.new()
|
||
|
input_space.keycode = KEY_SPACE
|
||
|
var input_x: InputEventKey = InputEventKey.new()
|
||
|
input_x.keycode = KEY_X
|
||
|
var input_controller: InputEventJoypadButton = InputEventJoypadButton.new()
|
||
|
input_controller.button_index = JOY_BUTTON_A
|
||
|
|
||
|
ProjectSettings.set_setting('input/dialogic_default_action', {'deadzone':0.5, 'events':[input_enter, input_left_click, input_space, input_x, input_controller]})
|
||
|
ProjectSettings.save()
|
||
|
|
||
|
#endregion
|