diff options
Diffstat (limited to 'release')
29 files changed, 261 insertions, 48 deletions
diff --git a/release/datafiles/colormanagement/config.ocio b/release/datafiles/colormanagement/config.ocio index bb9fd27fb84..bd342a0577e 100644 --- a/release/datafiles/colormanagement/config.ocio +++ b/release/datafiles/colormanagement/config.ocio @@ -42,7 +42,7 @@ roles: # For interop between configs, and to determine XYZ for rendering aces_interchange: Linear ACES - # Specifed by OCIO, not used in Blender + # Specified by OCIO, not used in Blender color_timing: Filmic Log compositing_log: Filmic Log default: Linear diff --git a/release/datafiles/locale b/release/datafiles/locale -Subproject 6178bad247c69c9c4e1a98c5f35765752341b3a +Subproject 8ee2942570f08d10484bb2328d0d1b0aaaa0367 diff --git a/release/datafiles/splash.png b/release/datafiles/splash.png Binary files differindex 74e239b0f98..eb1250cf5a5 100644 --- a/release/datafiles/splash.png +++ b/release/datafiles/splash.png diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index da01f65131c..055a2e37c6c 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -647,7 +647,7 @@ const bTheme U_theme_default = { .facedot_size = 4, .movie = RGBA(0x4d6890ff), .movieclip = RGBA(0x8f4c4cff), - .mask = RGBA(0x666666ff), + .mask = RGBA(0x8f5656ff), .image = RGBA(0x8f744bff), .scene = RGBA(0x808033ff), .audio = RGBA(0x448080ff), diff --git a/release/freedesktop/snap/README.md b/release/freedesktop/snap/README.md index 742b265ada6..f6c662e9f1e 100644 --- a/release/freedesktop/snap/README.md +++ b/release/freedesktop/snap/README.md @@ -12,6 +12,6 @@ Build pipeline snap tracks and channels - Test builds for the upcoming stable release - *not used for now* <track>/beta - Nightly automated builds provided by a release branch - <track>/egde/<branch> + <track>/edge/<branch> - Nightly or on demand builds - will also make use of branch ``` diff --git a/release/lts/create_release_notes.py b/release/lts/create_release_notes.py index 2a396dca6b0..2d35a71c263 100755 --- a/release/lts/create_release_notes.py +++ b/release/lts/create_release_notes.py @@ -97,7 +97,7 @@ def extract_release_notes(version: str, task_id: int): # Process - 1. Retrieval of description of the gived `task_id`. + 1. Retrieval of description of the given `task_id`. 2. Find rows for the given `version` and convert to `ReleaseLogLine`. 3. based on the associated task or commit retrieves the title of the log line. diff --git a/release/scripts/addons b/release/scripts/addons -Subproject f6107e2fd9a92b55ac110c7db941e287e2f6604 +Subproject f2a08d80ccd3c13af304525778df3905f95bd44 diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py index 00edd7d523d..cf904a1a88b 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py +++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py @@ -877,7 +877,7 @@ def dump_messages(do_messages, do_checks, settings): addons = utils.enable_addons(support={"OFFICIAL"}) # Note this is not needed if we have been started with factory settings, but just in case... # XXX This is not working well, spent a whole day trying to understand *why* we still have references of - # those removed calsses in things like `bpy.types.OperatorProperties.__subclasses__()` + # those removed classes in things like `bpy.types.OperatorProperties.__subclasses__()` # (could not even reproduce it from regular py console in Blender with UI...). # For some reasons, cleanup does not happen properly, *and* we have no way to tell which class is valid # and which has been unregistered. So for now, just go for the dirty, easy way: do not disable add-ons. :( diff --git a/release/scripts/modules/bl_i18n_utils/utils.py b/release/scripts/modules/bl_i18n_utils/utils.py index 13fb87d386a..e13eb15dfd2 100644 --- a/release/scripts/modules/bl_i18n_utils/utils.py +++ b/release/scripts/modules/bl_i18n_utils/utils.py @@ -778,7 +778,7 @@ class I18nMessages: try: import bpy except ModuleNotFoundError: - print("Could not import bpy, find_best_messages_matches must be run from whithin Blender.") + print("Could not import bpy, find_best_messages_matches must be run from within Blender.") return # Build helper mappings. diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py index 3f0248970c6..b009c38edb4 100644 --- a/release/scripts/modules/bpy/utils/__init__.py +++ b/release/scripts/modules/bpy/utils/__init__.py @@ -26,6 +26,7 @@ not associated with blenders internal data. __all__ = ( "blend_paths", "escape_identifier", + "flip_name", "unescape_identifier", "keyconfig_init", "keyconfig_set", @@ -61,6 +62,7 @@ from _bpy import ( _utils_units as units, blend_paths, escape_identifier, + flip_name, unescape_identifier, register_class, resource_path, @@ -106,7 +108,7 @@ def execfile(filepath, *, mod=None): mod_orig = modules.get(mod_name, None) modules[mod_name] = mod - # No error supression, just ensure `sys.modules[mod_name]` is properly restored in the case of an error. + # No error suppression, just ensure `sys.modules[mod_name]` is properly restored in the case of an error. try: mod_spec.loader.exec_module(mod) finally: diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 26efb6e3307..b477f624b7b 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -720,7 +720,7 @@ class Gizmo(StructRNA): # Dummy class to keep the reference in `bpy_types_dict` and avoid -# erros like: "TypeError: expected GizmoGroup subclass of class ..." +# errors like: "TypeError: expected GizmoGroup subclass of class ..." class GizmoGroup(StructRNA): __slots__ = () diff --git a/release/scripts/presets/keyconfig/Blender.py b/release/scripts/presets/keyconfig/Blender.py index 35c920b3f40..1ac7626f926 100644 --- a/release/scripts/presets/keyconfig/Blender.py +++ b/release/scripts/presets/keyconfig/Blender.py @@ -202,7 +202,7 @@ class Prefs(bpy.types.KeyConfigPreferences): update=update_fn, ) - # Developer note, this is an experemental option. + # Developer note, this is an experimental option. use_pie_click_drag: BoolProperty( name="Pie Menu on Drag", description=( diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index 6a837e64b78..543742709ef 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -1097,6 +1097,7 @@ def km_outliner(params): # Fall through to generic context menu if the item(s) selected have no type specific actions. ("outliner.operation", {"type": 'RIGHTMOUSE', "value": 'PRESS'}, None), op_menu("OUTLINER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}), + op_menu_pie("OUTLINER_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None), ("outliner.item_drag_drop", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True}, None), ("outliner.show_hierarchy", {"type": 'HOME', "value": 'PRESS'}, None), @@ -1748,6 +1749,7 @@ def km_graph_editor(params): ("graph.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), ("graph.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), ("graph.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + op_menu_pie("GRAPH_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ("graph.fmodifier_add", {"type": 'M', "value": 'PRESS', "shift": True, "ctrl": True}, {"properties": [("only_active", False)]}), ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None), @@ -1815,6 +1817,7 @@ def km_image_generic(params): ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS', "repeat": True}, None), ("image.cycle_render_slot", {"type": 'J', "value": 'PRESS', "alt": True, "repeat": True}, {"properties": [("reverse", True)]}), + op_menu_pie("IMAGE_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ]) if not params.legacy: @@ -2027,6 +2030,7 @@ def km_node_editor(params): ("node.view_all", {"type": 'HOME', "value": 'PRESS'}, None), ("node.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), ("node.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), + op_menu_pie("NODE_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ("node.delete", {"type": 'X', "value": 'PRESS'}, None), ("node.delete", {"type": 'DEL', "value": 'PRESS'}, None), ("node.delete_reconnect", {"type": 'X', "value": 'PRESS', "ctrl": True}, None), @@ -2389,6 +2393,7 @@ def km_dopesheet(params): ("action.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), ("action.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), ("action.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + op_menu_pie("DOPESHEET_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ("anim.channels_editable_toggle", {"type": 'TAB', "value": 'PRESS'}, None), ("anim.channels_select_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None), ("transform.transform", {"type": 'G', "value": 'PRESS'}, @@ -2503,6 +2508,7 @@ def km_nla_editor(params): ("nla.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None), ("nla.view_selected", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None), ("nla.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None), + op_menu_pie("NLA_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ("nla.actionclip_add", {"type": 'A', "value": 'PRESS', "shift": True}, None), ("nla.transition_add", {"type": 'T', "value": 'PRESS', "shift": True}, None), ("nla.soundclip_add", {"type": 'K', "value": 'PRESS', "shift": True}, None), @@ -2835,6 +2841,7 @@ def km_sequencer(params): ("sequencer.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None), op_menu("SEQUENCER_MT_add", {"type": 'A', "value": 'PRESS', "shift": True}), op_menu("SEQUENCER_MT_change", {"type": 'C', "value": 'PRESS'}), + op_menu_pie("SEQUENCER_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None), ("wm.context_set_int", {"type": 'O', "value": 'PRESS'}, {"properties": [("data_path", 'scene.sequence_editor.overlay_frame'), ("value", 0)]}), @@ -2892,6 +2899,7 @@ def km_sequencerpreview(params): {"properties": [("ratio", 0.25)]}), ("sequencer.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS'}, {"properties": [("ratio", 0.125)]}), + op_menu_pie("SEQUENCER_MT_preview_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), # Edit. ("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None), @@ -3042,6 +3050,7 @@ def km_clip(_params): op_menu_pie("CLIP_MT_solving_pie", {"type": 'S', "value": 'PRESS', "shift": True}), op_menu_pie("CLIP_MT_marker_pie", {"type": 'E', "value": 'PRESS', "shift": True}), op_menu_pie("CLIP_MT_reconstruction_pie", {"type": 'W', "value": 'PRESS', "shift": True}), + op_menu_pie("CLIP_MT_view_pie", {"type": 'ACCENT_GRAVE', "value": 'PRESS'}), ]) return keymap 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 65692062f48..a2f482d1a55 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1030,7 +1030,7 @@ class WM_OT_url_open_preset(Operator): "Report a bug in an add-on"), _url_from_bug_addon), (('RELEASE_NOTES', "Release Notes", - "Read about whats new in this version of Blender"), + "Read about what's new in this version of Blender"), _url_from_release_notes), (('MANUAL', "Manual", "The reference manual for this version of Blender"), @@ -1430,7 +1430,7 @@ class WM_OT_properties_edit(Operator): type_items = rna_custom_property_type_items subtype_items = rna_vector_subtype_items - # Helper method to avoid repetative code to retrieve a single value from sequences and non-sequences. + # Helper method to avoid repetitive code to retrieve a single value from sequences and non-sequences. @staticmethod def _convert_new_value_single(old_value, new_type): if hasattr(old_value, "__len__") and len(old_value) > 0: diff --git a/release/scripts/startup/bl_ui/properties_data_gpencil.py b/release/scripts/startup/bl_ui/properties_data_gpencil.py index 793c4a52350..34e83573bc9 100644 --- a/release/scripts/startup/bl_ui/properties_data_gpencil.py +++ b/release/scripts/startup/bl_ui/properties_data_gpencil.py @@ -110,7 +110,8 @@ class GPENCIL_MT_layer_context_menu(Menu): layout.separator() - layout.operator("gpencil.layer_merge", icon='SORT_ASC', text="Merge Down") + layout.operator("gpencil.layer_merge", icon='SORT_ASC', text="Merge Down").mode = 'ACTIVE' + layout.operator("gpencil.layer_merge", text="Merge All").mode = 'ALL' layout.separator() layout.operator("gpencil.layer_duplicate_object", text="Copy Layer to Selected").only_active = True diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py index 26fe215b17d..9afe8415cf4 100644 --- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py +++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py @@ -261,7 +261,7 @@ class PHYSICS_PT_rigid_body_dynamics(PHYSICS_PT_rigidbody_panel, Panel): # col = layout.column(align=True) # col.label(text="Activation:") - # XXX: settings such as activate on collison/etc. + # XXX: settings such as activate on collision/etc. col = flow.column() col.prop(rbo, "linear_damping", text="Damping Translation") diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index c18d77987ad..86e9ef3d664 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -1858,6 +1858,43 @@ class CLIP_MT_reconstruction_pie(Menu): pie.operator("clip.apply_solution_scale", icon='ARROW_LEFTRIGHT') +class CLIP_MT_view_pie(Menu): + bl_label = "View" + + @classmethod + def poll(cls, context): + space = context.space_data + + # View operators are not yet implemented in Dopesheet mode. + return space.view != 'DOPESHEET' + + def draw(self, context): + layout = self.layout + sc = context.space_data + + pie = layout.menu_pie() + + if sc.view == 'CLIP': + pie.operator("clip.view_all") + pie.operator("clip.view_selected", icon='ZOOM_SELECTED') + + if sc.mode == 'MASK': + pie.operator("clip.view_center_cursor") + pie.separator() + else: + # Add spaces so items stay in the same position through all modes. + pie.separator() + pie.separator() + + pie.operator("clip.view_all", text="Frame All Fit").fit_view = True + + if sc.view == 'GRAPH': + pie.operator_context = 'INVOKE_REGION_PREVIEW' + pie.operator("clip.graph_view_all") + pie.separator() + pie.operator("clip.graph_center_current_frame") + + classes = ( CLIP_UL_tracking_objects, CLIP_HT_header, @@ -1925,6 +1962,7 @@ classes = ( CLIP_MT_tracking_pie, CLIP_MT_reconstruction_pie, CLIP_MT_solving_pie, + CLIP_MT_view_pie, ) if __name__ == "__main__": # only for live edit. diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index 781c430a752..3c90e0c96cc 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -379,6 +379,18 @@ class DOPESHEET_MT_view(Menu): layout.menu("INFO_MT_area") +class DOPESHEET_MT_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + pie = layout.menu_pie() + pie.operator("action.view_all") + pie.operator("action.view_selected", icon='ZOOM_SELECTED') + pie.operator("action.view_frame") + + class DOPESHEET_MT_select(Menu): bl_label = "Select" @@ -527,6 +539,39 @@ class DOPESHEET_MT_key_transform(Menu): layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE' +class DopesheetActionPanelBase: + bl_region_type = 'UI' + bl_label = "Action" + + @classmethod + def draw_generic_panel(cls, context, layout, action): + layout.label(text=action.name, icon='ACTION') + + layout.prop(action, "use_frame_range") + + col = layout.column() + col.active = action.use_frame_range + + row = col.row(align=True) + row.prop(action, "frame_start", text="Start") + row.prop(action, "frame_end", text="End") + + col.prop(action, "use_cyclic") + + +class DOPESHEET_PT_action(DopesheetActionPanelBase, Panel): + bl_space_type = 'DOPESHEET_EDITOR' + bl_category = "Item" + + @classmethod + def poll(cls, context): + return bool(context.selected_visible_actions) + + def draw(self, context): + action = context.selected_visible_actions[0] + self.draw_generic_panel(context, self.layout, action) + + ####################################### # Grease Pencil Editing @@ -778,7 +823,9 @@ classes = ( DOPESHEET_MT_context_menu, DOPESHEET_MT_channel_context_menu, DOPESHEET_MT_snap_pie, + DOPESHEET_MT_view_pie, DOPESHEET_PT_filters, + DOPESHEET_PT_action, DOPESHEET_PT_gpencil_mode, DOPESHEET_PT_gpencil_layer_masks, DOPESHEET_PT_gpencil_layer_transform, diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py index 4ae9a33785f..e33cf8d6cfb 100644 --- a/release/scripts/startup/bl_ui/space_filebrowser.py +++ b/release/scripts/startup/bl_ui/space_filebrowser.py @@ -404,7 +404,13 @@ class FILEBROWSER_PT_advanced_filter(Panel): def is_option_region_visible(context, space): - if not space.active_operator: + from bpy_extras.asset_utils import SpaceAssetInfo + + if SpaceAssetInfo.is_asset_browser(space): + pass + # For the File Browser, there must be an operator for there to be options + # (irrelevant for the Asset Browser). + elif not space.active_operator: return False for region in context.area.regions: @@ -701,7 +707,7 @@ class ASSETBROWSER_PT_metadata(asset_utils.AssetBrowserPanel, Panel): asset_file_handle = context.asset_file_handle if asset_file_handle is None: - layout.label(text="No asset selected", icon='INFO') + layout.label(text="No active asset", icon='INFO') return asset_library_ref = context.asset_library_ref diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py index 612b7ba2b09..1562870d64f 100644 --- a/release/scripts/startup/bl_ui/space_graph.py +++ b/release/scripts/startup/bl_ui/space_graph.py @@ -338,6 +338,18 @@ class GRAPH_MT_key_snap(Menu): layout.operator("graph.snap_cursor_value", text="Cursor Value to Selection") +class GRAPH_MT_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + pie = layout.menu_pie() + pie.operator("graph.view_all") + pie.operator("graph.view_selected", icon='ZOOM_SELECTED') + pie.operator("graph.view_frame") + + class GRAPH_MT_delete(Menu): bl_label = "Delete" @@ -468,6 +480,7 @@ classes = ( GRAPH_MT_channel_context_menu, GRAPH_MT_pivot_pie, GRAPH_MT_snap_pie, + GRAPH_MT_view_pie, GRAPH_PT_filters, ) diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py index 6a769b1aecc..8e82b07716c 100644 --- a/release/scripts/startup/bl_ui/space_image.py +++ b/release/scripts/startup/bl_ui/space_image.py @@ -591,6 +591,31 @@ class IMAGE_MT_uvs_snap_pie(Menu): ).target = 'ADJACENT_UNSELECTED' +class IMAGE_MT_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + sima = context.space_data + show_uvedit = sima.show_uvedit + show_maskedit = sima.show_maskedit + + pie = layout.menu_pie() + pie.operator("image.view_all") + + if show_uvedit or show_maskedit: + pie.operator("image.view_selected", text="Frame Selected", icon='ZOOM_SELECTED') + pie.operator("image.view_center_cursor", text="Center View to Cursor") + else: + # Add spaces so items stay in the same position through all modes. + pie.separator() + pie.separator() + + pie.operator("image.view_zoom_ratio", text="Zoom 1:1").ratio = 1 + pie.operator("image.view_all", text="Frame All Fit").fit_view = True + + class IMAGE_HT_tool_header(Header): bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'TOOL_HEADER' @@ -1633,6 +1658,7 @@ classes = ( IMAGE_MT_mask_context_menu, IMAGE_MT_pivot_pie, IMAGE_MT_uvs_snap_pie, + IMAGE_MT_view_pie, IMAGE_HT_tool_header, IMAGE_HT_header, IMAGE_MT_editor_menus, diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py index d472352084c..62c02799a9f 100644 --- a/release/scripts/startup/bl_ui/space_nla.py +++ b/release/scripts/startup/bl_ui/space_nla.py @@ -22,6 +22,7 @@ from bpy.types import Header, Menu, Panel from bpy.app.translations import contexts as i18n_contexts from bl_ui.space_dopesheet import ( DopesheetFilterPopoverBase, + DopesheetActionPanelBase, dopesheet_filter, ) @@ -66,6 +67,21 @@ class NLA_PT_filters(DopesheetFilterPopoverBase, Panel): DopesheetFilterPopoverBase.draw_standard_filters(context, layout) +class NLA_PT_action(DopesheetActionPanelBase, Panel): + bl_space_type = 'NLA_EDITOR' + bl_category = "Strip" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + strip = context.active_nla_strip + return strip and strip.type == 'CLIP' and strip.action + + def draw(self, context): + action = context.active_nla_strip.action + self.draw_generic_panel(context, self.layout, action) + + class NLA_MT_editor_menus(Menu): bl_idname = "NLA_MT_editor_menus" bl_label = "" @@ -247,6 +263,18 @@ class NLA_MT_snap_pie(Menu): pie.operator("nla.snap", text="Selection to Nearest Marker").type = 'NEAREST_MARKER' +class NLA_MT_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + pie = layout.menu_pie() + pie.operator("nla.view_all") + pie.operator("nla.view_selected", icon='ZOOM_SELECTED') + pie.operator("nla.view_frame") + + class NLA_MT_context_menu(Menu): bl_label = "NLA Context Menu" @@ -300,9 +328,11 @@ classes = ( NLA_MT_add, NLA_MT_edit_transform, NLA_MT_snap_pie, + NLA_MT_view_pie, NLA_MT_context_menu, NLA_MT_channel_context_menu, NLA_PT_filters, + NLA_PT_action, ) if __name__ == "__main__": # only for live edit. diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index 2fda13184da..9bf812e036d 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -367,6 +367,17 @@ class NODE_MT_node(Menu): layout.operator("node.read_viewlayers") +class NODE_MT_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + pie = layout.menu_pie() + pie.operator("node.view_all") + pie.operator("node.view_selected", icon='ZOOM_SELECTED') + + class NODE_PT_active_tool(ToolActivePanelHelper, Panel): bl_space_type = 'NODE_EDITOR' bl_region_type = 'UI' @@ -708,8 +719,13 @@ class NODE_PT_overlay(Panel): col.separator() + col.prop(overlay, "show_context_path", text="Context Path") col.prop(snode, "show_annotation", text="Annotations") + if snode.tree_type == 'GeometryNodeTree': + col.separator() + col.prop(overlay, "show_timing", text="Timings") + class NODE_UL_interface_sockets(bpy.types.UIList): def draw_item(self, context, layout, _data, item, icon, _active_data, _active_propname, _index): @@ -877,6 +893,7 @@ classes = ( NODE_MT_node, NODE_MT_node_color_context_menu, NODE_MT_context_menu, + NODE_MT_view_pie, NODE_PT_material_slots, NODE_PT_node_color_presets, NODE_PT_active_node_generic, diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py index 07fa2220915..d85538a37e0 100644 --- a/release/scripts/startup/bl_ui/space_outliner.py +++ b/release/scripts/startup/bl_ui/space_outliner.py @@ -142,6 +142,17 @@ class OUTLINER_MT_context_menu_view(Menu): layout.operator("outliner.show_one_level", text="Hide One Level").open = False +class OUTLINER_MT_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + pie = layout.menu_pie() + pie.operator("outliner.show_hierarchy") + pie.operator("outliner.show_active", icon='ZOOM_SELECTED') + + class OUTLINER_MT_edit_datablocks(Menu): bl_label = "Edit" @@ -471,6 +482,7 @@ classes = ( OUTLINER_MT_asset, OUTLINER_MT_context_menu, OUTLINER_MT_context_menu_view, + OUTLINER_MT_view_pie, OUTLINER_PT_filter, ) diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 32ada453b50..a2ec5075a4d 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -1159,6 +1159,31 @@ class SEQUENCER_MT_pivot_pie(Menu): pie.prop_enum(sequencer_tool_settings, "pivot_point", value='MEDIAN') +class SEQUENCER_MT_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + pie = layout.menu_pie() + pie.operator("sequencer.view_all") + pie.operator("sequencer.view_selected", text="Frame Selected", icon='ZOOM_SELECTED') + + +class SEQUENCER_MT_preview_view_pie(Menu): + bl_label = "View" + + def draw(self, context): + layout = self.layout + + pie = layout.menu_pie() + pie.operator_context = 'INVOKE_REGION_PREVIEW' + pie.operator("sequencer.view_all_preview") + pie.operator("sequencer.view_selected", text="Frame Selected", icon='ZOOM_SELECTED') + pie.separator() + pie.operator("sequencer.view_zoom_ratio", text="Zoom 1:1").ratio = 1 + + class SequencerButtonsPanel: bl_space_type = 'SEQUENCE_EDITOR' bl_region_type = 'UI' @@ -2601,6 +2626,8 @@ classes = ( SEQUENCER_MT_context_menu, SEQUENCER_MT_preview_context_menu, SEQUENCER_MT_pivot_pie, + SEQUENCER_MT_view_pie, + SEQUENCER_MT_preview_view_pie, SEQUENCER_PT_color_tag_picker, diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py index 9d41a0fa02f..c4dabb5b5bc 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_common.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py @@ -64,7 +64,7 @@ from collections import namedtuple ToolDef = namedtuple( "ToolDef", ( - # Unique tool name (withing space & mode context). + # Unique tool name (within space & mode context). "idname", # The name to display in the interface. "label", @@ -106,7 +106,7 @@ ToolDef = namedtuple( # Keep this functionality since it's likely useful for add-on key-maps. # # Warning: currently 'from_dict' this is a list of one item, - # so internally we can swap the key-map function for the key-map it's self. + # so internally we can swap the key-map function for the key-map itself. # This isn't very nice and may change, tool definitions shouldn't care about this. "keymap", # Optional data-block associated with this tool. diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index e7f93bddac3..4976834dd87 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -477,6 +477,16 @@ class USERPREF_PT_edit_weight_paint(EditingPanel, CenterAlignMixIn, Panel): col.active = view.use_weight_color_range col.template_color_ramp(view, "weight_color_range", expand=True) +class USERPREF_PT_edit_text_editor(EditingPanel, CenterAlignMixIn, Panel): + bl_label = "Text Editor" + bl_options = {'DEFAULT_CLOSED'} + + def draw_centered(self, context, layout): + prefs = context.preferences + edit = prefs.edit + + layout.prop(edit, "use_text_edit_auto_close") + class USERPREF_PT_edit_misc(EditingPanel, CenterAlignMixIn, Panel): bl_label = "Miscellaneous" @@ -1858,11 +1868,6 @@ class USERPREF_PT_addons(AddOnPanel, Panel): if p ) - # Development option for 2.8x, don't show users bundled addons - # unless they have been updated for 2.8x. - # Developers can turn them on with '--debug' - show_official_27x_addons = bpy.app.debug - # collect the categories that can be filtered on addons = [ (mod, addon_utils.module_bl_info(mod)) @@ -1939,15 +1944,6 @@ class USERPREF_PT_addons(AddOnPanel, Panel): ): continue - # Skip 2.7x add-ons included with Blender, unless in debug mode. - is_addon_27x = info.get("blender", (0,)) < (2, 80) - if ( - is_addon_27x and - (not show_official_27x_addons) and - (not mod.__file__.startswith(addon_user_dirs)) - ): - continue - # Addon UI Code col_box = col.column() box = col_box.box() @@ -1970,13 +1966,7 @@ class USERPREF_PT_addons(AddOnPanel, Panel): sub.active = is_enabled sub.label(text="%s: %s" % (info["category"], info["name"])) - # WARNING: 2.8x exception, may be removed - # use disabled state for old add-ons, chances are they are broken. - if is_addon_27x: - sub.label(text="Upgrade to 2.8x required") - sub.label(icon='ERROR') - # Remove code above after 2.8x migration is complete. - elif info["warning"]: + if info["warning"]: sub.label(icon='ERROR') # icon showing support level. @@ -2358,6 +2348,7 @@ classes = ( USERPREF_PT_edit_annotations, USERPREF_PT_edit_weight_paint, USERPREF_PT_edit_gpencil, + USERPREF_PT_edit_text_editor, USERPREF_PT_edit_misc, USERPREF_PT_animation_timeline, diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 34f447a7108..4880a07115a 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -111,13 +111,13 @@ def curve_node_items(context): yield NodeItem("GeometryNodeTrimCurve") yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) yield NodeItem("GeometryNodeInputCurveHandlePositions") - yield NodeItem("GeometryNodeCurveParameter") yield NodeItem("GeometryNodeInputTangent") yield NodeItem("GeometryNodeInputCurveTilt") yield NodeItem("GeometryNodeCurveEndpointSelection") yield NodeItem("GeometryNodeCurveHandleTypeSelection") yield NodeItem("GeometryNodeInputSplineCyclic") yield NodeItem("GeometryNodeSplineLength") + yield NodeItem("GeometryNodeSplineParameter") yield NodeItem("GeometryNodeInputSplineResolution") yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) yield NodeItem("GeometryNodeSetCurveRadius") @@ -141,6 +141,7 @@ def mesh_node_items(context): yield NodeItem("GeometryNodeLegacySubdivisionSurface", poll=geometry_nodes_legacy_poll) yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeDualMesh") yield NodeItem("GeometryNodeMeshBoolean") yield NodeItem("GeometryNodeMeshToCurve") yield NodeItem("GeometryNodeMeshToPoints") @@ -675,6 +676,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeAttributeRemove", poll=geometry_nodes_legacy_poll), NodeItem("GeometryNodeCaptureAttribute"), + NodeItem("GeometryNodeAttributeDomainSize"), NodeItem("GeometryNodeAttributeStatistic"), NodeItem("GeometryNodeAttributeTransfer"), ]), @@ -749,7 +751,7 @@ geometry_node_categories = [ NodeItem("ShaderNodeMath"), NodeItem("FunctionNodeBooleanMath"), NodeItem("FunctionNodeRotateEuler"), - NodeItem("FunctionNodeCompareFloats"), + NodeItem("FunctionNodeCompare"), NodeItem("FunctionNodeFloatToInt"), NodeItem("GeometryNodeSwitch"), NodeItem("FunctionNodeRandomValue"), |