]> git.sesse.net Git - kdenlive/blob - src/monitorscene.cpp
3a305d87aea7e6706c6652f1315a4580648d5198
[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()
131 {
132     slotZoom(qMax(0, (int)(m_zoom * 100 - 1)));
133 }
134
135 void MonitorScene::slotZoomIn()
136 {
137     int newzoom = (100 * m_zoom + 0.5);
138     newzoom++;
139     slotZoom(qMin(300, newzoom));
140 }
141
142 void MonitorScene::slotSetCursor(const QCursor &cursor)
143 {
144     if (m_view)
145         m_view->setCursor(cursor);
146 }
147
148
149 void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
150 {
151     emit mousePressed(event);
152
153     if (!event->isAccepted())
154         QGraphicsScene::mousePressEvent(event);
155 }
156
157 void MonitorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
158 {
159     emit mouseMoved(event);
160
161     if (!event->isAccepted())
162         QGraphicsScene::mouseMoveEvent(event);
163 }
164
165 void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
166 {
167     emit mouseReleased(event);
168
169     if (!event->isAccepted())
170         QGraphicsScene::mouseReleaseEvent(event);
171 }
172
173 void MonitorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
174 {
175     Q_UNUSED(event);
176
177     if (!m_enabled)
178         emit addKeyframe();
179 }
180
181
182 #include "monitorscene.moc"