Add addon database

This commit is contained in:
VAILLANT Jeremy
2021-05-13 15:39:31 +02:00
parent 4afe0ceb2e
commit f1b7f939af
66 changed files with 4953 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
"""
class GDDBDataPanel
"""
class_name GDDBDataPanel
tool
extends PopupPanel
signal select_data
var m_prop_id = gddb_constants.c_invalid_id
var m_row_idx = gddb_constants.c_invalid_id
var m_table = null
# Called when the node enters the scene tree for the first time.
func _ready():
connect("about_to_show", self, "on_about_to_show")
$ItemList.connect("item_selected", self, "on_item_selected")
# sets property id
func set_prop_id(prop_id : int) -> void :
m_prop_id = prop_id
# returns property id
func get_prop_id() -> int :
return m_prop_id
# sets row index
func set_row_idx(row_idx : int) -> void :
m_row_idx = row_idx
# returns row index
func get_row_idx() -> int :
return m_row_idx
# sets the table from the database
func set_table(table) -> void:
m_table = table
# returns the table from the database
func get_table() -> Object:
return m_table
# called when the popup is about to show
func on_about_to_show() -> void :
$ItemList.clear()
$ItemList.add_item("None")
for idx in range(0, m_table.get_rows_count()):
var option = gddb_globals.get_json_from_row(m_table, idx)
$ItemList.add_item(option)
# called when an item is selected
func on_item_selected(idx : int) -> void:
# the first index is ""
if(idx == 0):
emit_signal("select_data", m_prop_id, m_row_idx, -1, "{}" )
else:
emit_signal("select_data", m_prop_id, m_row_idx, idx-1, $ItemList.get_item_text(idx) )
hide()
@@ -0,0 +1,25 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://addons/godot_db_manager/dlgs/data_dlg.gd" type="Script" id=1]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_12.tres" type="DynamicFont" id=2]
[node name="data_dlg" type="PopupPanel"]
anchor_right = 0.285625
anchor_bottom = 0.351111
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ItemList" type="ItemList" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 4.0
margin_top = 4.0
margin_right = -4.0
margin_bottom = -4.0
custom_fonts/font = ExtResource( 2 )
items = [ "ababab", null, false, "cdcdcd", null, false, "efefef", null, false ]
__meta__ = {
"_edit_use_anchors_": false
}
@@ -0,0 +1,41 @@
"""
class GDDBDeletePropDlg
"""
class_name GDDBDeletePropDlg
tool
extends WindowDialog
signal delete_prop
var m_prop_id = gddb_constants.c_invalid_id
# Called when the node enters the scene tree for the first time.
func _ready() -> void :
$v_layout/buttons/ok_btn.connect("pressed", self, "on_ok_btn_pressed")
$v_layout/buttons/cancel_btn.connect("pressed", self, "on_cancel_btn_pressed")
# sets the property id
func set_prop_id(prop_id : int) -> void :
m_prop_id = prop_id
# returns the property id
func get_prop_id() -> int :
return m_prop_id
func set_prop_name(prop_name : String) -> void:
var text = "Delete property with name \"" + prop_name + "\" ?"
$v_layout/prop_info/prop_lbl.set_text(text)
# returns the table id
func get_table_id() -> int :
return m_prop_id
# called when the OK button is pressed
func on_ok_btn_pressed() -> void :
emit_signal("delete_prop")
hide()
func on_cancel_btn_pressed() -> void:
hide()
@@ -0,0 +1,66 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/godot_db_manager/dlgs/delete_prop_dlg.gd" type="Script" id=1]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_14.tres" type="DynamicFont" id=2]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_12.tres" type="DynamicFont" id=3]
[node name="delete_prop_dlg" type="WindowDialog"]
visible = true
anchor_right = 0.257
anchor_bottom = 0.084
margin_right = 0.799988
margin_bottom = 0.399994
focus_next = NodePath("v_layout/buttons/ok_btn")
focus_mode = 1
custom_fonts/title_font = ExtResource( 2 )
popup_exclusive = true
window_title = "Delete property"
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="v_layout" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
custom_constants/separation = 10
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="prop_info" type="HBoxContainer" parent="v_layout"]
margin_top = 13.0
margin_right = 412.0
margin_bottom = 30.0
alignment = 1
[node name="prop_lbl" type="Label" parent="v_layout/prop_info"]
margin_left = 152.0
margin_right = 259.0
margin_bottom = 17.0
custom_fonts/font = ExtResource( 2 )
text = "Property name: "
[node name="buttons" type="HBoxContainer" parent="v_layout"]
margin_top = 40.0
margin_right = 412.0
margin_bottom = 61.0
custom_constants/separation = 50
alignment = 1
[node name="ok_btn" type="Button" parent="v_layout/buttons"]
margin_left = 81.0
margin_right = 181.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "OK"
[node name="cancel_btn" type="Button" parent="v_layout/buttons"]
margin_left = 231.0
margin_right = 331.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "Cancel"
@@ -0,0 +1,37 @@
"""
class GDDBDeleteTableDlg
"""
class_name GDDBDeleteTableDlg
tool
extends WindowDialog
signal delete_table
var m_table_id = gddb_constants.c_invalid_id
# Called when the node enters the scene tree for the first time.
func _ready():
$v_layout/buttons/ok_btn.connect("pressed", self, "on_ok_btn_pressed")
$v_layout/buttons/cancel_btn.connect("pressed", self, "on_cancel_btn_pressed")
# sets the table id
func set_table_id(table_id : int) -> void:
m_table_id = table_id
func set_table_name(table_name : String) -> void:
var text = "Delete table with name \"" + table_name + "\" ?"
$v_layout/table_info/table_lbl.set_text(text)
# returns the table id
func get_table_id() -> int:
return m_table_id
# called when the OK button is pressed
func on_ok_btn_pressed() -> void:
emit_signal("delete_table")
hide()
func on_cancel_btn_pressed() -> void:
hide()
@@ -0,0 +1,66 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/godot_db_manager/dlgs/delete_table_dlg.gd" type="Script" id=1]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_14.tres" type="DynamicFont" id=2]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_12.tres" type="DynamicFont" id=3]
[node name="delete_table_dlg" type="WindowDialog"]
visible = true
anchor_right = 0.257
anchor_bottom = 0.084
margin_right = 0.799988
margin_bottom = 0.399994
focus_next = NodePath("v_layout/buttons/ok_btn")
focus_mode = 1
custom_fonts/title_font = ExtResource( 2 )
popup_exclusive = true
window_title = "Delete table"
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="v_layout" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
custom_constants/separation = 10
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="table_info" type="HBoxContainer" parent="v_layout"]
margin_top = 13.0
margin_right = 412.0
margin_bottom = 30.0
alignment = 1
[node name="table_lbl" type="Label" parent="v_layout/table_info"]
margin_left = 162.0
margin_right = 249.0
margin_bottom = 17.0
custom_fonts/font = ExtResource( 2 )
text = "Table name: "
[node name="buttons" type="HBoxContainer" parent="v_layout"]
margin_top = 40.0
margin_right = 412.0
margin_bottom = 61.0
custom_constants/separation = 50
alignment = 1
[node name="ok_btn" type="Button" parent="v_layout/buttons"]
margin_left = 81.0
margin_right = 181.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "OK"
[node name="cancel_btn" type="Button" parent="v_layout/buttons"]
margin_left = 231.0
margin_right = 331.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "Cancel"
@@ -0,0 +1,59 @@
"""
class GDDBEditStringDlg
"""
class_name GDDBEditStringDlg
tool
extends WindowDialog
signal string_edited
var m_prop_id = gddb_constants.c_invalid_id
var m_row_idx = gddb_constants.c_invalid_id
var m_data_text = ""
# Called when the node enters the scene tree for the first time.
func _ready():
$v_layout/btns/ok_btn.connect("pressed", self, "on_ok_btn_pressed")
$v_layout/btns/cancel_btn.connect("pressed", self, "on_cancel_btn_pressed")
$v_layout/text.connect("text_changed", self, "on_text_changed")
# sets property id
func set_prop_id(prop_id : int) -> void:
m_prop_id = prop_id
# returns property id
func get_prop_id() -> int :
return m_prop_id
# sets row index
func set_row_idx(row_idx : int) -> void :
m_row_idx = row_idx
# returns row index
func get_row_idx() -> int :
return m_row_idx
# sets data text
func set_data_text(text : String) -> void :
m_data_text = text
$v_layout/text.set_text(text)
# returns data text
func get_data_text() -> String :
return m_data_text
# Called when the OK button is pressed
func on_ok_btn_pressed() -> void :
emit_signal("string_edited")
hide()
# Called when the Cancel button is pressed
func on_cancel_btn_pressed() -> void :
hide()
# Called when text is changed
func on_text_changed() -> void:
m_data_text = $v_layout/text.get_text()
@@ -0,0 +1,60 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/godot_db_manager/dlgs/edit_string_dlg.gd" type="Script" id=1]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_14.tres" type="DynamicFont" id=2]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_12.tres" type="DynamicFont" id=3]
[node name="edit_string_dlg" type="WindowDialog"]
anchor_right = 0.430625
anchor_bottom = 0.423333
focus_next = NodePath("v_layout/text")
custom_fonts/title_font = ExtResource( 3 )
window_title = "Edit string"
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": true
}
[node name="v_layout" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="edit_text_btns" type="HBoxContainer" parent="v_layout"]
margin_right = 689.0
margin_bottom = 30.0
rect_min_size = Vector2( 0, 30 )
[node name="text" type="TextEdit" parent="v_layout"]
margin_top = 34.0
margin_right = 689.0
margin_bottom = 334.0
rect_min_size = Vector2( 0, 300 )
custom_fonts/font = ExtResource( 2 )
caret_blink = true
[node name="btns" type="HBoxContainer" parent="v_layout"]
margin_top = 338.0
margin_right = 689.0
margin_bottom = 368.0
rect_min_size = Vector2( 0, 30 )
custom_constants/separation = 200
alignment = 1
[node name="ok_btn" type="Button" parent="v_layout/btns"]
margin_left = 144.0
margin_right = 244.0
margin_bottom = 30.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "OK"
[node name="cancel_btn" type="Button" parent="v_layout/btns"]
margin_left = 444.0
margin_right = 544.0
margin_bottom = 30.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "Cancel"
@@ -0,0 +1,11 @@
[gd_scene format=2]
[node name="error_dlg" type="AcceptDialog"]
visible = true
anchor_right = 0.139
anchor_bottom = 0.099
margin_right = 0.599976
margin_bottom = -0.100006
popup_exclusive = true
window_title = "Error"
dialog_autowrap = true
@@ -0,0 +1,76 @@
"""
class GDDBLoadResourcePathDlg
"""
class_name GDDBLoadResourcePathDlg
tool
extends FileDialog
# TODO: put this list in a config file
const file_filters = [
# Godot resource file types
"*.res, *.tres ; Godot resource file types",
# Godot scene files
"*.scn, *.tscn, *escn ; Godot scene file types",
# Code file types
"*.gd, *.cs, *.h, *.c, *.hpp, *.cpp ; Code file types",
# Shader file types
"*.shader ; Shader file types",
# material file types
"*.mat ; Material file types",
# mesh file types
"*.dae, *.gltf, *.obj, *.fbx ; Mesh file types",
# animation file types
"*.anim ; Animation file types",
# font file types
"*.ttf, *.otf ; Font file types",
# image file types
"*.png, *.jpg, *.jpeg, *.tiff, *.tga, *.bmp, *.webp, *.gif, *.hdr ; Images file types",
# soung file types
"*.snd, *.wav, *.ogg, *.mp3 ; Sound file types",
# video file types
"*.ogg, *.mpg, *.mpeg, *.avi, *.mov, *.mp4, *.webm ; Video file types",
# text file types
"*.txt, *.csv, *.json, *.xml, *.cfg, *.ini ; Text file types",
# document file types
"*.doc, *.docx, *.xls, *.xlsx, *.odt, *.ods, *.pdf ; Doc file types",
# binary data file types
"*.dat, *.raw ; Binary data file types"
]
var m_prop_id = gddb_constants.c_invalid_id
var m_row_idx = gddb_constants.c_invalid_id
# Called when the node enters the scene tree for the first time.
func _ready():
set_filters(PoolStringArray(file_filters))
# sets the property id
func set_prop_id(prop_id : int) -> void :
m_prop_id = prop_id
# returns the property id
func get_prop_id() -> int :
return m_prop_id
# sets the row index
func set_row_idx(row_idx : int) -> void :
m_row_idx = row_idx
# returns the row index
func get_row_idx() -> int :
return m_row_idx
@@ -0,0 +1,16 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://addons/godot_db_manager/dlgs/load_res_path_dlg.gd" type="Script" id=1]
[node name="load_res_path_dlg" type="FileDialog"]
anchor_right = 0.404
anchor_bottom = 0.431
margin_right = -0.400024
margin_bottom = 0.0999756
window_title = "Open a File"
resizable = true
mode = 0
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false
}
@@ -0,0 +1,63 @@
"""
class GDDBNewDBDlg
"""
class_name GDDBNewDBDlg
tool
extends WindowDialog
signal create_new_db
var m_current_db_name = ""
# Called when the node enters the scene tree for the first time.
func _ready() -> void :
$v_layout/buttons/ok_btn.connect("pressed", self, "on_ok_btn_pressed")
$v_layout/buttons/cancel_btn.connect("pressed", self, "on_cancel_btn_pressed")
connect("about_to_show", self, "on_about_to_show")
$v_layout/db_info/db_edt.connect("text_changed", self, "on_text_changed")
$v_layout/db_info/db_edt.connect("text_entered", self, "on_text_confirmed")
# Called when the node is about to be shown.
func on_about_to_show() -> void :
m_current_db_name = ""
$v_layout/db_info/db_edt.set_text(m_current_db_name)
# called everytime the text is changed
func on_text_changed(new_text: String) -> void :
var change_text = true
if(!gddb_globals.check_db_name(new_text)):
change_text = false
else:
if(new_text.length() > gddb_constants.c_max_db_name_len):
change_text = false
else:
change_text = true
if(change_text):
m_current_db_name = $v_layout/db_info/db_edt.get_text()
else:
$v_layout/db_info/db_edt.set_text(m_current_db_name)
$v_layout/db_info/db_edt.set_cursor_position(m_current_db_name.length())
# called when the user presses the ENTER key
func on_text_confirmed(text : String) -> void :
# print("GDDBNewDBDlg::on_text_confirmed(" + text + ")")
if(m_current_db_name.empty()):
return
handle_db_name()
hide()
# called when the OK button is pressed
func on_ok_btn_pressed() -> void :
if(!m_current_db_name.empty()):
handle_db_name()
# called when the Cancel button is pressed
func on_cancel_btn_pressed() -> void :
hide()
# handles the name of the database
func handle_db_name() -> void :
emit_signal("create_new_db", m_current_db_name)
@@ -0,0 +1,82 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_14.tres" type="DynamicFont" id=1]
[ext_resource path="res://addons/godot_db_manager/dlgs/new_db_dlg.gd" type="Script" id=2]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_12.tres" type="DynamicFont" id=3]
[node name="new_db_dlg" type="WindowDialog"]
visible = true
anchor_right = 0.257
anchor_bottom = 0.1
margin_right = 0.799988
focus_next = NodePath("v_layout/db_info/db_edt")
focus_mode = 2
custom_fonts/title_font = ExtResource( 1 )
popup_exclusive = true
window_title = "New database (max 16 characters)"
script = ExtResource( 2 )
__meta__ = {
"_edit_horizontal_guides_": [ 90.0781 ],
"_edit_use_anchors_": false
}
[node name="v_layout" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
custom_constants/separation = 20
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="db_info" type="HBoxContainer" parent="v_layout"]
margin_top = 11.0
margin_right = 412.0
margin_bottom = 38.0
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="db_lbl" type="Label" parent="v_layout/db_info"]
margin_left = 18.0
margin_top = 5.0
margin_right = 89.0
margin_bottom = 22.0
custom_fonts/font = ExtResource( 1 )
text = "DB name: "
[node name="db_edt" type="LineEdit" parent="v_layout/db_info"]
margin_left = 93.0
margin_right = 393.0
margin_bottom = 27.0
rect_min_size = Vector2( 300, 20 )
custom_fonts/font = ExtResource( 1 )
caret_blink = true
caret_blink_speed = 0.5
[node name="buttons" type="HBoxContainer" parent="v_layout"]
margin_top = 58.0
margin_right = 412.0
margin_bottom = 79.0
custom_constants/separation = 80
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ok_btn" type="Button" parent="v_layout/buttons"]
margin_left = 66.0
margin_right = 166.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "OK"
[node name="cancel_btn" type="Button" parent="v_layout/buttons"]
margin_left = 246.0
margin_right = 346.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 3 )
text = "Cancel"
@@ -0,0 +1,83 @@
"""
class GDDBNewDBDlg
"""
class_name GDDBNewTableDlg
tool
extends WindowDialog
signal create_new_table
signal cancel_dialog
var m_dlg_type : int = gddb_types.e_new_dlg_type_new
var m_table_id = gddb_constants.c_invalid_id
var m_current_table_name = ""
# Called when the node enters the scene tree for the first time.
func _ready():
$v_layout/buttons/ok_btn.connect("pressed", self, "on_ok_btn_pressed")
$v_layout/buttons/cancel_btn.connect("pressed", self, "on_cancel_btn_pressed")
$v_layout/table_info/table_edt.connect("text_changed", self, "on_text_changed")
$v_layout/table_info/table_edt.connect("text_entered", self, "on_text_confirmed")
m_current_table_name = ""
# sets the type of the dialog
func set_dld_type(dlg_type : int) -> void :
m_dlg_type = dlg_type
# returns the dialog type
func get_dlg_type() -> int :
return m_dlg_type
# sets the table id
func set_table_id(table_id : int) -> void:
m_table_id = table_id
# returns the table id
func get_table_id() -> int:
return m_table_id
# sets the table name
func set_init_name(table_name : String) -> void:
# print("cNewTableDlg::set_init_name(" + name + ")")
m_current_table_name = table_name
$v_layout/table_info/table_edt.set_text(m_current_table_name)
func on_text_changed(new_text: String) -> void:
var change_text = true
if(!gddb_globals.check_db_name(new_text)):
change_text = false
else:
if(new_text.length() > gddb_constants.c_max_db_name_len):
change_text = false
else:
change_text = true
if(change_text):
m_current_table_name = $v_layout/table_info/table_edt.get_text()
else:
$v_layout/table_info/table_edt.set_text(m_current_table_name)
$v_layout/table_info/table_edt.set_cursor_position(m_current_table_name.length())
# called when the user presses the ENTER key
func on_text_confirmed(text : String) -> void:
if(m_current_table_name.empty()):
return
handle_table_name()
hide()
# called when the OK button is pressed
func on_ok_btn_pressed() -> void:
if(!m_current_table_name.empty()):
handle_table_name()
hide()
# called when the Cancel button is pressed
func on_cancel_btn_pressed() -> void :
hide()
emit_signal("cancel_dialog")
# handles the text in the EditLine
func handle_table_name() -> void:
emit_signal("create_new_table", m_current_table_name)
@@ -0,0 +1,73 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_12.tres" type="DynamicFont" id=1]
[ext_resource path="res://addons/godot_db_manager/dlgs/new_table_dlg.gd" type="Script" id=2]
[ext_resource path="res://addons/godot_db_manager/assets/fnt/roboto_14.tres" type="DynamicFont" id=3]
[node name="new_table_dlg" type="WindowDialog"]
visible = true
anchor_right = 0.257
anchor_bottom = 0.084
margin_right = 0.799988
margin_bottom = 0.399994
focus_next = NodePath("v_layout/table_info/table_edt")
focus_mode = 1
custom_fonts/title_font = ExtResource( 3 )
popup_exclusive = true
window_title = "New table (max 16 characters)"
script = ExtResource( 2 )
[node name="v_layout" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
custom_constants/separation = 10
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
}
[node name="table_info" type="HBoxContainer" parent="v_layout"]
margin_top = 8.0
margin_right = 412.0
margin_bottom = 35.0
alignment = 1
[node name="table_lbl" type="Label" parent="v_layout/table_info"]
margin_left = 10.0
margin_top = 5.0
margin_right = 97.0
margin_bottom = 22.0
custom_fonts/font = ExtResource( 3 )
text = "Table name: "
[node name="table_edt" type="LineEdit" parent="v_layout/table_info"]
margin_left = 101.0
margin_right = 401.0
margin_bottom = 27.0
rect_min_size = Vector2( 300, 20 )
custom_fonts/font = ExtResource( 3 )
caret_blink = true
caret_blink_speed = 0.5
[node name="buttons" type="HBoxContainer" parent="v_layout"]
margin_top = 45.0
margin_right = 412.0
margin_bottom = 66.0
custom_constants/separation = 80
alignment = 1
[node name="ok_btn" type="Button" parent="v_layout/buttons"]
margin_left = 66.0
margin_right = 166.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 1 )
text = "OK"
[node name="cancel_btn" type="Button" parent="v_layout/buttons"]
margin_left = 246.0
margin_right = 346.0
margin_bottom = 21.0
rect_min_size = Vector2( 100, 0 )
custom_fonts/font = ExtResource( 1 )
text = "Cancel"