Beispiel #1
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        layout.prop(st, "use_normalization", text="Normalize")
        row = layout.row()
        row.active = st.use_normalization
        row.prop(st, "use_auto_normalization", text="Auto")

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", icon_only=True)

        row = layout.row(align=True)
        row.operator("graph.copy", text="", icon='COPYDOWN')
        row.operator("graph.paste", text="", icon='PASTEDOWN')

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
Beispiel #2
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        layout.prop(st, "use_normalization", text="Normalize")
        row = layout.row()
        row.active = st.use_normalization
        row.prop(st, "use_auto_normalization", text="Auto")

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", text="", icon_only=True)

        row = layout.row(align=True)
        row.operator("graph.copy", text="", icon='COPYDOWN')
        row.operator("graph.paste", text="", icon='PASTEDOWN')

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
Beispiel #3
0
    def draw(self, context):
        layout = self.layout
        tool_settings = context.tool_settings

        st = context.space_data

        layout.template_header()

        # Now a exposed as a sub-space type
        # layout.prop(st, "mode", text="")

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        row = layout.row(align=True)
        row.prop(st,
                 "use_normalization",
                 icon='NORMALIZE_FCURVES',
                 text="Normalize",
                 toggle=True)
        sub = row.row(align=True)
        sub.active = st.use_normalization
        sub.prop(st,
                 "use_auto_normalization",
                 icon='FILE_REFRESH',
                 text="",
                 toggle=True)

        layout.separator_spacer()

        dopesheet_filter(layout, context)

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='X')
        else:
            row.operator("graph.ghost_curves_create",
                         text="",
                         icon='FCURVE_SNAPSHOT')

        layout.popover(
            panel="GRAPH_PT_filters",
            text="",
            icon='FILTER',
        )

        layout.prop(st, "pivot_point", icon_only=True)

        layout.prop(st, "auto_snap", text="")

        row = layout.row(align=True)
        row.prop(tool_settings,
                 "use_proportional_fcurve",
                 text="",
                 icon_only=True)
        sub = row.row(align=True)
        sub.active = tool_settings.use_proportional_fcurve
        sub.prop(tool_settings,
                 "proportional_edit_falloff",
                 text="",
                 icon_only=True)
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        if context.area.show_menus:
            row.menu("GRAPH_MT_view")
            row.menu("GRAPH_MT_select")
            row.menu("GRAPH_MT_marker")
            row.menu("GRAPH_MT_channel")
            row.menu("GRAPH_MT_key")

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", text="", icon_only=True)

        row = layout.row(align=True)
        row.operator("graph.copy", text="", icon='COPYDOWN')
        row.operator("graph.paste", text="", icon='PASTEDOWN')

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
Beispiel #5
0
    def draw(self, context):
        layout = self.layout

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu

        ########################### Switch between the editors

        # bfa - The tabs to switch between the four animation editors. The classes are in space_dopesheet.py
        row = layout.row(align=True)

        row.operator("wm.switch_editor_to_dopesheet", text="", icon='ACTION')
        row.operator("wm.switch_editor_to_graph", text="", icon='GRAPH')
        row.operator("wm.switch_editor_to_driver", text="", icon='DRIVER')
        row.operator("wm.switch_editor_in_nla", text="", icon='NLA_ACTIVE')

        ###########################

        NLA_MT_editor_menus.draw_collapsible(context, layout)

        layout.separator_spacer()

        dopesheet_filter(layout, context)

        layout.popover(panel="NLA_PT_filters", text="", icon='FILTER')

        layout.prop(st, "auto_snap", text="")
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        if context.area.show_menus:
            row.menu("GRAPH_MT_view")
            row.menu("GRAPH_MT_select")
            row.menu("GRAPH_MT_marker")
            row.menu("GRAPH_MT_channel")
            row.menu("GRAPH_MT_key")

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", text="", icon_only=True)

        row = layout.row(align=True)
        row.operator("graph.copy", text="", icon='COPYDOWN')
        row.operator("graph.paste", text="", icon='PASTEDOWN')

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
Beispiel #7
0
    def draw(self, context):
        layout = self.layout

        st = context.space_data
        scene = context.scene

        preferences = context.preferences
        addon_prefs = preferences.addons["bforartists_toolbar_settings"].preferences

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu

        ########################### Switch between the editors

        # bfa - The tabs to switch between the four animation editors. The classes are in space_dopesheet.py
        row = layout.row(align=True)

        row.operator("wm.switch_editor_to_dopesheet", text="", icon='ACTION')
        row.operator("wm.switch_editor_to_graph", text="", icon='GRAPH')
        row.operator("wm.switch_editor_to_driver", text="", icon='DRIVER')
        row.operator("wm.switch_editor_in_nla", text="", icon='NLA_ACTIVE')

        ########################### tweak strip actions

        row = layout.row(align = True)

        if addon_prefs.nla_tweak_isolate_action:

            if scene.is_nla_tweakmode:
                row.active_default = True
                row.operator("nla.tweakmode_exit", text="Tweak", icon = "ACTION_TWEAK_SOLO").isolate_action = True
                row.label(icon = "CHECKBOX_HLT", text = "Isolate")
            else:
                row.operator("nla.tweakmode_enter", text="Tweak", icon = "ACTION_TWEAK_SOLO").isolate_action = True
                row.prop(addon_prefs, "nla_tweak_isolate_action")

        else:

            if scene.is_nla_tweakmode:
                row.active_default = True
                row.operator("nla.tweakmode_exit", text="Tweak", icon = "ACTION_TWEAK")
                row.label(icon = "CHECKBOX_DEHLT", text = "Isolate")
            else:
                row.operator("nla.tweakmode_enter", text="Tweak", icon = "ACTION_TWEAK")
                row.prop(addon_prefs, "nla_tweak_isolate_action")

        ##########################

        NLA_MT_editor_menus.draw_collapsible(context, layout)

        layout.separator_spacer()

        dopesheet_filter(layout, context)

        row = layout.row()

        row.popover(panel="NLA_PT_filters", text="", icon='FILTER')
        row.prop(st, "auto_snap", text="")
        row.popover(panel = "NLA_PT_view_view_options", text = "Options")
Beispiel #8
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu
        NLA_MT_editor_menus.draw_collapsible(context, layout)

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #9
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context,
                                      layout)  # bfa - show hide the editormenu
        NLA_MT_editor_menus.draw_collapsible(context, layout)

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #10
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        NLA_MT_editor_menus.draw_collapsible(context, layout)

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #11
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        NLA_MT_editor_menus.draw_collapsible(context, layout)

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #12
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout
        toolsettings = context.tool_settings

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu

        # bfa - The tabs to switch between the four animation editors. The classes are in space_time.py
        row = layout.row(align=True)
        row.operator("wm.switch_editor_to_timeline", text="", icon='TIME')
        row.operator("wm.switch_editor_in_graph", text="", icon='GRAPH_ACTIVE')
        row.operator("wm.switch_editor_to_dopesheet", text="", icon='ACTION')     
        row.operator("wm.switch_editor_to_nla", text="", icon='NLA')

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        row = layout.row(align=True)
        row.prop(st, "use_normalization", icon='NORMALIZE_FCURVES', text="Normalize", toggle=True)
        sub = row.row(align=True)
        sub.active = st.use_normalization
        sub.prop(st, "use_auto_normalization", icon='FILE_REFRESH', text="", toggle=True)

        row = layout.row(align=True)

        row.prop(toolsettings, "use_proportional_fcurve",
                 text="", icon_only=True)
        if toolsettings.use_proportional_fcurve:
            row.prop(toolsettings, "proportional_edit_falloff",
                     text="", icon_only=True)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", icon_only=True)

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
Beispiel #13
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout
        toolsettings = context.tool_settings

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context,
                                      layout)  # bfa - show hide the editormenu
        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        layout.prop(st, "use_normalization", text="Normalize")
        row = layout.row()
        row.active = st.use_normalization
        row.prop(st, "use_auto_normalization", text="Auto")

        row = layout.row(align=True)

        row.prop(toolsettings,
                 "use_proportional_fcurve",
                 text="",
                 icon_only=True)
        if toolsettings.use_proportional_fcurve:
            row.prop(toolsettings,
                     "proportional_edit_falloff",
                     text="",
                     icon_only=True)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", icon_only=True)

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear",
                         text="",
                         icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create",
                         text="",
                         icon='GHOST_ENABLED')
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout
        toolsettings = context.tool_settings

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        row = layout.row(align=True)
        row.prop(st, "use_normalization", icon='NORMALIZE_FCURVES', text="Normalize", toggle=True)
        sub = row.row(align=True)
        sub.active = st.use_normalization
        sub.prop(st, "use_auto_normalization", icon='FILE_REFRESH', text="", toggle=True)

        row = layout.row(align=True)

        row.prop(toolsettings, "use_proportional_fcurve",
                 text="", icon_only=True)
        if toolsettings.use_proportional_fcurve:
            row.prop(toolsettings, "proportional_edit_falloff",
                     text="", icon_only=True)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", icon_only=True)

        row = layout.row(align=True)
        row.operator("graph.copy", text="", icon='COPYDOWN')
        row.operator("graph.paste", text="", icon='PASTEDOWN')
        row.operator("graph.paste", text="", icon='PASTEFLIPDOWN').flipped = True

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
Beispiel #15
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout
        toolsettings = context.tool_settings

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu

        # bfa - The tabs to switch between the four animation editors. The classes are in space_time.py
        row = layout.row(align=True)
        row.operator("wm.switch_editor_to_timeline", text="", icon='TIME')
        row.operator("wm.switch_editor_in_graph", text="", icon='GRAPH_ACTIVE')
        row.operator("wm.switch_editor_to_dopesheet", text="", icon='ACTION')     
        row.operator("wm.switch_editor_to_nla", text="", icon='NLA')

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        layout.prop(st, "use_normalization", text="Normalize")
        row = layout.row()
        row.active = st.use_normalization
        row.prop(st, "use_auto_normalization", text="Auto")

        row = layout.row(align=True)

        row.prop(toolsettings, "use_proportional_fcurve",
                 text="", icon_only=True)
        if toolsettings.use_proportional_fcurve:
            row.prop(toolsettings, "proportional_edit_falloff",
                     text="", icon_only=True)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", icon_only=True)

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
Beispiel #16
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        if context.area.show_menus:
            row.menu("NLA_MT_view")
            row.menu("NLA_MT_select")
            row.menu("NLA_MT_marker")
            row.menu("NLA_MT_edit")
            row.menu("NLA_MT_add")

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #17
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        if context.area.show_menus:
            row.menu("NLA_MT_view")
            row.menu("NLA_MT_select")
            row.menu("NLA_MT_marker")
            row.menu("NLA_MT_edit")
            row.menu("NLA_MT_add")

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #18
0
    def draw(self, context):
        layout = self.layout

        st = context.space_data

        layout.template_header()

        NLA_MT_editor_menus.draw_collapsible(context, layout)

        layout.separator_spacer()

        dopesheet_filter(layout, context)

        layout.popover(
            panel="NLA_PT_filters",
            text="",
            icon='FILTER',
        )

        layout.prop(st, "auto_snap", text="")
Beispiel #19
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu

        # bfa - The tabs to switch between the four animation editors. The classes are in space_time.py
        row = layout.row(align=True)
        row.operator("wm.switch_editor_to_timeline", text="", icon='TIME')
        row.operator("wm.switch_editor_to_graph", text="", icon='IPO')
        row.operator("wm.switch_editor_to_dopesheet", text="", icon='ACTION')     
        row.operator("wm.switch_editor_in_nla", text="", icon='NLA_ACTIVE')
  
        NLA_MT_editor_menus.draw_collapsible(context, layout)

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #20
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu

        # bfa - The tabs to switch between the four animation editors. The classes are in space_time.py
        row = layout.row(align=True)
        row.operator("wm.switch_editor_to_timeline", text="", icon='TIME')
        row.operator("wm.switch_editor_to_graph", text="", icon='IPO')
        row.operator("wm.switch_editor_to_dopesheet", text="", icon='ACTION')     
        row.operator("wm.switch_editor_in_nla", text="", icon='NLA_ACTIVE')
  
        NLA_MT_editor_menus.draw_collapsible(context, layout)

        dopesheet_filter(layout, context)

        layout.prop(st, "auto_snap", text="")
Beispiel #21
0
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout
        toolsettings = context.tool_settings

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context, layout) # bfa - show hide the editormenu
        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        layout.prop(st, "use_normalization", text="Normalize")
        row = layout.row()
        row.active = st.use_normalization
        row.prop(st, "use_auto_normalization", text="Auto")

        row = layout.row(align=True)

        row.prop(toolsettings, "use_proportional_fcurve",
                 text="", icon_only=True)
        if toolsettings.use_proportional_fcurve:
            row.prop(toolsettings, "proportional_edit_falloff",
                     text="", icon_only=True)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", icon_only=True)

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create", text="", icon='GHOST_ENABLED')
def DOPESHEET_HT_header_draw(self, context):
    layout = self.layout

    st = context.space_data
    toolsettings = context.tool_settings

    row = layout.row(align=True)
    row.template_header()

    bpy.types.DOPESHEET_MT_editor_menus.draw_collapsible(context, layout)

    layout.prop(st, "mode", text="")

    if st.mode in {'ACTION', 'SHAPEKEY'}:
        row = layout.row(align=True)
        row.operator("action.layer_prev", text="", icon='TRIA_DOWN')
        row.operator("action.layer_next", text="", icon='TRIA_UP')

        layout.template_ID(st,
                           "action",
                           new="action.new",
                           unlink="action.unlink")
        preferences = leader.get_preferences(context)
        if preferences is not None and st.mode == "ACTION" and preferences.general_enable_deletion and action_set(
        ):
            layout.operator(LLAnimHelpers_DeleteOperator.bl_idname,
                            icon="CANCEL",
                            text="",
                            emboss=False)

        row = layout.row(align=True)
        row.operator("action.push_down", text="Push Down", icon='NLA_PUSHDOWN')
        row.operator("action.stash", text="Stash", icon='FREEZE')

    layout.prop(st.dopesheet, "show_summary", text="Summary")

    if st.mode == 'DOPESHEET':
        space_dopesheet.dopesheet_filter(layout, context)
    elif st.mode == 'ACTION':
        # 'genericFiltersOnly' limits the options to only the relevant 'generic' subset of
        # filters which will work here and are useful (especially for character animation)
        space_dopesheet.dopesheet_filter(layout,
                                         context,
                                         genericFiltersOnly=True)
    elif st.mode == 'GPENCIL':
        row = layout.row(align=True)
        row.prop(st.dopesheet, "show_gpencil_3d_only", text="Active Only")

        if st.dopesheet.show_gpencil_3d_only:
            row = layout.row(align=True)
            row.prop(st.dopesheet, "show_only_selected", text="")
            row.prop(st.dopesheet, "show_hidden", text="")

        row = layout.row(align=True)
        row.prop(st.dopesheet, "use_filter_text", text="")
        if st.dopesheet.use_filter_text:
            row.prop(st.dopesheet, "filter_text", text="")
            row.prop(st.dopesheet, "use_multi_word_filter", text="")

    row = layout.row(align=True)
    row.prop(toolsettings, "use_proportional_action", text="", icon_only=True)
    if toolsettings.use_proportional_action:
        row.prop(toolsettings,
                 "proportional_edit_falloff",
                 text="",
                 icon_only=True)

    # Grease Pencil mode doesn't need snapping, as it's frame-aligned only
    if st.mode != 'GPENCIL':
        layout.prop(st, "auto_snap", text="")

    row = layout.row(align=True)
    row.operator("action.copy", text="", icon='COPYDOWN')
    row.operator("action.paste", text="", icon='PASTEDOWN')
    if st.mode not in ('GPENCIL', 'MASK'):
        row.operator("action.paste", text="",
                     icon='PASTEFLIPDOWN').flipped = True
Beispiel #23
0
    def draw(self, context):
        layout = self.layout
        tool_settings = context.tool_settings

        st = context.space_data

        ALL_MT_editormenu.draw_hidden(context,
                                      layout)  # bfa - show hide the editormenu

        # Now a exposed as a sub-space type
        # layout.prop(st, "mode", text="")

        ############################ Switch between the editors

        if context.space_data.mode == 'FCURVES':

            # bfa - The tabs to switch between the four animation editors. The classes are in space_dopesheet.py
            row = layout.row(align=True)

            row.operator("wm.switch_editor_to_dopesheet",
                         text="",
                         icon='ACTION')
            row.operator("wm.switch_editor_in_graph",
                         text="",
                         icon='GRAPH_ACTIVE')
            row.operator("wm.switch_editor_to_driver", text="", icon='DRIVER')
            row.operator("wm.switch_editor_to_nla", text="", icon='NLA')

        elif context.space_data.mode == 'DRIVERS':

            # bfa - The tabs to switch between the four animation editors. The classes are in space_dopesheet.py
            row = layout.row(align=True)

            row.operator("wm.switch_editor_to_dopesheet",
                         text="",
                         icon='ACTION')
            row.operator("wm.switch_editor_to_graph", text="", icon='GRAPH')
            row.operator("wm.switch_editor_in_driver",
                         text="",
                         icon='DRIVER_ACTIVE')
            row.operator("wm.switch_editor_to_nla", text="", icon='NLA')

        #############################

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.separator_spacer()

        row = layout.row(align=True)
        row.prop(st,
                 "use_normalization",
                 icon='NORMALIZE_FCURVES',
                 text="",
                 toggle=True)
        sub = row.row(align=True)
        if st.use_normalization:
            sub.prop(st,
                     "use_auto_normalization",
                     icon='FILE_REFRESH',
                     text="",
                     toggle=True)

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear", text="", icon='X')
        else:
            row.operator("graph.ghost_curves_create",
                         text="",
                         icon='FCURVE_SNAPSHOT')

        dopesheet_filter(layout, context)

        layout.popover(panel="GRAPH_PT_filters", text="", icon='FILTER')

        layout.prop(st, "auto_snap", text="")

        row = layout.row(align=True)
        row.prop(tool_settings,
                 "use_proportional_fcurve",
                 text="",
                 icon_only=True)
        sub = row.row(align=True)

        if tool_settings.use_proportional_fcurve:
            sub.prop(tool_settings,
                     "proportional_edit_falloff",
                     text="",
                     icon_only=True)

        row = layout.row(align=True)

        row.prop(st, "pivot_point", icon_only=True)
        row.operator_menu_enum("graph.easing_type",
                               "type",
                               text="",
                               icon="IPO_EASE_IN_OUT")
        row.operator_menu_enum("graph.handle_type",
                               "type",
                               text="",
                               icon="HANDLE_AUTO")
        row.operator_menu_enum("graph.interpolation_type",
                               "type",
                               text="",
                               icon="INTERPOLATE")

        row = layout.row()
        row.popover(panel="GRAPH_PT_properties_view_options", text="Options")
    def draw(self, context):
        from bl_ui.space_dopesheet import dopesheet_filter

        layout = self.layout
        toolsettings = context.tool_settings

        st = context.space_data

        row = layout.row(align=True)
        row.template_header()

        GRAPH_MT_editor_menus.draw_collapsible(context, layout)

        layout.prop(st, "mode", text="")

        dopesheet_filter(layout, context)

        row = layout.row(align=True)
        row.prop(st,
                 "use_normalization",
                 icon='NORMALIZE_FCURVES',
                 text="Normalize",
                 toggle=True)
        sub = row.row(align=True)
        sub.active = st.use_normalization
        sub.prop(st,
                 "use_auto_normalization",
                 icon='FILE_REFRESH',
                 text="",
                 toggle=True)

        row = layout.row(align=True)

        row.prop(toolsettings,
                 "use_proportional_fcurve",
                 text="",
                 icon_only=True)
        if toolsettings.use_proportional_fcurve:
            row.prop(toolsettings,
                     "proportional_edit_falloff",
                     text="",
                     icon_only=True)

        layout.prop(st, "auto_snap", text="")
        layout.prop(st, "pivot_point", icon_only=True)

        row = layout.row(align=True)
        row.operator("graph.copy", text="", icon='COPYDOWN')
        row.operator("graph.paste", text="", icon='PASTEDOWN')
        row.operator("graph.paste", text="",
                     icon='PASTEFLIPDOWN').flipped = True

        row = layout.row(align=True)
        if st.has_ghost_curves:
            row.operator("graph.ghost_curves_clear",
                         text="",
                         icon='GHOST_DISABLED')
        else:
            row.operator("graph.ghost_curves_create",
                         text="",
                         icon='GHOST_ENABLED')