| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- extends PanelContainer
- @onready var state_treeview: Tree = $HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/AvatarStateTreeview
- @onready var state_add_button: Button = $HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/Add
- @onready var state_del_button: Button = $HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/Del
- @onready var total_state_treeview: Tree = $HSplitContainer/VSplitContainer/PanelContainer2/MarginContainer/VBoxContainer/TotalStateTreeview
- @onready var button_0: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button0
- @onready var button_1: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button1
- @onready var button_2: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button2
- @onready var button_3: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button3
- @onready var button_4: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button4
- @onready var slot_check_box: CheckBox = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer3/SlotCheckBox
- @onready var value_treeview: Tree = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer2/ValueTreeview
- var states_index = -1
- var scope_buttons = []
- var current_scope = 0
- var states = null
- func _ready() -> void:
- _init_gui()
- func _init_gui():
- visibility_changed.connect(_on_visibility_changed)
-
- # avatar_state
- state_treeview.columns = 3
- state_treeview.hide_root = true
- state_treeview.set_column_title(0, "ID")
- state_treeview.set_column_title(1, "Name")
- state_treeview.set_column_title(2, "State")
- state_treeview.set_column_custom_minimum_width(0, 40)
- state_treeview.set_column_custom_minimum_width(2, 40)
- state_treeview.set_column_expand(1, true)
- state_treeview.set_column_expand_ratio(1, 4)
- state_treeview.item_selected.connect(_on_avatar_state_treeview_selected)
- #state_treeview.nothing_selected.connect(_on_asset_listview_nothing_selected)
-
- # total_state_treeview
- total_state_treeview.columns = 3
- total_state_treeview.hide_root = true
- total_state_treeview.set_column_title(0, "Part")
- total_state_treeview.set_column_title(1, "Required")
- total_state_treeview.set_column_title(2, "Max")
- total_state_treeview.create_item()
-
- # scope_buttons
- scope_buttons.append(button_0)
- scope_buttons.append(button_1)
- scope_buttons.append(button_2)
- scope_buttons.append(button_3)
- scope_buttons.append(button_4)
- for i in range(scope_buttons.size()):
- var btn = scope_buttons[i]
- btn.toggled.connect(_on_scope_button_pressed.bind(i))
- pass
-
- slot_check_box.toggled.connect(_onslot_check_box_toggled)
-
- # value_treeview
- value_treeview.columns = 3
- value_treeview.hide_root = true
- value_treeview.set_column_title(0, "ID")
- value_treeview.set_column_title(1, "Value")
- value_treeview.set_column_title(2, "Required")
- value_treeview.set_column_custom_minimum_width(0, 40)
- value_treeview.set_column_custom_minimum_width(2, 60)
- value_treeview.set_column_expand(0, false)
- value_treeview.set_column_expand(1, true)
- value_treeview.set_column_expand(2, false)
- value_treeview.item_edited.connect(_on_value_treeview_item_edited)
- var root = value_treeview.create_item()
- root.set_cell_mode(2, TreeItem.CELL_MODE_CHECK)
- root.set_checked(2, false)
- func load_data():
- if AvatarDollDataMgr.initialed == false:
- return
-
- states = AvatarDollDataMgr.avatar_doll_data["Settings"]["States"]
-
- state_treeview.clear()
- state_treeview.create_item() # root
- value_treeview.clear()
- value_treeview.create_item()
-
- # state_treeview
- for i in range(states.size()):
- var state = states[i]
- var item = state_treeview.create_item()
- item.set_text(0, str(i))
- item.set_text(1, str(state["Name"]))
- item.set_text(2, str(state["Values"].size()))
- item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER)
-
- # total_state_treeview
- update_total_state()
-
- if states.size() > 0:
- state_treeview.set_selected(state_treeview.get_root().get_child(0), 0)
- func _on_visibility_changed() -> void:
- if is_visible_in_tree() == true:
- load_data()
- func _on_scope_button_pressed(_toggled_on, _index):
- if not AvatarDollDataMgr.initialed:
- return
-
- current_scope = 0
- for i in range(scope_buttons.size()):
- if scope_buttons[i].button_pressed:
- current_scope += 1 << i
- states[states_index]["Scope"] = current_scope
- update_total_state()
- func _onslot_check_box_toggled(toggled_on):
- if not AvatarDollDataMgr.initialed or states_index < 0:
- return
- states[states_index]["Slot"] = toggled_on
- update_total_state()
- func _on_avatar_state_treeview_selected():
- if not AvatarDollDataMgr.initialed:
- return
-
- value_treeview.clear()
- value_treeview.create_item() # root
-
- states_index = int(state_treeview.get_selected().get_text(0))
- if states_index < 0:
- for i in range(5):
- scope_buttons[i].set_pressed_no_signal(false)
- return
-
- var state = states[states_index]
- var scope = int(state["Scope"])
- for i in range(5):
- var s = scope & 1
- scope_buttons[i].set_pressed_no_signal(s == 1)
- scope = scope >> 1
-
- slot_check_box.set_pressed_no_signal(state["Slot"])
-
- for i in range(state["Values"].size()):
- var item = value_treeview.create_item()
- item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_cell_mode(2, TreeItem.CELL_MODE_CHECK)
- item.set_editable(1, true)
- item.set_editable(2, true)
-
- item.set_text(0, str(i))
- item.set_text(1, state["Values"][i])
- item.set_checked(2, state["Required"][i])
-
- func _on_value_treeview_item_edited():
- if not AvatarDollDataMgr.initialed or states_index < 0:
- return
-
- var item = value_treeview.get_edited()
- var row = int(item.get_text(0))
- var column = value_treeview.get_edited_column()
- var state = states[states_index]
-
- if column == 1: state["Values"][row] = item.get_text(column)
- elif column == 2: state["Required"][row] = item.is_checked(column)
-
- update_total_state()
-
- func update_total_state():
- total_state_treeview.clear()
- total_state_treeview.create_item()
-
- var slot_required = 0
- var slot_max = 0
-
- var total_state_required = [0, 0, 0, 0, 0]
- var total_state_max = [0, 0, 0, 0, 0]
- for state in states:
- var required = 0
- var value_count = state["Values"].size()
- for r in state["Required"]:
- if r: required += 1
-
- if state["Slot"]:
- if slot_required == 0:
- slot_required = value_count
- else:
- slot_required *= value_count
-
- if slot_max == 0:
- slot_max = value_count
- else:
- slot_max *= value_count
-
- var scope = int(state["Scope"])
- for i in range(5):
- if scope & 1 == 1:
- if total_state_max[i] == 0:
- total_state_max[i] = value_count
- else:
- total_state_max[i] *= value_count
-
- if total_state_required[i] == 0:
- total_state_required[i] = required
- else:
- total_state_required[i] *= required
-
- scope = scope >> 1
-
- slot_required = slot_required if slot_required != 0 else 1
- slot_max = slot_max if slot_max != 0 else 1
-
- # set data
- var item = total_state_treeview.create_item()
- item.set_text(0, "Slot")
- item.set_text(1, str(slot_required))
- item.set_text(2, str(slot_max))
- item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER)
-
- var parts = ["Body", "Head", "Hair", "Face", "Cloth"]
- for i in range(5):
- item = total_state_treeview.create_item()
- item.set_text(0, parts[i])
- item.set_text(1, str(total_state_required[i]))
- item.set_text(2, str(total_state_max[i]))
- item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
- item.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER)
|