Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • ea85385cca10abd5c83f45a3abdbb6940690c0e1
  • master par défaut
  • script
  • new-devel
  • devel
  • timingView-edit
  • fix-mpv
7 résultats

TimingScene.cc

Blame
  • TimingScene.cc 4,04 Kio
    #include "TimingScene.hh"
    
    #include "../../Lib/Utils.hh"
    #include "../../Lib/Ass/Ass.hh"
    #include "../../Lib/Document/VivyDocument.hh"
    
    #include <QGraphicsLineItem>
    #include <QGraphicsPixmapItem>
    #include <QGraphicsView>
    #include <QLabel>
    #include <QMessageBox>
    #include <QMouseEvent>
    #include <QPainter>
    #include <QGraphicsSceneMouseEvent>
    #include <QScrollArea>
    #include <QScrollBar>
    #include <QVBoxLayout>
    
    using namespace Vivy;
    
    TimingScene::TimingScene(QWidget *parent) noexcept
        : QGraphicsScene(parent)
    {
    }
    
    TimingScene::TimingScene(QImage img_, AudioContext::StreamPtr stream, QWidget *parent) noexcept
        : QGraphicsScene(parent)
        , img(img_)
        , audioStream(stream)
    {
        QPixmap pixmap(QPixmap::fromImage(img));
        backgroundImg = addPixmap(pixmap);
        ax = new TimingAxis(stream, 0, pixmap.width(), 10);
        addItem(ax);
    
        ax->refreshTicks();
    
        if (auto assDocument = currentVivyDocument->getAssSubDocument()){
            QVector<Ass::LinePtr> lines = assDocument->getLines();
            for (int i = 0; i < lines.size(); ++i) {
                if (auto line = lines.at(i).get()){
                    qreal xstart = posFromTime(line->getStart());
                    TimingBar* bar = new TimingBar(QLine(int(xstart), 30, int(xstart), int(height())), QColor(127,0,0));
                    bar->setZValue(10);
                    addItem(bar);
                    qreal xend = posFromTime(line->getEnd());
                    bar = new TimingBar(QLine(int(xend), 30, int(xend), int(height())), QColor(127,0,0));
                    bar->setZValue(10);
                    addItem(bar);
                    QGraphicsRectItem* rect = new QGraphicsRectItem(xstart, 30, xend-xstart, int(height())-30);
                    addItem(rect);
                    rect->setBrush(Qt::blue);
                    rect->setOpacity(0.1);
                    QGraphicsTextItem* text = new QGraphicsTextItem(line->getContentAsText());
                    addItem(text);
                    text->setZValue(5);
                    text->setTextWidth(xend-xstart-10);
                    text->setPos(xstart+5, 30+(height()-30)/2);
                }
            }
        }
    }
    
    void
    TimingScene::mousePressEvent(QGraphicsSceneMouseEvent *event) noexcept
    {
        QPointF pos        = event->scenePos();
        QGraphicsItem *got = itemAt(pos, QTransform());
        Ass::LinePtr p     = currentLine.lock();
    
        if (p && (got == nullptr || got == backgroundImg)) {
            // Handle the different cases
            if (timingMode == TimingMode::Line)
                handleMousePressEventLine(event, p);
            else if (timingMode == TimingMode::Syl)
                handleMousePressEventSyl(event, p);
            else if (timingMode == TimingMode::Char)
                handleMousePressEventChar(event, p);
        }
    
        QGraphicsScene::mousePressEvent(event);
    }
    
    void
    TimingScene::handleMousePressEventLine(QGraphicsSceneMouseEvent *event, Ass::LinePtr p) noexcept
    {
        QPointF pos  = event->scenePos();
        quint64 time = timeFromPos(pos.x());
    
        if (const auto &btn = event->button(); btn == Qt::LeftButton) {
            p->setStart(time);
        } else if (btn == Qt::RightButton) {
            p->setEnd(time);
        }
    }
    
    void
    TimingScene::handleMousePressEventSyl(QGraphicsSceneMouseEvent *, Ass::LinePtr) noexcept
    {
    }
    
    void
    TimingScene::handleMousePressEventChar(QGraphicsSceneMouseEvent *, Ass::LinePtr) noexcept
    {
    }
    
    quint64
    TimingScene::timeFromPos(qreal x) const noexcept
    {
        return timeFromPos(quint64(x));
    }
    
    quint64
    TimingScene::timeFromPos(quint64 x) const noexcept
    {
        if (const quint64 w = quint64(width()); x <= 0 || w <= 0) {
            qCritical() << "Try avoid possible divide by zero in the time from position";
            return 0;
        } else {
            return x * audioStream->getLength() / w;
        }
    }
    
    qreal
    TimingScene::posFromTime(quint64 t) const noexcept
    {
        if (const quint64 w = quint64(width()); t <= 0 || w <= 0) {
            qCritical() << "Try avoid possible divide by zero in the position from time";
            return 0;
        } else {
            return 10 * t * w / audioStream->getLength();
        }
    }
    
    QGraphicsPixmapItem *
    TimingScene::bg() noexcept
    {
        return backgroundImg;
    }
    
    TimingAxis *
    TimingScene::getAxis()
    {
        return ax;
    }