diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index de1726900..fc64d0083 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -145,6 +145,10 @@ void EffectControls::copy(bool del) { } } +void EffectControls::scroll_to_frame(long frame) { + scroll_to_frame_internal(horizontalScrollBar, frame, zoom, keyframeView->width()); +} + void EffectControls::show_effect_menu(int type, int subtype) { effect_menu_type = type; effect_menu_subtype = subtype; diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index 564b4f0a8..afb9a7e26 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -42,6 +42,7 @@ public: void delete_selected_keyframes(); void copy(bool del); bool multiple; + void scroll_to_frame(long frame); QVector selected_clips; diff --git a/panels/panels.cpp b/panels/panels.cpp index 35bed658a..e1f57e94d 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -11,6 +11,8 @@ #include "grapheditor.h" #include "debug.h" +#include + Project* panel_project = 0; EffectControls* panel_effect_controls = 0; Viewer* panel_sequence_viewer = 0; @@ -27,43 +29,43 @@ void update_effect_controls() { int vclip = -1; int aclip = -1; QVector selected_clips; - int mode = TA_NO_TRANSITION; + int mode = TA_NO_TRANSITION; if (sequence != NULL) { for (int i=0;iclips.size();i++) { Clip* clip = sequence->clips.at(i); - if (clip != NULL) { - for (int j=0;jselections.size();j++) { - const Selection& s = sequence->selections.at(j); - bool add = true; - if (clip->timeline_in >= s.in && clip->timeline_out <= s.out && clip->track == s.track) { - mode = TA_NO_TRANSITION; - } else if (selection_contains_transition(s, clip, TA_OPENING_TRANSITION)) { - mode = TA_OPENING_TRANSITION; - } else if (selection_contains_transition(s, clip, TA_CLOSING_TRANSITION)) { - mode = TA_CLOSING_TRANSITION; - } else { - add = false; - } + if (clip != NULL) { + for (int j=0;jselections.size();j++) { + const Selection& s = sequence->selections.at(j); + bool add = true; + if (clip->timeline_in >= s.in && clip->timeline_out <= s.out && clip->track == s.track) { + mode = TA_NO_TRANSITION; + } else if (selection_contains_transition(s, clip, TA_OPENING_TRANSITION)) { + mode = TA_OPENING_TRANSITION; + } else if (selection_contains_transition(s, clip, TA_CLOSING_TRANSITION)) { + mode = TA_CLOSING_TRANSITION; + } else { + add = false; + } - if (add) { - if (clip->track < 0 && vclip == -1) { - vclip = i; - } else if (clip->track >= 0 && aclip == -1) { - aclip = i; - } else { - vclip = -2; - aclip = -2; + if (add) { + if (clip->track < 0 && vclip == -1) { + vclip = i; + } else if (clip->track >= 0 && aclip == -1) { + aclip = i; + } else { + vclip = -2; + aclip = -2; multiple = true; multiple = true; - break; - } - } - } + break; + } + } + } } } if (!multiple) { - // check if aclip is linked to vclip + // check if aclip is linked to vclip if (vclip >= 0) selected_clips.append(vclip); if (aclip >= 0) selected_clips.append(aclip); if (vclip >= 0 && aclip >= 0) { @@ -84,7 +86,7 @@ void update_effect_controls() { } } - bool same = (selected_clips.size() == panel_effect_controls->selected_clips.size()); + bool same = (selected_clips.size() == panel_effect_controls->selected_clips.size()); if (same) { for (int i=0;iselected_clips.at(i)) { @@ -101,9 +103,9 @@ void update_effect_controls() { } void update_ui(bool modified) { - if (modified) { - update_effect_controls(); - } + if (modified) { + update_effect_controls(); + } panel_effect_controls->update_keyframes(); panel_timeline->repaint_timeline(); panel_sequence_viewer->update_viewer(); @@ -111,61 +113,72 @@ void update_ui(bool modified) { } QDockWidget *get_focused_panel() { - QDockWidget* w = NULL; - if (config.hover_focus) { - if (panel_project->underMouse()) { - w = panel_project; - } else if (panel_effect_controls->underMouse()) { - w = panel_effect_controls; - } else if (panel_sequence_viewer->underMouse()) { - w = panel_sequence_viewer; - } else if (panel_footage_viewer->underMouse()) { - w = panel_footage_viewer; - } else if (panel_timeline->underMouse()) { - w = panel_timeline; - } - } - if (w == NULL) { - if (panel_project->is_focused()) { - w = panel_project; + QDockWidget* w = NULL; + if (config.hover_focus) { + if (panel_project->underMouse()) { + w = panel_project; + } else if (panel_effect_controls->underMouse()) { + w = panel_effect_controls; + } else if (panel_sequence_viewer->underMouse()) { + w = panel_sequence_viewer; + } else if (panel_footage_viewer->underMouse()) { + w = panel_footage_viewer; + } else if (panel_timeline->underMouse()) { + w = panel_timeline; + } + } + if (w == NULL) { + if (panel_project->is_focused()) { + w = panel_project; } else if (panel_effect_controls->keyframe_focus() || panel_effect_controls->is_focused()) { - w = panel_effect_controls; - } else if (panel_sequence_viewer->is_focused()) { - w = panel_sequence_viewer; - } else if (panel_footage_viewer->is_focused()) { - w = panel_footage_viewer; - } else if (panel_timeline->focused()) { - w = panel_timeline; - } - } - return w; + w = panel_effect_controls; + } else if (panel_sequence_viewer->is_focused()) { + w = panel_sequence_viewer; + } else if (panel_footage_viewer->is_focused()) { + w = panel_footage_viewer; + } else if (panel_timeline->focused()) { + w = panel_timeline; + } + } + return w; } void alloc_panels(QWidget* parent) { - // TODO maybe replace these with non-pointers later on? - panel_sequence_viewer = new Viewer(parent); - panel_sequence_viewer->setObjectName("seq_viewer"); - panel_footage_viewer = new Viewer(parent); - panel_footage_viewer->setObjectName("footage_viewer"); - panel_project = new Project(parent); - panel_project->setObjectName("proj_root"); - panel_effect_controls = new EffectControls(parent); - panel_effect_controls->setObjectName("fx_controls"); - panel_timeline = new Timeline(parent); - panel_timeline->setObjectName("timeline"); - panel_graph_editor = new GraphEditor(parent); - panel_graph_editor->setObjectName("graph_editor"); + // TODO maybe replace these with non-pointers later on? + panel_sequence_viewer = new Viewer(parent); + panel_sequence_viewer->setObjectName("seq_viewer"); + panel_footage_viewer = new Viewer(parent); + panel_footage_viewer->setObjectName("footage_viewer"); + panel_project = new Project(parent); + panel_project->setObjectName("proj_root"); + panel_effect_controls = new EffectControls(parent); + panel_effect_controls->setObjectName("fx_controls"); + panel_timeline = new Timeline(parent); + panel_timeline->setObjectName("timeline"); + panel_graph_editor = new GraphEditor(parent); + panel_graph_editor->setObjectName("graph_editor"); } void free_panels() { - delete panel_sequence_viewer; - panel_sequence_viewer = NULL; - delete panel_footage_viewer; - panel_footage_viewer = NULL; - delete panel_project; - panel_project = NULL; - delete panel_effect_controls; - panel_effect_controls = NULL; - delete panel_timeline; - panel_timeline = NULL; + delete panel_sequence_viewer; + panel_sequence_viewer = NULL; + delete panel_footage_viewer; + panel_footage_viewer = NULL; + delete panel_project; + panel_project = NULL; + delete panel_effect_controls; + panel_effect_controls = NULL; + delete panel_timeline; + panel_timeline = NULL; +} + +void scroll_to_frame_internal(QScrollBar* bar, long frame, double zoom, int area_width) { + int screen_point = getScreenPointFromFrame(zoom, frame) - bar->value(); + int min_x = area_width*0.1; + int max_x = area_width-min_x; + if (screen_point < min_x) { + bar->setValue(getScreenPointFromFrame(zoom, frame) - min_x); + } else if (screen_point > max_x) { + bar->setValue(getScreenPointFromFrame(zoom, frame) - max_x); + } } diff --git a/panels/panels.h b/panels/panels.h index 691736b82..2434d1daa 100644 --- a/panels/panels.h +++ b/panels/panels.h @@ -9,6 +9,7 @@ class GraphEditor; class QWidget; class QDockWidget; +class QScrollBar; extern Project* panel_project; extern EffectControls* panel_effect_controls; @@ -21,5 +22,6 @@ void update_ui(bool modified); QDockWidget* get_focused_panel(); void alloc_panels(QWidget *parent); void free_panels(); +void scroll_to_frame_internal(QScrollBar* bar, long frame, double zoom, int area_width); #endif // PANELS_H diff --git a/panels/timeline.cpp b/panels/timeline.cpp index d1ab37705..b450f7e61 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -476,16 +476,7 @@ void Timeline::select_all() { } void Timeline::scroll_to_frame(long frame) { - if (sequence != NULL) { - int screen_point = getTimelineScreenPointFromFrame(frame); - int min_x = timeline_area->width()*0.1; - int max_x = timeline_area->width()*0.9; - if (screen_point < min_x) { - horizontalScrollBar->setValue(getScreenPointFromFrame(zoom, frame) - min_x); - } else if (screen_point > max_x) { - horizontalScrollBar->setValue(getScreenPointFromFrame(zoom, frame) - max_x); - } - } + scroll_to_frame_internal(horizontalScrollBar, frame, zoom, timeline_area->width()); } void Timeline::resizeEvent(QResizeEvent *event) { diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 8ee03decf..af1522dc7 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -3,6 +3,7 @@ #include "playback/audio.h" #include "timeline.h" #include "panels/project.h" +#include "panels/effectcontrols.h" #include "project/sequence.h" #include "project/clip.h" #include "panels/panels.h" @@ -237,7 +238,10 @@ bool frame_rate_is_droppable(float rate) { void Viewer::seek(long p) { pause(); seq->playhead = p; - if (main_sequence) panel_timeline->scroll_to_frame(p); + if (main_sequence) { + panel_timeline->scroll_to_frame(p); + panel_effect_controls->scroll_to_frame(p); + } update_parents(); reset_all_audio(); audio_scrub = true;