]> git.sesse.net Git - kdenlive/blob - src/monitorscene.cpp
dfe14a99fc5e4194df5a18d3b5b760859658764d
[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 "onmonitoritems/onmonitorrectitem.h"
24 #include "kdenlivesettings.h"
25
26 #include <QGraphicsView>
27 #include <QGraphicsPixmapItem>
28 #include <QGraphicsSceneMouseEvent>
29
30 MonitorScene::MonitorScene(Render *renderer, QObject* parent) :
31         QGraphicsScene(parent),
32         m_renderer(renderer),
33         m_view(NULL),
34         m_backgroundImage(QImage()),
35         m_enabled(true),
36         m_zoom(1.0)
37 {
38     setBackgroundBrush(QBrush(QColor(KdenliveSettings::window_background().name())));
39
40     QPen framepen(Qt::DotLine);
41     framepen.setColor(Qt::red);
42
43     m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_renderer->frameRenderWidth(), m_renderer->renderHeight()));
44     m_frameBorder->setPen(framepen);
45     m_frameBorder->setZValue(-1);
46     m_frameBorder->setBrush(Qt::transparent);
47     m_frameBorder->setFlags(0);
48     addItem(m_frameBorder);
49
50     m_lastUpdate = QTime::currentTime();
51     m_background = new QGraphicsPixmapItem();
52     m_background->setZValue(-2);
53     m_background->setFlags(0);
54     m_background->setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
55     m_background->setTransformationMode(Qt::FastTransformation);
56     QPixmap bg(m_renderer->frameRenderWidth(), m_renderer->renderHeight());
57     bg.fill();
58     m_background->setPixmap(bg);
59     addItem(m_background);
60
61     connect(m_renderer, SIGNAL(frameUpdated(QImage)), this, SLOT(slotSetBackgroundImage(QImage)));
62 }
63
64 void MonitorScene::setUp()
65 {
66     if (views().count() > 0) {
67         m_view = views().at(0);
68         m_view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
69     } else {
70         m_view = NULL;
71     }
72 }
73
74 void MonitorScene::resetProfile()
75 {
76     const QRectF border(0, 0, m_renderer->frameRenderWidth(), m_renderer->renderHeight());
77     m_frameBorder->setRect(border);
78 }
79
80 void MonitorScene::setEnabled(bool enabled)
81 {
82     m_enabled = enabled;
83 }
84
85 void MonitorScene::slotUpdateBackground()
86 {
87     if (m_view && m_view->isVisible()) {
88         if (m_lastUpdate.msecsTo(QTime::currentTime()) > 100) {
89             m_background->setPixmap(QPixmap::fromImage(m_backgroundImage));
90             m_lastUpdate = QTime::currentTime();
91         }
92     }
93 }
94
95 void MonitorScene::slotSetBackgroundImage(const QImage &image)
96 {
97     if (m_view && m_view->isVisible()) {
98         m_backgroundImage = image;
99         slotUpdateBackground();
100     }
101 }
102
103 void MonitorScene::slotZoom(int value)
104 {
105     if (m_view) {
106         m_zoom = value / 100.0;
107         m_view->resetTransform();
108         m_view->scale(m_renderer->renderWidth() * m_zoom / m_renderer->frameRenderWidth(), m_zoom);
109         emit zoomChanged(value);
110     }
111 }
112
113 void MonitorScene::slotZoomFit()
114 {
115     if (m_view) {
116         int xzoom = 100 * m_view->viewport()->height() / m_renderer->renderHeight();
117         int yzoom = 100 * m_view->viewport()->width() / m_renderer->renderWidth();
118         slotZoom(qMin(xzoom, yzoom));
119         m_view->centerOn(m_frameBorder);
120     }
121 }
122
123 void MonitorScene::slotZoomOriginal()
124 {
125     slotZoom(100);
126     if (m_view)
127         m_view->centerOn(m_frameBorder);
128 }
129
130 void MonitorScene::slotZoomOut(int by)
131 {
132     slotZoom(qMax(0, (int)(m_zoom * 100 - by)));
133 }
134
135 void MonitorScene::slotZoomIn(int by)
136 {
137     slotZoom(qMin(300, (int)(m_zoom * 100 + by + 0.5)));
138 }
139
140 void MonitorScene::slotSetCursor(const QCursor &cursor)
141 {
142     if (m_view)
143         m_view->setCursor(cursor);
144 }
145
146
147 void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
148 {
149     emit mousePressed(event);
150
151     if (!event->isAccepted())
152         QGraphicsScene::mousePressEvent(event);
153 }
154
155 void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
156 {
157     emit mouseMoved(event);
158
159     if (!event->isAccepted())
160         QGraphicsScene::mouseMoveEvent(event);
161 }
162
163 void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
164 {
165     emit mouseReleased(event);
166
167     if (!event->isAccepted())
168         QGraphicsScene::mouseReleaseEvent(event);
169 }
170
171 void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
172 {
173     Q_UNUSED(event);
174
175     if (!m_enabled)
176         emit addKeyframe();
177 }
178
179 void MonitorScene::wheelEvent(QGraphicsSceneWheelEvent* event)
180 {
181     if (event->modifiers() == Qt::ControlModifier) {
182         if (event->delta() > 0)
183             slotZoomIn(5);
184         else
185             slotZoomOut(5);
186     } else {
187         QGraphicsScene::wheelEvent(event);
188     }
189
190     event->accept();
191 }
192
193 #include "monitorscene.moc"