mirror of
https://github.com/lihop/godot-xterm.git
synced 2025-05-05 04:34:23 +02:00
Further progress towards Godot 4.0 support
- Primary example scenes (menu, terminal, and asciicast) working but still a lot of warning/error messages and some regressions. - Editor integrated terminal works, but still a lot of warning/error messages and some regressions. - Added support for "blink" display attribute. - Removed GDScript terminal code. Terminal node is now purely a GDExtension. So is LibuvUtils. - GUT tests not working yet. - Still a lot of things to fix. - So far, only built for and manually tested on Linux x86_64.
This commit is contained in:
parent
aad8e39dae
commit
ad7f97e493
30 changed files with 1385 additions and 1459 deletions
|
@ -1,5 +1,5 @@
|
|||
@tool
|
||||
extends "../../terminal.gd"
|
||||
extends Terminal
|
||||
|
||||
signal exited(exit_code, signum)
|
||||
|
||||
|
@ -14,46 +14,43 @@ func _set_terminal_colors(color_map: Dictionary) -> void:
|
|||
for key in color_map.keys():
|
||||
var val: String = color_map[key]
|
||||
var color: Color = editor_settings.get_setting("text_editor/highlighting/%s" % val)
|
||||
theme.set_color(key, "Terminal", color)
|
||||
add_theme_color_override(key, color)
|
||||
|
||||
|
||||
func _ready():
|
||||
if not editor_settings:
|
||||
return
|
||||
|
||||
theme = Theme.new()
|
||||
|
||||
# Get colors from TextEdit theme. Created using the default (Adaptive) theme
|
||||
# for reference, but will probably cause strange results if using another theme
|
||||
# better to use a dedicated terminal theme, rather than relying on this.
|
||||
_set_terminal_colors(
|
||||
{
|
||||
"black": "caret_background_color",
|
||||
"red": "keyword_color",
|
||||
"green": "gdscript/node_path_color",
|
||||
"yellow": "string_color",
|
||||
"blue": "function_color",
|
||||
"magenta": "symbol_color",
|
||||
"cyan": "gdscript/function_definition_color",
|
||||
"white": "text_color",
|
||||
"bright_black": "comment_color",
|
||||
"bright_red": "breakpoint_color",
|
||||
"bright_green": "base_type_color",
|
||||
"bright_yellow": "search_result_color",
|
||||
"bright_blue": "member_variable_color",
|
||||
"bright_magenta": "code_folding_color",
|
||||
"bright_cyan": "user_type_color",
|
||||
"bright_white": "text_selected_color",
|
||||
"background": "background_color",
|
||||
"foreground": "caret_color",
|
||||
"ansi_0_color": "completion_background_color",
|
||||
"ansi_1_color": "keyword_color",
|
||||
"ansi_2_color": "gdscript/node_path_color",
|
||||
"ansi_3_color": "string_color",
|
||||
"ansi_4_color": "function_color",
|
||||
"ansi_5_color": "symbol_color",
|
||||
"ansi_6_color": "gdscript/function_definition_color",
|
||||
"ansi_7_color": "text_color",
|
||||
"ansi_8_color": "comment_color",
|
||||
"ansi_9_color": "breakpoint_color",
|
||||
"ansi_10_color": "base_type_color",
|
||||
"ansi_11_color": "search_result_color",
|
||||
"ansi_12_color": "member_variable_color",
|
||||
"ansi_13_color": "code_folding_color",
|
||||
"ansi_14_color": "user_type_color",
|
||||
"ansi_15_color": "text_selected_color",
|
||||
"background_color": "background_color",
|
||||
"foreground_color": "caret_color",
|
||||
}
|
||||
)
|
||||
_native_terminal._update_theme()
|
||||
|
||||
|
||||
func _input(event):
|
||||
if has_focus() and event is InputEventKey and event.is_pressed():
|
||||
if event.control and event.scancode in [KEY_PAGEUP, KEY_PAGEDOWN]:
|
||||
if event.ctrl_pressed and event.scancode in [KEY_PAGEUP, KEY_PAGEDOWN]:
|
||||
# Handled by switch tabs shortcut.
|
||||
return
|
||||
|
||||
|
|
|
@ -1,27 +1,25 @@
|
|||
[gd_scene load_steps=4 format=2]
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bkcyv0w3setep"]
|
||||
|
||||
[ext_resource path="res://addons/godot_xterm/editor_plugins/terminal/editor_terminal.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/godot_xterm/pty.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/godot_xterm/themes/default.tres" type="Theme" id=3]
|
||||
[ext_resource type="Script" path="res://addons/godot_xterm/editor_plugins/terminal/editor_terminal.gd" id="1"]
|
||||
[ext_resource type="Script" path="res://addons/godot_xterm/pty.gd" id="2"]
|
||||
[ext_resource type="Theme" uid="uid://c3ep6rm56qjeb" path="res://addons/godot_xterm/themes/default.tres" id="3"]
|
||||
|
||||
[node name="Terminal" type="Control"]
|
||||
[node name="Terminal" type="Terminal"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
focus_mode = 1
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
theme = ExtResource( 3 )
|
||||
script = ExtResource( 1 )
|
||||
focus_mode = 1
|
||||
theme = ExtResource("3")
|
||||
script = ExtResource("1")
|
||||
|
||||
[node name="PTY" type="Node" parent="."]
|
||||
script = ExtResource( 2 )
|
||||
script = ExtResource("2")
|
||||
terminal_path = NodePath("..")
|
||||
env = {
|
||||
"COLORTERM": "truecolor",
|
||||
"TERM": "xterm-256color"
|
||||
}
|
||||
|
||||
[node name="Bell" type="AudioStreamPlayer" parent="."]
|
||||
|
||||
[connection signal="bell" from="." to="Bell" method="play"]
|
||||
[connection signal="exited" from="PTY" to="." method="_on_PTY_exited"]
|
||||
|
|
|
@ -28,9 +28,9 @@ var editor_plugin: EditorPlugin
|
|||
var editor_interface: EditorInterface
|
||||
|
||||
@onready var editor_settings: EditorSettings = editor_interface.get_editor_settings()
|
||||
@onready var tabs: TabBar = $VBoxContainer/TabbarContainer/TabBar
|
||||
@onready var tabs: TabBar = $VBoxContainer/TabbarContainer/Tabs
|
||||
@onready var tabbar_container: HBoxContainer = $VBoxContainer/TabbarContainer
|
||||
@onready var add_button: Button = $VBoxContainer/TabbarContainer/TabBar/AddButton
|
||||
@onready var add_button: Button = $VBoxContainer/TabbarContainer/AddButton
|
||||
@onready var tab_container: TabContainer = $VBoxContainer/TabContainer
|
||||
@onready var terminal_popup_menu: PopupMenu = $VBoxContainer/TerminalPopupMenu
|
||||
|
||||
|
@ -39,7 +39,7 @@ var editor_interface: EditorInterface
|
|||
@onready var size_label: Label = $SizeLabel
|
||||
@onready var size_label_timer: Timer = $SizeLabel/SizeLabelTimer
|
||||
|
||||
@onready var ready := true
|
||||
@onready var is_ready := true
|
||||
|
||||
var _theme := Theme.new()
|
||||
var _settings: TerminalSettings
|
||||
|
@ -47,7 +47,9 @@ var _tab_container_min_size
|
|||
|
||||
|
||||
func _ready():
|
||||
tab_container.add_theme_stylebox_override("panel", get_stylebox("background", "EditorStyles"))
|
||||
tab_container.add_theme_stylebox_override(
|
||||
"panel", get_theme_stylebox("background", "EditorStyles")
|
||||
)
|
||||
_update_settings()
|
||||
|
||||
|
||||
|
@ -55,18 +57,6 @@ func _load_or_create_settings() -> void:
|
|||
# Use only default settings for now, until settings are properly defined
|
||||
# and documented.
|
||||
_settings = TerminalSettings.new()
|
||||
return
|
||||
|
||||
var dir := Directory.new()
|
||||
|
||||
if not dir.dir_exists(SETTINGS_FILE_PATH.get_base_dir()):
|
||||
dir.make_dir(SETTINGS_FILE_PATH.get_base_dir())
|
||||
|
||||
if not dir.file_exists(SETTINGS_FILE_PATH):
|
||||
var settings := TerminalSettings.new()
|
||||
ResourceSaver.save(SETTINGS_FILE_PATH, settings)
|
||||
|
||||
_settings = load(SETTINGS_FILE_PATH)
|
||||
|
||||
|
||||
func _update_settings() -> void:
|
||||
|
@ -76,36 +66,37 @@ func _update_settings() -> void:
|
|||
if editor_interface.has_method("get_editor_scale"):
|
||||
editor_scale = editor_interface.get_editor_scale()
|
||||
|
||||
minimum_size = Vector2(0, tabbar_container.size.y + 182) * editor_scale
|
||||
custom_minimum_size = Vector2(0, tabbar_container.size.y + 182) * editor_scale
|
||||
size.y = 415
|
||||
|
||||
tabs.tab_close_display_policy = TabBar.CLOSE_BUTTON_SHOW_ALWAYS
|
||||
|
||||
# Update shortcuts.
|
||||
if _settings.new_terminal_shortcut:
|
||||
terminal_popup_menu.set_item_shortcut(
|
||||
TerminalPopupMenuOptions.NEW_TERMINAL, _settings.new_terminal_shortcut, true
|
||||
)
|
||||
if _settings.kill_terminal_shortcut:
|
||||
terminal_popup_menu.set_item_shortcut(
|
||||
TerminalPopupMenuOptions.KILL_TERMINAL, _settings.kill_terminal_shortcut, false
|
||||
)
|
||||
if _settings.copy_shortcut:
|
||||
terminal_popup_menu.set_item_shortcut(
|
||||
TerminalPopupMenuOptions.COPY, _settings.copy_shortcut, false
|
||||
)
|
||||
if _settings.paste_shortcut:
|
||||
terminal_popup_menu.set_item_shortcut(
|
||||
TerminalPopupMenuOptions.PASTE, _settings.paste_shortcut, false
|
||||
)
|
||||
#FIXME
|
||||
# # Update shortcuts.
|
||||
# if _settings.new_terminal_shortcut:
|
||||
# terminal_popup_menu.set_item_shortcut(
|
||||
# TerminalPopupMenuOptions.NEW_TERMINAL, _settings.new_terminal_shortcut, true
|
||||
# )
|
||||
# if _settings.kill_terminal_shortcut:
|
||||
# terminal_popup_menu.set_item_shortcut(
|
||||
# TerminalPopupMenuOptions.KILL_TERMINAL, _settings.kill_terminal_shortcut, false
|
||||
# )
|
||||
# if _settings.copy_shortcut:
|
||||
# terminal_popup_menu.set_item_shortcut(
|
||||
# TerminalPopupMenuOptions.COPY, _settings.copy_shortcut, false
|
||||
# )
|
||||
# if _settings.paste_shortcut:
|
||||
# terminal_popup_menu.set_item_shortcut(
|
||||
# TerminalPopupMenuOptions.PASTE, _settings.paste_shortcut, false
|
||||
# )
|
||||
|
||||
_update_terminal_tabs()
|
||||
|
||||
|
||||
func _update_terminal_tabs():
|
||||
# Wait a couple of frames to allow everything to resize before updating.
|
||||
await get_tree().idle_frame
|
||||
await get_tree().idle_frame
|
||||
await get_tree().process_frame
|
||||
await get_tree().process_frame
|
||||
|
||||
if tabs.get_offset_buttons_visible():
|
||||
# Move add button to fixed position on the tabbar.
|
||||
|
@ -116,7 +107,7 @@ func _update_terminal_tabs():
|
|||
tabbar_container.move_child(add_button, 0)
|
||||
else:
|
||||
# Move add button after last tab.
|
||||
if add_button.get_parent() == tabbar_container:
|
||||
if tabs.tab_count > 0 and add_button.get_parent() == tabbar_container:
|
||||
tabbar_container.remove_child(add_button)
|
||||
tabs.add_child(add_button)
|
||||
var last_tab := Rect2()
|
||||
|
@ -125,6 +116,9 @@ func _update_terminal_tabs():
|
|||
add_button.position = Vector2(
|
||||
last_tab.position.x + last_tab.size.x + 3, last_tab.position.y
|
||||
)
|
||||
if tabs.tab_count == 0 and add_button.get_parent() == tabs:
|
||||
tabs.remove_child(add_button)
|
||||
tabbar_container.add_child(add_button)
|
||||
|
||||
# Make sure we still own the button, so it gets saved with our scene.
|
||||
add_button.owner = self
|
||||
|
@ -135,9 +129,9 @@ func _on_AddButton_pressed():
|
|||
var terminal := EditorTerminal.instantiate()
|
||||
tabs.add_tab(shell.get_file())
|
||||
terminal.editor_settings = editor_settings
|
||||
terminal.set_anchors_preset(PRESET_WIDE)
|
||||
terminal.connect("gui_input",Callable(self,"_on_TabContainer_gui_input"))
|
||||
terminal.connect("exited",Callable(self,"_on_Terminal_exited").bind(terminal))
|
||||
terminal.set_anchors_preset(PRESET_BOTTOM_WIDE)
|
||||
terminal.connect("gui_input", Callable(self, "_on_TabContainer_gui_input"))
|
||||
terminal.connect("exited", Callable(self, "_on_Terminal_exited").bind(terminal))
|
||||
tab_container.add_child(terminal)
|
||||
terminal.pty.fork(shell)
|
||||
terminal.grab_focus()
|
||||
|
@ -163,7 +157,7 @@ func _on_Tabs_tab_close(tab_index):
|
|||
|
||||
|
||||
func _notification(what):
|
||||
if not ready:
|
||||
if not is_ready:
|
||||
return
|
||||
|
||||
match what:
|
||||
|
@ -181,46 +175,53 @@ func _input(event: InputEvent) -> void:
|
|||
return
|
||||
|
||||
# Global shortcut to open new terminal and make terminal panel visible.
|
||||
if _settings.new_terminal_shortcut and _settings.new_terminal_shortcut.shortcut:
|
||||
if event.is_match(_settings.new_terminal_shortcut.shortcut):
|
||||
get_tree().set_input_as_handled()
|
||||
editor_plugin.make_bottom_panel_item_visible(self)
|
||||
_on_AddButton_pressed()
|
||||
# FIXME
|
||||
# if _settings.new_terminal_shortcut and _settings.new_terminal_shortcut.shortcut:
|
||||
# if event.is_match(_settings.new_terminal_shortcut.shortcut):
|
||||
# get_tree().set_input_as_handled()
|
||||
# editor_plugin.make_bottom_panel_item_visible(self)
|
||||
# _on_AddButton_pressed()
|
||||
|
||||
# Non-global shortcuts, only applied if terminal is active and focused.
|
||||
if (
|
||||
tabs.get_tab_count() > 0 and tab_container.get_child(tabs.current_tab).has_focus()
|
||||
or terminal_popup_menu.has_focus()
|
||||
):
|
||||
pass
|
||||
# Kill terminal.
|
||||
if _settings.kill_terminal_shortcut and _settings.kill_terminal_shortcut.shortcut:
|
||||
if event.is_match(_settings.kill_terminal_shortcut.shortcut):
|
||||
get_tree().set_input_as_handled()
|
||||
_on_TerminalPopupMenu_id_pressed(TerminalPopupMenuOptions.KILL_TERMINAL)
|
||||
# FIXME shortcut
|
||||
|
||||
# Copy.
|
||||
if _settings.copy_shortcut and _settings.copy_shortcut.shortcut:
|
||||
if event.is_match(_settings.copy_shortcut.shortcut):
|
||||
get_tree().set_input_as_handled()
|
||||
_on_TerminalPopupMenu_id_pressed(TerminalPopupMenuOptions.COPY)
|
||||
|
||||
# Paste.
|
||||
if _settings.paste_shortcut and _settings.paste_shortcut.shortcut:
|
||||
if event.is_match(_settings.paste_shortcut.shortcut):
|
||||
get_tree().set_input_as_handled()
|
||||
_on_TerminalPopupMenu_id_pressed(TerminalPopupMenuOptions.PASTE)
|
||||
# if _settings.kill_terminal_shortcut and _settings.kill_terminal_shortcut.shortcut:
|
||||
# if event.is_match(_settings.kill_terminal_shortcut.shortcut):
|
||||
# get_tree().set_input_as_handled()
|
||||
# _on_TerminalPopupMenu_id_pressed(TerminalPopupMenuOptions.KILL_TERMINAL)
|
||||
|
||||
# Next tab.
|
||||
if _settings.next_tab_shortcut and _settings.next_tab_shortcut.shortcut:
|
||||
if event.is_match(_settings.next_tab_shortcut.shortcut):
|
||||
get_tree().set_input_as_handled()
|
||||
tabs.current_tab = min(tabs.current_tab + 1, tabs.get_tab_count() - 1)
|
||||
# Copy.
|
||||
#FIXME
|
||||
# if _settings.copy_shortcut and _settings.copy_shortcut.shortcut:
|
||||
# if event.is_match(_settings.copy_shortcut.shortcut):
|
||||
# get_tree().set_input_as_handled()
|
||||
# _on_TerminalPopupMenu_id_pressed(TerminalPopupMenuOptions.COPY)
|
||||
|
||||
# Previous tab.
|
||||
if _settings.previous_tab_shortcut and _settings.previous_tab_shortcut.shortcut:
|
||||
if event.is_match(_settings.previous_tab_shortcut.shortcut):
|
||||
get_tree().set_input_as_handled()
|
||||
tabs.current_tab = max(tabs.current_tab - 1, 0)
|
||||
# Paste.
|
||||
#FIXME
|
||||
# if _settings.paste_shortcut and _settings.paste_shortcut.shortcut:
|
||||
# if event.is_match(_settings.paste_shortcut.shortcut):
|
||||
# get_tree().set_input_as_handled()
|
||||
# _on_TerminalPopupMenu_id_pressed(TerminalPopupMenuOptions.PASTE)
|
||||
#
|
||||
# # Next tab.
|
||||
# if _settings.next_tab_shortcut and _settings.next_tab_shortcut.shortcut:
|
||||
# if event.is_match(_settings.next_tab_shortcut.shortcut):
|
||||
# get_tree().set_input_as_handled()
|
||||
# tabs.current_tab = min(tabs.current_tab + 1, tabs.get_tab_count() - 1)
|
||||
#
|
||||
# # Previous tab.
|
||||
# if _settings.previous_tab_shortcut and _settings.previous_tab_shortcut.shortcut:
|
||||
# if event.is_match(_settings.previous_tab_shortcut.shortcut):
|
||||
# get_tree().set_input_as_handled()
|
||||
# tabs.current_tab = max(tabs.current_tab - 1, 0)
|
||||
|
||||
|
||||
func _on_TabContainer_gui_input(event):
|
||||
|
@ -238,15 +239,15 @@ func _on_TerminalPopupMenu_id_pressed(id):
|
|||
var terminal = tab_container.get_child(tab_container.current_tab)
|
||||
match id:
|
||||
TerminalPopupMenuOptions.COPY:
|
||||
OS.clipboard = terminal.copy_selection()
|
||||
DisplayServer.clipboard_set(terminal.copy_selection())
|
||||
TerminalPopupMenuOptions.PASTE:
|
||||
for i in OS.clipboard.length():
|
||||
for i in DisplayServer.clipboard_get().length():
|
||||
var event = InputEventKey.new()
|
||||
event.unicode = ord(OS.clipboard[i])
|
||||
event.unicode = DisplayServer.clipboard_get().unicode_at(i)
|
||||
event.button_pressed = true
|
||||
terminal._gui_input(event)
|
||||
TerminalPopupMenuOptions.COPY_ALL:
|
||||
OS.clipboard = terminal.copy_all()
|
||||
DisplayServer.clipboard_set(terminal.copy_all())
|
||||
TerminalPopupMenuOptions.CLEAR:
|
||||
terminal.clear()
|
||||
TerminalPopupMenuOptions.KILL_TERMINAL:
|
||||
|
|
|
@ -1,119 +1,93 @@
|
|||
[gd_scene load_steps=7 format=2]
|
||||
[gd_scene load_steps=4 format=3 uid="uid://cbxovnvw5o4mo"]
|
||||
|
||||
[ext_resource path="res://addons/godot_xterm/editor_plugins/terminal/terminal_panel.gd" type="Script" id=1]
|
||||
[ext_resource type="Script" path="res://addons/godot_xterm/editor_plugins/terminal/terminal_panel.gd" id="1"]
|
||||
|
||||
[sub_resource type="Image" id=6]
|
||||
[sub_resource type="Image" id="Image_x7bb3"]
|
||||
data = {
|
||||
"data": PackedByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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( 6 )
|
||||
size = Vector2( 16, 16 )
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id=3]
|
||||
texture = SubResource( 2 )
|
||||
region_rect = Rect2( 0, 0, 16, 16 )
|
||||
offset_left = 2.0
|
||||
offset_right = 2.0
|
||||
offset_top = 2.0
|
||||
offset_bottom = 2.0
|
||||
|
||||
[sub_resource type="Image" id=7]
|
||||
data = {
|
||||
"data": PackedByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ),
|
||||
"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 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": "RGBA8",
|
||||
"height": 16,
|
||||
"mipmaps": false,
|
||||
"width": 16
|
||||
}
|
||||
|
||||
[sub_resource type="ImageTexture" id=5]
|
||||
flags = 0
|
||||
flags = 0
|
||||
image = SubResource( 7 )
|
||||
size = Vector2( 16, 16 )
|
||||
[sub_resource type="ImageTexture" id="ImageTexture_e8boo"]
|
||||
image = SubResource("Image_x7bb3")
|
||||
|
||||
[node name="Panel" type="Panel"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_top = -3.0
|
||||
minimum_size = Vector2( 0, 34 )
|
||||
custom_styles/panel = SubResource( 3 )
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
offset_bottom = 3.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
minimum_size = Vector2( 0, 24 )
|
||||
custom_constants/separation = 0
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="TabbarContainer" type="HBoxContainer" parent="VBoxContainer"]
|
||||
offset_right = 1024.0
|
||||
offset_bottom = 24.0
|
||||
layout_mode = 2
|
||||
|
||||
[node name="TabBar" type="TabBar" parent="VBoxContainer/TabbarContainer"]
|
||||
offset_right = 1024.0
|
||||
offset_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
tab_alignment = 0
|
||||
tab_close_display_policy = 1
|
||||
[node name="Tabs" type="TabBar" parent="VBoxContainer/TabbarContainer"]
|
||||
layout_mode = 2
|
||||
clip_tabs = false
|
||||
drag_to_rearrange_enabled = true
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="AddButton" type="Button" parent="VBoxContainer/TabbarContainer/TabBar"]
|
||||
offset_left = 3.0
|
||||
offset_right = 31.0
|
||||
offset_bottom = 24.0
|
||||
[node name="AddButton" type="Button" parent="VBoxContainer/TabbarContainer"]
|
||||
layout_mode = 2
|
||||
tooltip_text = "Add a new scene."
|
||||
icon = SubResource( 5 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
icon = SubResource("ImageTexture_e8boo")
|
||||
|
||||
[node name="PopupMenu" type="PopupMenu" parent="VBoxContainer/TabbarContainer"]
|
||||
offset_left = 906.0
|
||||
offset_right = 1024.0
|
||||
offset_bottom = 88.0
|
||||
items = [ "Kill", null, 0, false, false, 0, 0, null, "", false, "Kill Others", null, 0, false, false, 1, 0, null, "", false, "Kill to the Right", null, 0, false, false, 2, 0, null, "", false, "Kill All", null, 0, false, false, 3, 0, null, "", false ]
|
||||
item_count = 4
|
||||
item_0/text = "Kill"
|
||||
item_0/id = 0
|
||||
item_1/text = "Kill Others"
|
||||
item_1/id = 1
|
||||
item_2/text = "Kill to the Right"
|
||||
item_2/id = 2
|
||||
item_3/text = "Kill All"
|
||||
item_3/id = 3
|
||||
|
||||
[node name="TabContainer" type="TabContainer" parent="VBoxContainer"]
|
||||
offset_top = 24.0
|
||||
offset_right = 1024.0
|
||||
offset_bottom = 603.0
|
||||
clip_contents = true
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
custom_constants/top_margin = 0
|
||||
custom_constants/side_margin = 0
|
||||
custom_styles/panel = SubResource( 3 )
|
||||
tabs_visible = false
|
||||
|
||||
[node name="TerminalPopupMenu" type="PopupMenu" parent="VBoxContainer"]
|
||||
offset_right = 193.0
|
||||
offset_bottom = 160.0
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 0
|
||||
items = [ "New Terminal", null, 0, false, false, 0, 0, null, "", false, "", null, 0, false, true, 1, 0, null, "", true, "Copy", null, 0, false, false, 2, 0, null, "", false, "Paste", null, 0, false, false, 3, 0, null, "", false, "Copy All", null, 0, false, false, 4, 0, null, "", false, "", null, 0, false, false, 5, 0, null, "", true, "Clear", null, 0, false, false, 6, 0, null, "", false, "Kill Terminal", null, 0, false, false, 7, 0, null, "", false ]
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
size = Vector2i(136, 178)
|
||||
item_count = 8
|
||||
item_0/text = "New Terminal"
|
||||
item_0/id = 0
|
||||
item_1/text = ""
|
||||
item_1/id = 1
|
||||
item_1/disabled = true
|
||||
item_1/separator = true
|
||||
item_2/text = "Copy"
|
||||
item_2/id = 2
|
||||
item_3/text = "Paste"
|
||||
item_3/id = 3
|
||||
item_4/text = "Copy All"
|
||||
item_4/id = 4
|
||||
item_5/text = ""
|
||||
item_5/id = 5
|
||||
item_5/separator = true
|
||||
item_6/text = "Clear"
|
||||
item_6/id = 6
|
||||
item_7/text = "Kill Terminal"
|
||||
item_7/id = 7
|
||||
|
||||
[node name="SizeLabel" type="Label" parent="."]
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
|
@ -122,15 +96,15 @@ offset_left = -52.0
|
|||
offset_top = -15.5
|
||||
offset_right = 52.0
|
||||
offset_bottom = 15.5
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
text = "Size: %d rows; %d cols
|
||||
(%d x %d)"
|
||||
align = 1
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Panel" type="Panel" parent="SizeLabel"]
|
||||
show_behind_parent = true
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = -5.0
|
||||
|
@ -139,17 +113,13 @@ offset_right = 5.0
|
|||
offset_bottom = 5.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="SizeLabelTimer" type="Timer" parent="SizeLabel"]
|
||||
|
||||
[connection signal="resized" from="." to="." method="_on_Panel_resized"]
|
||||
[connection signal="reposition_active_tab_request" from="VBoxContainer/TabbarContainer/TabBar" to="." method="_on_Tabs_reposition_active_tab_request"]
|
||||
[connection signal="tab_changed" from="VBoxContainer/TabbarContainer/TabBar" to="." method="_on_Tabs_tab_changed"]
|
||||
[connection signal="tab_closed" from="VBoxContainer/TabbarContainer/TabBar" to="." method="_on_Tabs_tab_close"]
|
||||
[connection signal="pressed" from="VBoxContainer/TabbarContainer/TabBar/AddButton" to="." method="_on_AddButton_pressed"]
|
||||
[connection signal="tab_changed" from="VBoxContainer/TabbarContainer/Tabs" to="." method="_on_Tabs_tab_changed"]
|
||||
[connection signal="tab_close_pressed" from="VBoxContainer/TabbarContainer/Tabs" to="." method="_on_Tabs_tab_close"]
|
||||
[connection signal="pressed" from="VBoxContainer/TabbarContainer/AddButton" to="." method="_on_AddButton_pressed"]
|
||||
[connection signal="gui_input" from="VBoxContainer/TabContainer" to="." method="_on_TabContainer_gui_input"]
|
||||
[connection signal="id_pressed" from="VBoxContainer/TerminalPopupMenu" to="." method="_on_TerminalPopupMenu_id_pressed"]
|
||||
[connection signal="timeout" from="SizeLabel/SizeLabelTimer" to="." method="_on_SizeLabelTimer_timeout"]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue