- Edited
I have this script for types variations of buttons, all work fine except when pressing on rectangle type, it doesn't initiate pressed style or receive touch event although other types work as expected. I don't know why:
extends Control
@onready var border: Panel = $Border
@onready var center: Panel = $Center
@onready var icon: TextureRect = $Icon
@onready var label: Label = $Label
@export var min_size: Vector2
enum ButtonType {
BORDERED_ICON_DECREASED_CENTER,
BORDERED_ICON_NORMAL_CENTER,
ICON,
RECTANGLE,
TEXT
}
@export var type: ButtonType
@export var icon_texture: Texture2D
@export var text: String
signal pressed
var themes = [
{
"graphite": {"primary": Color.RED, "secondary": Color.GREEN}
},
{
"nature": {"primary": Color.YELLOW, "secondary": Color.BLUE}
}
]
var current_theme: Dictionary
func _ready() -> void:
current_theme = themes[0][themes[0].keys()[0]]
#init icon and texture
if icon_texture:
icon.texture = icon_texture
if text:
label.text = text
set_custom_minimum_size(min_size)
set_normal_style()
func set_components_visibility(border_visible, center_visible, icon_visible, label_visible):
border.visible = border_visible
center.visible = center_visible
icon.visible = icon_visible
label.visible = label_visible
func set_normal_style():
match type:
ButtonType.BORDERED_ICON_DECREASED_CENTER:
set_components_visibility(true, false, true, false)
var stylebox: StyleBoxFlat = border.get_theme_stylebox("panel").duplicate()
stylebox.border_color = current_theme.primary
border.add_theme_stylebox_override("panel", stylebox)
icon.modulate = current_theme.primary
ButtonType.BORDERED_ICON_NORMAL_CENTER:
set_components_visibility(true, false, true, false)
var stylebox: StyleBoxFlat = border.get_theme_stylebox("panel").duplicate()
stylebox.border_color = current_theme.primary
border.add_theme_stylebox_override("panel", stylebox)
icon.modulate = current_theme.primary
ButtonType.ICON:
set_components_visibility(false, false, true, false)
icon.modulate = current_theme.primary
ButtonType.RECTANGLE:
set_components_visibility(false, true, false, true)
var stylebox: StyleBoxFlat = center.get_theme_stylebox("panel").duplicate()
stylebox.bg_color = current_theme.primary
stylebox.set_corner_radius_all(25)
center.add_theme_stylebox_override("panel", stylebox)
label.modulate = current_theme.secondary
label.add_theme_font_size_override("font_size", 84)
ButtonType.TEXT:
set_components_visibility(false, false, false, true)
label.modulate = current_theme.primary
label.add_theme_font_size_override("font_size", 40)
func set_pressed_style():
print("set_pressed_style")
match type:
ButtonType.BORDERED_ICON_DECREASED_CENTER:
set_components_visibility(false, true, true, false)
var stylebox: StyleBoxFlat = center.get_theme_stylebox("panel").duplicate()
stylebox.bg_color = current_theme.primary
stylebox.set_corner_radius_all(20)
center.add_theme_stylebox_override("panel", stylebox)
icon.modulate = current_theme.secondary
ButtonType.BORDERED_ICON_NORMAL_CENTER:
set_components_visibility(true, true, true, false)
var stylebox: StyleBoxFlat = border.get_theme_stylebox("panel").duplicate()
stylebox.border_color = current_theme.primary
border.add_theme_stylebox_override("panel", stylebox)
var stylebox_2: StyleBoxFlat = center.get_theme_stylebox("panel").duplicate()
stylebox_2.bg_color = current_theme.primary
center.add_theme_stylebox_override("panel", stylebox_2)
icon.modulate = current_theme.secondary
ButtonType.ICON:
set_components_visibility(false, true, true, false)
var stylebox: StyleBoxFlat = center.get_theme_stylebox("panel").duplicate()
stylebox.bg_color = current_theme.primary
stylebox.set_corner_radius_all(20)
center.add_theme_stylebox_override("panel", stylebox)
icon.modulate = current_theme.secondary
ButtonType.RECTANGLE:
print('button type rectangle')
set_components_visibility(true, false, false, true)
var stylebox: StyleBoxFlat = border.get_theme_stylebox("panel").duplicate()
stylebox.border_color = current_theme.primary
stylebox.set_corner_radius_all(20)
border.add_theme_stylebox_override("panel", stylebox)
label.modulate = current_theme.primary
label.add_theme_font_size_override("font_size", 84)
ButtonType.TEXT:
set_components_visibility(false, true, false, true)
var stylebox: StyleBoxFlat = center.get_theme_stylebox("panel").duplicate()
stylebox.bg_color = current_theme.primary
stylebox.set_corner_radius_all(20)
center.add_theme_stylebox_override("panel", stylebox)
label.modulate = current_theme.secondary
label.add_theme_font_size_override("font_size", 40)
func _on_gui_input(event: InputEvent) -> void:
if event is InputEventScreenTouch:
print('event screen touch')
if event.pressed:
set_pressed_style()
else:
set_normal_style()
pressed.emit()