diff --git a/mainwindow.cpp b/mainwindow.cpp index d85028c3e..1da5e9eb7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -55,11 +55,13 @@ void MainWindow::setup_layout() { panel_timeline->show(); addDockWidget(Qt::TopDockWidgetArea, panel_project); - addDockWidget(Qt::TopDockWidgetArea, panel_effect_controls); - tabifyDockWidget(panel_effect_controls, panel_footage_viewer); + addDockWidget(Qt::TopDockWidgetArea, panel_footage_viewer); + tabifyDockWidget(panel_footage_viewer, panel_effect_controls); + panel_footage_viewer->raise(); addDockWidget(Qt::TopDockWidgetArea, panel_sequence_viewer); addDockWidget(Qt::BottomDockWidgetArea, panel_timeline); + // workaround for older versions of Qt resizeDocks({panel_project}, {40}, Qt::Horizontal); } @@ -101,10 +103,10 @@ MainWindow::MainWindow(QWidget *parent) : setDockNestingEnabled(true); // TODO maybe replace these with non-pointers later on? - panel_project = new Project(this); - panel_effect_controls = new EffectControls(this); panel_sequence_viewer = new Viewer(this); panel_footage_viewer = new Viewer(this); + panel_project = new Project(this); + panel_effect_controls = new EffectControls(this); panel_timeline = new Timeline(this); setup_layout(); @@ -454,35 +456,35 @@ void MainWindow::on_actionReset_to_default_layout_triggered() void MainWindow::on_actionGo_to_start_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->is_focused() || panel_effect_controls->keyframe_focus())) { panel_sequence_viewer->go_to_start(); } } void MainWindow::on_actionPrevious_Frame_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->is_focused() || panel_effect_controls->keyframe_focus())) { panel_sequence_viewer->previous_frame(); } } void MainWindow::on_actionNext_Frame_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->is_focused() || panel_effect_controls->keyframe_focus())) { panel_sequence_viewer->next_frame(); } } void MainWindow::on_actionGo_to_End_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->is_focused() || panel_effect_controls->keyframe_focus())) { panel_sequence_viewer->go_to_end(); } } void MainWindow::on_actionPlay_Pause_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus() || panel_effect_controls->keyframe_focus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->is_focused() || panel_effect_controls->keyframe_focus())) { panel_sequence_viewer->toggle_play(); } } @@ -524,14 +526,14 @@ void MainWindow::on_actionSlip_Tool_triggered() void MainWindow::on_actionGo_to_Previous_Cut_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->is_focused())) { panel_timeline->previous_cut(); } } void MainWindow::on_actionGo_to_Next_Cut_triggered() { - if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->hasFocus())) { + if (sequence != NULL && (panel_timeline->focused() || panel_sequence_viewer->is_focused())) { panel_timeline->next_cut(); } } @@ -576,28 +578,19 @@ void MainWindow::viewMenu_About_To_Be_Shown() { void MainWindow::on_actionFrames_triggered() { config.timecode_view = TIMECODE_FRAMES; - if (sequence != NULL) { - panel_sequence_viewer->update_playhead_timecode(sequence->playhead); - panel_sequence_viewer->update_end_timecode(); - } + update_ui(false); } void MainWindow::on_actionDrop_Frame_triggered() { config.timecode_view = TIMECODE_DROP; - if (sequence != NULL) { - panel_sequence_viewer->update_playhead_timecode(sequence->playhead); - panel_sequence_viewer->update_end_timecode(); - } + update_ui(false); } void MainWindow::on_actionNon_Drop_Frame_triggered() { config.timecode_view = TIMECODE_NONDROP; - if (sequence != NULL) { - panel_sequence_viewer->update_playhead_timecode(sequence->playhead); - panel_sequence_viewer->update_end_timecode(); - } + update_ui(false); } void MainWindow::toolMenu_About_To_Be_Shown() { @@ -701,18 +694,26 @@ void MainWindow::on_actionRipple_to_Out_Point_triggered() void MainWindow::on_actionSet_In_Point_triggered() { - if (panel_timeline->focused() || panel_sequence_viewer->hasFocus()) panel_timeline->set_in_point(); + if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { + panel_sequence_viewer->set_in_point(); + } else if (panel_footage_viewer->is_focused()) { + panel_footage_viewer->set_in_point(); + } } void MainWindow::on_actionSet_Out_Point_triggered() { - if (panel_timeline->focused() || panel_sequence_viewer->hasFocus()) panel_timeline->set_out_point(); + if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { + panel_sequence_viewer->set_out_point(); + } else if (panel_footage_viewer->is_focused()) { + panel_footage_viewer->set_out_point(); + } } void MainWindow::on_actionClear_In_Out_triggered() { - if ((panel_timeline->focused() || panel_sequence_viewer->hasFocus()) && sequence->using_workarea) { + if ((panel_timeline->focused() || panel_sequence_viewer->is_focused()) && sequence->using_workarea) { undo_stack.push(new SetTimelineInOutCommand(sequence, false, 0, 0)); - panel_timeline->repaint_timeline(); + update_ui(false); } } diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 4f9073557..408df6436 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -30,6 +30,7 @@ EffectControls::EffectControls(QWidget *parent) : init_effects(); init_transitions(); clear_effects(false); + ui->headers->viewer = panel_sequence_viewer; ui->headers->snapping = false; ui->effects_area->parent_widget = ui->scrollArea; @@ -45,9 +46,6 @@ EffectControls::EffectControls(QWidget *parent) : connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), ui->keyframeView, SLOT(set_y_scroll(int))); connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), ui->scrollArea->verticalScrollBar(), SLOT(setValue(int))); connect(ui->scrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)), ui->verticalScrollBar, SLOT(setValue(int))); - - /*connect(ui->keyframeScroller->verticalScrollBar(), SIGNAL(valueChanged(int)), ui->scrollArea->verticalScrollBar(), SLOT(setValue(int))); - connect(ui->keyframeScroller->horizontalScrollBar(), SIGNAL(valueChanged(int)), ui->headers, SLOT(set_scroll(int)));*/ } EffectControls::~EffectControls() { diff --git a/panels/panels.cpp b/panels/panels.cpp index b1b53e55f..0698950ab 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -62,7 +62,7 @@ void update_effect_controls() { void update_ui(bool modified) { if (modified) { - panel_sequence_viewer->reset_all_audio(); +// panel_sequence_viewer->reset_all_audio(); update_effect_controls(); } panel_effect_controls->update_keyframes(); diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 2f53bebb4..b02098851 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -184,14 +184,6 @@ int Timeline::calculate_track_height(int track, int value) { return vector.at(index); } -void Timeline::set_in_point() { - ui->headers->set_in_point(sequence->playhead); -} - -void Timeline::set_out_point() { - ui->headers->set_out_point(sequence->playhead); -} - void Timeline::update_sequence() { bool null_sequence = (sequence == NULL); @@ -315,7 +307,8 @@ void Timeline::delete_selection(bool ripple_delete) { if (!deleted) { for (int j=0;jclips.size();j++) { Clip* cc = sequence->clips.at(j); - if (cc->track == c->track + if (cc != NULL + && cc->track == c->track && cc->timeline_in > c->timeline_out && cc->timeline_in < c->timeline_out + ripple_length) { ripple_length = cc->timeline_in - c->timeline_out; diff --git a/panels/timeline.h b/panels/timeline.h index dd731fb6a..c992f5f93 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -92,8 +92,6 @@ public: bool has_clip_been_split(int c); void toggle_links(); void ripple_to_in_point(bool in); - void set_in_point(); - void set_out_point(); void delete_in_out(bool ripple); void previous_cut(); void next_cut(); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index b3309754c..fb1089c72 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -52,7 +52,11 @@ Viewer::Viewer(QWidget *parent) : } Viewer::~Viewer() { - delete ui; + delete ui; +} + +bool Viewer::is_focused() { + return ui->headers->hasFocus() || ui->openGLWidget->hasFocus(); } void Viewer::set_main_sequence() { @@ -140,7 +144,7 @@ QString frame_to_timecode(long f, int view, double frame_rate) { } bool frame_rate_is_droppable(float rate) { - return (rate == 23.976f || rate == 29.97f || rate == 59.94f); + return (qFuzzyCompare(rate, 23.976f) || qFuzzyCompare(rate, 29.97f) || qFuzzyCompare(rate, 59.94f)); } void Viewer::seek(long p) { @@ -204,10 +208,6 @@ void Viewer::update_end_timecode() { void Viewer::update_header_zoom() { if (seq != NULL) { long sequenceEndFrame = seq->getEndFrame(); - if (sequenceEndFrame > 0) { - ui->headers->update_zoom((double) ui->headers->width() / (double) sequenceEndFrame); - } else { - } ui->headers->update_zoom((sequenceEndFrame > 0) ? ((double) ui->headers->width() / (double) sequenceEndFrame) : 1); } } @@ -224,6 +224,17 @@ void Viewer::update_viewer() { viewer_widget->update(); update_header_zoom(); if (seq != NULL) update_playhead_timecode(seq->playhead); + update_end_timecode(); +} + +void Viewer::set_in_point() { + qDebug() << "in h"; + ui->headers->set_in_point(seq->playhead); +} + +void Viewer::set_out_point() { + qDebug() << "out h"; + ui->headers->set_out_point(seq->playhead); } void Viewer::set_media(int type, void* media) { @@ -242,7 +253,8 @@ void Viewer::set_media(int type, void* media) { MediaStream* video_stream = footage->video_tracks.at(0); seq->width = video_stream->video_width; seq->height = video_stream->video_height; - seq->frame_rate = video_stream->video_frame_rate; + if (video_stream->video_frame_rate > 0) seq->frame_rate = video_stream->video_frame_rate; + qDebug() << seq->frame_rate << video_stream->video_frame_rate; Clip* c = new Clip(seq); c->media = footage; diff --git a/panels/viewer.h b/panels/viewer.h index d9b49838c..b3202b0c9 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -23,6 +23,7 @@ public: explicit Viewer(QWidget *parent = 0); ~Viewer(); + bool is_focused(); void set_main_sequence(); void set_media(int type, void* media); void compose(); @@ -31,6 +32,8 @@ public: void update_end_timecode(); void update_header_zoom(); void update_viewer(); + void set_in_point(); + void set_out_point(); // playback functions void go_to_start(); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index d3a098f5a..2540a7cd0 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -708,8 +708,6 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { bool shift = (event->modifiers() & Qt::ShiftModifier); if (event->button() == Qt::LeftButton) { - bool changed = false; - ComboAction* ca = new ComboAction(); bool push_undo = false; @@ -780,8 +778,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { areas.append(s); panel_timeline->delete_areas_and_relink(ca, areas); - push_undo = true; - changed = true; + push_undo = true; if (!shift) { panel_timeline->creating = false; @@ -952,11 +949,9 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } } } - push_undo = true; - changed = true; + push_undo = true; } - } else if (panel_timeline->selecting || panel_timeline->rect_select_proc) { - changed = true; + } else if (panel_timeline->selecting || panel_timeline->rect_select_proc) { } else if (panel_timeline->splitting) { bool split = false; for (int i=0;isplit_tracks.size();i++) { @@ -966,8 +961,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } } if (split) { - push_undo = true; - changed = true; + push_undo = true; } panel_timeline->split_cache.clear(); } @@ -1004,7 +998,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { pre_clips.clear(); post_clips.clear(); - update_ui(changed); + update_ui(true); } } }