diff options
Diffstat (limited to 'release/scripts/startup/bl_ui/space_toolsystem_common.py')
-rw-r--r-- | release/scripts/startup/bl_ui/space_toolsystem_common.py | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py new file mode 100644 index 00000000000..bab25c3450b --- /dev/null +++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py @@ -0,0 +1,131 @@ +# ##### 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> +import bpy + +__all__ = ( + "ToolSelectPanelHelper", +) + + +class ToolSelectPanelHelper: + """ + Generic Class, can be used for any toolbar. + + - keymap_prefix: + The text prefix for each key-map for this spaces tools. + - tools_all(): + Returns all tools defined. + - tools_from_context(context): + Returns tools available in this context. + + Each tool is a triplet: + ``(tool_name, manipulator_group_idname, keymap_actions)`` + For a separator in the toolbar, use ``None``. + + Where: + ``tool_name`` + is the name to display in the interface. + ``manipulator_group_idname`` + is an optional manipulator group to activate when the tool is set. + ``keymap_actions`` + an optional triple of: ``(operator_id, operator_properties, keymap_item_args)`` + """ + + @classmethod + def _km_actionmouse_simple(cls, kc, text, actions): + + # standalone + def props_assign_recursive(rna_props, py_props): + for prop_id, value in py_props.items(): + if isinstance(value, dict): + props_assign_recursive(getattr(rna_props, prop_id), value) + else: + setattr(rna_props, prop_id, value) + + km_idname = cls.keymap_prefix + text + km = kc.keymaps.new(km_idname, space_type=cls.bl_space_type, region_type='WINDOW') + for op_idname, op_props_dict, kmi_kwargs in actions: + kmi = km.keymap_items.new(op_idname, **kmi_kwargs) + kmi_props = kmi.properties + if op_props_dict: + props_assign_recursive(kmi.properties, op_props_dict) + return km, km_idname + + @classmethod + def register(cls): + wm = bpy.context.window_manager + + # XXX, should we be manipulating the user-keyconfig on load? + # Perhaps this should only add when keymap items don't already exist. + # + # This needs some careful consideration. + kc = wm.keyconfigs.user + + # {tool_name: (keymap, keymap_idname, manipulator_group_idname), ...} + cls._tool_keymap = {} + + # ignore in background mode + if kc is None: + return + + for t in cls.tools_all(): + text, mp_idname, actions = t + if actions is not None: + km, km_idname = cls._km_actionmouse_simple(kc, text, actions) + cls._tool_keymap[text] = km, km_idname + + def draw(self, context): + # XXX, this UI isn't very nice. + # We might need to create new button types for this. + # Since we probably want: + # - tool-tips that include multiple key shortcuts. + # - ability to click and hold to expose sub-tools. + + workspace = context.workspace + km_idname_active = workspace.tool_keymap or None + mp_idname_active = workspace.tool_manipulator_group or None + layout = self.layout + + for tool_items in self.tools_from_context(context): + if tool_items: + col = layout.box().column() + for item in tool_items: + if item is None: + col = layout.box().column() + continue + text, mp_idname, actions = item + + if actions is not None: + km, km_idname = self._tool_keymap[text] + else: + km = None + km_idname = None + + props = col.operator( + "wm.tool_set", + text=text, + emboss=( + km_idname_active == km_idname and + mp_idname_active == mp_idname + ), + ) + + props.keymap = km_idname or "" + props.manipulator_group = mp_idname or "" |