from .. import __package__ as base_package import bpy from bpy.types import Header, Panel from .funcs import get_scene_workspaces, get_use_topbar, get_switch, get_compact # Ref TOPBAR_HT_upper_bar https://projects.blender.org/blender/blender/src/commit/2204157a2c9fc926643b0e39968602c750d9b5e6/scripts/startup/bl_ui/space_topbar.py#L14 class TOPBAR_HT_upper_bar(Header): bl_space_type = 'TOPBAR' def draw(self, context): region = context.region if region.alignment == 'RIGHT': self.draw_right(context) else: self.draw_left(context) def draw_left(self, context): layout = self.layout window = context.window screen = context.screen bpy.types.TOPBAR_MT_editor_menus.draw_collapsible(context, layout) layout.separator() # Edit start use_topbar = get_use_topbar() compact = get_compact() switch= get_switch() if not screen.show_fullscreen: main_col = layout.column() spacer_row = main_col.row() spacer_row.scale_y = 1 main_row = main_col.row() sy = 1.18 sx = 1.18 if switch: col = main_row.column() # Show/Hide Custom Topbar col.operator("sw.switch", text="", emboss=False, icon="CHECKBOX_HLT" if use_topbar else "CHECKBOX_DEHLT") if not use_topbar: # Original layout.template_ID_tabs(window, "workspace", new="workspace.add", menu="TOPBAR_MT_workspace_menu") else: r = main_row.row(align=True) r.scale_x = 0.87 r.scale_y = sy sw = get_scene_workspaces() # Link all (with no linked workspaces) if not sw and bpy.data.workspaces: c = r.column() c.scale_x = 1.4 c.operator("sw.link_all", text="Link all workspaces", icon="LINKED") active_not_here = True for w in sw: i = sw.index(w) active = bpy.context.window.workspace.name == w if active and i > 0 and not compact: r.separator() ab = r.box() ab = ab.row(align=True) # Workspace unlink if active and not compact: col = ab.column() col.scale_x = sx col.operator("sw.remove", text="", icon="X", emboss=False).index = i exist = w in [x.name for x in bpy.data.workspaces] # Workspace ab.operator("sw.workspace", text=w, icon="NONE" if exist else "ERROR", emboss=active, depress=active).workspace = w # Active workspace options if active: col = ab.column() col.scale_x = sx col.menu("TOPBAR_MT_workspace_menu", text="", icon="OPTIONS") active_not_here = False if not compact: r.separator() if not compact: r.separator() size = sx if compact else sx * 1.25 # Link other workspaces if len(bpy.data.workspaces) > len(sw): c = r.column() c.scale_x = size c.menu("SW_MT_missing_workspaces", text="", icon="WORKSPACE") if not compact: r.separator() # Duplicate linked workspaces from other scenes if len(bpy.data.scenes) > 1: c = r.column() c.scale_x = size c.menu("SW_MT_copy_from", text="", icon="DUPLICATE") if not compact: r.separator() # Original Add Workspace menu c = r.column() c.scale_x = size c = c.box() c.operator("workspace.add", text="", icon="ADD", emboss=False) if not compact: r.separator() # Active (but not linked) workspace if active_not_here: r.separator() r = r.box() r = r.row(align=True) b = r.box() b.scale_x = sx b.operator("sw.link_workspace", text=f"{bpy.context.window.workspace.name} (link)", icon="LINKED", emboss=True, depress=True).workspace = bpy.context.window.workspace.name # Active workspace options col = r.box() col.scale_x = sx col.menu("TOPBAR_MT_workspace_menu", text="", icon="OPTIONS") # Edit - End else: layout.operator("screen.back_to_previous", icon='SCREEN_BACK', text="Back to Previous") def draw_right(self, context): layout = self.layout window = context.window screen = context.screen scene = window.scene # If statusbar is hidden, still show messages at the top if not screen.show_statusbar: layout.template_reports_banner() layout.template_running_jobs() # Active workspace view-layer is retrieved through window, not through workspace. layout.template_ID(window, "scene", new="scene.new", unlink="scene.delete") row = layout.row(align=True) row.template_search( window, "view_layer", scene, "view_layers", new="scene.view_layer_add", unlink="scene.view_layer_remove")