Monitor::Monitor(Kdenlive::MonitorId id, MonitorManager *manager, QWidget *parent) : AbstractMonitor(id, manager, parent) , render(NULL) , m_controller(NULL) , m_glMonitor(NULL) , m_splitEffect(NULL) , m_splitProducer(NULL) , m_length(2) , m_dragStarted(false) , m_recManager(NULL) , m_loopClipAction(NULL) , m_effectCompare(NULL) , m_sceneVisibilityAction(NULL) , m_contextMenu(NULL) , m_selectedClip(NULL) , m_loopClipTransition(true) , m_editMarker(NULL) , m_forceSizeFactor(0) , m_rootItem(NULL) , m_lastMonitorSceneType(MonitorSceneNone) { QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); // Create container widget m_glWidget = new QWidget; QGridLayout* glayout = new QGridLayout(m_glWidget); glayout->setSpacing(0); glayout->setContentsMargins(0, 0, 0, 0); // Create QML OpenGL widget m_glMonitor = new GLWidget(); m_videoWidget = QWidget::createWindowContainer(qobject_cast<QWindow*>(m_glMonitor)); glayout->addWidget(m_videoWidget, 0, 0); m_verticalScroll = new QScrollBar(Qt::Vertical); glayout->addWidget(m_verticalScroll, 0, 1); m_verticalScroll->hide(); m_horizontalScroll = new QScrollBar(Qt::Horizontal); glayout->addWidget(m_horizontalScroll, 1, 0); m_horizontalScroll->hide(); connect(m_horizontalScroll, SIGNAL(valueChanged(int)), m_glMonitor, SLOT(setOffsetX(int))); connect(m_verticalScroll, SIGNAL(valueChanged(int)), m_glMonitor, SLOT(setOffsetY(int))); connect(m_glMonitor, SIGNAL(frameDisplayed(const SharedFrame&)), this, SLOT(onFrameDisplayed(const SharedFrame&))); connect(m_glMonitor, SIGNAL(mouseSeek(int,bool)), this, SLOT(slotMouseSeek(int,bool))); connect(m_glMonitor, SIGNAL(monitorPlay()), this, SLOT(slotPlay())); connect(m_glMonitor, SIGNAL(startDrag()), this, SLOT(slotStartDrag())); connect(m_glMonitor, SIGNAL(switchFullScreen(bool)), this, SLOT(slotSwitchFullScreen(bool))); connect(m_glMonitor, SIGNAL(zoomChanged()), this, SLOT(setZoom())); connect(m_glMonitor, SIGNAL(effectChanged(QRect)), this, SIGNAL(effectChanged(QRect))); connect(m_glMonitor, SIGNAL(effectChanged(QVariantList)), this, SIGNAL(effectChanged(QVariantList))); if (KdenliveSettings::displayMonitorInfo()) { // Load monitor overlay qml m_glMonitor->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::DataLocation, QStringLiteral("kdenlivemonitor.qml")))); m_rootItem = m_glMonitor->rootObject(); } connect(m_glMonitor, SIGNAL(showContextMenu(QPoint)), this, SLOT(slotShowMenu(QPoint))); m_glWidget->setMinimumSize(QSize(320, 180)); layout->addWidget(m_glWidget, 10); layout->addStretch(); // Get base size for icons int s = style()->pixelMetric(QStyle::PM_SmallIconSize); // Tool bar buttons m_toolbar = new QToolBar(this); m_toolbar->setIconSize(QSize(s, s)); QWidget *sp1 = new QWidget(this); sp1->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); m_toolbar->addWidget(sp1); if (id == Kdenlive::ClipMonitor) { // Add options for recording m_recManager = new RecManager(s, this); connect(m_recManager, &RecManager::warningMessage, this, &Monitor::warningMessage); connect(m_recManager, &RecManager::addClipToProject, this, &Monitor::addClipToProject); } if (id != Kdenlive::DvdMonitor) { m_toolbar->addAction(manager->getAction("mark_in")); m_toolbar->addAction(manager->getAction("mark_out")); } m_toolbar->addAction(manager->getAction("monitor_seek_backward")); QToolButton *playButton = new QToolButton(m_toolbar); m_playMenu = new QMenu(i18n("Play..."), this); m_playAction = static_cast<KDualAction*> (manager->getAction("monitor_play")); m_playMenu->addAction(m_playAction); playButton->setMenu(m_playMenu); playButton->setPopupMode(QToolButton::MenuButtonPopup); m_toolbar->addWidget(playButton); m_toolbar->addAction(manager->getAction("monitor_seek_forward")); playButton->setDefaultAction(m_playAction); m_configMenu = new QMenu(i18n("Misc..."), this); if (id != Kdenlive::DvdMonitor) { if (id == Kdenlive::ClipMonitor) { 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_forceSize = new KSelectAction(QIcon::fromTheme("transform-scale"), i18n("Force Monitor Size"), this); QAction *fullAction = m_forceSize->addAction(QIcon(), i18n("Force 100%")); fullAction->setData(100); QAction *halfAction = m_forceSize->addAction(QIcon(), i18n("Force 50%")); halfAction->setData(50); QAction *freeAction = m_forceSize->addAction(QIcon(), i18n("Free Resize")); freeAction->setData(0); m_configMenu->addAction(m_forceSize); m_forceSize->setCurrentAction(freeAction); connect(m_forceSize, SIGNAL(triggered(QAction*)), this, SLOT(slotForceSize(QAction*))); }
void MouseMachine::buildMachine() { delete machine; machine = NULL; machine = new QStateMachine(this); stIdle = new QState(); stPressed = new QState(); stManScroll = new QState(); stAutoScroll = new QState(); trIdle2Pressed = new QMouseEventTransition(theTarget, QEvent::MouseButtonPress, Qt::LeftButton); trIdle2Pressed->setTargetState(stPressed); connect (trIdle2Pressed, SIGNAL(triggered()), SLOT(slotStartTap())); trDoubleclick = new QMouseEventTransition(theTarget, QEvent::MouseButtonDblClick, Qt::LeftButton); trDoubleclick->setTargetState(stIdle); connect (trDoubleclick, SIGNAL(triggered()), SLOT(slotDoubleTap())); trPressed2Idle = new QMouseEventTransition(theTarget, QEvent::MouseButtonRelease, Qt::LeftButton); trPressed2Idle->setTargetState(stIdle); connect (trPressed2Idle, SIGNAL(triggered()), SLOT(slotPotentialDblclick())); trPressed2Man = new FilteredMouseMoveTransition(false); trPressed2Man->setTargetState(stManScroll); connect (trPressed2Man, SIGNAL(triggered()), SLOT(slotStartDrag())); trTapHold = new QSignalTransition(&tapHoldTimer, SIGNAL(timeout())); trTapHold->setTargetState(stIdle); connect (trTapHold, SIGNAL(triggered()), SLOT(slotTapAndHold())); trManScrolling = new QMouseEventTransition(theTarget, QEvent::MouseMove, Qt::NoButton); connect (trManScrolling, SIGNAL(triggered()), SLOT(slotDrag())); stIdle->addTransition(trIdle2Pressed); stIdle->addTransition(trDoubleclick); stPressed->addTransition(trPressed2Idle); stPressed->addTransition(trPressed2Man); stPressed->addTransition(trTapHold); stManScroll->addTransition(trManScrolling); machine->addState(stIdle); machine->addState(stPressed); machine->addState(stManScroll); if (m_options & MouseMachine::AutoScroll) { trMan2Auto = new QMouseEventTransition(theTarget, QEvent::MouseButtonRelease, Qt::LeftButton); trMan2Auto->setTargetState(stAutoScroll); connect (trMan2Auto, SIGNAL(triggered()), SLOT(slotStartAuto())); trAuto2Man = new QMouseEventTransition(theTarget, QEvent::MouseButtonPress, Qt::LeftButton); trAuto2Man->setTargetState(stManScroll); connect (trAuto2Man, SIGNAL(triggered()), SLOT(slotStartDrag())); trAuto2Idle = new AutoscrollTransition(false); trAuto2Idle->setTargetState(stIdle); // connect (trAuto2Idle, SIGNAL(triggered()), SLOT(slotPotentialDblclick())); stManScroll->addTransition(trMan2Auto); stAutoScroll->addTransition(trAuto2Idle); stAutoScroll->addTransition(trAuto2Man); machine->addState(stAutoScroll); } else { trMan2Idle = new QMouseEventTransition(theTarget, QEvent::MouseButtonRelease, Qt::LeftButton); trMan2Idle->setTargetState(stIdle); // connect (trMan2Idle, SIGNAL(triggered()), SLOT(slotPotentialDblclick())); stManScroll->addTransition(trMan2Idle); } machine->setInitialState(stIdle); }