themes/main_theme.tres is the project theme. It holds Godot's default look for every control type the game uses, plus named styles for the game's own look (popups, the background, spacers, list rows, title and text sizes, highlights) and a palette for the popup dimming. Scenes and scripts name these styles instead of setting colours, sizes or style boxes, and the five old theme files are gone. themes/README.md explains the styles and how to make a new theme. The screenshot tour now uses the real character pictures, so the layout baseline is taken again. Screenshots are pixel-identical to before, and test_theme.gd checks that the look stays in the theme.
69 lines
2.0 KiB
GDScript
69 lines
2.0 KiB
GDScript
class_name InspirationList
|
|
extends ScrollContainer
|
|
## The list of every soundtrack, shown for inspiration. It scrolls slowly up and down
|
|
## by itself, at the speed set in the settings.
|
|
|
|
## The soundtracks shown, in order.
|
|
|
|
var soundtracks: Array = []
|
|
|
|
# Scroll direction: 1 = down, -1 = up
|
|
var scroll_direction: int = 1
|
|
|
|
@onready var _rows: VBoxContainer = $VBoxContainer
|
|
|
|
|
|
func _ready() -> void:
|
|
scroll_direction = 1
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
var speed_pixels_per_second: float = float(Settings.inspiration_list_speed) * 60.0
|
|
var scroll_amount: float = speed_pixels_per_second * delta * float(scroll_direction)
|
|
|
|
var scroll_bar: VScrollBar = get_v_scroll_bar()
|
|
|
|
# Don't scroll if list is empty or too short
|
|
if scroll_bar.max_value <= 0:
|
|
return
|
|
|
|
var current_pos: float = scroll_bar.value
|
|
|
|
if scroll_direction == 1:
|
|
# Scrolling down
|
|
if current_pos + scroll_bar.page < scroll_bar.max_value:
|
|
scroll_bar.value = minf(current_pos + scroll_amount,
|
|
scroll_bar.max_value - scroll_bar.page)
|
|
else:
|
|
# Reached bottom, reverse direction
|
|
scroll_direction = -1
|
|
scroll_bar.value = scroll_bar.max_value - scroll_bar.page
|
|
else:
|
|
# Scrolling up
|
|
if current_pos > 0:
|
|
scroll_bar.value = maxf(current_pos + scroll_amount, 0)
|
|
else:
|
|
# Reached top, reverse direction
|
|
scroll_direction = 1
|
|
scroll_bar.value = 0
|
|
|
|
|
|
## Fetches every soundtrack from the server and shows them.
|
|
func load_from_server() -> void:
|
|
GameLog.debug("load_from_server")
|
|
var populate_list: Callable = func populate_list(array: Variant) -> void:
|
|
if typeof(array) == TYPE_ARRAY:
|
|
show_soundtracks(array)
|
|
else:
|
|
GameLog.warning("Unexpected data")
|
|
MusicServerClient.fetch_all_soundtracks(populate_list)
|
|
|
|
|
|
## Shows [param list] instead of the soundtracks shown now.
|
|
func show_soundtracks(list: Array) -> void:
|
|
soundtracks = []
|
|
soundtracks.append_array(list)
|
|
Settings.delete_children(_rows)
|
|
for i: int in soundtracks.size():
|
|
_rows.add_child(ListRow.create(soundtracks[i], i, &"TextLarge"))
|