feat: animation pause and manually step to next frame

Resolve: https://github.com/BLumia/pineapple-pictures/issues/85
This commit is contained in:
2024-11-06 20:28:39 +08:00
parent a993437983
commit 42e3d4c691
6 changed files with 59 additions and 1 deletions

View File

@ -21,6 +21,9 @@ public:
: QGraphicsPixmapItem(pixmap, parent)
{}
enum { Type = UserType + 1 };
int type() const override { return Type; }
void setScaleHint(float scaleHint) {
m_scaleHint = scaleHint;
}
@ -61,6 +64,9 @@ class PGraphicsMovieItem : public QGraphicsItem
public:
PGraphicsMovieItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) {}
enum { Type = UserType + 2 };
int type() const override { return Type; }
void setMovie(QMovie* movie) {
if (m_movie) m_movie->disconnect();
m_movie.reset(movie);
@ -80,6 +86,10 @@ public:
}
}
inline QMovie * movie() const {
return m_movie.data();
}
private:
QScopedPointer<QMovie> m_movie;
};
@ -158,6 +168,29 @@ bool GraphicsScene::trySetTransformationMode(Qt::TransformationMode mode, float
return false;
}
bool GraphicsScene::togglePauseAnimation()
{
PGraphicsMovieItem * animatedItem = qgraphicsitem_cast<PGraphicsMovieItem *>(m_theThing);
if (animatedItem) {
animatedItem->movie()->setPaused(animatedItem->movie()->state() != QMovie::Paused);
return true;
}
return false;
}
bool GraphicsScene::skipAnimationFrame(int delta)
{
PGraphicsMovieItem * animatedItem = qgraphicsitem_cast<PGraphicsMovieItem *>(m_theThing);
if (animatedItem) {
const int frameCount = animatedItem->movie()->frameCount();
const int currentFrame = animatedItem->movie()->currentFrameNumber();
const int targetFrame = (currentFrame + delta) % frameCount;
animatedItem->movie()->setPaused(true);
return animatedItem->movie()->jumpToFrame(targetFrame);
}
return false;
}
QPixmap GraphicsScene::renderToPixmap()
{
PGraphicsPixmapItem * pixmapItem = qgraphicsitem_cast<PGraphicsPixmapItem *>(m_theThing);