Skip to content
Extraits de code Groupes Projets
Valider c54ee904 rédigé par Elliu's avatar Elliu
Parcourir les fichiers

Fix drag-and drop for start of line bar

parent fac42388
Branches
Étiquettes
1 requête de fusion!29Improve timingView with display of the ASS lines
...@@ -12,8 +12,6 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent) ...@@ -12,8 +12,6 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent)
, line(*lineptr) , line(*lineptr)
{ {
setPos(TimingUtils::posFromMs(int(line.getStart()) * 10), TimingUtils::axisHeight()); setPos(TimingUtils::posFromMs(int(line.getStart()) * 10), TimingUtils::axisHeight());
originalX = pos().x();
originalY = pos().y();
int currentTime = 0; int currentTime = 0;
int endSyl = 0; int endSyl = 0;
int i; int i;
...@@ -23,6 +21,8 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent) ...@@ -23,6 +21,8 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent)
seps.append(timingSeparatorStart); seps.append(timingSeparatorStart);
connect(timingSeparatorStart, &TimingSeparator::positionChanged, this, connect(timingSeparatorStart, &TimingSeparator::positionChanged, this,
&TimingLine::timingSeparatorHasChanged); &TimingLine::timingSeparatorHasChanged);
connect(timingSeparatorStart, &TimingSeparator::enterPress, this, &TimingLine::sepEnterPress);
connect(timingSeparatorStart, &TimingSeparator::exitPress, this, &TimingLine::sepExitPress);
QVector<Ass::Syl> syls = line.getContent(); QVector<Ass::Syl> syls = line.getContent();
for (i = 0; i < syls.size(); ++i) { for (i = 0; i < syls.size(); ++i) {
...@@ -38,6 +38,9 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent) ...@@ -38,6 +38,9 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent)
seps.append(timingSeparator); seps.append(timingSeparator);
connect(timingSeparator, &TimingSeparator::positionChanged, this, connect(timingSeparator, &TimingSeparator::positionChanged, this,
&TimingLine::timingSeparatorHasChanged); &TimingLine::timingSeparatorHasChanged);
connect(timingSeparator, &TimingSeparator::enterPress, this,
&TimingLine::sepEnterPress);
connect(timingSeparator, &TimingSeparator::exitPress, this, &TimingLine::sepExitPress);
} }
currentTime = endSyl; currentTime = endSyl;
...@@ -48,19 +51,23 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent) ...@@ -48,19 +51,23 @@ TimingLine::TimingLine(Ass::Line *lineptr, QGraphicsItem *parent)
seps.append(timingSeparatorEnd); seps.append(timingSeparatorEnd);
connect(timingSeparatorEnd, &TimingSeparator::positionChanged, this, connect(timingSeparatorEnd, &TimingSeparator::positionChanged, this,
&TimingLine::timingSeparatorHasChanged); &TimingLine::timingSeparatorHasChanged);
connect(timingSeparatorEnd, &TimingSeparator::enterPress, this, &TimingLine::sepEnterPress);
connect(timingSeparatorEnd, &TimingSeparator::exitPress, this, &TimingLine::sepExitPress);
} }
QRectF QRectF
TimingLine::boundingRect() const TimingLine::boundingRect() const
{ {
return QRectF(0, 0, TimingUtils::posFromMs(int(10 * (line.getEnd() - line.getStart()))), return QRectF(tempOffset, 0,
TimingUtils::posFromMs(int(10 * (line.getEnd() - line.getStart()))),
TimingUtils::audioHeight()); TimingUtils::audioHeight());
} }
void void
TimingLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) TimingLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{ {
painter->fillRect(QRectF(0, 0, painter->fillRect(
QRectF(tempOffset, 0,
TimingUtils::posFromMs(int(10 * (line.getEnd() - line.getStart()))), TimingUtils::posFromMs(int(10 * (line.getEnd() - line.getStart()))),
TimingUtils::audioHeight()), TimingUtils::audioHeight()),
QColor(0, 255, 255, 50)); QColor(0, 255, 255, 50));
...@@ -71,6 +78,36 @@ TimingLine::timingSeparatorHasChanged(int sylIndex, qreal x) ...@@ -71,6 +78,36 @@ TimingLine::timingSeparatorHasChanged(int sylIndex, qreal x)
{ {
} }
void
TimingLine::sepEnterPress(int sepIndex)
{
}
void
TimingLine::sepExitPress(int sepIndex)
{
if (tempOffset) {
prepareGeometryChange();
if (sepIndex == 0) {
moveBy(tempOffset, 0);
timingSyls[sepIndex]->setPos(0, 0);
seps[sepIndex]->silentlySetPos(0, 0);
for (int i = 1; i < timingSyls.size(); i++) {
timingSyls[i]->moveBy(-tempOffset, 0);
}
for (int i = 1; i < seps.size(); i++) {
seps[i]->silentlyMoveBy(-tempOffset, 0);
}
line.setStart(quint64(TimingUtils::msFromPos(mapToScene(0, 0).x()) / 10));
}
}
tempOffset = 0;
}
qreal qreal
TimingLine::requestMove(int sepIndex, qreal x) TimingLine::requestMove(int sepIndex, qreal x)
{ {
...@@ -92,12 +129,14 @@ TimingLine::requestMove(int sepIndex, qreal x) ...@@ -92,12 +129,14 @@ TimingLine::requestMove(int sepIndex, qreal x)
if (ret > maxi) if (ret > maxi)
ret = maxi; ret = maxi;
tempOffset = ret;
quint64 dur1 = quint64(TimingUtils::msFromPos(int(seps[1]->pos().x() - ret)) / 10); quint64 dur1 = quint64(TimingUtils::msFromPos(int(seps[1]->pos().x() - ret)) / 10);
(*syls)[0].setDuration(dur1); (*syls)[0].setDuration(dur1);
timingSyls[0]->setLen(dur1); timingSyls[0]->setLen(dur1);
setPos(originalX + ret, originalY); timingSyls[0]->setPos(ret, 0);
line.setStart(line.getStart() + line.setStart(
quint64(TimingUtils::msFromPos(int(originalX) + int(ret) / 10))); quint64(TimingUtils::msFromPos(mapToScene(seps[0]->pos().x(), 0).x()) / 10));
} }
else if (sepIndex >= syls->size()) { else if (sepIndex >= syls->size()) {
......
...@@ -20,14 +20,16 @@ private: ...@@ -20,14 +20,16 @@ private:
Ass::Line line; Ass::Line line;
QVector<TimingSeparator *> seps; QVector<TimingSeparator *> seps;
QVector<TimingSyl *> timingSyls; QVector<TimingSyl *> timingSyls;
int originalX;
int originalY; qreal tempOffset{ 0 };
public: public:
qreal requestMove(int, qreal); qreal requestMove(int, qreal);
public slots: public slots:
void timingSeparatorHasChanged(int, qreal); void timingSeparatorHasChanged(int, qreal);
void sepEnterPress(int);
void sepExitPress(int);
}; };
} }
...@@ -15,6 +15,7 @@ TimingSeparator::TimingSeparator(int time, int index, SeparatorStyle style_, Tim ...@@ -15,6 +15,7 @@ TimingSeparator::TimingSeparator(int time, int index, SeparatorStyle style_, Tim
, sepIndex(index) , sepIndex(index)
, parentTimingLine(parent) , parentTimingLine(parent)
{ {
qDebug() << time;
setPos(TimingUtils::posFromMs(time), 0); setPos(TimingUtils::posFromMs(time), 0);
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
...@@ -63,18 +64,46 @@ TimingSeparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option ...@@ -63,18 +64,46 @@ TimingSeparator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option
} }
} }
void
TimingSeparator::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
emit enterPress(sepIndex);
QGraphicsObject::mousePressEvent(event);
}
void
TimingSeparator::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
emit exitPress(sepIndex);
QGraphicsObject::mouseReleaseEvent(event);
}
void
TimingSeparator::silentlySetPos(int x, int y)
{
inhibMove = true;
setPos(x, y);
inhibMove = false;
}
void
TimingSeparator::silentlyMoveBy(int x, int y)
{
inhibMove = true;
moveBy(x, y);
inhibMove = false;
}
QVariant QVariant
TimingSeparator::itemChange(GraphicsItemChange change, const QVariant &value) noexcept TimingSeparator::itemChange(GraphicsItemChange change, const QVariant &value) noexcept
{ {
if (change == ItemPositionChange) { if (change == ItemPositionChange && !inhibMove) {
qreal destination = value.toPointF().x(); qreal destination = value.toPointF().x();
destination = parentTimingLine->requestMove(sepIndex, destination); destination = parentTimingLine->requestMove(sepIndex, destination);
if (style == SeparatorStyle::Start)
destination = 0;
emit positionChanged(sepIndex, destination); emit positionChanged(sepIndex, destination);
return QPointF(destination, 0); return QPointF(destination, 0);
} }
return QGraphicsObject::itemChange(change, value); return QGraphicsObject::itemChange(change, value);
} }
...@@ -25,11 +25,21 @@ private: ...@@ -25,11 +25,21 @@ private:
int sepIndex; int sepIndex;
TimingLine *parentTimingLine; TimingLine *parentTimingLine;
bool inhibMove{ false };
signals: signals:
void positionChanged(int, qreal); void positionChanged(int, qreal);
void enterPress(int);
void exitPress(int);
protected: protected:
QVariant itemChange(GraphicsItemChange change, const QVariant &value) noexcept override; QVariant itemChange(GraphicsItemChange change, const QVariant &value) noexcept override;
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
public:
void silentlySetPos(int, int);
void silentlyMoveBy(int, int);
}; };
} }
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter