Adding Sequencer Tools, a (basic and beginning) collection of tools for the Sequencer.
[blender-addons-contrib.git] / sequencer_tools / __init__.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 bl_info = {
20     "name": "Sequencer Tools",
21     "author": "mont29",
22     "version": (0, 0, 1),
23     "blender": (2, 6, 3),
24     "location": "Sequencer menus/UI",
25     "description": "Various Sequencer tools.",
26     "warning": "",
27     "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Sequencer/Tools",
28     "tracker_url": "projects.blender.org/tracker/index.php?func=detail&aid=31549",
29     "support": 'TESTING',
30     "category": "Sequencer"
31 }
32
33
34 import bpy
35
36 from sequencer_tools.export_strips import SEQExportStrip
37
38
39 KEYMAPS = (
40     # First, keymap identifiers (last bool is True for modal km).
41     (("Sequencer", "WINDOW", "SEQUENCE_EDITOR", False), (
42     # Then a tuple of keymap items, defined by a dict of kwargs for
43     # the km new func, and a tuple of tuples (name, val) for ops properties,
44     # if needing non-default values.
45         ({"idname": SEQExportStrip.bl_idname, "type": "P", "value": "PRESS",
46                                               "shift": True, "ctrl": True},
47          ()),
48     )),
49 )
50
51
52 def menu_func(self, context):
53     self.layout.operator(SEQExportStrip.bl_idname, text="Export Selected")
54
55
56 def find_keymap_items(km, idname):
57     return (i for i in km.keymap_items if i.idname == idname)
58
59
60 def update_keymap(activate):
61     # Add.
62     if activate:
63         kconf = bpy.context.window_manager.keyconfigs.addon
64         for km_info, km_items in KEYMAPS:
65             km_name, km_regtype, km_sptype, km_ismodal = km_info
66             kmap = [k for k in kconf.keymaps
67                     if k.name == km_name and k.region_type == km_regtype and
68                        k.space_type == km_sptype and k.is_modal == km_ismodal]
69             if kmap:
70                 kmap = kmap[0]
71             else:
72                 kmap = kconf.keymaps.new(km_name, region_type=km_regtype,
73                                          space_type=km_sptype,
74                                          modal=km_ismodal)
75             for kmi_kwargs, props in km_items:
76                 kmi = kmap.keymap_items.new(**kmi_kwargs)
77                 kmi.active = True
78                 for prop, val in props:
79                     setattr(kmi.properties, prop, val)
80
81     # Remove.
82     else:
83         # XXX We must also clean up user keyconfig, else, if user has
84         #     customized one of our shortcut, this customization
85         #     remains in memory, and comes back when re-enabling the addon,
86         #     causing a sigsev... :/
87         kconfs = bpy.context.window_manager.keyconfigs
88         for kconf in (kconfs.user, kconfs.addon):
89             for km_info, km_items in KEYMAPS:
90                 km_name, km_regtype, km_sptype, km_ismodal = km_info
91                 kmaps = (k for k in kconf.keymaps
92                          if k.name == km_name and
93                             k.region_type == km_regtype and
94                             k.space_type == km_sptype and
95                             k.is_modal == km_ismodal)
96                 for kmap in kmaps:
97                     for kmi_kwargs, props in km_items:
98                         for kmi in find_keymap_items(kmap,
99                                                      kmi_kwargs["idname"]):
100                             kmap.keymap_items.remove(kmi)
101                 # XXX We won’t remove addons keymaps themselves,
102                 #     other addons might also use them!
103
104
105 def register():
106     bpy.utils.register_module(__name__)
107     bpy.types.SEQUENCER_MT_strip.append(menu_func)
108
109     update_keymap(True)
110
111
112 def unregister():
113     bpy.utils.unregister_module(__name__)
114     bpy.types.SEQUENCER_MT_strip.remove(menu_func)
115
116     update_keymap(False)
117
118
119 if __name__ == "__main__":
120     register()