Changeset View
Changeset View
Standalone View
Standalone View
release/scripts/startup/bl_ui/space_outliner.py
| Show All 25 Lines | class OUTLINER_HT_header(Header): | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| space = context.space_data | space = context.space_data | ||||
| display_mode = space.display_mode | display_mode = space.display_mode | ||||
| scene = context.scene | scene = context.scene | ||||
| ks = context.scene.keying_sets.active | ks = context.scene.keying_sets.active | ||||
| support_filters = display_mode in {'COLLECTIONS', 'VIEW_LAYER'} | |||||
| row = layout.row(align=True) | row = layout.row(align=True) | ||||
| row.template_header() | row.template_header() | ||||
| layout.prop(space, "display_mode", text="") | layout.prop(space, "display_mode", text="") | ||||
| row = layout.row() | |||||
| if display_mode in {'OBJECTS', 'COLLECTIONS'}: | |||||
| row.popover(space_type='OUTLINER', | |||||
| region_type='HEADER', | |||||
| panel_type="OUTLINER_PT_filter", | |||||
| text="", | |||||
| icon='FILTER') | |||||
| OUTLINER_MT_editor_menus.draw_collapsible(context, layout) | OUTLINER_MT_editor_menus.draw_collapsible(context, layout) | ||||
| if space.display_mode == 'DATABLOCKS': | if display_mode == 'DATABLOCKS': | ||||
| layout.separator() | layout.separator() | ||||
| row = layout.row(align=True) | row = layout.row(align=True) | ||||
| row.operator("outliner.keyingset_add_selected", icon='ZOOMIN', text="") | row.operator("outliner.keyingset_add_selected", icon='ZOOMIN', text="") | ||||
| row.operator("outliner.keyingset_remove_selected", icon='ZOOMOUT', text="") | row.operator("outliner.keyingset_remove_selected", icon='ZOOMOUT', text="") | ||||
| if ks: | if ks: | ||||
| row = layout.row() | row = layout.row() | ||||
| row.prop_search(scene.keying_sets, "active", scene, "keying_sets", text="") | row.prop_search(scene.keying_sets, "active", scene, "keying_sets", text="") | ||||
| row = layout.row(align=True) | row = layout.row(align=True) | ||||
| row.operator("anim.keyframe_insert", text="", icon='KEY_HLT') | row.operator("anim.keyframe_insert", text="", icon='KEY_HLT') | ||||
| row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT') | row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT') | ||||
| else: | else: | ||||
| row = layout.row() | row = layout.row() | ||||
| row.label(text="No Keying Set Active") | row.label(text="No Keying Set Active") | ||||
| row = layout.row(align=True) | row = layout.row(align=True) | ||||
| row.prop(space, "use_filter_search", text="") | row.prop(space, "use_filter_search", text="") | ||||
| if space.use_filter_search: | if space.use_filter_search: | ||||
| row.prop(space, "filter_text", text="") | row.prop(space, "filter_text", text="") | ||||
| row.prop(space, "use_filter_complete", text="") | row.prop(space, "use_filter_complete", text="") | ||||
| row.prop(space, "use_filter_case_sensitive", text="") | row.prop(space, "use_filter_case_sensitive", text="") | ||||
| row = layout.row() | |||||
| if support_filters: | |||||
| row.popover(space_type='OUTLINER', | |||||
| region_type='HEADER', | |||||
| panel_type="OUTLINER_PT_filter", | |||||
| text="", | |||||
| icon='FILTER') | |||||
| class OUTLINER_MT_editor_menus(Menu): | class OUTLINER_MT_editor_menus(Menu): | ||||
| bl_idname = "OUTLINER_MT_editor_menus" | bl_idname = "OUTLINER_MT_editor_menus" | ||||
| bl_label = "" | bl_label = "" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| self.draw_menus(self.layout, context) | self.draw_menus(self.layout, context) | ||||
| @staticmethod | @staticmethod | ||||
| def draw_menus(layout, context): | def draw_menus(layout, context): | ||||
| space = context.space_data | space = context.space_data | ||||
| layout.menu("OUTLINER_MT_view") | layout.menu("OUTLINER_MT_view") | ||||
| if space.display_mode == 'DATABLOCKS': | if space.display_mode == 'DATABLOCKS': | ||||
| layout.menu("OUTLINER_MT_edit_datablocks") | layout.menu("OUTLINER_MT_edit_datablocks") | ||||
| elif space.display_mode == 'ORPHAN_DATA': | elif space.display_mode == 'ORPHAN_DATA': | ||||
| layout.menu("OUTLINER_MT_edit_orphan_data") | layout.menu("OUTLINER_MT_edit_orphan_data") | ||||
| elif space.display_mode == 'VIEW_LAYER': | |||||
| layout.menu("OUTLINER_MT_edit_view_layer") | |||||
| class OUTLINER_MT_view(Menu): | class OUTLINER_MT_view(Menu): | ||||
| bl_label = "View" | bl_label = "View" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| space = context.space_data | space = context.space_data | ||||
| Show All 10 Lines | def draw(self, context): | ||||
| layout.separator() | layout.separator() | ||||
| layout.operator("screen.area_dupli") | layout.operator("screen.area_dupli") | ||||
| layout.operator("screen.screen_full_area") | layout.operator("screen.screen_full_area") | ||||
| layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area").use_hide_panels = True | layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area").use_hide_panels = True | ||||
| class OUTLINER_MT_edit_view_layer(Menu): | |||||
| bl_label = "Edit" | |||||
| def draw(self, context): | |||||
| layout = self.layout | |||||
| layout.operator("outliner.collection_link", icon='LINKED') | |||||
| layout.operator("outliner.collection_new", icon='NEW') | |||||
| class OUTLINER_MT_edit_datablocks(Menu): | class OUTLINER_MT_edit_datablocks(Menu): | ||||
| bl_label = "Edit" | bl_label = "Edit" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| layout.operator("outliner.keyingset_add_selected") | layout.operator("outliner.keyingset_add_selected") | ||||
| layout.operator("outliner.keyingset_remove_selected") | layout.operator("outliner.keyingset_remove_selected") | ||||
| layout.separator() | layout.separator() | ||||
| layout.operator("outliner.drivers_add_selected") | layout.operator("outliner.drivers_add_selected") | ||||
| layout.operator("outliner.drivers_delete_selected") | layout.operator("outliner.drivers_delete_selected") | ||||
| class OUTLINER_MT_edit_orphan_data(Menu): | class OUTLINER_MT_edit_orphan_data(Menu): | ||||
| bl_label = "Edit" | bl_label = "Edit" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| layout.operator("outliner.orphans_purge") | layout.operator("outliner.orphans_purge") | ||||
| class OUTLINER_MT_context_scene_collection(Menu): | class OUTLINER_MT_collection(Menu): | ||||
| bl_label = "Collection" | bl_label = "Collection" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| layout.operator("outliner.collection_nested_new", text="New Collection", icon='NEW') | space = context.space_data | ||||
| layout.operator("outliner.collection_duplicate", text="Duplicate Collection") | |||||
| layout.operator("outliner.collection_delete_selected", text="Delete Collections", icon='X') | layout.operator("outliner.collection_new", text="New") | ||||
| 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.separator() | ||||
| layout.operator("outliner.collection_objects_add", text="Add Selected", icon='ZOOMIN') | |||||
| layout.operator("outliner.collection_objects_remove", text="Remove Selected", icon='ZOOMOUT') | |||||
| layout.operator("outliner.collection_objects_select", text="Select Objects") | |||||
| layout.operator("outliner.collection_objects_deselect", text="Deselect Objects") | |||||
| class OUTLINER_MT_context_object_select(Menu): | layout.separator() | ||||
| bl_label = "Object Operation Select" | |||||
| def draw(self, context): | layout.operator("outliner.collection_instance", text="Instance to Scene") | ||||
| layout = self.layout | if space.display_mode == 'COLLECTIONS' and space.filter_collection != 'SCENE': | ||||
| layout.operator("outliner.collection_link", text="Link to Scene") | |||||
| layout.operator("outliner.id_operation", text="Unlink").type='UNLINK' | |||||
| layout.operator("outliner.object_operation", text="Select").type='SELECT' | # TODO: needed for static override, but not all operators work | ||||
| layout.operator("outliner.object_operation", text="Deselect").type='DESELECT' | layout.separator() | ||||
| layout.operator("outliner.object_operation", text="Select Hierarchy").type='SELECT_HIERARCHY' | layout.operator_menu_enum("outliner.id_operation", 'type', text="ID Data") | ||||
| class OUTLINER_MT_context_object_delete(Menu): | class OUTLINER_MT_collection_new(Menu): | ||||
| bl_label = "Object Operation Delete" | bl_label = "Collection" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| layout.operator("outliner.object_operation", text="Delete").type='DELETE' | layout.operator("outliner.collection_new", text="New") | ||||
| layout.operator("outliner.object_operation", text="Delete Hierarchy").type='DELETE_HIERARCHY' | |||||
| class OUTLINER_MT_context_object_collection(Menu): | class OUTLINER_MT_object(Menu): | ||||
| bl_label = "Object Operation Collection" | bl_label = "Object" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| layout.operator("outliner.object_add_to_new_collection", text="Add to New Collection", icon='ZOOMIN') | space = context.space_data | ||||
| layout.operator("outliner.object_remove_from_collection", text="Remove from Collection", icon='ZOOMOUT') | |||||
| layout.operator("outliner.object_operation", text="Delete").type='DELETE' | |||||
| if space.display_mode != 'COLLECTIONS': | |||||
| layout.operator("outliner.object_operation", text="Delete Hierarchy").type='DELETE_HIERARCHY' | |||||
| class OUTLINER_MT_context_object(Menu): | layout.separator() | ||||
| bl_label = "Object" | |||||
| def draw(self, context): | layout.operator("outliner.object_operation", text="Select").type='SELECT' | ||||
| layout = self.layout | layout.operator("outliner.object_operation", text="Select Hierarchy").type='SELECT_HIERARCHY' | ||||
| layout.operator("outliner.object_operation", text="Deselect").type='DESELECT' | |||||
| layout.menu("OUTLINER_MT_context_object_select", text="Select") | |||||
| layout.menu("OUTLINER_MT_context_object_delete", text="Delete") | |||||
| layout.menu("OUTLINER_MT_context_object_collection", text="Collection") | |||||
| layout.separator() | layout.separator() | ||||
| layout.operator("outliner.object_operation", text="Remap Users").type='REMAP' | |||||
| layout.operator("outliner.object_operation", text="Rename").type='RENAME' | if space.display_mode == 'COLLECTIONS': | ||||
| layout.operator("outliner.id_operation", text="Unlink").type='UNLINK' | |||||
| layout.separator() | |||||
| # TODO: needed for static override, but not all operators work | |||||
| layout.operator_menu_enum("outliner.id_operation", 'type', text="ID Data") | |||||
| class OUTLINER_PT_filter(Panel): | class OUTLINER_PT_filter(Panel): | ||||
| bl_space_type = 'OUTLINER' | bl_space_type = 'OUTLINER' | ||||
| bl_region_type = 'HEADER' | bl_region_type = 'HEADER' | ||||
| bl_label = "Filter" | bl_label = "Filter" | ||||
| def draw(self, context): | def draw(self, context): | ||||
| layout = self.layout | layout = self.layout | ||||
| space = context.space_data | space = context.space_data | ||||
| display_mode = space.display_mode | |||||
| if display_mode == 'COLLECTIONS': | |||||
| col = layout.column(align=True) | |||||
| col.label(text="Collections:") | |||||
| col.row().prop(space, "filter_collection", expand=True) | |||||
| layout.separator() | |||||
| col = layout.column() | col = layout.column() | ||||
| col.prop(space, "filter_state", text="") | if display_mode == 'COLLECTIONS': | ||||
| col.prop(space, "use_filter_object", text="Objects") | |||||
| active = space.use_filter_object | |||||
| else: | |||||
| col.label("Objects:") | |||||
| active = True | |||||
| sub = col.column(align=True) | sub = col.column(align=True) | ||||
| sub.active = space.filter_state != 'NONE' | sub.active = active | ||||
| sub.prop(space, "filter_state", text="") | |||||
| sub.prop(space, "use_filter_object_content", text="Object Contents") | sub.prop(space, "use_filter_object_content", text="Object Contents") | ||||
| sub.prop(space, "use_filter_children", text="Object Children") | sub.prop(space, "use_filter_children", text="Object Children") | ||||
| layout.separator() | layout.separator() | ||||
| col = layout.column_flow(align=True) | col = layout.column_flow(align=True) | ||||
| col.active = space.filter_state != 'NONE' | col.active = active | ||||
| if bpy.data.meshes: | if bpy.data.meshes: | ||||
| col.prop(space, "use_filter_object_mesh", text="Meshes") | col.prop(space, "use_filter_object_mesh", text="Meshes") | ||||
| if bpy.data.armatures: | if bpy.data.armatures: | ||||
| col.prop(space, "use_filter_object_armature", text="Armatures") | col.prop(space, "use_filter_object_armature", text="Armatures") | ||||
| if bpy.data.lamps: | if bpy.data.lamps: | ||||
| col.prop(space, "use_filter_object_lamp", text="Lamps") | col.prop(space, "use_filter_object_lamp", text="Lamps") | ||||
| if bpy.data.cameras: | if bpy.data.cameras: | ||||
| col.prop(space, "use_filter_object_camera", text="Cameras") | col.prop(space, "use_filter_object_camera", text="Cameras") | ||||
| col.prop(space, "use_filter_object_empty", text="Empties") | col.prop(space, "use_filter_object_empty", text="Empties") | ||||
| if bpy.data.curves or \ | if bpy.data.curves or \ | ||||
| bpy.data.metaballs or \ | bpy.data.metaballs or \ | ||||
| bpy.data.lightprobes or \ | bpy.data.lightprobes or \ | ||||
| bpy.data.lattices or \ | bpy.data.lattices or \ | ||||
| bpy.data.fonts or bpy.data.speakers: | bpy.data.fonts or bpy.data.speakers: | ||||
| col.prop(space, "use_filter_object_others", text="Others") | col.prop(space, "use_filter_object_others", text="Others") | ||||
| layout.separator() | |||||
| layout.prop(space, "use_filter_collection", text="Collections") | |||||
| classes = ( | classes = ( | ||||
| OUTLINER_HT_header, | OUTLINER_HT_header, | ||||
| OUTLINER_MT_editor_menus, | OUTLINER_MT_editor_menus, | ||||
| OUTLINER_MT_view, | OUTLINER_MT_view, | ||||
| OUTLINER_MT_edit_view_layer, | |||||
| OUTLINER_MT_edit_datablocks, | OUTLINER_MT_edit_datablocks, | ||||
| OUTLINER_MT_edit_orphan_data, | OUTLINER_MT_edit_orphan_data, | ||||
| OUTLINER_MT_context_scene_collection, | OUTLINER_MT_collection, | ||||
| OUTLINER_MT_context_object, | OUTLINER_MT_collection_new, | ||||
| OUTLINER_MT_context_object_delete, | OUTLINER_MT_object, | ||||
| OUTLINER_MT_context_object_select, | |||||
| OUTLINER_MT_context_object_collection, | |||||
| OUTLINER_PT_filter, | OUTLINER_PT_filter, | ||||
| ) | ) | ||||
| if __name__ == "__main__": # only for live edit. | if __name__ == "__main__": # only for live edit. | ||||
| from bpy.utils import register_class | from bpy.utils import register_class | ||||
| for cls in classes: | for cls in classes: | ||||
| register_class(cls) | register_class(cls) | ||||