122 lines
3.2 KiB
GDScript
122 lines
3.2 KiB
GDScript
extends VBoxContainer
|
|
|
|
const TimeSlot = preload("res://scenes/board/time_slot.tscn")
|
|
const ReservationScene = preload("res://scenes/board/reservation.tscn")
|
|
const ReservationIndent = preload("res://scenes/board/reservation_indent.tscn")
|
|
|
|
const WorkingDayStart = 8
|
|
const WorkingDayEnd = 21
|
|
|
|
const MinimalMinutesToShowTitle = 30
|
|
|
|
const MockedSchedule = [
|
|
{
|
|
"title": "Психолог",
|
|
"start_time": 120,
|
|
"end_time": 180,
|
|
"color": 1
|
|
},
|
|
{
|
|
"title": "Дипал",
|
|
"start_time": 180,
|
|
"end_time": 210,
|
|
"color": 2
|
|
},
|
|
{
|
|
"title": "Маркетинг",
|
|
"start_time": 280,
|
|
"end_time": 325,
|
|
"color": 3
|
|
}
|
|
]
|
|
|
|
@onready var _main: Main = get_tree().get_current_scene()
|
|
@onready var _timeline = $Panel/Timeline
|
|
@onready var _reservations = $Panel/Reservations
|
|
|
|
func _ready():
|
|
_remove_time_slots()
|
|
_remove_reservations()
|
|
|
|
_fill_with_slots()
|
|
_update_schedule()
|
|
|
|
func _remove_time_slots():
|
|
for time_slot in _timeline.get_children():
|
|
time_slot.queue_free()
|
|
|
|
func _fill_with_slots():
|
|
for hour in range(WorkingDayStart, WorkingDayEnd):
|
|
var slot = TimeSlot.instantiate()
|
|
_timeline.add_child(slot)
|
|
slot.set_time(hour)
|
|
|
|
func _remove_reservations():
|
|
for reservation in _reservations.get_children():
|
|
reservation.queue_free()
|
|
|
|
func _update_schedule():
|
|
if not _main.is_node_ready():
|
|
await _main.ready
|
|
|
|
var repo = _main.get_reservation_repo()
|
|
var previous_finish_time = 0
|
|
|
|
for reservation in repo.list_reservations():
|
|
var start_time_hours = reservation.start_time['hours']
|
|
var start_time_minutes = reservation.start_time['minutes']
|
|
var start_time = (start_time_hours - WorkingDayStart)*60 + start_time_minutes
|
|
|
|
var finish_time_hours = reservation.finish_time['hours']
|
|
var finish_time_minutes = reservation.finish_time['minutes']
|
|
var finish_time = (finish_time_hours - WorkingDayStart)*60 + finish_time_minutes
|
|
|
|
var reservation_time = finish_time - start_time
|
|
|
|
_compose_indent(start_time - previous_finish_time)
|
|
_compose_reservation(reservation_time, reservation.title, reservation.color)
|
|
|
|
previous_finish_time = finish_time
|
|
|
|
func _compose_indent(minutes):
|
|
var indent = ReservationIndent.instantiate()
|
|
_reservations.add_child(indent)
|
|
indent.set_minutes(minutes)
|
|
|
|
func _compose_reservation(minutes, title, color):
|
|
if minutes <= MinimalMinutesToShowTitle:
|
|
title = ""
|
|
|
|
var reservation = ReservationScene.instantiate()
|
|
_reservations.add_child(reservation)
|
|
reservation.set_minutes(minutes)
|
|
reservation.set_title(title)
|
|
reservation.set_color(color)
|
|
|
|
func _input(event):
|
|
if event is InputEventScreenTouch or (event is InputEventMouseButton and event.pressed):
|
|
if _clicked_on_timeline(event.position):
|
|
await get_tree().create_timer(0.01, false).timeout
|
|
|
|
if _main.get_current_page() == Main.Pages.Board:
|
|
_main.load_page(Main.Pages.ReservationCreation)
|
|
|
|
func _clicked_on_timeline(pos: Vector2):
|
|
var timeline_position = _timeline.global_position
|
|
return (
|
|
pos.x > timeline_position.x and
|
|
pos.x < _timeline.size.x + timeline_position.x
|
|
) and (
|
|
pos.y > timeline_position.y and
|
|
pos.y < _timeline.size.y + timeline_position.y
|
|
)
|
|
|
|
func _on_room_button_pressed():
|
|
print("emit change room signal")
|
|
|
|
func _on_date_button_pressed():
|
|
print("emit change date signal")
|
|
|
|
func update():
|
|
_ready()
|