valueslider.gd 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. extends VBoxContainer
  2. @onready var window := $BreakFileMaker
  3. @onready var editor := window.get_node("AutomationEditor")
  4. @onready var slider = $HSplitContainer/HSlider
  5. var undo_redo: UndoRedo
  6. var previous_value
  7. signal meta_changed
  8. #Called when the node enters the scene tree for the first time.
  9. func _ready() -> void:
  10. #$HSplitContainer/ValueLabel.text = str($HSplitContainer/HSlider.value) # initial value
  11. $HSplitContainer/LineEdit.text = str($HSplitContainer/HSlider.value) # initial value
  12. $BreakFileMaker.hide()
  13. editor.connect("automation_updated", Callable(self, "_on_automation_data_received"))
  14. previous_value = slider.value
  15. func _on_h_slider_value_changed(value: float) -> void:
  16. #$HSplitContainer/ValueLabel.text = str(value)
  17. $HSplitContainer/LineEdit.text = str(value)
  18. func _on_line_edit_text_submitted(new_text: String) -> void:
  19. #check if input from text box is a valid number for the slider if not choose an appropriate value and set that
  20. if new_text.is_valid_float():
  21. var new_val = new_text.to_float()
  22. if new_val > $HSplitContainer/HSlider.max_value:
  23. $HSplitContainer/HSlider.value = $HSplitContainer/HSlider.max_value
  24. elif new_val < $HSplitContainer/HSlider.min_value:
  25. $HSplitContainer/HSlider.value = $HSplitContainer/HSlider.min_value
  26. else:
  27. $HSplitContainer/HSlider.set_value_no_signal(new_val)
  28. else:
  29. $HSplitContainer/LineEdit.text = str($HSplitContainer/HSlider.value)
  30. func _on_line_edit_focus_exited() -> void:
  31. #check if input from text box is a valid number for the slider if not choose and appropriate value and set that
  32. if $HSplitContainer/LineEdit.text.is_valid_float():
  33. var new_val = $HSplitContainer/LineEdit.text.to_float()
  34. if new_val > $HSplitContainer/HSlider.max_value:
  35. $HSplitContainer/HSlider.value = $HSplitContainer/HSlider.max_value
  36. elif new_val < $HSplitContainer/HSlider.min_value:
  37. $HSplitContainer/HSlider.value = $HSplitContainer/HSlider.min_value
  38. else:
  39. $HSplitContainer/HSlider.set_value_no_signal(new_val)
  40. else:
  41. $HSplitContainer/LineEdit.text = str($HSplitContainer/HSlider.value)
  42. #check for right click
  43. func _on_h_slider_gui_input(event: InputEvent) -> void:
  44. if $HSplitContainer/HSlider.get_meta("brk"): #check if slider can take a break file
  45. if $HSplitContainer/HSlider.has_meta("brk_data"): #check if it already has break data and set menu correctly (used when loading files)
  46. $HSplitContainer/HSlider/PopupMenu.set_item_text(0, "Edit Automation")
  47. if $HSplitContainer/HSlider/PopupMenu.get_item_count() <= 1: #if it has automation data but no remove button, add it
  48. $HSplitContainer/HSlider/PopupMenu.add_item("Remove Automation", 1)
  49. $HSplitContainer/HSlider/PopupMenu.set_item_disabled(0, false)
  50. else: #if it can't take automation data updata menu to let user know
  51. $HSplitContainer/HSlider/PopupMenu.set_item_disabled(0, true)
  52. $HSplitContainer/HSlider/PopupMenu.set_item_text(0, "Automation is not available for this parameter")
  53. if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
  54. var local_pos = DisplayServer.mouse_get_position()
  55. # Show popup at global mouse position
  56. $HSplitContainer/HSlider/PopupMenu.popup()
  57. $HSplitContainer/HSlider/PopupMenu.set_position(local_pos)
  58. # Prevent default context menu or input propagation if needed
  59. accept_event()
  60. elif event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.double_click:
  61. $HSplitContainer/HSlider.value = $HSplitContainer/HSlider.get_meta("default_value")
  62. accept_event()
  63. func _on_popup_menu_index_pressed(index: int) -> void:
  64. match index:
  65. 0:
  66. $BreakFileMaker.position = DisplayServer.mouse_get_position()
  67. $BreakFileMaker.show()
  68. if $HSplitContainer/HSlider.has_meta("brk_data"):
  69. $BreakFileMaker/AutomationEditor.read_automation($HSplitContainer/HSlider.get_meta("brk_data"))
  70. 1:
  71. $HSplitContainer/HSlider.set_meta("brk_data", null)
  72. $BreakFileMaker/AutomationEditor.reset_automation()
  73. $HSplitContainer/HSlider.editable = true
  74. $HSplitContainer/HSlider/PopupMenu.set_item_text(0, "Add Automation")
  75. $HSplitContainer/HSlider/PopupMenu.remove_item(1)
  76. _on_meta_changed()
  77. func _on_automation_data_received(data):
  78. $HSplitContainer/HSlider.set_meta("brk_data", data)
  79. $HSplitContainer/HSlider.editable = false
  80. $HSplitContainer/HSlider/PopupMenu.set_item_text(0, "Edit Automation")
  81. if $HSplitContainer/HSlider/PopupMenu.get_item_count() <= 1:
  82. $HSplitContainer/HSlider/PopupMenu.add_item("Remove Automation", 1)
  83. _on_meta_changed()
  84. func _on_save_automation_button_down() -> void:
  85. $BreakFileMaker.hide()
  86. func _on_save_automation_2_button_down() -> void:
  87. $BreakFileMaker.hide()
  88. func _on_break_file_maker_close_requested() -> void:
  89. $BreakFileMaker.hide()
  90. func _on_meta_changed():
  91. emit_signal("meta_changed")
  92. func _on_h_slider_drag_ended(value_changed: bool) -> void:
  93. if slider.value != previous_value:
  94. undo_redo.create_action("Change Slider Value")
  95. undo_redo.add_do_method(set_slider_value.bind(slider.value))
  96. undo_redo.add_undo_method(set_slider_value.bind(previous_value))
  97. undo_redo.commit_action()
  98. func set_slider_value(value: float) -> void:
  99. slider.value = value