From: Jean-Baptiste Mardelle Date: Wed, 16 Sep 2009 22:58:36 +0000 (+0000) Subject: Cleanup drawing of monitor rulers, add Markers list in clip monitor menu X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=b7afae4d27a5b5659775725e17e20eaa0c93a240;p=kdenlive Cleanup drawing of monitor rulers, add Markers list in clip monitor menu svn path=/trunk/kdenlive/; revision=3901 --- diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 66e5c779..71cfacb3 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -296,7 +296,7 @@ QList < GenTime > DocClipBase::snapMarkers() const QList < GenTime > markers; for (int count = 0; count < m_snapMarkers.count(); ++count) { - markers.append(m_snapMarkers[count].time()); + markers.append(m_snapMarkers.at(count).time()); } return markers; @@ -380,23 +380,23 @@ GenTime DocClipBase::findPreviousSnapMarker(const GenTime & currTime) { int it; for (it = 0; it < m_snapMarkers.count(); it++) { - if (m_snapMarkers[it].time() >= currTime) + if (m_snapMarkers.at(it).time() >= currTime) break; } if (it == 0) return GenTime(); - else if (it == m_snapMarkers.count() - 1 && m_snapMarkers[it].time() < currTime) - return m_snapMarkers[it].time(); - else return m_snapMarkers[it-1].time(); + else if (it == m_snapMarkers.count() - 1 && m_snapMarkers.at(it).time() < currTime) + return m_snapMarkers.at(it).time(); + else return m_snapMarkers.at(it-1).time(); } GenTime DocClipBase::findNextSnapMarker(const GenTime & currTime) { int it; for (it = 0; it < m_snapMarkers.count(); it++) { - if (m_snapMarkers[it].time() > currTime) + if (m_snapMarkers.at(it).time() > currTime) break; } - if (it < m_snapMarkers.count() && m_snapMarkers[it].time() > currTime) return m_snapMarkers[it].time(); + if (it < m_snapMarkers.count() && m_snapMarkers.at(it).time() > currTime) return m_snapMarkers.at(it).time(); return duration(); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e64bc634..a403f407 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2011,8 +2011,9 @@ void MainWindow::slotAddClipMarker() MarkerDialog d(clip, marker, m_activeDocument->timecode(), i18n("Add Marker"), this); if (d.exec() == QDialog::Accepted) { m_activeTimeline->projectView()->slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment()); + if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); + m_clipMonitor->updateMarkers(clip); } - if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); } void MainWindow::slotDeleteClipMarker() @@ -2044,6 +2045,7 @@ void MainWindow::slotDeleteClipMarker() } m_activeTimeline->projectView()->slotDeleteClipMarker(comment, id, pos); if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); + m_clipMonitor->updateMarkers(clip); } @@ -2066,6 +2068,7 @@ void MainWindow::slotDeleteAllClipMarkers() } m_activeTimeline->projectView()->slotDeleteAllClipMarkers(clip->getId()); if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); + m_clipMonitor->updateMarkers(clip); } void MainWindow::slotEditClipMarker() @@ -2103,6 +2106,7 @@ void MainWindow::slotEditClipMarker() if (d.newMarker().time() != pos) { // remove old marker m_activeTimeline->projectView()->slotAddClipMarker(id, pos, QString()); + m_clipMonitor->updateMarkers(clip); } if (m_clipMonitor->isActive()) m_clipMonitor->checkOverlay(); } diff --git a/src/monitor.cpp b/src/monitor.cpp index 78acd3d7..88259bf8 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -98,6 +98,13 @@ Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent) : configButton->setMenu(m_configMenu); configButton->setPopupMode(QToolButton::QToolButton::InstantPopup); toolbar->addWidget(configButton); + + if (name == "clip") { + m_markerMenu = new QMenu(i18n("Go to marker..."), this); + m_markerMenu->setEnabled(false); + m_configMenu->addMenu(m_markerMenu); + connect(m_markerMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotGoToMarker(QAction *))); + } m_configMenu->addAction(KIcon("transform-scale"), i18n("Resize (100%)"), this, SLOT(slotSetSizeOneToOne())); m_configMenu->addAction(KIcon("transform-scale"), i18n("Resize (50%)"), this, SLOT(slotSetSizeOneToTwo())); } @@ -218,6 +225,12 @@ void Monitor::setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMe } +void Monitor::slotGoToMarker(QAction *action) +{ + int pos = action->data().toInt(); + slotSeek(pos); +} + void Monitor::slotSetSizeOneToOne() { QRect r = QApplication::desktop()->screenGeometry(); @@ -268,6 +281,26 @@ DocClipBase *Monitor::activeClip() return m_currentClip; } +void Monitor::updateMarkers(DocClipBase *source) +{ + if (source == m_currentClip) { + m_markerMenu->clear(); + QList markers = m_currentClip->commentedSnapMarkers(); + if (!markers.isEmpty()) { + QList marks; + for (int i = 0; i < markers.count(); i++) { + int pos = (int) markers.at(i).time().frames(render->fps()); + marks.append(pos); + QString position = m_monitorManager->timecode().getTimecode(markers.at(i).time()) + ' ' + markers.at(i).comment(); + QAction *go = m_markerMenu->addAction(position); + go->setData(pos); + } + m_ruler->setMarkers(marks); + } else m_ruler->setMarkers(QList ()); + m_markerMenu->setEnabled(!m_markerMenu->isEmpty()); + } +} + void Monitor::slotSeekToPreviousSnap() { if (m_currentClip) slotSeek(getSnapForPos(true).frames(m_monitorManager->timecode().fps())); @@ -713,6 +746,7 @@ void Monitor::slotSetXml(DocClipBase *clip, const int position) } if (clip != m_currentClip) { m_currentClip = clip; + updateMarkers(clip); if (render->setProducer(clip->producer(), position) == -1) { // MLT CONSUMER is broken emit blockMonitors(); diff --git a/src/monitor.h b/src/monitor.h index 9d7723f3..3f3fe8fd 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -82,6 +82,7 @@ public: GenTime position(); void checkOverlay(); void updateTimecodeFormat(); + void updateMarkers(DocClipBase *source); protected: virtual void mousePressEvent(QMouseEvent * event); @@ -114,6 +115,7 @@ private: QMenu *m_contextMenu; QMenu *m_configMenu; QMenu *m_playMenu; + QMenu *m_markerMenu; QPoint m_DragStartPosition; #ifdef Q_WS_MAC VideoGLWidget *m_glWidget; @@ -133,6 +135,7 @@ private slots: void setClipZone(QPoint pos); void slotSwitchMonitorInfo(bool show); void slotSwitchDropFrames(bool show); + void slotGoToMarker(QAction *action); public slots: void slotOpenFile(const QString &); diff --git a/src/smallruler.cpp b/src/smallruler.cpp index 8881329c..de1e2119 100644 --- a/src/smallruler.cpp +++ b/src/smallruler.cpp @@ -52,7 +52,7 @@ void SmallRuler::adjustScale(int maximum) m_medium = 60 * 25; } m_cursorPosition = m_cursorFramePosition * m_scale; - update(); + updatePixmap(); } void SmallRuler::setZone(int start, int end) @@ -75,7 +75,13 @@ void SmallRuler::setZone(int start, int end) m_zoneEnd = end; } else m_zoneEnd = end; } - update(); + updatePixmap(); +} + +void SmallRuler::setMarkers(QList < int > list) +{ + m_markers = list; + updatePixmap(); } QPoint SmallRuler::zone() @@ -92,7 +98,7 @@ void SmallRuler::mousePressEvent(QMouseEvent * event) if (qAbs(pos - m_zoneStart) < qAbs(pos - m_zoneEnd)) m_zoneStart = pos; else m_zoneEnd = pos; emit zoneChanged(QPoint(m_zoneStart, m_zoneEnd)); - update(); + updatePixmap(); } else emit seekRenderer((int) pos); } @@ -113,7 +119,7 @@ void SmallRuler::slotNewValue(int value) const int offset = 6; const int x = qMin(oldPos, m_cursorPosition); const int w = qAbs(oldPos - m_cursorPosition); - update(x - offset, 9, w + 2 * offset, 6); + update(x - offset, 4, w + 2 * offset, 6); } //virtual @@ -122,40 +128,54 @@ void SmallRuler::resizeEvent(QResizeEvent *) adjustScale(m_maxval); } -// virtual -void SmallRuler::paintEvent(QPaintEvent *e) +void SmallRuler::updatePixmap() { - - QPainter p(this); - QRect r = e->rect(); - p.setClipRect(r); - + m_pixmap = QPixmap(width(), height()); + m_pixmap.fill(palette().window().color()); + QPainter p(&m_pixmap); double f, fend; - p.setPen(palette().dark().color()); const int zoneStart = (int)(m_zoneStart * m_scale); const int zoneEnd = (int)(m_zoneEnd * m_scale); + p.fillRect(zoneStart, height() / 2 - 1, zoneEnd - zoneStart, height() / 2, m_zoneColor); + + // draw markers + if (!m_markers.isEmpty()) { + p.setPen(Qt::red); + for (int i = 0; i < m_markers.count(); i++) { + p.drawLine(m_markers.at(i) * m_scale, 0, m_markers.at(i) * m_scale, 9); + } + } + p.setPen(palette().dark().color()); + // draw the little marks + fend = m_scale * m_small; + if (fend > 2) for (f = 0; f < width(); f += fend) { + p.drawLine((int)f, 0, (int)f, 3); + } - p.fillRect(zoneStart, height() / 2, zoneEnd - zoneStart, height() / 2, m_zoneColor); + // draw medium marks + fend = m_scale * m_medium; + if (fend > 2) for (f = 0; f < width(); f += fend) { + p.drawLine((int)f, 0, (int)f, 6); + } + p.end(); + update(); +} - if (r.top() < 9) { - // draw the little marks - fend = m_scale * m_small; - if (fend > 2) for (f = 0; f < width(); f += fend) { - p.drawLine((int)f, 1, (int)f, 3); - } +// virtual +void SmallRuler::paintEvent(QPaintEvent *e) +{ - // draw medium marks - fend = m_scale * m_medium; - if (fend > 2) for (f = 0; f < width(); f += fend) { - p.drawLine((int)f, 1, (int)f, 5); - } - } + QPainter p(this); + QRect r = e->rect(); + p.setClipRect(r); + p.drawPixmap(QPointF(), m_pixmap); // draw pointer QPolygon pa(3); - pa.setPoints(3, m_cursorPosition - 5, 14, m_cursorPosition + 5, 14, m_cursorPosition/*+0*/, 9); + pa.setPoints(3, m_cursorPosition - 5, 10, m_cursorPosition + 5, 10, m_cursorPosition/*+0*/, 5); p.setBrush(palette().dark().color()); + p.setPen(Qt::NoPen); p.drawPolygon(pa); } diff --git a/src/smallruler.h b/src/smallruler.h index 2414a502..38c466fb 100644 --- a/src/smallruler.h +++ b/src/smallruler.h @@ -34,6 +34,7 @@ public: void adjustScale(int maximum); void setZone(int start, int end); QPoint zone(); + void setMarkers(QList < int > list); protected: virtual void paintEvent(QPaintEvent *e); @@ -49,6 +50,9 @@ private: int m_zoneStart; int m_zoneEnd; QColor m_zoneColor; + QList m_markers; + QPixmap m_pixmap; + void updatePixmap(); public slots: void slotNewValue(int value); diff --git a/src/widgets/monitor_ui.ui b/src/widgets/monitor_ui.ui index edf0f36b..9a15a100 100644 --- a/src/widgets/monitor_ui.ui +++ b/src/widgets/monitor_ui.ui @@ -1,7 +1,8 @@ - + + Monitor_UI - - + + 0 0 @@ -9,65 +10,65 @@ 177 - - + + 0 - + 0 - - - + + + NoAntialias - + 0 - - - - + + + + 0 0 - + 16 - 15 + 10 - + 16777215 - 15 + 10 - + 0 - - - - + + + + 0 0 - + 0 15 - + 0