2025-01-29 00:45:44 +03:00

176 lines
4.3 KiB
GDScript

extends Control
const TimeHand = preload("res://scenes/common/time/time_hand.tscn")
const WorkingDayStart = 8
const WorkingDayEnd = 21
const DigitsNumber = 12
enum State {
SettingHours,
SettingMinutes
}
@export var number_flash_time := 0.5
@onready var _main: Main = get_tree().get_current_scene()
@onready var _hours_label = $VerticalBar/Time/Hours
@onready var _minutes_label = $VerticalBar/Time/Minutes
@onready var _time = $VerticalBar/Time
@onready var _face = $VerticalBar/Circle/Face
@onready var _arrow = $VerticalBar/Circle/Clock/Arrow
@onready var _numbers = $VerticalBar/Circle/Clock/Numbers
var _hours : int
var _minutes : int
var _state := State.SettingHours
var _time_after_last_flash := 0.0
signal time_is_set(hours: int, minutes: int)
func _ready():
_set_initial_values()
_start_hours_setting()
func _set_initial_values():
_hours = WorkingDayStart
_minutes = 0
func _process(delta):
if _time_after_last_flash >= number_flash_time:
_flash_number()
_time_after_last_flash = 0.0
_time_after_last_flash += delta
func _flash_number():
match _state:
State.SettingHours:
_hours_label.text = str(_hours) \
if _hours_label.text == '_' else '_'
State.SettingMinutes:
_minutes_label.text = _correct_minutes(str(_minutes)) \
if _minutes_label.text == '_' else '_'
func _fill_with_hours():
_remove_numbers()
for part in range(0, DigitsNumber):
var number = TimeHand.instantiate()
_numbers.add_child(number)
number.set_part(part)
number.set_value(WorkingDayStart + part)
func _fill_with_minutes():
_remove_numbers()
for part in range(0, DigitsNumber):
var number = TimeHand.instantiate()
_numbers.add_child(number)
number.set_part(part)
number.set_value(5*part)
func _remove_numbers():
for number in _numbers.get_children():
number.queue_free()
func _clicked_on_face(pos: Vector2):
var face_position = _face.global_position
return (pos.x > face_position.x and pos.x < _face.size.x + face_position.x) and \
(pos.y > face_position.y and pos.y < _face.size.y + face_position.y)
func _clicked_on_time(pos: Vector2):
var time_position = _time.global_position
return (pos.x > time_position.x and pos.x < _time.size.x + time_position.x) and \
(pos.y > time_position.y and pos.y < _time.size.y + time_position.y)
func _input(event):
if not _main.get_current_page() == Main.Pages.TimeSetting:
return
if (event is InputEventScreenTouch and event.pressed) or \
(event is InputEventMouseButton and event.pressed): # TODO: call on click or release, do not do anything if it was clicked
if _clicked_on_face(event.position):
var number = _get_closest_number(event.position)
_arrow.rotation = number.rotation
match _state:
State.SettingHours:
set_hours(number.get_value())
await get_tree().create_timer(0.01, false).timeout
_start_minutes_setting()
State.SettingMinutes:
set_minutes(number.get_value())
time_is_set.emit(_hours, _minutes)
await get_tree().create_timer(0.01, false).timeout
_main.go_to_previous_page()
_ready()
elif _clicked_on_time(event.position):
match _get_closest_unit(event.position):
_hours_label:
_start_hours_setting()
_minutes_label:
_start_minutes_setting()
await event.is_released() == true
func _get_closest_number(pos: Vector2):
var min_distance = INF
var sought = null
for number in _numbers.get_children():
var distance = number.get_number_position().distance_to(pos)
if (distance < min_distance):
min_distance = distance
sought = number
return sought
func _get_closest_unit(pos: Vector2):
var min_distance = INF
var sought = null
for unit in _time.get_children():
var distance = unit.global_position.distance_to(pos)
if (distance < min_distance):
min_distance = distance
sought = unit
return sought
func set_hours(value):
_hours = value
_update_time()
func get_hours():
return _hours
func set_minutes(value):
_minutes = value
_update_time()
func get_minutes():
return _minutes
func _update_time():
_arrow.rotation = 0.0
_hours_label.text = str(_hours)
_minutes_label.text = _correct_minutes(str(_minutes))
func _correct_minutes(value):
return "0" + value if len(value) == 1 else value
func _start_hours_setting():
_state = State.SettingHours
_fill_with_hours()
_update_time()
func _start_minutes_setting():
_state = State.SettingMinutes
_fill_with_minutes()
_update_time()
func update():
_ready()