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
		
	
	
		
			3.9 KiB
		
	
	
	
		
			GDScript
		
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			GDScript
		
	
| 
								 
											2 years ago
										 
									 | 
							
								@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()
							 |