move wayfinder files to Flumi folder
1
flumi/addons/DatePicker/Calendar.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c134lf0pxabrf
|
||||
95
flumi/addons/DatePicker/Calendar.gd
Normal file
@@ -0,0 +1,95 @@
|
||||
class_name Calendar
|
||||
extends PopupPanel
|
||||
|
||||
@export var header: Button
|
||||
@export var next: BaseButton
|
||||
@export var previous: BaseButton
|
||||
@export var view_parent: Control
|
||||
|
||||
@export var month_view: MonthView
|
||||
@export var year_view: YearView
|
||||
|
||||
var margin: float = 16.0
|
||||
|
||||
var view: Node:
|
||||
get:
|
||||
return view_parent.get_child(0) if view_parent.get_child_count() > 0 else null
|
||||
|
||||
var _date_time: Dictionary = Time.get_datetime_dict_from_system()
|
||||
## The date that the calendar is currently displaying.
|
||||
var date_time: Dictionary:
|
||||
get:
|
||||
return _date_time
|
||||
set(value):
|
||||
_date_time = value
|
||||
date_changed.emit()
|
||||
|
||||
var _selected: Dictionary = Time.get_datetime_dict_from_system()
|
||||
## The date that the user has selected.
|
||||
var selected: Dictionary:
|
||||
get:
|
||||
return _selected
|
||||
set(value):
|
||||
_selected = value
|
||||
date_selected.emit()
|
||||
|
||||
## The earliest date that can be selected.
|
||||
var lower_limit: Dictionary
|
||||
## The latest date that can be selected.
|
||||
var upper_limit: Dictionary
|
||||
## The button that displays this calendar - can be null.
|
||||
var calendar_button: Button
|
||||
|
||||
## The signal emitted when the view changes.
|
||||
signal view_changed(view: Control)
|
||||
## The signal emitted when the date changes.
|
||||
signal date_changed()
|
||||
## The signal emitted when the user selects a date in ANY view.
|
||||
signal date_selected()
|
||||
## The signal emitted when the user is finished selecting a date.
|
||||
signal finished()
|
||||
|
||||
func init():
|
||||
header.text = "%s %s" % [MonthView.num_to_month(date_time.month), date_time.year]
|
||||
|
||||
header.pressed.connect(_on_header_pressed)
|
||||
previous.pressed.connect(func(): if view: view.previous())
|
||||
next.pressed.connect(func(): if view: view.next())
|
||||
|
||||
year_view.init()
|
||||
|
||||
func _enter_tree():
|
||||
get_tree().root.gui_focus_changed.connect(_on_gui_focus_changed)
|
||||
|
||||
func _exit_tree():
|
||||
if get_tree() and get_tree().root:
|
||||
get_tree().root.gui_focus_changed.disconnect(_on_gui_focus_changed)
|
||||
|
||||
func _on_header_pressed():
|
||||
var is_default = month_view.visible
|
||||
if is_default:
|
||||
month_view.hide()
|
||||
year_view.show()
|
||||
else:
|
||||
month_view.show()
|
||||
year_view.hide()
|
||||
|
||||
func _on_gui_focus_changed(focus: Control):
|
||||
if focus and not is_ancestor_of(focus) and not focus is DateButton:
|
||||
visible = false
|
||||
|
||||
func set_view(new_view: Node):
|
||||
if view:
|
||||
view.queue_free()
|
||||
new_view.calendar = self
|
||||
view_parent.add_child(new_view)
|
||||
view_changed.emit(new_view)
|
||||
|
||||
func _gui_input(event: InputEvent):
|
||||
if event is InputEventMouseButton:
|
||||
var mb = event as InputEventMouseButton
|
||||
if mb.pressed:
|
||||
if mb.button_index == MOUSE_BUTTON_WHEEL_DOWN and view:
|
||||
view.next()
|
||||
elif mb.button_index == MOUSE_BUTTON_WHEEL_UP and view:
|
||||
view.previous()
|
||||
1
flumi/addons/DatePicker/Calendar.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bh27iqijrabku
|
||||
88
flumi/addons/DatePicker/Calendar.tscn
Normal file
@@ -0,0 +1,88 @@
|
||||
[gd_scene load_steps=14 format=3 uid="uid://dgn7djiy1xhlu"]
|
||||
|
||||
[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="1_1ddb1"]
|
||||
[ext_resource type="Script" uid="uid://bh27iqijrabku" path="res://addons/DatePicker/Calendar.gd" id="1_heut6"]
|
||||
[ext_resource type="Texture2D" uid="uid://d1jslyy8aajcn" path="res://Assets/Icons/arrow-up.svg" id="3_1ddb1"]
|
||||
[ext_resource type="Texture2D" uid="uid://df1m4j7uxi63v" path="res://Assets/Icons/chevron-down.svg" id="3_rjgii"]
|
||||
[ext_resource type="Texture2D" uid="uid://c1bqnfwurnnrc" path="res://Assets/Icons/arrow-down.svg" id="4_rjgii"]
|
||||
[ext_resource type="PackedScene" uid="uid://n5ra5w5aupx7" path="res://addons/DatePicker/YearView.tscn" id="5_qmkbm"]
|
||||
[ext_resource type="PackedScene" uid="uid://hiv2ckjbs43p" path="res://addons/DatePicker/MonthView.tscn" id="6_rjgii"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_w2pln"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_s0l8g"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mavvk"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j0d5i"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1e668"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5m4sc"]
|
||||
|
||||
[node name="Calendar" type="PopupPanel" node_paths=PackedStringArray("header", "next", "previous", "view_parent", "month_view", "year_view")]
|
||||
size = Vector2i(263, 308)
|
||||
visible = true
|
||||
theme = ExtResource("1_1ddb1")
|
||||
script = ExtResource("1_heut6")
|
||||
header = NodePath("VboxContainer/HeaderContainer/HeaderButton")
|
||||
next = NodePath("VboxContainer/HeaderContainer/Next")
|
||||
previous = NodePath("VboxContainer/HeaderContainer/Previous")
|
||||
view_parent = NodePath("VboxContainer/View")
|
||||
month_view = NodePath("VboxContainer/View/MonthView")
|
||||
year_view = NodePath("VboxContainer/View/YearView")
|
||||
|
||||
[node name="VboxContainer" type="VBoxContainer" parent="."]
|
||||
offset_left = 15.0
|
||||
offset_top = 15.0
|
||||
offset_right = 248.0
|
||||
offset_bottom = 293.0
|
||||
theme_override_constants/separation = 12
|
||||
|
||||
[node name="HeaderContainer" type="HBoxContainer" parent="VboxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HeaderButton" type="Button" parent="VboxContainer/HeaderContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_w2pln")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxEmpty_s0l8g")
|
||||
text = "July 1980"
|
||||
icon = ExtResource("3_rjgii")
|
||||
flat = true
|
||||
alignment = 0
|
||||
icon_alignment = 2
|
||||
|
||||
[node name="Spacer" type="Control" parent="VboxContainer/HeaderContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Previous" type="Button" parent="VboxContainer/HeaderContainer"]
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_mavvk")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxEmpty_j0d5i")
|
||||
icon = ExtResource("3_1ddb1")
|
||||
flat = true
|
||||
|
||||
[node name="Next" type="Button" parent="VboxContainer/HeaderContainer"]
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_1e668")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxEmpty_5m4sc")
|
||||
icon = ExtResource("4_rjgii")
|
||||
flat = true
|
||||
|
||||
[node name="View" type="Control" parent="VboxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="MonthView" parent="VboxContainer/View" node_paths=PackedStringArray("calendar") instance=ExtResource("6_rjgii")]
|
||||
layout_mode = 0
|
||||
calendar = NodePath("../../..")
|
||||
|
||||
[node name="YearView" parent="VboxContainer/View" node_paths=PackedStringArray("calendar") instance=ExtResource("5_qmkbm")]
|
||||
visible = false
|
||||
layout_mode = 0
|
||||
calendar = NodePath("../../..")
|
||||
4
flumi/addons/DatePicker/CalendarGroup.tres
Normal file
@@ -0,0 +1,4 @@
|
||||
[gd_resource type="ButtonGroup" format=3 uid="uid://bqxxq56yxl44h"]
|
||||
|
||||
[resource]
|
||||
allow_unpress = true
|
||||
1
flumi/addons/DatePicker/DateButton.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ds2esqjkjc4h0
|
||||
77
flumi/addons/DatePicker/DateButton.gd
Normal file
@@ -0,0 +1,77 @@
|
||||
class_name DateButton
|
||||
extends Button
|
||||
|
||||
var calendar: Calendar
|
||||
var calendar_control: Control
|
||||
|
||||
const CALENDAR = preload("res://addons/DatePicker/Calendar.tscn")
|
||||
|
||||
func init():
|
||||
text = "mm/dd/yyyy"
|
||||
_init_calendar()
|
||||
|
||||
func _init_calendar():
|
||||
calendar = CALENDAR.instantiate()
|
||||
add_child(calendar)
|
||||
calendar.hide()
|
||||
calendar.init()
|
||||
|
||||
pressed.connect(_on_button_pressed)
|
||||
calendar.popup_hide.connect(func(): button_pressed = false)
|
||||
calendar.finished.connect(_on_date_selected)
|
||||
tree_exited.connect(func(): if is_instance_valid(calendar): calendar.queue_free())
|
||||
|
||||
func init_with_date(date_string: String) -> void:
|
||||
_init_calendar()
|
||||
|
||||
var parsed_date = parse_date_string(date_string)
|
||||
if parsed_date:
|
||||
calendar.date_time = parsed_date
|
||||
calendar.selected = parsed_date.duplicate()
|
||||
update_button_text()
|
||||
else:
|
||||
text = "mm/dd/yyyy" # Set default text if parsing fails
|
||||
|
||||
func parse_date_string(date_string: String) -> Dictionary:
|
||||
# Parse ISO date format (YYYY-MM-DD)
|
||||
var parts = date_string.split("-")
|
||||
if parts.size() != 3:
|
||||
return {}
|
||||
|
||||
var year = parts[0].to_int()
|
||||
var month = parts[1].to_int()
|
||||
var day = parts[2].to_int()
|
||||
|
||||
# Validate date components
|
||||
if year < 1 or month < 1 or month > 12 or day < 1 or day > 31:
|
||||
return {}
|
||||
|
||||
return {
|
||||
"year": year,
|
||||
"month": month,
|
||||
"day": day
|
||||
}
|
||||
|
||||
func update_button_text() -> void:
|
||||
var date = calendar.selected
|
||||
text = "%d/%d/%d" % [date.month, date.day, date.year]
|
||||
|
||||
func _on_date_selected():
|
||||
var date = calendar.selected
|
||||
text = "%02d/%02d/%04d" % [date.month, date.day, date.year]
|
||||
|
||||
func _on_button_pressed():
|
||||
if calendar.is_visible():
|
||||
calendar.hide()
|
||||
return
|
||||
|
||||
var viewport_height = get_viewport_rect().size.y
|
||||
var show_above = false
|
||||
if get_global_position().y + size.y + calendar.size.y > viewport_height and get_global_position().y * 2 + size.y > viewport_height:
|
||||
show_above = true
|
||||
|
||||
var h_offset = (size.x - calendar.size.x) / 2
|
||||
var v_offset = -calendar.size.y if show_above else size.y
|
||||
|
||||
calendar.position = get_screen_position() + Vector2(h_offset, v_offset)
|
||||
calendar.popup()
|
||||
1
flumi/addons/DatePicker/DateButton.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://do548vwv7m0rq
|
||||
33
flumi/addons/DatePicker/DateButton.tscn
Normal file
@@ -0,0 +1,33 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://b6c1twaog7hui"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://mol3s1ujp0k2" path="res://Assets/Icons/calendar_16x16.svg" id="1_ef33s"]
|
||||
[ext_resource type="Script" uid="uid://do548vwv7m0rq" path="res://addons/DatePicker/DateButton.gd" id="1_sskq5"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ef33s"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ufs0o"]
|
||||
content_margin_left = 4.0
|
||||
bg_color = Color(0.105882, 0.105882, 0.105882, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pnupr"]
|
||||
content_margin_left = 4.0
|
||||
bg_color = Color(0.105882, 0.105882, 0.105882, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[node name="DateButton" type="Button"]
|
||||
offset_right = 115.0
|
||||
offset_bottom = 34.0
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_ef33s")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_ufs0o")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_pnupr")
|
||||
action_mode = 0
|
||||
text = "3/13/2025"
|
||||
icon = ExtResource("1_ef33s")
|
||||
script = ExtResource("1_sskq5")
|
||||
1
flumi/addons/DatePicker/ICalendarView.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://crwtb840n4orl
|
||||
19
flumi/addons/DatePicker/ICalendarView.gd
Normal file
@@ -0,0 +1,19 @@
|
||||
class_name ICalendarView
|
||||
extends RefCounted
|
||||
|
||||
## A view that dictates how a calendar should be displayed (i.e. MonthView or YearView).
|
||||
|
||||
## The calendar that this view is a part of.
|
||||
var calendar: Calendar
|
||||
|
||||
## When the user clicks the previous button (i.e. go to the previous year).
|
||||
func previous():
|
||||
pass
|
||||
|
||||
## When the user clicks the next button (i.e. go to the next year).
|
||||
func next():
|
||||
pass
|
||||
|
||||
## Update the view to reflect the selected date.
|
||||
func refresh():
|
||||
pass
|
||||
1
flumi/addons/DatePicker/ICalendarView.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://lxw1ab33fva2
|
||||
21
flumi/addons/DatePicker/LICENSE.md
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Christopher Charbonneau
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
1
flumi/addons/DatePicker/MonthView.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bc88158gaxg4f
|
||||
146
flumi/addons/DatePicker/MonthView.gd
Normal file
@@ -0,0 +1,146 @@
|
||||
class_name MonthView
|
||||
extends VBoxContainer
|
||||
|
||||
@export var calendar: Calendar
|
||||
|
||||
var buttons: GridContainer
|
||||
var dates: Array = []
|
||||
var _updating: bool = false
|
||||
|
||||
func _ready():
|
||||
buttons = $Days
|
||||
for i in range(buttons.get_child_count()):
|
||||
buttons.get_child(i).toggled.connect(_on_day_toggled.bind(i))
|
||||
refresh()
|
||||
|
||||
func _on_day_toggled(toggled: bool, button_index: int):
|
||||
if _updating or button_index >= dates.size() or not dates[button_index]:
|
||||
return
|
||||
|
||||
var button = buttons.get_child(button_index)
|
||||
if not toggled:
|
||||
button.set_pressed_no_signal(true)
|
||||
return
|
||||
|
||||
for i in range(buttons.get_child_count()):
|
||||
if i != button_index:
|
||||
buttons.get_child(i).set_pressed_no_signal(false)
|
||||
|
||||
calendar.selected = dates[button_index]
|
||||
calendar.date_time = dates[button_index].duplicate()
|
||||
calendar.hide()
|
||||
calendar.finished.emit()
|
||||
|
||||
func previous():
|
||||
var new_date = calendar.date_time.duplicate()
|
||||
new_date.month -= 1
|
||||
if new_date.month < 1:
|
||||
new_date.month = 12
|
||||
new_date.year -= 1
|
||||
calendar.date_time = new_date
|
||||
refresh()
|
||||
|
||||
func next():
|
||||
var new_date = calendar.date_time.duplicate()
|
||||
new_date.month += 1
|
||||
if new_date.month > 12:
|
||||
new_date.month = 1
|
||||
new_date.year += 1
|
||||
calendar.date_time = new_date
|
||||
refresh()
|
||||
|
||||
func refresh():
|
||||
_updating = true
|
||||
calendar.header.text = "%s %s" % [num_to_month(calendar.date_time.month), calendar.date_time.year]
|
||||
dates.clear()
|
||||
dates.resize(buttons.get_child_count())
|
||||
|
||||
for i in range(buttons.get_child_count()):
|
||||
var button = buttons.get_child(i)
|
||||
button.text = ""
|
||||
button.set_pressed_no_signal(false)
|
||||
dates[i] = null
|
||||
|
||||
var first_day = calendar.date_time.duplicate()
|
||||
first_day.day = 1
|
||||
var start_day = Time.get_datetime_dict_from_unix_time(
|
||||
Time.get_unix_time_from_datetime_dict(first_day)
|
||||
).weekday % 7
|
||||
|
||||
var days_in_month = get_days_in_month(calendar.date_time.year, calendar.date_time.month)
|
||||
|
||||
var prev_month_num = calendar.date_time.month - 1
|
||||
var prev_year = calendar.date_time.year
|
||||
if prev_month_num < 1:
|
||||
prev_month_num = 12
|
||||
prev_year -= 1
|
||||
var prev_days = get_days_in_month(prev_year, prev_month_num)
|
||||
|
||||
var gray_color = Color(0.51, 0.54, 0.596)
|
||||
var dark_color = Color(0.133, 0.137, 0.137)
|
||||
|
||||
# Fill previous month days
|
||||
for i in range(start_day):
|
||||
var day = prev_days - start_day + i + 1
|
||||
var button = buttons.get_child(i)
|
||||
dates[i] = {"year": prev_year, "month": prev_month_num, "day": day}
|
||||
button.text = str(day)
|
||||
button.add_theme_color_override("font_color", gray_color)
|
||||
button.add_theme_color_override("font_hover_color", gray_color)
|
||||
button.set_pressed_no_signal(
|
||||
day == calendar.selected.day and
|
||||
calendar.selected.year == prev_year and
|
||||
calendar.selected.month == prev_month_num
|
||||
)
|
||||
|
||||
# Fill current month days
|
||||
for i in range(days_in_month):
|
||||
var button = buttons.get_child(i + start_day)
|
||||
dates[i + start_day] = {"year": calendar.date_time.year, "month": calendar.date_time.month, "day": i + 1}
|
||||
button.text = str(i + 1)
|
||||
button.add_theme_color_override("font_color", dark_color)
|
||||
button.add_theme_color_override("font_hover_color", dark_color)
|
||||
button.set_pressed_no_signal(
|
||||
i + 1 == calendar.selected.day and
|
||||
calendar.selected.year == calendar.date_time.year and
|
||||
calendar.selected.month == calendar.date_time.month
|
||||
)
|
||||
|
||||
var next_month_num = calendar.date_time.month + 1
|
||||
var next_year = calendar.date_time.year
|
||||
if next_month_num > 12:
|
||||
next_month_num = 1
|
||||
next_year += 1
|
||||
|
||||
# Fill next month days
|
||||
for i in range(days_in_month + start_day, buttons.get_child_count()):
|
||||
var day = i + 1 - days_in_month - start_day
|
||||
var button = buttons.get_child(i)
|
||||
dates[i] = {"year": next_year, "month": next_month_num, "day": day}
|
||||
button.text = str(day)
|
||||
button.add_theme_color_override("font_color", gray_color)
|
||||
button.add_theme_color_override("font_hover_color", gray_color)
|
||||
button.set_pressed_no_signal(
|
||||
day == calendar.selected.day and
|
||||
calendar.selected.year == next_year and
|
||||
calendar.selected.month == next_month_num
|
||||
)
|
||||
|
||||
_updating = false
|
||||
|
||||
func get_days_in_month(year: int, month: int) -> int:
|
||||
var thirty_one = [1, 3, 5, 7, 8, 10, 12]
|
||||
var thirty = [4, 6, 9, 11]
|
||||
|
||||
if month in thirty_one:
|
||||
return 31
|
||||
elif month in thirty:
|
||||
return 30
|
||||
elif month == 2:
|
||||
return 29 if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) else 28
|
||||
else:
|
||||
return 0
|
||||
|
||||
static func num_to_month(month: int) -> String:
|
||||
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
||||
return months[month - 1]
|
||||
1
flumi/addons/DatePicker/MonthView.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://drxqmka0n1ntw
|
||||
642
flumi/addons/DatePicker/MonthView.tscn
Normal file
@@ -0,0 +1,642 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://hiv2ckjbs43p"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://drxqmka0n1ntw" path="res://addons/DatePicker/MonthView.gd" id="1_iouni"]
|
||||
[ext_resource type="ButtonGroup" uid="uid://bqxxq56yxl44h" path="res://addons/DatePicker/CalendarGroup.tres" id="2_nfkp2"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5l1mp"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5l1mp"]
|
||||
bg_color = Color(0.613675, 0.748845, 0.957838, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pressed"]
|
||||
bg_color = Color(0.247059, 0.466667, 0.807843, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ochoi"]
|
||||
bg_color = Color(1, 1, 1, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[node name="MonthView" type="VBoxContainer"]
|
||||
offset_right = 234.0
|
||||
offset_bottom = 240.0
|
||||
script = ExtResource("1_iouni")
|
||||
|
||||
[node name="DayOfWeek" type="GridContainer" parent="."]
|
||||
layout_mode = 2
|
||||
columns = 7
|
||||
|
||||
[node name="Sunday" type="Label" parent="DayOfWeek"]
|
||||
custom_minimum_size = Vector2(0, 36)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Su"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="Monday" type="Label" parent="DayOfWeek"]
|
||||
custom_minimum_size = Vector2(0, 36)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Mo"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="Tuesday" type="Label" parent="DayOfWeek"]
|
||||
custom_minimum_size = Vector2(0, 36)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Tu"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="Wednesday" type="Label" parent="DayOfWeek"]
|
||||
custom_minimum_size = Vector2(0, 36)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "We"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="Thursday" type="Label" parent="DayOfWeek"]
|
||||
custom_minimum_size = Vector2(0, 36)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Th"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="Friday" type="Label" parent="DayOfWeek"]
|
||||
custom_minimum_size = Vector2(0, 36)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Fr"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="Saturday" type="Label" parent="DayOfWeek"]
|
||||
custom_minimum_size = Vector2(0, 36)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Sa"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="Days" type="GridContainer" parent="."]
|
||||
layout_mode = 2
|
||||
columns = 7
|
||||
|
||||
[node name="Button0" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button1" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button2" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button3" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button4" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button5" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button6" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button7" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button8" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button9" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button10" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button11" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button12" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button13" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button14" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button15" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button16" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button17" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button18" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button19" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button20" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button21" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button22" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button23" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button24" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button25" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button26" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button27" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button28" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button29" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button30" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button31" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button32" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button33" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button34" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button35" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button36" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button37" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button38" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button39" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button40" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
|
||||
[node name="Button41" type="Button" parent="Days"]
|
||||
custom_minimum_size = Vector2(30, 30)
|
||||
layout_mode = 2
|
||||
mouse_default_cursor_shape = 2
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_5l1mp")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_5l1mp")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_ochoi")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_nfkp2")
|
||||
4
flumi/addons/DatePicker/README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
This is a heavily modified version of **DatePicker** by [chrisizeful](https://github.com/chrisizeful/)
|
||||
|
||||
- GitHub: https://github.com/chrisizeful/DatePicker
|
||||
- Godot Asset: https://godotengine.org/asset-library/asset/3835
|
||||
1
flumi/addons/DatePicker/YearView.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b5qslpdcfyikx
|
||||
92
flumi/addons/DatePicker/YearView.gd
Normal file
@@ -0,0 +1,92 @@
|
||||
class_name YearView
|
||||
extends HBoxContainer
|
||||
|
||||
@export var calendar: Calendar
|
||||
|
||||
func init():
|
||||
var button_example: Button = %Button
|
||||
var year_container: VBoxContainer = %YearContainer
|
||||
|
||||
var buttons_data = []
|
||||
for i in range(200):
|
||||
var year = i + 1900
|
||||
buttons_data.append(year)
|
||||
|
||||
for year in buttons_data:
|
||||
var new_btn: Button = button_example.duplicate()
|
||||
new_btn.name = "Year" + str(year)
|
||||
new_btn.pressed.connect(_on_year_selected.bind(year))
|
||||
new_btn.text = str(year)
|
||||
year_container.add_child(new_btn)
|
||||
|
||||
button_example.queue_free()
|
||||
|
||||
year_container.resized.connect(func():
|
||||
scroll_to_current_year()
|
||||
refresh()
|
||||
)
|
||||
|
||||
func scroll_to_current_year():
|
||||
var year_container: VBoxContainer = %YearContainer
|
||||
var scroll_container: ScrollContainer = $SmoothScrollContainer
|
||||
|
||||
var current_year = calendar.date_time.year
|
||||
var target_button: Button = year_container.get_node_or_null("Year" + str(current_year))
|
||||
|
||||
if not target_button:
|
||||
return
|
||||
|
||||
while target_button.position.y <= 0:
|
||||
await get_tree().process_frame
|
||||
|
||||
for child in year_container.get_children():
|
||||
if child is Button:
|
||||
child.set_pressed_no_signal(child == target_button)
|
||||
|
||||
var button_position = target_button.position.y
|
||||
var container_height = scroll_container.size.y
|
||||
var button_height = target_button.size.y
|
||||
var scroll_position = button_position - (container_height / 2) + (button_height / 2)
|
||||
|
||||
scroll_container.scroll_vertical = max(0, scroll_position)
|
||||
|
||||
func _on_year_selected(year: int):
|
||||
var new_date = calendar.date_time.duplicate()
|
||||
new_date.year = year
|
||||
calendar.selected = new_date
|
||||
calendar.date_time = new_date
|
||||
|
||||
if calendar.has_signal("date_changed"):
|
||||
calendar.date_changed.emit(new_date)
|
||||
|
||||
calendar.year_view.hide()
|
||||
calendar.month_view.show()
|
||||
calendar.month_view.refresh()
|
||||
|
||||
calendar.finished.emit()
|
||||
|
||||
func previous():
|
||||
var new_date = calendar.date_time.duplicate()
|
||||
new_date.year -= 1
|
||||
calendar.date_time = new_date
|
||||
refresh()
|
||||
|
||||
func next():
|
||||
var new_date = calendar.date_time.duplicate()
|
||||
new_date.year += 1
|
||||
calendar.date_time = new_date
|
||||
refresh()
|
||||
|
||||
func refresh():
|
||||
var current_time = Time.get_unix_time_from_system()
|
||||
|
||||
calendar.header.text = "%s %s" % [MonthView.num_to_month(calendar.date_time.month), calendar.date_time.year]
|
||||
|
||||
for child in %YearContainer.get_children():
|
||||
if child is Button:
|
||||
child.set_pressed_no_signal(false)
|
||||
|
||||
var target_button_name = "Year" + str(calendar.date_time.year)
|
||||
var target_button = %YearContainer.get_node_or_null(target_button_name)
|
||||
if target_button:
|
||||
target_button.set_pressed_no_signal(true)
|
||||
1
flumi/addons/DatePicker/YearView.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c8nfr825g08sy
|
||||
82
flumi/addons/DatePicker/YearView.tscn
Normal file
@@ -0,0 +1,82 @@
|
||||
[gd_scene load_steps=11 format=3 uid="uid://n5ra5w5aupx7"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c8nfr825g08sy" path="res://addons/DatePicker/YearView.gd" id="1_hiiks"]
|
||||
[ext_resource type="Script" uid="uid://bgqglerkcylxx" path="res://addons/SmoothScroll/SmoothScrollContainer.gd" id="1_sw7yn"]
|
||||
[ext_resource type="ButtonGroup" uid="uid://bqxxq56yxl44h" path="res://addons/DatePicker/CalendarGroup.tres" id="2_2qddy"]
|
||||
[ext_resource type="Script" uid="uid://b7h0k2h2qwlqv" path="res://addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd" id="2_iofl3"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_wpifq"]
|
||||
script = ExtResource("2_iofl3")
|
||||
friction = 4.0
|
||||
minimum_velocity = 0.4
|
||||
rebound_strength = 7.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_kdl71"]
|
||||
script = ExtResource("2_iofl3")
|
||||
friction = 4.0
|
||||
minimum_velocity = 0.4
|
||||
rebound_strength = 7.0
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_iofl3"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kdl71"]
|
||||
content_margin_left = 8.0
|
||||
bg_color = Color(0.168627, 0.168627, 0.168627, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pressed"]
|
||||
content_margin_left = 8.0
|
||||
bg_color = Color(0.247059, 0.466667, 0.807843, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wpifq"]
|
||||
content_margin_left = 8.0
|
||||
bg_color = Color(0.105882, 0.105882, 0.105882, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[node name="YearView" type="HBoxContainer"]
|
||||
script = ExtResource("1_hiiks")
|
||||
|
||||
[node name="SmoothScrollContainer" type="ScrollContainer" parent="."]
|
||||
custom_minimum_size = Vector2(234, 240)
|
||||
layout_mode = 2
|
||||
script = ExtResource("1_sw7yn")
|
||||
wheel_scroll_damper = SubResource("Resource_wpifq")
|
||||
dragging_scroll_damper = SubResource("Resource_kdl71")
|
||||
drag_with_mouse = false
|
||||
allow_overdragging = false
|
||||
metadata/_custom_type_script = "uid://bgqglerkcylxx"
|
||||
|
||||
[node name="YearContainer" type="VBoxContainer" parent="SmoothScrollContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(234, 240)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
|
||||
[node name="Button" type="Button" parent="SmoothScrollContainer/YearContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(34, 5)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
mouse_filter = 1
|
||||
theme_override_colors/font_color = Color(1, 1, 1, 1)
|
||||
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_iofl3")
|
||||
theme_override_styles/hover = SubResource("StyleBoxFlat_kdl71")
|
||||
theme_override_styles/pressed = SubResource("StyleBoxFlat_pressed")
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_wpifq")
|
||||
toggle_mode = true
|
||||
button_group = ExtResource("2_2qddy")
|
||||
text = "2025"
|
||||
alignment = 0
|
||||
7
flumi/addons/DatePicker/plugin.cfg
Normal file
@@ -0,0 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="DatePicker"
|
||||
description="A themed Godot calendar addon inspiried by the Windows 11 calendar."
|
||||
author="Chris Charbonneau"
|
||||
version="1.0.0"
|
||||
script=""
|
||||
916
flumi/addons/SmoothScroll/SmoothScrollContainer.gd
Normal 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
|
||||
1
flumi/addons/SmoothScroll/SmoothScrollContainer.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bgqglerkcylxx
|
||||
19
flumi/addons/SmoothScroll/class-icon.svg
Normal 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 |
37
flumi/addons/SmoothScroll/class-icon.svg.import
Normal 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
|
||||
3
flumi/addons/SmoothScroll/debug_font.tres
Normal file
@@ -0,0 +1,3 @@
|
||||
[gd_resource type="SystemFont" format=3 uid="uid://cw8c0p3b5mv5y"]
|
||||
|
||||
[resource]
|
||||
BIN
flumi/addons/SmoothScroll/icon.afdesign
Normal file
8
flumi/addons/SmoothScroll/plugin.cfg
Normal 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"
|
||||
12
flumi/addons/SmoothScroll/plugin.gd
Normal 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")
|
||||
1
flumi/addons/SmoothScroll/plugin.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b7svd7w4nwpch
|
||||
@@ -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)
|
||||
@@ -0,0 +1 @@
|
||||
uid://dlagxcnf11lr4
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
uid://b7h0k2h2qwlqv
|
||||
BIN
flumi/addons/SmoothScroll/scroll_damper/icon.afdesign
Normal file
29
flumi/addons/SmoothScroll/scroll_damper/icon.svg
Normal 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 |
37
flumi/addons/SmoothScroll/scroll_damper/icon.svg.import
Normal 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
|
||||
@@ -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)
|
||||
@@ -0,0 +1 @@
|
||||
uid://dvvc75dvopgcg
|
||||
@@ -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)
|
||||
@@ -0,0 +1 @@
|
||||
uid://ccgjrqkk3oksk
|
||||
74
flumi/addons/SmoothScroll/scroll_damper/scroll_damper.gd
Normal 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
|
||||
@@ -0,0 +1 @@
|
||||
uid://bcy471w0pi8af
|
||||
81
flumi/addons/godot-flexbox/assets.gd
Normal 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
|
||||
1
flumi/addons/godot-flexbox/assets.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://df0yh5hcurt8
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |