Text plugin script updates: Better error handling, variable parsing, token caching...
[blender.git] / release / scripts / textplugin_suggest.py
1 #!BPY
2 """
3 Name: 'Suggest All'
4 Blender: 246
5 Group: 'TextPlugin'
6 Shortcut: 'Ctrl+Space'
7 Tooltip: 'Performs suggestions based on the context of the cursor'
8 """
9
10 # Only run if we have the required modules
11 try:
12         import bpy
13         from BPyTextPlugin import *
14         OK = True
15 except ImportError:
16         OK = False
17
18 def check_membersuggest(line, c):
19         pos = line.rfind('.', 0, c)
20         if pos == -1:
21                 return False
22         for s in line[pos+1:c]:
23                 if not s.isalnum() and not s == '_':
24                         return False
25         return True
26
27 def check_imports(line, c):
28         if line.rfind('import ', 0, c) == c-7:
29                 return True
30         if line.rfind('from ', 0, c) == c-5:
31                 return True
32         return False
33
34 def main():
35         txt = bpy.data.texts.active
36         (line, c) = current_line(txt)
37         
38         # Check we are in a normal context
39         if get_context(txt) != NORMAL:
40                 return
41         
42         # Check the character preceding the cursor and execute the corresponding script
43         
44         if check_membersuggest(line, c):
45                 import textplugin_membersuggest
46                 return
47         
48         elif check_imports(line, c):
49                 import textplugin_imports
50                 return
51         
52         # Otherwise we suggest globals, keywords, etc.
53         list = []
54         pre = get_targets(line, c)
55         
56         for k in KEYWORDS:
57                 list.append((k, 'k'))
58         
59         for k, v in get_builtins().items():
60                 list.append((k, type_char(v)))
61         
62         for k, v in get_imports(txt).items():
63                 list.append((k, type_char(v)))
64         
65         for k, v in get_defs(txt).items():
66                 list.append((k, 'f'))
67         
68         for k in get_vars(txt):
69                 list.append((k, 'v'))
70         
71         list.sort(cmp = suggest_cmp)
72         txt.suggest(list, pre[-1])
73
74 if OK:
75         main()