input (date)
This commit is contained in:
1
Assets/Icons/arrow-down.svg
Normal file
1
Assets/Icons/arrow-down.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-down-icon lucide-arrow-down"><path d="M12 5v14"/><path d="m19 12-7 7-7-7"/></svg>
|
||||||
|
After Width: | Height: | Size: 284 B |
37
Assets/Icons/arrow-down.svg.import
Normal file
37
Assets/Icons/arrow-down.svg.import
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://c1bqnfwurnnrc"
|
||||||
|
path="res://.godot/imported/arrow-down.svg-1e5275b4ffe06ccf19d892794fc84c5b.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/Icons/arrow-down.svg"
|
||||||
|
dest_files=["res://.godot/imported/arrow-down.svg-1e5275b4ffe06ccf19d892794fc84c5b.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=1.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
1
Assets/Icons/arrow-up.svg
Normal file
1
Assets/Icons/arrow-up.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-icon lucide-arrow-up"><path d="m5 12 7-7 7 7"/><path d="M12 19V5"/></svg>
|
||||||
|
After Width: | Height: | Size: 279 B |
37
Assets/Icons/arrow-up.svg.import
Normal file
37
Assets/Icons/arrow-up.svg.import
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://d1jslyy8aajcn"
|
||||||
|
path="res://.godot/imported/arrow-up.svg-e673f59c1623de68e856c93a57be6cb0.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/Icons/arrow-up.svg"
|
||||||
|
dest_files=["res://.godot/imported/arrow-up.svg-e673f59c1623de68e856c93a57be6cb0.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=1.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
1
Assets/Icons/calendar.svg
Normal file
1
Assets/Icons/calendar.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar-icon lucide-calendar"><path d="M8 2v4"/><path d="M16 2v4"/><rect width="18" height="18" x="3" y="4" rx="2"/><path d="M3 10h18"/></svg>
|
||||||
|
After Width: | Height: | Size: 340 B |
37
Assets/Icons/calendar.svg.import
Normal file
37
Assets/Icons/calendar.svg.import
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://da721lhb4r0so"
|
||||||
|
path="res://.godot/imported/calendar.svg-4a7aa93bfd00cdce85eae886ac3d4d51.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/Icons/calendar.svg"
|
||||||
|
dest_files=["res://.godot/imported/calendar.svg-4a7aa93bfd00cdce85eae886ac3d4d51.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=1.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
2
Assets/Icons/calendar_16x16.svg
Normal file
2
Assets/Icons/calendar_16x16.svg
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar-icon lucide-calendar"><path d="M8 2v4"/><path d="M16 2v4"/><rect width="18" height="18" x="3" y="4" rx="2"/><path d="M3 10h18"/></svg>
|
||||||
|
After Width: | Height: | Size: 379 B |
37
Assets/Icons/calendar_16x16.svg.import
Normal file
37
Assets/Icons/calendar_16x16.svg.import
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://mol3s1ujp0k2"
|
||||||
|
path="res://.godot/imported/calendar_16x16.svg-38c497b40cde0596f1f838e0a52171d2.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Assets/Icons/calendar_16x16.svg"
|
||||||
|
dest_files=["res://.godot/imported/calendar_16x16.svg-38c497b40cde0596f1f838e0a52171d2.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=1.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -9,10 +9,11 @@ TODO:
|
|||||||
8. **More input types** (url, tel, date, time, etc.)
|
8. **More input types** (url, tel, date, time, etc.)
|
||||||
9. **Required** attribute for inputs
|
9. **Required** attribute for inputs
|
||||||
10. Installer should register **gurt://** as a valid protocol thru the registry.
|
10. Installer should register **gurt://** as a valid protocol thru the registry.
|
||||||
|
11. < input type=**datetime** />, essentially a type "date" but with a vertical separator, then `mm | ss | FORMAT` layout for time.
|
||||||
|
|
||||||
Issues:
|
Issues:
|
||||||
1. **< br />** counts as 1 element in **WebsiteContainer**, therefore despite being (0,0) in size, it counts as double in spacing
|
1. **< br />** counts as 1 element in **WebsiteContainer**, therefore despite being (0,0) in size, it counts as double in spacing
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
- **<input />** is sort-of inline in normal web. We render it as a block element (new-line).
|
- **< input />** is sort-of inline in normal web. We render it as a block element (new-line).
|
||||||
- A single `RichTextLabel` for inline text tags should stop, we should use invididual ones so it's easier to style and achieve separation through a `vboxcontainer`.
|
- A single `RichTextLabel` for inline text tags should stop, we should use invididual ones so it's easier to style and achieve separation through a `vboxcontainer`.
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
|
|
||||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_c32on"]
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_c32on"]
|
||||||
|
|
||||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7g0pl"]
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0v877"]
|
||||||
bg_color = Color(0.168627, 0.168627, 0.168627, 1)
|
bg_color = Color(0.105882, 0.105882, 0.105882, 1)
|
||||||
corner_radius_top_left = 4
|
corner_radius_top_left = 4
|
||||||
corner_radius_top_right = 4
|
corner_radius_top_right = 4
|
||||||
corner_radius_bottom_right = 4
|
corner_radius_bottom_right = 4
|
||||||
@@ -142,7 +142,7 @@ corner_radius_bottom_left = 4
|
|||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
Button/styles/focus = SubResource("StyleBoxEmpty_c32on")
|
Button/styles/focus = SubResource("StyleBoxEmpty_c32on")
|
||||||
Button/styles/hover = SubResource("StyleBoxFlat_7g0pl")
|
Button/styles/hover = SubResource("StyleBoxFlat_0v877")
|
||||||
Button/styles/normal = SubResource("StyleBoxFlat_c32on")
|
Button/styles/normal = SubResource("StyleBoxFlat_c32on")
|
||||||
CheckBox/constants/icon_max_width = 24
|
CheckBox/constants/icon_max_width = 24
|
||||||
CheckBox/icons/checked = ExtResource("2_3k2jb")
|
CheckBox/icons/checked = ExtResource("2_3k2jb")
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ _data = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[node name="Tab1" type="Control"]
|
[node name="Tab1" type="Control"]
|
||||||
custom_minimum_size = Vector2(350, 50)
|
custom_minimum_size = Vector2(0, 50)
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
anchors_preset = 0
|
anchors_preset = 0
|
||||||
offset_right = 350.0
|
offset_right = 350.0
|
||||||
@@ -103,7 +103,7 @@ unique_name_in_owner = true
|
|||||||
z_index = -2
|
z_index = -2
|
||||||
clip_contents = true
|
clip_contents = true
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
offset_right = 350.0
|
offset_right = 47.0
|
||||||
offset_bottom = 50.0
|
offset_bottom = 50.0
|
||||||
focus_mode = 0
|
focus_mode = 0
|
||||||
mouse_default_cursor_shape = 2
|
mouse_default_cursor_shape = 2
|
||||||
@@ -124,9 +124,8 @@ text_overrun_behavior = 3
|
|||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
z_index = 1
|
z_index = 1
|
||||||
layout_mode = 0
|
layout_mode = 0
|
||||||
offset_left = 278.0
|
offset_left = -64.0
|
||||||
offset_top = 2.0
|
offset_top = 2.0
|
||||||
offset_right = 342.0
|
|
||||||
offset_bottom = 50.0
|
offset_bottom = 50.0
|
||||||
texture = ExtResource("3_q3baj")
|
texture = ExtResource("3_q3baj")
|
||||||
|
|
||||||
@@ -134,9 +133,8 @@ texture = ExtResource("3_q3baj")
|
|||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
custom_minimum_size = Vector2(23, 23)
|
custom_minimum_size = Vector2(23, 23)
|
||||||
layout_mode = 0
|
layout_mode = 0
|
||||||
offset_left = 8.0
|
offset_left = -23.0
|
||||||
offset_top = 13.0
|
offset_top = 13.0
|
||||||
offset_right = 31.0
|
|
||||||
offset_bottom = 36.0
|
offset_bottom = 36.0
|
||||||
texture = ExtResource("6_ib6pj")
|
texture = ExtResource("6_ib6pj")
|
||||||
expand_mode = 1
|
expand_mode = 1
|
||||||
@@ -146,9 +144,8 @@ unique_name_in_owner = true
|
|||||||
z_index = 2
|
z_index = 2
|
||||||
custom_minimum_size = Vector2(34, 34)
|
custom_minimum_size = Vector2(34, 34)
|
||||||
layout_mode = 0
|
layout_mode = 0
|
||||||
offset_left = 319.0
|
offset_left = -34.0
|
||||||
offset_top = 12.0
|
offset_top = 12.0
|
||||||
offset_right = 353.0
|
|
||||||
offset_bottom = 46.0
|
offset_bottom = 46.0
|
||||||
scale = Vector2(0.75, 0.75)
|
scale = Vector2(0.75, 0.75)
|
||||||
focus_mode = 0
|
focus_mode = 0
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
[gd_scene load_steps=4 format=3 uid="uid://c7yay102a3b4c"]
|
[gd_scene load_steps=5 format=3 uid="uid://c7yay102a3b4c"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://kv6ebscarj2e" path="res://Scripts/Tags/input.gd" id="1_input"]
|
[ext_resource type="Script" uid="uid://kv6ebscarj2e" path="res://Scripts/Tags/input.gd" id="1_input"]
|
||||||
[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="2_theme"]
|
[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="2_theme"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://b6c1twaog7hui" path="res://addons/DatePicker/DateButton.tscn" id="3_a88g6"]
|
||||||
|
|
||||||
[sub_resource type="ButtonGroup" id="ButtonGroup_06us3"]
|
[sub_resource type="ButtonGroup" id="ButtonGroup_06us3"]
|
||||||
|
|
||||||
@@ -21,6 +22,7 @@ size_flags_vertical = 0
|
|||||||
script = ExtResource("1_input")
|
script = ExtResource("1_input")
|
||||||
|
|
||||||
[node name="LineEdit" type="LineEdit" parent="."]
|
[node name="LineEdit" type="LineEdit" parent="."]
|
||||||
|
visible = false
|
||||||
layout_mode = 1
|
layout_mode = 1
|
||||||
offset_right = 400.0
|
offset_right = 400.0
|
||||||
offset_bottom = 35.0
|
offset_bottom = 35.0
|
||||||
@@ -48,9 +50,13 @@ button_group = SubResource("ButtonGroup_06us3")
|
|||||||
flat = true
|
flat = true
|
||||||
|
|
||||||
[node name="ColorPickerButton" type="ColorPickerButton" parent="."]
|
[node name="ColorPickerButton" type="ColorPickerButton" parent="."]
|
||||||
|
visible = false
|
||||||
layout_mode = 0
|
layout_mode = 0
|
||||||
offset_right = 83.0
|
offset_right = 83.0
|
||||||
offset_bottom = 35.0
|
offset_bottom = 35.0
|
||||||
toggle_mode = false
|
toggle_mode = false
|
||||||
|
|
||||||
|
[node name="DateButton" parent="." instance=ExtResource("3_a88g6")]
|
||||||
|
layout_mode = 0
|
||||||
|
|
||||||
[connection signal="popup_closed" from="ColorPickerButton" to="." method="_on_color_picker_popup_closed"]
|
[connection signal="popup_closed" from="ColorPickerButton" to="." method="_on_color_picker_popup_closed"]
|
||||||
|
|||||||
@@ -88,6 +88,9 @@ func _exit_tree():
|
|||||||
loading_tween = null
|
loading_tween = null
|
||||||
remove_from_group("tabs")
|
remove_from_group("tabs")
|
||||||
|
|
||||||
|
func _enter_tree() -> void:
|
||||||
|
$AnimationPlayer.play("appear")
|
||||||
|
|
||||||
func _on_button_pressed() -> void:
|
func _on_button_pressed() -> void:
|
||||||
# Check if click was on close button area
|
# Check if click was on close button area
|
||||||
var mouse_pos = get_global_mouse_position()
|
var mouse_pos = get_global_mouse_position()
|
||||||
|
|||||||
@@ -81,7 +81,6 @@ func create_tab() -> void:
|
|||||||
tab.tab_closed.connect(_tab_closed.bind(index))
|
tab.tab_closed.connect(_tab_closed.bind(index))
|
||||||
|
|
||||||
h_box_container.add_child(tab)
|
h_box_container.add_child(tab)
|
||||||
tab.animation.play("appear")
|
|
||||||
|
|
||||||
set_active_tab(index)
|
set_active_tab(index)
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ const BROWSER_TEXT: Theme = preload("res://Scenes/Styles/BrowserText.tres")
|
|||||||
var custom_hex_input: LineEdit
|
var custom_hex_input: LineEdit
|
||||||
|
|
||||||
func init(element: HTMLParser.HTMLElement) -> void:
|
func init(element: HTMLParser.HTMLElement) -> void:
|
||||||
var line_edit: LineEdit = $LineEdit
|
|
||||||
var check_box: CheckBox = $CheckBox
|
|
||||||
var radio_button: CheckBox = $RadioButton
|
|
||||||
var color_picker_button: ColorPickerButton = $ColorPickerButton
|
var color_picker_button: ColorPickerButton = $ColorPickerButton
|
||||||
var picker: ColorPicker = color_picker_button.get_picker()
|
var picker: ColorPicker = color_picker_button.get_picker()
|
||||||
|
|
||||||
@@ -54,56 +51,67 @@ func init(element: HTMLParser.HTMLElement) -> void:
|
|||||||
var maxlength = element.get_attribute("maxlength")
|
var maxlength = element.get_attribute("maxlength")
|
||||||
var pattern = element.get_attribute("pattern")
|
var pattern = element.get_attribute("pattern")
|
||||||
|
|
||||||
if input_type == "checkbox":
|
# Define which child should be active for each input type
|
||||||
if is_instance_valid(line_edit): line_edit.queue_free()
|
var active_child_map = {
|
||||||
if is_instance_valid(radio_button): radio_button.queue_free()
|
"checkbox": "CheckBox",
|
||||||
if is_instance_valid(color_picker_button): color_picker_button.queue_free()
|
"radio": "RadioButton",
|
||||||
check_box.visible = true
|
"color": "ColorPickerButton",
|
||||||
if value and value == "true": check_box.button_pressed = true
|
"password": "LineEdit",
|
||||||
custom_minimum_size = check_box.size
|
"date": "DateButton"
|
||||||
|
}
|
||||||
|
|
||||||
elif input_type == "radio":
|
var active_child_name = active_child_map.get(input_type, "LineEdit")
|
||||||
if is_instance_valid(line_edit): line_edit.queue_free()
|
remove_unused_children(active_child_name)
|
||||||
if is_instance_valid(check_box): check_box.queue_free()
|
|
||||||
if is_instance_valid(color_picker_button): color_picker_button.queue_free()
|
var active_child = get_node(active_child_name)
|
||||||
radio_button.visible = true
|
active_child.visible = true
|
||||||
radio_button.toggle_mode = true
|
custom_minimum_size = active_child.size
|
||||||
if value and value == "true": radio_button.button_pressed = true
|
|
||||||
custom_minimum_size = radio_button.size
|
match input_type:
|
||||||
|
"checkbox":
|
||||||
|
var checkbox = active_child as CheckBox
|
||||||
|
if value and value == "true":
|
||||||
|
checkbox.button_pressed = true
|
||||||
|
|
||||||
|
"radio":
|
||||||
|
var radio = active_child as CheckBox
|
||||||
|
radio.toggle_mode = true
|
||||||
|
if value and value == "true":
|
||||||
|
radio.button_pressed = true
|
||||||
|
|
||||||
if group.length() > 0:
|
if group.length() > 0:
|
||||||
if not button_groups.has(group):
|
if not button_groups.has(group):
|
||||||
button_groups[group] = ButtonGroup.new()
|
button_groups[group] = ButtonGroup.new()
|
||||||
radio_button.button_group = button_groups[group]
|
radio.button_group = button_groups[group]
|
||||||
|
|
||||||
elif input_type == "color":
|
"color":
|
||||||
if is_instance_valid(line_edit): line_edit.queue_free()
|
var color_button = active_child as ColorPickerButton
|
||||||
if is_instance_valid(check_box): check_box.queue_free()
|
|
||||||
if is_instance_valid(radio_button): radio_button.queue_free()
|
|
||||||
color_picker_button.visible = true
|
|
||||||
if value and value.length() > 0:
|
if value and value.length() > 0:
|
||||||
var color = Color.from_string(value, Color.WHITE)
|
var color = Color.from_string(value, Color.WHITE)
|
||||||
color_picker_button.color = color
|
color_button.color = color
|
||||||
custom_minimum_size = color_picker_button.size
|
|
||||||
|
|
||||||
elif input_type == "password":
|
"password":
|
||||||
if is_instance_valid(check_box): check_box.queue_free()
|
var line_edit = active_child as LineEdit
|
||||||
if is_instance_valid(radio_button): radio_button.queue_free()
|
|
||||||
if is_instance_valid(color_picker_button): color_picker_button.queue_free()
|
|
||||||
line_edit.visible = true
|
|
||||||
line_edit.secret = true
|
line_edit.secret = true
|
||||||
custom_minimum_size = line_edit.size
|
|
||||||
setup_text_input(line_edit, placeholder, value, minlength, maxlength, pattern)
|
setup_text_input(line_edit, placeholder, value, minlength, maxlength, pattern)
|
||||||
|
|
||||||
|
"date":
|
||||||
|
var date_button = active_child as DateButton
|
||||||
|
if value and value.length() > 0:
|
||||||
|
date_button.init_with_date(value)
|
||||||
else:
|
else:
|
||||||
if is_instance_valid(check_box): check_box.queue_free()
|
date_button.init()
|
||||||
if is_instance_valid(radio_button): radio_button.queue_free()
|
|
||||||
if is_instance_valid(color_picker_button): color_picker_button.queue_free()
|
_: # Default case (text input)
|
||||||
line_edit.visible = true
|
var line_edit = active_child as LineEdit
|
||||||
line_edit.secret = false
|
line_edit.secret = false
|
||||||
custom_minimum_size = line_edit.size
|
|
||||||
setup_text_input(line_edit, placeholder, value, minlength, maxlength, pattern)
|
setup_text_input(line_edit, placeholder, value, minlength, maxlength, pattern)
|
||||||
|
|
||||||
|
func remove_unused_children(keep_child_name: String) -> void:
|
||||||
|
for child in get_children():
|
||||||
|
if child.name != keep_child_name:
|
||||||
|
child.queue_free()
|
||||||
|
|
||||||
func setup_text_input(line_edit: LineEdit, placeholder: String, value: String, minlength: String, maxlength: String, pattern: String) -> void:
|
func setup_text_input(line_edit: LineEdit, placeholder: String, value: String, minlength: String, maxlength: String, pattern: String) -> void:
|
||||||
if placeholder: line_edit.placeholder_text = placeholder
|
if placeholder: line_edit.placeholder_text = placeholder
|
||||||
if value: line_edit.text = value
|
if value: line_edit.text = value
|
||||||
|
|||||||
@@ -92,6 +92,8 @@ line breaks
|
|||||||
|
|
||||||
<h2>Color</h2>
|
<h2>Color</h2>
|
||||||
<input type=\"color\" value=\"#ff0000\" />
|
<input type=\"color\" value=\"#ff0000\" />
|
||||||
|
<h2>Date</h2>
|
||||||
|
<input type=\"date\" value=\"2018-07-22\" />
|
||||||
|
|
||||||
<input type=\"password\" placeholder=\"your password...\" />
|
<input type=\"password\" placeholder=\"your password...\" />
|
||||||
<button type=\"submit\">Submit</button>
|
<button type=\"submit\">Submit</button>
|
||||||
@@ -104,7 +106,6 @@ line breaks
|
|||||||
<separator direction=\"vertical\" />
|
<separator direction=\"vertical\" />
|
||||||
</body>".to_utf8_buffer()
|
</body>".to_utf8_buffer()
|
||||||
|
|
||||||
# Create parser and parse
|
|
||||||
var parser: HTMLParser = HTMLParser.new(html_bytes)
|
var parser: HTMLParser = HTMLParser.new(html_bytes)
|
||||||
var parse_result = parser.parse()
|
var parse_result = parser.parse()
|
||||||
|
|
||||||
@@ -113,7 +114,6 @@ line breaks
|
|||||||
if parse_result.errors.size() > 0:
|
if parse_result.errors.size() > 0:
|
||||||
print("Parse errors: " + str(parse_result.errors))
|
print("Parse errors: " + str(parse_result.errors))
|
||||||
|
|
||||||
# TODO: render the shit on the screen
|
|
||||||
var tab = tab_container.tabs[tab_container.active_tab]
|
var tab = tab_container.tabs[tab_container.active_tab]
|
||||||
|
|
||||||
var title = parser.get_title()
|
var title = parser.get_title()
|
||||||
|
|||||||
1
addons/DatePicker/Calendar.cs.uid
Normal file
1
addons/DatePicker/Calendar.cs.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://c134lf0pxabrf
|
||||||
95
addons/DatePicker/Calendar.gd
Normal file
95
addons/DatePicker/Calendar.gd
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
class_name Calendar
|
||||||
|
extends PopupPanel
|
||||||
|
|
||||||
|
@export var header: Button
|
||||||
|
@export var next: BaseButton
|
||||||
|
@export var previous: BaseButton
|
||||||
|
@export var view_parent: Control
|
||||||
|
|
||||||
|
@export var month_view: MonthView
|
||||||
|
@export var year_view: YearView
|
||||||
|
|
||||||
|
var margin: float = 16.0
|
||||||
|
|
||||||
|
var view: Node:
|
||||||
|
get:
|
||||||
|
return view_parent.get_child(0) if view_parent.get_child_count() > 0 else null
|
||||||
|
|
||||||
|
var _date_time: Dictionary = Time.get_datetime_dict_from_system()
|
||||||
|
## The date that the calendar is currently displaying.
|
||||||
|
var date_time: Dictionary:
|
||||||
|
get:
|
||||||
|
return _date_time
|
||||||
|
set(value):
|
||||||
|
_date_time = value
|
||||||
|
date_changed.emit()
|
||||||
|
|
||||||
|
var _selected: Dictionary = Time.get_datetime_dict_from_system()
|
||||||
|
## The date that the user has selected.
|
||||||
|
var selected: Dictionary:
|
||||||
|
get:
|
||||||
|
return _selected
|
||||||
|
set(value):
|
||||||
|
_selected = value
|
||||||
|
date_selected.emit()
|
||||||
|
|
||||||
|
## The earliest date that can be selected.
|
||||||
|
var lower_limit: Dictionary
|
||||||
|
## The latest date that can be selected.
|
||||||
|
var upper_limit: Dictionary
|
||||||
|
## The button that displays this calendar - can be null.
|
||||||
|
var calendar_button: Button
|
||||||
|
|
||||||
|
## The signal emitted when the view changes.
|
||||||
|
signal view_changed(view: Control)
|
||||||
|
## The signal emitted when the date changes.
|
||||||
|
signal date_changed()
|
||||||
|
## The signal emitted when the user selects a date in ANY view.
|
||||||
|
signal date_selected()
|
||||||
|
## The signal emitted when the user is finished selecting a date.
|
||||||
|
signal finished()
|
||||||
|
|
||||||
|
func init():
|
||||||
|
header.text = "%s %s" % [MonthView.num_to_month(date_time.month), date_time.year]
|
||||||
|
|
||||||
|
header.pressed.connect(_on_header_pressed)
|
||||||
|
previous.pressed.connect(func(): if view: view.previous())
|
||||||
|
next.pressed.connect(func(): if view: view.next())
|
||||||
|
|
||||||
|
year_view.init()
|
||||||
|
|
||||||
|
func _enter_tree():
|
||||||
|
get_tree().root.gui_focus_changed.connect(_on_gui_focus_changed)
|
||||||
|
|
||||||
|
func _exit_tree():
|
||||||
|
if get_tree() and get_tree().root:
|
||||||
|
get_tree().root.gui_focus_changed.disconnect(_on_gui_focus_changed)
|
||||||
|
|
||||||
|
func _on_header_pressed():
|
||||||
|
var is_default = month_view.visible
|
||||||
|
if is_default:
|
||||||
|
month_view.hide()
|
||||||
|
year_view.show()
|
||||||
|
else:
|
||||||
|
month_view.show()
|
||||||
|
year_view.hide()
|
||||||
|
|
||||||
|
func _on_gui_focus_changed(focus: Control):
|
||||||
|
if focus and not is_ancestor_of(focus) and not focus is DateButton:
|
||||||
|
visible = false
|
||||||
|
|
||||||
|
func set_view(new_view: Node):
|
||||||
|
if view:
|
||||||
|
view.queue_free()
|
||||||
|
new_view.calendar = self
|
||||||
|
view_parent.add_child(new_view)
|
||||||
|
view_changed.emit(new_view)
|
||||||
|
|
||||||
|
func _gui_input(event: InputEvent):
|
||||||
|
if event is InputEventMouseButton:
|
||||||
|
var mb = event as InputEventMouseButton
|
||||||
|
if mb.pressed:
|
||||||
|
if mb.button_index == MOUSE_BUTTON_WHEEL_DOWN and view:
|
||||||
|
view.next()
|
||||||
|
elif mb.button_index == MOUSE_BUTTON_WHEEL_UP and view:
|
||||||
|
view.previous()
|
||||||
1
addons/DatePicker/Calendar.gd.uid
Normal file
1
addons/DatePicker/Calendar.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://bh27iqijrabku
|
||||||
88
addons/DatePicker/Calendar.tscn
Normal file
88
addons/DatePicker/Calendar.tscn
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
[gd_scene load_steps=14 format=3 uid="uid://dgn7djiy1xhlu"]
|
||||||
|
|
||||||
|
[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="1_1ddb1"]
|
||||||
|
[ext_resource type="Script" uid="uid://bh27iqijrabku" path="res://addons/DatePicker/Calendar.gd" id="1_heut6"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://d1jslyy8aajcn" path="res://Assets/Icons/arrow-up.svg" id="3_1ddb1"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://df1m4j7uxi63v" path="res://Assets/Icons/chevron-down.svg" id="3_rjgii"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://c1bqnfwurnnrc" path="res://Assets/Icons/arrow-down.svg" id="4_rjgii"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://n5ra5w5aupx7" path="res://addons/DatePicker/YearView.tscn" id="5_qmkbm"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://hiv2ckjbs43p" path="res://addons/DatePicker/MonthView.tscn" id="6_rjgii"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_w2pln"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_s0l8g"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mavvk"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j0d5i"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1e668"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5m4sc"]
|
||||||
|
|
||||||
|
[node name="Calendar" type="PopupPanel" node_paths=PackedStringArray("header", "next", "previous", "view_parent", "month_view", "year_view")]
|
||||||
|
size = Vector2i(263, 308)
|
||||||
|
visible = true
|
||||||
|
theme = ExtResource("1_1ddb1")
|
||||||
|
script = ExtResource("1_heut6")
|
||||||
|
header = NodePath("VboxContainer/HeaderContainer/HeaderButton")
|
||||||
|
next = NodePath("VboxContainer/HeaderContainer/Next")
|
||||||
|
previous = NodePath("VboxContainer/HeaderContainer/Previous")
|
||||||
|
view_parent = NodePath("VboxContainer/View")
|
||||||
|
month_view = NodePath("VboxContainer/View/MonthView")
|
||||||
|
year_view = NodePath("VboxContainer/View/YearView")
|
||||||
|
|
||||||
|
[node name="VboxContainer" type="VBoxContainer" parent="."]
|
||||||
|
offset_left = 15.0
|
||||||
|
offset_top = 15.0
|
||||||
|
offset_right = 248.0
|
||||||
|
offset_bottom = 293.0
|
||||||
|
theme_override_constants/separation = 12
|
||||||
|
|
||||||
|
[node name="HeaderContainer" type="HBoxContainer" parent="VboxContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
|
||||||
|
[node name="HeaderButton" type="Button" parent="VboxContainer/HeaderContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 0
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_w2pln")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxEmpty_s0l8g")
|
||||||
|
text = "July 1980"
|
||||||
|
icon = ExtResource("3_rjgii")
|
||||||
|
flat = true
|
||||||
|
alignment = 0
|
||||||
|
icon_alignment = 2
|
||||||
|
|
||||||
|
[node name="Spacer" type="Control" parent="VboxContainer/HeaderContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
|
||||||
|
[node name="Previous" type="Button" parent="VboxContainer/HeaderContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_mavvk")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxEmpty_j0d5i")
|
||||||
|
icon = ExtResource("3_1ddb1")
|
||||||
|
flat = true
|
||||||
|
|
||||||
|
[node name="Next" type="Button" parent="VboxContainer/HeaderContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_1e668")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxEmpty_5m4sc")
|
||||||
|
icon = ExtResource("4_rjgii")
|
||||||
|
flat = true
|
||||||
|
|
||||||
|
[node name="View" type="Control" parent="VboxContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_vertical = 3
|
||||||
|
|
||||||
|
[node name="MonthView" parent="VboxContainer/View" node_paths=PackedStringArray("calendar") instance=ExtResource("6_rjgii")]
|
||||||
|
layout_mode = 0
|
||||||
|
calendar = NodePath("../../..")
|
||||||
|
|
||||||
|
[node name="YearView" parent="VboxContainer/View" node_paths=PackedStringArray("calendar") instance=ExtResource("5_qmkbm")]
|
||||||
|
visible = false
|
||||||
|
layout_mode = 0
|
||||||
|
calendar = NodePath("../../..")
|
||||||
4
addons/DatePicker/CalendarGroup.tres
Normal file
4
addons/DatePicker/CalendarGroup.tres
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
[gd_resource type="ButtonGroup" format=3 uid="uid://bqxxq56yxl44h"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
allow_unpress = true
|
||||||
1
addons/DatePicker/DateButton.cs.uid
Normal file
1
addons/DatePicker/DateButton.cs.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://ds2esqjkjc4h0
|
||||||
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()
|
||||||
1
addons/DatePicker/DateButton.gd.uid
Normal file
1
addons/DatePicker/DateButton.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://do548vwv7m0rq
|
||||||
33
addons/DatePicker/DateButton.tscn
Normal file
33
addons/DatePicker/DateButton.tscn
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
[gd_scene load_steps=6 format=3 uid="uid://b6c1twaog7hui"]
|
||||||
|
|
||||||
|
[ext_resource type="Texture2D" uid="uid://mol3s1ujp0k2" path="res://Assets/Icons/calendar_16x16.svg" id="1_ef33s"]
|
||||||
|
[ext_resource type="Script" uid="uid://do548vwv7m0rq" path="res://addons/DatePicker/DateButton.gd" id="1_sskq5"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ef33s"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ufs0o"]
|
||||||
|
content_margin_left = 4.0
|
||||||
|
bg_color = Color(0.105882, 0.105882, 0.105882, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pnupr"]
|
||||||
|
content_margin_left = 4.0
|
||||||
|
bg_color = Color(0.105882, 0.105882, 0.105882, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[node name="DateButton" type="Button"]
|
||||||
|
offset_right = 115.0
|
||||||
|
offset_bottom = 34.0
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_ef33s")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_ufs0o")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_pnupr")
|
||||||
|
action_mode = 0
|
||||||
|
text = "3/13/2025"
|
||||||
|
icon = ExtResource("1_ef33s")
|
||||||
|
script = ExtResource("1_sskq5")
|
||||||
1
addons/DatePicker/ICalendarView.cs.uid
Normal file
1
addons/DatePicker/ICalendarView.cs.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://crwtb840n4orl
|
||||||
19
addons/DatePicker/ICalendarView.gd
Normal file
19
addons/DatePicker/ICalendarView.gd
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
class_name ICalendarView
|
||||||
|
extends RefCounted
|
||||||
|
|
||||||
|
## A view that dictates how a calendar should be displayed (i.e. MonthView or YearView).
|
||||||
|
|
||||||
|
## The calendar that this view is a part of.
|
||||||
|
var calendar: Calendar
|
||||||
|
|
||||||
|
## When the user clicks the previous button (i.e. go to the previous year).
|
||||||
|
func previous():
|
||||||
|
pass
|
||||||
|
|
||||||
|
## When the user clicks the next button (i.e. go to the next year).
|
||||||
|
func next():
|
||||||
|
pass
|
||||||
|
|
||||||
|
## Update the view to reflect the selected date.
|
||||||
|
func refresh():
|
||||||
|
pass
|
||||||
1
addons/DatePicker/ICalendarView.gd.uid
Normal file
1
addons/DatePicker/ICalendarView.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://lxw1ab33fva2
|
||||||
21
addons/DatePicker/LICENSE.md
Normal file
21
addons/DatePicker/LICENSE.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Christopher Charbonneau
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
1
addons/DatePicker/MonthView.cs.uid
Normal file
1
addons/DatePicker/MonthView.cs.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://bc88158gaxg4f
|
||||||
146
addons/DatePicker/MonthView.gd
Normal file
146
addons/DatePicker/MonthView.gd
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
class_name MonthView
|
||||||
|
extends VBoxContainer
|
||||||
|
|
||||||
|
@export var calendar: Calendar
|
||||||
|
|
||||||
|
var buttons: GridContainer
|
||||||
|
var dates: Array = []
|
||||||
|
var _updating: bool = false
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
buttons = $Days
|
||||||
|
for i in range(buttons.get_child_count()):
|
||||||
|
buttons.get_child(i).toggled.connect(_on_day_toggled.bind(i))
|
||||||
|
refresh()
|
||||||
|
|
||||||
|
func _on_day_toggled(toggled: bool, button_index: int):
|
||||||
|
if _updating or button_index >= dates.size() or not dates[button_index]:
|
||||||
|
return
|
||||||
|
|
||||||
|
var button = buttons.get_child(button_index)
|
||||||
|
if not toggled:
|
||||||
|
button.set_pressed_no_signal(true)
|
||||||
|
return
|
||||||
|
|
||||||
|
for i in range(buttons.get_child_count()):
|
||||||
|
if i != button_index:
|
||||||
|
buttons.get_child(i).set_pressed_no_signal(false)
|
||||||
|
|
||||||
|
calendar.selected = dates[button_index]
|
||||||
|
calendar.date_time = dates[button_index].duplicate()
|
||||||
|
calendar.hide()
|
||||||
|
calendar.finished.emit()
|
||||||
|
|
||||||
|
func previous():
|
||||||
|
var new_date = calendar.date_time.duplicate()
|
||||||
|
new_date.month -= 1
|
||||||
|
if new_date.month < 1:
|
||||||
|
new_date.month = 12
|
||||||
|
new_date.year -= 1
|
||||||
|
calendar.date_time = new_date
|
||||||
|
refresh()
|
||||||
|
|
||||||
|
func next():
|
||||||
|
var new_date = calendar.date_time.duplicate()
|
||||||
|
new_date.month += 1
|
||||||
|
if new_date.month > 12:
|
||||||
|
new_date.month = 1
|
||||||
|
new_date.year += 1
|
||||||
|
calendar.date_time = new_date
|
||||||
|
refresh()
|
||||||
|
|
||||||
|
func refresh():
|
||||||
|
_updating = true
|
||||||
|
calendar.header.text = "%s %s" % [num_to_month(calendar.date_time.month), calendar.date_time.year]
|
||||||
|
dates.clear()
|
||||||
|
dates.resize(buttons.get_child_count())
|
||||||
|
|
||||||
|
for i in range(buttons.get_child_count()):
|
||||||
|
var button = buttons.get_child(i)
|
||||||
|
button.text = ""
|
||||||
|
button.set_pressed_no_signal(false)
|
||||||
|
dates[i] = null
|
||||||
|
|
||||||
|
var first_day = calendar.date_time.duplicate()
|
||||||
|
first_day.day = 1
|
||||||
|
var start_day = Time.get_datetime_dict_from_unix_time(
|
||||||
|
Time.get_unix_time_from_datetime_dict(first_day)
|
||||||
|
).weekday % 7
|
||||||
|
|
||||||
|
var days_in_month = get_days_in_month(calendar.date_time.year, calendar.date_time.month)
|
||||||
|
|
||||||
|
var prev_month_num = calendar.date_time.month - 1
|
||||||
|
var prev_year = calendar.date_time.year
|
||||||
|
if prev_month_num < 1:
|
||||||
|
prev_month_num = 12
|
||||||
|
prev_year -= 1
|
||||||
|
var prev_days = get_days_in_month(prev_year, prev_month_num)
|
||||||
|
|
||||||
|
var gray_color = Color(0.51, 0.54, 0.596)
|
||||||
|
var dark_color = Color(0.133, 0.137, 0.137)
|
||||||
|
|
||||||
|
# Fill previous month days
|
||||||
|
for i in range(start_day):
|
||||||
|
var day = prev_days - start_day + i + 1
|
||||||
|
var button = buttons.get_child(i)
|
||||||
|
dates[i] = {"year": prev_year, "month": prev_month_num, "day": day}
|
||||||
|
button.text = str(day)
|
||||||
|
button.add_theme_color_override("font_color", gray_color)
|
||||||
|
button.add_theme_color_override("font_hover_color", gray_color)
|
||||||
|
button.set_pressed_no_signal(
|
||||||
|
day == calendar.selected.day and
|
||||||
|
calendar.selected.year == prev_year and
|
||||||
|
calendar.selected.month == prev_month_num
|
||||||
|
)
|
||||||
|
|
||||||
|
# Fill current month days
|
||||||
|
for i in range(days_in_month):
|
||||||
|
var button = buttons.get_child(i + start_day)
|
||||||
|
dates[i + start_day] = {"year": calendar.date_time.year, "month": calendar.date_time.month, "day": i + 1}
|
||||||
|
button.text = str(i + 1)
|
||||||
|
button.add_theme_color_override("font_color", dark_color)
|
||||||
|
button.add_theme_color_override("font_hover_color", dark_color)
|
||||||
|
button.set_pressed_no_signal(
|
||||||
|
i + 1 == calendar.selected.day and
|
||||||
|
calendar.selected.year == calendar.date_time.year and
|
||||||
|
calendar.selected.month == calendar.date_time.month
|
||||||
|
)
|
||||||
|
|
||||||
|
var next_month_num = calendar.date_time.month + 1
|
||||||
|
var next_year = calendar.date_time.year
|
||||||
|
if next_month_num > 12:
|
||||||
|
next_month_num = 1
|
||||||
|
next_year += 1
|
||||||
|
|
||||||
|
# Fill next month days
|
||||||
|
for i in range(days_in_month + start_day, buttons.get_child_count()):
|
||||||
|
var day = i + 1 - days_in_month - start_day
|
||||||
|
var button = buttons.get_child(i)
|
||||||
|
dates[i] = {"year": next_year, "month": next_month_num, "day": day}
|
||||||
|
button.text = str(day)
|
||||||
|
button.add_theme_color_override("font_color", gray_color)
|
||||||
|
button.add_theme_color_override("font_hover_color", gray_color)
|
||||||
|
button.set_pressed_no_signal(
|
||||||
|
day == calendar.selected.day and
|
||||||
|
calendar.selected.year == next_year and
|
||||||
|
calendar.selected.month == next_month_num
|
||||||
|
)
|
||||||
|
|
||||||
|
_updating = false
|
||||||
|
|
||||||
|
func get_days_in_month(year: int, month: int) -> int:
|
||||||
|
var thirty_one = [1, 3, 5, 7, 8, 10, 12]
|
||||||
|
var thirty = [4, 6, 9, 11]
|
||||||
|
|
||||||
|
if month in thirty_one:
|
||||||
|
return 31
|
||||||
|
elif month in thirty:
|
||||||
|
return 30
|
||||||
|
elif month == 2:
|
||||||
|
return 29 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) else 28
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
static func num_to_month(month: int) -> String:
|
||||||
|
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
||||||
|
return months[month - 1]
|
||||||
1
addons/DatePicker/MonthView.gd.uid
Normal file
1
addons/DatePicker/MonthView.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://drxqmka0n1ntw
|
||||||
642
addons/DatePicker/MonthView.tscn
Normal file
642
addons/DatePicker/MonthView.tscn
Normal file
@@ -0,0 +1,642 @@
|
|||||||
|
[gd_scene load_steps=7 format=3 uid="uid://hiv2ckjbs43p"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://drxqmka0n1ntw" path="res://addons/DatePicker/MonthView.gd" id="1_iouni"]
|
||||||
|
[ext_resource type="ButtonGroup" uid="uid://bqxxq56yxl44h" path="res://addons/DatePicker/CalendarGroup.tres" id="2_nfkp2"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5l1mp"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5l1mp"]
|
||||||
|
bg_color = Color(0.613675, 0.748845, 0.957838, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pressed"]
|
||||||
|
bg_color = Color(0.247059, 0.466667, 0.807843, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ochoi"]
|
||||||
|
bg_color = Color(1, 1, 1, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[node name="MonthView" type="VBoxContainer"]
|
||||||
|
offset_right = 234.0
|
||||||
|
offset_bottom = 240.0
|
||||||
|
script = ExtResource("1_iouni")
|
||||||
|
|
||||||
|
[node name="DayOfWeek" type="GridContainer" parent="."]
|
||||||
|
layout_mode = 2
|
||||||
|
columns = 7
|
||||||
|
|
||||||
|
[node name="Sunday" type="Label" parent="DayOfWeek"]
|
||||||
|
custom_minimum_size = Vector2(0, 36)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "Su"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Monday" type="Label" parent="DayOfWeek"]
|
||||||
|
custom_minimum_size = Vector2(0, 36)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "Mo"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Tuesday" type="Label" parent="DayOfWeek"]
|
||||||
|
custom_minimum_size = Vector2(0, 36)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "Tu"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Wednesday" type="Label" parent="DayOfWeek"]
|
||||||
|
custom_minimum_size = Vector2(0, 36)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "We"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Thursday" type="Label" parent="DayOfWeek"]
|
||||||
|
custom_minimum_size = Vector2(0, 36)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "Th"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Friday" type="Label" parent="DayOfWeek"]
|
||||||
|
custom_minimum_size = Vector2(0, 36)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "Fr"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Saturday" type="Label" parent="DayOfWeek"]
|
||||||
|
custom_minimum_size = Vector2(0, 36)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
text = "Sa"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
|
||||||
|
[node name="Days" type="GridContainer" parent="."]
|
||||||
|
layout_mode = 2
|
||||||
|
columns = 7
|
||||||
|
|
||||||
|
[node name="Button0" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button1" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button2" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button3" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button4" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button5" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button6" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button7" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button8" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button9" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button10" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button11" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button12" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button13" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button14" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button15" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button16" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button17" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button18" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button19" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button20" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button21" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button22" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button23" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button24" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button25" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button26" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button27" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button28" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button29" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button30" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button31" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button32" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button33" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button34" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button35" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button36" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button37" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button38" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button39" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button40" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
|
|
||||||
|
[node name="Button41" type="Button" parent="Days"]
|
||||||
|
custom_minimum_size = Vector2(30, 30)
|
||||||
|
layout_mode = 2
|
||||||
|
mouse_default_cursor_shape = 2
|
||||||
|
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_nfkp2")
|
||||||
4
addons/DatePicker/README.md
Normal file
4
addons/DatePicker/README.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
This is a heavily modified version of **DatePicker** by [chrisizeful](https://github.com/chrisizeful/)
|
||||||
|
|
||||||
|
- GitHub: https://github.com/chrisizeful/DatePicker
|
||||||
|
- Godot Asset: https://godotengine.org/asset-library/asset/3835
|
||||||
1
addons/DatePicker/YearView.cs.uid
Normal file
1
addons/DatePicker/YearView.cs.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://b5qslpdcfyikx
|
||||||
92
addons/DatePicker/YearView.gd
Normal file
92
addons/DatePicker/YearView.gd
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
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 = $SmoothScrollContainer
|
||||||
|
|
||||||
|
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)
|
||||||
1
addons/DatePicker/YearView.gd.uid
Normal file
1
addons/DatePicker/YearView.gd.uid
Normal file
@@ -0,0 +1 @@
|
|||||||
|
uid://c8nfr825g08sy
|
||||||
82
addons/DatePicker/YearView.tscn
Normal file
82
addons/DatePicker/YearView.tscn
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
[gd_scene load_steps=11 format=3 uid="uid://n5ra5w5aupx7"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://c8nfr825g08sy" path="res://addons/DatePicker/YearView.gd" id="1_hiiks"]
|
||||||
|
[ext_resource type="Script" uid="uid://bgqglerkcylxx" path="res://addons/SmoothScroll/SmoothScrollContainer.gd" id="1_sw7yn"]
|
||||||
|
[ext_resource type="ButtonGroup" uid="uid://bqxxq56yxl44h" path="res://addons/DatePicker/CalendarGroup.tres" id="2_2qddy"]
|
||||||
|
[ext_resource type="Script" uid="uid://b7h0k2h2qwlqv" path="res://addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd" id="2_iofl3"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_wpifq"]
|
||||||
|
script = ExtResource("2_iofl3")
|
||||||
|
friction = 4.0
|
||||||
|
minimum_velocity = 0.4
|
||||||
|
rebound_strength = 7.0
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_kdl71"]
|
||||||
|
script = ExtResource("2_iofl3")
|
||||||
|
friction = 4.0
|
||||||
|
minimum_velocity = 0.4
|
||||||
|
rebound_strength = 7.0
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_iofl3"]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kdl71"]
|
||||||
|
content_margin_left = 8.0
|
||||||
|
bg_color = Color(0.168627, 0.168627, 0.168627, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pressed"]
|
||||||
|
content_margin_left = 8.0
|
||||||
|
bg_color = Color(0.247059, 0.466667, 0.807843, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wpifq"]
|
||||||
|
content_margin_left = 8.0
|
||||||
|
bg_color = Color(0.105882, 0.105882, 0.105882, 1)
|
||||||
|
corner_radius_top_left = 4
|
||||||
|
corner_radius_top_right = 4
|
||||||
|
corner_radius_bottom_right = 4
|
||||||
|
corner_radius_bottom_left = 4
|
||||||
|
|
||||||
|
[node name="YearView" type="HBoxContainer"]
|
||||||
|
script = ExtResource("1_hiiks")
|
||||||
|
|
||||||
|
[node name="SmoothScrollContainer" type="ScrollContainer" parent="."]
|
||||||
|
custom_minimum_size = Vector2(234, 240)
|
||||||
|
layout_mode = 2
|
||||||
|
script = ExtResource("1_sw7yn")
|
||||||
|
wheel_scroll_damper = SubResource("Resource_wpifq")
|
||||||
|
dragging_scroll_damper = SubResource("Resource_kdl71")
|
||||||
|
drag_with_mouse = false
|
||||||
|
allow_overdragging = false
|
||||||
|
metadata/_custom_type_script = "uid://bgqglerkcylxx"
|
||||||
|
|
||||||
|
[node name="YearContainer" type="VBoxContainer" parent="SmoothScrollContainer"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
custom_minimum_size = Vector2(234, 240)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 4
|
||||||
|
size_flags_vertical = 4
|
||||||
|
|
||||||
|
[node name="Button" type="Button" parent="SmoothScrollContainer/YearContainer"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
custom_minimum_size = Vector2(34, 5)
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
size_flags_vertical = 3
|
||||||
|
mouse_filter = 1
|
||||||
|
theme_override_colors/font_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||||
|
theme_override_styles/focus = SubResource("StyleBoxEmpty_iofl3")
|
||||||
|
theme_override_styles/hover = SubResource("StyleBoxFlat_kdl71")
|
||||||
|
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||||
|
theme_override_styles/normal = SubResource("StyleBoxFlat_wpifq")
|
||||||
|
toggle_mode = true
|
||||||
|
button_group = ExtResource("2_2qddy")
|
||||||
|
text = "2025"
|
||||||
|
alignment = 0
|
||||||
7
addons/DatePicker/plugin.cfg
Normal file
7
addons/DatePicker/plugin.cfg
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[plugin]
|
||||||
|
|
||||||
|
name="DatePicker"
|
||||||
|
description="A themed Godot calendar addon inspiried by the Windows 11 calendar."
|
||||||
|
author="Chris Charbonneau"
|
||||||
|
version="1.0.0"
|
||||||
|
script=""
|
||||||
@@ -28,7 +28,7 @@ window/stretch/aspect="ignore"
|
|||||||
|
|
||||||
[editor_plugins]
|
[editor_plugins]
|
||||||
|
|
||||||
enabled=PackedStringArray("res://addons/SmoothScroll/plugin.cfg")
|
enabled=PackedStringArray("res://addons/DatePicker/plugin.cfg", "res://addons/SmoothScroll/plugin.cfg")
|
||||||
|
|
||||||
[file_customization]
|
[file_customization]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user