diff --git a/scripts/modules/addon_utils.py b/scripts/modules/addon_utils.py index 82812875640..a9bde2ef4b0 100644 --- a/scripts/modules/addon_utils.py +++ b/scripts/modules/addon_utils.py @@ -68,7 +68,7 @@ def _paths_with_extension_repos(): for repo in _preferences.filepaths.extension_repos: if not repo.enabled: continue - dirpath = repo.directory + dirpath = repo.directory_or_default if not os.path.isdir(dirpath): continue addon_paths.append((dirpath, "%s.%s" % (_ext_base_pkg_idname, repo.module))) @@ -652,7 +652,7 @@ def _extension_dirpath_from_preferences(): for repo in _preferences.filepaths.extension_repos: if not repo.enabled: continue - repos_dict[repo.module] = repo.directory + repos_dict[repo.module] = repo.directory_or_default return repos_dict diff --git a/scripts/modules/bpy_types.py b/scripts/modules/bpy_types.py index c83f9511e4f..65cf4b02e75 100644 --- a/scripts/modules/bpy_types.py +++ b/scripts/modules/bpy_types.py @@ -1307,6 +1307,18 @@ class RenderEngine(StructRNA, metaclass=RNAMeta): __slots__ = () +class UserExtensionRepo(StructRNA): + __slots__ = () + + @property + def directory_or_default(self): + """Return ``directory`` or a default path derived from the users scripts path.""" + if directory := self.directory: + return directory + import os + return os.path.join(_bpy.utils.user_resource('SCRIPTS', path="extensions"), self.module) + + class HydraRenderEngine(RenderEngine): __slots__ = () diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 65d910e139b..7761ef6aafc 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -623,6 +623,10 @@ typedef struct bUserExtensionRepo { */ char module[48]; + /** + * The "local" directory where extensions are stored. + * When unset, use `{BLENDER_USER_SCRIPTS}/extensions/{bUserExtensionRepo::module}`. + */ char dirpath[1024]; /* FILE_MAX */ char remote_path[1024]; /* FILE_MAX */ diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 08dbe3fcb4e..dc154a2188e 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -6612,7 +6612,10 @@ static void rna_def_userdef_filepaths_extension_repo(BlenderRNA *brna) prop = RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH); RNA_def_property_string_sdna(prop, nullptr, "dirpath"); - RNA_def_property_ui_text(prop, "Local Directory", "The local directory containing extensions"); + RNA_def_property_ui_text(prop, + "Local Directory", + "The local directory containing extensions. " + "When unset, a path is used based on the user scripts path"); RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_EDITOR_FILEBROWSER); RNA_def_property_string_funcs( prop, nullptr, nullptr, "rna_userdef_extension_repo_directory_set");