Added resource table plugin
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
@tool
|
||||
extends Control
|
||||
|
||||
const TablesPluginSettingsClass := preload("res://addons/resources_spreadsheet_view/settings_grid.gd")
|
||||
|
||||
@export var table_header_scene : PackedScene
|
||||
|
||||
@onready var editor_view : Control = $"../../../.."
|
||||
@onready var hide_columns_button : MenuButton = $"../../MenuStrip/VisibleCols"
|
||||
@onready var grid : Container = $"../../../MarginContainer/FooterContentSplit/Panel/Scroll/MarginContainer/TableGrid"
|
||||
|
||||
|
||||
var hidden_columns := {}:
|
||||
get:
|
||||
var result := {}
|
||||
for k_path in column_properties:
|
||||
var result_one_path := {}
|
||||
result[k_path] = result_one_path
|
||||
for k_column in column_properties[k_path]:
|
||||
for k_property in column_properties[k_path][k_column]:
|
||||
if k_property == &"visibility" && [k_property]:
|
||||
result[k_path][k_column] = true
|
||||
|
||||
return result
|
||||
var column_properties := {}
|
||||
var columns := []:
|
||||
set(v):
|
||||
columns = v
|
||||
for x in get_children():
|
||||
remove_child(x)
|
||||
x.queue_free()
|
||||
|
||||
var new_node : Control
|
||||
for x in v:
|
||||
new_node = table_header_scene.instantiate()
|
||||
new_node.manager = self
|
||||
add_child(new_node)
|
||||
new_node.set_label(x)
|
||||
new_node.get_node("Button").pressed.connect(editor_view._set_sorting.bind(x))
|
||||
_update_column_sizes()
|
||||
|
||||
|
||||
func _ready():
|
||||
hide_columns_button\
|
||||
.get_popup()\
|
||||
.id_pressed\
|
||||
.connect(_on_visible_cols_id_pressed)
|
||||
$"../../../MarginContainer/FooterContentSplit/Panel/Scroll"\
|
||||
.get_h_scroll_bar()\
|
||||
.value_changed\
|
||||
.connect(_on_h_scroll_changed)
|
||||
|
||||
|
||||
func update():
|
||||
_update_hidden_columns()
|
||||
_update_column_sizes()
|
||||
|
||||
|
||||
func hide_column(column_index : int):
|
||||
set_column_property(column_index, &"visibility", 0)
|
||||
editor_view.save_data()
|
||||
update()
|
||||
|
||||
|
||||
func set_column_property(column_index : int, property_key : StringName, property_value):
|
||||
var dict := column_properties
|
||||
if !dict.has(editor_view.current_path):
|
||||
dict[editor_view.current_path] = {}
|
||||
|
||||
dict = dict[editor_view.current_path]
|
||||
if !dict.has(columns[column_index]):
|
||||
dict[columns[column_index]] = {}
|
||||
|
||||
dict = dict[columns[column_index]]
|
||||
dict[property_key] = property_value
|
||||
|
||||
|
||||
func get_column_property(column_index : int, property_key : StringName, property_default = null):
|
||||
var dict := column_properties
|
||||
if !dict.has(editor_view.current_path):
|
||||
return property_default
|
||||
|
||||
dict = dict[editor_view.current_path]
|
||||
if !dict.has(columns[column_index]):
|
||||
return property_default
|
||||
|
||||
dict = dict[columns[column_index]]
|
||||
return dict.get(property_key, property_default)
|
||||
|
||||
|
||||
func select_column(column_index : int):
|
||||
editor_view.select_column(column_index)
|
||||
|
||||
|
||||
func _update_column_sizes():
|
||||
if grid.get_child_count() == 0:
|
||||
return
|
||||
|
||||
await get_tree().process_frame
|
||||
var column_headers := get_children()
|
||||
|
||||
if grid.get_child_count() < column_headers.size(): return
|
||||
if column_headers.size() != columns.size():
|
||||
editor_view.refresh()
|
||||
return
|
||||
|
||||
var clip_text : bool = ProjectSettings.get_setting(TablesPluginSettingsClass.PREFIX + "clip_headers")
|
||||
var visible_column_minsizes : Array[float] = []
|
||||
for i in column_headers.size():
|
||||
var header = column_headers[i]
|
||||
if header.visible:
|
||||
header.get_child(0).clip_text = clip_text
|
||||
visible_column_minsizes.append(header.get_combined_minimum_size().x)
|
||||
|
||||
grid.visible_column_minsizes = visible_column_minsizes
|
||||
await get_tree().process_frame
|
||||
|
||||
# Abort if the node has been deleted since.
|
||||
if !is_instance_valid(column_headers[0]):
|
||||
return
|
||||
|
||||
get_parent().custom_minimum_size.y = column_headers[0].get_combined_minimum_size().y
|
||||
var column_positions : Array = grid.visible_column_positions
|
||||
var i := 0
|
||||
for x in column_headers:
|
||||
if !x.visible:
|
||||
continue
|
||||
|
||||
var pos : float = column_positions[i]
|
||||
x.position.x = pos
|
||||
x.size.x = column_positions[i + 1] - pos
|
||||
i += 1
|
||||
|
||||
|
||||
func _update_hidden_columns():
|
||||
var current_path : String = editor_view.current_path
|
||||
var rows_shown : int = editor_view.last_row - editor_view.first_row
|
||||
|
||||
if !column_properties.has(current_path):
|
||||
column_properties[current_path] = {
|
||||
"resource_local_to_scene" : { &"visibility" : 0 },
|
||||
"resource_name" : { &"visibility" : 0 },
|
||||
"metadata/_custom_type_script" : { &"visibility" : 0 },
|
||||
}
|
||||
editor_view.save_data()
|
||||
|
||||
var visible_column_count := 0
|
||||
for i in columns.size():
|
||||
var column_visible : bool = get_column_property(i, &"visibility", 1) != 0
|
||||
get_child(i).visible = column_visible
|
||||
for j in rows_shown:
|
||||
grid.get_child(j * columns.size() + i).visible = column_visible
|
||||
|
||||
if column_visible:
|
||||
visible_column_count += 1
|
||||
|
||||
|
||||
func _on_h_scroll_changed(value):
|
||||
position.x = -value
|
||||
|
||||
|
||||
func _on_visible_cols_about_to_popup():
|
||||
var popup := hide_columns_button.get_popup()
|
||||
popup.clear()
|
||||
popup.hide_on_checkable_item_selection = false
|
||||
for i in columns.size():
|
||||
popup.add_check_item(columns[i].capitalize(), i)
|
||||
popup.set_item_checked(i, get_column_property(i, &"visibility", 1) != 0)
|
||||
|
||||
|
||||
func _on_visible_cols_id_pressed(id : int):
|
||||
var popup := hide_columns_button.get_popup()
|
||||
if popup.is_item_checked(id):
|
||||
popup.set_item_checked(id, false)
|
||||
set_column_property(id, &"visibility", 0)
|
||||
|
||||
else:
|
||||
popup.set_item_checked(id, true)
|
||||
set_column_property(id, &"visibility", 1)
|
||||
|
||||
editor_view.save_data()
|
||||
update()
|
||||
Reference in New Issue
Block a user