diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-10-29 23:55:45 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-10-29 23:55:45 +0300 |
commit | 4b3fd4a8e05e49a9034e5ee789fcfef3961c19c5 (patch) | |
tree | 278aea66d1d901873a8e19f329f7a89c8a434d51 /release/scripts/ui/space_console.py | |
parent | 8c707b2a5f306f149bcd3057ab6fe91076c75dd8 (diff) |
replacement for my own autocomplete module by stani
--- from his patch
All the functionality is in the console
folder:
- intellisense.py: the central module which loads others on demand
- complete_namespace: more or less a replacement for the old autocomplete.py
- complete_import: module completion (I find this very handy, not just luxury)
These complete_* modules work very simple and should also work outside blender. You give some input and it returns a list with possible completions.
autocomplete.py is now deprecated.
Diffstat (limited to 'release/scripts/ui/space_console.py')
-rw-r--r-- | release/scripts/ui/space_console.py | 424 |
1 files changed, 212 insertions, 212 deletions
diff --git a/release/scripts/ui/space_console.py b/release/scripts/ui/space_console.py index 19024977992..d02577d93e6 100644 --- a/release/scripts/ui/space_console.py +++ b/release/scripts/ui/space_console.py @@ -1,235 +1,236 @@ +import sys import bpy + class CONSOLE_HT_header(bpy.types.Header): - __space_type__ = 'CONSOLE' - - def draw(self, context): - sc = context.space_data - # text = sc.text - layout = self.layout - - row= layout.row(align=True) - row.template_header() - - if context.area.show_menus: - sub = row.row(align=True) - - if sc.console_type == 'REPORT': - sub.itemM("CONSOLE_MT_report") - else: - sub.itemM("CONSOLE_MT_console") - - layout.itemS() - layout.itemR(sc, "console_type", expand=True) - - if sc.console_type == 'REPORT': - row = layout.row(align=True) - row.itemR(sc, "show_report_debug", text="Debug") - row.itemR(sc, "show_report_info", text="Info") - row.itemR(sc, "show_report_operator", text="Operators") - row.itemR(sc, "show_report_warn", text="Warnings") - row.itemR(sc, "show_report_error", text="Errors") - - row = layout.row() - row.enabled = sc.show_report_operator - row.itemO("console.report_replay") - else: - row = layout.row(align=True) - row.itemO("console.autocomplete", text="Autocomplete") + __space_type__ = 'CONSOLE' + + def draw(self, context): + sc = context.space_data + # text = sc.text + layout = self.layout + + row = layout.row(align=True) + row.template_header() + + if context.area.show_menus: + sub = row.row(align=True) + + if sc.console_type == 'REPORT': + sub.itemM("CONSOLE_MT_report") + else: + sub.itemM("CONSOLE_MT_console") + + layout.itemS() + layout.itemR(sc, "console_type", expand=True) + + if sc.console_type == 'REPORT': + row = layout.row(align=True) + row.itemR(sc, "show_report_debug", text="Debug") + row.itemR(sc, "show_report_info", text="Info") + row.itemR(sc, "show_report_operator", text="Operators") + row.itemR(sc, "show_report_warn", text="Warnings") + row.itemR(sc, "show_report_error", text="Errors") + + row = layout.row() + row.enabled = sc.show_report_operator + row.itemO("console.report_replay") + else: + row = layout.row(align=True) + row.itemO("console.autocomplete", text="Autocomplete") + class CONSOLE_MT_console(bpy.types.Menu): - __label__ = "Console" + __label__ = "Console" - def draw(self, context): - layout = self.layout - sc = context.space_data + def draw(self, context): + layout = self.layout + layout.column() + layout.itemO("console.clear") + layout.itemO("console.copy") + layout.itemO("console.paste") - layout.column() - layout.itemO("console.clear") - layout.itemO("console.copy") - layout.itemO("console.paste") class CONSOLE_MT_report(bpy.types.Menu): - __label__ = "Report" + __label__ = "Report" - def draw(self, context): - layout = self.layout - sc = context.space_data + def draw(self, context): + layout = self.layout + layout.column() + layout.itemO("console.select_all_toggle") + layout.itemO("console.select_border") + layout.itemO("console.report_delete") + layout.itemO("console.report_copy") - layout.column() - layout.itemO("console.select_all_toggle") - layout.itemO("console.select_border") - layout.itemO("console.report_delete") - layout.itemO("console.report_copy") def add_scrollback(text, text_type): - for l in text.split('\n'): - bpy.ops.console.scrollback_append(text=l.replace('\t', ' '), type=text_type) + for l in text.split('\n'): + bpy.ops.console.scrollback_append(text=l.replace('\t', ' '), + type=text_type) + def get_console(console_id): - ''' - helper function for console operators - currently each text datablock gets its own console - code.InteractiveConsole() - ...which is stored in this function. - - console_id can be any hashable type - ''' - import sys, code - - try: consoles = get_console.consoles - except:consoles = get_console.consoles = {} - - # clear all dead consoles, use text names as IDs - # TODO, find a way to clear IDs - ''' - for console_id in list(consoles.keys()): - if console_id not in bpy.data.texts: - del consoles[id] - ''' - - try: - namespace, console, stdout, stderr = consoles[console_id] - except: - namespace = {'__builtins__':__builtins__} # locals() - namespace['bpy'] = bpy - - console = code.InteractiveConsole(namespace) - - import io - stdout = io.StringIO() - stderr = io.StringIO() - - consoles[console_id]= namespace, console, stdout, stderr - - return namespace, console, stdout, stderr + ''' + helper function for console operators + currently each text datablock gets its own + console - bpython_code.InteractiveConsole() + ...which is stored in this function. + + console_id can be any hashable type + ''' + from code import InteractiveConsole + + try: + consoles = get_console.consoles + except: + consoles = get_console.consoles = {} + + # clear all dead consoles, use text names as IDs + # TODO, find a way to clear IDs + ''' + for console_id in list(consoles.keys()): + if console_id not in bpy.data.texts: + del consoles[id] + ''' + + try: + console, stdout, stderr = consoles[console_id] + except: + namespace = {'__builtins__': __builtins__, 'bpy': bpy} + console = InteractiveConsole(namespace) + + import io + stdout = io.StringIO() + stderr = io.StringIO() + + consoles[console_id] = console, stdout, stderr + + return console, stdout, stderr + class CONSOLE_OT_exec(bpy.types.Operator): - '''Execute the current console line as a python expression.''' - __idname__ = "console.execute" - __label__ = "Console Execute" - __register__ = False - - # Both prompts must be the same length - PROMPT = '>>> ' - PROMPT_MULTI = '... ' - - # is this working??? - ''' - def poll(self, context): - return (context.space_data.type == 'PYTHON') - ''' # its not :| - - def execute(self, context): - import sys - - sc = context.space_data - - try: - line = sc.history[-1].line - except: - return ('CANCELLED',) - - if sc.console_type != 'PYTHON': - return ('CANCELLED',) - - namespace, console, stdout, stderr = get_console(hash(context.region)) - namespace['C'] = context - - # redirect output - sys.stdout = stdout - sys.stderr = stderr - - # run the console - if not line.strip(): - line_exec = '\n' # executes a multiline statement - else: - line_exec = line - - is_multiline = console.push(line_exec) - - stdout.seek(0) - stderr.seek(0) - - output = stdout.read() - output_err = stderr.read() - - # cleanup - sys.stdout = sys.__stdout__ - sys.stderr = sys.__stderr__ - sys.last_traceback = None - - # So we can reuse, clear all data - stdout.truncate(0) - stderr.truncate(0) - - bpy.ops.console.scrollback_append(text = sc.prompt+line, type='INPUT') - - if is_multiline: sc.prompt = self.PROMPT_MULTI - else: sc.prompt = self.PROMPT - - # insert a new blank line - bpy.ops.console.history_append(text="", current_character=0, remove_duplicates= True) - - # Insert the output into the editor - # not quite correct because the order might have changed, but ok 99% of the time. - if output: add_scrollback(output, 'OUTPUT') - if output_err: add_scrollback(output_err, 'ERROR') - - - return ('FINISHED',) + '''Execute the current console line as a python expression.''' + __idname__ = "console.execute" + __label__ = "Console Execute" + __register__ = False + + # Both prompts must be the same length + PROMPT = '>>> ' + PROMPT_MULTI = '... ' + + # is this working??? + ''' + def poll(self, context): + return (context.space_data.type == 'PYTHON') + ''' + # its not :| + + def execute(self, context): + sc = context.space_data + + try: + line = sc.history[-1].line + except: + return ('CANCELLED',) + + if sc.console_type != 'PYTHON': + return ('CANCELLED',) + + console, stdout, stderr = get_console(hash(context.region)) + + # redirect output + sys.stdout = stdout + sys.stderr = stderr + + # run the console + if not line.strip(): + line_exec = '\n' # executes a multiline statement + else: + line_exec = line + + is_multiline = console.push(line_exec) + + stdout.seek(0) + stderr.seek(0) + + output = stdout.read() + output_err = stderr.read() + + # cleanup + sys.stdout = sys.__stdout__ + sys.stderr = sys.__stderr__ + sys.last_traceback = None + + # So we can reuse, clear all data + stdout.truncate(0) + stderr.truncate(0) + + bpy.ops.console.scrollback_append(text=sc.prompt + line, type='INPUT') + + if is_multiline: + sc.prompt = self.PROMPT_MULTI + else: + sc.prompt = self.PROMPT + + # insert a new blank line + bpy.ops.console.history_append(text="", current_character=0, + remove_duplicates=True) + + # Insert the output into the editor + # not quite correct because the order might have changed, + # but ok 99% of the time. + if output: + add_scrollback(output, 'OUTPUT') + if output_err: + add_scrollback(output_err, 'ERROR') + + return ('FINISHED',) class CONSOLE_OT_autocomplete(bpy.types.Operator): - '''Evaluate the namespace up until the cursor and give a list of options or complete the name if there is only one.''' - __idname__ = "console.autocomplete" - __label__ = "Console Autocomplete" - __register__ = False - - def poll(self, context): - return context.space_data.console_type == 'PYTHON' - - def execute(self, context): - - sc = context.space_data - - namespace, console, stdout, stderr = get_console(hash(context.region)) - - current_line = sc.history[-1] - line = current_line.line - - if not console: - return ('CANCELLED',) - - if sc.console_type != 'PYTHON': - return ('CANCELLED',) - - # fake cursor, use for autocomp func. - bcon = {} - bcon['cursor'] = current_line.current_character - bcon['console'] = console - bcon['edit_text'] = line - bcon['namespace'] = namespace - bcon['scrollback'] = '' # nor from the BGE console - - - # This function isnt aware of the text editor or being an operator - # just does the autocomp then copy its results back - import autocomplete - autocomplete.execute(bcon) - - # Now we need to copy back the line from blender back into the text editor. - # This will change when we dont use the text editor anymore - if bcon['scrollback']: - add_scrollback(bcon['scrollback'], 'INFO') - - # copy back - current_line.line = bcon['edit_text'] - current_line.current_character = bcon['cursor'] - - context.area.tag_redraw() - - return ('FINISHED',) + '''Evaluate the namespace up until the cursor and give a list of + options or complete the name if there is only one.''' + __idname__ = "console.autocomplete" + __label__ = "Console Autocomplete" + __register__ = False + def poll(self, context): + return context.space_data.console_type == 'PYTHON' + + def execute(self, context): + from console import intellisense + + sc = context.space_data + + console = get_console(hash(context.region))[0] + + current_line = sc.history[-1] + line = current_line.line + + if not console: + return ('CANCELLED',) + + if sc.console_type != 'PYTHON': + return ('CANCELLED',) + + # This function isnt aware of the text editor or being an operator + # just does the autocomp then copy its results back + current_line.line, current_line.current_character, scrollback = \ + intellisense.expand( + line=current_line.line, + cursor=current_line.current_character, + namespace=console.locals, + private='-d' in sys.argv) + + # Now we need to copy back the line from blender back into the + # text editor. This will change when we dont use the text editor + # anymore + if scrollback: + add_scrollback(scrollback, 'INFO') + + context.area.tag_redraw() + + return ('FINISHED',) bpy.types.register(CONSOLE_HT_header) @@ -238,4 +239,3 @@ bpy.types.register(CONSOLE_MT_report) bpy.ops.add(CONSOLE_OT_exec) bpy.ops.add(CONSOLE_OT_autocomplete) - |