move wayfinder files to Flumi folder

This commit is contained in:
Face
2025-08-02 14:18:14 +03:00
parent 8fbabdd01a
commit e575974721
442 changed files with 6 additions and 188 deletions

View File

@@ -0,0 +1 @@
uid://c134lf0pxabrf

View 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()

View File

@@ -0,0 +1 @@
uid://bh27iqijrabku

View 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("../../..")

View File

@@ -0,0 +1,4 @@
[gd_resource type="ButtonGroup" format=3 uid="uid://bqxxq56yxl44h"]
[resource]
allow_unpress = true

View File

@@ -0,0 +1 @@
uid://ds2esqjkjc4h0

View 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()

View File

@@ -0,0 +1 @@
uid://do548vwv7m0rq

View 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")

View File

@@ -0,0 +1 @@
uid://crwtb840n4orl

View 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

View File

@@ -0,0 +1 @@
uid://lxw1ab33fva2

View 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.

View File

@@ -0,0 +1 @@
uid://bc88158gaxg4f

View 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]

View File

@@ -0,0 +1 @@
uid://drxqmka0n1ntw

View 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")

View 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

View File

@@ -0,0 +1 @@
uid://b5qslpdcfyikx

View 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)

View File

@@ -0,0 +1 @@
uid://c8nfr825g08sy

View 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

View 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=""

View File

@@ -0,0 +1,916 @@
## Smooth scroll functionality for ScrollContainer
##
## Applies velocity based momentum and "overdrag"
## functionality to a ScrollContainer
@tool
extends ScrollContainer
class_name SmoothScrollContainer
@export_group("Mouse Wheel")
## Drag impact for one scroll input
@export_range(0, 10, 0.01, "or_greater", "hide_slider")
var speed := 1000.0
## ScrollDamper for wheel scrolling
@export
var wheel_scroll_damper: ScrollDamper = ExpoScrollDamper.new()
@export_group("Dragging")
## ScrollDamper for dragging
@export
var dragging_scroll_damper: ScrollDamper = ExpoScrollDamper.new()
### Allow dragging with mouse or not
@export
var drag_with_mouse := true
## Allow dragging with touch or not
@export
var drag_with_touch := true
@export_group("Container")
## Below this value, snap content to boundary
@export
var just_snap_under := 0.4
## Margin of the currently focused element
@export_range(0, 50)
var follow_focus_margin := 20
## Makes the container scrollable vertically
@export
var allow_vertical_scroll := true
## Makes the container scrollable horizontally
@export
var allow_horizontal_scroll := true
## Makes the container only scrollable where the content has overflow
@export
var auto_allow_scroll := true
## Whether the content of this container should be allowed to overshoot at the ends
## before interpolating back to its bounds
@export
var allow_overdragging := true
@export_group("Scroll Bar")
## Hides scrollbar as long as not hovered or interacted with
@export
var hide_scrollbar_over_time := false:
set(val): hide_scrollbar_over_time = _set_hide_scrollbar_over_time(val)
## Time after scrollbar starts to fade out when 'hide_scrollbar_over_time' is true
@export
var scrollbar_hide_time := 5.0
## Fadein time for scrollbar when 'hide_scrollbar_over_time' is true
@export
var scrollbar_fade_in_time := 0.2
## Fadeout time for scrollbar when 'hide_scrollbar_over_time' is true
@export
var scrollbar_fade_out_time := 0.5
@export_group("Input")
## If true sets the input event as handled with set_input_as_handled()
@export
var handle_input := true
@export_group("Debug")
## Adds debug information
@export
var debug_mode := false
## Current velocity of the `content_node`
var velocity := Vector2(0,0)
## Control node to move when scrolling
var content_node: Control
## Current position of `content_node`
var pos := Vector2(0, 0)
## Current ScrollDamper to use, recording to last input type
var scroll_damper: ScrollDamper
## When true, `content_node`'s position is only set by dragging the h scroll bar
var h_scrollbar_dragging := false
## When true, `content_node`'s position is only set by dragging the v scroll bar
var v_scrollbar_dragging := false
## When ture, `content_node` follows drag position
var content_dragging := false
## When ture, `content_node` has moved by dragging
var content_dragging_moved := false
## Timer for hiding scroll bar
var scrollbar_hide_timer := Timer.new()
## Tween for showing scroll bar
var scrollbar_show_tween: Tween
## Tween for hiding scroll bar
var scrollbar_hide_tween: Tween
## Tween for scroll x to
var scroll_x_to_tween: Tween
## Tween for scroll y to
var scroll_y_to_tween: Tween
## [0,1] Mouse or touch's relative movement accumulation when overdrag[br]
## [2,3] Position where dragging starts[br]
## [4,5,6,7] Left_distance, right_distance, top_distance, bottom_distance
var drag_temp_data := []
## Whether touch point is in deadzone.
var is_in_deadzone := false
## Whether mouse is on h or v scroll bar
var mouse_on_scrollbar := false
## If content is being scrolled
var is_scrolling := false:
set(val):
if is_scrolling != val:
if val:
emit_signal("scroll_started")
else:
emit_signal("scroll_ended")
is_scrolling = val
## Last type of input used to scroll
enum SCROLL_TYPE {WHEEL, BAR, DRAG}
var last_scroll_type: SCROLL_TYPE
#region Virtual Functions
func _ready() -> void:
if debug_mode:
setup_debug_drawing()
# Initialize variables
scroll_damper = wheel_scroll_damper
get_v_scroll_bar().gui_input.connect(_scrollbar_input.bind(true))
get_h_scroll_bar().gui_input.connect(_scrollbar_input.bind(false))
get_v_scroll_bar().mouse_entered.connect(_mouse_on_scroll_bar.bind(true))
get_v_scroll_bar().mouse_exited.connect(_mouse_on_scroll_bar.bind(false))
get_h_scroll_bar().mouse_entered.connect(_mouse_on_scroll_bar.bind(true))
get_h_scroll_bar().mouse_exited.connect(_mouse_on_scroll_bar.bind(false))
get_viewport().gui_focus_changed.connect(_on_focus_changed)
for c in get_children():
if not c is ScrollBar:
content_node = c
add_child(scrollbar_hide_timer)
scrollbar_hide_timer.one_shot = true
scrollbar_hide_timer.timeout.connect(_scrollbar_hide_timer_timeout)
if hide_scrollbar_over_time:
scrollbar_hide_timer.start(scrollbar_hide_time)
get_tree().node_added.connect(_on_node_added)
func _process(delta: float) -> void:
if Engine.is_editor_hint(): return
scroll(true, velocity.y, pos.y, delta)
scroll(false, velocity.x, pos.x, delta)
update_scrollbars()
update_is_scrolling()
if debug_mode:
queue_redraw()
# Detecting mouse entering and exiting scroll bar
func _mouse_on_scroll_bar(entered: bool) -> void:
mouse_on_scrollbar = entered
# Forwarding scroll inputs from scrollbar
func _scrollbar_input(event: InputEvent, vertical: bool) -> void:
if event is InputEventMouseButton:
if event.button_index == MOUSE_BUTTON_WHEEL_DOWN\
or event.button_index == MOUSE_BUTTON_WHEEL_UP\
or event.button_index == MOUSE_BUTTON_WHEEL_LEFT\
or event.button_index == MOUSE_BUTTON_WHEEL_RIGHT:
_gui_input(event)
if event.button_index == MOUSE_BUTTON_LEFT:
if event.pressed:
if vertical:
v_scrollbar_dragging = true
last_scroll_type = SCROLL_TYPE.BAR
kill_scroll_to_tweens()
else:
h_scrollbar_dragging = true
last_scroll_type = SCROLL_TYPE.BAR
kill_scroll_to_tweens()
else:
if vertical:
v_scrollbar_dragging = false
else:
h_scrollbar_dragging = false
if event is InputEventScreenTouch:
if event.pressed:
if vertical:
v_scrollbar_dragging = true
last_scroll_type = SCROLL_TYPE.BAR
kill_scroll_to_tweens()
else:
h_scrollbar_dragging = true
last_scroll_type = SCROLL_TYPE.BAR
kill_scroll_to_tweens()
else:
if vertical:
v_scrollbar_dragging = false
else:
h_scrollbar_dragging = false
func _gui_input(event: InputEvent) -> void:
# Show scroll bars when mouse moves
if hide_scrollbar_over_time and event is InputEventMouseMotion:
show_scrollbars()
if event is InputEventMouseButton:
match event.button_index:
MOUSE_BUTTON_WHEEL_DOWN:
if event.pressed:
last_scroll_type = SCROLL_TYPE.WHEEL
if event.shift_pressed or not should_scroll_vertical():
if should_scroll_horizontal():
velocity.x -= speed * event.factor
else:
if should_scroll_vertical():
velocity.y -= speed * event.factor
scroll_damper = wheel_scroll_damper
kill_scroll_to_tweens()
MOUSE_BUTTON_WHEEL_UP:
if event.pressed:
last_scroll_type = SCROLL_TYPE.WHEEL
if event.shift_pressed or not should_scroll_vertical():
if should_scroll_horizontal():
velocity.x += speed * event.factor
else:
if should_scroll_vertical():
velocity.y += speed * event.factor
scroll_damper = wheel_scroll_damper
kill_scroll_to_tweens()
MOUSE_BUTTON_WHEEL_LEFT:
if event.pressed:
last_scroll_type = SCROLL_TYPE.WHEEL
if event.shift_pressed:
if should_scroll_vertical():
velocity.y -= speed * event.factor
else:
if should_scroll_horizontal():
velocity.x += speed * event.factor
scroll_damper = wheel_scroll_damper
kill_scroll_to_tweens()
MOUSE_BUTTON_WHEEL_RIGHT:
if event.pressed:
last_scroll_type = SCROLL_TYPE.WHEEL
if event.shift_pressed:
if should_scroll_vertical():
velocity.y += speed * event.factor
else:
if should_scroll_horizontal():
velocity.x -= speed * event.factor
scroll_damper = wheel_scroll_damper
kill_scroll_to_tweens()
MOUSE_BUTTON_LEFT:
if event.pressed:
if !drag_with_mouse: return
content_dragging = true
is_in_deadzone = true
scroll_damper = dragging_scroll_damper
last_scroll_type = SCROLL_TYPE.DRAG
init_drag_temp_data()
kill_scroll_to_tweens()
else:
content_dragging = false
is_in_deadzone = false
if (event is InputEventScreenDrag and drag_with_touch) \
or (event is InputEventMouseMotion and drag_with_mouse):
if content_dragging:
if should_scroll_horizontal():
drag_temp_data[0] += event.relative.x
if should_scroll_vertical():
drag_temp_data[1] += event.relative.y
remove_all_children_focus(self)
handle_content_dragging()
if event is InputEventPanGesture:
if should_scroll_horizontal():
velocity.x = -event.delta.x * speed
kill_scroll_to_tweens()
if should_scroll_vertical():
velocity.y = -event.delta.y * speed
kill_scroll_to_tweens()
if event is InputEventScreenTouch:
if event.pressed:
if !drag_with_touch: return
content_dragging = true
is_in_deadzone = true
scroll_damper = dragging_scroll_damper
last_scroll_type = SCROLL_TYPE.DRAG
init_drag_temp_data()
kill_scroll_to_tweens()
else:
content_dragging = false
is_in_deadzone = false
# Handle input if handle_input is true
if handle_input:
get_tree().get_root().set_input_as_handled()
# Scroll to new focused element
func _on_focus_changed(control: Control) -> void:
if follow_focus:
self.ensure_control_visible(control)
func _draw() -> void:
if debug_mode:
draw_debug()
# Sets default mouse filter for SmoothScroll children to MOUSE_FILTER_PASS
func _on_node_added(node: Node) -> void:
if node is Control and Engine.is_editor_hint():
if is_ancestor_of(node):
node.mouse_filter = Control.MOUSE_FILTER_PASS
func _scrollbar_hide_timer_timeout() -> void:
if !any_scroll_bar_dragged():
hide_scrollbars()
func _set_hide_scrollbar_over_time(value: bool) -> bool:
if value == false:
if scrollbar_hide_timer != null:
scrollbar_hide_timer.stop()
if scrollbar_show_tween != null:
scrollbar_show_tween.kill()
if scrollbar_hide_tween != null:
scrollbar_hide_tween.kill()
get_h_scroll_bar().modulate = Color.WHITE
get_v_scroll_bar().modulate = Color.WHITE
else:
if scrollbar_hide_timer != null and scrollbar_hide_timer.is_inside_tree():
scrollbar_hide_timer.start(scrollbar_hide_time)
return value
func _get(property: StringName) -> Variant:
match property:
"scroll_horizontal":
if !content_node: return 0
return -int(content_node.position.x)
"scroll_vertical":
if !content_node: return 0
return -int(content_node.position.y)
_:
return null
func _set(property: StringName, value: Variant) -> bool:
match property:
"scroll_horizontal":
if !content_node:
scroll_horizontal = 0
return true
scroll_horizontal = value
kill_scroll_x_to_tween()
velocity.x = 0.0
pos.x = clampf(
-value as float,
-get_child_size_x_diff(content_node, true),
0.0
)
return true
"scroll_vertical":
if !content_node:
scroll_vertical = 0
return true
scroll_vertical = value
kill_scroll_y_to_tween()
velocity.y = 0.0
pos.y = clampf(
-value as float,
-get_child_size_y_diff(content_node, true),
0.0
)
return true
_:
return false
#endregion
#region Scrolling Logic
func scroll(vertical: bool, axis_velocity: float, axis_pos: float, delta: float):
# If no scroll needed, don't apply forces
if vertical:
if not should_scroll_vertical():
return
else:
if not should_scroll_horizontal():
return
if !scroll_damper: return
# Applies counterforces when overdragging
if not content_dragging:
axis_velocity = handle_overdrag(vertical, axis_velocity, axis_pos, delta)
# Move content node by applying velocity
var slide_result = scroll_damper.slide(axis_velocity, delta)
axis_velocity = slide_result[0]
axis_pos += slide_result[1]
# Snap to boundary if close enough
var snap_result = snap(vertical, axis_velocity, axis_pos)
axis_velocity = snap_result[0]
axis_pos = snap_result[1]
else:
# Preserve dragging velocity for 1 frame
# in case no movement event while releasing dragging with touch
if content_dragging_moved:
content_dragging_moved = false
else:
axis_velocity = 0.0
# If using scroll bar dragging, set the content_node's
# position by using the scrollbar position
if handle_scrollbar_drag():
return
if vertical:
if not allow_overdragging:
# Clamp if calculated position is beyond boundary
if is_outside_top_boundary(axis_pos):
axis_pos = 0.0
axis_velocity = 0.0
elif is_outside_bottom_boundary(axis_pos):
axis_pos = -get_child_size_y_diff(content_node, true)
axis_velocity = 0.0
content_node.position.y = axis_pos
pos.y = axis_pos
velocity.y = axis_velocity
else:
if not allow_overdragging:
# Clamp if calculated position is beyond boundary
if is_outside_left_boundary(axis_pos):
axis_pos = 0.0
axis_velocity = 0.0
elif is_outside_right_boundary(axis_pos):
axis_pos = -get_child_size_x_diff(content_node, true)
axis_velocity = 0.0
content_node.position.x = axis_pos
pos.x = axis_pos
velocity.x = axis_velocity
func handle_overdrag(vertical: bool, axis_velocity: float, axis_pos: float, delta: float) -> float:
if !scroll_damper: return 0.0
# Calculate the size difference between this container and content_node
var size_diff = get_child_size_y_diff(content_node, true) \
if vertical else get_child_size_x_diff(content_node, true)
# Calculate distance to left and right or top and bottom
var dist1 = get_child_top_dist(axis_pos, size_diff) \
if vertical else get_child_left_dist(axis_pos, size_diff)
var dist2 = get_child_bottom_dist(axis_pos, size_diff) \
if vertical else get_child_right_dist(axis_pos, size_diff)
# Calculate velocity to left and right or top and bottom
var target_vel1 = scroll_damper._calculate_velocity_to_dest(dist1, 0.0)
var target_vel2 = scroll_damper._calculate_velocity_to_dest(dist2, 0.0)
# Bounce when out of boundary. When velocity is not fast enough to go back,
# apply a opposite force and get a new velocity. If the new velocity is too fast,
# apply a velocity that makes it scroll back exactly.
if axis_pos > 0.0:
if axis_velocity > target_vel1:
axis_velocity = scroll_damper.attract(
dist1,
0.0,
axis_velocity,
delta
)
if axis_pos < -size_diff:
if axis_velocity < target_vel2:
axis_velocity = scroll_damper.attract(
dist2,
0.0,
axis_velocity,
delta
)
return axis_velocity
# Snap to boundary if close enough in next frame
func snap(vertical: bool, axis_velocity: float, axis_pos: float) -> Array:
# Calculate the size difference between this container and content_node
var size_diff = get_child_size_y_diff(content_node, true) \
if vertical else get_child_size_x_diff(content_node, true)
# Calculate distance to left and right or top and bottom
var dist1 = get_child_top_dist(axis_pos, size_diff) \
if vertical else get_child_left_dist(axis_pos, size_diff)
var dist2 = get_child_bottom_dist(axis_pos, size_diff) \
if vertical else get_child_right_dist(axis_pos, size_diff)
if (
dist1 > 0.0 \
and abs(dist1) < just_snap_under \
and abs(axis_velocity) < just_snap_under \
):
axis_pos -= dist1
axis_velocity = 0.0
elif (
dist2 < 0.0 \
and abs(dist2) < just_snap_under \
and abs(axis_velocity) < just_snap_under \
):
axis_pos -= dist2
axis_velocity = 0.0
return [axis_velocity, axis_pos]
## Returns true when scrollbar was dragged
func handle_scrollbar_drag() -> bool:
if h_scrollbar_dragging:
velocity.x = 0.0
pos.x = -get_h_scroll_bar().value
return true
if v_scrollbar_dragging:
velocity.y = 0.0
pos.y = -get_v_scroll_bar().value
return true
return false
func handle_content_dragging() -> void:
if !dragging_scroll_damper: return
if(
Vector2(drag_temp_data[0], drag_temp_data[1]).length() < scroll_deadzone \
and is_in_deadzone
):
return
elif is_in_deadzone == true:
is_in_deadzone = false
drag_temp_data[0] = 0.0
drag_temp_data[1] = 0.0
content_dragging_moved = true
var calculate_dest = func(delta: float, damping: float) -> float:
if delta >= 0.0:
return delta / (1 + delta * damping * 0.00001)
else:
return delta
var calculate_position = func(
temp_dist1: float, # Temp distance
temp_dist2: float,
temp_relative: float # Event's relative movement accumulation
) -> float:
if temp_relative + temp_dist1 > 0.0:
var delta = min(temp_relative, temp_relative + temp_dist1)
var dest = calculate_dest.call(delta, dragging_scroll_damper._attract_factor)
return dest - min(0.0, temp_dist1)
elif temp_relative + temp_dist2 < 0.0:
var delta = max(temp_relative, temp_relative + temp_dist2)
var dest = -calculate_dest.call(-delta, dragging_scroll_damper._attract_factor)
return dest - max(0.0, temp_dist2)
else: return temp_relative
if should_scroll_vertical():
var y_pos = calculate_position.call(
drag_temp_data[6], # Temp top_distance
drag_temp_data[7], # Temp bottom_distance
drag_temp_data[1] # Temp y relative accumulation
) + drag_temp_data[3]
velocity.y = (y_pos - pos.y) / get_process_delta_time()
pos.y = y_pos
if should_scroll_horizontal():
var x_pos = calculate_position.call(
drag_temp_data[4], # Temp left_distance
drag_temp_data[5], # Temp right_distance
drag_temp_data[0] # Temp x relative accumulation
) + drag_temp_data[2]
velocity.x = (x_pos - pos.x) / get_process_delta_time()
pos.x = x_pos
func remove_all_children_focus(node: Node) -> void:
if node is Control:
var control = node as Control
control.release_focus()
for child in node.get_children():
remove_all_children_focus(child)
func update_is_scrolling() -> void:
if(
(content_dragging and not is_in_deadzone)
or any_scroll_bar_dragged()
or velocity != Vector2.ZERO
):
is_scrolling = true
else:
is_scrolling = false
func update_scrollbars() -> void:
# Update vertical scroll bar
if get_v_scroll_bar().value != -pos.y:
get_v_scroll_bar().set_value_no_signal(-pos.y)
get_v_scroll_bar().queue_redraw()
# Update horizontal scroll bar
if get_h_scroll_bar().value != -pos.x:
get_h_scroll_bar().set_value_no_signal(-pos.x)
get_h_scroll_bar().queue_redraw()
# Always show sroll bars when scrolling or mouse is on any scroll bar
if hide_scrollbar_over_time and (is_scrolling or mouse_on_scrollbar):
show_scrollbars()
func init_drag_temp_data() -> void:
# Calculate the size difference between this container and content_node
var content_node_size_diff = get_child_size_diff(content_node, true, true)
# Calculate distance to left, right, top and bottom
var content_node_boundary_dist = get_child_boundary_dist(
content_node.position,
content_node_size_diff
)
drag_temp_data = [
0.0,
0.0,
content_node.position.x,
content_node.position.y,
content_node_boundary_dist.x,
content_node_boundary_dist.y,
content_node_boundary_dist.z,
content_node_boundary_dist.w,
]
# Get container size x without v scroll bar 's width
func get_spare_size_x() -> float:
var size_x = size.x
if get_v_scroll_bar().visible:
size_x -= get_v_scroll_bar().size.x
return max(size_x, 0.0)
# Get container size y without h scroll bar 's height
func get_spare_size_y() -> float:
var size_y = size.y
if get_h_scroll_bar().visible:
size_y -= get_h_scroll_bar().size.y
return max(size_y, 0.0)
# Get container size without scroll bars' size
func get_spare_size() -> Vector2:
return Vector2(get_spare_size_x(), get_spare_size_y())
# Calculate the size x difference between this container and child node
func get_child_size_x_diff(child: Control, clamp: bool) -> float:
var child_size_x = child.size.x * child.scale.x
# Falsify the size of the child node to avoid errors
# when its size is smaller than this container 's
if clamp:
child_size_x = max(child_size_x, get_spare_size_x())
return child_size_x - get_spare_size_x()
# Calculate the size y difference between this container and child node
func get_child_size_y_diff(child: Control, clamp: bool) -> float:
var child_size_y = child.size.y * child.scale.y
# Falsify the size of the child node to avoid errors
# when its size is smaller than this container 's
if clamp:
child_size_y = max(child_size_y, get_spare_size_y())
return child_size_y - get_spare_size_y()
# Calculate the size difference between this container and child node
func get_child_size_diff(child: Control, clamp_x: bool, clamp_y: bool) -> Vector2:
return Vector2(
get_child_size_x_diff(child, clamp_x),
get_child_size_y_diff(child, clamp_y)
)
# Calculate distance to left
func get_child_left_dist(child_pos_x: float, child_size_diff_x: float) -> float:
return child_pos_x
# Calculate distance to right
func get_child_right_dist(child_pos_x: float, child_size_diff_x: float) -> float:
return child_pos_x + child_size_diff_x
# Calculate distance to top
func get_child_top_dist(child_pos_y: float, child_size_diff_y: float) -> float:
return child_pos_y
# Calculate distance to bottom
func get_child_bottom_dist(child_pos_y: float, child_size_diff_y: float) -> float:
return child_pos_y + child_size_diff_y
# Calculate distance to left, right, top and bottom
func get_child_boundary_dist(child_pos: Vector2, child_size_diff: Vector2) -> Vector4:
return Vector4(
get_child_left_dist(child_pos.x, child_size_diff.x),
get_child_right_dist(child_pos.x, child_size_diff.x),
get_child_top_dist(child_pos.y, child_size_diff.y),
get_child_bottom_dist(child_pos.y, child_size_diff.y),
)
func kill_scroll_x_to_tween() -> void:
if scroll_x_to_tween: scroll_x_to_tween.kill()
func kill_scroll_y_to_tween() -> void:
if scroll_y_to_tween: scroll_y_to_tween.kill()
func kill_scroll_to_tweens() -> void:
kill_scroll_x_to_tween()
kill_scroll_y_to_tween()
#endregion
#region Debug Drawing
var debug_gradient := Gradient.new()
func setup_debug_drawing() -> void:
debug_gradient.set_color(0.0, Color.GREEN)
debug_gradient.set_color(1.0, Color.RED)
func draw_debug() -> void:
# Calculate the size difference between this container and content_node
var size_diff = get_child_size_diff(content_node, false, false)
# Calculate distance to left, right, top and bottom
var boundary_dist = get_child_boundary_dist(
content_node.position,
size_diff
)
var bottom_distance = boundary_dist.w
var top_distance = boundary_dist.z
var right_distance = boundary_dist.y
var left_distance = boundary_dist.x
# Overdrag lines
# Top + Bottom
draw_line(Vector2(0.0, 0.0), Vector2(0.0, top_distance), debug_gradient.sample(clamp(top_distance / size.y, 0.0, 1.0)), 5.0)
draw_line(Vector2(0.0, size.y), Vector2(0.0, size.y+bottom_distance), debug_gradient.sample(clamp(-bottom_distance / size.y, 0.0, 1.0)), 5.0)
# Left + Right
draw_line(Vector2(0.0, size.y), Vector2(left_distance, size.y), debug_gradient.sample(clamp(left_distance / size.y, 0.0, 1.0)), 5.0)
draw_line(Vector2(size.x, size.y), Vector2(size.x+right_distance, size.y), debug_gradient.sample(clamp(-right_distance / size.y, 0.0, 1.0)), 5.0)
# Velocity lines
var origin := Vector2(5.0, size.y/2)
draw_line(origin, origin + Vector2(0.0, velocity.y*0.01), debug_gradient.sample(clamp(velocity.y*2 / size.y, 0.0, 1.0)), 5.0)
draw_line(origin, origin + Vector2(0.0, velocity.x*0.01), debug_gradient.sample(clamp(velocity.x*2 / size.x, 0.0, 1.0)), 5.0)
#endregion
#region API Functions
## Scrolls to specific x position
func scroll_x_to(x_pos: float, duration := 0.5) -> void:
if not should_scroll_horizontal(): return
if content_dragging: return
velocity.x = 0.0
var size_x_diff = get_child_size_x_diff(content_node, true)
x_pos = clampf(x_pos, -size_x_diff, 0.0)
kill_scroll_x_to_tween()
scroll_x_to_tween = create_tween()
var tweener = scroll_x_to_tween.tween_property(self, "pos:x", x_pos, duration)
tweener.set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUINT)
## Scrolls to specific y position
func scroll_y_to(y_pos: float, duration := 0.5) -> void:
if not should_scroll_vertical(): return
if content_dragging: return
velocity.y = 0.0
var size_y_diff = get_child_size_y_diff(content_node, true)
y_pos = clampf(y_pos, -size_y_diff, 0.0)
kill_scroll_y_to_tween()
scroll_y_to_tween = create_tween()
var tweener = scroll_y_to_tween.tween_property(self, "pos:y", y_pos, duration)
tweener.set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_QUINT)
## Scrolls up a page
func scroll_page_up(duration := 0.5) -> void:
var destination = content_node.position.y + get_spare_size_y()
scroll_y_to(destination, duration)
## Scrolls down a page
func scroll_page_down(duration := 0.5) -> void:
var destination = content_node.position.y - get_spare_size_y()
scroll_y_to(destination, duration)
## Scrolls left a page
func scroll_page_left(duration := 0.5) -> void:
var destination = content_node.position.x + get_spare_size_x()
scroll_x_to(destination, duration)
## Scrolls right a page
func scroll_page_right(duration := 0.5) -> void:
var destination = content_node.position.x - get_spare_size_x()
scroll_x_to(destination, duration)
## Adds velocity to the vertical scroll
func scroll_vertically(amount: float) -> void:
velocity.y -= amount
## Adds velocity to the horizontal scroll
func scroll_horizontally(amount: float) -> void:
velocity.x -= amount
## Scrolls to top
func scroll_to_top(duration := 0.5) -> void:
scroll_y_to(0.0, duration)
## Scrolls to bottom
func scroll_to_bottom(duration := 0.5) -> void:
scroll_y_to(get_spare_size_y() - content_node.size.y, duration)
## Scrolls to left
func scroll_to_left(duration := 0.5) -> void:
scroll_x_to(0.0, duration)
## Scrolls to right
func scroll_to_right(duration := 0.5) -> void:
scroll_x_to(get_spare_size_x() - content_node.size.x, duration)
func is_outside_top_boundary(y_pos: float = pos.y) -> bool:
var size_y_diff = get_child_size_y_diff(content_node,true)
var top_dist = get_child_top_dist(y_pos, size_y_diff)
return top_dist > 0.0
func is_outside_bottom_boundary(y_pos: float = pos.y) -> bool:
var size_y_diff = get_child_size_y_diff(content_node,true)
var bottom_dist = get_child_bottom_dist(y_pos, size_y_diff)
return bottom_dist < 0.0
func is_outside_left_boundary(x_pos: float = pos.x) -> bool:
var size_x_diff = get_child_size_x_diff(content_node,true)
var left_dist = get_child_left_dist(x_pos, size_x_diff)
return left_dist > 0.0
func is_outside_right_boundary(x_pos: float = pos.x) -> bool:
var size_x_diff = get_child_size_x_diff(content_node,true)
var right_dist = get_child_right_dist(x_pos, size_x_diff)
return right_dist < 0.0
## Returns true if any scroll bar is being dragged
func any_scroll_bar_dragged() -> bool:
return h_scrollbar_dragging or v_scrollbar_dragging
## Returns true if there is enough content height to scroll
func should_scroll_vertical() -> bool:
var disable_scroll = (not allow_vertical_scroll) \
or (auto_allow_scroll and get_child_size_y_diff(content_node, false) <= 0) \
or !scroll_damper
if disable_scroll:
velocity.y = 0.0
return false
else:
return true
## Returns true if there is enough content width to scroll
func should_scroll_horizontal() -> bool:
var disable_scroll = (not allow_horizontal_scroll) \
or (auto_allow_scroll and get_child_size_x_diff(content_node, false) <= 0) \
or !scroll_damper
if disable_scroll:
velocity.x = 0.0
return false
else:
return true
## Fades out scrollbars within given [param time].[br]
## Default for [param time] is current [member scrollbar_fade_out_time]
func hide_scrollbars(time: float = scrollbar_fade_out_time) -> void:
# Kill scrollbar_show_tween to avoid animation conflict
if scrollbar_show_tween != null and scrollbar_show_tween.is_valid():
scrollbar_show_tween.kill()
# Create new tweens if needed
if (
get_v_scroll_bar().modulate != Color.TRANSPARENT \
or get_h_scroll_bar().modulate != Color.TRANSPARENT
):
if scrollbar_hide_tween and !scrollbar_hide_tween.is_running():
scrollbar_hide_tween.kill()
if scrollbar_hide_tween == null or !scrollbar_hide_tween.is_valid():
scrollbar_hide_tween = create_tween()
scrollbar_hide_tween.set_parallel(true)
scrollbar_hide_tween.tween_property(get_v_scroll_bar(), 'modulate', Color.TRANSPARENT, time)
scrollbar_hide_tween.tween_property(get_h_scroll_bar(), 'modulate', Color.TRANSPARENT, time)
## Fades in scrollbars within given [param time].[br]
## Default for [param time] is current [member scrollbar_fade_in_time]
func show_scrollbars(time: float = scrollbar_fade_in_time) -> void:
# Restart timer
scrollbar_hide_timer.start(scrollbar_hide_time)
# Kill scrollbar_hide_tween to avoid animation conflict
if scrollbar_hide_tween != null and scrollbar_hide_tween.is_valid():
scrollbar_hide_tween.kill()
# Create new tweens if needed
if (
get_v_scroll_bar().modulate != Color.WHITE \
or get_h_scroll_bar().modulate != Color.WHITE \
):
if scrollbar_show_tween and !scrollbar_show_tween.is_running():
scrollbar_show_tween.kill()
if scrollbar_show_tween == null or !scrollbar_show_tween.is_valid():
scrollbar_show_tween = create_tween()
scrollbar_show_tween.set_parallel(true)
scrollbar_show_tween.tween_property(get_v_scroll_bar(), 'modulate', Color.WHITE, time)
scrollbar_show_tween.tween_property(get_h_scroll_bar(), 'modulate', Color.WHITE, time)
## Scroll to position to ensure the given control node is visible
func ensure_control_visible(control: Control) -> void:
if !content_node: return
if !content_node.is_ancestor_of(control): return
if !scroll_damper: return
var size_diff = (
control.get_global_rect().size - get_global_rect().size
) / (get_global_rect().size / size)
var boundary_dist = get_child_boundary_dist(
(control.global_position - global_position) \
/ (get_global_rect().size / size),
size_diff
)
var content_node_position = content_node.position
if boundary_dist.x < 0 + follow_focus_margin:
scroll_x_to(content_node_position.x - boundary_dist.x + follow_focus_margin)
elif boundary_dist.y > 0 - follow_focus_margin:
scroll_x_to(content_node_position.x - boundary_dist.y - follow_focus_margin)
if boundary_dist.z < 0 + follow_focus_margin:
scroll_y_to(content_node_position.y - boundary_dist.z + follow_focus_margin)
elif boundary_dist.w > 0 - follow_focus_margin:
scroll_y_to(content_node_position.y - boundary_dist.w - follow_focus_margin)
#endregion

View File

@@ -0,0 +1 @@
uid://bgqglerkcylxx

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 25 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M58.4,10.7C66.4,10.7 73,17.2 73,25.3L73,66.3C73,79 62.7,89.3 50,89.3C37.3,89.3 27,79 27,66.3L27,25.3C27,17.3 33.5,10.7 41.6,10.7L58.4,10.7M58.4,5L41.6,5C30.4,5 21.3,14.1 21.3,25.3L21.3,66.3C21.3,82.1 34.1,95 50,95C65.9,95 78.7,82.1 78.7,66.3L78.7,25.3C78.7,14.1 69.6,5 58.4,5Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50,52.5C49.7,52.5 49.3,52.4 49,52.2L40.2,46C39.4,45.5 39.2,44.4 39.8,43.6C40.3,42.8 41.4,42.6 42.2,43.2L50,48.7L57.8,43.2C58.6,42.7 59.6,42.8 60.2,43.6C60.7,44.4 60.6,45.4 59.8,46L51,52.2C50.7,52.4 50.3,52.5 50,52.5Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50.1,65.8C49.8,65.8 49.4,65.7 49.1,65.5L40.3,59.3C39.5,58.8 39.3,57.7 39.9,56.9C40.4,56.1 41.5,55.9 42.3,56.5L50.1,62L57.9,56.5C58.7,56 59.7,56.1 60.3,56.9C60.8,57.7 60.7,58.7 59.9,59.3L51.1,65.5C50.8,65.7 50.5,65.8 50.1,65.8Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50,78.8C49.7,78.8 49.3,78.7 49,78.5L40.2,72.3C39.4,71.8 39.2,70.7 39.8,69.9C40.4,69.1 41.4,68.9 42.2,69.5L50,75L57.8,69.5C58.6,69 59.6,69.1 60.2,69.9C60.7,70.7 60.6,71.7 59.8,72.3L51,78.5C50.7,78.7 50.3,78.8 50,78.8Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50,36.3C48.1,36.3 46.6,34.8 46.6,32.9L46.6,25.4C46.6,23.5 48.1,22 50,22C51.9,22 53.4,23.5 53.4,25.4L53.4,32.9C53.4,34.8 51.9,36.3 50,36.3Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dorhyoghxkay6"
path="res://.godot/imported/class-icon.svg-c17de51589a7d30572bf401526524f64.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/SmoothScroll/class-icon.svg"
dest_files=["res://.godot/imported/class-icon.svg-c17de51589a7d30572bf401526524f64.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

View File

@@ -0,0 +1,3 @@
[gd_resource type="SystemFont" format=3 uid="uid://cw8c0p3b5mv5y"]
[resource]

Binary file not shown.

View File

@@ -0,0 +1,8 @@
[plugin]
name="SmoothScroll"
description="""This plugin adds a new scroll container class
with additional smooth scroll options."""
author="Fabian Keßler (SpyrexDE)"
version="1.3"
script="plugin.gd"

View File

@@ -0,0 +1,12 @@
@tool
extends EditorPlugin
func _enter_tree():
add_custom_type("ScrollDamper", "Resource", preload("scroll_damper/scroll_damper.gd"), preload("scroll_damper/icon.svg"))
add_custom_type("SmoothScrollContainer", "ScrollContainer", preload("SmoothScrollContainer.gd"), preload("class-icon.svg"))
func _exit_tree():
remove_custom_type("ScrollDamper")
remove_custom_type("SmoothScrollContainer")

View File

@@ -0,0 +1 @@
uid://b7svd7w4nwpch

View File

@@ -0,0 +1,33 @@
extends ScrollDamper
class_name CubicScrollDamper
## Friction, not physical.
## The higher the value, the more obvious the deceleration.
@export_range(0.001, 10000.0, 0.001, "or_greater", "hide_slider")
var friction := 4.0:
set(val):
friction = max(val, 0.001)
_factor = pow(10.0, friction) - 1.0
## Factor to use in formula
var _factor := 10000.0:
set(val): _factor = max(val, 0.000000000001)
func _calculate_velocity_by_time(time: float) -> float:
if time <= 0.0: return 0.0
return time*time*time * _factor
func _calculate_time_by_velocity(velocity: float) -> float:
return pow(abs(velocity) / _factor, 1.0/3.0)
func _calculate_offset_by_time(time: float) -> float:
time = max(time, 0.0)
return 1.0/4.0 * _factor * time*time*time*time
func _calculate_time_by_offset(offset: float) -> float:
return pow(abs(offset) * 4.0 / _factor, 1.0/4.0)

View File

@@ -0,0 +1 @@
uid://dlagxcnf11lr4

View File

@@ -0,0 +1,47 @@
extends ScrollDamper
class_name ExpoScrollDamper
## Friction, not physical.
## The higher the value, the more obvious the deceleration.
@export_range(0.001, 10000.0, 0.001, "or_greater", "hide_slider")
var friction := 4.0:
set(val):
friction = max(val, 0.001)
_factor = pow(10.0, friction)
## Factor to use in formula
var _factor := 10000.0:
set(val): _factor = max(val, 1.000000000001)
## Minumun velocity.
@export_range(0.001, 100000.0, 0.001, "or_greater", "hide_slider")
var minimum_velocity := 0.4:
set(val): minimum_velocity = max(val, 0.001)
func _calculate_velocity_by_time(time: float) -> float:
var minimum_time = _calculate_time_by_velocity(minimum_velocity)
if time <= minimum_time: return 0.0
return pow(_factor, time)
func _calculate_time_by_velocity(velocity: float) -> float:
return log(abs(velocity)) / log(_factor)
func _calculate_offset_by_time(time: float) -> float:
return pow(_factor, time) / log(_factor)
func _calculate_time_by_offset(offset: float) -> float:
return log(offset * log(_factor)) / log(_factor)
func _calculate_velocity_to_dest(from: float, to: float) -> float:
var dist = to - from
var min_time = _calculate_time_by_velocity(minimum_velocity)
var min_offset = _calculate_offset_by_time(min_time)
var time = _calculate_time_by_offset(abs(dist) + min_offset)
var vel = _calculate_velocity_by_time(time) * sign(dist)
return vel

View File

@@ -0,0 +1 @@
uid://b7h0k2h2qwlqv

Binary file not shown.

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g transform="matrix(1,0,0,1,34.4806,-89.0415)">
<path d="M185.254,992.427C601.296,991.628 768.576,997.711 778.133,294.568" style="fill:none;stroke:rgb(191,244,196);stroke-width:70px;"/>
</g>
<g id="icon.afdesign" transform="matrix(28.1622,0,0,28.1622,387.945,401.774)">
<g transform="matrix(1,0,0,1,-12.5,-12.5)">
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M58.4,10.7C66.4,10.7 73,17.2 73,25.3L73,66.3C73,79 62.7,89.3 50,89.3C37.3,89.3 27,79 27,66.3L27,25.3C27,17.3 33.5,10.7 41.6,10.7L58.4,10.7M58.4,5L41.6,5C30.4,5 21.3,14.1 21.3,25.3L21.3,66.3C21.3,82.1 34.1,95 50,95C65.9,95 78.7,82.1 78.7,66.3L78.7,25.3C78.7,14.1 69.6,5 58.4,5Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50,52.5C49.7,52.5 49.3,52.4 49,52.2L40.2,46C39.4,45.5 39.2,44.4 39.8,43.6C40.3,42.8 41.4,42.6 42.2,43.2L50,48.7L57.8,43.2C58.6,42.7 59.6,42.8 60.2,43.6C60.7,44.4 60.6,45.4 59.8,46L51,52.2C50.7,52.4 50.3,52.5 50,52.5Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50.1,65.8C49.8,65.8 49.4,65.7 49.1,65.5L40.3,59.3C39.5,58.8 39.3,57.7 39.9,56.9C40.4,56.1 41.5,55.9 42.3,56.5L50.1,62L57.9,56.5C58.7,56 59.7,56.1 60.3,56.9C60.8,57.7 60.7,58.7 59.9,59.3L51.1,65.5C50.8,65.7 50.5,65.8 50.1,65.8Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50,78.8C49.7,78.8 49.3,78.7 49,78.5L40.2,72.3C39.4,71.8 39.2,70.7 39.8,69.9C40.4,69.1 41.4,68.9 42.2,69.5L50,75L57.8,69.5C58.6,69 59.6,69.1 60.2,69.9C60.7,70.7 60.6,71.7 59.8,72.3L51,78.5C50.7,78.7 50.3,78.8 50,78.8Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
<g transform="matrix(0.268293,0,0,0.255556,-0.914634,-0.277778)">
<path d="M50,36.3C48.1,36.3 46.6,34.8 46.6,32.9L46.6,25.4C46.6,23.5 48.1,22 50,22C51.9,22 53.4,23.5 53.4,25.4L53.4,32.9C53.4,34.8 51.9,36.3 50,36.3Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
</g>
</g>
<g transform="matrix(-10.6313,1.88738e-15,-3.10862e-15,-25.7598,1344.05,1429.95)">
<path d="M50,52.5C49.7,52.5 49.3,52.4 49,52.2L40.2,46C39.4,45.5 39.2,44.4 39.8,43.6C40.3,42.8 41.4,42.6 42.2,43.2L50,48.7L57.8,43.2C58.6,42.7 59.6,42.8 60.2,43.6C60.7,44.4 60.6,45.4 59.8,46L51,52.2C50.7,52.4 50.3,52.5 50,52.5Z" style="fill:rgb(191,244,196);fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://4ok12qtgl7xq"
path="res://.godot/imported/icon.svg-5b01e8115f19d6d63dc265815ce29c75.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/SmoothScroll/scroll_damper/icon.svg"
dest_files=["res://.godot/imported/icon.svg-5b01e8115f19d6d63dc265815ce29c75.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

View File

@@ -0,0 +1,33 @@
extends ScrollDamper
class_name LinearScrollDamper
## Friction, not physical.
## The higher the value, the more obvious the deceleration.
@export_range(0.001, 10000.0, 0.001, "or_greater", "hide_slider")
var friction := 4.0:
set(val):
friction = max(val, 0.001)
_factor = pow(10.0, friction) - 1.0
## Factor to use in formula
var _factor := 10000.0:
set(val): _factor = max(val, 0.000000000001)
func _calculate_velocity_by_time(time: float) -> float:
if time <= 0.0: return 0.0
return time * _factor
func _calculate_time_by_velocity(velocity: float) -> float:
return abs(velocity) / _factor
func _calculate_offset_by_time(time: float) -> float:
time = max(time, 0.0)
return 1.0/2.0 * _factor * time*time
func _calculate_time_by_offset(offset: float) -> float:
return sqrt(abs(offset) * 2.0 / _factor)

View File

@@ -0,0 +1 @@
uid://dvvc75dvopgcg

View File

@@ -0,0 +1,33 @@
extends ScrollDamper
class_name QuadScrollDamper
## Friction, not physical.
## The higher the value, the more obvious the deceleration.
@export_range(0.001, 10000.0, 0.001, "or_greater", "hide_slider")
var friction := 4.0:
set(val):
friction = max(val, 0.001)
_factor = pow(10.0, friction) - 1.0
## Factor to use in formula
var _factor := 10000.0:
set(val): _factor = max(val, 0.000000000001)
func _calculate_velocity_by_time(time: float) -> float:
if time <= 0.0: return 0.0
return time*time * _factor
func _calculate_time_by_velocity(velocity: float) -> float:
return sqrt(abs(velocity) / _factor)
func _calculate_offset_by_time(time: float) -> float:
time = max(time, 0.0)
return 1.0/3.0 * _factor * time*time*time
func _calculate_time_by_offset(offset: float) -> float:
return pow(abs(offset) * 3.0 / _factor, 1.0/3.0)

View File

@@ -0,0 +1 @@
uid://ccgjrqkk3oksk

View File

@@ -0,0 +1,74 @@
@icon("icon.svg")
extends Resource
class_name ScrollDamper
## Abstract class
## Rebound strength. The higher the value, the faster it attracts.
@export_range(0.0, 1.0, 0.001, "or_greater", "hide_slider")
var rebound_strength := 7.0:
set(val):
rebound_strength= max(val, 0.0)
_attract_factor = rebound_strength * rebound_strength * rebound_strength
## Factor for attracting.
var _attract_factor := 400.0:
set(val):
_attract_factor = max(val, 0.0)
# Abstract method
func _calculate_velocity_by_time(time: float) -> float:
return 0.0
# Abstract method
func _calculate_time_by_velocity(velocity: float) -> float:
return 0.0
# Abstract method
func _calculate_offset_by_time(time: float) -> float:
return 0.0
# Abstract method
func _calculate_time_by_offset(offset: float) -> float:
return 0.0
func _calculate_velocity_to_dest(from: float, to: float) -> float:
var dist = to - from
var time = _calculate_time_by_offset(abs(dist))
var vel = _calculate_velocity_by_time(time) * sign(dist)
return vel
func _calculate_next_velocity(present_time: float, delta_time: float) -> float:
return _calculate_velocity_by_time(present_time - delta_time)
func _calculate_next_offset(present_time: float, delta_time: float) -> float:
return _calculate_offset_by_time(present_time) \
- _calculate_offset_by_time(present_time - delta_time)
## Return the result of next velocity and position according to delta time
func slide(velocity: float, delta_time: float) -> Array:
var present_time = _calculate_time_by_velocity(velocity)
return [
_calculate_next_velocity(present_time, delta_time) * sign(velocity),
_calculate_next_offset(present_time, delta_time) * sign(velocity)
]
## Emulate force that attracts something to destination.
## Return the result of next velocity according to delta time
func attract(from: float, to: float, velocity: float, delta_time: float) -> float:
var dist = to - from
var target_vel = _calculate_velocity_to_dest(from, to)
velocity += _attract_factor * dist * delta_time \
+ _calculate_velocity_by_time(delta_time) * sign(dist)
if (
(dist > 0 and velocity >= target_vel) \
or (dist < 0 and velocity <= target_vel) \
):
velocity = target_vel
return velocity

View File

@@ -0,0 +1 @@
uid://bcy471w0pi8af

View File

@@ -0,0 +1,81 @@
class_name IconAssets
static var icons_map
static var current_theme
static var color_conversion_map = {}
const flex_icons_sources = [
"AlignContentAroundRowIcon",
"AlignContentAroundColumnIcon",
"AlignContentBetweenRowIcon",
"AlignContentBetweenColumnIcon",
"AlignContentCenterRowIcon",
"AlignContentCenterColumnIcon",
"AlignContentEndRowIcon",
"AlignContentEndColumnIcon",
"AlignContentStartRowIcon",
"AlignContentStartColumnIcon",
"AlignContentStretchRowIcon",
"AlignContentStretchColumnIcon",
"AlignItemsBaselineColumnIcon",
"AlignItemsBaselineRowIcon",
"AlignItemsCenterColumnIcon",
"AlignItemsCenterRowIcon",
"AlignItemsEndColumnIcon",
"AlignItemsEndRowIcon",
"AlignItemsStartColumnIcon",
"AlignItemsStartRowIcon",
"AlignItemsStretchColumnIcon",
"AlignItemsStretchRowIcon",
"DisplayFlexRow",
"DisplayFlexColumn",
"ArrowReverseIcon",
"FlexWrapNoWrapColumnIcon",
"FlexWrapNoWrapRowIcon",
"FlexWrapWrapColumnIcon",
"FlexWrapWrapRowIcon",
"JustifyContentCenterColumnIcon",
"JustifyContentCenterRowIcon",
"JustifyContentEndColumnIcon",
"JustifyContentEndRowIcon",
"JustifyContentSpaceAroundColumnIcon",
"JustifyContentSpaceAroundRowIcon",
"JustifyContentSpaceBetweenColumnIcon",
"JustifyContentSpaceBetweenRowIcon",
"JustifyContentSpaceEvenlyColumnIcon",
"JustifyContentSpaceEvenlyRowIcon",
"JustifyContentStartColumnIcon",
"JustifyContentStartRowIcon",
]
static func get_icon(icon:String):
return icons_map[current_theme].get(icon)
#maybe bugs here, map should be initial here
static func generate_icons(dark_theme):
if icons_map == null:
icons_map = {}
if icons_map.has(dark_theme):
current_theme = dark_theme
return
if current_theme != dark_theme:
current_theme = dark_theme
icons_map[current_theme] = {}
var icon_theme = "dark" if dark_theme else "light"
for icon_name in flex_icons_sources:
icons_map[current_theme][icon_name] = load("res://addons/godot-flexbox/assets/%s/%s.svg" % [icon_theme, icon_name])
static func add_conversion_color_pair(p_from_color:String, p_to_color:String):
color_conversion_map[Color.html(p_from_color)] = Color.html(p_to_color)
static func conversion_color_pairs():
color_conversion_map = {}
add_conversion_color_pair("#d6d6d6", "#474747"); # Highlighted part
add_conversion_color_pair("#474747", "#d6d6d6"); # Background part

View File

@@ -0,0 +1 @@
uid://df0yh5hcurt8

View File

@@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_12)">
<path d="M0 -4.76837e-07L0 16H1L1 -4.76837e-07H0ZM15 -4.76837e-07L15 16H16V-4.76837e-07H15ZM3 12L3 4H7L7 12H3ZM9 12V4H13V12H9Z" fill="#D6D6D6"/>
</g>
<defs>
<clipPath id="clip0_8_12">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 418 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d2l1kkssssaxp"
path="res://.godot/imported/AlignContentAroundColumnIcon.svg-17b7bde393ab6adaa268b2798824d09b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentAroundColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentAroundColumnIcon.svg-17b7bde393ab6adaa268b2798824d09b.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceAroundColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 22.5H0V24h24v-1.5ZM6 4.5h12v6H6v-6ZM6 13.5h12v6H6v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 253 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cb1pyfu0vgkk1"
path="res://.godot/imported/AlignContentAroundRowIcon.svg-cba31d3e2cb2814c6c9754f54ba99e3f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentAroundRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentAroundRowIcon.svg-cba31d3e2cb2814c6c9754f54ba99e3f.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

View File

@@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_14)">
<path d="M0 -4.76837e-07L0 16H1L1 -4.76837e-07H0ZM15 -4.76837e-07L15 16H16V-4.76837e-07H15ZM2 12L2 4H6L6 12H2ZM10 12V4H14V12H10Z" fill="#D6D6D6"/>
</g>
<defs>
<clipPath id="clip0_8_14">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 420 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://1tuprcke6b3q"
path="res://.godot/imported/AlignContentBetweenColumnIcon.svg-9afaff8eb0d52c831e9744a6274140d2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentBetweenColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentBetweenColumnIcon.svg-9afaff8eb0d52c831e9744a6274140d2.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="JustifyContentSpaceBetweenColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 22.5H0V24h24v-1.5ZM6 3h12v6H6V3ZM6 15h12v6H6v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 249 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b3vvj6nsa3elh"
path="res://.godot/imported/AlignContentBetweenRowIcon.svg-158985a6f23611020a314ec7766b2774.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentBetweenRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentBetweenRowIcon.svg-158985a6f23611020a314ec7766b2774.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

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0V16H9V0H8ZM3 12L3 4H7L7 12H3ZM10 12V4H14V12H10Z" fill="#D6D6D6"/>
</svg>

After

Width:  |  Height:  |  Size: 182 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://clevjexvw81s2"
path="res://.godot/imported/AlignContentCenterColumnIcon.svg-08aa103afcf470f41a749b0fb2d99d82.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentCenterColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentCenterColumnIcon.svg-08aa103afcf470f41a749b0fb2d99d82.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M16 8H0v1h16V8ZM4 3h8v4H4V3ZM4 10h8v4H4v-4Z"/></svg>

After

Width:  |  Height:  |  Size: 151 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfh1fayri054d"
path="res://.godot/imported/AlignContentCenterRowIcon.svg-b53ff1cff2db32cd9dbc50e9faa97318.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentCenterRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentCenterRowIcon.svg-b53ff1cff2db32cd9dbc50e9faa97318.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

View File

@@ -0,0 +1,15 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_6)">
<mask id="mask0_8_6" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="16">
<path d="M0 16L0 0L16 0V16H0Z" fill="white"/>
</mask>
<g mask="url(#mask0_8_6)">
<path d="M15 0L15 16H16V0H15ZM5 12L5 4H9V12H5ZM10 12V4H14V12H10Z" fill="#D6D6D6"/>
</g>
</g>
<defs>
<clipPath id="clip0_8_6">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 552 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://buai0bv8miqrx"
path="res://.godot/imported/AlignContentEndColumnIcon.svg-05770fba0491527fd1aa0f93463055f7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentEndColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentEndColumnIcon.svg-05770fba0491527fd1aa0f93463055f7.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><g fill="#d6d6d6" clip-path="url(#a)"><path d="M16 15H0v1h16v-1ZM4 5h8v4H4V5ZM4 10h8v4H4v-4Z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 258 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dpwkqbay3gfi7"
path="res://.godot/imported/AlignContentEndRowIcon.svg-16c42695d544572c28c7a549c03ef6e5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentEndRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentEndRowIcon.svg-16c42695d544572c28c7a549c03ef6e5.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

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 0L1 16H2L2 0H1ZM3 12L3 4H7L7 12H3ZM8 12V4H12V12H8Z" fill="#D6D6D6"/>
</svg>

After

Width:  |  Height:  |  Size: 184 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bgh1u6p45ydad"
path="res://.godot/imported/AlignContentStartColumnIcon.svg-c7a947a2f05d8cac15b8ee078ffcd394.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStartColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentStartColumnIcon.svg-c7a947a2f05d8cac15b8ee078ffcd394.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M16 1H0v1h16V1ZM4 3h8v4H4V3ZM4 8h8v4H4V8Z"/></svg>

After

Width:  |  Height:  |  Size: 149 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2hof4hdg1idm"
path="res://.godot/imported/AlignContentStartRowIcon.svg-87b04e46a18453a15fb124940ed848bf.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStartRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentStartRowIcon.svg-87b04e46a18453a15fb124940ed848bf.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

View File

@@ -0,0 +1,15 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_8_16)">
<mask id="mask0_8_16" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="16">
<path d="M0 16L0 0L16 0V16H0Z" fill="white"/>
</mask>
<g mask="url(#mask0_8_16)">
<path d="M0 0L0 16H1L1 0H0ZM15 0L15 16H16V0H15ZM1.5 12L1.5 4H7L7 12H1.5ZM9 12V4H14.5V12H9Z" fill="#D6D6D6"/>
</g>
</g>
<defs>
<clipPath id="clip0_8_16">
<rect width="16" height="16" fill="white" transform="matrix(0 -1 1 0 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 582 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cn28p8262kj8c"
path="res://.godot/imported/AlignContentStretchColumnIcon.svg-2138f6a1dd3cd0e6c36dc134e4b05be4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStretchColumnIcon.svg"
dest_files=["res://.godot/imported/AlignContentStretchColumnIcon.svg-2138f6a1dd3cd0e6c36dc134e4b05be4.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><g fill="#d6d6d6" clip-path="url(#a)"><path d="M16 0H0v1h16V0ZM16 15H0v1h16v-1ZM4 1.5h8V7H4V1.5ZM4 9h8v5.5H4V9Z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 277 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://mjhhl7uu0oe4"
path="res://.godot/imported/AlignContentStretchRowIcon.svg-a266e80aa9bb8b02b559638407561029.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignContentStretchRowIcon.svg"
dest_files=["res://.godot/imported/AlignContentStretchRowIcon.svg-a266e80aa9bb8b02b559638407561029.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsBaselineColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" fill-rule="evenodd" d="M12 0h-1.5v4.5h-6v6h6V12h-6v6h6v6H12v-6h3v-6h-3v-1.5h6v-6h-6V0Zm-1.5 16.5v-3H6v3h4.5Zm0-7.5V6H6v3h4.5Z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 314 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cmyap54y4yo35"
path="res://.godot/imported/AlignItemsBaselineColumnIcon.svg-12db9ba8b1c5af2f67b4496f15d2a1b5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsBaselineColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsBaselineColumnIcon.svg-12db9ba8b1c5af2f67b4496f15d2a1b5.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsBaselineRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" fill-rule="evenodd" d="M12 4.5h6v6h6V12h-6v3h-6v-3h-1.5v6h-6v-6H0v-1.5h4.5v-6h6v6H12v-6Zm1.5 6h3V6h-3v4.5Zm-4.5 0V6H6v4.5h3Z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 310 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://daysqt8ngikir"
path="res://.godot/imported/AlignItemsBaselineRowIcon.svg-ee5f5f80c57ab0b9c1bb8a5acf7a7ff6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsBaselineRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsBaselineRowIcon.svg-ee5f5f80c57ab0b9c1bb8a5acf7a7ff6.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsCenterColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M12 0h-1.5v4.5h-6v6h6V12H6v6h4.5v6H12v-6h4.5v-6H12v-1.5h6v-6h-6V0Z"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://i3yof2smssw7"
path="res://.godot/imported/AlignItemsCenterColumnIcon.svg-ab2ddd42e3b55aa9dcfb797f6664ebbf.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsCenterColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsCenterColumnIcon.svg-ab2ddd42e3b55aa9dcfb797f6664ebbf.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsCenterRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M4.5 4.5h6v6H12V6h6v4.5h6V12h-6v4.5h-6V12h-1.5v6h-6v-6H0v-1.5h4.5v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dv74mug5v87k6"
path="res://.godot/imported/AlignItemsCenterRowIcon.svg-c0171f6e84379dae8f5d5cca5e70651b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsCenterRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsCenterRowIcon.svg-c0171f6e84379dae8f5d5cca5e70651b.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsEndColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0h-1.5v24H24V0ZM9 4.5h12v6H9v-6ZM12 12h9v6h-9v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 220 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cv0qfpmcerq8t"
path="res://.godot/imported/AlignItemsEndColumnIcon.svg-0b1bec61efada17b6ef38f636a37118d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsEndColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsEndColumnIcon.svg-0b1bec61efada17b6ef38f636a37118d.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsEndRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M10.5 9h-6v12h6V9ZM18 12h-6v9h6v-9ZM0 24v-1.5h24V24H0Z"/></svg>

After

Width:  |  Height:  |  Size: 218 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://uyy8l6dk5r4k"
path="res://.godot/imported/AlignItemsEndRowIcon.svg-78e2def3804324657d53b0434695fc5d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsEndRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsEndRowIcon.svg-78e2def3804324657d53b0434695fc5d.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsStartColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M1.5 0H0v24h1.5V0ZM3 4.5h12v6H3v-6ZM3 12h9v6H3v-6Z"/></svg>

After

Width:  |  Height:  |  Size: 219 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://fwuvoi0hdms0"
path="res://.godot/imported/AlignItemsStartColumnIcon.svg-b03da1dff93ac7771c712ddf441e5466.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStartColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStartColumnIcon.svg-b03da1dff93ac7771c712ddf441e5466.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#d6d6d6" data-wf-icon="AlignItemsStartRowIcon" viewBox="0 0 24 24"><path d="M0 0h24v1.5H0V0ZM10.5 3h-6v12h6V3ZM18 3h-6v9h6V3Z"/></svg>

After

Width:  |  Height:  |  Size: 203 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://csb7tfc5p5bhm"
path="res://.godot/imported/AlignItemsStartRowIcon.svg-2c1c6961d68a00a806c5094555410a31.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStartRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStartRowIcon.svg-2c1c6961d68a00a806c5094555410a31.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsStretchColumnIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" stroke="#d6d6d6" d="M3.75 5.25h16.5v4.5H3.75v-4.5Zm0 7.5h16.5v4.5H3.75v-4.5Z"/><path fill="#d6d6d6" d="M0 0h1.5v24H0V0Zm22.5 0H24v24h-1.5V0Z"/></svg>

After

Width:  |  Height:  |  Size: 308 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cf81mj2tgw2b5"
path="res://.godot/imported/AlignItemsStretchColumnIcon.svg-ecf2a24725ab2745508c65d0c3fa73a7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStretchColumnIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStretchColumnIcon.svg-ecf2a24725ab2745508c65d0c3fa73a7.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="AlignItemsStretchRowIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" d="M24 0H0v1.5h24V0ZM24 24v-1.5H0V24h24ZM4.5 3h6v18h-6V3ZM12 3h6v18h-6V3Z"/></svg>

After

Width:  |  Height:  |  Size: 238 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://qw8gc5s41jag"
path="res://.godot/imported/AlignItemsStretchRowIcon.svg-9b7b56f1bb1014d12909ed7e17069829.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/AlignItemsStretchRowIcon.svg"
dest_files=["res://.godot/imported/AlignItemsStretchRowIcon.svg-9b7b56f1bb1014d12909ed7e17069829.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" data-wf-icon="ArrowReverseIcon" viewBox="0 0 24 24"><path fill="#d6d6d6" fill-rule="evenodd" d="m16.485 6 .015-4.5-6 6 6 6-.015-4.5V6ZM22.5 6h-6v3h6V6ZM7.515 15 7.5 10.5l6 6-6 6 .015-4.5v-3ZM1.5 18h6v-3h-6v3Z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 312 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c5lajpvqkfcv2"
path="res://.godot/imported/ArrowReverseIcon.svg-693bd0370d26679b76ee3608e9c4045e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/ArrowReverseIcon.svg"
dest_files=["res://.godot/imported/ArrowReverseIcon.svg-693bd0370d26679b76ee3608e9c4045e.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

View File

@@ -0,0 +1 @@
<svg width="16" height="16" aria-hidden="true" class="bem-Svg" data-icon="DisplayFlex" style="display:block"><path fill="#d6d6d6" fill-rule="evenodd" d="M2 2h12v12H2V2zM1 1h14v14H1V1z" clip-rule="evenodd" opacity=".6"/><path fill="#d6d6d6" fill-rule="evenodd" d="M7 4H4v8h3V4zm2 0h3v8H9V4z" clip-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 318 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c8x3hek74tddw"
path="res://.godot/imported/DisplayFlexColumn.svg-9fb088e3aea8789b5fbc455f02b614a7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/DisplayFlexColumn.svg"
dest_files=["res://.godot/imported/DisplayFlexColumn.svg-9fb088e3aea8789b5fbc455f02b614a7.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" fill="none"><g><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g fill-rule="evenodd" mask="url(#b)"><path d="M2 14h12V2H2zM1 1h14v14H1z" opacity=".6" style="fill:#919191"/><path d="M12 7H4V4h8zm0 2v3H4V9z" style="fill:#d6d6d6"/></g></g><defs><path id="a" d="M0 0h16v16H0z"/></defs></svg>

After

Width:  |  Height:  |  Size: 400 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2xodbt05umvh"
path="res://.godot/imported/DisplayFlexRow.svg-ef4eb78c813528e12d55e4b37a753a01.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/DisplayFlexRow.svg"
dest_files=["res://.godot/imported/DisplayFlexRow.svg-ef4eb78c813528e12d55e4b37a753a01.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M5 15v-3h6v3zM5 5V2h6v3z"/><path stroke="#d6d6d6" d="M5.5 9.5v-2h5v2z"/></svg>

After

Width:  |  Height:  |  Size: 177 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cfpwpkwc4qfsc"
path="res://.godot/imported/FlexWrapNoWrapColumnIcon.svg-1a0c68d7c077fa1651c1c62b2c35e0f5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/godot-flexbox/assets/dark/FlexWrapNoWrapColumnIcon.svg"
dest_files=["res://.godot/imported/FlexWrapNoWrapColumnIcon.svg-1a0c68d7c077fa1651c1c62b2c35e0f5.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

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none"><path fill="#d6d6d6" d="M1 5h3v6H1zM11 5h3v6h-3z"/><path stroke="#d6d6d6" d="M6.5 5.5h2v5h-2z"/></svg>

After

Width:  |  Height:  |  Size: 177 B

Some files were not shown because too many files have changed in this diff Show More