diff --git a/src/Lib/Ass/Syl.cc b/src/Lib/Ass/Syl.cc index 65d29a85cd80ce92f5a259edfed905f59f6440f1..2c5a3d217a8d5a86ceee4d5ee0de88427a2db40b 100644 --- a/src/Lib/Ass/Syl.cc +++ b/src/Lib/Ass/Syl.cc @@ -35,3 +35,9 @@ Syl::getContent() const noexcept { return content; } + +quint64 +Syl::getDuration() const noexcept +{ + return duration; +} diff --git a/src/Lib/Ass/Syl.hh b/src/Lib/Ass/Syl.hh index 461746e90d6f8acf4027ddab62a3fcedf58bdb40..e112eef3a10a00c59cfad1eea6fc60b24d1b2e0d 100644 --- a/src/Lib/Ass/Syl.hh +++ b/src/Lib/Ass/Syl.hh @@ -21,7 +21,7 @@ public: ReadAssTags // Read ass tags }; - explicit Syl(const Syl &) noexcept = default; + //explicit Syl(const Syl &) noexcept = default; // FIXME: define copy contructor explicit Syl(Line *const, const QString &, ConstructMode mode = ConstructMode::ReadAssTags) noexcept; @@ -29,6 +29,7 @@ public: ~Syl() noexcept = default; QString getContent() const noexcept; + quint64 getDuration() const noexcept; private: static quint64 getDurationFromString(const QString &) noexcept; diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc index 5d1b702ae1a2e10fdde1a1e2a62049508eb1d18f..12e2df3ae25b8db396a02748a57371608952820c 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc +++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.cc @@ -4,12 +4,29 @@ #include <QGraphicsScene> #include "TimingUtils.hh" +#include "TimingSyl.hh" +#include "TimingSeparator.hh" using namespace Vivy; -TimingLine::TimingLine(QGraphicsItem *parent) - : QGraphicsItem(parent) +TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent) + : QGraphicsObject(parent) + , line(*lineptr) { + setPos(TimingUtils::posFromMs(int(line.getStart())*10), TimingUtils::axisHeight()); + int currentTime = 0; + QVector<Ass::Syl> syls = line.getContent(); + for (int i = 0; i < syls.size(); ++i){ + int endSyl = currentTime + 10 * int(syls.at(i).getDuration()); + + TimingSyl* timingSyl = new TimingSyl(syls.at(i), currentTime, this); + + // TODO: Here create the TimingSeparator and connect + TimingSeparator* timingSeparatorStart = new TimingSeparator(currentTime, i != 0 ? TimingSeparator::SeparatorStyle::Middle : TimingSeparator::SeparatorStyle::Start, this); + TimingSeparator* timingSeparatorEnd = new TimingSeparator(endSyl, i != syls.size()-1 ? TimingSeparator::SeparatorStyle::Middle : TimingSeparator::SeparatorStyle::End, this); + + currentTime = endSyl; + } } QRectF diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh index 894a1431962ca97380ca56d5ed9844ef67092cc9..6b8be066cb4fce77f0f80294c5264d553e5b54c9 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh +++ b/src/UI/DocumentViews/AudioVisualizer/TimingLine.hh @@ -1,15 +1,21 @@ #pragma once -#include <QGraphicsItem> +#include <QGraphicsObject> + +#include "../../../Lib/Ass/Ass.hh" namespace Vivy { -class TimingLine final : public QGraphicsItem { +class TimingLine final : public QGraphicsObject { + Q_OBJECT public: - explicit TimingLine(QGraphicsItem *parent = nullptr); + explicit TimingLine(Ass::Line*, QGraphicsItem* = nullptr); QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + +private: + Ass::Line line; }; } diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc index 78f5195eb2bc115036225fe4ad1ea351c9505286..53ea04fcdd66a4e6c3dda8e43a43d3ab6d523e58 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc +++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc @@ -20,6 +20,10 @@ #include "TimingUtils.hh" +#include "TimingAxis.hh" +#include "TimingCursor.hh" +#include "TimingLine.hh" + using namespace Vivy; TimingScene::TimingScene(QWidget *parent) noexcept @@ -60,7 +64,7 @@ TimingScene::rebuildScene() TimingUtils::setAudioHeight(pixmap.height()); TimingUtils::setAudioWidth(img.width()); - TimingUtils::setAudioLength(audioStream->getLength()); + TimingUtils::setAudioLength(int(audioStream->getLength())); ax = new TimingAxis(); addItem(ax); @@ -76,7 +80,11 @@ TimingScene::rebuildScene() 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()) {} + if (auto line = lines.at(i).get()) { + TimingLine* timingLine = new TimingLine(line); + addItem(timingLine); + // TODO: Here connect timingLine.linechanged to lineassmodel or something + } } } } diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh index 832923b11650f383b0ab23eea9acef7e22324a65..bfa2f3ba892e61a2d00b3f7a378a7ad63fa061ca 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh +++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh @@ -3,7 +3,6 @@ #include "../../../Lib/Utils.hh" #include "../../../Lib/Audio.hh" #include "../../../Lib/Ass/Ass.hh" -#include "TimingBar.hh" #include "TimingAxis.hh" #include "TimingCursor.hh" diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc index a06827c5a6ddf522d117ac9b542a43c372ea12a1..aae1083b801c13ab279ae2670796b36152d1ed51 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc +++ b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.cc @@ -7,18 +7,56 @@ using namespace Vivy; -TimingSeparator::TimingSeparator(QGraphicsItem *parent) - : QGraphicsItem(parent) +TimingSeparator::TimingSeparator(int time, SeparatorStyle style_, QGraphicsItem* parent) + : QGraphicsObject(parent) + , style(style_) { + setPos(TimingUtils::posFromMs(time), 0); + + switch(style){ + case SeparatorStyle::Start: + pen = QPen(QColor(0, 0, 255)); + break; + case SeparatorStyle::Middle: + pen = QPen(QColor(180, 0, 180)); + break; + case SeparatorStyle::End: + pen = QPen(QColor(255, 0, 0)); + break; + } + // Putting even-size width seems to be undefined behaviour for pixel drawing : stick to odd + pen.setWidth(1); } QRectF TimingSeparator::boundingRect() const { - return QRectF(); + return QRectF(-widthPaw, 0, 2*widthPaw, TimingUtils::audioHeight()); } void TimingSeparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + painter->setPen(pen); + int height = TimingUtils::audioHeight(); + + int top = 1 + pen.width()/2; + int bottom = height - 1 - pen.width()/2; + + painter->drawLine(0, top, 0, bottom); + + switch(style){ + case SeparatorStyle::Start: + painter->drawLine(0, top, widthPaw, top); + painter->drawLine(0, bottom, widthPaw, bottom); + break; + case SeparatorStyle::Middle: + painter->drawLine(-widthPaw, top, widthPaw, top); + painter->drawLine(-widthPaw, bottom, widthPaw, bottom); + break; + case SeparatorStyle::End: + painter->drawLine(-widthPaw, top, 0, top); + painter->drawLine(-widthPaw, bottom, 0, bottom); + break; + } } diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh index a86b8e934c12cefb6a65801bc94819d7530ecac6..72d648c73220e3d8c300ae3f7cc2de10ecb702ef 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh +++ b/src/UI/DocumentViews/AudioVisualizer/TimingSeparator.hh @@ -1,15 +1,28 @@ #pragma once -#include <QGraphicsItem> +#include <QGraphicsObject> namespace Vivy { -class TimingSeparator final : public QGraphicsItem { +class TimingSeparator final : public QGraphicsObject { + Q_OBJECT public: - explicit TimingSeparator(QGraphicsItem *parent = nullptr); + enum class SeparatorStyle { + Start, + Middle, + End + }; + +public: + explicit TimingSeparator(int, SeparatorStyle style = SeparatorStyle::Middle, QGraphicsItem *parent = nullptr); QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + +private: + SeparatorStyle style; + int widthPaw = 5; + QPen pen; }; } diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc index 93dcc959079f430c120777d3f0d4edcdb75e446a..80ec74e14d1939e2b9cc75ac5f39d21b50a8b388 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc +++ b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.cc @@ -4,21 +4,25 @@ #include <QGraphicsScene> #include "TimingUtils.hh" +#include "TimingSeparator.hh" using namespace Vivy; -TimingSyl::TimingSyl(QGraphicsItem *parent) - : QGraphicsItem(parent) +TimingSyl::TimingSyl(Ass::Syl syl_, int startTime, QGraphicsItem *parent) + : QGraphicsObject(parent) + , syl(syl_) { + setPos(TimingUtils::posFromMs(startTime), 0); } QRectF TimingSyl::boundingRect() const { - return QRectF(); + return QRectF(0, 0, int(syl.getDuration()),TimingUtils::audioHeight()); } void TimingSyl::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + painter->drawText(boundingRect(), Qt::AlignCenter, syl.getContent()); } diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh index 768beb42b61ca051baecbfa7c730d35ce0b41505..fcf74aea60089e621e2b2347f52f286b5ad8213c 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh +++ b/src/UI/DocumentViews/AudioVisualizer/TimingSyl.hh @@ -1,15 +1,21 @@ #pragma once -#include <QGraphicsItem> +#include <QGraphicsObject> + +#include "../../../Lib/Ass/Ass.hh" namespace Vivy { -class TimingSyl final : public QGraphicsItem { +class TimingSyl final : public QGraphicsObject { + Q_OBJECT public: - explicit TimingSyl(QGraphicsItem *parent = nullptr); + explicit TimingSyl(Ass::Syl, int, QGraphicsItem *parent = nullptr); QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + +private: + Ass::Syl syl; }; }