You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			154 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			GDScript
		
	
| @tool
 | |
| extends Control
 | |
| 
 | |
| const TablesPluginSettingsClass := preload("res://addons/resources_spreadsheet_view/settings_grid.gd")
 | |
| 
 | |
| @export var table_header_scene : PackedScene
 | |
| 
 | |
| @export @onready var editor_view : Control = $"../../../.."
 | |
| @export @onready var hide_columns_button : BaseButton = $"../../MenuStrip/VisibleCols"
 | |
| @export @onready var grid : GridContainer = $"../../../MarginContainer/FooterContentSplit/Panel/Scroll/MarginContainer/TableGrid"
 | |
| 
 | |
| 
 | |
| var hidden_columns := {}
 | |
| var columns := []:
 | |
|     set(v):
 | |
|         columns = v
 | |
|         for x in get_children():
 | |
|             x.queue_free()
 | |
| 
 | |
|         var new_node : Control
 | |
|         for x in v:
 | |
|             new_node = table_header_scene.instantiate()
 | |
|             add_child(new_node)
 | |
|             new_node.manager = self
 | |
|             new_node.set_label(x)
 | |
|             new_node.get_node("Button").pressed.connect(editor_view._set_sorting.bind(x))
 | |
| 
 | |
| 
 | |
| 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):
 | |
|     hidden_columns[editor_view.current_path][editor_view.columns[column_index]] = true
 | |
|     editor_view.save_data()
 | |
|     update()
 | |
| 
 | |
| 
 | |
| 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 min_width := 0
 | |
|     var cell : Control
 | |
| 
 | |
|     for i in column_headers.size():
 | |
|         var header = column_headers[i]
 | |
|         cell = grid.get_child(i)
 | |
| 
 | |
|         header.get_child(0).clip_text = clip_text
 | |
|         header.custom_minimum_size.x = 0
 | |
|         cell.custom_minimum_size.x = 0
 | |
|         header.size.x = 0
 | |
| 
 | |
|         min_width = max(header.size.x, cell.size.x)
 | |
|         header.custom_minimum_size.x = min_width
 | |
|         cell.custom_minimum_size.x = header.get_minimum_size().x
 | |
|         header.size.x = min_width
 | |
| 
 | |
|     grid.hide()
 | |
|     grid.show()
 | |
|     hide()
 | |
|     show()
 | |
|     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].size.y
 | |
|     for i in column_headers.size():
 | |
|         column_headers[i].position.x = grid.get_child(i).position.x
 | |
|         column_headers[i].size.x = grid.get_child(i).size.x
 | |
| 
 | |
| 
 | |
| func _update_hidden_columns():
 | |
|     var current_path = editor_view.current_path
 | |
|     var rows_shown = editor_view.last_row - editor_view.first_row
 | |
| 
 | |
|     if !hidden_columns.has(current_path):
 | |
|         hidden_columns[current_path] = {
 | |
|       "resource_local_to_scene" : true,
 | |
|       "resource_name" : true,
 | |
|     }
 | |
|         editor_view.save_data()
 | |
| 
 | |
|     var visible_column_count = 0
 | |
|     for i in columns.size():
 | |
|         var column_visible = !hidden_columns[current_path].has(columns[i])
 | |
| 
 | |
|         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
 | |
| 
 | |
|     grid.columns = visible_column_count
 | |
| 
 | |
| 
 | |
| func _on_h_scroll_changed(value):
 | |
|     position.x = -value
 | |
| 
 | |
| 
 | |
| func _on_visible_cols_about_to_popup():
 | |
|     var current_path = editor_view.current_path
 | |
|     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, not hidden_columns[current_path].has(columns[i]))
 | |
| 
 | |
| 
 | |
| func _on_visible_cols_id_pressed(id : int):
 | |
|     var current_path = editor_view.current_path
 | |
|     var popup = hide_columns_button.get_popup()
 | |
|     if popup.is_item_checked(id):
 | |
|         popup.set_item_checked(id, false)
 | |
|         hidden_columns[current_path][columns[id]] = true
 | |
| 
 | |
|     else:
 | |
|         popup.set_item_checked(id, true)
 | |
|         hidden_columns[current_path].erase(columns[id])
 | |
| 
 | |
|     editor_view.save_data()
 | |
|     update()
 |