434 lines
16 KiB
GDScript
434 lines
16 KiB
GDScript
"""
|
|
class GDDBTableEditor
|
|
"""
|
|
|
|
class_name GDDBTableEditor
|
|
|
|
tool
|
|
extends Control
|
|
|
|
signal set_dirty
|
|
|
|
var m_parent_table = null
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
$tabs/structure/header/new_property_btn.connect("pressed", self, "on_new_property_btn_pressed")
|
|
$tabs/data/add_data_btn.connect("pressed", self, "on_add_row_data_btn_pressed")
|
|
$tabs/data/add_data_btn.set_disabled(true)
|
|
|
|
$load_res_path_dlg.connect("file_selected", self, "on_select_res_path")
|
|
|
|
$data_dlg.connect("select_data", self, "on_select_data")
|
|
|
|
$edit_string_dlg.connect("string_edited", self, "on_text_edited")
|
|
|
|
$delete_prop_dlg.connect("delete_prop", self, "on_confirm_delete_property")
|
|
|
|
# called when resizing a property
|
|
func on_resize_property(prop_id : int, diff_x : float) -> void :
|
|
var current_prop = null
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_header.get_child_count()):
|
|
var prop = $tabs/data/scroll/data_holder/data_header.get_child(idx)
|
|
if(prop.get_prop_id() == prop_id):
|
|
current_prop = prop
|
|
break
|
|
|
|
var prop_size : Vector2 = current_prop.get_child(0).get_size()
|
|
|
|
# print("diff_x: " + str(diff_x))
|
|
prop_size.x += diff_x
|
|
|
|
if(prop_size.x < gddb_constants.c_min_cell_width):
|
|
return
|
|
if(prop_size.x > gddb_constants.c_max_cell_width):
|
|
return
|
|
|
|
# print("prop_size.x = " + str(prop_size.x))
|
|
|
|
var prop_idx = -1
|
|
|
|
var data_size = $tabs/data/scroll.get_size()
|
|
data_size.x += diff_x
|
|
$tabs/data/scroll/data_holder/data_header.set_size(data_size)
|
|
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_header.get_child_count()):
|
|
var prop = $tabs/data/scroll/data_holder/data_header.get_child(idx)
|
|
if(prop.get_prop_id() == prop_id):
|
|
var current_prop_size = prop.get_custom_minimum_size()
|
|
current_prop_size.x += diff_x
|
|
prop.set_custom_minimum_size(current_prop_size)
|
|
prop_idx = idx
|
|
|
|
if(prop_idx != -1 && idx > prop_idx):
|
|
var pos = prop.get_position()
|
|
pos.x += diff_x
|
|
prop.set_position(pos)
|
|
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_container.get_child_count()):
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(idx)
|
|
for jdx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(jdx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
cell.set_custom_minimum_size(prop_size)
|
|
if(jdx > prop_idx):
|
|
var pos = cell.get_position()
|
|
pos.x += diff_x
|
|
cell.set_position(pos)
|
|
|
|
# called when the new_property button is pressed
|
|
func on_new_property_btn_pressed() -> void:
|
|
# print("GDDBTableEditor::on_new_property_btn_pressed()")
|
|
if(null == m_parent_table):
|
|
print("ERROR: GDDBTableEditor::on_new_property_btn_pressed() - m_parent_table is null")
|
|
return
|
|
var prop_idx = m_parent_table.get_props_count()
|
|
var prop_type = gddb_types.e_prop_type_bool
|
|
var prop_name = "Property_" + str(prop_idx+1)
|
|
var prop_id = m_parent_table.add_prop(prop_type, prop_name)
|
|
add_prop_to_structure(prop_id, prop_type, prop_name)
|
|
add_prop_to_data(prop_id, prop_type, prop_name, false)
|
|
|
|
# enable add data btn
|
|
$tabs/data/add_data_btn.set_disabled(false)
|
|
|
|
emit_signal("set_dirty")
|
|
|
|
# adds a property to structure tab
|
|
func add_prop_to_structure(prop_id : int, prop_type : int, prop_name : String) -> void:
|
|
# print("GDDBTableEditor::add_prop_to_structure(" + str(prop_id) + ", " + str(prop_type) + ", " + prop_name + ")")
|
|
var prop = load(gddb_constants.c_addon_main_path + "table_property.tscn").instance()
|
|
$tabs/structure/scroll/properties.add_child(prop)
|
|
prop.set_parent_table(m_parent_table)
|
|
prop.setup(prop_id, prop_type, prop_name)
|
|
prop.connect("edit_property", self, "on_edit_property")
|
|
prop.connect("delete_property", self, "on_delete_property")
|
|
prop.connect("enable_autoincrement", self, "on_enable_prop_autoincrement")
|
|
|
|
# adds a property to data tab
|
|
func add_prop_to_data(prop_id : int, prop_type : int, prop_name : String, has_autoincrement : bool) -> void:
|
|
var prop = load(gddb_constants.c_addon_main_path + "data_label.tscn").instance()
|
|
$tabs/data/scroll/data_holder/data_header.add_child(prop)
|
|
prop.set_prop_id(prop_id)
|
|
prop.set_text(prop_name)
|
|
prop.connect("resize_property", self, "on_resize_property")
|
|
|
|
# add property to the existing rows
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_container.get_child_count()):
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(idx)
|
|
var cell = load(gddb_constants.c_addon_main_path + "table_cell.tscn").instance()
|
|
row.add_child(cell)
|
|
cell.set_prop_id(prop_id)
|
|
cell.set_row_idx(idx)
|
|
cell.set_prop_type(prop_type)
|
|
cell.set_text("")
|
|
cell.enable_autoincrement(has_autoincrement)
|
|
cell.connect("edit_data", self, "on_edit_data")
|
|
cell.connect("choose_resource", self, "on_choose_resource")
|
|
cell.connect("choose_data", self, "on_choose_data")
|
|
cell.connect("edit_string", self, "on_edit_string")
|
|
|
|
# called when the add data button is pressed
|
|
func on_add_row_data_btn_pressed() -> void:
|
|
# print("GDDBTableEditor::on_add_row_data_btn_pressed")
|
|
# add blank row in the table
|
|
var row_idx = m_parent_table.get_rows_count()
|
|
m_parent_table.add_blank_row()
|
|
|
|
# add row in the interface
|
|
var row = HBoxContainer.new()
|
|
$tabs/data/scroll/data_holder/data_container.add_child(row)
|
|
for idx in range(0, $tabs/structure/scroll/properties.get_child_count()):
|
|
var cell = load(gddb_constants.c_addon_main_path + "table_cell.tscn").instance()
|
|
var prop = $tabs/structure/scroll/properties.get_child(idx)
|
|
var db_prop = m_parent_table.get_prop_by_id(idx)
|
|
row.add_child(cell)
|
|
cell.set_prop_id(idx)
|
|
cell.set_row_idx(row_idx)
|
|
cell.set_prop_type(prop.get_prop_type())
|
|
var autoincrement = db_prop.has_autoincrement()
|
|
cell.enable_autoincrement(db_prop.has_autoincrement())
|
|
if(autoincrement):
|
|
cell.set_text(str(row_idx+1))
|
|
cell.connect("edit_data", self, "on_edit_data")
|
|
cell.connect("choose_resource", self, "on_choose_resource")
|
|
cell.connect("choose_data", self, "on_choose_data")
|
|
cell.connect("edit_string", self, "on_edit_string")
|
|
|
|
emit_signal("set_dirty")
|
|
|
|
# sets the table from database
|
|
func set_table(table : Object) -> void:
|
|
# print("GDDBTableEditor::set_table(" + table.get_table_name() + ")")
|
|
clear_current_layout()
|
|
|
|
m_parent_table = table
|
|
fill_properties()
|
|
fill_data()
|
|
|
|
# fills the interface with current table's properties
|
|
func fill_properties() -> void:
|
|
# print("GDDBTableEditor::fill_properties()")
|
|
var props_count = m_parent_table.get_props_count()
|
|
for idx in range(0, props_count):
|
|
var db_prop = m_parent_table.get_prop_at(idx)
|
|
add_prop_to_structure(db_prop.get_prop_id(), db_prop.get_prop_type(), db_prop.get_prop_name())
|
|
var prop = load(gddb_constants.c_addon_main_path + "data_label.tscn").instance()
|
|
$tabs/data/scroll/data_holder/data_header.add_child(prop)
|
|
prop.set_prop_id(db_prop.get_prop_id())
|
|
prop.set_prop_type(db_prop.get_prop_type())
|
|
prop.set_text(db_prop.get_prop_name())
|
|
prop.connect("resize_property", self, "on_resize_property")
|
|
if(props_count > 0):
|
|
$tabs/data/add_data_btn.set_disabled(false)
|
|
|
|
# fills the interface with current table's data
|
|
func fill_data() -> void:
|
|
#print("GDDBTableEditor::fill_data()")
|
|
var rows_count = m_parent_table.get_rows_count()
|
|
#print("Table name: " + m_parent_table.get_table_name())
|
|
#print("rows_count: " + str(rows_count))
|
|
for idx in range(0, rows_count):
|
|
var row = HBoxContainer.new()
|
|
$tabs/data/scroll/data_holder/data_container.add_child(row)
|
|
var data_row = m_parent_table.get_data_at_row_idx(idx)
|
|
for jdx in range(0, data_row.size()):
|
|
var db_prop = m_parent_table.get_prop_at(jdx)
|
|
#print("Prop id: " + str(db_prop.get_prop_id()))
|
|
#print("Prop type: " + str(db_prop.get_prop_type()))
|
|
#print("Prop name: " + str(db_prop.get_prop_name()))
|
|
|
|
var cell = load(gddb_constants.c_addon_main_path + "table_cell.tscn").instance()
|
|
var cell_data = data_row[jdx].get_data()
|
|
|
|
var prop_type = db_prop.get_prop_type()
|
|
if(prop_type >= gddb_types.e_prop_types_count):
|
|
var db = m_parent_table.get_parent_database()
|
|
var table = db.get_table_by_id(prop_type - gddb_types.e_prop_types_count)
|
|
var data_row_idx = cell_data.to_int()
|
|
cell_data = gddb_globals.get_json_from_row(table, data_row_idx)
|
|
|
|
row.add_child(cell)
|
|
|
|
cell.set_prop_id(data_row[jdx].get_prop_id())
|
|
cell.set_row_idx(idx)
|
|
cell.set_prop_type(prop_type)
|
|
cell.set_text(cell_data)
|
|
cell.enable_autoincrement(db_prop.has_autoincrement())
|
|
cell.connect("edit_data", self, "on_edit_data")
|
|
cell.connect("choose_resource", self, "on_choose_resource")
|
|
cell.connect("choose_data", self, "on_choose_data")
|
|
cell.connect("edit_string", self, "on_edit_string")
|
|
|
|
# links properties
|
|
func link_props() -> void :
|
|
# print("GDDBTableEditor::link_props() for table with name: " + m_parent_table.get_table_name())
|
|
for idx in range(0, $tabs/structure/scroll/properties.get_child_count()):
|
|
var prop = $tabs/structure/scroll/properties.get_child(idx)
|
|
prop.link()
|
|
|
|
# refreshes autoincrement props
|
|
func refresh_autoincrement_props(prop_id, enable) -> void:
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_container.get_child_count()):
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(idx)
|
|
for jdx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(jdx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
cell.enable_autoincrement(enable)
|
|
|
|
# cleares current layout
|
|
func clear_current_layout() -> void:
|
|
# clear structure tab
|
|
for idx in range(0, $tabs/structure/scroll/properties.get_child_count()):
|
|
$tabs/structure/scroll/properties.get_child(idx).queue_free()
|
|
|
|
# clear data from data tab
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_container.get_child_count()):
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(idx)
|
|
for jdx in range(0, row.get_child_count()):
|
|
row.get_child(jdx).queue_free()
|
|
row.queue_free()
|
|
|
|
# clear properties from data tab
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_header.get_child_count()):
|
|
$tabs/data/scroll/data_holder/data_header.get_child(idx).queue_free()
|
|
|
|
$tabs/data/add_data_btn.set_disabled(true)
|
|
|
|
# called when a property is edited
|
|
func on_edit_property(prop_id : int, prop_type : int, prop_name : String) -> void:
|
|
"""
|
|
print("GDDBTableEditor::on_edit_property(" + str(prop_id) + ", " + str(prop_type) + ", " + prop_name + ")")
|
|
if(prop_type >= gddb_types.e_prop_types_count):
|
|
var db = m_parent_table.get_parent_database()
|
|
var selected_table = db.get_table_by_id(gddb_types.e_prop_types_count - prop_type)
|
|
print("GDDBTableEditor::on_edit_property(" + str(prop_id) + ", " + selected_table.get_table_name() + ", " + prop_name + ")")
|
|
else:
|
|
print("GDDBTableEditor::on_edit_property(" + str(prop_id) + ", " + gddb_globals.get_data_name(prop_type) + ", " + prop_name + ")")
|
|
#"""
|
|
# edit prop in the table
|
|
m_parent_table.edit_prop(prop_id, prop_type, prop_name)
|
|
|
|
# refresh the prop name in data tab
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_header.get_child_count()):
|
|
var prop = $tabs/data/scroll/data_holder/data_header.get_child(idx)
|
|
if(prop.get_prop_id() == prop_id):
|
|
prop.set_text(prop_name)
|
|
|
|
# update data type
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_container.get_child_count()):
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(idx)
|
|
for jdx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(jdx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
"""
|
|
if(prop_type < gddb_types.e_prop_types_count):
|
|
print("Prop type: " + gddb_globals.get_data_name(prop_type))
|
|
else:
|
|
print("Prop type: custom")
|
|
"""
|
|
cell.set_prop_type(prop_type)
|
|
|
|
emit_signal("set_dirty")
|
|
|
|
# called when a property is deleted
|
|
func on_delete_property(prop_id : int) -> void:
|
|
# print("GDDBTableEditor::on_delete_property(" + str(prop_id) + ")")
|
|
var prop = m_parent_table.get_prop_by_id(prop_id)
|
|
$delete_prop_dlg.set_prop_id(prop_id)
|
|
$delete_prop_dlg.set_prop_name(prop.get_prop_name())
|
|
$delete_prop_dlg.popup_centered()
|
|
|
|
# called when a property is deleted
|
|
func on_confirm_delete_property() -> void:
|
|
var prop_id = $delete_prop_dlg.get_prop_id()
|
|
|
|
# deletes a property from table; also all data by this property
|
|
m_parent_table.delete_prop(prop_id)
|
|
|
|
# delete cells from data tab
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_container.get_child_count()):
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(idx)
|
|
for jdx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(jdx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
cell.disconnect("edit_data", self, "on_edit_data")
|
|
cell.queue_free()
|
|
break
|
|
|
|
# delete property from data tab
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_header.get_child_count()):
|
|
var prop = $tabs/data/scroll/data_holder/data_header.get_child(idx)
|
|
if(prop.get_prop_id() == prop_id):
|
|
prop.queue_free()
|
|
break
|
|
|
|
# delete prop from structure
|
|
for idx in range(0, $tabs/structure/scroll/properties.get_child_count()):
|
|
var prop = $tabs/structure/scroll/properties.get_child(idx)
|
|
if(prop.get_prop_id() == prop_id):
|
|
prop.queue_free()
|
|
break
|
|
|
|
# refresh the add data button
|
|
var props_count = m_parent_table.get_props_count()
|
|
if(props_count == 0):
|
|
$tabs/data/add_data_btn.set_disabled(true)
|
|
|
|
emit_signal("set_dirty")
|
|
|
|
# called when the property has autoincrement or not
|
|
func on_enable_prop_autoincrement(prop_id : int, enable : bool) -> void :
|
|
m_parent_table.enable_prop_autoincrement(prop_id, enable)
|
|
emit_signal("set_dirty")
|
|
refresh_autoincrement_props(prop_id, enable)
|
|
|
|
# reindex all data
|
|
if(enable):
|
|
for idx in range(0, $tabs/data/scroll/data_holder/data_container.get_child_count()):
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(idx)
|
|
for jdx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(jdx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
cell.set_text(str(idx + 1))
|
|
|
|
# called when edit data
|
|
func on_edit_data(prop_id : int, row_idx : int, data : String) -> void:
|
|
m_parent_table.edit_data(prop_id, row_idx, data)
|
|
emit_signal("set_dirty")
|
|
|
|
# called when choosing a resource
|
|
func on_choose_resource(prop_id : int, row_idx : int) -> void:
|
|
# print("GDDBTableEditor::on_choose_resource(" + str(prop_id) + ", " + str(row_idx) + ")")
|
|
$load_res_path_dlg.set_prop_id(prop_id)
|
|
$load_res_path_dlg.set_row_idx(row_idx)
|
|
$load_res_path_dlg.popup_centered()
|
|
|
|
# called when choosing a data
|
|
func on_choose_data(prop_id : int, row_idx : int, prop_type : int) -> void:
|
|
# print("GDDBTableEditor::on_choose_data(" + str(prop_id) + ", " + str(row_idx) + ", " + str(prop_type) + ")")
|
|
$data_dlg.set_prop_id(prop_id)
|
|
$data_dlg.set_row_idx(row_idx)
|
|
var table_id = prop_type - gddb_types.e_prop_types_count
|
|
var db = m_parent_table.get_parent_database()
|
|
var tbl = db.get_table_by_id(table_id)
|
|
$data_dlg.set_table(tbl)
|
|
$data_dlg.popup_centered()
|
|
|
|
# called when choosing to edit string
|
|
func on_edit_string(prop_id : int, row_idx : int, text : String) -> void:
|
|
$edit_string_dlg.set_prop_id(prop_id)
|
|
$edit_string_dlg.set_row_idx(row_idx)
|
|
$edit_string_dlg.set_data_text(text)
|
|
$edit_string_dlg.popup_centered()
|
|
|
|
# called when selecting a resource filepath
|
|
func on_select_res_path(filepath : String) -> void:
|
|
# print("GDDBTableEditor::on_select_res_path(" + filepath + ")")
|
|
var prop_id = $load_res_path_dlg.get_prop_id()
|
|
var row_idx = $load_res_path_dlg.get_row_idx()
|
|
m_parent_table.edit_data(prop_id, row_idx, filepath)
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(row_idx)
|
|
for idx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(idx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
cell.set_text(filepath)
|
|
|
|
emit_signal("set_dirty")
|
|
|
|
# called when data from a table is choosen
|
|
func on_select_data(prop_id : int, row_idx : int, data_row_idx : int, data : String) -> void:
|
|
# set the data in the databes / table
|
|
m_parent_table.edit_data(prop_id, row_idx, str(data_row_idx))
|
|
|
|
# fill in the interface cell with data
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(row_idx)
|
|
for idx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(idx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
cell.set_text(data)
|
|
break
|
|
|
|
emit_signal("set_dirty")
|
|
|
|
# called when the text is edited
|
|
func on_text_edited():
|
|
var prop_id = $edit_string_dlg.get_prop_id()
|
|
var row_idx = $edit_string_dlg.get_row_idx()
|
|
var text_data = $edit_string_dlg.get_data_text()
|
|
|
|
var data = gddb_globals.handle_string(text_data)
|
|
|
|
# print("GDDBTableEditor::on_text_edited() - prop_id: " + str(prop_id) + ", row_idx: " + str(row_idx) + ", data: " + text_data)
|
|
|
|
m_parent_table.edit_data(prop_id, row_idx, data)
|
|
|
|
var row = $tabs/data/scroll/data_holder/data_container.get_child(row_idx)
|
|
for idx in range(0, row.get_child_count()):
|
|
var cell = row.get_child(idx)
|
|
if(cell.get_prop_id() == prop_id):
|
|
cell.set_text(text_data)
|
|
break
|
|
|
|
emit_signal("set_dirty")
|