SettingsCategory.gd 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. extends VBoxContainer
  2. @export var category_name := "Hi"
  3. @export var options: Array[Control] = []
  4. var selected_index := -1
  5. @export var minimum_idx := -1
  6. @export var active := true
  7. @export var description_node: Control = null
  8. @export var scroll_container: ScrollContainer = null
  9. @export var scroll_step := 8
  10. var can_input := true
  11. func _process(_delta: float) -> void:
  12. visible = active
  13. if active and can_input:
  14. handle_input()
  15. var idx := 0
  16. for i in options:
  17. if i != null:
  18. i.selected = selected_index == idx and active and can_input
  19. idx += 1
  20. if description_node != null and selected_index >= 0 and options[selected_index] != null:
  21. description_node.text = options[selected_index].value_descs[options[selected_index].selected_index]
  22. if not active:
  23. selected_index = minimum_idx
  24. func handle_input() -> void:
  25. if Input.is_action_just_pressed("ui_down"):
  26. selected_index += 1
  27. if Settings.file.audio.extra_sfx == 1:
  28. AudioManager.play_global_sfx("menu_move")
  29. if Input.is_action_just_pressed("ui_up"):
  30. selected_index -= 1
  31. if Settings.file.audio.extra_sfx == 1:
  32. AudioManager.play_global_sfx("menu_move")
  33. if scroll_container != null:
  34. scroll_container.scroll_vertical = float(lerpf(0.0, scroll_container.get_v_scroll_bar().max_value, inverse_lerp(0.0, options.size() - 1, selected_index - 2)))
  35. selected_index = clamp(selected_index, minimum_idx, options.size() - 1)
  36. func auto_get_options() -> void:
  37. options.clear()
  38. selected_index = 0
  39. for i in get_children():
  40. if i is HBoxContainer:
  41. options.append(i)