#!BPY
""" Registration info for Blender menus:
Name: 'HotKeys'
Blender: 232
Group: 'Misc'
Tip: 'All the hotkeys.'
""" 

#------------------------
#  Hotkeys script
#         jm soler (2003)
# -----------------------
# Page officielle :
#   http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_hotkeyscript.htm
# Communiquer les problemes et les erreurs sur:
#   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#--------------------------------------------- 
# ce script est proposé sous licence GPL pour etre associe
# a la distribution de Blender 2.33 et suivant
#----------------------------------------------


import Blender
from Blender.Draw import *
from Blender.BGL import *

hotkeys={
'Speciales 1':[
[',', 'Fixe le pivot de rotation et d\échelle sur la Bounding Box'],
['.', 'Fixe le pivot de rotation et d\échelle sur le curseur 3D'] ,   
['ù', 'Affiche tous les calques'] ,
['Shift-ù', 'Affiche tous les calque ou le précédent'] ,
['TAB', 'Entrer/sortir du mode édition'] ,
['TAB', 'Mode édition & Edition des valeurs numériques : passe a la valeur suivante'],
['TAB', 'Sequencer: Edit meta strip'] ,
['CTRL-TAB', 'Armatures : Entre/sort du mode pose'],
['CTRL-ALT-clic droit','Mode Edit : Sélectionne un segment'],
['ALTgr-clic droit','Mode Edit : Sélectionne un segment']],

'Speciales 2':[
['F1', 'Ouvre le fichier'],
['F2', 'Sauve  le Fichier'],
['F3', 'Sauve l\'image'],
['F4', 'Fenetre Logic (pourrait changer)'],
['F5', 'Fenêtre Material (pourrait changer)'],
['F6', 'Fenêtre Texture'],
['F7', 'Fenêtre Object'],
['F8', 'Fenêtre World'],
['F9', 'Fenêtre du Mode Edition'],
['F10', 'Fenêtre de Rendu'],
['F11', 'Rappel la dernière image rendue'],
['F12', 'Effectue le rendu de la scène courante'],
['Shift-F1', 'Fenêtre de sélection de Libraries'],
['Shift-F4', 'Fenêtre d\'exploration/selection des données'],
['Shift-F5', 'Fenêtre 3D'],
['Shift-F6', 'Fenêtre IPO'],
['Shift-F8', 'Fenêtre du Sequencer Vidéo'],
['Shift-F9', 'Fenêtre OOP (Orienté Objet)'],
['Shift-F10', 'Fenêtre Image']
] ,

'Chiffres':[
['1..2..0-=', 'Montre le calque 1..2..12'] ,
['ALT-1..2..0', 'Montre le calque 11..12..20'] ,
['SHIFT-1..2..0-=', 'Active le calque 1..2..12'] ,
['SHIFT-ALT-...', 'Active le calque 11..12..20'] ],

'Clav. Num.':[
['Numpad DEL', 'Zoom sur l\'object'] ,
['Numpad /', 'Affiche l\'objet sélectionne en vue Locale (cache les autres)'] ,
['Numpad *', "Fait tourner l\'affichage en fonction des axes locaux de l\'objet courant"] ,
['Numpad +', 'Zoome avant (fonctionne partout)'] ,
['Numpad +', 'Proportional vertex edit mode: Augmente le niveau d\'influence'] ,
['Numpad -', 'Zoom arrière (Montre le calque)'] ,
['Numpad -', 'Proportional vertex edit mode: Diminue le niveau d\'influence'] ,
['Numpad INS', 'Passe la fenêtre 2D/3D en Vue Camera'] ,
['CTRL-Numpad INS', 'Transforme L\'objet actif en caméra'] ,
['ALT-Numbad INS', 'Restaure  l\'ancienne caméra (lui rend le focus en somme)'] ,
['Numpad 1', 'Vue de Face'] ,
['CTRL-Numpad 1', 'Vue arrière'] ,
['Numpad 3', 'Vue Cote Droit'] ,
['CTRL-Numpad 3', 'Vue cote Gauche'] ,
['Numpad 7', 'Vue du dessus'] ,
['CTRL-Numpad 7', 'Vue de dessous '] ,
['Numpad 5', 'Bascule vue orthogonale // vue en perspective '] ,
['Numpad 9', 'Vue Redraw '] ,
['Numpad 2', 'Rotation du point de vue sur la gauche'] ,
['Numpad 6', 'Rotation du point de vue sur la droite'] ,
['Numpad 8', 'Rotation du point de vue vers le haut'] ,
['Numpad 2', 'Rotation du point de vue vers le bas'] ],

'Fleches ':[
['PgUp', 'IPO: Sélectionne la prochaine clef d\'animation'] ,
['CTRL-PgUp', 'IPO: Sélectionne et saute a la clef d\'animation suivante'] ,
['PgDn', 'IPO: Sélectionne la precedente clef d\'animation'] ,
['CTRL-PgDn', 'IPO: Sélectionne et saute à la clef d\'aniamtion précédente'] ,
['LEFT', 'Recule d\'une image dans l\'animation'] ,
['RIGHT', 'Avance d\'une image dans l\'animation'] ,
['DOWN', 'Recule de 10 images dans l\'animation'] ,
['UP', 'Avance de 10 images dans l\'animation'] ],

'Lettres ':[ {"A":[ 
['A', 'Sélectionner tout/Désélectionner tout'] ,
['ALT-A', 'Animation de la fenêtre courante'] ,
['ALT-A', 'Fenêtre Text : Sélectionne tout le texte'],
['CTRL-A', "Appliquer les transformations size/rotation aux données de l\'objet"] ,
['SHIFT-A', 'Sequencer: Menu ADD '] ,
['SHIFT-ALT-A', 'Animation de toute les fenêtres'] ,
['SHIFT-CTRL-A', 'Application des modifications du lattice / Rend les dupliverts reels']] ,

"B":[ 
['B', 'Sélection par Bordure (boite) '] ,
['BB', 'Sélection par Cercle '] ,
['SHIFT-B', 'Définir une boite de sélection pour le rendu'],
['ALT-B','slectionne une série de segment en boucle. ']],

"C":[ 
['C', 'Centrer la vue sur le curseur 3D'] ,
['C', 'Sequencer: Changer les images'] ,
['C', 'IPO: Accroche la frame courante à la clef sélectionnée'] ,
['ALT-C', 'Menu Convert'] ,
['ALT-C', 'Fenêtre Text : Copier la sélection'],
['CTRL-SHIFT-C', 'Fenêtre Text : (B2.27, win32 uniquement) copie le texte sélectionné dans le presse papier'],
['CTRL-C', 'Menu Copy (Copie les propriétés  de l\'objet actif aux objets sélectionnes)'] ,
['SHIFT-C', 'Centrer et zoomer la vue sur les objets sélectionnes']] ,

"D":[  
['D', 'Menu 3D Draw Mode'] ,
['ALT-D', 'Crée une nouvelle instance d\'un objet'] ,
['CTRL-D', 'Affiche l\'alpha de la texture  image comme un wireframe'] ,
['SHIFT-D', 'Crée une compie complète de l\'objet'] ],

"E":[ 
['E', 'Extruder'],
['ALT-SHIFT-E', 'Fenêtre Text :Appelle le Menu Edition' ]] ,

"F":[ 
['F', 'Mode Edit : Construit un segment ou une face'] ,
['F', 'Sequencer: Active le Filtre Y'] ,
['F', 'Mode Faceselect '] ,
['ALT-F', 'Remplissage Amélioré (Beautify fill)'] ,
['ALT-F', 'Fenêtre Text : Trouver soit le texte entré dans la boite de dialogue ou le texte surligné ou recommencer la recherche'],
['ALT-SHIFT-F', 'Fenêtre Text : appelle le Menu Fichier '],
['CTRL-F', 'tri les faces en fonction de axe Z '] ,
['CTRL-F', 'Edit mode: Echange les segments du triangle'] ,
['SHIFT-F', 'Edit mode: Remplit avec des triangles']] ,

"G":[ 
['G', 'Grab (Déplace)'] ,
['ALT-G', 'Annule le déplacement'] ,
['SHIFT-ALT-G', 'Retire les objets sélectionnés du groupe'] ,
['CTRL-G', 'Ajoute les objets sélectionnés au groupe'] ,
['SHIFT-G', 'Menu Groupe'] ],

"H":[ 
['H', 'Mode Edition Mesh : Cache les sommets/faces sélectionnés'] ,
['H', 'Curves: Active le type handle (poignée)'] ,
['ALT-H', 'Mode Edition Mesh : Réaffiche les sommets'] ,
['CTRL-H', 'Curves: Calcul automatique des handles (poignée)'] ,
['SHIFT-H', 'Mode Edition Mesh : Cache les sommets non sélectionnés'] ,
['SHIFT-H', 'Curves: Etablit le type de gestion']] ,

"I":[ 
['I', 'Menu Clef d\'animation'] ],

"J":[ 
['J', 'Mesh: regroupe tous les triangles adjacents en quadrilatères'] ,
['J', 'Echange la page de rendu de la fenêtre de rendu'] ,
['CTRL-J', 'unit les objets sélectionnés'] ,
['CTRL-J', 'Nurbs: Ajoute un segment'] ,
['CTRL-J', 'IPO: unis le menu clef d\'animation'],
['ALT-J', 'Edit Mode: convertir les quads en triangles'],
['ALT-J', 'Fenêtre Text : Sauter à la ligne numéro ']],

"K":[  
['K', '3d window: Montre les positions des clefs d\'animation'] ,
['K', 'IPO: Montre les positions des clefs d\'animation'] ,
['K', 'Nurbs: imprime les divisions'] ,
['CTRL-K', 'Construit le squelette depuis l\'armature'] ,
['SHIFT-K', 'Montre et sélectionne toutes les clefs d\'animation pour l\'objet'] ,
['SHIFT-K', 'Edit: Mode de sélection du couteau'],
['SHIFT-K', 'Faceselect : Efface les couleurs des sommets'],
] ,

"L":[ 
['L', 'Menu Make local'] ,
['L', 'Edit mode: Sélectionne les points liés (à côté du pointeur de la souris)'] ,
['L', 'Fenêtre OOPS : Selectionne les objets liés'] ,
['CTRL-L', 'Menu Make Links (Construction des liens'] ,
['SHIFT-L', 'Menu Select links (sélectionne les liens)'] ],

"M":[ 
['M', 'Déplacer l\'objet vers un autre calque'] ,
['M', 'Sequencer: Construit un meta strip (groupe) à partir de strips sélectionnés'],
['ALT-M', 'Edit Mode: fusionne les sommets'],
['ALT-M', 'Fenêtre Text : (B2.27) Envoie le texte sélectionné dans le tampon de l\'objet Text'],
['CTRL-M', 'Mode Edit : (B2.32) selectionne tous les sommets situé sur le périmetre extérieur d\'un mesh'],
['CTRL-M', 'Mode Objet : (B2.33) permet de choisir la copie miroir suivant l\'axe voulu'],
],

"N":[ 
['N', 'Menu Entrée Numerique (Size/Rot/Loc)'] ,
['N', 'Fenêtre OOPS : Renomme un objet/objets liés'] ,
['CTRL-N', 'Armature: Recalcule les angles de rotation du bone'] ,
['CTRL-N', 'Recalcule les vecteurs normaux vers l\'extérieur'] ,
['CTRL-ALT-N', 'Recalcule les vecteurs normaux vers l\'intérieur'] ],

"O":[ 
['O', 'Edit mode: Active l\'outil d\'édition magnétique (proportional vertex editing)'] ,
['ALT-O', 'Efface l\'origine de l\'objet (retourne vers la position du parent direct)'] ,
['ALT-O', 'Fenêtre Text : Ouvrir un fchier'],
['CTRL-O', 'Reouvre le dernier fichier enregisté'] ,
['SHIFT-O', 'Proportional vertex edit mode: Active la courbe de pente d\'adoucie/pointue'] ],

"P":[ 
['P', 'Démarre le mode de jeu interactif'] ,
['P', 'Edit mode: Separe les sommets sélectionnés en un nouvel objet'] ,
['ALT-P', 'Efface la relation de parenté'] ,
['CTRL-P', 'Apparente l\'objet actif aux objets sélectionnés'] ,
['CTRL-SHIFT-P', 'Apparente l\'objet actif aux objets sélectionnés sans inverser la matrice'] ,
['CTRL-P', 'Edit mode: Apparente le sommet actif aux objets sélectionnés'] ],

"Q":[['Q', 'Quitter Blender(valable partout)'] ],

"R":[ 
['R', 'Rotation'] ,
['R', 'IPO: Enregistre les mouvements de la souris dans une courbe IPO'] ,
['RX', 'Rotation autour de l\'axe X '] ,
['RXX', "Rotation autour de l\'axe  X local"] ,
['RY', 'Rotation autour de l\'axe Y '] ,
['RYY', "Rotation autour de l\'axe Y local"] ,
['RZ', 'Rotation autour de l\'axe Z s'] ,
['RZZ', "Rotation autour de l\'axe Z local "] ,
['ALT-R', 'Efface la rotation de l\'objet'] ,
['SHIFT-R', 'Nurbs: Sélectionne le rang'], 
['CTRL-R', 'Edit Mode: Couteau, coupe les segmets sélectionnés, souris : accepté, bouton gauche/refusé, bouton droit'],
['SHIT-R', 'Edit Mode: Sélection de la boucle de faces adjacentes']],

"S":[ 
['S', 'Scale'] ,
['SX', 'Expansion autour de l\'axe X '] ,
['SY', 'Expansion autour de l\'axe  Y '] ,
['SZ', 'Expension autour de l\'axe  Z '] ,
['SXX', 'Expansion autour de l\'axe local X et affiche les axes'] ,
['SYY', 'Expansion autour de l\'axe local Y et affiche les axes'] ,
['SZZ', 'Expansion autour de l\'axe local Z et affiche les axes'] ,
['ALT-S', 'Edit mode: Ecrase ou grossi (mise à l\'échelle par rapport à la normale)'] ,
['ALT-S', 'Efface le size de l\'objet'] ,
['CTRL-S', 'Edit mode: Incline'] ,
['SHIFT-S', 'Menu Accroche au Curseur/à la Grille'] ],

"T":[ 
['T', 'Sequencer: Touch and print selected movies'] ,
['T', 'Adjuste l\'espace texture'] ,
['T', 'Mode Edition mode: Flip 3d curve'] ,
['T', 'IPO: Change le type IPO'] ,
['ALT-T', 'Efface le tracking de l\'object'] ,
['CTRL-T', 'Active le mode traque de l\'objet sélectionné vers l\'objet actif'] ,
['CTRL-T', 'Mesh: Convertir en triangles'] ,
['CTRL-ALT-T', 'Blenchmark'] ],

"U":[ 
['U', 'Menu trnasforme en utilisateur unique (Make single user)'] ,
['U', 'Mode Edition: Reload object data from before entering edit mode'] ,
['U', 'Mode Faceselect : Menu de calcul automatique des UV'] ,
['U', 'Mode Vertex-/Weightpaint Undo'] ,
['CTRL-U', 'Sauve les définitions courantes comme définitions par defaut'],
['SHIFT-U', 'EditMode : Menu Redo '],
['ALT-U', 'Edit Mode: Menu Undo ']
 ],

"V":[ 
['V', 'Curves/Nurbs: Vector handle'] ,
['V', 'Mode Vertexpaint'] ,
['ALT-V', "Agrandi l\'objet pour correspondre au rapport de proportion de la texture de l\'image"] ,
['SHIFT-V', 'Edit mode: Aligne la Vue sur les sommets sélectionnés'] ],

"W":[ 
['W', 'Menu Opérations Booléennes'] ,
['W', 'Edit mode: Menu Specials'] ,
['CTRL-W', 'Sauve le fichier courant'] ,
['CTRL-W', 'Nurbs: Bascule la direction'] ,
['SHIFT-W', 'Gauchi/courbe les sommets sélectionnés autour du curseur 3D'] ] ,

"X":[ 
['X', 'Menu Effacement (Delete)'] ,
['CTRL-X', 'Restaure les données par défaut (Efface tout)'] ],

"Y":[ 
['Y', 'Mesh: détache les sommets et les faces sélectionnées du reste du mesh'] ],

"Z":[ 
['Z', 'Bascule vers le mode 3d draw de type : solide/ wireframe (voir aussi D)'],
['Alt-Z', 'Bascule vers le mode 3d draw de type : : solid / textured (see also D)'],
['Shift-Z', 'Bascule vers le mode 3d draw de type : : shaded / wireframe (see also D)']
]}]}


for k in hotkeys.keys():
   hotkeys[k].append(Create(0))

for k in hotkeys['Lettres '][0]:
   hotkeys['Lettres '][0][k].append(Create(0))

hotL=hotkeys['Lettres '][0].keys()
hotL.sort()

hot=hotkeys.keys()
hot.sort()

glCr=glRasterPos2d
glCl3=glColor3f
glCl4=glColor4f
glRct=glRectf

cf=[0.95,0.95,0.9,0.0]
c1=[0.95,0.95,0.9,0.0]
c=cf
r=[0,0,0,0]

def trace_rectangle4(r,c):
    glCl4(c[0],c[1],c[2],c[3])
    glRct(r[0],r[1],r[2],r[3])

def trace_rectangle3(r,c,c1):
    glCl3(c[0],c[1],c[2])
    glRct(r[0],r[1],r[2],r[3])
    glCl3(c1[0],c1[1],c1[2])

def draw():
    global r,c,c1,hotkeys, hot, hotL

    size=Buffer(GL_FLOAT, 4)
    glGetFloatv(GL_SCISSOR_BOX, size)
    size= size.list

    for s in [0,1,2,3]: size[s]=int(size[s])
    
    c=[0.9,0.95,0.95,0.0]
    c1=[0.95,0.95,0.9,0.0]

    r=[0,size[3],size[2],0]
    trace_rectangle4(r,c)

    c=[0.7,0.7,0.9,0.0]
    c1=[0.95,0.95,0.9,0.0]
    
    r=[0,size[3],size[2],size[3]-20]
    trace_rectangle4(r,c)

    c1=[0.7,0.7,0.9,0.0]
    c=[0.2,0.2,0.4,0.0]
    c2=[0.87,0.87,0.95,0.0]     

    r=[0,size[3]-20,size[2],size[3]-44]
    trace_rectangle4(r,c)

    glColor3f(0.1, 0.1, 0.15)
    glRasterPos2f(10, size[3]-16)

    Text("HotKey")

    l=0
    listed=0
    Llisted=0
    for k in hot:             
       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 )
       l+=len(k)
       if hotkeys[k][-1].val==1.0:
           listed=hot.index(k)
           #print listed
    l=0
    if hot[listed]!='Lettres ':
       for n in  hotkeys[hot[listed]][:-1]:
          if l%2==0:
             r=[4,size[3]-(18*l+66),
                     8+(21*26), size[3]-(46+18*l)]
             trace_rectangle4(r,c2)
          glColor3f(0.1, 0.1, 0.15)
          glRasterPos2f(4+8, size[3]-(58+18*l))
          Text(n[0])
          glRasterPos2f(4+8*15, size[3]-(58+18*l))
          Text('  : '+n[1]) 
          l+=1
    else:
       for k in hotL:
            pos=hotL.index(k)
            hotkeys['Lettres '][0][k][-1]=Toggle(k,pos+20,4+hotL.index(k)*21, size[3]-(52+18), 20, 20, hotkeys['Lettres '][0][k][-1].val )
            if hotkeys['Lettres '][0][k][-1].val==1.0:
               Llisted=pos
       for n in hotkeys['Lettres '][0][hotL[Llisted]][:-1]:
          if l%2==0:
             r=[4,size[3]-(18*l+92),
                     8+(21*26), size[3]-(74+18*l)]
             trace_rectangle4(r,c2)
          glColor3f(0.1, 0.1, 0.15)  
          glRasterPos2f(4+8, size[3]-(88+18*l))
          Text(n[0])
          glRasterPos2f(4+8*15, size[3]-(88+18*l))
          Text('  : '+n[1]) 
          l+=1

def event(evt, val):
    global hotkeys     
    if (evt== QKEY and not val): Exit()

def bevent(evt):
    global hotkeysmhot, hotL
    if   (evt== 1):
        Exit()

    elif (evt in range(10,20,1)):
        for k in hot:
           if hot.index(k)+10!=evt:
                 hotkeys[k][-1].val=0
                 
        Blender.Window.Redraw()

    elif (evt in range(20,46,1)):
        for k in hotL:
           if hotL.index(k)+20!=evt:
                 hotkeys['Lettres '][0][k][-1].val=0

        Blender.Window.Redraw()

Register(draw, event, bevent)