File size: 3,717 Bytes
985c397 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | // SPDX-License-Identifier: LGPL-2.1-or-later
/****************************************************************************
* *
* Copyright (c) 2023 Bas Ruigrok (Rexbas) <Rexbas@proton.me> *
* *
* This file is part of FreeCAD. *
* *
* FreeCAD is free software: you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 2.1 of the *
* License, or (at your option) any later version. *
* *
* FreeCAD is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with FreeCAD. If not, see *
* <https://www.gnu.org/licenses/>. *
* *
***************************************************************************/
#include "NavigationAnimator.h"
#include "NavigationAnimation.h"
#include <QEventLoop>
using namespace Gui;
NavigationAnimator::NavigationAnimator()
: activeAnimation(nullptr)
{}
NavigationAnimator::~NavigationAnimator()
{
stop();
}
/**
* @brief Start an animation
*
* @param animation The animation to start
*/
void NavigationAnimator::start(const std::shared_ptr<NavigationAnimation>& animation)
{
stop();
activeAnimation = animation;
activeAnimation->initialize();
connect(activeAnimation.get(), &NavigationAnimation::finished, this, [this]() {
activeAnimation->onStop(true);
activeAnimation.reset();
});
activeAnimation->start();
}
/**
* @brief Start an animation and wait for it to finish
*
* @param animation The animation to start
* @return True if the animation finished, false if interrupted
*/
bool NavigationAnimator::startAndWait(const std::shared_ptr<NavigationAnimation>& animation)
{
stop();
bool finished = true;
QEventLoop loop;
connect(animation.get(), &NavigationAnimation::finished, &loop, &QEventLoop::quit);
connect(animation.get(), &NavigationAnimation::interrupted, &loop, [&finished, &loop]() {
finished = false;
loop.quit();
});
start(animation);
loop.exec();
return finished;
}
/**
* @brief Stops an active animation and releases shared ownership of the animation
*/
void NavigationAnimator::stop()
{
if (activeAnimation && activeAnimation->state() != QAbstractAnimation::State::Stopped) {
disconnect(activeAnimation.get(), &NavigationAnimation::finished, 0, 0);
Q_EMIT activeAnimation->interrupted();
activeAnimation->stop();
activeAnimation->onStop(false);
activeAnimation.reset();
}
}
/**
* @return Whether or not an animation is active
*/
bool NavigationAnimator::isAnimating() const
{
if (activeAnimation != nullptr) {
return activeAnimation->state() == QAbstractAnimation::State::Running;
}
return false;
}
|