Add working tests, fix bugs, rework popups and automate releases #36

Merged
Sansan merged 34 commits from feature/adding_tests into develop 2026-10-06 22:14:44 +02:00
39 changed files with 3283 additions and 1869 deletions
Showing only changes of commit 8b71723a34 - Show all commits

No files matched your search

+8 -33
View File
@@ -2,58 +2,33 @@ class_name ListRow
extends PanelContainer
## One item in a list of names, such as the inspiration list or a sync result column.
##
## Every row has its own background, alternating between two shades, so it is clear
## where an item starts even when its text wraps over several lines.
const EVEN_BACKGROUND: Color = Color(1, 1, 1, 0.05)
const ODD_BACKGROUND: Color = Color(1, 1, 1, 0.11)
static var _even_style: StyleBoxFlat
static var _odd_style: StyleBoxFlat
## Every row has its own background, alternating between the theme's [code]ListRowEven[/code]
## and [code]ListRowOdd[/code] styles, so it is clear where an item starts even when its
## text wraps over several lines.
## The label showing the item's text.
var label: Label
## The item's text.
var text: String:
get:
return label.text
## Creates the row for item number [param row] (counting from 0) in a list.
## Creates the row for item number [param row] (counting from 0) in a list. The text uses
## the theme's [param label_style], e.g. [code]TextLarge[/code].
static func create(
item_text: String,
row: int,
font_size: int,
label_style: StringName,
alignment: HorizontalAlignment = HORIZONTAL_ALIGNMENT_LEFT,
) -> ListRow:
var list_row: ListRow = ListRow.new()
list_row.add_theme_stylebox_override("panel", _style(row % 2 != 0))
list_row.theme_type_variation = &"ListRowOdd" if row % 2 != 0 else &"ListRowEven"
list_row.label = Label.new()
list_row.label.add_theme_font_size_override("font_size", font_size)
list_row.label.theme_type_variation = label_style
list_row.label.text = item_text
list_row.label.horizontal_alignment = alignment
list_row.label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
list_row.add_child(list_row.label)
return list_row
# Rows share two styles instead of each creating its own
static func _style(odd: bool) -> StyleBoxFlat:
if _even_style == null:
_even_style = _make_style(EVEN_BACKGROUND)
_odd_style = _make_style(ODD_BACKGROUND)
return _odd_style if odd else _even_style
static func _make_style(background: Color) -> StyleBoxFlat:
var style: StyleBoxFlat = StyleBoxFlat.new()
style.bg_color = background
style.set_corner_radius_all(4)
style.content_margin_left = 8
style.content_margin_right = 8
style.content_margin_top = 2
style.content_margin_bottom = 2
return style
+10 -2
View File
@@ -8,7 +8,6 @@
[ext_resource type="PackedScene" uid="uid://bd1by80q1v27e" path="res://popups/ShortcutsPopup.tscn" id="13_8eebo"]
[ext_resource type="PackedScene" uid="uid://btupbowehiyyu" path="res://popups/QRPopup.tscn" id="15_qr_window"]
[ext_resource type="PackedScene" uid="uid://cp54idaudb8dp" path="res://popups/AboutPopup.tscn" id="16_about_window"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[ext_resource type="PackedScene" uid="uid://bijh5h5yrivm3" path="res://popups/LogPopup.tscn" id="14_26rwn"]
[node name="MainWindow" type="Control" unique_id=407149696]
@@ -20,6 +19,16 @@ grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_eu0t5")
[node name="Background" type="Panel" parent="." unique_id=1093825566]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
theme_type_variation = &"WindowBackground"
[node name="TopBar" parent="." unique_id=1734261695 instance=ExtResource("top_bar_scene")]
[node name="Quiz" parent="." unique_id=1357908642 instance=ExtResource("quiz_scene")]
@@ -60,7 +69,6 @@ offset_right = 1262.0
offset_bottom = 860.0
[node name="StatisticsPopupPanel" type="PopupPanel" parent="." unique_id=298311407]
theme = ExtResource("popup_theme")
oversampling_override = 1.0
initial_position = 2
size = Vector2i(450, 100)
+1 -5
View File
@@ -2,9 +2,6 @@
[ext_resource type="Script" path="res://main/top_bar.gd" id="top_bar_script"]
[sub_resource type="LabelSettings" id="LabelSettings_ychxr"]
font_size = 25
[sub_resource type="InputEventKey" id="InputEventKey_ujjlu"]
device = -1
alt_pressed = true
@@ -34,8 +31,8 @@ offset_top = 12.0
offset_right = 369.0
offset_bottom = 50.0
size_flags_horizontal = 0
theme_type_variation = &"Title"
text = "Music Player Randomizer"
label_settings = SubResource("LabelSettings_ychxr")
[node name="SyncButton" type="Button" parent="." unique_id=1228313556]
layout_mode = 0
@@ -97,4 +94,3 @@ offset_bottom = 48.0
focus_mode = 0
action_mode = 0
text = "QR"
+1 -2
View File
@@ -1,10 +1,8 @@
[gd_scene format=3 uid="uid://cp54idaudb8dp"]
[ext_resource type="Script" uid="uid://b7bh0of7olbcb" path="res://popups/about_popup.gd" id="1_about_script"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[node name="AboutPopup" type="Control" unique_id=1626010355 node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -19,6 +17,7 @@ unique_name_in_owner = true
layout_mode = 0
offset_right = 600.0
offset_bottom = 640.0
theme_type_variation = &"PopupBackground"
[node name="TitleLabel" type="Label" parent="AboutPanel" unique_id=200295721]
layout_mode = 0
+2 -5
View File
@@ -1,11 +1,8 @@
[gd_scene load_steps=4 format=3 uid="uid://c7ecjj2af6usf"]
[gd_scene format=3 uid="uid://c7ecjj2af6usf"]
[ext_resource type="Script" uid="uid://i35b3scbpwpu" path="res://popups/character_card.gd" id="1_pjt0s"]
[ext_resource type="Texture2D" uid="uid://cv3hdd6bsruau" path="res://icon.svg" id="2_pjt0s"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pjt0s"]
bg_color = Color(0.302, 0.302, 0.302, 1)
[node name="CharacterCard" type="Control"]
layout_mode = 3
anchors_preset = 0
@@ -15,7 +12,7 @@ script = ExtResource("1_pjt0s")
layout_mode = 0
offset_right = 240.0
offset_bottom = 145.0
theme_override_styles/panel = SubResource("StyleBoxFlat_pjt0s")
theme_type_variation = &"CharacterCard"
[node name="MarginContainer" type="MarginContainer" parent="Panel"]
layout_mode = 0
+3 -7
View File
@@ -1,13 +1,8 @@
[gd_scene load_steps=3 format=3 uid="uid://cdy4kvemwaiom"]
[gd_scene format=3 uid="uid://cdy4kvemwaiom"]
[ext_resource type="Script" uid="uid://cvffg87wr6r3y" path="res://popups/character_select_popup.gd" id="1_h4tdp"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[sub_resource type="LabelSettings" id="LabelSettings_p4iny"]
font_size = 25
[node name="CharacterSelectPopup" type="Control" node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
layout_mode = 3
anchors_preset = 0
script = ExtResource("1_h4tdp")
@@ -18,6 +13,7 @@ unique_name_in_owner = true
layout_mode = 0
offset_right = 1290.0
offset_bottom = 665.0
theme_type_variation = &"PopupBackground"
[node name="VBoxContainer" type="VBoxContainer" parent="CharacterPanel"]
layout_mode = 0
@@ -29,8 +25,8 @@ size_flags_horizontal = 3
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 0
theme_type_variation = &"Title"
text = "Character Select"
label_settings = SubResource("LabelSettings_p4iny")
horizontal_alignment = 1
[node name="MarginContainer" type="MarginContainer" parent="CharacterPanel/VBoxContainer"]
+3 -4
View File
@@ -1,10 +1,8 @@
[gd_scene load_steps=2 format=3 uid="uid://bijh5h5yrivm3"]
[gd_scene format=3 uid="uid://bijh5h5yrivm3"]
[ext_resource type="Script" uid="uid://cw41y87l64qo7" path="res://popups/log_popup.gd" id="1_q72ua"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[node name="LogPopup" type="Control" node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
custom_minimum_size = Vector2(700, 700)
layout_mode = 3
anchors_preset = 15
@@ -22,13 +20,14 @@ custom_minimum_size = Vector2(700, 700)
layout_mode = 0
offset_right = 700.0
offset_bottom = 700.0
theme_type_variation = &"PopupBackground"
[node name="TitleLabel" type="Label" parent="LogPanel"]
layout_mode = 0
offset_top = 8.0
offset_right = 700.0
offset_bottom = 48.0
theme_override_font_sizes/font_size = 25
theme_type_variation = &"Title"
text = "Log"
horizontal_alignment = 1
+1 -2
View File
@@ -2,10 +2,8 @@
[ext_resource type="Script" uid="uid://bsa6xg5xos6h7" path="res://popups/qr_popup.gd" id="1_qr_script"]
[ext_resource type="Script" uid="uid://dynulhnyq5hpq" path="res://addons/kenyoni/qr_code/qr_code_rect.gd" id="2_jpsxt"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[node name="QRPopup" type="Control" unique_id=1996957585 node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -20,6 +18,7 @@ unique_name_in_owner = true
layout_mode = 0
offset_right = 450.0
offset_bottom = 520.0
theme_type_variation = &"PopupBackground"
[node name="QRCodeRect" type="TextureRect" parent="QRPanel" unique_id=1054378438]
unique_name_in_owner = true
+1 -2
View File
@@ -1,10 +1,8 @@
[gd_scene format=3 uid="uid://bxydgil1yifps"]
[ext_resource type="Script" uid="uid://bg5yo08638600" path="res://popups/search_popup.gd" id="1_m7bij"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[node name="SearchPopup" type="Control" unique_id=616238617 node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -19,6 +17,7 @@ unique_name_in_owner = true
layout_mode = 0
offset_right = 1152.0
offset_bottom = 640.0
theme_type_variation = &"PopupBackground"
[node name="ClearButton" type="Button" parent="." unique_id=1549439398]
layout_mode = 0
+2 -6
View File
@@ -1,13 +1,8 @@
[gd_scene format=3 uid="uid://dldpeo5y3l5hq"]
[ext_resource type="Script" uid="uid://dukqyjoduf1af" path="res://popups/settings_popup.gd" id="1_bt55j"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[sub_resource type="LabelSettings" id="LabelSettings_3xrlm"]
font_size = 25
[node name="SettingsPopup" type="Control" unique_id=1298840328 node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -22,6 +17,7 @@ unique_name_in_owner = true
layout_mode = 0
offset_right = 500.0
offset_bottom = 640.0
theme_type_variation = &"PopupBackground"
[node name="ScrollContainer" type="ScrollContainer" parent="SettingsPanel" unique_id=1325795358]
layout_mode = 0
@@ -39,8 +35,8 @@ size_flags_horizontal = 3
[node name="Label" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer" unique_id=1111531402]
layout_mode = 2
size_flags_vertical = 0
theme_type_variation = &"Title"
text = "Settings"
label_settings = SubResource("LabelSettings_3xrlm")
horizontal_alignment = 1
[node name="StopAfterCurrentCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer" unique_id=508305575]
+2 -3
View File
@@ -1,10 +1,8 @@
[gd_scene load_steps=2 format=3 uid="uid://bd1by80q1v27e"]
[gd_scene format=3 uid="uid://bd1by80q1v27e"]
[ext_resource type="Script" uid="uid://rolypd0cqd6h" path="res://popups/shortcuts_popup.gd" id="1_12pxi"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[node name="ShortcutsPopup" type="Control" node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
custom_minimum_size = Vector2(700, 700)
layout_mode = 3
anchors_preset = 15
@@ -21,6 +19,7 @@ custom_minimum_size = Vector2(700, 700)
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
theme_type_variation = &"PopupBackground"
[node name="ScrollContainer" type="ScrollContainer" parent="ShortcutsPanel"]
custom_minimum_size = Vector2(700, 700)
+3 -7
View File
@@ -1,13 +1,8 @@
[gd_scene format=3 uid="uid://dpdem7pdxweb5"]
[ext_resource type="Script" uid="uid://c3ejukwth512a" path="res://popups/sync_popup.gd" id="1_8ba47"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[sub_resource type="LabelSettings" id="LabelSettings_anbfi"]
font_size = 25
[node name="SyncPopup" type="Control" unique_id=1302914356 node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -22,6 +17,7 @@ unique_name_in_owner = true
layout_mode = 0
offset_right = 1500.0
offset_bottom = 640.0
theme_type_variation = &"PopupBackground"
[node name="ScrollContainer" type="ScrollContainer" parent="SyncPanel" unique_id=1289116349]
layout_mode = 0
@@ -40,8 +36,8 @@ theme_override_constants/separation = 12
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 0
theme_type_variation = &"Title"
text = "Sync"
label_settings = SubResource("LabelSettings_anbfi")
horizontal_alignment = 1
[node name="SyncTime" type="Label" parent="SyncPanel/ScrollContainer/SyncVBoxContainer" unique_id=1344333200]
@@ -55,8 +51,8 @@ unique_name_in_owner = true
visible = false
layout_mode = 2
size_flags_vertical = 0
theme_type_variation = &"Title"
text = "No changes since last sync"
label_settings = SubResource("LabelSettings_anbfi")
horizontal_alignment = 1
[node name="ProgressHBoxContainer" type="HBoxContainer" parent="SyncPanel/ScrollContainer/SyncVBoxContainer" unique_id=196414805]
+2 -6
View File
@@ -2,13 +2,8 @@
[ext_resource type="Script" uid="uid://dxpb22xbwf3t1" path="res://popups/winner_popup.gd" id="1_winner_script"]
[ext_resource type="Texture2D" uid="uid://r4as0nmtoa7p" path="res://noCharacter.png" id="2_no_character"]
[ext_resource type="Theme" path="res://themes/popup_theme.tres" id="popup_theme"]
[sub_resource type="LabelSettings" id="LabelSettings_hr75l"]
font_size = 35
[node name="WinnerPopup" type="Control" unique_id=1111111111 node_paths=PackedStringArray("panel")]
theme = ExtResource("popup_theme")
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -23,6 +18,7 @@ unique_name_in_owner = true
layout_mode = 0
offset_right = 500.0
offset_bottom = 600.0
theme_type_variation = &"PopupBackground"
[node name="VBoxContainer" type="VBoxContainer" parent="WinnerPanel" unique_id=471159349]
layout_mode = 0
@@ -44,8 +40,8 @@ stretch_mode = 5
[node name="WinnerLabel" type="Label" parent="WinnerPanel/VBoxContainer" unique_id=1437597286]
unique_name_in_owner = true
layout_mode = 2
theme_type_variation = &"TitleMedium"
text = "Winner!"
label_settings = SubResource("LabelSettings_hr75l")
horizontal_alignment = 1
vertical_alignment = 2
+1 -1
View File
@@ -17,7 +17,7 @@ func add_log_row(text: String) -> void:
func make_log_label(row: String) -> Label:
var log_label: Label = Label.new()
log_label.add_theme_font_size_override("font_size", 20)
log_label.theme_type_variation = &"TextLarge"
log_label.text = row
log_label.autowrap_mode = TextServer.AUTOWRAP_WORD
return log_label
+1 -1
View File
@@ -15,10 +15,10 @@ var _popups: Array[BasePopup] = []
static func add_to(parent: Control, popups: Array[BasePopup]) -> PopupBackdrop:
var backdrop: PopupBackdrop = PopupBackdrop.new()
backdrop.name = "PopupBackdrop"
backdrop.color = Color(0, 0, 0, 0.55)
backdrop.mouse_filter = Control.MOUSE_FILTER_STOP
backdrop._popups = popups
parent.add_child(backdrop)
backdrop.color = backdrop.get_theme_color(&"backdrop", &"Palette")
backdrop.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
for popup: BasePopup in popups:
parent.move_child(popup, -1)
+4 -9
View File
@@ -25,15 +25,12 @@ var shortcuts_dic: Dictionary = {
@onready var shortcuts_panel: Panel = %ShortcutsPanel
#Color(0.18, 0.18, 0.18)
#Color(0.302, 0.302, 0.302)
#Color(0.259, 0.259, 0.259)
func _ready() -> void:
shortcuts_dic.sort()
Settings.delete_children(shortcuts_vbox)
var title: Label = Label.new()
title.add_theme_font_size_override("font_size", 20)
title.theme_type_variation = &"TextLarge"
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
title.text = "Shortcuts"
shortcuts_vbox.add_child(title)
@@ -45,23 +42,21 @@ func _ready() -> void:
hbox.alignment = BoxContainer.ALIGNMENT_CENTER
var label: Label = Label.new()
label.add_theme_font_size_override("font_size", 20)
label.theme_type_variation = &"TextLarge"
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
label.text = shortcut
label.autowrap_mode = TextServer.AUTOWRAP_WORD
label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
var label2: Label = Label.new()
label2.add_theme_font_size_override("font_size", 20)
label2.theme_type_variation = &"TextLarge"
label2.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
label2.text = shortcuts_dic[shortcut]
label2.autowrap_mode = TextServer.AUTOWRAP_WORD
label2.size_flags_horizontal = Control.SIZE_EXPAND_FILL
if count % 2 == 0:
var new_stylebox_normal: Resource = panel.get_theme_stylebox("panel").duplicate()
new_stylebox_normal.bg_color = Color(0.18, 0.18, 0.18)
panel.add_theme_stylebox_override("panel", new_stylebox_normal)
panel.theme_type_variation = &"ShortcutRowDark"
hbox.add_child(label)
hbox.add_child(label2)
+3 -6
View File
@@ -171,19 +171,16 @@ func list_visible(vbox: VBoxContainer, separator: VSeparator) -> void:
func make_header_label(vbox: VBoxContainer, text: String) -> void:
var label: Label = Label.new()
label.add_theme_font_size_override("font_size", 20)
label.theme_type_variation = &"HighlightLarge"
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
label.add_theme_color_override("font_color", Color(1, 0.5, 0))
label.text = text
vbox.add_child(label)
# Items alternate between white and orange text as well as background shade
func make_soundtrack_row(text: String, row: int) -> ListRow:
var list_row: ListRow = ListRow.create(text, row, 18, HORIZONTAL_ALIGNMENT_CENTER)
if row % 2 != 0:
list_row.label.add_theme_color_override("font_color", Color(1, 0.5, 0))
return list_row
var label_style: StringName = &"HighlightMedium" if row % 2 != 0 else &"TextMedium"
return ListRow.create(text, row, label_style, HORIZONTAL_ALIGNMENT_CENTER)
func reset_sync_result() -> void:
+4
View File
@@ -48,6 +48,10 @@ project/assembly_name="MusicPlayer"
enabled=PackedStringArray("res://addons/kenyoni/qr_code/plugin.cfg", "res://addons/gdUnit4/plugin.cfg")
[gui]
theme/custom="res://themes/main_theme.tres"
[input]
ui_accept={
+1 -2
View File
@@ -2,13 +2,12 @@
[ext_resource type="Script" path="res://quiz/music_list_panel.gd" id="part_script"]
[ext_resource type="Script" uid="uid://gf1bk6xbe3j" path="res://quiz/scroll_to_end_container.gd" id="7_dj026"]
[ext_resource type="Theme" uid="uid://rxexo3ur85as" path="res://themes/light_gray_theme.tres" id="7_wxbv6"]
[node name="MusicListPanel" type="PanelContainer" unique_id=2011292375]
layout_mode = 3
theme = ExtResource("7_wxbv6")
offset_right = 1088.0
offset_bottom = 512.0
theme_type_variation = &"MusicList"
script = ExtResource("part_script")
[node name="ScrollContainer" type="ScrollContainer" parent="." unique_id=707750459]
+2 -8
View File
@@ -2,12 +2,6 @@
[ext_resource type="Script" path="res://quiz/now_playing.gd" id="part_script"]
[sub_resource type="LabelSettings" id="LabelSettings_qspbu"]
font_size = 50
[sub_resource type="LabelSettings" id="LabelSettings_3m52w"]
font_size = 35
[node name="NowPlaying" type="VBoxContainer" unique_id=42468498]
layout_mode = 3
offset_right = 1088.0
@@ -17,13 +11,13 @@ script = ExtResource("part_script")
[node name="SoundtrackLabel" type="Label" parent="." unique_id=173147793]
custom_minimum_size = Vector2(1, 1)
layout_mode = 2
label_settings = SubResource("LabelSettings_qspbu")
theme_type_variation = &"TitleLarge"
horizontal_alignment = 1
autowrap_mode = 2
[node name="SongLabel" type="Label" parent="." unique_id=1687490027]
custom_minimum_size = Vector2(1, 1)
layout_mode = 2
label_settings = SubResource("LabelSettings_3m52w")
theme_type_variation = &"TitleMedium"
horizontal_alignment = 1
autowrap_mode = 2
+6 -21
View File
@@ -1,24 +1,9 @@
[gd_scene load_steps=9 format=3 uid="uid://cslogy2csnd7a"]
[gd_scene format=3 uid="uid://cslogy2csnd7a"]
[ext_resource type="Script" uid="uid://dl6no2wr2c86y" path="res://quiz/player_row.gd" id="1_if4kc"]
[ext_resource type="Texture2D" uid="uid://r4as0nmtoa7p" path="res://noCharacter.png" id="2_hpj3s"]
[ext_resource type="Texture2D" uid="uid://b2kj6m8qpsgb1" path="res://icons/person_remove_light.svg" id="3_j3uxe"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_821k2"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_w10e8"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_78a8g"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_i56hb"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_b2crt"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[node name="PlayerRow" type="Control"]
custom_minimum_size = Vector2(2.08165e-12, 40)
layout_mode = 3
@@ -39,7 +24,7 @@ grow_vertical = 2
[node name="Panel4" type="Panel" parent="HBoxContainer"]
custom_minimum_size = Vector2(5, 40)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_821k2")
theme_type_variation = &"DarkSpacer"
[node name="Name" type="Label" parent="HBoxContainer"]
unique_name_in_owner = true
@@ -55,7 +40,7 @@ text_overrun_behavior = 3
[node name="Panel3" type="Panel" parent="HBoxContainer"]
custom_minimum_size = Vector2(16, 2.08165e-12)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_w10e8")
theme_type_variation = &"DarkSpacer"
[node name="Character" type="TextureButton" parent="HBoxContainer"]
unique_name_in_owner = true
@@ -70,7 +55,7 @@ stretch_mode = 5
[node name="Panel2" type="Panel" parent="HBoxContainer"]
custom_minimum_size = Vector2(30, 40)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_78a8g")
theme_type_variation = &"DarkSpacer"
[node name="AddPoint" type="Button" parent="HBoxContainer"]
unique_name_in_owner = true
@@ -83,7 +68,7 @@ text = "+1"
[node name="Panel5" type="Panel" parent="HBoxContainer"]
custom_minimum_size = Vector2(3, 40)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_i56hb")
theme_type_variation = &"DarkSpacer"
[node name="RemovePoint" type="Button" parent="HBoxContainer"]
unique_name_in_owner = true
@@ -96,7 +81,7 @@ text = "-1"
[node name="Panel" type="Panel" parent="HBoxContainer"]
custom_minimum_size = Vector2(30, 40)
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_b2crt")
theme_type_variation = &"DarkSpacer"
[node name="RemovePlayer" type="TextureButton" parent="HBoxContainer"]
unique_name_in_owner = true
+2 -8
View File
@@ -13,12 +13,6 @@ unicode = 63743
[sub_resource type="Shortcut" id="Shortcut_jafqj"]
events = [SubResource("InputEventKey_03bm3")]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qk7sj"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_k1ygi"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[node name="PlayersPanel" type="PanelContainer" unique_id=1708375945]
layout_mode = 3
offset_right = 641.0
@@ -60,7 +54,7 @@ layout_mode = 2
[node name="Panel" type="Panel" parent="VBoxContainer/AddPlayerContainer" unique_id=1569854056]
layout_mode = 2
size_flags_horizontal = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_qk7sj")
theme_type_variation = &"DarkSpacer"
[node name="PlayerNameField" type="TextEdit" parent="VBoxContainer/AddPlayerContainer" unique_id=332535327]
unique_name_in_owner = true
@@ -80,7 +74,7 @@ text = "Add"
custom_minimum_size = Vector2(2.08165e-12, 40)
layout_mode = 2
size_flags_horizontal = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_k1ygi")
theme_type_variation = &"DarkSpacer"
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer" unique_id=1000000001]
layout_mode = 2
+3 -7
View File
@@ -1,15 +1,13 @@
[gd_scene load_steps=5 format=3 uid="uid://1jbtmhbqolqe"]
[gd_scene format=3 uid="uid://1jbtmhbqolqe"]
[ext_resource type="Texture2D" uid="uid://c8r7ykphss4c2" path="res://characters/Link.png" id="1_ll28s"]
[ext_resource type="Script" uid="uid://cjo13wixip8mq" path="res://quiz/song_row.gd" id="1_lspki"]
[ext_resource type="Theme" uid="uid://8bllart6xn1f" path="res://themes/default_theme.tres" id="1_x7fq8"]
[ext_resource type="StyleBox" uid="uid://bsv6yb0yir04l" path="res://themes/style_box_flat.tres" id="3_5h84f"]
[node name="SongRow" type="PanelContainer"]
custom_minimum_size = Vector2(1000, 0)
offset_right = 1088.0
offset_bottom = 59.0
theme = ExtResource("1_x7fq8")
theme_type_variation = &"SongRow"
script = ExtResource("1_lspki")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
@@ -23,9 +21,7 @@ custom_minimum_size = Vector2(865, 28)
layout_mode = 2
size_flags_horizontal = 3
mouse_filter = 1
theme = ExtResource("1_x7fq8")
theme_override_font_sizes/font_size = 20
theme_override_styles/normal = ExtResource("3_5h84f")
theme_type_variation = &"SongRowLabel"
text = "Final Fantasy Dissidia 012 Duodecim (Sista Fantasin Meningsskiljaktigheter 012 Tolv) - 'Crystal Cave -arrange-'' from FINAL FANTASY III"
autowrap_mode = 2
+1 -1
View File
@@ -65,4 +65,4 @@ func show_soundtracks(list: Array) -> void:
soundtracks.append_array(list)
Settings.delete_children(_rows)
for i: int in soundtracks.size():
_rows.add_child(ListRow.create(soundtracks[i], i, 20))
_rows.add_child(ListRow.create(soundtracks[i], i, &"TextLarge"))
+1 -1
View File
@@ -19,7 +19,7 @@ func set_label() -> void:
var size_to_change: int = song_object.players_given_point.size() * 50
song_list_label.custom_minimum_size = Vector2(1000 - size_to_change, 28)
if song_object.is_playing:
song_list_label.add_theme_color_override("font_color", Color(1, 0.5, 0))
song_list_label.theme_type_variation = &"SongRowLabelPlaying"
song_list_label.text = song_object.get_song_info()
File diff suppressed because it is too large. Load diff
+22 -1
View File
@@ -27,6 +27,9 @@ const SYNC_RESULT: Dictionary = {
"total_time": "00:00:03",
}
## The character pictures the fake server hands out.
const CHARACTERS_DIR: String = "res://characters"
## Popups in the order the tour opens them: the state name, then the popup's node. The
## state names are what the popups were first called, so screenshots taken before they
## were renamed can still be compared with new ones.
@@ -53,7 +56,11 @@ static func make_server() -> FakeHttpTransport:
server.respond_json("/music/all", SOUNDTRACKS)
server.respond_json("/music/all/order", SOUNDTRACKS)
server.respond_json("/music/list", [])
server.respond_json("/characters", [])
var characters: Array[String] = character_names()
server.respond_json("/characters", characters)
for character_name: String in characters:
server.respond_bytes("/character?name=" + character_name.uri_encode(),
FileAccess.get_file_as_bytes(CHARACTERS_DIR.path_join(character_name)))
server.respond_bytes("/music/rand", mp3)
server.respond_bytes("/music/addQue", PackedByteArray())
server.respond_json("/music/info", SONG_INFO)
@@ -64,6 +71,16 @@ static func make_server() -> FakeHttpTransport:
return server
## The pictures in [constant CHARACTERS_DIR], sorted by name.
static func character_names() -> Array[String]:
var names: Array[String] = []
for file_name: String in DirAccess.get_files_at(CHARACTERS_DIR):
if file_name.ends_with(".png"):
names.append(file_name)
names.sort()
return names
## Puts Settings and Playlist in the state the tour expects. Call it before the main
## window is created.
static func prepare_autoloads() -> void:
@@ -104,6 +121,10 @@ func run(on_state: Callable) -> void:
_call("play_next_song")
await _settle()
_freeze_music_player()
var picture: Image = Image.new()
picture.load_png_from_buffer(
FileAccess.get_file_as_bytes(CHARACTERS_DIR.path_join(character_names()[0])))
_player_row(0).new_character_selected(ImageTexture.create_from_image(picture))
_player_row(0).add_point()
_player_row(0).add_point()
_player_row(1).add_point()
+9 -84
View File
@@ -1,73 +1,14 @@
extends GdUnitTestSuite
## Checks that every node of the main window is where it was before the window was
## split into scenes.
## Checks that every node of the main window is where it was when the baseline was taken.
##
## [code]tests/data/layout_baseline.json[/code] was written by
## [code]tools/take_screenshots.gd[/code] before the split. It holds the position, size
## and visibility of every node in each UiTour state, keyed by the node's old path. This
## test runs the same tour and compares, after moving each old path to where the node
## lives now.
## [code]tests/data/layout_baseline.json[/code] is written by
## [code]tools/take_screenshots.gd[/code] (run it with --headless and copy its layout.json).
## It holds the position, size and visibility of every node in each UiTour state, keyed
## by the node's path from the main window. Take a new baseline when the layout is
## meant to change, e.g. after moving a button.
const BASELINE_PATH: String = "res://tests/data/layout_baseline.json"
## Where each node of the old main window lives now: its old name, and the path that
## replaces it. Nodes that are not listed are still where they were.
const MOVED: Dictionary = {
# The top bar
"TopPanelContainer": "TopBar/TopPanelContainer",
"Title": "TopBar/Title",
"SearchButton": "TopBar/SearchButton",
"SyncButton": "TopBar/SyncButton",
"StatisticsButton": "TopBar/StatisticsButton",
"ShortcutsButton": "TopBar/ShortcutsButton",
"AboutButton": "TopBar/AboutButton",
"QRButton": "TopBar/QRButton",
# The popups of the main window, renamed from *Window to *Popup
"Search": "SearchPopup",
"SyncWindow": "SyncPopup",
"QRWindow": "QRPopup",
"ShortcutsWindow": "ShortcutsPopup",
"AboutWindow": "AboutPopup",
"Log": "LogPopup",
# The quiz and its parts
"Open": "Quiz/Open",
"FileDialog": "Quiz/FileDialog",
"DebugLabel": "Quiz/DebugLabel",
"MusicListPanel": "Quiz/MusicListPanel",
"Players": "Quiz/PlayersPanel",
"ScrollContainer": "Quiz/InspirationList",
"VBoxContainer": "Quiz/NowPlaying",
"MusicPlayer": "Quiz/MusicPlayer/PlayerBar",
"RepeatSongCheckButton": "Quiz/MusicPlayer/RepeatSongCheckButton",
"ResetPlaylistButton": "Quiz/QuizToolbar/ResetPlaylistButton",
"ResetPointsButton": "Quiz/QuizToolbar/ResetPointsButton",
"SettingsButton": "Quiz/QuizToolbar/SettingsButton",
"SoundTestButton": "Quiz/QuizToolbar/SoundTestButton",
"ShowAnswerButton": "Quiz/SongControls/ShowAnswerButton",
"NextButton": "Quiz/SongControls/NextButton",
"SettingsWindow": "Quiz/SettingsPopup",
"NewCharacterSelect": "Quiz/CharacterSelectPopup",
"WinnerWindow": "Quiz/WinnerPopup",
}
## Scenes that were renamed, by their old and new root name. A row added to a list is
## named after its scene's root when the name is still free, so these show up deeper in a
## path.
const RENAMED_SCENES: Dictionary = {
"SongListObject": "SongRow",
"Player": "PlayerRow",
}
const SYNC_COLUMNS: String = "SyncPopup/SyncPanel/ScrollContainer/SyncVBoxContainer"
## Nodes renamed inside a popup: the path after the moves above, and the new path.
const RENAMED_PATHS: Dictionary = {
"SearchPopup/ScrollContainer/VBoxContainer": "SearchPopup/ScrollContainer/SearchResults",
SYNC_COLUMNS + "/CatchedErrorsVBox": SYNC_COLUMNS + "/CaughtErrorsVBox",
SYNC_COLUMNS + "/CaughtErrorsVBox/CatchedErrorsLabel":
SYNC_COLUMNS + "/CaughtErrorsVBox/CaughtErrorsLabel",
}
## Nodes whose height follows text that changes between versions, such as the changelog.
## Their position and width are still checked.
const HEIGHT_FOLLOWS_TEXT: Array[String] = [
@@ -105,21 +46,6 @@ func after() -> void:
_snapshot.restore()
## Where the node that used to be at [param old_path] in the main window is now.
static func new_path(old_path: String) -> String:
var parts: PackedStringArray = old_path.split("/")
for i: int in parts.size():
parts[i] = RENAMED_SCENES.get(parts[i], parts[i])
var first: String = parts[0]
parts[0] = MOVED.get(first, first)
var path: String = "/".join(parts)
# In order, so a node inside a renamed node is found after its parent's rename
for renamed: String in RENAMED_PATHS:
if path == renamed || path.begins_with(renamed + "/"):
path = RENAMED_PATHS[renamed] + path.trim_prefix(renamed)
return path
func _baseline() -> Dictionary:
return JSON.parse_string(FileAccess.get_file_as_string(BASELINE_PATH))
@@ -133,11 +59,10 @@ func test_every_node_is_where_it_was() -> void:
var baseline: Dictionary = _baseline()
for state: String in baseline:
var actual: Dictionary = _layout.get(state, {})
for old_path: String in baseline[state]:
var path: String = new_path(old_path)
var expected: Dictionary = baseline[state][old_path]
for path: String in baseline[state]:
var expected: Dictionary = baseline[state][path]
if !actual.has(path):
problems.append("%s: %s is missing (was %s)" % [state, path, old_path])
problems.append("%s: %s is missing" % [state, path])
continue
var rect: Array = actual[path].rect
var sides: int = 3 if _height_follows_text(path) else 4
+1 -1
View File
@@ -5,7 +5,7 @@ extends MainWindowTestSuite
## server and the keyboard shortcuts reach both the main window and the quiz.
const MAIN_WINDOW_CHILDREN: Array[String] = [
"TopBar", "Quiz", "PopupBackdrop", "SearchPopup", "SyncPopup", "QRPopup",
"Background", "TopBar", "Quiz", "PopupBackdrop", "SearchPopup", "SyncPopup", "QRPopup",
"ShortcutsPopup", "StatisticsPopupPanel", "AboutPopup", "LogPopup",
]
+117
View File
@@ -0,0 +1,117 @@
extends GdUnitTestSuite
## The whole look comes from the project theme, themes/main_theme.tres: scenes and
## scripts name its styles instead of setting colours, sizes or style boxes themselves.
const THEME_PATH: String = "res://themes/main_theme.tres"
## Folders with the game's scenes and scripts.
const GAME_FOLDERS: Array[String] = [
"res://main", "res://quiz", "res://player", "res://popups", "res://common", "res://data",
"res://server",
]
## The named styles the game uses, and the type each one is based on.
const STYLES: Dictionary = {
"WindowBackground": "Panel",
"PopupBackground": "Panel",
"DarkSpacer": "Panel",
"CharacterCard": "Panel",
"MusicList": "PanelContainer",
"SongRow": "PanelContainer",
"ShortcutRowDark": "PanelContainer",
"ListRowEven": "PanelContainer",
"ListRowOdd": "PanelContainer",
"TitleLarge": "Label",
"TitleMedium": "Label",
"Title": "Label",
"TextLarge": "Label",
"TextMedium": "Label",
"HighlightLarge": "Label",
"HighlightMedium": "Label",
"SongRowLabel": "Label",
"SongRowLabelPlaying": "Label",
}
var _theme: Theme = load(THEME_PATH)
## Every file in [param folder] and its subfolders whose name ends with [param extension].
func _files(folder: String, extension: String) -> Array[String]:
var found: Array[String] = []
for file_name: String in DirAccess.get_files_at(folder):
if file_name.ends_with(extension):
found.append(folder.path_join(file_name))
for subfolder: String in DirAccess.get_directories_at(folder):
found.append_array(_files(folder.path_join(subfolder), extension))
return found
func _game_files(extension: String) -> Array[String]:
var found: Array[String] = []
for folder: String in GAME_FOLDERS:
found.append_array(_files(folder, extension))
return found
func _lines_matching(files: Array[String], pattern: String) -> Array[String]:
var regex: RegEx = RegEx.create_from_string(pattern)
var hits: Array[String] = []
for path: String in files:
var lines: PackedStringArray = FileAccess.get_file_as_string(path).split("\n")
for i: int in lines.size():
if regex.search(lines[i]) != null:
hits.append("%s:%d: %s" % [path, i + 1, lines[i].strip_edges()])
return hits
func test_project_uses_the_main_theme() -> void:
assert_str(ProjectSettings.get_setting("gui/theme/custom")).is_equal(THEME_PATH)
func test_theme_has_every_named_style() -> void:
for style: String in STYLES:
assert_str(String(_theme.get_type_variation_base(style))) \
.override_failure_message(style + " is missing or has the wrong base") \
.is_equal(STYLES[style])
func test_theme_has_the_palette() -> void:
assert_bool(_theme.has_color("backdrop", "Palette")).is_true()
func test_every_style_named_in_scenes_and_scripts_exists() -> void:
var regex: RegEx = RegEx.create_from_string('&"([A-Z][A-Za-z]+)"')
var missing: Array[String] = []
for path: String in _game_files(".tscn") + _game_files(".gd"):
for found: RegExMatch in regex.search_all(FileAccess.get_file_as_string(path)):
var style: String = found.get_string(1)
if !(style in STYLES) && style != "Palette":
missing.append("%s: %s" % [path, style])
assert_array(missing).override_failure_message(
"Styles not in the theme:\n" + "\n".join(missing)).is_empty()
func test_scenes_take_their_look_from_the_theme() -> void:
var hits: Array[String] = _lines_matching(_game_files(".tscn"),
"^(theme = |label_settings = |theme_override_(styles|colors|font_sizes|fonts)/)" \
+ "|^\\[sub_resource type=\"(StyleBoxFlat|LabelSettings|Theme)\"")
assert_array(hits).override_failure_message(
"Look set in a scene instead of the theme:\n" + "\n".join(hits)).is_empty()
func test_scripts_take_their_look_from_the_theme() -> void:
var hits: Array[String] = _lines_matching(_game_files(".gd"),
"add_theme_[a-z_]+_override|StyleBoxFlat\\.new|Color\\(")
assert_array(hits).override_failure_message(
"Look set in a script instead of the theme:\n" + "\n".join(hits)).is_empty()
func test_main_window_background_comes_from_the_theme_and_lets_clicks_through() -> void:
var main: Control = auto_free(load("res://main/MainWindow.tscn").instantiate())
var background: Panel = main.get_child(0)
assert_str(background.name).is_equal("Background")
assert_str(String(background.theme_type_variation)).is_equal("WindowBackground")
assert_int(background.mouse_filter).is_equal(Control.MOUSE_FILTER_IGNORE)
assert_float(background.anchor_right).is_equal(1.0)
assert_float(background.anchor_bottom).is_equal(1.0)
+1
View File
@@ -0,0 +1 @@
uid://b2wva7kaaq8ua
+12 -5
View File
@@ -6,22 +6,29 @@ func _background(list_row: ListRow) -> Color:
return (list_row.get_theme_stylebox("panel") as StyleBoxFlat).bg_color
## Adds [param list_row] to the tree, where it gets its look from the project theme.
func _shown(list_row: ListRow) -> ListRow:
add_child(auto_free(list_row))
return list_row
func test_row_shows_text() -> void:
var list_row: ListRow = auto_free(ListRow.create("Chrono Trigger", 0, 20))
var list_row: ListRow = auto_free(ListRow.create("Chrono Trigger", 0, &"TextLarge"))
assert_str(list_row.text).is_equal("Chrono Trigger")
func test_neighbouring_rows_have_different_backgrounds() -> void:
var first: ListRow = auto_free(ListRow.create("Chrono Trigger", 0, 20))
var second: ListRow = auto_free(ListRow.create("Chrono Cross", 1, 20))
var third: ListRow = auto_free(ListRow.create("Xenogears", 2, 20))
var first: ListRow = _shown(ListRow.create("Chrono Trigger", 0, &"TextLarge"))
var second: ListRow = _shown(ListRow.create("Chrono Cross", 1, &"TextLarge"))
var third: ListRow = _shown(ListRow.create("Xenogears", 2, &"TextLarge"))
assert_that(_background(first)).is_not_equal(_background(second))
assert_that(_background(first)).is_equal(_background(third))
func test_long_text_wraps() -> void:
var list_row: ListRow = auto_free(ListRow.create("Castlevania: Symphony of the Night", 0, 20))
var list_row: ListRow = auto_free(
ListRow.create("Castlevania: Symphony of the Night", 0, &"TextLarge"))
assert_int(list_row.label.autowrap_mode).is_equal(TextServer.AUTOWRAP_WORD_SMART)
+52
View File
@@ -0,0 +1,52 @@
# Themes
The whole look of the game comes from one theme, `main_theme.tres`. It is the project
theme (Project Settings → GUI → Theme → Custom), so every scene uses it without setting
anything. Scenes and scripts never set colours, font sizes or style boxes themselves;
they name one of the theme's styles instead, and `tests/integration/test_theme.gd`
checks that it stays that way.
## Making a new theme
1. Copy `main_theme.tres`, e.g. to `dark_blue_theme.tres`.
2. Open the copy in Godot (double-click it) and change its colours, style boxes and font
sizes in the theme editor. Keep every style's name.
3. Point Project Settings → GUI → Theme → Custom at the copy.
Icons (play, restart, add player, the slider and switch knobs) are not part of the theme;
they come from the image files in `icons/` and Godot's built-in theme.
## What is in the theme
**Godot's default look** for every kind of control the game uses (Button, Label, Panel,
CheckButton, sliders, scroll bars, text fields and so on), copied in so it can be changed
here.
**Named styles** (theme type variations), picked with *Theme Type Variation* in a node's
inspector or `theme_type_variation` in code:
| Style | Based on | Used for |
|---|---|---|
| `WindowBackground` | Panel | The background behind everything in the main window |
| `PopupBackground` | Panel | The panel of every popup: dark, bordered and rounded |
| `DarkSpacer` | Panel | The dark gaps in the player list and the add player row |
| `CharacterCard` | Panel | A character in the character select popup |
| `MusicList` | PanelContainer | The list of songs in the quiz |
| `SongRow` | PanelContainer | One song in that list |
| `ShortcutRowDark` | PanelContainer | Every other row in the shortcuts popup |
| `ListRowEven`, `ListRowOdd` | PanelContainer | Alternating rows in the inspiration and sync lists |
| `TitleLarge` | Label | The soundtrack that is playing (50) |
| `TitleMedium` | Label | The song that is playing, and the winner (35) |
| `Title` | Label | The window title and popup titles (25) |
| `TextLarge` | Label | Log rows, shortcuts and the inspiration list (20) |
| `TextMedium` | Label | Rows in the sync result (18) |
| `HighlightLarge`, `HighlightMedium` | Label | Orange text: sync headers and every other sync row |
| `SongRowLabel`, `SongRowLabelPlaying` | Label | A song's text, and the one that is playing |
The **PopupPanel** type itself is styled too, for the Statistics popup.
**Palette**: colours used from code.
| Colour | Used for |
|---|---|
| `backdrop` | The dimming behind an open popup |
-6
View File
@@ -1,6 +0,0 @@
[gd_resource type="Theme" load_steps=2 format=3 uid="uid://8bllart6xn1f"]
[ext_resource type="StyleBox" uid="uid://bsv6yb0yir04l" path="res://themes/style_box_flat.tres" id="1_uierc"]
[resource]
PanelContainer/styles/panel = ExtResource("1_uierc")
-7
View File
@@ -1,7 +0,0 @@
[gd_resource type="Theme" load_steps=2 format=3 uid="uid://rxexo3ur85as"]
[ext_resource type="StyleBox" uid="uid://blf3g88mugovr" path="res://themes/neutral_gray.tres" id="1_alhp2"]
[resource]
Label/styles/normal = ExtResource("1_alhp2")
PanelContainer/styles/panel = ExtResource("1_alhp2")
+916
View File
@@ -0,0 +1,916 @@
[gd_resource type="Theme" format=3]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vxwtt"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.3)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rjgu6"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 2.0
expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vu6l5"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.225, 0.225, 0.225, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ydht1"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8gw6x"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0, 0, 0, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g21io"]
bg_color = Color(0.302, 0.302, 0.302, 1)
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7ceur"]
content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_uobgu"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 2.0
expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_puucq"]
content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1mjdo"]
content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_s5e0q"]
content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0x86e"]
content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_f5ubn"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7qy2x"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.4)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_myxx4"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3kvey"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.75, 0.75, 0.75, 0.75)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5iri2"]
content_margin_left = 0.0
content_margin_top = 4.0
content_margin_right = 0.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3scot"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 2.0
expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxLine" id="StyleBoxLine_puicy"]
content_margin_left = 4.0
content_margin_top = 0.0
content_margin_right = 4.0
content_margin_bottom = 0.0
color = Color(0.5, 0.5, 0.5, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_quqgn"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.4)
corner_radius_top_left = 4
corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_m01q4"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
corner_radius_top_left = 4
corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_k36pm"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 4
corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6h40v"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 2.0
expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_s47sh"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_u5sc5"]
content_margin_left = 8.0
content_margin_top = 2.0
content_margin_right = 8.0
content_margin_bottom = 2.0
bg_color = Color(1, 1, 1, 0.05)
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_mxy8k"]
content_margin_left = 8.0
content_margin_top = 2.0
content_margin_right = 8.0
content_margin_bottom = 2.0
bg_color = Color(1, 1, 1, 0.11)
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_33f1l"]
bg_color = Color(0.257813, 0.257813, 0.257813, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wbnll"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.3)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bmtpa"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.3)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_f5lmb"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 2.0
expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qtlom"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0.225, 0.225, 0.225, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_t2i82"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0.225, 0.225, 0.225, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a4gt2"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_uisqs"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dinf2"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0, 0, 0, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a0ksy"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0, 0, 0, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hwwyi"]
content_margin_left = 0.0
content_margin_top = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wl3gy"]
content_margin_left = 0.0
content_margin_top = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vputg"]
content_margin_left = 12.0
content_margin_top = 12.0
content_margin_right = 12.0
content_margin_bottom = 12.0
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.36, 0.36, 0.36, 1)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1de2m"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.4, 0.4, 0.4, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxLine" id="StyleBoxLine_bacd5"]
content_margin_left = 4.0
content_margin_top = 0.0
content_margin_right = 4.0
content_margin_bottom = 0.0
color = Color(0.5, 0.5, 0.5, 1)
[sub_resource type="StyleBoxLine" id="StyleBoxLine_k3nwn"]
content_margin_left = 4.0
content_margin_top = 0.0
content_margin_right = 4.0
content_margin_bottom = 0.0
color = Color(0.5, 0.5, 0.5, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_axpob"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.25, 0.25, 0.25, 1)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.175, 0.175, 0.175, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxLine" id="StyleBoxLine_cl37w"]
content_margin_left = 4.0
content_margin_top = 0.0
content_margin_right = 4.0
content_margin_bottom = 0.0
color = Color(0.5, 0.5, 0.5, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_07kyi"]
content_margin_left = 2.0
content_margin_top = 2.0
content_margin_right = 2.0
content_margin_bottom = 2.0
bg_color = Color(0.1, 0.1, 0.1, 0.3)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ouuwv"]
content_margin_left = 2.0
content_margin_top = 2.0
content_margin_right = 2.0
content_margin_bottom = 2.0
bg_color = Color(1, 1, 1, 0.4)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_35dwi"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(1, 1, 1, 0.75)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 4.0
expand_margin_top = 4.0
expand_margin_right = 4.0
expand_margin_bottom = 4.0
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_r3gy8"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_anjdx"]
content_margin_left = 0.0
content_margin_top = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
bg_color = Color(0.18, 0.18, 0.18, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_oxgwg"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_r1nnu"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lkqs8"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1tv07"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 2.0
expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0ly2h"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
border_width_bottom = 2
border_color = Color(0, 0, 0, 0.6)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_o0qds"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.1, 0.1, 0.1, 0.3)
border_width_bottom = 2
border_color = Color(0, 0, 0, 0.3)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ogk6w"]
content_margin_left = 8.0
content_margin_top = 2.0
content_margin_right = 8.0
content_margin_bottom = 2.0
bg_color = Color(0, 0, 0, 0.5)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dwgvb"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.4)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_uoaln"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_x5u8n"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.75, 0.75, 0.75, 0.75)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6fedo"]
content_margin_left = 4.0
content_margin_top = 0.0
content_margin_right = 4.0
content_margin_bottom = 0.0
bg_color = Color(0.1, 0.1, 0.1, 0.6)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
corner_detail = 6
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8sdcv"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.75)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 5
expand_margin_left = 2.0
expand_margin_top = 2.0
expand_margin_right = 2.0
expand_margin_bottom = 2.0
[sub_resource type="StyleBoxLine" id="StyleBoxLine_r3erx"]
content_margin_left = 0.0
content_margin_top = 4.0
content_margin_right = 0.0
content_margin_bottom = 4.0
color = Color(0.5, 0.5, 0.5, 1)
vertical = true
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2mdtn"]
bg_color = Color(0.3, 0.3, 0.3, 1)
[resource]
Button/colors/font_color = Color(0.875, 0.875, 0.875, 1)
Button/colors/font_disabled_color = Color(0.875, 0.875, 0.875, 0.5)
Button/colors/font_focus_color = Color(0.95, 0.95, 0.95, 1)
Button/colors/font_hover_color = Color(0.95, 0.95, 0.95, 1)
Button/colors/font_hover_pressed_color = Color(1, 1, 1, 1)
Button/colors/font_outline_color = Color(0, 0, 0, 1)
Button/colors/font_pressed_color = Color(1, 1, 1, 1)
Button/colors/icon_disabled_color = Color(1, 1, 1, 0.4)
Button/colors/icon_focus_color = Color(1, 1, 1, 1)
Button/colors/icon_hover_color = Color(1, 1, 1, 1)
Button/colors/icon_hover_pressed_color = Color(1, 1, 1, 1)
Button/colors/icon_normal_color = Color(1, 1, 1, 1)
Button/colors/icon_pressed_color = Color(1, 1, 1, 1)
Button/constants/align_to_largest_stylebox = 0
Button/constants/h_separation = 4
Button/constants/icon_max_width = 0
Button/constants/outline_size = 0
Button/font_sizes/font_size = 16
Button/styles/disabled = SubResource("StyleBoxFlat_vxwtt")
Button/styles/focus = SubResource("StyleBoxFlat_rjgu6")
Button/styles/hover = SubResource("StyleBoxFlat_vu6l5")
Button/styles/normal = SubResource("StyleBoxFlat_ydht1")
Button/styles/pressed = SubResource("StyleBoxFlat_8gw6x")
CharacterCard/base_type = &"Panel"
CharacterCard/styles/panel = SubResource("StyleBoxFlat_g21io")
CheckButton/colors/button_checked_color = Color(1, 1, 1, 1)
CheckButton/colors/button_unchecked_color = Color(1, 1, 1, 1)
CheckButton/colors/font_color = Color(0.875, 0.875, 0.875, 1)
CheckButton/colors/font_disabled_color = Color(0.875, 0.875, 0.875, 0.5)
CheckButton/colors/font_focus_color = Color(0.95, 0.95, 0.95, 1)
CheckButton/colors/font_hover_color = Color(0.95, 0.95, 0.95, 1)
CheckButton/colors/font_hover_pressed_color = Color(1, 1, 1, 1)
CheckButton/colors/font_outline_color = Color(0, 0, 0, 1)
CheckButton/colors/font_pressed_color = Color(1, 1, 1, 1)
CheckButton/constants/check_v_offset = 0
CheckButton/constants/h_separation = 4
CheckButton/constants/outline_size = 0
CheckButton/font_sizes/font_size = 16
CheckButton/styles/disabled = SubResource("StyleBoxEmpty_7ceur")
CheckButton/styles/focus = SubResource("StyleBoxFlat_uobgu")
CheckButton/styles/hover = SubResource("StyleBoxEmpty_puucq")
CheckButton/styles/hover_pressed = SubResource("StyleBoxEmpty_1mjdo")
CheckButton/styles/normal = SubResource("StyleBoxEmpty_s5e0q")
CheckButton/styles/pressed = SubResource("StyleBoxEmpty_0x86e")
DarkSpacer/base_type = &"Panel"
DarkSpacer/styles/panel = SubResource("StyleBoxFlat_f5ubn")
GridContainer/constants/h_separation = 4
GridContainer/constants/v_separation = 4
HBoxContainer/constants/separation = 4
HScrollBar/styles/grabber = SubResource("StyleBoxFlat_7qy2x")
HScrollBar/styles/grabber_highlight = SubResource("StyleBoxFlat_myxx4")
HScrollBar/styles/grabber_pressed = SubResource("StyleBoxFlat_3kvey")
HScrollBar/styles/scroll = SubResource("StyleBoxFlat_5iri2")
HScrollBar/styles/scroll_focus = SubResource("StyleBoxFlat_3scot")
HSeparator/constants/separation = 4
HSeparator/styles/separator = SubResource("StyleBoxLine_puicy")
HSlider/constants/center_grabber = 0
HSlider/constants/grabber_offset = 0
HSlider/constants/tick_offset = 0
HSlider/styles/grabber_area = SubResource("StyleBoxFlat_quqgn")
HSlider/styles/grabber_area_highlight = SubResource("StyleBoxFlat_m01q4")
HSlider/styles/slider = SubResource("StyleBoxFlat_k36pm")
HighlightLarge/base_type = &"Label"
HighlightLarge/colors/font_color = Color(1, 0.5, 0, 1)
HighlightLarge/font_sizes/font_size = 20
HighlightMedium/base_type = &"Label"
HighlightMedium/colors/font_color = Color(1, 0.5, 0, 1)
HighlightMedium/font_sizes/font_size = 18
Label/colors/font_color = Color(1, 1, 1, 1)
Label/colors/font_outline_color = Color(0, 0, 0, 1)
Label/colors/font_shadow_color = Color(0, 0, 0, 0)
Label/constants/line_spacing = 3
Label/constants/outline_size = 0
Label/constants/shadow_offset_x = 1
Label/constants/shadow_offset_y = 1
Label/constants/shadow_outline_size = 1
Label/font_sizes/font_size = 16
Label/styles/focus = SubResource("StyleBoxFlat_6h40v")
Label/styles/normal = SubResource("StyleBoxEmpty_s47sh")
ListRowEven/base_type = &"PanelContainer"
ListRowEven/styles/panel = SubResource("StyleBoxFlat_u5sc5")
ListRowOdd/base_type = &"PanelContainer"
ListRowOdd/styles/panel = SubResource("StyleBoxFlat_mxy8k")
MarginContainer/constants/margin_bottom = 0
MarginContainer/constants/margin_left = 0
MarginContainer/constants/margin_right = 0
MarginContainer/constants/margin_top = 0
MusicList/base_type = &"PanelContainer"
MusicList/styles/panel = SubResource("StyleBoxFlat_33f1l")
OptionButton/colors/font_color = Color(0.875, 0.875, 0.875, 1)
OptionButton/colors/font_disabled_color = Color(0.875, 0.875, 0.875, 0.5)
OptionButton/colors/font_focus_color = Color(0.95, 0.95, 0.95, 1)
OptionButton/colors/font_hover_color = Color(0.95, 0.95, 0.95, 1)
OptionButton/colors/font_hover_pressed_color = Color(1, 1, 1, 1)
OptionButton/colors/font_outline_color = Color(0, 0, 0, 1)
OptionButton/colors/font_pressed_color = Color(1, 1, 1, 1)
OptionButton/constants/arrow_margin = 4
OptionButton/constants/h_separation = 4
OptionButton/constants/modulate_arrow = 0
OptionButton/constants/outline_size = 0
OptionButton/font_sizes/font_size = 16
OptionButton/styles/disabled = SubResource("StyleBoxFlat_wbnll")
OptionButton/styles/disabled_mirrored = SubResource("StyleBoxFlat_bmtpa")
OptionButton/styles/focus = SubResource("StyleBoxFlat_f5lmb")
OptionButton/styles/hover = SubResource("StyleBoxFlat_qtlom")
OptionButton/styles/hover_mirrored = SubResource("StyleBoxFlat_t2i82")
OptionButton/styles/normal = SubResource("StyleBoxFlat_a4gt2")
OptionButton/styles/normal_mirrored = SubResource("StyleBoxFlat_uisqs")
OptionButton/styles/pressed = SubResource("StyleBoxFlat_dinf2")
OptionButton/styles/pressed_mirrored = SubResource("StyleBoxFlat_a0ksy")
Palette/colors/backdrop = Color(0, 0, 0, 0.55)
Panel/styles/panel = SubResource("StyleBoxFlat_hwwyi")
PanelContainer/styles/panel = SubResource("StyleBoxFlat_wl3gy")
PopupBackground/base_type = &"Panel"
PopupBackground/styles/panel = SubResource("StyleBoxFlat_vputg")
PopupMenu/colors/font_accelerator_color = Color(0.7, 0.7, 0.7, 0.8)
PopupMenu/colors/font_color = Color(0.875, 0.875, 0.875, 1)
PopupMenu/colors/font_disabled_color = Color(0.4, 0.4, 0.4, 0.8)
PopupMenu/colors/font_hover_color = Color(0.875, 0.875, 0.875, 1)
PopupMenu/colors/font_outline_color = Color(0, 0, 0, 1)
PopupMenu/colors/font_separator_color = Color(0.875, 0.875, 0.875, 1)
PopupMenu/colors/font_separator_outline_color = Color(0, 0, 0, 1)
PopupMenu/constants/gutter_compact = 1
PopupMenu/constants/h_separation = 4
PopupMenu/constants/icon_max_width = 0
PopupMenu/constants/indent = 10
PopupMenu/constants/item_end_padding = 2
PopupMenu/constants/item_start_padding = 2
PopupMenu/constants/outline_size = 0
PopupMenu/constants/search_bar_separation = 4
PopupMenu/constants/separator_outline_size = 0
PopupMenu/constants/v_separation = 4
PopupMenu/font_sizes/font_separator_size = 16
PopupMenu/font_sizes/font_size = 16
PopupMenu/styles/hover = SubResource("StyleBoxFlat_1de2m")
PopupMenu/styles/labeled_separator_left = SubResource("StyleBoxLine_bacd5")
PopupMenu/styles/labeled_separator_right = SubResource("StyleBoxLine_k3nwn")
PopupMenu/styles/panel = SubResource("StyleBoxFlat_axpob")
PopupMenu/styles/separator = SubResource("StyleBoxLine_cl37w")
PopupPanel/styles/panel = SubResource("StyleBoxFlat_vputg")
ProgressBar/colors/font_color = Color(0.95, 0.95, 0.95, 1)
ProgressBar/colors/font_outline_color = Color(0, 0, 0, 1)
ProgressBar/constants/outline_size = 0
ProgressBar/font_sizes/font_size = 16
ProgressBar/styles/background = SubResource("StyleBoxFlat_07kyi")
ProgressBar/styles/fill = SubResource("StyleBoxFlat_ouuwv")
ScrollContainer/colors/scroll_hint_horizontal_color = Color(0, 0, 0, 1)
ScrollContainer/colors/scroll_hint_vertical_color = Color(0, 0, 0, 1)
ScrollContainer/styles/focus = SubResource("StyleBoxFlat_35dwi")
ScrollContainer/styles/panel = SubResource("StyleBoxEmpty_r3gy8")
ShortcutRowDark/base_type = &"PanelContainer"
ShortcutRowDark/styles/panel = SubResource("StyleBoxFlat_anjdx")
SongRow/base_type = &"PanelContainer"
SongRow/styles/panel = SubResource("StyleBoxFlat_oxgwg")
SongRowLabel/base_type = &"Label"
SongRowLabel/font_sizes/font_size = 20
SongRowLabel/styles/normal = SubResource("StyleBoxFlat_r1nnu")
SongRowLabelPlaying/base_type = &"Label"
SongRowLabelPlaying/colors/font_color = Color(1, 0.5, 0, 1)
SongRowLabelPlaying/font_sizes/font_size = 20
SongRowLabelPlaying/styles/normal = SubResource("StyleBoxFlat_lkqs8")
TextEdit/colors/background_color = Color(0, 0, 0, 0)
TextEdit/colors/caret_background_color = Color(0, 0, 0, 1)
TextEdit/colors/caret_color = Color(0.875, 0.875, 0.875, 1)
TextEdit/colors/current_line_color = Color(0.25, 0.25, 0.26, 0.8)
TextEdit/colors/font_color = Color(0.875, 0.875, 0.875, 1)
TextEdit/colors/font_outline_color = Color(0, 0, 0, 1)
TextEdit/colors/font_placeholder_color = Color(0.875, 0.875, 0.875, 0.6)
TextEdit/colors/font_readonly_color = Color(0.875, 0.875, 0.875, 0.5)
TextEdit/colors/font_selected_color = Color(0, 0, 0, 0)
TextEdit/colors/search_result_border_color = Color(0.3, 0.3, 0.3, 0.4)
TextEdit/colors/search_result_color = Color(0.3, 0.3, 0.3, 1)
TextEdit/colors/selection_color = Color(0.5, 0.5, 0.5, 1)
TextEdit/colors/word_highlighted_color = Color(0.5, 0.5, 0.5, 0.25)
TextEdit/constants/caret_width = 1
TextEdit/constants/line_spacing = 4
TextEdit/constants/outline_size = 0
TextEdit/constants/wrap_offset = 10
TextEdit/font_sizes/font_size = 16
TextEdit/styles/focus = SubResource("StyleBoxFlat_1tv07")
TextEdit/styles/normal = SubResource("StyleBoxFlat_0ly2h")
TextEdit/styles/read_only = SubResource("StyleBoxFlat_o0qds")
TextLarge/base_type = &"Label"
TextLarge/font_sizes/font_size = 20
TextMedium/base_type = &"Label"
TextMedium/font_sizes/font_size = 18
Title/base_type = &"Label"
Title/font_sizes/font_size = 25
TitleLarge/base_type = &"Label"
TitleLarge/font_sizes/font_size = 50
TitleMedium/base_type = &"Label"
TitleMedium/font_sizes/font_size = 35
TooltipLabel/colors/font_color = Color(0.875, 0.875, 0.875, 1)
TooltipLabel/colors/font_outline_color = Color(0, 0, 0, 1)
TooltipLabel/colors/font_shadow_color = Color(0, 0, 0, 0)
TooltipLabel/constants/outline_size = 0
TooltipLabel/constants/shadow_offset_x = 1
TooltipLabel/constants/shadow_offset_y = 1
TooltipLabel/font_sizes/font_size = 16
TooltipPanel/styles/panel = SubResource("StyleBoxFlat_ogk6w")
VBoxContainer/constants/separation = 4
VScrollBar/styles/grabber = SubResource("StyleBoxFlat_dwgvb")
VScrollBar/styles/grabber_highlight = SubResource("StyleBoxFlat_uoaln")
VScrollBar/styles/grabber_pressed = SubResource("StyleBoxFlat_x5u8n")
VScrollBar/styles/scroll = SubResource("StyleBoxFlat_6fedo")
VScrollBar/styles/scroll_focus = SubResource("StyleBoxFlat_8sdcv")
VSeparator/constants/separation = 4
VSeparator/styles/separator = SubResource("StyleBoxLine_r3erx")
WindowBackground/base_type = &"Panel"
WindowBackground/styles/panel = SubResource("StyleBoxFlat_2mdtn")
-4
View File
@@ -1,4 +0,0 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://blf3g88mugovr"]
[resource]
bg_color = Color(0.257813, 0.257813, 0.257813, 1)
-21
View File
@@ -1,21 +0,0 @@
[gd_resource type="Theme" format=3]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_popup"]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.36, 0.36, 0.36, 1)
corner_radius_top_left = 6
corner_radius_top_right = 6
corner_radius_bottom_right = 6
corner_radius_bottom_left = 6
content_margin_left = 12.0
content_margin_top = 12.0
content_margin_right = 12.0
content_margin_bottom = 12.0
[resource]
Panel/styles/panel = SubResource("StyleBoxFlat_popup")
PopupPanel/styles/panel = SubResource("StyleBoxFlat_popup")
-4
View File
@@ -1,4 +0,0 @@
[gd_resource type="StyleBoxFlat" format=3 uid="uid://bsv6yb0yir04l"]
[resource]
bg_color = Color(0.180392, 0.180392, 0.180392, 1)