move script directories for internal blender scripts.
[blender.git] / release / scripts / startup / bl_ui / space_console.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20 import bpy
21 from bpy.props import StringProperty
22
23
24 class CONSOLE_HT_header(bpy.types.Header):
25     bl_space_type = 'CONSOLE'
26
27     def draw(self, context):
28         layout = self.layout
29
30         row = layout.row(align=True)
31         row.template_header()
32
33         if context.area.show_menus:
34             sub = row.row(align=True)
35             sub.menu("CONSOLE_MT_console")
36
37         row = layout.row(align=True)
38         row.operator("console.autocomplete", text="Autocomplete")
39
40
41 class CONSOLE_MT_console(bpy.types.Menu):
42     bl_label = "Console"
43
44     def draw(self, context):
45         layout = self.layout
46         layout.column()
47         layout.operator("console.clear")
48         layout.operator("console.copy")
49         layout.operator("console.paste")
50         layout.menu("CONSOLE_MT_language")
51
52         layout.separator()
53
54         layout.operator("screen.area_dupli")
55         layout.operator("screen.screen_full_area")
56
57
58 class CONSOLE_MT_language(bpy.types.Menu):
59     bl_label = "Languages..."
60
61     def draw(self, context):
62         import sys
63
64         layout = self.layout
65         layout.column()
66
67         # Collect modules with 'console_*.execute'
68         languages = []
69         for modname, mod in sys.modules.items():
70             if modname.startswith("console_") and hasattr(mod, "execute"):
71                 languages.append(modname.split('_', 1)[-1])
72
73         languages.sort()
74
75         for language in languages:
76             layout.operator("console.language", text=language[0].upper() + language[1:]).language = language
77
78
79 def add_scrollback(text, text_type):
80     for l in text.split('\n'):
81         bpy.ops.console.scrollback_append(text=l.replace('\t', '    '),
82             type=text_type)
83
84
85 class ConsoleExec(bpy.types.Operator):
86     '''Execute the current console line as a python expression'''
87     bl_idname = "console.execute"
88     bl_label = "Console Execute"
89
90     def execute(self, context):
91         sc = context.space_data
92
93         module = __import__("console_" + sc.language)
94         execute = getattr(module, "execute", None)
95
96         if execute:
97             return execute(context)
98         else:
99             print("Error: bpy.ops.console.execute_" + sc.language + " - not found")
100             return {'FINISHED'}
101
102
103 class ConsoleAutocomplete(bpy.types.Operator):
104     '''Evaluate the namespace up until the cursor and give a list of options or complete the name if there is only one'''
105     bl_idname = "console.autocomplete"
106     bl_label = "Console Autocomplete"
107
108     def execute(self, context):
109         sc = context.space_data
110         module = __import__("console_" + sc.language)
111         autocomplete = getattr(module, "autocomplete", None)
112
113         if autocomplete:
114             return autocomplete(context)
115         else:
116             print("Error: bpy.ops.console.autocomplete_" + sc.language + " - not found")
117             return {'FINISHED'}
118
119
120 class ConsoleBanner(bpy.types.Operator):
121     '''Print a message whem the terminal initializes'''
122     bl_idname = "console.banner"
123     bl_label = "Console Banner"
124
125     def execute(self, context):
126         sc = context.space_data
127
128         # default to python
129         if not sc.language:
130             sc.language = 'python'
131
132         module = __import__("console_" + sc.language)
133         banner = getattr(module, "banner", None)
134
135         if banner:
136             return banner(context)
137         else:
138             print("Error: bpy.ops.console.banner_" + sc.language + " - not found")
139             return {'FINISHED'}
140
141
142 class ConsoleLanguage(bpy.types.Operator):
143     '''Set the current language for this console'''
144     bl_idname = "console.language"
145     bl_label = "Console Language"
146     language = StringProperty(name="Language", maxlen=32, default="")
147
148     def execute(self, context):
149         sc = context.space_data
150
151         # defailt to python
152         sc.language = self.language
153
154         bpy.ops.console.banner()
155
156         # insert a new blank line
157         bpy.ops.console.history_append(text="", current_character=0,
158             remove_duplicates=True)
159
160         return {'FINISHED'}