PyAPI: add preferences.filepaths.extension_repos.new/remove methods

Provide convenient access to adding/removing repositories,
useful for testing.
This commit is contained in:
Campbell Barton
2023-08-11 17:34:51 +10:00
parent 00ffa63b8f
commit 8ce5a24b77
4 changed files with 76 additions and 2 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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<bUserExtensionRepo *>(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,