#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 <KDebug>
#include <QLabel>
#include <QIntValidator>
#include <QVBoxLayout>
-#include <QGraphicsView>
Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget *parent) :
m_length(0),
m_dragStarted(false),
m_monitorRefresh(NULL),
- m_effectScene(NULL),
- m_effectView(NULL),
+ m_effectWidget(NULL),
m_selectedClip(NULL),
m_loopClipTransition(true)
// 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();
// Monitor ruler
layout->addWidget(m_ruler);
// Tool bar buttons
- QToolBar *toolbar = new QToolBar(name, this);
- toolbar->setIconSize(QSize(s, s));
+ 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);
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);
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()));
- toolbar->setMaximumHeight(s * 1.5);
- 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);
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)
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)));
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<QPainter::RenderHint>());
- 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::Preferred);
+ 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()
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;
}
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);
// 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());
}
}
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)
if (m_monitorRefresh == NULL) {
// Using OpenGL display
#if defined(Q_WS_MAC) || defined(USE_OPEN_GL)
- m_overlay = new Overlay(m_glWidget);
+ if (m_glWidget->layout()) delete m_glWidget->layout();
+ m_overlay = new Overlay();
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->addStretch(10);
+ layout->addWidget(m_overlay);
+ m_glWidget->setLayout(layout);
#endif
} else {
- m_overlay = new Overlay(m_monitorRefresh);
+ if (m_monitorRefresh->layout()) delete m_monitorRefresh->layout();
+ m_overlay = new Overlay();
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->addStretch(10);
+ layout->addWidget(m_overlay);
+ m_monitorRefresh->setLayout(layout);
m_overlay->raise();
m_overlay->setHidden(true);
}
+ checkOverlay();
} else {
delete m_overlay;
m_overlay = NULL;
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 <QToolButton *>(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) :
// MonitorRefresh is used as container for the SDL display (it's window id is passed to SDL)
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_OpaquePaintEvent);
+ setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
//setAttribute(Qt::WA_NoSystemBackground);
}
QLabel(parent)
{
setAttribute(Qt::WA_TransparentForMouseEvents);
- //setAttribute(Qt::WA_OpaquePaintEvent);
- //setAttribute(Qt::WA_NoSystemBackground);
setAutoFillBackground(true);
setBackgroundRole(QPalette::Base);
+ setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
}
+
void Overlay::setOverlayText(const QString &text, bool isZone)
{
setHidden(true);
void VideoContainer::mouseDoubleClickEvent(QMouseEvent * event)
{
+ Q_UNUSED(event);
+
if (!KdenliveSettings::openglmonitors())
switchFullScreen();
}