Пример #1
0
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*)));
    }
Пример #2
0
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);
}