146 lines
5.1 KiB
Python

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.name 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()