123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- # ##### BEGIN GPL LICENSE BLOCK #####
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software Foundation,
- # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- #
- # ##### END GPL LICENSE BLOCK #####
- # <pep8-80 compliant>
- import bpy
- from bpy.types import Header, Menu, Panel
- from bpy.app.translations import pgettext_iface as iface_
- class TEXT_HT_header(Header):
- bl_space_type = 'TEXT_EDITOR'
- def draw(self, context):
- layout = self.layout
- st = context.space_data
- text = st.text
- layout.template_header()
- TEXT_MT_editor_menus.draw_collapsible(context, layout)
- if text and text.is_modified:
- row = layout.row(align=True)
- row.alert = True
- row.operator("text.resolve_conflict", text="", icon='HELP')
- layout.separator_spacer()
- row = layout.row(align=True)
- row.template_ID(st, "text", new="text.new", unlink="text.unlink", open="text.open")
- layout.separator_spacer()
- row = layout.row(align=True)
- row.prop(st, "show_line_numbers", text="")
- row.prop(st, "show_word_wrap", text="")
- row.prop(st, "show_syntax_highlight", text="")
- if text:
- is_osl = text.name.endswith((".osl", ".osl"))
- row = layout.row()
- if is_osl:
- row = layout.row()
- row.operator("node.shader_script_update")
- else:
- row = layout.row()
- row.active = text.name.endswith(".py")
- row.prop(text, "use_module")
- row = layout.row()
- row.operator("text.run_script")
- class TEXT_HT_footer(Header):
- bl_space_type = 'TEXT_EDITOR'
- bl_region_type = 'FOOTER'
- def draw(self, context):
- layout = self.layout
- st = context.space_data
- text = st.text
- if text:
- row = layout.row()
- if text.filepath:
- if text.is_dirty:
- row.label(
- text=iface_(f"File: *{text.filepath:s} (unsaved)"),
- translate=False,
- )
- else:
- row.label(
- text=iface_(f"File: {text.filepath:s}"),
- translate=False,
- )
- else:
- row.label(
- text="Text: External"
- if text.library
- else "Text: Internal",
- )
- class TEXT_MT_editor_menus(Menu):
- bl_idname = "TEXT_MT_editor_menus"
- bl_label = ""
- def draw(self, context):
- layout = self.layout
- st = context.space_data
- text = st.text
- layout.menu("TEXT_MT_view")
- layout.menu("TEXT_MT_text")
- if text:
- layout.menu("TEXT_MT_edit")
- layout.menu("TEXT_MT_format")
- layout.menu("TEXT_MT_templates")
- class TEXT_PT_properties(Panel):
- bl_space_type = 'TEXT_EDITOR'
- bl_region_type = 'UI'
- bl_category = "Text"
- bl_label = "Properties"
- def draw(self, context):
- layout = self.layout
- st = context.space_data
- flow = layout.column_flow()
- flow.prop(st, "show_line_numbers")
- flow.prop(st, "show_word_wrap")
- flow.prop(st, "show_syntax_highlight")
- flow.prop(st, "show_line_highlight")
- flow.prop(st, "use_live_edit")
- flow = layout.column_flow()
- flow.prop(st, "font_size")
- flow.prop(st, "tab_width")
- text = st.text
- if text:
- flow.prop(text, "use_tabs_as_spaces")
- flow.prop(st, "show_margin")
- col = flow.column()
- col.active = st.show_margin
- col.prop(st, "margin_column")
- class TEXT_PT_find(Panel):
- bl_space_type = 'TEXT_EDITOR'
- bl_region_type = 'UI'
- bl_category = "Text"
- bl_label = "Find"
- def draw(self, context):
- layout = self.layout
- st = context.space_data
- # find
- col = layout.column(align=True)
- row = col.row(align=True)
- row.prop(st, "find_text", text="")
- row.operator("text.find_set_selected", text="", icon='TEXT')
- col.operator("text.find")
- # replace
- col = layout.column(align=True)
- row = col.row(align=True)
- row.prop(st, "replace_text", text="")
- row.operator("text.replace_set_selected", text="", icon='TEXT')
- col.operator("text.replace")
- # settings
- layout.prop(st, "use_match_case")
- row = layout.row(align=True)
- row.prop(st, "use_find_wrap", text="Wrap")
- row.prop(st, "use_find_all", text="All")
- class TEXT_MT_view(Menu):
- bl_label = "View"
- def draw(self, context):
- layout = self.layout
- st = context.space_data
- layout.prop(st, "show_region_ui")
- layout.separator()
- layout.operator("text.move",
- text="Top of File",
- ).type = 'FILE_TOP'
- layout.operator("text.move",
- text="Bottom of File",
- ).type = 'FILE_BOTTOM'
- layout.separator()
- layout.menu("INFO_MT_area")
- class TEXT_MT_text(Menu):
- bl_label = "Text"
- def draw(self, context):
- layout = self.layout
- st = context.space_data
- text = st.text
- layout.operator("text.new", text="New")
- layout.operator("text.open", text="Open...", icon='FILE_FOLDER')
- if text:
- layout.separator()
- layout.operator("text.reload")
- layout.separator()
- layout.operator("text.save", icon='FILE_TICK')
- layout.operator("text.save_as", text="Save As...")
- if text.filepath:
- layout.operator("text.make_internal")
- layout.separator()
- layout.operator("text.run_script")
- class TEXT_MT_templates_py(Menu):
- bl_label = "Python"
- def draw(self, _context):
- self.path_menu(
- bpy.utils.script_paths("templates_py"),
- "text.open",
- props_default={"internal": True},
- filter_ext=lambda ext: (ext.lower() == ".py")
- )
- class TEXT_MT_templates_osl(Menu):
- bl_label = "Open Shading Language"
- def draw(self, _context):
- self.path_menu(
- bpy.utils.script_paths("templates_osl"),
- "text.open",
- props_default={"internal": True},
- filter_ext=lambda ext: (ext.lower() == ".osl")
- )
- class TEXT_MT_templates(Menu):
- bl_label = "Templates"
- def draw(self, _context):
- layout = self.layout
- layout.menu("TEXT_MT_templates_py")
- layout.menu("TEXT_MT_templates_osl")
- class TEXT_MT_edit_select(Menu):
- bl_label = "Select"
- def draw(self, _context):
- layout = self.layout
- layout.operator("text.select_all")
- layout.operator("text.select_line")
- class TEXT_MT_format(Menu):
- bl_label = "Format"
- def draw(self, _context):
- layout = self.layout
- layout.operator("text.indent")
- layout.operator("text.unindent")
- layout.separator()
- layout.operator("text.comment")
- layout.operator("text.uncomment")
- layout.separator()
- layout.operator_menu_enum("text.convert_whitespace", "type")
- class TEXT_MT_edit_to3d(Menu):
- bl_label = "Text To 3D Object"
- def draw(self, _context):
- layout = self.layout
- layout.operator("text.to_3d_object",
- text="One Object",
- ).split_lines = False
- layout.operator("text.to_3d_object",
- text="One Object Per Line",
- ).split_lines = True
- class TEXT_MT_edit(Menu):
- bl_label = "Edit"
- @classmethod
- def poll(cls, context):
- return (context.space_data.text)
- def draw(self, _context):
- layout = self.layout
- layout.operator("ed.undo")
- layout.operator("ed.redo")
- layout.separator()
- layout.operator("text.cut")
- layout.operator("text.copy", icon='COPYDOWN')
- layout.operator("text.paste", icon='PASTEDOWN')
- layout.operator("text.duplicate_line")
- layout.separator()
- layout.operator("text.move_lines",
- text="Move line(s) up").direction = 'UP'
- layout.operator("text.move_lines",
- text="Move line(s) down").direction = 'DOWN'
- layout.separator()
- layout.menu("TEXT_MT_edit_select")
- layout.separator()
- layout.operator("text.jump")
- layout.operator("text.start_find", text="Find...")
- layout.operator("text.autocomplete")
- layout.separator()
- layout.menu("TEXT_MT_edit_to3d")
- class TEXT_MT_toolbox(Menu):
- bl_label = ""
- def draw(self, _context):
- layout = self.layout
- layout.operator_context = 'INVOKE_DEFAULT'
- layout.operator("text.cut")
- layout.operator("text.copy")
- layout.operator("text.paste")
- layout.separator()
- layout.operator("text.run_script")
- classes = (
- TEXT_HT_header,
- TEXT_HT_footer,
- TEXT_MT_edit,
- TEXT_MT_editor_menus,
- TEXT_PT_properties,
- TEXT_PT_find,
- TEXT_MT_view,
- TEXT_MT_text,
- TEXT_MT_templates,
- TEXT_MT_templates_py,
- TEXT_MT_templates_osl,
- TEXT_MT_edit_select,
- TEXT_MT_format,
- TEXT_MT_edit_to3d,
- TEXT_MT_toolbox,
- )
- if __name__ == "__main__": # only for live edit.
- from bpy.utils import register_class
- for cls in classes:
- register_class(cls)
|