diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 845013b58..8e9207909 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -70,102 +70,104 @@ void TimelineWidget::right_click_ripple() { } void TimelineWidget::show_context_menu(const QPoint& pos) { - // hack because sometimes right clicking doesn't trigger mouseReleaseEvent - panel_timeline->rect_select_init = false; - panel_timeline->rect_select_proc = false; + if (sequence != NULL) { + // hack because sometimes right clicking doesn't trigger mouseReleaseEvent + panel_timeline->rect_select_init = false; + panel_timeline->rect_select_proc = false; - QMenu menu(this); + QMenu menu(this); - QAction* undoAction = menu.addAction("&Undo"); - QAction* redoAction = menu.addAction("&Redo"); - connect(undoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(undo())); - connect(redoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(redo())); - undoAction->setEnabled(undo_stack.canUndo()); - redoAction->setEnabled(undo_stack.canRedo()); - menu.addSeparator(); + QAction* undoAction = menu.addAction("&Undo"); + QAction* redoAction = menu.addAction("&Redo"); + connect(undoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(undo())); + connect(redoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(redo())); + undoAction->setEnabled(undo_stack.canUndo()); + redoAction->setEnabled(undo_stack.canRedo()); + menu.addSeparator(); - // collect all the selected clips - QVector selected_clips; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); - if (c != NULL && panel_timeline->is_clip_selected(c, true)) { - selected_clips.append(c); - } - } + // collect all the selected clips + QVector selected_clips; + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != NULL && panel_timeline->is_clip_selected(c, true)) { + selected_clips.append(c); + } + } - if (selected_clips.isEmpty()) { - // no clips are selected - panel_timeline->cursor_frame = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()); - panel_timeline->cursor_track = getTrackFromScreenPoint(pos.y()); + if (selected_clips.isEmpty()) { + // no clips are selected + panel_timeline->cursor_frame = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()); + panel_timeline->cursor_track = getTrackFromScreenPoint(pos.y()); - bool can_ripple_delete = true; - bool at_end_of_sequence = true; - rc_ripple_min = 0; - rc_ripple_max = LONG_MAX; + bool can_ripple_delete = true; + bool at_end_of_sequence = true; + rc_ripple_min = 0; + rc_ripple_max = LONG_MAX; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); - if (c != NULL) { - if (c->timeline_in > panel_timeline->cursor_frame || c->timeline_out > panel_timeline->cursor_frame) { - at_end_of_sequence = false; - } - if (c->track == panel_timeline->cursor_track) { - if (c->timeline_in <= panel_timeline->cursor_frame && c->timeline_out >= panel_timeline->cursor_frame) { - can_ripple_delete = false; - break; - } else if (c->timeline_out < panel_timeline->cursor_frame) { - rc_ripple_min = qMax(rc_ripple_min, c->timeline_out); - } else if (c->timeline_in > panel_timeline->cursor_frame) { - rc_ripple_max = qMin(rc_ripple_max, c->timeline_in); - } - } - } - } + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != NULL) { + if (c->timeline_in > panel_timeline->cursor_frame || c->timeline_out > panel_timeline->cursor_frame) { + at_end_of_sequence = false; + } + if (c->track == panel_timeline->cursor_track) { + if (c->timeline_in <= panel_timeline->cursor_frame && c->timeline_out >= panel_timeline->cursor_frame) { + can_ripple_delete = false; + break; + } else if (c->timeline_out < panel_timeline->cursor_frame) { + rc_ripple_min = qMax(rc_ripple_min, c->timeline_out); + } else if (c->timeline_in > panel_timeline->cursor_frame) { + rc_ripple_max = qMin(rc_ripple_max, c->timeline_in); + } + } + } + } - if (can_ripple_delete && !at_end_of_sequence) { - QAction* ripple_delete_action = menu.addAction("R&ipple Delete"); - connect(ripple_delete_action, SIGNAL(triggered(bool)), this, SLOT(right_click_ripple())); - } + if (can_ripple_delete && !at_end_of_sequence) { + QAction* ripple_delete_action = menu.addAction("R&ipple Delete"); + connect(ripple_delete_action, SIGNAL(triggered(bool)), this, SLOT(right_click_ripple())); + } - menu.addAction("Sequence settings coming soon..."); - } else { - // clips are selected - QAction* cutAction = menu.addAction("C&ut"); - connect(cutAction, SIGNAL(triggered(bool)), mainWindow, SLOT(cut())); - QAction* copyAction = menu.addAction("Cop&y"); - connect(copyAction, SIGNAL(triggered(bool)), mainWindow, SLOT(copy())); - QAction* pasteAction = menu.addAction("&Paste"); - connect(pasteAction, SIGNAL(triggered(bool)), mainWindow, SLOT(paste())); - menu.addSeparator(); - QAction* speedAction = menu.addAction("&Speed/Duration"); - connect(speedAction, SIGNAL(triggered(bool)), mainWindow, SLOT(openSpeedDialog())); - QAction* autoscaleAction = menu.addAction("Auto-s&cale"); - autoscaleAction->setCheckable(true); - connect(autoscaleAction, SIGNAL(triggered(bool)), this, SLOT(toggle_autoscale())); + menu.addAction("Sequence settings coming soon..."); + } else { + // clips are selected + QAction* cutAction = menu.addAction("C&ut"); + connect(cutAction, SIGNAL(triggered(bool)), mainWindow, SLOT(cut())); + QAction* copyAction = menu.addAction("Cop&y"); + connect(copyAction, SIGNAL(triggered(bool)), mainWindow, SLOT(copy())); + QAction* pasteAction = menu.addAction("&Paste"); + connect(pasteAction, SIGNAL(triggered(bool)), mainWindow, SLOT(paste())); + menu.addSeparator(); + QAction* speedAction = menu.addAction("&Speed/Duration"); + connect(speedAction, SIGNAL(triggered(bool)), mainWindow, SLOT(openSpeedDialog())); + QAction* autoscaleAction = menu.addAction("Auto-s&cale"); + autoscaleAction->setCheckable(true); + connect(autoscaleAction, SIGNAL(triggered(bool)), this, SLOT(toggle_autoscale())); - // set autoscale arbitrarily to the first selected clip - autoscaleAction->setChecked(selected_clips.at(0)->autoscale); + // set autoscale arbitrarily to the first selected clip + autoscaleAction->setChecked(selected_clips.at(0)->autoscale); - // check if all selected clips have the same media for a "Reveal In Project" - bool same_media = true; - rc_reveal_media = selected_clips.at(0)->media; - for (int i=1;imedia != rc_reveal_media) { - same_media = false; - break; - } - } + // check if all selected clips have the same media for a "Reveal In Project" + bool same_media = true; + rc_reveal_media = selected_clips.at(0)->media; + for (int i=1;imedia != rc_reveal_media) { + same_media = false; + break; + } + } - if (same_media) { - QAction* revealInProjectAction = menu.addAction("&Reveal in Project"); - connect(revealInProjectAction, SIGNAL(triggered(bool)), this, SLOT(reveal_media())); - } + if (same_media) { + QAction* revealInProjectAction = menu.addAction("&Reveal in Project"); + connect(revealInProjectAction, SIGNAL(triggered(bool)), this, SLOT(reveal_media())); + } - QAction* rename = menu.addAction("R&ename"); - connect(rename, SIGNAL(triggered(bool)), this, SLOT(rename_clip())); - } + QAction* rename = menu.addAction("R&ename"); + connect(rename, SIGNAL(triggered(bool)), this, SLOT(rename_clip())); + } - menu.exec(mapToGlobal(pos)); + menu.exec(mapToGlobal(pos)); + } } void TimelineWidget::toggle_autoscale() {