def workflow_menu_launched(widget, event): guiutils.remove_children(_workflow_menu) # ---- preset presets_item = Gtk.MenuItem.new_with_label(_("Workflow Presets")) presets_item.show() presets_menu = Gtk.Menu() standard = guiutils.get_menu_item(_("Standard"), _workflow_menu_callback, (None, "preset standard")) standard.show() presets_menu.add(standard) film_style = guiutils.get_menu_item(_("Film Style"), _workflow_menu_callback, (None, "preset filmstyle")) film_style.show() presets_menu.add(film_style) presets_item.set_submenu(presets_menu) _workflow_menu.add(presets_item) # --- behaviours guiutils.add_separetor(_workflow_menu) behaviours_item = Gtk.MenuItem.new_with_label(_("Behaviours")) behaviours_item.show() behaviours_menu = Gtk.Menu() delete_item = Gtk.MenuItem.new_with_label(_("Default Delete Action")) delete_item.show() delete_menu = Gtk.Menu() labels = [_("Lift"), _("Splice Out")] msgs = ["delete lift", "delete splice"] _build_radio_menu_items_group(delete_menu, labels, msgs, _workflow_menu_callback, 0) delete_item.set_submenu(delete_menu) behaviours_menu.add(delete_item) dnd_item = Gtk.MenuItem.new_with_label(_("Drag'n'Drop Action")) dnd_item.show() dnd_menu = Gtk.Menu() labels = [ _("Always Overwrite Blanks"), _("Overwrite Blanks on non-V1 Tracks"), _("Always Insert") ] msgs = ["always overwrite", "overwrite nonV1", "always insert"] active_index = editorpersistance.prefs.dnd_action #appconsts values corrspond with order here _build_radio_menu_items_group(dnd_menu, labels, msgs, _workflow_menu_callback, active_index) dnd_item.set_submenu(dnd_menu) behaviours_menu.add(dnd_item) autofollow_item = Gtk.CheckMenuItem() autofollow_item.set_label(_("Compositors Auto Follow")) autofollow_item.set_active(editorstate.auto_follow_active()) autofollow_item.connect("activate", _workflow_menu_callback, (None, "autofollow")) autofollow_item.show() behaviours_menu.append(autofollow_item) behaviours_item.set_submenu(behaviours_menu) _workflow_menu.add(behaviours_item) # --- tools guiutils.add_separetor(_workflow_menu) # Active tools non_active_tools = range(1, 11) # we have 10 tools currently for i in range(0, len( editorpersistance.prefs.active_tools)): # tool_id in _TOOLS_DATA: tool_id = editorpersistance.prefs.active_tools[i] tool_name, tool_icon_file = _TOOLS_DATA[tool_id] _workflow_menu.add( _get_workflow_tool_menu_item(_workflow_menu_callback, tool_id, tool_name, tool_icon_file, i + 1)) try: # needed to prevent crashes when manually changing preset tools during dev, remove when those are decided upon non_active_tools.remove(tool_id) except: pass guiutils.add_separetor(_workflow_menu) # Non-active tools for tool_id in non_active_tools: tool_name, tool_icon_file = _TOOLS_DATA[tool_id] _workflow_menu.add( _get_workflow_tool_menu_item(_workflow_menu_callback, tool_id, tool_name, tool_icon_file, -1)) _workflow_menu.popup(None, None, None, None, event.button, event.time)
def tline_canvas_mouse_pressed(event, frame): """ Mouse event callback from timeline canvas widget """ editorstate.timeline_mouse_disabled = False # This is used to disable "move and "release" events when they would get bad data. if PLAYER().looping(): return elif PLAYER().is_playing(): PLAYER().stop_playback() # Double click handled separately if event.type == Gdk.EventType._2BUTTON_PRESS: return # Handle and exit parent clip selecting if EDIT_MODE() == editorstate.SELECT_PARENT_CLIP: syncsplitevent.select_sync_parent_mouse_pressed(event, frame) editorstate.timeline_mouse_disabled = True # Set INSERT_MODE modesetting.set_default_edit_mode() return # Handle and exit tline sync clip selecting if EDIT_MODE() == editorstate.SELECT_TLINE_SYNC_CLIP: audiosync.select_sync_clip_mouse_pressed(event, frame) editorstate.timeline_mouse_disabled = True # Set INSERT_MODE modesetting.set_default_edit_mode() return # Hitting timeline in clip display mode displays timeline in # default mode. if not timeline_visible(): updater.display_sequence_in_monitor() if (event.button == 1): # Now that we have correct edit mode we'll reenter # this method to get e.g. a select action tline_canvas_mouse_pressed(event, frame) return if (event.button == 3): # Right mouse + CTRL displays clip menu if we hit clip if (event.get_state() & Gdk.ModifierType.CONTROL_MASK): PLAYER().seek_frame(frame) # Right mouse on timeline seeks frame else: success = display_clip_menu_pop_up(event.y, event, frame) if not success: PLAYER().seek_frame(frame) return # If clip end drag mode is for some reason still active, exit to default edit mode if EDIT_MODE() == editorstate.CLIP_END_DRAG: modesetting.set_default_edit_mode() # This shouldn't happen unless for some reason mouse release didn't hit clipenddragmode listener. print("EDIT_MODE() == editorstate.CLIP_END_DRAG at mouse press!") # Check if match frame close is hit if editorstate.current_is_move_mode() and timeline_visible(): if tlinewidgets.match_frame_close_hit(event.x, event.y) == True: tlinewidgets.set_match_frame(-1, -1, True) updater.repaint_tline() return # Check if compositor is hit and if so, handle compositor editing if editorstate.current_is_move_mode() and timeline_visible(): hit_compositor = tlinewidgets.compositor_hit(frame, event.x, event.y, current_sequence().compositors) if hit_compositor != None: if editorstate.get_compositing_mode() == appconsts.COMPOSITING_MODE_STANDARD_AUTO_FOLLOW: compositeeditor.set_compositor(hit_compositor) compositormodes.set_compositor_selected(hit_compositor) movemodes.clear_selected_clips() editorstate.timeline_mouse_disabled = True return elif editorstate.auto_follow_active() == False or hit_compositor.obey_autofollow == False: movemodes.clear_selected_clips() if event.button == 1 or (event.button == 3 and event.get_state() & Gdk.ModifierType.CONTROL_MASK): compositormodes.set_compositor_mode(hit_compositor) mode_funcs = EDIT_MODE_FUNCS[editorstate.COMPOSITOR_EDIT] press_func = mode_funcs[TL_MOUSE_PRESS] press_func(event, frame) return if event.button == 3: compositormodes.set_compositor_selected(hit_compositor) guicomponents.display_compositor_popup_menu(event, hit_compositor, compositor_menu_item_activated) return elif event.button == 2: updater.zoom_project_length() return compositormodes.clear_compositor_selection() # Check if we should enter clip end drag mode if (event.button == 3 and editorstate.current_is_move_mode() and timeline_visible() and (event.get_state() & Gdk.ModifierType.CONTROL_MASK)): # with CTRL right mouse clipenddragmode.maybe_init_for_mouse_press(event, frame) elif (timeline_visible() and (EDIT_MODE() == editorstate.INSERT_MOVE or EDIT_MODE() == editorstate.OVERWRITE_MOVE) and (tlinewidgets.pointer_context == appconsts.POINTER_CONTEXT_END_DRAG_LEFT or tlinewidgets.pointer_context == appconsts.POINTER_CONTEXT_END_DRAG_RIGHT)): # with pointer context clipenddragmode.maybe_init_for_mouse_press(event, frame) # Handle mouse button presses depending which button was pressed and # editor state. # RIGHT BUTTON: seek frame or display clip menu if not dragging clip end if (event.button == 3 and EDIT_MODE() != editorstate.CLIP_END_DRAG and EDIT_MODE() != editorstate.KF_TOOL): if ((not editorstate.current_is_active_trim_mode()) and timeline_visible()): if not(event.get_state() & Gdk.ModifierType.CONTROL_MASK): success = display_clip_menu_pop_up(event.y, event, frame) if not success: PLAYER().seek_frame(frame) else: # For trim modes set <X>_NO_EDIT edit mode and seek frame. and seek frame trimmodes.set_no_edit_trim_mode() PLAYER().seek_frame(frame) return # LEFT BUTTON: Select new trimmed clip in active one roll trim mode with sensitive cursor. elif (event.button == 1 and EDIT_MODE() == editorstate.ONE_ROLL_TRIM): track = tlinewidgets.get_track(event.y) if track == None: modesetting.set_default_edit_mode(True) return success = trimmodes.set_oneroll_mode(track, frame) if not success: modesetting.set_default_edit_mode(True) return if trimmodes.edit_data["to_side_being_edited"] == True: pointer_context = appconsts.POINTER_CONTEXT_TRIM_LEFT else: pointer_context = appconsts.POINTER_CONTEXT_TRIM_RIGHT gui.editor_window.set_tline_cursor_to_context(pointer_context) gui.editor_window.set_tool_selector_to_mode() if not editorpersistance.prefs.quick_enter_trims: editorstate.timeline_mouse_disabled = True else: trimmodes.oneroll_trim_move(event.x, event.y, frame, None) elif event.button == 2: updater.zoom_project_length() # LEFT BUTTON: Handle left mouse button edits by passing event to current edit mode # handler func elif event.button == 1 or event.button == 3: mode_funcs = EDIT_MODE_FUNCS[EDIT_MODE()] press_func = mode_funcs[TL_MOUSE_PRESS] press_func(event, frame)
def workflow_menu_launched(widget, event): guiutils.remove_children(_workflow_menu) # ---- preset presets_item = Gtk.MenuItem.new_with_label(_("Workflow Presets")) presets_item.show() presets_menu = Gtk.Menu() standard = guiutils.get_menu_item(_("Standard"), _workflow_menu_callback, (None, "preset standard")) standard.show() presets_menu.add(standard) film_style = guiutils.get_menu_item(_("Film Style"), _workflow_menu_callback, (None, "preset filmstyle")) film_style.show() presets_menu.add(film_style) presets_item.set_submenu(presets_menu) _workflow_menu.add(presets_item) # --- behaviours guiutils.add_separetor(_workflow_menu) behaviours_item = Gtk.MenuItem.new_with_label(_("Behaviours")) behaviours_item.show() behaviours_menu = Gtk.Menu() delete_item = Gtk.MenuItem.new_with_label(_("Default Delete Action")) delete_item.show() delete_menu = Gtk.Menu() labels = [_("Lift"), _("Splice Out")] msgs = ["delete lift", "delete splice"] _build_radio_menu_items_group(delete_menu, labels, msgs, _workflow_menu_callback, 0) delete_item.set_submenu(delete_menu) #behaviours_menu.add(delete_item) dnd_item = Gtk.MenuItem.new_with_label(_("Drag'n'Drop Action")) dnd_item.show() dnd_menu = Gtk.Menu() labels = [_("Always Overwrite Blanks"), _("Overwrite Blanks on non-V1 Tracks"), _("Always Insert")] msgs = ["always overwrite", "overwrite nonV1", "always insert"] active_index = editorpersistance.prefs.dnd_action #appconsts values corrspond with order here _build_radio_menu_items_group(dnd_menu, labels, msgs, _workflow_menu_callback, active_index) dnd_item.set_submenu(dnd_menu) behaviours_menu.add(dnd_item) autofollow_item = Gtk.CheckMenuItem() autofollow_item.set_label(_("Compositors Auto Follow")) autofollow_item.set_active(editorstate.auto_follow_active()) autofollow_item.connect("activate", _workflow_menu_callback, (None, "autofollow")) autofollow_item.show() behaviours_menu.append(autofollow_item) show_tooltips_item = Gtk.CheckMenuItem() show_tooltips_item.set_label(_("Show Tooltips for Tools")) show_tooltips_item.set_active(editorpersistance.prefs.show_tool_tooltips) show_tooltips_item.connect("activate", _workflow_menu_callback, (None, "tooltips")) show_tooltips_item.show() behaviours_menu.append(show_tooltips_item) behaviours_item.set_submenu(behaviours_menu) _workflow_menu.add(behaviours_item) # --- tools guiutils.add_separetor(_workflow_menu) # Active tools non_active_tools = range(1, 12) # we have 11 tools currently for i in range(0, len(editorpersistance.prefs.active_tools)):# tool_id in _TOOLS_DATA: tool_id = editorpersistance.prefs.active_tools[i] tool_name, tool_icon_file = _TOOLS_DATA[tool_id] _workflow_menu.add(_get_workflow_tool_menu_item(_workflow_menu_callback, tool_id, tool_name, tool_icon_file, i+1)) try: # needed to prevent crashes when manually changing preset tools during dev, remove when those are decided upon non_active_tools.remove(tool_id) except: pass guiutils.add_separetor(_workflow_menu) # Non-active tools for tool_id in non_active_tools: tool_name, tool_icon_file = _TOOLS_DATA[tool_id] _workflow_menu.add(_get_workflow_tool_menu_item(_workflow_menu_callback, tool_id, tool_name, tool_icon_file, -1)) _workflow_menu.popup(None, None, None, None, event.button, event.time)