[Bf-blender-cvs] [8e201dbfd1] app-templates: Missed adding this previous commit

Campbell Barton noreply at git.blender.org
Wed Mar 22 02:35:07 CET 2017


Commit: 8e201dbfd18fd11f64c8808dd098ff81a253a865
Author: Campbell Barton
Date:   Wed Mar 22 12:35:01 2017 +1100
Branches: app-templates
https://developer.blender.org/rB8e201dbfd18fd11f64c8808dd098ff81a253a865

Missed adding this previous commit

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

A	release/scripts/modules/bl_app_override/helpers.py

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

diff --git a/release/scripts/modules/bl_app_override/helpers.py b/release/scripts/modules/bl_app_override/helpers.py
new file mode 100644
index 0000000000..f60fb271a1
--- /dev/null
+++ b/release/scripts/modules/bl_app_override/helpers.py
@@ -0,0 +1,221 @@
+# ##### 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-80 compliant>
+
+# -----------------------------------------------------------------------------
+# AppOverrideState
+
+class AppOverrideState:
+    """
+    Utility class to encapsulate overriding the application state,
+    so settings can be overridden, then restored back to its original state.
+
+    This is a wrapper for utility functions defined in ``bl_app_override``,
+    so users can simply provide override values without calling each function,
+    storing the result, then restoring later on.
+
+    Instead, the class can define callbacks (documented below),
+    Then call  call ``setup``, to reverse this call ``teardown``.
+
+    All of the callbacks below are optional,
+    leaving them undeclared means you're opting out of manipulating
+    that particular aspect.
+
+
+    Class Ignore
+    ------------
+
+    This will unregister classes in ``bpy.types``
+    typically used to remove panels.
+
+    - ``class_ignore() -> [cls, ...]``
+      A function that returns classes from ``bpy.types``
+      that are to be unregistered.
+
+
+    UI Filter
+    ---------
+
+    This disables particular interface elements
+    (operator, property, menu or label).
+
+    Classes which will have ``ui_ignore_*`` callbacks applied to them.
+
+    - ``ui_ignore_classes() -> [cls, ...]``
+      Currently the only classes that make sense to include in this list are:
+      ``(bpy.types.Panel, bpy.types.Header ,bpy.types.Menu)``.
+
+      When left to None, all classes are used.
+
+    Return True to ignore.
+
+    - ``ui_ignore_operator(id) -> bool``
+    - ``ui_ignore_property(class_id, prop_id) -> bool``
+    - ``ui_ignore_menu(id) -> bool``
+    - ``ui_ignore_label(text) -> bool``
+
+    When not declared, no filtering takes place.
+
+
+    Add-ons
+    -------
+
+    - ``addon_paths() -> [path, ...]``
+      Return a sequence of paths which contain addons.
+    - ``addons() -> [addon, ...]``
+      Return a sequence of addon id's to enable.
+    """
+    __slots__ = (
+        # setup_classes
+        "_class_store",
+        # setup_ui_ignore
+        "_ui_ignore_store",
+        # setup_addons
+        "_addon_store",
+    )
+
+    # ---------
+    # Callbacks
+    #
+    # Set as None, to make it simple to check if they're being overridden.
+
+    # setup/teardown classes
+    class_ignore = None
+
+    # setup/teardown ui_ignore
+    ui_ignore_classes = None
+    ui_ignore_operator = None
+    ui_ignore_property = None
+    ui_ignore_menu = None
+    ui_ignore_label = None
+
+    addon_paths = None
+    addons = None
+
+    # End callbacks
+
+    def __init__(self):
+        self._class_store = None
+        self._addon_store = None
+        self._ui_ignore_store = None
+
+    def _setup_classes(self):
+        import bpy
+        assert(self._class_store is None)
+        self._class_store = self.class_ignore()
+        from bpy.utils import unregister_class
+        for cls in self._class_store:
+            unregister_class(cls)
+
+    def _teardown_classes(self):
+        assert(len(self._class_store) != 0)
+
+        from bpy.utils import register_class
+        for cls in self._class_store:
+            register_class(cls)
+        self._class_store = None
+
+    def _setup_ui_ignore(self):
+        import bl_app_override
+
+        self._ui_ignore_store = bl_app_override.ui_draw_filter_register(
+            ui_ignore_classes=(
+                None if self.ui_ignore_classes is None
+                else self.ui_ignore_classes()
+            ),
+            ui_ignore_operator=self.ui_ignore_operator,
+            ui_ignore_property=self.ui_ignore_property,
+            ui_ignore_menu=self.ui_ignore_menu,
+            ui_ignore_label=self.ui_ignore_label,
+        )
+
+    def _teardown_ui_ignore(self):
+        import bl_app_override
+        bl_app_override.ui_draw_filter_unregister(
+            self._ui_ignore_store
+        )
+        self._ui_ignore_store = None
+
+
+    def _setup_addons(self):
+        import sys
+        import os
+
+        sys_path = []
+        if self.addon_paths is not None:
+            for path in self.addon_paths():
+                if path not in sys.path:
+                    sys.path.append(path)
+
+        import addon_utils
+        addons = []
+        if self.addons is not None:
+            addons.extend(self.addons())
+            for addon in addons:
+                addon_utils.enable(addon)
+
+        self._addon_store = {
+            "sys_path": sys_path,
+            "addons": addons,
+        }
+
+    def _teardown_addons(self):
+        import sys
+
+        sys_path = self._addon_store["sys_path"]
+        for path in sys_path:
+            # should always succeed, but if not its no problem
+            try:
+                sys.path.remove(path)
+            except:
+                pass
+
+        addons = self._addon_store["addons"]
+        import addon_utils
+        for addon in addons:
+            addon_utils.disable(addon)
+
+        self._addon_store.clear()
+        self._addon_store = None
+
+    def setup(self):
+        if self.class_ignore is not None:
+            self._setup_classes()
+
+        if any((self.addon_paths,
+                self.addons,
+        )):
+            self._setup_addons()
+
+        if any((self.ui_ignore_operator,
+                self.ui_ignore_property,
+                self.ui_ignore_menu,
+                self.ui_ignore_label,
+        )):
+            self._setup_ui_ignore()
+
+    def teardown(self):
+        if self._class_store is not None:
+            self._teardown_classes()
+
+        if self._addon_store is not None:
+            self._teardown_addons()
+
+        if self._ui_ignore_store is not None:
+            self._teardown_ui_ignore()




More information about the Bf-blender-cvs mailing list