bl_addon_info --> bl_info
[blender-addons-contrib.git] / system_keyboard_svg.py
1 # ***** BEGIN GPL LICENSE BLOCK *****
2 #
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software Foundation,
16 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17 #
18 # ***** END GPL LICENCE BLOCK *****
19 # this script creates Keyboard layout images of the current keyboard configuration.
20 # the result will be writen to the blender default directory.
21
22 # first implementation done by jbakker
23
24 bl_info = {
25     "name": "Keyboard Layout (svg)",
26     "author": "Jbakker",
27     "version": (0,1),
28     "blender": (2, 5, 4),
29     "api": 32411,
30     "location": "",
31     "description": "Save the hotkeys as a .svg file (search: Keyboard)",
32     "warning": "",
33     "wiki_url": 'http://wiki.blender.org/index.php/Extensions:2.5/Py/' \
34         'Scripts/System/Keyboard Layout (svg)',
35     "tracker_url": "https://projects.blender.org/tracker/index.php?" \
36         "func==detail&aid=21490",
37     "category": "System"}
38
39 import bpy
40
41 keyboard=[
42 ['`', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO', 'MINUS', 'EQUAL', 'BACKSPACE'],
43 ['TAB', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\\' ],
44 ['CAPSLOCK','A','S','D','F','G','H','J','K','L',';',"'",'ENTER'],
45 ['SHIFT', 'Z','X','C','V','B','N','M',',','.','/','SHIFT'],
46 ['CONTROL', 'OSKEY','ALT','SPACE','ALT','OSKEY','MENUKEY','CONTROL']
47 ]
48
49 # default dimension of a single key [width, heidgh]
50 DEFAULT_KEY_DIMENSION=[100,100]
51 # alternative dimensions of specufic keys [keyname,[width, height]]
52 ALTERNATIVE_KEY_DIMENSIONS={
53 'BACKSPACE':[250,100],
54 'TAB':[175,100],
55 '\\':[175,100],
56 'CAPSLOCK':[225,100],
57 'ENTER':[240,100],
58 'SHIFT':[290,100],
59 'CONTROL':[225,100],
60 'ALT':[100,100],
61 'OSKEY':[100,100],
62 'MENUKEY':[100,100],
63 'SPACE':[690,100],
64 }
65
66
67 def createKeyboard(viewtype):
68     """
69     Creates a keyboard layout (.svg) file of the current configuration for a specific viewtype.
70     example of a viewtype is "VIEW_3D".
71     """
72     for keyconfig in bpy.data.window_managers[0].keyconfigs:
73         map = {}
74         for keymap in keyconfig.keymaps:
75             if keymap.space_type in [viewtype]:
76                 for key in keymap.items:
77                     if key.map_type=='KEYBOARD':
78                         test = 0
79                         pre = []
80                         cont= ""
81                         if key.ctrl:
82                             test = test + 1
83                             cont="C"    
84                         if key.alt:
85                             test = test + 2
86                             cont=cont+"A"
87                         if key.shift:
88                             test = test + 4
89                             cont=cont+"S"
90                         if key.oskey:
91                             test = test + 8
92                             cont=cont+"O"
93                         if len(cont)>0:
94                             cont="["+cont+"] "
95                         ktype = key.type
96                         if ktype not in map.keys():
97                             map[ktype] = []
98                         map[ktype].append((test, cont+key.name))
99         
100         filename="keyboard_"+viewtype+".svg"
101         print(filename)
102         svgfile = open(filename, "w")
103         svgfile.write("""<?xml version="1.0" standalone="no"?>
104     <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
105     """)
106         svgfile.write("""<svg width="2000" height="800" version="1.1" xmlns="http://www.w3.org/2000/svg">
107     """)
108         svgfile.write("""<style>
109     rect {
110         fill:rgb(192,192,192);
111         stroke-width:1;
112         stroke:rgb(0,0,0);
113     }
114     text.header {
115         font-size:xx-large;
116     }
117     text.key {
118         stroke-width:1;
119         stroke:rgb(0,0,0);
120     }
121     text.action {
122         font-size:smaller;
123     }
124     text.add0 {
125         font-size:smaller;
126         fill:rgb(0,0,0)
127     }
128     text.add1 {
129         font-size:smaller;
130         fill:rgb(255,0,0)
131     }
132     text.add2 {
133         font-size:smaller;
134         fill:rgb(0,255,0)
135     }
136     text.add3 {
137        font-size:smaller;
138        fill:rgb(128,128,0)
139     }
140     text.add4 {
141         font-size:smaller;
142         fill:rgb(0,0,255)
143     }
144     text.add5 {
145         font-size:smaller;
146         fill:rgb(128,0,128)
147     }
148     text.add6 {
149         font-size:smaller;
150         fill:rgb(0, 128, 128)
151     }
152     text.add7 {
153         font-size:smaller;
154         fill:rgb(128,128,128)
155     }
156     text.add8 {
157         font-size:smaller;
158         fill:rgb(128,128,128)
159     }
160     text.add9 {
161         font-size:smaller;
162         fill:rgb(255,128,128)
163     }
164     text.add10 {
165         font-size:smaller;
166         fill:rgb(128,255,128)
167     }
168     text.add11 {
169         font-size:smaller;
170         fill:rgb(255,255,128)
171     }
172     text.add12 {
173         font-size:smaller;
174         fill:rgb(128,128,255)
175     }
176     text.add13 {
177         font-size:smaller;
178         fill:rgb(255,128,255)
179     }
180     text.add14 {
181         font-size:smaller;
182         fill:rgb(128,255,255)
183     }
184     text.add15 {
185         font-size:smaller;
186         fill:rgb(255,255,128)
187     }
188     </style>
189     """)
190         svgfile.write("""<text class="header" x="100" y="24">keyboard layout - """+viewtype+"""</text>
191 """)
192     
193         x=0
194         xgap=15
195         ygap=15
196         y=32
197         for row in keyboard:
198             x=0
199             for key in row:
200                 width=DEFAULT_KEY_DIMENSION[0]
201                 height=DEFAULT_KEY_DIMENSION[1]
202                 if key in ALTERNATIVE_KEY_DIMENSIONS.keys():
203                     width=ALTERNATIVE_KEY_DIMENSIONS[key][0]
204                     height=ALTERNATIVE_KEY_DIMENSIONS[key][1]
205                 tx=16
206                 ty=16
207                 svgfile.write("""<rect x=\""""+str(x)+"""\" y=\""""+str(y)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\" rx="20" ry="20" />
208     """);
209                 svgfile.write("""<text class="key" x=\""""+str(x+tx)+"""\" y=\""""+str(y+ty)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\">
210     """);
211                 svgfile.write(key)
212                 svgfile.write("</text>")
213                 ty=ty+16
214                 tx=4
215                 if key in map.keys():
216                     for a in map[key]:
217                         svgfile.write("""<text class="add"""+str(a[0])+"""" x=\""""+str(x+tx)+"""\" y=\""""+str(y+ty)+"""\" width=\""""+str(width)+"""\" height=\""""+str(height)+"""\">
218     """);
219                         svgfile.write(a[1])
220                         svgfile.write("</text>")
221                         ty=ty+16
222                 x=x+width+xgap
223             y=y+100+ygap
224         svgfile.write("""</svg>""")
225         svgfile.flush()
226         svgfile.close()
227
228 class WM_OT_Keyboardlayout(bpy.types.Operator):
229     """
230         Windows manager operator for keyboard leyout export
231     """
232     bl_idname = "wm.keyboardlayout"
233     bl_label = "Keyboard layout (SGV)"
234
235     def execute(self, context):
236         """
237         Iterate over all viewtypes to export the keyboard layout.
238         """
239         for vt in ['VIEW_3D', 'LOGIC_EDITOR', 'NODE_EDITOR', 'CONSOLE', 'GRAPH_EDITOR', 'PROPERTIES', 'SEQUENCE_EDITOR', 'OUTLINER', 'IMAGE_EDITOR', 'TEXT_EDITOR', 'DOPESHEET_EDITOR', 'Window']:
240             createKeyboard(vt)
241         return {'FINISHED'}
242
243 def register():
244     pass
245
246 def unregister():
247     pass
248
249 if __name__ == "__main__":
250     register()