176 lines
4.3 KiB
GDScript
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()
|