[Bf-blender-cvs] [e56bd4d] ui-preview-buttons: Make previews a real module, and BPyPreviewsCollection a subclass of dict.

Bastien Montagne noreply at git.blender.org
Sat May 2 11:28:42 CEST 2015


Commit: e56bd4d43a3eaac748d6841254f4d44dca5dbe07
Author: Bastien Montagne
Date:   Sat May 2 11:24:51 2015 +0200
Branches: ui-preview-buttons
https://developer.blender.org/rBe56bd4d43a3eaac748d6841254f4d44dca5dbe07

Make previews a real module, and BPyPreviewsCollection a subclass of dict.

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

M	release/scripts/modules/bpy/utils/__init__.py
A	release/scripts/modules/bpy/utils/previews.py

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

diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index 4fe2ae0..037531f 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -62,6 +62,8 @@ from _bpy import script_paths as _bpy_script_paths
 from _bpy import user_resource as _user_resource
 from _bpy import _utils_units as units
 
+from . import previews
+
 import bpy as _bpy
 import os as _os
 import sys as _sys
@@ -698,134 +700,3 @@ def make_rna_paths(struct_name, prop_name, enum_name):
         else:
             src = src_rna = struct_name
     return src, src_rna, src_enum
-
-
-# High-level previews manager.
-class BPyPreviewsCollection:
-    """
-    Fake dict-like class of previews.
-    """
-    from _bpy import app as _app
-
-    def __init__(self, name):
-        self._previews = {}
-        self._coll_name = name
-
-    def __del__(self):
-        self.clear()
-
-    def _gen_key(self, name):
-        return self._coll_name + name
-
-    def new(self, name):
-        app = self.__class__._app
-        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):
-        app = self.__class__._app
-        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):
-        app = self.__class__._app
-        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):
-        app = self.__class__._app
-        for name in self._previews.keys():
-            app._previews.release(self._gen_key(name))
-        self._previews.clear()
-
-    # No setdefault(), pop(), popitem(), copy(), nor update()
-
-
-class BPyPreviewsManager:
-    """
-    High-level 'cached' 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',)
-
-    _preview_coll_type = BPyPreviewsCollection
-
-    def __init__(self):
-        self._previews_collections = {}
-
-    def __del__(self):
-        self.clear()
-
-    def new(self, name):
-        """
-        Return a new preview collection, or existing one if 'name' already exists.
-        """
-        return self._previews_collections.setdefault(name, self.__class__._preview_coll_type(name))
-
-    def _remove(self, name):
-        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.utils.previews'>"
-
-
-previews = BPyPreviewsManager()
-
-# __all__ is not much useful actually :/
-del BPyPreviewsManager, BPyPreviewsCollection
diff --git a/release/scripts/modules/bpy/utils/previews.py b/release/scripts/modules/bpy/utils/previews.py
new file mode 100644
index 0000000..6a39b69
--- /dev/null
+++ b/release/scripts/modules/bpy/utils/previews.py
@@ -0,0 +1,121 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+"""
+This module contains utility functions to handle custom previews.
+
+It behaves as a high-level 'cached' previews manager.
+
+This allows addons to generate their own previews, and use them as icons in UI widgets
+('icon_value' of UILayout functions).
+"""
+
+__all__ = (
+    "new",
+    "delete",
+    "clear",
+    )
+
+
+# High-level previews manager.
+class BPyPreviewsCollection(dict):
+    """
+    Dict-like class of previews.
+    """
+    from _bpy import app as _app
+
+    def __init__(self, name):
+        super().__init__()
+        self._coll_name = name
+
+    def __del__(self):
+        app = self.__class__._app
+        for name in self.keys():
+            app._previews.release(self._gen_key(name))
+
+    def _gen_key(self, name):
+        return self._coll_name + name
+
+    def new(self, name):
+        app = self.__class__._app
+        return self.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):
+        app = self.__class__._app
+        pkey = self._gen_key(name)
+        if force_reload:
+            self[name] = p = app._previews.load(pkey, path, path_type, True)
+            return p
+        else:
+            return self.setdefault(name, app._previews.load(pkey, path, path_type, False))
+    load.__doc__ = _app._previews.load.__doc__
+
+    def release(self, name):
+        app = self.__class__._app
+        p = self.pop(name, None)
+        if p is not None:
+            del p
+            app._previews.release(self._gen_key(name))
+    release.__doc__ = _app._previews.release.__doc__
+
+    def clear(self):
+        app = self.__class__._app
+        for name in self.keys():
+            app._previews.release(self._gen_key(name))
+        super().clear()
+
+    def __delitem__(self, key):
+        return self.release(key)
+
+    def __repr__(self):
+        return "<PreviewsCollection '%s'>\n\tPreviews: %s" % (self._coll_name, super().__repr__())
+
+
+_previews_collections = {}
+
+
+def new(name):
+    """
+    Return a new preview collection, or existing one if 'name' already exists.
+    """
+    return _previews_collections.setdefault(name, BPyPreviewsCollection(name))
+
+
+def _remove(name):
+    return _previews_collections.pop(name, None)
+
+
+def delete(name):
+    """
+    Delete specified previews collection.
+    """
+    pcoll = _remove(name)
+    if pcoll is not None:
+        del pcoll
+
+
+def clear(self):
+    """
+    Delete all previews collections.
+    """
+    for pcoll in _previews_collections.values():
+        del pcoll
+    _previews_collections.clear()




More information about the Bf-blender-cvs mailing list