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