//################################################################################################## // // Custom Visualization Core library // Copyright (C) 2011-2013 Ceetron AS // // This library may be used under the terms of either the GNU General Public License or // the GNU Lesser General Public License as follows: // // GNU General Public License Usage // This library is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This library 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 General Public License at <> // for more details. // // GNU Lesser General Public License Usage // This library 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. // // This library 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 at <> // for more details. // //################################################################################################## #include "cafFrameAnimationControl.h" #include namespace caf { //================================================================================================== /// /// \class RIAnimationControl /// /// Animation control class /// //================================================================================================== // Default timeout 100 ms, 10 FPS static const int TIMEOUT_DEFAULT = 100; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- FrameAnimationControl::FrameAnimationControl(QObject* parent) : QObject(parent) { m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), SLOT(slotTimerTriggered())); setDefault(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setDefault() { setCurrentFrame(0); setNumFrames(0); setTimeout(TIMEOUT_DEFAULT); setForward(true); setRepeatFromStart(false); setRepeatFwdBwd(false); // m_lastTimeStamp = 0; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::start() { m_timer->start(m_timeout); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::stop() { m_timer->stop(); emit endAnimation(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::pause() { m_timer->stop(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::stepForward() { if (m_currentFrame < m_numFrames - 1) { m_timer->stop(); setCurrentFrame(m_currentFrame + 1); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::stepBackward() { if (m_currentFrame >= 1) { m_timer->stop(); setCurrentFrame(m_currentFrame - 1); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool FrameAnimationControl::isActive() const { return m_timer->isActive(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setCurrentFrame(int frameIndex) { if (frameIndex >= 0) { m_currentFrame = frameIndex; emit changeFrame(m_currentFrame); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- int FrameAnimationControl::currentFrame() const { return m_currentFrame; } //-------------------------------------------------------------------------------------------------- /// Set current frame without emitting signal /// Used when views are linked and need to update current frame without emitting a signal /// Emitting a signal will cause infinite recursion //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setCurrentFrameOnly(int frameIndex) { if (frameIndex >= 0) { m_currentFrame = frameIndex; } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setNumFrames(int numFrames) { m_numFrames = numFrames < 0 ? 0 : numFrames; emit frameCountChanged(m_numFrames); if (m_currentFrame >= numFrames ) m_currentFrame = 0; // Should we emit frameChanged ? } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- int FrameAnimationControl::numFrames() const { return m_numFrames; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setTimeout(int milliSeconds) { m_timeout = milliSeconds < 0 ? 0 : milliSeconds; if (isActive()) start(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- int FrameAnimationControl::timeout() const { return m_timeout; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setForward(bool forward) { m_forward = forward; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool FrameAnimationControl::forward() const { return m_forward; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setRepeatFromStart(bool turnRepeatOn) { m_repeatFromStart = turnRepeatOn; if (turnRepeatOn) m_repeatFwdBwd = false; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool FrameAnimationControl::isRepeatingFromStart() const { return m_repeatFromStart; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::setRepeatFwdBwd(bool turnRepeatOn) { m_repeatFwdBwd = turnRepeatOn; if (turnRepeatOn) m_repeatFromStart = false; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool FrameAnimationControl::isRepeatingFwdBwd() const { return m_repeatFwdBwd; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotPlayFwd() { setForward(true); start(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotPlayBwd() { setForward(false); start(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotStop() { stop(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotPause() { pause(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotStepForward() { stepForward(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotStepBackward() { stepBackward(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotTimerTriggered() { // Update current frame according to settings if (m_forward) { if (m_currentFrame + 1 >= m_numFrames) { if (m_repeatFromStart) { m_currentFrame = 0; } else if (m_repeatFwdBwd) { setForward(false); m_currentFrame--; } else { m_timer->stop(); m_currentFrame = m_numFrames - 1; } } else { m_currentFrame++; } } else { if (m_currentFrame - 1 < 0) { if (m_repeatFromStart) { m_currentFrame = m_numFrames - 1; } else if (m_repeatFwdBwd) { setForward(true); m_currentFrame++; // Ends up as 1 (second frame) makes 2 1 0 1 2 and not 2 1 0 0 1 2 } else { m_timer->stop(); m_currentFrame = 0; } } else { m_currentFrame--; } } // Emit signal with updated frame index emit changeFrame(m_currentFrame); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::skipToEnd() { m_timer->stop(); setCurrentFrame(m_numFrames-1); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::skipToStart() { m_timer->stop(); setCurrentFrame(0); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotSkipToEnd() { skipToEnd(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotSkipToStart() { skipToStart(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotRepeatFromStart(bool turnRepeatOn) { setRepeatFromStart(turnRepeatOn); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void FrameAnimationControl::slotRepeatFwdBwd(bool turnRepeatOn) { setRepeatFwdBwd(turnRepeatOn); } } // End namespace caf