Text plugin script updates: Better error handling, variable parsing, token caching...
[blender.git] / release / scripts / textplugin_membersuggest.py
1 #!BPY
2 """
3 Name: 'Member Suggest'
4 Blender: 246
5 Group: 'TextPlugin'
6 Shortcut: 'Period'
7 Tooltip: 'Lists members of the object preceding the cursor in the current text \
8 space'
9 """
10
11 # Only run if we have the required modules
12 try:
13         import bpy
14         from BPyTextPlugin import *
15         OK = True
16 except ImportError:
17         OK = False
18
19 def main():
20         txt = bpy.data.texts.active
21         (line, c) = current_line(txt)
22         
23         # Check we are in a normal context
24         if get_context(txt) != NORMAL:
25                 return
26         
27         pre = get_targets(line, c)
28         
29         if len(pre) <= 1:
30                 return
31         
32         list = []
33         
34         imports = get_imports(txt)
35         
36         # Identify the root (root.sub.sub.)
37         if imports.has_key(pre[0]):
38                 obj = imports[pre[0]]
39         else:
40                 return
41         
42         # Step through sub-attributes
43         try:
44                 for name in pre[1:-1]:
45                         obj = getattr(obj, name)
46         except AttributeError:
47                 print "Attribute not found '%s' in '%s'" % (name, '.'.join(pre))
48                 return
49         
50         try:
51                 attr = obj.__dict__.keys()
52         except AttributeError:
53                 attr = dir(obj)
54         
55         for k in attr:
56                 try:
57                         v = getattr(obj, k)
58                         if is_module(v): t = 'm'
59                         elif callable(v): t = 'f'
60                         else: t = 'v'
61                         list.append((k, t))
62                 except (AttributeError, TypeError): # Some attributes are not readable
63                         pass
64         
65         if list != []:
66                 list.sort(cmp = suggest_cmp)
67                 txt.suggest(list, pre[-1])
68
69 if OK:
70         main()