from .. import __package__ as base_package import bpy prop_name = "scene_workspaces"; prop_i_name = "scene_workspaces_active"; def_templates_w_order = [ ['Layout','Modeling','Sculpting','UV Editing','Texture Paint','Shading','Animation','Rendering','Compositing','Geometry Nodes','Scripting'], ['2D Animation','2D Full Canvas','Compositing','Rendering'], ['Sculpting','Shading'], ['Motion Tracking','Masking','Compositing','Rendering'], ['Video Editing','Rendering'] ] def has_data(scene = None, prop = prop_name): return prop in bpy.data.scenes[scene if scene else bpy.context.scene.name] def get_scene_workspaces(scene = None): if has_data(scene): return bpy.data.scenes[scene if scene else bpy.context.scene.name][prop_name] else: return [] def get_active(scene = None): if has_data(scene, prop_i_name): i = bpy.data.scenes[scene if scene else bpy.context.scene.name][prop_i_name] return i if i else 0 else: return 0 def set_active(val = 0): bpy.data.scenes[bpy.context.scene.name][prop_i_name] = val def prefs(): return bpy.context.preferences.addons[base_package].preferences def get_use_topbar(): return prefs().use_topbar def get_only_with_multiple(): return prefs().only_with_multiple_scenes def get_switch(): return prefs().switch def get_compact(): return prefs().compact def set_scene_workspaces(workspaces, scene = None): s = scene if scene else bpy.context.scene.name bpy.data.scenes[s][prop_name] = workspaces if not get_active(): set_active() def workspaces_match_template(): match = False templates = [] for templs in def_templates_w_order: if set([w.name for w in bpy.data.workspaces]) == set(templs): match = True templates = templs break return match, templates def select_all(): workspaces = get_scene_workspaces() match, templates = workspaces_match_template() if match and not workspaces: workspaces = templates else: for w in bpy.data.workspaces: if w not in workspaces: workspaces.append(w.name) set_scene_workspaces(workspaces) def get_other_scene_names(): return [s.name for s in bpy.data.scenes if s.name != bpy.context.scene.name] def tag_redraw_topbar(): for area in bpy.context.window.screen.areas: if area.type == 'TOPBAR': area.tag_redraw() break def assign_shortcuts(): wm = bpy.context.window_manager km = wm.keyconfigs.addon.keymaps.new(name='Window', space_type='EMPTY') prev = km.keymap_items.new('sw.activate', 'PAGE_UP', 'PRESS', ctrl=True, shift=True) prev.properties.next = False next = km.keymap_items.new('sw.activate', 'PAGE_DOWN', 'PRESS', ctrl=True, shift=True) next.properties.next = True def remove_shortcuts(): wm = bpy.context.window_manager km = wm.keyconfigs.addon.keymaps.new(name='Window', space_type='EMPTY') for kmi in km.keymap_items: if kmi.idname == "sw.activate": km.keymap_items.remove(kmi) def workspace_ops(layout, i, menu_mode=False, name=None): if menu_mode: layout.prop(prefs(), "compact", text="Compact Mode") layout.separator() def remove(l): remove = l.operator( "sw.remove", text="Unlink workspace from scene" if menu_mode else "", icon='X') remove.index = i remove(layout) layout.separator() rename = layout.operator( "sw.rename", text="Rename" if menu_mode else "", icon="TEXT") rename.current_name = name if name else bpy.context.window.workspace.name rename.new_name = rename.current_name layout.separator() top = layout.operator("sw.move", text="Reorder to Front (scene only)" if menu_mode else "", icon='TRIA_LEFT_BAR' if menu_mode else 'TRIA_UP_BAR') top.index = i top.top = True up = layout.operator("sw.move", text="Move Left (scene only)" if menu_mode else "", icon='TRIA_LEFT' if menu_mode else 'TRIA_UP') up.index = i up.up = 1 down = layout.operator("sw.move", text="Move Right (scene only)" if menu_mode else "", icon='TRIA_RIGHT' if menu_mode else 'TRIA_DOWN') down.index = i down.up = -1 bottom = layout.operator("sw.move", text="Reorder to Back (scene only)" if menu_mode else "", icon='TRIA_RIGHT_BAR' if menu_mode else 'TRIA_DOWN_BAR') bottom.index = i bottom.top = False layout.separator() if menu_mode and bpy.context.window.workspace.name in get_scene_workspaces(): layout.separator() layout.operator("sw.activate", text="Previous Workspace (scene)" if menu_mode else "").next = False layout.operator("sw.activate", text="Next Workspace (scene)" if menu_mode else "").next = True def workspace_menu(self, context): layout = self.layout use_topbar = get_use_topbar() if use_topbar and has_data(): workspace_ops(layout, get_scene_workspaces().index( context.window.workspace.name), True) layout.separator()