Created LineEditWithButtons class, to have Icons in the LineEdit that respond as buttons.
78 lines
2.2 KiB
GDScript
78 lines
2.2 KiB
GDScript
@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
|