Commit: 63392700babfd04666ffdb2e04f0935e104d7bff
Author: Bastien Montagne
Date:   Mon Apr 27 17:56:17 2015 +0200
Branches: ui-preview-buttons
https://developer.blender.org/rB63392700babfd04666ffdb2e04f0935e104d7bff

Add 'readonly dict-like' behavior to high-level previews collection.

And some cleanup/rename/documentation/...

===================================================================

M       release/scripts/modules/bpy/utils.py
M       source/blender/blenkernel/BKE_icons.h
M       source/blender/blenkernel/intern/icons.c
M       source/blender/editors/interface/interface_icons.c
M       source/blender/makesrna/intern/rna_brush.c
M       source/blender/python/intern/bpy_app_previews.c

===================================================================

diff --git a/release/scripts/modules/bpy/utils.py 
b/release/scripts/modules/bpy/utils.py
index 3047f02..56990ce 100644
--- a/release/scripts/modules/bpy/utils.py
+++ b/release/scripts/modules/bpy/utils.py
@@ -704,9 +704,10 @@ def make_rna_paths(struct_name, prop_name, enum_name):
 # High-level previews manager.
 class BPyPreviewsManager:
     """
-    Fake module like class.
+    High-level 'cached' previews manager.
 
-    bpy.app.previews_manager
+    This allows addons to generate their own previews, and use them as icons 
in UI widgets
+    ('icon_value' of UILayout functions).
     """
     __slots__ = ('_previews_collections',)
 
@@ -726,17 +727,23 @@ class BPyPreviewsManager:
         return self._previews_collections.pop(name, None)
 
     def delete(self, name):
+        """
+        Delete specified previews collection.
+        """
         pcoll = self._remove(name)
         if pcoll is not None:
             del pcoll
 
     def clear(self):
+        """
+        Delete all previews collections.
+        """
         for pcoll in self._previews_collections.values():
             del pcoll
         self._previews_collections.clear()
 
     def __repr__(self):
-        return "<module like class 'bpy.app.previews_manager'>"
+        return "<module like class 'bpy.utils.previews'>"
 
 
 class BPyPreviewsCollection:
@@ -756,32 +763,61 @@ class BPyPreviewsCollection:
         return self._coll_name + name
 
     def new(self, name):
-        """
-        Return a new empty preview, or existing one if 'name' already exists.
-        """
         return self._previews.setdefault(name, 
app._previews.new(self._gen_key(name)))
+    new.__doc__ = app._previews.new.__doc__
 
     def load(self, name, path, path_type, force_reload=False):
-        """
-        Return a new preview from given file path, or existing one if 'name' 
already exists.
-        """
         pkey = self._gen_key(name)
         if force_reload:
             self._previews[name] = p = app._previews.load(pkey, path, 
path_type, True)
             return p
         else:
             return self._previews.setdefault(name, app._previews.load(pkey, 
path, path_type, False))
+    load.__doc__ = app._previews.load.__doc__
 
     def release(self, name):
         p = self._previews.pop(name, None)
         if p is not None:
             del p
             app._previews.release(self._gen_key(name))
+    release.__doc__ = app._previews.release.__doc__
+
+    def __repr__(self):
+        return "<PreviewsCollection '%s'>\n\tPreviews: %s" % (self._coll_name, 
repr(self._previews))
+
+    # Readonly dict-like API.
+    def __len__(self):
+        return len(self._previews)
+
+    def __getitem__(self, key):
+        return self.new(key)
+
+    # no __setitem__!
+
+    def __delitem__(self, key):
+        return self.release(key)
+
+    def __contains__(self, key):
+        return key in self._previews
+
+    def keys(self):
+        return self._previews.keys()
+
+    def values(self):
+        return self._previews.values()
+
+    def items(self):
+        return self._previews.items()
+
+    def get(self, key, default=None):
+        return self._previews.get(key, default)
 
     def clear(self):
         for name in self._previews.keys():
             _previews.release(self._gen_key(name))
         self._previews.clear()
 
-previews = BPyPreviewsManager()
+    # No setdefault(), pop(), popitem(), copy(), nor update()
 
+
+previews = BPyPreviewsManager()
diff --git a/source/blender/blenkernel/BKE_icons.h 
b/source/blender/blenkernel/BKE_icons.h
index a950caa..f92a52a 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -85,7 +85,7 @@ void BKE_previewimg_free(struct PreviewImage **prv);
 void BKE_previewimg_clear(struct PreviewImage *prv, enum eIconSizes size);
 
 /* free the preview image belonging to the id */
-void BKE_previewimg_free_id(struct ID *id);
+void BKE_previewimg_id_free(struct ID *id);
 
 /* create a new preview image */
 struct PreviewImage *BKE_previewimg_create(void);
@@ -93,13 +93,15 @@ struct PreviewImage *BKE_previewimg_create(void);
 /* create a copy of the preview image */
 struct PreviewImage *BKE_previewimg_copy(struct PreviewImage *prv);
 
-struct PreviewImage *BKE_previewimg_name_get(const char *name);
+/* retrieve existing or create new preview image */
+struct PreviewImage *BKE_previewimg_id_get(struct ID *id);
 
-struct PreviewImage *BKE_previewimg_thumbnail_get(const char *name, const char 
*path, const int source, bool force_update);
+struct PreviewImage *BKE_previewimg_cached_get(const char *name);
 
-void BKE_previewimg_name_release(const char *name);
+struct PreviewImage *BKE_previewimg_cached_thumbnail_get(
+        const char *name, const char *path, const int source, bool 
force_update);
+
+void BKE_previewimg_cached_release(const char *name);
 
-/* retrieve existing or create new preview image */
-struct PreviewImage *BKE_previewimg_id_get(struct ID *id);
 
 #endif /*  __BKE_ICONS_H__ */
diff --git a/source/blender/blenkernel/intern/icons.c 
b/source/blender/blenkernel/intern/icons.c
index a54a80e..0117551 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -66,7 +66,7 @@ static int gNextIconId = 1;
 
 static int gFirstIconId = 1;
 
-static GHash *gFilePreviews = NULL;
+static GHash *gCachedPreviews = NULL;
 
 static void icon_free(void *val)
 {
@@ -113,8 +113,8 @@ void BKE_icons_init(int first_dyn_id)
        if (!gIcons)
                gIcons = BLI_ghash_int_new(__func__);
 
-       if (!gFilePreviews) {
-               gFilePreviews = BLI_ghash_str_new(__func__);
+       if (!gCachedPreviews) {
+               gCachedPreviews = BLI_ghash_str_new(__func__);
        }
 }
 
@@ -125,9 +125,9 @@ void BKE_icons_free(void)
                gIcons = NULL;
        }
 
-       if (gFilePreviews) {
-               BLI_ghash_free(gFilePreviews, MEM_freeN, 
BKE_previewimg_freefunc);
-               gFilePreviews = NULL;
+       if (gCachedPreviews) {
+               BLI_ghash_free(gCachedPreviews, MEM_freeN, 
BKE_previewimg_freefunc);
+               gCachedPreviews = NULL;
        }
 }
 
@@ -206,7 +206,7 @@ PreviewImage *BKE_previewimg_copy(PreviewImage *prv)
        return prv_img;
 }
 
-void BKE_previewimg_free_id(ID *id) 
+void BKE_previewimg_id_free(ID *id)
 {
        if (GS(id->name) == ID_MA) {
                Material *mat = (Material *)id;
@@ -234,15 +234,53 @@ void BKE_previewimg_free_id(ID *id)
        }
 }
 
+PreviewImage *BKE_previewimg_id_get(ID *id)
+{
+       PreviewImage *prv_img = NULL;
+
+       if (GS(id->name) == ID_MA) {
+               Material *mat = (Material *)id;
+               if (!mat->preview) mat->preview = BKE_previewimg_create();
+               prv_img = mat->preview;
+       }
+       else if (GS(id->name) == ID_TE) {
+               Tex *tex = (Tex *)id;
+               if (!tex->preview) tex->preview = BKE_previewimg_create();
+               prv_img = tex->preview;
+       }
+       else if (GS(id->name) == ID_WO) {
+               World *wo = (World *)id;
+               if (!wo->preview) wo->preview = BKE_previewimg_create();
+               prv_img = wo->preview;
+       }
+       else if (GS(id->name) == ID_LA) {
+               Lamp *la  = (Lamp *)id;
+               if (!la->preview) la->preview = BKE_previewimg_create();
+               prv_img = la->preview;
+       }
+       else if (GS(id->name) == ID_IM) {
+               Image *img  = (Image *)id;
+               if (!img->preview) img->preview = BKE_previewimg_create();
+               prv_img = img->preview;
+       }
+       else if (GS(id->name) == ID_BR) {
+               Brush *br  = (Brush *)id;
+               if (!br->preview) br->preview = BKE_previewimg_create();
+               prv_img = br->preview;
+       }
+
+       return prv_img;
+}
+
 /**
  * Generate an empty PreviewImage, if not yet existing.
  */
-PreviewImage *BKE_previewimg_name_get(const char *name)
+PreviewImage *BKE_previewimg_cached_get(const char *name)
 {
        PreviewImage *prv = NULL;
        void **prv_v;
 
-       prv_v = BLI_ghash_lookup_p(gFilePreviews, name);
+       prv_v = BLI_ghash_lookup_p(gCachedPreviews, name);
 
        if (prv_v) {
                prv = *prv_v;
@@ -257,7 +295,7 @@ PreviewImage *BKE_previewimg_name_get(const char *name)
                *prv_v = prv;
        }
        else {
-               BLI_ghash_insert(gFilePreviews, (void *)BLI_strdup(name), prv);
+               BLI_ghash_insert(gCachedPreviews, (void *)BLI_strdup(name), 
prv);
        }
 
        return prv;
@@ -266,13 +304,14 @@ PreviewImage *BKE_previewimg_name_get(const char *name)
 /**
  * Generate a PreviewImage from given file path, using thumbnails management, 
if not yet existing.
  */
-PreviewImage *BKE_previewimg_thumbnail_get(const char *name, const char *path, 
const int source, bool force_update)
+PreviewImage *BKE_previewimg_cached_thumbnail_get(
+        const char *name, const char *path, const int source, bool 
force_update)
 {
        PreviewImage *prv = NULL;
        void **prv_v;
        int icon_w, icon_h;
 
-       prv_v = BLI_ghash_lookup_p(gFilePreviews, name);
+       prv_v = BLI_ghash_lookup_p(gCachedPreviews, name);
 
        if (prv_v) {
                prv = *prv_v;
@@ -322,16 +361,16 @@ PreviewImage *BKE_previewimg_thumbnail_get(const char 
*name, const char *path, c
                        *prv_v = prv;
                }
                else {
-                       BLI_ghash_insert(gFilePreviews, (void 
*)BLI_strdup(name), prv);
+                       BLI_ghash_insert(gCachedPreviews, (void 
*)BLI_strdup(name), prv);
                }
        }
 
        return prv;
 }
 
-void BKE_previewimg_name_release(const char *name)
+void BKE_previewimg_cached_release(const char *name)
 {
-       PreviewImage *prv = BLI_ghash_popkey(gFilePreviews, (void *)name, 
MEM_freeN);
+       PreviewImage *prv = BLI_ghash_popkey(gCachedPreviews, (void *)name, 
MEM_freeN);
 
        if (prv) {
                if (prv->icon_id) {
@@ -341,44 +380,6 @@ void BKE_previewimg_name_release(const char *name)
        }
 }
 
-PreviewImage *BKE_previewimg_id_get(ID *id)
-{
-       PreviewImage *prv_img = NULL;
-
-       if (GS(id->name) == ID_MA) {
-               Material *mat = (Material *)id;
-               if (!mat->preview) mat->preview = BKE_previewimg_create();
-               prv_img = mat->preview;
-       }
-       else if (GS(id->name) == ID_TE) {
-               Tex *tex = (Tex *)id;
-               if (!tex->preview) tex->preview = BKE_previewimg_create();
-               prv_img = tex->preview;
-       }
-       else if (GS(id->name) == ID_WO) {
-               World *wo = (World *)id;
-               if (!wo->preview) wo->preview = BKE_previewimg_create();
-               prv_img = wo->preview;
-       }
-       else if (GS(id->name) == ID_LA) {
-               Lamp *la  = (Lamp *)id;
-               if (!la->preview) la->preview = BKE_previewimg_create();
-               prv_img = la->preview;
-       }
-       else if (GS(id->name) == ID_IM) {
-               Image *img  = (Image *)id;
-               if (!img->preview) img->preview = BKE_previewimg_create();
-               prv_img = img->preview;
-       }
-       else if (GS(id->name) == I

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to