diff --git a/addons/resources_spreadsheet_view/editor_view.gd b/addons/resources_spreadsheet_view/editor_view.gd index ad02721..333788e 100644 --- a/addons/resources_spreadsheet_view/editor_view.gd +++ b/addons/resources_spreadsheet_view/editor_view.gd @@ -87,9 +87,6 @@ func display_folder(folderpath : String, sort_by : String = "", sort_reverse : b if folderpath.ends_with(".tres") and !folderpath.ends_with(ResourceTablesImport.SUFFIX): folderpath = folderpath.get_base_dir() + "/" - - if search_cond == null: - _on_search_cond_text_submitted("true") node_recent_paths.add_path_to_recent(folderpath) first_row = node_page_manager.first_row @@ -150,7 +147,7 @@ func fill_property_data(res): func insert_row_sorted(res : Resource, rows : Array, sort_by : String, sort_reverse : bool): - if !search_cond.can_show(res, rows.size()): + if search_cond != null && !search_cond.can_show(res, rows.size()): return for i in rows.size(): @@ -402,34 +399,6 @@ func _get_row_resources(row_indices) -> Array: return arr -func _on_search_cond_text_submitted(new_text : String): - var new_script := GDScript.new() - new_script.source_code = "static func can_show(res, index):\n\treturn " + new_text - new_script.reload() - - search_cond = new_script - refresh() - - -func _on_process_expr_text_submitted(new_text : String): - if new_text == "": - new_text = "true" - - var new_script := GDScript.new() - new_script.source_code = "static func get_result(value, res, row_index, cell_index):\n\treturn " + new_text - new_script.reload() - - var new_script_instance = new_script.new() - var values = get_edited_cells_values() - var cur_row := 0 - - var edited_rows = _selection.get_edited_rows() - for i in values.size(): - values[i] = new_script_instance.get_result(values[i], rows[edited_rows[i]], edited_rows[i], i) - - set_edited_cells_values(values) - - func _on_File_pressed(): node_folder_path.get_parent().get_parent().visible = !node_folder_path.get_parent().get_parent().visible diff --git a/addons/resources_spreadsheet_view/editor_view.tscn b/addons/resources_spreadsheet_view/editor_view.tscn index 1b05dab..9ce70ee 100644 --- a/addons/resources_spreadsheet_view/editor_view.tscn +++ b/addons/resources_spreadsheet_view/editor_view.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=29 format=3 uid="uid://tmleonv20aqk"] +[gd_scene load_steps=30 format=3 uid="uid://tmleonv20aqk"] [ext_resource type="Script" path="res://addons/resources_spreadsheet_view/editor_view.gd" id="1_wfx75"] [ext_resource type="Script" path="res://addons/resources_spreadsheet_view/editor_color_setter.gd" id="2_t2s7k"] [ext_resource type="Script" path="res://addons/resources_spreadsheet_view/editor_icon_button.gd" id="3_7ja2l"] [ext_resource type="Script" path="res://addons/resources_spreadsheet_view/main_screen/recent_paths.gd" id="4_umoob"] +[ext_resource type="Script" path="res://addons/resources_spreadsheet_view/main_screen/expression_textfield.gd" id="5_faq75"] [ext_resource type="Script" path="res://addons/resources_spreadsheet_view/main_screen/table_pages.gd" id="5_ka2yn"] [ext_resource type="Script" path="res://addons/resources_spreadsheet_view/main_screen/column_header_manager.gd" id="6_emnmd"] [ext_resource type="PackedScene" uid="uid://d1s6oihqedvo5" path="res://addons/resources_spreadsheet_view/main_screen/table_header.tscn" id="7_3dx0v"] @@ -261,10 +262,14 @@ mouse_filter = 0 mouse_default_cursor_shape = 16 text = "(?)" -[node name="SearchCond" type="LineEdit" parent="HeaderContentSplit/VBoxContainer/Search/Search"] +[node name="Filter" type="HBoxContainer" parent="HeaderContentSplit/VBoxContainer/Search/Search"] layout_mode = 2 size_flags_horizontal = 3 -text = "true" +script = ExtResource("5_faq75") +editor_view_path = NodePath("../../../../..") +title = "func f(res : Resource, index : int):" +default_text = "true" +default_text_ml = "return true" [node name="VSeparator" type="VSeparator" parent="HeaderContentSplit/VBoxContainer/Search/Search"] layout_mode = 2 @@ -290,9 +295,15 @@ mouse_filter = 0 mouse_default_cursor_shape = 16 text = "(?)" -[node name="ProcessExpr" type="LineEdit" parent="HeaderContentSplit/VBoxContainer/Search/Search"] +[node name="Process" type="HBoxContainer" parent="HeaderContentSplit/VBoxContainer/Search/Search"] layout_mode = 2 size_flags_horizontal = 3 +script = ExtResource("5_faq75") +editor_view_path = NodePath("../../../../..") +mode = 1 +title = "func f(value : Var, res : Resource, index : int):" +default_text = "value" +default_text_ml = "return value" [node name="HBoxContainer3" type="HBoxContainer" parent="HeaderContentSplit/VBoxContainer"] layout_mode = 2 @@ -548,8 +559,6 @@ metadata/_edit_lock_ = true [connection signal="pressed" from="HeaderContentSplit/VBoxContainer/HBoxContainer/HBoxContainer/SelectDir" to="Control/FileDialog" method="popup_centered"] [connection signal="pressed" from="HeaderContentSplit/VBoxContainer/HBoxContainer/HBoxContainer/DeletePath" to="HeaderContentSplit/VBoxContainer/HBoxContainer/HBoxContainer2/RecentPaths" method="remove_selected_path_from_recent"] [connection signal="pressed" from="HeaderContentSplit/VBoxContainer/HBoxContainer/HBoxContainer2/ImportExport" to="Control/FileDialogText" method="popup_centered"] -[connection signal="text_submitted" from="HeaderContentSplit/VBoxContainer/Search/Search/SearchCond" to="." method="_on_search_cond_text_submitted"] -[connection signal="text_submitted" from="HeaderContentSplit/VBoxContainer/Search/Search/ProcessExpr" to="." method="_on_process_expr_text_submitted"] [connection signal="pressed" from="HeaderContentSplit/VBoxContainer/HBoxContainer3/Refresh" to="." method="_on_path_text_submitted"] [connection signal="value_changed" from="HeaderContentSplit/VBoxContainer/HBoxContainer3/Pages/LineEdit" to="HeaderContentSplit/VBoxContainer/HBoxContainer3/Pages" method="_on_LineEdit_value_changed"] [connection signal="dir_selected" from="Control/FileDialog" to="." method="_on_FileDialog_dir_selected"] diff --git a/addons/resources_spreadsheet_view/main_screen/expression_textfield.gd b/addons/resources_spreadsheet_view/main_screen/expression_textfield.gd new file mode 100644 index 0000000..e8d34cd --- /dev/null +++ b/addons/resources_spreadsheet_view/main_screen/expression_textfield.gd @@ -0,0 +1,118 @@ +@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 + +var _textfield : LineEdit +var _textfield_ml : TextEdit +var _togglable_popup : PopupPanel + + +func _enter_tree(): + 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() + _textfield = LineEdit.new() + _togglable_popup = PopupPanel.new() + _textfield_ml = TextEdit.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) + + title_label.text = title + + toggle_button.icon = get_theme_icon("Collapse", "EditorIcons") + toggle_button.pressed.connect(_on_expand_pressed) + + submit_button.text = "Run multiline!" + submit_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + submit_button.pressed.connect(_on_text_submitted) + + _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 + + +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() + + +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, row_index, cell_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 cur_row := 0 + + var edited_rows = editor_view._selection.get_edited_rows() + for i in values.size(): + values[i] = new_script_instance.get_result(values[i], editor_view.rows[edited_rows[i]], edited_rows[i], i) + + editor_view.set_edited_cells_values(values)