]> git.sesse.net Git - kdenlive/blob - src/monitor.cpp
first po file
[kdenlive] / src / monitor.cpp
1 /***************************************************************************
2  *   Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
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 <QMouseEvent>
22 #include <QStylePainter>
23 #include <QMenu>
24 #include <QToolButton>
25 #include <QToolBar>
26
27 #include <KDebug>
28 #include <KLocale>
29
30 #include "gentime.h"
31 #include "monitor.h"
32 #include "renderer.h"
33 #include "monitormanager.h"
34 #include "smallruler.h"
35
36 Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
37         : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name), m_isActive(false) {
38     ui.setupUi(this);
39     m_scale = 1;
40     m_ruler = new SmallRuler();
41     QVBoxLayout *layout = new QVBoxLayout;
42     layout->addWidget(m_ruler);
43     ui.ruler_frame->setLayout(layout);
44
45     QToolBar *toolbar = new QToolBar(name, this);
46     QVBoxLayout *layout2 = new QVBoxLayout;
47
48     m_playIcon = KIcon("media-playback-start");
49     m_pauseIcon = KIcon("media-playback-pause");
50
51     QAction *m_rewAction = toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"));
52     connect(m_rewAction, SIGNAL(triggered()), this, SLOT(slotRewind()));
53     QAction *m_rew1Action = toolbar->addAction(KIcon("media-skip-backward"), i18n("Rewind 1 frame"));
54     connect(m_rew1Action, SIGNAL(triggered()), this, SLOT(slotRewindOneFrame()));
55
56     QToolButton *playButton = new QToolButton(toolbar);
57     QMenu *playMenu = new QMenu(this);
58     playButton->setMenu(playMenu);
59     playButton->setPopupMode(QToolButton::MenuButtonPopup);
60     toolbar->addWidget(playButton);
61
62     m_playAction = playMenu->addAction(m_playIcon, i18n("Play"));
63     m_playAction->setCheckable(true);
64     connect(m_playAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
65     QAction *m_playSectionAction = playMenu->addAction(m_playIcon, i18n("Play Section"));
66     connect(m_playSectionAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
67     QAction *m_loopSectionAction = playMenu->addAction(m_playIcon, i18n("Loop Section"));
68     connect(m_loopSectionAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
69
70     QAction *m_fwd1Action = toolbar->addAction(KIcon("media-skip-forward"), i18n("Forward 1 frame"));
71     connect(m_fwd1Action, SIGNAL(triggered()), this, SLOT(slotForwardOneFrame()));
72     QAction *m_fwdAction = toolbar->addAction(KIcon("media-seek-forward"), i18n("Forward"));
73     connect(m_fwdAction, SIGNAL(triggered()), this, SLOT(slotForward()));
74
75     playButton->setDefaultAction(m_playAction);
76
77     m_timePos = new KRestrictedLine(this);
78     m_timePos->setInputMask("99:99:99:99");
79     toolbar->addWidget(m_timePos);
80
81     layout2->addWidget(toolbar);
82     ui.button_frame->setLayout(layout2);
83
84     //m_ruler->setPixelPerMark(3);
85
86
87     QVBoxLayout *rendererBox = new QVBoxLayout(ui.video_frame);
88     m_monitorRefresh = new MonitorRefresh(ui.video_frame);
89     rendererBox->addWidget(m_monitorRefresh);
90     m_monitorRefresh->setAttribute(Qt::WA_PaintOnScreen);
91     render = new Render(m_name, (int) m_monitorRefresh->winId(), -1, this);
92     m_monitorRefresh->setRenderer(render);
93
94     connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int)));
95     connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
96     connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
97     if (name != "clip") {
98         connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int)));
99         connect(render, SIGNAL(durationChanged(int)), this, SIGNAL(durationChanged(int)));
100     }
101     //render->createVideoXWindow(ui.video_frame->winId(), -1);
102     int width = m_ruler->width();
103     m_ruler->setLength(width);
104     m_ruler->setMaximum(width);
105     m_length = 0;
106
107     kDebug() << "/////// BUILDING MONITOR, ID: " << ui.video_frame->winId();
108 }
109
110 QString Monitor::name() const {
111     return m_name;
112 }
113
114 // virtual
115 void Monitor::mousePressEvent(QMouseEvent * event) {
116     slotPlay();
117 }
118
119 // virtual
120 void Monitor::wheelEvent(QWheelEvent * event) {
121     if (event->delta() > 0) slotForwardOneFrame();
122     else slotRewindOneFrame();
123 }
124
125 void Monitor::activateMonitor() {
126     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
127 }
128
129 void Monitor::slotSeek(int pos) {
130     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
131     if (render == NULL) return;
132     int realPos = (int)(((double) pos) / m_scale);
133     render->seekToFrame(realPos);
134     m_position = realPos;
135     emit renderPosition(m_position);
136     m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
137 }
138
139 void Monitor::slotRewind(double speed) {
140     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
141     if (speed == 0) {
142         double currentspeed = render->playSpeed();
143         if (currentspeed >= 0) render->play(-2);
144         else render->play(currentspeed * 2);
145     } else render->play(speed);
146     m_playAction->setChecked(true);
147     m_playAction->setIcon(m_pauseIcon);
148 }
149
150 void Monitor::slotForward(double speed) {
151     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
152     if (speed == 0) {
153         double currentspeed = render->playSpeed();
154         if (currentspeed <= 1) render->play(2);
155         else render->play(currentspeed * 2);
156     } else render->play(speed);
157     m_playAction->setChecked(true);
158     m_playAction->setIcon(m_pauseIcon);
159 }
160
161 void Monitor::slotRewindOneFrame() {
162     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
163     render->play(0);
164     if (m_position < 1) return;
165     m_position--;
166     render->seekToFrame(m_position);
167     emit renderPosition(m_position);
168     m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
169 }
170
171 void Monitor::slotForwardOneFrame() {
172     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
173     render->play(0);
174     if (m_position >= m_length) return;
175     m_position++;
176     render->seekToFrame(m_position);
177     emit renderPosition(m_position);
178     m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
179 }
180
181 void Monitor::seekCursor(int pos) {
182     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
183     int rulerPos = (int)(pos * m_scale);
184     m_position = pos;
185     m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
186     //kDebug() << "seek: " << pos << ", scale: " << m_scale;
187     m_ruler->slotNewValue(rulerPos);
188 }
189
190 void Monitor::rendererStopped(int pos) {
191     int rulerPos = (int)(pos * m_scale);
192     m_ruler->slotNewValue(rulerPos);
193     m_position = pos;
194     m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
195     m_playAction->setChecked(false);
196     m_playAction->setIcon(m_playIcon);
197 }
198
199 void Monitor::initMonitor() {
200     kDebug() << "/////// INITING MONITOR, ID: " << ui.video_frame->winId();
201 }
202
203 // virtual
204 void Monitor::resizeEvent(QResizeEvent * event) {
205     QWidget::resizeEvent(event);
206     adjustRulerSize(-1);
207     if (render && m_isActive) render->doRefresh();
208     //
209 }
210
211 void Monitor::adjustRulerSize(int length) {
212     int width = m_ruler->width();
213     m_ruler->setLength(width);
214     if (length > 0) m_length = length;
215     m_scale = (double) width / m_length;
216     if (m_scale == 0) m_scale = 1;
217     kDebug() << "RULER WIDT: " << width << ", RENDER LENGT: " << m_length << ", SCALE: " << m_scale;
218     m_ruler->setPixelPerMark(m_scale);
219     m_ruler->setMaximum(width);
220     //m_ruler->setLength(length);
221 }
222
223 void Monitor::stop() {
224     m_isActive = false;
225     if (render) render->stop();
226 }
227
228 void Monitor::start() {
229     m_isActive = true;
230     if (render) render->start();
231 }
232
233 void Monitor::refreshMonitor(bool visible) {
234     if (visible && render) {
235         if (!m_isActive) m_monitorManager->activateMonitor(m_name);
236         render->askForRefresh();
237     }
238 }
239
240 void Monitor::slotPlay() {
241     if (render == NULL) return;
242     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
243     render->switchPlay();
244     m_playAction->setChecked(true);
245     m_playAction->setIcon(m_pauseIcon);
246 }
247
248 void Monitor::slotSetXml(const QDomElement &e) {
249     if (render == NULL) return;
250     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
251     QDomDocument doc;
252     QDomElement westley = doc.createElement("westley");
253     doc.appendChild(westley);
254     westley.appendChild(e);
255     render->setSceneList(doc, 0);
256     m_ruler->slotNewValue(0);
257     m_timePos->setText("00:00:00:00");
258     m_position = 0;
259 }
260
261 void Monitor::slotOpenFile(const QString &file) {
262     if (render == NULL) return;
263     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
264     QDomDocument doc;
265     QDomElement westley = doc.createElement("westley");
266     doc.appendChild(westley);
267     QDomElement prod = doc.createElement("producer");
268     westley.appendChild(prod);
269     prod.setAttribute("mlt_service", "avformat");
270     prod.setAttribute("resource", file);
271     render->setSceneList(doc, 0);
272 }
273
274 void Monitor::resetProfile(QString prof) {
275     if (render == NULL) return;
276     render->resetProfile(prof);
277 }
278
279 void Monitor::saveSceneList(QString path, QDomElement e) {
280     if (render == NULL) return;
281     render->saveSceneList(path, e);
282 }
283
284 MonitorRefresh::MonitorRefresh(QWidget* parent): QWidget(parent), m_renderer(NULL) {
285
286 }
287
288 void MonitorRefresh::setRenderer(Render* render) {
289     m_renderer = render;
290 }
291
292 void MonitorRefresh::paintEvent(QPaintEvent * event) {
293     if (m_renderer != NULL) m_renderer->doRefresh();
294 }
295
296 #include "monitor.moc"