From 8ce5a24b77d0cd2fbf862b44e7219aa90e95fde9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 11 Aug 2023 17:34:51 +1000 Subject: [PATCH] PyAPI: add preferences.filepaths.extension_repos.new/remove methods Provide convenient access to adding/removing repositories, useful for testing. --- source/blender/blenkernel/BKE_preferences.h | 1 + .../blender/blenkernel/intern/preferences.cc | 3 +- .../editors/space_userpref/userpref_ops.cc | 3 +- source/blender/makesrna/intern/rna_userdef.cc | 71 +++++++++++++++++++ 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/BKE_preferences.h b/source/blender/blenkernel/BKE_preferences.h index 4e28aa9d21c..13b4bb77e84 100644 --- a/source/blender/blenkernel/BKE_preferences.h +++ b/source/blender/blenkernel/BKE_preferences.h @@ -81,6 +81,7 @@ void BKE_preferences_asset_library_default_add(struct UserDef *userdef) ATTR_NON bUserExtensionRepo *BKE_preferences_extension_repo_add(UserDef *userdef, const char *name, + const char *module, const char *dirpath); void BKE_preferences_extension_repo_remove(UserDef *userdef, bUserExtensionRepo *repo); diff --git a/source/blender/blenkernel/intern/preferences.cc b/source/blender/blenkernel/intern/preferences.cc index 9d672883fb8..9eeb9fe02d8 100644 --- a/source/blender/blenkernel/intern/preferences.cc +++ b/source/blender/blenkernel/intern/preferences.cc @@ -158,6 +158,7 @@ static size_t strncpy_py_module(char *dst, const char *src, const size_t dst_max bUserExtensionRepo *BKE_preferences_extension_repo_add(UserDef *userdef, const char *name, + const char *module, const char *dirpath) { bUserExtensionRepo *repo = DNA_struct_default_alloc(bUserExtensionRepo); @@ -167,7 +168,7 @@ bUserExtensionRepo *BKE_preferences_extension_repo_add(UserDef *userdef, BKE_preferences_extension_repo_name_set(userdef, repo, name); /* Set the unique module-name. */ - BKE_preferences_extension_repo_module_set(userdef, repo, name); + BKE_preferences_extension_repo_module_set(userdef, repo, module); /* Set the directory. */ STRNCPY(repo->dirpath, dirpath); diff --git a/source/blender/editors/space_userpref/userpref_ops.cc b/source/blender/editors/space_userpref/userpref_ops.cc index aeb800a8985..d76db8563ac 100644 --- a/source/blender/editors/space_userpref/userpref_ops.cc +++ b/source/blender/editors/space_userpref/userpref_ops.cc @@ -251,7 +251,8 @@ static int preferences_extension_repo_add_exec(bContext *C, wmOperator *op) BLI_path_split_file_part(directory, name, sizeof(name)); - bUserExtensionRepo *new_repo = BKE_preferences_extension_repo_add(&U, name, directory); + const char *module = name; + bUserExtensionRepo *new_repo = BKE_preferences_extension_repo_add(&U, name, module, directory); /* Activate new repository in the UI for further setup. */ U.active_extension_repo = BLI_findindex(&U.extension_repos, new_repo); diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index fee6c86657f..06db68fb4bc 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -423,6 +423,42 @@ static void rna_userdef_script_directory_remove(ReportList *reports, PointerRNA USERDEF_TAG_DIRTY; } +static bUserExtensionRepo *rna_userdef_extension_repo_new(const char *name, + const char *module, + const char *directory, + const char *remote_path) +{ + Main *bmain = G.main; + BKE_callback_exec_null(bmain, BKE_CB_EVT_EXTENSION_REPOS_UPDATE_PRE); + + bUserExtensionRepo *repo = BKE_preferences_extension_repo_add( + &U, name ? name : "", module ? module : "", directory ? directory : ""); + if (remote_path) { + STRNCPY(repo->remote_path, remote_path); + } + + BKE_callback_exec_null(bmain, BKE_CB_EVT_EXTENSION_REPOS_UPDATE_POST); + USERDEF_TAG_DIRTY; + return repo; +} + +static void rna_userdef_extension_repo_remove(ReportList *reports, PointerRNA *ptr) +{ + Main *bmain = G.main; + BKE_callback_exec_null(bmain, BKE_CB_EVT_EXTENSION_REPOS_UPDATE_PRE); + + bUserExtensionRepo *repo = static_cast(ptr->data); + if (BLI_findindex(&U.extension_repos, repo) == -1) { + BKE_report(reports, RPT_ERROR, "Extension repository not found"); + return; + } + BKE_preferences_extension_repo_remove(&U, repo); + RNA_POINTER_INVALIDATE(ptr); + + BKE_callback_exec_null(bmain, BKE_CB_EVT_EXTENSION_REPOS_UPDATE_POST); + USERDEF_TAG_DIRTY; +} + static void rna_userdef_load_ui_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr) { UserDef *userdef = (UserDef *)ptr->data; @@ -6534,6 +6570,40 @@ static void rna_def_userdef_script_directory_collection(BlenderRNA *brna, Proper RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0)); } +static void rna_def_userdef_extension_repos_collection(BlenderRNA *brna, PropertyRNA *cprop) +{ + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "UserExtensionRepoCollection"); + srna = RNA_def_struct(brna, "UserExtensionRepoCollection", nullptr); + RNA_def_struct_clear_flag(srna, STRUCT_UNDO); + RNA_def_struct_ui_text(srna, "User Extension Repos", "Collection of user extension repos"); + + func = RNA_def_function(srna, "new", "rna_userdef_extension_repo_new"); + RNA_def_function_flag(func, FUNC_NO_SELF); + RNA_def_function_ui_description(func, "Add a new repository"); + + RNA_def_string(func, "name", nullptr, sizeof(bUserExtensionRepo::name), "Name", ""); + RNA_def_string(func, "module", nullptr, sizeof(bUserExtensionRepo::module), "Module", ""); + RNA_def_string( + func, "directory", nullptr, sizeof(bUserExtensionRepo::dirpath), "Directories", ""); + RNA_def_string( + func, "remote_path", nullptr, sizeof(bUserExtensionRepo::remote_path), "Remote Path", ""); + + /* return type */ + parm = RNA_def_pointer(func, "repo", "UserExtensionRepo", "", "Newly added repo"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "remove", "rna_userdef_extension_repo_remove"); + RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_REPORTS); + RNA_def_function_ui_description(func, "Remove repos"); + parm = RNA_def_pointer(func, "repo", "UserExtensionRepo", "", "Repo to remove"); + RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0)); +} + static void rna_def_userdef_filepaths(BlenderRNA *brna) { PropertyRNA *prop; @@ -6751,6 +6821,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) prop = RNA_def_property(srna, "extension_repos", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "UserExtensionRepo"); RNA_def_property_ui_text(prop, "Extension Repos", ""); + rna_def_userdef_extension_repos_collection(brna, prop); prop = RNA_def_property(srna, "active_extension_repo", PROP_INT, PROP_NONE); RNA_def_property_ui_text(prop,