closed panels by default
[blender-addons-contrib.git] / system_keyboard_svg.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 # <pep8 compliant>
20
21 # this script creates Keyboard layout images of the current keyboard configuration.
22 # the result will be writen to the blender default directory.
23
24 # first implementation done by jbakker
25
26 bl_info = {
27     "name": "Keyboard Layout (svg)",
28     "author": "Jbakker",
29     "version": (0, 1),
30     "blender": (2, 6, 0),
31     "location": "",
32     "description": "Save the hotkeys as a .svg file (search: Keyboard)",
33     "warning": "may not work in recent svn",
34     "wiki_url": 'http://wiki.blender.org/index.php/Extensions:2.6/Py/' \
35         'Scripts/System/keymaps_to_svg',
36     "tracker_url": "https://projects.blender.org/tracker/index.php?" \
37         "func==detail&aid=21490",
38     "category": "System"}
39
40 import bpy
41
42 keyboard = (
43     ('`', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO', 'MINUS', 'EQUAL', 'BACKSPACE'),
44     ('TAB', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '(', ')', '\\'),
45     ('CAPSLOCK', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', "'", 'ENTER'),
46     ('SHIFT', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 'SHIFT'),
47     ('CONTROL', 'OSKEY', 'ALT', 'SPACE', 'ALT', 'OSKEY', 'MENUKEY', 'CONTROL')
48     )
49
50 # default dimension of a single key [width, heidgh]
51 DEFAULT_KEY_DIMENSION = 100, 100
52 # alternative dimensions of specufic keys [keyname,[width, height]]
53 ALTERNATIVE_KEY_DIMENSIONS = {
54     'BACKSPACE': (250, 100),
55     'TAB': (175, 100),
56     '\\': (175, 100),
57     'CAPSLOCK': (225, 100),
58     'ENTER': (240, 100),
59     'SHIFT': (290, 100),
60     'CONTROL': (225, 100),
61     'ALT': (100, 100),
62     'OSKEY': (100, 100),
63     'MENUKEY': (100, 100),
64     'SPACE': (690, 100),
65 }
66
67
68 def createKeyboard(viewtype):
69     """
70     Creates a keyboard layout (.svg) file of the current configuration for a specific viewtype.
71     example of a viewtype is "VIEW_3D".
72     """
73     for keyconfig in bpy.data.window_managers[0].keyconfigs:
74         kc_map = {}
75         for keymap in keyconfig.keymaps:
76             if keymap.space_type == viewtype:
77                 for key in keymap.keymap_items:
78                     if key.map_type == 'KEYBOARD':
79                         test = 0
80                         pre = []
81                         cont = ""
82                         if key.ctrl:
83                             test = test + 1
84                             cont = "C"
85                         if key.alt:
86                             test = test + 2
87                             cont = cont + "A"
88                         if key.shift:
89                             test = test + 4
90                             cont = cont + "S"
91                         if key.oskey:
92                             test = test + 8
93                             cont = cont + "O"
94                         if len(cont) > 0:
95                             cont = "[" + cont + "] "
96                         ktype = key.type
97                         if ktype not in kc_map:
98                             kc_map[ktype] = []
99                         kc_map[ktype].append((test, cont + key.name))
100
101         filename = "keyboard_%s.svg" % viewtype
102         print(filename)
103         svgfile = open(filename, "w")
104         svgfile.write("""<?xml version="1.0" standalone="no"?>
105     <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
106     """)
107         svgfile.write("""<svg width="2000" height="800" version="1.1" xmlns="http://www.w3.org/2000/svg">
108     """)
109         svgfile.write("""<style>
110     rect {
111         fill:rgb(192,192,192);
112         stroke-width:1;
113         stroke:rgb(0,0,0);
114     }
115     text.header {
116         font-size:xx-large;
117     }
118     text.key {
119         stroke-width:1;
120         stroke:rgb(0,0,0);
121     }
122     text.action {
123         font-size:smaller;
124     }
125     text.add0 {
126         font-size:smaller;
127         fill:rgb(0,0,0)
128     }
129     text.add1 {
130         font-size:smaller;
131         fill:rgb(255,0,0)
132     }
133     text.add2 {
134         font-size:smaller;
135         fill:rgb(0,255,0)
136     }
137     text.add3 {
138        font-size:smaller;
139        fill:rgb(128,128,0)
140     }
141     text.add4 {
142         font-size:smaller;
143         fill:rgb(0,0,255)
144     }
145     text.add5 {
146         font-size:smaller;
147         fill:rgb(128,0,128)
148     }
149     text.add6 {
150         font-size:smaller;
151         fill:rgb(0, 128, 128)
152     }
153     text.add7 {
154         font-size:smaller;
155         fill:rgb(128,128,128)
156     }
157     text.add8 {
158         font-size:smaller;
159         fill:rgb(128,128,128)
160     }
161     text.add9 {
162         font-size:smaller;
163         fill:rgb(255,128,128)
164     }
165     text.add10 {
166         font-size:smaller;
167         fill:rgb(128,255,128)
168     }
169     text.add11 {
170         font-size:smaller;
171         fill:rgb(255,255,128)
172     }
173     text.add12 {
174         font-size:smaller;
175         fill:rgb(128,128,255)
176     }
177     text.add13 {
178         font-size:smaller;
179         fill:rgb(255,128,255)
180     }
181     text.add14 {
182         font-size:smaller;
183         fill:rgb(128,255,255)
184     }
185     text.add15 {
186         font-size:smaller;
187         fill:rgb(255,255,128)
188     }
189     </style>
190     """)
191         svgfile.write("""<text class="header" x="100" y="24">keyboard layout - """ + viewtype + """</text>
192 """)
193
194         x = 0
195         xgap = 15
196         ygap = 15
197         y = 32
198         for row in keyboard:
199             x = 0
200             for key in row:
201                 width, height = ALTERNATIVE_KEY_DIMENSIONS.get(key, DEFAULT_KEY_DIMENSION)
202                 tx = 16
203                 ty = 16
204                 svgfile.write("""<rect x=\"""" + str(x) +
205                               """\" y=\"""" + str(y) +
206                               """\" width=\"""" + str(width) +
207                               """\" height=\"""" + str(height) +
208                               """\" rx="20" ry="20" />
209     """)
210                 svgfile.write("""<text class="key" x=\"""" + str(x + tx) +
211                               """\" y=\"""" + str(y + ty) +
212                               """\" width=\"""" + str(width) +
213                               """\" height=\"""" + str(height) + """\">
214     """)
215                 svgfile.write(key)
216                 svgfile.write("</text>")
217                 ty = ty + 16
218                 tx = 4
219                 if key in kc_map:
220                     for a in kc_map[key]:
221                         svgfile.write("""<text class="add""" + str(a[0]) +
222                                       """" x=\"""" + str(x + tx) +
223                                       """\" y=\"""" + str(y + ty) +
224                                       """\" width=\"""" + str(width) +
225                                       """\" height=\"""" + str(height) + """\">
226     """)
227                         svgfile.write(a[1])
228                         svgfile.write("</text>")
229                         ty = ty + 16
230                 x = x + width + xgap
231             y = y + 100 + ygap
232         svgfile.write("""</svg>""")
233         svgfile.flush()
234         svgfile.close()
235
236
237 class WM_OT_Keyboardlayout(bpy.types.Operator):
238     """
239         Windows manager operator for keyboard leyout export
240     """
241     bl_idname = "wm.keyboardlayout"
242     bl_label = "Keyboard layout (SVG)"
243
244     def execute(self, context):
245         """
246         Iterate over all viewtypes to export the keyboard layout.
247         """
248         for vt in ('VIEW_3D',
249                    'LOGIC_EDITOR',
250                    'NODE_EDITOR',
251                    'CONSOLE',
252                    'GRAPH_EDITOR',
253                    'PROPERTIES',
254                    'SEQUENCE_EDITOR',
255                    'OUTLINER',
256                    'IMAGE_EDITOR',
257                    'TEXT_EDITOR',
258                    'DOPESHEET_EDITOR',
259                    'Window'):
260
261             createKeyboard(vt)
262         return {'FINISHED'}
263
264
265 def register():
266     bpy.utils.register_module(__name__)
267
268
269 def unregister():
270     bpy.utils.unregister_module(__name__)
271
272 if __name__ == "__main__":
273     register()