[Bf-blender-cvs] [6339270] ui-preview-buttons: Add 'readonly dict-like' behavior to high-level previews collection.

Bastien Montagne noreply at git.blender.org
Mon Apr 27 18:18:30 CEST 2015


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. @@




More information about the Bf-blender-cvs mailing list