BKE_addon: new/free/ensure functions
authorCampbell Barton <ideasman42@gmail.com>
Mon, 12 Feb 2018 06:24:18 +0000 (17:24 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 12 Feb 2018 06:24:18 +0000 (17:24 +1100)
source/blender/blenkernel/BKE_addon.h
source/blender/blenkernel/intern/addon.c
source/blender/blenkernel/intern/blender.c
source/blender/editors/interface/resources.c
source/blender/makesrna/intern/rna_userdef.c

index 74c1edd1c1be28bdf5fa34c5974f0ec3fe6baf9e..e631d1d65376670927b15e740fcc5435b4a368b8 100644 (file)
  *  \ingroup bke
  */
 
-#include "RNA_types.h"
 
+struct ListBase;
+struct bAddon;
+
+#ifdef __RNA_TYPES_H__
 typedef struct bAddonPrefType {
        /* type info */
        char idname[64]; // best keep the same size as BKE_ST_MAXNAME
@@ -36,6 +39,10 @@ typedef struct bAddonPrefType {
        ExtensionRNA ext;
 } bAddonPrefType;
 
+#else
+typedef struct bAddonPrefType bAddonPrefType;
+#endif
+
 bAddonPrefType *BKE_addon_pref_type_find(const char *idname, bool quiet);
 void            BKE_addon_pref_type_add(bAddonPrefType *apt);
 void            BKE_addon_pref_type_remove(const bAddonPrefType *apt);
@@ -43,4 +50,8 @@ void            BKE_addon_pref_type_remove(const bAddonPrefType *apt);
 void            BKE_addon_pref_type_init(void);
 void            BKE_addon_pref_type_free(void);
 
+struct bAddon  *BKE_addon_new(void);
+struct bAddon  *BKE_addon_ensure(struct ListBase *addons, const char *module);
+void            BKE_addon_free(struct bAddon *addon);
+
 #endif  /* __BKE_ADDON_H__ */
index 0ef12397fe7ec29352129c945109825c53dfb5bd..8a5154f00392dd42ee4ac71849bd6c9560edeaac 100644 (file)
 #include <stddef.h>
 #include <stdlib.h>
 
+#include "RNA_types.h"
+
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
+#include "BLI_string.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
 
 #include "BKE_addon.h"  /* own include */
+#include "BKE_idprop.h"
+
+#include "DNA_listBase.h"
+#include "DNA_userdef_types.h"
+
 
 #include "MEM_guardedalloc.h"
 
+/* -------------------------------------------------------------------- */
+/** \name Add-on New/Free
+ * \{ */
+
+bAddon *BKE_addon_new(void)
+{
+       bAddon *addon = MEM_callocN(sizeof(bAddon), "bAddon");
+       return addon;
+}
+
+bAddon *BKE_addon_ensure(ListBase *addon_list, const char *module)
+{
+       bAddon *addon = BLI_findstring(addon_list, module, offsetof(bAddon, module));
+       if (addon == NULL) {
+               addon = BKE_addon_new();
+               BLI_strncpy(addon->module, module, sizeof(addon->module));
+               BLI_addtail(addon_list, addon);
+       }
+       return addon;
+}
+
+void BKE_addon_free(bAddon *addon)
+{
+       if (addon->prop) {
+               IDP_FreeProperty(addon->prop);
+               MEM_freeN(addon->prop);
+       }
+       MEM_freeN(addon);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Add-on Preference API
+ * \{ */
+
 static GHash *global_addonpreftype_hash = NULL;
 
 
@@ -81,3 +127,5 @@ void BKE_addon_pref_type_free(void)
        BLI_ghash_free(global_addonpreftype_hash, NULL, MEM_freeN);
        global_addonpreftype_hash = NULL;
 }
+
+/** \} */
index e8a3387c153da889cd91e91c73d8572efca36e4e..a27f075a3465d9905c0ff8e56c34a2ca2233be8e 100644 (file)
@@ -45,6 +45,7 @@
 #include "IMB_imbuf.h"
 #include "IMB_moviecache.h"
 
+#include "BKE_addon.h"
 #include "BKE_blender.h"  /* own include */
 #include "BKE_blender_version.h"  /* own include */
 #include "BKE_blendfile.h"
@@ -198,11 +199,7 @@ static void userdef_free_addons(UserDef *userdef)
 {
        for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
                addon_next = addon->next;
-               if (addon->prop) {
-                       IDP_FreeProperty(addon->prop);
-                       MEM_freeN(addon->prop);
-               }
-               MEM_freeN(addon);
+               BKE_addon_free(addon);
        }
        BLI_listbase_clear(&userdef->addons);
 }
index d12e7cc036b658a9ee405852fbad99597dd069a8..fd73ff8552a532e22948641d78c810be03b60813 100644 (file)
@@ -45,6 +45,7 @@
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
 
+#include "BKE_addon.h"
 #include "BKE_appdir.h"
 #include "BKE_colorband.h"
 #include "BKE_DerivedMesh.h"
@@ -2148,11 +2149,7 @@ void init_userdef_do_versions(void)
                }
                
                /* enable (Cycles) addon by default */
-               if (!BLI_findstring(&U.addons, "cycles", offsetof(bAddon, module))) {
-                       bAddon *baddon = MEM_callocN(sizeof(bAddon), "bAddon");
-                       BLI_strncpy(baddon->module, "cycles", sizeof(baddon->module));
-                       BLI_addtail(&U.addons, baddon);
-               }
+               BKE_addon_ensure(&U.addons, "cycles");
        }
        
        if (!USER_VERSION_ATLEAST(260, 5)) {
index 489a841fb0be19e9dd4cf8d04448d6605ff752de..0496de4dd6ad5135a75728fe46ac74e23c62e27e 100644 (file)
@@ -402,27 +402,22 @@ static void rna_userdef_autosave_update(Main *bmain, Scene *scene, PointerRNA *p
 static bAddon *rna_userdef_addon_new(void)
 {
        ListBase *addons_list = &U.addons;
-       bAddon *bext = MEM_callocN(sizeof(bAddon), "bAddon");
-       BLI_addtail(addons_list, bext);
-       return bext;
+       bAddon *addon = BKE_addon_new();
+       BLI_addtail(addons_list, addon);
+       return addon;
 }
 
-static void rna_userdef_addon_remove(ReportList *reports, PointerRNA *bext_ptr)
+static void rna_userdef_addon_remove(ReportList *reports, PointerRNA *addon_ptr)
 {
        ListBase *addons_list = &U.addons;
-       bAddon *bext = bext_ptr->data;
-       if (BLI_findindex(addons_list, bext) == -1) {
+       bAddon *addon = addon_ptr->data;
+       if (BLI_findindex(addons_list, addon) == -1) {
                BKE_report(reports, RPT_ERROR, "Add-on is no longer valid");
                return;
        }
-
-       if (bext->prop) {
-               IDP_FreeProperty(bext->prop);
-               MEM_freeN(bext->prop);
-       }
-
-       BLI_freelinkN(addons_list, bext);
-       RNA_POINTER_INVALIDATE(bext_ptr);
+       BLI_remlink(addons_list, addon);
+       BKE_addon_free(addon);
+       RNA_POINTER_INVALIDATE(addon_ptr);
 }
 
 static bPathCompare *rna_userdef_pathcompare_new(void)