diff --git a/flumi/Scenes/main.tscn b/flumi/Scenes/main.tscn
index 1e0c479..23bd2bf 100644
--- a/flumi/Scenes/main.tscn
+++ b/flumi/Scenes/main.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=40 format=3 uid="uid://bytm7bt2s4ak8"]
+[gd_scene load_steps=36 format=3 uid="uid://bytm7bt2s4ak8"]
[ext_resource type="Script" uid="uid://bg5iqnwic1rio" path="res://Scripts/main.gd" id="1_8q3xr"]
[ext_resource type="Texture2D" uid="uid://df1m4j7uxi63v" path="res://Assets/Icons/chevron-down.svg" id="2_6bp64"]
@@ -10,8 +10,6 @@
[ext_resource type="Texture2D" uid="uid://cu4hjoba6etf" path="res://Assets/Icons/rotate-cw.svg" id="5_344ge"]
[ext_resource type="Texture2D" uid="uid://cehbtwq6gq0cn" path="res://Assets/Icons/plus.svg" id="5_ynf5e"]
[ext_resource type="Texture2D" uid="uid://cklatjc4m38dy" path="res://Assets/Icons/ellipsis-vertical.svg" id="10_6iyac"]
-[ext_resource type="Script" uid="uid://bgqglerkcylxx" path="res://addons/SmoothScroll/SmoothScrollContainer.gd" id="10_d1ilt"]
-[ext_resource type="Script" uid="uid://b7h0k2h2qwlqv" path="res://addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd" id="11_6iyac"]
[ext_resource type="Theme" uid="uid://bn6rbmdy60lhr" path="res://Scenes/Styles/BrowserText.tres" id="11_ee4r6"]
[ext_resource type="Script" uid="uid://vjjhljlftlbk" path="res://Scripts/OptionButton.gd" id="11_gt3je"]
[ext_resource type="Texture2D" uid="uid://du24f6em2nqwq" path="res://Assets/Icons/external-link.svg" id="12_gt3je"]
@@ -76,18 +74,6 @@ expand_margin_left = 40.0
LineEdit/styles/focus = SubResource("StyleBoxEmpty_u50mg")
LineEdit/styles/normal = SubResource("StyleBoxFlat_cbgmd")
-[sub_resource type="Resource" id="Resource_fdnlq"]
-script = ExtResource("11_6iyac")
-friction = 4.0
-minimum_velocity = 0.4
-rebound_strength = 7.0
-
-[sub_resource type="Resource" id="Resource_jkdf5"]
-script = ExtResource("11_6iyac")
-friction = 4.0
-minimum_velocity = 0.4
-rebound_strength = 7.0
-
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_white"]
bg_color = Color(1, 1, 1, 1)
@@ -273,12 +259,6 @@ layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
-script = ExtResource("10_d1ilt")
-wheel_scroll_damper = SubResource("Resource_fdnlq")
-dragging_scroll_damper = SubResource("Resource_jkdf5")
-drag_with_mouse = false
-allow_overdragging = false
-metadata/_custom_type_script = "uid://bgqglerkcylxx"
[node name="WebsiteContainer" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"]
unique_name_in_owner = true
diff --git a/flumi/addons/DatePicker/YearView.tscn b/flumi/addons/DatePicker/YearView.tscn
index 35810a1..3b39692 100644
--- a/flumi/addons/DatePicker/YearView.tscn
+++ b/flumi/addons/DatePicker/YearView.tscn
@@ -1,21 +1,7 @@
-[gd_scene load_steps=11 format=3 uid="uid://n5ra5w5aupx7"]
+[gd_scene load_steps=7 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"]
@@ -46,24 +32,18 @@ corner_radius_bottom_left = 4
[node name="YearView" type="HBoxContainer"]
script = ExtResource("1_hiiks")
-[node name="SmoothScrollContainer" type="ScrollContainer" parent="."]
+[node name="ScrollContainer" 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"]
+[node name="YearContainer" type="VBoxContainer" parent="ScrollContainer"]
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"]
+[node name="Button" type="Button" parent="ScrollContainer/YearContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(34, 5)
layout_mode = 2
diff --git a/flumi/addons/SmoothScroll/SmoothScrollContainer.gd b/flumi/addons/SmoothScroll/SmoothScrollContainer.gd
deleted file mode 100644
index 4c3c9ce..0000000
--- a/flumi/addons/SmoothScroll/SmoothScrollContainer.gd
+++ /dev/null
@@ -1,916 +0,0 @@
-## 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
diff --git a/flumi/addons/SmoothScroll/SmoothScrollContainer.gd.uid b/flumi/addons/SmoothScroll/SmoothScrollContainer.gd.uid
deleted file mode 100644
index 305c994..0000000
--- a/flumi/addons/SmoothScroll/SmoothScrollContainer.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://bgqglerkcylxx
diff --git a/flumi/addons/SmoothScroll/class-icon.svg b/flumi/addons/SmoothScroll/class-icon.svg
deleted file mode 100644
index 30862c1..0000000
--- a/flumi/addons/SmoothScroll/class-icon.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
diff --git a/flumi/addons/SmoothScroll/class-icon.svg.import b/flumi/addons/SmoothScroll/class-icon.svg.import
deleted file mode 100644
index 488e0a4..0000000
--- a/flumi/addons/SmoothScroll/class-icon.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[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
diff --git a/flumi/addons/SmoothScroll/debug_font.tres b/flumi/addons/SmoothScroll/debug_font.tres
deleted file mode 100644
index 3871a65..0000000
--- a/flumi/addons/SmoothScroll/debug_font.tres
+++ /dev/null
@@ -1,3 +0,0 @@
-[gd_resource type="SystemFont" format=3 uid="uid://cw8c0p3b5mv5y"]
-
-[resource]
diff --git a/flumi/addons/SmoothScroll/icon.afdesign b/flumi/addons/SmoothScroll/icon.afdesign
deleted file mode 100644
index 1b54598..0000000
Binary files a/flumi/addons/SmoothScroll/icon.afdesign and /dev/null differ
diff --git a/flumi/addons/SmoothScroll/plugin.cfg b/flumi/addons/SmoothScroll/plugin.cfg
deleted file mode 100644
index 2c42343..0000000
--- a/flumi/addons/SmoothScroll/plugin.cfg
+++ /dev/null
@@ -1,8 +0,0 @@
-[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"
diff --git a/flumi/addons/SmoothScroll/plugin.gd b/flumi/addons/SmoothScroll/plugin.gd
deleted file mode 100644
index de14735..0000000
--- a/flumi/addons/SmoothScroll/plugin.gd
+++ /dev/null
@@ -1,12 +0,0 @@
-@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")
diff --git a/flumi/addons/SmoothScroll/plugin.gd.uid b/flumi/addons/SmoothScroll/plugin.gd.uid
deleted file mode 100644
index ca7fc96..0000000
--- a/flumi/addons/SmoothScroll/plugin.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://b7svd7w4nwpch
diff --git a/flumi/addons/SmoothScroll/scroll_damper/cubic_scroll_damper.gd b/flumi/addons/SmoothScroll/scroll_damper/cubic_scroll_damper.gd
deleted file mode 100644
index 3c40815..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/cubic_scroll_damper.gd
+++ /dev/null
@@ -1,33 +0,0 @@
-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)
diff --git a/flumi/addons/SmoothScroll/scroll_damper/cubic_scroll_damper.gd.uid b/flumi/addons/SmoothScroll/scroll_damper/cubic_scroll_damper.gd.uid
deleted file mode 100644
index 5917f98..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/cubic_scroll_damper.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://dlagxcnf11lr4
diff --git a/flumi/addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd b/flumi/addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd
deleted file mode 100644
index c6d9b9d..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd
+++ /dev/null
@@ -1,47 +0,0 @@
-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
diff --git a/flumi/addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd.uid b/flumi/addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd.uid
deleted file mode 100644
index bd22621..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/expo_scroll_damper.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://b7h0k2h2qwlqv
diff --git a/flumi/addons/SmoothScroll/scroll_damper/icon.afdesign b/flumi/addons/SmoothScroll/scroll_damper/icon.afdesign
deleted file mode 100644
index 2bd817e..0000000
Binary files a/flumi/addons/SmoothScroll/scroll_damper/icon.afdesign and /dev/null differ
diff --git a/flumi/addons/SmoothScroll/scroll_damper/icon.svg b/flumi/addons/SmoothScroll/scroll_damper/icon.svg
deleted file mode 100644
index 54a8de1..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/icon.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
diff --git a/flumi/addons/SmoothScroll/scroll_damper/icon.svg.import b/flumi/addons/SmoothScroll/scroll_damper/icon.svg.import
deleted file mode 100644
index 240f33d..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/icon.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[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
diff --git a/flumi/addons/SmoothScroll/scroll_damper/linear_scroll_damper.gd b/flumi/addons/SmoothScroll/scroll_damper/linear_scroll_damper.gd
deleted file mode 100644
index c563513..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/linear_scroll_damper.gd
+++ /dev/null
@@ -1,33 +0,0 @@
-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)
diff --git a/flumi/addons/SmoothScroll/scroll_damper/linear_scroll_damper.gd.uid b/flumi/addons/SmoothScroll/scroll_damper/linear_scroll_damper.gd.uid
deleted file mode 100644
index 632707a..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/linear_scroll_damper.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://dvvc75dvopgcg
diff --git a/flumi/addons/SmoothScroll/scroll_damper/quad_scroll_damper.gd b/flumi/addons/SmoothScroll/scroll_damper/quad_scroll_damper.gd
deleted file mode 100644
index 308c0e0..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/quad_scroll_damper.gd
+++ /dev/null
@@ -1,33 +0,0 @@
-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)
diff --git a/flumi/addons/SmoothScroll/scroll_damper/quad_scroll_damper.gd.uid b/flumi/addons/SmoothScroll/scroll_damper/quad_scroll_damper.gd.uid
deleted file mode 100644
index 51ad970..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/quad_scroll_damper.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://ccgjrqkk3oksk
diff --git a/flumi/addons/SmoothScroll/scroll_damper/scroll_damper.gd b/flumi/addons/SmoothScroll/scroll_damper/scroll_damper.gd
deleted file mode 100644
index 448f0ee..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/scroll_damper.gd
+++ /dev/null
@@ -1,74 +0,0 @@
-@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
diff --git a/flumi/addons/SmoothScroll/scroll_damper/scroll_damper.gd.uid b/flumi/addons/SmoothScroll/scroll_damper/scroll_damper.gd.uid
deleted file mode 100644
index 8f446a0..0000000
--- a/flumi/addons/SmoothScroll/scroll_damper/scroll_damper.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://bcy471w0pi8af
diff --git a/flumi/icon.svg.import b/flumi/icon.svg.import
index 1115d0a..f26921f 100644
--- a/flumi/icon.svg.import
+++ b/flumi/icon.svg.import
@@ -2,7 +2,7 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://b3qknee38ix28"
+uid="uid://upg01x0wud8q"
path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"
metadata={
"vram_texture": false