diff --git a/lib/UI/line_edit_with_buttons.gd b/lib/UI/line_edit_with_buttons.gd new file mode 100644 index 00000000..2a36c136 --- /dev/null +++ b/lib/UI/line_edit_with_buttons.gd @@ -0,0 +1,78 @@ +@tool +extends LineEdit +class_name LineEditWithButtons + +signal left_button_pressed() +signal left_button_toggled() +signal right_button_pressed() +signal right_button_toggled() + +@export_subgroup("Left Icon") +@export var left: Texture2D: + set(value): + left = value + if not is_node_ready(): return + + if _left_btn and value == null: + _left_btn.queue_free() + return + if not _left_btn and value: + _left_btn = _create_button_icon(value) + _left_btn.pressed.connect(left_button_pressed.emit) + _left_btn.toggled.connect(left_button_toggled.emit) + return + _left_btn.icon = value +@export var left_is_toggle: bool = false +@export_subgroup("Right Icon") +@export var right: Texture2D: + set(value): + right = value + if not is_node_ready(): return + if _right_btn and value == null: + _right_btn.queue_free() + return + if not _right_btn and value: + _right_btn = _create_button_icon(value) + _right_btn.pressed.connect(right_button_pressed.emit) + _right_btn.toggled.connect(right_button_toggled.emit) + return + _left_btn.icon = value +@export var right_is_toggle: bool = false + +var _left_btn: Button +var _right_btn: Button +var _container: HBoxContainer +var _spacer: Control + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + _container = HBoxContainer.new() + _spacer = Control.new() + _spacer.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _container.add_child(_spacer) + add_child(_container) + if left != null: + _left_btn = _create_button_icon(left) + _left_btn.pressed.connect(left_button_pressed.emit) + _left_btn.toggled.connect(left_button_toggled.emit) + if right != null: + _right_btn = _create_button_icon(right, -1) + _right_btn.pressed.connect(right_button_pressed.emit) + _right_btn.toggled.connect(right_button_toggled.emit) + + item_rect_changed.connect(_handle_resize) + +func _create_button_icon(icon: Texture2D, pos: int = 0) -> Button: + var btn = Button.new() + btn.icon = left + btn.flat = true + btn.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER + btn.vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER + btn.expand_icon = true + btn.toggle_mode = left_is_toggle + _container.add_child(btn) + _container.move_child(btn, pos) + return btn + +func _handle_resize() -> void: + _container.size = size diff --git a/lib/UI/line_edit_with_buttons.gd.uid b/lib/UI/line_edit_with_buttons.gd.uid new file mode 100644 index 00000000..612e3c28 --- /dev/null +++ b/lib/UI/line_edit_with_buttons.gd.uid @@ -0,0 +1 @@ +uid://ch7qf8iy31pfy