diff options
Diffstat (limited to 'release/scripts')
m--------- | release/scripts/addons | 0 | ||||
m--------- | release/scripts/addons_contrib | 0 | ||||
-rw-r--r-- | release/scripts/modules/rna_prop_ui.py | 90 | ||||
-rw-r--r-- | release/scripts/presets/interface_theme/Blender_Light.xml | 42 | ||||
-rw-r--r-- | release/scripts/presets/keyconfig/Blender.py | 16 | ||||
-rw-r--r-- | release/scripts/presets/keyconfig/keymap_data/blender_default.py | 530 | ||||
-rw-r--r-- | release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py | 12 | ||||
-rw-r--r-- | release/scripts/startup/bl_operators/spreadsheet.py | 13 | ||||
-rw-r--r-- | release/scripts/startup/bl_operators/userpref.py | 8 | ||||
-rw-r--r-- | release/scripts/startup/bl_operators/wm.py | 85 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/properties_grease_pencil_common.py | 2 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_filebrowser.py | 7 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_sequencer.py | 264 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_toolsystem_toolbar.py | 2 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_view3d.py | 12 | ||||
-rw-r--r-- | release/scripts/startup/nodeitems_builtins.py | 65 |
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"), ]), |