Implement multiline filter/process

This commit is contained in:
don-tnowe 2023-09-24 17:57:10 +03:00
parent 8fc923da8b
commit c42d6b21d5
3 changed files with 134 additions and 38 deletions

View File

@ -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

View File

@ -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"]

View File

@ -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)