1 /***
2
3 Olive - Non-Linear Video Editor
4 Copyright (C) 2019 Olive Team
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19 ***/
20
21 #include "panels.h"
22
23 #include "timeline/sequence.h"
24 #include "timeline/clip.h"
25 #include "effects/transition.h"
26 #include "global/config.h"
27 #include "effects/effectloaders.h"
28 #include "global/debug.h"
29
30 #include <QScrollBar>
31 #include <QCoreApplication>
32
33 Project* panel_project = nullptr;
34 EffectControls* panel_effect_controls = nullptr;
35 Viewer* panel_sequence_viewer = nullptr;
36 Viewer* panel_footage_viewer = nullptr;
37 Timeline* panel_timeline = nullptr;
38 GraphEditor* panel_graph_editor = nullptr;
39
update_ui(bool modified)40 void update_ui(bool modified) {
41 if (modified) {
42 panel_effect_controls->SetClips();
43 }
44 panel_effect_controls->update_keyframes();
45 panel_timeline->repaint_timeline();
46 panel_sequence_viewer->update_viewer();
47 panel_graph_editor->update_panel();
48 }
49
get_focused_panel(bool force_hover)50 QDockWidget *get_focused_panel(bool force_hover) {
51 QDockWidget* w = nullptr;
52 if (olive::CurrentConfig.hover_focus || force_hover) {
53 if (panel_project->underMouse()) {
54 w = panel_project;
55 } else if (panel_effect_controls->underMouse()) {
56 w = panel_effect_controls;
57 } else if (panel_sequence_viewer->underMouse()) {
58 w = panel_sequence_viewer;
59 } else if (panel_footage_viewer->underMouse()) {
60 w = panel_footage_viewer;
61 } else if (panel_timeline->underMouse()) {
62 w = panel_timeline;
63 } else if (panel_graph_editor->view_is_under_mouse()) {
64 w = panel_graph_editor;
65 }
66 }
67 if (w == nullptr) {
68 if (panel_project->is_focused()) {
69 w = panel_project;
70 } else if (panel_effect_controls->keyframe_focus() || panel_effect_controls->is_focused()) {
71 w = panel_effect_controls;
72 } else if (panel_sequence_viewer->is_focused()) {
73 w = panel_sequence_viewer;
74 } else if (panel_footage_viewer->is_focused()) {
75 w = panel_footage_viewer;
76 } else if (panel_timeline->focused()) {
77 w = panel_timeline;
78 } else if (panel_graph_editor->view_is_focused()) {
79 w = panel_graph_editor;
80 }
81 }
82 return w;
83 }
84
alloc_panels(QWidget * parent)85 void alloc_panels(QWidget* parent) {
86 panel_sequence_viewer = new Viewer(parent);
87 panel_sequence_viewer->setObjectName("seq_viewer");
88 panel_footage_viewer = new Viewer(parent);
89 panel_footage_viewer->setObjectName("footage_viewer");
90 panel_footage_viewer->show_videoaudio_buttons(true);
91 panel_project = new Project(parent);
92 panel_project->setObjectName("proj_root");
93 panel_effect_controls = new EffectControls(parent);
94 EffectInit::StartLoading();
95 panel_effect_controls->setObjectName("fx_controls");
96 panel_timeline = new Timeline(parent);
97 panel_timeline->setObjectName("timeline");
98 panel_graph_editor = new GraphEditor(parent);
99 panel_graph_editor->setObjectName("graph_editor");
100 }
101
free_panels()102 void free_panels() {
103 delete panel_sequence_viewer;
104 panel_sequence_viewer = nullptr;
105 delete panel_footage_viewer;
106 panel_footage_viewer = nullptr;
107 delete panel_project;
108 panel_project = nullptr;
109 delete panel_effect_controls;
110 panel_effect_controls = nullptr;
111 delete panel_timeline;
112 panel_timeline = nullptr;
113 }
114
scroll_to_frame_internal(QScrollBar * bar,long frame,double zoom,int area_width)115 void scroll_to_frame_internal(QScrollBar* bar, long frame, double zoom, int area_width) {
116 if (bar->value() == bar->minimum() || bar->value() == bar->maximum()) {
117 return;
118 }
119
120 int screen_point = getScreenPointFromFrame(zoom, frame) - bar->value();
121 int min_x = area_width*0.1;
122 int max_x = area_width-min_x;
123 if (screen_point < min_x) {
124 bar->setValue(getScreenPointFromFrame(zoom, frame) - min_x);
125 } else if (screen_point > max_x) {
126 bar->setValue(getScreenPointFromFrame(zoom, frame) - max_x);
127 }
128 }
129