Created LineEditWithButtons

Created LineEditWithButtons class, to have Icons in the LineEdit that
respond as buttons.
This commit is contained in:
Mario Steele 2026-02-27 16:17:32 -06:00
parent 785a3922a7
commit e9859e3842
2 changed files with 79 additions and 0 deletions

View file

@ -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

View file

@ -0,0 +1 @@
uid://ch7qf8iy31pfy