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.
269 lines
8.2 KiB
269 lines
8.2 KiB
tool |
|
extends HBoxContainer |
|
|
|
# customization options for the event |
|
|
|
# This is the default data that is going to be saved to json |
|
export(String) var event_name : String |
|
export (Dictionary) var event_data: Dictionary = {'event_id':'dialogic_000'} |
|
export(Texture) var event_icon : Texture |
|
export(StyleBoxFlat) var event_style : StyleBoxFlat |
|
|
|
export(PackedScene) var header_scene : PackedScene |
|
export(PackedScene) var body_scene : PackedScene |
|
|
|
export (bool) var expand_on_default := false |
|
export (bool) var needs_indentation := false |
|
export (String) var help_page_path := "" |
|
signal option_action(action_name) |
|
|
|
|
|
### internal node eferences |
|
onready var panel = $PanelContainer |
|
onready var selected_style = $PanelContainer/SelectedStyle |
|
onready var warning = $PanelContainer/MarginContainer/VBoxContainer/Header/Warning |
|
onready var title_label = $PanelContainer/MarginContainer/VBoxContainer/Header/TitleLabel |
|
onready var icon_texture = $PanelContainer/MarginContainer/VBoxContainer/Header/IconTexture |
|
onready var expand_control = $PanelContainer/MarginContainer/VBoxContainer/Header/ExpandControl |
|
onready var options_control = $PanelContainer/MarginContainer/VBoxContainer/Header/OptionsControl |
|
onready var header_content_container = $PanelContainer/MarginContainer/VBoxContainer/Header/Content |
|
onready var body_container = $PanelContainer/MarginContainer/VBoxContainer/Body |
|
onready var body_content_container = $PanelContainer/MarginContainer/VBoxContainer/Body/Content |
|
onready var indent_node = $Indent |
|
onready var help_button = $PanelContainer/MarginContainer/VBoxContainer/Header/HelpButton |
|
var header_node |
|
var body_node |
|
|
|
### extarnal node references |
|
var editor_reference |
|
|
|
### the indent size |
|
const indent_size = 25 |
|
|
|
# Setting this to true will ignore the event while saving |
|
# Useful for making placeholder events in drag and drop |
|
var ignore_save = false |
|
|
|
## ***************************************************************************** |
|
## PUBLIC METHODS |
|
## ***************************************************************************** |
|
|
|
func visual_select(): |
|
selected_style.show() |
|
|
|
|
|
func visual_deselect(): |
|
selected_style.hide() |
|
|
|
|
|
func set_event_style(style: StyleBoxFlat): |
|
panel.set('custom_styles/panel', style) |
|
|
|
|
|
func get_event_style(): |
|
return panel.get('custom_styles/panel') |
|
|
|
|
|
# called by the timeline before adding it to the tree |
|
func load_data(data): |
|
event_data = data |
|
|
|
|
|
func get_body(): |
|
return body_node |
|
|
|
|
|
func get_header(): |
|
return header_node |
|
|
|
|
|
func set_warning(text): |
|
warning.texture = get_icon("NodeWarning", "EditorIcons") |
|
warning.hint_tooltip = text |
|
|
|
|
|
func remove_warning(text = ''): |
|
if warning.hint_tooltip == text or text == '': |
|
warning.texture = null |
|
|
|
|
|
func set_preview(text: String): |
|
expand_control.set_preview(text) |
|
|
|
|
|
func set_indent(indent: int): |
|
indent_node.rect_min_size = Vector2(indent_size * indent, 0) |
|
indent_node.visible = indent != 0 |
|
|
|
|
|
func set_expanded(expanded: bool): |
|
expand_control.set_expanded(expanded) |
|
|
|
|
|
## ***************************************************************************** |
|
## PRIVATE METHODS |
|
## ***************************************************************************** |
|
|
|
func _set_event_icon(icon: Texture): |
|
icon_texture.texture = icon |
|
|
|
|
|
func _set_event_name(text: String): |
|
title_label.text = text |
|
|
|
|
|
func _set_header(scene: PackedScene): |
|
header_node = _set_content(header_content_container, scene) |
|
|
|
|
|
func _set_body(scene: PackedScene): |
|
body_node = _set_content(body_content_container, scene) |
|
# show the expand toggle |
|
expand_control.set_enabled(body_node != null) |
|
|
|
|
|
func _setup_event(): |
|
if event_style != null: |
|
set_event_style(event_style) |
|
if event_icon != null: |
|
_set_event_icon(event_icon) |
|
if event_name != null: |
|
_set_event_name(event_name) |
|
if header_scene != null: |
|
_set_header(header_scene) |
|
if body_scene != null: |
|
_set_body(body_scene) |
|
|
|
|
|
func _set_content(container: Control, scene: PackedScene): |
|
for c in container.get_children(): |
|
container.remove_child(c) |
|
if scene != null: |
|
var node = scene.instance() |
|
node.editor_reference = editor_reference |
|
container.add_child(node) |
|
# node.set_owner(get_tree().get_edited_scene_root()) |
|
return node |
|
return null |
|
|
|
|
|
func _on_ExpandControl_state_changed(expanded: bool): |
|
if expanded: |
|
if body_node: |
|
body_container.show() |
|
else: |
|
if body_node: |
|
body_container.hide() |
|
expand_control.set_preview(body_node.get_preview()) |
|
|
|
|
|
func _on_OptionsControl_action(action_name: String): |
|
# Simply transmit the signal to the timeline editor |
|
emit_signal("option_action", action_name) |
|
|
|
|
|
func _on_Indent_visibility_changed(): |
|
if not indent_node: |
|
return |
|
if needs_indentation: |
|
if indent_node.visible: |
|
remove_warning(DTS.translate("This event needs a question event around it!")) |
|
else: |
|
set_warning(DTS.translate("This event needs a question event around it!")) |
|
|
|
|
|
func _on_gui_input(event): |
|
if event is InputEventMouseButton and event.is_pressed() and event.button_index == 1: |
|
grab_focus() # Grab focus to avoid copy pasting text or events |
|
if event.doubleclick and expand_control.enabled: |
|
expand_control.set_expanded(not expand_control.expanded) |
|
|
|
|
|
# called when the data of the header is changed |
|
func _on_Header_data_changed(new_event_data): |
|
event_data = new_event_data |
|
|
|
# update the body in case it has to |
|
if get_body(): |
|
get_body().load_data(event_data) |
|
|
|
|
|
# called when the data of the body is changed |
|
func _on_Body_data_changed(new_event_data): |
|
event_data = new_event_data |
|
|
|
# update the header in case it has to |
|
if get_header(): |
|
get_header().load_data(event_data) |
|
|
|
func _request_set_body_enabled(enabled:bool): |
|
expand_control.set_enabled(enabled) |
|
|
|
if get_body(): |
|
get_body().visible = enabled |
|
|
|
func _request_selection(): |
|
var timeline_editor = editor_reference.get_node_or_null('MainPanel/TimelineEditor') |
|
if (timeline_editor != null): |
|
# @todo select item and clear selection is marked as "private" in TimelineEditor.gd |
|
# consider to make it "public" or add a public helper function |
|
timeline_editor.select_item(self) |
|
|
|
## ***************************************************************************** |
|
## OVERRIDES |
|
## ***************************************************************************** |
|
|
|
func _ready(): |
|
event_name = DTS.translate(event_name) |
|
|
|
## DO SOME STYLING |
|
$PanelContainer/SelectedStyle.modulate = get_color("accent_color", "Editor") |
|
|
|
|
|
_setup_event() |
|
|
|
set_focus_mode(1) # Allowing this node to grab focus |
|
|
|
# signals |
|
panel.connect("gui_input", self, '_on_gui_input') |
|
expand_control.connect("state_changed", self, "_on_ExpandControl_state_changed") |
|
options_control.connect("action", self, "_on_OptionsControl_action") |
|
|
|
# load icons |
|
if help_page_path != "": |
|
help_button.icon = get_icon("HelpSearch", "EditorIcons") |
|
help_button.show() |
|
|
|
# when it enters the tree, load the data into the header/body |
|
# If there is any external data, it will be set already BEFORE the event is added to tree |
|
# if you have a header |
|
if get_header(): |
|
get_header().connect("data_changed", self, "_on_Header_data_changed") |
|
get_header().connect("request_open_body", expand_control, "set_expanded", [true]) |
|
get_header().connect("request_close_body", expand_control, "set_expanded", [false]) |
|
get_header().connect("request_selection", self, "_request_selection") |
|
get_header().connect("request_set_body_enabled", self, "_request_set_body_enabled") |
|
get_header().connect("set_warning", self, "set_warning") |
|
get_header().connect("remove_warning", self, "remove_warning") |
|
get_header().load_data(event_data) |
|
# if you have a body |
|
if get_body(): |
|
get_body().connect("data_changed", self, "_on_Body_data_changed") |
|
get_body().connect("request_open_body", expand_control, "set_expanded", [true]) |
|
get_body().connect("request_close_body", expand_control, "set_expanded", [false]) |
|
get_body().connect("request_set_body_enabled", self, "_request_set_body_enabled") |
|
get_body().connect("request_selection", self, "_request_selection") |
|
get_body().connect("set_warning", self, "set_warning") |
|
get_body().connect("remove_warning", self, "remove_warning") |
|
get_body().load_data(event_data) |
|
|
|
if get_body(): |
|
set_expanded(expand_on_default) |
|
|
|
_on_Indent_visibility_changed() |
|
|
|
|
|
func _on_HelpButton_pressed(): |
|
if help_page_path: |
|
var master_tree = editor_reference.get_node_or_null('MainPanel/MasterTreeContainer/MasterTree') |
|
master_tree.select_documentation_item(help_page_path)
|
|
|