add timer entity

This commit is contained in:
Nitwel 2024-05-01 19:08:09 +02:00
parent 75c0bce3da
commit 0b280cd5a5
4 changed files with 191 additions and 0 deletions

View File

@ -0,0 +1,96 @@
extends Entity
const Entity = preload ("../entity.gd")
@onready var time_label: Label3D = $TimerLabel
@onready var name_label: Label3D = $NameLabel
@onready var icon_label: Label3D = $IconLabel
@onready var play_button: Button3D = $PlayButton
@onready var stop_button: Button3D = $StopButton
var duration = "00:00:00"
var finishes_at = null
var running = false
# Called when the node enters the scene tree for the first time.
func _ready():
super()
var stateInfo = await HomeApi.get_state(entity_id)
set_state(stateInfo)
await HomeApi.watch_state(entity_id, func(new_state):
set_state(new_state)
)
play_button.on_button_up.connect(func():
if running == false:
HomeApi.set_state(entity_id, "start")
else:
HomeApi.set_state(entity_id, "pause")
)
stop_button.on_button_up.connect(func():
HomeApi.set_state(entity_id, "cancel")
)
EventSystem.on_slow_tick.connect(_slow_tick)
func _slow_tick(_delta: float):
if running == false:
return
if finishes_at != null:
var time_left = finishes_at - round(Time.get_unix_time_from_system())
if time_left < 0:
time_left = 0
var time_dict = Time.get_time_dict_from_unix_time(time_left)
time_label.text = "%01d:%02d:%02d" % [time_dict["hour"],time_dict["minute"],time_dict["second"]]
func set_state(stateInfo):
if stateInfo == null:
return
print("stateInfo: ", stateInfo)
var state = stateInfo["state"]
var attributes = stateInfo["attributes"]
# if attributes.has("icon")&&attributes["icon"] != null&&attributes["icon"].begins_with("mdi:"):
# icon_label.text = attributes["icon"].split(":")[1]
# else:
# icon_label.text = "timer"
if attributes.has("friendly_name")&&attributes["friendly_name"] != null:
name_label.text = attributes["friendly_name"]
else:
name_label.text = "Timer"
if attributes.has("duration")&&attributes["duration"] != null:
duration = attributes["duration"]
else:
duration = "00:00:00"
stop_button.visible = state == "active"||state == "paused"
stop_button.disabled = state == "idle"
match state:
"idle":
running = false
finishes_at = null
time_label.text = duration
play_button.position.x = 0
play_button.label = "play_arrow"
"paused":
running = false
play_button.position.x = -0.03
play_button.label = "resume"
"active":
if attributes.has("finishes_at")&&attributes["finishes_at"] != null:
finishes_at = Time.get_unix_time_from_datetime_string(attributes["finishes_at"])
running = true
play_button.position.x = -0.03
play_button.label = "pause"

View File

@ -0,0 +1,83 @@
[gd_scene load_steps=10 format=3 uid="uid://chxdrb8qenypb"]
[ext_resource type="Script" path="res://content/entities/timer/timer.gd" id="1_bomjl"]
[ext_resource type="FontVariation" uid="uid://sshfnckriqxn" path="res://assets/icons/icons.tres" id="2_ug1vg"]
[ext_resource type="Script" path="res://content/functions/movable.gd" id="2_x0bn6"]
[ext_resource type="PackedScene" uid="uid://bsjqdvkt0u87c" path="res://content/ui/components/button/button.tscn" id="3_v7356"]
[ext_resource type="PackedScene" uid="uid://dnam3fe36gg62" path="res://content/ui/components/panel/panel.tscn" id="5_j3gsb"]
[ext_resource type="Shader" path="res://content/ui/components/panel/glass.gdshader" id="6_40cd1"]
[sub_resource type="BoxShape3D" id="BoxShape3D_3qyo4"]
size = Vector3(0.32, 0.16, 0.02)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_71h4x"]
resource_local_to_scene = true
render_priority = 10
shader = ExtResource("6_40cd1")
shader_parameter/color = Color(1, 1, 1, 0.3)
shader_parameter/border_color = Color(1, 1, 1, 1)
shader_parameter/edge_color = Color(0, 0, 0, 1)
shader_parameter/size = Vector2(8, 4)
shader_parameter/border_size = 0.01
shader_parameter/border_fade_in = 0.05
shader_parameter/border_fade_out = 0.0
shader_parameter/corner_radius = 0.2
shader_parameter/roughness = 0.3
shader_parameter/grain_amount = 0.02
[sub_resource type="QuadMesh" id="QuadMesh_3qjpe"]
size = Vector2(0.32, 0.16)
[node name="Timer" type="StaticBody3D" groups=["entity"]]
script = ExtResource("1_bomjl")
[node name="TimerLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "10:00:00"
font_size = 70
outline_size = 0
[node name="NameLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.12, 0.06, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "Timer"
font_size = 28
outline_size = 0
horizontal_alignment = 0
[node name="IconLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.14, 0.06, 0)
pixel_size = 0.001
render_priority = 15
outline_render_priority = 14
text = "timer"
font = ExtResource("2_ug1vg")
font_size = 28
outline_size = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.01)
shape = SubResource("BoxShape3D_3qyo4")
[node name="Movable" type="Node" parent="."]
script = ExtResource("2_x0bn6")
[node name="PlayButton" parent="." instance=ExtResource("3_v7356")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
label = "play_arrow"
icon = true
[node name="StopButton" parent="." instance=ExtResource("3_v7356")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03, -0.05, 0)
label = "stop"
icon = true
[node name="Panel" parent="." instance=ExtResource("5_j3gsb")]
material_override = SubResource("ShaderMaterial_71h4x")
mesh = SubResource("QuadMesh_3qjpe")
size = Vector2(0.32, 0.16)

View File

@ -259,6 +259,13 @@ func set_state(entity: String, state: Variant, attributes: Dictionary={}):
elif domain == 'number':
service = 'set_value'
attributes["value"] = state
elif domain == 'timer':
if state == 'start':
service = 'start'
elif state == 'cancel':
service = 'cancel'
elif state == 'pause':
service = 'pause'
if service == null:
return null

View File

@ -10,6 +10,7 @@ const Camera = preload ("res://content/entities/camera/camera.tscn")
const ButtonEntity = preload ("res://content/entities/button/button.tscn")
const NumberEntity = preload ("res://content/entities/number/number.tscn")
const LineGraphEntity = preload ("res://content/entities/line_chart/line_chart.tscn")
const TimerEntity = preload ("res://content/entities/timer/timer.tscn")
static func create_entity(id: String, type=null):
var entity = null
@ -34,6 +35,8 @@ static func create_entity(id: String, type=null):
entity = NumberEntity.instantiate()
"line_chart":
entity = LineGraphEntity.instantiate()
"timer":
entity = TimerEntity.instantiate()
_:
return null
@ -58,5 +61,7 @@ static func get_entity_icon(type: String) -> String:
return "sliders"
"line_chart":
return "finance"
"timer":
return "timer"
_:
return "question_mark"