[Bf-blender-cvs] [4ea4acc] ui-preview-buttons: Change resource management, previews now match file-io closer

Campbell Barton noreply at git.blender.org
Tue May 5 13:56:36 CEST 2015


Commit: 4ea4accd113e20d4b8fc505cc2c46a94744ad91f
Author: Campbell Barton
Date:   Tue May 5 21:55:39 2015 +1000
Branches: ui-preview-buttons
https://developer.blender.org/rB4ea4accd113e20d4b8fc505cc2c46a94744ad91f

Change resource management, previews now match file-io closer

Callers need to hold a reference to the preview collection and close when they're done

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

M	release/scripts/modules/bpy/utils/previews.py
M	release/scripts/templates_py/ui_previews.py

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

diff --git a/release/scripts/modules/bpy/utils/previews.py b/release/scripts/modules/bpy/utils/previews.py
index 8984712..813ed59 100644
--- a/release/scripts/modules/bpy/utils/previews.py
+++ b/release/scripts/modules/bpy/utils/previews.py
@@ -41,6 +41,7 @@ class BPyPreviewsCollection(dict):
     """
     Dict-like class of previews.
     """
+
     # Internal notes:
     # - keys in the dict are stored by name
     # - values are instances of bpy.types.Preview
@@ -49,10 +50,14 @@ class BPyPreviewsCollection(dict):
     def __init__(self, name):
         super().__init__()
         self._coll_name = name
+        _previews_names_used.add(name)
 
     def __del__(self):
-        for name in self.keys():
-            _previews.release(self._gen_key(name))
+        if self._coll_name not in _previews_names_used:
+            return
+
+        raise Warning("%r: left open, remove with 'bpy.utils.previews.remove()'")
+        self.close()
 
     def _gen_key(self, name):
         return ":".join((self._coll_name, name))
@@ -73,7 +78,6 @@ class BPyPreviewsCollection(dict):
     def release(self, name):
         p = self.pop(name, None)
         if p is not None:
-            del p
             _previews.release(self._gen_key(name))
     release.__doc__ = _previews.release.__doc__
 
@@ -82,6 +86,10 @@ class BPyPreviewsCollection(dict):
             _previews.release(self._gen_key(name))
         super().clear()
 
+    def close(self):
+        self.clear()
+        _previews_names_used.remove(self._coll_name)
+
     def __delitem__(self, key):
         return self.release(key)
 
@@ -89,25 +97,24 @@ class BPyPreviewsCollection(dict):
         return "<PreviewsCollection '%s'>\n\tPreviews: %s" % (self._coll_name, super().__repr__())
 
 
-_previews_collections = {}
+_previews_names_used = set()
 
 
 def new(name):
     """
     Return a new preview collection, or existing one if 'name' already exists.
     """
-    return _previews_collections.setdefault(name, BPyPreviewsCollection(name))
 
+    if name in _previews_names_used:
+        raise Exception("Preview %r already exists!" % name)
 
-def remove(name):
-    """
-    Remove the specified previews collection.
-    """
-    _previews_collections.pop(name, None)
+    p = BPyPreviewsCollection(name)
+    return p
 
 
-def clear(self):
+def remove(p):
     """
-    Delete all previews collections.
+    Remove the specified previews collection.
     """
-    _previews_collections.clear()
+    p.close()
+
diff --git a/release/scripts/templates_py/ui_previews.py b/release/scripts/templates_py/ui_previews.py
index c3897f2..4be3d9d 100644
--- a/release/scripts/templates_py/ui_previews.py
+++ b/release/scripts/templates_py/ui_previews.py
@@ -29,7 +29,7 @@ def enum_previews_from_directory_items(self, context):
     directory = wm.my_previews_dir
 
     # gets the already existing preview collection (defined in register func).
-    pcoll = bpy.utils.previews.new("PreviewsInDirectory")
+    pcoll = previews["main"]
 
     if directory == pcoll.my_previews_dir:
         return pcoll.my_previews
@@ -79,6 +79,8 @@ class PreviewsExamplePanel(bpy.types.Panel):
         row.prop(wm, "my_previews")
 
 
+previews = {}
+
 def register():
     from bpy.types import WindowManager
     from bpy.props import (
@@ -89,6 +91,7 @@ def register():
     WindowManager.my_previews_dir = StringProperty(
             name="Folder Path",
             subtype='DIR_PATH',
+            default="/d"
             )
 
     WindowManager.my_previews = EnumProperty(
@@ -103,10 +106,13 @@ def register():
     # - It can store enum_items' strings
     #   (remember you have to keep those strings somewhere in py,
     #   else they get freed and Blender references invalid memory!).
+    import bpy.utils.previews
     pcoll = bpy.utils.previews.new("PreviewsInDirectory")
     pcoll.my_previews_dir = ""
     pcoll.my_previews = ()
 
+    previews["main"] = pcoll
+
     bpy.utils.register_class(PreviewsExamplePanel)
 
 
@@ -115,10 +121,13 @@ def unregister():
 
     del WindowManager.my_previews
 
-    bpy.utils.previews.remove("PreviewsInDirectory")
+    for p in previews.values():
+        bpy.utils.previews.remove(p)
+    bpy.utils.previews.clear()
 
     bpy.utils.unregister_class(PreviewsExamplePanel)
 
 
 if __name__ == "__main__":
     register()
+




More information about the Bf-blender-cvs mailing list