[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