]> git.sesse.net Git - kdenlive/blob - src/monitor.cpp
slowly progressing... ruler scrubbing, start of trackview
[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   if (m_position < 1) return;
80   m_position--;
81   render->seekToFrame(m_position);
82   ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
83 }
84
85 void Monitor::slotForwardOneFrame()
86 {
87   render->play(0);
88   if (m_position >= m_length) return;
89   m_position++;
90   render->seekToFrame(m_position);
91   ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
92 }
93
94 void Monitor::seekCursor(int pos)
95 {
96   int rulerPos = (int) (pos * m_scale);
97   m_position = pos;
98   ui.monitor_time->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
99   //kDebug()<<"seek: "<<pos<<", scale: "<<m_scale<<
100   m_ruler->slotNewValue(rulerPos);
101 }
102
103 void Monitor::rendererStopped(int pos)
104 {
105   int rulerPos = (int) (pos * m_scale);
106   m_ruler->slotNewValue(rulerPos);
107   ui.button_play->setChecked(false);
108   ui.button_play->setIcon(m_playIcon);
109 }
110
111 void Monitor::initMonitor()
112 {
113   if ( render ) return;
114   render = new Render(m_name, this);
115   render->createVideoXWindow(ui.video_frame->winId(), -1);
116   connect(render, SIGNAL(playListDuration(int)), this, SLOT(adjustRulerSize(int)));
117   connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
118   connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
119   int width = m_ruler->width();
120   m_ruler->setLength(width);
121   m_ruler->setMaximum(width);
122   m_length = 0;
123 }
124
125 // virtual
126 void Monitor::resizeEvent ( QResizeEvent * event )
127 {
128   adjustRulerSize(-1);
129   if (render) render->askForRefresh();
130 }
131
132 void Monitor::adjustRulerSize(int length)
133 {
134   int width = m_ruler->width();
135   m_ruler->setLength(width);
136   if (length > 0) m_length = length;
137   m_scale = (double) width / m_length;
138   if (m_scale == 0) m_scale = 1;
139   kDebug()<<"RULER WIDT: "<<width<<", RENDER LENGT: "<<m_length<<", SCALE: "<<m_scale;
140   m_ruler->setPixelPerMark(m_scale);
141   m_ruler->setMaximum(width);
142   //m_ruler->setLength(length);
143 }
144
145 void Monitor::stop()
146 {
147   if (render) render->stop();
148 }
149
150 void Monitor::start()
151 {
152   if (render) render->start();
153 }
154
155 void Monitor::refreshMonitor(bool visible)
156 {
157   if (visible && render) render->askForRefresh();
158 }
159
160 void Monitor::slotOpen()
161 {
162   if ( render == NULL ) return;
163   render->mltInsertClip(2, GenTime(1, 25), QString("<westley><producer mlt_service=\"colour\" colour=\"red\" in=\"1\" out=\"30\" /></westley>"));
164   render->mltInsertClip(2, GenTime(0, 25), QString("<westley><producer mlt_service=\"avformat\" resource=\"/home/one/.vids/clip3e.mpg\" in=\"1\" out=\"300\" /></westley>"));
165 }
166
167 void Monitor::slotPlay()
168 {
169   if ( render == NULL ) return;
170   m_monitorManager->activateMonitor(m_name);
171   render->switchPlay();
172   ui.button_play->setChecked(true);
173   ui.button_play->setIcon(m_pauseIcon);
174 }
175
176 void Monitor::slotSetXml(const QDomElement &e)
177 {
178     if ( render == NULL ) return;
179     m_monitorManager->activateMonitor(m_name);
180     QDomDocument doc;
181     QDomElement westley = doc.createElement("westley");
182     doc.appendChild(westley);
183     westley.appendChild(e);
184     render->setSceneList(doc, 0);
185     m_ruler->slotNewValue(0);
186     ui.monitor_time->setText("00:00:00:00");
187     m_position = 0;
188 }
189
190
191 void Monitor::slotOpenFile(const QString &file)
192 {
193     if ( render == NULL ) return;
194     m_monitorManager->activateMonitor(m_name);
195     QDomDocument doc;
196     QDomElement westley = doc.createElement("westley");
197     doc.appendChild(westley);
198     QDomElement prod = doc.createElement("producer");
199     westley.appendChild(prod);
200     prod.setAttribute("mlt_service", "avformat");
201     prod.setAttribute("resource", file);
202     render->setSceneList(doc, 0);
203 }
204
205
206
207 #include "monitor.moc"