diff options
Diffstat (limited to 'release/scripts/textplugin_membersuggest.py')
-rw-r--r-- | release/scripts/textplugin_membersuggest.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/release/scripts/textplugin_membersuggest.py b/release/scripts/textplugin_membersuggest.py new file mode 100644 index 00000000000..7c0de78b704 --- /dev/null +++ b/release/scripts/textplugin_membersuggest.py @@ -0,0 +1,90 @@ +#!BPY +""" +Name: 'Member Suggest | .' +Blender: 246 +Group: 'TextPlugin' +Shortcut: 'Period' +Tooltip: 'Lists members of the object preceding the cursor in the current text space' +""" + +# Only run if we have the required modules +try: + import bpy + from BPyTextPlugin import * +except ImportError: + OK = False +else: + OK = True + +def main(): + txt = bpy.data.texts.active + if not txt: + return + + (line, c) = current_line(txt) + + # Check we are in a normal context + if get_context(txt) != CTX_NORMAL: + return + + targets = get_targets(line, c) + + if targets[0] == '': # Check if we are looking at a constant [] {} '' etc. + i = c - len('.'.join(targets)) - 1 + if i >= 0: + if line[i] == '"' or line[i] == "'": + targets[0] = 'str' + elif line[i] == '}': + targets[0] = 'dict' + elif line[i] == ']': # Could be array elem x[y] or list [y] + i = line.rfind('[', 0, i) - 1 + while i >= 0: + if line[i].isalnum() or line[i] == '_': + break + elif line[i] != ' ' and line[i] != '\t': + i = -1 + break + i -= 1 + if i < 0: + targets[0] = 'list' + + obj = resolve_targets(txt, targets[:-1]) + if not obj: + return + + items = [] + + if isinstance(obj, VarDesc): + obj = obj.type + + if isinstance(obj, Definition): # Locally defined + if hasattr(obj, 'classes'): + items.extend([(s, 'f') for s in obj.classes.keys()]) + if hasattr(obj, 'defs'): + items.extend([(s, 'f') for s in obj.defs.keys()]) + if hasattr(obj, 'vars'): + items.extend([(s, 'v') for s in obj.vars.keys()]) + + else: # Otherwise we have an imported or builtin object + try: + attr = obj.__dict__.keys() + except AttributeError: + attr = dir(obj) + else: + if not attr: attr = dir(obj) + + for k in attr: + try: + v = getattr(obj, k) + except (AttributeError, TypeError): # Some attributes are not readable + pass + else: + items.append((k, type_char(v))) + + if items != []: + items.sort(cmp = suggest_cmp) + txt.suggest(items, targets[-1]) + +# Check we are running as a script and not imported as a module +if __name__ == "__main__" and OK: + main() |