147 lines
6.0 KiB
Python
147 lines
6.0 KiB
Python
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, get_only_with_multiple
|
|
|
|
# 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()
|
|
only_with_multiple = get_only_with_multiple()
|
|
has_multiple = len(bpy.data.scenes) > 1
|
|
multiple_satisfied = (not only_with_multiple or only_with_multiple and has_multiple)
|
|
|
|
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 and multiple_satisfied:
|
|
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 or not multiple_satisfied:
|
|
# 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")
|