X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmonitor.cpp;h=dbe677190b43f481894b1b220723194d90836a8a;hb=548782dfe8b4ec1edc0c15f0062f5a976f1c6ee3;hp=574b1f001e129599561baa0780658076a56ba0c7;hpb=efe8d9bd95254f319b102f970600618b18e73492;p=kdenlive diff --git a/src/monitor.cpp b/src/monitor.cpp index 574b1f00..dbe67719 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -23,8 +23,9 @@ #include "monitormanager.h" #include "smallruler.h" #include "docclipbase.h" -#include "monitorscene.h" #include "abstractclipitem.h" +#include "monitorscene.h" +#include "monitoreditwidget.h" #include "kdenlivesettings.h" #include @@ -42,7 +43,6 @@ #include #include #include -#include Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget *parent) : @@ -58,44 +58,45 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget m_length(0), m_dragStarted(false), m_monitorRefresh(NULL), - m_effectScene(NULL), - m_effectView(NULL), + m_effectWidget(NULL), m_selectedClip(NULL), m_loopClipTransition(true) { QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); // Video widget holder m_videoBox = new VideoContainer(this); m_videoBox->setContentsMargins(0, 0, 0, 0); - m_videoBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + m_videoBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); layout->addWidget(m_videoBox, 10); layout->addStretch(); + // Get base size for icons + int s = style()->pixelMetric(QStyle::PM_SmallIconSize); + // Monitor ruler layout->addWidget(m_ruler); - // Tool bar buttons - QToolBar *toolbar = new QToolBar(name, this); - QVBoxLayout *layout2 = new QVBoxLayout; - layout2->setContentsMargins(0, 0, 0, 0); + m_toolbar = new QToolBar(name, this); + m_toolbar->setIconSize(QSize(s, s)); m_playIcon = KIcon("media-playback-start"); m_pauseIcon = KIcon("media-playback-pause"); if (name != "chapter") { - toolbar->addAction(KIcon("kdenlive-zone-start"), i18n("Set zone start"), this, SLOT(slotSetZoneStart())); - toolbar->addAction(KIcon("kdenlive-zone-end"), i18n("Set zone end"), this, SLOT(slotSetZoneEnd())); + m_toolbar->addAction(KIcon("kdenlive-zone-start"), i18n("Set zone start"), this, SLOT(slotSetZoneStart())); + m_toolbar->addAction(KIcon("kdenlive-zone-end"), i18n("Set zone end"), this, SLOT(slotSetZoneEnd())); } else { m_ruler->setZone(-3, -2); } - toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"), this, SLOT(slotRewind())); - //toolbar->addAction(KIcon("media-skip-backward"), i18n("Rewind 1 frame"), this, SLOT(slotRewindOneFrame())); + m_toolbar->addAction(KIcon("media-seek-backward"), i18n("Rewind"), this, SLOT(slotRewind())); + //m_toolbar->addAction(KIcon("media-skip-backward"), i18n("Rewind 1 frame"), this, SLOT(slotRewindOneFrame())); - QToolButton *playButton = new QToolButton(toolbar); + QToolButton *playButton = new QToolButton(m_toolbar); m_playMenu = new QMenu(i18n("Play..."), this); m_playAction = m_playMenu->addAction(m_playIcon, i18n("Play")); //m_playAction->setCheckable(true); @@ -103,20 +104,20 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget playButton->setMenu(m_playMenu); playButton->setPopupMode(QToolButton::MenuButtonPopup); - toolbar->addWidget(playButton); + m_toolbar->addWidget(playButton); - //toolbar->addAction(KIcon("media-skip-forward"), i18n("Forward 1 frame"), this, SLOT(slotForwardOneFrame())); - toolbar->addAction(KIcon("media-seek-forward"), i18n("Forward"), this, SLOT(slotForward())); + //m_toolbar->addAction(KIcon("media-skip-forward"), i18n("Forward 1 frame"), this, SLOT(slotForwardOneFrame())); + m_toolbar->addAction(KIcon("media-seek-forward"), i18n("Forward"), this, SLOT(slotForward())); playButton->setDefaultAction(m_playAction); if (name != "chapter") { - QToolButton *configButton = new QToolButton(toolbar); + QToolButton *configButton = new QToolButton(m_toolbar); m_configMenu = new QMenu(i18n("Misc..."), this); configButton->setIcon(KIcon("system-run")); configButton->setMenu(m_configMenu); configButton->setPopupMode(QToolButton::QToolButton::InstantPopup); - toolbar->addWidget(configButton); + m_toolbar->addWidget(configButton); if (name == "clip") { m_markerMenu = new QMenu(i18n("Go to marker..."), this); @@ -128,13 +129,23 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget m_configMenu->addAction(KIcon("transform-scale"), i18n("Resize (50%)"), this, SLOT(slotSetSizeOneToTwo())); } - QWidget *spacer = new QWidget(this); - spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - toolbar->addWidget(spacer); - m_timePos = new TimecodeDisplay(m_monitorManager->timecode(), this); - toolbar->addWidget(m_timePos); - connect(m_timePos, SIGNAL(editingFinished()), this, SLOT(slotSeek())); - layout->addWidget(toolbar); + // Create Volume slider popup + m_volumePopup = new QFrame(this, Qt::Popup); + QVBoxLayout *poplayout = new QVBoxLayout; + poplayout->setContentsMargins(0, 0, 0, 0); + m_audioSlider = new QSlider(Qt::Vertical); + m_audioSlider->setRange(0, 100); + poplayout->addWidget(m_audioSlider); + m_volumePopup->setLayout(poplayout); + KIcon icon; + if (KdenliveSettings::volume() == 0) icon = KIcon("audio-volume-muted"); + else icon = KIcon("audio-volume-medium"); + + m_volumeWidget = m_toolbar->widgetForAction(m_toolbar->addAction(icon, i18n("Audio volume"), this, SLOT(slotShowVolume()))); + + // we need to show / hide the popup once so that it's geometry can be calculated in slotShowVolume + m_volumePopup->show(); + m_volumePopup->hide(); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setLayout(layout); @@ -144,7 +155,7 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget bool monitorCreated = false; #ifdef Q_WS_MAC - createOpenGlWidget(videoBox, profile); + createOpenGlWidget(m_videoBox, profile); monitorCreated = true; //m_glWidget->setFixedSize(width, height); #elif defined (USE_OPEN_GL) @@ -161,7 +172,14 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget render = new Render(m_name, (int) m_monitorRefresh->winId(), profile, this); m_monitorRefresh->setRenderer(render); } +#if defined (USE_OPEN_GL) + else if (m_glWidget) { + lay->addWidget(m_glWidget); + m_videoBox->setLayout(lay); + } +#endif + connect(m_audioSlider, SIGNAL(valueChanged(int)), this, SLOT(slotSetVolume(int))); connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int))); connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int))); connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int))); @@ -179,15 +197,20 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget if (m_monitorRefresh) m_monitorRefresh->show(); if (name == "project") { - m_effectScene = new MonitorScene(render); - m_effectView = new QGraphicsView(m_effectScene, m_videoBox); - lay->addWidget(m_effectView); - m_effectView->setRenderHints(QFlags()); - m_effectView->scale(((double) render->renderWidth()) / render->frameRenderWidth(), 1.0); - m_effectView->setMouseTracking(true); - m_effectScene->setUp(); - m_effectView->hide(); + m_effectWidget = new MonitorEditWidget(render, m_videoBox); + m_toolbar->addAction(m_effectWidget->getVisibilityAction()); + lay->addWidget(m_effectWidget); + m_effectWidget->hide(); } + + QWidget *spacer = new QWidget(this); + spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + m_toolbar->addWidget(spacer); + m_timePos = new TimecodeDisplay(m_monitorManager->timecode(), this); + m_toolbar->addWidget(m_timePos); + connect(m_timePos, SIGNAL(editingFinished()), this, SLOT(slotSeek())); + m_toolbar->setMaximumHeight(s * 1.5); + layout->addWidget(m_toolbar); } Monitor::~Monitor() @@ -195,10 +218,8 @@ Monitor::~Monitor() delete m_ruler; delete m_timePos; delete m_overlay; - if (m_name == "project") { - delete m_effectView; - delete m_effectScene; - } + if (m_effectWidget) + delete m_effectWidget; delete m_monitorRefresh; delete render; } @@ -438,7 +459,7 @@ void Monitor::slotSwitchFullScreen() void Monitor::mouseReleaseEvent(QMouseEvent * event) { if (m_dragStarted) { - if (m_videoBox->underMouse() && (!m_effectView || !m_effectView->isVisible())) { + if (m_videoBox->underMouse() && (!m_effectWidget || !m_effectWidget->isVisible())) { if (isActive()) slotPlay(); else activateMonitor(); } else QWidget::mouseReleaseEvent(event); @@ -796,10 +817,10 @@ void Monitor::slotSetXml(DocClipBase *clip, QPoint zone, const int position) // MLT CONSUMER is broken kDebug(QtWarningMsg) << "ERROR, Cannot start monitor"; } - } else if (position != -1) render->seek(GenTime(position, m_monitorManager->timecode().fps())); + } else if (position != -1) render->seek(position); if (!zone.isNull()) { m_ruler->setZone(zone.x(), zone.y()); - render->seek(GenTime(zone.x(), m_monitorManager->timecode().fps())); + render->seek(zone.x()); } } @@ -830,10 +851,8 @@ void Monitor::resetProfile(const QString profile) m_timePos->updateTimeCode(m_monitorManager->timecode()); if (render == NULL) return; render->resetProfile(profile); - if (m_effectScene) { - m_effectView->scale(((double) render->renderWidth()) / render->frameRenderWidth(), 1.0); - m_effectScene->resetProfile(); - } + if (m_effectWidget) + m_effectWidget->resetProfile(render); } void Monitor::saveSceneList(QString path, QDomElement info) @@ -932,23 +951,46 @@ void Monitor::slotEffectScene(bool show) m_glWidget->setVisible(!show); #endif } - m_effectView->setVisible(show); + m_effectWidget->setVisible(show); + m_effectWidget->getVisibilityAction()->setChecked(show); emit requestFrameForAnalysis(show); if (show) { + m_effectWidget->getScene()->slotZoomFit(); render->doRefresh(); - m_effectScene->slotZoomFit(); } } } -MonitorScene * Monitor::getEffectScene() +MonitorEditWidget* Monitor::getEffectEdit() { - return m_effectScene; + return m_effectWidget; } bool Monitor::effectSceneDisplayed() { - return m_effectView->isVisible(); + return m_effectWidget->isVisible(); +} + +void Monitor::slotSetVolume(int volume) +{ + KdenliveSettings::setVolume(volume); + KIcon icon; + if (volume == 0) icon = KIcon("audio-volume-muted"); + else icon = KIcon("audio-volume-medium"); + static_cast (m_volumeWidget)->setIcon(icon); + render->slotSetVolume(volume); +} + +void Monitor::slotShowVolume() +{ + m_volumePopup->move(mapToGlobal(m_toolbar->geometry().topLeft()) + QPoint(mapToParent(m_volumeWidget->geometry().bottomLeft()).x(), -m_volumePopup->height())); + int vol = render->volume(); + // Disable widget if we cannot get the volume + m_volumePopup->setEnabled(vol != -1); + m_audioSlider->blockSignals(true); + m_audioSlider->setValue(vol); + m_audioSlider->blockSignals(false); + m_volumePopup->show(); } MonitorRefresh::MonitorRefresh(QWidget* parent) : @@ -1051,6 +1093,8 @@ void VideoContainer::wheelEvent(QWheelEvent * event) void VideoContainer::mouseDoubleClickEvent(QMouseEvent * event) { + Q_UNUSED(event); + if (!KdenliveSettings::openglmonitors()) switchFullScreen(); }