874101d1c798d66b1ee4f3638a88f58c37aa846a
[blender.git] / release / scripts / op / console_shell.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20 import sys
21 import os
22
23 import bpy
24
25
26 language_id = 'shell'
27
28 def add_scrollback(text, text_type):
29     for l in text.split('\n'):
30         bpy.ops.console.scrollback_append(text=l.replace('\t', '    '),
31             type=text_type)
32
33 def shell_run(text):
34     import subprocess
35     val, output= subprocess.getstatusoutput(text)
36
37     if not val:
38         style= 'OUTPUT'
39     else:
40         style= 'ERROR'
41
42     add_scrollback(output, style)
43
44
45 class ShellConsoleExec(bpy.types.Operator):
46     '''Execute the current console line as a python expression.'''
47     bl_idname = "console.execute_" + language_id
48     bl_label = "Console Execute"
49     bl_register = False
50
51     # Both prompts must be the same length
52     PROMPT = '$ '
53
54     # is this working???
55     '''
56     def poll(self, context):
57         return (context.space_data.type == 'PYTHON')
58     '''
59     # its not :|
60
61     def execute(self, context):
62         sc = context.space_data
63
64         try:
65             line = sc.history[-1].line
66         except:
67             return ('CANCELLED',)
68             
69         bpy.ops.console.scrollback_append(text=sc.prompt + line, type='INPUT')
70         
71         shell_run(line)
72         
73         # insert a new blank line
74         bpy.ops.console.history_append(text="", current_character=0,
75             remove_duplicates=True)
76
77         sc.prompt = os.getcwd()+ShellConsoleExec.PROMPT
78         return ('FINISHED',)
79
80
81 class ShellConsoleAutocomplete(bpy.types.Operator):
82     '''Evaluate the namespace up until the cursor and give a list of
83     options or complete the name if there is only one.'''
84     bl_idname = "console.autocomplete_" + language_id
85     bl_label = "Python Console Autocomplete"
86     bl_register = False
87
88     def poll(self, context):
89         return context.space_data.console_type == 'PYTHON'
90
91     def execute(self, context):
92         from console import intellisense
93
94         sc = context.space_data
95         
96         # TODO
97         return ('CANCELLED',)
98
99
100 class ShellConsoleBanner(bpy.types.Operator):
101     bl_idname = "console.banner_" + language_id
102
103     def execute(self, context):
104         sc = context.space_data
105         
106         shell_run("bash --version")
107         sc.prompt = os.getcwd()+ShellConsoleExec.PROMPT
108
109         return ('FINISHED',)
110
111 bpy.ops.add(ShellConsoleExec)
112 bpy.ops.add(ShellConsoleAutocomplete)
113 bpy.ops.add(ShellConsoleBanner)