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 #ifndef VIEWERWIDGET_H
22 #define VIEWERWIDGET_H
23 
24 #include <QOpenGLWidget>
25 #include <QMatrix4x4>
26 #include <QOpenGLTexture>
27 #include <QTimer>
28 #include <QThread>
29 #include <QMutex>
30 #include <QWaitCondition>
31 #include <QOpenGLFunctions>
32 
33 #include "timeline/clip.h"
34 #include "project/footage.h"
35 #include "effects/effect.h"
36 #include "ui/viewerwindow.h"
37 #include "ui/viewercontainer.h"
38 #include "rendering/renderthread.h"
39 
40 class Viewer;
41 class QOpenGLFramebufferObject;
42 struct GLTextureCoords;
43 
44 class ViewerWidget : public QOpenGLWidget, QOpenGLFunctions
45 {
46   Q_OBJECT
47 public:
48   ViewerWidget(QWidget *parent = nullptr);
49   ~ViewerWidget();
50 
51   void close_window();
52   void wait_until_render_is_paused();
53 
54   void paintGL();
55   void initializeGL();
56   Viewer* viewer;
57   ViewerContainer* container;
58 
59   bool waveform;
60   ClipPtr waveform_clip;
61   const FootageStream* waveform_ms;
62   double waveform_zoom;
63   int waveform_scroll;
64 
65   void frame_update();
66   RenderThread* get_renderer();
67   void set_scroll(double x, double y);
68 public slots:
69   void set_waveform_scroll(int s);
70   void set_fullscreen(int screen = 0);
71 protected:
72   void mousePressEvent(QMouseEvent *event);
73   void mouseMoveEvent(QMouseEvent *event);
74   void mouseReleaseEvent(QMouseEvent *event);
75   void wheelEvent(QWheelEvent* event);
76 private:
77   void draw_waveform_func();
78   void draw_title_safe_area();
79   void draw_gizmos();
80   EffectGizmo* get_gizmo_from_mouse(int x, int y);
81   void move_gizmos(QMouseEvent *event, bool done);
82   bool dragging;
83   void seek_from_click(int x);
84   Effect* gizmos;
85   int drag_start_x;
86   int drag_start_y;
87   int gizmo_x_mvmt;
88   int gizmo_y_mvmt;
89   EffectGizmo* selected_gizmo;
90   RenderThread* renderer;
91   ViewerWindow* window;
92   double x_scroll;
93   double y_scroll;
94 private slots:
95   void context_destroy();
96   void retry();
97   void show_context_menu();
98   void save_frame();
99   void queue_repaint();
100   void fullscreen_menu_action(QAction* action);
101   void set_fit_zoom();
102   void set_custom_zoom();
103   void set_menu_zoom(QAction *action);
104 };
105 
106 #endif // VIEWERWIDGET_H
107