diff --git a/scripts/modules/addon_utils.py b/scripts/modules/addon_utils.py index e30eccefce6..d808ecbf2c7 100644 --- a/scripts/modules/addon_utils.py +++ b/scripts/modules/addon_utils.py @@ -66,7 +66,7 @@ def _paths_with_extension_repos(): import os addon_paths = [(path, "") for path in paths()] if _preferences.experimental.use_extension_repos: - for repo in _preferences.filepaths.extension_repos: + for repo in _preferences.extensions.repos: if not repo.enabled: continue dirpath = repo.directory @@ -413,7 +413,7 @@ def enable(module_name, *, default_set=False, persistent=False, handle_error=Non elif is_extension and module_name.startswith(ex.name + "."): repo_id = module_name[len(_ext_base_pkg_idname_with_dot):].rpartition(".")[0] repo = next( - (repo for repo in _preferences.filepaths.extension_repos if repo.module == repo_id), + (repo for repo in _preferences.extensions.repos if repo.module == repo_id), None, ) if repo is None: @@ -766,7 +766,7 @@ def _initialize_ensure_extensions_addon(): class _ext_global: __slots__ = () - # Store a map of `preferences.filepaths.extension_repos` -> `module_id`. + # Store a map of `preferences.extensions.repos` -> `module_id`. # Only needed to detect renaming between `bpy.app.handlers.extension_repos_update_{pre & post}` events. # # The first dictionary is for enabled repositories, the second for disabled repositories @@ -787,7 +787,7 @@ def _extension_preferences_idmap(): repos_idmap = {} repos_idmap_disabled = {} if _preferences.experimental.use_extension_repos: - for repo in _preferences.filepaths.extension_repos: + for repo in _preferences.extensions.repos: if repo.enabled: repos_idmap[repo.as_pointer()] = repo.module else: @@ -798,7 +798,7 @@ def _extension_preferences_idmap(): def _extension_dirpath_from_preferences(): repos_dict = {} if _preferences.experimental.use_extension_repos: - for repo in _preferences.filepaths.extension_repos: + for repo in _preferences.extensions.repos: if not repo.enabled: continue repos_dict[repo.module] = repo.directory @@ -909,7 +909,7 @@ def _initialize_extension_repos_post_addons_prepare( addon.module = module_name_next if submodules_del: - repo_module_map = {repo.module: repo for repo in _preferences.filepaths.extension_repos} + repo_module_map = {repo.module: repo for repo in _preferences.extensions.repos} for module_id in submodules_del: repo_userdef = addon_userdef_info.get(module_id, {}) repo_runtime = addon_runtime_info.get(module_id, {}) @@ -1003,7 +1003,7 @@ def _initialize_extension_repos_post(*_, is_first=False): # Detect rename modules & module directories. for module_id_next, dirpath_next in repos_info_next.items(): - # Lookup never fails, as the "next" values use: `preferences.filepaths.extension_repos`. + # Lookup never fails, as the "next" values use: `preferences.extensions.repos`. repo_id = repos_idmap_next_reverse[module_id_next] # Lookup may fail if this is a newly added module. # Don't attempt to setup `submodules_add` though as it's possible diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index 0bf5e8ea09d..4c09816d554 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -2095,15 +2095,15 @@ class USERPREF_PT_extensions_repos(Panel): layout.use_property_split = False layout.use_property_decorate = False - paths = context.preferences.filepaths - active_repo_index = paths.active_extension_repo + extensions = context.preferences.extensions + active_repo_index = extensions.active_repo row = layout.row() row.template_list( "USERPREF_UL_extension_repos", "user_extension_repos", - paths, "extension_repos", - paths, "active_extension_repo" + extensions, "repos", + extensions, "active_repo" ) col = row.column(align=True) @@ -2116,7 +2116,7 @@ class USERPREF_PT_extensions_repos(Panel): col.operator("preferences.extension_repo_upgrade", text="", icon='IMPORT') try: - active_repo = None if active_repo_index < 0 else paths.extension_repos[active_repo_index] + active_repo = None if active_repo_index < 0 else extensions.repos[active_repo_index] except IndexError: active_repo = None diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 227002c5002..d02c9692eef 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -781,6 +781,11 @@ static PointerRNA rna_UserDef_filepaths_get(PointerRNA *ptr) return rna_pointer_inherit_refine(ptr, &RNA_PreferencesFilePaths, ptr->data); } +static PointerRNA rna_UserDef_extensions_get(PointerRNA *ptr) +{ + return rna_pointer_inherit_refine(ptr, &RNA_PreferencesExtensions, ptr->data); +} + static PointerRNA rna_UserDef_system_get(PointerRNA *ptr) { return rna_pointer_inherit_refine(ptr, &RNA_PreferencesSystem, ptr->data); @@ -6949,7 +6954,8 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) "Automatically convert all new tabs into spaces for new and loaded text files"); prop = RNA_def_property(srna, "use_extension_online_access_handled", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "extension_flag", USER_EXTENSION_FLAG_ONLINE_ACCESS_HANDLED); + RNA_def_property_boolean_sdna( + prop, nullptr, "extension_flag", USER_EXTENSION_FLAG_ONLINE_ACCESS_HANDLED); RNA_def_property_ui_text( prop, "Online Access", @@ -7088,15 +7094,36 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Active Asset Library", "Index of the asset library being edited in the Preferences UI"); +} + +static void rna_def_userdef_extensions(BlenderRNA *brna) +{ + PropertyRNA *prop; + StructRNA *srna; + + srna = RNA_def_struct(brna, "PreferencesExtensions", nullptr); + RNA_def_struct_sdna(srna, "UserDef"); + RNA_def_struct_nested(brna, srna, "Preferences"); + RNA_def_struct_ui_text(srna, "Extensions", "Settings for extensions"); + + prop = RNA_def_property(srna, "use_online_access_handled", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna( + prop, nullptr, "extension_flag", USER_EXTENSION_FLAG_ONLINE_ACCESS_HANDLED); + RNA_def_property_ui_text( + prop, + "Online Access", + "The user has been shown the \"Online Access\" prompt and make a choice"); rna_def_userdef_filepaths_extension_repo(brna); - prop = RNA_def_property(srna, "extension_repos", PROP_COLLECTION, PROP_NONE); + prop = RNA_def_property(srna, "repos", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, nullptr, "extension_repos", nullptr); RNA_def_property_struct_type(prop, "UserExtensionRepo"); RNA_def_property_ui_text(prop, "Extension Repositories", ""); rna_def_userdef_extension_repos_collection(brna, prop); - prop = RNA_def_property(srna, "active_extension_repo", PROP_INT, PROP_NONE); + prop = RNA_def_property(srna, "active_repo", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, nullptr, "active_extension_repo"); RNA_def_property_ui_text( prop, "Active Extension Repository", @@ -7410,6 +7437,12 @@ void RNA_def_userdef(BlenderRNA *brna) RNA_def_property_pointer_funcs(prop, "rna_UserDef_filepaths_get", nullptr, nullptr, nullptr); RNA_def_property_ui_text(prop, "File Paths", "Default paths for external files"); + prop = RNA_def_property(srna, "extensions", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_struct_type(prop, "PreferencesExtensions"); + RNA_def_property_pointer_funcs(prop, "rna_UserDef_extensions_get", nullptr, nullptr, nullptr); + RNA_def_property_ui_text(prop, "Extensions", "Settings for extensions"); + prop = RNA_def_property(srna, "system", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); RNA_def_property_struct_type(prop, "PreferencesSystem"); @@ -7478,6 +7511,7 @@ void RNA_def_userdef(BlenderRNA *brna) rna_def_userdef_input(brna); rna_def_userdef_keymap(brna); rna_def_userdef_filepaths(brna); + rna_def_userdef_extensions(brna); rna_def_userdef_system(brna); rna_def_userdef_addon(brna); rna_def_userdef_addon_pref(brna);