[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