poll() as a python '@staticmethod' was too limiting and didnt allow useful base class...
[blender.git] / release / scripts / 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 *
22
23
24 class CONSOLE_HT_header(bpy.types.Header):
25     bl_space_type = 'CONSOLE'
26
27     def draw(self, context):
28         sc = context.space_data
29         # text = sc.text
30         layout = self.layout
31
32         row = layout.row(align=True)
33         row.template_header()
34
35         if context.area.show_menus:
36             sub = row.row(align=True)
37
38             if sc.console_type == 'REPORT':
39                 sub.menu("CONSOLE_MT_report")
40             else:
41                 sub.menu("CONSOLE_MT_console")
42
43         layout.separator()
44         layout.prop(sc, "console_type", expand=True)
45
46         if sc.console_type == 'REPORT':
47             row = layout.row(align=True)
48             row.prop(sc, "show_report_debug", text="Debug")
49             row.prop(sc, "show_report_info", text="Info")
50             row.prop(sc, "show_report_operator", text="Operators")
51             row.prop(sc, "show_report_warn", text="Warnings")
52             row.prop(sc, "show_report_error", text="Errors")
53
54             row = layout.row()
55             row.enabled = sc.show_report_operator
56             row.operator("console.report_replay")
57         else:
58             row = layout.row(align=True)
59             row.operator("console.autocomplete", text="Autocomplete")
60
61
62 class CONSOLE_MT_console(bpy.types.Menu):
63     bl_label = "Console"
64
65     def draw(self, context):
66         layout = self.layout
67         layout.column()
68         layout.operator("console.clear")
69         layout.operator("console.copy")
70         layout.operator("console.paste")
71         layout.menu("CONSOLE_MT_language")
72
73         layout.separator()
74
75         layout.operator("screen.area_dupli")
76         layout.operator("screen.screen_full_area")
77
78
79 class CONSOLE_MT_report(bpy.types.Menu):
80     bl_label = "Report"
81
82     def draw(self, context):
83         layout = self.layout
84         layout.column()
85         layout.operator("console.select_all_toggle")
86         layout.operator("console.select_border")
87         layout.operator("console.report_delete")
88         layout.operator("console.report_copy")
89
90
91 class CONSOLE_MT_language(bpy.types.Menu):
92     bl_label = "Languages..."
93
94     def draw(self, context):
95         import sys
96
97         layout = self.layout
98         layout.column()
99
100         # Collect modules with 'console_*.execute'
101         languages = []
102         for modname, mod in sys.modules.items():
103             if modname.startswith("console_") and hasattr(mod, "execute"):
104                 languages.append(modname.split('_', 1)[-1])
105
106         languages.sort()
107
108         for language in languages:
109             layout.operator("console.language", text=language[0].upper() + language[1:]).language = language
110
111
112 def add_scrollback(text, text_type):
113     for l in text.split('\n'):
114         bpy.ops.console.scrollback_append(text=l.replace('\t', '    '),
115             type=text_type)
116
117
118 class ConsoleExec(bpy.types.Operator):
119     '''Execute the current console line as a python expression'''
120     bl_idname = "console.execute"
121     bl_label = "Console Execute"
122
123     def execute(self, context):
124         sc = context.space_data
125
126         module = __import__("console_" + sc.language)
127         execute = getattr(module, "execute", None)
128
129         if execute:
130             return execute(context)
131         else:
132             print("Error: bpy.ops.console.execute_" + sc.language + " - not found")
133             return {'FINISHED'}
134
135
136 class ConsoleAutocomplete(bpy.types.Operator):
137     '''Evaluate the namespace up until the cursor and give a list of options or complete the name if there is only one'''
138     bl_idname = "console.autocomplete"
139     bl_label = "Console Autocomplete"
140
141     @classmethod
142     def poll(cls, context):
143         return context.space_data.console_type != 'REPORT'
144
145     def execute(self, context):
146         sc = context.space_data
147         module = __import__("console_" + sc.language)
148         autocomplete = getattr(module, "autocomplete", None)
149
150         if autocomplete:
151             return autocomplete(context)
152         else:
153             print("Error: bpy.ops.console.autocomplete_" + sc.language + " - not found")
154             return {'FINISHED'}
155
156
157 class ConsoleBanner(bpy.types.Operator):
158     '''Print a message whem the terminal initializes'''
159     bl_idname = "console.banner"
160     bl_label = "Console Banner"
161
162     def execute(self, context):
163         sc = context.space_data
164
165         # default to python
166         if not sc.language:
167             sc.language = 'python'
168
169         module = __import__("console_" + sc.language)
170         banner = getattr(module, "banner", None)
171
172         if banner:
173             return banner(context)
174         else:
175             print("Error: bpy.ops.console.banner_" + sc.language + " - not found")
176             return {'FINISHED'}
177
178
179 class ConsoleLanguage(bpy.types.Operator):
180     '''Set the current language for this console'''
181     bl_idname = "console.language"
182     bl_label = "Console Language"
183     language = StringProperty(name="Language", maxlen=32, default="")
184
185     def execute(self, context):
186         sc = context.space_data
187
188         # defailt to python
189         sc.language = self.properties.language
190
191         bpy.ops.console.banner()
192
193         # insert a new blank line
194         bpy.ops.console.history_append(text="", current_character=0,
195             remove_duplicates=True)
196
197         return {'FINISHED'}
198
199
200 def register():
201     pass
202
203
204 def unregister():
205     pass
206
207 if __name__ == "__main__":
208     register()