]> git.sesse.net Git - kdenlive/blob - src/monitorscene.cpp
on-monitor editing:
[kdenlive] / src / monitorscene.cpp
1 /***************************************************************************
2  *   Copyright (C) 2010 by Till Theato (root@ttill.de)                     *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
18  ***************************************************************************/
19
20
21 #include "monitorscene.h"
22 #include "renderer.h"
23 #include "kdenlivesettings.h"
24
25 #include <QGraphicsView>
26 #include <QGraphicsPixmapItem>
27 #include <QGraphicsSceneMouseEvent>
28
29 MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
30         QGraphicsScene(parent),
31         m_renderer(renderer),
32         m_view(NULL),
33         m_backgroundImage(QImage()),
34         m_enabled(true),
35         m_zoom(1.0)
36 {
37     setBackgroundBrush(QBrush(QColor(KdenliveSettings::window_background().name())));
38
39     QPen framepen(Qt::DotLine);
40     framepen.setColor(Qt::red);
41
42     m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_renderer->frameRenderWidth(), m_renderer->renderHeight()));
43     m_frameBorder->setPen(framepen);
44     m_frameBorder->setZValue(-1);
45     m_frameBorder->setBrush(Qt::transparent);
46     m_frameBorder->setFlags(0);
47     addItem(m_frameBorder);
48
49     m_lastUpdate = QTime::currentTime();
50     m_background = new QGraphicsPixmapItem();
51     m_background->setZValue(-2);
52     m_background->setFlags(0);
53     m_background->setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
54     m_background->setTransformationMode(Qt::FastTransformation);
55     QPixmap bg(m_renderer->frameRenderWidth(), m_renderer->renderHeight());
56     bg.fill();
57     m_background->setPixmap(bg);
58     addItem(m_background);
59
60     connect(m_renderer, SIGNAL(frameUpdated(QImage)), this, SLOT(slotSetBackgroundImage(QImage)));
61 }
62
63 void MonitorScene::setUp()
64 {
65     if (views().count() > 0) {
66         m_view = views().at(0);
67         m_view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
68     } else {
69         m_view = NULL;
70     }
71 }
72
73 void MonitorScene::resetProfile()
74 {
75     const QRectF border(0, 0, m_renderer->frameRenderWidth(), m_renderer->renderHeight());
76     m_frameBorder->setRect(border);
77 }
78
79 void MonitorScene::setEnabled(bool enabled)
80 {
81     m_enabled = enabled;
82 }
83
84 void MonitorScene::slotUpdateBackground()
85 {
86     if (m_view && m_view->isVisible()) {
87         if (m_lastUpdate.msecsTo(QTime::currentTime()) > 50) {
88             m_background->setPixmap(QPixmap::fromImage(m_backgroundImage));
89             m_lastUpdate = QTime::currentTime();
90         }
91     }
92 }
93
94 void MonitorScene::slotSetBackgroundImage(const QImage &image)
95 {
96     if (m_view && m_view->isVisible()) {
97         m_backgroundImage = image;
98         slotUpdateBackground();
99     }
100 }
101
102 void MonitorScene::slotZoom(int value)
103 {
104     if (m_view) {
105         m_zoom = value / 100.0;
106         m_view->resetTransform();
107         m_view->scale(m_renderer->renderWidth() * m_zoom / m_renderer->frameRenderWidth(), m_zoom);
108         emit zoomChanged(value);
109     }
110 }
111
112 void MonitorScene::slotZoomFit()
113 {
114     if (m_view) {
115         int xzoom = 100 * m_view->viewport()->height() / m_renderer->renderHeight();
116         int yzoom = 100 * m_view->viewport()->width() / m_renderer->renderWidth();
117         slotZoom(qMin(xzoom, yzoom));
118         m_view->centerOn(m_frameBorder);
119     }
120 }
121
122 void MonitorScene::slotZoomOriginal()
123 {
124     slotZoom(100);
125     if (m_view)
126         m_view->centerOn(m_frameBorder);
127 }
128
129 void MonitorScene::slotZoomOut(int by)
130 {
131     slotZoom(qMax(0, (int)(m_zoom * 100 - by)));
132 }
133
134 void MonitorScene::slotZoomIn(int by)
135 {
136     slotZoom(qMin(300, (int)(m_zoom * 100 + by + 0.5)));
137 }
138
139 void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
140 {
141     QGraphicsScene::mouseMoveEvent(event);
142 }
143
144 void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
145 {
146     Q_UNUSED(event);
147
148     if (!m_enabled)
149         emit addKeyframe();
150 }
151
152 void MonitorScene::wheelEvent(QGraphicsSceneWheelEvent* event)
153 {
154     if (event->modifiers() == Qt::ControlModifier) {
155         if (event->delta() > 0)
156             slotZoomIn(5);
157         else
158             slotZoomOut(5);
159     } else {
160         QGraphicsScene::wheelEvent(event);
161     }
162
163     event->accept();
164 }
165
166 #include "monitorscene.moc"