talkpal-frontend/scenes/main/main_tablet.gd
2025-02-17 00:45:02 +03:00

180 lines
5.5 KiB
GDScript

@tool
extends Main
class_name MainTablet
const BgColors = {
"standart": Color("22262d"),
"busy": Color("4e0003"),
"free": Color("003c18"),
"temporarily_free": Color("3a2c00")
}
const MinutesForTemporarilyFree := 15
enum Status {
FREE,
BUSY
}
@onready var _reservation_repo : AbstractReservationRepo = $Repos/Reservation
@onready var _reservation_service : ReservationService = $Services/ReservationService
@export var current_page : Pages:
set(value):
current_page = value
load_page(value, false)
@onready var _pages := {
Pages.Board: $Left/Pages/Board,
Pages.ReservationCreation: $Left/Pages/ReservationCreation,
Pages.ReservationEdit: $Left/Pages/ReservationEdit,
Pages.TimeSetting: $Left/Pages/TimeSetting
}
@onready var _time_status_indent := $Left/TimeStatusContainer/Indent
@onready var _time_label := $Left/TimeStatusContainer/TimeLabel
@onready var _status_label := $Left/TimeStatusContainer/StatusLabel
@onready var _background := $Background
@onready var _create_reservation_button := $RightBottom/CreateReservationButton
@onready var _15_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_15min
@onready var _30_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_30min
@onready var _45_min_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_45min
@onready var _1_hour_button := $Left/TimeStatusContainer/ReserveNowBox/InstantButtons/_1h
var _current_page := Pages.Board
var _previous_page : Pages
var _status : Status
func _ready():
initialize_signals()
func initialize_signals():
_create_reservation_button.pressed.connect(_on_create_reservation_button_pressed)
_15_min_button.pressed.connect(_on_15_min_button_pressed)
_30_min_button.pressed.connect(_on_30_min_button_pressed)
_45_min_button.pressed.connect(_on_45_min_button_pressed)
_1_hour_button.pressed.connect(_on_1_hour_button_pressed)
func _process(delta):
_process_time_status_indent()
var time = Time.get_time_dict_from_system()
_process_time(time)
_process_status(time)
func _process_time_status_indent():
var indent = get_viewport_rect().size.y/3
if _get_time_status_indent() != indent:
_set_time_status_indent(indent)
func _process_time(time):
_time_label.text = "%02d:%02d" % [time.hour, time.minute]
func _process_status(time):
var reservations = _reservation_repo.list_reservations()
var current_time_in_minutes = time.hour*60 + time.minute
for reservation in reservations:
var start_time_in_minutes = reservation.start_time.hours*60 + reservation.start_time.minutes
var finish_time_in_minutes = reservation.finish_time.hours*60 + reservation.finish_time.minutes
if current_time_in_minutes >= start_time_in_minutes \
and current_time_in_minutes < finish_time_in_minutes:
_status = Status.BUSY
_status_label.text = "Занято"
_background.color = BgColors.busy
return
elif current_time_in_minutes <= start_time_in_minutes \
and current_time_in_minutes + MinutesForTemporarilyFree > start_time_in_minutes:
_status = Status.FREE
_status_label.text = "Свободно"
_background.color = BgColors.temporarily_free
return
if len(reservations) > 0:
_status = Status.FREE
_status_label.text = "Свободно"
_background.color = BgColors.free
else:
_status = Status.FREE
_status_label.text = "Свободно"
_background.color = BgColors.standart
func get_current_page():
return _current_page
func load_page(value, with_update=true):
_pages[_current_page].visible = false
if _previous_page != _current_page:
if not _current_page == Pages.TimeSetting:
_previous_page = _current_page
_current_page = value
if with_update:
_pages[_current_page].update()
_pages[_current_page].visible = true
return _pages[_current_page]
func go_to_previous_page(with_update=true):
if _previous_page != null:
load_page(_previous_page, with_update)
func get_reservation_repo() -> AbstractReservationRepo:
return _reservation_repo
func get_reservation_service() -> ReservationService:
return _reservation_service
func _set_time_status_indent(value):
_time_status_indent.custom_minimum_size.y = value
func _get_time_status_indent():
return _time_status_indent.custom_minimum_size.y
func _create_default_reservation(minutes_of_reservation):
if _status == Status.BUSY:
return
var datetime = Time.get_datetime_dict_from_system()
var start_time_in_minutes = datetime.hour * 60 + datetime.minute
var finish_time_in_minutes = start_time_in_minutes + minutes_of_reservation
var finish_time_hours = floor(finish_time_in_minutes/60)
var finish_time_minutes = finish_time_in_minutes - finish_time_hours * 60
if get_reservation_service().is_time_busy(start_time_in_minutes, finish_time_in_minutes):
return
var dto = CreateReservationDTO.new()
dto.title = ""
dto.date = "%02d.%02d.%04d" % [datetime.day, datetime.month, datetime.year]
dto.start_time = {"hours": datetime.hour, "minutes": datetime.minute}
dto.finish_time = {"hours": finish_time_hours, "minutes": finish_time_minutes}
dto.creator = ""
dto.room_id = "" # TODO: make it listbox
dto.description = ""
dto.color = randi_range(1, 3)
var repo = get_reservation_repo()
repo.create_reservation(dto)
dto.queue_free()
load_page(Main.Pages.Board, true)
func _on_create_reservation_button_pressed():
load_page(Pages.ReservationCreation)
func _on_15_min_button_pressed():
_create_default_reservation(15)
func _on_30_min_button_pressed():
_create_default_reservation(30)
func _on_45_min_button_pressed():
_create_default_reservation(45)
func _on_1_hour_button_pressed():
_create_default_reservation(60)