diff options
Diffstat (limited to 'release/scripts/startup/bl_ui/space_outliner.py')
-rw-r--r-- | release/scripts/startup/bl_ui/space_outliner.py | 218 |
1 files changed, 193 insertions, 25 deletions
diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py index 4951ef83ad0..df48d17274d 100644 --- a/release/scripts/startup/bl_ui/space_outliner.py +++ b/release/scripts/startup/bl_ui/space_outliner.py @@ -18,7 +18,7 @@ # <pep8 compliant> import bpy -from bpy.types import Header, Menu +from bpy.types import Header, Menu, Panel class OUTLINER_HT_header(Header): @@ -28,21 +28,41 @@ class OUTLINER_HT_header(Header): layout = self.layout space = context.space_data + display_mode = space.display_mode scene = context.scene ks = context.scene.keying_sets.active row = layout.row(align=True) row.template_header() - OUTLINER_MT_editor_menus.draw_collapsible(context, layout) + layout.prop(space, "display_mode", icon_only=True) - layout.prop(space, "display_mode", text="") + if display_mode in {'VIEW_LAYER'}: + layout.operator("outliner.collection_new", text="", icon="GROUP").nested = True - layout.prop(space, "filter_text", icon='VIEWZOOM', text="") + layout.separator_spacer() - layout.separator() + row = layout.row(align=True) + row.prop(space, "filter_text", icon='VIEWZOOM', text="") + + layout.separator_spacer() + + row = layout.row(align=True) + if display_mode in {'VIEW_LAYER'}: + row.popover(space_type='OUTLINER', + region_type='HEADER', + panel_type="OUTLINER_PT_filter", + text="", + icon='FILTER') + elif display_mode in {'LIBRARIES', 'ORPHAN_DATA'}: + row.prop(space, "use_filter_id_type", text="", icon='FILTER') + sub = row.row(align=True) + sub.active = space.use_filter_id_type + sub.prop(space, "filter_id_type", text="", icon_only=True) + + if space.display_mode == 'DATA_API': + layout.separator() - if space.display_mode == 'DATABLOCKS': row = layout.row(align=True) row.operator("outliner.keyingset_add_selected", icon='ZOOMIN', text="") row.operator("outliner.keyingset_remove_selected", icon='ZOOMOUT', text="") @@ -57,8 +77,8 @@ class OUTLINER_HT_header(Header): else: row = layout.row() row.label(text="No Keying Set Active") - elif space.display_mode == 'ORPHAN_DATA': - layout.operator("outliner.orphans_purge") + + OUTLINER_MT_editor_menus.draw_collapsible(context, layout) class OUTLINER_MT_editor_menus(Menu): @@ -73,11 +93,13 @@ class OUTLINER_MT_editor_menus(Menu): space = context.space_data layout.menu("OUTLINER_MT_view") - layout.menu("OUTLINER_MT_search") - if space.display_mode == 'DATABLOCKS': + if space.display_mode == 'DATA_API': layout.menu("OUTLINER_MT_edit_datablocks") + elif space.display_mode == 'ORPHAN_DATA': + layout.menu("OUTLINER_MT_edit_orphan_data") + class OUTLINER_MT_view(Menu): bl_label = "View" @@ -87,56 +109,202 @@ class OUTLINER_MT_view(Menu): space = context.space_data - if space.display_mode not in {'DATABLOCKS', 'USER_PREFERENCES'}: + layout.prop(space, "use_filter_complete", text="Exact Match Search") + layout.prop(space, "use_filter_case_sensitive", text="Case Sensitive Search") + + layout.separator() + + if space.display_mode != 'DATA_API': layout.prop(space, "use_sort_alpha") layout.prop(space, "show_restrict_columns") layout.separator() layout.operator("outliner.show_active") + layout.separator() + layout.operator("outliner.show_one_level", text="Show One Level") layout.operator("outliner.show_one_level", text="Hide One Level").open = False layout.operator("outliner.show_hierarchy") layout.separator() - layout.operator("screen.area_dupli") - layout.operator("screen.screen_full_area") - layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area").use_hide_panels = True + layout.menu("INFO_MT_area") -class OUTLINER_MT_search(Menu): - bl_label = "Search" +class OUTLINER_MT_edit_datablocks(Menu): + bl_label = "Edit" def draw(self, context): layout = self.layout - space = context.space_data + layout.operator("outliner.keyingset_add_selected") + layout.operator("outliner.keyingset_remove_selected") - layout.prop(space, "use_filter_case_sensitive") - layout.prop(space, "use_filter_complete") + layout.separator() + layout.operator("outliner.drivers_add_selected") + layout.operator("outliner.drivers_delete_selected") -class OUTLINER_MT_edit_datablocks(Menu): + +class OUTLINER_MT_edit_orphan_data(Menu): bl_label = "Edit" def draw(self, context): layout = self.layout + layout.operator("outliner.orphans_purge") + + +class OUTLINER_MT_collection_view_layer(Menu): + bl_label = "View Layer" + + def draw(self, context): + layout = self.layout + + space = context.space_data + + layout.operator("outliner.collection_exclude_set", text="Exclude") + layout.operator("outliner.collection_include_set", text="Include") - layout.operator("outliner.keyingset_add_selected") - layout.operator("outliner.keyingset_remove_selected") + +class OUTLINER_MT_collection(Menu): + bl_label = "Collection" + + def draw(self, context): + layout = self.layout + + space = context.space_data + + layout.operator("outliner.collection_new", text="New").nested = True + layout.operator("outliner.collection_duplicate", text="Duplicate") + layout.operator("outliner.collection_delete", text="Delete").hierarchy = False + layout.operator("outliner.collection_delete", text="Delete Hierarchy").hierarchy = True layout.separator() - layout.operator("outliner.drivers_add_selected") - layout.operator("outliner.drivers_delete_selected") + layout.operator("outliner.collection_objects_select", text="Select Objects") + layout.operator("outliner.collection_objects_deselect", text="Deselect Objects") + + layout.separator() + + layout.operator("outliner.collection_instance", text="Instance to Scene") + if space.display_mode != 'VIEW_LAYER': + layout.operator("outliner.collection_link", text="Link to Scene") + layout.operator("outliner.id_operation", text="Unlink").type = 'UNLINK' + + if space.display_mode == 'VIEW_LAYER': + layout.separator() + layout.menu("OUTLINER_MT_collection_view_layer") + + layout.separator() + layout.operator_menu_enum("outliner.id_operation", "type", text="ID Data") + + +class OUTLINER_MT_collection_new(Menu): + bl_label = "Collection" + + def draw(self, context): + layout = self.layout + + layout.operator("outliner.collection_new", text="New").nested = False + + +class OUTLINER_MT_object(Menu): + bl_label = "Object" + + def draw(self, context): + layout = self.layout + + space = context.space_data + obj = context.active_object + object_mode = 'OBJECT' if obj is None else obj.mode + + layout.operator("outliner.object_operation", text="Delete").type = 'DELETE' + if space.display_mode == 'VIEW_LAYER' and not space.use_filter_collection: + layout.operator("outliner.object_operation", text="Delete Hierarchy").type = 'DELETE_HIERARCHY' + + layout.separator() + + layout.operator("outliner.object_operation", text="Select").type = 'SELECT' + layout.operator("outliner.object_operation", text="Select Hierarchy").type = 'SELECT_HIERARCHY' + layout.operator("outliner.object_operation", text="Deselect").type = 'DESELECT' + + layout.separator() + + if object_mode in {'EDIT', 'POSE'}: + name = bpy.types.Object.bl_rna.properties["mode"].enum_items[object_mode].name + layout.operator("outliner.object_operation", text=f"{name} Set").type = 'OBJECT_MODE_ENTER' + layout.operator("outliner.object_operation", text=f"{name} Clear").type = 'OBJECT_MODE_EXIT' + del name + + layout.separator() + + if not (space.display_mode == 'VIEW_LAYER' and not space.use_filter_collection): + layout.operator("outliner.id_operation", text="Unlink").type = 'UNLINK' + layout.separator() + + layout.operator_menu_enum("outliner.id_operation", "type", text="ID Data") + + +class OUTLINER_PT_filter(Panel): + bl_space_type = 'OUTLINER' + bl_region_type = 'HEADER' + bl_label = "Filter" + + def draw(self, context): + layout = self.layout + + space = context.space_data + display_mode = space.display_mode + + layout.prop(space, "use_filter_collection", text="Collections") + + layout.separator() + + col = layout.column() + col.prop(space, "use_filter_object", text="Objects") + active = space.use_filter_object + + sub = col.column(align=True) + sub.active = active + sub.prop(space, "filter_state", text="") + sub.prop(space, "use_filter_object_content", text="Object Contents") + sub.prop(space, "use_filter_children", text="Object Children") + + layout.separator() + + col = layout.column_flow(align=True) + col.active = active + + if bpy.data.meshes: + col.prop(space, "use_filter_object_mesh", text="Meshes") + if bpy.data.armatures: + col.prop(space, "use_filter_object_armature", text="Armatures") + if bpy.data.lamps: + col.prop(space, "use_filter_object_lamp", text="Lamps") + if bpy.data.cameras: + col.prop(space, "use_filter_object_camera", text="Cameras") + + col.prop(space, "use_filter_object_empty", text="Empties") + + if bpy.data.curves or \ + bpy.data.metaballs or \ + bpy.data.lightprobes or \ + bpy.data.lattices or \ + bpy.data.fonts or bpy.data.speakers: + col.prop(space, "use_filter_object_others", text="Others") classes = ( OUTLINER_HT_header, OUTLINER_MT_editor_menus, OUTLINER_MT_view, - OUTLINER_MT_search, OUTLINER_MT_edit_datablocks, + OUTLINER_MT_edit_orphan_data, + OUTLINER_MT_collection, + OUTLINER_MT_collection_new, + OUTLINER_MT_collection_view_layer, + OUTLINER_MT_object, + OUTLINER_PT_filter, ) if __name__ == "__main__": # only for live edit. |