]> git.sesse.net Git - kdenlive/blob - src/monitor.cpp
Improve clip monitor
[kdenlive] / src / monitor.cpp
1
2 #include <QMouseEvent>
3 #include <QStylePainter>
4
5 #include <KDebug>
6 #include <KLocale>
7
8 #include "gentime.h"
9 #include "monitor.h"
10
11 Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
12     : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name)
13 {
14   ui.setupUi(this);
15   m_scale = 1;
16   m_ruler = new SmallRuler();
17   QVBoxLayout *layout = new QVBoxLayout;
18   layout->addWidget( m_ruler);
19   ui.ruler_frame->setLayout( layout );
20   //m_ruler->setPixelPerMark(3);
21   m_playIcon = KIcon("media-playback-start");
22   m_pauseIcon = KIcon("media-playback-pause");
23   ui.button_play->setIcon(m_playIcon);
24   ui.button_rew1->setIcon(KIcon("media-skip-backward"));
25   ui.button_rew->setIcon(KIcon("media-seek-backward"));
26   ui.button_fwd1->setIcon(KIcon("media-skip-forward"));
27   ui.button_fwd->setIcon(KIcon("media-seek-forward"));
28   connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
29   connect(ui.button_rew, SIGNAL(clicked()), this, SLOT(slotRewind()));
30   connect(ui.button_rew1, SIGNAL(clicked()), this, SLOT(slotRewindOneFrame()));
31   connect(ui.button_fwd, SIGNAL(clicked()), this, SLOT(slotForward()));
32   connect(ui.button_fwd1, SIGNAL(clicked()), this, SLOT(slotForwardOneFrame()));
33   connect(ui.button_play, SIGNAL(clicked()), this, SLOT(slotPlay()));
34 }
35
36 // virtual
37 void Monitor::mousePressEvent ( QMouseEvent * event )
38 {
39   slotPlay();
40 }
41
42 // virtual
43 void Monitor::wheelEvent ( QWheelEvent * event )
44 {
45   if (event->delta() > 0) slotForwardOneFrame();
46   else slotRewindOneFrame();
47 }
48
49 void Monitor::slotSeek(int pos)
50 {
51   if ( render == NULL ) return;
52   int realPos = ((double) pos) / m_scale;
53   render->seekToFrame(realPos);
54   m_position = realPos;
55   ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
56 }
57
58 void Monitor::slotRewind()
59 {
60   double speed = render->playSpeed();
61   if ( speed >= 0 ) render->play(-2);
62   else render->play(speed * 2);
63   ui.button_play->setChecked(true);
64   ui.button_play->setIcon(m_pauseIcon);
65 }
66
67 void Monitor::slotForward()
68 {
69   double speed = render->playSpeed();
70   if ( speed <= 1 ) render->play(2);
71   else render->play(speed * 2);
72   ui.button_play->setChecked(true);
73   ui.button_play->setIcon(m_pauseIcon);
74 }
75
76 void Monitor::slotRewindOneFrame()
77 {
78   render->play(0);
79   m_position--;
80   render->seekToFrame(m_position);
81   ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
82 }
83
84 void Monitor::slotForwardOneFrame()
85 {
86   render->play(0);
87   m_position++;
88   render->seekToFrame(m_position);
89   ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
90 }
91
92 void Monitor::seekCursor(int pos)
93 {
94   int rulerPos = (int) (pos * m_scale);
95   m_position = pos;
96   ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
97   //kDebug()<<"seek: "<<pos<<", scale: "<<m_scale<<
98   m_ruler->slotNewValue(rulerPos);
99 }
100
101 void Monitor::rendererStopped(int pos)
102 {
103   int rulerPos = (int) (pos * m_scale);
104   m_ruler->slotNewValue(rulerPos);
105   ui.button_play->setChecked(false);
106   ui.button_play->setIcon(m_playIcon);
107 }
108
109 void Monitor::initMonitor()
110 {
111   if ( render ) return;
112   render = new Render(m_name, this);
113   render->createVideoXWindow(ui.video_frame->winId(), -1);
114   connect(render, SIGNAL(playListDuration(int)), this, SLOT(adjustRulerSize(int)));
115   connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
116   connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
117   int width = m_ruler->width();
118   m_ruler->setLength(width);
119   m_ruler->setMaximum(width);
120   m_length = 0;
121 }
122
123 // virtual
124 void Monitor::resizeEvent ( QResizeEvent * event )
125 {
126   adjustRulerSize(-1);
127   if (render) render->askForRefresh();
128 }
129
130 void Monitor::adjustRulerSize(int length)
131 {
132   int width = m_ruler->width();
133   m_ruler->setLength(width);
134   if (length > 0) m_length = length;
135   m_scale = (double) width / m_length;
136   if (m_scale == 0) m_scale = 1;
137   kDebug()<<"RULER WIDT: "<<width<<", RENDER LENGT: "<<m_length<<", SCALE: "<<m_scale;
138   m_ruler->setPixelPerMark(m_scale);
139   m_ruler->setMaximum(width);
140   //m_ruler->setLength(length);
141 }
142
143 void Monitor::stop()
144 {
145   if (render) render->stop();
146 }
147
148 void Monitor::start()
149 {
150   if (render) render->start();
151 }
152
153 void Monitor::refreshMonitor(bool visible)
154 {
155   if (visible && render) render->askForRefresh();
156 }
157
158 void Monitor::slotOpen()
159 {
160   if ( render == NULL ) return;
161   render->mltInsertClip(2, GenTime(1, 25), QString("<westley><producer mlt_service=\"colour\" colour=\"red\" in=\"1\" out=\"30\" /></westley>"));
162   render->mltInsertClip(2, GenTime(0, 25), QString("<westley><producer mlt_service=\"avformat\" resource=\"/home/one/.vids/clip3e.mpg\" in=\"1\" out=\"300\" /></westley>"));
163 }
164
165 void Monitor::slotPlay()
166 {
167   if ( render == NULL ) return;
168   m_monitorManager->activateMonitor(m_name);
169   render->switchPlay();
170   ui.button_play->setChecked(true);
171   ui.button_play->setIcon(m_pauseIcon);
172 }
173
174 void Monitor::slotSetXml(const QDomElement &e)
175 {
176     if ( render == NULL ) return;
177     m_monitorManager->activateMonitor(m_name);
178     QDomDocument doc;
179     QDomElement westley = doc.createElement("westley");
180     doc.appendChild(westley);
181     westley.appendChild(e);
182     render->setSceneList(doc, 0);
183     m_ruler->slotNewValue(0);
184     ui.monitor_time->setText("00:00:00:00");
185     m_position = 0;
186 }
187
188
189 void Monitor::slotOpenFile(const QString &file)
190 {
191     if ( render == NULL ) return;
192     m_monitorManager->activateMonitor(m_name);
193     QDomDocument doc;
194     QDomElement westley = doc.createElement("westley");
195     doc.appendChild(westley);
196     QDomElement prod = doc.createElement("producer");
197     westley.appendChild(prod);
198     prod.setAttribute("mlt_service", "avformat");
199     prod.setAttribute("resource", file);
200     render->setSceneList(doc, 0);
201 }
202
203
204
205 #include "monitor.moc"