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.
		
		
		
		
		
			
		
			
	
	
		
			174 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			GDScript
		
	
		
		
			
		
	
	
			174 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			GDScript
		
	
| 
								 
											2 years ago
										 
									 | 
							
								@tool
							 | 
						||
| 
								 | 
							
								extends Control
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@export var editor_view_path : NodePath
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@export_enum("Filter", "Process", "Sort") var mode := 0
							 | 
						||
| 
								 | 
							
								@export var title := ""
							 | 
						||
| 
								 | 
							
								@export var default_text := "":
							 | 
						||
| 
								 | 
							
									set(v):
							 | 
						||
| 
								 | 
							
										default_text = v
							 | 
						||
| 
								 | 
							
										if _textfield == null:
							 | 
						||
| 
								 | 
							
											await ready
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										_textfield.text = v
							 | 
						||
| 
								 | 
							
								@export_multiline var default_text_ml := "":
							 | 
						||
| 
								 | 
							
									set(v):
							 | 
						||
| 
								 | 
							
										default_text_ml = v
							 | 
						||
| 
								 | 
							
										if _textfield_ml == null:
							 | 
						||
| 
								 | 
							
											await ready
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										_textfield_ml.text = v
							 | 
						||
| 
								 | 
							
								@export var function_save_key := ""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _textfield : LineEdit
							 | 
						||
| 
								 | 
							
								var _textfield_ml : TextEdit
							 | 
						||
| 
								 | 
							
								var _togglable_popup : PopupPanel
							 | 
						||
| 
								 | 
							
								var _saved_function_index_label : Label
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _saved_functions : Array = []
							 | 
						||
| 
								 | 
							
								var _saved_function_selected := -1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func load_saved_functions(func_dict : Dictionary):
							 | 
						||
| 
								 | 
							
									if !func_dict.has(function_save_key):
							 | 
						||
| 
								 | 
							
										func_dict[function_save_key] = [default_text_ml]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_saved_functions = func_dict[function_save_key]
							 | 
						||
| 
								 | 
							
									_on_saved_function_selected(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _ready():
							 | 
						||
| 
								 | 
							
									var toggle_button := Button.new()
							 | 
						||
| 
								 | 
							
									var popup_box := VBoxContainer.new()
							 | 
						||
| 
								 | 
							
									var popup_buttons_box := HBoxContainer.new()
							 | 
						||
| 
								 | 
							
									var title_label := Label.new()
							 | 
						||
| 
								 | 
							
									var submit_button := Button.new()
							 | 
						||
| 
								 | 
							
									var move_label := Label.new()
							 | 
						||
| 
								 | 
							
									var move_button_l := Button.new()
							 | 
						||
| 
								 | 
							
									var move_button_r := Button.new()
							 | 
						||
| 
								 | 
							
									_textfield = LineEdit.new()
							 | 
						||
| 
								 | 
							
									_togglable_popup = PopupPanel.new()
							 | 
						||
| 
								 | 
							
									_textfield_ml = TextEdit.new()
							 | 
						||
| 
								 | 
							
									_saved_function_index_label = Label.new()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									add_child(_textfield)
							 | 
						||
| 
								 | 
							
									add_child(toggle_button)
							 | 
						||
| 
								 | 
							
									_textfield.add_child(_togglable_popup)
							 | 
						||
| 
								 | 
							
									_togglable_popup.add_child(popup_box)
							 | 
						||
| 
								 | 
							
									popup_box.add_child(title_label)
							 | 
						||
| 
								 | 
							
									popup_box.add_child(_textfield_ml)
							 | 
						||
| 
								 | 
							
									popup_box.add_child(popup_buttons_box)
							 | 
						||
| 
								 | 
							
									popup_buttons_box.add_child(submit_button)
							 | 
						||
| 
								 | 
							
									popup_buttons_box.add_child(move_label)
							 | 
						||
| 
								 | 
							
									popup_buttons_box.add_child(move_button_l)
							 | 
						||
| 
								 | 
							
									popup_buttons_box.add_child(_saved_function_index_label)
							 | 
						||
| 
								 | 
							
									popup_buttons_box.add_child(move_button_r)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									title_label.text = title
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									toggle_button.icon = get_theme_icon("Collapse", "EditorIcons")
							 | 
						||
| 
								 | 
							
									toggle_button.pressed.connect(_on_expand_pressed)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_textfield.size_flags_horizontal = Control.SIZE_EXPAND_FILL
							 | 
						||
| 
								 | 
							
									_textfield.text_submitted.connect(_on_text_submitted.unbind(1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_textfield_ml.size_flags_horizontal = Control.SIZE_EXPAND_FILL
							 | 
						||
| 
								 | 
							
									_textfield_ml.size_flags_vertical = Control.SIZE_EXPAND_FILL
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									submit_button.text = "Run multiline!"
							 | 
						||
| 
								 | 
							
									submit_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
							 | 
						||
| 
								 | 
							
									submit_button.pressed.connect(_on_text_submitted)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									move_label.text = "Choose saved:"
							 | 
						||
| 
								 | 
							
									move_button_l.icon = get_theme_icon("PagePrevious", "EditorIcons")
							 | 
						||
| 
								 | 
							
									move_button_l.pressed.connect(_on_saved_function_bumped.bind(-1))
							 | 
						||
| 
								 | 
							
									_on_saved_function_selected(0)
							 | 
						||
| 
								 | 
							
									move_button_r.icon = get_theme_icon("PageNext", "EditorIcons")
							 | 
						||
| 
								 | 
							
									move_button_r.pressed.connect(_on_saved_function_bumped.bind(+1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_expand_pressed():
							 | 
						||
| 
								 | 
							
									_togglable_popup.popup(Rect2i(_textfield.get_screen_position(), Vector2(size.x, 256.0)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_text_submitted():
							 | 
						||
| 
								 | 
							
									[_table_filter, _table_process][mode].call()
							 | 
						||
| 
								 | 
							
									_saved_functions[_saved_function_selected] = _textfield_ml.text
							 | 
						||
| 
								 | 
							
									get_node(editor_view_path).save_data.call_deferred()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _get_script_source_code(first_line : String):
							 | 
						||
| 
								 | 
							
									var new_text := ""
							 | 
						||
| 
								 | 
							
									if !_togglable_popup.visible:
							 | 
						||
| 
								 | 
							
										new_text = _textfield.text
							 | 
						||
| 
								 | 
							
										if new_text == "":
							 | 
						||
| 
								 | 
							
											new_text = default_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return first_line + "\treturn " + new_text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									else:
							 | 
						||
| 
								 | 
							
										new_text = _textfield_ml.text
							 | 
						||
| 
								 | 
							
										if new_text == "":
							 | 
						||
| 
								 | 
							
											new_text = default_text_ml
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var text_split := new_text.split("\n")
							 | 
						||
| 
								 | 
							
										for i in text_split.size():
							 | 
						||
| 
								 | 
							
											text_split[i] = "\t" + text_split[i]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return first_line + "\n".join(text_split)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _table_filter():
							 | 
						||
| 
								 | 
							
									var new_script := GDScript.new()
							 | 
						||
| 
								 | 
							
									new_script.source_code = _get_script_source_code("static func can_show(res, index):\n")
							 | 
						||
| 
								 | 
							
									new_script.reload()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var editor_view := get_node(editor_view_path)
							 | 
						||
| 
								 | 
							
									editor_view.search_cond = new_script
							 | 
						||
| 
								 | 
							
									editor_view.refresh()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _table_process():
							 | 
						||
| 
								 | 
							
									var new_script := GDScript.new()
							 | 
						||
| 
								 | 
							
									new_script.source_code = _get_script_source_code("static func get_result(value, res, all_res, row_index):\n")
							 | 
						||
| 
								 | 
							
									new_script.reload()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var editor_view := get_node(editor_view_path)
							 | 
						||
| 
								 | 
							
									var new_script_instance = new_script.new()
							 | 
						||
| 
								 | 
							
									var values = editor_view.get_edited_cells_values()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var edited_rows : Array[int] = editor_view._selection.get_edited_rows()
							 | 
						||
| 
								 | 
							
									var edited_resources := edited_rows.map(func(x): return editor_view.rows[x])
							 | 
						||
| 
								 | 
							
									for i in values.size():
							 | 
						||
| 
								 | 
							
										values[i] = new_script_instance.get_result(values[i], editor_view.rows[edited_rows[i]], edited_resources, i)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									editor_view.set_edited_cells_values(values)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_saved_function_selected(new_index : int):
							 | 
						||
| 
								 | 
							
									if new_index < 0:
							 | 
						||
| 
								 | 
							
										new_index = 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if _saved_function_selected == _saved_functions.size() - 1 and _textfield_ml.text == default_text_ml:
							 | 
						||
| 
								 | 
							
										_saved_functions.resize(_saved_functions.size() - 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									elif _saved_function_selected >= 0:
							 | 
						||
| 
								 | 
							
										_saved_functions[_saved_function_selected] = _textfield_ml.text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_saved_function_selected = new_index
							 | 
						||
| 
								 | 
							
									if new_index >= _saved_functions.size():
							 | 
						||
| 
								 | 
							
										_saved_functions.resize(new_index + 1)
							 | 
						||
| 
								 | 
							
										for i in _saved_functions.size():
							 | 
						||
| 
								 | 
							
											if _saved_functions[i] == null:
							 | 
						||
| 
								 | 
							
												_saved_functions[i] = default_text_ml
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_textfield_ml.text = _saved_functions[new_index]
							 | 
						||
| 
								 | 
							
									_saved_function_index_label.text = "%d/%d" % [new_index + 1, _saved_functions.size()]
							 | 
						||
| 
								 | 
							
									get_node(editor_view_path).save_data.call_deferred()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_saved_function_bumped(increment : int):
							 | 
						||
| 
								 | 
							
									_on_saved_function_selected(_saved_function_selected + increment)
							 |