diff --git a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd
index b049eee..7094f90 100644
--- a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd
+++ b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd
@@ -11,6 +11,7 @@ onready var nodes = {
'description': $HBoxContainer/Container/Description/TextEdit,
'file': $HBoxContainer/Container/FileName/LineEdit,
'color': $HBoxContainer/Container/Color/ColorPickerButton,
+ 'mirror_portraits_checkbox' : $HBoxContainer/VBoxContainer/HBoxContainer/MirrorOption/MirrorPortraitsCheckBox,
'default_speaker': $HBoxContainer/Container/Actions/DefaultSpeaker,
'display_name_checkbox': $HBoxContainer/Container/Name/CheckBox,
'display_name': $HBoxContainer/Container/DisplayName/LineEdit,
@@ -55,6 +56,7 @@ func clear_character_editor():
nodes['name'].text = ''
nodes['description'].text = ''
nodes['color'].color = Color('#ffffff')
+ nodes['mirror_portraits_checkbox'].pressed = false
nodes['default_speaker'].pressed = false
nodes['display_name_checkbox'].pressed = false
nodes['display_name'].text = ''
@@ -76,7 +78,8 @@ func create_character():
'color': '#ffffff',
'id': character_file,
'default_speaker': false,
- 'portraits': []
+ 'portraits': [],
+ 'mirror_portraits' :false
}
DialogicResources.set_character(character)
character['metadata'] = {'file': character_file}
@@ -101,6 +104,7 @@ func generate_character_data_to_save():
'id': nodes['file'].text,
'description': nodes['description'].text,
'color': '#' + nodes['color'].color.to_html(),
+ 'mirror_portraits': nodes["mirror_portraits_checkbox"].pressed,
'default_speaker': default_speaker,
'portraits': portraits,
'display_name_bool': nodes['display_name_checkbox'].pressed,
@@ -150,7 +154,14 @@ func load_character(filename: String):
if data.has('offset_x'):
nodes['offset_x'].value = data['offset_x']
nodes['offset_y'].value = data['offset_y']
-
+
+ if data.has('mirror_portraits'):
+ nodes['mirror_portraits_checkbox'].pressed = data['mirror_portraits']
+ nodes['portrait_preview'].flip_h = data['mirror_portraits']
+ else:
+ nodes['mirror_portraits_checkbox'].pressed = false
+ nodes['portrait_preview'].flip_h = false
+
# Portraits
var default_portrait = create_portrait_entry()
default_portrait.get_node('NameEdit').text = 'Default'
@@ -183,3 +194,7 @@ func create_portrait_entry(p_name = '', path = '', grab_focus = false):
p.get_node("NameEdit").grab_focus()
p._on_ButtonSelect_pressed()
return p
+
+
+func _on_MirrorPortraitsCheckBox_toggled(button_pressed):
+ nodes['portrait_preview'].flip_h = button_pressed
diff --git a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn
index 098d5b4..9804b24 100644
--- a/addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn
+++ b/addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn
@@ -8,7 +8,7 @@ content_margin_left = 5.0
content_margin_right = 5.0
content_margin_top = 5.0
content_margin_bottom = 5.0
-bg_color = Color( 0.2, 0.23, 0.31, 1 )
+bg_color = Color( 0.03, 0.21, 0.26, 1 )
[node name="CharacterEditor" type="ScrollContainer"]
margin_left = 192.0
@@ -141,9 +141,9 @@ margin_bottom = 14.0
text = "Portraits / Expressions"
[node name="Labels" type="HBoxContainer" parent="HBoxContainer/Container"]
-margin_top = 188.0
+margin_top = 216.0
margin_right = 523.0
-margin_bottom = 202.0
+margin_bottom = 230.0
[node name="LineEdit" type="Label" parent="HBoxContainer/Container/Labels"]
margin_right = 100.0
@@ -314,3 +314,15 @@ rect_min_size = Vector2( 100, 0 )
allow_greater = true
allow_lesser = true
suffix = "Y"
+
+[node name="MirrorOption" type="HBoxContainer" parent="HBoxContainer/VBoxContainer/HBoxContainer"]
+margin_left = 398.0
+margin_right = 523.0
+margin_bottom = 24.0
+
+[node name="MirrorPortraitsCheckBox" type="CheckBox" parent="HBoxContainer/VBoxContainer/HBoxContainer/MirrorOption"]
+margin_right = 125.0
+margin_bottom = 24.0
+text = "Mirror portraits"
+
+[connection signal="toggled" from="HBoxContainer/VBoxContainer/HBoxContainer/MirrorOption/MirrorPortraitsCheckBox" to="." method="_on_MirrorPortraitsCheckBox_toggled"]
diff --git a/addons/dialogic/Editor/EditorView.gd b/addons/dialogic/Editor/EditorView.gd
index ebfc8fa..2e3c964 100644
--- a/addons/dialogic/Editor/EditorView.gd
+++ b/addons/dialogic/Editor/EditorView.gd
@@ -72,11 +72,35 @@ func _ready():
$ToolBar/FoldTools/ButtonUnfold.connect('pressed', timeline_editor, 'unfold_all_nodes')
+ # Adding items to context menus
+ $TimelinePopupMenu.add_icon_item(get_icon("Filesystem", "EditorIcons"), 'Show in File Manager')
+ $TimelinePopupMenu.add_icon_item(get_icon("ActionCopy", "EditorIcons"), 'Copy Timeline Name')
+ $TimelinePopupMenu.add_icon_item(get_icon("Remove", "EditorIcons"), 'Remove Timeline')
+
+ $CharacterPopupMenu.add_icon_item(get_icon("Filesystem", "EditorIcons"), 'Show in File Manager')
+ $CharacterPopupMenu.add_icon_item(get_icon("Remove", "EditorIcons"), 'Remove Character')
+
+ $ThemePopupMenu.add_icon_item(get_icon("Filesystem", "EditorIcons"), 'Show in File Manager')
+ $ThemePopupMenu.add_icon_item(get_icon("Duplicate", "EditorIcons"), 'Duplicate Theme')
+ $ThemePopupMenu.add_icon_item(get_icon("Remove", "EditorIcons"), 'Remove Theme')
+
+ $DefinitionPopupMenu.add_icon_item(get_icon("Edit", "EditorIcons"), 'Edit Definitions File')
+ $DefinitionPopupMenu.add_icon_item(get_icon("Remove", "EditorIcons"), 'Remove Definition')
+
+ $TimelineRootPopupMenu.add_icon_item(get_icon("Add", "EditorIcons") ,'Add Timeline')
+ $CharacterRootPopupMenu.add_icon_item(get_icon("Add", "EditorIcons") ,'Add Character')
+ $ThemeRootPopupMenu.add_icon_item(get_icon("Add", "EditorIcons") ,'Add Theme')
+ $DefinitionRootPopupMenu.add_icon_item(get_icon("Add", "EditorIcons") ,'Add Definition')
+
# Connecting context menus
$TimelinePopupMenu.connect('id_pressed', self, '_on_TimelinePopupMenu_id_pressed')
$CharacterPopupMenu.connect('id_pressed', self, '_on_CharacterPopupMenu_id_pressed')
$ThemePopupMenu.connect('id_pressed', self, '_on_ThemePopupMenu_id_pressed')
$DefinitionPopupMenu.connect('id_pressed', self, '_on_DefinitionPopupMenu_id_pressed')
+ $TimelineRootPopupMenu.connect('id_pressed', self, '_on_TimelineRootPopupMenu_id_pressed')
+ $CharacterRootPopupMenu.connect('id_pressed', self, '_on_CharacterRootPopupMenu_id_pressed')
+ $ThemeRootPopupMenu.connect('id_pressed', self, '_on_ThemeRootPopupMenu_id_pressed')
+ $DefinitionRootPopupMenu.connect('id_pressed', self, '_on_DefinitionRootPopupMenu_id_pressed')
#Connecting confirmation menus
$RemoveTimelineConfirmation.connect('confirmed', self, '_on_RemoveTimelineConfirmation_confirmed')
@@ -130,21 +154,42 @@ func _on_ThemePopupMenu_id_pressed(id):
if id == 0:
OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('THEME_DIR')))
if id == 1:
- $RemoveThemeConfirmation.popup_centered()
- if id == 2:
var filename = $MainPanel/MasterTreeContainer/MasterTree.get_selected().get_metadata(0)['file']
if (filename.begins_with('theme-')):
theme_editor.duplicate_theme(filename)
+ if id == 2:
+ $RemoveThemeConfirmation.popup_centered()
# Definition context menu
func _on_DefinitionPopupMenu_id_pressed(id):
if id == 0:
- OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('DEFAULT_DEFINITIONS_FILE')))
+ var paths = DialogicResources.get_config_files_paths()
+ OS.shell_open(ProjectSettings.globalize_path(paths['DEFAULT_DEFINITIONS_FILE']))
if id == 1:
$RemoveDefinitionConfirmation.popup_centered()
+# Timeline Root context menu
+func _on_TimelineRootPopupMenu_id_pressed(id):
+ if id == 0: # Add Timeline
+ $MainPanel/TimelineEditor.new_timeline()
+
+# Character Root context menu
+func _on_CharacterRootPopupMenu_id_pressed(id):
+ if id == 0: # Add Character
+ $MainPanel/CharacterEditor.new_character()
+
+# Theme Root context menu
+func _on_ThemeRootPopupMenu_id_pressed(id):
+ if id == 0: # Add Theme
+ $MainPanel/ThemeEditor.new_theme()
+
+# Definition Root context menu
+func _on_DefinitionRootPopupMenu_id_pressed(id):
+ if id == 0: # Add Definition
+ $MainPanel/DefinitionEditor.new_definition()
+
func _on_RemoveDefinitionConfirmation_confirmed():
var target = $MainPanel/DefinitionEditor.current_definition['id']
DialogicResources.delete_default_definition(target)
@@ -194,7 +239,7 @@ func godot_dialog_connect(who, method_name):
func _on_file_selected(path):
- dprint(path)
+ dprint('[D] Selected '+str(path))
func dprint(what) -> void:
diff --git a/addons/dialogic/Editor/EditorView.tscn b/addons/dialogic/Editor/EditorView.tscn
index d638046..50bd40e 100644
--- a/addons/dialogic/Editor/EditorView.tscn
+++ b/addons/dialogic/Editor/EditorView.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=17 format=2]
+[gd_scene load_steps=14 format=2]
[ext_resource path="res://addons/dialogic/Editor/EditorView.gd" type="Script" id=1]
[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn" type="PackedScene" id=2]
@@ -8,14 +8,11 @@
[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/SettingsEditor.tscn" type="PackedScene" id=6]
[ext_resource path="res://addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn" type="PackedScene" id=7]
[ext_resource path="res://addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn" type="PackedScene" id=8]
-[ext_resource path="res://addons/dialogic/Images/Context Menus/ActionCopy.svg" type="Texture" id=11]
[ext_resource path="res://addons/dialogic/Editor/DefinitionEditor/DefinitionEditor.tscn" type="PackedScene" id=12]
[ext_resource path="res://addons/dialogic/Images/Toolbar/add-theme.svg" type="Texture" id=13]
-[ext_resource path="res://addons/dialogic/Images/Context Menus/Remove.svg" type="Texture" id=22]
-[ext_resource path="res://addons/dialogic/Images/Context Menus/Filesystem.svg" type="Texture" id=26]
[ext_resource path="res://addons/dialogic/Editor/MasterTree/MasterTree.tscn" type="PackedScene" id=35]
-[sub_resource type="Image" id=1]
+[sub_resource type="Image" id=3]
data = {
"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
"format": "LumAlpha8",
@@ -27,7 +24,7 @@ data = {
[sub_resource type="ImageTexture" id=2]
flags = 4
flags = 4
-image = SubResource( 1 )
+image = SubResource( 3 )
size = Vector2( 16, 16 )
[node name="EditorView" type="Control"]
@@ -206,7 +203,6 @@ margin_left = 151.0
margin_top = 276.0
margin_right = 325.0
margin_bottom = 332.0
-items = [ "Show in File Manager", ExtResource( 26 ), 0, false, false, 0, 0, null, "", false, "Copy Timeline Name", ExtResource( 11 ), 0, false, false, 1, 0, null, "", false, "Remove", ExtResource( 22 ), 0, false, false, 2, 0, null, "", false ]
__meta__ = {
"_edit_use_anchors_": false
}
@@ -216,17 +212,6 @@ margin_left = 171.799
margin_top = 209.0
margin_right = 267.799
margin_bottom = 229.0
-items = [ "Show in File Manager", ExtResource( 26 ), 0, false, false, 0, 0, null, "", false, "Remove Character", ExtResource( 22 ), 0, false, false, 1, 0, null, "", false ]
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="ThemePopupMenu" type="PopupMenu" parent="."]
-margin_left = 171.799
-margin_top = 209.0
-margin_right = 267.799
-margin_bottom = 229.0
-items = [ "Show in File Manager", ExtResource( 26 ), 0, false, false, 0, 0, null, "", false, "Remove Theme", ExtResource( 22 ), 0, false, false, 1, 0, null, "", false, "Duplicate Theme", ExtResource( 11 ), 0, false, false, 2, 0, null, "", false ]
__meta__ = {
"_edit_use_anchors_": false
}
@@ -236,7 +221,51 @@ margin_left = 171.799
margin_top = 209.0
margin_right = 267.799
margin_bottom = 229.0
-items = [ "Edit definitions file", ExtResource( 26 ), 0, false, false, 0, 0, null, "", false, "Remove Definition", ExtResource( 22 ), 0, false, false, 1, 0, null, "", false ]
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ThemePopupMenu" type="PopupMenu" parent="."]
+margin_left = 171.799
+margin_top = 209.0
+margin_right = 267.799
+margin_bottom = 229.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TimelineRootPopupMenu" type="PopupMenu" parent="."]
+margin_left = 159.0
+margin_top = 283.0
+margin_right = 227.0
+margin_bottom = 319.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="CharacterRootPopupMenu" type="PopupMenu" parent="."]
+margin_left = 159.0
+margin_top = 283.0
+margin_right = 227.0
+margin_bottom = 319.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ThemeRootPopupMenu" type="PopupMenu" parent="."]
+margin_left = 159.0
+margin_top = 283.0
+margin_right = 227.0
+margin_bottom = 319.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="DefinitionRootPopupMenu" type="PopupMenu" parent="."]
+margin_left = 159.0
+margin_top = 283.0
+margin_right = 227.0
+margin_bottom = 319.0
__meta__ = {
"_edit_use_anchors_": false
}
diff --git a/addons/dialogic/Editor/Events/AudioBlock.gd b/addons/dialogic/Editor/Events/AudioBlock.gd
index fe74770..d867a1d 100644
--- a/addons/dialogic/Editor/Events/AudioBlock.gd
+++ b/addons/dialogic/Editor/Events/AudioBlock.gd
@@ -7,57 +7,29 @@ var editorPopup
# This is the information of this event and it will get parsed and saved to the JSON file.
var event_data = {
+ 'event_name':'AudioEvent',
'audio': 'stop',
- 'file': ''
+ 'file': '',
+ 'audio_bus':'Master',
+ 'volume':0
}
func _ready():
- load_audio('')
- $PanelContainer/VBoxContainer/Header/ButtonClear.icon = get_icon("Remove", "EditorIcons")
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.icon = get_icon("Play", "EditorIcons")
-
-func _on_ButtonAudio_pressed():
- editor_reference.godot_dialog("*.wav, *.ogg, *.mp3")
- editor_reference.godot_dialog_connect(self, "_on_file_selected")
-
-
-func _on_file_selected(path, target):
- target.load_audio(path)
-
-
-func load_audio(path: String):
- if not path.empty():
- $PanelContainer/VBoxContainer/Header/Name.text = path
- $PanelContainer/VBoxContainer/Header/ButtonClear.disabled = false
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.disabled = false
- event_data['file'] = path
- event_data['audio'] = 'play'
- else:
- $PanelContainer/VBoxContainer/Header/Name.text = 'No sound (will stop previous audio event)'
- $PanelContainer/VBoxContainer/Header/ButtonClear.disabled = true
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.disabled = true
- event_data['file'] = ''
- event_data['audio'] = 'stop'
-
+ $PanelContainer/VBoxContainer/Header/VisibleToggle.set_visible(true)
+ $PanelContainer/VBoxContainer/Settings/AudioPicker.editor_reference = editor_reference
+ $PanelContainer/VBoxContainer/Settings/AudioPicker.connect('audio_changed', self, 'update_audio_data')
func load_data(data):
event_data = data
- load_audio(data['file'])
+ $PanelContainer/VBoxContainer/Settings/AudioPicker.load_data(data)
-
-func _on_ButtonPreviewPlay_pressed():
- if $PanelContainer/AudioPreview.is_playing():
- $PanelContainer/AudioPreview.stop()
+func update_audio_data(file, playing, audio_bus, volume):
+ event_data['file'] = file
+ event_data['audio'] = playing
+ event_data['audio_bus'] = audio_bus
+ event_data['volume'] = volume
+ if file:
+ $PanelContainer/VBoxContainer/Header/Preview.text = 'Plays '+file.get_file()
else:
- $PanelContainer/AudioPreview.stream = load(event_data['file'])
- $PanelContainer/AudioPreview.play()
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.icon = get_icon("Stop", "EditorIcons")
-
-
-func _on_AudioPreview_finished():
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.icon = get_icon("Play", "EditorIcons")
-
-
-func _on_ButtonClear_pressed():
- load_audio('')
+ $PanelContainer/VBoxContainer/Header/Preview.text = 'Stops previous audio event'
diff --git a/addons/dialogic/Editor/Events/AudioBlock.tscn b/addons/dialogic/Editor/Events/AudioBlock.tscn
index fd639d4..d677d44 100644
--- a/addons/dialogic/Editor/Events/AudioBlock.tscn
+++ b/addons/dialogic/Editor/Events/AudioBlock.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=6 format=2]
+[gd_scene load_steps=8 format=2]
[ext_resource path="res://addons/dialogic/Editor/Events/AudioBlock.gd" type="Script" id=1]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg" type="Texture" id=3]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
-
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/AudioPicker.tscn" type="PackedScene" id=5]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.tscn" type="PackedScene" id=8]
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 16.0
@@ -55,69 +56,49 @@ size_flags_horizontal = 3
[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
margin_right = 1776.0
-margin_bottom = 28.0
+margin_bottom = 30.0
[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/Header"]
margin_right = 22.0
-margin_bottom = 28.0
+margin_bottom = 30.0
texture = ExtResource( 3 )
stretch_mode = 6
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Header"]
margin_left = 26.0
-margin_top = 7.0
-margin_right = 83.0
-margin_bottom = 21.0
-text = " Audio "
+margin_top = 8.0
+margin_right = 118.0
+margin_bottom = 22.0
+text = " Audio Event "
-[node name="Name" type="Label" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 87.0
-margin_top = 7.0
-margin_right = 352.0
-margin_bottom = 21.0
-text = "No sound (will stop previous audio event)"
-
-[node name="ButtonAudio" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 356.0
-margin_right = 380.0
-margin_bottom = 28.0
-text = "..."
-
-[node name="ButtonClear" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 384.0
-margin_right = 396.0
-margin_bottom = 28.0
-disabled = true
-
-[node name="ButtonPreviewPlay" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 400.0
-margin_right = 412.0
-margin_bottom = 28.0
-disabled = true
+[node name="VisibleToggle" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 8 )]
+margin_left = 122.0
+margin_right = 152.0
+pressed = false
[node name="Preview" type="Label" parent="PanelContainer/VBoxContainer/Header"]
-visible = false
-margin_left = 103.0
+margin_left = 156.0
margin_top = 8.0
-margin_right = 131.0
+margin_right = 156.0
margin_bottom = 22.0
custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
-text = " ..."
[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 2 )]
-margin_left = 416.0
+margin_left = 160.0
margin_right = 1735.0
-margin_bottom = 28.0
+margin_bottom = 30.0
[node name="OptionButton" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 4 )]
margin_left = 1739.0
margin_right = 1776.0
-margin_bottom = 28.0
items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
-[node name="AudioPreview" type="AudioStreamPlayer" parent="PanelContainer"]
+[node name="Settings" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
+visible = false
+margin_top = 34.0
+margin_right = 1776.0
+margin_bottom = 54.0
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ButtonAudio" to="." method="_on_ButtonAudio_pressed"]
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ButtonClear" to="." method="_on_ButtonClear_pressed"]
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ButtonPreviewPlay" to="." method="_on_ButtonPreviewPlay_pressed"]
-[connection signal="finished" from="PanelContainer/AudioPreview" to="." method="_on_AudioPreview_finished"]
+[node name="AudioPicker" parent="PanelContainer/VBoxContainer/Settings" instance=ExtResource( 5 )]
+margin_right = 294.0
+margin_bottom = 20.0
diff --git a/addons/dialogic/Editor/Events/BackgroundMusic.gd b/addons/dialogic/Editor/Events/BackgroundMusic.gd
index 6d5300c..2adeb10 100644
--- a/addons/dialogic/Editor/Events/BackgroundMusic.gd
+++ b/addons/dialogic/Editor/Events/BackgroundMusic.gd
@@ -8,58 +8,35 @@ var editorPopup
# This is the information of this event and it will get parsed and saved to the JSON file.
var event_data = {
+ 'event_name':'BackgroundMusic',
'background-music': 'stop',
- 'file': ''
+ 'file': '',
+ 'audio_bus':'Master',
+ 'volume':0,
+ 'fade_length':1,
}
func _ready():
- load_audio('')
- $PanelContainer/VBoxContainer/Header/ButtonClear.icon = get_icon("Remove", "EditorIcons")
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.icon = get_icon("Play", "EditorIcons")
-
-
-func _on_ButtonAudio_pressed():
- editor_reference.godot_dialog("*.wav, *.ogg, *.mp3")
- editor_reference.godot_dialog_connect(self, "_on_file_selected")
-
-
-func _on_file_selected(path, target):
- target.load_audio(path)
-
-
-func load_audio(path: String):
- if not path.empty():
- $PanelContainer/VBoxContainer/Header/Name.text = path
- $PanelContainer/VBoxContainer/Header/ButtonClear.disabled = false
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.disabled = false
- event_data['file'] = path
- event_data['background-music'] = 'play'
- else:
- $PanelContainer/VBoxContainer/Header/Name.text = 'No music (will stop with fade out)'
- $PanelContainer/VBoxContainer/Header/ButtonClear.disabled = true
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.disabled = true
- event_data['file'] = ''
- event_data['background-music'] = 'stop'
-
+ $PanelContainer/VBoxContainer/Header/VisibleToggle.set_visible(true)
+ $PanelContainer/VBoxContainer/Settings/AudioPicker.editor_reference = editor_reference
+ $PanelContainer/VBoxContainer/Settings/AudioPicker.connect("audio_changed", self, "update_audio_data")
func load_data(data):
event_data = data
- load_audio(data['file'])
+ $PanelContainer/VBoxContainer/Settings/FadeLength.value = event_data.get("fade_length", 1)
+ $PanelContainer/VBoxContainer/Settings/AudioPicker.load_data(data)
-
-func _on_ButtonPreviewPlay_pressed():
- if $PanelContainer/AudioPreview.is_playing():
- $PanelContainer/AudioPreview.stop()
+func update_audio_data(file, playing, audio_bus, volume):
+ event_data['background-music'] = playing
+ event_data['file'] = file
+ event_data['audio_bus'] = audio_bus
+ event_data['volume'] = volume
+ if file:
+ $PanelContainer/VBoxContainer/Header/Preview.text = 'Plays '+file.get_file()
else:
- $PanelContainer/AudioPreview.stream = load(event_data['file'])
- $PanelContainer/AudioPreview.play()
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.icon = get_icon("Stop", "EditorIcons")
+ $PanelContainer/VBoxContainer/Header/Preview.text = 'Fades out previous background music'
+func _on_FadeLength_value_changed(value):
+ event_data['fade_length'] = value
-func _on_AudioPreview_finished():
- $PanelContainer/VBoxContainer/Header/ButtonPreviewPlay.icon = get_icon("Play", "EditorIcons")
-
-
-func _on_ButtonClear_pressed():
- load_audio('')
diff --git a/addons/dialogic/Editor/Events/BackgroundMusic.tscn b/addons/dialogic/Editor/Events/BackgroundMusic.tscn
index a8c1901..d354040 100644
--- a/addons/dialogic/Editor/Events/BackgroundMusic.tscn
+++ b/addons/dialogic/Editor/Events/BackgroundMusic.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=6 format=2]
+[gd_scene load_steps=8 format=2]
[ext_resource path="res://addons/dialogic/Editor/Events/BackgroundMusic.gd" type="Script" id=1]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/background-music.svg" type="Texture" id=3]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
-
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/AudioPicker.tscn" type="PackedScene" id=5]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.tscn" type="PackedScene" id=8]
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 16.0
@@ -55,69 +56,66 @@ size_flags_horizontal = 3
[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
margin_right = 1776.0
-margin_bottom = 28.0
+margin_bottom = 30.0
[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/Header"]
margin_right = 22.0
-margin_bottom = 28.0
+margin_bottom = 30.0
texture = ExtResource( 3 )
stretch_mode = 6
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Header"]
margin_left = 26.0
-margin_top = 7.0
+margin_top = 8.0
margin_right = 150.0
-margin_bottom = 21.0
+margin_bottom = 22.0
text = " Background Music"
-[node name="Name" type="Label" parent="PanelContainer/VBoxContainer/Header"]
+[node name="VisibleToggle" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 8 )]
margin_left = 154.0
-margin_top = 7.0
-margin_right = 368.0
-margin_bottom = 21.0
-text = "No music (will stop with fade out)"
-
-[node name="ButtonAudio" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 372.0
-margin_right = 396.0
-margin_bottom = 28.0
-text = "..."
-
-[node name="ButtonClear" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 400.0
-margin_right = 412.0
-margin_bottom = 28.0
-disabled = true
-
-[node name="ButtonPreviewPlay" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 416.0
-margin_right = 428.0
-margin_bottom = 28.0
-disabled = true
+margin_right = 184.0
+pressed = false
[node name="Preview" type="Label" parent="PanelContainer/VBoxContainer/Header"]
-visible = false
-margin_left = 103.0
+margin_left = 188.0
margin_top = 8.0
-margin_right = 131.0
+margin_right = 188.0
margin_bottom = 22.0
custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
-text = " ..."
[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 2 )]
-margin_left = 432.0
+margin_left = 192.0
margin_right = 1735.0
-margin_bottom = 28.0
+margin_bottom = 30.0
[node name="OptionButton" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 4 )]
margin_left = 1739.0
margin_right = 1776.0
-margin_bottom = 28.0
items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
-[node name="AudioPreview" type="AudioStreamPlayer" parent="PanelContainer"]
+[node name="Settings" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
+visible = false
+margin_top = 34.0
+margin_right = 1776.0
+margin_bottom = 58.0
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ButtonAudio" to="." method="_on_ButtonAudio_pressed"]
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ButtonClear" to="." method="_on_ButtonClear_pressed"]
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ButtonPreviewPlay" to="." method="_on_ButtonPreviewPlay_pressed"]
-[connection signal="finished" from="PanelContainer/AudioPreview" to="." method="_on_AudioPreview_finished"]
+[node name="AudioPicker" parent="PanelContainer/VBoxContainer/Settings" instance=ExtResource( 5 )]
+margin_right = 334.0
+margin_bottom = 24.0
+event_name = "Background Music"
+
+[node name="FadeLengthLabel" type="Label" parent="PanelContainer/VBoxContainer/Settings"]
+margin_left = 338.0
+margin_top = 5.0
+margin_right = 425.0
+margin_bottom = 19.0
+text = " Fade-length:"
+
+[node name="FadeLength" type="SpinBox" parent="PanelContainer/VBoxContainer/Settings"]
+margin_left = 429.0
+margin_right = 503.0
+margin_bottom = 24.0
+step = 0.01
+suffix = "s"
+
+[connection signal="value_changed" from="PanelContainer/VBoxContainer/Settings/FadeLength" to="." method="_on_FadeLength_value_changed"]
diff --git a/addons/dialogic/Editor/Events/ChangeBackground.gd b/addons/dialogic/Editor/Events/ChangeBackground.gd
new file mode 100644
index 0000000..a4f5592
--- /dev/null
+++ b/addons/dialogic/Editor/Events/ChangeBackground.gd
@@ -0,0 +1,52 @@
+tool
+extends Control
+
+var editor_reference
+var preview = "..."
+
+var preview_scene = preload("res://addons/dialogic/Editor/Events/Common/ImagePreview.tscn")
+
+onready var event_template = $EventTemplate
+
+var image_picker
+
+# This is the information of this event and it will get parsed and saved to the JSON file.
+var event_data = {
+ 'background': ''
+}
+
+func _ready():
+ image_picker = event_template.get_header()
+ # Needed to open the file dialog
+ image_picker.editor_reference = editor_reference
+ image_picker.connect("file_selected", self, "_on_file_selected")
+ image_picker.connect("clear_pressed", self, "_on_clear_pressed")
+
+
+func load_data(data):
+ event_data = data
+ load_image(event_data['background'])
+
+
+func load_image(img_src: String):
+ event_data['background'] = img_src
+ if not img_src.empty() and not img_src.ends_with('.tscn'):
+ event_template.set_preview("...")
+ event_template.set_body(preview_scene)
+ event_template.get_body().set_image(load(img_src))
+ image_picker.set_image(img_src)
+ elif img_src.ends_with('.tscn'):
+ event_template.set_preview("...")
+ image_picker.set_image(img_src)
+ event_template.set_body(null)
+ else:
+ event_template.set_body(null)
+ image_picker.clear_image()
+
+
+func _on_file_selected(path):
+ load_image(path)
+
+
+func _on_clear_pressed():
+ load_image('')
diff --git a/addons/dialogic/Editor/Events/ChangeBackground.tscn b/addons/dialogic/Editor/Events/ChangeBackground.tscn
new file mode 100644
index 0000000..28e8f2f
--- /dev/null
+++ b/addons/dialogic/Editor/Events/ChangeBackground.tscn
@@ -0,0 +1,26 @@
+[gd_scene load_steps=6 format=2]
+
+[ext_resource path="res://addons/dialogic/Editor/Events/ChangeBackground.gd" type="Script" id=2]
+[ext_resource path="res://addons/dialogic/Editor/Events/styles/ChangeBackground.tres" type="StyleBox" id=3]
+[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=4]
+[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/change-background.svg" type="Texture" id=6]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/ImagePicker.tscn" type="PackedScene" id=7]
+
+[node name="ChangeBackground" type="HBoxContainer"]
+anchor_right = 1.0
+margin_bottom = 44.0
+size_flags_horizontal = 3
+size_flags_vertical = 9
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="EventTemplate" parent="." instance=ExtResource( 4 )]
+anchor_right = 0.0
+margin_right = 1024.0
+margin_bottom = 46.0
+event_style = ExtResource( 3 )
+event_icon = ExtResource( 6 )
+event_name = "Change Background"
+header_scene = ExtResource( 7 )
diff --git a/addons/dialogic/Editor/Events/CharacterJoinBlock.gd b/addons/dialogic/Editor/Events/CharacterJoinBlock.gd
index e629e8d..ae22cac 100644
--- a/addons/dialogic/Editor/Events/CharacterJoinBlock.gd
+++ b/addons/dialogic/Editor/Events/CharacterJoinBlock.gd
@@ -2,8 +2,8 @@ tool
extends Control
var editor_reference
-onready var portrait_picker = $PanelContainer/VBoxContainer/Header/PortraitPicker
-
+onready var character_picker = $PanelContainer/VBoxContainer/Header/CharacterAndPortraitPicker
+onready var mirror_toggle = $PanelContainer/VBoxContainer/Header/MirrorButton
var current_color = Color('#ffffff')
var default_icon_color = Color("#65989898")
@@ -12,40 +12,36 @@ var event_data = {
'action': 'join',
'character': '',
'portrait': '',
- 'position': {"0":false,"1":false,"2":false,"3":false,"4":false}
+ 'position': {"0":false,"1":false,"2":false,"3":false,"4":false},
+ 'mirror':false
}
func _ready():
for p in $PanelContainer/VBoxContainer/Header/PositionsContainer.get_children():
p.connect('pressed', self, "position_button_pressed", [p.name])
- $PanelContainer/VBoxContainer/Header/CharacterPicker.connect('character_selected', self , '_on_character_selected')
- portrait_picker.get_popup().connect("index_pressed", self, '_on_portrait_selected')
- portrait_picker.allow_dont_change = false
+ character_picker.connect("character_changed", self, '_on_character_change')
+ character_picker.set_allow_portrait_dont_change(false)
+ mirror_toggle.icon = get_icon("MirrorX", "EditorIcons")
-func _on_character_selected(data):
+func _on_character_change(character: Dictionary, portrait: String):
# Updating icon Color
- current_color = Color(data['color'])
- var c_c_ind = 0
- for p in $PanelContainer/VBoxContainer/Header/PositionsContainer.get_children():
- if event_data['position'][str(c_c_ind)]:
- p.set('self_modulate', Color(data['color']))
- else:
- p.set('self_modulate', default_icon_color)
- c_c_ind += 1
- event_data['character'] = data['file']
- portrait_picker.set_character(event_data['character'], event_data['portrait'])
- portrait_picker.text = 'Default'
-
-
-func _on_portrait_selected(index):
- var text = portrait_picker.get_popup().get_item_text(index)
- if portrait_picker.allow_dont_change:
- if text == "[Don't change]":
- text = ''
- event_data['portrait'] = text
- portrait_picker.set_character(event_data['character'], event_data['portrait'])
+ if character.keys().size() > 0:
+ current_color = Color(character['color'])
+ var c_c_ind = 0
+ for p in $PanelContainer/VBoxContainer/Header/PositionsContainer.get_children():
+ if event_data['position'][str(c_c_ind)]:
+ p.set('self_modulate', Color(character['color']))
+ else:
+ p.set('self_modulate', default_icon_color)
+ c_c_ind += 1
+ event_data['character'] = character['file']
+ event_data['portrait'] = portrait
+ else:
+ event_data['character'] = ''
+ event_data['portrait'] = ''
+ clear_all_positions()
func position_button_pressed(name):
@@ -78,10 +74,16 @@ func check_active_position(active_color = Color("#ffffff")):
func load_data(data):
event_data = data
if data['character'] != '':
- var character_data = DialogicResources.get_character_json(data['character'])
- $PanelContainer/VBoxContainer/Header/CharacterPicker.set_data(character_data['name'], Color(character_data['color']))
- portrait_picker.set_character(data['character'], data['portrait'])
- current_color = Color(character_data['color'])
+ character_picker.set_data(data['character'], data['portrait'])
+ current_color = character_picker.get_selected_character()['color']
check_active_position(current_color)
- return
- check_active_position()
+ else:
+ check_active_position()
+
+ if data.has('mirror'):
+ mirror_toggle.pressed = data['mirror']
+ else:
+ mirror_toggle.pressed = false
+
+func _on_MirrorButton_toggled(button_pressed):
+ event_data['mirror'] = button_pressed
diff --git a/addons/dialogic/Editor/Events/CharacterJoinBlock.tscn b/addons/dialogic/Editor/Events/CharacterJoinBlock.tscn
index c934990..dc26a75 100644
--- a/addons/dialogic/Editor/Events/CharacterJoinBlock.tscn
+++ b/addons/dialogic/Editor/Events/CharacterJoinBlock.tscn
@@ -1,15 +1,11 @@
-[gd_scene load_steps=9 format=2]
+[gd_scene load_steps=8 format=2]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=1]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=2]
[ext_resource path="res://addons/dialogic/Editor/Events/CharacterJoinBlock.gd" type="Script" id=3]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/character-join.svg" type="Texture" id=4]
[ext_resource path="res://addons/dialogic/Images/Event Icons/character.svg" type="Texture" id=5]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/PortraitPicker.tscn" type="PackedScene" id=7]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/CharacterPicker.tscn" type="PackedScene" id=8]
-
-
-
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.tscn" type="PackedScene" id=6]
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 16.0
@@ -72,14 +68,12 @@ margin_right = 130.0
margin_bottom = 22.0
text = " Character join: "
-[node name="CharacterPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 8 )]
+[node name="CharacterAndPortraitPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 6 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
margin_left = 134.0
margin_right = 240.0
-
-[node name="PortraitPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 7 )]
-visible = false
-margin_left = 278.0
-margin_right = 361.0
+margin_bottom = 30.0
[node name="LabelPosition" type="Label" parent="PanelContainer/VBoxContainer/Header"]
margin_left = 244.0
@@ -127,8 +121,17 @@ margin_right = 186.0
margin_bottom = 30.0
icon = ExtResource( 5 )
-[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 1 )]
+[node name="MirrorButton" type="ToolButton" parent="PanelContainer/VBoxContainer/Header"]
margin_left = 502.0
+margin_right = 514.0
+margin_bottom = 30.0
+hint_tooltip = "Mirrors the character"
+focus_mode = 0
+toggle_mode = true
+enabled_focus_mode = 0
+
+[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 1 )]
+margin_left = 518.0
margin_right = 1735.0
margin_bottom = 30.0
@@ -136,3 +139,5 @@ margin_bottom = 30.0
margin_left = 1739.0
margin_right = 1776.0
items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
+
+[connection signal="toggled" from="PanelContainer/VBoxContainer/Header/MirrorButton" to="." method="_on_MirrorButton_toggled"]
diff --git a/addons/dialogic/Editor/Events/Choice.gd b/addons/dialogic/Editor/Events/Choice.gd
index 1ff952b..9742013 100644
--- a/addons/dialogic/Editor/Events/Choice.gd
+++ b/addons/dialogic/Editor/Events/Choice.gd
@@ -4,23 +4,37 @@ extends Control
var editor_reference
var editorPopup
+onready var definition_picker = $PanelContainer/VBoxContainer/Header/Condition/DefinitionPicker
+onready var condition_picker = $PanelContainer/VBoxContainer/Header/Condition/ConditionPicker
+onready var condition_line_edit = $PanelContainer/VBoxContainer/Header/Condition/CustomLineEdit2
+onready var condition_checkbox = $PanelContainer/VBoxContainer/Header/ConditionCheckBox
+
# This is the information of this event and it will get parsed and saved to the JSON file.
var event_data = {
- 'choice': ''
+ 'choice': '',
+ 'condition': '',
+ 'definition': '',
+ 'value': ''
}
func _ready():
$PanelContainer/VBoxContainer/Header/Warning.visible = false
$PanelContainer/VBoxContainer/Header/CustomLineEdit.connect('text_changed', self, '_on_LineEdit_text_changed')
- pass
+ definition_picker.get_popup().connect("index_pressed", self, '_on_definition_entry_selected')
+ condition_picker.get_popup().connect("index_pressed", self, '_on_condition_entry_selected')
func load_data(data):
event_data = data
$PanelContainer/VBoxContainer/Header/CustomLineEdit.text = event_data['choice']
-
+ if event_data.has('condition') and event_data.has('definition') and event_data.has('value'):
+ condition_checkbox.pressed = not event_data['condition'].empty() and not event_data['definition'].empty() and not event_data['value'].empty()
+ else:
+ _reset_conditions()
+ condition_checkbox.pressed = false
+ _load_condition_data(event_data)
func _on_LineEdit_text_changed(new_text):
event_data['choice'] = new_text
@@ -28,3 +42,39 @@ func _on_LineEdit_text_changed(new_text):
func _on_Indent_visibility_changed():
$PanelContainer/VBoxContainer/Header/Warning.visible = !$Indent.visible
+
+
+func _load_condition_data(event_data):
+ condition_line_edit.text = event_data['value']
+ definition_picker.load_definition(event_data['definition'])
+ condition_picker.load_condition(event_data['condition'])
+
+
+func _reset_conditions():
+ event_data['condition'] = ''
+ event_data['definition'] = ''
+ event_data['value'] = ''
+
+
+func _on_ConditionCheckBox_toggled(button_pressed):
+ $PanelContainer/VBoxContainer/Header/Condition.visible = button_pressed
+ if not button_pressed:
+ _reset_conditions()
+ _load_condition_data(event_data)
+ elif event_data['condition'].empty():
+ event_data['condition'] = '=='
+ _load_condition_data(event_data)
+
+
+func _on_CustomLineEdit2_text_changed(new_text):
+ event_data['value'] = new_text
+
+
+func _on_definition_entry_selected(index):
+ var metadata = definition_picker.get_popup().get_item_metadata(index)
+ event_data['definition'] = metadata['id']
+
+
+func _on_condition_entry_selected(index):
+ var metadata = condition_picker.get_popup().get_item_metadata(index)
+ event_data['condition'] = metadata['condition']
diff --git a/addons/dialogic/Editor/Events/Choice.tscn b/addons/dialogic/Editor/Events/Choice.tscn
index c753c23..c34627a 100644
--- a/addons/dialogic/Editor/Events/Choice.tscn
+++ b/addons/dialogic/Editor/Events/Choice.tscn
@@ -1,14 +1,13 @@
-[gd_scene load_steps=8 format=2]
+[gd_scene load_steps=10 format=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/choice.svg" type="Texture" id=1]
[ext_resource path="res://addons/dialogic/Editor/Events/Choice.gd" type="Script" id=2]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/ConditionPicker.tscn" type="PackedScene" id=5]
[ext_resource path="res://addons/dialogic/Images/Event Icons/warning.svg" type="Texture" id=6]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/CustomLineEdit.tscn" type="PackedScene" id=7]
-
-
-
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/DefinitionPicker.tscn" type="PackedScene" id=8]
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 16.0
@@ -94,15 +93,52 @@ margin_left = 50.0
margin_right = 98.0
margin_bottom = 28.0
-[node name="Preview" type="Label" parent="PanelContainer/VBoxContainer/Header"]
+[node name="Spacer2" type="Control" parent="PanelContainer/VBoxContainer/Header"]
margin_left = 102.0
+margin_right = 112.0
+margin_bottom = 28.0
+rect_min_size = Vector2( 10, 0 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ConditionCheckBox" type="CheckBox" parent="PanelContainer/VBoxContainer/Header"]
+margin_left = 116.0
+margin_right = 238.0
+margin_bottom = 28.0
+text = "Has condition?"
+
+[node name="Condition" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Header"]
+visible = false
+margin_left = 228.0
+margin_right = 506.0
+margin_bottom = 28.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="DefinitionPicker" parent="PanelContainer/VBoxContainer/Header/Condition" instance=ExtResource( 8 )]
+margin_right = 143.0
+margin_bottom = 28.0
+
+[node name="ConditionPicker" parent="PanelContainer/VBoxContainer/Header/Condition" instance=ExtResource( 5 )]
+margin_left = 147.0
+margin_right = 226.0
+
+[node name="CustomLineEdit2" parent="PanelContainer/VBoxContainer/Header/Condition" instance=ExtResource( 7 )]
+margin_left = 230.0
+margin_right = 278.0
+margin_bottom = 28.0
+
+[node name="Preview" type="Label" parent="PanelContainer/VBoxContainer/Header"]
+margin_left = 242.0
margin_top = 7.0
-margin_right = 102.0
+margin_right = 242.0
margin_bottom = 21.0
custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 3 )]
-margin_left = 106.0
+margin_left = 246.0
margin_right = 941.0
margin_bottom = 28.0
@@ -111,4 +147,7 @@ margin_left = 945.0
margin_right = 982.0
margin_bottom = 28.0
items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
+
[connection signal="visibility_changed" from="Indent" to="." method="_on_Indent_visibility_changed"]
+[connection signal="toggled" from="PanelContainer/VBoxContainer/Header/ConditionCheckBox" to="." method="_on_ConditionCheckBox_toggled"]
+[connection signal="text_changed" from="PanelContainer/VBoxContainer/Header/Condition/CustomLineEdit2" to="." method="_on_CustomLineEdit2_text_changed"]
diff --git a/addons/dialogic/Editor/Events/CloseDialog.gd b/addons/dialogic/Editor/Events/CloseDialog.gd
index d715fc0..b51b3b5 100644
--- a/addons/dialogic/Editor/Events/CloseDialog.gd
+++ b/addons/dialogic/Editor/Events/CloseDialog.gd
@@ -7,12 +7,16 @@ var editorPopup
# This is the information of this event and it will get parsed and saved to the JSON file.
var event_data = {
- 'close_dialog': ''
+ 'close_dialog': '',
+ 'transition_duration': 1.0
}
-func _ready():
- pass
-
func load_data(data):
event_data = data
+ if not event_data.has('transition_duration'):
+ event_data['transition_duration'] = 1.0
+ $PanelContainer/VBoxContainer/Header/SpinBox.value = event_data['transition_duration']
+
+func _on_SpinBox_value_changed(value):
+ event_data['transition_duration'] = value
diff --git a/addons/dialogic/Editor/Events/CloseDialog.tscn b/addons/dialogic/Editor/Events/CloseDialog.tscn
index 703ca2e..43a39f2 100644
--- a/addons/dialogic/Editor/Events/CloseDialog.tscn
+++ b/addons/dialogic/Editor/Events/CloseDialog.tscn
@@ -1,13 +1,11 @@
-[gd_scene load_steps=6 format=2]
+[gd_scene load_steps=7 format=2]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/SpinBoxPreventDnD.gd" type="Script" id=1]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg" type="Texture" id=2]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=3]
[ext_resource path="res://addons/dialogic/Editor/Events/CloseDialog.gd" type="Script" id=4]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=5]
-
-
-
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 16.0
content_margin_right = 6.0
@@ -66,19 +64,36 @@ stretch_mode = 6
[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Header"]
margin_left = 26.0
margin_top = 7.0
-margin_right = 113.0
+margin_right = 121.0
margin_bottom = 21.0
-text = " Close Dialog"
+text = " Close Dialog "
+
+[node name="SpinBox" type="SpinBox" parent="PanelContainer/VBoxContainer/Header"]
+margin_left = 125.0
+margin_right = 199.0
+margin_bottom = 28.0
+step = 0.1
+value = 1.0
+allow_greater = true
+align = 1
+script = ExtResource( 1 )
+
+[node name="Title2" type="Label" parent="PanelContainer/VBoxContainer/Header"]
+margin_left = 203.0
+margin_top = 7.0
+margin_right = 324.0
+margin_bottom = 21.0
+text = " Fade-out duration"
[node name="Preview" type="Label" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 117.0
+margin_left = 328.0
margin_top = 7.0
-margin_right = 117.0
+margin_right = 328.0
margin_bottom = 21.0
custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 5 )]
-margin_left = 121.0
+margin_left = 332.0
margin_right = 1735.0
margin_bottom = 28.0
@@ -87,3 +102,4 @@ margin_left = 1739.0
margin_right = 1776.0
margin_bottom = 28.0
items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
+[connection signal="value_changed" from="PanelContainer/VBoxContainer/Header/SpinBox" to="." method="_on_SpinBox_value_changed"]
diff --git a/addons/dialogic/Editor/Events/Common/AudioPicker.gd b/addons/dialogic/Editor/Events/Common/AudioPicker.gd
new file mode 100644
index 0000000..c844cc6
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/AudioPicker.gd
@@ -0,0 +1,106 @@
+tool
+extends HBoxContainer
+
+var editor_reference
+var editorPopup
+
+export (String) var event_name = 'Audio Event'
+
+var file : String
+var audio : String
+var audio_bus : String = "Master"
+var volume: float = 0
+
+signal audio_changed(file, audio, audio_bus, volume)
+
+func _ready():
+ load_audio('')
+ AudioServer.connect("bus_layout_changed", self, "update_bus_selector")
+ $ButtonClear.icon = get_icon("Remove", "EditorIcons")
+ $ButtonPreviewPlay.icon = get_icon("Play", "EditorIcons")
+ update_bus_selector()
+
+func _on_ButtonAudio_pressed():
+ editor_reference.godot_dialog("*.wav, *.ogg, *.mp3")
+ editor_reference.godot_dialog_connect(self, "_on_file_selected")
+
+func _on_file_selected(path, target):
+ target.load_audio(path) # why is the targer needed? Couldn't it just call itself?
+
+func load_audio(path: String):
+ if not path.empty():
+ $Name.text = path.get_file()
+ $Name.hint_tooltip = path
+ $ButtonAudio.hint_tooltip = path
+ $ButtonClear.disabled = false
+ $ButtonPreviewPlay.disabled = false
+ file = path
+ audio = 'play'
+ emit_signal("audio_changed", file, audio, audio_bus, volume)
+
+ show_options()
+ else:
+ $Name.text = 'No sound (will stop previous '+event_name+')'
+ file = ''
+ audio = 'stop'
+ emit_signal("audio_changed", file, audio, audio_bus, volume)
+
+ hide_options()
+
+func load_data(data):
+ file = data['file']
+ if data.has('audio'): audio = data['audio']
+ if data.has('background-music'): audio = data['background-music']
+
+ if data.has('audio_bus'): audio_bus = data['audio_bus']
+
+ for idx in range($BusSelector.get_item_count()):
+ if $BusSelector.get_item_text(idx) == audio_bus:
+ $BusSelector.select(idx)
+
+ if data.has('volume'): volume = data['volume']
+ $Volume.value = volume
+ load_audio(file)
+
+func _on_ButtonPreviewPlay_pressed():
+ if $AudioPreview.is_playing():
+ $AudioPreview.stop()
+ else:
+ $AudioPreview.stream = load(file)
+ $AudioPreview.bus = audio_bus
+ $AudioPreview.volume_db = volume
+ $AudioPreview.play()
+ $ButtonPreviewPlay.icon = get_icon("Stop", "EditorIcons")
+
+func _on_AudioPreview_finished():
+ $ButtonPreviewPlay.icon = get_icon("Play", "EditorIcons")
+
+func _on_ButtonClear_pressed():
+ load_audio('')
+
+func update_bus_selector():
+ $BusSelector.clear()
+ for i in range(AudioServer.bus_count):
+ $BusSelector.add_item(AudioServer.get_bus_name(i))
+
+func _on_BusSelector_item_selected(index):
+ audio_bus = $BusSelector.get_item_text(index)
+ emit_signal("audio_changed", file, audio, audio_bus, volume)
+
+func _on_Volume_value_changed(value):
+ volume = value
+ emit_signal("audio_changed", file, audio, audio_bus, volume)
+
+func show_options():
+ $ButtonClear.show()
+ $ButtonPreviewPlay.show()
+ $BusSelector.show()
+ $VolumeLabel.show()
+ $Volume.show()
+
+func hide_options():
+ $ButtonClear.hide()
+ $ButtonPreviewPlay.hide()
+ $BusSelector.hide()
+ $VolumeLabel.hide()
+ $Volume.hide()
diff --git a/addons/dialogic/Editor/Events/Common/AudioPicker.tscn b/addons/dialogic/Editor/Events/Common/AudioPicker.tscn
new file mode 100644
index 0000000..3f1a46f
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/AudioPicker.tscn
@@ -0,0 +1,101 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/AudioPicker.gd" type="Script" id=1]
+
+[sub_resource type="Image" id=3]
+data = {
+"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
+"format": "LumAlpha8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id=2]
+flags = 4
+flags = 4
+image = SubResource( 3 )
+size = Vector2( 16, 16 )
+
+[node name="AudioPicker" type="HBoxContainer"]
+margin_right = 40.0
+margin_bottom = 40.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Name" type="Label" parent="."]
+margin_top = 13.0
+margin_right = 266.0
+margin_bottom = 27.0
+mouse_filter = 1
+text = "No sound (will stop previous Audio Event)"
+
+[node name="ButtonAudio" type="Button" parent="."]
+margin_left = 270.0
+margin_right = 294.0
+margin_bottom = 40.0
+text = "..."
+
+[node name="ButtonClear" type="Button" parent="."]
+visible = false
+margin_left = 297.0
+margin_right = 325.0
+margin_bottom = 40.0
+disabled = true
+icon = SubResource( 2 )
+
+[node name="ButtonPreviewPlay" type="Button" parent="."]
+visible = false
+margin_left = 329.0
+margin_right = 357.0
+margin_bottom = 40.0
+disabled = true
+icon = SubResource( 2 )
+
+[node name="BusSelector" type="OptionButton" parent="."]
+visible = false
+margin_left = 361.0
+margin_right = 390.0
+margin_bottom = 40.0
+text = "Master"
+items = [ "Master", null, false, 0, null, "Cool new bus", null, false, 1, null ]
+selected = 0
+
+[node name="VolumeLabel" type="Label" parent="."]
+margin_left = 298.0
+margin_top = 13.0
+margin_right = 359.0
+margin_bottom = 27.0
+text = " Volume:"
+
+[node name="Volume" type="SpinBox" parent="."]
+margin_left = 363.0
+margin_right = 437.0
+margin_bottom = 40.0
+min_value = -80.0
+max_value = 24.0
+step = 0.01
+suffix = "dB"
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Preview" type="Label" parent="."]
+visible = false
+margin_left = 329.0
+margin_top = 13.0
+margin_right = 357.0
+margin_bottom = 27.0
+custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
+text = " ..."
+
+[node name="AudioPreview" type="AudioStreamPlayer" parent="."]
+
+[connection signal="pressed" from="ButtonAudio" to="." method="_on_ButtonAudio_pressed"]
+[connection signal="pressed" from="ButtonClear" to="." method="_on_ButtonClear_pressed"]
+[connection signal="pressed" from="ButtonPreviewPlay" to="." method="_on_ButtonPreviewPlay_pressed"]
+[connection signal="item_selected" from="BusSelector" to="." method="_on_BusSelector_item_selected"]
+[connection signal="value_changed" from="Volume" to="." method="_on_Volume_value_changed"]
+[connection signal="finished" from="AudioPreview" to="." method="_on_AudioPreview_finished"]
diff --git a/addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.gd b/addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.gd
new file mode 100644
index 0000000..a6508dc
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.gd
@@ -0,0 +1,56 @@
+tool
+extends HBoxContainer
+
+onready var character_picker = $CharacterPicker
+onready var portrait_picker = $PortraitPicker
+
+signal character_changed(character, portrait)
+
+var allow_portrait_dont_change := true
+
+var character := {}
+var portrait: String
+
+
+func _ready():
+ character_picker.connect('character_selected', self , '_on_character_selected')
+ portrait_picker.connect("portrait_selected", self, '_on_portrait_selected')
+
+
+func set_allow_portrait_dont_change(dont_allow: bool):
+ allow_portrait_dont_change = dont_allow
+ portrait_picker.allow_dont_change = dont_allow
+
+
+func set_data(c: String, p: String):
+ character = {}
+ for ch in DialogicUtil.get_character_list():
+ if ch['file'] == c:
+ character = ch
+
+ if character.has('name') and character.has('color'):
+ character_picker.set_data(character['name'], Color(character['color']))
+ portrait_picker.set_character(character, p)
+ else:
+ character_picker.set_data('', Color('#FFFFFF'))
+ portrait_picker.set_character({}, '')
+
+
+
+func _on_character_selected(data: Dictionary):
+ character = data
+ if allow_portrait_dont_change or character.keys().size() == 0:
+ portrait = ''
+ else:
+ portrait = 'Default'
+ portrait_picker.set_character(character)
+ emit_signal("character_changed", character, portrait)
+
+
+func _on_portrait_selected(p: String):
+ portrait = p
+ emit_signal("character_changed", character, portrait)
+
+
+func get_selected_character() -> Dictionary:
+ return character
diff --git a/addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.tscn b/addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.tscn
new file mode 100644
index 0000000..e940a88
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.tscn
@@ -0,0 +1,23 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.tscn" type="PackedScene" id=1]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.gd" type="Script" id=3]
+
+[node name="CharacterAndPortraitPicker" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_right = -880.0
+margin_bottom = -570.0
+rect_min_size = Vector2( 144, 30 )
+script = ExtResource( 3 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="CharacterPicker" parent="." instance=ExtResource( 2 )]
+
+[node name="PortraitPicker" parent="." instance=ExtResource( 1 )]
+visible = false
+margin_left = 110.0
+margin_right = 144.0
diff --git a/addons/dialogic/Editor/Events/Common/CharacterPicker.gd b/addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.gd
similarity index 56%
rename from addons/dialogic/Editor/Events/Common/CharacterPicker.gd
rename to addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.gd
index 8606210..f746e15 100644
--- a/addons/dialogic/Editor/Events/Common/CharacterPicker.gd
+++ b/addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.gd
@@ -1,7 +1,7 @@
tool
extends HBoxContainer
-signal character_selected(value)
+signal character_selected(data)
func _ready():
@@ -11,36 +11,35 @@ func _ready():
func _on_Dropdown_about_to_show():
var popup = $Dropdown.get_popup()
popup.clear()
- popup.add_item('No Character')
- popup.set_item_metadata(0, {'file': '', 'color': Color('#ffffff')})
+ popup.add_item('[Character]')
+ popup.set_item_metadata(0, {})
var index = 1
for c in DialogicUtil.get_sorted_character_list():
popup.add_item(c['name'])
- popup.set_item_metadata(index, {'file': c['file'],'color': c['color']})
+ popup.set_item_metadata(index, c)
index += 1
func _on_character_selected(index: int):
- var data = {'file': '', 'color': Color('#FFFFFF')}
+ var metadata = $Dropdown.get_popup().get_item_metadata(index)
if index == 0:
set_data('[Character]', Color('#FFFFFF'))
else:
- var metadata = $Dropdown.get_popup().get_item_metadata(index)
set_data($Dropdown.get_popup().get_item_text(index), metadata['color'])
- data['file'] = metadata['file']
- data['color'] = metadata['color']
-
- emit_signal('character_selected', data)
- return data
+ emit_signal('character_selected', metadata)
+ return metadata
-func set_data_by_file(file_name):
+func set_data_by_file(file_name: String):
# This method is used when you don't know the character's color
var character = DialogicResources.get_character_json(file_name)
set_data(character['name'], Color(character['color']))
-func set_data(text: String, color:Color = Color('#FFFFFF')) -> void:
- $Dropdown.text = text
+func set_data(text: String, color: Color = Color('#FFFFFF')):
+ if not text.empty():
+ $Dropdown.text = text
+ else:
+ $Dropdown.text = '[Character]'
$Icon.set("self_modulate", Color(color))
diff --git a/addons/dialogic/Editor/Events/Common/CharacterPicker.tscn b/addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.tscn
similarity index 94%
rename from addons/dialogic/Editor/Events/Common/CharacterPicker.tscn
rename to addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.tscn
index 649a2a5..11479c4 100644
--- a/addons/dialogic/Editor/Events/Common/CharacterPicker.tscn
+++ b/addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.tscn
@@ -1,10 +1,7 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/character.svg" type="Texture" id=1]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/CharacterPicker.gd" type="Script" id=2]
-
-
-
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/CharacterPicker.gd" type="Script" id=2]
[node name="CharacterPicker" type="HBoxContainer"]
margin_right = 106.0
@@ -30,5 +27,4 @@ margin_bottom = 30.0
focus_mode = 2
text = "[Character]"
flat = false
-
[connection signal="about_to_show" from="Dropdown" to="." method="_on_Dropdown_about_to_show"]
diff --git a/addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.gd b/addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.gd
new file mode 100644
index 0000000..52f0967
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.gd
@@ -0,0 +1,54 @@
+tool
+extends MenuButton
+
+var character := {}
+var portrait := ""
+
+var allow_dont_change := true
+
+signal portrait_selected(portrait)
+
+
+func _ready():
+ visible = false
+ connect("about_to_show", self, '_on_about_to_show')
+ get_popup().connect("index_pressed", self, '_on_portrait_selected')
+ if not allow_dont_change:
+ _set_portrait('Default')
+
+
+func set_character(c: Dictionary, p: String = '') -> void:
+ character = c
+ visible = character.has('portraits') and character['portraits'].size() > 1
+ _set_portrait('Default')
+ if allow_dont_change and (p == "[Don't change]" or p.empty()):
+ _set_portrait('')
+ elif visible:
+ for port in character['portraits']:
+ if port['name'] == p:
+ _set_portrait(p)
+
+func _set_portrait(val: String):
+ if (val.empty() or val == "[Don't change]") and allow_dont_change:
+ text = "[Don't change]"
+ portrait = ""
+ else:
+ text = val
+ portrait = val
+
+
+func _on_about_to_show():
+ get_popup().clear()
+ var index = 0
+ if allow_dont_change:
+ get_popup().add_item("[Don't change]")
+ index += 1
+ if character.has('portraits'):
+ for p in character['portraits']:
+ get_popup().add_item(p['name'])
+ index += 1
+
+
+func _on_portrait_selected(index: int):
+ set_character(character, get_popup().get_item_text(index))
+ emit_signal("portrait_selected", portrait)
diff --git a/addons/dialogic/Editor/Events/Common/PortraitPicker.tscn b/addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.tscn
similarity index 75%
rename from addons/dialogic/Editor/Events/Common/PortraitPicker.tscn
rename to addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.tscn
index 1581038..040060d 100644
--- a/addons/dialogic/Editor/Events/Common/PortraitPicker.tscn
+++ b/addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.tscn
@@ -1,7 +1,8 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Portrait.svg" type="Texture" id=1]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/PortraitPicker.gd" type="Script" id=2]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/PortraitPicker.gd" type="Script" id=2]
+
diff --git a/addons/dialogic/Editor/Events/Common/ImagePicker.gd b/addons/dialogic/Editor/Events/Common/ImagePicker.gd
new file mode 100644
index 0000000..89b1e38
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/ImagePicker.gd
@@ -0,0 +1,34 @@
+tool
+extends HBoxContainer
+
+var editor_reference
+
+signal clear_pressed()
+signal file_selected()
+
+onready var name_label = $Name
+onready var clear_button = $ClearButton
+
+
+func set_image(src: String):
+ clear_button.disabled = false
+ name_label.text = src;
+
+
+func clear_image():
+ clear_button.disabled = true
+ name_label.text = 'No image (will clear previous scene event)'
+
+
+func _on_file_selected(path, target):
+ emit_signal("file_selected", path)
+
+
+func _on_ImageButton_pressed():
+ editor_reference.godot_dialog("*.png, *.jpg, *.jpeg, *.tga, *.svg, *.svgz, *.bmp, *.webp, *.tscn")
+ editor_reference.godot_dialog_connect(self, "_on_file_selected")
+
+
+func _on_ClearButton_pressed():
+ clear_image()
+ emit_signal("clear_pressed")
diff --git a/addons/dialogic/Editor/Events/Common/ImagePicker.tscn b/addons/dialogic/Editor/Events/Common/ImagePicker.tscn
new file mode 100644
index 0000000..71bd81d
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/ImagePicker.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/dialogic/Images/Context Menus/Remove.svg" type="Texture" id=1]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/ImagePicker.gd" type="Script" id=2]
+
+[node name="ImagePicker" type="HBoxContainer"]
+margin_left = 154.0
+margin_right = 485.0
+margin_bottom = 28.0
+script = ExtResource( 2 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Name" type="Label" parent="."]
+margin_top = 7.0
+margin_right = 271.0
+margin_bottom = 21.0
+text = "No image (will clear previous scene event)"
+
+[node name="ImageButton" type="Button" parent="."]
+margin_left = 275.0
+margin_right = 299.0
+margin_bottom = 28.0
+text = "..."
+
+[node name="ClearButton" type="Button" parent="."]
+margin_left = 303.0
+margin_right = 331.0
+margin_bottom = 28.0
+disabled = true
+icon = ExtResource( 1 )
+[connection signal="pressed" from="ImageButton" to="." method="_on_ImageButton_pressed"]
+[connection signal="pressed" from="ClearButton" to="." method="_on_ClearButton_pressed"]
diff --git a/addons/dialogic/Editor/Events/Common/ImagePreview.gd b/addons/dialogic/Editor/Events/Common/ImagePreview.gd
new file mode 100644
index 0000000..bf90dce
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/ImagePreview.gd
@@ -0,0 +1,15 @@
+tool
+extends CenterContainer
+
+onready var texture_rect = $TextureRect
+
+var previw_size = 200
+
+func set_image(image: Texture):
+ texture_rect.texture = image
+ if image != null:
+ texture_rect.rect_size = Vector2(previw_size, previw_size)
+ texture_rect.rect_min_size = Vector2(previw_size, previw_size)
+ else:
+ texture_rect.rect_size = Vector2(0, 0)
+ texture_rect.rect_min_size = Vector2(0, 0)
diff --git a/addons/dialogic/Editor/Events/Common/ImagePreview.tscn b/addons/dialogic/Editor/Events/Common/ImagePreview.tscn
new file mode 100644
index 0000000..5a9a434
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Common/ImagePreview.tscn
@@ -0,0 +1,25 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/ImagePreview.gd" type="Script" id=1]
+
+[node name="ImagePreview" type="CenterContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_right = -824.0
+margin_bottom = -400.0
+mouse_filter = 1
+size_flags_horizontal = 3
+size_flags_vertical = 3
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TextureRect" type="TextureRect" parent="."]
+margin_right = 200.0
+margin_bottom = 200.0
+rect_min_size = Vector2( 200, 200 )
+size_flags_horizontal = 5
+size_flags_vertical = 5
+expand = true
+stretch_mode = 6
diff --git a/addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn b/addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn
index 71b403d..096fcc7 100644
--- a/addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn
+++ b/addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn
@@ -3,8 +3,6 @@
[ext_resource path="res://addons/dialogic/Images/Pieces/expand-icon.svg" type="Texture" id=1]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.gd" type="Script" id=2]
-
-
[node name="OptionButton" type="MenuButton"]
margin_left = 1749.0
margin_right = 1786.0
diff --git a/addons/dialogic/Editor/Events/Common/PortraitPicker.gd b/addons/dialogic/Editor/Events/Common/PortraitPicker.gd
deleted file mode 100644
index a6006a2..0000000
--- a/addons/dialogic/Editor/Events/Common/PortraitPicker.gd
+++ /dev/null
@@ -1,44 +0,0 @@
-tool
-extends MenuButton
-
-var character
-var portrait
-
-var allow_dont_change:bool = true
-
-
-func _ready():
- visible = false
- connect("about_to_show", self, '_on_about_to_show')
- if allow_dont_change == false:
- text = 'Default'
-
-
-func set_character(c: String, p: String = '') -> void:
- character = c
- portrait = p
- visible = false
- for c in DialogicUtil.get_character_list():
- if c['file'] == character:
- if c.has('portraits'):
- if c['portraits'].size() > 1:
- visible = true
- for p in c['portraits']:
- if p['name'] == portrait:
- text = portrait
- if allow_dont_change:
- if p == "[Don't change]":
- text = ''
-
-
-func _on_about_to_show():
- get_popup().clear()
- var index = 0
- if allow_dont_change:
- get_popup().add_item("[Don't change]")
- index += 1
- for c in DialogicUtil.get_sorted_character_list():
- if c['file'] == character:
- for p in c['portraits']:
- get_popup().add_item(p['name'])
- index += 1
diff --git a/addons/dialogic/Editor/Events/Question.gd b/addons/dialogic/Editor/Events/Question.gd
index ca4c3e5..7cf13b7 100644
--- a/addons/dialogic/Editor/Events/Question.gd
+++ b/addons/dialogic/Editor/Events/Question.gd
@@ -13,15 +13,14 @@ var event_data = {
'portrait': '',
}
-onready var portrait_picker = $PanelContainer/VBoxContainer/Header/PortraitPicker
+onready var character_picker = $PanelContainer/VBoxContainer/Header/CharacterAndPortraitPicker
func _ready():
- $PanelContainer/VBoxContainer/Header/CharacterPicker.connect('character_selected', self , '_on_character_selected')
- portrait_picker.get_popup().connect("index_pressed", self, '_on_portrait_selected')
+ character_picker.connect("character_changed", self, '_on_character_changed')
var c_list = DialogicUtil.get_sorted_character_list()
if c_list.size() == 0:
- $PanelContainer/VBoxContainer/Header/CharacterPicker.visible = false
+ character_picker.visible = false
else:
# Default Speaker
for c in c_list:
@@ -36,31 +35,17 @@ func load_data(data):
event_data['portrait'] = ''
$PanelContainer/VBoxContainer/Header/LineEdit.text = event_data['question']
- update_preview()
+ character_picker.set_data(event_data['character'], event_data['portrait'])
func _on_LineEdit_text_changed(new_text):
event_data['question'] = new_text
-func _on_character_selected(data):
- event_data['character'] = data['file']
- update_preview()
-
-
-func _on_portrait_selected(index):
- var text = portrait_picker.get_popup().get_item_text(index)
- if text == "[Don't change]":
- text = ''
- portrait_picker.text = ''
- event_data['portrait'] = text
- update_preview()
-
-
-func update_preview():
- portrait_picker.set_character(event_data['character'], event_data['portrait'])
-
- for c in DialogicUtil.get_character_list():
- if c['file'] == event_data['character']:
- $PanelContainer/VBoxContainer/Header/CharacterPicker.set_data_by_file(event_data['character'])
-
+func _on_character_changed(character_data: Dictionary, portrait: String) -> void:
+ if character_data.keys().size() > 0:
+ event_data['character'] = character_data['file']
+ event_data['portrait'] = portrait
+ else:
+ event_data['character'] = ''
+ event_data['portrait'] = ''
diff --git a/addons/dialogic/Editor/Events/Question.tscn b/addons/dialogic/Editor/Events/Question.tscn
index 3f73802..e89eb4f 100644
--- a/addons/dialogic/Editor/Events/Question.tscn
+++ b/addons/dialogic/Editor/Events/Question.tscn
@@ -1,11 +1,10 @@
-[gd_scene load_steps=8 format=2]
+[gd_scene load_steps=7 format=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/question.svg" type="Texture" id=1]
[ext_resource path="res://addons/dialogic/Editor/Events/Question.gd" type="Script" id=2]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=3]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/CharacterPicker.tscn" type="PackedScene" id=5]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/PortraitPicker.tscn" type="PackedScene" id=6]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.tscn" type="PackedScene" id=5]
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 16.0
@@ -78,14 +77,13 @@ margin_left = 26.0
margin_right = 30.0
margin_bottom = 28.0
-[node name="CharacterPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 5 )]
+[node name="CharacterAndPortraitPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 5 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
margin_left = 34.0
margin_right = 140.0
margin_bottom = 28.0
-[node name="PortraitPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 6 )]
-visible = false
-
[node name="VSeparator2" type="VSeparator" parent="PanelContainer/VBoxContainer/Header"]
margin_left = 144.0
margin_right = 148.0
diff --git a/addons/dialogic/Editor/Events/SceneEvent.gd b/addons/dialogic/Editor/Events/SceneEvent.gd
deleted file mode 100644
index 0f38cb7..0000000
--- a/addons/dialogic/Editor/Events/SceneEvent.gd
+++ /dev/null
@@ -1,60 +0,0 @@
-tool
-extends Control
-
-var editor_reference
-var editorPopup
-var preview = "..."
-onready var toggler = get_node("PanelContainer/VBoxContainer/Header/VisibleToggle")
-
-# This is the information of this event and it will get parsed and saved to the JSON file.
-var event_data = {
- 'background': ''
-}
-
-
-func _ready():
- connect("gui_input", self, '_on_gui_input')
-
-
-func load_data(data):
- event_data = data
- print("loading")
- print(data)
- load_image(event_data['background'])
-
-
-func load_image(img_src: String):
- event_data['background'] = img_src
- if not img_src.empty() and not img_src.ends_with('.tscn'):
- $PanelContainer/VBoxContainer/Header/Name.text = img_src
- $PanelContainer/VBoxContainer/TextureRect.texture = load(img_src)
- $PanelContainer/VBoxContainer/TextureRect.rect_min_size = Vector2(200,200)
- $PanelContainer/VBoxContainer/Header/ClearButton.disabled = false
- preview = "..."
- toggler.show()
- toggler.set_visible(true)
- else:
- $PanelContainer/VBoxContainer/Header/Name.text = 'No image (will clear previous scene event)'
- $PanelContainer/VBoxContainer/TextureRect.rect_min_size = Vector2(0,0)
- $PanelContainer/VBoxContainer/Header/ClearButton.disabled = true
- preview = ""
- toggler.hide()
- toggler.set_visible(false)
-
-
-func _on_gui_input(event):
- if event is InputEventMouseButton and event.is_pressed() and event.doubleclick and event.button_index == 1 and toggler.visible:
- toggler.set_visible(not toggler.pressed)
-
-
-func _on_ImageButton_pressed():
- editor_reference.godot_dialog("*.png, *.jpg, *.jpeg, *.tga, *.svg, *.svgz, *.bmp, *.webp, *.tscn")
- editor_reference.godot_dialog_connect(self, "_on_file_selected")
-
-
-func _on_file_selected(path, target):
- target.load_image(path)
-
-
-func _on_ClearButton_pressed():
- load_image('')
diff --git a/addons/dialogic/Editor/Events/SceneEvent.tscn b/addons/dialogic/Editor/Events/SceneEvent.tscn
deleted file mode 100644
index 4eec5b8..0000000
--- a/addons/dialogic/Editor/Events/SceneEvent.tscn
+++ /dev/null
@@ -1,127 +0,0 @@
-[gd_scene load_steps=8 format=2]
-
-[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/scene event.svg" type="Texture" id=1]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=2]
-[ext_resource path="res://addons/dialogic/Images/Context Menus/Remove.svg" type="Texture" id=3]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.tscn" type="PackedScene" id=4]
-[ext_resource path="res://addons/dialogic/Editor/Events/SceneEvent.gd" type="Script" id=5]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=6]
-
-
-[sub_resource type="StyleBoxFlat" id=1]
-content_margin_left = 16.0
-content_margin_right = 6.0
-content_margin_top = 6.0
-content_margin_bottom = 6.0
-bg_color = Color( 0.219608, 0.34902, 0.701961, 0.443137 )
-border_width_left = 2
-border_width_top = 2
-border_width_right = 2
-border_width_bottom = 2
-border_color = Color( 0.12549, 0.12549, 0.12549, 1 )
-corner_radius_top_left = 6
-corner_radius_top_right = 6
-corner_radius_bottom_right = 6
-corner_radius_bottom_left = 6
-
-[node name="SceneBlock" type="HBoxContainer"]
-anchor_right = 1.0
-margin_bottom = 44.0
-size_flags_horizontal = 3
-size_flags_vertical = 9
-script = ExtResource( 5 )
-__meta__ = {
-"_edit_use_anchors_": false
-}
-
-[node name="Indent" type="Control" parent="."]
-visible = false
-margin_bottom = 46.0
-
-[node name="PanelContainer" type="PanelContainer" parent="."]
-margin_right = 1024.0
-margin_bottom = 44.0
-mouse_filter = 1
-size_flags_horizontal = 3
-size_flags_vertical = 3
-custom_styles/panel = SubResource( 1 )
-
-[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
-margin_left = 16.0
-margin_top = 6.0
-margin_right = 1018.0
-margin_bottom = 38.0
-size_flags_horizontal = 3
-
-[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer"]
-margin_right = 1002.0
-margin_bottom = 28.0
-
-[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/Header"]
-margin_right = 22.0
-margin_bottom = 28.0
-texture = ExtResource( 1 )
-stretch_mode = 6
-
-[node name="Title" type="Label" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 26.0
-margin_top = 7.0
-margin_right = 139.0
-margin_bottom = 21.0
-text = " Scene settings "
-
-[node name="Name" type="Label" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 143.0
-margin_top = 7.0
-margin_right = 414.0
-margin_bottom = 21.0
-text = "No image (will clear previous scene event)"
-
-[node name="ImageButton" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 418.0
-margin_right = 442.0
-margin_bottom = 28.0
-text = "..."
-
-[node name="ClearButton" type="Button" parent="PanelContainer/VBoxContainer/Header"]
-margin_left = 446.0
-margin_right = 474.0
-margin_bottom = 28.0
-disabled = true
-icon = ExtResource( 3 )
-
-[node name="VisibleToggle" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 4 )]
-visible = false
-margin_left = 478.0
-margin_right = 508.0
-
-[node name="Preview" type="Label" parent="PanelContainer/VBoxContainer/Header"]
-visible = false
-margin_left = 512.0
-margin_top = 8.0
-margin_right = 540.0
-margin_bottom = 22.0
-custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
-text = " ..."
-
-[node name="Spacer" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 6 )]
-margin_left = 478.0
-margin_right = 961.0
-margin_bottom = 28.0
-
-[node name="OptionButton" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 2 )]
-margin_left = 965.0
-margin_right = 1002.0
-margin_bottom = 28.0
-items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
-
-[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer"]
-margin_top = 32.0
-margin_right = 1002.0
-margin_bottom = 32.0
-size_flags_horizontal = 3
-size_flags_vertical = 3
-expand = true
-stretch_mode = 5
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ImageButton" to="." method="_on_ImageButton_pressed"]
-[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/ClearButton" to="." method="_on_ClearButton_pressed"]
diff --git a/addons/dialogic/Editor/Events/Templates/EventTemplate.gd b/addons/dialogic/Editor/Events/Templates/EventTemplate.gd
new file mode 100644
index 0000000..c7f64b2
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Templates/EventTemplate.gd
@@ -0,0 +1,144 @@
+tool
+extends HBoxContainer
+
+export(StyleBoxFlat) var event_style : StyleBoxFlat
+export(Texture) var event_icon : Texture
+export(String) var event_name : String
+export(PackedScene) var header_scene : PackedScene
+export(PackedScene) var body_scene : PackedScene
+
+signal option_action(action_name)
+signal selected()
+
+onready var panel = $PanelContainer
+onready var title_container = $PanelContainer/MarginContainer/VBoxContainer/Header/TitleHBoxContainer
+onready var title_label = $PanelContainer/MarginContainer/VBoxContainer/Header/TitleHBoxContainer/TitleMarginContainer/TitleLabel
+onready var icon_texture = $PanelContainer/MarginContainer/VBoxContainer/Header/IconMarginContainer/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
+
+
+var header_node
+var body_node
+var indent_size = 25
+
+## *****************************************************************************
+## PUBLIC METHODS
+## *****************************************************************************
+
+
+func set_event_style(style: StyleBoxFlat):
+ panel.set('custom_styles/panel', style)
+
+
+func get_event_style():
+ return panel.get('custom_styles/panel')
+
+
+func set_event_icon(icon: Texture):
+ icon_texture.texture = icon
+
+
+func set_event_name(text: String):
+ title_label.text = text
+ if text.empty():
+ title_container.hide()
+ else:
+ title_container.show()
+
+
+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)
+ expand_control.set_enabled(body_node != null)
+
+
+func get_body():
+ return body_node
+
+
+func get_header():
+ return header_node
+
+
+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 on_timeline_selected():
+ emit_signal("selected")
+
+
+func set_expanded(expanded: bool):
+ expand_control.set_expanded(expanded)
+
+
+## *****************************************************************************
+## PRIVATE METHODS
+## *****************************************************************************
+
+
+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()
+ 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:
+ body_container.show()
+ else:
+ body_container.hide()
+
+
+func _on_OptionsControl_action(action_name: String):
+ # Simply transmit the signal to the timeline editor
+ emit_signal("option_action", action_name)
+
+
+func _on_gui_input(event):
+ if event is InputEventMouseButton and event.is_pressed() and event.doubleclick and event.button_index == 1 and expand_control.enabled:
+ expand_control.set_expanded(not expand_control.expanded)
+
+
+## *****************************************************************************
+## OVERRIDES
+## *****************************************************************************
+
+
+func _ready():
+ _setup_event()
+ 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")
+ expand_control.set_enabled(body_scene != null)
diff --git a/addons/dialogic/Editor/Events/Templates/EventTemplate.tscn b/addons/dialogic/Editor/Events/Templates/EventTemplate.tscn
new file mode 100644
index 0000000..04e771f
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Templates/EventTemplate.tscn
@@ -0,0 +1,168 @@
+[gd_scene load_steps=7 format=2]
+
+[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.gd" type="Script" id=1]
+[ext_resource path="res://addons/dialogic/Editor/Events/Templates/ExpandControl.tscn" type="PackedScene" id=2]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=4]
+[ext_resource path="res://addons/dialogic/Editor/Events/Templates/OptionsControl.tscn" type="PackedScene" id=5]
+[ext_resource path="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg" type="Texture" id=6]
+
+[sub_resource type="StyleBoxFlat" id=1]
+bg_color = Color( 0.262745, 0.262745, 0.262745, 1 )
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+corner_radius_top_left = 6
+corner_radius_top_right = 6
+corner_radius_bottom_right = 6
+corner_radius_bottom_left = 6
+
+[node name="EventTemplate" type="HBoxContainer"]
+anchor_right = 1.0
+margin_bottom = 44.0
+rect_min_size = Vector2( 0, 44 )
+size_flags_horizontal = 3
+size_flags_vertical = 9
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+event_style = SubResource( 1 )
+event_icon = ExtResource( 6 )
+event_name = "Event Template"
+
+[node name="Indent" type="Control" parent="."]
+visible = false
+margin_bottom = 64.0
+
+[node name="PanelContainer" type="PanelContainer" parent="."]
+margin_right = 1024.0
+margin_bottom = 46.0
+mouse_filter = 1
+mouse_default_cursor_shape = 6
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_styles/panel = SubResource( 1 )
+
+[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"]
+margin_left = 2.0
+margin_top = 2.0
+margin_right = 1022.0
+margin_bottom = 44.0
+mouse_filter = 1
+custom_constants/margin_right = 6
+custom_constants/margin_top = 6
+custom_constants/margin_left = 6
+custom_constants/margin_bottom = 6
+
+[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer"]
+margin_left = 6.0
+margin_top = 6.0
+margin_right = 1014.0
+margin_bottom = 36.0
+rect_min_size = Vector2( 0, 30 )
+size_flags_horizontal = 3
+
+[node name="Header" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
+margin_right = 1008.0
+margin_bottom = 30.0
+rect_min_size = Vector2( 0, 30 )
+size_flags_horizontal = 3
+
+[node name="IconMarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header"]
+margin_right = 31.0
+margin_bottom = 30.0
+mouse_filter = 1
+custom_constants/margin_right = 5
+custom_constants/margin_left = 10
+
+[node name="IconTexture" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/Header/IconMarginContainer"]
+margin_left = 10.0
+margin_right = 26.0
+margin_bottom = 30.0
+texture = ExtResource( 6 )
+stretch_mode = 6
+
+[node name="TitleHBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header"]
+margin_left = 35.0
+margin_right = 160.0
+margin_bottom = 30.0
+
+[node name="VSeparator" type="VSeparator" parent="PanelContainer/MarginContainer/VBoxContainer/Header/TitleHBoxContainer"]
+margin_right = 4.0
+margin_bottom = 30.0
+mouse_filter = 1
+
+[node name="TitleMarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header/TitleHBoxContainer"]
+margin_left = 8.0
+margin_right = 117.0
+margin_bottom = 30.0
+mouse_filter = 1
+custom_constants/margin_right = 5
+custom_constants/margin_left = 5
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TitleLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/Header/TitleHBoxContainer/TitleMarginContainer"]
+margin_left = 5.0
+margin_top = 8.0
+margin_right = 104.0
+margin_bottom = 22.0
+text = "Event Template"
+
+[node name="VSeparator2" type="VSeparator" parent="PanelContainer/MarginContainer/VBoxContainer/Header/TitleHBoxContainer"]
+margin_left = 121.0
+margin_right = 125.0
+margin_bottom = 30.0
+mouse_filter = 1
+
+[node name="Content" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header"]
+margin_left = 164.0
+margin_right = 174.0
+margin_bottom = 30.0
+mouse_filter = 1
+custom_constants/margin_right = 5
+custom_constants/margin_left = 5
+
+[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" instance=ExtResource( 2 )]
+margin_left = 178.0
+margin_right = 230.0
+
+[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" instance=ExtResource( 4 )]
+margin_left = 178.0
+margin_right = 962.0
+margin_bottom = 30.0
+
+[node name="VSeparator3" type="VSeparator" parent="PanelContainer/MarginContainer/VBoxContainer/Header"]
+margin_left = 966.0
+margin_right = 970.0
+margin_bottom = 30.0
+mouse_filter = 1
+
+[node name="OptionsControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" instance=ExtResource( 5 )]
+margin_left = 974.0
+margin_right = 1008.0
+margin_bottom = 30.0
+items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", false, "Remove", null, 0, false, false, 3, 0, null, "", false ]
+
+[node name="Body" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer"]
+visible = false
+margin_top = 34.0
+margin_right = 1008.0
+margin_bottom = 262.0
+
+[node name="HSeparator" type="HSeparator" parent="PanelContainer/MarginContainer/VBoxContainer/Body"]
+margin_right = 1008.0
+margin_bottom = 4.0
+mouse_filter = 1
+
+[node name="Content" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Body"]
+margin_top = 8.0
+margin_right = 1008.0
+margin_bottom = 228.0
+mouse_filter = 1
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_constants/margin_top = 10
+custom_constants/margin_bottom = 10
diff --git a/addons/dialogic/Editor/Events/Templates/ExpandControl.gd b/addons/dialogic/Editor/Events/Templates/ExpandControl.gd
new file mode 100644
index 0000000..578a80c
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Templates/ExpandControl.gd
@@ -0,0 +1,43 @@
+tool
+extends HBoxContainer
+
+onready var visible_toggle = $VisibleToggle
+onready var preview = $MarginContainer/Preview
+
+var enabled : bool
+var expanded: bool
+
+signal state_changed(expanded)
+
+func _ready():
+ set_enabled(false)
+ visible_toggle.connect("toggled", self, "_on_VisibleToggle_toggled")
+
+
+func set_preview(text: String):
+ preview.text = text
+
+
+func set_enabled(enabled: bool):
+ self.enabled = enabled
+ set_expanded(enabled)
+ if enabled:
+ show()
+ else:
+ hide()
+
+
+func set_expanded(expanded: bool):
+ self.expanded = expanded
+ visible_toggle.pressed = expanded
+ if expanded:
+ preview.hide()
+ else:
+ preview.show()
+ visible_toggle.release_focus()
+ emit_signal("state_changed", expanded)
+
+
+func _on_VisibleToggle_toggled(button_pressed: bool):
+ if enabled:
+ set_expanded(button_pressed)
diff --git a/addons/dialogic/Editor/Events/Templates/ExpandControl.tscn b/addons/dialogic/Editor/Events/Templates/ExpandControl.tscn
new file mode 100644
index 0000000..62ef5a7
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Templates/ExpandControl.tscn
@@ -0,0 +1,38 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/dialogic/Editor/Events/Templates/ExpandControl.gd" type="Script" id=1]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.tscn" type="PackedScene" id=4]
+
+[node name="ExpandControl" type="HBoxContainer"]
+visible = false
+margin_right = 62.0
+margin_bottom = 30.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="VSeparator" type="VSeparator" parent="."]
+margin_right = 4.0
+margin_bottom = 30.0
+
+[node name="VisibleToggle" parent="." instance=ExtResource( 4 )]
+margin_left = 8.0
+margin_right = 38.0
+pressed = false
+script = null
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+margin_left = 42.0
+margin_right = 64.0
+margin_bottom = 30.0
+mouse_filter = 1
+custom_constants/margin_left = 10
+
+[node name="Preview" type="Label" parent="MarginContainer"]
+margin_left = 10.0
+margin_top = 8.0
+margin_right = 22.0
+margin_bottom = 22.0
+custom_colors/font_color = Color( 1, 1, 1, 0.513726 )
+text = "..."
diff --git a/addons/dialogic/Editor/Events/Templates/OptionsControl.gd b/addons/dialogic/Editor/Events/Templates/OptionsControl.gd
new file mode 100644
index 0000000..bae3b4d
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Templates/OptionsControl.gd
@@ -0,0 +1,17 @@
+tool
+extends MenuButton
+
+signal action(action_name)
+
+func _ready():
+ var popup = get_popup()
+ popup.connect("index_pressed", self, "_on_OptionSelected")
+
+
+func _on_OptionSelected(index):
+ if index == 0:
+ emit_signal("action", "up")
+ elif index == 1:
+ emit_signal("action", "down")
+ elif index == 3:
+ emit_signal("action","remove")
diff --git a/addons/dialogic/Editor/Events/Templates/OptionsControl.tscn b/addons/dialogic/Editor/Events/Templates/OptionsControl.tscn
new file mode 100644
index 0000000..7e72889
--- /dev/null
+++ b/addons/dialogic/Editor/Events/Templates/OptionsControl.tscn
@@ -0,0 +1,16 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://addons/dialogic/Editor/Events/Templates/OptionsControl.gd" type="Script" id=1]
+[ext_resource path="res://addons/dialogic/Images/Pieces/expand-icon.svg" type="Texture" id=2]
+
+[node name="OptionsControl" type="MenuButton"]
+margin_right = 29.0
+margin_bottom = 20.0
+icon = ExtResource( 2 )
+clip_text = true
+align = 2
+items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", true, "Remove", null, 0, false, false, 3, 0, null, "", false ]
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
diff --git a/addons/dialogic/Editor/Events/TextBlock.gd b/addons/dialogic/Editor/Events/TextBlock.gd
index 147fd42..6e63d03 100644
--- a/addons/dialogic/Editor/Events/TextBlock.gd
+++ b/addons/dialogic/Editor/Events/TextBlock.gd
@@ -13,7 +13,7 @@ var event_data = {
'portrait': '',
}
-onready var portrait_picker = $PanelContainer/VBoxContainer/Header/PortraitPicker
+onready var character_picker = $PanelContainer/VBoxContainer/Header/CharacterAndPortraitPicker
onready var text_editor = $PanelContainer/VBoxContainer/TextEdit
func _ready():
@@ -25,12 +25,11 @@ func _ready():
connect("gui_input", self, '_on_gui_input')
text_editor.connect("focus_entered", self, "_on_TextEdit_focus_entered")
text_editor.set("rect_min_size", Vector2(0, 80))
- $PanelContainer/VBoxContainer/Header/CharacterPicker.connect('character_selected', self , '_on_character_selected')
- portrait_picker.get_popup().connect("index_pressed", self, '_on_portrait_selected')
+ character_picker.connect('character_changed', self , '_on_character_changed')
var c_list = DialogicUtil.get_sorted_character_list()
if c_list.size() == 0:
- $PanelContainer/VBoxContainer/Header/CharacterPicker.visible = false
+ character_picker.visible = false
else:
# Default Speaker
for c in c_list:
@@ -38,17 +37,13 @@ func _ready():
event_data['character'] = c['file']
-func _on_character_selected(data) -> void:
- event_data['character'] = data['file']
- update_preview()
-
-
-func _on_portrait_selected(index) -> void:
- var text = portrait_picker.get_popup().get_item_text(index)
- if text == "[Don't change]":
- text = ''
- portrait_picker.text = ''
- event_data['portrait'] = text
+func _on_character_changed(character_data: Dictionary, portrait: String) -> void:
+ if character_data.keys().size() > 0:
+ event_data['character'] = character_data['file']
+ event_data['portrait'] = portrait
+ else:
+ event_data['character'] = ''
+ event_data['portrait'] = ''
update_preview()
@@ -67,17 +62,13 @@ func load_text(text) -> void:
func load_data(data) -> void:
event_data = data
text_editor.text = event_data['text']
+ character_picker.set_data(event_data['character'], event_data['portrait'])
update_preview()
func update_preview() -> String:
- portrait_picker.set_character(event_data['character'], event_data['portrait'])
var t = text_editor.text
text_editor.rect_min_size.y = text_height * (2 + t.count('\n'))
-
- for c in DialogicUtil.get_character_list():
- if c['file'] == event_data['character']:
- $PanelContainer/VBoxContainer/Header/CharacterPicker.set_data_by_file(event_data['character'])
var text = event_data['text']
var lines = text.count('\n')
diff --git a/addons/dialogic/Editor/Events/TextBlock.tscn b/addons/dialogic/Editor/Events/TextBlock.tscn
index d25eda5..90d0847 100644
--- a/addons/dialogic/Editor/Events/TextBlock.tscn
+++ b/addons/dialogic/Editor/Events/TextBlock.tscn
@@ -1,16 +1,12 @@
-[gd_scene load_steps=9 format=2]
+[gd_scene load_steps=8 format=2]
[ext_resource path="res://addons/dialogic/Editor/Events/TextBlock.gd" type="Script" id=1]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/VisibleToggle.tscn" type="PackedScene" id=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/text-event.svg" type="Texture" id=3]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/PieceExtraSettings.tscn" type="PackedScene" id=4]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/CharacterPicker.tscn" type="PackedScene" id=6]
-[ext_resource path="res://addons/dialogic/Editor/Events/Common/PortraitPicker.tscn" type="PackedScene" id=7]
+[ext_resource path="res://addons/dialogic/Editor/Events/Common/Characters/CharacterAndPortraitPicker.tscn" type="PackedScene" id=5]
[ext_resource path="res://addons/dialogic/Editor/Events/Common/Spacer.tscn" type="PackedScene" id=8]
-
-
-
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 6.0
content_margin_right = 6.0
@@ -90,14 +86,12 @@ margin_left = 35.0
margin_right = 39.0
margin_bottom = 30.0
-[node name="CharacterPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 6 )]
+[node name="CharacterAndPortraitPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 5 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
margin_left = 43.0
margin_right = 149.0
-
-[node name="PortraitPicker" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 7 )]
-visible = false
-margin_left = 153.0
-margin_right = 187.0
+margin_bottom = 30.0
[node name="VisibleToggle" parent="PanelContainer/VBoxContainer/Header" instance=ExtResource( 2 )]
margin_left = 153.0
@@ -129,8 +123,8 @@ margin_bottom = 114.0
rect_min_size = Vector2( 0, 80 )
size_flags_horizontal = 3
size_flags_vertical = 3
+syntax_highlighting = true
show_line_numbers = true
smooth_scrolling = true
wrap_enabled = true
-
[connection signal="text_changed" from="PanelContainer/VBoxContainer/TextEdit" to="." method="_on_TextEdit_text_changed"]
diff --git a/addons/dialogic/Editor/Events/styles/ChangeBackground.tres b/addons/dialogic/Editor/Events/styles/ChangeBackground.tres
new file mode 100644
index 0000000..285be4b
--- /dev/null
+++ b/addons/dialogic/Editor/Events/styles/ChangeBackground.tres
@@ -0,0 +1,13 @@
+[gd_resource type="StyleBoxFlat" format=2]
+
+[resource]
+bg_color = Color( 0.219608, 0.34902, 0.701961, 0.443137 )
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color( 0.12549, 0.12549, 0.12549, 1 )
+corner_radius_top_left = 6
+corner_radius_top_right = 6
+corner_radius_bottom_right = 6
+corner_radius_bottom_left = 6
diff --git a/addons/dialogic/Editor/Events/selected_styleboxflat.tres b/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres
similarity index 100%
rename from addons/dialogic/Editor/Events/selected_styleboxflat.tres
rename to addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres
diff --git a/addons/dialogic/Editor/Events/styles/selected_styleboxflat_template.tres b/addons/dialogic/Editor/Events/styles/selected_styleboxflat_template.tres
new file mode 100644
index 0000000..b8724b2
--- /dev/null
+++ b/addons/dialogic/Editor/Events/styles/selected_styleboxflat_template.tres
@@ -0,0 +1,13 @@
+[gd_resource type="StyleBoxFlat" format=2]
+
+[resource]
+bg_color = Color( 0.0980392, 0.329412, 0.509804, 1 )
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color( 0.0901961, 0.560784, 0.937255, 1 )
+corner_radius_top_left = 6
+corner_radius_top_right = 6
+corner_radius_bottom_right = 6
+corner_radius_bottom_left = 6
diff --git a/addons/dialogic/Editor/Events/selected_styleboxflat_text_event.tres b/addons/dialogic/Editor/Events/styles/selected_styleboxflat_text_event.tres
similarity index 100%
rename from addons/dialogic/Editor/Events/selected_styleboxflat_text_event.tres
rename to addons/dialogic/Editor/Events/styles/selected_styleboxflat_text_event.tres
diff --git a/addons/dialogic/Editor/MasterTree/MasterTree.gd b/addons/dialogic/Editor/MasterTree/MasterTree.gd
index f9c0891..3be76b5 100644
--- a/addons/dialogic/Editor/MasterTree/MasterTree.gd
+++ b/addons/dialogic/Editor/MasterTree/MasterTree.gd
@@ -58,27 +58,26 @@ func _ready():
# Creating the parents
timelines_tree = tree.create_item(root)
- timelines_tree.set_selectable(0, false)
timelines_tree.set_text(0, "Timelines")
timelines_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
+ timelines_tree.set_metadata(0, {'editor': 'Timeline Root'})
characters_tree = tree.create_item(root)
- characters_tree.set_selectable(0, false)
characters_tree.set_text(0, "Characters")
characters_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
+ characters_tree.set_metadata(0, {'editor': 'Character Root'})
definitions_tree = tree.create_item(root)
- definitions_tree.set_selectable(0, false)
definitions_tree.set_text(0, "Definitions")
definitions_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
+ definitions_tree.set_metadata(0, {'editor': 'Definition Root'})
themes_tree = tree.create_item(root)
- themes_tree.set_selectable(0, false)
themes_tree.set_text(0, "Themes")
themes_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
+ themes_tree.set_metadata(0, {'editor': 'Theme Root'})
settings_tree = tree.create_item(root)
- settings_tree.set_selectable(0, true)
settings_tree.set_text(0, "Settings")
settings_tree.set_icon(0, get_icon("GDScript", "EditorIcons"))
settings_tree.set_metadata(0, {'editor': 'Settings'})
@@ -140,6 +139,7 @@ func _add_timeline(timeline, select = false):
else:
item.set_text(0, timeline['file'])
timeline['editor'] = 'Timeline'
+ timeline['editable'] = true
item.set_metadata(0, timeline)
if not get_constant("dark_theme", "Editor"):
item.set_icon_modulate(0, get_color("property_color", "Editor"))
@@ -165,6 +165,7 @@ func _add_theme(theme_item, select = false):
item.set_icon(0, theme_icon)
item.set_text(0, theme_item['name'])
theme_item['editor'] = 'Theme'
+ theme_item['editable'] = true
item.set_metadata(0, theme_item)
if not get_constant("dark_theme", "Editor"):
item.set_icon_modulate(0, get_color("property_color", "Editor"))
@@ -192,6 +193,7 @@ func _add_character(character, select = false):
else:
item.set_text(0, character['file'])
character['editor'] = 'Character'
+ character['editable'] = true
item.set_metadata(0, character)
#item.set_editable(0, true)
if character.has('color'):
@@ -220,6 +222,7 @@ func _add_definition(definition, select = false):
if definition['type'] == 1:
item.set_icon(0, glossary_icon)
definition['editor'] = 'Definition'
+ definition['editable'] = true
item.set_metadata(0, definition)
if not get_constant("dark_theme", "Editor"):
item.set_icon_modulate(0, get_color("property_color", "Editor"))
@@ -237,23 +240,22 @@ func _on_item_selected():
if metadata['editor'] == 'Timeline':
timeline_editor.load_timeline(metadata['file'])
show_timeline_editor()
- if metadata['editor'] == 'Character':
+ elif metadata['editor'] == 'Character':
if not character_editor.is_selected(metadata['file']):
character_editor.load_character(metadata['file'])
show_character_editor()
- if metadata['editor'] == 'Definition':
+ elif metadata['editor'] == 'Definition':
if not definition_editor.is_selected(metadata['id']):
definition_editor.visible = true
definition_editor.load_definition(metadata['id'])
show_definition_editor()
- if metadata['editor'] == 'Theme':
+ elif metadata['editor'] == 'Theme':
theme_editor.load_theme(metadata['file'])
show_theme_editor()
- if metadata['editor'] == 'Settings':
+ elif metadata['editor'] == 'Settings':
settings_editor.update_data()
show_settings_editor()
-
func show_character_editor():
emit_signal("editor_selected", 'character')
character_editor.visible = true
@@ -328,7 +330,18 @@ func _on_item_rmb_selected(position):
if item['editor'] == 'Definition':
editor_reference.get_node("DefinitionPopupMenu").rect_position = get_viewport().get_mouse_position()
editor_reference.get_node("DefinitionPopupMenu").popup()
-
+ if item['editor'] == 'Timeline Root':
+ editor_reference.get_node('TimelineRootPopupMenu').rect_position = get_viewport().get_mouse_position()
+ editor_reference.get_node('TimelineRootPopupMenu').popup()
+ if item['editor'] == 'Character Root':
+ editor_reference.get_node("CharacterRootPopupMenu").rect_position = get_viewport().get_mouse_position()
+ editor_reference.get_node("CharacterRootPopupMenu").popup()
+ if item['editor'] == 'Theme Root':
+ editor_reference.get_node("ThemeRootPopupMenu").rect_position = get_viewport().get_mouse_position()
+ editor_reference.get_node("ThemeRootPopupMenu").popup()
+ if item['editor'] == 'Definition Root':
+ editor_reference.get_node("DefinitionRootPopupMenu").rect_position = get_viewport().get_mouse_position()
+ editor_reference.get_node("DefinitionRootPopupMenu").popup()
func remove_selected():
var item = get_selected()
@@ -351,8 +364,9 @@ func _on_gui_input(event):
if event.is_pressed() and event.doubleclick:
var item = get_selected()
var metadata = item.get_metadata(0)
- item.set_editable(0, true)
- $RenamerReset.start(0.5)
+ if metadata.has("editable") and metadata["editable"]:
+ item.set_editable(0, true)
+ $RenamerReset.start(0.5)
func _on_item_edited():
diff --git a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd
index 255f83b..8843d85 100644
--- a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd
+++ b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd
@@ -31,16 +31,19 @@ onready var n : Dictionary = {
# Dialog box
'background_texture_button_visible': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3/CheckBox",
'theme_background_image': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3/BackgroundTextureButton",
- 'theme_next_image': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NextIndicatorButton",
- 'next_animation': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NextAnimation",
+ 'theme_next_image': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextIndicatorButton",
+ 'next_indicator_scale': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer7/IndicatorScale",
+ 'next_indicator_offset_x': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetX",
+ 'next_indicator_offset_y': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetY",
+ 'next_animation': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextAnimation",
'theme_action_key': $"VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/BoxContainer/ActionOptionButton",
'theme_background_color_visible': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2/CheckBox",
'theme_background_color': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2/ColorPickerButton",
- 'theme_text_margin': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer/TextOffsetV",
- 'theme_text_margin_h': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer/TextOffsetH",
- 'size_w': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer4/BoxSizeW",
- 'size_h': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer4/BoxSizeH",
- 'bottom_gap': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer5/BottomGap",
+ 'theme_text_margin': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer/TextOffsetV",
+ 'theme_text_margin_h': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer/TextOffsetH",
+ 'size_w': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer4/BoxSizeW",
+ 'size_h': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer4/BoxSizeH",
+ 'bottom_gap': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer5/BottomGap",
'background_modulation': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6/CheckBox",
'background_modulation_color': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6/ColorPickerButton",
@@ -72,6 +75,10 @@ onready var n : Dictionary = {
'button_offset_y': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetV",
'button_separation': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/VerticalSeparation",
+ 'button_fixed': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/FixedSize",
+ 'button_fixed_x': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeX",
+ 'button_fixed_y': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeY",
+
# Glossary
'glossary_font': $VBoxContainer/TabContainer/Glossary/Column/GridContainer/FontButton,
'glossary_color': $VBoxContainer/TabContainer/Glossary/Column/GridContainer/ColorPickerButton,
@@ -101,7 +108,7 @@ func _ready() -> void:
func load_theme(filename):
loading = true
current_theme = filename
- var theme = DialogicResources.get_theme_config(filename)
+ var theme = DialogicResources.get_theme_config(filename)
# Settings
n['theme_action_key'].text = theme.get_value('settings', 'action_key', 'ui_accept')
@@ -111,6 +118,10 @@ func load_theme(filename):
n['theme_background_color'].color = Color(theme.get_value('background', 'color', '#ff000000'))
n['theme_background_color_visible'].pressed = theme.get_value('background', 'use_color', false)
n['theme_next_image'].text = DialogicResources.get_filename_from_path(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png'))
+ n['next_indicator_scale'].value = theme.get_value('next_indicator', 'scale', 0.4)
+ var next_indicator_offset = theme.get_value('next_indicator', 'offset', Vector2(13,10))
+ n['next_indicator_offset_x'].value = next_indicator_offset.x
+ n['next_indicator_offset_y'].value = next_indicator_offset.y
n['background_modulation'].pressed = theme.get_value('background', 'modulation', false)
n['background_modulation_color'].color = Color(theme.get_value('background', 'modulation_color', '#ffffffff'))
@@ -135,8 +146,9 @@ func load_theme(filename):
n['button_separation'].value = theme.get_value('buttons', 'gap', 5)
n['button_modulation'].pressed = theme.get_value('buttons', 'modulation', false)
n['button_modulation_color'].color = Color(theme.get_value('buttons', 'modulation_color', '#ffffffff'))
-
-
+ n['button_fixed'].pressed = theme.get_value('buttons', 'fixed', false)
+ n['button_fixed_x'].value = theme.get_value('buttons', 'fixed_size', Vector2(130,40)).x
+ n['button_fixed_y'].value = theme.get_value('buttons', 'fixed_size', Vector2(130,40)).y
toggle_button_customization_fields(not theme.get_value('buttons', 'use_native', false))
@@ -245,6 +257,14 @@ func _on_indicator_selected(path, target) -> void:
return
DialogicResources.set_theme_value(current_theme, 'next_indicator','image', path)
n['theme_next_image'].text = DialogicResources.get_filename_from_path(path)
+ # Since people will probably want the sprite on fresh values and the default
+ # ones are for the custom dialogic theme, I reset the next indicator properties
+ # here so they can set the scale and offset they want.
+ DialogicResources.set_theme_value(current_theme, 'next_indicator', 'scale', 1)
+ DialogicResources.set_theme_value(current_theme, 'offset', 'scale', Vector2(10,10))
+ n['next_indicator_scale'].value = 1
+ n['next_indicator_offset_x'].value = 10
+ n['next_indicator_offset_y'].value = 10
_on_PreviewButton_pressed() # Refreshing the preview
@@ -301,8 +321,12 @@ func _on_PreviewButton_pressed() -> void:
$VBoxContainer/Panel.add_child(preview_dialog)
# maintaining the preview panel big enough for the dialog box
- $VBoxContainer/Panel.rect_min_size.y = preview_dialog.current_theme.get_value('box', 'size', Vector2(910, 167)).y + 90 + preview_dialog.current_theme.get_value('box', 'bottom_gap', 40)
+ var box_size = preview_dialog.current_theme.get_value('box', 'size', Vector2(910, 167)).y
+ var bottom_gap = preview_dialog.current_theme.get_value('box', 'bottom_gap', 40)
+ var extra = 90
+ $VBoxContainer/Panel.rect_min_size.y = box_size + extra + bottom_gap
$VBoxContainer/Panel.rect_size.y = 0
+ preview_dialog.call_deferred('resize_main')
func _on_ActionOptionButton_item_selected(index) -> void:
@@ -630,3 +654,32 @@ func _on_ColorPicker_ChoiceButtons_modulation_color_changed(color) -> void:
DialogicResources.set_theme_value(current_theme, 'buttons', 'modulation_color', '#' + color.to_html())
$DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times
+
+
+func _on_IndicatorScale_value_changed(value) -> void:
+ if loading:
+ return
+ DialogicResources.set_theme_value(current_theme, 'next_indicator', 'scale', value)
+ _on_PreviewButton_pressed() # Refreshing the preview
+
+
+func _on_NextOffset_value_changed(value):
+ if loading:
+ return
+ var offset_value = Vector2(n['next_indicator_offset_x'].value, n['next_indicator_offset_y'].value)
+ DialogicResources.set_theme_value(current_theme, 'next_indicator', 'offset', offset_value)
+ _on_PreviewButton_pressed() # Refreshing the preview
+
+
+func _on_FixedSize_toggled(button_pressed):
+ if loading:
+ return
+ DialogicResources.set_theme_value(current_theme, 'buttons', 'fixed', button_pressed)
+ _on_PreviewButton_pressed() # Refreshing the preview
+
+
+func _on_ButtonSize_value_changed(value):
+ if loading:
+ return
+ DialogicResources.set_theme_value(current_theme, 'buttons','fixed_size', Vector2(n['button_fixed_x'].value,n['button_fixed_y'].value))
+ _on_PreviewButton_pressed() # Refreshing the preview
diff --git a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn
index 4d1c370..2bfcda0 100644
--- a/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn
+++ b/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn
@@ -8,38 +8,38 @@ content_margin_left = 4.0
content_margin_right = 4.0
content_margin_top = 4.0
content_margin_bottom = 4.0
-bg_color = Color( 0.2265, 0.246975, 0.301575, 1 )
+bg_color = Color( 0.252, 0.2718, 0.3246, 1 )
[node name="ThemeEditor" type="ScrollContainer"]
anchor_right = 1.0
anchor_bottom = 1.0
margin_right = -6.0
-margin_bottom = -17.0
+margin_bottom = 311.0
script = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="VBoxContainer" type="VBoxContainer" parent="."]
-margin_right = 1006.0
-margin_bottom = 592.0
+margin_right = 1018.0
+margin_bottom = 911.0
size_flags_horizontal = 3
size_flags_vertical = 3
custom_constants/separation = 15
[node name="Panel" type="Panel" parent="VBoxContainer"]
-margin_right = 1006.0
-margin_bottom = 300.0
-rect_min_size = Vector2( 0, 300 )
+margin_right = 1018.0
+margin_bottom = 460.0
+rect_min_size = Vector2( 0, 460 )
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"]
-margin_top = 315.0
-margin_right = 1006.0
-margin_bottom = 375.0
+margin_top = 475.0
+margin_right = 1018.0
+margin_bottom = 535.0
custom_constants/separation = 10
[node name="TextEdit" type="TextEdit" parent="VBoxContainer/HBoxContainer3"]
-margin_right = 844.0
+margin_right = 856.0
margin_bottom = 60.0
rect_min_size = Vector2( 400, 60 )
size_flags_horizontal = 3
@@ -48,21 +48,22 @@ text = "This is preview text. You can use [color=#A5EFAC]BBCode[/color] to styl
wrap_enabled = true
[node name="PreviewButton" type="Button" parent="VBoxContainer/HBoxContainer3"]
-margin_left = 854.0
-margin_right = 1006.0
+margin_left = 866.0
+margin_right = 1018.0
margin_bottom = 60.0
text = " Preview changes "
icon = ExtResource( 1 )
[node name="TabContainer" type="TabContainer" parent="VBoxContainer"]
-margin_top = 390.0
-margin_right = 1006.0
-margin_bottom = 592.0
+margin_top = 550.0
+margin_right = 1018.0
+margin_bottom = 911.0
size_flags_horizontal = 3
size_flags_vertical = 3
tab_align = 0
[node name="Dialog Text" type="HBoxContainer" parent="VBoxContainer/TabContainer"]
+visible = false
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 4.0
@@ -73,7 +74,7 @@ custom_constants/separation = 10
[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"]
margin_right = 270.0
-margin_bottom = 166.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -199,12 +200,12 @@ prefix = "Y"
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Text"]
margin_left = 280.0
margin_right = 284.0
-margin_bottom = 166.0
+margin_bottom = 325.0
[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"]
margin_left = 294.0
margin_right = 564.0
-margin_bottom = 166.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -251,8 +252,8 @@ margin_bottom = -4.0
custom_constants/separation = 10
[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"]
-margin_right = 270.0
-margin_bottom = 157.0
+margin_right = 288.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -260,29 +261,29 @@ __meta__ = {
}
[node name="SectionTitle" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column"]
-margin_right = 270.0
+margin_right = 288.0
margin_bottom = 22.0
custom_styles/normal = SubResource( 1 )
text = "Visuals"
[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column"]
margin_top = 26.0
-margin_right = 270.0
-margin_bottom = 154.0
+margin_right = 288.0
+margin_bottom = 190.0
size_flags_horizontal = 3
custom_constants/hseparation = 10
columns = 2
[node name="Label5" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
margin_top = 5.0
-margin_right = 134.0
+margin_right = 126.0
margin_bottom = 19.0
size_flags_horizontal = 3
text = "Background Color"
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
-margin_left = 144.0
-margin_right = 270.0
+margin_left = 136.0
+margin_right = 288.0
margin_bottom = 24.0
[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2"]
@@ -291,20 +292,20 @@ margin_bottom = 24.0
[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2"]
margin_left = 28.0
-margin_right = 126.0
+margin_right = 152.0
margin_bottom = 24.0
size_flags_horizontal = 3
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
margin_top = 33.0
-margin_right = 134.0
+margin_right = 126.0
margin_bottom = 47.0
text = "Background Texture"
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
-margin_left = 144.0
+margin_left = 136.0
margin_top = 28.0
-margin_right = 270.0
+margin_right = 288.0
margin_bottom = 52.0
[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3"]
@@ -314,21 +315,21 @@ pressed = true
[node name="BackgroundTextureButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3"]
margin_left = 28.0
-margin_right = 126.0
+margin_right = 152.0
margin_bottom = 24.0
size_flags_horizontal = 3
text = "background-2"
[node name="Label9" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
margin_top = 61.0
-margin_right = 134.0
+margin_right = 126.0
margin_bottom = 75.0
text = "Texture Modulation"
[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
-margin_left = 144.0
+margin_left = 136.0
margin_top = 56.0
-margin_right = 270.0
+margin_right = 288.0
margin_bottom = 80.0
[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6"]
@@ -337,47 +338,102 @@ margin_bottom = 24.0
[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6"]
margin_left = 28.0
-margin_right = 126.0
+margin_right = 152.0
margin_bottom = 24.0
size_flags_horizontal = 3
-[node name="Label2" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
-margin_top = 87.0
-margin_right = 134.0
-margin_bottom = 101.0
-text = "Next indicator"
+[node name="Label6" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
+margin_top = 89.0
+margin_right = 126.0
+margin_bottom = 103.0
+size_flags_horizontal = 3
+text = "Box padding"
-[node name="NextIndicatorButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
-margin_left = 144.0
+[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
+margin_left = 136.0
margin_top = 84.0
-margin_right = 270.0
-margin_bottom = 104.0
-text = "next-indicator"
+margin_right = 288.0
+margin_bottom = 108.0
-[node name="Label4" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
-margin_top = 111.0
-margin_right = 134.0
-margin_bottom = 125.0
-text = "Next animation"
+[node name="TextOffsetV" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer"]
+margin_right = 74.0
+margin_bottom = 24.0
+max_value = 1e+07
+value = 10.0
+rounded = true
+allow_greater = true
+allow_lesser = true
-[node name="NextAnimation" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
-margin_left = 144.0
-margin_top = 108.0
-margin_right = 270.0
-margin_bottom = 128.0
-__meta__ = {
-"_edit_use_anchors_": false
-}
+[node name="TextOffsetH" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer"]
+margin_left = 78.0
+margin_right = 152.0
+margin_bottom = 24.0
+max_value = 1e+07
+value = 20.0
+rounded = true
+allow_greater = true
+allow_lesser = true
+
+[node name="Label7" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
+margin_top = 117.0
+margin_right = 126.0
+margin_bottom = 131.0
+text = "Box size (pixels)"
+
+[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
+margin_left = 136.0
+margin_top = 112.0
+margin_right = 288.0
+margin_bottom = 136.0
+
+[node name="BoxSizeW" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer4"]
+margin_right = 74.0
+margin_bottom = 24.0
+value = 100.0
+rounded = true
+allow_greater = true
+allow_lesser = true
+
+[node name="BoxSizeH" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer4"]
+margin_left = 78.0
+margin_right = 152.0
+margin_bottom = 24.0
+max_value = 999.0
+value = 167.0
+rounded = true
+allow_greater = true
+allow_lesser = true
+
+[node name="Label8" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
+margin_top = 145.0
+margin_right = 126.0
+margin_bottom = 159.0
+text = "Bottom gap"
+
+[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"]
+margin_left = 136.0
+margin_top = 140.0
+margin_right = 288.0
+margin_bottom = 164.0
+
+[node name="BottomGap" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer5"]
+margin_right = 74.0
+margin_bottom = 24.0
+max_value = 999.0
+value = 40.0
+rounded = true
+allow_greater = true
+allow_lesser = true
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Box"]
-margin_left = 280.0
-margin_right = 284.0
-margin_bottom = 157.0
+margin_left = 298.0
+margin_right = 302.0
+margin_bottom = 325.0
[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"]
-margin_left = 294.0
-margin_right = 564.0
-margin_bottom = 157.0
+margin_left = 312.0
+margin_right = 582.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -388,29 +444,78 @@ __meta__ = {
margin_right = 270.0
margin_bottom = 22.0
custom_styles/normal = SubResource( 1 )
-text = "Placement"
+text = "Next Indicator"
[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2"]
margin_top = 26.0
margin_right = 270.0
-margin_bottom = 106.0
+margin_bottom = 126.0
size_flags_horizontal = 3
custom_constants/hseparation = 10
columns = 2
-[node name="Label6" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
-margin_top = 5.0
+[node name="Label2" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+margin_top = 3.0
margin_right = 108.0
-margin_bottom = 19.0
-size_flags_horizontal = 3
-text = "Box padding"
+margin_bottom = 17.0
+text = "Image"
-[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+[node name="NextIndicatorButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
margin_left = 118.0
margin_right = 270.0
-margin_bottom = 24.0
+margin_bottom = 20.0
+text = "next-indicator"
-[node name="TextOffsetV" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer"]
+[node name="Label4" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+margin_top = 27.0
+margin_right = 108.0
+margin_bottom = 41.0
+text = "Animation"
+
+[node name="NextAnimation" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+margin_left = 118.0
+margin_top = 24.0
+margin_right = 270.0
+margin_bottom = 44.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Label3" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+margin_top = 53.0
+margin_right = 108.0
+margin_bottom = 67.0
+text = "Scale"
+
+[node name="HBoxContainer7" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+margin_left = 118.0
+margin_top = 48.0
+margin_right = 270.0
+margin_bottom = 72.0
+
+[node name="IndicatorScale" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer7"]
+margin_right = 74.0
+margin_bottom = 24.0
+max_value = 999.0
+step = 0.1
+value = 1.0
+allow_greater = true
+allow_lesser = true
+
+[node name="Label9" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+margin_top = 81.0
+margin_right = 108.0
+margin_bottom = 95.0
+size_flags_horizontal = 3
+text = "Offset"
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
+margin_left = 118.0
+margin_top = 76.0
+margin_right = 270.0
+margin_bottom = 100.0
+
+[node name="NextOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2"]
margin_right = 74.0
margin_bottom = 24.0
max_value = 1e+07
@@ -419,7 +524,7 @@ rounded = true
allow_greater = true
allow_lesser = true
-[node name="TextOffsetH" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer"]
+[node name="NextOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2"]
margin_left = 78.0
margin_right = 152.0
margin_bottom = 24.0
@@ -429,66 +534,15 @@ rounded = true
allow_greater = true
allow_lesser = true
-[node name="Label7" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
-margin_top = 33.0
-margin_right = 108.0
-margin_bottom = 47.0
-text = "Box size (pixels)"
-
-[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
-margin_left = 118.0
-margin_top = 28.0
-margin_right = 270.0
-margin_bottom = 52.0
-
-[node name="BoxSizeW" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer4"]
-margin_right = 74.0
-margin_bottom = 24.0
-value = 100.0
-rounded = true
-allow_greater = true
-allow_lesser = true
-
-[node name="BoxSizeH" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer4"]
-margin_left = 78.0
-margin_right = 152.0
-margin_bottom = 24.0
-max_value = 999.0
-value = 167.0
-rounded = true
-allow_greater = true
-allow_lesser = true
-
-[node name="Label8" type="Label" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
-margin_top = 61.0
-margin_right = 108.0
-margin_bottom = 75.0
-text = "Bottom gap"
-
-[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"]
-margin_left = 118.0
-margin_top = 56.0
-margin_right = 270.0
-margin_bottom = 80.0
-
-[node name="BottomGap" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer5"]
-margin_right = 74.0
-margin_bottom = 24.0
-max_value = 999.0
-value = 40.0
-rounded = true
-allow_greater = true
-allow_lesser = true
-
[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Box"]
-margin_left = 574.0
-margin_right = 578.0
-margin_bottom = 157.0
+margin_left = 592.0
+margin_right = 596.0
+margin_bottom = 325.0
[node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"]
-margin_left = 588.0
-margin_right = 858.0
-margin_bottom = 157.0
+margin_left = 606.0
+margin_right = 876.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -542,7 +596,7 @@ custom_constants/separation = 10
[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"]
margin_right = 287.0
-margin_bottom = 157.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -630,12 +684,12 @@ prefix = "Y"
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Name Label"]
margin_left = 297.0
margin_right = 301.0
-margin_bottom = 157.0
+margin_bottom = 325.0
[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"]
margin_left = 311.0
margin_right = 581.0
-margin_bottom = 157.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -651,7 +705,7 @@ text = "Box"
[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column2"]
margin_top = 26.0
margin_right = 270.0
-margin_bottom = 78.0
+margin_bottom = 106.0
columns = 2
[node name="Label5" type="Label" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"]
@@ -725,12 +779,12 @@ size_flags_horizontal = 3
[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Name Label"]
margin_left = 591.0
margin_right = 595.0
-margin_bottom = 157.0
+margin_bottom = 325.0
[node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"]
margin_left = 605.0
margin_right = 875.0
-margin_bottom = 157.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -770,7 +824,6 @@ allow_greater = true
allow_lesser = true
[node name="Choice Buttons" type="HBoxContainer" parent="VBoxContainer/TabContainer"]
-visible = false
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 4.0
@@ -781,7 +834,7 @@ custom_constants/separation = 10
[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons"]
margin_right = 270.0
-margin_bottom = 157.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -797,7 +850,7 @@ text = "Visuals"
[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column"]
margin_top = 26.0
margin_right = 270.0
-margin_bottom = 106.0
+margin_bottom = 162.0
size_flags_horizontal = 3
custom_constants/hseparation = 10
columns = 2
@@ -898,26 +951,26 @@ margin_bottom = 24.0
size_flags_horizontal = 3
[node name="Label2" type="Label" parent="VBoxContainer/TabContainer/Choice Buttons/Column/GridContainer"]
-margin_top = 89.0
+margin_top = 117.0
margin_right = 134.0
-margin_bottom = 103.0
+margin_bottom = 131.0
text = "Use Native Buttons"
[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column/GridContainer"]
margin_left = 144.0
-margin_top = 84.0
+margin_top = 112.0
margin_right = 270.0
-margin_bottom = 108.0
+margin_bottom = 136.0
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Choice Buttons"]
margin_left = 280.0
margin_right = 284.0
-margin_bottom = 157.0
+margin_bottom = 325.0
[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons"]
margin_left = 294.0
-margin_right = 575.0
-margin_bottom = 157.0
+margin_right = 603.0
+margin_bottom = 325.0
rect_min_size = Vector2( 270, 0 )
size_flags_vertical = 3
__meta__ = {
@@ -925,15 +978,15 @@ __meta__ = {
}
[node name="SectionTitle" type="Label" parent="VBoxContainer/TabContainer/Choice Buttons/Column2"]
-margin_right = 281.0
+margin_right = 309.0
margin_bottom = 22.0
custom_styles/normal = SubResource( 1 )
text = "Placement"
[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2"]
margin_top = 26.0
-margin_right = 281.0
-margin_bottom = 78.0
+margin_right = 309.0
+margin_bottom = 106.0
size_flags_horizontal = 3
custom_constants/hseparation = 10
columns = 2
@@ -947,7 +1000,7 @@ text = "Box padding"
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"]
margin_left = 129.0
-margin_right = 281.0
+margin_right = 309.0
margin_bottom = 24.0
[node name="TextOffsetV" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer"]
@@ -976,12 +1029,44 @@ text = "Vertical separation"
[node name="VerticalSeparation" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"]
margin_left = 129.0
margin_top = 28.0
-margin_right = 281.0
+margin_right = 309.0
margin_bottom = 52.0
value = 5.0
rounded = true
allow_lesser = true
+[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"]
+margin_top = 61.0
+margin_right = 119.0
+margin_bottom = 75.0
+text = "Fixed size"
+
+[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"]
+margin_left = 129.0
+margin_top = 56.0
+margin_right = 309.0
+margin_bottom = 80.0
+
+[node name="FixedSize" type="CheckBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"]
+margin_right = 24.0
+margin_bottom = 24.0
+
+[node name="ButtonSizeX" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"]
+margin_left = 28.0
+margin_right = 102.0
+margin_bottom = 24.0
+rounded = true
+allow_greater = true
+allow_lesser = true
+
+[node name="ButtonSizeY" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"]
+margin_left = 106.0
+margin_right = 180.0
+margin_bottom = 24.0
+rounded = true
+allow_greater = true
+allow_lesser = true
+
[node name="Glossary" type="HBoxContainer" parent="VBoxContainer/TabContainer"]
visible = false
anchor_right = 1.0
@@ -1114,13 +1199,16 @@ one_shot = true
[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3/BackgroundTextureButton" to="." method="_on_BackgroundTextureButton_pressed"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6/CheckBox" to="." method="_on_BackgroundTexture_Modulation_toggled"]
[connection signal="color_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6/ColorPickerButton" to="." method="_on_ColorPicker_Background_texture_modulation_color_changed"]
-[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NextIndicatorButton" to="." method="_on_NextIndicatorButton_pressed"]
-[connection signal="item_selected" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NextAnimation" to="." method="_on_NextAnimation_item_selected"]
-[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer/TextOffsetV" to="." method="_on_TextMargin_value_changed"]
-[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer/TextOffsetH" to="." method="_on_TextMargin_value_changed"]
-[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer4/BoxSizeW" to="." method="_on_BoxSize_value_changed"]
-[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer4/BoxSizeH" to="." method="_on_BoxSize_value_changed"]
-[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer5/BottomGap" to="." method="_on_BottomGap_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer/TextOffsetV" to="." method="_on_TextMargin_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer/TextOffsetH" to="." method="_on_TextMargin_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer4/BoxSizeW" to="." method="_on_BoxSize_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer4/BoxSizeH" to="." method="_on_BoxSize_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer5/BottomGap" to="." method="_on_BottomGap_value_changed"]
+[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextIndicatorButton" to="." method="_on_NextIndicatorButton_pressed"]
+[connection signal="item_selected" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextAnimation" to="." method="_on_NextAnimation_item_selected"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer7/IndicatorScale" to="." method="_on_IndicatorScale_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetX" to="." method="_on_NextOffset_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetY" to="." method="_on_NextOffset_value_changed"]
[connection signal="item_selected" from="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/BoxContainer/ActionOptionButton" to="." method="_on_ActionOptionButton_item_selected"]
[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/BoxContainer/ActionOptionButton" to="." method="_on_ActionOptionButton_pressed"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Name Label/Column/GridContainer/CharacterColor" to="." method="_on_name_auto_color_toggled"]
@@ -1147,6 +1235,9 @@ one_shot = true
[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetV" to="." method="_on_ButtonOffset_value_changed"]
[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetH" to="." method="_on_ButtonOffset_value_changed"]
[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/VerticalSeparation" to="." method="_on_VerticalSeparation_value_changed"]
+[connection signal="toggled" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/FixedSize" to="." method="_on_FixedSize_toggled"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeX" to="." method="_on_ButtonSize_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeY" to="." method="_on_ButtonSize_value_changed"]
[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column/GridContainer/FontButton" to="." method="_on_GlossaryFontButton_pressed"]
[connection signal="color_changed" from="VBoxContainer/TabContainer/Glossary/Column/GridContainer/ColorPickerButton" to="." method="_on_GlossaryColorPicker_color_changed"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Glossary/Column/GridContainer/HBoxContainer2/CheckBoxShadow" to="." method="_on_CheckBoxShadow_toggled"]
diff --git a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd
index b47271b..ec62026 100644
--- a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd
+++ b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd
@@ -11,8 +11,9 @@ onready var timeline = $TimelineArea/TimeLine
onready var events_warning = $ScrollContainer/EventContainer/EventsWarning
var hovered_item = null
-var selected_style : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/selected_styleboxflat.tres")
-var selected_style_text : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/selected_styleboxflat_text_event.tres")
+var selected_style : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres")
+var selected_style_text : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/styles/selected_styleboxflat_text_event.tres")
+var selected_style_template : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/styles/selected_styleboxflat_template.tres")
var saved_style : StyleBoxFlat
var selected_item : Node
@@ -20,6 +21,10 @@ var selected_item : Node
var moving_piece = null
var piece_was_dragged = false
+func _has_template(event):
+ return event.event_data.has("background")
+
+
func _ready():
var modifier = ''
var _scale = get_constant("inspector_margin", "Editor")
@@ -203,10 +208,12 @@ func _process(delta):
func _clear_selection():
if selected_item != null and saved_style != null:
- var selected_panel: PanelContainer = selected_item.get_node("PanelContainer")
- if selected_panel != null:
- selected_panel.set('custom_styles/panel', saved_style)
-
+ if not _has_template(selected_item):
+ var selected_panel: PanelContainer = selected_item.get_node("PanelContainer")
+ if selected_panel != null:
+ selected_panel.set('custom_styles/panel', saved_style)
+ else:
+ selected_item.event_template.set_event_style(saved_style)
selected_item = null
saved_style = null
@@ -218,17 +225,22 @@ func _is_item_selected(item: Node):
func _select_item(item: Node):
if item != null and not _is_item_selected(item):
_clear_selection()
- var panel: PanelContainer = item.get_node("PanelContainer")
- if panel != null:
- saved_style = panel.get('custom_styles/panel')
- selected_item = item
- if selected_item.event_data.has('text') and selected_item.event_data.has('character'):
- panel.set('custom_styles/panel', selected_style_text)
- else:
- panel.set('custom_styles/panel', selected_style)
- # allow event panels to do additional operation when getting selected
- if (selected_item.has_method("on_timeline_selected")):
- selected_item.on_timeline_selected()
+ selected_item = item
+ if not _has_template(item):
+ var panel: PanelContainer = item.get_node("PanelContainer")
+ if panel != null:
+ saved_style = panel.get('custom_styles/panel')
+ if selected_item.event_data.has('text') and selected_item.event_data.has('character'):
+ panel.set('custom_styles/panel', selected_style_text)
+ else:
+ panel.set('custom_styles/panel', selected_style)
+ # allow event panels to do additional operation when getting selected
+ if (selected_item.has_method("on_timeline_selected")):
+ selected_item.on_timeline_selected()
+ else:
+ saved_style = item.event_template.get_event_style()
+ item.event_template.set_event_style(selected_style_template)
+ selected_item.event_template.on_timeline_selected()
else:
_clear_selection()
@@ -250,6 +262,16 @@ func _on_gui_input(event, item: Node):
piece_was_dragged = false
+func _on_event_options_action(action: String, item: Node):
+ if action == "remove":
+ if selected_item != item:
+ _select_item(item)
+ delete_event()
+ else:
+ move_block(item, action)
+ indent_events()
+
+
# Event Creation signal for buttons
func _create_event_button_pressed(button_name):
create_event(button_name)
@@ -284,7 +306,6 @@ func _on_ButtonCondition_pressed() -> void:
# Adding an event to the timeline
func create_event(scene: String, data: Dictionary = {'no-data': true} , indent: bool = false):
- # This function will create an event in the timeline.
var piece = load("res://addons/dialogic/Editor/Events/" + scene + ".tscn").instance()
piece.editor_reference = editor_reference
if selected_item != null:
@@ -294,6 +315,9 @@ func create_event(scene: String, data: Dictionary = {'no-data': true} , indent:
if data.has('no-data') == false:
piece.load_data(data)
+ if _has_template(piece):
+ piece.event_template.connect("option_action", self, '_on_event_options_action', [piece])
+
piece.connect("gui_input", self, '_on_gui_input', [piece])
events_warning.visible = false
# Indent on create
@@ -313,8 +337,13 @@ func indent_events() -> void:
return
# Resetting all the indents
for event in event_list:
- var indent_node = event.get_node("Indent")
- indent_node.visible = false
+ var indent_node
+ # Keep old behavior for items without template
+ if not _has_template(event):
+ indent_node = event.get_node("Indent")
+ indent_node.visible = false
+ else:
+ event.event_template.set_indent(0)
# Adding new indents
for event in event_list:
@@ -322,17 +351,18 @@ func indent_events() -> void:
# in this list have an event_data property
if (not "event_data" in event):
continue
-
- if event.event_data.has('question') or event.event_data.has('condition'):
- indent += 1
- starter = true
- question_index += 1
- question_indent[question_index] = indent
+
+
if event.event_data.has('choice'):
if question_index > 0:
indent = question_indent[question_index] + 1
starter = true
- if event.event_data.has('endbranch'):
+ elif event.event_data.has('question') or event.event_data.has('condition'):
+ indent += 1
+ starter = true
+ question_index += 1
+ question_indent[question_index] = indent
+ elif event.event_data.has('endbranch'):
if question_indent.has(question_index):
indent = question_indent[question_index]
indent -= 1
@@ -341,20 +371,24 @@ func indent_events() -> void:
indent = 0
if indent > 0:
- var indent_node = event.get_node("Indent")
- indent_node.rect_min_size = Vector2(25 * indent, 0)
- indent_node.visible = true
- if starter:
- indent_node.rect_min_size = Vector2(25 * (indent - 1), 0)
- if indent - 1 == 0:
- indent_node.visible = false
-
+ # Keep old behavior for items without template
+ if not _has_template(event):
+ var indent_node = event.get_node("Indent")
+ indent_node.rect_min_size = Vector2(25 * indent, 0)
+ indent_node.visible = true
+ if starter:
+ indent_node.rect_min_size = Vector2(25 * (indent - 1), 0)
+ if indent - 1 == 0:
+ indent_node.visible = false
+ else:
+ if starter:
+ event.event_template.set_indent(indent - 1)
+ else:
+ event.event_template.set_indent(indent)
starter = false
func load_timeline(filename: String):
- #print('---------------------------')
- #print('Loading: ', filename)
clear_timeline()
var start_time = OS.get_system_time_msecs()
timeline_file = filename
@@ -370,16 +404,16 @@ func load_timeline(filename: String):
{'text', 'character', 'portrait'}:
create_event("TextBlock", i)
{'background'}:
- create_event("SceneEvent", i)
- {'character', 'action', 'position', 'portrait'}:
+ create_event("ChangeBackground", i)
+ {'character', 'action', 'position', 'portrait',..}:
create_event("CharacterJoinBlock", i)
- {'audio', 'file'}:
+ {'audio', 'file', ..}:
create_event("AudioBlock", i)
- {'background-music', 'file'}:
+ {'background-music', 'file', ..}:
create_event("BackgroundMusic", i)
{'question', 'options', ..}:
create_event("Question", i)
- {'choice'}:
+ {'choice', ..}:
create_event("Choice", i)
{'endbranch'}:
create_event("EndBranch", i)
@@ -391,7 +425,7 @@ func load_timeline(filename: String):
create_event("EmitSignal", i)
{'change_scene'}:
create_event("ChangeScene", i)
- {'close_dialog'}:
+ {'close_dialog', ..}:
create_event("CloseDialog", i)
{'wait_seconds'}:
create_event("WaitSeconds", i)
@@ -439,7 +473,10 @@ func get_block_below(block):
func get_block_height(block):
if block != null:
- return block.get_node("PanelContainer").rect_size.y
+ if not _has_template(block):
+ return block.get_node("PanelContainer").rect_size.y
+ else:
+ return block.rect_size.y
else:
return null
@@ -506,9 +543,13 @@ func fold_all_nodes():
for event in timeline.get_children():
if event.has_node("PanelContainer/VBoxContainer/Header/VisibleToggle"):
event.get_node("PanelContainer/VBoxContainer/Header/VisibleToggle").set_pressed(false)
+ elif _has_template(event):
+ event.event_template.set_expanded(false)
func unfold_all_nodes():
for event in timeline.get_children():
if event.has_node("PanelContainer/VBoxContainer/Header/VisibleToggle"):
event.get_node("PanelContainer/VBoxContainer/Header/VisibleToggle").set_pressed(true)
+ elif _has_template(event):
+ event.event_template.set_expanded(true)
diff --git a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn
index 4348fb4..a258c22 100644
--- a/addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn
+++ b/addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn
@@ -3,7 +3,7 @@
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/character-join.svg" type="Texture" id=1]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/text-event.svg" type="Texture" id=2]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg" type="Texture" id=3]
-[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/scene event.svg" type="Texture" id=4]
+[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/change-background.svg" type="Texture" id=4]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/condition.svg" type="Texture" id=5]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg" type="Texture" id=6]
[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/character-leave.svg" type="Texture" id=7]
@@ -24,6 +24,7 @@
[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/TimelineArea.gd" type="Script" id=22]
+
[sub_resource type="StyleBoxFlat" id=1]
content_margin_left = 5.0
content_margin_right = 5.0
@@ -266,15 +267,15 @@ align = 0
script = ExtResource( 21 )
EventName = "ChangeTimeline"
-[node name="SceneEvent" type="Button" parent="ScrollContainer/EventContainer"]
+[node name="ChangeBackground" type="Button" parent="ScrollContainer/EventContainer"]
margin_top = 408.0
margin_right = 180.0
margin_bottom = 436.0
-text = " Scene Event"
+text = " Change Background"
icon = ExtResource( 4 )
align = 0
script = ExtResource( 21 )
-EventName = "SceneEvent"
+EventName = "ChangeBackground"
[node name="CloseDialog" type="Button" parent="ScrollContainer/EventContainer"]
margin_top = 440.0
diff --git a/addons/dialogic/Images/Context Menus/ActionCopy.svg b/addons/dialogic/Images/Context Menus/ActionCopy.svg
deleted file mode 100644
index d7a1e10..0000000
--- a/addons/dialogic/Images/Context Menus/ActionCopy.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/addons/dialogic/Images/Context Menus/Filesystem.svg b/addons/dialogic/Images/Context Menus/Filesystem.svg
deleted file mode 100644
index a5e1c2f..0000000
--- a/addons/dialogic/Images/Context Menus/Filesystem.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/addons/dialogic/Images/Event Icons/Main Icons/scene event.svg b/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg
similarity index 100%
rename from addons/dialogic/Images/Event Icons/Main Icons/scene event.svg
rename to addons/dialogic/Images/Event Icons/Main Icons/change-background.svg
diff --git a/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg.import b/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg.import
new file mode 100644
index 0000000..189068a
--- /dev/null
+++ b/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="StreamTexture"
+path="res://.import/change-background.svg-b779e98a98d293a18e8d288547972610.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/dialogic/Images/Event Icons/Main Icons/change-background.svg"
+dest_files=[ "res://.import/change-background.svg-b779e98a98d293a18e8d288547972610.stex" ]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_mode=0
+compress/bptc_ldr=0
+compress/normal_map=0
+flags/repeat=0
+flags/filter=true
+flags/mipmaps=false
+flags/anisotropic=false
+flags/srgb=2
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/HDR_as_SRGB=false
+process/invert_color=false
+stream=false
+size_limit=0
+detect_3d=true
+svg/scale=1.0
diff --git a/addons/dialogic/Nodes/BackgroundMusic.gd b/addons/dialogic/Nodes/BackgroundMusic.gd
index d8a6417..d56632a 100644
--- a/addons/dialogic/Nodes/BackgroundMusic.gd
+++ b/addons/dialogic/Nodes/BackgroundMusic.gd
@@ -1,29 +1,43 @@
extends Control
class_name DialogicBackgroundMusic
-onready var _anim_player := $AnimationPlayer
onready var _track1 := $Track1
onready var _track2 := $Track2
var current_path = ""
-func crossfade_to(path: String) -> void:
- if current_path != path:
- current_path = path
- var stream: AudioStream = load(current_path)
- if _track1.playing and _track2.playing:
- return
-
- if _track2.playing:
- _track1.stream = stream
- _track1.play()
- _anim_player.play("FadeToTrack1")
- else:
- _track2.stream = stream
- _track2.play()
- _anim_player.play("FadeToTrack2")
+func crossfade_to(path: String, audio_bus:String, volume:float, fade_length: float) -> void:
+ if _track1.playing and _track2.playing:
+ return
+
+ var stream: AudioStream = load(path)
+ var fade_out_track = _track1
+ var fade_in_track = _track2
+
+ if _track2.playing:
+ fade_out_track = _track2
+ fade_in_track = _track1
+
+ # setup the new track
+ fade_in_track.stream = stream
+ fade_in_track.bus = audio_bus
+ fade_in_track.volume_db = -60
+
+
+ $Tween.interpolate_property(fade_out_track, "volume_db", null, -60, fade_length, Tween.TRANS_LINEAR)
+ $Tween.interpolate_property(fade_in_track, "volume_db", -60, volume, fade_length, Tween.TRANS_LINEAR)
+ $Tween.start()
+
+ # in case the audio is already playing we will attempt a fade into the new one from the current position
+ if current_path == path:
+ fade_in_track.play(fade_out_track.get_playback_position())
+ # else just play it from the beginning
+ else:
+ fade_in_track.play()
+ current_path = path
-
-func fade_out() -> void:
+func fade_out(fade_length:float = 1) -> void:
current_path = ""
- _anim_player.play("FadeOut")
+ $Tween.interpolate_property(_track1, "volume_db", null, -60, fade_length, Tween.TRANS_LINEAR)
+ $Tween.interpolate_property(_track2, "volume_db", null, -60, fade_length, Tween.TRANS_LINEAR)
+ $Tween.start()
diff --git a/addons/dialogic/Nodes/BackgroundMusic.tscn b/addons/dialogic/Nodes/BackgroundMusic.tscn
index 68129e6..68ea880 100644
--- a/addons/dialogic/Nodes/BackgroundMusic.tscn
+++ b/addons/dialogic/Nodes/BackgroundMusic.tscn
@@ -1,137 +1,7 @@
-[gd_scene load_steps=5 format=2]
+[gd_scene load_steps=2 format=2]
[ext_resource path="res://addons/dialogic/Nodes/BackgroundMusic.gd" type="Script" id=1]
-[sub_resource type="Animation" id=1]
-resource_name = "FadeOut"
-length = 0.5
-tracks/0/type = "value"
-tracks/0/path = NodePath("Track1:volume_db")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 0.5 ),
-"transitions": PoolRealArray( 5.66, 1 ),
-"update": 0,
-"values": [ 0.0, -80.0 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Track2:volume_db")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 0.5 ),
-"transitions": PoolRealArray( 5.66, 1 ),
-"update": 0,
-"values": [ 0.0, -80.0 ]
-}
-tracks/2/type = "value"
-tracks/2/path = NodePath("Track2:playing")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/keys = {
-"times": PoolRealArray( 0.5 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ false ]
-}
-tracks/3/type = "value"
-tracks/3/path = NodePath("Track1:playing")
-tracks/3/interp = 1
-tracks/3/loop_wrap = true
-tracks/3/imported = false
-tracks/3/enabled = true
-tracks/3/keys = {
-"times": PoolRealArray( 0.5 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ false ]
-}
-
-[sub_resource type="Animation" id=2]
-length = 0.5
-tracks/0/type = "value"
-tracks/0/path = NodePath("Track1:volume_db")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 0.5 ),
-"transitions": PoolRealArray( 5.66, 1 ),
-"update": 0,
-"values": [ -80.0, 0.0 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Track2:volume_db")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0, 0.5 ),
-"transitions": PoolRealArray( 5.66, 1 ),
-"update": 0,
-"values": [ 0.0, -80.0 ]
-}
-tracks/2/type = "value"
-tracks/2/path = NodePath("Track2:playing")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/keys = {
-"times": PoolRealArray( 0.5 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ false ]
-}
-
-[sub_resource type="Animation" id=3]
-length = 0.5
-tracks/0/type = "value"
-tracks/0/path = NodePath("Track1:volume_db")
-tracks/0/interp = 1
-tracks/0/loop_wrap = true
-tracks/0/imported = false
-tracks/0/enabled = true
-tracks/0/keys = {
-"times": PoolRealArray( 0, 0.5 ),
-"transitions": PoolRealArray( 5.66, 1 ),
-"update": 0,
-"values": [ 0.0, -80.0 ]
-}
-tracks/1/type = "value"
-tracks/1/path = NodePath("Track1:playing")
-tracks/1/interp = 1
-tracks/1/loop_wrap = true
-tracks/1/imported = false
-tracks/1/enabled = true
-tracks/1/keys = {
-"times": PoolRealArray( 0.5 ),
-"transitions": PoolRealArray( 1 ),
-"update": 1,
-"values": [ false ]
-}
-tracks/2/type = "value"
-tracks/2/path = NodePath("Track2:volume_db")
-tracks/2/interp = 1
-tracks/2/loop_wrap = true
-tracks/2/imported = false
-tracks/2/enabled = true
-tracks/2/keys = {
-"times": PoolRealArray( 0, 0.5 ),
-"transitions": PoolRealArray( 5.66, 1 ),
-"update": 0,
-"values": [ -80.0, 0.0 ]
-}
-
[node name="BackgroundMusic" type="Control"]
margin_right = 40.0
margin_bottom = 40.0
@@ -141,11 +11,9 @@ __meta__ = {
}
[node name="Track1" type="AudioStreamPlayer" parent="."]
+volume_db = -80.0
[node name="Track2" type="AudioStreamPlayer" parent="."]
volume_db = -80.0
-[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
-anims/FadeOut = SubResource( 1 )
-anims/FadeToTrack1 = SubResource( 2 )
-anims/FadeToTrack2 = SubResource( 3 )
+[node name="Tween" type="Tween" parent="."]
diff --git a/addons/dialogic/Nodes/Portrait.gd b/addons/dialogic/Nodes/Portrait.gd
index 99aa693..b81e931 100644
--- a/addons/dialogic/Nodes/Portrait.gd
+++ b/addons/dialogic/Nodes/Portrait.gd
@@ -4,7 +4,8 @@ var character_data = {
'name': 'Default',
'image': "res://addons/dialogic/Example Assets/portraits/df-3.png",
'color': Color(0.973511, 1, 0.152344),
- 'file': ''
+ 'file': '',
+ 'mirror_portraits': false
}
var positions = {
'left': Vector2(-400, 0),
@@ -12,10 +13,11 @@ var positions = {
'center': Vector2(0, 0),
'center_right': Vector2(200, 0),
'center_left': Vector2(-200, 0)}
+
var direction = 'left'
var debug = false
-func init(expression: String = '', position_offset = 'left') -> void:
+func init(expression: String = '', position_offset = 'left', mirror = false) -> void:
rect_position += positions[position_offset]
direction = position_offset
modulate = Color(1,1,1,0)
@@ -41,7 +43,14 @@ func init(expression: String = '', position_offset = 'left') -> void:
$TextureRect.texture.get_width() * 0.5,
$TextureRect.texture.get_height()
) * custom_scale
-
+
+ # the mirror setting of the character
+ if character_data["data"].has('mirror_portraits'):
+ if character_data["data"]['mirror_portraits']:
+ $TextureRect.flip_h = true
+ # the mirror setting of the join event
+ if mirror:
+ $TextureRect.flip_h = !$TextureRect.flip_h
func _ready():
if debug:
@@ -59,7 +68,7 @@ func set_portrait(expression: String) -> void:
$TextureRect.texture = load(p['path'])
else:
$TextureRect.texture = Texture.new()
-
+
# Tween stuff
func fade_in(node = self, time = 0.5):
diff --git a/addons/dialogic/Nodes/TextBubble.gd b/addons/dialogic/Nodes/TextBubble.gd
index c22816b..b9f6b3a 100644
--- a/addons/dialogic/Nodes/TextBubble.gd
+++ b/addons/dialogic/Nodes/TextBubble.gd
@@ -6,6 +6,7 @@ var text_speed := 0.02 # Higher = lower speed
onready var text_label = $RichTextLabel
onready var name_label = $NameLabel
onready var tween = $Tween
+onready var next_indicator = $NextIndicatorContainer/NextIndicator
var _finished := false
@@ -101,7 +102,20 @@ func load_theme(theme: ConfigFile):
$TextureRect.visible = theme.get_value('background', 'use_image', true)
# Next image
- $NextIndicator.texture = DialogicUtil.path_fixer_load(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png'))
+ $NextIndicatorContainer.rect_position = Vector2(0,0)
+ next_indicator.texture = DialogicUtil.path_fixer_load(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png'))
+ # Reset for up and down animation
+ next_indicator.margin_top = 0
+ next_indicator.margin_bottom = 0
+ next_indicator.margin_left = 0
+ next_indicator.margin_right = 0
+ # Scale
+ var indicator_scale = theme.get_value('next_indicator', 'scale', 0.4)
+ next_indicator.rect_scale = Vector2(indicator_scale, indicator_scale)
+ # Offset
+ var offset = theme.get_value('next_indicator', 'offset', Vector2(13, 10))
+ next_indicator.rect_position = theme.get_value('box', 'size', Vector2(910, 167)) - (next_indicator.texture.get_size() * indicator_scale)
+ next_indicator.rect_position -= offset
# Character Name
$NameLabel/ColorRect.visible = theme.get_value('name', 'background_visible', false)
@@ -120,10 +134,10 @@ func load_theme(theme: ConfigFile):
$NameLabel/TextureRect.modulate = Color('#ffffffff')
# Setting next indicator animation
- $NextIndicator.self_modulate = Color('#ffffff')
- $NextIndicator/AnimationPlayer.play(
- theme.get_value('next_indicator', 'animation', 'Up and down')
- )
+ next_indicator.self_modulate = Color('#ffffff')
+ var animation = theme.get_value('next_indicator', 'animation', 'Up and down')
+ next_indicator.get_node('AnimationPlayer').play(animation)
+
## *****************************************************************************
## PRIVATE METHODS
diff --git a/addons/dialogic/Nodes/TextBubble.tscn b/addons/dialogic/Nodes/TextBubble.tscn
index 1ddcff4..54f3c42 100644
--- a/addons/dialogic/Nodes/TextBubble.tscn
+++ b/addons/dialogic/Nodes/TextBubble.tscn
@@ -31,7 +31,7 @@ resource_name = "Static"
[sub_resource type="Animation" id=4]
loop = true
tracks/0/type = "value"
-tracks/0/path = NodePath(".:margin_bottom")
+tracks/0/path = NodePath("..:rect_position")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/imported = false
@@ -40,7 +40,7 @@ tracks/0/keys = {
"times": PoolRealArray( 0, 0.5 ),
"transitions": PoolRealArray( 1, 1 ),
"update": 0,
-"values": [ 12.0, 55.0 ]
+"values": [ Vector2( 0, 0 ), Vector2( 0, -10 ) ]
}
[sub_resource type="StyleBoxFlat" id=5]
@@ -92,7 +92,7 @@ margin_bottom = -10.0
rect_clip_content = false
custom_styles/normal = SubResource( 1 )
custom_fonts/normal_font = ExtResource( 1 )
-custom_colors/default_color = Color( 0.423529, 0.580392, 0.74902, 1 )
+custom_colors/default_color = Color( 1, 1, 1, 1 )
custom_colors/font_color_shadow = Color( 1, 1, 1, 0 )
custom_constants/shadow_offset_x = 2
custom_constants/shadow_offset_y = 2
@@ -104,30 +104,31 @@ __meta__ = {
"_edit_use_anchors_": false
}
-[node name="NextIndicator" type="TextureRect" parent="."]
-visible = false
-anchor_left = 1.0
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-margin_left = -36.4279
-margin_top = -35.9016
-margin_right = 14.5721
-margin_bottom = 44.8652
-rect_scale = Vector2( 0.4, 0.4 )
+[node name="NextIndicatorContainer" type="Control" parent="."]
+margin_right = 40.0
+margin_bottom = 40.0
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="NextIndicator" type="TextureRect" parent="NextIndicatorContainer"]
+margin_top = -10.0
+margin_right = 51.0
+margin_bottom = 41.0
texture = ExtResource( 3 )
stretch_mode = 4
__meta__ = {
"_edit_use_anchors_": false
}
-[node name="AnimationPlayer" type="AnimationPlayer" parent="NextIndicator"]
+[node name="AnimationPlayer" type="AnimationPlayer" parent="NextIndicatorContainer/NextIndicator"]
autoplay = "Up and down"
anims/Pulse = SubResource( 2 )
anims/Static = SubResource( 3 )
"anims/Up and down" = SubResource( 4 )
[node name="NameLabel" type="Label" parent="."]
+visible = false
margin_top = -48.0
margin_right = 58.0
margin_bottom = -8.0
diff --git a/addons/dialogic/Nodes/dialog_node.gd b/addons/dialogic/Nodes/dialog_node.gd
index 60e023a..f64dc25 100644
--- a/addons/dialogic/Nodes/dialog_node.gd
+++ b/addons/dialogic/Nodes/dialog_node.gd
@@ -56,6 +56,8 @@ func _ready():
# Setting everything up for the node to be default
$DefinitionInfo.visible = false
$TextBubble.connect("text_completed", self, "_on_text_completed")
+ $TextBubble/RichTextLabel.connect('meta_hover_started', self, '_on_RichTextLabel_meta_hover_started')
+ $TextBubble/RichTextLabel.connect('meta_hover_ended', self, '_on_RichTextLabel_meta_hover_ended')
# Getting the character information
characters = DialogicUtil.get_character_list()
@@ -83,15 +85,16 @@ func load_config_files():
func resize_main():
# This function makes sure that the dialog is displayed at the correct
- # size and position in the screen.
- if Engine.is_editor_hint() == false:
+ # size and position in the screen.
+ var reference = rect_size
+ if not Engine.is_editor_hint():
set_global_position(Vector2(0,0))
- if ProjectSettings.get_setting("display/window/stretch/mode") != '2d':
- set_deferred('rect_size', get_viewport().size)
- dprint("Viewport", get_viewport().size)
- $TextBubble.rect_position.x = (rect_size.x / 2) - ($TextBubble.rect_size.x / 2)
+ reference = get_viewport().get_visible_rect().size
+
+ $TextBubble.rect_position.x = (reference.x / 2) - ($TextBubble.rect_size.x / 2)
if current_theme != null:
- $TextBubble.rect_position.y = (rect_size.y) - ($TextBubble.rect_size.y) - current_theme.get_value('box', 'bottom_gap', 40)
+ $TextBubble.rect_position.y = (reference.y) - ($TextBubble.rect_size.y) - current_theme.get_value('box', 'bottom_gap', 40)
+
func set_current_dialog(dialog_path: String):
@@ -190,32 +193,48 @@ func parse_branches(dialog_script: Dictionary) -> Dictionary:
var event_id: int = 0 # The current id for jumping later on
var question_id: int = 0 # identifying the questions to assign options to it
for event in dialog_script['events']:
- if event.has('question'):
- event['event_id'] = event_id
- event['question_id'] = question_id
- event['answered'] = false
- question_id += 1
- questions.append(event)
- parser_queue.append(event)
-
- if event.has('condition'):
- event['event_id'] = event_id
- event['question_id'] = question_id
- event['answered'] = false
- question_id += 1
- questions.append(event)
- parser_queue.append(event)
-
if event.has('choice'):
var opened_branch = parser_queue.back()
- dialog_script['events'][opened_branch['event_id']]['options'].append({
+ var option = {
'question_id': opened_branch['question_id'],
'label': event['choice'],
'event_id': event_id,
- })
+ }
+ if event.has('condition') and event.has('definition') and event.has('value'):
+ option = {
+ 'question_id': opened_branch['question_id'],
+ 'label': event['choice'],
+ 'event_id': event_id,
+ 'condition': event['condition'],
+ 'definition': event['definition'],
+ 'value': event['value'],
+ }
+ else:
+ option = {
+ 'question_id': opened_branch['question_id'],
+ 'label': event['choice'],
+ 'event_id': event_id,
+ 'condition': '',
+ 'definition': '',
+ 'value': '',
+ }
+ dialog_script['events'][opened_branch['event_id']]['options'].append(option)
event['question_id'] = opened_branch['question_id']
-
- if event.has('endbranch'):
+ elif event.has('question'):
+ event['event_id'] = event_id
+ event['question_id'] = question_id
+ event['answered'] = false
+ question_id += 1
+ questions.append(event)
+ parser_queue.append(event)
+ elif event.has('condition'):
+ event['event_id'] = event_id
+ event['question_id'] = question_id
+ event['answered'] = false
+ question_id += 1
+ questions.append(event)
+ parser_queue.append(event)
+ elif event.has('endbranch'):
event['event_id'] = event_id
var opened_branch = parser_queue.pop_back()
event['end_branch_of'] = opened_branch['question_id']
@@ -256,7 +275,7 @@ func _insert_glossary_definitions(text: String):
func _process(delta):
- $TextBubble/NextIndicator.visible = finished
+ $TextBubble/NextIndicatorContainer/NextIndicator.visible = finished
if waiting_for_answer and Input.is_action_just_released(input_next):
if $Options.get_child_count() > 0:
$Options.get_child(0).grab_focus()
@@ -317,6 +336,7 @@ func on_timeline_end():
DialogicSingleton.save_definitions()
DialogicSingleton.set_current_timeline('')
emit_signal("event_end", "timeline")
+ dprint('[D] Timeline End')
func _init_dialog():
@@ -435,7 +455,7 @@ func event_handler(event: Dictionary):
if char_portrait == '':
char_portrait = 'Default'
p.character_data = character_data
- p.init(char_portrait, get_character_position(event['position']))
+ p.init(char_portrait, get_character_position(event['position']), event.get('mirror', false))
$Portraits.add_child(p)
p.fade_in()
_load_next_event()
@@ -455,6 +475,7 @@ func event_handler(event: Dictionary):
background.anchor_bottom = 1
background.stretch_mode = TextureRect.STRETCH_SCALE
background.show_behind_parent = true
+ background.mouse_filter = Control.MOUSE_FILTER_IGNORE
add_child(background)
background.texture = null
if (background.get_child_count() > 0):
@@ -469,7 +490,7 @@ func event_handler(event: Dictionary):
elif (event['background'] != ''):
background.texture = load(event['background'])
_load_next_event()
- {'audio'}, {'audio', 'file'}:
+ {'audio'}, {'audio', 'file', ..}:
emit_signal("event_start", "audio", event)
if event['audio'] == 'play' and 'file' in event.keys() and not event['file'].empty():
var audio = get_node_or_null('AudioEvent')
@@ -477,21 +498,25 @@ func event_handler(event: Dictionary):
audio = AudioStreamPlayer.new()
audio.name = 'AudioEvent'
add_child(audio)
+ if event.has('audio_bus'):
+ if AudioServer.get_bus_index(event['audio_bus']) >= 0:
+ audio.bus = event['audio_bus']
+ if event.has('volume'):
+ audio.volume_db = event['volume']
audio.stream = load(event['file'])
audio.play()
- print('play')
else:
var audio = get_node_or_null('AudioEvent')
if audio != null:
audio.stop()
audio.queue_free()
_load_next_event()
- {'background-music'}, {'background-music', 'file'}:
+ {'background-music'}, {'background-music', 'file',..}:
emit_signal("event_start", "background-music", event)
if event['background-music'] == 'play' and 'file' in event.keys() and not event['file'].empty():
- $FX/BackgroundMusic.crossfade_to(event['file'])
+ $FX/BackgroundMusic.crossfade_to(event['file'], event.get('audio_bus', 'Master'), event.get('volume', 0), event.get('fade_length', 1))
else:
- $FX/BackgroundMusic.fade_out()
+ $FX/BackgroundMusic.fade_out(event.get('fade_length', 1))
_load_next_event()
{'endbranch', ..}:
emit_signal("event_start", "endbranch", event)
@@ -502,9 +527,12 @@ func event_handler(event: Dictionary):
dprint('[!] Emitting signal: dialogic_signal(', event['emit_signal'], ')')
emit_signal("dialogic_signal", event['emit_signal'])
_load_next_event()
- {'close_dialog'}:
+ {'close_dialog', ..}:
emit_signal("event_start", "close_dialog", event)
- close_dialog_event()
+ var transition_duration = 1.0
+ if event.has('transition_duration'):
+ transition_duration = event['transition_duration']
+ close_dialog_event(transition_duration)
{'set_theme'}:
emit_signal("event_start", "set_theme", event)
if event['set_theme'] != '':
@@ -569,7 +597,7 @@ func event_handler(event: Dictionary):
_load_next_event()
_:
visible = false
- dprint('Other event. ', event)
+ dprint('[D] Other event. ', event)
$Options.visible = waiting_for_answer
@@ -580,7 +608,21 @@ func reset_options():
option.queue_free()
-func add_choice_button(option):
+func _should_add_choice_button(option: Dictionary):
+ if not option['condition'].empty() and not option['definition'].empty() and not option['value'].empty():
+ var def_value = null
+ for d in definitions['variables']:
+ if d['id'] == option['definition']:
+ def_value = d['value']
+ return def_value != null and _compare_definitions(def_value, option['value'], option['condition']);
+ else:
+ return true
+
+
+func add_choice_button(option: Dictionary):
+ if not _should_add_choice_button(option):
+ return
+
var theme = current_theme
var button = ChoiceButton.instance()
@@ -593,6 +635,11 @@ func add_choice_button(option):
button.set('custom_colors/font_color', text_color)
button.set('custom_colors/font_color_hover', text_color)
button.set('custom_colors/font_color_pressed', text_color)
+
+ if theme.get_value('buttons', 'fixed', false):
+ var size = theme.get_value('buttons', 'fixed_size', Vector2(130,40))
+ button.rect_min_size = size
+ button.rect_size = size
if theme.get_value('buttons', 'text_color_enabled', true):
var button_text_color = Color(theme.get_value('buttons', 'text_color', "#ffffffff"))
@@ -729,7 +776,7 @@ func _on_RichTextLabel_meta_hover_started(meta):
'color': current_theme.get_value('definitions', 'color', '#ffbebebe'),
})
correct_type = true
- dprint(d)
+ dprint('[D] Hovered over glossary entry: ', d)
if correct_type:
definition_visible = true
@@ -740,7 +787,6 @@ func _on_RichTextLabel_meta_hover_started(meta):
func _on_RichTextLabel_meta_hover_ended(meta):
# Adding a timer to avoid a graphical glitch
-
$DefinitionInfo/Timer.start(0.1)
@@ -752,18 +798,17 @@ func _on_Definition_Timer_timeout():
func wait_seconds(seconds):
var timer = Timer.new()
- timer.name = 'WaitSeconds'
add_child(timer)
- timer.connect("timeout", self, '_on_WaitSeconds_timeout')
+ timer.connect("timeout", self, '_on_WaitSeconds_timeout', [timer])
timer.start(seconds)
$TextBubble.visible = false
-func _on_WaitSeconds_timeout():
+func _on_WaitSeconds_timeout(timer):
emit_signal("event_end", "wait")
waiting = false
- $WaitSeconds.stop()
- $WaitSeconds.queue_free()
+ timer.stop()
+ timer.queue_free()
$TextBubble.visible = true
_load_next_event()
@@ -811,18 +856,21 @@ func characters_leave_all():
p.fade_out()
-func close_dialog_event():
- var tween = Tween.new()
- add_child(tween)
- tween.interpolate_property($TextBubble, "modulate",
- $TextBubble.modulate, Color('#00ffffff'), 1,
- Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
- tween.start()
- var close_dialog_timer = Timer.new()
- close_dialog_timer.connect("timeout", self, '_on_close_dialog_timeout')
- add_child(close_dialog_timer)
- close_dialog_timer.start(2)
+func close_dialog_event(transition_duration):
characters_leave_all()
+ if transition_duration == 0:
+ _on_close_dialog_timeout()
+ else:
+ var tween = Tween.new()
+ add_child(tween)
+ tween.interpolate_property($TextBubble, "modulate",
+ $TextBubble.modulate, Color('#00ffffff'), transition_duration,
+ Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
+ tween.start()
+ var close_dialog_timer = Timer.new()
+ close_dialog_timer.connect("timeout", self, '_on_close_dialog_timeout')
+ add_child(close_dialog_timer)
+ close_dialog_timer.start(transition_duration)
func _on_close_dialog_timeout():
diff --git a/addons/dialogic/Other/DialogicSharp.cs b/addons/dialogic/Other/DialogicSharp.cs
new file mode 100644
index 0000000..f07005d
--- /dev/null
+++ b/addons/dialogic/Other/DialogicSharp.cs
@@ -0,0 +1,77 @@
+using Godot;
+using GC = Godot.Collections;
+using System;
+
+public static class DialogicSharp
+{
+ private static Script _dialogic = GD.Load