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.

189 lines
7.8 KiB

@tool
extends Control
## Script that handles the editor sidebar.
signal file_activated(file_path)
signal content_item_activated(item_name)
@onready var editors_manager = get_parent().get_parent()
func _ready():
if owner.get_parent() is SubViewport:
return
## CONNECTIONS
%ResourcesList.item_selected.connect(_on_resources_list_item_selected)
%ResourcesList.item_clicked.connect(_on_resources_list_item_clicked)
editors_manager.resource_opened.connect(_on_editors_resource_opened)
editors_manager.editor_changed.connect(_on_editors_editor_changed)
%ContentList.item_selected.connect(func (idx:int): content_item_activated.emit(%ContentList.get_item_text(idx)))
var editor_scale := DialogicUtil.get_editor_scale()
## ICONS
%Logo.texture = load("res://addons/dialogic/Editor/Images/dialogic-logo.svg")
%Logo.custom_minimum_size.y = 30 * editor_scale
%Search.right_icon = get_theme_icon("Search", "EditorIcons")
%CurrentResource.add_theme_stylebox_override('normal', get_theme_stylebox('normal', 'LineEdit'))
%ContentList.add_theme_color_override("font_hovered_color", get_theme_color("warning_color", "Editor"))
%ContentList.add_theme_color_override("font_selected_color", get_theme_color("property_color_z", "Editor"))
## MARGINS
$VBox/Margin.set("theme_override_constants/margin_left", get_theme_constant("base_margin", "Editor") * editor_scale)
$VBox/Margin.set("theme_override_constants/margin_bottom", get_theme_constant("base_margin", "Editor") * editor_scale)
## RIGHT CLICK MENU
%RightClickMenu.clear()
%RightClickMenu.add_icon_item(get_theme_icon("Remove", "EditorIcons"), "Remove From List", 1)
%RightClickMenu.add_separator()
%RightClickMenu.add_icon_item(get_theme_icon("Filesystem", "EditorIcons"), "Show in FileSystem", 2)
%RightClickMenu.add_icon_item(get_theme_icon("ExternalLink", "EditorIcons"), "Open in External Program", 3)
################################################################################
## RESOURCE LIST
################################################################################
func _on_editors_resource_opened(resource:Resource) -> void:
update_resource_list()
func _on_editors_editor_changed(previous:DialogicEditor, current:DialogicEditor) -> void:
%ContentListSection.visible = current.current_resource is DialogicTimeline
update_resource_list()
func clean_resource_list(resources_list:Array = []) -> PackedStringArray:
return PackedStringArray(resources_list.filter(func(x): return ResourceLoader.exists(x)))
func update_resource_list(resources_list:PackedStringArray = []) -> void:
var filter :String = %Search.text
var current_file := ""
if editors_manager.current_editor and editors_manager.current_editor.current_resource:
current_file = editors_manager.current_editor.current_resource.resource_path
var character_directory: Dictionary = DialogicResourceUtil.get_character_directory()
var timeline_directory: Dictionary = DialogicResourceUtil.get_timeline_directory()
if resources_list.is_empty():
resources_list = DialogicUtil.get_editor_setting('last_resources', [])
if !current_file in resources_list:
resources_list.append(current_file)
resources_list = clean_resource_list(resources_list)
%CurrentResource.text = "No Resource"
%CurrentResource.add_theme_color_override("font_color", get_theme_color("disabled_font_color", "Editor"))
%ResourcesList.clear()
var idx := 0
for character_name in character_directory:
if character_directory[character_name] in resources_list:
if filter.is_empty() or filter.to_lower() in character_name.to_lower():
%ResourcesList.add_item(
character_name,
load("res://addons/dialogic/Editor/Images/Resources/character.svg"))
%ResourcesList.set_item_metadata(idx, character_directory[character_name])
%ResourcesList.set_item_tooltip(idx, character_directory[character_name])
if character_directory[character_name] == current_file:
%ResourcesList.select(idx)
%ResourcesList.set_item_custom_fg_color(idx, get_theme_color("accent_color", "Editor"))
%CurrentResource.text = character_directory[character_name].get_file()
idx += 1
for timeline_name in timeline_directory:
if timeline_directory[timeline_name] in resources_list:
if filter.is_empty() or filter.to_lower() in timeline_name.to_lower():
%ResourcesList.add_item(timeline_name, get_theme_icon("TripleBar", "EditorIcons"))
%ResourcesList.set_item_metadata(idx, timeline_directory[timeline_name])
if timeline_directory[timeline_name] == current_file:
%ResourcesList.select(idx)
%ResourcesList.set_item_custom_fg_color(idx, get_theme_color("accent_color", "Editor"))
%CurrentResource.text = timeline_name+'.dtl'
idx += 1
if %CurrentResource.text != "No Resource":
%CurrentResource.add_theme_color_override("font_color", get_theme_color("font_color", "Editor"))
%ResourcesList.sort_items_by_text()
DialogicUtil.set_editor_setting('last_resources', resources_list)
func _on_resources_list_item_selected(index:int) -> void:
if %ResourcesList.get_item_metadata(index) == null:
return
editors_manager.edit_resource(load(%ResourcesList.get_item_metadata(index)))
func _on_resources_list_item_clicked(index: int, at_position: Vector2, mouse_button_index: int) -> void:
# If clicked with the middle mouse button, remove the item from the list
if mouse_button_index == MOUSE_BUTTON_MIDDLE:
remove_item_from_list(index)
if mouse_button_index == MOUSE_BUTTON_RIGHT:
%RightClickMenu.popup_on_parent(Rect2(get_global_mouse_position(), Vector2()))
%RightClickMenu.set_meta('item_index', index)
func _on_search_text_changed(new_text:String) -> void:
update_resource_list()
func set_unsaved_indicator(saved:bool = true) -> void:
if saved and %CurrentResource.text.ends_with('(*)'):
%CurrentResource.text = %CurrentResource.text.trim_suffix('(*)')
if not saved and not %CurrentResource.text.ends_with('(*)'):
%CurrentResource.text = %CurrentResource.text+"(*)"
func _on_logo_gui_input(event:InputEvent) -> void:
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
editors_manager.open_editor(editors_manager.editors['HomePage'].node)
func update_content_list(list:PackedStringArray) -> void:
var prev_selected := ""
if %ContentList.is_anything_selected():
prev_selected = %ContentList.get_item_text(%ContentList.get_selected_items()[0])
%ContentList.clear()
%ContentList.add_item('~ Top')
for i in list:
if i.is_empty(): continue
%ContentList.add_item(i)
if i == prev_selected:
%ContentList.select(%ContentList.item_count-1)
if list.is_empty():
return
var current_resource: Resource = editors_manager.get_current_editor().current_resource
var timeline_directory := DialogicResourceUtil.get_timeline_directory()
var label_directory := DialogicResourceUtil.get_label_cache()
if current_resource != null:
for i in timeline_directory:
if timeline_directory[i] == current_resource.resource_path:
label_directory[i] = list
# also always store the current timelines labels for easy access
label_directory[""] = list
DialogicResourceUtil.set_label_cache(label_directory)
func remove_item_from_list(index) -> void:
var new_list := []
for entry in DialogicUtil.get_editor_setting('last_resources', []):
if entry != %ResourcesList.get_item_metadata(index):
new_list.append(entry)
DialogicUtil.set_editor_setting('last_resources', new_list)
%ResourcesList.remove_item(index)
func _on_right_click_menu_id_pressed(id:int) -> void:
match id:
1: # REMOVE ITEM FROM LIST
remove_item_from_list(%RightClickMenu.get_meta("item_index"))
2: # OPEN IN FILESYSTEM
EditorInterface.get_file_system_dock().navigate_to_path(%ResourcesList.get_item_metadata(%RightClickMenu.get_meta("item_index")))
3: # OPEN IN EXTERNAL EDITOR
OS.shell_open(ProjectSettings.globalize_path(%ResourcesList.get_item_metadata(%RightClickMenu.get_meta("item_index"))))