#!BPY """ Name: 'Code Outline | Ctrl T' Blender: 246 Group: 'TextPlugin' Shortcut: 'Ctrl+T' Tooltip: 'Provides a menu for jumping to class and functions definitions.' """ # Only run if we have the required modules try: import bpy from BPyTextPlugin import * from Blender import Draw except ImportError: OK = False else: OK = True def make_menu(items, eventoffs): n = len(items) if n < 20: return [(items[i], i+1+eventoffs) for i in range(len(items))] letters = [] check = 'abcdefghijklmnopqrstuvwxyz_' # Names cannot start 0-9 for c in check: for item in items: if item[0].lower() == c: letters.append(c) break entries = {} i = 0 for item in items: i += 1 c = item[0].lower() entries.setdefault(c, []).append((item, i+eventoffs)) subs = [] for c in letters: subs.append((c, entries[c])) return subs def find_word(txt, word): i = 0 txt.reset() while True: try: line = txt.readline() except StopIteration: break c = line.find(word) if c != -1: txt.setCursorPos(i, c) break i += 1 def main(): txt = bpy.data.texts.active if not txt: return # Identify word under cursor if get_context(txt) == CTX_NORMAL: line, c = current_line(txt) start = c-1 end = c while start >= 0: if not line[start].lower() in 'abcdefghijklmnopqrstuvwxyz0123456789_': break start -= 1 while end < len(line): if not line[end].lower() in 'abcdefghijklmnopqrstuvwxyz0123456789_': break end += 1 word = line[start+1:end] if word in KEYWORDS: word = None else: word = None script = get_cached_descriptor(txt) items = [] desc = None tmp = script.classes.keys() tmp.sort(cmp = suggest_cmp) class_menu = make_menu(tmp, len(items)) class_menu_length = len(tmp) items.extend(tmp) tmp = script.defs.keys() tmp.sort(cmp = suggest_cmp) defs_menu = make_menu(tmp, len(items)) defs_menu_length = len(tmp) items.extend(tmp) tmp = script.vars.keys() tmp.sort(cmp = suggest_cmp) vars_menu = make_menu(tmp, len(items)) vars_menu_length = len(tmp) items.extend(tmp) menu = [('Script %t', 0), ('Classes', class_menu), ('Functions', defs_menu), ('Variables', vars_menu)] if word: menu.extend([None, ('Locate', [(word, -10)])]) i = Draw.PupTreeMenu(menu) if i == -1: return # Chosen to search for word under cursor if i == -10: if script.classes.has_key(word): desc = script.classes[word] elif script.defs.has_key(word): desc = script.defs[word] elif script.vars.has_key(word): desc = script.vars[word] else: find_word(txt, word) return else: i -= 1 if i < class_menu_length: desc = script.classes[items[i]] elif i < class_menu_length + defs_menu_length: desc = script.defs[items[i]] elif i < class_menu_length + defs_menu_length + vars_menu_length: desc = script.vars[items[i]] if desc: txt.setCursorPos(desc.lineno-1, 0) # Check we are running as a script and not imported as a module if __name__ == "__main__" and OK: main()