2023-08-16 00:20:26 +10:00
|
|
|
# SPDX-FileCopyrightText: 2009-2023 Blender Authors
|
2023-06-15 13:09:04 +10:00
|
|
|
#
|
2022-02-11 09:07:11 +11:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
2023-06-15 13:09:04 +10:00
|
|
|
|
2009-04-22 18:39:44 +00:00
|
|
|
import bpy
|
2011-08-12 06:57:00 +00:00
|
|
|
from bpy.types import Header, Menu, Panel
|
2022-08-22 14:30:32 +02:00
|
|
|
from bpy.app.translations import (
|
|
|
|
|
contexts as i18n_contexts,
|
|
|
|
|
pgettext_iface as iface_,
|
|
|
|
|
)
|
2013-02-10 09:09:26 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_HT_header(Header):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'TEXT_EDITOR'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
|
|
|
|
text = st.text
|
2020-01-23 14:53:19 +01:00
|
|
|
is_syntax_highlight_supported = st.is_syntax_highlight_supported()
|
2019-04-21 04:49:19 +10:00
|
|
|
layout.template_header()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
TEXT_MT_editor_menus.draw_collapsible(context, layout)
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2020-10-27 16:30:37 -07:00
|
|
|
layout.separator_spacer()
|
|
|
|
|
|
2010-08-18 07:14:10 +00:00
|
|
|
if text and text.is_modified:
|
2019-04-21 04:58:52 +10:00
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.alert = True
|
2020-10-27 16:30:37 -07:00
|
|
|
row.operator("text.resolve_conflict", text="", icon='QUESTION')
|
2010-06-11 14:10:02 +00:00
|
|
|
|
2018-06-28 08:27:03 +02:00
|
|
|
row = layout.row(align=True)
|
2024-03-15 10:04:03 +11:00
|
|
|
row.template_ID(st, "text", new="text.new", unlink="text.unlink", open="text.open")
|
2020-01-23 14:53:19 +01:00
|
|
|
|
|
|
|
|
if text:
|
2025-04-25 19:27:30 +02:00
|
|
|
is_osl = text.name.endswith((".osl", ".oso"))
|
2020-01-23 14:53:19 +01:00
|
|
|
if is_osl:
|
2025-04-25 19:27:30 +02:00
|
|
|
row.operator("text.update_shader", text="", icon='FILE_REFRESH')
|
2020-01-23 14:53:19 +01:00
|
|
|
else:
|
|
|
|
|
row = layout.row()
|
|
|
|
|
row.active = is_syntax_highlight_supported
|
|
|
|
|
row.operator("text.run_script", text="", icon='PLAY')
|
2018-06-28 08:27:03 +02:00
|
|
|
|
|
|
|
|
layout.separator_spacer()
|
2012-11-03 14:32:26 +00:00
|
|
|
|
2019-08-10 01:14:40 +10:00
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.prop(st, "show_line_numbers", text="")
|
|
|
|
|
row.prop(st, "show_word_wrap", text="")
|
2019-08-13 15:35:48 +02:00
|
|
|
|
|
|
|
|
syntax = row.row(align=True)
|
|
|
|
|
syntax.active = is_syntax_highlight_supported
|
|
|
|
|
syntax.prop(st, "show_syntax_highlight", text="")
|
2019-08-10 01:14:40 +10:00
|
|
|
|
2019-04-05 13:48:26 +02:00
|
|
|
|
|
|
|
|
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:
|
2009-10-31 19:31:45 +00:00
|
|
|
row = layout.row()
|
2010-06-02 17:58:28 +00:00
|
|
|
if text.filepath:
|
2010-08-18 07:14:10 +00:00
|
|
|
if text.is_dirty:
|
2018-06-28 08:30:54 +02:00
|
|
|
row.label(
|
2024-04-27 16:02:37 +10:00
|
|
|
text=iface_("File: *{:s} (unsaved)").format(text.filepath),
|
2018-06-28 08:30:54 +02:00
|
|
|
translate=False,
|
|
|
|
|
)
|
2009-10-31 19:31:45 +00:00
|
|
|
else:
|
2018-06-28 08:30:54 +02:00
|
|
|
row.label(
|
2024-04-27 16:02:37 +10:00
|
|
|
text=iface_("File: {:s}").format(text.filepath),
|
2018-06-28 08:30:54 +02:00
|
|
|
translate=False,
|
|
|
|
|
)
|
2009-10-31 19:31:45 +00:00
|
|
|
else:
|
2018-06-28 08:30:54 +02:00
|
|
|
row.label(
|
2019-08-02 15:36:58 +02:00
|
|
|
text=iface_("Text: External")
|
2018-06-28 08:30:54 +02:00
|
|
|
if text.library
|
2019-08-02 15:36:58 +02:00
|
|
|
else iface_("Text: Internal"),
|
2024-06-06 11:26:28 +10:00
|
|
|
translate=False,
|
2018-06-28 08:30:54 +02:00
|
|
|
)
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
class TEXT_MT_editor_menus(Menu):
|
|
|
|
|
bl_idname = "TEXT_MT_editor_menus"
|
|
|
|
|
bl_label = ""
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2018-12-20 12:02:21 +11:00
|
|
|
layout = self.layout
|
2014-01-27 18:38:53 +11:00
|
|
|
st = context.space_data
|
|
|
|
|
text = st.text
|
|
|
|
|
|
|
|
|
|
layout.menu("TEXT_MT_view")
|
|
|
|
|
layout.menu("TEXT_MT_text")
|
|
|
|
|
|
|
|
|
|
if text:
|
|
|
|
|
layout.menu("TEXT_MT_edit")
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.menu("TEXT_MT_select")
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("TEXT_MT_format")
|
|
|
|
|
|
|
|
|
|
layout.menu("TEXT_MT_templates")
|
|
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_PT_properties(Panel):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'TEXT_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
2018-11-21 21:41:00 +01:00
|
|
|
bl_category = "Text"
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Properties"
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-08-04 12:51:28 +02:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
2009-10-31 19:31:45 +00:00
|
|
|
st = context.space_data
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2019-08-04 12:51:28 +02:00
|
|
|
if not st.text:
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
layout.active = False
|
|
|
|
|
|
2019-08-04 12:51:28 +02:00
|
|
|
st = context.space_data
|
2009-10-31 19:31:45 +00:00
|
|
|
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
col = layout.column(align=False, heading="Margin")
|
|
|
|
|
row = col.row(align=True)
|
|
|
|
|
sub = row.row(align=True)
|
|
|
|
|
sub.prop(st, "show_margin", text="")
|
|
|
|
|
sub = sub.row(align=True)
|
|
|
|
|
sub.active = st.show_margin
|
|
|
|
|
sub.prop(st, "margin_column", text="")
|
|
|
|
|
|
|
|
|
|
layout.prop(st, "font_size")
|
|
|
|
|
layout.prop(st, "tab_width")
|
2010-01-20 17:41:41 +00:00
|
|
|
|
|
|
|
|
text = st.text
|
|
|
|
|
if text:
|
2019-08-04 12:51:28 +02:00
|
|
|
layout.prop(text, "indentation")
|
2011-02-18 13:57:54 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_PT_find(Panel):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'TEXT_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
2018-11-21 21:41:00 +01:00
|
|
|
bl_category = "Text"
|
2019-08-04 12:51:28 +02:00
|
|
|
bl_label = "Find & Replace"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
st = context.space_data
|
|
|
|
|
|
|
|
|
|
# find
|
2019-08-04 12:51:28 +02:00
|
|
|
col = layout.column()
|
2013-08-23 20:41:21 +00:00
|
|
|
row = col.row(align=True)
|
2019-08-04 12:51:28 +02:00
|
|
|
row.prop(st, "find_text", icon='VIEWZOOM', text="")
|
|
|
|
|
row.operator("text.find_set_selected", text="", icon='EYEDROPPER')
|
2009-11-23 00:27:30 +00:00
|
|
|
col.operator("text.find")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-08-04 12:51:28 +02:00
|
|
|
layout.separator()
|
|
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
# replace
|
2019-08-04 12:51:28 +02:00
|
|
|
col = layout.column()
|
2013-08-23 20:41:21 +00:00
|
|
|
row = col.row(align=True)
|
2019-08-04 12:51:28 +02:00
|
|
|
row.prop(st, "replace_text", icon='DECORATE_OVERRIDE', text="")
|
|
|
|
|
row.operator("text.replace_set_selected", text="", icon='EYEDROPPER')
|
2020-06-24 14:51:46 +10:00
|
|
|
|
|
|
|
|
row = col.row(align=True)
|
|
|
|
|
row.operator("text.replace")
|
2020-10-24 11:42:17 -07:00
|
|
|
row.operator("text.replace", text="Replace All").all = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-08-04 12:51:28 +02:00
|
|
|
layout.separator()
|
|
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
# settings
|
2024-09-13 16:30:06 +10:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
col = layout.column(heading="Search")
|
2019-08-04 12:51:28 +02:00
|
|
|
if not st.text:
|
2024-09-13 16:30:06 +10:00
|
|
|
col.active = False
|
2024-12-26 12:40:04 +01:00
|
|
|
col.prop(st, "use_match_case", text="Match Case")
|
|
|
|
|
col.prop(st, "use_find_wrap", text="Wrap Around")
|
2024-09-13 16:30:06 +10:00
|
|
|
col.prop(st, "use_find_all", text="All Data-Blocks")
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
class TEXT_MT_view_navigation(Menu):
|
|
|
|
|
bl_label = "Navigation"
|
|
|
|
|
|
2019-10-23 02:34:30 +11:00
|
|
|
def draw(self, _context):
|
2019-08-08 15:49:21 +10:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move", text="Top").type = 'FILE_TOP'
|
|
|
|
|
layout.operator("text.move", text="Bottom").type = 'FILE_BOTTOM'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move", text="Line Begin").type = 'LINE_BEGIN'
|
|
|
|
|
layout.operator("text.move", text="Line End").type = 'LINE_END'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move", text="Previous Line").type = 'PREVIOUS_LINE'
|
|
|
|
|
layout.operator("text.move", text="Next Line").type = 'NEXT_LINE'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move", text="Previous Word").type = 'PREVIOUS_WORD'
|
|
|
|
|
layout.operator("text.move", text="Next Word").type = 'NEXT_WORD'
|
|
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_MT_view(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "View"
|
2010-09-07 15:17:42 +00:00
|
|
|
|
2010-07-30 14:56:17 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2010-09-07 15:17:42 +00:00
|
|
|
|
2019-04-18 12:16:03 +02:00
|
|
|
st = context.space_data
|
|
|
|
|
|
|
|
|
|
layout.prop(st, "show_region_ui")
|
2013-01-15 23:15:32 +00:00
|
|
|
|
2010-08-03 22:41:01 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
2019-08-04 12:51:28 +02:00
|
|
|
layout.prop(st, "show_line_numbers")
|
|
|
|
|
layout.prop(st, "show_word_wrap")
|
2019-08-13 15:35:48 +02:00
|
|
|
syntax = layout.column()
|
|
|
|
|
syntax.active = st.is_syntax_highlight_supported()
|
|
|
|
|
syntax.prop(st, "show_syntax_highlight")
|
2019-08-04 12:51:28 +02:00
|
|
|
layout.prop(st, "show_line_highlight")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2023-06-02 15:23:52 +10:00
|
|
|
props = layout.operator("wm.context_cycle_int", text="Zoom In")
|
|
|
|
|
props.data_path = "space_data.font_size"
|
|
|
|
|
props.reverse = False
|
|
|
|
|
|
|
|
|
|
props = layout.operator("wm.context_cycle_int", text="Zoom Out")
|
|
|
|
|
props.data_path = "space_data.font_size"
|
|
|
|
|
props.reverse = True
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.menu("TEXT_MT_view_navigation")
|
2010-09-07 15:17:42 +00:00
|
|
|
|
2012-11-04 18:26:30 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
2018-05-24 18:35:19 +02:00
|
|
|
layout.menu("INFO_MT_area")
|
2012-11-04 18:26:30 +00:00
|
|
|
|
2010-09-07 15:17:42 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_MT_text(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Text"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
|
|
|
|
text = st.text
|
|
|
|
|
|
2024-03-15 10:04:03 +11:00
|
|
|
layout.operator("text.new", text="New", text_ctxt=i18n_contexts.id_text, icon='FILE_NEW')
|
2019-03-04 15:24:23 +01:00
|
|
|
layout.operator("text.open", text="Open...", icon='FILE_FOLDER')
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
if text:
|
2019-03-04 15:24:23 +01:00
|
|
|
layout.separator()
|
2023-05-25 16:25:46 -06:00
|
|
|
row = layout.row()
|
|
|
|
|
row.operator("text.reload")
|
|
|
|
|
row.enabled = not text.is_in_memory
|
|
|
|
|
|
|
|
|
|
row = layout.row()
|
2023-06-22 12:35:49 +10:00
|
|
|
row.operator("text.jump_to_file_at_point", text="Edit Externally")
|
2023-05-25 16:25:46 -06:00
|
|
|
row.enabled = (not text.is_in_memory and context.preferences.filepaths.text_editor != "")
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2019-03-04 15:24:23 +01:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("text.save", icon='FILE_TICK')
|
|
|
|
|
layout.operator("text.save_as", text="Save As...")
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2010-06-02 17:58:28 +00:00
|
|
|
if text.filepath:
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.separator()
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("text.make_internal")
|
2009-04-22 18:39:44 +00:00
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.separator()
|
2021-08-13 15:51:08 +10:00
|
|
|
layout.prop(text, "use_module")
|
2019-08-08 15:49:21 +10:00
|
|
|
|
|
|
|
|
layout.prop(st, "use_live_edit")
|
|
|
|
|
|
2019-03-04 15:24:23 +01:00
|
|
|
layout.separator()
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("text.run_script")
|
2009-04-22 18:39:44 +00:00
|
|
|
|
|
|
|
|
|
2012-12-30 01:39:55 +00:00
|
|
|
class TEXT_MT_templates_py(Menu):
|
|
|
|
|
bl_label = "Python"
|
|
|
|
|
|
2023-08-23 12:09:15 +02:00
|
|
|
def draw(self, _context):
|
2017-03-15 02:59:32 +11:00
|
|
|
self.path_menu(
|
PyAPI: use keyword only arguments
Use keyword only arguments for the following functions.
- addon_utils.module_bl_info 2nd arg `info_basis`.
- addon_utils.modules 1st `module_cache`, 2nd arg `refresh`.
- addon_utils.modules_refresh 1st arg `module_cache`.
- bl_app_template_utils.activate 1nd arg `template_id`.
- bl_app_template_utils.import_from_id 2nd arg `ignore_not_found`.
- bl_app_template_utils.import_from_path 2nd arg `ignore_not_found`.
- bl_keymap_utils.keymap_from_toolbar.generate 2nd & 3rd args `use_fallback_keys` & `use_reset`.
- bl_keymap_utils.platform_helpers.keyconfig_data_oskey_from_ctrl 2nd arg `filter_fn`.
- bl_ui_utils.bug_report_url.url_prefill_from_blender 1st arg `addon_info`.
- bmesh.types.BMFace.copy 1st & 2nd args `verts`, `edges`.
- bmesh.types.BMesh.calc_volume 1st arg `signed`.
- bmesh.types.BMesh.from_mesh 2nd..4th args `face_normals`, `use_shape_key`, `shape_key_index`.
- bmesh.types.BMesh.from_object 3rd & 4th args `cage`, `face_normals`.
- bmesh.types.BMesh.transform 2nd arg `filter`.
- bmesh.types.BMesh.update_edit_mesh 2nd & 3rd args `loop_triangles`, `destructive`.
- bmesh.types.{BMVertSeq,BMEdgeSeq,BMFaceSeq}.sort 1st & 2nd arg `key`, `reverse`.
- bmesh.utils.face_split 4th..6th args `coords`, `use_exist`, `example`.
- bpy.data.libraries.load 2nd..4th args `link`, `relative`, `assets_only`.
- bpy.data.user_map 1st..3rd args `subset`, `key_types, `value_types`.
- bpy.msgbus.subscribe_rna 5th arg `options`.
- bpy.path.abspath 2nd & 3rd args `start` & `library`.
- bpy.path.clean_name 2nd arg `replace`.
- bpy.path.ensure_ext 3rd arg `case_sensitive`.
- bpy.path.module_names 2nd arg `recursive`.
- bpy.path.relpath 2nd arg `start`.
- bpy.types.EditBone.transform 2nd & 3rd arg `scale`, `roll`.
- bpy.types.Operator.as_keywords 1st arg `ignore`.
- bpy.types.Struct.{keyframe_insert,keyframe_delete} 2nd..5th args `index`, `frame`, `group`, `options`.
- bpy.types.WindowManager.popup_menu 2nd & 3rd arg `title`, `icon`.
- bpy.types.WindowManager.popup_menu_pie 3rd & 4th arg `title`, `icon`.
- bpy.utils.app_template_paths 1st arg `subdir`.
- bpy.utils.app_template_paths 1st arg `subdir`.
- bpy.utils.blend_paths 1st..3rd args `absolute`, `packed`, `local`.
- bpy.utils.execfile 2nd arg `mod`.
- bpy.utils.keyconfig_set 2nd arg `report`.
- bpy.utils.load_scripts 1st & 2nd `reload_scripts` & `refresh_scripts`.
- bpy.utils.preset_find 3rd & 4th args `display_name`, `ext`.
- bpy.utils.resource_path 2nd & 3rd arg `major`, `minor`.
- bpy.utils.script_paths 1st..4th args `subdir`, `user_pref`, `check_all`, `use_user`.
- bpy.utils.smpte_from_frame 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.smpte_from_seconds 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.system_resource 2nd arg `subdir`.
- bpy.utils.time_from_frame 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.time_to_frame 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.units.to_string 4th..6th `precision`, `split_unit`, `compatible_unit`.
- bpy.utils.units.to_value 4th arg `str_ref_unit`.
- bpy.utils.user_resource 2nd & 3rd args `subdir`, `create`
- bpy_extras.view3d_utils.location_3d_to_region_2d 4th arg `default`.
- bpy_extras.view3d_utils.region_2d_to_origin_3d 4th arg `clamp`.
- gpu.offscreen.unbind 1st arg `restore`.
- gpu_extras.batch.batch_for_shader 4th arg `indices`.
- gpu_extras.batch.presets.draw_circle_2d 4th arg `segments`.
- gpu_extras.presets.draw_circle_2d 4th arg `segments`.
- imbuf.types.ImBuf.resize 2nd arg `resize`.
- imbuf.write 2nd arg `filepath`.
- mathutils.kdtree.KDTree.find 2nd arg `filter`.
- nodeitems_utils.NodeCategory 3rd & 4th arg `descriptions`, `items`.
- nodeitems_utils.NodeItem 2nd..4th args `label`, `settings`, `poll`.
- nodeitems_utils.NodeItemCustom 1st & 2nd arg `poll`, `draw`.
- rna_prop_ui.draw 5th arg `use_edit`.
- rna_prop_ui.rna_idprop_ui_get 2nd arg `create`.
- rna_prop_ui.rna_idprop_ui_prop_clear 3rd arg `remove`.
- rna_prop_ui.rna_idprop_ui_prop_get 3rd arg `create`.
- rna_xml.xml2rna 2nd arg `root_rna`.
- rna_xml.xml_file_write 4th arg `skip_typemap`.
2021-06-08 18:03:14 +10:00
|
|
|
bpy.utils.script_paths(subdir="templates_py"),
|
2017-03-15 02:59:32 +11:00
|
|
|
"text.open",
|
|
|
|
|
props_default={"internal": True},
|
2022-12-15 17:24:23 +11:00
|
|
|
filter_ext=lambda ext: (ext.lower() == ".py"),
|
2023-12-20 18:16:12 +01:00
|
|
|
translate=False,
|
2017-03-15 02:59:32 +11:00
|
|
|
)
|
2012-12-30 01:39:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class TEXT_MT_templates_osl(Menu):
|
|
|
|
|
bl_label = "Open Shading Language"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2017-03-15 02:59:32 +11:00
|
|
|
self.path_menu(
|
PyAPI: use keyword only arguments
Use keyword only arguments for the following functions.
- addon_utils.module_bl_info 2nd arg `info_basis`.
- addon_utils.modules 1st `module_cache`, 2nd arg `refresh`.
- addon_utils.modules_refresh 1st arg `module_cache`.
- bl_app_template_utils.activate 1nd arg `template_id`.
- bl_app_template_utils.import_from_id 2nd arg `ignore_not_found`.
- bl_app_template_utils.import_from_path 2nd arg `ignore_not_found`.
- bl_keymap_utils.keymap_from_toolbar.generate 2nd & 3rd args `use_fallback_keys` & `use_reset`.
- bl_keymap_utils.platform_helpers.keyconfig_data_oskey_from_ctrl 2nd arg `filter_fn`.
- bl_ui_utils.bug_report_url.url_prefill_from_blender 1st arg `addon_info`.
- bmesh.types.BMFace.copy 1st & 2nd args `verts`, `edges`.
- bmesh.types.BMesh.calc_volume 1st arg `signed`.
- bmesh.types.BMesh.from_mesh 2nd..4th args `face_normals`, `use_shape_key`, `shape_key_index`.
- bmesh.types.BMesh.from_object 3rd & 4th args `cage`, `face_normals`.
- bmesh.types.BMesh.transform 2nd arg `filter`.
- bmesh.types.BMesh.update_edit_mesh 2nd & 3rd args `loop_triangles`, `destructive`.
- bmesh.types.{BMVertSeq,BMEdgeSeq,BMFaceSeq}.sort 1st & 2nd arg `key`, `reverse`.
- bmesh.utils.face_split 4th..6th args `coords`, `use_exist`, `example`.
- bpy.data.libraries.load 2nd..4th args `link`, `relative`, `assets_only`.
- bpy.data.user_map 1st..3rd args `subset`, `key_types, `value_types`.
- bpy.msgbus.subscribe_rna 5th arg `options`.
- bpy.path.abspath 2nd & 3rd args `start` & `library`.
- bpy.path.clean_name 2nd arg `replace`.
- bpy.path.ensure_ext 3rd arg `case_sensitive`.
- bpy.path.module_names 2nd arg `recursive`.
- bpy.path.relpath 2nd arg `start`.
- bpy.types.EditBone.transform 2nd & 3rd arg `scale`, `roll`.
- bpy.types.Operator.as_keywords 1st arg `ignore`.
- bpy.types.Struct.{keyframe_insert,keyframe_delete} 2nd..5th args `index`, `frame`, `group`, `options`.
- bpy.types.WindowManager.popup_menu 2nd & 3rd arg `title`, `icon`.
- bpy.types.WindowManager.popup_menu_pie 3rd & 4th arg `title`, `icon`.
- bpy.utils.app_template_paths 1st arg `subdir`.
- bpy.utils.app_template_paths 1st arg `subdir`.
- bpy.utils.blend_paths 1st..3rd args `absolute`, `packed`, `local`.
- bpy.utils.execfile 2nd arg `mod`.
- bpy.utils.keyconfig_set 2nd arg `report`.
- bpy.utils.load_scripts 1st & 2nd `reload_scripts` & `refresh_scripts`.
- bpy.utils.preset_find 3rd & 4th args `display_name`, `ext`.
- bpy.utils.resource_path 2nd & 3rd arg `major`, `minor`.
- bpy.utils.script_paths 1st..4th args `subdir`, `user_pref`, `check_all`, `use_user`.
- bpy.utils.smpte_from_frame 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.smpte_from_seconds 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.system_resource 2nd arg `subdir`.
- bpy.utils.time_from_frame 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.time_to_frame 2nd & 3rd args `fps`, `fps_base`.
- bpy.utils.units.to_string 4th..6th `precision`, `split_unit`, `compatible_unit`.
- bpy.utils.units.to_value 4th arg `str_ref_unit`.
- bpy.utils.user_resource 2nd & 3rd args `subdir`, `create`
- bpy_extras.view3d_utils.location_3d_to_region_2d 4th arg `default`.
- bpy_extras.view3d_utils.region_2d_to_origin_3d 4th arg `clamp`.
- gpu.offscreen.unbind 1st arg `restore`.
- gpu_extras.batch.batch_for_shader 4th arg `indices`.
- gpu_extras.batch.presets.draw_circle_2d 4th arg `segments`.
- gpu_extras.presets.draw_circle_2d 4th arg `segments`.
- imbuf.types.ImBuf.resize 2nd arg `resize`.
- imbuf.write 2nd arg `filepath`.
- mathutils.kdtree.KDTree.find 2nd arg `filter`.
- nodeitems_utils.NodeCategory 3rd & 4th arg `descriptions`, `items`.
- nodeitems_utils.NodeItem 2nd..4th args `label`, `settings`, `poll`.
- nodeitems_utils.NodeItemCustom 1st & 2nd arg `poll`, `draw`.
- rna_prop_ui.draw 5th arg `use_edit`.
- rna_prop_ui.rna_idprop_ui_get 2nd arg `create`.
- rna_prop_ui.rna_idprop_ui_prop_clear 3rd arg `remove`.
- rna_prop_ui.rna_idprop_ui_prop_get 3rd arg `create`.
- rna_xml.xml2rna 2nd arg `root_rna`.
- rna_xml.xml_file_write 4th arg `skip_typemap`.
2021-06-08 18:03:14 +10:00
|
|
|
bpy.utils.script_paths(subdir="templates_osl"),
|
2017-03-15 02:59:32 +11:00
|
|
|
"text.open",
|
|
|
|
|
props_default={"internal": True},
|
2022-12-15 17:24:23 +11:00
|
|
|
filter_ext=lambda ext: (ext.lower() == ".osl"),
|
2017-03-15 02:59:32 +11:00
|
|
|
)
|
2009-10-29 11:26:44 +00:00
|
|
|
|
|
|
|
|
|
2012-12-30 01:39:55 +00:00
|
|
|
class TEXT_MT_templates(Menu):
|
|
|
|
|
bl_label = "Templates"
|
|
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2012-12-30 01:39:55 +00:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.menu("TEXT_MT_templates_py")
|
|
|
|
|
layout.menu("TEXT_MT_templates_osl")
|
2024-07-30 16:44:41 +02:00
|
|
|
# We only have one Blender Manifest template for now,
|
|
|
|
|
# better to show it on the top level.
|
|
|
|
|
layout.separator()
|
|
|
|
|
self.path_menu(
|
|
|
|
|
bpy.utils.script_paths(subdir="templates_toml"),
|
|
|
|
|
"text.open",
|
|
|
|
|
props_default={"internal": True},
|
|
|
|
|
filter_ext=lambda ext: (ext.lower() == ".toml"),
|
|
|
|
|
)
|
2012-12-30 01:39:55 +00:00
|
|
|
|
|
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
class TEXT_MT_select(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.select_all", text="All")
|
2025-06-28 17:06:15 +02:00
|
|
|
layout.operator("text.select_line", text="Line", text_ctxt=i18n_contexts.id_text)
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.select_word", text="Word")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move_select", text="Top").type = 'FILE_TOP'
|
|
|
|
|
layout.operator("text.move_select", text="Bottom").type = 'FILE_BOTTOM'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move_select", text="Line Begin").type = 'LINE_BEGIN'
|
|
|
|
|
layout.operator("text.move_select", text="Line End").type = 'LINE_END'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move_select", text="Previous Line").type = 'PREVIOUS_LINE'
|
|
|
|
|
layout.operator("text.move_select", text="Next Line").type = 'NEXT_LINE'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.move_select", text="Previous Word").type = 'PREVIOUS_WORD'
|
|
|
|
|
layout.operator("text.move_select", text="Next Word").type = 'NEXT_WORD'
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_MT_format(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Format"
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("text.indent")
|
|
|
|
|
layout.operator("text.unindent")
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2019-08-05 13:54:27 +10:00
|
|
|
layout.operator("text.comment_toggle")
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator_menu_enum("text.convert_whitespace", "type")
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_MT_edit_to3d(Menu):
|
2020-10-07 08:04:53 -05:00
|
|
|
bl_label = "Text to 3D Object"
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2024-04-30 12:46:05 +10:00
|
|
|
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
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class TEXT_MT_edit(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Edit"
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2019-08-05 12:47:55 +10:00
|
|
|
return context.space_data.text is not None
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2019-10-23 02:34:30 +11:00
|
|
|
def draw(self, _context):
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2025-10-05 23:06:33 +02:00
|
|
|
layout.operator("ed.undo", icon='LOOP_BACK')
|
|
|
|
|
layout.operator("ed.redo", icon='LOOP_FORWARDS')
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("text.cut")
|
2018-12-18 08:40:29 +11:00
|
|
|
layout.operator("text.copy", icon='COPYDOWN')
|
|
|
|
|
layout.operator("text.paste", icon='PASTEDOWN')
|
2012-04-29 18:53:43 +00:00
|
|
|
layout.operator("text.duplicate_line")
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.move_lines", text="Move Line(s) Up").direction = 'UP'
|
|
|
|
|
layout.operator("text.move_lines", text="Move Line(s) Down").direction = 'DOWN'
|
2012-05-04 14:27:13 +00:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.start_find", text="Find & Replace...")
|
2020-06-11 14:04:50 -04:00
|
|
|
layout.operator("text.find_set_selected")
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.jump", text="Jump To...")
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2012-12-31 15:11:36 +00:00
|
|
|
layout.operator("text.autocomplete")
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("TEXT_MT_edit_to3d")
|
2009-06-16 01:10:47 +00:00
|
|
|
|
2010-02-14 11:21:21 +00:00
|
|
|
|
2019-08-08 16:39:50 +10:00
|
|
|
class TEXT_MT_context_menu(Menu):
|
2010-05-12 08:03:36 +00:00
|
|
|
bl_label = ""
|
|
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2010-05-12 08:03:36 +00:00
|
|
|
layout = self.layout
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2010-05-13 01:46:48 +00:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2010-05-12 08:03:36 +00:00
|
|
|
|
|
|
|
|
layout.operator("text.cut")
|
2019-08-04 12:51:28 +02:00
|
|
|
layout.operator("text.copy", icon='COPYDOWN')
|
|
|
|
|
layout.operator("text.paste", icon='PASTEDOWN')
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.duplicate_line")
|
2010-05-12 08:03:36 +00:00
|
|
|
|
|
|
|
|
layout.separator()
|
2010-05-16 12:15:04 +00:00
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.move_lines", text="Move Line(s) Up").direction = 'UP'
|
|
|
|
|
layout.operator("text.move_lines", text="Move Line(s) Down").direction = 'DOWN'
|
2019-08-04 12:51:28 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.indent")
|
|
|
|
|
layout.operator("text.unindent")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-08-08 15:49:21 +10:00
|
|
|
layout.operator("text.comment_toggle")
|
2019-08-04 12:51:28 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("text.autocomplete")
|
2011-04-04 10:13:04 +00:00
|
|
|
|
2017-03-18 20:03:24 +11:00
|
|
|
|
|
|
|
|
classes = (
|
|
|
|
|
TEXT_HT_header,
|
2019-04-05 13:48:26 +02:00
|
|
|
TEXT_HT_footer,
|
2017-03-18 20:03:24 +11:00
|
|
|
TEXT_MT_edit,
|
|
|
|
|
TEXT_MT_editor_menus,
|
2017-03-20 02:34:32 +11:00
|
|
|
TEXT_PT_find,
|
2019-08-04 12:51:28 +02:00
|
|
|
TEXT_PT_properties,
|
2017-03-20 02:34:32 +11:00
|
|
|
TEXT_MT_view,
|
2019-08-08 15:49:21 +10:00
|
|
|
TEXT_MT_view_navigation,
|
2017-03-20 02:34:32 +11:00
|
|
|
TEXT_MT_text,
|
2017-03-18 20:03:24 +11:00
|
|
|
TEXT_MT_templates,
|
|
|
|
|
TEXT_MT_templates_py,
|
2017-03-20 02:34:32 +11:00
|
|
|
TEXT_MT_templates_osl,
|
2019-08-08 15:49:21 +10:00
|
|
|
TEXT_MT_select,
|
2017-03-20 02:34:32 +11:00
|
|
|
TEXT_MT_format,
|
|
|
|
|
TEXT_MT_edit_to3d,
|
2019-08-08 16:39:50 +10:00
|
|
|
TEXT_MT_context_menu,
|
2017-03-18 20:03:24 +11:00
|
|
|
)
|
|
|
|
|
|
2011-04-04 10:13:04 +00:00
|
|
|
if __name__ == "__main__": # only for live edit.
|
2017-03-18 20:03:24 +11:00
|
|
|
from bpy.utils import register_class
|
|
|
|
|
for cls in classes:
|
|
|
|
|
register_class(cls)
|