-
-
Notifications
You must be signed in to change notification settings - Fork 183
/
Copy pathThemeManager.gd
102 lines (77 loc) · 3.48 KB
/
ThemeManager.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
extends Node
const THEME_ROOT := "res://ui/theme/"
const THEME_FONTS_ROOT := "res://ui/theme/fonts/"
const COLOR_TEXT_DEFAULT := Color(0.960784, 0.980392, 0.980392)
const COLOR_TEXT_LOWER_CONTRAST := Color(0.736288, 0.728113, 0.839844)
onready var _theme = preload("res://ui/theme/gdscript_app_theme.tres")
var _font_defaults := {}
func _ready() -> void:
_cache_font_defaults()
var current_profile := UserProfiles.get_profile()
scale_all_font_sizes(current_profile.font_size_scale, false)
set_lower_contrast(current_profile.lower_contrast, false)
set_dyslexia_font(current_profile.dyslexia_font, false)
func _cache_font_defaults() -> void:
_font_defaults.clear()
var fs = Directory.new()
var error = fs.change_dir(THEME_FONTS_ROOT)
if error != OK:
printerr("Failed to open theme fonts directory at '%s': Error code %d" % [THEME_FONTS_ROOT, error])
return
error = fs.list_dir_begin(true, true)
if error != OK:
printerr("Failed to read theme fonts directory at '%s': Error code %d" % [THEME_FONTS_ROOT, error])
return
var current_file := fs.get_next() as String
while not current_file.empty():
if current_file.get_extension() != "tres":
current_file = fs.get_next()
continue
var font_resource = ResourceLoader.load(THEME_FONTS_ROOT.plus_file(current_file)) as DynamicFont
if not font_resource:
current_file = fs.get_next()
continue
_font_defaults[font_resource] = {"size": font_resource.size, "font": font_resource.font_data.font_path}
current_file = fs.get_next()
func scale_all_font_sizes(size_scale: int, and_save: bool = true) -> void:
for font_resource in _font_defaults:
font_resource = font_resource as DynamicFont
if not font_resource:
continue
var default_size = int(_font_defaults[font_resource]["size"])
# Each scale unit equals 2 points of font size.
font_resource.size = default_size + size_scale * 2
if and_save:
var current_profile := UserProfiles.get_profile()
current_profile.font_size_scale = size_scale
current_profile.save()
Events.emit_signal("font_size_scale_changed", size_scale)
func set_lower_contrast(lower_contrast: bool, and_save: bool = true) -> void:
var color := COLOR_TEXT_LOWER_CONTRAST if lower_contrast else COLOR_TEXT_DEFAULT
_theme.set_color("font_color", "Label", color)
_theme.set_color("default_color", "RichTextLabel", color)
if and_save:
var current_profile := UserProfiles.get_profile()
current_profile.lower_contrast = lower_contrast
current_profile.save()
func set_dyslexia_font(dyslexia_font: bool, and_save: bool = true) -> void:
for font_resource in _font_defaults:
font_resource = font_resource as DynamicFont
if not font_resource:
continue
if dyslexia_font:
font_resource.size -= (font_resource.size * 0.25)
if "SourceCodePro" in font_resource.font_data.font_path:
font_resource.font_data = load("res://ui/theme/fonts/OpenDyslexicMono-Regular.otf")
elif "Regular" in font_resource.font_data.font_path:
font_resource.font_data = load("res://ui/theme/fonts/OpenDyslexic-Regular.otf")
elif "Bold" in font_resource.font_data.font_path:
font_resource.font_data = load("res://ui/theme/fonts/OpenDyslexic-Bold.otf")
elif "Italic" in font_resource.font_data.font_path:
font_resource.font_data = load("res://ui/theme/fonts/OpenDyslexic-Italic.otf")
else:
font_resource.font_data = load(_font_defaults[font_resource]["font"])
if and_save:
var current_profile := UserProfiles.get_profile()
current_profile.dyslexia_font = dyslexia_font
current_profile.save()