commit
883e4e708b
94
app/content/entities/timer/timer.gd
Normal file
94
app/content/entities/timer/timer.gd
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
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
|
||||||
|
|
||||||
|
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"
|
83
app/content/entities/timer/timer.tscn
Normal file
83
app/content/entities/timer/timer.tscn
Normal 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)
|
|
@ -259,6 +259,13 @@ func set_state(entity: String, state: Variant, attributes: Dictionary={}):
|
||||||
elif domain == 'number':
|
elif domain == 'number':
|
||||||
service = 'set_value'
|
service = 'set_value'
|
||||||
attributes["value"] = state
|
attributes["value"] = state
|
||||||
|
elif domain == 'timer':
|
||||||
|
if state == 'start':
|
||||||
|
service = 'start'
|
||||||
|
elif state == 'cancel':
|
||||||
|
service = 'cancel'
|
||||||
|
elif state == 'pause':
|
||||||
|
service = 'pause'
|
||||||
|
|
||||||
if service == null:
|
if service == null:
|
||||||
return null
|
return null
|
||||||
|
|
|
@ -10,6 +10,7 @@ const Camera = preload ("res://content/entities/camera/camera.tscn")
|
||||||
const ButtonEntity = preload ("res://content/entities/button/button.tscn")
|
const ButtonEntity = preload ("res://content/entities/button/button.tscn")
|
||||||
const NumberEntity = preload ("res://content/entities/number/number.tscn")
|
const NumberEntity = preload ("res://content/entities/number/number.tscn")
|
||||||
const LineGraphEntity = preload ("res://content/entities/line_chart/line_chart.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):
|
static func create_entity(id: String, type=null):
|
||||||
var entity = null
|
var entity = null
|
||||||
|
@ -34,6 +35,8 @@ static func create_entity(id: String, type=null):
|
||||||
entity = NumberEntity.instantiate()
|
entity = NumberEntity.instantiate()
|
||||||
"line_chart":
|
"line_chart":
|
||||||
entity = LineGraphEntity.instantiate()
|
entity = LineGraphEntity.instantiate()
|
||||||
|
"timer":
|
||||||
|
entity = TimerEntity.instantiate()
|
||||||
_:
|
_:
|
||||||
return null
|
return null
|
||||||
|
|
||||||
|
@ -58,5 +61,7 @@ static func get_entity_icon(type: String) -> String:
|
||||||
return "sliders"
|
return "sliders"
|
||||||
"line_chart":
|
"line_chart":
|
||||||
return "finance"
|
return "finance"
|
||||||
|
"timer":
|
||||||
|
return "timer"
|
||||||
_:
|
_:
|
||||||
return "question_mark"
|
return "question_mark"
|
Loading…
Reference in New Issue
Block a user