Help menu!
[blender.git] / release / scripts / hotkeys.py
1 #!BPY
2
3 """ Registration info for Blender menus:
4 Name: 'Hotkey Reference'
5 Blender: 232
6 Group: 'Help'
7 Tip: 'All the hotkeys'
8 """ 
9 # $Id$
10 #------------------------
11 #  Hotkeys script
12 #         jm soler (2003)
13 # -----------------------
14 # Page officielle :
15 #   http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_hotkeyscript.htm
16 # Communiquer les problemes et les erreurs sur:
17 #   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
18 #--------------------------------------------- 
19 # ce script est proposé sous licence GPL pour etre associe
20 # a la distribution de Blender 2.33 et suivant
21 # --------------------------------------------------------------------------
22 # this script is released under GPL licence
23 # for the Blender 2.33 scripts package
24 # --------------------------------------------------------------------------
25 # ***** BEGIN GPL LICENSE BLOCK *****
26 #
27 # Copyright (C) 2003, 2004: Jean-Michel Soler
28 #
29 # This program is free software; you can redistribute it and/or
30 # modify it under the terms of the GNU General Public License
31 # as published by the Free Software Foundation; either version 2
32 # of the License, or (at your option) any later version.
33 #
34 # This program is distributed in the hope that it will be useful,
35 # but WITHOUT ANY WARRANTY; without even the implied warranty of
36 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37 # GNU General Public License for more details.
38 #
39 # You should have received a copy of the GNU General Public License
40 # along with this program; if not, write to the Free Software Foundation,
41 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
42 #
43 # ***** END GPL LICENCE BLOCK *****
44 # --------------------------------------------------------------------------
45
46 import Blender
47 from Blender.Draw import *
48 from Blender.BGL import *
49
50 hotkeys={
51 'Specials 1 ':[
52 [',', 'Set Bounding Box rotation scaling pivot'],
53 ['.', 'Set 3D cursor as rotation scaling pivot'] ,
54 ['~', 'Display all layers'] ,
55 ['Shift-~', 'Display all/previous layers'] ,
56 ['TAB', 'Enter/exit edit mode'] ,
57 ['TAB', 'Edit Mode and Numerical Edit (see N key) : move to next input value'],
58 ['TAB', 'Sequencer: Edit meta strip'] ,
59 ['CTRL-TAB', 'Enter/exit pose mode']
60 ],
61
62 'Specials 2 ':[
63 ['F1', 'Open File'],
64 ['F2', 'Save File'],
65 ['F3', 'Save image'],
66 ['F4', 'Logic window (may change)'],
67 ['F5', 'Material window'],
68 ['F6', 'Texture window'],
69 ['F7', 'Object window'],
70 ['F8', 'World window'],
71 ['F9', 'Edit Mode window'],
72 ['F10', 'Render Window'],
73 ['F11', 'Recall the last rendered image'],
74 ['F12', 'Render current Scene'],
75 ['Shift-F1', 'Library Data Select'],
76 ['Shift-F4', 'Data Select '],
77 ['Shift-F5', '3D window'],
78 ['Shift-F6', 'IPO window'],
79 ['Shift-F8', 'Video Sequencer window'],
80 ['Shift-F9', 'OOP window'],
81 ['Shift-F10', 'Image Window']
82 ] ,
83
84 'Numbers  ':[
85 ['1..2..0-=', 'Show layer 1..2..12'] ,
86 ['ALT-1..2..0', 'Show layer 11..12..20'] ,
87 ['SHIFT-1..2..0-=', 'Toggle layer 1..2..12'] ,
88 ['SHIFT-ALT-...', 'Toggle layer 11..12..20'] ],
89
90 'Numpad  ':[
91 ['Numpad DEL', 'Zoom on object'] ,
92 ['Numpad /', 'Local view on object (hide others)'] ,
93 ['Numpad *', "Rotate view to object's local axes"] ,
94 ['Numpad +', 'Zoom in (works everywhere)'] ,
95 ['Numpad +', 'Proportional vertex edit mode: Increase range of influence'] ,
96 ['Numpad -', 'Zoom out (works everywhere)'] ,
97 ['Numpad -', 'Proportional vertex edit mode: Decrease range of influence'] ,
98 ['Numpad INS', 'Set Camera view'] ,
99 ['CTRL-Numpad INS', 'Set active object as camera'] ,
100 ['ALT-Numbad INS', 'Restore old camera'] ,
101 ['Numpad 1', 'Front view'] ,
102 ['CTRL-Numpad 1', 'Back view'] ,
103 ['Numpad 3', 'Right-Side view'] ,
104 ['CTRL-Numpad 3', 'Left-Side view'] ,
105 ['Numpad 7', 'Top view'] ,
106 ['CTRL-Numpad 7', 'Bottom view '] ,
107 ['Numpad 5', 'Toggle orthogonal // perspective view'] ,
108 ['Numpad 9', 'Redraw view'] ,
109 ['Numpad 2', 'Rotate view left'] ,
110 ['Numpad 6', 'Rotate view right'] ,
111 ['Numpad 8', 'Rotate view up'] ,
112 ['Numpad 2', 'Rotate view down'] ],
113
114 'Arrows ':[
115 ['PgUp', 'IPO: Select next keyframe'] ,
116 ['CTRL-PgUp', 'IPO: Select and jump to next keyframe'] ,
117 ['PgDn', 'IPO: Select previous keyframe'] ,
118 ['CTRL-PgDn', 'IPO: Select and jump to previous keyframe'] ,
119 ['LEFT', 'One frame backwards'] ,
120 ['RIGHT', 'One frame forwards'] ,
121 ['DOWN', '10 frames backwards'] ,
122 ['UP', '10 frames forwards'] ],
123
124 'Letters ':[ {"A":[ 
125 ['A', 'Select all / Deselect all'] ,
126 ['ALT-A', 'Animate current window'] ,
127 ['CTRL-A', "Apply object's size/rotation to object data"] ,
128 ['SHIFT-A', 'Sequencer: ADD menu'] ,
129 ['SHIFT-ALT-A', 'Animate all windows'] ,
130 ['SHIFT-CTRL-A', 'Apply lattice / Make dupliverts real']] ,
131
132 "B":[ 
133 ['B', 'Border select'] ,
134 ['BB', 'Circle select'] ,
135 ['SHIFT-B', 'Set render border'] ],
136
137 "C":[ 
138 ['C', 'Center view on cursor'] ,
139 ['C', 'Sequencer: Change images'] ,
140 ['C', 'IPO: Snap current frame to selected key'] ,
141 ['ALT-C', 'Convert menu'] ,
142 ['CTRL-C', 'Copy menu (Copy properties of active to selected objects)'] ,
143 ['SHIFT-C', 'Center and zoom view on selected objects']] ,
144
145 "D":[  
146 ['D', 'Set 3d draw mode'] ,
147 ['ALT-D', 'Create new instance of object'] ,
148 ['CTRL-D', 'Display alpha of image texture as wire'] ,
149 ['SHIFT-D', 'Create full copy of object'] ],
150
151 "E":[ 
152 ['E', 'Extrude'],
153 ['EX', 'Extrude along X axis'],
154 ['EY', 'Extrude along Y axis'],
155 ['EZ', 'Extrude along Z axis'],
156 ['ALT-E', 'Edit mode: exit edit mode'],] ,
157
158 "F":[ 
159 ['F', 'Edit mode: Make edge/face'] ,
160 ['F', 'Sequencer: Set Filter Y'] ,
161 ['F', 'Faceselect mode'] ,
162 ['ALT-F', 'Beautify fill'] ,
163 ['CTRL-F', 'Sort faces in Z direction'] ,
164 ['CTRL-F', 'Edit mode: Flip triangle edges'] ,
165 ['SHIFT-F', 'Edit mode: Fill with triangles']] ,
166
167 "G":[ 
168 ['G', 'Grab (move)'] ,
169 ['ALT-G', 'Clear location'] ,
170 ['SHIFT-ALT-G', 'Remove selected objects from group'] ,
171 ['CTRL-G', 'Add selected objects to group'] ,
172 ['SHIFT-G', 'Group menu'] ],
173
174 "H":[ 
175 ['H', 'Hide selected vertices/faces'] ,
176 ['H', 'Curves: Set handle type'] ,
177 ['ALT-H', 'Reveal vertices'] ,
178 ['CTRL-H', 'Curves: Automatic handle calculation'] ,
179 ['SHIFT-H', 'Hide deselected vertices'] ,
180 ['SHIFT-H', 'Curves: Set handle type']] ,
181
182 "I":[ 
183 ['I', 'Keyframe menu'] ],
184
185 "J":[ 
186 ['J', 'Mesh: Join all adjacent triangles to quads'] ,
187 ['J', 'Swap render page of render window'] ,
188 ['CTRL-J', 'Join selected objects'] ,
189 ['CTRL-J', 'Nurbs: Add segment'] ,
190 ['CTRL-J', 'IPO: Join keyframes menu'],
191 ['ALT-J', 'Edit Mode: convert quads to triangles']
192 ],
193
194 "K":[  
195 ['K', '3d window: Show keyframe positions'] ,
196 ['K', 'IPO: Show keyframe positions'] ,
197 ['K', 'Nurbs: Print knots'] ,
198 ['CTRL-K', 'Make skeleton from armature'] ,
199 ['SHIFT-K', 'Show and select all keyframes for object'] ,
200 ['SHIFT-K', 'Edit: Knife Mode select'],
201 ['SHIFT-K', 'Faceselect: Clear vertexcolours'],
202 ] ,
203
204 "L":[ 
205 ['L', 'Make local menu'] ,
206 ['L', 'Edit mode: Select linked vertices (near mouse pointer)'] ,
207 ['L', 'OOPS window: Select linked objects'] ,
208 ['CTRL-L', 'Make links menu'] ,
209 ['SHIFT-L', 'Select links menu'] ],
210
211 "M":[ 
212 ['M', 'Move object to different layer'] ,
213 ['M', 'Sequencer: Make meta strip (group) from selected strips'],
214 ['ALT-M', 'Edit Mode: Merge vertices'] ],
215
216 "N":[ 
217 ['N', 'Numeric input menu (Size/Rot/Loc)'] ,
218 ['N', 'OOPS window: Rename object/linked objects'] ,
219 ['CTRL-N', 'Armature: Recalculate bone roll angles'] ,
220 ['CTRL-N', 'Recalculate normals to outside'] ,
221 ['CTRL-ALT-N', 'Recalculate normals to inside'] ],
222
223 "O":[ 
224 ['O', 'Edit mode: Toggle proportional vertex editing'] ,
225 ['ALT-O', 'Clear object origin'] ,
226 ['CTRL-O', 'Revert current file to last saved'] ,
227 ['SHIFT-O', 'Proportional vertex edit mode: Toggle smooth/steep falloff'] ],
228
229 "P":[ 
230 ['P', 'Start realtime engine'] ,
231 ['P', 'Edit mode: Seperate vertices to new object'] ,
232 ['ALT-P', 'Clear parent relationship'] ,
233 ['CTRL-P', 'Make active object parent of selected object'] ,
234 ['CTRL-SHIFT-P', 'Make active object parent of selected object without inverse'] ,
235 ['CTRL-P', 'Edit mode: Make active vertex parent of selected object'] ],
236
237 "Q":[['Q', 'Quit'] ],
238
239 "R":[ 
240 ['R', 'Rotate'] ,
241 ['R', 'IPO: Record mouse movement as IPO curve'] ,
242 ['RX', 'Rotate around X axis'] ,
243 ['RXX', "Rotate around object's local X axis"] ,
244 ['RY', 'Rotate around Y axis'] ,
245 ['RYY', "Rotate around object's local Y axis"] ,
246 ['RZ', 'Rotate around Z axis'] ,
247 ['RZZ', "Rotate around object's local Z axis"] ,
248 ['ALT-R', 'Clear object rotation'] ,
249 ['SHIFT-R', 'Nurbs: Select row'], 
250 ['CTRL-R', 'Edit Mode: Knife, cut selected edges, accept left mouse/ cancel right mouse'],
251 ['SHIT-R', 'Edit Mode: loop Selection']],
252
253 "S":[ 
254 ['S', 'Scale'] ,
255 ['SX', 'Flip around X axis'] ,
256 ['SY', 'Flip around Y axis'] ,
257 ['SZ', 'Flip around Z axis'] ,
258 ['SXX', 'Flip around X axis and show axis'] ,
259 ['SYY', 'Flip around Y axis and show axis'] ,
260 ['SZZ', 'Flip around Z axis and show axis'] ,
261 ['ALT-S', 'Edit mode: Shrink/fatten (Scale along vertex normals)'] ,
262 ['ALT-S', 'Clear object size'] ,
263 ['CTRL-S', 'Edit mode: Shear'] ,
264 ['SHIFT-S', 'Cursor/Grid snap menu'] ],
265
266 "T":[ 
267 ['T', 'Sequencer: Touch and print selected movies'] ,
268 ['T', 'Adjust texture space'] ,
269 ['T', 'Edit mode: Flip 3d curve'] ,
270 ['T', 'IPO: Change IPO type'] ,
271 ['ALT-T', 'Clear tracking of object'] ,
272 ['CTRL-T', 'Make selected object track active object'] ,
273 ['CTRL-T', 'Mesh: Convert to triangles'] ,
274 ['CTRL-ALT-T', 'Blenchmark'] ],
275
276 "U":[ 
277 ['U', 'Make single user menu'] ,
278 ['U', 'Edit mode: Reload object data from before entering edit mode'] ,
279 ['U', 'Faceselect mode: Automatic UV calculation menu'] ,
280 ['U', 'Vertex-/Weightpaint mode: Undo'] ,
281 ['CTRL-U', 'Save current state as user default'],
282 ['SHIFT-U', 'EditMode : Redo Menu'],
283 ['ALT-U', 'Edit Mode: Undo Menu']
284  ],
285
286 "V":[ 
287 ['V', 'Curves/Nurbs: Vector handle'] ,
288 ['V', 'Vertexpaint mode'] ,
289 ['ALT-V', "Scale object to match image texture's aspect ratio"] ,
290 ['SHIFT-V', 'Edit mode: Align view to selected vertices'] ],
291
292 "W":[ 
293 ['W', 'Boolean operations menu'] ,
294 ['W', 'Edit mode: Specials menu'] ,
295 ['CTRL-W', 'Save current file'] ,
296 ['CTRL-W', 'Nurbs: Switch direction'] ,
297 ['SHIFT-W', 'Warp/bend selected vertices around cursor'] ] ,
298
299 "X":[ 
300 ['X', 'Delete menu'] ,
301 ['CTRL-X', 'Restore default state (Erase all)'] ],
302
303 "Y":[ 
304 ['Y', 'Mesh: Split selected vertices/faces from the rest'] ],
305
306 "Z":[ 
307 ['Z', 'Switch 3d draw type : solide/ wireframe (see also D)'],
308 ['Alt-Z', 'Switch 3d draw type : solid / textured (see also D)'],
309 ['Shift-Z', 'Switch 3d draw type : shaded / wireframe (see also D)'],
310
311 ]}]}
312
313
314 for k in hotkeys.keys():
315    hotkeys[k].append(Create(0))
316
317 for k in hotkeys['Letters '][0]:
318    hotkeys['Letters '][0][k].append(Create(0))
319
320 hotL=hotkeys['Letters '][0].keys()
321 hotL.sort()
322
323 hot=hotkeys.keys()
324 hot.sort()
325
326 glCr=glRasterPos2d
327 glCl3=glColor3f
328 glCl4=glColor4f
329 glRct=glRectf
330
331 cf=[0.95,0.95,0.9,0.0]
332 c1=[0.95,0.95,0.9,0.0]
333 c=cf
334 r=[0,0,0,0]
335
336 def trace_rectangle4(r,c):
337     glCl4(c[0],c[1],c[2],c[3])
338     glRct(r[0],r[1],r[2],r[3])
339
340 def trace_rectangle3(r,c,c1):
341     glCl3(c[0],c[1],c[2])
342     glRct(r[0],r[1],r[2],r[3])
343     glCl3(c1[0],c1[1],c1[2])
344
345 def draw():
346     global r,c,c1,hotkeys, hot, hotL
347
348     size=Buffer(GL_FLOAT, 4)
349     glGetFloatv(GL_SCISSOR_BOX, size)
350     size= size.list
351
352     for s in [0,1,2,3]: size[s]=int(size[s])
353
354     c=[0.9,0.95,0.95,0.0]
355     c1=[0.95,0.95,0.9,0.0]
356
357     r=[0,size[3],size[2],0]
358     trace_rectangle4(r,c)
359
360     c=[0.7,0.7,0.9,0.0]
361     c1=[0.95,0.95,0.9,0.0]
362     
363     r=[0,size[3],size[2],size[3]-20]
364     trace_rectangle4(r,c)
365
366     c1=[0.7,0.7,0.9,0.0]
367     c=[0.2,0.2,0.4,0.0]
368     c2=[0.87,0.87,0.95,0.0]     
369
370     r=[0,size[3]-20,size[2],size[3]-44]
371     trace_rectangle4(r,c)
372
373     glColor3f(0.1, 0.1, 0.15)
374     glRasterPos2f(10, size[3]-16)
375
376     Text("HotKey")
377
378     l=0
379     listed=0
380     Llisted=0
381     for k in hot:             
382        hotkeys[k][-1]=Toggle(k, hot.index(k)+10, 4+(20*26)/6*hot.index(k), size[3]-(40), len(k)*8, 20, hotkeys[k][-1].val )
383        l+=len(k)
384        if hotkeys[k][-1].val==1.0:
385            listed=hot.index(k)
386            #print listed
387     l=0
388     if hot[listed]!='Letters ':
389        for n in  hotkeys[hot[listed]][:-1]:
390           if l%2==0:
391              r=[4,size[3]-(18*l+66),
392                      8+(21*26), size[3]-(46+18*l)]
393              trace_rectangle4(r,c2)
394           glColor3f(0.1, 0.1, 0.15)
395           glRasterPos2f(4+8, size[3]-(58+18*l))
396           Text(n[0])
397           glRasterPos2f(4+8*15, size[3]-(58+18*l))
398           Text('  : '+n[1]) 
399           l+=1
400     else:
401        for k in hotL:
402             pos=hotL.index(k)
403             hotkeys['Letters '][0][k][-1]=Toggle(k,pos+20,4+hotL.index(k)*21, size[3]-(52+18), 20, 20, hotkeys['Letters '][0][k][-1].val )
404             if hotkeys['Letters '][0][k][-1].val==1.0:
405                Llisted=pos
406        for n in hotkeys['Letters '][0][hotL[Llisted]][:-1]:
407           if l%2==0:
408              r=[4,size[3]-(18*l+92),
409                      8+(21*26), size[3]-(74+18*l)]
410              trace_rectangle4(r,c2)
411           glColor3f(0.1, 0.1, 0.15)  
412           glRasterPos2f(4+8, size[3]-(88+18*l))
413           Text(n[0])
414           glRasterPos2f(4+8*15, size[3]-(88+18*l))
415           Text('  : '+n[1]) 
416           l+=1
417
418 def event(evt, val):
419     global hotkeys     
420     if ((evt== QKEY or evt== ESCKEY) and not val): Exit()
421
422 def bevent(evt):
423     global hotkeysmhot, hotL
424     if   (evt== 1):
425         Exit()
426
427     elif (evt in range(10,20,1)):
428         for k in hot:
429            if hot.index(k)+10!=evt:
430                  hotkeys[k][-1].val=0
431                  
432         Blender.Window.Redraw()
433
434     elif (evt in range(20,46,1)):
435         for k in hotL:
436            if hotL.index(k)+20!=evt:
437                  hotkeys['Letters '][0][k][-1].val=0
438
439         Blender.Window.Redraw()
440
441 Register(draw, event, bevent)