Skip to content

Commit ef3d78a

Browse files
authored
Merge pull request #6 from DarthPapalo666/advanced_filter_options
Advanced filter options
2 parents 8b799b5 + 527b367 commit ef3d78a

File tree

8 files changed

+142
-29
lines changed

8 files changed

+142
-29
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ export_presets.cfg
1818
.mono/
1919
data_*/
2020
mono_crash.*.json
21+
plugin_icon.png.import
22+
plugin_icon.svg.import

addons/resource_databases/editor_only/editor_data_classes/editor_database_collection.gd

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,15 @@ func remove_category(category: StringName) -> void:
187187
_emit_collection_entries_changed()
188188

189189

190+
func clear_category(category: StringName) -> void:
191+
assert(has_category(category))
192+
var was_empty := (_categories_to_ints[category] as Dictionary).size() == 0
193+
(_categories_to_ints[category] as Dictionary).clear()
194+
_emit_categories_changed()
195+
if not was_empty:
196+
_emit_collection_entries_changed()
197+
198+
190199
func get_all_categories() -> Array[StringName]:
191200
var arr: Array[StringName]
192201
arr.assign(_categories_to_ints.keys())

addons/resource_databases/editor_only/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="Resource Databases"
44
description="Use the fully-fledged database editor to create and modify your resource databases!\n\nLoad them at runtime as the new resource type \"Database\" and load resources dynamically!"
55
author="DarthPapalo"
6-
version="1.2.1"
6+
version="1.3.1"
77
script="plugin.gd"

addons/resource_databases/editor_only/ui/components/collection_view/category_filter/category_filter.tscn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ corner_radius_bottom_left = 6
1919
[node name="CategoryFilter" type="PanelContainer" node_paths=PackedStringArray("_button", "_texture")]
2020
offset_right = 8.0
2121
offset_bottom = 31.0
22+
size_flags_horizontal = 3
2223
theme_override_styles/panel = SubResource("StyleBoxFlat_bnakq")
2324
script = ExtResource("1_iqelm")
2425
_button = NodePath("Button")
@@ -30,6 +31,7 @@ theme_override_styles/focus = SubResource("StyleBoxEmpty_lr1dy")
3031
text = " <category_name>"
3132
flat = true
3233
alignment = 0
34+
text_overrun_behavior = 3
3335

3436
[node name="TextureRect" type="TextureRect" parent="."]
3537
custom_minimum_size = Vector2(0, 24)

addons/resource_databases/editor_only/ui/components/collection_view/collection_view.gd

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,14 @@ const CATEGORY_FILTER_SCENE := preload("res://addons/resource_databases/editor_o
2222
@export_subgroup("Filters components")
2323
@export var _filters_check_button: CheckButton
2424
@export var _filters_panel: PanelContainer
25-
@export var _category_filters_container: HFlowContainer
25+
@export var _category_filters_container: VBoxContainer
2626
@export var _expression_filter_text_edit: TextEdit
27+
# Advanced filter options
28+
@export var _advanced_filter_options: VBoxContainer
29+
@export var _no_categories_label: Label
30+
@export var _categories_option_button: OptionButton
31+
@export var _update_category_button: Button
32+
@export var _clear_category_button: Button
2733

2834
var DatabaseEditor := Namespace.get_editor_singleton()
2935
var DatabaseSettings := Namespace.get_settings_singleton()
@@ -185,7 +191,20 @@ func _get_filtered_ids() -> Array[int]:
185191
var expr := _get_filter_expression()
186192
if expr == null:
187193
return result
194+
var expression_ids := _get_expression_ids()
188195
result = result.filter(
196+
func(int_id: int) -> bool:
197+
return int_id in expression_ids
198+
)
199+
return result
200+
201+
202+
func _get_expression_ids() -> Array[int]:
203+
var expr := _get_filter_expression()
204+
assert(expr != null, "Can't get expression IDs if expression is null.")
205+
var entries_ids: Array[int] = []
206+
entries_ids.assign(_current_entries.ints_to_locators.keys())
207+
var ids = entries_ids.filter(
189208
func(int_id: int) -> bool:
190209
var locator := _current_entries.ints_to_locators[int_id] as String
191210
var locator_references_resource := false
@@ -214,7 +233,7 @@ func _get_filtered_ids() -> Array[int]:
214233
return false
215234
return expr_result as bool
216235
)
217-
return result
236+
return ids
218237

219238

220239
func _get_filter_expression() -> Expression:
@@ -227,7 +246,7 @@ func _get_filter_expression() -> Expression:
227246
return expr
228247

229248

230-
func _on_evaluate_expression_button_pressed() -> void:
249+
func _on_filter_with_expression_button_pressed() -> void:
231250
_update_entries()
232251

233252

@@ -237,14 +256,14 @@ func _on_clear_expression_button_pressed() -> void:
237256
_update_entries()
238257

239258

240-
func _register_resources_collection(paths: PackedStringArray) -> void:
259+
func _register_resources_in_collection(paths: PackedStringArray) -> void:
241260
for path: String in paths:
242261
if FileAccess.file_exists(path): # Is file
243262
_get_collection().register_resource(path)
244263
elif DirAccess.dir_exists_absolute(path): # Is folder
245264
_get_collection().register_folder_resources(path)
246265
else:
247-
print_rich("[color=orange]Error on drag and drop, invalid path [color=yellow](%s)" % path)
266+
print_rich("[color=orange][ResourceDatabase] Error on drag and drop, invalid path [color=yellow](%s)" % path)
248267

249268

250269
#region Collection callbacks
@@ -267,8 +286,11 @@ func _on_collection_categories_changed(categories: Dictionary) -> void:
267286
for category: StringName in _categories_view_exclude_filter.keys():
268287
if category not in categories:
269288
_categories_view_exclude_filter.erase(category)
289+
# Remove categories from option button of advanced expression options
290+
_categories_option_button.clear()
270291
# Add new filters
271292
for category: StringName in categories:
293+
# Update category filters
272294
var new_filter: Namespace.CategoryFilter = CATEGORY_FILTER_SCENE.instantiate()
273295
var initial_state := 0
274296
if _categories_view_include_filter.has(category):
@@ -278,7 +300,14 @@ func _on_collection_categories_changed(categories: Dictionary) -> void:
278300
new_filter.set_category(category, initial_state)
279301
new_filter.filter_changed.connect(_on_category_filter_state_changed.bind(category))
280302
_category_filters_container.add_child(new_filter)
303+
# Update category option button for advanced expression options
304+
_categories_option_button.add_item(String(category))
305+
_categories_option_button.set_item_metadata(_categories_option_button.item_count - 1, category)
281306
_update_entries()
307+
_update_category_button.disabled = _categories_option_button.selected == -1
308+
_clear_category_button.disabled = _categories_option_button.selected == -1
309+
_no_categories_label.visible = _categories_option_button.selected == -1
310+
_categories_option_button.visible = _categories_option_button.selected != -1
282311
#endregion
283312

284313

@@ -426,10 +455,24 @@ func _on_filters_check_button_toggled(toggled_on: bool) -> void:
426455
_update_entries()
427456

428457

429-
# TESTING
430-
func _on_testing_button_pressed() -> void:
431-
#print(load(_get_collection().get_entries()[&"ints_to_locators"][0] as String).get_script().get_script_property_list())
432-
#print("Size: ", DatabaseEditor.get_database().get_collection(collection_uid).collection_size)
433-
for u in 5:
434-
_get_collection().register_test_res()
435-
pass
458+
#region Advanced filter options
459+
func _on_advanced_filter_options_check_button_toggled(toggled_on: bool) -> void:
460+
_advanced_filter_options.visible = toggled_on
461+
462+
463+
func _on_update_category_button_pressed() -> void:
464+
var category: StringName = _categories_option_button.get_item_metadata(_categories_option_button.selected)
465+
if not await DatabaseEditor.warn("Update category", "Are you sure you want to update the [b]%s[/b] category with the currently filtered IDs?" % category):
466+
return
467+
var filtered_ids := _get_filtered_ids()
468+
_get_collection().clear_category(category)
469+
for id: int in filtered_ids:
470+
_get_collection().add_category_to_resource(category, id, false)
471+
472+
473+
func _on_clear_category_button_pressed() -> void:
474+
var category: StringName = _categories_option_button.get_item_metadata(_categories_option_button.selected)
475+
if not await DatabaseEditor.warn("Clear category", "Are you sure you want to clear the [b]%s[/b] category?" % category):
476+
return
477+
_get_collection().clear_category(category)
478+
#endregion

addons/resource_databases/editor_only/ui/components/collection_view/collection_view.tscn

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[gd_scene load_steps=10 format=3 uid="uid://c6snrkt0lx7rr"]
1+
[gd_scene load_steps=11 format=3 uid="uid://c6snrkt0lx7rr"]
22

33
[ext_resource type="Script" path="res://addons/resource_databases/editor_only/ui/components/collection_view/collection_view.gd" id="2_r2ggo"]
44
[ext_resource type="PackedScene" uid="uid://drfc1vxe6tdt2" path="res://addons/resource_databases/editor_only/ui/components/database_entry/database_entries_top_bar.tscn" id="5_yml8w"]
@@ -29,13 +29,21 @@ bg_color = Color(0.113725, 0.133333, 0.160784, 1)
2929
border_width_left = 2
3030
border_color = Color(0.439216, 0.729412, 0.980392, 1)
3131

32+
[sub_resource type="StyleBoxLine" id="StyleBoxLine_66tam"]
33+
color = Color(0.441, 0.728467, 0.98, 0.392157)
34+
thickness = 2
35+
3236
[sub_resource type="CodeHighlighter" id="CodeHighlighter_jhtmh"]
3337
number_color = Color(1, 0.70742, 0.783604, 1)
3438
symbol_color = Color(0.758361, 0.414505, 1, 1)
3539
function_color = Color(0.177751, 0.378312, 1, 1)
3640
member_variable_color = Color(0.447388, 0.890726, 1, 1)
41+
member_keyword_colors = {
42+
"res": Color(1, 0.627451, 0.478431, 1),
43+
"res_type": Color(1, 0.713726, 0.756863, 1)
44+
}
3745

38-
[node name="CollectionView" type="PanelContainer" node_paths=PackedStringArray("_collection_button", "_selection_button", "_selected_collection_label", "_collection_entries_container", "_search_line_edit", "_entries_view_page_counter", "_filters_check_button", "_filters_panel", "_category_filters_container", "_expression_filter_text_edit")]
46+
[node name="CollectionView" type="PanelContainer" node_paths=PackedStringArray("_collection_button", "_selection_button", "_selected_collection_label", "_collection_entries_container", "_search_line_edit", "_entries_view_page_counter", "_filters_check_button", "_filters_panel", "_category_filters_container", "_expression_filter_text_edit", "_advanced_filter_options", "_no_categories_label", "_categories_option_button", "_update_category_button", "_clear_category_button")]
3947
anchors_preset = 15
4048
anchor_right = 1.0
4149
anchor_bottom = 1.0
@@ -56,6 +64,11 @@ _filters_check_button = NodePath("VBoxContainer/ToolsPanel/ToolsContainer/Filter
5664
_filters_panel = NodePath("VBoxContainer/HSplitContainer/FiltersContainer")
5765
_category_filters_container = NodePath("VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ScrollContainer/CategoryFiltersContainer")
5866
_expression_filter_text_edit = NodePath("VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ExpressionFilterTextEdit")
67+
_advanced_filter_options = NodePath("VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions")
68+
_no_categories_label = NodePath("VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions/NoCategoriesLabel")
69+
_categories_option_button = NodePath("VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions/CategoriesOptionButton")
70+
_update_category_button = NodePath("VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions/UpdateCategoryButton")
71+
_clear_category_button = NodePath("VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions/ClearCategoryButton")
5972

6073
[node name="VBoxContainer" type="VBoxContainer" parent="."]
6174
layout_mode = 2
@@ -124,11 +137,6 @@ popup/item_8/text = "Remove category from selected"
124137
popup/item_8/id = 8
125138
popup/item_8/disabled = true
126139

127-
[node name="TestingButton" type="Button" parent="VBoxContainer/ToolsPanel/ToolsContainer"]
128-
visible = false
129-
layout_mode = 2
130-
text = "Testing"
131-
132140
[node name="FiltersCheckButton" type="CheckButton" parent="VBoxContainer/ToolsPanel/ToolsContainer"]
133141
layout_mode = 2
134142
size_flags_horizontal = 10
@@ -203,12 +211,15 @@ layout_mode = 2
203211
size_flags_vertical = 3
204212
size_flags_stretch_ratio = 2.0
205213

206-
[node name="CategoryFiltersContainer" type="HFlowContainer" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ScrollContainer"]
214+
[node name="CategoryFiltersContainer" type="VBoxContainer" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ScrollContainer"]
207215
layout_mode = 2
208216
size_flags_horizontal = 3
209217
size_flags_vertical = 3
210-
theme_override_constants/h_separation = 6
211-
theme_override_constants/v_separation = 6
218+
219+
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer"]
220+
layout_mode = 2
221+
theme_override_constants/separation = 7
222+
theme_override_styles/separator = SubResource("StyleBoxLine_66tam")
212223

213224
[node name="Label2" type="Label" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer"]
214225
layout_mode = 2
@@ -227,9 +238,10 @@ layout_mode = 2
227238
theme_override_constants/separation = 6
228239
alignment = 1
229240

230-
[node name="EvaluateExpressionButton" type="Button" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ExpressionOptionsContainer"]
241+
[node name="FilterWithExpressionButton" type="Button" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ExpressionOptionsContainer"]
231242
layout_mode = 2
232-
text = "Evaluate"
243+
size_flags_horizontal = 3
244+
text = "Filter"
233245
flat = true
234246

235247
[node name="ClearExpressionButton" type="Button" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ExpressionOptionsContainer"]
@@ -238,10 +250,48 @@ size_flags_horizontal = 3
238250
text = "Clear"
239251
flat = true
240252

241-
[connection signal="pressed" from="VBoxContainer/ToolsPanel/ToolsContainer/TestingButton" to="." method="_on_testing_button_pressed"]
253+
[node name="HSeparator2" type="HSeparator" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer"]
254+
layout_mode = 2
255+
theme_override_constants/separation = 7
256+
theme_override_styles/separator = SubResource("StyleBoxLine_66tam")
257+
258+
[node name="AdvancedFilterOptionsCheckButton" type="CheckButton" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer"]
259+
layout_mode = 2
260+
text = "Advanced"
261+
262+
[node name="AdvancedFilterOptions" type="VBoxContainer" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer"]
263+
visible = false
264+
layout_mode = 2
265+
266+
[node name="NoCategoriesLabel" type="Label" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions"]
267+
layout_mode = 2
268+
text = "No categories"
269+
horizontal_alignment = 1
270+
271+
[node name="CategoriesOptionButton" type="OptionButton" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions"]
272+
visible = false
273+
layout_mode = 2
274+
text_overrun_behavior = 3
275+
fit_to_longest_item = false
276+
277+
[node name="UpdateCategoryButton" type="Button" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions"]
278+
layout_mode = 2
279+
disabled = true
280+
text = "Update category"
281+
flat = true
282+
283+
[node name="ClearCategoryButton" type="Button" parent="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions"]
284+
layout_mode = 2
285+
disabled = true
286+
text = "Clear category"
287+
flat = true
288+
242289
[connection signal="toggled" from="VBoxContainer/ToolsPanel/ToolsContainer/FiltersCheckButton" to="." method="_on_filters_check_button_toggled"]
243290
[connection signal="text_changed" from="VBoxContainer/HSplitContainer/EntriesElements/VBoxContainer/SearchLineEdit" to="." method="_on_search_line_edit_text_changed"]
244291
[connection signal="change_page_requested" from="VBoxContainer/HSplitContainer/EntriesElements/VBoxContainer/ViewPageCounter" to="." method="_on_view_page_counter_change_page_requested"]
245-
[connection signal="paths_dropped" from="VBoxContainer/HSplitContainer/EntriesElements/DragAndDropPanel" to="." method="_register_resources_collection"]
246-
[connection signal="pressed" from="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ExpressionOptionsContainer/EvaluateExpressionButton" to="." method="_on_evaluate_expression_button_pressed"]
292+
[connection signal="paths_dropped" from="VBoxContainer/HSplitContainer/EntriesElements/DragAndDropPanel" to="." method="_register_resources_in_collection"]
293+
[connection signal="pressed" from="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ExpressionOptionsContainer/FilterWithExpressionButton" to="." method="_on_filter_with_expression_button_pressed"]
247294
[connection signal="pressed" from="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/ExpressionOptionsContainer/ClearExpressionButton" to="." method="_on_clear_expression_button_pressed"]
295+
[connection signal="toggled" from="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptionsCheckButton" to="." method="_on_advanced_filter_options_check_button_toggled"]
296+
[connection signal="pressed" from="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions/UpdateCategoryButton" to="." method="_on_update_category_button_pressed"]
297+
[connection signal="pressed" from="VBoxContainer/HSplitContainer/FiltersContainer/VBoxContainer/AdvancedFilterOptions/ClearCategoryButton" to="." method="_on_clear_category_button_pressed"]

addons/resource_databases/editor_only/ui/components/dialogs/warning_dialog/warning_dialog.gd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ func _on_accept_button_pressed() -> void:
2020
func _on_cancel_button_pressed() -> void:
2121
hide()
2222
decision.emit(false)
23+
24+
25+
func _on_about_to_popup() -> void:
26+
# Forces the window to adopt the minimum size
27+
size = Vector2i.ZERO

addons/resource_databases/editor_only/ui/components/dialogs/warning_dialog/warning_dialog.tscn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ anchor_bottom = 1.0
2525
grow_horizontal = 2
2626
grow_vertical = 2
2727
size_flags_horizontal = 6
28-
size_flags_vertical = 2
28+
size_flags_vertical = 6
2929
theme_type_variation = &"DialogPanel"
3030

3131
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
3232
layout_mode = 2
33+
size_flags_horizontal = 4
3334
theme_override_constants/separation = 20
3435
alignment = 1
3536

@@ -55,6 +56,7 @@ text = "Accept"
5556
layout_mode = 2
5657
text = "Cancel"
5758

59+
[connection signal="about_to_popup" from="." to="." method="_on_about_to_popup"]
5860
[connection signal="close_requested" from="." to="." method="_on_cancel_button_pressed"]
5961
[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer/AcceptButton" to="." method="_on_accept_button_pressed"]
6062
[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer/CancelButton" to="." method="_on_cancel_button_pressed"]

0 commit comments

Comments
 (0)