Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts')
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--release/scripts/modules/rna_prop_ui.py90
-rw-r--r--release/scripts/presets/interface_theme/Blender_Light.xml42
-rw-r--r--release/scripts/presets/keyconfig/Blender.py16
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py530
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py12
-rw-r--r--release/scripts/startup/bl_operators/spreadsheet.py13
-rw-r--r--release/scripts/startup/bl_operators/userpref.py8
-rw-r--r--release/scripts/startup/bl_operators/wm.py85
-rw-r--r--release/scripts/startup/bl_ui/properties_grease_pencil_common.py2
-rw-r--r--release/scripts/startup/bl_ui/space_filebrowser.py7
-rw-r--r--release/scripts/startup/bl_ui/space_sequencer.py264
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_toolbar.py2
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py12
-rw-r--r--release/scripts/startup/nodeitems_builtins.py65
16 files changed, 668 insertions, 480 deletions
diff --git a/release/scripts/addons b/release/scripts/addons
-Subproject e68c0118c13c3575e6096ad2dc7fb4434eadf38
+Subproject f2a08d80ccd3c13af304525778df3905f95bd44
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
-Subproject 42da56aa73726710107031787af5eea18679798
+Subproject 16467648282500cc229c271f62201ef897f2c2c
diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py
index 2cc806be10d..fce59a26c38 100644
--- a/release/scripts/modules/rna_prop_ui.py
+++ b/release/scripts/modules/rna_prop_ui.py
@@ -28,7 +28,7 @@ ARRAY_TYPES = (list, tuple, IDPropertyArray, Vector, bpy_prop_array)
# Maximum length of an array property for which a multi-line
# edit field will be displayed in the Custom Properties panel.
-MAX_DISPLAY_ROWS = 4
+MAX_DISPLAY_ROWS = 8
def rna_idprop_quote_path(prop):
@@ -134,18 +134,7 @@ def rna_idprop_ui_create(
def draw(layout, context, context_member, property_type, *, use_edit=True):
-
- def assign_props(prop, value, key):
- prop.data_path = context_member
- prop.property_name = key
-
- try:
- prop.value = str(value)
- except:
- pass
-
rna_item, context_member = rna_idprop_context_value(context, context_member, property_type)
-
# poll should really get this...
if not rna_item:
return
@@ -164,17 +153,15 @@ def draw(layout, context, context_member, property_type, *, use_edit=True):
# TODO: Allow/support adding new custom props to overrides.
if use_edit and not is_lib_override:
row = layout.row()
- props = row.operator("wm.properties_add", text="Add")
+ props = row.operator("wm.properties_add", text="New", icon='ADD')
props.data_path = context_member
del row
+ layout.separator()
show_developer_ui = context.preferences.view.show_developer_ui
rna_properties = {prop.identifier for prop in rna_item.bl_rna.properties if prop.is_runtime} if items else None
- layout.use_property_split = True
- layout.use_property_decorate = False # No animation.
-
- flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=True)
+ layout.use_property_decorate = False
for key, value in items:
is_rna = (key in rna_properties)
@@ -188,57 +175,50 @@ def draw(layout, context, context_member, property_type, *, use_edit=True):
if to_dict:
value = to_dict()
- val_draw = str(value)
elif to_list:
value = to_list()
- val_draw = str(value)
- else:
- val_draw = value
- row = layout.row(align=True)
- box = row.box()
+ split = layout.split(factor=0.4, align=True)
+ label_row = split.row()
+ label_row.alignment = 'RIGHT'
+ label_row.label(text=key, translate=False)
- if use_edit:
- split = box.split(factor=0.75)
- row = split.row()
- else:
- split = box.split(factor=1.00)
- row = split.row()
+ value_row = split.row(align=True)
+ value_column = value_row.column(align=True)
- row.alignment = 'RIGHT'
+ is_long_array = to_list and len(value) >= MAX_DISPLAY_ROWS
- row.label(text=key, translate=False)
+ if is_rna:
+ value_column.prop(rna_item, key, text="")
+ elif to_dict or is_long_array:
+ props = value_column.operator("wm.properties_edit_value", text="Edit Value")
+ props.data_path = context_member
+ props.property_name = key
+ else:
+ value_column.prop(rna_item, '["%s"]' % escape_identifier(key), text="")
- # Explicit exception for arrays.
- show_array_ui = to_list and not is_rna and 0 < len(value) <= MAX_DISPLAY_ROWS
+ operator_row = value_row.row()
- if show_array_ui and isinstance(value[0], (int, float)):
- row.prop(rna_item, '["%s"]' % escape_identifier(key), text="")
- elif to_dict or to_list:
- row.label(text=val_draw, translate=False)
- else:
- if is_rna:
- row.prop(rna_item, key, text="")
- else:
- row.prop(rna_item, '["%s"]' % escape_identifier(key), text="")
+ # Do not allow editing of overridden properties (we cannot use a poll function
+ # of the operators here since they's have no access to the specific property).
+ operator_row.enabled = not(is_lib_override and key in rna_item.id_data.override_library.reference)
if use_edit:
- row = split.row(align=True)
- # Do not allow editing of overridden properties (we cannot use a poll function
- # of the operators here since they's have no access to the specific property).
- row.enabled = not(is_lib_override and key in rna_item.id_data.override_library.reference)
if is_rna:
- row.label(text="API Defined")
+ operator_row.label(text="API Defined")
elif is_lib_override:
- row.label(text="Library Override")
+ operator_row.active = False
+ operator_row.label(text="", icon='DECORATE_LIBRARY_OVERRIDE')
else:
- props = row.operator("wm.properties_edit", text="Edit")
- assign_props(props, val_draw, key)
- props = row.operator("wm.properties_remove", text="", icon='REMOVE')
- assign_props(props, val_draw, key)
-
- del flow
-
+ props = operator_row.operator("wm.properties_edit", text="", icon='PREFERENCES', emboss=False)
+ props.data_path = context_member
+ props.property_name = key
+ props = operator_row.operator("wm.properties_remove", text="", icon='X', emboss=False)
+ props.data_path = context_member
+ props.property_name = key
+ else:
+ # Add some spacing, so the right side of the buttons line up with layouts with decorators.
+ operator_row.label(text="", icon='BLANK1')
class PropertyPanel:
"""
diff --git a/release/scripts/presets/interface_theme/Blender_Light.xml b/release/scripts/presets/interface_theme/Blender_Light.xml
index 8074371c450..e3ac77b008d 100644
--- a/release/scripts/presets/interface_theme/Blender_Light.xml
+++ b/release/scripts/presets/interface_theme/Blender_Light.xml
@@ -434,7 +434,7 @@
button="#99999900"
button_title="#1a1a1a"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#b3b3b3"
@@ -509,7 +509,7 @@
button="#999999e6"
button_title="#1a1a1a"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -555,7 +555,7 @@
button="#999999e6"
button_title="#1a1a1a"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#999999e6"
tab_active="#6697e6"
@@ -613,7 +613,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -688,7 +688,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -773,7 +773,7 @@
button="#99999900"
button_title="#1a1a1a"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#b3b3b3"
@@ -833,7 +833,7 @@
button="#99999900"
button_title="#1a1a1a"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#b3b3b3"
@@ -870,7 +870,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#656565ff"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -917,7 +917,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -939,7 +939,7 @@
</text_editor>
<node_editor>
<ThemeNodeEditor
- grid="#353535"
+ grid="#1B1B1B"
node_selected="#f15800"
node_active="#f15800"
wire="#191919"
@@ -955,7 +955,7 @@
matte_node="#977474"
distor_node="#749797"
noodle_curving="4"
- grid_levels="2"
+ grid_levels="7"
dash_alpha="0.5"
input_node="#cb3d4a"
output_node="#cb3d4a"
@@ -981,7 +981,7 @@
button="#99999900"
button_title="#1a1a1a"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#b3b3b3"
@@ -1032,7 +1032,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -1081,7 +1081,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -1115,7 +1115,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#b3b3b3ff"
execution_buts="#b3b3b3ff"
tab_active="#6697e6"
@@ -1156,7 +1156,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -1221,7 +1221,7 @@
button="#7272727f"
button_title="#000000"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#6697e6"
@@ -1263,8 +1263,8 @@
header_text_hi="#ffffff"
button="#2f303599"
button_title="#ffffff"
- button_text="#ffffff"
- button_text_hi="#ffffff"
+ button_text="#000000"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#446499"
@@ -1298,7 +1298,7 @@
button="#2f303500"
button_title="#ffffff"
button_text="#ffffff"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#00000000"
tab_active="#446499"
@@ -1334,7 +1334,7 @@
button="#999999e6"
button_title="#1a1a1a"
button_text="#000000"
- button_text_hi="#ffffff"
+ button_text_hi="#000000"
navigation_bar="#00000000"
execution_buts="#999999e6"
tab_active="#6697e6"
diff --git a/release/scripts/presets/keyconfig/Blender.py b/release/scripts/presets/keyconfig/Blender.py
index 1852e150589..35c920b3f40 100644
--- a/release/scripts/presets/keyconfig/Blender.py
+++ b/release/scripts/presets/keyconfig/Blender.py
@@ -56,7 +56,7 @@ class Prefs(bpy.types.KeyConfigPreferences):
update=update_fn,
)
tool_key_mode: EnumProperty(
- name="Tool Keys:",
+ name="Tool Keys",
description=(
"The method of keys to activate tools such as move, rotate & scale (G, R, S)"
),
@@ -242,13 +242,13 @@ class Prefs(bpy.types.KeyConfigPreferences):
# General settings.
col = layout.column()
- col.row().prop(self, "select_mouse", text="Select with Mouse Button:", expand=True)
- col.row().prop(self, "spacebar_action", text="Spacebar Action:", expand=True)
+ col.row().prop(self, "select_mouse", text="Select with Mouse Button", expand=True)
+ col.row().prop(self, "spacebar_action", text="Spacebar Action", expand=True)
if is_select_left:
- col.row().prop(self, "gizmo_action", text="Activate Gizmo Event:", expand=True)
+ col.row().prop(self, "gizmo_action", text="Activate Gizmo Event", expand=True)
else:
- col.row().prop(self, "rmb_action", text="Right Mouse Select Action:", expand=True)
+ col.row().prop(self, "rmb_action", text="Right Mouse Select Action", expand=True)
col.row().prop(self, "tool_key_mode", expand=True)
@@ -271,9 +271,9 @@ class Prefs(bpy.types.KeyConfigPreferences):
# 3DView settings.
col = layout.column()
col.label(text="3D View")
- col.row().prop(self, "v3d_tilde_action", text="Grave Accent / Tilde Action:", expand=True)
- col.row().prop(self, "v3d_mmb_action", text="Middle Mouse Action:", expand=True)
- col.row().prop(self, "v3d_alt_mmb_drag_action", text="Alt Middle Mouse Drag Action:", expand=True)
+ col.row().prop(self, "v3d_tilde_action", text="Grave Accent / Tilde Action", expand=True)
+ col.row().prop(self, "v3d_mmb_action", text="Middle Mouse Action", expand=True)
+ col.row().prop(self, "v3d_alt_mmb_drag_action", text="Alt Middle Mouse Drag Action", expand=True)
# Checkboxes sub-layout.
col = layout.column()
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index e70fe63677a..9f921bd2b70 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -208,7 +208,6 @@ class Params:
# ------------------------------------------------------------------------------
# Constants
-
# Physical layout.
NUMBERS_1 = ('ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'ZERO')
# Numeric order.
@@ -846,8 +845,156 @@ def km_user_interface(_params):
# ------------------------------------------------------------------------------
-# Editors
+# Shared Between Editors (Mask, Time-Line)
+def km_mask_editing(params):
+ items = []
+ keymap = (
+ "Mask Editing",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ if params.select_mouse == 'RIGHTMOUSE':
+ # mask.slide_point performs mostly the same function, so for the left
+ # click select keymap it's fine to have the context menu instead.
+ items.extend([
+ ("mask.select", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
+ {"properties": [("deselect_all", not params.legacy)]}),
+ ("transform.translate", {"type": 'EVT_TWEAK_R', "value": 'ANY'}, None),
+ ])
+
+ items.extend([
+ ("mask.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
+ op_menu("MASK_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
+ *_template_items_proportional_editing(
+ params, connected=False, toggle_data_path='tool_settings.use_proportional_edit_mask'),
+ ("mask.add_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.add_feather_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ ("mask.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("mask.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("mask.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("toggle", True)]}),
+ *_template_items_select_actions(params, "mask.select_all"),
+ ("mask.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS'},
+ {"properties": [("deselect", False)]}),
+ ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
+ {"properties": [("deselect", True)]}),
+ ("mask.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ ("mask.select_circle", {"type": 'C', "value": 'PRESS'}, None),
+ ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True},
+ {"properties": [("mode", 'ADD')]}),
+ ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
+ {"properties": [("mode", 'SUB')]}),
+ ("mask.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
+ ("mask.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
+ *_template_items_hide_reveal_actions("mask.hide_view_set", "mask.hide_view_clear"),
+ ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True}, None),
+ ("mask.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
+ ("mask.slide_point", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("mask.slide_spline_curvature", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ("mask.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
+ ("mask.normals_make_consistent",
+ {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True}, None),
+ ("mask.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
+ ("mask.shape_key_insert", {"type": 'I', "value": 'PRESS'}, None),
+ ("mask.shape_key_clear", {"type": 'I', "value": 'PRESS', "alt": True}, None),
+ ("mask.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("mask.copy_splines", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
+ ("mask.paste_splines", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
+ ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
+ ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
+ ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
+ ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
+ ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
+ ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
+ ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True},
+ {"properties": [("mode", 'MASK_SHRINKFATTEN')]}),
+ ])
+
+ # 3D cursor
+ if params.cursor_tweak_event:
+ items.extend([
+ ("uv.cursor_set", params.cursor_set_event, None),
+ ("transform.translate", params.cursor_tweak_event,
+ {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
+ ])
+ else:
+ items.extend([
+ ("uv.cursor_set", params.cursor_set_event, None),
+ ])
+
+ return keymap
+
+
+def km_markers(params):
+ items = []
+ keymap = (
+ "Markers",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
+ ("marker.move", {"type": params.select_tweak, "value": 'ANY'},
+ {"properties": [("tweak", True)]}),
+ ("marker.duplicate", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("extend", True)]}),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("camera", True)]}),
+ ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
+ {"properties": [("extend", True), ("camera", True)]}),
+ ("marker.select_box", {"type": params.select_tweak, "value": 'ANY'},
+ {"properties": [("tweak", True)]}),
+ ("marker.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ *_template_items_select_actions(params, "marker.select_all"),
+ ("marker.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("marker.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+ ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
+ ("marker.move", {"type": 'G', "value": 'PRESS'}, None),
+ ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ])
+
+ return keymap
+
+
+def km_time_scrub(_params):
+ items = []
+ keymap = (
+ "Time Scrub",
+ {"space_type": 'EMPTY', "region_type": 'WINDOW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("anim.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+def km_time_scrub_clip(_params):
+ items = []
+ keymap = (
+ "Clip Time Scrub",
+ {"space_type": 'CLIP_EDITOR', "region_type": 'PREVIEW'},
+ {"items": items},
+ )
+
+ items.extend([
+ ("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
+ ])
+
+ return keymap
+
+
+# ------------------------------------------------------------------------------
+# Editor (Property Editor)
def km_property_editor(_params):
items = []
@@ -894,6 +1041,9 @@ def km_property_editor(_params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Outliner)
+
def km_outliner(params):
items = []
keymap = (
@@ -983,6 +1133,9 @@ def km_outliner(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (UV Editor)
+
def km_uv_editor(params):
items = []
keymap = (
@@ -1114,6 +1267,9 @@ def km_uv_editor(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (3D View)
+
# 3D View: all regions.
def km_view3d_generic(_params):
items = []
@@ -1478,151 +1634,8 @@ def km_view3d(params):
return keymap
-def km_mask_editing(params):
- items = []
- keymap = (
- "Mask Editing",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items": items},
- )
-
- if params.select_mouse == 'RIGHTMOUSE':
- # mask.slide_point performs mostly the same function, so for the left
- # click select keymap it's fine to have the context menu instead.
- items.extend([
- ("mask.select", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
- {"properties": [("deselect_all", not params.legacy)]}),
- ("transform.translate", {"type": 'EVT_TWEAK_R', "value": 'ANY'}, None),
- ])
-
- items.extend([
- ("mask.new", {"type": 'N', "value": 'PRESS', "alt": True}, None),
- op_menu("MASK_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}),
- *_template_items_proportional_editing(
- params, connected=False, toggle_data_path='tool_settings.use_proportional_edit_mask'),
- ("mask.add_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
- ("mask.add_feather_vertex_slide", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
- ("mask.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("mask.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("mask.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
- {"properties": [("toggle", True)]}),
- *_template_items_select_actions(params, "mask.select_all"),
- ("mask.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
- ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS'},
- {"properties": [("deselect", False)]}),
- ("mask.select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
- {"properties": [("deselect", True)]}),
- ("mask.select_box", {"type": 'B', "value": 'PRESS'}, None),
- ("mask.select_circle", {"type": 'C', "value": 'PRESS'}, None),
- ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True},
- {"properties": [("mode", 'ADD')]}),
- ("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
- {"properties": [("mode", 'SUB')]}),
- ("mask.select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
- ("mask.select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
- *_template_items_hide_reveal_actions("mask.hide_view_set", "mask.hide_view_clear"),
- ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True}, None),
- ("mask.cyclic_toggle", {"type": 'C', "value": 'PRESS', "alt": True}, None),
- ("mask.slide_point", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("mask.slide_spline_curvature", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("mask.handle_type_set", {"type": 'V', "value": 'PRESS'}, None),
- ("mask.normals_make_consistent",
- {"type": 'N', "value": 'PRESS', "ctrl" if params.legacy else "shift": True}, None),
- ("mask.parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
- ("mask.parent_clear", {"type": 'P', "value": 'PRESS', "alt": True}, None),
- ("mask.shape_key_insert", {"type": 'I', "value": 'PRESS'}, None),
- ("mask.shape_key_clear", {"type": 'I', "value": 'PRESS', "alt": True}, None),
- ("mask.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("mask.copy_splines", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
- ("mask.paste_splines", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
- ("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
- ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
- ("transform.rotate", {"type": 'R', "value": 'PRESS'}, None),
- ("transform.resize", {"type": 'S', "value": 'PRESS'}, None),
- ("transform.tosphere", {"type": 'S', "value": 'PRESS', "shift": True, "alt": True}, None),
- ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
- ("transform.transform", {"type": 'S', "value": 'PRESS', "alt": True},
- {"properties": [("mode", 'MASK_SHRINKFATTEN')]}),
- ])
-
- # 3D cursor
- if params.cursor_tweak_event:
- items.extend([
- ("uv.cursor_set", params.cursor_set_event, None),
- ("transform.translate", params.cursor_tweak_event,
- {"properties": [("release_confirm", True), ("cursor_transform", True)]}),
- ])
- else:
- items.extend([
- ("uv.cursor_set", params.cursor_set_event, None),
- ])
-
- return keymap
-
-
-def km_markers(params):
- items = []
- keymap = (
- "Markers",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items": items},
- )
-
- items.extend([
- ("marker.add", {"type": 'M', "value": 'PRESS'}, None),
- ("marker.move", {"type": params.select_tweak, "value": 'ANY'},
- {"properties": [("tweak", True)]}),
- ("marker.duplicate", {"type": 'D', "value": 'PRESS', "shift": True}, None),
- ("marker.select", {"type": params.select_mouse, "value": 'PRESS'}, None),
- ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
- {"properties": [("extend", True)]}),
- ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "ctrl": True},
- {"properties": [("camera", True)]}),
- ("marker.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True, "ctrl": True},
- {"properties": [("extend", True), ("camera", True)]}),
- ("marker.select_box", {"type": params.select_tweak, "value": 'ANY'},
- {"properties": [("tweak", True)]}),
- ("marker.select_box", {"type": 'B', "value": 'PRESS'}, None),
- *_template_items_select_actions(params, "marker.select_all"),
- ("marker.delete", {"type": 'X', "value": 'PRESS'}, None),
- ("marker.delete", {"type": 'DEL', "value": 'PRESS'}, None),
- ("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ("marker.move", {"type": 'G', "value": 'PRESS'}, None),
- ("marker.camera_bind", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
- ])
-
- return keymap
-
-
-def km_time_scrub(_params):
- items = []
- keymap = (
- "Time Scrub",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items": items},
- )
-
- items.extend([
- ("anim.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ])
-
- return keymap
-
-
-def km_time_scrub_clip(_params):
- items = []
- keymap = (
- "Clip Time Scrub",
- {"space_type": 'CLIP_EDITOR', "region_type": 'PREVIEW'},
- {"items": items},
- )
-
- items.extend([
- ("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ])
-
- return keymap
-
+# ------------------------------------------------------------------------------
+# Editor (Graph Editor)
def km_graph_editor_generic(_params):
items = []
@@ -1637,7 +1650,7 @@ def km_graph_editor_generic(_params):
sidebar_key={"type": 'N', "value": 'PRESS'},
),
("graph.extrapolation_type", {"type": 'E', "value": 'PRESS', "shift": True}, None),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
*_template_items_hide_reveal_actions("graph.hide", "graph.reveal"),
("wm.context_set_enum", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
{"properties": [("data_path", 'area.type'), ("value", 'DOPESHEET_EDITOR')]}),
@@ -1777,6 +1790,9 @@ def km_graph_editor(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Image)
+
def km_image_generic(params):
items = []
keymap = (
@@ -1899,6 +1915,9 @@ def km_image(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Node)
+
def km_node_generic(_params):
items = []
keymap = (
@@ -2072,6 +2091,9 @@ def km_node_editor(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Info)
+
def km_info(params):
items = []
keymap = (
@@ -2098,6 +2120,9 @@ def km_info(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (File Browser)
+
def km_file_browser(params):
items = []
keymap = (
@@ -2115,7 +2140,9 @@ def km_file_browser(params):
("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
+ # The two refresh operators have polls excluding each other (so only one is available depending on context).
("file.refresh", {"type": 'R', "value": 'PRESS'}, None),
+ ("file.asset_library_refresh", {"type": 'R', "value": 'PRESS'}, None),
("file.parent", {"type": 'P', "value": 'PRESS'}, None),
("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None),
@@ -2165,7 +2192,7 @@ def km_file_browser_main(params):
if not params.use_file_single_click:
items.extend([
("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
- {"properties": [("open", True), ("deselect_all", not params.legacy)]}),
+ {"properties": [("open", True), ("deselect_all", not params.legacy)]}),
])
items.extend([
@@ -2248,6 +2275,9 @@ def km_file_browser_buttons(_params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Dope Sheet)
+
def km_dopesheet_generic(_params):
items = []
keymap = (
@@ -2359,7 +2389,7 @@ def km_dopesheet(params):
("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
("transform.transform", {"type": 'G', "value": 'PRESS'},
{"properties": [("mode", 'TIME_TRANSLATE')]}),
("transform.transform", {"type": params.select_tweak, "value": 'ANY'},
@@ -2382,6 +2412,9 @@ def km_dopesheet(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (NLA)
+
def km_nla_generic(_params):
items = []
keymap = (
@@ -2400,7 +2433,7 @@ def km_nla_generic(_params):
{"properties": [("isolate_action", True)]}),
("nla.tweakmode_exit", {"type": 'TAB', "value": 'PRESS', "shift": True},
{"properties": [("isolate_action", True)]}),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
])
return keymap
@@ -2511,6 +2544,9 @@ def km_nla_editor(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Text)
+
def km_text_generic(_params):
items = []
keymap = (
@@ -2672,6 +2708,9 @@ def km_text(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Sequencer)
+
def km_sequencercommon(params):
items = []
keymap = (
@@ -2831,7 +2870,10 @@ def km_sequencerpreview(params):
value=params.select_mouse_value_fallback,
legacy=params.legacy,
),
+ *_template_items_select_actions(params, "sequencer.select_all"),
+ ("sequencer.select_box", {"type": 'B', "value": 'PRESS'}, None),
+ # View.
("sequencer.view_all_preview", {"type": 'HOME', "value": 'PRESS'}, None),
("sequencer.view_all_preview", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
("sequencer.view_ghost_border", {"type": 'O', "value": 'PRESS'}, None),
@@ -2849,6 +2891,8 @@ def km_sequencerpreview(params):
{"properties": [("ratio", 0.25)]}),
("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'},
{"properties": [("ratio", 0.125)]}),
+
+ # Edit.
("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
op_tool_optional(
("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
@@ -2865,6 +2909,10 @@ def km_sequencerpreview(params):
{"properties": [("property", 'SCALE')]}),
("sequencer.strip_transform_clear", {"type": 'R', "alt": True, "value": 'PRESS'},
{"properties": [("property", 'ROTATION')]}),
+
+ ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None),
+ ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None),
+
*_template_items_context_menu("SEQUENCER_MT_preview_context_menu", params.context_menu_event),
])
@@ -2893,6 +2941,9 @@ def km_sequencerpreview(params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Console)
+
def km_console(_params):
items = []
keymap = (
@@ -2958,6 +3009,9 @@ def km_console(_params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Clip)
+
def km_clip(_params):
items = []
keymap = (
@@ -3187,6 +3241,9 @@ def km_clip_dopesheet_editor(_params):
return keymap
+# ------------------------------------------------------------------------------
+# Editor (Spreadsheet)
+
def km_spreadsheet_generic(_params):
items = []
keymap = (
@@ -3208,7 +3265,6 @@ def km_spreadsheet_generic(_params):
# ------------------------------------------------------------------------------
# Animation
-
def km_frames(params):
items = []
keymap = (
@@ -3328,7 +3384,7 @@ def km_animation_channels(params):
("anim.channel_select_keys", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True},
{"properties": [("extend", True)]}),
# Find (setting the name filter).
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
# Selection.
*_template_items_select_actions(params, "anim.channels_select_all"),
("anim.channels_select_box", {"type": 'B', "value": 'PRESS'}, None),
@@ -3372,8 +3428,7 @@ def km_animation_channels(params):
# ------------------------------------------------------------------------------
-# Modes
-
+# Object Modes
def km_grease_pencil(params):
items = []
@@ -4607,17 +4662,6 @@ def _template_view3d_select(*, type, value, legacy):
)]
-def _template_view3d_select_for_fallback(params, fallback):
- if (not fallback) and params.use_fallback_tool_rmb:
- # Needed so we have immediate select+tweak when the default select tool is active.
- return _template_view3d_select(
- type=params.select_mouse,
- value=params.select_mouse_value,
- legacy=params.legacy,
- )
- return []
-
-
def _template_view3d_gpencil_select(*, type, value, legacy, use_select_mouse=True):
return [
*([] if not use_select_mouse else [
@@ -4633,17 +4677,6 @@ def _template_view3d_gpencil_select(*, type, value, legacy, use_select_mouse=Tru
]
-def _template_view3d_gpencil_select_for_fallback(params, fallback):
- if (not fallback) and params.use_fallback_tool_rmb:
- # Needed so we have immediate select+tweak when the default select tool is active.
- return _template_view3d_gpencil_select(
- type=params.select_mouse,
- value=params.select_mouse_value,
- legacy=params.legacy,
- )
- return []
-
-
def _template_uv_select(*, type, value, legacy):
return [
("uv.select", {"type": type, "value": value},
@@ -4653,17 +4686,6 @@ def _template_uv_select(*, type, value, legacy):
]
-def _template_uv_select_for_fallback(params, fallback):
- if (not fallback) and params.use_fallback_tool_rmb:
- # Needed so we have immediate select+tweak when the default select tool is active.
- return _template_uv_select(
- type=params.select_mouse,
- value=params.select_mouse_value,
- legacy=params.legacy,
- )
- return []
-
-
def _template_sequencer_generic_select(*, type, value, legacy):
return [(
"sequencer.select",
@@ -4686,7 +4708,7 @@ def _template_sequencer_preview_select(*, type, value, legacy):
(("center",), ("ctrl",)),
# TODO:
# (("enumerate",), ("alt",)),
- (("toggle", "center"), ("shift", "ctrl")),
+ (("toggle", "center"), ("shift", "ctrl")),
# (("center", "enumerate"), ("ctrl", "alt")),
# (("toggle", "enumerate"), ("shift", "alt")),
# (("toggle", "center", "enumerate"), ("shift", "ctrl", "alt")),
@@ -4709,17 +4731,6 @@ def _template_sequencer_timeline_select(*, type, value, legacy):
)]
-def _template_sequencer_select_for_fallback(params, fallback):
- if (not fallback) and params.use_fallback_tool_rmb:
- # Needed so we have immediate select+tweak when the default select tool is active.
- return _template_sequencer_generic_select(
- type=params.select_mouse,
- value=params.select_mouse_value,
- legacy=params.legacy,
- )
- return []
-
-
def km_image_paint(params):
items = []
keymap = (
@@ -5486,7 +5497,6 @@ def km_object_non_modal(params):
# ------------------------------------------------------------------------------
# Modal Maps and Gizmos
-
def km_eyedropper_modal_map(_params):
items = []
keymap = (
@@ -6160,11 +6170,10 @@ def km_popup_toolbar(_params):
# ------------------------------------------------------------------------------
-# Tool System Keymaps
+# Tool System (Generic)
#
# Named are auto-generated based on the tool name and it's toolbar.
-
def km_generic_tool_annotate(params):
return (
"Generic Tool: Annotate",
@@ -6227,6 +6236,9 @@ def km_image_editor_tool_generic_sample(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (UV Editor)
+
def km_image_editor_tool_uv_cursor(params):
return (
"Image Editor Tool: Uv, Cursor",
@@ -6261,7 +6273,6 @@ def km_image_editor_tool_uv_select_box(params, *, fallback):
"uv.select_box",
# Don't use `tool_maybe_tweak_event`, see comment for this slot.
**(params.select_tweak_event if fallback else params.tool_tweak_event))),
- *_template_uv_select_for_fallback(params, fallback),
]},
)
@@ -6289,7 +6300,6 @@ def km_image_editor_tool_uv_select_lasso(params, *, fallback):
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
"uv.select_lasso",
**(params.select_tweak_event if fallback else params.tool_tweak_event))),
- *_template_uv_select_for_fallback(params, fallback),
]},
)
@@ -6357,6 +6367,9 @@ def km_image_editor_tool_uv_scale(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (Node Editor)
+
def km_node_editor_tool_select(params, *, fallback):
return (
_fallback_id("Node Tool: Tweak", fallback),
@@ -6377,7 +6390,8 @@ def km_node_editor_tool_select_box(params, *, fallback):
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
"node.select_box",
- type=params.tool_maybe_tweak, value=params.tool_maybe_tweak_value,
+ # Don't use `tool_maybe_tweak_event`, see comment for this slot.
+ **(params.select_tweak_event if fallback else params.tool_tweak_event),
properties=[("tweak", True)],
)),
]},
@@ -6390,7 +6404,7 @@ def km_node_editor_tool_select_lasso(params, *, fallback):
{"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
- "node.select_lasso", type=params.tool_mouse, value='PRESS',
+ "node.select_lasso", **(params.select_tweak_event if fallback else params.tool_tweak_event),
properties=[("tweak", True)]))
]},
)
@@ -6402,7 +6416,11 @@ def km_node_editor_tool_select_circle(params, *, fallback):
{"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
{"items": [
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple(
- "node.select_circle", type=params.tool_mouse, value='PRESS',
+ "node.select_circle",
+ # Why circle select should be used on tweak?
+ # So that RMB or Shift-RMB is still able to set an element as active.
+ type=params.select_tweak if fallback else params.tool_mouse,
+ value='ANY' if fallback else 'PRESS',
properties=[("wait_for_input", False)])),
]},
)
@@ -6418,6 +6436,9 @@ def km_node_editor_tool_links_cut(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Generic)
+
def km_3d_view_tool_cursor(params):
return (
"3D View Tool: Cursor",
@@ -6453,7 +6474,6 @@ def km_3d_view_tool_select_box(params, *, fallback):
"view3d.select_box",
# Don't use `tool_maybe_tweak_event`, see comment for this slot.
**(params.select_tweak_event if fallback else params.tool_tweak_event))),
- *_template_view3d_select_for_fallback(params, fallback),
]},
)
@@ -6470,7 +6490,6 @@ def km_3d_view_tool_select_circle(params, *, fallback):
type=params.select_tweak if fallback else params.tool_mouse,
value='ANY' if fallback else 'PRESS',
properties=[("wait_for_input", False)])),
- # No selection fallback since this operates on press.
]},
)
@@ -6483,7 +6502,6 @@ def km_3d_view_tool_select_lasso(params, *, fallback):
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions(
"view3d.select_lasso",
**(params.select_tweak_event if fallback else params.tool_tweak_event))),
- *_template_view3d_select_for_fallback(params, fallback),
]}
)
@@ -6564,6 +6582,9 @@ def km_3d_view_tool_measure(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Pose Mode)
+
def km_3d_view_tool_pose_breakdowner(params):
return (
"3D View Tool: Pose, Breakdowner",
@@ -6594,6 +6615,9 @@ def km_3d_view_tool_pose_relax(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Edit Armature)
+
def km_3d_view_tool_edit_armature_roll(params):
return (
"3D View Tool: Edit Armature, Roll",
@@ -6649,6 +6673,9 @@ def km_3d_view_tool_edit_armature_extrude_to_cursor(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Object Mode)
+
def km_3d_view_tool_interactive_add(params):
return (
"3D View Tool: Object, Add Primitive",
@@ -6665,6 +6692,9 @@ def km_3d_view_tool_interactive_add(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Edit Mesh)
+
def km_3d_view_tool_edit_mesh_extrude_region(params):
return (
"3D View Tool: Edit Mesh, Extrude Region",
@@ -6931,6 +6961,9 @@ def km_3d_view_tool_edit_mesh_rip_edge(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Edit Curve)
+
def km_3d_view_tool_edit_curve_draw(params):
return (
"3D View Tool: Edit Curve, Draw",
@@ -6998,6 +7031,9 @@ def km_3d_view_tool_edit_curve_extrude_to_cursor(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Sculpt)
+
def km_3d_view_tool_sculpt_box_hide(params):
return (
"3D View Tool: Sculpt, Box Hide",
@@ -7153,6 +7189,9 @@ def km_3d_view_tool_sculpt_face_set_edit(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Weight Paint)
+
def km_3d_view_tool_paint_weight_sample_weight(params):
return (
"3D View Tool: Paint Weight, Sample Weight",
@@ -7183,6 +7222,9 @@ def km_3d_view_tool_paint_weight_gradient(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Grease Pencil, Paint)
+
def km_3d_view_tool_paint_gpencil_line(params):
return (
"3D View Tool: Paint Gpencil, Line",
@@ -7317,6 +7359,9 @@ def km_3d_view_tool_paint_gpencil_interpolate(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Grease Pencil, Edit)
+
def km_3d_view_tool_edit_gpencil_select(params, *, fallback):
return (
_fallback_id("3D View Tool: Edit Gpencil, Tweak", fallback),
@@ -7339,7 +7384,6 @@ def km_3d_view_tool_edit_gpencil_select_box(params, *, fallback):
"gpencil.select_box",
# Don't use `tool_maybe_tweak_event`, see comment for this slot.
**(params.select_tweak_event if fallback else params.tool_tweak_event))),
- *_template_view3d_gpencil_select_for_fallback(params, fallback),
]},
)
@@ -7356,7 +7400,6 @@ def km_3d_view_tool_edit_gpencil_select_circle(params, *, fallback):
type=params.select_tweak if fallback else params.tool_mouse,
value='ANY' if fallback else 'PRESS',
properties=[("wait_for_input", False)])),
- # No selection fallback since this operates on press.
]},
)
@@ -7369,7 +7412,6 @@ def km_3d_view_tool_edit_gpencil_select_lasso(params, *, fallback):
*([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions(
"gpencil.select_lasso",
**(params.select_tweak_event if fallback else params.tool_tweak_event))),
- *_template_view3d_gpencil_select_for_fallback(params, fallback),
]}
)
@@ -7455,6 +7497,9 @@ def km_3d_view_tool_edit_gpencil_interpolate(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (3D View, Grease Pencil, Sculpt)
+
def km_3d_view_tool_sculpt_gpencil_select(params):
return (
"3D View Tool: Sculpt Gpencil, Tweak",
@@ -7490,24 +7535,26 @@ def km_3d_view_tool_sculpt_gpencil_select_lasso(params):
)
-def km_sequencer_editor_tool_select(params, *, fallback):
+# ------------------------------------------------------------------------------
+# Tool System (Sequencer, Generic)
+
+def km_sequencer_editor_tool_generic_select(params, *, fallback):
return (
_fallback_id("Sequencer Tool: Tweak", fallback),
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
{"items": [
- *([] if fallback else
- _template_items_tool_select(params, "sequencer.select", "sequencer.cursor_set", extend="toggle")
- ),
- *([] if (not params.use_fallback_tool_rmb) else _template_sequencer_generic_select(
- type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)),
+ *([] if fallback else _template_items_tool_select(
+ params, "sequencer.select", "sequencer.cursor_set", extend="toggle")),
+ *([] if (not params.use_fallback_tool_rmb) else _template_sequencer_preview_select(
+ type=params.select_mouse, value=params.select_mouse_value_fallback, legacy=params.legacy)),
# Ignored for preview.
*_template_items_change_frame(params),
]},
)
-def km_sequencer_editor_tool_select_box(params, *, fallback):
+def km_sequencer_editor_tool_generic_select_box(params, *, fallback):
return (
_fallback_id("Sequencer Tool: Select Box", fallback),
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
@@ -7517,7 +7564,6 @@ def km_sequencer_editor_tool_select_box(params, *, fallback):
"sequencer.select_box",
**(params.select_tweak_event if fallback else params.tool_tweak_event),
properties=[("tweak", params.select_mouse == 'LEFTMOUSE')])),
- *_template_sequencer_select_for_fallback(params, fallback),
# RMB select can already set the frame, match the tweak tool.
# Ignored for preview.
@@ -7527,17 +7573,7 @@ def km_sequencer_editor_tool_select_box(params, *, fallback):
)
-def km_sequencer_editor_tool_generic_sample(params):
- return (
- "Sequencer Tool: Sample",
- {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
- {"items": [
- ("sequencer.sample", {"type": params.tool_mouse, "value": 'PRESS'}, None),
- ]},
- )
-
-
-def km_sequencer_editor_tool_cursor(params):
+def km_sequencer_editor_tool_generic_cursor(params):
return (
"Sequencer Tool: Cursor",
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
@@ -7550,6 +7586,9 @@ def km_sequencer_editor_tool_cursor(params):
)
+# ------------------------------------------------------------------------------
+# Tool System (Sequencer, Timeline)
+
def km_sequencer_editor_tool_blade(_params):
return (
"Sequencer Tool: Blade",
@@ -7566,6 +7605,19 @@ def km_sequencer_editor_tool_blade(_params):
)
+# ------------------------------------------------------------------------------
+# Tool System (Sequencer, Preview)
+
+def km_sequencer_editor_tool_sample(params):
+ return (
+ "Sequencer Tool: Sample",
+ {"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
+ {"items": [
+ ("sequencer.sample", {"type": params.tool_mouse, "value": 'PRESS'}, None),
+ ]},
+ )
+
+
def km_sequencer_editor_tool_move(params):
return (
"Sequencer Tool: Move",
@@ -7848,14 +7900,14 @@ def generate_keymaps(params=None):
km_3d_view_tool_sculpt_gpencil_select_box(params),
km_3d_view_tool_sculpt_gpencil_select_circle(params),
km_3d_view_tool_sculpt_gpencil_select_lasso(params),
- *(km_sequencer_editor_tool_select(params, fallback=fallback) for fallback in (False, True)),
- *(km_sequencer_editor_tool_select_box(params, fallback=fallback) for fallback in (False, True)),
+ *(km_sequencer_editor_tool_generic_select(params, fallback=fallback) for fallback in (False, True)),
+ *(km_sequencer_editor_tool_generic_select_box(params, fallback=fallback) for fallback in (False, True)),
+ km_sequencer_editor_tool_generic_cursor(params),
km_sequencer_editor_tool_blade(params),
- km_sequencer_editor_tool_generic_sample(params),
- km_sequencer_editor_tool_cursor(params),
- km_sequencer_editor_tool_scale(params),
- km_sequencer_editor_tool_rotate(params),
+ km_sequencer_editor_tool_sample(params),
km_sequencer_editor_tool_move(params),
+ km_sequencer_editor_tool_rotate(params),
+ km_sequencer_editor_tool_scale(params),
]
# ------------------------------------------------------------------------------
diff --git a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
index 6baf0d569d6..0ae64dbc62e 100644
--- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
+++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
@@ -875,7 +875,7 @@ def km_graph_editor_generic(params):
items.extend([
op_panel("TOPBAR_PT_name", {"type": 'RET', "value": 'PRESS'}, [("keep_open", False)]),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
("graph.hide", {"type": 'H', "value": 'PRESS', "ctrl": True},
{"properties": [("unselected", False)]}),
("graph.hide", {"type": 'H', "value": 'PRESS', "shift": True},
@@ -1227,7 +1227,9 @@ def km_file_browser(params):
("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True}, None),
("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True}, None),
+ # The two refresh operators have polls excluding each other (so only one is available depending on context).
("file.refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
+ ("file.asset_library_refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None),
("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None),
("wm.context_toggle", {"type": 'H', "value": 'PRESS'},
@@ -1272,7 +1274,9 @@ def km_file_browser_main(params):
items.extend([
("file.mouse_execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ # The two refresh operators have polls excluding each other (so only one is available depending on context).
("file.refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
+ ("file.asset_library_refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
{"properties": [("open", False), ("deselect_all", True)]}),
@@ -1439,7 +1443,7 @@ def km_dopesheet(params):
("action.view_selected", {"type": 'F', "value": 'PRESS'}, None),
("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
("anim.channels_editable_toggle", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
("transform.transform", {"type": 'W', "value": 'PRESS'},
{"properties": [("mode", 'TIME_TRANSLATE')]}),
("transform.transform", {"type": 'EVT_TWEAK_L', "value": 'ANY'},
@@ -1477,7 +1481,7 @@ def km_nla_generic(params):
*_template_items_animation(),
("nla.tweakmode_enter", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
("nla.tweakmode_exit", {"type": 'ESC', "value": 'PRESS'}, None),
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
])
return keymap
@@ -2234,7 +2238,7 @@ def km_animation_channels(params):
("anim.channel_select_keys", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK', "shift": True},
{"properties": [("extend", True)]}),
# Find (setting the name filter).
- ("anim.channels_find", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
+ ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
# Selection.
("anim.channels_select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}),
("anim.channels_select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
diff --git a/release/scripts/startup/bl_operators/spreadsheet.py b/release/scripts/startup/bl_operators/spreadsheet.py
index b5098d63dac..ba0c9969356 100644
--- a/release/scripts/startup/bl_operators/spreadsheet.py
+++ b/release/scripts/startup/bl_operators/spreadsheet.py
@@ -50,19 +50,6 @@ class SPREADSHEET_OT_toggle_pin(Operator):
space.is_pinned = False
space.context_path.guess()
- def find_geometry_node_editors(self, context):
- editors = []
- for window in context.window_manager.windows:
- for area in window.screen.areas:
- space = area.spaces.active
- if space.type != 'NODE_EDITOR':
- continue
- if space.edit_tree is None:
- continue
- if space.edit_tree.type == 'GEOMETRY':
- editors.append(space)
- return editors
-
classes = (
SPREADSHEET_OT_toggle_pin,
diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py
index 67a02f6e1f4..1363bcf60e4 100644
--- a/release/scripts/startup/bl_operators/userpref.py
+++ b/release/scripts/startup/bl_operators/userpref.py
@@ -100,14 +100,6 @@ class PREFERENCES_OT_copy_prev(Operator):
version_new = ((version[0] * 100) + version[1])
version_old = ((version[0] * 100) + version[1]) - 1
- # Special case, remove when the version is > 3.0.
- if version_new == 300:
- version_new = 294
- version_old = 293
- else:
- print("TODO: remove exception!")
- # End special case.
-
# Ensure we only try to copy files from a point release.
# The check below ensures the second numbers match.
while (version_new % 100) // 10 == (version_old % 100) // 10:
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 170b9f3ae44..28bb0a58c02 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -1298,6 +1298,13 @@ rna_vector_subtype_items = (
('QUATERNION', "Quaternion Rotation", "Quaternion rotation (affects NLA blending)"),
)
+
+# NOTE: needed for Python 3.10 since there are name-space issues with annotations.
+# This can be moved into the class as a static-method once Python 3.9x is dropped.
+def _wm_properties_edit_subtype_items(_self, _context):
+ return WM_OT_properties_edit.subtype_items
+
+
class WM_OT_properties_edit(Operator):
"""Change a custom property's type, or adjust how it is displayed in the interface"""
bl_idname = "wm.properties_edit"
@@ -1312,7 +1319,7 @@ class WM_OT_properties_edit(Operator):
property_name: rna_custom_property_name
property_type: EnumProperty(
name="Type",
- items=lambda self, _context: WM_OT_properties_edit.type_items,
+ items=rna_custom_property_type_items,
)
is_overridable_library: BoolProperty(
name="Is Library Overridable",
@@ -1404,7 +1411,7 @@ class WM_OT_properties_edit(Operator):
)
subtype: EnumProperty(
name="Subtype",
- items=lambda self, _context: WM_OT_properties_edit.subtype_items,
+ items=_wm_properties_edit_subtype_items,
)
# String properties.
@@ -1442,7 +1449,7 @@ class WM_OT_properties_edit(Operator):
# Convert an old property for a string, avoiding unhelpful string representations for custom list types.
@staticmethod
- def _convert_old_property_to_string(item, name):
+ def convert_custom_property_to_string(item, name):
# The IDProperty group view API currently doesn't have a "lookup" method.
for key, value in item.items():
if key == name:
@@ -1461,7 +1468,8 @@ class WM_OT_properties_edit(Operator):
# Retrieve the current type of the custom property on the RNA struct. Some properties like group properties
# can be created in the UI, but editing their meta-data isn't supported. In that case, return 'PYTHON'.
- def _get_property_type(self, item, property_name):
+ @staticmethod
+ def get_property_type(item, property_name):
from rna_prop_ui import (
rna_idprop_value_item_type,
)
@@ -1549,17 +1557,17 @@ class WM_OT_properties_edit(Operator):
return self._convert_new_value_single(item[name_old], float)
if prop_type_new == 'INT_ARRAY':
- prop_type_old = self._get_property_type(item, name_old)
+ prop_type_old = self.get_property_type(item, name_old)
if prop_type_old in {'INT', 'FLOAT', 'INT_ARRAY', 'FLOAT_ARRAY'}:
return self._convert_new_value_array(item[name_old], int, self.array_length)
if prop_type_new == 'FLOAT_ARRAY':
- prop_type_old = self._get_property_type(item, name_old)
+ prop_type_old = self.get_property_type(item, name_old)
if prop_type_old in {'INT', 'FLOAT', 'FLOAT_ARRAY', 'INT_ARRAY'}:
return self._convert_new_value_array(item[name_old], float, self.array_length)
if prop_type_new == 'STRING':
- return self._convert_old_property_to_string(item, name_old)
+ return self.convert_custom_property_to_string(item, name_old)
# If all else fails, create an empty string property. That should avoid errors later on anyway.
return ""
@@ -1672,7 +1680,7 @@ class WM_OT_properties_edit(Operator):
self.report({'ERROR'}, "Cannot edit properties from override data")
return {'CANCELLED'}
- prop_type_old = self._get_property_type(item, name_old)
+ prop_type_old = self.get_property_type(item, name_old)
prop_type_new = self.property_type
self._old_prop_name[:] = [name]
@@ -1716,14 +1724,14 @@ class WM_OT_properties_edit(Operator):
return {'CANCELLED'}
# Set operator's property type with the type of the existing property, to display the right settings.
- old_type = self._get_property_type(item, name)
+ old_type = self.get_property_type(item, name)
self.property_type = old_type
self.last_property_type = old_type
# So that the operator can do something for unsupported properties, change the property into
# a string, just for editing in the dialog. When the operator executes, it will be converted back
# into a python value. Always do this conversion, in case the Python property edit type is selected.
- self.eval_string = self._convert_old_property_to_string(item, name)
+ self.eval_string = self.convert_custom_property_to_string(item, name)
if old_type != 'PYTHON':
self._fill_old_ui_data(item, name)
@@ -1845,6 +1853,62 @@ class WM_OT_properties_edit(Operator):
layout.prop(self, "description")
+# Edit the value of a custom property with the given name on the RNA struct at the given data path.
+# For supported types, this simply acts as a convenient way to create a popup for a specific property
+# and draws the custom property value directly in the popup. For types like groups which can't be edited
+# directly with buttons, instead convert the value to a string, evaluate the changed string when executing.
+class WM_OT_properties_edit_value(Operator):
+ """Edit the value of a custom property"""
+ bl_idname = "wm.properties_edit_value"
+ bl_label = "Edit Property Value"
+ # register only because invoke_props_popup requires.
+ bl_options = {'REGISTER', 'INTERNAL'}
+
+ data_path: rna_path
+ property_name: rna_custom_property_name
+
+ # Store the value converted to a string as a fallback for otherwise unsupported types.
+ eval_string: StringProperty(
+ name="Value",
+ description="Value for custom property types that can only be edited as a Python expression"
+ )
+
+ def execute(self, context):
+ if self.eval_string:
+ rna_item = eval("context.%s" % self.data_path)
+ try:
+ new_value = eval(self.eval_string)
+ except Exception as ex:
+ self.report({'WARNING'}, "Python evaluation failed: " + str(ex))
+ return {'CANCELLED'}
+ rna_item[self.property_name] = new_value
+ return {'FINISHED'}
+
+ def invoke(self, context, _event):
+ rna_item = eval("context.%s" % self.data_path)
+
+ if WM_OT_properties_edit.get_property_type(rna_item, self.property_name) == 'PYTHON':
+ self.eval_string = WM_OT_properties_edit.convert_custom_property_to_string(rna_item,
+ self.property_name)
+ else:
+ self.eval_string = ""
+
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
+
+ def draw(self, context):
+ from bpy.utils import escape_identifier
+
+ rna_item = eval("context.%s" % self.data_path)
+
+ layout = self.layout
+ if WM_OT_properties_edit.get_property_type(rna_item, self.property_name) == 'PYTHON':
+ layout.prop(self, "eval_string")
+ else:
+ col = layout.column(align=True)
+ col.prop(rna_item, '["%s"]' % escape_identifier(self.property_name), text="")
+
+
class WM_OT_properties_add(Operator):
"""Add your own property to the data-block"""
bl_idname = "wm.properties_add"
@@ -3056,6 +3120,7 @@ classes = (
WM_OT_properties_add,
WM_OT_properties_context_change,
WM_OT_properties_edit,
+ WM_OT_properties_edit_value,
WM_OT_properties_remove,
WM_OT_sysinfo,
WM_OT_owner_disable,
diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index c31881fa194..6ca13674234 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -591,7 +591,7 @@ class GreasePencilMaterialsPanel:
if len(ob.material_slots) > 0 and ob.active_material_index >= 0:
ma = ob.material_slots[ob.active_material_index].material
- if ma is not None and ma.grease_pencil is not None:
+ if is_view3d and ma is not None and ma.grease_pencil is not None:
gpcolor = ma.grease_pencil
if gpcolor.stroke_style == 'SOLID':
row = layout.row()
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index 927a30f0ae0..05f505c518d 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -52,7 +52,9 @@ class FILEBROWSER_HT_header(Header):
icon_only=True,
)
- layout.prop(params, "filter_search", text="", icon='VIEWZOOM')
+ sub = layout.row()
+ sub.ui_units_x = 8
+ sub.prop(params, "filter_search", text="", icon='VIEWZOOM')
layout.popover(
panel="ASSETBROWSER_PT_filter",
@@ -734,6 +736,7 @@ class ASSETBROWSER_PT_metadata(asset_utils.AssetBrowserPanel, Panel):
row.operator("asset.open_containing_blend_file", text="", icon='TOOL_SETTINGS')
layout.prop(asset_file_handle.asset_data, "description")
+ layout.prop(asset_file_handle.asset_data, "author")
class ASSETBROWSER_PT_metadata_preview(asset_utils.AssetMetaDataPanel, Panel):
@@ -789,7 +792,7 @@ class ASSETBROWSER_MT_context_menu(AssetBrowserMenu, Menu):
st = context.space_data
params = st.params
- layout.operator("file.refresh", text="Refresh")
+ layout.operator("file.asset_library_refresh")
layout.separator()
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index 9b96cef9de4..120b2d7c13a 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -37,6 +37,14 @@ from bl_ui.space_toolsystem_common import (
from rna_prop_ui import PropertyPanel
+def _space_view_types(st):
+ view_type = st.view_type
+ return (
+ view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'},
+ view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'},
+ )
+
+
def selected_sequences_len(context):
selected_sequences = getattr(context, "selected_sequences", None)
if selected_sequences is None:
@@ -228,15 +236,19 @@ class SEQUENCER_MT_editor_menus(Menu):
def draw(self, context):
layout = self.layout
st = context.space_data
+ has_sequencer, _has_preview = _space_view_types(st)
layout.menu("SEQUENCER_MT_view")
+ layout.menu("SEQUENCER_MT_select")
- if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
- layout.menu("SEQUENCER_MT_select")
+ if has_sequencer:
if st.show_markers:
layout.menu("SEQUENCER_MT_marker")
layout.menu("SEQUENCER_MT_add")
- layout.menu("SEQUENCER_MT_strip")
+
+ layout.menu("SEQUENCER_MT_strip")
+
+ layout.menu("SEQUENCER_MT_image")
class SEQUENCER_PT_gizmo_display(Panel):
@@ -559,8 +571,14 @@ class SEQUENCER_MT_select_linked(Menu):
class SEQUENCER_MT_select(Menu):
bl_label = "Select"
- def draw(self, _context):
+ def draw(self, context):
layout = self.layout
+ st = context.space_data
+ has_sequencer, has_preview = _space_view_types(st)
+
+ # FIXME: this doesn't work for both preview + window region.
+ if has_preview:
+ layout.operator_context = 'INVOKE_REGION_PREVIEW'
layout.operator("sequencer.select_all", text="All").action = 'SELECT'
layout.operator("sequencer.select_all", text="None").action = 'DESELECT'
@@ -569,17 +587,20 @@ class SEQUENCER_MT_select(Menu):
layout.separator()
layout.operator("sequencer.select_box", text="Box Select")
- props = layout.operator("sequencer.select_box", text="Box Select (Include Handles)")
- props.include_handles = True
+ if has_sequencer:
+ props = layout.operator("sequencer.select_box", text="Box Select (Include Handles)")
+ props.include_handles = True
layout.separator()
- layout.operator_menu_enum("sequencer.select_side_of_frame", "side", text="Side of Frame...")
- layout.menu("SEQUENCER_MT_select_handle", text="Handle")
- layout.menu("SEQUENCER_MT_select_channel", text="Channel")
- layout.menu("SEQUENCER_MT_select_linked", text="Linked")
+ if has_sequencer:
+ layout.operator_menu_enum("sequencer.select_side_of_frame", "side", text="Side of Frame...")
+ layout.menu("SEQUENCER_MT_select_handle", text="Handle")
+ layout.menu("SEQUENCER_MT_select_channel", text="Channel")
+ layout.menu("SEQUENCER_MT_select_linked", text="Linked")
+
+ layout.separator()
- layout.separator()
layout.operator_menu_enum("sequencer.select_grouped", "type", text="Grouped")
@@ -787,43 +808,43 @@ class SEQUENCER_MT_add_effect(Menu):
col.enabled = selected_sequences_len(context) != 0
-class SEQUENCER_MT_strip_image_transform(Menu):
- bl_label = "Image Transform"
-
- def draw(self, _context):
- layout = self.layout
-
- layout.operator("sequencer.strip_transform_fit", text="Scale To Fit").fit_method = 'FIT'
- layout.operator("sequencer.strip_transform_fit", text="Scale to Fill").fit_method = 'FILL'
- layout.operator("sequencer.strip_transform_fit", text="Stretch To Fill").fit_method = 'STRETCH'
- layout.separator()
-
- layout.operator("sequencer.strip_transform_clear", text="Clear Position").property = 'POSITION'
- layout.operator("sequencer.strip_transform_clear", text="Clear Scale").property = 'SCALE'
- layout.operator("sequencer.strip_transform_clear", text="Clear Rotation").property = 'ROTATION'
- layout.operator("sequencer.strip_transform_clear", text="Clear All").property = 'ALL'
-
-
class SEQUENCER_MT_strip_transform(Menu):
bl_label = "Transform"
- def draw(self, _context):
+ def draw(self, context):
layout = self.layout
+ st = context.space_data
+ has_sequencer, has_preview = _space_view_types(st)
- layout.operator("transform.seq_slide", text="Move")
- layout.operator("transform.transform", text="Move/Extend from Current Frame").mode = 'TIME_EXTEND'
- layout.operator("sequencer.slip", text="Slip Strip Contents")
+ if has_preview:
+ layout.operator_context = 'INVOKE_REGION_PREVIEW'
+ else:
+ layout.operator_context = 'INVOKE_REGION_WIN'
- layout.separator()
- layout.operator("sequencer.snap")
- layout.operator("sequencer.offset_clear")
+ # FIXME: mixed preview/sequencer views.
+ if has_preview:
+ layout.operator("transform.translate", text="Move")
+ layout.operator("transform.rotate", text="Rotate")
+ layout.operator("transform.resize", text="Scale")
+ else:
+ layout.operator("transform.seq_slide", text="Move")
+ layout.operator("transform.transform", text="Move/Extend from Current Frame").mode = 'TIME_EXTEND'
+ layout.operator("sequencer.slip", text="Slip Strip Contents")
- layout.separator()
- layout.operator_menu_enum("sequencer.swap", "side")
+ # TODO (for preview)
+ if has_sequencer:
+ layout.separator()
+ layout.operator("sequencer.snap")
+ layout.operator("sequencer.offset_clear")
- layout.separator()
- layout.operator("sequencer.gap_remove").all = False
- layout.operator("sequencer.gap_insert")
+ layout.separator()
+
+ if has_sequencer:
+ layout.operator_menu_enum("sequencer.swap", "side")
+
+ layout.separator()
+ layout.operator("sequencer.gap_remove").all = False
+ layout.operator("sequencer.gap_insert")
class SEQUENCER_MT_strip_input(Menu):
@@ -893,69 +914,129 @@ class SEQUENCER_MT_strip(Menu):
def draw(self, context):
layout = self.layout
+ st = context.space_data
+ has_sequencer, has_preview = _space_view_types(st)
- layout.operator_context = 'INVOKE_REGION_WIN'
+ # FIXME: this doesn't work for both preview + window region.
+ if has_preview:
+ layout.operator_context = 'INVOKE_REGION_PREVIEW'
+ else:
+ layout.operator_context = 'INVOKE_REGION_WIN'
- layout.separator()
layout.menu("SEQUENCER_MT_strip_transform")
- layout.menu("SEQUENCER_MT_strip_image_transform")
-
layout.separator()
- layout.operator("sequencer.split", text="Split").type = 'SOFT'
- layout.operator("sequencer.split", text="Hold Split").type = 'HARD'
- layout.separator()
- layout.operator("sequencer.copy", text="Copy")
- layout.operator("sequencer.paste", text="Paste")
- layout.operator("sequencer.duplicate_move")
+ if has_sequencer:
+
+ layout.operator("sequencer.split", text="Split").type = 'SOFT'
+ layout.operator("sequencer.split", text="Hold Split").type = 'HARD'
+ layout.separator()
+
+ if has_sequencer:
+ layout.operator("sequencer.copy", text="Copy")
+ layout.operator("sequencer.paste", text="Paste")
+ layout.operator("sequencer.duplicate_move")
+
layout.operator("sequencer.delete", text="Delete")
strip = context.active_sequence_strip
- if strip:
- strip_type = strip.type
+ if has_sequencer:
+ if strip:
+ strip_type = strip.type
- if strip_type != 'SOUND':
- layout.separator()
- layout.operator_menu_enum("sequencer.strip_modifier_add", "type", text="Add Modifier")
- layout.operator("sequencer.strip_modifier_copy", text="Copy Modifiers to Selection")
+ if strip_type != 'SOUND':
+ layout.separator()
+ layout.operator_menu_enum("sequencer.strip_modifier_add", "type", text="Add Modifier")
+ layout.operator("sequencer.strip_modifier_copy", text="Copy Modifiers to Selection")
+
+ if strip_type in {
+ 'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
+ 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', 'WIPE', 'GLOW',
+ 'TRANSFORM', 'COLOR', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
+ 'GAUSSIAN_BLUR',
+ }:
+ layout.separator()
+ layout.menu("SEQUENCER_MT_strip_effect")
+ elif strip_type == 'MOVIE':
+ layout.separator()
+ layout.menu("SEQUENCER_MT_strip_movie")
+ elif strip_type == 'IMAGE':
+ layout.separator()
+ layout.operator("sequencer.rendersize")
+ layout.operator("sequencer.images_separate")
+ elif strip_type == 'TEXT':
+ layout.separator()
+ layout.menu("SEQUENCER_MT_strip_effect")
+ elif strip_type == 'META':
+ layout.separator()
+ layout.operator("sequencer.meta_make")
+ layout.operator("sequencer.meta_separate")
+ layout.operator("sequencer.meta_toggle", text="Toggle Meta")
+ if strip_type != 'META':
+ layout.separator()
+ layout.operator("sequencer.meta_make")
+ layout.operator("sequencer.meta_toggle", text="Toggle Meta")
- if strip_type in {
- 'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
- 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', 'WIPE', 'GLOW',
- 'TRANSFORM', 'COLOR', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
- 'GAUSSIAN_BLUR',
- }:
- layout.separator()
- layout.menu("SEQUENCER_MT_strip_effect")
- elif strip_type == 'MOVIE':
- layout.separator()
- layout.menu("SEQUENCER_MT_strip_movie")
- elif strip_type == 'IMAGE':
- layout.separator()
- layout.operator("sequencer.rendersize")
- layout.operator("sequencer.images_separate")
- elif strip_type == 'TEXT':
- layout.separator()
- layout.menu("SEQUENCER_MT_strip_effect")
- elif strip_type == 'META':
- layout.separator()
- layout.operator("sequencer.meta_make")
- layout.operator("sequencer.meta_separate")
- layout.operator("sequencer.meta_toggle", text="Toggle Meta")
- if strip_type != 'META':
- layout.separator()
- layout.operator("sequencer.meta_make")
- layout.operator("sequencer.meta_toggle", text="Toggle Meta")
+ if has_sequencer:
+ layout.separator()
+ layout.menu("SEQUENCER_MT_color_tag_picker")
- layout.separator()
- layout.menu("SEQUENCER_MT_color_tag_picker")
+ layout.separator()
+ layout.menu("SEQUENCER_MT_strip_lock_mute")
- layout.separator()
- layout.menu("SEQUENCER_MT_strip_lock_mute")
+ layout.separator()
+ layout.menu("SEQUENCER_MT_strip_input")
- layout.separator()
- layout.menu("SEQUENCER_MT_strip_input")
+
+class SEQUENCER_MT_image(Menu):
+ bl_label = "Image"
+
+ def draw(self, context):
+ layout = self.layout
+ st = context.space_data
+
+ if st.view_type == {'PREVIEW', 'SEQUENCER_PREVIEW'}:
+ layout.menu("SEQUENCER_MT_image_transform")
+
+ layout.menu("SEQUENCER_MT_image_clear")
+ layout.menu("SEQUENCER_MT_image_apply")
+
+
+class SEQUENCER_MT_image_transform(Menu):
+ bl_label = "Transfrom"
+
+ def draw(self, _context):
+ layout = self.layout
+
+ layout.operator_context = 'INVOKE_REGION_PREVIEW'
+
+ layout.operator("transform.translate")
+ layout.operator("transform.rotate")
+ layout.operator("transform.resize", text="Scale")
+
+
+class SEQUENCER_MT_image_clear(Menu):
+ bl_label = "Clear"
+
+ def draw(self, _context):
+ layout = self.layout
+
+ layout.operator("sequencer.strip_transform_clear", text="Position").property = 'POSITION'
+ layout.operator("sequencer.strip_transform_clear", text="Scale").property = 'SCALE'
+ layout.operator("sequencer.strip_transform_clear", text="Rotation").property = 'ROTATION'
+ layout.operator("sequencer.strip_transform_clear", text="All Transforms").property = 'ALL'
+
+
+class SEQUENCER_MT_image_apply(Menu):
+ bl_label = "Apply"
+
+ def draw(self, _context):
+ layout = self.layout
+
+ layout.operator("sequencer.strip_transform_fit", text="Scale To Fit").fit_method = 'FIT'
+ layout.operator("sequencer.strip_transform_fit", text="Scale to Fill").fit_method = 'FILL'
+ layout.operator("sequencer.strip_transform_fit", text="Stretch To Fill").fit_method = 'STRETCH'
class SEQUENCER_MT_context_menu(Menu):
@@ -2523,10 +2604,13 @@ classes = (
SEQUENCER_MT_strip_effect,
SEQUENCER_MT_strip_movie,
SEQUENCER_MT_strip,
- SEQUENCER_MT_strip_image_transform,
SEQUENCER_MT_strip_transform,
SEQUENCER_MT_strip_input,
SEQUENCER_MT_strip_lock_mute,
+ SEQUENCER_MT_image,
+ SEQUENCER_MT_image_transform,
+ SEQUENCER_MT_image_clear,
+ SEQUENCER_MT_image_apply,
SEQUENCER_MT_color_tag_picker,
SEQUENCER_MT_context_menu,
SEQUENCER_MT_preview_context_menu,
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 721c6bdb99c..1a448046f7a 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -2429,6 +2429,7 @@ class _defs_node_edit:
icon="ops.node.links_cut",
widget=None,
keymap="Node Tool: Links Cut",
+ options={'KEYMAP_FALLBACK'},
)
@@ -2462,6 +2463,7 @@ class _defs_sequencer_generic:
widget=None,
keymap="Sequencer Tool: Blade",
draw_settings=draw_settings,
+ options={'KEYMAP_FALLBACK'},
)
@ToolDef.from_fn
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 1c2190bb7a0..0172fa0655f 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2265,6 +2265,7 @@ class VIEW3D_MT_object(Menu):
layout.separator()
+ layout.menu("VIEW3D_MT_object_asset")
layout.menu("VIEW3D_MT_object_parent")
layout.menu("VIEW3D_MT_object_collection")
layout.menu("VIEW3D_MT_object_relations")
@@ -2758,6 +2759,16 @@ class VIEW3D_MT_object_cleanup(Menu):
layout.operator("object.material_slot_remove_unused", text="Remove Unused Material Slots")
+class VIEW3D_MT_object_asset(Menu):
+ bl_label = "Asset"
+
+ def draw(self, _context):
+ layout = self.layout
+
+ layout.operator("asset.mark")
+ layout.operator("asset.clear", text="Clear Asset").set_fake_user = False
+ layout.operator("asset.clear", text="Clear Asset (Set Fake User)").set_fake_user = True
+
class VIEW3D_MT_make_single_user(Menu):
bl_label = "Make Single User"
@@ -7541,6 +7552,7 @@ classes = (
VIEW3D_MT_image_add,
VIEW3D_MT_object,
VIEW3D_MT_object_animation,
+ VIEW3D_MT_object_asset,
VIEW3D_MT_object_rigid_body,
VIEW3D_MT_object_clear,
VIEW3D_MT_object_context_menu,
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 0a34f541e5c..34f447a7108 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -87,8 +87,6 @@ def curve_node_items(context):
space = context.space_data
if not space:
return
- if not space.edit_tree:
- return
if geometry_nodes_legacy_poll(context):
yield NodeItem("GeometryNodeLegacyCurveEndpoints")
@@ -137,8 +135,6 @@ def mesh_node_items(context):
space = context.space_data
if not space:
return
- if not space.edit_tree:
- return
if geometry_nodes_legacy_poll(context):
yield NodeItem("GeometryNodeLegacyEdgeSplit", poll=geometry_nodes_legacy_poll)
@@ -157,6 +153,32 @@ def mesh_node_items(context):
yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
yield NodeItem("GeometryNodeSetShadeSmooth")
+# Custom Menu for Geometry Nodes "Geometry" category
+def geometry_node_items(context):
+ if context is None:
+ return
+ space = context.space_data
+ if not space:
+ return
+
+ if geometry_nodes_legacy_poll(context):
+ yield NodeItem("GeometryNodeLegacyDeleteGeometry", poll=geometry_nodes_legacy_poll)
+ yield NodeItem("GeometryNodeLegacyRaycast", poll=geometry_nodes_legacy_poll)
+ yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
+
+ yield NodeItem("GeometryNodeBoundBox")
+ yield NodeItem("GeometryNodeConvexHull")
+ yield NodeItem("GeometryNodeDeleteGeometry")
+ yield NodeItem("GeometryNodeProximity")
+ yield NodeItem("GeometryNodeJoinGeometry")
+ yield NodeItem("GeometryNodeRaycast")
+ yield NodeItem("GeometryNodeSeparateComponents")
+ yield NodeItem("GeometryNodeSeparateGeometry")
+ yield NodeItem("GeometryNodeTransform")
+ yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
+ yield NodeItem("GeometryNodeSetID")
+ yield NodeItem("GeometryNodeSetPosition")
+
# Custom Menu for Geometry Node Input Nodes
def geometry_input_node_items(context):
if context is None:
@@ -164,15 +186,13 @@ def geometry_input_node_items(context):
space = context.space_data
if not space:
return
- if not space.edit_tree:
- return
if geometry_nodes_legacy_poll(context):
yield NodeItem("FunctionNodeLegacyRandomFloat")
yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeCollectionInfo")
yield NodeItem("FunctionNodeInputBool")
+ yield NodeItem("GeometryNodeCollectionInfo")
yield NodeItem("FunctionNodeInputColor")
yield NodeItem("FunctionNodeInputInt")
yield NodeItem("GeometryNodeIsViewport")
@@ -182,6 +202,7 @@ def geometry_input_node_items(context):
yield NodeItem("ShaderNodeValue")
yield NodeItem("FunctionNodeInputVector")
yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
+ yield NodeItem("GeometryNodeInputID")
yield NodeItem("GeometryNodeInputIndex")
yield NodeItem("GeometryNodeInputNormal")
yield NodeItem("GeometryNodeInputPosition")
@@ -194,8 +215,6 @@ def geometry_material_node_items(context):
space = context.space_data
if not space:
return
- if not space.edit_tree:
- return
if geometry_nodes_legacy_poll(context):
yield NodeItem("GeometryNodeLegacyMaterialAssign")
@@ -217,8 +236,6 @@ def point_node_items(context):
space = context.space_data
if not space:
return
- if not space.edit_tree:
- return
if geometry_nodes_legacy_poll(context):
yield NodeItem("GeometryNodeLegacyAlignRotationToVector", poll=geometry_nodes_legacy_poll)
@@ -244,15 +261,16 @@ def node_group_items(context):
space = context.space_data
if not space:
return
- ntree = space.edit_tree
- if not ntree:
- return
yield NodeItemCustom(draw=group_tools_draw)
yield NodeItem("NodeGroupInput", poll=group_input_output_item_poll)
yield NodeItem("NodeGroupOutput", poll=group_input_output_item_poll)
+ ntree = space.edit_tree
+ if not ntree:
+ return
+
yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
def contains_group(nodetree, group):
@@ -677,21 +695,7 @@ geometry_node_categories = [
NodeItem("GeometryNodeCurvePrimitiveQuadrilateral"),
NodeItem("GeometryNodeCurvePrimitiveBezierSegment"),
]),
- GeometryNodeCategory("GEO_GEOMETRY", "Geometry", items=[
- NodeItem("GeometryNodeLegacyDeleteGeometry", poll=geometry_nodes_legacy_poll),
- NodeItem("GeometryNodeLegacyRaycast", poll=geometry_nodes_legacy_poll),
-
- NodeItem("GeometryNodeRaycast"),
- NodeItem("GeometryNodeProximity"),
- NodeItem("GeometryNodeBoundBox"),
- NodeItem("GeometryNodeConvexHull"),
- NodeItem("GeometryNodeDeleteGeometry"),
- NodeItem("GeometryNodeTransform"),
- NodeItem("GeometryNodeJoinGeometry"),
- NodeItem("GeometryNodeSeparateComponents"),
- NodeItem("GeometryNodeSeparateGeometry"),
- NodeItem("GeometryNodeSetPosition"),
- ]),
+ GeometryNodeCategory("GEO_GEOMETRY", "Geometry", items=geometry_node_items),
GeometryNodeCategory("GEO_INPUT", "Input", items=geometry_input_node_items),
GeometryNodeCategory("GEO_INSTANCE", "Instances", items=[
NodeItem("GeometryNodeInstanceOnPoints"),
@@ -727,6 +731,7 @@ geometry_node_categories = [
NodeItem("FunctionNodeReplaceString"),
]),
GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
+ NodeItem("ShaderNodeTexBrick"),
NodeItem("ShaderNodeTexChecker"),
NodeItem("ShaderNodeTexGradient"),
NodeItem("ShaderNodeTexMagic"),
@@ -735,6 +740,7 @@ geometry_node_categories = [
NodeItem("ShaderNodeTexVoronoi"),
NodeItem("ShaderNodeTexWave"),
NodeItem("ShaderNodeTexWhiteNoise"),
+ NodeItem("GeometryNodeImageTexture"),
]),
GeometryNodeCategory("GEO_UTILITIES", "Utilities", items=[
NodeItem("ShaderNodeMapRange"),
@@ -758,6 +764,7 @@ geometry_node_categories = [
]),
GeometryNodeCategory("GEO_VOLUME", "Volume", items=[
NodeItem("GeometryNodeLegacyPointsToVolume", poll=geometry_nodes_legacy_poll),
+ NodeItem("GeometryNodeLegacyVolumeToMesh", poll=geometry_nodes_legacy_poll),
NodeItem("GeometryNodeVolumeToMesh"),
]),