Compare commits

..

No commits in common. "main" and "2.3.3" have entirely different histories.
main ... 2.3.3

2 changed files with 211 additions and 311 deletions

@ -4,9 +4,6 @@
# Godot Minimal Theme
> [!NOTE]
> This theme has been ported to Godot natively and is the new default theme starting with Godot 4.6. You don't need to install it anymore. All of the future UI improvements will happen in the [Godot repository](https://github.com/godotengine/godot).
## Installation
1. Download the `minimal_theme.tres` file of the [latest theme version](https://github.com/passivestar/godot-minimal-theme/releases/latest).
@ -19,9 +16,9 @@ Minimal theme supports all editor settings. My recommendations are:
`Editor Settings -> Interface -> Theme`:
- Base Color: `#272727`
- Base Color: `#252525`
- Accent Color: `#569eff`
- Contrast: `0.3-0.35`
- Contrast: `0.25-0.3`
- Icon Saturation: `2`
- Corner Radius: `4-5`

@ -51,60 +51,23 @@ func _init() -> void:
var increased_margin : float = base_spacing + extra_spacing * 0.75
var popup_margin : float = maxf(base_margin * 2.4, 4.0 * scale)
# Colors
dark_theme = base_color.get_luminance() < 0.5
var dark_theme_icon_and_font : bool = dark_theme
if icon_and_font_color != 0: # ColorMode.AUTO_COLOR
dark_theme_icon_and_font = icon_and_font_color == 2 # ColorMode.LIGHT
var color_mono : Color = Color.WHITE if dark_theme else Color.BLACK
var color_mono_inv : Color = Color.BLACK if dark_theme else Color.WHITE
var color_mono_font : Color = Color.WHITE if dark_theme_icon_and_font else Color.BLACK
var mono_color : Color = Color.WHITE if dark_theme else Color.BLACK
var mono_color_icon_and_font : Color = Color.WHITE if dark_theme_icon_and_font else Color.BLACK
var extra_border_color_1 : Color = Color(1, 1, 1, 0.4) if dark_theme else Color(0, 0, 0, 0.4)
var extra_border_color_2 : Color = Color(1, 1, 1, 0.2) if dark_theme else Color(0, 0, 0, 0.2)
# Ensure minimum contrast with the light theme. The default
# contrast makes it hard to see the UI elements
if not dark_theme and contrast < 0 and contrast > -0.4:
contrast = -0.4
# Surface colors
var color_surface_lowest : Color = _get_base_color(-1.3 if dark_theme else -2.2, 0.9)
var color_surface_lower : Color = _get_base_color(-0.95 if dark_theme else -1.8, 0.9)
var color_surface_low : Color = _get_base_color(-0.6 if dark_theme else -0.9)
var color_surface_base : Color = _get_base_color(-0.2)
var color_surface_high : Color = _get_base_color(0.2, 0.8)
var color_surface_higher : Color = _get_base_color(0.35, 0.8)
var color_surface_highest : Color = _get_base_color(0.55, 0.6)
# Font colors
var color_font_normal : Color = color_mono_font * Color(1, 1, 1, 0.7)
var color_font_secondary : Color = color_mono_font * Color(1, 1, 1, 0.45)
var color_font_highlighted : Color = color_mono_font
var color_font_dimmed : Color = color_mono_font * Color(1, 1, 1, 0.35 if dark_theme_icon_and_font else 0.5)
# Icon colors
var color_icon_normal : Color = Color(1, 1, 1, 0.7 if dark_theme_icon_and_font else 0.95)
var color_icon_secondary : Color = Color(1, 1, 1, 0.45 if dark_theme_icon_and_font else 0.6)
var color_icon_focus : Color = Color(1, 1, 1)
var color_icon_hover : Color = Color(1, 1, 1)
var color_icon_pressed : Color = accent_color * (1.15 if dark_theme_icon_and_font else 3.5)
color_icon_pressed.a = 1.0
var color_icon_disabled : Color = Color(1, 1, 1, 0.35 if dark_theme_icon_and_font else 0.5)
# Button colors
var color_button_normal : Color = _get_base_color(0.35, 0.85)
var color_button_hover : Color = _get_base_color(0.55, 0.75)
var color_button_pressed : Color = _get_base_color(0.75, 0.75)
var color_button_disabled : Color = _get_base_color(0.2, 0.75)
var color_button_border : Color = _get_base_color(0.45, 0.75)
var color_button_border_hover : Color = _get_base_color(0.65, 0.75)
var color_button_border_pressed : Color = _get_base_color(0.85, 0.75)
# Extra border colors
var color_extra_border : Color = color_mono * Color(1, 1, 1, 0.4)
var color_extra_border_dimmed : Color = color_mono * Color(1, 1, 1, 0.2)
# Main stylebox that most styleboxes duplicate
var base_sb : StyleBoxFlat = StyleBoxFlat.new()
base_sb.bg_color = base_color
@ -115,48 +78,45 @@ func _init() -> void:
# than transparent ones, however this is currently only noticeable on the Close
# button of editor settings, and it probably shouldn't even exist
var button_sb : StyleBoxFlat = base_sb.duplicate()
button_sb.bg_color = color_button_normal
button_sb.shadow_color = color_mono_inv * Color(1, 1, 1, 0.005)
button_sb.bg_color = _get_base_color(0.3, 0.8)
button_sb.shadow_color = Color(0, 0, 0, 0.005) if dark_theme else Color(1, 1, 1, 0.005)
button_sb.shadow_size = int(ceilf(8 * scale))
button_sb.shadow_offset = Vector2(0, 4) * scale
if draw_extra_borders:
_set_border(button_sb, color_extra_border, 1)
_set_border(button_sb, extra_border_color_1, floorf(scale))
else:
_set_border(button_sb, color_button_border, 1)
_set_border(button_sb, _get_base_color(0.425, 0.7), 1)
_set_margin(button_sb, base_margin * 2, base_margin * 1.5, base_margin * 2, base_margin * 1.5)
var button_hover_sb : StyleBoxFlat = button_sb.duplicate()
button_hover_sb.bg_color = color_button_hover
button_hover_sb.bg_color = _get_base_color(0.5, 0.7)
if draw_extra_borders:
_set_border(button_hover_sb, color_extra_border, 1)
_set_border(button_hover_sb, extra_border_color_1, floorf(scale))
else:
_set_border(button_hover_sb, color_button_border_hover, 1)
_set_border(button_hover_sb, _get_base_color(0.625, 0.7), 1)
var button_pressed_sb : StyleBoxFlat = button_sb.duplicate()
button_pressed_sb.bg_color = color_button_pressed
button_pressed_sb.bg_color = _get_base_color(0.7, 0.7)
if draw_extra_borders:
_set_border(button_pressed_sb, color_extra_border, 1)
_set_border(button_pressed_sb, extra_border_color_1, floorf(scale))
else:
_set_border(button_pressed_sb, color_button_border_pressed, 1)
_set_border(button_pressed_sb, _get_base_color(0.825, 0.7), 1)
var button_disabled_sb : StyleBoxFlat = button_sb.duplicate()
button_disabled_sb.set_border_width_all(0)
button_disabled_sb.bg_color = color_button_disabled
button_disabled_sb.bg_color = _get_base_color(0.2, 0.7)
if draw_extra_borders:
_set_border(button_disabled_sb, color_extra_border_dimmed * Color(1, 1, 1, 0.5), 1)
_set_border(button_disabled_sb, extra_border_color_2 * Color(1, 1, 1, 0.5), floorf(scale))
var flat_button_hover_sb : StyleBoxFlat = base_sb.duplicate()
# This affects buttons in Tree so top and bottom margins should be kept low
_set_margin(flat_button_hover_sb, base_margin * 1.5, base_margin * 0.9, base_margin * 1.5, base_margin * 0.9)
flat_button_hover_sb.bg_color = color_button_normal
flat_button_hover_sb.bg_color = _get_base_color(0.3, 0.7)
if draw_extra_borders:
_set_border(flat_button_hover_sb, color_extra_border, 1)
_set_border(flat_button_hover_sb, extra_border_color_1, floorf(scale))
var flat_button_pressed_sb : StyleBoxFlat = flat_button_hover_sb.duplicate()
flat_button_pressed_sb.bg_color = color_button_hover
var flat_button_normal_sb : StyleBoxFlat = flat_button_hover_sb.duplicate()
flat_button_normal_sb.draw_center = false
flat_button_pressed_sb.bg_color = _get_base_color(0.5, 0.7)
var base_empty_sb : StyleBoxFlat = base_sb.duplicate()
base_empty_sb.draw_center = false
@ -171,15 +131,15 @@ func _init() -> void:
# Animation editor
set_color('focus_color', 'AnimationBezierTrackEdit', Color.TRANSPARENT)
set_color('h_line_color', 'AnimationBezierTrackEdit', color_mono * Color(1, 1, 1, 0.12))
set_color('track_focus_color', 'AnimationBezierTrackEdit', color_mono * Color(1, 1, 1, 0.1))
set_color('h_line_color', 'AnimationBezierTrackEdit', mono_color * Color(1, 1, 1, 0.12))
set_color('track_focus_color', 'AnimationBezierTrackEdit', mono_color * Color(1, 1, 1, 0.1))
set_color('v_line_color', 'AnimationBezierTrackEdit', Color.TRANSPARENT)
set_color('font_primary_color', 'AnimationTimelineEdit', color_font_normal)
set_color('font_secondary_color', 'AnimationTimelineEdit', color_font_dimmed)
set_color('font_primary_color', 'AnimationTimelineEdit', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('font_secondary_color', 'AnimationTimelineEdit', mono_color_icon_and_font * Color(1, 1, 1, 0.4))
set_color('h_line_color', 'AnimationTimelineEdit', Color.TRANSPARENT)
set_color('v_line_primary_color', 'AnimationTimelineEdit', color_mono * Color(1, 1, 1, 0.4))
set_color('v_line_secondary_color', 'AnimationTimelineEdit', color_mono * Color(1, 1, 1, 0.08))
set_color('v_line_primary_color', 'AnimationTimelineEdit', mono_color * Color(1, 1, 1, 0.4))
set_color('v_line_secondary_color', 'AnimationTimelineEdit', mono_color * Color(1, 1, 1, 0.08))
set_constant('text_primary_margin', 'AnimationTimelineEdit', int(base_margin * 0.75 * scale))
set_constant('text_secondary_margin', 'AnimationTimelineEdit', int(base_margin * 0.5 * scale))
@ -189,13 +149,13 @@ func _init() -> void:
set_constant('v_line_secondary_width', 'AnimationTimelineEdit', int(ceilf(scale)))
var sb : StyleBoxFlat = base_sb.duplicate()
sb.bg_color = color_surface_highest
sb.bg_color = _get_base_color(0.55, 0.7)
if draw_extra_borders:
_set_border(sb, color_extra_border, 1)
_set_border(sb, extra_border_color_1, floorf(scale))
set_stylebox('time_available', 'AnimationTimelineEdit', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_high
sb.bg_color = _get_base_color(0.2, 0.8)
set_stylebox('time_unavailable', 'AnimationTimelineEdit', sb)
set_color('h_line_color', 'AnimationTrackEdit', Color.TRANSPARENT)
@ -203,25 +163,25 @@ func _init() -> void:
sb = base_sb.duplicate()
sb.draw_center = false
_set_border(sb, color_surface_high, 2)
_set_border(sb, _get_base_color(0.3, 0.6), 2)
_set_margin(sb, base_margin * 1.5, base_margin, base_margin * 1.5, base_margin)
set_stylebox('focus', 'AnimationTrackEdit', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_high
sb.bg_color = _get_base_color(0.2, 0.9)
set_stylebox('hover', 'AnimationTrackEdit', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_base
sb.bg_color = _get_base_color(-0.2)
set_stylebox('odd', 'AnimationTrackEdit', sb)
set_color('bg_color', 'AnimationTrackEditGroup', color_surface_base)
set_color('bg_color', 'AnimationTrackEditGroup', _get_base_color(-0.2))
set_color('h_line_color', 'AnimationTrackEditGroup', Color.TRANSPARENT)
set_color('v_line_color', 'AnimationTrackEditGroup', Color.TRANSPARENT)
set_constant('h_separation', 'AnimationTrackEditGroup', int(base_margin * 2 * scale))
sb = base_sb.duplicate()
sb.bg_color = color_surface_low
sb.bg_color = _get_base_color(-0.6)
_set_margin(sb, base_margin * 4, base_margin, 0, base_margin)
set_stylebox('header', 'AnimationTrackEditGroup', sb)
@ -244,27 +204,23 @@ func _init() -> void:
# Audio Bus
sb = base_sb.duplicate()
sb.bg_color = color_surface_high
sb.bg_color = _get_base_color(0.2, 0.7)
set_stylebox('normal', 'EditorAudioBus', sb)
set_stylebox('focus', 'EditorAudioBus', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_higher
sb.bg_color = _get_base_color(0.35, 0.7)
set_stylebox('master', 'EditorAudioBus', sb)
# Button
set_color('font_color', 'Button', color_font_normal)
set_color('font_disabled_color', 'Button', color_font_dimmed)
set_color('font_focus_color', 'Button', color_font_highlighted)
set_color('font_hover_color', 'Button', color_font_highlighted)
set_color('font_hover_pressed_color', 'Button', color_font_highlighted)
set_color('font_pressed_color', 'Button', color_font_highlighted)
set_color('icon_disabled_color', 'Button', color_icon_disabled)
set_color('icon_focus_color', 'Button', color_icon_focus)
set_color('icon_hover_color', 'Button', color_icon_hover)
set_color('icon_hover_pressed_color', 'Button', color_icon_hover)
set_color('icon_normal_color', 'Button', color_icon_normal)
set_color('icon_pressed_color', 'Button', color_icon_pressed)
set_color('font_color', 'Button', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('font_disabled_color', 'Button', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('font_focus_color', 'Button', mono_color_icon_and_font)
set_color('font_hover_color', 'Button', mono_color_icon_and_font)
set_color('font_hover_pressed_color', 'Button', mono_color_icon_and_font)
set_color('font_pressed_color', 'Button', mono_color_icon_and_font)
set_color('icon_disabled_color', 'Button', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('icon_normal_color', 'Button', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_constant('outline_size', 'Button', 0)
set_stylebox('disabled', 'Button', button_disabled_sb)
set_stylebox('disabled_mirrored', 'Button', button_disabled_sb)
@ -280,8 +236,8 @@ func _init() -> void:
# Checkbox
set_color('font_hover_pressed_color', 'CheckBox', color_font_highlighted)
set_color('font_pressed_color', 'CheckBox', color_font_normal)
set_color('font_hover_pressed_color', 'CheckBox', mono_color_icon_and_font)
set_color('font_pressed_color', 'CheckBox', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
sb = base_sb.duplicate()
sb.draw_center = false
@ -291,24 +247,24 @@ func _init() -> void:
# CheckButton
set_color('font_focus_color', 'CheckButton', color_font_normal)
set_color('font_hover_pressed_color', 'CheckButton', color_font_highlighted)
set_color('font_pressed_color', 'CheckButton', color_font_normal)
set_color('font_focus_color', 'CheckButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('font_hover_pressed_color', 'CheckButton', mono_color_icon_and_font)
set_color('font_pressed_color', 'CheckButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
# Editor
set_color('background', 'Editor', color_surface_low)
set_color('box_selection_fill_color', 'Editor', color_mono * Color(1, 1, 1, 0.12))
set_color('box_selection_stroke_color', 'Editor', color_mono * Color(1, 1, 1, 0.4))
set_color('background', 'Editor', _get_base_color(-0.6))
set_color('box_selection_fill_color', 'Editor', mono_color * Color(1, 1, 1, 0.12))
set_color('box_selection_stroke_color', 'Editor', mono_color * Color(1, 1, 1, 0.4))
# Ruler in 2D view:
set_color('dark_color_2', 'Editor', base_color.lerp(color_mono_inv, 0.3) * Color(1, 1, 1, 0.8))
set_color('dark_color_2', 'Editor', Color(0, 0, 0, 0.3) if dark_theme else Color(1, 1, 1, 0.3))
# Shortcut tree cell background:
set_color('dark_color_3', 'Editor', color_surface_lower)
set_color('dark_color_3', 'Editor', _get_base_color(-0.6))
set_color('forward_plus_color', 'Editor', Color(0.54902, 0.752941, 0.392157))
set_color('gl_compatibility_color', 'Editor', Color(0.447059, 0.698039, 0.890196))
set_color('mobile_color', 'Editor', Color(0.862745, 0.482353, 0.584314))
set_color('property_color_w', 'Editor', color_font_normal)
set_color('property_color_w', 'Editor', mono_color_icon_and_font * Color(1, 1, 1, 0.8))
set_color('property_color_x', 'Editor', Color('#E16277') if dark_theme_icon_and_font else Color('#670A18'))
set_color('property_color_y', 'Editor', Color('#C3EF65') if dark_theme_icon_and_font else Color('#455E10'))
set_color('property_color_z', 'Editor', Color('#6AABF6') if dark_theme_icon_and_font else Color('#143862'))
@ -327,17 +283,17 @@ func _init() -> void:
sb.corner_radius_bottom_right = int(corner_radius * scale)
sb.corner_radius_bottom_left = int(corner_radius * scale)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('normal', 'EditorHelpBitContent', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_low
sb.bg_color = _get_base_color(-0.55 if dark_theme else -0.9) # Same as secondary tree
_set_margin(sb, base_margin * 2, base_margin, base_margin * 2, base_margin)
sb.set_corner_radius_all(0)
sb.corner_radius_top_right = int(corner_radius * scale)
sb.corner_radius_top_left = int(corner_radius * scale)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('normal', 'EditorHelpBitTitle', sb)
# EditorInspector
@ -347,10 +303,10 @@ func _init() -> void:
set_stylebox('panel', 'EditorInspector', empty_sb)
set_constant('v_separation', 'EditorInspector', int(base_margin * 0.5 * scale))
sb = base_sb.duplicate()
sb.bg_color = color_surface_high
sb.bg_color = _get_base_color(0.2, 0.8)
_set_margin(sb, 0, base_margin * 1.2, 0, base_margin * 1.2)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('bg', 'EditorInspectorCategory', sb)
set_constant('h_separation', 'EditorInspectorSection', int(base_margin * scale))
@ -364,7 +320,7 @@ func _init() -> void:
# EditorProperty
set_color('property_color', 'EditorProperty', color_font_normal)
set_color('property_color', 'EditorProperty', mono_color_icon_and_font * Color(1, 1, 1, 0.6))
set_color('warning_color', 'EditorProperty', get_color('warning_color', 'Editor'))
set_stylebox('bg', 'EditorProperty', base_empty_sb)
@ -373,35 +329,27 @@ func _init() -> void:
# bindings editor relies on it for property removal
sb = base_sb.duplicate()
# Transparent background to make sure it blends with subresource editors
sb.bg_color = color_mono * Color(1, 1, 1, 0.03)
sb.bg_color = mono_color * Color(1, 1, 1, 0.03)
set_stylebox('bg_selected', 'EditorProperty', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_lower
sb.bg_color = _get_base_color(-0.8) # Same as LineEdit normal
sb.set_content_margin_all(base_margin * scale)
set_stylebox('child_bg', 'EditorProperty', sb)
# EditorSpinSlider
sb = base_sb.duplicate()
sb.bg_color = color_surface_lower
sb.bg_color = _get_base_color(-0.8)
sb.set_content_margin_all(base_margin * scale)
set_stylebox('label_bg', 'EditorSpinSlider', sb)
# EditorNode
sb = base_sb.duplicate()
sb.set_content_margin_all(0)
sb.set_corner_radius_all(0)
sb.bg_color = color_surface_lowest
set_stylebox('Background', 'EditorStyles', sb)
# Viewport
sb = base_sb.duplicate()
sb.draw_center = false
sb.set_corner_radius_all(0)
_set_border(sb, color_mono * Color(1, 1, 1, 0.07), 2, false)
_set_border(sb, mono_color * Color(1, 1, 1, 0.07), 2, false)
set_stylebox('FocusViewport', 'EditorStyles', sb)
sb = base_sb.duplicate()
@ -412,15 +360,17 @@ func _init() -> void:
# Contextual Toolbar
sb = base_sb.duplicate()
sb.bg_color = color_surface_higher
sb.bg_color = _get_base_color(0.25)
sb.set_content_margin_all(0)
set_stylebox('ContextualToolbar', 'EditorStyles', sb)
# LaunchPad
sb = base_sb.duplicate()
sb.bg_color = accent_color * Color(1, 1, 1, 0.2)
_set_border(sb, accent_color * Color(1, 1, 1, 0.8), 2)
sb.bg_color = _get_base_color(-0.5)
_set_margin(sb, base_margin * 1.5, base_margin, base_margin * 1.5, base_margin)
sb.set_expand_margin_all(scale)
sb.set_border_width_all(0)
set_stylebox('LaunchPadMovieMode', 'EditorStyles', sb)
sb = sb.duplicate()
@ -429,25 +379,20 @@ func _init() -> void:
set_stylebox('LaunchPadNormal', 'EditorStyles', sb)
sb = base_sb.duplicate()
sb.bg_color = accent_color * Color(1, 1, 1, 0.8)
sb.bg_color = _get_base_color(0.5)
sb.set_content_margin_all(0)
set_stylebox('MovieWriterButtonPressed', 'EditorStyles', sb)
sb = base_sb.duplicate()
sb.bg_color = color_mono * Color(1, 1, 1, 0.1)
sb.set_content_margin_all(0)
set_stylebox('hover', 'RunBarButton', sb)
# Godot 4.5:
set_color('icon_normal_color', 'RunBarButtonMovieMakerDisabled', color_font_normal)
set_color('icon_pressed_color', 'RunBarButtonMovieMakerDisabled', color_font_highlighted)
set_color('icon_hover_color', 'RunBarButtonMovieMakerDisabled', color_font_highlighted)
set_color('icon_hover_pressed_color', 'RunBarButtonMovieMakerDisabled', color_font_highlighted)
set_color('icon_normal_color', 'RunBarButtonMovieMakerDisabled', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('icon_pressed_color', 'RunBarButtonMovieMakerDisabled', mono_color_icon_and_font)
set_color('icon_hover_color', 'RunBarButtonMovieMakerDisabled', mono_color_icon_and_font)
set_color('icon_hover_pressed_color', 'RunBarButtonMovieMakerDisabled', mono_color_icon_and_font)
set_color('icon_normal_color', 'RunBarButtonMovieMakerEnabled', color_font_normal)
set_color('icon_pressed_color', 'RunBarButtonMovieMakerEnabled', color_font_highlighted)
set_color('icon_hover_color', 'RunBarButtonMovieMakerEnabled', color_font_highlighted)
set_color('icon_hover_pressed_color', 'RunBarButtonMovieMakerEnabled', color_font_highlighted)
set_color('icon_normal_color', 'RunBarButtonMovieMakerEnabled', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('icon_pressed_color', 'RunBarButtonMovieMakerEnabled', mono_color_icon_and_font)
set_color('icon_hover_color', 'RunBarButtonMovieMakerEnabled', mono_color_icon_and_font)
set_color('icon_hover_pressed_color', 'RunBarButtonMovieMakerEnabled', mono_color_icon_and_font)
# Godot 4.4 and earlier:
set_color('movie_writer_icon_hover', 'EditorStyles', Color(1, 1, 1, 0.8))
@ -458,24 +403,20 @@ func _init() -> void:
# EditorValidationPanel
sb = base_sb.duplicate()
sb.bg_color = color_surface_low
sb.bg_color = _get_base_color(-0.5)
_set_margin(sb, base_margin, base_margin * 0.5, base_margin, base_margin * 0.5)
set_stylebox('panel', 'EditorValidationPanel', sb)
# FlatButton
set_color('font_color', 'FlatButton', color_font_normal)
set_color('font_disabled_color', 'FlatButton', color_font_dimmed)
set_color('font_focus_color', 'FlatButton', color_font_highlighted)
set_color('font_hover_color', 'FlatButton', color_font_highlighted)
set_color('font_hover_pressed_color', 'FlatButton', color_font_highlighted)
set_color('font_pressed_color', 'FlatButton', color_font_highlighted)
set_color('icon_disabled_color', 'FlatButton', color_icon_disabled)
set_color('icon_focus_color', 'FlatButton', color_icon_focus)
set_color('icon_hover_color', 'FlatButton', color_icon_hover)
set_color('icon_hover_pressed_color', 'FlatButton', color_icon_hover)
set_color('icon_normal_color', 'FlatButton', color_icon_normal)
set_color('icon_pressed_color', 'FlatButton', color_icon_pressed)
set_color('font_color', 'FlatButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('font_disabled_color', 'FlatButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('font_focus_color', 'FlatButton', mono_color_icon_and_font)
set_color('font_hover_color', 'FlatButton', mono_color_icon_and_font)
set_color('font_hover_pressed_color', 'FlatButton', mono_color_icon_and_font)
set_color('font_pressed_color', 'FlatButton', mono_color_icon_and_font)
set_color('icon_disabled_color', 'FlatButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('icon_normal_color', 'FlatButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_stylebox('disabled', 'FlatButton', base_empty_wide_sb)
set_stylebox('disabled_mirrored', 'FlatButton', base_empty_wide_sb)
@ -490,19 +431,19 @@ func _init() -> void:
# FlatMenuButton
set_color('font_color', 'FlatMenuButton', color_font_normal)
set_color('font_disabled_color', 'FlatMenuButton', color_font_dimmed)
set_color('font_focus_color', 'FlatMenuButton', color_font_highlighted)
set_color('font_hover_color', 'FlatMenuButton', color_font_highlighted)
set_color('font_hover_pressed_color', 'FlatMenuButton', color_font_highlighted)
set_color('font_pressed_color', 'FlatMenuButton', color_font_highlighted)
set_color('font_color', 'FlatMenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('font_disabled_color', 'FlatMenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('font_focus_color', 'FlatMenuButton', mono_color_icon_and_font)
set_color('font_hover_color', 'FlatMenuButton', mono_color_icon_and_font)
set_color('font_hover_pressed_color', 'FlatMenuButton', mono_color_icon_and_font)
set_color('font_pressed_color', 'FlatMenuButton', mono_color_icon_and_font)
set_color('icon_disabled_color', 'FlatMenuButton', color_icon_disabled)
set_color('icon_focus_color', 'FlatMenuButton', color_icon_focus)
set_color('icon_hover_color', 'FlatMenuButton', color_icon_hover)
set_color('icon_hover_pressed_color', 'FlatMenuButton', color_icon_hover)
set_color('icon_normal_color', 'FlatMenuButton', color_icon_normal)
set_color('icon_pressed_color', 'FlatMenuButton', color_icon_pressed)
set_color('icon_normal_color', 'FlatMenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('icon_disabled_color', 'FlatMenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('icon_focus_color', 'FlatMenuButton', mono_color_icon_and_font)
set_color('icon_hover_color', 'FlatMenuButton', mono_color_icon_and_font)
set_color('icon_hover_pressed_color', 'FlatMenuButton', mono_color_icon_and_font)
set_color('icon_pressed_color', 'FlatMenuButton', mono_color_icon_and_font)
set_stylebox('disabled', 'FlatMenuButton', base_empty_wide_sb)
set_stylebox('disabled_mirrored', 'FlatMenuButton', base_empty_wide_sb)
@ -520,7 +461,7 @@ func _init() -> void:
sb = base_sb.duplicate()
sb.draw_center = false
_set_border(sb, color_mono * Color(1, 1, 1, 0.3), 1)
_set_border(sb, mono_color * Color(1, 1, 1, 0.3), 1, false)
set_stylebox('sample_focus', 'ColorPicker', sb)
set_stylebox('picker_focus_rectangle', 'ColorPicker', sb)
@ -535,7 +476,7 @@ func _init() -> void:
sb = base_sb.duplicate()
sb.draw_center = false
_set_border(sb, color_mono * Color(1, 1, 1, 0.07), 2)
_set_border(sb, mono_color * Color(1, 1, 1, 0.07), 2, false)
set_stylebox('panel_focus', 'GraphEdit', sb)
# GraphStateMachine
@ -575,7 +516,7 @@ func _init() -> void:
set_constant('v_separation', 'ItemList', int(base_margin * 1.5 * scale))
sb = base_sb.duplicate()
sb.bg_color = color_mono * Color(1, 1, 1, 0.04)
sb.bg_color = mono_color * Color(1, 1, 1, 0.04)
set_stylebox('cursor', 'ItemList', sb)
set_stylebox('cursor_unfocused', 'ItemList', sb)
set_stylebox('focus', 'ItemList', base_empty_sb)
@ -592,7 +533,7 @@ func _init() -> void:
# Label
set_color('font_color', 'Label', color_font_normal)
set_color('font_color', 'Label', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
empty_sb = base_empty_sb.duplicate()
# Keeping vertical margin low otherwise quick open looks bad
@ -601,30 +542,30 @@ func _init() -> void:
# LineEdit and TextEdit
set_color('font_placeholder_color', 'LineEdit', color_font_dimmed)
set_color('font_placeholder_color', 'LineEdit', mono_color_icon_and_font * Color(1, 1, 1, 0.4))
sb = base_sb.duplicate()
sb.bg_color = color_surface_lowest
sb.bg_color = _get_base_color(-1.3 if dark_theme else -2.2)
if draw_extra_borders:
_set_border(sb, color_extra_border, 1)
_set_border(sb, extra_border_color_1, floorf(scale))
_set_margin(sb, base_margin * 2, base_margin * 0.75, base_margin * 2, base_margin * 0.75)
set_stylebox('focus', 'LineEdit', sb)
set_stylebox('focus', 'TextEdit', sb)
sb = sb.duplicate()
sb.bg_color = color_surface_lower
sb.bg_color = _get_base_color(-0.9 if dark_theme else -1.8)
set_stylebox('normal', 'LineEdit', sb)
set_stylebox('normal', 'TextEdit', sb)
# Using transparent background for readonly otherwise it looks bad in the master audio bus
sb = sb.duplicate()
sb.bg_color = Color(0, 0, 0, 0.2) if dark_theme else Color(1, 1, 1, 0.5)
sb.bg_color = Color(0, 0, 0, 0.1) if dark_theme else Color(1, 1, 1, 0.1)
set_stylebox('read_only', 'LineEdit', sb)
set_stylebox('read_only', 'TextEdit', sb)
# MainMenuBar
set_stylebox('normal', 'MainMenuBar', flat_button_normal_sb)
set_stylebox('normal', 'MainMenuBar', base_empty_wide_sb)
set_stylebox('hover', 'MainMenuBar', flat_button_hover_sb)
set_stylebox('hover_pressed', 'MainMenuBar', flat_button_pressed_sb)
set_stylebox('pressed', 'MainMenuBar', flat_button_pressed_sb)
@ -642,19 +583,19 @@ func _init() -> void:
# MenuButton
set_color('font_color', 'MenuButton', color_font_normal)
set_color('font_disabled_color', 'MenuButton', color_font_dimmed)
set_color('font_focus_color', 'MenuButton', color_font_highlighted)
set_color('font_hover_color', 'MenuButton', color_font_highlighted)
set_color('font_hover_pressed_color', 'MenuButton', color_font_highlighted)
set_color('font_pressed_color', 'MenuButton', color_font_highlighted)
set_color('font_color', 'MenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('font_disabled_color', 'MenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('font_focus_color', 'MenuButton', mono_color_icon_and_font)
set_color('font_hover_color', 'MenuButton', mono_color_icon_and_font)
set_color('font_hover_pressed_color', 'MenuButton', mono_color_icon_and_font)
set_color('font_pressed_color', 'MenuButton', mono_color_icon_and_font)
set_color('icon_disabled_color', 'MenuButton', color_icon_disabled)
set_color('icon_focus_color', 'MenuButton', color_icon_focus)
set_color('icon_hover_color', 'MenuButton', color_icon_hover)
set_color('icon_hover_pressed_color', 'MenuButton', color_icon_hover)
set_color('icon_normal_color', 'MenuButton', color_icon_normal)
set_color('icon_pressed_color', 'MenuButton', color_icon_pressed)
set_color('icon_normal_color', 'MenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('icon_disabled_color', 'MenuButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('icon_focus_color', 'MenuButton', mono_color_icon_and_font)
set_color('icon_hover_color', 'MenuButton', mono_color_icon_and_font)
set_color('icon_hover_pressed_color', 'MenuButton', mono_color_icon_and_font)
set_color('icon_pressed_color', 'MenuButton', mono_color_icon_and_font)
set_stylebox('disabled', 'MenuButton', base_empty_wide_sb)
set_stylebox('disabled_mirrored', 'MenuButton', base_empty_wide_sb)
@ -670,20 +611,16 @@ func _init() -> void:
# OptionButton
set_constant('arrow_margin', 'OptionButton', int(base_margin * 2 * scale))
set_color('font_color', 'OptionButton', color_font_normal)
set_color('font_disabled_color', 'OptionButton', color_font_dimmed)
set_color('font_focus_color', 'OptionButton', color_font_highlighted)
set_color('font_hover_color', 'OptionButton', color_font_highlighted)
set_color('font_hover_pressed_color', 'OptionButton', color_font_highlighted)
set_color('font_pressed_color', 'OptionButton', color_font_highlighted)
set_color('icon_disabled_color', 'OptionButton', color_icon_disabled)
set_color('icon_focus_color', 'OptionButton', color_icon_focus)
set_color('icon_hover_color', 'OptionButton', color_icon_hover)
set_color('icon_hover_pressed_color', 'OptionButton', color_icon_hover)
set_color('icon_normal_color', 'OptionButton', color_icon_normal)
set_color('icon_pressed_color', 'OptionButton', color_icon_pressed)
set_constant('arrow_margin', 'OptionButton', int(base_margin * 3.5))
set_color('font_color', 'OptionButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('font_disabled_color', 'OptionButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('font_focus_color', 'OptionButton', mono_color_icon_and_font)
set_color('font_hover_color', 'OptionButton', mono_color_icon_and_font)
set_color('font_hover_pressed_color', 'OptionButton', mono_color_icon_and_font)
set_color('font_pressed_color', 'OptionButton', mono_color_icon_and_font)
set_color('icon_disabled_color', 'OptionButton', mono_color_icon_and_font * Color(1, 1, 1, 0.3))
set_color('icon_normal_color', 'OptionButton', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_stylebox('disabled', 'OptionButton', button_disabled_sb)
set_stylebox('disabled_mirrored', 'OptionButton', button_disabled_sb)
@ -706,17 +643,17 @@ func _init() -> void:
set_stylebox('hover', 'PopupMenu', flat_button_hover_sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_lower
sb.bg_color = _get_base_color(-0.8, 0.9)
sb.set_content_margin_all(int(popup_margin * scale))
sb.set_corner_radius_all(0)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('panel', 'PopupMenu', sb)
var line_sb : StyleBoxLine = StyleBoxLine.new()
line_sb.color = color_mono * Color(1, 1, 1, 0.075 if dark_theme else 0.125)
line_sb.grow_begin = base_margin * -2.0 * scale
line_sb.grow_end = base_margin * -2.0 * scale
line_sb.color = _get_base_color(-1.4, 0.6)
line_sb.grow_begin = base_margin * -1.5 * scale
line_sb.grow_end = base_margin * -1.5 * scale
line_sb.thickness = int(ceilf(scale * 2))
set_stylebox('labeled_separator_left', 'PopupMenu', line_sb)
set_stylebox('labeled_separator_right', 'PopupMenu', line_sb)
@ -725,21 +662,21 @@ func _init() -> void:
set_stylebox('panel', 'PanelContainer', base_empty_wide_sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_lower
sb.bg_color = _get_base_color(-0.8, 0.9)
sb.shadow_color = Color(0, 0, 0, 0.3)
sb.shadow_size = int(base_margin * 0.75 * scale)
sb.set_content_margin_all(int(popup_margin * scale))
sb.set_corner_radius_all(0)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('panel', 'PopupPanel', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_lower
sb.bg_color = _get_base_color(-0.8, 0.9)
sb.set_content_margin_all(0)
sb.set_corner_radius_all(0)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('panel', 'TooltipPanel', sb)
sb = base_sb.duplicate()
@ -749,7 +686,7 @@ func _init() -> void:
set_stylebox('panel', 'AcceptDialog', sb)
sb = sb.duplicate()
sb.bg_color = color_surface_lowest
sb.bg_color = _get_base_color(-1.4)
set_stylebox('panel', 'EditorSettingsDialog', sb)
set_stylebox('panel', 'ProjectSettingsEditor', sb)
set_stylebox('panel', 'ProjectExportDialog', sb)
@ -760,24 +697,24 @@ func _init() -> void:
# ProgressBar
sb = base_sb.duplicate()
sb.bg_color = color_surface_lowest
sb.bg_color = _get_base_color(-1.3, 0.9)
sb.expand_margin_top = base_margin * 0.5 * scale
sb.expand_margin_bottom = base_margin * 0.5 * scale
sb.set_content_margin_all(base_margin * scale)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('background', 'ProgressBar', sb)
sb = sb.duplicate()
sb.bg_color = color_button_normal
sb.bg_color = _get_base_color(0.4, 0.8)
if draw_extra_borders:
_set_border(sb, color_extra_border, 1)
_set_border(sb, extra_border_color_1, floorf(scale))
set_stylebox('fill', 'ProgressBar', sb)
# RichTextLabel
sb = base_sb.duplicate()
sb.bg_color = color_surface_low
sb.bg_color = _get_base_color(-0.5)
sb.set_content_margin_all(base_margin * 2 * scale)
set_stylebox('normal', 'RichTextLabel', sb)
@ -790,30 +727,29 @@ func _init() -> void:
sb = base_sb.duplicate()
sb.bg_color = _get_base_color(0.5, 0.6)
_set_border(sb, base_color * Color(1, 1, 1, 0), 3)
_set_border(sb, _get_base_color() * Color(1, 1, 1, 0), floorf(scale))
set_stylebox('grabber', 'HScrollBar', sb)
set_stylebox('grabber', 'VScrollBar', sb)
sb = base_sb.duplicate()
sb.bg_color = _get_base_color(1.4, 0.5)
_set_border(sb, base_color * Color(1, 1, 1, 0), 2.5)
set_stylebox('grabber_highlight', 'HScrollBar', sb)
set_stylebox('grabber_highlight', 'VScrollBar', sb)
set_stylebox('grabber_pressed', 'HScrollBar', sb)
set_stylebox('grabber_pressed', 'VScrollBar', sb)
var margin : int = 12 if increase_scrollbar_touch_area else 6
var margin : int = 10 if increase_scrollbar_touch_area else 3
empty_sb = base_empty_sb.duplicate()
_set_margin(empty_sb, 0, margin, 0, margin)
_set_margin(empty_sb, 0, margin * scale, 0, margin * scale)
set_stylebox('scroll', 'HScrollBar', empty_sb)
set_stylebox('scroll_focus', 'HScrollBar', empty_sb)
empty_sb = empty_sb.duplicate()
_set_margin(empty_sb, margin, 0, margin, 0)
_set_margin(empty_sb, margin * scale, 0, margin * scale, 0)
set_stylebox('scroll', 'VScrollBar', empty_sb)
set_stylebox('scroll_focus', 'VScrollBar', empty_sb)
@ -825,57 +761,34 @@ func _init() -> void:
# TabContainer
set_color('font_selected_color', 'TabBar', color_font_normal)
set_color('font_selected_color', 'TabContainer', color_font_normal)
set_color('font_hovered_color', 'TabBar', color_font_highlighted)
set_color('font_hovered_color', 'TabContainer', color_font_highlighted)
set_color('font_unselected_color', 'TabBar', color_font_secondary)
set_color('font_unselected_color', 'TabContainer', color_font_secondary)
set_color('font_disabled_color', 'TabBar', color_font_dimmed * Color(1, 1, 1, 0.55))
set_color('font_disabled_color', 'TabContainer', color_font_dimmed * Color(1, 1, 1, 0.55))
set_color('icon_selected_color', 'TabBar', color_font_normal)
set_color('icon_selected_color', 'TabContainer', color_font_normal)
set_color('icon_hovered_color', 'TabBar', color_font_highlighted)
set_color('icon_hovered_color', 'TabContainer', color_font_highlighted)
set_color('icon_unselected_color', 'TabBar', color_font_secondary)
set_color('icon_unselected_color', 'TabContainer', color_font_secondary)
set_color('icon_disabled_color', 'TabBar', color_font_dimmed * Color(1, 1, 1, 0.55))
set_color('icon_disabled_color', 'TabContainer', color_font_dimmed * Color(1, 1, 1, 0.55))
sb = base_sb.duplicate()
_set_margin(sb, base_margin * 4, base_margin * 2.1, base_margin * 4, base_margin * 2.1)
_set_margin(sb, base_margin * 4, base_margin * 2.3, base_margin * 4, base_margin * 2.3)
sb.set_corner_radius_all(0)
sb.corner_radius_top_left = int(corner_radius * scale)
sb.corner_radius_top_right = int(corner_radius * scale)
set_stylebox('tab_selected', 'TabBar', sb)
set_stylebox('tab_selected', 'TabContainer', sb)
set_stylebox('ThemeEditorPreviewFG', 'EditorStyles', sb)
sb = sb.duplicate()
sb.bg_color = color_surface_base
sb.bg_color = _get_base_color(-0.35)
set_stylebox('tab_selected', 'TabContainerOdd', sb)
set_stylebox('tab_focus', 'TabBar', base_empty_sb)
set_stylebox('tab_focus', 'TabContainer', base_empty_sb)
set_stylebox('tab_focus', 'TabContainerOdd', base_empty_sb)
sb = sb.duplicate()
sb.bg_color = base_color
sb.border_color = accent_color
set_stylebox('tab_focus', 'TabBar', sb)
set_stylebox('tab_focus', 'TabContainer', sb)
sb = sb.duplicate()
sb.bg_color = color_surface_lowest
sb.bg_color = Color.TRANSPARENT
sb.set_border_width_all(0)
set_stylebox('tab_unselected', 'TabBar', sb)
set_stylebox('tab_unselected', 'TabContainer', sb)
set_stylebox('tab_unselected', 'TabContainerOdd', sb)
set_stylebox('ThemeEditorPreviewBG', 'EditorStyles', sb)
set_stylebox('tab_disabled', 'TabBar', sb)
set_stylebox('tab_disabled', 'TabContainer', sb)
set_stylebox('tab_disabled', 'TabContainerOdd', sb)
sb = sb.duplicate()
sb.bg_color = color_surface_base * Color(1, 1, 1, 0.8)
sb.bg_color = _get_base_color(-0.4)
set_stylebox('tab_hovered', 'TabBar', sb)
set_stylebox('tab_hovered', 'TabContainer', sb)
set_stylebox('tab_hovered', 'TabContainerOdd', sb)
sb = base_sb.duplicate()
sb.set_content_margin_all(increased_margin * 1.5 * scale)
@ -884,24 +797,16 @@ func _init() -> void:
sb.corner_radius_bottom_left = int(corner_radius * scale)
set_stylebox('panel', 'TabContainer', sb)
sb = sb.duplicate()
sb.bg_color = color_surface_base
set_stylebox('panel', 'TabContainerOdd', sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_lowest
sb.corner_radius_bottom_left = 0
sb.corner_radius_bottom_right = 0
_set_margin(sb, 0, base_margin * 0.25, base_margin, 0)
sb = empty_sb.duplicate()
_set_margin(sb, 0, 0, base_margin * 2, 0)
set_stylebox('tabbar_background', 'TabContainer', sb)
set_stylebox('tabbar_background', 'TabContainerOdd', sb)
# Tree
set_color('drop_position_color', 'Tree', color_font_dimmed)
set_color('font_color', 'Tree', color_font_normal)
set_color('drop_position_color', 'Tree', mono_color * Color(1, 1, 1, 0.4))
set_color('font_color', 'Tree', mono_color_icon_and_font * Color(1, 1, 1, 0.7))
set_color('guide_color', 'Tree', Color.TRANSPARENT)
set_color('parent_hl_line_color', 'Tree', color_mono * Color(1, 1, 1, relationship_line_opacity))
set_color('parent_hl_line_color', 'Tree', mono_color * Color(1, 1, 1, relationship_line_opacity))
set_constant('children_hl_line_width', 'Tree', 0)
set_constant('draw_guides', 'Tree', 0)
set_constant('draw_relationship_lines', 'Tree', 1)
@ -918,7 +823,7 @@ func _init() -> void:
# doesn't work because EditorPropertyResource is using Tree panel
# stylebox to draw its background as well, making it look broken
empty_sb = base_empty_sb.duplicate()
_set_margin(empty_sb, base_margin * 1.5, base_margin * 2.5, base_margin * 1.5, base_margin * 2.5)
empty_sb.set_content_margin_all(base_margin * 2 * scale)
set_stylebox('panel', 'Tree', empty_sb)
# Leaving focus empty for trees and scroll containers because there's no way to
@ -926,7 +831,7 @@ func _init() -> void:
set_stylebox('focus', 'Tree', base_empty_sb)
sb = base_sb.duplicate()
sb.bg_color = color_surface_lowest
sb.bg_color = _get_base_color(-1.2 if dark_theme else -1.8)
# Using a transparent border to separate rounded column titles
sb.border_width_left = int(ceilf(scale))
@ -939,7 +844,7 @@ func _init() -> void:
sb = flat_button_hover_sb.duplicate()
sb.set_content_margin_all(0)
sb.bg_color = color_button_disabled
sb.bg_color = _get_base_color(0.2, 0.7)
set_stylebox('button_hover', 'Tree', sb)
set_stylebox('hover', 'Tree', sb)
set_stylebox('hovered_dimmed', 'Tree', sb)
@ -949,25 +854,23 @@ func _init() -> void:
set_stylebox('selected_focus', 'Tree', sb)
sb = sb.duplicate()
sb.bg_color = color_button_normal
sb.bg_color = _get_base_color(0.3, 0.7)
set_stylebox('hovered_selected', 'Tree', sb)
set_stylebox('hovered_selected_focus', 'Tree', sb)
sb = flat_button_pressed_sb.duplicate()
_set_margin(sb, base_margin, 0, base_margin, 0)
set_stylebox('button_pressed', 'Tree', sb)
set_stylebox('custom_button_pressed', 'Tree', sb)
set_stylebox('button_pressed', 'Tree', flat_button_pressed_sb)
set_stylebox('custom_button_pressed', 'Tree', flat_button_pressed_sb)
# Cursor is drawn on top of the item so it needs to be transparent
sb = base_sb.duplicate()
sb.bg_color = color_mono * Color(1, 1, 1, 0.04)
sb.bg_color = mono_color * Color(1, 1, 1, 0.04)
set_stylebox('cursor', 'Tree', sb)
set_stylebox('cursor_unfocused', 'Tree', sb)
# Separators
line_sb = StyleBoxLine.new()
line_sb.color = Color(0, 0, 0, 0.4) if dark_theme else Color(0, 0, 0, 0.2)
line_sb.color = _get_base_color(-1.2, 0.6)
line_sb.grow_begin = base_margin * -1 * scale
line_sb.grow_end = base_margin * -1 * scale
line_sb.thickness = int(ceilf(scale * 2))
@ -980,22 +883,12 @@ func _init() -> void:
line_sb.vertical = true
set_stylebox('separator', 'VSeparator', line_sb)
# Sliders
sb = base_sb.duplicate()
sb.bg_color = color_mono_inv * Color(1, 1, 1, 0.35)
_set_margin(sb, 0, 2, 0, 2)
set_stylebox('slider', 'HSlider', sb)
sb = sb.duplicate()
_set_margin(sb, 2, 0, 2, 0)
set_stylebox('slider', 'VSlider', sb)
# Sidebars
sb = base_sb.duplicate()
sb.bg_color = color_surface_low
sb.bg_color = _get_base_color(-0.55 if dark_theme else -0.9)
if draw_extra_borders:
_set_border(sb, color_extra_border_dimmed, 1)
_set_border(sb, extra_border_color_2, floorf(scale))
set_stylebox('panel', 'TreeSecondary', sb)
set_stylebox('panel', 'ItemListSecondary', sb)
# Use sidebar stylebox for EditorDebuggerInspector in StackTrace
@ -1006,16 +899,9 @@ func _init() -> void:
# ProjectManager
sb = base_sb.duplicate()
sb.bg_color = color_surface_low
sb.bg_color = _get_base_color(-0.7 if dark_theme else -0.9)
set_stylebox('project_list', 'ProjectManager', sb)
# Asset Library
sb = base_sb.duplicate()
sb.set_content_margin_all(base_margin * 2 * scale)
sb.bg_color = color_surface_low
set_stylebox('panel', 'AssetLib', sb)
# HACKS
# This section is for workarounds for unthemable UI
# These could be fixed on the engine side in the future
@ -1030,19 +916,19 @@ func _init() -> void:
# QuickSettingsDialog is using EditorStyles Background stylebox
# by default which is way too dark for this theme
var scene_tree : SceneTree = Engine.get_main_loop()
var root : Window = scene_tree.root
var root : Window = Engine.get_main_loop().root
var quick_settings_dialog : AcceptDialog = root.find_children('', 'QuickSettingsDialog', true, false)[0]
var quick_settings_dialog_list_panel : PanelContainer = quick_settings_dialog.find_children('', 'PanelContainer', true, false)[0]
var panel_sb_quick_settings : StyleBoxFlat = base_sb.duplicate()
panel_sb_quick_settings.bg_color = color_surface_low
quick_settings_dialog_list_panel.add_theme_stylebox_override('panel', panel_sb_quick_settings)
var _error_quick_settings : int = quick_settings_dialog.theme_changed.connect(func() -> void:
var panel_sb : StyleBoxFlat = base_sb.duplicate()
panel_sb.bg_color = _get_base_color(-0.7 if dark_theme else -0.9)
quick_settings_dialog_list_panel.add_theme_stylebox_override('panel', panel_sb)
var _error : int = quick_settings_dialog.theme_changed.connect(func() -> void:
# Reapply the stylebox override on theme change
quick_settings_dialog_list_panel.add_theme_stylebox_override('panel', panel_sb_quick_settings)
quick_settings_dialog_list_panel.add_theme_stylebox_override('panel', panel_sb)
)
# All fixes below are for the main editor window
if EditorInterface.get_script_editor() == null:
return
# TilesetEditor
@ -1054,11 +940,11 @@ func _init() -> void:
var tileset_editor : Control = EditorInterface.get_base_control().find_children('', 'TileSetEditor', true, false)[0]
var expand_panel : Control = tileset_editor.get_child(3)
var panel_sb_expand_panel : StyleBoxFlat = base_sb.duplicate()
panel_sb_expand_panel.set_corner_radius_all(0)
expand_panel.add_theme_stylebox_override('panel', panel_sb_expand_panel)
var _error_tileset_editor : int = tileset_editor.theme_changed.connect(func() -> void:
expand_panel.add_theme_stylebox_override('panel', panel_sb_expand_panel)
var panel_sb : StyleBoxFlat = base_sb.duplicate()
panel_sb.set_corner_radius_all(0)
expand_panel.add_theme_stylebox_override('panel', panel_sb)
var _error : int = tileset_editor.theme_changed.connect(func() -> void:
expand_panel.add_theme_stylebox_override('panel', panel_sb)
)
# EditorObjectSelector
@ -1084,12 +970,29 @@ func _init() -> void:
node_3d_editor_toolbar_margin_container.add_theme_constant_override('margin_top', int(base_margin * 0.5 * scale))
node_3d_editor_toolbar_margin_container.add_theme_constant_override('margin_bottom', int(base_margin * 0.5 * scale))
# GameView is not enabled in the Android editor as the Game workspace is implemented differently
if Engine.get_version_info().hex >= 0x040400 and not OS.has_feature('android'):
if Engine.get_version_info().hex >= 0x040400:
var game_view : Control = EditorInterface.get_base_control().find_children('', 'GameView', true, false)[0]
var game_view_toolbar_margin_container : Control = game_view.find_children('', 'MarginContainer', true, false)[0]
game_view_toolbar_margin_container.add_theme_constant_override('margin_top', int(base_margin * 0.5 * scale))
game_view_toolbar_margin_container.add_theme_constant_override('margin_bottom', int(base_margin * 0.5 * scale))
# ThemeTypeEditor TabContainer
# Tabs of ThemeTypeEditor need to be custom because of lighter background of
# the bottom panel
var theme_type_editor : Control = EditorInterface.get_base_control().find_children('', 'ThemeTypeEditor', true, false)[0]
var theme_type_editor_tab_container : TabContainer = theme_type_editor.find_children('', 'TabContainer', true, false)[0]
var theme_type_editor_tab_container_sb : StyleBoxFlat = base_sb.duplicate()
theme_type_editor_tab_container_sb.bg_color = _get_base_color(-1.1)
theme_type_editor_tab_container_sb.set_content_margin_all(0)
theme_type_editor_tab_container_sb.content_margin_top = int(base_margin * scale)
theme_type_editor_tab_container_sb.corner_radius_bottom_left = 0
theme_type_editor_tab_container_sb.corner_radius_bottom_right = 0
theme_type_editor_tab_container.add_theme_stylebox_override('tabbar_background', theme_type_editor_tab_container_sb)
).call_deferred()
# Lighten base color in dark theme, darken in light theme, clamp