Skip to content

Commit

Permalink
🎉 feat: added sub section basic functionality but not full functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
maktoobgar committed Jan 8, 2023
1 parent 067c108 commit 8f6d912
Show file tree
Hide file tree
Showing 11 changed files with 205 additions and 73 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ CHANGELOG
UNRELEASED
----------

* 🎉 feat: added sub section basic functionality but not full functionality
* 🎉 feat: basics of sub_section added

3.3.0 (2023-01-06)
Expand Down
14 changes: 9 additions & 5 deletions addons/scene_manager/item_setting.gd
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
class_name ItemSetting

var visibility: bool = true
var categorized: bool = false

func _init(visibility = true) -> void:
func _init(visibility = true, categorized = false) -> void:
self.visibility = visibility
self.categorized = categorized

func as_dictionary() -> Dictionary:
return {
"visibility": self.visibility
"visibility": self.visibility,
"categorized": self.categorized
}

static func dictionary_to_item_setting(input: Dictionary) -> ItemSetting:
var visibility = input["visibility"] if input.has("visibility") else true
return ItemSetting.new(visibility)
var categorized = input["categorized"] if input.has("categorized") else false
return ItemSetting.new(visibility, categorized)

static func default() -> ItemSetting:
return ItemSetting.new(true)
return ItemSetting.new()

func duplicate() -> ItemSetting:
return new(self.visibility)
return new(self.visibility, self.categorized)
10 changes: 0 additions & 10 deletions addons/scene_manager/label_id.tscn

This file was deleted.

109 changes: 79 additions & 30 deletions addons/scene_manager/manager.gd
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@ const _hide_button_unchecked = preload("res://addons/scene_manager/icons/GuiChec
# add save, refresh
@onready var _save_button: Button = self.find_child("save")
@onready var _refresh_button: Button = self.find_child("refresh")
# add category
@onready var _add_category_button: Button = self.find_child("add_category")
@onready var _category_name_line_edit: LineEdit = self.find_child("category_name")
# add section
# add list
@onready var _add_subsection_button: Button = self.find_child("add_subsection")
@onready var _add_section_button: Button = self.find_child("add_section")
@onready var _section_name_line_edit: LineEdit = self.find_child("section_name")
# add ignore
Expand All @@ -36,7 +34,7 @@ const _hide_button_unchecked = preload("res://addons/scene_manager/icons/GuiChec
@onready var _accept_dialog: AcceptDialog = self.find_child("accept_dialog")

# A dictionary which contains every scenes exact addresses as key and an array
# assigned as values which categories every category name the scene is part of
# assigned as values which categories every section name the scene is part of
#
# Example: { "res://demo/scene3.tscn": ["Character", "Menu"] }
var _sections: Dictionary = {}
Expand Down Expand Up @@ -81,6 +79,11 @@ func get_all_lists_names_except(excepts: Array = [""]) -> Array:
arr.append(node.name)
return arr

# Returns names of all sublists from UI and active tab
func get_all_sublists_names_except(excepts: Array = [""]) -> Array:
var section = _tab_container.get_child(_tab_container.current_tab)
return section.get_all_sublists()

# Shows a dialog message at the middle of screen
func show_message(title: String, description: String) -> void:
_accept_dialog.title = title
Expand Down Expand Up @@ -145,11 +148,9 @@ func _clear_all_lists() -> void:
# Removes all tabs in scene manager
func _delete_all_tabs() -> void:
for node in _get_lists_nodes():
if node.name == "All":
continue
node.free()

# Returns nodes of all category lists from UI in `Scene Manager` tool
# Returns nodes of all section lists from UI in `Scene Manager` tool
func _get_lists_nodes() -> Array:
var arr: Array = []
for i in range(_tab_container.get_child_count()):
Expand All @@ -169,12 +170,36 @@ func remove_scene_from_list(section_name: String, scene_name: String, scene_addr
list.remove_item(scene_name, scene_address)
_section_remove(scene_address, section_name)

# Removes and add in `All` section too so that it updates its place in list
var all_list = _get_one_list_node_by_name("All")
var setting = all_list.get_node_by_scene_address(scene_address).get_setting()
all_list.remove_item(scene_name, scene_address)
setting.categorized = has_sections(scene_address)
all_list.add_item(scene_name, scene_address, setting)

# Adds an item to a list
func add_scene_to_list(list_name: String, scene_name: String, scene_address: String, setting :ItemSetting) -> void:
#
# Used mainly in this script
func _add_scene_to_list(list_name: String, scene_name: String, scene_address: String, setting :ItemSetting) -> void:
var list: Node = _get_one_list_node_by_name(list_name)
list.add_item(scene_name, scene_address, setting)
_sections_add(scene_address, list_name)

# Adds an item to a list
#
# This function is used in `scene_item.gd` script and plus doing what is supposed
# to do, removes and again adds the item in `All` section so that it can be placed
# in currect place in currect section
func add_scene_to_list(list_name: String, scene_name: String, scene_address: String, setting :ItemSetting) -> void:
_add_scene_to_list(list_name, scene_name, scene_address, setting)

# Removes and add in `All` section too so that it updates its place in list
var all_list = _get_one_list_node_by_name("All")
setting = all_list.get_node_by_scene_address(scene_address).get_setting()
all_list.remove_item(scene_name, scene_address)
setting.categorized = has_sections(scene_address)
all_list.add_item(scene_name, scene_address, setting)

# Adds an address to ignore list
func _add_ignore_item(address: String) -> void:
var item = _ignore_item.instantiate()
Expand Down Expand Up @@ -218,13 +243,14 @@ func _reload_scenes() -> void:
else:
setting = ItemSetting.default()
_sections_add(scene["value"], section)
add_scene_to_list(section, key, scene["value"], setting)
_add_scene_to_list(section, key, scene["value"], setting)
var setting: ItemSetting = null
if "settings" in keys && "All" in scene["settings"].keys():
setting = ItemSetting.dictionary_to_item_setting(scene["settings"]["All"])
else:
setting = ItemSetting.default()
add_scene_to_list("All", key, scene["value"], setting)
setting.categorized = has_sections(scene["value"])
_add_scene_to_list("All", key, scene["value"], setting)

# Add scenes that are new and are not into `Scenes` script
var data_values: Array = []
Expand All @@ -235,7 +261,7 @@ func _reload_scenes() -> void:
for key in scenes:
if !(scenes[key] in data_values):
var setting = ItemSetting.default()
add_scene_to_list("All", key, scenes[key], setting)
_add_scene_to_list("All", key, scenes[key], setting)

# Reloads ignores list in UI and in this script
func _reload_ignores() -> void:
Expand Down Expand Up @@ -283,7 +309,11 @@ func get_sections(scene_address: String) -> Array:
return []
return _sections[scene_address]

# Cleans `_sections` variable from `All` category
# Returns true or false if passed `scene_address` has sections
func has_sections(scene_address: String) -> bool:
return _sections.keys().has(scene_address) && _sections[scene_address] != []

# Cleans `_sections` variable from `All` section
func _clean_sections() -> void:
var scenes: Array = get_all_lists_names_except(["All"])
for key in _sections:
Expand All @@ -304,6 +334,14 @@ func update_all_scene_with_key(scene_key: String, scene_new_key: String, value:
if list not in except_list:
list.update_scene_with_key(scene_key, scene_new_key, value, setting)

# Checks for duplications in scenes of lists
func check_duplication():
var list: Array = _get_one_list_node_by_name("All").check_duplication()
for node in _get_lists_nodes():
node.set_reset_theme_for_all()
if list:
node.set_duplicate_theme(list)

# Removes `_ignore_list` and `_sections` keys from passed dictionary so that
# just scene names remain in returned dictionary
func _remove_ignore_list_and_sections_from_dic(dic: Dictionary) -> Dictionary:
Expand Down Expand Up @@ -480,27 +518,25 @@ func _add_scene_list(text: String) -> void:
list.name = text.capitalize()
_tab_container.add_child(list)

# Add Category Button
func _on_add_category_button_up():
if _category_name_line_edit.text != "":
_add_scene_list(_category_name_line_edit.text)
_category_name_line_edit.text = ""
_add_category_button.disabled = true
# Add section Button
func _on_add_section_button_up():
if _section_name_line_edit.text != "":
_add_scene_list(_section_name_line_edit.text)
_section_name_line_edit.text = ""
_add_subsection_button.disabled = true
_add_section_button.disabled = true

# When category name text changes
func _on_category_name_text_changed(new_text):
# When section name text changes
func _on_section_name_text_changed(new_text):
if new_text != "" && !(new_text.capitalize() in get_all_lists_names_except()):
_add_category_button.disabled = false
_add_section_button.disabled = false
else:
_add_category_button.disabled = true
_add_section_button.disabled = true

# Checks for duplications in scenes of lists
func check_duplication():
var list: Array = _get_one_list_node_by_name("All").check_duplication()
for node in _get_lists_nodes():
node.set_reset_theme_for_all()
if list:
node.set_duplicate_theme(list)
if new_text != "" && _tab_container.get_child(_tab_container.current_tab).name != "All" && !(new_text.capitalize() in get_all_sublists_names_except()):
_add_subsection_button.disabled = false
else:
_add_subsection_button.disabled = true

# Hide Button
func _on_hide_button_up():
Expand All @@ -510,3 +546,16 @@ func _on_hide_button_up():
else:
_hide_button.icon = _hide_button_checked
_ignores_container.visible = true

# Tab changes
func _on_tab_container_tab_changed(tab: int):
_on_section_name_text_changed(_section_name_line_edit.text)

# Add SubSection Button
func _on_add_subsection_button_up():
if _section_name_line_edit.text != "":
var section = _tab_container.get_child(_tab_container.current_tab)
section.add_subsection(_section_name_line_edit.text)
_section_name_line_edit.text = ""
_add_subsection_button.disabled = true
_add_section_button.disabled = true
26 changes: 19 additions & 7 deletions addons/scene_manager/menu.tscn
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
[gd_scene load_steps=5 format=3 uid="uid://crnf0w0s44hxx"]

[ext_resource type="Texture2D" uid="uid://dtdbx26h20nr" path="res://addons/scene_manager/icons/GuiChecked.svg" id="1"]
[ext_resource type="Texture2D" uid="uid://b72ilejlbbo6v" path="res://addons/scene_manager/icons/GuiChecked.svg" id="1"]
[ext_resource type="PackedScene" path="res://addons/scene_manager/label.tscn" id="2"]
[ext_resource type="Texture2D" uid="uid://dci7nx6dnosoc" path="res://addons/scene_manager/icons/FileDialog.svg" id="3"]
[ext_resource type="Texture2D" uid="uid://cpgpxp006i0e7" path="res://addons/scene_manager/icons/FileDialog.svg" id="3"]
[ext_resource type="Script" path="res://addons/scene_manager/manager.gd" id="6"]

[node name="root_container" type="MarginContainer"]
Expand Down Expand Up @@ -33,15 +33,25 @@ size_flags_vertical = 8
[node name="add_category_container" type="HBoxContainer" parent="main_container/add_category_container"]
layout_mode = 2

[node name="category_name" type="LineEdit" parent="main_container/add_category_container/add_category_container"]
[node name="section_name" type="LineEdit" parent="main_container/add_category_container/add_category_container"]
layout_mode = 2
size_flags_horizontal = 3

[node name="add_category" type="Button" parent="main_container/add_category_container/add_category_container"]
[node name="HBoxContainer" type="HBoxContainer" parent="main_container/add_category_container/add_category_container"]
layout_mode = 2
size_flags_horizontal = 3

[node name="add_subsection" type="Button" parent="main_container/add_category_container/add_category_container/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
disabled = true
text = "+ SubList"

[node name="add_section" type="Button" parent="main_container/add_category_container/add_category_container/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
disabled = true
text = "Add Category"
text = "+ List"

[node name="separator" type="HSeparator" parent="main_container"]
layout_mode = 2
Expand Down Expand Up @@ -138,8 +148,10 @@ text = "Save"
[node name="accept_dialog" type="AcceptDialog" parent="."]
dialog_autowrap = true

[connection signal="text_changed" from="main_container/add_category_container/add_category_container/category_name" to="." method="_on_category_name_text_changed"]
[connection signal="button_up" from="main_container/add_category_container/add_category_container/add_category" to="." method="_on_add_category_button_up"]
[connection signal="tab_changed" from="main_container/scenes/tab_container" to="." method="_on_tab_container_tab_changed"]
[connection signal="text_changed" from="main_container/add_category_container/add_category_container/section_name" to="." method="_on_section_name_text_changed"]
[connection signal="button_up" from="main_container/add_category_container/add_category_container/HBoxContainer/add_subsection" to="." method="_on_add_subsection_button_up"]
[connection signal="button_up" from="main_container/add_category_container/add_category_container/HBoxContainer/add_section" to="." method="_on_add_section_button_up"]
[connection signal="dir_selected" from="main_container/interactive_section_container/ignore_interactive_section_container/add_ignore_container/dialog_add_ignore_container/file_dialog" to="." method="_on_file_dialog_dir_file_selected"]
[connection signal="file_selected" from="main_container/interactive_section_container/ignore_interactive_section_container/add_ignore_container/dialog_add_ignore_container/file_dialog" to="." method="_on_file_dialog_dir_file_selected"]
[connection signal="button_up" from="main_container/interactive_section_container/ignore_interactive_section_container/add_ignore_container/dialog_add_ignore_container/file_dialog_button" to="." method="_on_file_dialog_button_button_up"]
Expand Down
22 changes: 16 additions & 6 deletions addons/scene_manager/scene_item.gd
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ extends HBoxContainer
@onready var _key: String = get_node("key").text
# Variables
var _setting: ItemSetting
var _sub_section: Control
var _list: Control

# Finds and fills `_root` variable properly
func _ready() -> void:
Expand Down Expand Up @@ -44,7 +46,7 @@ func get_visibility() -> bool:
# Sets value of `_setting.visibility`
func set_visibility(input: bool) -> void:
_setting.visibility = input
self.visible = get_parent().get_parent().determine_item_visibility(_setting)
self.visible = _list.determine_item_visibility(_setting)

# Returns `_setting`
func get_setting() -> ItemSetting:
Expand All @@ -65,17 +67,17 @@ func remove_custom_theme() -> void:
# Popup Button
func _on_popup_button_button_up():
var i: int = 0
var arr: Array = _root.get_all_lists_names_except()
var sections: Array = _root.get_all_lists_names_except()
_popup_menu.clear()
_popup_menu.add_separator("Categories")
i += 1
# Categories have id of 0
for value in arr:
if value == "All":
for section in sections:
if section == "All":
continue
_popup_menu.add_check_item(value)
_popup_menu.add_check_item(section)
_popup_menu.set_item_id(i, 0)
_popup_menu.set_item_checked(i, value in _root.get_sections(get_value()))
_popup_menu.set_item_checked(i, section in _root.get_sections(get_value()))
i += 1
_popup_menu.add_separator("General")
i += 1
Expand Down Expand Up @@ -137,3 +139,11 @@ func _on_key_gui_input(event: InputEvent) -> void:
_on_key_value_text_changed()
_key = get_key()
_root.check_duplication()

# When added
func _on_tree_entered():
get_parent().get_parent().child_entered()

# When deleted
func _on_tree_exiting():
get_parent().get_parent().child_exiting()
4 changes: 3 additions & 1 deletion addons/scene_manager/scene_item.tscn
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[gd_scene load_steps=3 format=3 uid="uid://hh0sw1g7upfc"]

[ext_resource type="Script" path="res://addons/scene_manager/scene_item.gd" id="2"]
[ext_resource type="Texture2D" uid="uid://8336mcj402s5" path="res://addons/scene_manager/icons/GuiTabMenuHl.svg" id="3"]
[ext_resource type="Texture2D" uid="uid://bjmufqgg61f7j" path="res://addons/scene_manager/icons/GuiTabMenuHl.svg" id="3"]

[node name="item" type="HBoxContainer"]
offset_right = 280.0
Expand All @@ -28,6 +28,8 @@ size = Vector2i(100, 28)
visible = true
hide_on_item_selection = false

[connection signal="tree_entered" from="." to="." method="_on_tree_entered"]
[connection signal="tree_exiting" from="." to="." method="_on_tree_exiting"]
[connection signal="button_up" from="popup_button" to="." method="_on_popup_button_button_up"]
[connection signal="gui_input" from="key" to="." method="_on_key_gui_input"]
[connection signal="index_pressed" from="popup_menu" to="." method="_on_popup_menu_index_pressed"]
Loading

0 comments on commit 8f6d912

Please sign in to comment.