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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts/startup/bl_ui/space_outliner.py')
-rw-r--r--release/scripts/startup/bl_ui/space_outliner.py218
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.