Пример #1
0
def get_media_files_panel(media_list_view, add_cb, del_cb, col_changed_cb,
                          hamburger_launch_pressed, filtering_cb):
    # Create buttons and connect signals
    add_media_b = Gtk.Button(_("Add"))
    del_media_b = Gtk.Button(_("Delete"))
    add_media_b.connect("clicked", add_cb, None)
    del_media_b.connect("clicked", del_cb, None)
    add_media_b.set_tooltip_text(_("Add Media File to Bin"))
    del_media_b.set_tooltip_text(_("Delete Media File from Bin"))

    hamburger_launcher = guicomponents.HamburgerPressLaunch(
        hamburger_launch_pressed)
    guiutils.set_margins(hamburger_launcher.widget, 2, 0, 4, 12)

    columns_img = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                     "columns.png")
    columns_launcher = guicomponents.PressLaunch(col_changed_cb,
                                                 columns_img,
                                                 w=22,
                                                 h=22)
    columns_launcher.surface_y = 6
    columns_launcher.widget.set_tooltip_text(
        _("Number of Media File columns."))

    all_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                    "show_all_files.png")
    audio_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                      "show_audio_files.png")
    graphics_pixbuf = cairo.ImageSurface.create_from_png(
        respaths.IMAGE_PATH + "show_graphics_files.png")
    video_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                      "show_video_files.png")
    imgseq_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                       "show_imgseq_files.png")
    pattern_pixbuf = cairo.ImageSurface.create_from_png(
        respaths.IMAGE_PATH + "show_pattern_producers.png")

    files_filter_launcher = guicomponents.ImageMenuLaunch(
        filtering_cb, [
            all_pixbuf, video_pixbuf, audio_pixbuf, graphics_pixbuf,
            imgseq_pixbuf, pattern_pixbuf
        ], 24, 22)
    files_filter_launcher.surface_x = 3
    files_filter_launcher.surface_y = 4
    files_filter_launcher.widget.set_tooltip_text(
        _("Visible Media File types."))
    gui.media_view_filter_selector = files_filter_launcher

    buttons_box = Gtk.HBox(False, 1)
    buttons_box.pack_start(hamburger_launcher.widget, False, False, 0)
    buttons_box.pack_start(guiutils.get_pad_label(4, 4), False, False, 0)
    buttons_box.pack_start(columns_launcher.widget, False, False, 0)
    buttons_box.pack_start(files_filter_launcher.widget, False, False, 0)
    buttons_box.pack_start(Gtk.Label(), True, True, 0)

    panel = Gtk.VBox()
    panel.pack_start(media_list_view, True, True, 0)
    panel.pack_start(buttons_box, False, True, 0)

    return panel
Пример #2
0
def get_media_files_panel(media_list_view, add_cb, del_cb, col_changed_cb,
                          proxy_cb, filtering_cb):
    # Create buttons and connect signals
    add_media_b = Gtk.Button(_("Add"))
    del_media_b = Gtk.Button(_("Delete"))
    add_media_b.connect("clicked", add_cb, None)
    del_media_b.connect("clicked", del_cb, None)
    add_media_b.set_tooltip_text(_("Add Media File to Bin"))
    del_media_b.set_tooltip_text(_("Delete Media File from Bin"))

    proxy_b = Gtk.Button()
    proxy_b.set_image(
        Gtk.Image.new_from_file(respaths.IMAGE_PATH + "proxy_button.png"))
    proxy_b.connect("clicked", proxy_cb, None)
    proxy_b.set_tooltip_text(_("Render Proxy Files For Selected Media"))
    gui.proxy_button = proxy_b

    columns_img = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                     "columns.png")
    columns_launcher = guicomponents.PressLaunch(col_changed_cb,
                                                 columns_img,
                                                 w=22,
                                                 h=22)
    columns_launcher.surface_y = 9

    all_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                    "show_all_files.png")
    audio_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                      "show_audio_files.png")
    graphics_pixbuf = cairo.ImageSurface.create_from_png(
        respaths.IMAGE_PATH + "show_graphics_files.png")
    video_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                      "show_video_files.png")
    imgseq_pixbuf = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                       "show_imgseq_files.png")
    pattern_pixbuf = cairo.ImageSurface.create_from_png(
        respaths.IMAGE_PATH + "show_pattern_producers.png")

    files_filter_launcher = guicomponents.ImageMenuLaunch(
        filtering_cb, [
            all_pixbuf, video_pixbuf, audio_pixbuf, graphics_pixbuf,
            imgseq_pixbuf, pattern_pixbuf
        ], 24, 22)
    files_filter_launcher.surface_x = 3
    files_filter_launcher.surface_y = 8
    gui.media_view_filter_selector = files_filter_launcher

    buttons_box = Gtk.HBox(False, 1)
    buttons_box.pack_start(add_media_b, True, True, 0)
    buttons_box.pack_start(del_media_b, True, True, 0)
    buttons_box.pack_start(proxy_b, False, False, 0)
    buttons_box.pack_start(guiutils.get_pad_label(4, 4), False, False, 0)
    buttons_box.pack_start(columns_launcher.widget, False, False, 0)
    buttons_box.pack_start(files_filter_launcher.widget, False, False, 0)

    panel = Gtk.VBox()
    panel.pack_start(buttons_box, False, True, 0)
    panel.pack_start(media_list_view, True, True, 0)

    return panel
Пример #3
0
def get_media_files_panel(media_list_view, add_cb, del_cb, col_changed_cb,
                          hamburger_launch_pressed, filtering_cb):
    # Aug-2019 - SvdB - BB
    size_adj = 1
    prefs = editorpersistance.prefs
    if prefs.double_track_hights:
        size_adj = 2
    hamburger_launcher = guicomponents.HamburgerPressLaunch(
        hamburger_launch_pressed)
    guiutils.set_margins(hamburger_launcher.widget, 2, 0, 4, 12)

    columns_img = guiutils.get_cairo_image("columns")
    columns_launcher = guicomponents.PressLaunch(col_changed_cb,
                                                 columns_img,
                                                 w=22 * size_adj,
                                                 h=22 * size_adj)
    columns_launcher.surface_y = 6
    columns_launcher.widget.set_tooltip_text(
        _("Number of Media File columns."))

    all_pixbuf = guiutils.get_cairo_image("show_all_files")
    audio_pixbuf = guiutils.get_cairo_image("show_audio_files")
    graphics_pixbuf = guiutils.get_cairo_image("show_graphics_files")
    video_pixbuf = guiutils.get_cairo_image("show_video_files")
    imgseq_pixbuf = guiutils.get_cairo_image("show_imgseq_files")
    pattern_pixbuf = guiutils.get_cairo_image("show_pattern_producers")
    unused_pixbuf = guiutils.get_cairo_image("show_unused_files")

    files_filter_launcher = guicomponents.ImageMenuLaunch(
        filtering_cb, [
            all_pixbuf, video_pixbuf, audio_pixbuf, graphics_pixbuf,
            imgseq_pixbuf, pattern_pixbuf, unused_pixbuf
        ], 24 * size_adj, 22 * size_adj)
    files_filter_launcher.surface_x = 3
    files_filter_launcher.surface_y = 4
    files_filter_launcher.widget.set_tooltip_text(
        _("Visible Media File types."))
    gui.media_view_filter_selector = files_filter_launcher

    bin_info = guicomponents.BinInfoPanel()

    buttons_box = Gtk.HBox(False, 1)
    buttons_box.pack_start(hamburger_launcher.widget, False, False, 0)
    buttons_box.pack_start(guiutils.get_pad_label(4, 4), False, False, 0)
    buttons_box.pack_start(columns_launcher.widget, False, False, 0)
    buttons_box.pack_start(files_filter_launcher.widget, False, False, 0)
    buttons_box.pack_start(Gtk.Label(), True, True, 0)
    buttons_box.pack_start(bin_info, False, False, 0)
    #buttons_box.pack_start(Gtk.Label(), True, True, 0)

    panel = Gtk.VBox()
    panel.pack_start(media_list_view, True, True, 0)
    panel.pack_start(buttons_box, False, True, 0)

    return (panel, bin_info)
Пример #4
0
    def __init__(self, filter_object, edit_panel, filter_stack):
        self.filter_object = filter_object
        self.filter_header_row = FilterHeaderRow(filter_object)

        self.edit_panel = edit_panel
        self.edit_panel_frame = Gtk.Frame()
        self.edit_panel_frame.add(edit_panel)
        self.edit_panel_frame.set_shadow_type(Gtk.ShadowType.NONE)

        self.filter_stack = filter_stack

        self.expander = Gtk.Expander()
        self.expander.set_label_widget(self.filter_header_row.widget)
        self.expander.add(self.edit_panel_frame)
        self.expander.set_label_fill(True)

        self.expander_frame = Gtk.Frame()
        self.expander_frame.add(self.expander)
        self.expander_frame.set_shadow_type(Gtk.ShadowType.NONE)
        guiutils.set_margins(self.expander_frame, 2, 0, 0, 0)

        self.active_check = Gtk.CheckButton()
        self.active_check.set_active(self.filter_object.active)
        self.active_check.connect("toggled", self.toggle_filter_active)
        guiutils.set_margins(self.active_check, 4, 0, 0, 0)

        self.active_check_vbox = Gtk.VBox(False, 0)
        self.active_check_vbox.pack_start(self.active_check, False, False, 0)
        self.active_check_vbox.pack_start(Gtk.Label(), True, True, 0)

        surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                     "trash.png")
        trash_button = guicomponents.PressLaunch(self.trash_pressed,
                                                 surface,
                                                 w=22,
                                                 h=22)

        self.trash_vbox = Gtk.VBox(False, 0)
        self.trash_vbox.pack_start(trash_button.widget, False, False, 0)
        self.trash_vbox.pack_start(Gtk.Label(), True, True, 0)

        self.widget = Gtk.HBox(False, 0)
        self.widget.pack_start(self.active_check_vbox, False, False, 0)
        self.widget.pack_start(self.expander_frame, True, True, 0)
        self.widget.pack_start(self.trash_vbox, False, False, 0)
        self.widget.show_all()
Пример #5
0
def _display_compositor_edit_box():
    # This gets called on startup before edit_frame is filled
    try:
        widgets.value_edit_frame.remove(widgets.value_edit_box)
    except:
        pass

    global keyframe_editor_widgets
    keyframe_editor_widgets = []

    vbox = Gtk.VBox()

    # Case: Empty edit frame
    global compositor
    if compositor == None:
        widgets.empty_label = Gtk.Label(label=_("No Compositor"))
        vbox.pack_start(widgets.empty_label, True, True, 0)

        vbox.pack_start(Gtk.Label(), True, True, 0)
        vbox.show_all()
        widgets.value_edit_box = vbox
        widgets.value_edit_frame.add(vbox)
        return

    # Case: Filled frame
    compositor_name_label = Gtk.Label(label="<b>" + compositor.name + "</b>")
    compositor_name_label.set_use_markup(True)
    vbox.pack_start(compositor_name_label, False, False, 0)
    vbox.pack_start(guicomponents.EditorSeparator().widget, False, False, 0)

    # Track editor
    target_combo = guicomponents.get_compositor_track_select_combo(
        current_sequence().tracks[compositor.transition.b_track],
        current_sequence().tracks[compositor.transition.a_track],
        _target_track_changed)

    target_row = Gtk.HBox()
    target_row.pack_start(guiutils.get_pad_label(5, 3), False, False, 0)
    target_row.pack_start(Gtk.Label(label=_("Destination Track:")), False,
                          False, 0)
    target_row.pack_start(guiutils.get_pad_label(5, 3), False, False, 0)
    target_row.pack_start(target_combo, False, False, 0)
    target_row.pack_start(Gtk.Label(), True, True, 0)
    vbox.pack_start(target_row, False, False, 0)
    vbox.pack_start(guicomponents.EditorSeparator().widget, False, False, 0)

    # Transition editors
    t_editable_properties = propertyedit.get_transition_editable_properties(
        compositor)
    for ep in t_editable_properties:
        editor_row = propertyeditorbuilder.get_editor_row(ep)
        if editor_row != None:  # Some properties don't have editors
            vbox.pack_start(editor_row, False, False, 0)
            vbox.pack_start(guicomponents.EditorSeparator().widget, False,
                            False, 0)

        # Add keyframe editor widget to be updated for frame changes if such is created.
        try:
            editor_type = ep.args[propertyeditorbuilder.EDITOR]
        except KeyError:
            editor_type = propertyeditorbuilder.SLIDER  # this is the default value

        if ((editor_type == propertyeditorbuilder.KEYFRAME_EDITOR) or
            (editor_type == propertyeditorbuilder.KEYFRAME_EDITOR_RELEASE)
                or (editor_type == propertyeditorbuilder.KEYFRAME_EDITOR_CLIP)
                or (editor_type == propertyeditorbuilder.FADE_LENGTH)
                or (editor_type == propertyeditorbuilder.GEOMETRY_EDITOR)):
            keyframe_editor_widgets.append(editor_row)

    # Extra editors. Editable properties have already been created with "editor=no_editor"
    # and will be looked up by editors from clip
    editor_rows = propertyeditorbuilder.get_transition_extra_editor_rows(
        compositor, t_editable_properties)
    for editor_row in editor_rows:
        # These are added to keyframe editor based on editor type, not based on EditableProperty type as above
        # because one editor sets values for multiple EditableProperty objects
        if editor_row.__class__ == keyframeeditor.RotatingGeometryEditor:
            keyframe_editor_widgets.append(editor_row)
        vbox.pack_start(editor_row, False, False, 0)
        vbox.pack_start(guicomponents.EditorSeparator().widget, False, False,
                        0)

    hamburger_launcher_surface = cairo.ImageSurface.create_from_png(
        respaths.IMAGE_PATH + "hamburger_big.png")
    hamburger_launcher = guicomponents.PressLaunch(_hamburger_launch_pressed,
                                                   hamburger_launcher_surface,
                                                   24, 24)
    sl_row = guiutils.get_right_justified_box([hamburger_launcher.widget])
    vbox.pack_start(sl_row, False, False, 0)

    vbox.pack_start(Gtk.Label(), True, True, 0)
    vbox.show_all()

    scroll_window = Gtk.ScrolledWindow()
    scroll_window.add_with_viewport(vbox)
    scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC,
                             Gtk.PolicyType.AUTOMATIC)
    scroll_window.show_all()

    widgets.value_edit_box = scroll_window
    widgets.value_edit_frame.add(scroll_window)
Пример #6
0
def effect_selection_changed():
    global keyframe_editor_widgets

    # Check we have clip
    if clip == None:
        keyframe_editor_widgets = []
        return

    # Check we actually have filters so we can display one.
    # If not, clear previous filters from view.
    if len(clip.filters) == 0:
        vbox = Gtk.VBox(False, 0)
        vbox.pack_start(Gtk.Label(), False, False, 0)
        widgets.value_edit_frame.remove(widgets.value_edit_box)
        widgets.value_edit_frame.add(vbox)
        vbox.show_all()
        widgets.value_edit_box = vbox
        keyframe_editor_widgets = []
        return

    # "changed" get's called twice when adding filter and selecting last
    # so we use this do this only once
    if block_changed_update == True:
        return

    keyframe_editor_widgets = []

    # Get selected row which is also index of filter in clip.filters
    treeselection = widgets.effect_stack_view.treeview.get_selection()
    (model, rows) = treeselection.get_selected_rows()

    # If we don't get legal selection select first filter
    try:
        row = rows[0]
        filter_index = max(row)
    except:
        filter_index = 0

    filter_object = clip.filters[filter_index]

    global current_filter_index
    current_filter_index = filter_index

    # Create EditableProperty wrappers for properties
    editable_properties = propertyedit.get_filter_editable_properties(
        clip, filter_object, filter_index, track, clip_index)

    # Get editors and set them displayed
    vbox = Gtk.VBox(False, 0)
    try:
        filter_name = translations.filter_names[filter_object.info.name]
    except KeyError:
        filter_name = filter_object.info.name

    filter_name_label = Gtk.Label(label="<b>" + filter_name + "</b>")
    filter_name_label.set_use_markup(True)
    vbox.pack_start(filter_name_label, False, False, 0)
    vbox.pack_start(guicomponents.EditorSeparator().widget, False, False, 0)

    if len(editable_properties) > 0:
        # Create editor row for each editable property
        for ep in editable_properties:
            editor_row = propertyeditorbuilder.get_editor_row(ep)
            if editor_row == None:
                continue

            # Set keyframe editor widget to be updated for frame changes if such is created
            try:
                editor_type = ep.args[propertyeditorbuilder.EDITOR]
            except KeyError:
                editor_type = propertyeditorbuilder.SLIDER  # this is the default value
            if ((editor_type == propertyeditorbuilder.KEYFRAME_EDITOR) or
                (editor_type == propertyeditorbuilder.KEYFRAME_EDITOR_RELEASE)
                    or
                (editor_type == propertyeditorbuilder.KEYFRAME_EDITOR_CLIP)):
                keyframe_editor_widgets.append(editor_row)

            # if slider property is being dedited as keyrame property
            if hasattr(editor_row, "is_kf_editor"):
                keyframe_editor_widgets.append(editor_row)

            vbox.pack_start(editor_row, False, False, 0)
            if not hasattr(editor_row, "no_separator"):
                vbox.pack_start(guicomponents.EditorSeparator().widget, False,
                                False, 0)

        # Create NonMltEditableProperty wrappers for properties
        non_mlteditable_properties = propertyedit.get_non_mlt_editable_properties(
            clip, filter_object, filter_index)

        # Extra editors. Editable properties may have already been created
        # with "editor=no_editor" and now extra editors may be created to edit those
        # Non mlt properties are added as these are only need with extraeditors
        editable_properties.extend(non_mlteditable_properties)
        editor_rows = propertyeditorbuilder.get_filter_extra_editor_rows(
            filter_object, editable_properties)
        for editor_row in editor_rows:
            vbox.pack_start(editor_row, False, False, 0)
            if not hasattr(editor_row, "no_separator"):
                vbox.pack_start(guicomponents.EditorSeparator().widget, False,
                                False, 0)
        vbox.pack_start(guiutils.pad_label(12, 12), False, False, 0)

        hamburger_launcher_surface = cairo.ImageSurface.create_from_png(
            respaths.IMAGE_PATH + "hamburger_big.png")
        hamburger_launcher = guicomponents.PressLaunch(
            _hamburger_launch_pressed, hamburger_launcher_surface, 24, 24)

        sl_row = guiutils.get_left_justified_box([hamburger_launcher.widget])
        vbox.pack_start(sl_row, False, False, 0)

        vbox.pack_start(Gtk.Label(), True, True, 0)

    else:
        vbox.pack_start(Gtk.Label(label=_("No editable parameters")), True,
                        True, 0)
    vbox.show_all()

    scroll_window = Gtk.ScrolledWindow()
    scroll_window.add_with_viewport(vbox)
    scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC,
                             Gtk.PolicyType.AUTOMATIC)
    scroll_window.show_all()

    widgets.value_edit_frame.remove(widgets.value_edit_box)
    widgets.value_edit_frame.add(scroll_window)

    widgets.value_edit_box = scroll_window
Пример #7
0
def _create_buttons(editor_window):
    IMG_PATH = respaths.IMAGE_PATH
    editor_window.big_TC = Gtk.Stack()
    tc_disp = guicomponents.BigTCDisplay()
    tc_entry = guicomponents.BigTCEntry()
    tc_disp.widget.show()
    tc_entry.widget.show()
    editor_window.big_TC.add_named(tc_disp.widget, "BigTCDisplay")
    editor_window.big_TC.add_named(tc_entry.widget, "BigTCEntry")
    editor_window.big_TC.set_visible_child_name("BigTCDisplay")
    gui.big_tc = editor_window.big_TC

    surface = cairo.ImageSurface.create_from_png(IMG_PATH + "workflow.png")
    editor_window.worflow_launch = guicomponents.PressLaunch(
        workflow.workflow_menu_launched, surface, w=22, h=22)

    editor_window.tool_selector = guicomponents.ToolSelector(
        editor_window.mode_selector_pressed, m_pixbufs, 40, 22)

    if editorpersistance.prefs.buttons_style == 2:  # NO_DECORATIONS
        no_decorations = True
    else:
        no_decorations = False

    editor_window.zoom_buttons = glassbuttons.GlassButtonsGroup(
        38, 23, 2, 8, 5)
    editor_window.zoom_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "zoom_in.png"),
        updater.zoom_in)
    editor_window.zoom_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "zoom_out.png"),
        updater.zoom_out)
    editor_window.zoom_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "zoom_length.png"),
        updater.zoom_project_length)
    editor_window.zoom_buttons.widget.set_tooltip_text(
        _("Zoom In - Mouse Middle Scroll\n Zoom Out - Mouse Middle Scroll\n Zoom Length - Mouse Middle Click"
          ))
    editor_window.zoom_buttons.no_decorations = no_decorations

    editor_window.edit_buttons = glassbuttons.GlassButtonsGroup(
        32, 23, 2, 5, 5)
    editor_window.edit_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "dissolve.png"),
        tlineaction.add_transition_pressed)
    editor_window.edit_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "cut.png"),
        tlineaction.cut_pressed)
    editor_window.edit_buttons.widget.set_tooltip_text(
        _("Add Rendered Transition - 2 clips selected\nAdd Rendered Fade - 1 clip selected\nCut - X"
          ))
    editor_window.edit_buttons.no_decorations = no_decorations

    editor_window.edit_buttons_3 = glassbuttons.GlassButtonsGroup(
        46, 23, 2, 3, 5)
    editor_window.edit_buttons_3.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "splice_out.png"),
        tlineaction.splice_out_button_pressed)
    editor_window.edit_buttons_3.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "ripple_delete.png"),
        tlineaction.ripple_delete_button_pressed)
    editor_window.edit_buttons_3.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "lift.png"),
        tlineaction.lift_button_pressed)
    editor_window.edit_buttons_3.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "delete_range.png"),
        tlineaction.delete_range_button_pressed)
    editor_window.edit_buttons_3.widget.set_tooltip_text(
        _("Splice Out - Delete\nRipple Delete\nLift\nDelete Range"))
    editor_window.edit_buttons_3.no_decorations = no_decorations

    editor_window.edit_buttons_2 = glassbuttons.GlassButtonsGroup(
        44, 23, 2, 3, 5)
    editor_window.edit_buttons_2.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "resync.png"),
        tlineaction.resync_button_pressed)
    editor_window.edit_buttons_2.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "split_audio.png"),
        tlineaction.split_audio_button_pressed)
    editor_window.edit_buttons_2.widget.set_tooltip_text(
        _("Resync Selected\nSplit Audio"))
    editor_window.edit_buttons_2.no_decorations = no_decorations

    editor_window.monitor_insert_buttons = glassbuttons.GlassButtonsGroup(
        44, 23, 2, 3, 5)
    editor_window.monitor_insert_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "overwrite_range.png"),
        tlineaction.range_overwrite_pressed)
    editor_window.monitor_insert_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "overwrite_clip.png"),
        tlineaction.three_point_overwrite_pressed)
    editor_window.monitor_insert_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "insert_clip.png"),
        tlineaction.insert_button_pressed)
    editor_window.monitor_insert_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "append_clip.png"),
        tlineaction.append_button_pressed)
    editor_window.monitor_insert_buttons.widget.set_tooltip_text(
        _("Overwrite Range\nOverwrite Clip - T\nInsert Clip - Y\nAppend Clip - U"
          ))
    editor_window.monitor_insert_buttons.no_decorations = no_decorations

    editor_window.undo_redo = glassbuttons.GlassButtonsGroup(28, 23, 2, 2, 7)
    editor_window.undo_redo.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "undo.png"),
        undo.do_undo_and_repaint)
    editor_window.undo_redo.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "redo.png"),
        undo.do_redo_and_repaint)
    editor_window.undo_redo.widget.set_tooltip_text(
        _("Undo - Ctrl + Z\nRedo - Ctrl + Y"))
    editor_window.undo_redo.no_decorations = no_decorations

    editor_window.tools_buttons = glassbuttons.GlassButtonsGroup(
        30, 23, 2, 14, 7)
    editor_window.tools_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "open_mixer.png"),
        audiomonitoring.show_audio_monitor)
    editor_window.tools_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "open_titler.png"),
        titler.show_titler)
    editor_window.tools_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "open_gmic.png"),
        gmic.launch_gmic)
    editor_window.tools_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "open_natron.png"),
        toolnatron.launch_natron_animations_tool)
    editor_window.tools_buttons.add_button(
        cairo.ImageSurface.create_from_png(IMG_PATH + "open_renderqueue.png"),
        lambda: batchrendering.launch_batch_rendering())
    editor_window.tools_buttons.widget.set_tooltip_text(
        _("Audio Mixer\nTitler\nG'Mic Effects\nNatron Animations\nBatch Render Queue"
          ))
    editor_window.tools_buttons.no_decorations = True

    if editorstate.audio_monitoring_available == False:
        editor_window.tools_buttons.sensitive[0] = False
        editor_window.tools_buttons.widget.set_tooltip_text(
            _("Audio Mixer(not available)\nTitler"))
Пример #8
0
def _create_buttons(editor_window):
    # Aug-2019 - SvdB - BB
    prefs = editorpersistance.prefs
    size_adj = 1
    if prefs.double_track_hights:
        size_adj = 2

    editor_window.big_TC = Gtk.Stack()
    tc_disp = guicomponents.BigTCDisplay()
    tc_entry = guicomponents.BigTCEntry()
    tc_disp.widget.show()
    tc_entry.widget.show()
    editor_window.big_TC.add_named(tc_disp.widget, "BigTCDisplay")
    editor_window.big_TC.add_named(tc_entry.widget, "BigTCEntry")
    editor_window.big_TC.set_visible_child_name("BigTCDisplay")
    gui.big_tc = editor_window.big_TC

    surface = guiutils.get_cairo_image("workflow")
    editor_window.worflow_launch = guicomponents.PressLaunch(
        workflow.workflow_menu_launched,
        surface,
        w=22 * size_adj,
        h=22 * size_adj)

    editor_window.tool_selector = guicomponents.ToolSelector(
        editor_window.mode_selector_pressed, m_pixbufs, 40 * size_adj,
        22 * size_adj)

    if editorpersistance.prefs.buttons_style == 2:  # NO_DECORATIONS
        no_decorations = True
    else:
        no_decorations = False

    # Colorized icons
    if prefs.colorized_icons is True:
        icon_color = "_color"
    else:
        icon_color = ""
    # End of Colorized icons

    editor_window.zoom_buttons = glassbuttons.GlassButtonsGroup(
        38 * size_adj, 23 * size_adj, 2 * size_adj, 8 * size_adj, 5 * size_adj)
    editor_window.zoom_buttons.add_button(
        guiutils.get_cairo_image("zoom_in" + icon_color), updater.zoom_in)
    editor_window.zoom_buttons.add_button(
        guiutils.get_cairo_image("zoom_out" + icon_color), updater.zoom_out)
    editor_window.zoom_buttons.add_button(
        guiutils.get_cairo_image("zoom_length" + icon_color),
        updater.zoom_project_length)
    tooltips = [
        _("Zoom In - Mouse Middle Scroll"),
        _("Zoom Out - Mouse Middle Scroll"),
        _("Zoom Length - Mouse Middle Click")
    ]
    tooltip_runner = glassbuttons.TooltipRunner(editor_window.zoom_buttons,
                                                tooltips)
    editor_window.zoom_buttons.no_decorations = no_decorations

    editor_window.edit_buttons = glassbuttons.GlassButtonsGroup(
        32 * size_adj, 23 * size_adj, 2 * size_adj, 5 * size_adj, 5 * size_adj)
    editor_window.edit_buttons.add_button(
        guiutils.get_cairo_image("dissolve" + icon_color),
        tlineaction.add_transition_pressed)
    editor_window.edit_buttons.add_button(
        guiutils.get_cairo_image("cut" + icon_color), tlineaction.cut_pressed)
    tooltips = [
        _("Add Rendered Transition - 2 clips selected\nAdd Rendered Fade - 1 clip selected"
          ),
        _("Cut Active Tracks - X\nCut All Tracks - Shift + X")
    ]
    tooltip_runner = glassbuttons.TooltipRunner(editor_window.edit_buttons,
                                                tooltips)
    editor_window.edit_buttons.no_decorations = no_decorations

    editor_window.edit_buttons_3 = glassbuttons.GlassButtonsGroup(
        46 * size_adj, 23 * size_adj, 2 * size_adj, 3 * size_adj, 5 * size_adj)
    editor_window.edit_buttons_3.add_button(
        guiutils.get_cairo_image("splice_out" + icon_color),
        tlineaction.splice_out_button_pressed)
    editor_window.edit_buttons_3.add_button(
        guiutils.get_cairo_image("lift" + icon_color),
        tlineaction.lift_button_pressed)
    editor_window.edit_buttons_3.add_button(
        guiutils.get_cairo_image("ripple_delete" + icon_color),
        tlineaction.ripple_delete_button_pressed)
    editor_window.edit_buttons_3.add_button(
        guiutils.get_cairo_image("delete_range" + icon_color),
        tlineaction.delete_range_button_pressed)
    tooltips = [
        _("Splice Out - Delete"),
        _("Lift - Control + Delete"),
        _("Ripple Delete"),
        _("Range Delete")
    ]
    tooltip_runner = glassbuttons.TooltipRunner(editor_window.edit_buttons_3,
                                                tooltips)
    editor_window.edit_buttons_3.no_decorations = no_decorations

    editor_window.edit_buttons_2 = glassbuttons.GlassButtonsGroup(
        44 * size_adj, 23 * size_adj, 2 * size_adj, 3 * size_adj, 5 * size_adj)
    editor_window.edit_buttons_2.add_button(
        guiutils.get_cairo_image("resync" + icon_color),
        tlineaction.resync_button_pressed)
    editor_window.edit_buttons_2.add_button(
        guiutils.get_cairo_image("split_audio" + icon_color),
        tlineaction.split_audio_button_pressed)
    tooltips = [_("Resync Selected"), _("Split Audio")]
    tooltip_runner = glassbuttons.TooltipRunner(editor_window.edit_buttons_2,
                                                tooltips)
    editor_window.edit_buttons_2.no_decorations = no_decorations

    editor_window.monitor_insert_buttons = glassbuttons.GlassButtonsGroup(
        44 * size_adj, 23 * size_adj, 2 * size_adj, 3 * size_adj, 5 * size_adj)
    editor_window.monitor_insert_buttons.add_button(
        guiutils.get_cairo_image("overwrite_range" + icon_color),
        tlineaction.range_overwrite_pressed)
    editor_window.monitor_insert_buttons.add_button(
        guiutils.get_cairo_image("overwrite_clip" + icon_color),
        tlineaction.three_point_overwrite_pressed)
    editor_window.monitor_insert_buttons.add_button(
        guiutils.get_cairo_image("insert_clip" + icon_color),
        tlineaction.insert_button_pressed)
    editor_window.monitor_insert_buttons.add_button(
        guiutils.get_cairo_image("append_clip" + icon_color),
        tlineaction.append_button_pressed)
    tooltips = [
        _("Overwrite Range"),
        _("Overwrite Clip - T"),
        _("Insert Clip - Y"),
        _("Append Clip - U")
    ]
    tooltip_runner = glassbuttons.TooltipRunner(
        editor_window.monitor_insert_buttons, tooltips)
    editor_window.monitor_insert_buttons.no_decorations = no_decorations

    editor_window.undo_redo = glassbuttons.GlassButtonsGroup(
        28 * size_adj, 23 * size_adj, 2 * size_adj, 2 * size_adj, 7 * size_adj)
    editor_window.undo_redo.add_button(
        guiutils.get_cairo_image("undo" + icon_color),
        undo.do_undo_and_repaint)
    editor_window.undo_redo.add_button(
        guiutils.get_cairo_image("redo" + icon_color),
        undo.do_redo_and_repaint)
    tooltips = [_("Undo - Ctrl + Z"), _("Redo - Ctrl + Y")]
    tooltip_runner = glassbuttons.TooltipRunner(editor_window.undo_redo,
                                                tooltips)
    editor_window.undo_redo.no_decorations = no_decorations

    editor_window.tools_buttons = glassbuttons.GlassButtonsGroup(
        30 * size_adj, 23 * size_adj, 2 * size_adj, 14 * size_adj,
        7 * size_adj)
    editor_window.tools_buttons.add_button(
        guiutils.get_cairo_image("open_mixer" + icon_color),
        audiomonitoring.show_audio_monitor)
    editor_window.tools_buttons.add_button(
        guiutils.get_cairo_image("open_titler" + icon_color),
        titler.show_titler)
    editor_window.tools_buttons.add_button(
        guiutils.get_cairo_image("open_gmic" + icon_color), gmic.launch_gmic)
    editor_window.tools_buttons.add_button(
        guiutils.get_cairo_image("open_renderqueue" + icon_color),
        lambda: batchrendering.launch_batch_rendering())
    tooltips = [
        _("Audio Mixer"),
        _("Titler"),
        _("G'Mic Effects"),
        _("Batch Render Queue")
    ]
    tooltip_runner = glassbuttons.TooltipRunner(editor_window.tools_buttons,
                                                tooltips)
    editor_window.tools_buttons.no_decorations = True

    if editorstate.audio_monitoring_available == False:
        editor_window.tools_buttons.sensitive[0] = False
        editor_window.tools_buttons.widget.set_tooltip_text(
            _("Audio Mixer(not available)\nTitler"))
Пример #9
0
def get_media_log_events_panel(events_list_view):
    global widgets
    actions_pixbuf = gtk.gdk.pixbuf_new_from_file(respaths.IMAGE_PATH +
                                                  "media_log_action.png")
    group_actions_menu = guicomponents.PressLaunch(_group_action_pressed,
                                                   actions_pixbuf, 38, 22)

    star_check = gtk.CheckButton()
    star_check.set_active(True)
    star_check.connect("clicked", lambda w: media_log_filtering_changed())
    widgets.star_check = star_check

    star_label = gtk.Image()
    star_label.set_from_file(respaths.IMAGE_PATH + "star.png")

    star_not_active_check = gtk.CheckButton()
    star_not_active_check.set_active(True)
    star_not_active_check.connect("clicked",
                                  lambda w: media_log_filtering_changed())
    widgets.star_not_active_check = star_not_active_check

    star_not_active_label = gtk.Image()
    star_not_active_label.set_from_file(respaths.IMAGE_PATH +
                                        "star_not_active.png")

    star_button = gtk.Button()
    star_button.set_image(
        gtk.image_new_from_file(respaths.IMAGE_PATH + "star.png"))
    star_button.connect("clicked", lambda w: media_log_star_button_pressed())

    no_star_button = gtk.Button()
    no_star_button.set_image(
        gtk.image_new_from_file(respaths.IMAGE_PATH + "star_not_active.png"))
    no_star_button.connect("clicked",
                           lambda w: media_log_no_star_button_pressed())

    widgets.group_box = gtk.HBox()
    _create_group_select()
    widgets.group_view_select.set_active(0)

    row1 = gtk.HBox()
    row1.pack_start(guiutils.get_pad_label(6, 12), False, True, 0)
    row1.pack_start(group_actions_menu.widget, False, True, 0)
    row1.pack_start(guiutils.get_pad_label(6, 12), False, True, 0)
    row1.pack_start(widgets.group_box, False, True, 0)
    row1.pack_start(guiutils.get_pad_label(6, 12), False, True, 0)
    row1.pack_start(star_check, False, True, 0)
    row1.pack_start(star_label, False, True, 0)
    row1.pack_start(guiutils.get_pad_label(6, 12), False, True, 0)
    row1.pack_start(star_not_active_check, False, True, 0)
    row1.pack_start(star_not_active_label, False, True, 0)
    row1.pack_start(guiutils.pad_label(12, 12), False, False, 0)
    row1.pack_start(star_button, False, True, 0)
    row1.pack_start(no_star_button, False, True, 0)
    row1.pack_start(gtk.Label(), True, True, 0)

    widgets.log_range = gtk.Button()
    widgets.log_range.set_image(
        gtk.image_new_from_file(respaths.IMAGE_PATH + "log_range.png"))
    widgets.log_range.set_size_request(80, 30)
    widgets.log_range.connect("clicked", lambda w: log_range_clicked())

    delete_button = gtk.Button()
    delete_button.set_image(
        gtk.image_new_from_file(respaths.IMAGE_PATH + "delete_log_range.png"))
    delete_button.set_size_request(80, 30)
    delete_button.connect("clicked", lambda w: delete_selected())

    use_comments_label = gtk.Label(_("Use Comments as Clip Names"))
    use_comments_check = gtk.CheckButton()
    use_comments_check.set_active(False)
    widgets.use_comments_check = use_comments_check

    insert_displayed = gtk.Button()
    insert_displayed.set_image(
        gtk.image_new_from_file(respaths.IMAGE_PATH + "insert_media_log.png"))
    insert_displayed.set_size_request(80, 22)
    insert_displayed.connect("clicked", lambda w: insert_selected_log_events())

    append_displayed = gtk.Button()
    append_displayed.set_image(
        gtk.image_new_from_file(respaths.IMAGE_PATH + "append_media_log.png"))
    append_displayed.set_size_request(80, 22)
    append_displayed.connect("clicked", lambda w: append_log_events())

    row2 = gtk.HBox()
    row2.pack_start(widgets.log_range, False, True, 0)
    row2.pack_start(delete_button, False, True, 0)
    row2.pack_start(gtk.Label(), True, True, 0)
    row2.pack_start(use_comments_label, False, True, 0)
    row2.pack_start(use_comments_check, False, True, 0)
    row2.pack_start(gtk.Label(), True, True, 0)
    row2.pack_start(insert_displayed, False, True, 0)
    row2.pack_start(append_displayed, False, True, 0)

    panel = gtk.VBox()
    panel.pack_start(row1, False, True, 0)
    panel.pack_start(events_list_view, True, True, 0)
    panel.pack_start(row2, False, True, 0)
    panel.set_size_request(400, 200)

    star_check.set_tooltip_text(_("Display starred ranges"))
    star_not_active_check.set_tooltip_text(_("Display non-starred ranges"))
    star_button.set_tooltip_text(_("Set selected ranges starred"))
    no_star_button.set_tooltip_text(_("Set selected ranges non-starred"))
    widgets.log_range.set_tooltip_text(_("Log current marked range"))
    delete_button.set_tooltip_text(_("Delete selected ranges"))
    insert_displayed.set_tooltip_text(_("Insert selected ranges on Timeline"))
    append_displayed.set_tooltip_text(_("Append displayed ranges on Timeline"))

    dnd.connect_range_log(events_list_view.treeview)

    return panel
Пример #10
0
    def __init__(self):
        global IMG_PATH
        IMG_PATH = respaths.IMAGE_PATH

        # Read cursors
        global INSERTMOVE_CURSOR, OVERWRITE_CURSOR, TWOROLL_CURSOR, ONEROLL_CURSOR, \
        ONEROLL_NO_EDIT_CURSOR, TWOROLL_NO_EDIT_CURSOR, SLIDE_CURSOR, SLIDE_NO_EDIT_CURSOR, \
        MULTIMOVE_CURSOR, MULTIMOVE_NO_EDIT_CURSOR
        INSERTMOVE_CURSOR = gtk.gdk.pixbuf_new_from_file(
            respaths.IMAGE_PATH + "insertmove_cursor.png")
        OVERWRITE_CURSOR = gtk.gdk.pixbuf_new_from_file(respaths.IMAGE_PATH +
                                                        "overwrite_cursor.png")
        TWOROLL_CURSOR = gtk.gdk.pixbuf_new_from_file(respaths.IMAGE_PATH +
                                                      "tworoll_cursor.png")
        ONEROLL_CURSOR = gtk.gdk.pixbuf_new_from_file(respaths.IMAGE_PATH +
                                                      "oneroll_cursor.png")
        SLIDE_CURSOR = gtk.gdk.pixbuf_new_from_file(respaths.IMAGE_PATH +
                                                    "slide_cursor.png")
        ONEROLL_NO_EDIT_CURSOR = gtk.gdk.pixbuf_new_from_file(
            respaths.IMAGE_PATH + "oneroll_noedit_cursor.png")
        TWOROLL_NO_EDIT_CURSOR = gtk.gdk.pixbuf_new_from_file(
            respaths.IMAGE_PATH + "tworoll_noedit_cursor.png")
        SLIDE_NO_EDIT_CURSOR = gtk.gdk.pixbuf_new_from_file(
            respaths.IMAGE_PATH + "slide_noedit_cursor.png")
        MULTIMOVE_CURSOR = gtk.gdk.pixbuf_new_from_file(respaths.IMAGE_PATH +
                                                        "multimove_cursor.png")
        MULTIMOVE_NO_EDIT_CURSOR = gtk.gdk.pixbuf_new_from_file(
            respaths.IMAGE_PATH + "multimove_cursor.png")

        # Window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_icon_from_file(respaths.IMAGE_PATH +
                                       "flowbladeappicon.png")
        self.window.set_border_width(5)

        # To ask confirmation for shutdown
        self.window.connect("delete-event", lambda w, e: app.shutdown())

        # Player consumer has to be stopped and started when window resized
        self.window.connect("window-state-event",
                            lambda w, e: updater.refresh_player())

        # Build menubar
        # Menubar build resources
        menu_actions = [
            ('FileMenu', None, _('_File')),
            ('New', None, _('_New...'), '<control>N', None,
             lambda a: projectaction.new_project()),
            ('Open', None, _('_Open...'), '<control>O', None,
             lambda a: projectaction.load_project()),
            ('OpenRecent', None, _('Open Recent')),
            ('Save', None, _('_Save'), '<control>S', None,
             lambda a: projectaction.save_project()),
            ('Save As', None, _('_Save As...'), None, None,
             lambda a: projectaction.save_project_as()),
            ('SaveSnapshot', None, _('Save Backup Snapshot...'), None, None,
             lambda a: projectaction.save_backup_snapshot()),
            ('ExportMenu', None, _('Export')),
            ('ExportMeltXML', None, _('MLT XML'), None, None,
             lambda a: exporting.MELT_XML_export()),
            ('ExportEDL', None, _('EDL CMX 3600'), None, None,
             lambda a: exporting.EDL_export()),
            ('ExportScreenshot', None, _('Current Frame'), None, None,
             lambda a: exporting.screenshot_export()),
            ('Close', None, _('_Close'), None, None,
             lambda a: projectaction.close_project()),
            ('Quit', None, _('_Quit'), '<control>Q', None,
             lambda a: app.shutdown()), ('EditMenu', None, _('_Edit')),
            ('Undo', None, _('_Undo'), '<control>Z', None,
             undo.do_undo_and_repaint),
            ('Redo', None, _('_Redo'), '<control>Y', None,
             undo.do_redo_and_repaint),
            ('AddFromMonitor', None, _('Add Monitor Clip')),
            ('AppendClip', None, _('Append'), None, None,
             lambda a: tlineaction.append_button_pressed()),
            ('InsertClip', None, _('Insert'), None, None,
             lambda a: tlineaction.insert_button_pressed()),
            ('ThreepointOverWriteClip', None, _('Three Point Overwrite'), None,
             None, lambda a: tlineaction.three_point_overwrite_pressed()),
            ('RangeOverWriteClip', None, _('Range Overwrite'), None, None,
             lambda a: tlineaction.range_overwrite_pressed()),
            ('CutClip', None, _('Cut Clip'), None, None,
             lambda a: tlineaction.cut_pressed()),
            ('DeleteClip', None, _('Lift'), None, None,
             lambda a: tlineaction.lift_button_pressed()),
            ('SpliceOutClip', None, _('Splice Out'), None, None,
             lambda a: tlineaction.splice_out_button_pressed()),
            ('ResyncSelected', None, _('Resync'), None, None,
             lambda a: tlineaction.resync_button_pressed()),
            ('SetSyncParent', None, _('Set Sync Parent'), None, None,
             lambda a: _this_is_not_used()),
            ('AddTransition', None, _('Add Single Track Transition'), None,
             None, lambda a: tlineaction.add_transition_menu_item_selected()),
            ('AddFade', None, _('Add Single Track Fade'), None, None,
             lambda a: tlineaction.add_fade_menu_item_selected()),
            ('ClearFilters', None, _('Clear Filters'), None, None,
             lambda a: clipmenuaction.clear_filters()),
            ('ChangeSequenceTracks', None,
             _('Change Sequence Tracks Count...'), None, None,
             lambda a: projectaction.change_sequence_track_count()),
            ('Watermark', None, _('Watermark...'), None, None,
             lambda a: menuactions.edit_watermark()),
            ('ProfilesManager', None, _('Profiles Manager'), None, None,
             lambda a: menuactions.profiles_manager()),
            ('Preferences', None, _('Preferences'), None, None,
             lambda a: preferenceswindow.preferences_dialog()),
            ('ViewMenu', None, _('View')), ('ProjectMenu', None, _('Project')),
            ('AddMediaClip', None, _('Add Media Clip...'), None, None,
             lambda a: projectaction.add_media_files()),
            ('AddImageSequence', None, _('Add Image Sequence...'), None, None,
             lambda a: projectaction.add_image_sequence()),
            ('CreateColorClip', None, _('Create Color Clip...'), None, None,
             lambda a: patternproducer.create_color_clip()),
            ('PatternProducersMenu', None, _('Create Pattern Producer')),
            ('CreateNoiseClip', None, _('Noise'), None, None,
             lambda a: patternproducer.create_noise_clip()),
            ('CreateBarsClip', None, _('EBU Bars'), None, None,
             lambda a: patternproducer.create_bars_clip()),
            ('CreateIsingClip', None, _('Ising'), None, None,
             lambda a: patternproducer.create_icing_clip()),
            ('CreateColorPulseClip', None, _('Color Pulse'), None, None,
             lambda a: patternproducer.create_color_pulse_clip()),
            ('LogClipRange', None, _('Log Marked Clip Range'), '<control>L',
             None, lambda a: medialog.log_range_clicked()),
            ('RecreateMediaIcons', None, _('Recreate Media Icons...'), None,
             None, lambda a: menuactions.recreate_media_file_icons()),
            ('RemoveUnusedMedia', None, _('Remove Unused Media...'), None,
             None, lambda a: projectaction.remove_unused_media()),
            ('JackAudio', None, _("JACK Audio..."), None, None,
             lambda a: menuactions.jack_output_managing()),
            ('ProxyManager', None, _('Proxy Manager'), None, None,
             lambda a: proxyediting.show_proxy_manager_dialog()),
            ('ProjectType', None, _("Change Project Type..."), None, None,
             lambda a: projectaction.change_project_type()),
            ('ProjectInfo', None, _('Project Info'), None, None,
             lambda a: menuactions.show_project_info()),
            ('RenderMenu', None, _('Render')),
            ('AddToQueue', None, _('Add To Batch Render Queue...'), None, None,
             lambda a: projectaction.add_to_render_queue()),
            ('BatchRender', None, _('Batch Render Queue'), None, None,
             lambda a: batchrendering.launch_batch_rendering()),
            ('Render', None, _('Render Timeline'), None, None,
             lambda a: projectaction.do_rendering()),
            ('ToolsMenu', None, _('Tools')),
            ('Titler', None, _('Titler'), None, None,
             lambda a: titler.show_titler()),
            ('AudioMix', None, _('Audio Mixer'), None, None,
             lambda a: audiomonitoring.show_audio_monitor()),
            ('MediaLink', None, _('Media Relinker'), None, None,
             lambda a: medialinker.display_linker()),
            ('HelpMenu', None, _('_Help')),
            ('QuickReference', None, _('Contents'), None, None,
             lambda a: menuactions.quick_reference()),
            ('Environment', None, _('Runtime Environment'), None, None,
             lambda a: menuactions.environment()),
            ('KeyboardShortcuts', None, _('Keyboard Shortcuts'), None, None,
             lambda a: dialogs.keyboard_shortcuts_dialog(self.window)),
            ('About', None, _('About'), None, None,
             lambda a: menuactions.about()),
            ('InsertMode', None, None, '1', None,
             lambda a: _this_is_not_used()),
            ('OverMode', None, None, '2', None, lambda a: _this_is_not_used()),
            ('OneRollMode', None, None, '3', None,
             lambda a: _this_is_not_used()),
            ('TwoRollMode', None, None, '4', None,
             lambda a: _this_is_not_used()),
            ('SlideMode', None, None, '5', None,
             lambda a: _this_is_not_used()),
            ('MultiMode', None, None, '6', None, lambda a: _this_is_not_used())
        ]

        menu_string = """<ui>
            <menubar name='MenuBar'>
                <menu action='FileMenu'>
                    <menuitem action='New'/>
                    <menuitem action='Open'/>
                    <menu action='OpenRecent'/>
                    <menuitem action='Save'/>
                    <menuitem action='Save As'/>
                    <menuitem action='SaveSnapshot'/>
                    <separator/>
                    <menu action='ExportMenu'>
                        <menuitem action='ExportMeltXML'/>
                        <menuitem action='ExportScreenshot'/>
                    </menu>
                    <separator/>
                    <menuitem action='Close'/>
                    <menuitem action='Quit'/>
                </menu>
                <menu action='EditMenu'>
                    <menuitem action='Undo'/>
                    <menuitem action='Redo'/>
                    <separator/>
                    <menu action='AddFromMonitor'>
                        <menuitem action='AppendClip'/>
                        <menuitem action='InsertClip'/>
                        <menuitem action='ThreepointOverWriteClip'/>
                        <menuitem action='RangeOverWriteClip'/>
                    </menu>
                    <separator/>
                    <menuitem action='CutClip'/>
                    <separator/>
                    <menuitem action='SpliceOutClip'/>
                    <menuitem action='DeleteClip'/>
                    <menuitem action='ResyncSelected'/>
                    <menuitem action='ClearFilters'/>
                    <separator/>
                    <menuitem action='AddTransition'/>
                    <menuitem action='AddFade'/>
                    <separator/>
                    <menuitem action='ChangeSequenceTracks'/>
                    <menuitem action='Watermark'/>
                    <separator/>
                    <menuitem action='ProfilesManager'/>
                    <menuitem action='Preferences'/>
                </menu>
                <menu action='ViewMenu'>
                </menu>
                <menu action='ProjectMenu'>
                    <menuitem action='AddMediaClip'/>
                    <menuitem action='AddImageSequence'/>
                    <separator/>
                    <menuitem action='CreateColorClip'/>
                    <menu action='PatternProducersMenu'>
                        <menuitem action='CreateNoiseClip'/>
                        <menuitem action='CreateColorPulseClip'/>
                        <menuitem action='CreateIsingClip'/>
                        <menuitem action='CreateBarsClip'/>    
                    </menu>
                    <separator/>
                    <menuitem action='LogClipRange'/>
                    <separator/>
                    <menuitem action='RecreateMediaIcons'/>
                    <menuitem action='RemoveUnusedMedia'/>
                    <separator/>
                    <menuitem action='ProxyManager'/>
                </menu>
                <menu action='RenderMenu'>
                    <menuitem action='AddToQueue'/>
                    <menuitem action='BatchRender'/>
                    <separator/>
                    <menuitem action='Render'/>
                </menu>
                <menu action='ToolsMenu'>
                    <menuitem action='Titler'/>
                    <menuitem action='AudioMix'/>
                    <separator/>
                    <menuitem action='MediaLink'/>
                </menu>
                <menu action='HelpMenu'>
                    <menuitem action='QuickReference'/>
                    <menuitem action='KeyboardShortcuts'/>
                    <menuitem action='Environment'/>
                    <separator/>
                    <menuitem action='About'/>
                </menu>
          </menubar>
        </ui>"""

        # Create global action group
        action_group = gtk.ActionGroup('WindowActions')
        action_group.add_actions(menu_actions, user_data=None)

        # Create UIManager and add accelators to window
        ui = gtk.UIManager()
        ui.insert_action_group(action_group, 0)
        ui.add_ui_from_string(menu_string)
        accel_group = ui.get_accel_group()
        self.window.add_accel_group(accel_group)

        # Get menu bar
        self.menubar = ui.get_widget('/MenuBar')

        # Set reference to UI manager and acclegroup
        self.uimanager = ui
        self.accel_group = accel_group

        # Add recent projects to menu
        editorpersistance.fill_recents_menu_widget(
            ui.get_widget('/MenuBar/FileMenu/OpenRecent'),
            projectaction.open_recent_project)

        # Disable audio mixer if not available
        if editorstate.audio_monitoring_available == False:
            ui.get_widget('/MenuBar/ToolsMenu/AudioMix').set_sensitive(False)

        # Menu box
        menu_vbox = gtk.VBox(False, 0)
        menu_vbox.pack_start(self.menubar, False, True, 0)

        # Media manager
        self.bin_list_view = guicomponents.BinListView(
            projectaction.bin_selection_changed, projectaction.bin_name_edited)
        dnd.connect_bin_tree_view(self.bin_list_view.treeview,
                                  projectaction.move_files_to_bin)
        self.bin_list_view.set_property("can-focus", True)
        bins_panel = panels.get_bins_panel(
            self.bin_list_view, lambda w, e: projectaction.add_new_bin(),
            lambda w, e: projectaction.delete_selected_bin())
        bins_panel.set_size_request(MEDIA_MANAGER_WIDTH, BINS_HEIGHT)

        self.media_list_view = guicomponents.MediaPanel(
            projectaction.media_file_menu_item_selected,
            updater.set_and_display_monitor_media_file)
        self.media_scroll_window = gtk.ScrolledWindow()
        self.media_scroll_window.add_with_viewport(self.media_list_view.widget)
        self.media_scroll_window.set_policy(gtk.POLICY_AUTOMATIC,
                                            gtk.POLICY_AUTOMATIC)
        self.media_scroll_window.set_size_request(
            guicomponents.MEDIA_OBJECT_WIDGET_WIDTH * 2 + 70,
            guicomponents.MEDIA_OBJECT_WIDGET_HEIGHT)
        self.media_scroll_window.show_all()

        media_panel = panels.get_media_files_panel(
            self.media_scroll_window,
            lambda w, e: projectaction.add_media_files(),
            lambda w, e: projectaction.delete_media_files(),
            lambda a: self.media_list_view.columns_changed(a),
            lambda w, e: proxyediting.create_proxy_files_pressed(),
            projectaction.media_filtering_select_pressed)

        self.mm_paned = gtk.HPaned()
        self.mm_paned.pack1(bins_panel, resize=True, shrink=True)
        self.mm_paned.pack2(media_panel, resize=True, shrink=False)

        mm_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        mm_panel.set_padding(2, 2, 6, 2)
        mm_panel.add(self.mm_paned)

        # Effects
        self.effect_select_list_view = guicomponents.FilterListView()
        self.effect_select_combo_box = gtk.combo_box_new_text()
        self.effect_select_list_view.treeview.connect(
            "row-activated",
            clipeffectseditor.effect_select_row_double_clicked)
        dnd.connect_effects_select_tree_view(
            self.effect_select_list_view.treeview)

        clip_editor_panel = clipeffectseditor.get_clip_effects_editor_panel(
            self.effect_select_combo_box, self.effect_select_list_view)

        clipeffectseditor.widgets.effect_stack_view.treeview.connect(
            "button-press-event", clipeffectseditor.filter_stack_button_press)

        effects_editor_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        effects_editor_panel.set_padding(0, 0, 4, 0)
        effects_editor_panel.add(clipeffectseditor.widgets.value_edit_frame)

        effects_hbox = gtk.HBox()
        effects_hbox.set_border_width(5)
        effects_hbox.pack_start(clip_editor_panel, False, False, 0)
        effects_hbox.pack_start(effects_editor_panel, True, True, 0)

        self.effects_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        self.effects_panel.set_padding(2, 2, 2, 2)
        self.effects_panel.add(effects_hbox)

        # Compositors
        compositor_clip_panel = compositeeditor.get_compositor_clip_panel()

        compositor_editor_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        compositor_editor_panel.set_padding(0, 0, 4, 0)
        compositor_editor_panel.add(compositeeditor.widgets.value_edit_frame)

        compositors_hbox = gtk.HBox()
        compositors_hbox.set_border_width(5)
        compositors_hbox.pack_start(compositor_clip_panel, False, False, 0)
        compositors_hbox.pack_start(compositor_editor_panel, True, True, 0)

        self.compositors_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        self.compositors_panel.set_padding(0, 0, 0, 0)
        self.compositors_panel.add(compositors_hbox)

        # Render
        normal_height = True
        if appconsts.TOP_ROW_HEIGHT < 500:  # small screens have no space to display this
            normal_height = False

        add_audio_desc = True
        if editorstate.SCREEN_HEIGHT < 863:
            add_audio_desc = False

        try:
            render.create_widgets(normal_height)
            render_panel_left = rendergui.get_render_panel_left(
                render.widgets, add_audio_desc, normal_height)
        except IndexError:
            print "No rendering options found"
            render_panel_left = None

        # 'None' here means that no possible rendering options were available
        # and creating panel failed. Inform user of this and hide render GUI
        if render_panel_left == None:
            render_hbox = gtk.VBox(False, 5)
            render_hbox.pack_start(gtk.Label("Rendering disabled."), False,
                                   False, 0)
            render_hbox.pack_start(
                gtk.Label("No available rendering options found."), False,
                False, 0)
            render_hbox.pack_start(
                gtk.Label(
                    "See Help->Environment->Render Options for details."),
                False, False, 0)
            render_hbox.pack_start(
                gtk.Label("Install codecs to make rendering available."),
                False, False, 0)
            render_hbox.pack_start(gtk.Label(" "), True, True, 0)
        else:  # all is good
            render_panel_right = rendergui.get_render_panel_right(
                render.widgets, lambda w, e: projectaction.do_rendering(),
                lambda w, e: projectaction.add_to_render_queue())
            render_hbox = gtk.HBox(True, 5)
            render_hbox.pack_start(render_panel_left, True, True, 0)
            render_hbox.pack_start(render_panel_right, True, True, 0)

        render_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        render_panel.set_padding(2, 6, 8, 6)
        render_panel.add(render_hbox)

        # Media log events List
        media_log_events_list_view = medialog.get_media_log_list_view()
        events_panel = medialog.get_media_log_events_panel(
            media_log_events_list_view)

        media_log_vbox = gtk.HBox()
        media_log_vbox.pack_start(events_panel, True, True, 0)

        media_log_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        media_log_panel.set_padding(6, 6, 6, 6)
        media_log_panel.add(media_log_vbox)
        self.media_log_events_list_view = media_log_events_list_view

        # Sequence list
        self.sequence_list_view = guicomponents.SequenceListView(
            projectaction.sequence_name_edited)
        seq_panel = panels.get_sequences_panel(
            self.sequence_list_view,
            lambda w, e: projectaction.change_edit_sequence(),
            lambda w, e: projectaction.add_new_sequence(),
            lambda w, e: projectaction.delete_selected_sequence())

        # Project info
        project_info_panel = projectinfogui.get_project_info_panel()

        # Project vbox and panel
        project_vbox = gtk.HBox()
        project_vbox.pack_start(project_info_panel, False, True, 0)
        project_vbox.pack_start(seq_panel, True, True, 0)

        project_panel = gtk.Alignment(0.5, 0.5, 1.0, 1.0)
        project_panel.set_padding(0, 2, 6, 2)
        project_panel.add(project_vbox)

        # Notebook
        self.notebook = gtk.Notebook()
        self.notebook.set_size_request(appconsts.NOTEBOOK_WIDTH,
                                       appconsts.TOP_ROW_HEIGHT)
        self.notebook.append_page(mm_panel, gtk.Label(_("Media")))
        self.notebook.append_page(media_log_panel, gtk.Label(_("Range Log")))
        self.notebook.append_page(self.effects_panel, gtk.Label(_("Filters")))
        self.notebook.append_page(self.compositors_panel,
                                  gtk.Label(_("Compositors")))
        self.notebook.append_page(project_panel, gtk.Label(_("Project")))
        self.notebook.append_page(render_panel, gtk.Label(_("Render")))
        self.notebook.set_tab_pos(gtk.POS_BOTTOM)

        # Right notebook, used for Widescreen and Two row layouts
        self.right_notebook = gtk.Notebook()
        self.right_notebook.set_tab_pos(gtk.POS_BOTTOM)

        # Position bar and decorative frame  for it
        self.pos_bar = PositionBar()
        pos_bar_frame = gtk.Frame()
        pos_bar_frame.add(self.pos_bar.widget)
        pos_bar_frame.set_shadow_type(gtk.SHADOW_ETCHED_IN)

        # Positionbar vbox
        pos_bar_vbox = gtk.VBox(False, 1)
        pos_bar_vbox.pack_start(guiutils.get_pad_label(5, 2), False, True, 0)
        pos_bar_vbox.pack_start(pos_bar_frame, False, True, 0)

        # Play buttons row
        self._create_monitor_row_widgets()
        self.player_buttons = glassbuttons.PlayerButtons()
        self.player_buttons.widget.set_tooltip_text(
            _("Prev Frame - Arrow Left\nNext Frame - Arrow Right\nPlay - Space\nStop - Space\nMark In - I\nMark Out - O\nClear Marks\nTo Mark In\nTo Mark Out"
              ))
        self.monitor_source.modify_font(pango.FontDescription("sans bold 8"))
        player_buttons_row = gtk.HBox(False, 0)

        player_buttons_row.pack_start(self.player_buttons.widget, False, True,
                                      0)
        player_buttons_row.pack_start(self.monitor_source, True, True, 0)

        # Creates monitor switch buttons
        self._create_monitor_buttons()

        # Switch button box
        switch_hbox = gtk.HBox(True, 1)
        switch_hbox.pack_start(self.sequence_editor_b, False, False, 0)
        switch_hbox.pack_start(self.clip_editor_b, False, False, 0)

        # Switch button box V, for centered buttons
        switch_vbox = gtk.VBox(False, 1)
        switch_vbox.pack_start(guiutils.get_pad_label(5, 2), False, True, 0)
        switch_vbox.pack_start(switch_hbox, False, True, 0)

        # Switch / pos bar row
        self.view_mode_select = guicomponents.get_monitor_view_select_combo(
            lambda w, e: tlineaction.view_mode_menu_lauched(w, e))
        sw_pos_hbox = gtk.HBox(False, 1)
        sw_pos_hbox.pack_start(switch_vbox, False, True, 0)
        sw_pos_hbox.pack_start(pos_bar_vbox, True, True, 0)
        sw_pos_hbox.pack_start(self.view_mode_select.widget, False, False, 0)

        # Video display
        black_box = gtk.EventBox()
        black_box.add(gtk.Label())
        bg_color = gtk.gdk.Color(red=0.0, green=0.0, blue=0.0)
        black_box.modify_bg(gtk.STATE_NORMAL, bg_color)

        self.tline_display = black_box  # This can be any GTK+ widget (that is not "windowless"), only its XWindow draw rect
        # is used to position and scale SDL overlay that actually displays video.
        dnd.connect_video_monitor(self.tline_display)

        # Monitor
        monitor_vbox = gtk.VBox(False, 1)
        monitor_vbox.pack_start(self.tline_display, True, True, 0)
        monitor_vbox.pack_start(sw_pos_hbox, False, True, 0)
        monitor_vbox.pack_start(player_buttons_row, False, True, 0)

        monitor_align = gtk.Alignment(xalign=0.0,
                                      yalign=0.0,
                                      xscale=1.0,
                                      yscale=1.0)
        monitor_align.add(monitor_vbox)
        monitor_align.set_padding(3, 0, 3, 3)

        monitor_frame = gtk.Frame()
        monitor_frame.add(monitor_align)
        monitor_frame.set_shadow_type(gtk.SHADOW_ETCHED_OUT)
        monitor_frame.set_size_request(MONITOR_AREA_WIDTH,
                                       appconsts.TOP_ROW_HEIGHT)

        # Notebook panel
        notebook_vbox = gtk.VBox(False, 1)
        notebook_vbox.pack_start(self.notebook, True, True)

        # Top row paned
        self.top_paned = gtk.HPaned()
        self.top_paned.pack1(notebook_vbox, resize=False, shrink=False)
        self.top_paned.pack2(monitor_frame, resize=True, shrink=False)

        # Top row
        self.top_row_hbox = gtk.HBox(False, 0)
        self.top_row_hbox.pack_start(self.top_paned, True, True, 0)
        self._update_top_row()

        # Edit buttons rows
        self.edit_buttons_row = self._get_edit_buttons_row()
        self.edit_buttons_frame = gtk.Frame()
        self.edit_buttons_frame.add(self.edit_buttons_row)
        self.edit_buttons_frame.set_shadow_type(gtk.SHADOW_ETCHED_IN)

        # Timeline scale
        self.tline_scale = tlinewidgets.TimeLineFrameScale(
            editevent.insert_move_mode_pressed, updater.mouse_scroll_zoom)

        # Timecode display
        self.tline_info = gtk.HBox()
        info_contents = gtk.Label()
        self.tline_info.add(info_contents)
        self.tline_info.info_contents = info_contents  # this switched and sacved as member of its container
        info_h = gtk.HBox()
        info_h.pack_start(self.tline_info, False, False, 0)
        info_h.pack_start(gtk.Label(), True, True, 0)
        info_h.set_size_request(
            tlinewidgets.COLUMN_WIDTH - 22 -
            22,  # - 22, # room for 2 menu launch buttons 
            tlinewidgets.SCALE_HEIGHT)

        marker_pixbuf = gtk.gdk.pixbuf_new_from_file(respaths.IMAGE_PATH +
                                                     "marker.png")
        markers_launcher = guicomponents.get_markers_menu_launcher(
            tlineaction.marker_menu_lauch_pressed, marker_pixbuf)

        tracks_launcher_pixbuf = gtk.gdk.pixbuf_new_from_file(
            respaths.IMAGE_PATH + "track_menu_launch.png")
        tracks_launcher = guicomponents.PressLaunch(
            trackaction.all_tracks_menu_launch_pressed, tracks_launcher_pixbuf)

        # Timeline top row
        tline_hbox_1 = gtk.HBox()
        tline_hbox_1.pack_start(info_h, False, False, 0)
        tline_hbox_1.pack_start(tracks_launcher.widget, False, False, 0)
        tline_hbox_1.pack_start(markers_launcher.widget, False, False, 0)
        tline_hbox_1.pack_start(self.tline_scale.widget, True, True, 0)

        # Timeline column
        self.tline_column = tlinewidgets.TimeLineColumn(
            trackaction.track_active_switch_pressed,
            trackaction.track_center_pressed)

        # Timeline editpanel
        self.tline_canvas = tlinewidgets.TimeLineCanvas(
            editevent.tline_canvas_mouse_pressed,
            editevent.tline_canvas_mouse_moved,
            editevent.tline_canvas_mouse_released,
            editevent.tline_canvas_double_click, updater.mouse_scroll_zoom,
            self.tline_cursor_leave, self.tline_cursor_enter)

        dnd.connect_tline(self.tline_canvas.widget,
                          editevent.tline_effect_drop,
                          editevent.tline_media_drop)

        # Timeline middle row
        tline_hbox_2 = gtk.HBox()
        tline_hbox_2.pack_start(self.tline_column.widget, False, False, 0)
        tline_hbox_2.pack_start(self.tline_canvas.widget, True, True, 0)

        # Bottom row filler
        self.left_corner = guicomponents.TimeLineLeftBottom()
        self.left_corner.widget.set_size_request(tlinewidgets.COLUMN_WIDTH, 20)

        # Timeline scroller
        self.tline_scroller = tlinewidgets.TimeLineScroller(
            updater.tline_scrolled)

        # Timeline bottom row
        tline_hbox_3 = gtk.HBox()
        tline_hbox_3.pack_start(self.left_corner.widget, False, False, 0)
        tline_hbox_3.pack_start(self.tline_scroller, True, True, 0)

        # Timeline hbox
        tline_vbox = gtk.VBox()
        tline_vbox.pack_start(tline_hbox_1, False, False, 0)
        tline_vbox.pack_start(tline_hbox_2, True, True, 0)
        tline_vbox.pack_start(tline_hbox_3, False, False, 0)

        # Timeline box
        self.tline_box = gtk.HBox()
        self.tline_box.pack_start(tline_vbox, True, True, 0)

        # Timeline pane
        tline_pane = gtk.VBox(False, 1)
        tline_pane.pack_start(self.edit_buttons_frame, False, True, 0)
        tline_pane.pack_start(self.tline_box, True, True, 0)

        # VPaned top row / timeline
        self.app_v_paned = gtk.VPaned()
        self.app_v_paned.pack1(self.top_row_hbox, resize=False, shrink=False)
        self.app_v_paned.pack2(tline_pane, resize=True, shrink=False)

        # Pane
        pane = gtk.VBox(False, 1)
        pane.pack_start(menu_vbox, False, True, 0)
        pane.pack_start(self.app_v_paned, True, True, 0)

        # Tooltips
        self._add_tool_tips()

        # GUI preferences
        self._init_gui_to_prefs()

        # Viewmenu initial state
        self._init_view_menu(ui.get_widget('/MenuBar/ViewMenu'))

        # Set pane and show window
        self.window.add(pane)
        self.window.set_title("Flowblade")

        # Maximize if it seems that we exited maximized, else set size
        w, h = editorpersistance.prefs.exit_allocation
        if w != 0:  # non-existing prefs file causes w and h to be 0
            if (float(w) / editorstate.SCREEN_WIDTH >
                    0.95) and (float(h) / editorstate.SCREEN_HEIGHT > 0.95):
                self.window.maximize()
                print "maximize"
            else:
                self.window.resize(w, h)
                self.window.set_position(gtk.WIN_POS_CENTER)
        else:
            self.window.set_position(gtk.WIN_POS_CENTER)

        # Show window and all of its components
        self.window.show_all()

        # Set paned positions
        self.mm_paned.set_position(editorpersistance.prefs.mm_paned_position)
        self.top_paned.set_position(editorpersistance.prefs.top_paned_position)
        self.app_v_paned.set_position(
            editorpersistance.prefs.app_v_paned_position)
Пример #11
0
    def __init__(self, filter_object, filter_stack):
        self.filter_object = filter_object
        self.filter_stack = filter_stack

        surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                     "filter_save.png")
        save_button = guicomponents.PressLaunch(self.save_pressed,
                                                surface,
                                                w=22,
                                                h=22)
        save_button.widget.set_tooltip_markup(_("Save effect values"))

        surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                     "filter_load.png")
        load_button = guicomponents.PressLaunch(self.load_pressed,
                                                surface,
                                                w=22,
                                                h=22)
        load_button.widget.set_tooltip_markup(_("Load effect values"))

        surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH +
                                                     "filter_reset.png")
        reset_button = guicomponents.PressLaunch(self.reset_pressed,
                                                 surface,
                                                 w=22,
                                                 h=22)
        reset_button.widget.set_tooltip_markup(_("Reset effect values"))

        surface = guiutils.get_cairo_image("filters_mask_add")
        mask_button = guicomponents.PressLaunch(self.add_mask_pressed,
                                                surface,
                                                w=22,
                                                h=22)
        mask_button.widget.set_tooltip_markup(_("Add Filter Mask"))

        surface = guiutils.get_cairo_image("filters_move_up")
        move_up_button = guicomponents.PressLaunch(self.move_up_pressed,
                                                   surface,
                                                   w=22,
                                                   h=22)
        move_up_button.widget.set_tooltip_markup(_("Move Filter Up"))

        surface = guiutils.get_cairo_image("filters_move_down")
        move_down_button = guicomponents.PressLaunch(self.move_down_pressed,
                                                     surface,
                                                     w=22,
                                                     h=22)
        move_down_button.widget.set_tooltip_markup(_("Move Filter Down"))

        surface = guiutils.get_cairo_image("filters_move_top")
        move_top_button = guicomponents.PressLaunch(self.move_top_pressed,
                                                    surface,
                                                    w=22,
                                                    h=22)
        move_top_button.widget.set_tooltip_markup(_("Move Filter To Top"))

        surface = guiutils.get_cairo_image("filters_move_bottom")
        move_bottom_button = guicomponents.PressLaunch(
            self.move_bottom_pressed, surface, w=22, h=22)
        move_bottom_button.widget.set_tooltip_markup(
            _("Move Filter To Bottom"))

        self.widget = Gtk.HBox(False, 0)
        self.widget.pack_start(guiutils.pad_label(4, 5), False, False, 0)
        self.widget.pack_start(mask_button.widget, False, False, 0)
        self.widget.pack_start(guiutils.pad_label(2, 5), False, False, 0)
        self.widget.pack_start(reset_button.widget, False, False, 0)
        self.widget.pack_start(guiutils.pad_label(12, 5), False, False, 0)
        self.widget.pack_start(move_up_button.widget, False, False, 0)
        self.widget.pack_start(move_down_button.widget, False, False, 0)
        self.widget.pack_start(move_top_button.widget, False, False, 0)
        self.widget.pack_start(move_bottom_button.widget, False, False, 0)
        self.widget.pack_start(guiutils.pad_label(12, 5), False, False, 0)
        self.widget.pack_start(save_button.widget, False, False, 0)
        self.widget.pack_start(load_button.widget, False, False, 0)

        self.widget.pack_start(Gtk.Label(), True, True, 0)
Пример #12
0
    def __init__(self):
        GObject.GObject.__init__(self)
        self.connect("delete-event", lambda w, e:_shutdown())

        app_icon = GdkPixbuf.Pixbuf.new_from_file(respaths.IMAGE_PATH + "flowbladetoolicon.png")
        self.set_icon(app_icon)

        #---- LEFT PANEL
        hamburger_launcher_surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "hamburger.png")
        self.hamburger_launcher = guicomponents.PressLaunch(_hamburger_launch_pressed, hamburger_launcher_surface)
        guiutils.set_margins(self.hamburger_launcher.widget, 0, 8, 0, 8)

        # Animation selector menu launcher row
        self.animation_label = Gtk.Label(_animation_instance.info.name)
        self.present_event_box = Gtk.EventBox()
        self.present_event_box.add(self.animation_label)
        self.present_event_box.connect("button-press-event", animations_menu_launched)
        self.script_menu = toolguicomponents.PressLaunch(animations_menu_launched)

        selector_row = Gtk.HBox(False, 2)
        selector_row.pack_start(self.hamburger_launcher.widget, False, False, 0)
        selector_row.pack_start(self.present_event_box, False, False, 0)
        selector_row.pack_start(self.script_menu.widget, False, False, 0)
        selector_row.set_margin_top(2)
        # Edit area
        self.value_edit_frame = Gtk.Frame()
        self.value_edit_frame.set_shadow_type(Gtk.ShadowType.IN)
        self.value_edit_frame.set_size_request(EDIT_PANEL_WIDTH+ 10, EDIT_PANEL_HEIGHT + 10)
        self.value_edit_box = None
        
        
        #---- RIGHT PANEL
        self.preview_info = Gtk.Label()
        self.preview_info.set_markup("<small>" + _("no preview") + "</small>" )
        preview_info_row = Gtk.HBox()
        preview_info_row.pack_start(self.preview_info, False, False, 0)
        preview_info_row.pack_start(Gtk.Label(), True, True, 0)
        preview_info_row.set_margin_top(6)
        preview_info_row.set_margin_bottom(8)
        preview_info_row.set_size_request(200, 10)
        
        # Monitor 
        self.preview_monitor = cairoarea.CairoDrawableArea2(MONITOR_WIDTH, MONITOR_HEIGHT, self._draw_preview)

        # Position control panel
        self.pos_bar = positionbar.PositionBar(False)
        self.pos_bar.set_listener(self.position_listener)
        pos_bar_frame = Gtk.Frame()
        pos_bar_frame.add(self.pos_bar.widget)
        pos_bar_frame.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
        pos_bar_frame.set_margin_top(5)
        pos_bar_frame.set_margin_bottom(4)
        pos_bar_frame.set_margin_left(6)
        pos_bar_frame.set_margin_right(2)
                
        self.preview_button = Gtk.Button(_("Preview Frame"))
        self.preview_button.connect("clicked", lambda w: render_preview_frame())
                            
        control_panel = Gtk.HBox(False, 2)
        control_panel.pack_start(pos_bar_frame, True, True, 0)
        control_panel.pack_start(guiutils.pad_label(2, 2), False, False, 0)
        control_panel.pack_start(self.preview_button, False, False, 0)
        
        # Range setting
        in_label = Gtk.Label(_("Start:"))
        self.range_in = Gtk.SpinButton.new_with_range(1, 249, 1)
        out_label = Gtk.Label(_("End:"))
        self.range_out = Gtk.SpinButton.new_with_range(2, 250, 1)
        self.range_in.set_value(1)
        self.range_out.set_value(250)
        self.range_in.connect("value-changed", self.range_changed)
        self.range_out.connect("value-changed", self.range_changed)
        pos_label = Gtk.Label(_("Frame:"))
        self.pos_info = Gtk.Label(_("1"))

        range_row = Gtk.HBox(False, 2)
        range_row.pack_start(in_label, False, False, 0)
        range_row.pack_start(self.range_in, False, False, 0)
        range_row.pack_start(Gtk.Label(), True, True, 0)
        range_row.pack_start(pos_label, False, False, 0)
        range_row.pack_start(self.pos_info, False, False, 0)
        range_row.pack_start(Gtk.Label(), True, True, 0)
        range_row.pack_start(out_label, False, False, 0)
        range_row.pack_start(self.range_out, False, False, 0)
        range_row.set_margin_bottom(24)
        range_row.set_margin_left(5)

        # Render panel
        self.out_folder = Gtk.FileChooserButton(_("Select Folder"))
        self.out_folder.set_action(Gtk.FileChooserAction.SELECT_FOLDER)
        self.out_folder.connect("selection-changed", self.folder_selection_changed) 
        self.out_label = Gtk.Label(label=_("Frames Folder:"))
        
        self.frame_name = Gtk.Entry()
        self.frame_name.set_text("frame")
        self.extension_label = Gtk.Label()
        self.extension_label.set_markup("<small>XXXX.png</small>")

        out_folder_row = guiutils.get_left_justified_box([self.out_label, guiutils.pad_label(12, 2), \
                            self.out_folder, guiutils.pad_label(24, 2), self.frame_name, \
                            guiutils.pad_label(2, 2), self.extension_label])

        self.encode_check_label = Gtk.Label(_("Encode Video"))
        self.encode_check = Gtk.CheckButton()
        self.encode_check.set_active(False)
        self.encode_check.connect("toggled", lambda w:self.update_encode_sensitive())
        
        self.encode_settings_button = Gtk.Button(_("Encoding settings"))
        self.encode_settings_button.connect("clicked", lambda w:_encode_settings_clicked())
        self.encode_desc = Gtk.Label()
        self.encode_desc.set_markup("<small>" + _("not set")  + "</small>")
        self.encode_desc.set_ellipsize(Pango.EllipsizeMode.END)
        self.encode_desc.set_max_width_chars(32)

        encode_row = Gtk.HBox(False, 2)
        encode_row.pack_start(self.encode_check, False, False, 0)
        encode_row.pack_start(self.encode_check_label, False, False, 0)
        encode_row.pack_start(guiutils.pad_label(48, 12), False, False, 0)
        encode_row.pack_start(self.encode_settings_button, False, False, 0)
        encode_row.pack_start(guiutils.pad_label(6, 12), False, False, 0)
        encode_row.pack_start(self.encode_desc, False, False, 0)
        encode_row.pack_start(Gtk.Label(), True, True, 0)
        encode_row.set_margin_bottom(6)

        format_label = Gtk.Label(_("Natron Render Format:"))
        self.format_selector = Gtk.ComboBoxText() # filled later when current sequence known
        for format_desc in NATRON_RENDER_FORMATS:
            self.format_selector.append_text(format_desc)
        self.format_selector.set_active(NATRON_DEFAULT_RENDER_FORMAT)

        format_select_row = Gtk.HBox(False, 2)
        format_select_row.pack_start(format_label, False, False, 0)
        format_select_row.pack_start(guiutils.pad_label(12, 2), False, False, 0)
        format_select_row.pack_start(self.format_selector, False, False, 0)
        format_select_row.set_margin_top(24)

        self.render_percentage = Gtk.Label("")
        
        self.status_no_render = _("Set Frames Folder for valid render")
         
        self.render_status_info = Gtk.Label()
        self.render_status_info.set_markup("<small>" + self.status_no_render  + "</small>") 

        render_status_row = Gtk.HBox(False, 2)
        render_status_row.pack_start(self.render_percentage, False, False, 0)
        render_status_row.pack_start(Gtk.Label(), True, True, 0)
        render_status_row.pack_start(self.render_status_info, False, False, 0)

        render_status_row.set_margin_bottom(6)

        self.render_progress_bar = Gtk.ProgressBar()
        self.render_progress_bar.set_valign(Gtk.Align.CENTER)

        self.stop_button = guiutils.get_sized_button(_("Stop"), 100, 32)
        #self.stop_button.connect("clicked", lambda w:abort_render())
        self.render_button = guiutils.get_sized_button(_("Render"), 100, 32)
        self.render_button.connect("clicked", lambda w:render_output())

        render_row = Gtk.HBox(False, 2)
        render_row.pack_start(self.render_progress_bar, True, True, 0)
        render_row.pack_start(guiutils.pad_label(12, 2), False, False, 0)
        render_row.pack_start(self.stop_button, False, False, 0)
        render_row.pack_start(self.render_button, False, False, 0)

        render_vbox = Gtk.VBox(False, 2)
        render_vbox.pack_start(encode_row, False, False, 0)
        render_vbox.pack_start(Gtk.Label(), True, True, 0)
        render_vbox.pack_start(out_folder_row, False, False, 0)
        render_vbox.pack_start(format_select_row, False, False, 0)
        render_vbox.pack_start(Gtk.Label(), True, True, 0)
        render_vbox.pack_start(render_status_row, False, False, 0)
        render_vbox.pack_start(render_row, False, False, 0)
        render_vbox.pack_start(guiutils.pad_label(24, 24), False, False, 0)
        render_vbox.set_margin_left(8)

        # Bottomrow
        self.load_anim = Gtk.Button(_("Load Animation"))
        self.load_anim.connect("clicked", lambda w:load_script_dialog(_load_script_dialog_callback))
        self.save_anim = Gtk.Button(_("Save Animation"))
        self.save_anim.connect("clicked", lambda w:save_script_dialog(_save_script_dialog_callback))

        exit_b = guiutils.get_sized_button(_("Close"), 150, 32)
        exit_b.connect("clicked", lambda w:_shutdown())
        
        editor_buttons_row = Gtk.HBox()
        editor_buttons_row.pack_start(self.load_anim, False, False, 0)
        editor_buttons_row.pack_start(self.save_anim, False, False, 0)
        editor_buttons_row.pack_start(Gtk.Label(), True, True, 0)
        editor_buttons_row.pack_start(exit_b, False, False, 0)
        
        # Build window
        left_panel = Gtk.VBox(False, 2)
        left_panel.pack_start(selector_row, False, False, 0)
        left_panel.pack_start(self.value_edit_frame, True, True, 0)

        right_panel = Gtk.VBox(False, 0)
        right_panel.pack_start(preview_info_row, False, False, 0)
        right_panel.pack_start(self.preview_monitor, False, False, 0)
        right_panel.pack_start(control_panel, False, False, 0)
        right_panel.pack_start(range_row, False, False, 0)
        right_panel.pack_start(render_vbox, True, True, 0)
    
        right_panel.set_margin_left(4)
        
        sides_pane = Gtk.HBox(False, 2)
        sides_pane.pack_start(left_panel, False, False, 0)
        sides_pane.pack_start(right_panel, False, False, 0)

        pane = Gtk.VBox(False, 2)
        pane.pack_start(sides_pane, False, False, 0)
        pane.pack_start(editor_buttons_row, False, False, 0)
        
        align = guiutils.set_margins(pane, 2, 12, 12, 12)

        # Connect global key listener
        #self.connect("key-press-event", _global_key_down_listener)

        # Set pane and show window
        self.add(align)
        self.set_title(_("Natron Animations"))
        self.set_position(Gtk.WindowPosition.CENTER)
        #self.set_widgets_sensitive(False)
        self.show_all()
        self.set_resizable(False)
        #self.set_active_state(False)

        self.update_render_status_info()
        self.change_animation()