[gd_resource type="Theme" load_steps=2 format=3 uid="uid://bcibt73qths3g"] [sub_resource type="GDScript" id="GDScript_hhmc0"] script/source = "@tool extends Theme var base_color : Color var contrast : float var scale : float var dark_theme : bool func _init() -> void: # Editor Settings var settings : EditorSettings = EditorInterface.get_editor_settings() @warning_ignore('unsafe_cast') base_color = settings.get_setting('interface/theme/base_color') @warning_ignore('unsafe_cast') contrast = settings.get_setting('interface/theme/contrast') scale = EditorInterface.get_editor_scale() @warning_ignore('unsafe_cast') var accent_color : Color = settings.get_setting('interface/theme/accent_color') @warning_ignore('unsafe_cast') var base_spacing : int = settings.get_setting('interface/theme/base_spacing') @warning_ignore('unsafe_cast') var extra_spacing : int = settings.get_setting('interface/theme/additional_spacing') @warning_ignore('unsafe_cast') var corner_radius : int = settings.get_setting('interface/theme/corner_radius') @warning_ignore('unsafe_cast') var icon_and_font_color : int = settings.get_setting('interface/theme/icon_and_font_color') @warning_ignore('unsafe_cast') var relationship_line_opacity : float = settings.get_setting('interface/theme/relationship_line_opacity') @warning_ignore('unsafe_cast') var draw_extra_borders : bool = settings.get_setting('interface/theme/draw_extra_borders') var increase_scrollbar_touch_area : bool if Engine.get_version_info().hex >= 0x040500: @warning_ignore('unsafe_cast') increase_scrollbar_touch_area = settings.get_setting('interface/touchscreen/enable_touch_optimizations') else: @warning_ignore('unsafe_cast') increase_scrollbar_touch_area = settings.get_setting('interface/touchscreen/increase_scrollbar_touch_area') # Globals base_spacing = maxi(base_spacing, 2) # Base spacing below 2 looks broken var base_margin : float = base_spacing 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_icon_and_font : Color = Color.WHITE if dark_theme_icon_and_font else Color.BLACK # 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 and icon colors var color_font_and_icon_normal : Color = color_mono_icon_and_font * Color(1, 1, 1, 0.7) var color_font_and_icon_secondary : Color = color_mono_icon_and_font * Color(1, 1, 1, 0.45) var color_font_and_icon_highlighted : Color = color_mono_icon_and_font var color_font_and_icon_dimmed : Color = color_mono_icon_and_font * 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 base_sb.set_content_margin_all(base_margin * scale) base_sb.set_corner_radius_all(int(corner_radius * scale)) # Focus var focus_sb : StyleBoxFlat = base_sb.duplicate() focus_sb.draw_center = false _set_border(focus_sb, accent_color * Color(1, 1, 1, 0.8), 2) # Non-transparent buttons will potentially blend worse with background # 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.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) else: _set_border(button_sb, color_button_border, 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 if draw_extra_borders: _set_border(button_hover_sb, color_extra_border, 1) else: _set_border(button_hover_sb, color_button_border_hover, 1) var button_pressed_sb : StyleBoxFlat = button_sb.duplicate() button_pressed_sb.bg_color = color_button_pressed if draw_extra_borders: _set_border(button_pressed_sb, color_extra_border, 1) else: _set_border(button_pressed_sb, color_button_border_pressed, 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 if draw_extra_borders: _set_border(button_disabled_sb, color_extra_border_dimmed * Color(1, 1, 1, 0.5), 1) 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 if draw_extra_borders: _set_border(flat_button_hover_sb, color_extra_border, 1) 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 var base_empty_sb : StyleBoxFlat = base_sb.duplicate() base_empty_sb.draw_center = false base_empty_sb.set_content_margin_all(0) var base_empty_wide_sb : StyleBoxFlat = base_sb.duplicate() base_empty_wide_sb.draw_center = false # Ensure minimum margin for wide flat buttons otherwise the topbar looks broken var base_empty_wide_margin : float = maxf(base_margin, 3.0) _set_margin(base_empty_wide_sb, base_empty_wide_margin * 1.5, base_empty_wide_margin, base_empty_wide_margin * 1.5, base_empty_wide_margin) # Animation editor set_color('focus_color', 'AnimationBezierTrackEdit', accent_color * Color(1, 1, 1, 0.8)) 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('v_line_color', 'AnimationBezierTrackEdit', Color.TRANSPARENT) set_color('font_primary_color', 'AnimationTimelineEdit', color_font_and_icon_normal) set_color('font_secondary_color', 'AnimationTimelineEdit', color_font_and_icon_dimmed) 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_constant('text_primary_margin', 'AnimationTimelineEdit', int(base_margin * 0.75 * scale)) set_constant('text_secondary_margin', 'AnimationTimelineEdit', int(base_margin * 0.5 * scale)) set_constant('v_line_primary_margin', 'AnimationTimelineEdit', int(base_margin * scale)) set_constant('v_line_primary_width', 'AnimationTimelineEdit', int(ceilf(2 * scale))) set_constant('v_line_secondary_margin', 'AnimationTimelineEdit', int(base_margin * 1.5 * scale)) set_constant('v_line_secondary_width', 'AnimationTimelineEdit', int(ceilf(scale))) var sb : StyleBoxFlat = base_sb.duplicate() sb.bg_color = color_surface_highest if draw_extra_borders: _set_border(sb, color_extra_border, 1) set_stylebox('time_available', 'AnimationTimelineEdit', sb) sb = base_sb.duplicate() sb.bg_color = color_surface_high set_stylebox('time_unavailable', 'AnimationTimelineEdit', sb) set_color('h_line_color', 'AnimationTrackEdit', Color.TRANSPARENT) set_constant('h_separation', 'AnimationTrackEdit', int(base_margin * 1.5 * scale)) sb = base_sb.duplicate() sb.draw_center = false _set_border(sb, color_surface_high, 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 set_stylebox('hover', 'AnimationTrackEdit', sb) sb = base_sb.duplicate() sb.bg_color = color_surface_base set_stylebox('odd', 'AnimationTrackEdit', sb) set_color('bg_color', 'AnimationTrackEditGroup', color_surface_base) 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 _set_margin(sb, base_margin * 4, base_margin, 0, base_margin) set_stylebox('header', 'AnimationTrackEditGroup', sb) # Bottom panel # Use bigger margin for buttons in bottom panel to make them easier to press var empty_sb : StyleBoxFlat = base_empty_sb.duplicate() _set_margin(empty_sb, base_margin * 2, base_margin * 1.2, base_margin * 2, base_margin * 1.2) set_stylebox('normal', 'BottomPanelButton', base_empty_wide_sb) sb = flat_button_hover_sb.duplicate() _set_margin(sb, base_margin * 2, base_margin * 1.2, base_margin * 2, base_margin * 1.2) set_stylebox('hover', 'BottomPanelButton', sb) set_stylebox('pressed', 'BottomPanelButton', sb) sb = flat_button_pressed_sb.duplicate() _set_margin(sb, base_margin * 2, base_margin * 1.2, base_margin * 2, base_margin * 1.2) set_stylebox('hover_pressed', 'BottomPanelButton', sb) # Audio Bus sb = base_sb.duplicate() sb.bg_color = color_surface_high set_stylebox('normal', 'EditorAudioBus', sb) set_stylebox('focus', 'EditorAudioBus', focus_sb) sb = base_sb.duplicate() sb.bg_color = color_surface_higher set_stylebox('master', 'EditorAudioBus', sb) # Button set_color('font_color', 'Button', color_font_and_icon_normal) set_color('font_disabled_color', 'Button', color_font_and_icon_dimmed) set_color('font_focus_color', 'Button', color_font_and_icon_highlighted) set_color('font_hover_color', 'Button', color_font_and_icon_highlighted) set_color('font_hover_pressed_color', 'Button', color_font_and_icon_highlighted) set_color('font_pressed_color', 'Button', color_font_and_icon_highlighted) set_color('icon_disabled_color', 'Button', color_font_and_icon_dimmed) set_color('icon_normal_color', 'Button', color_font_and_icon_normal) set_color('icon_pressed_color', 'Button', accent_color) set_color('icon_hover_pressed_color', 'Button', accent_color) set_constant('outline_size', 'Button', 0) set_stylebox('disabled', 'Button', button_disabled_sb) set_stylebox('disabled_mirrored', 'Button', button_disabled_sb) set_stylebox('focus', 'Button', focus_sb) set_stylebox('hover', 'Button', button_hover_sb) set_stylebox('hover_mirrored', 'Button', button_hover_sb) set_stylebox('hover_pressed', 'Button', button_pressed_sb) set_stylebox('hover_pressed_mirrored', 'Button', button_pressed_sb) set_stylebox('normal', 'Button', button_sb) set_stylebox('normal_mirrored', 'Button', button_sb) set_stylebox('pressed', 'Button', button_pressed_sb) set_stylebox('pressed_mirrored', 'Button', button_pressed_sb) # Checkbox set_color('font_hover_pressed_color', 'CheckBox', color_font_and_icon_highlighted) set_color('font_pressed_color', 'CheckBox', color_font_and_icon_normal) sb = base_sb.duplicate() sb.draw_center = false _set_margin(sb, base_margin * 1.5, base_margin * 0.5, base_margin * 1.5, base_margin * 0.5) set_stylebox('normal', 'CheckBox', sb) set_stylebox('normal_mirrored', 'CheckBox', sb) # CheckButton set_color('font_focus_color', 'CheckButton', color_font_and_icon_normal) set_color('font_hover_pressed_color', 'CheckButton', color_font_and_icon_highlighted) set_color('font_pressed_color', 'CheckButton', color_font_and_icon_normal) # 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)) # Ruler in 2D view: set_color('dark_color_2', 'Editor', color_mono_inv * Color(1, 1, 1, 0.3)) # Shortcut tree cell background: set_color('dark_color_3', 'Editor', color_surface_lower) 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_and_icon_normal) 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')) set_color('warning_color', 'Editor', Color('#D4C79F') if dark_theme_icon_and_font else Color('#D47D03')) set_color('prop_subsection', 'Editor', Color.TRANSPARENT) set_constant('top_bar_separation', 'Editor', int(base_margin * scale)) set_constant('window_border_margin', 'Editor', int(base_margin * scale)) # EditorHelpBit sb = base_sb.duplicate() sb.bg_color = _get_base_color(-0.3 if dark_theme else -0.7) _set_margin(sb, base_margin * 2, base_margin, base_margin * 2, base_margin) sb.set_corner_radius_all(0) 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_stylebox('normal', 'EditorHelpBitContent', sb) sb = base_sb.duplicate() sb.bg_color = color_surface_low _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_stylebox('normal', 'EditorHelpBitTitle', sb) # EditorInspector empty_sb = base_empty_sb.duplicate() empty_sb.set_content_margin_all(base_margin * 2 * scale) 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 _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_stylebox('bg', 'EditorInspectorCategory', sb) set_constant('h_separation', 'EditorInspectorSection', int(base_margin * scale)) # EditorLogFilterButton # Hover and pressed styles are swapped for toggle buttons on purpose set_stylebox('hover', 'EditorLogFilterButton', flat_button_pressed_sb) set_stylebox('pressed', 'EditorLogFilterButton', flat_button_hover_sb) set_stylebox('normal', 'EditorLogFilterButton', base_empty_sb) # EditorProperty set_color('property_color', 'EditorProperty', color_font_and_icon_normal) set_color('warning_color', 'EditorProperty', get_color('warning_color', 'Editor')) set_stylebox('bg', 'EditorProperty', base_empty_sb) # Having visible indication of selected property doesn't bring # any value to the regular inspector, however connection # 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) set_stylebox('bg_selected', 'EditorProperty', sb) sb = base_sb.duplicate() sb.bg_color = color_surface_lower 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.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_stylebox('FocusViewport', 'EditorStyles', sb) sb = base_sb.duplicate() sb.bg_color = Color(0, 0, 0, 0.3) if dark_theme else Color(1, 1, 1, 0.3) _set_margin(sb, base_margin * 2, base_margin * 1.5, base_margin * 2, base_margin * 1.5) set_stylebox('Information3dViewport', 'EditorStyles', sb) # Contextual Toolbar sb = base_sb.duplicate() sb.bg_color = color_surface_higher 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) set_stylebox('LaunchPadMovieMode', 'EditorStyles', sb) sb = sb.duplicate() sb.draw_center = false sb.border_color = Color.TRANSPARENT set_stylebox('LaunchPadNormal', 'EditorStyles', sb) sb = base_sb.duplicate() sb.bg_color = accent_color * Color(1, 1, 1, 0.8) 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_and_icon_normal) set_color('icon_pressed_color', 'RunBarButtonMovieMakerDisabled', color_font_and_icon_highlighted) set_color('icon_hover_color', 'RunBarButtonMovieMakerDisabled', color_font_and_icon_highlighted) set_color('icon_hover_pressed_color', 'RunBarButtonMovieMakerDisabled', color_font_and_icon_highlighted) set_color('icon_normal_color', 'RunBarButtonMovieMakerEnabled', color_font_and_icon_normal) set_color('icon_pressed_color', 'RunBarButtonMovieMakerEnabled', color_font_and_icon_highlighted) set_color('icon_hover_color', 'RunBarButtonMovieMakerEnabled', color_font_and_icon_highlighted) set_color('icon_hover_pressed_color', 'RunBarButtonMovieMakerEnabled', color_font_and_icon_highlighted) # Godot 4.4 and earlier: set_color('movie_writer_icon_hover', 'EditorStyles', Color(1, 1, 1, 0.8)) set_color('movie_writer_icon_hover_pressed', 'EditorStyles', Color(1, 1, 1, 0.8)) set_color('movie_writer_icon_normal', 'EditorStyles', Color(1, 1, 1, 0.7)) set_color('movie_writer_icon_pressed', 'EditorStyles', Color(1, 1, 1, 0.941176)) # EditorValidationPanel sb = base_sb.duplicate() sb.bg_color = color_surface_low _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_and_icon_normal) set_color('font_disabled_color', 'FlatButton', color_font_and_icon_dimmed) set_color('font_focus_color', 'FlatButton', color_font_and_icon_highlighted) set_color('font_hover_color', 'FlatButton', color_font_and_icon_highlighted) set_color('font_hover_pressed_color', 'FlatButton', color_font_and_icon_highlighted) set_color('font_pressed_color', 'FlatButton', color_font_and_icon_highlighted) set_color('icon_disabled_color', 'FlatButton', color_font_and_icon_dimmed) set_color('icon_normal_color', 'FlatButton', color_font_and_icon_normal) set_stylebox('disabled', 'FlatButton', base_empty_wide_sb) set_stylebox('disabled_mirrored', 'FlatButton', base_empty_wide_sb) set_stylebox('normal', 'FlatButton', base_empty_wide_sb) set_stylebox('normal_mirrored', 'FlatButton', base_empty_wide_sb) set_stylebox('hover', 'FlatButton', flat_button_hover_sb) set_stylebox('hover_mirrored', 'FlatButton', flat_button_hover_sb) set_stylebox('hover_pressed', 'FlatButton', flat_button_pressed_sb) set_stylebox('hover_pressed_mirrored', 'FlatButton', flat_button_pressed_sb) set_stylebox('pressed', 'FlatButton', flat_button_pressed_sb) set_stylebox('pressed_mirrored', 'FlatButton', flat_button_pressed_sb) # FlatMenuButton set_color('font_color', 'FlatMenuButton', color_font_and_icon_normal) set_color('font_disabled_color', 'FlatMenuButton', color_font_and_icon_dimmed) set_color('font_focus_color', 'FlatMenuButton', color_font_and_icon_highlighted) set_color('font_hover_color', 'FlatMenuButton', color_font_and_icon_highlighted) set_color('font_hover_pressed_color', 'FlatMenuButton', color_font_and_icon_highlighted) set_color('font_pressed_color', 'FlatMenuButton', color_font_and_icon_highlighted) set_color('icon_normal_color', 'FlatMenuButton', color_font_and_icon_normal) set_color('icon_disabled_color', 'FlatMenuButton', color_font_and_icon_dimmed) set_color('icon_focus_color', 'FlatMenuButton', color_font_and_icon_highlighted) set_color('icon_hover_color', 'FlatMenuButton', color_font_and_icon_highlighted) set_stylebox('disabled', 'FlatMenuButton', base_empty_wide_sb) set_stylebox('disabled_mirrored', 'FlatMenuButton', base_empty_wide_sb) set_stylebox('focus', 'FlatMenuButton', focus_sb) set_stylebox('normal', 'FlatMenuButton', base_empty_wide_sb) set_stylebox('normal_mirrored', 'FlatMenuButton', base_empty_wide_sb) set_stylebox('hover', 'FlatMenuButton', flat_button_hover_sb) set_stylebox('hover_mirrored', 'FlatMenuButton', flat_button_hover_sb) set_stylebox('hover_pressed', 'FlatMenuButton', flat_button_pressed_sb) set_stylebox('hover_pressed_mirrored', 'FlatMenuButton', flat_button_pressed_sb) set_stylebox('pressed', 'FlatMenuButton', flat_button_pressed_sb) set_stylebox('pressed_mirrored', 'FlatMenuButton', flat_button_pressed_sb) # ColorPicker sb = base_sb.duplicate() sb.draw_center = false _set_border(sb, color_mono * Color(1, 1, 1, 0.3), 1) set_stylebox('sample_focus', 'ColorPicker', sb) set_stylebox('picker_focus_rectangle', 'ColorPicker', sb) sb = sb.duplicate() sb.set_corner_radius_all(int(256 * scale)) sb.set_corner_detail(int(32 * scale)) set_stylebox('picker_focus_circle', 'ColorPicker', sb) # GraphEdit sb = base_sb.duplicate() sb.draw_center = false _set_border(sb, color_mono * Color(1, 1, 1, 0.07), 2) set_stylebox('panel_focus', 'GraphEdit', sb) # GraphStateMachine set_color('focus_color', 'GraphStateMachine', accent_color * Color(1, 1, 1, 0.8)) # Box Containers set_constant('separation', 'HBoxContainer', int(2 * scale)) set_constant('separation', 'VBoxContainer', int(2 * scale)) # Split Containers set_constant('autohide', 'HSplitContainer', 1) set_constant('minimum_grab_thickness', 'HSplitContainer', int(base_margin * 1.5 * scale)) set_constant('separation', 'HSplitContainer', int(ceilf(2 * scale))) set_constant('autohide', 'VSplitContainer', 1) set_constant('minimum_grab_thickness', 'VSplitContainer', int(base_margin * 1.5 * scale)) set_constant('separation', 'VSplitContainer', int(ceilf(2 * scale))) # InspectorActionButton set_constant('h_separation', 'InspectorActionButton', int(base_margin * 2 * scale)) set_stylebox('disabled', 'InspectorActionButton', button_disabled_sb) set_stylebox('disabled_mirrored', 'InspectorActionButton', button_disabled_sb) set_stylebox('normal', 'InspectorActionButton', button_sb) set_stylebox('normal_mirrored', 'InspectorActionButton', button_sb) set_stylebox('hover', 'InspectorActionButton', button_hover_sb) set_stylebox('hover_mirrored', 'InspectorActionButton', button_hover_sb) set_stylebox('pressed', 'InspectorActionButton', button_pressed_sb) set_stylebox('pressed_mirrored', 'InspectorActionButton', button_pressed_sb) # ItemList set_color('guide_color', 'ItemList', Color.TRANSPARENT) 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) set_stylebox('cursor', 'ItemList', sb) set_stylebox('cursor_unfocused', 'ItemList', sb) set_stylebox('focus', 'ItemList', focus_sb) set_stylebox('hovered', 'ItemList', flat_button_hover_sb) set_stylebox('selected', 'ItemList', flat_button_hover_sb) set_stylebox('selected_focus', 'ItemList', focus_sb) set_stylebox('hovered_selected', 'ItemList', flat_button_hover_sb) set_stylebox('hovered_selected_focus', 'ItemList', focus_sb) sb = base_sb.duplicate() sb.set_content_margin_all(base_margin * 2 * scale) set_stylebox('panel', 'ItemList', sb) # Label set_color('font_color', 'Label', color_font_and_icon_normal) empty_sb = base_empty_sb.duplicate() # Keeping vertical margin low otherwise quick open looks bad _set_margin(empty_sb, base_margin * 2, base_margin, base_margin * 2, base_margin) set_stylebox('normal', 'Label', empty_sb) # LineEdit and TextEdit set_color('font_placeholder_color', 'LineEdit', color_font_and_icon_dimmed) sb = base_sb.duplicate() sb.bg_color = color_surface_lowest if draw_extra_borders: _set_border(sb, color_extra_border, 1) _set_margin(sb, base_margin * 2, base_margin * 0.75, base_margin * 2, base_margin * 0.75) set_stylebox('focus', 'LineEdit', focus_sb) set_stylebox('focus', 'TextEdit', focus_sb) sb = sb.duplicate() sb.bg_color = color_surface_lower 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) set_stylebox('read_only', 'LineEdit', sb) set_stylebox('read_only', 'TextEdit', sb) # MainMenuBar set_stylebox('normal', 'MainMenuBar', flat_button_normal_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) # MainScreenButton set_stylebox('normal', 'MainScreenButton', base_empty_wide_sb) set_stylebox('normal_mirrored', 'MainScreenButton', base_empty_wide_sb) set_stylebox('hover', 'MainScreenButton', base_empty_wide_sb) set_stylebox('hover_mirrored', 'MainScreenButton', base_empty_wide_sb) set_stylebox('hover_pressed', 'MainScreenButton', base_empty_wide_sb) set_stylebox('hover_pressed_mirrored', 'MainScreenButton', base_empty_wide_sb) set_stylebox('pressed', 'MainScreenButton', base_empty_wide_sb) set_stylebox('pressed_mirrored', 'MainScreenButton', base_empty_wide_sb) # MenuButton set_color('font_color', 'MenuButton', color_font_and_icon_normal) set_color('font_disabled_color', 'MenuButton', color_font_and_icon_dimmed) set_color('font_focus_color', 'MenuButton', color_font_and_icon_highlighted) set_color('font_hover_color', 'MenuButton', color_font_and_icon_highlighted) set_color('font_hover_pressed_color', 'MenuButton', color_font_and_icon_highlighted) set_color('font_pressed_color', 'MenuButton', color_font_and_icon_highlighted) set_color('icon_normal_color', 'MenuButton', color_font_and_icon_normal) set_color('icon_disabled_color', 'MenuButton', color_font_and_icon_dimmed) set_color('icon_focus_color', 'MenuButton', color_font_and_icon_highlighted) set_color('icon_hover_color', 'MenuButton', color_font_and_icon_highlighted) set_stylebox('disabled', 'MenuButton', base_empty_wide_sb) set_stylebox('disabled_mirrored', 'MenuButton', base_empty_wide_sb) set_stylebox('focus', 'MenuButton', focus_sb) set_stylebox('normal', 'MenuButton', base_empty_wide_sb) set_stylebox('normal_mirrored', 'MenuButton', base_empty_wide_sb) set_stylebox('pressed', 'MenuButton', flat_button_pressed_sb) set_stylebox('pressed_mirrored', 'MenuButton', flat_button_pressed_sb) set_stylebox('hover', 'MenuButton', flat_button_hover_sb) set_stylebox('hover_mirrored', 'MenuButton', flat_button_hover_sb) set_stylebox('hover_pressed', 'MenuButton', flat_button_hover_sb) set_stylebox('hover_pressed_mirrored', 'MenuButton', flat_button_hover_sb) # OptionButton set_constant('arrow_margin', 'OptionButton', int(base_margin * 2 * scale)) set_color('font_color', 'OptionButton', color_font_and_icon_normal) set_color('font_disabled_color', 'OptionButton', color_font_and_icon_dimmed) set_color('font_focus_color', 'OptionButton', color_font_and_icon_highlighted) set_color('font_hover_color', 'OptionButton', color_font_and_icon_highlighted) set_color('font_hover_pressed_color', 'OptionButton', color_font_and_icon_highlighted) set_color('font_pressed_color', 'OptionButton', color_font_and_icon_highlighted) set_color('icon_disabled_color', 'OptionButton', color_font_and_icon_dimmed) set_color('icon_normal_color', 'OptionButton', color_font_and_icon_normal) set_stylebox('disabled', 'OptionButton', button_disabled_sb) set_stylebox('disabled_mirrored', 'OptionButton', button_disabled_sb) set_stylebox('focus', 'OptionButton', focus_sb) set_stylebox('normal', 'OptionButton', button_sb) set_stylebox('normal_mirrored', 'OptionButton', button_sb) set_stylebox('pressed', 'OptionButton', button_pressed_sb) set_stylebox('pressed_mirrored', 'OptionButton', button_pressed_sb) set_stylebox('hover', 'OptionButton', button_hover_sb) set_stylebox('hover_mirrored', 'OptionButton', button_hover_sb) set_stylebox('hover_pressed', 'OptionButton', button_pressed_sb) set_stylebox('hover_pressed_mirrored', 'OptionButton', button_pressed_sb) # Popups set_constant('item_start_padding', 'PopupMenu', int(popup_margin * scale)) set_constant('v_separation', 'PopupMenu', int(base_margin * 1.75 * scale)) set_constant('h_separation', 'PopupMenu', int(base_margin * 1.75 * scale)) set_stylebox('hover', 'PopupMenu', flat_button_hover_sb) sb = base_sb.duplicate() sb.bg_color = color_surface_lower 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_stylebox('panel', 'PopupMenu', sb) var line_sb : StyleBoxLine = StyleBoxLine.new() line_sb.color = Color(0, 0, 0, 0.2 if dark_theme else 0.1) 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) set_stylebox('separator', 'PopupMenu', line_sb) set_stylebox('panel', 'PanelContainer', base_empty_wide_sb) sb = base_sb.duplicate() sb.bg_color = color_surface_lower 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_stylebox('panel', 'PopupPanel', sb) sb = base_sb.duplicate() sb.bg_color = color_surface_lower 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_stylebox('panel', 'TooltipPanel', sb) sb = base_sb.duplicate() sb.set_content_margin_all(int(popup_margin * scale)) sb.set_corner_radius_all(0) set_stylebox('panel', 'PopupDialog', sb) set_stylebox('panel', 'AcceptDialog', sb) sb = sb.duplicate() sb.bg_color = color_surface_lowest set_stylebox('panel', 'EditorSettingsDialog', sb) set_stylebox('panel', 'ProjectSettingsEditor', sb) set_stylebox('panel', 'ProjectExportDialog', sb) set_stylebox('panel', 'SceneImportSettingsDialog', sb) set_stylebox('panel', 'EditorAbout', sb) set_stylebox('panel', 'ThemeItemEditorDialog', sb) # ProgressBar sb = base_sb.duplicate() sb.bg_color = color_surface_lowest 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_stylebox('background', 'ProgressBar', sb) sb = sb.duplicate() sb.bg_color = color_button_normal if draw_extra_borders: _set_border(sb, color_extra_border, 1) set_stylebox('fill', 'ProgressBar', sb) # RichTextLabel sb = base_sb.duplicate() sb.bg_color = color_surface_low sb.set_content_margin_all(base_margin * 2 * scale) set_stylebox('normal', 'RichTextLabel', sb) # ScrollContainer set_stylebox('panel', 'ScrollContainer', base_empty_sb) set_stylebox('focus', 'ScrollContainer', focus_sb) # ScrollBar 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_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 empty_sb = base_empty_sb.duplicate() _set_margin(empty_sb, 0, margin, 0, margin) set_stylebox('scroll', 'HScrollBar', empty_sb) set_stylebox('scroll_focus', 'HScrollBar', focus_sb) empty_sb = empty_sb.duplicate() _set_margin(empty_sb, margin, 0, margin, 0) set_stylebox('scroll', 'VScrollBar', empty_sb) set_stylebox('scroll_focus', 'VScrollBar', focus_sb) # SplitContainer set_constant('minimum_grab_thickness', 'SplitContainer', int(base_margin * 2.0 * scale)) set_constant('separation', 'SplitContainer', int(base_margin * 0.75 * scale)) # TabContainer set_color('font_selected_color', 'TabBar', color_font_and_icon_normal) set_color('font_selected_color', 'TabContainer', color_font_and_icon_normal) set_color('font_hovered_color', 'TabBar', color_font_and_icon_highlighted) set_color('font_hovered_color', 'TabContainer', color_font_and_icon_highlighted) set_color('font_unselected_color', 'TabBar', color_font_and_icon_secondary) set_color('font_unselected_color', 'TabContainer', color_font_and_icon_secondary) set_color('font_disabled_color', 'TabBar', color_font_and_icon_dimmed * Color(1, 1, 1, 0.55)) set_color('font_disabled_color', 'TabContainer', color_font_and_icon_dimmed * Color(1, 1, 1, 0.55)) set_color('icon_selected_color', 'TabBar', color_font_and_icon_normal) set_color('icon_selected_color', 'TabContainer', color_font_and_icon_normal) set_color('icon_hovered_color', 'TabBar', color_font_and_icon_highlighted) set_color('icon_hovered_color', 'TabContainer', color_font_and_icon_highlighted) set_color('icon_unselected_color', 'TabBar', color_font_and_icon_secondary) set_color('icon_unselected_color', 'TabContainer', color_font_and_icon_secondary) set_color('icon_disabled_color', 'TabBar', color_font_and_icon_dimmed * Color(1, 1, 1, 0.55)) set_color('icon_disabled_color', 'TabContainer', color_font_and_icon_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) 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 set_stylebox('tab_selected', 'TabContainerOdd', sb) set_stylebox('tab_focus', 'TabBar', focus_sb) set_stylebox('tab_focus', 'TabContainer', focus_sb) set_stylebox('tab_focus', 'TabContainerOdd', focus_sb) sb = sb.duplicate() sb.bg_color = color_surface_lowest 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) 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) sb.set_corner_radius_all(0) sb.corner_radius_bottom_right = int(corner_radius * scale) 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) set_stylebox('tabbar_background', 'TabContainer', sb) set_stylebox('tabbar_background', 'TabContainerOdd', sb) # Tree set_color('drop_position_color', 'Tree', color_font_and_icon_dimmed) set_color('font_color', 'Tree', color_font_and_icon_normal) set_color('guide_color', 'Tree', Color.TRANSPARENT) set_color('parent_hl_line_color', 'Tree', color_mono * 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) set_constant('inner_item_margin_left', 'Tree', int(base_margin * scale)) set_constant('inner_item_margin_right', 'Tree', int(base_margin * scale)) set_constant('parent_hl_line_width', 'Tree', int(ceilf(scale))) set_constant('relationship_line_width', 'Tree', 0) var tree_v_separation : int = int(pow(base_margin * 0.2 * scale, 3)) set_constant('v_separation', 'Tree', tree_v_separation) # Using empty stylebox for trees to avoid drawing unnecessary borders in docks. # Note that using opaque color that is the same as dock background # 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) set_stylebox('panel', 'Tree', empty_sb) set_stylebox('focus', 'Tree', focus_sb) sb = base_sb.duplicate() sb.bg_color = color_surface_lowest # Using a transparent border to separate rounded column titles sb.border_width_left = int(ceilf(scale)) sb.border_width_right = int(ceilf(scale)) sb.border_color = sb.bg_color * Color(1, 1, 1, 0) set_stylebox('title_button_hover', 'Tree', sb) set_stylebox('title_button_normal', 'Tree', sb) set_stylebox('title_button_pressed', 'Tree', sb) sb = flat_button_hover_sb.duplicate() sb.set_content_margin_all(0) sb.bg_color = color_button_disabled set_stylebox('button_hover', 'Tree', sb) set_stylebox('hover', 'Tree', sb) set_stylebox('hovered_dimmed', 'Tree', sb) set_stylebox('custom_button_hover', 'Tree', sb) set_stylebox('hovered', 'Tree', sb) set_stylebox('selected', 'Tree', sb) set_stylebox('selected_focus', 'Tree', focus_sb) sb = sb.duplicate() sb.bg_color = color_button_normal set_stylebox('hovered_selected', 'Tree', sb) set_stylebox('hovered_selected_focus', 'Tree', focus_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) # 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) set_stylebox('cursor', 'Tree', sb) set_stylebox('cursor_unfocused', 'Tree', sb) # Separators line_sb = StyleBoxLine.new() line_sb.color = Color(0, 0, 0, 0.3) if dark_theme else Color(0, 0, 0, 0.1) line_sb.grow_begin = base_margin * -1 * scale line_sb.grow_end = base_margin * -1 * scale line_sb.thickness = int(ceilf(scale * 2)) set_constant('separation', 'HSeparator', int(base_margin * 2 * scale)) set_constant('separation', 'VSeparator', int(base_margin * 2 * scale)) set_stylebox('separator', 'HSeparator', line_sb) line_sb = line_sb.duplicate() 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 if draw_extra_borders: _set_border(sb, color_extra_border_dimmed, 1) set_stylebox('panel', 'TreeSecondary', sb) set_stylebox('panel', 'ItemListSecondary', sb) # Use sidebar stylebox for EditorDebuggerInspector in StackTrace # to keep the default 3-column layout, as debugger inspector is # too small to be considered a main area set_stylebox('panel', 'EditorDebuggerInspector', sb) # ProjectManager sb = base_sb.duplicate() sb.bg_color = color_surface_low 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 (func() -> void: # Project Manager fixes if EditorInterface.get_script_editor() == null: # QuickSettingsDialog # 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 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: # Reapply the stylebox override on theme change quick_settings_dialog_list_panel.add_theme_stylebox_override('panel', panel_sb_quick_settings) ) # All fixes below are for the main editor window return # TilesetEditor # Tileset editor is using Tree panel for the panel container of expanded view, while minimal theme # needs trees to be transparent, so it needs to have an explicitly set style for the theme # to still be able to support transparent Trees # See https://github.com/godotengine/godot/issues/99118 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) ) # EditorObjectSelector # Godot sometimes relies on unexposed MarginContainers var editor_object_selector : Control = EditorInterface.get_base_control().find_children('', 'EditorObjectSelector', true, false)[0] var editor_object_selector_margin_container : Control = editor_object_selector.find_children('', 'MarginContainer', true, false)[0] editor_object_selector_margin_container.add_theme_constant_override('margin_left', int(base_margin * 2 * scale)) editor_object_selector_margin_container.add_theme_constant_override('margin_right', int(base_margin * 2.5 * scale)) # CanvasItemEditor, Node3DEditor, GameView # Increase toolbar margins var canvas_item_editor : Control = EditorInterface.get_base_control().find_children('', 'CanvasItemEditor', true, false)[0] var canvas_item_editor_toolbar_margin_container : Control = canvas_item_editor.find_children('', 'MarginContainer', true, false)[0] canvas_item_editor_toolbar_margin_container.add_theme_constant_override('margin_top', int(base_margin * 0.5 * scale)) canvas_item_editor_toolbar_margin_container.add_theme_constant_override('margin_bottom', int(base_margin * 0.5 * scale)) var node_3d_editor : Control = EditorInterface.get_base_control().find_children('', 'Node3DEditor', true, false)[0] var node_3d_editor_toolbar_margin_container : Control = node_3d_editor.find_children('', 'MarginContainer', true, false)[0] 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'): 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)) ).call_deferred() # Lighten base color in dark theme, darken in light theme, clamp func _get_base_color(brightness_offset: float = 0, saturation_multiplier: float = 1) -> Color: var dark : bool = dark_theme if brightness_offset >= 0 else !dark_theme var color : Color = Color(base_color) color.v = clampf(lerpf(color.v, 1 if dark else 0, absf(contrast * brightness_offset)), 0, 1) color.s *= saturation_multiplier return color # Shorthand content margin setter func _set_margin(sb: StyleBox, left: float, top: float, right: float = left, bottom: float = top) -> void: sb.content_margin_left = left * scale sb.content_margin_top = top * scale sb.content_margin_right = right * scale sb.content_margin_bottom = bottom * scale # Shorthand border setter func _set_border(sb: StyleBoxFlat, color: Color, width: float = 1, blend: bool = false) -> void: sb.border_color = color sb.border_blend = blend sb.set_border_width_all(int(ceilf(width * scale))) " [resource] script = SubResource("GDScript_hhmc0")