From 017f15bf989e425ca7a2e03a04fc0b00ec7ae78c Mon Sep 17 00:00:00 2001 From: doc-code Date: Fri, 13 Sep 2024 22:44:09 +0200 Subject: [PATCH] Add functions for auto-order, auto-init, update workspace_ops --- addon/sw/funcs.py | 68 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/addon/sw/funcs.py b/addon/sw/funcs.py index 56d7e36..32e5f6d 100644 --- a/addon/sw/funcs.py +++ b/addon/sw/funcs.py @@ -1,21 +1,45 @@ from .. import __package__ as base_package import bpy -def has_data(): - return 'scene_workspaces' in bpy.data.scenes[bpy.context.scene.name] +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(): - return bpy.data.scenes[scene if scene else bpy.context.scene.name]['scene_workspaces'] + 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_scene + def get_switch(): return prefs().switch @@ -23,12 +47,30 @@ def get_compact(): return prefs().compact def set_scene_workspaces(workspaces, scene = None): - bpy.data.scenes[scene if scene else bpy.context.scene.name]['scene_workspaces'] = workspaces + 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 = [] - for w in bpy.data.workspaces: - workspaces.append(w.name) + 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(): @@ -54,11 +96,10 @@ 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 in ['sw.activate', 'sw.move'] : + if kmi.idname == "sw.activate": km.keymap_items.remove(kmi) def workspace_ops(layout, i, menu_mode=False, name=None): - layout.separator() if menu_mode: layout.prop(prefs(), "compact", text="Compact Mode") layout.separator() @@ -66,9 +107,8 @@ def workspace_ops(layout, i, menu_mode=False, name=None): remove = l.operator( "sw.remove", text="Unlink workspace from scene" if menu_mode else "", icon='X') remove.index = i - if menu_mode: - remove(layout) - layout.separator() + 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 @@ -95,8 +135,6 @@ def workspace_ops(layout, i, menu_mode=False, name=None): 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 - else: - remove(layout) def workspace_menu(self, context): layout = self.layout