forked from bartvdbraak/blender
d1d1d2b870
- Added a centralized function for resolving targets (aaa.bbb.ccc) - Added documentation support for locally defined classes and methods - The time taken to parse now dictates how long to use the cache before parsing again - Other tweaks and comments and support for numeric var types The text plugin scripts have been updated to make use of these features.
91 lines
2.0 KiB
Python
91 lines
2.0 KiB
Python
#!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()
|