Files
leonwww/flumi/addons/DatePicker/YearView.gd
2025-08-23 15:47:18 +03:00

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)