input (date)
This commit is contained in:
77
addons/DatePicker/DateButton.gd
Normal file
77
addons/DatePicker/DateButton.gd
Normal file
@@ -0,0 +1,77 @@
|
||||
class_name DateButton
|
||||
extends Button
|
||||
|
||||
var calendar: Calendar
|
||||
var calendar_control: Control
|
||||
|
||||
const CALENDAR = preload("res://addons/DatePicker/Calendar.tscn")
|
||||
|
||||
func init():
|
||||
text = "mm/dd/yyyy"
|
||||
_init_calendar()
|
||||
|
||||
func _init_calendar():
|
||||
calendar = CALENDAR.instantiate()
|
||||
add_child(calendar)
|
||||
calendar.hide()
|
||||
calendar.init()
|
||||
|
||||
pressed.connect(_on_button_pressed)
|
||||
calendar.popup_hide.connect(func(): button_pressed = false)
|
||||
calendar.finished.connect(_on_date_selected)
|
||||
tree_exited.connect(func(): if is_instance_valid(calendar): calendar.queue_free())
|
||||
|
||||
func init_with_date(date_string: String) -> void:
|
||||
_init_calendar()
|
||||
|
||||
var parsed_date = parse_date_string(date_string)
|
||||
if parsed_date:
|
||||
calendar.date_time = parsed_date
|
||||
calendar.selected = parsed_date.duplicate()
|
||||
update_button_text()
|
||||
else:
|
||||
text = "mm/dd/yyyy" # Set default text if parsing fails
|
||||
|
||||
func parse_date_string(date_string: String) -> Dictionary:
|
||||
# Parse ISO date format (YYYY-MM-DD)
|
||||
var parts = date_string.split("-")
|
||||
if parts.size() != 3:
|
||||
return {}
|
||||
|
||||
var year = parts[0].to_int()
|
||||
var month = parts[1].to_int()
|
||||
var day = parts[2].to_int()
|
||||
|
||||
# Validate date components
|
||||
if year < 1 or month < 1 or month > 12 or day < 1 or day > 31:
|
||||
return {}
|
||||
|
||||
return {
|
||||
"year": year,
|
||||
"month": month,
|
||||
"day": day
|
||||
}
|
||||
|
||||
func update_button_text() -> void:
|
||||
var date = calendar.selected
|
||||
text = "%d/%d/%d" % [date.month, date.day, date.year]
|
||||
|
||||
func _on_date_selected():
|
||||
var date = calendar.selected
|
||||
text = "%02d/%02d/%04d" % [date.month, date.day, date.year]
|
||||
|
||||
func _on_button_pressed():
|
||||
if calendar.is_visible():
|
||||
calendar.hide()
|
||||
return
|
||||
|
||||
var viewport_height = get_viewport_rect().size.y
|
||||
var show_above = false
|
||||
if get_global_position().y + size.y + calendar.size.y > viewport_height and get_global_position().y * 2 + size.y > viewport_height:
|
||||
show_above = true
|
||||
|
||||
var h_offset = (size.x - calendar.size.x) / 2
|
||||
var v_offset = -calendar.size.y if show_above else size.y
|
||||
|
||||
calendar.position = get_screen_position() + Vector2(h_offset, v_offset)
|
||||
calendar.popup()
|
||||
Reference in New Issue
Block a user