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

space_spreadsheet.py « bl_ui « startup « scripts « release - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 846582b014232c521a286f671fbcb6475bdd7d33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# SPDX-License-Identifier: GPL-2.0-or-later

import bpy


class SPREADSHEET_HT_header(bpy.types.Header):
    bl_space_type = 'SPREADSHEET'

    def draw(self, context):
        layout = self.layout
        space = context.space_data

        layout.template_header()
        viewer_path = space.viewer_path.path

        if len(viewer_path) == 0:
            self.draw_without_viewer_path(layout)
            return
        root_context = viewer_path[0]
        if root_context.type != 'ID':
            self.draw_without_viewer_path(layout)
            return
        if not isinstance(root_context.id, bpy.types.Object):
            self.draw_without_viewer_path(layout)
            return
        obj = root_context.id
        if obj is None:
            self.draw_without_viewer_path(layout)
            return

        layout.prop(space, "object_eval_state", text="")

        if space.object_eval_state == 'ORIGINAL':
            # Only show first context.
            viewer_path = viewer_path[:1]
        if space.display_viewer_path_collapsed:
            self.draw_collapsed_viewer_path(context, layout, viewer_path)
        else:
            self.draw_full_viewer_path(context, layout, viewer_path)

        pin_icon = 'PINNED' if space.is_pinned else 'UNPINNED'
        layout.operator("spreadsheet.toggle_pin", text="", icon=pin_icon, emboss=False)

        if space.object_eval_state == 'VIEWER_NODE' and len(viewer_path) < 3:
            layout.label(text="No active viewer node", icon='INFO')

        layout.separator_spacer()

        row = layout.row(align=True)
        sub = row.row(align=True)
        sub.active = self.selection_filter_available(space)
        sub.prop(space, "show_only_selected", text="")
        row.prop(space, "use_filter", toggle=True, icon='FILTER', icon_only=True)

    def draw_without_viewer_path(self, layout):
        layout.label(text="No active context")

    def draw_full_viewer_path(self, context, layout, viewer_path):
        space = context.space_data
        row = layout.row()
        for ctx in viewer_path[:-1]:
            subrow = row.row(align=True)
            self.draw_spreadsheet_context(subrow, ctx)
            self.draw_spreadsheet_viewer_path_icon(subrow, space)

        self.draw_spreadsheet_context(row, viewer_path[-1])

    def draw_collapsed_viewer_path(self, context, layout, viewer_path):
        space = context.space_data
        row = layout.row(align=True)
        self.draw_spreadsheet_context(row, viewer_path[0])
        if len(viewer_path) == 1:
            return
        self.draw_spreadsheet_viewer_path_icon(row, space)
        if len(viewer_path) > 2:
            self.draw_spreadsheet_viewer_path_icon(row, space, icon='DOT')
            self.draw_spreadsheet_viewer_path_icon(row, space)
        self.draw_spreadsheet_context(row, viewer_path[-1])

    def draw_spreadsheet_context(self, layout, ctx):
        if ctx.type == 'ID':
            if ctx.id is not None and isinstance(ctx.id, bpy.types.Object):
                layout.label(text=ctx.id.name, icon='OBJECT_DATA')
            else:
                layout.label(text="Invalid id")
        elif ctx.type == 'MODIFIER':
            layout.label(text=ctx.modifier_name, icon='MODIFIER')
        elif ctx.type == 'NODE':
            layout.label(text=ctx.node_name, icon='NODE')

    def draw_spreadsheet_viewer_path_icon(self, layout, space, icon='RIGHTARROW_THIN'):
        layout.prop(space, "display_viewer_path_collapsed", icon_only=True, emboss=False, icon=icon)

    def selection_filter_available(self, space):
        root_context = space.viewer_path.path[0]
        if root_context.type != 'ID':
            return False
        if not isinstance(root_context.id, bpy.types.Object):
            return False
        obj = root_context.id
        if obj is None:
            return False
        if obj.type == 'MESH':
            return obj.mode == 'EDIT'
        if obj.type == 'CURVES':
            return obj.mode == 'SCULPT_CURVES'
        return True


classes = (
    SPREADSHEET_HT_header,
)

if __name__ == "__main__":  # Only for live edit.
    from bpy.utils import register_class
    for cls in classes:
        register_class(cls)