2024-01-27 16:13:43 +02:00
|
|
|
extends Entity
|
|
|
|
|
|
|
|
const Entity = preload("../entity.gd")
|
2024-01-28 18:13:32 +02:00
|
|
|
const color_wheel_img := preload("res://assets/canvas.png")
|
2023-10-31 23:15:33 +02:00
|
|
|
|
2023-11-14 01:51:48 +02:00
|
|
|
@export var color_off = Color(0.23, 0.23, 0.23)
|
|
|
|
@export var color_on = Color(1.0, 0.85, 0.0)
|
|
|
|
|
2023-11-29 01:16:25 +02:00
|
|
|
@onready var animation: AnimationPlayer = $AnimationPlayer
|
|
|
|
@onready var slider: Slider3D = $Slider
|
2024-01-28 18:13:32 +02:00
|
|
|
@onready var color_wheel = $ColorWheel
|
|
|
|
@onready var color_puck = $ColorWheel/Puck
|
2024-01-28 18:30:01 +02:00
|
|
|
@onready var modes = $Modes
|
|
|
|
@onready var mode_next = $Modes/Next
|
|
|
|
@onready var mode_before = $Modes/Previous
|
|
|
|
@onready var mode_label = $Modes/Label
|
2023-11-29 01:16:25 +02:00
|
|
|
|
|
|
|
var state = true
|
2023-11-14 01:51:48 +02:00
|
|
|
var brightness = 0 # 0-255
|
2023-10-31 23:15:33 +02:00
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
func _ready():
|
2024-01-27 16:13:43 +02:00
|
|
|
super()
|
|
|
|
|
2023-11-24 02:36:31 +02:00
|
|
|
var stateInfo = await HomeApi.get_state(entity_id)
|
2023-11-12 18:36:23 +02:00
|
|
|
set_state(stateInfo["state"] == "on")
|
|
|
|
|
2024-01-28 18:30:01 +02:00
|
|
|
if stateInfo.has("attributes") && stateInfo["attributes"].has("effect_list") && stateInfo["attributes"]["effect_list"].size() > 0:
|
2024-01-29 13:37:25 +02:00
|
|
|
if stateInfo["attributes"].has("effect") && stateInfo["attributes"]["effect"] != null:
|
|
|
|
mode_label.text = stateInfo["attributes"]["effect"]
|
2024-01-28 18:30:01 +02:00
|
|
|
|
|
|
|
mode_next.on_button_down.connect(func():
|
|
|
|
var index = stateInfo["attributes"]["effect_list"].find(stateInfo["attributes"]["effect"])
|
|
|
|
if index == -1:
|
|
|
|
index = 0
|
|
|
|
else:
|
|
|
|
index = (index + 1) % stateInfo["attributes"]["effect_list"].size()
|
|
|
|
|
|
|
|
mode_label.text = stateInfo["attributes"]["effect_list"][index]
|
|
|
|
|
|
|
|
HomeApi.set_state(entity_id, "on", {"effect": stateInfo["attributes"]["effect_list"][index]})
|
|
|
|
)
|
|
|
|
|
|
|
|
mode_before.on_button_down.connect(func():
|
|
|
|
var index = stateInfo["attributes"]["effect_list"].find(stateInfo["attributes"]["effect"])
|
|
|
|
if index == -1:
|
|
|
|
index = 0
|
|
|
|
else:
|
|
|
|
index = (index - 1) % stateInfo["attributes"]["effect_list"].size()
|
|
|
|
|
|
|
|
mode_label.text = stateInfo["attributes"]["effect_list"][index]
|
|
|
|
|
|
|
|
HomeApi.set_state(entity_id, "on", {"effect": stateInfo["attributes"]["effect_list"][index]})
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
remove_child(modes)
|
|
|
|
|
|
|
|
|
2024-01-28 18:13:32 +02:00
|
|
|
if stateInfo.has("attributes") && stateInfo["attributes"].has("supported_color_modes") && stateInfo["attributes"]["supported_color_modes"].has("rgb"):
|
|
|
|
color_wheel.get_node("Clickable").on_press_down.connect(func(event: EventPointer):
|
|
|
|
var target_point = color_wheel.to_local(event.ray.get_collision_point())
|
|
|
|
|
|
|
|
var delta = Vector2(target_point.x, target_point.z) * (1.0 / 0.08)
|
|
|
|
if delta.length() > 1:
|
|
|
|
delta = delta.normalized()
|
|
|
|
|
|
|
|
var color = color_wheel_img.get_image().get_pixel((delta.x * 0.5 + 0.5) * 1000, (delta.y * 0.5 + 0.5) * 1000)
|
|
|
|
|
|
|
|
color_puck.material_override.albedo_color = color
|
|
|
|
color_puck.position = Vector3(target_point.x, color_puck.position.y, target_point.z)
|
|
|
|
|
|
|
|
var attributes = {
|
2024-01-28 18:30:01 +02:00
|
|
|
"rgb_color": [int(color.r * 255), int(color.g * 255), int(color.b * 255)],
|
2024-01-28 18:13:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
HomeApi.set_state(entity_id, "on", attributes)
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
remove_child(color_wheel)
|
|
|
|
|
2023-11-24 02:36:31 +02:00
|
|
|
await HomeApi.watch_state(entity_id, func(new_state):
|
2023-11-12 18:36:23 +02:00
|
|
|
if (new_state["state"] == "on") == state:
|
|
|
|
return
|
|
|
|
set_state(new_state["state"] == "on")
|
|
|
|
)
|
2023-10-31 23:15:33 +02:00
|
|
|
|
2023-11-29 01:16:25 +02:00
|
|
|
slider.on_value_changed.connect(func(new_value):
|
|
|
|
var value = new_value / 100 * 255
|
|
|
|
HomeApi.set_state(entity_id, "on" if state else "off", {"brightness": int(value)})
|
|
|
|
set_state(state, value)
|
|
|
|
)
|
|
|
|
|
|
|
|
func set_state(new_state: bool, new_brightness = null):
|
|
|
|
if state == false && new_state == false:
|
|
|
|
return
|
|
|
|
|
|
|
|
state = new_state
|
|
|
|
brightness = new_brightness
|
2023-11-14 01:51:48 +02:00
|
|
|
|
2023-11-12 18:36:23 +02:00
|
|
|
if state:
|
2023-11-14 01:51:48 +02:00
|
|
|
if brightness == null:
|
2023-11-29 01:16:25 +02:00
|
|
|
animation.speed_scale = 1
|
|
|
|
animation.play_backwards("light")
|
2023-11-14 01:51:48 +02:00
|
|
|
else:
|
2023-11-29 01:16:25 +02:00
|
|
|
var duration = animation.get_animation("light").length
|
|
|
|
animation.speed_scale = 0
|
|
|
|
animation.seek(lerpf(0, duration, 1 - (brightness / 255.0)), true)
|
2023-11-12 18:36:23 +02:00
|
|
|
else:
|
2023-11-29 01:16:25 +02:00
|
|
|
animation.speed_scale = 1
|
|
|
|
animation.play("light")
|
2023-11-14 01:51:48 +02:00
|
|
|
|
2023-10-31 23:15:33 +02:00
|
|
|
|
2023-11-05 22:32:50 +02:00
|
|
|
func _on_click(event):
|
2023-11-12 18:36:23 +02:00
|
|
|
if event.target == self:
|
2023-11-14 01:51:48 +02:00
|
|
|
var attributes = {}
|
|
|
|
|
|
|
|
if !state && brightness != null:
|
|
|
|
attributes["brightness"] = int(brightness)
|
|
|
|
|
2023-11-24 02:36:31 +02:00
|
|
|
HomeApi.set_state(entity_id, "on" if !state else "off", attributes)
|
2024-01-28 18:30:01 +02:00
|
|
|
set_state(!state, brightness)
|