Sélectionner une révision Git
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;
}