Skip to content

Commit 43498bf

Browse files
Sync theme color generation with GodSVG (#75)
1 parent c86f2be commit 43498bf

1 file changed

Lines changed: 78 additions & 94 deletions

File tree

src/utils/ThemeUtils.gd

Lines changed: 78 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ static var base_color: Color
88
static var accent_color: Color
99
static var is_theme_dark: bool
1010

11-
static var max_contrast_color: Color
12-
static var min_contrast_color: Color
11+
static var max_contrast_color: Color # White on dark theme, black on light theme.
1312
static var extreme_theme_color: Color # Black on dark theme, white on light theme.
1413
static var tinted_contrast_color: Color # Base color used to derive icon colors and other UI elements.
1514
static var gray_color: Color # Light gray on dark theme, darker gray on light theme.
@@ -18,8 +17,8 @@ static var black_or_white_counter_accent_color: Color
1817

1918
static var warning_icon_color: Color
2019
static var info_icon_color: Color
21-
static var folder_color: Color = Color.BLUE
22-
static var text_file_color: Color = Color.DARK_GRAY
20+
static var folder_color: Color
21+
static var text_file_color: Color
2322

2423
static var hover_selected_inspector_frame_inner_color: Color
2524
static var hover_selected_inspector_frame_title_color: Color
@@ -87,26 +86,24 @@ static var icon_normal_color: Color
8786
static var icon_hover_color: Color
8887
static var icon_pressed_color: Color
8988

90-
static var translucent_button_color_disabled: Color
9189
static var flat_button_color_disabled: Color
9290
static var context_button_color_disabled: Color
9391

9492
static var subtle_flat_panel_color: Color
9593
static var contrast_flat_panel_color: Color
9694
static var overlay_panel_inner_color: Color
97-
static var overlay_panel_subtler_inner_color: Color
95+
static var overlay_panel_border_color: Color
9896

9997
static var scrollbar_pressed_color: Color
10098

10199
static var line_edit_focus_color: Color
102100
static var line_edit_inner_color: Color
103101
static var line_edit_normal_border_color: Color
102+
static var mini_line_edit_inner_color: Color
104103
static var mini_line_edit_normal_border_color: Color
105104
static var line_edit_inner_color_disabled: Color
106105
static var line_edit_border_color_disabled: Color
107106

108-
static var tab_container_panel_inner_color: Color
109-
static var tab_container_panel_border_color: Color
110107
static var text_edit_alternative_inner_color: Color
111108

112109
static var selected_tab_color: Color
@@ -115,23 +112,23 @@ static var selected_tab_border_color: Color
115112
static func color_difference(color1: Color, color2: Color) -> float:
116113
return (absf(color1.r - color2.r) + absf(color1.g - color2.g) + absf(color1.b - color2.b)) / 3.0
117114

118-
119115
static func recalculate_colors() -> void:
120116
base_color = Configs.savedata.base_color
121117
accent_color = Configs.savedata.accent_color
122-
is_theme_dark = base_color.get_luminance() < 0.5
123-
124-
extreme_theme_color = Color.BLACK if is_theme_dark else Color.WHITE
125-
max_contrast_color = Color(1, 1, 1, 0.94) if is_theme_dark else Color(0, 0, 0, 0.87)
126-
min_contrast_color = Color(1, 1, 1, 0.24) if is_theme_dark else Color(0, 0, 0, 0.24)
127-
128-
tinted_contrast_color = accent_color.lerp(max_contrast_color, 0.4)
129-
gray_color = base_color.lerp(max_contrast_color, 0.5)
118+
is_theme_dark = (base_color.get_luminance() < 0.5)
119+
120+
max_contrast_color = Color("#fff") if is_theme_dark else Color("000")
121+
extreme_theme_color = Color("#000") if is_theme_dark else Color("fff")
122+
tinted_contrast_color = Color("#def") if is_theme_dark else Color("061728")
123+
gray_color = Color("808080") if is_theme_dark else Color("666")
130124
tinted_gray_color = tinted_contrast_color.blend(Color(extreme_theme_color, 0.475))
131-
black_or_white_counter_accent_color = extreme_theme_color if is_theme_dark else max_contrast_color
125+
black_or_white_counter_accent_color = Color("#000") if accent_color.get_luminance() > 0.625 else Color("fff")
126+
127+
warning_icon_color = Color("fca") if is_theme_dark else Color("96592c")
128+
info_icon_color = Color("acf") if is_theme_dark else Color("3a6ab0")
132129
folder_color = Color("88b6dd") if is_theme_dark else Color("528fcc")
133130
text_file_color = Color("fec") if is_theme_dark else Color("cc9629")
134-
131+
135132
hover_selected_inspector_frame_inner_color = Color.from_hsv(0.625, 0.48, 0.27) if ThemeUtils.is_theme_dark else Color.from_hsv(0.625, 0.27, 0.925)
136133
hover_selected_inspector_frame_title_color = hover_selected_inspector_frame_inner_color.lerp(max_contrast_color, 0.02)
137134
selected_inspector_frame_inner_color = Color.from_hsv(0.625, 0.5, 0.25) if ThemeUtils.is_theme_dark else Color.from_hsv(0.625, 0.23, 0.925)
@@ -143,98 +140,96 @@ static func recalculate_colors() -> void:
143140
inspector_frame_inner_color = Color.from_hsv(0.625, 0.6, 0.16) if ThemeUtils.is_theme_dark else Color.from_hsv(0.625, 0.12, 0.9)
144141
inspector_frame_title_color = inspector_frame_inner_color.lerp(max_contrast_color, 0.02)
145142
inspector_frame_border_color = Color.from_hsv(0.6, 0.5, 0.35) if ThemeUtils.is_theme_dark else Color.from_hsv(0.6, 0.5, 0.875)
146-
147-
# Icons
148-
warning_icon_color = Color("#FFD54F")
149-
info_icon_color = Color("#64B5F6")
150-
var icon_base = accent_color.lerp(max_contrast_color, 0.4)
143+
144+
intermediate_color = base_color
151145
if is_theme_dark:
152-
icon_normal_color = icon_base.lightened(0.1)
153-
icon_hover_color = icon_base.lightened(0.2)
154-
icon_pressed_color = icon_base.darkened(0.1)
146+
intermediate_color.s *= 0.96
147+
intermediate_color.v = 0.25 + 0.4 * sqrt(intermediate_color.v)
148+
if is_zero_approx(base_color.s):
149+
intermediate_color.h = accent_color.h
150+
elif base_color.h <= 5/6.0 and base_color.h > 1/6.0:
151+
intermediate_color.h = move_toward(intermediate_color.h, 1/6.0, 0.05)
155152
else:
156-
icon_normal_color = icon_base.darkened(0.05)
157-
icon_hover_color = icon_base
158-
icon_pressed_color = icon_base.darkened(0.15)
159-
160-
# Intermediate/neutral variants
161-
intermediate_color = accent_color.lerp(extreme_theme_color, 0.6)
153+
intermediate_color.s = 0.3 + 0.4 * sqrt(intermediate_color.s)
154+
intermediate_color.v *= 0.92
155+
if is_zero_approx(base_color.s):
156+
if not is_zero_approx(accent_color.s):
157+
intermediate_color.h = accent_color.h
158+
else:
159+
intermediate_color.s = 0
160+
intermediate_color.v *= 0.9
161+
162162
desaturated_color = intermediate_color.lerp(gray_color, 0.3).lerp(extreme_theme_color, 0.08)
163+
if not is_theme_dark:
164+
desaturated_color.v *= 0.9
163165
disabled_color = intermediate_color.lerp(gray_color, 0.8)
164-
165-
# Base/accent soft tones
166-
soft_base_color = base_color.lerp(max_contrast_color, 0.015)
167-
softer_base_color = base_color.lerp(max_contrast_color, 0.04)
166+
167+
soft_base_color = base_color.lerp(max_contrast_color, 0.015 if is_theme_dark else 0.03)
168+
softer_base_color = base_color.lerp(max_contrast_color, 0.04 if is_theme_dark else 0.08)
168169
soft_accent_color = accent_color.lerp(extreme_theme_color, 0.1)
169-
170-
# Overlay layers
171-
hover_overlay_color = Color(max_contrast_color, 0.08)
170+
hover_overlay_color = Color(tinted_contrast_color, 0.08)
172171
pressed_overlay_color = Color(tinted_contrast_color.lerp(soft_accent_color, 0.6), 0.24)
173172
hover_pressed_overlay_color = hover_overlay_color.blend(pressed_overlay_color)
174-
175-
soft_hover_overlay_color = Color(max_contrast_color, 0.06)
173+
174+
soft_hover_overlay_color = Color(tinted_contrast_color, 0.06)
176175
soft_pressed_overlay_color = Color(tinted_contrast_color.lerp(soft_accent_color, 0.4), 0.18)
177-
soft_hover_pressed_overlay_color = soft_hover_overlay_color.blend(soft_pressed_overlay_color)
178-
179-
strong_hover_overlay_color = Color(max_contrast_color, 0.12)
180-
stronger_hover_overlay_color = Color(max_contrast_color, 0.16)
181-
182-
# Intermediate overlays
183-
intermediate_hover_color = intermediate_color.blend(hover_overlay_color)
184-
soft_intermediate_color = intermediate_color.lerp(extreme_theme_color, 0.36)
185-
soft_intermediate_hover_color = soft_intermediate_color.blend(soft_hover_overlay_color)
186-
softer_intermediate_color = intermediate_color.lerp(extreme_theme_color, 0.48)
187-
softer_intermediate_hover_color = softer_intermediate_color.blend(soft_hover_overlay_color)
188-
189-
# Text
176+
var softer_hover_overlay_color := soft_hover_overlay_color
177+
softer_hover_overlay_color.a *= 0.5
178+
soft_hover_pressed_overlay_color = softer_hover_overlay_color.blend(soft_pressed_overlay_color)
179+
180+
strong_hover_overlay_color = Color(tinted_contrast_color, 0.12)
181+
stronger_hover_overlay_color = Color(tinted_contrast_color, 0.16)
182+
183+
intermediate_hover_color = intermediate_color.blend(strong_hover_overlay_color if is_theme_dark else stronger_hover_overlay_color)
184+
soft_intermediate_color = intermediate_color.lerp(extreme_theme_color, 0.36 if is_theme_dark else 0.48)
185+
soft_intermediate_hover_color = soft_intermediate_color.blend(soft_hover_overlay_color if is_theme_dark else hover_overlay_color)
186+
softer_intermediate_color = intermediate_color.lerp(extreme_theme_color, 0.44)
187+
if not is_theme_dark:
188+
softer_intermediate_color.s *= 0.8
189+
softer_intermediate_hover_color = softer_intermediate_color.blend(soft_hover_overlay_color if is_theme_dark else hover_overlay_color)
190+
190191
text_color = Color(max_contrast_color, 0.875)
191192
highlighted_text_color = Color(max_contrast_color)
192193
dim_text_color = Color(max_contrast_color, 0.75)
193194
dimmer_text_color = Color(max_contrast_color, 0.5)
194195
subtle_text_color = Color(max_contrast_color, 0.375)
195196
editable_text_color = tinted_contrast_color
196-
197-
# Panels
197+
198198
basic_panel_inner_color = softer_base_color
199199
basic_panel_border_color = base_color.lerp(max_contrast_color, 0.24)
200200
basic_panel_border_color.s = minf(basic_panel_border_color.s * 2.0, lerpf(basic_panel_border_color.s, 1.0, 0.2))
201-
subtle_panel_border_color = basic_panel_border_color.lerp(basic_panel_inner_color, 0.4)
202-
subtle_panel_border_color.s = minf(subtle_panel_border_color.s * 2.0, lerpf(subtle_panel_border_color.s, 1.0, 0.2))
203-
204-
overlay_panel_inner_color = base_color.lerp(extreme_theme_color, 0.15)
205-
overlay_panel_subtler_inner_color = base_color.lerp(extreme_theme_color, 0.08)
206-
207-
tab_container_panel_inner_color = base_color.lerp(extreme_theme_color, 0.12)
208-
tab_container_panel_border_color = max_contrast_color.lerp(base_color, 0.9)
209-
210-
subtle_flat_panel_color = base_color.lerp(max_contrast_color, 0.05)
211-
contrast_flat_panel_color = Color(tinted_contrast_color, 0.1)
212-
213-
# Selection
201+
subtle_panel_border_color = basic_panel_border_color.lerp(extreme_theme_color, 0.24)
202+
214203
caret_color = Color(tinted_contrast_color, 0.875)
215204
selection_color = Color(accent_color, 0.375)
216205
disabled_selection_color = Color(gray_color, 0.4)
217-
218-
# Buttons
206+
219207
common_button_inner_color_pressed = intermediate_color.lerp(accent_color, 0.64).lerp(extreme_theme_color, 0.4)
220208
common_button_border_color_pressed = intermediate_color.lerp(accent_color, 0.8)
221209
common_button_inner_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.72)
222210
common_button_border_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.56)
223-
224-
flat_button_color_disabled = base_color.lerp(max_contrast_color, 0.08)
225-
translucent_button_color_disabled = base_color.lerp(max_contrast_color, 0.1)
211+
212+
icon_normal_color = tinted_contrast_color.lerp(extreme_theme_color, 0.2)
213+
icon_hover_color = tinted_contrast_color
214+
icon_pressed_color = max_contrast_color
215+
216+
flat_button_color_disabled = Color(disabled_color.lerp(extreme_theme_color, 0.4), 0.18)
226217
context_button_color_disabled = Color(Color.BLACK, maxf(0.16, 0.48 - color_difference(Color.BLACK, basic_panel_inner_color) * 2)) if is_theme_dark\
227218
else Color(Color.BLACK, 0.055)
228219

229220
subtle_flat_panel_color = base_color
230221
contrast_flat_panel_color = Color(tinted_contrast_color, 0.1)
231222
overlay_panel_inner_color = base_color.lerp(extreme_theme_color, 0.1)
223+
overlay_panel_border_color = base_color.lerp(max_contrast_color, 0.32)
224+
overlay_panel_border_color.s = minf(overlay_panel_border_color.s * 4.0, lerpf(overlay_panel_border_color.s, 1.0, 0.6))
225+
overlay_panel_border_color.v = lerpf(overlay_panel_border_color.v, 1.0, 0.125)
232226

233227
scrollbar_pressed_color = intermediate_color.blend(Color(tinted_contrast_color.lerp(accent_color.lerp(max_contrast_color, 0.1), 0.2), 0.4))
234228

235229
line_edit_focus_color = Color(accent_color, 0.4)
236230
line_edit_inner_color = desaturated_color.lerp(extreme_theme_color, 0.74)
237231
line_edit_normal_border_color = desaturated_color.lerp(extreme_theme_color, 0.42 if is_theme_dark else 0.35)
232+
mini_line_edit_inner_color = desaturated_color.lerp(extreme_theme_color, 0.78)
238233
mini_line_edit_normal_border_color = desaturated_color.lerp(max_contrast_color, 0.04)
239234
line_edit_inner_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.88)
240235
line_edit_border_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.68)
@@ -246,19 +241,7 @@ static func recalculate_colors() -> void:
246241
connected_button_border_color_hover = line_edit_normal_border_color.blend(strong_hover_overlay_color)
247242
connected_button_inner_color_pressed = line_edit_inner_color.lerp(common_button_inner_color_pressed, 0.8)
248243
connected_button_border_color_pressed = line_edit_normal_border_color.lerp(common_button_border_color_pressed, 0.6)
249-
250-
# Scrollbars
251-
scrollbar_pressed_color = accent_color.lerp(max_contrast_color, 0.4)
252-
253-
# LineEdits
254-
line_edit_focus_color = Color(accent_color, 0.4)
255-
line_edit_inner_color = desaturated_color.lerp(extreme_theme_color, 0.74)
256-
line_edit_normal_border_color = desaturated_color.lerp(extreme_theme_color, 0.42)
257-
mini_line_edit_normal_border_color = desaturated_color.lerp(extreme_theme_color, 0.225)
258-
line_edit_inner_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.88)
259-
line_edit_border_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.68)
260-
261-
# Tabs
244+
262245
selected_tab_color = softer_intermediate_hover_color.lerp(accent_color, 0.2)
263246
selected_tab_border_color = accent_color
264247

@@ -375,7 +358,8 @@ static func _setup_panelcontainer(theme: Theme) -> void:
375358
tab_stylebox.content_margin_right = 12.0
376359
tab_stylebox.content_margin_top = 10.0
377360
tab_stylebox.content_margin_bottom = 10.0
378-
tab_stylebox.bg_color = subtle_flat_panel_color
361+
tab_stylebox.bg_color = basic_panel_inner_color
362+
tab_stylebox.border_color = basic_panel_border_color
379363
theme.set_stylebox("panel", "TabItem", tab_stylebox)
380364

381365
theme.add_type("TabItemActive")
@@ -402,8 +386,8 @@ static func _setup_panelcontainer(theme: Theme) -> void:
402386
theme.add_type("SideBarContent")
403387
theme.set_type_variation("SideBarContent", "PanelContainer")
404388
var panel_stylebox := StyleBoxFlat.new()
405-
panel_stylebox.bg_color = tab_container_panel_inner_color
406-
panel_stylebox.border_color = tab_container_panel_border_color
389+
panel_stylebox.bg_color = soft_base_color.lerp(softer_base_color, 0.6)
390+
panel_stylebox.border_color = subtle_panel_border_color
407391
panel_stylebox.set_border_width_all(1)
408392
panel_stylebox.set_corner_radius_all(8)
409393
panel_stylebox.content_margin_left = 16
@@ -699,7 +683,7 @@ static func _setup_button(theme: Theme) -> void:
699683
theme.set_stylebox("pressed", "TranslucentButton", pressed_translucent_button_stylebox)
700684

701685
var disabled_translucent_button_stylebox := normal_translucent_button_stylebox.duplicate()
702-
disabled_translucent_button_stylebox.bg_color = translucent_button_color_disabled
686+
disabled_translucent_button_stylebox.bg_color = context_button_color_disabled
703687
theme.set_stylebox("disabled", "TranslucentButton", disabled_translucent_button_stylebox)
704688

705689
theme.add_type("FlatButton")
@@ -1250,8 +1234,8 @@ static func _setup_tabcontainer(theme: Theme) -> void:
12501234
theme.set_font_size("font_size", "TabContainer", 14)
12511235

12521236
var panel_stylebox := StyleBoxFlat.new()
1253-
panel_stylebox.bg_color = tab_container_panel_inner_color
1254-
panel_stylebox.border_color = tab_container_panel_border_color
1237+
panel_stylebox.bg_color = soft_base_color.lerp(softer_base_color, 0.5)
1238+
panel_stylebox.border_color = subtle_panel_border_color
12551239
panel_stylebox.border_width_left = 2
12561240
panel_stylebox.border_width_right = 2
12571241
panel_stylebox.border_width_bottom = 2

0 commit comments

Comments
 (0)