93 lines
2.5 KiB
GDScript
93 lines
2.5 KiB
GDScript
class_name YearView
|
|
extends HBoxContainer
|
|
|
|
@export var calendar: Calendar
|
|
|
|
func init():
|
|
var button_example: Button = %Button
|
|
var year_container: VBoxContainer = %YearContainer
|
|
|
|
var buttons_data = []
|
|
for i in range(200):
|
|
var year = i + 1900
|
|
buttons_data.append(year)
|
|
|
|
for year in buttons_data:
|
|
var new_btn: Button = button_example.duplicate()
|
|
new_btn.name = "Year" + str(year)
|
|
new_btn.pressed.connect(_on_year_selected.bind(year))
|
|
new_btn.text = str(year)
|
|
year_container.add_child(new_btn)
|
|
|
|
button_example.queue_free()
|
|
|
|
year_container.resized.connect(func():
|
|
scroll_to_current_year()
|
|
refresh()
|
|
)
|
|
|
|
func scroll_to_current_year():
|
|
var year_container: VBoxContainer = %YearContainer
|
|
var scroll_container: ScrollContainer = $ScrollContainer
|
|
|
|
var current_year = calendar.date_time.year
|
|
var target_button: Button = year_container.get_node_or_null("Year" + str(current_year))
|
|
|
|
if not target_button:
|
|
return
|
|
|
|
while target_button.position.y <= 0:
|
|
await get_tree().process_frame
|
|
|
|
for child in year_container.get_children():
|
|
if child is Button:
|
|
child.set_pressed_no_signal(child == target_button)
|
|
|
|
var button_position = target_button.position.y
|
|
var container_height = scroll_container.size.y
|
|
var button_height = target_button.size.y
|
|
var scroll_position = button_position - (container_height / 2) + (button_height / 2)
|
|
|
|
scroll_container.scroll_vertical = max(0, scroll_position)
|
|
|
|
func _on_year_selected(year: int):
|
|
var new_date = calendar.date_time.duplicate()
|
|
new_date.year = year
|
|
calendar.selected = new_date
|
|
calendar.date_time = new_date
|
|
|
|
if calendar.has_signal("date_changed"):
|
|
calendar.date_changed.emit(new_date)
|
|
|
|
calendar.year_view.hide()
|
|
calendar.month_view.show()
|
|
calendar.month_view.refresh()
|
|
|
|
calendar.finished.emit()
|
|
|
|
func previous():
|
|
var new_date = calendar.date_time.duplicate()
|
|
new_date.year -= 1
|
|
calendar.date_time = new_date
|
|
refresh()
|
|
|
|
func next():
|
|
var new_date = calendar.date_time.duplicate()
|
|
new_date.year += 1
|
|
calendar.date_time = new_date
|
|
refresh()
|
|
|
|
func refresh():
|
|
var current_time = Time.get_unix_time_from_system()
|
|
|
|
calendar.header.text = "%s %s" % [MonthView.num_to_month(calendar.date_time.month), calendar.date_time.year]
|
|
|
|
for child in %YearContainer.get_children():
|
|
if child is Button:
|
|
child.set_pressed_no_signal(false)
|
|
|
|
var target_button_name = "Year" + str(calendar.date_time.year)
|
|
var target_button = %YearContainer.get_node_or_null(target_button_name)
|
|
if target_button:
|
|
target_button.set_pressed_no_signal(true)
|