1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
# SPDX-FileCopyrightText: 2009-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
from __future__ import annotations
import bpy
from bpy.types import Operator
from bpy.props import (
BoolProperty,
StringProperty,
)
from bpy.app.translations import contexts as i18n_contexts
def _lang_module_get(sc):
return __import__("console_" + sc.language,
# for python 3.3, maybe a bug???
level=0)
class ConsoleExec(Operator):
"""Execute the current console line as a Python expression"""
bl_idname = "console.execute"
bl_label = "Console Execute"
bl_options = {'UNDO_GROUPED'}
interactive: BoolProperty(
options={'SKIP_SAVE'},
)
@classmethod
def poll(cls, context):
return (context.area and context.area.type == 'CONSOLE')
def execute(self, context):
sc = context.space_data
module = _lang_module_get(sc)
execute = getattr(module, "execute", None)
if execute is not None:
return execute(context, self.interactive)
else:
print("Error: bpy.ops.console.execute_{:s} - not found".format(sc.language))
return {'FINISHED'}
class ConsoleAutocomplete(Operator):
"""Evaluate the namespace up until the cursor and give a list of """ \
"""options or complete the name if there is only one"""
bl_idname = "console.autocomplete"
bl_label = "Console Autocomplete"
@classmethod
def poll(cls, context):
return (context.area and context.area.type == 'CONSOLE')
def execute(self, context):
sc = context.space_data
module = _lang_module_get(sc)
autocomplete = getattr(module, "autocomplete", None)
if autocomplete:
return autocomplete(context)
else:
print("Error: bpy.ops.console.autocomplete_{:s} - not found".format(sc.language))
return {'FINISHED'}
class ConsoleCopyAsScript(Operator):
"""Copy the console contents for use in a script"""
bl_idname = "console.copy_as_script"
bl_label = "Copy to Clipboard (as Script)"
@classmethod
def poll(cls, context):
return (context.area and context.area.type == 'CONSOLE')
def execute(self, context):
sc = context.space_data
module = _lang_module_get(sc)
copy_as_script = getattr(module, "copy_as_script", None)
if copy_as_script:
return copy_as_script(context)
else:
print("Error: copy_as_script - not found for {!r}".format(sc.language))
return {'FINISHED'}
class ConsoleBanner(Operator):
"""Print a message when the terminal initializes"""
bl_idname = "console.banner"
bl_label = "Console Banner"
@classmethod
def poll(cls, context):
return (context.area and context.area.type == 'CONSOLE')
def execute(self, context):
sc = context.space_data
# default to python
if not sc.language:
sc.language = "python"
module = _lang_module_get(sc)
banner = getattr(module, "banner", None)
if banner:
return banner(context)
else:
print("Error: bpy.ops.console.banner_{:s} - not found".format(sc.language))
return {'FINISHED'}
class ConsoleLanguage(Operator):
"""Set the current language for this console"""
bl_idname = "console.language"
bl_label = "Console Language"
language: StringProperty(
name="Language",
translation_context=i18n_contexts.editor_python_console,
maxlen=32,
)
@classmethod
def poll(cls, context):
return (context.area and context.area.type == 'CONSOLE')
def execute(self, context):
sc = context.space_data
# default to python
sc.language = self.language
bpy.ops.console.banner()
# insert a new blank line
bpy.ops.console.history_append(text="", current_character=0, remove_duplicates=True)
return {'FINISHED'}
classes = (
ConsoleAutocomplete,
ConsoleBanner,
ConsoleCopyAsScript,
ConsoleExec,
ConsoleLanguage,
)
|