Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshsimplelevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcell.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toutputproperties.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* int getCurrentSceneFrameCount()
Toshihiro Shimizu 890ddd
  {
Shinya Kitaoka 120a6e
    return 100; //
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->getScene()->getFrameCount();
Toshihiro Shimizu 890ddd
  }*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*void getCurrentScenePlayRange(int &r0, int &r1, int &step)
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    /*
Toshihiro Shimizu 890ddd
    ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Toshihiro Shimizu 890ddd
    scene->getProperties()->getPreviewProperties()->getRange(r0, r1, step);
Toshihiro Shimizu 890ddd
    if(r0>r1)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      r0 = 0;
Toshihiro Shimizu 890ddd
      r1 = scene->getFrameCount()-1;
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
/*   r0 = 0;
Toshihiro Shimizu 890ddd
    r1 = getCurrentSceneFrameCount()-1;
Toshihiro Shimizu 890ddd
  }*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool getCurrentLevelFids(std::vector<tframeid> &fids) {</tframeid>
Shinya Kitaoka 120a6e
  /*
Shinya Kitaoka 120a6e
TXshSimpleLevel *sl = TApp::instance()->getCurrentLevel()->getSimpleLevel();
Shinya Kitaoka 120a6e
if(!sl) return false;
Shinya Kitaoka 120a6e
sl->getFids(fids);
Shinya Kitaoka 120a6e
*/
Shinya Kitaoka 120a6e
  fids.push_back(TFrameId(1));
Shinya Kitaoka 120a6e
  return !fids.empty();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TFrameId getLastLevelFid() { return TFrameId(1); }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TFrameHandle
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFrameHandle::TFrameHandle()
Shinya Kitaoka 120a6e
    : m_frame(-1)
Shinya Kitaoka 120a6e
    , m_fid()
Shinya Kitaoka 120a6e
    , m_timerId(0)
Shinya Kitaoka 120a6e
    , m_previewFrameRate(25)
Shinya Kitaoka 120a6e
    , m_frameType(SceneFrame)
Shinya Kitaoka 120a6e
    , m_looping(false)
Shinya Kitaoka 120a6e
    , m_isPlaying(false)
Shinya Kitaoka 120a6e
    , m_scrubRange(0, -1)
Shinya Kitaoka 120a6e
    , m_audioColumn(0)
Shinya Kitaoka 120a6e
    , m_xsheet(0)
Shinya Kitaoka 120a6e
    , m_fps(0)
Shinya Kitaoka 120a6e
    , m_frame0(-1)
Shinya Kitaoka 120a6e
    , m_frame1(-1) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TFrameHandle::~TFrameHandle() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int TFrameHandle::getFrame() const { return m_frame; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::setCurrentFrame(int frame) {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    // if(!getCurrentLevelFids(fids)) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_fids.size() <= 0) return;
Shinya Kitaoka 120a6e
    if (frame - 1 >= (int)m_fids.size())
Shinya Kitaoka 120a6e
      setFid(m_fids.back());
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      setFid(m_fids[frame - 1]);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    setFrame(frame - 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::setFrame(int frame) {
Shinya Kitaoka 120a6e
  if (m_frame == frame && m_frameType == SceneFrame) return;
Shinya Kitaoka 120a6e
  m_frame = frame;
Shinya Kitaoka 120a6e
  if (m_frameType != SceneFrame) {
Shinya Kitaoka 120a6e
    m_frameType = SceneFrame;
Shinya Kitaoka 120a6e
    emit frameTypeChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  emit frameSwitched();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TFrameId TFrameHandle::getFid() const { return m_fid; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::setFid(const TFrameId &fid) {
Shinya Kitaoka 120a6e
  if (m_fid == fid && m_frameType == LevelFrame) return;
Shinya Kitaoka 120a6e
  m_fid = fid;
Shinya Kitaoka 120a6e
  if (m_frameType != LevelFrame) {
Shinya Kitaoka 120a6e
    m_frameType = LevelFrame;
Shinya Kitaoka 120a6e
    emit frameTypeChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  emit frameSwitched();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::nextFrame() {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    // if(!getCurrentLevelFids(fids)) return;
Shinya Kitaoka 120a6e
    if (m_fids.size() <= 0) return;
Shinya Kitaoka 120a6e
    std::vector<tframeid>::iterator it;</tframeid>
Shinya Kitaoka 120a6e
    it = std::upper_bound(m_fids.begin(), m_fids.end(), m_fid);
Shinya Kitaoka 120a6e
    if (it == m_fids.end()) {
Shinya Kitaoka 120a6e
      // non c'e' nessun frame del livello oltre m_fid. Non vado oltre al primo
Shinya Kitaoka 120a6e
      // frame dopo l'ultimo.
Shinya Kitaoka 120a6e
      // TXshSimpleLevel *sl =
Shinya Kitaoka 120a6e
      // TApp::instance()->getCurrentLevel()->getSimpleLevel();
Shinya Kitaoka 120a6e
      TFrameId fid = m_fids.back();  // sl->index2fid(sl->getFrameCount());
Shinya Kitaoka 120a6e
      setFid(fid);
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      setFid(*it);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    setFrame(m_frame + 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::prevFrame() {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    if (m_fids.size() <= 0) return;
Shinya Kitaoka 120a6e
    std::vector<tframeid>::iterator it;</tframeid>
Shinya Kitaoka 120a6e
    it = std::lower_bound(m_fids.begin(), m_fids.end(), m_fid);
Shinya Kitaoka 120a6e
    // tornando indietro non vado prima del primo frame del livello
Shinya Kitaoka 120a6e
    if (it != m_fids.end() && it != m_fids.begin()) {
Shinya Kitaoka 120a6e
      --it;
Shinya Kitaoka 120a6e
      setFid(*it);
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      // se sono dopo l'ultimo, vado all'ultimo
Shinya Kitaoka 120a6e
      if (!m_fids.empty() && m_fid > m_fids.back()) setFid(m_fids.back());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    if (m_frame > 0) setFrame(m_frame - 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::firstFrame() {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    if (m_fids.size() <= 0) return;
Shinya Kitaoka 120a6e
    setFid(m_fids.front());
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    /*int r0,r1,step;
Shinya Kitaoka 120a6e
getCurrentScenePlayRange(r0,r1,step);*/
Shinya Kitaoka 120a6e
    setFrame(m_frame0);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::lastFrame() {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    if (m_fids.size() <= 0) return;
Shinya Kitaoka 120a6e
    setFid(m_fids.back());
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    /*int r0,r1,step;
Shinya Kitaoka 120a6e
getCurrentScenePlayRange(r0,r1,step);*/
Shinya Kitaoka 120a6e
    if (m_frame1 > 0) setFrame(m_frame1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::setPlaying(bool isPlaying) {
Shinya Kitaoka 120a6e
  if (m_isPlaying == isPlaying) return;
Shinya Kitaoka 120a6e
  m_isPlaying = isPlaying;
Shinya Kitaoka 120a6e
  emit isPlayingStatusChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
#ifdef LEVO
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::startPlaying(bool looping) {
Shinya Kitaoka 120a6e
  if (m_previewFrameRate == 0) return;
Shinya Kitaoka 120a6e
  if (isScrubbing()) stopScrubbing();
Shinya Kitaoka 120a6e
  setTimer(m_previewFrameRate);
Shinya Kitaoka 120a6e
  m_looping = looping;
Shinya Kitaoka 120a6e
  emit playStarted();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::stopPlaying() {
Shinya Kitaoka 120a6e
  if (m_timerId != 0) killTimer(m_timerId);
Shinya Kitaoka 120a6e
  m_timerId = 0;
Shinya Kitaoka 120a6e
  m_looping = false;
Shinya Kitaoka 120a6e
  emit playStopped();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::setTimer(int frameRate) {
Shinya Kitaoka 120a6e
  m_previewFrameRate = frameRate;
Shinya Kitaoka 120a6e
  if (m_timerId != 0) killTimer(m_timerId);
Shinya Kitaoka 120a6e
  int interval = troundp(1000.0 / double(m_previewFrameRate));
Shinya Kitaoka 120a6e
  m_timerId    = startTimer(interval);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::timerEvent(QTimerEvent *event) {
Shinya Kitaoka 120a6e
  assert(isScrubbing());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int elapsedTime = m_clock.elapsed();
Shinya Kitaoka 120a6e
  int frame       = m_scrubRange.first + elapsedTime * m_fps / 1000;
Shinya Kitaoka 120a6e
  int lastFrame   = m_scrubRange.second;
Shinya Kitaoka 120a6e
  if (frame >= lastFrame) {
Shinya Kitaoka 120a6e
    if (m_frame != lastFrame) setFrame(lastFrame);
Shinya Kitaoka 120a6e
    stopScrubbing();
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    setFrame(frame);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int TFrameHandle::getMaxFrameIndex() const {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    if (m_fids.size() <= 0)
Shinya Kitaoka 120a6e
      return -1;
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      return m_fids.size() - 1;
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    // return getCurrentSceneFrameCount()-1;
Shinya Kitaoka 120a6e
    return m_sceneFrameSize - 1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int TFrameHandle::getFrameIndex() const {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    if (m_fids.size() > 0) {
Shinya Kitaoka 120a6e
      std::vector<tframeid>::const_iterator it =</tframeid>
Shinya Kitaoka 120a6e
          std::find(m_fids.begin(), m_fids.end(), m_fid);
Shinya Kitaoka 120a6e
      if (it != m_fids.end())
Shinya Kitaoka 120a6e
        return std::distance(m_fids.begin(), it);
Shinya Kitaoka 120a6e
      else {
Shinya Kitaoka 120a6e
        if (m_fid > m_fids.back())
Shinya Kitaoka 120a6e
          return m_fids.size();
Shinya Kitaoka 120a6e
        else
Shinya Kitaoka 120a6e
          return -1;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      return -1;
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    return m_frame;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QString TFrameHandle::getFrameIndexName(int index) const {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    if (m_fid.getNumber() <= 0)
Shinya Kitaoka 120a6e
      return "";
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      return QString::number(m_fid.getNumber());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    return QString::number(m_frame + 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::setFrameIndex(int index) {
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    // std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    if (m_fids.size() > 0 && 0 <= index && index < (int)m_fids.size())
Shinya Kitaoka 120a6e
      setFid(m_fids[index]);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    setFrame(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::setFrameIndexByName(const QString &str) {
Shinya Kitaoka 120a6e
  int num = str.toInt();
Shinya Kitaoka 120a6e
  if (m_frameType == LevelFrame) {
Shinya Kitaoka 120a6e
    setFid(TFrameId(num));
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    setFrame(num - 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::scrubColumn(int r0, int r1, TXshSoundColumn *audioColumn,
Shinya Kitaoka 120a6e
                               double framePerSecond) {
Shinya Kitaoka 120a6e
  m_audioColumn = audioColumn;
Shinya Kitaoka 120a6e
  if (!scrub(r0, r1, framePerSecond)) m_audioColumn = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::scrubXsheet(int r0, int r1, TXsheet *xsheet,
Shinya Kitaoka 120a6e
                               double framePerSecond) {
Shinya Kitaoka 120a6e
  m_xsheet = xsheet;
Shinya Kitaoka 120a6e
  if (!scrub(r0, r1, framePerSecond)) m_xsheet = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool TFrameHandle::scrub(int r0, int r1, double framePerSecond) {
Shinya Kitaoka 120a6e
  if (isPlaying() || isScrubbing()) return false;
Shinya Kitaoka 120a6e
  bool onlyOneFrame = (r0 == r1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!isScrubbing() || !onlyOneFrame) emit scrubStarted();
Shinya Kitaoka 120a6e
  if (!onlyOneFrame) {
Shinya Kitaoka 120a6e
    m_fps        = framePerSecond;
Shinya Kitaoka 120a6e
    m_scrubRange = std::make_pair(r0, r1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  setFrame(r0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_audioColumn)
Shinya Kitaoka 120a6e
    m_audioColumn->scrub(r0, r1);
Shinya Kitaoka 120a6e
  else if (m_xsheet) {
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = r0; i <= r1; i++) m_xsheet->scrub(i);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (onlyOneFrame) return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_clock.start();
Shinya Kitaoka 120a6e
  m_timerId = startTimer(40);
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TFrameHandle::stopScrubbing() {
Shinya Kitaoka 120a6e
  if (!isScrubbing()) return;
Shinya Kitaoka 120a6e
  if (m_timerId > 0) killTimer(m_timerId);
Shinya Kitaoka 120a6e
  m_timerId                        = 0;
Shinya Kitaoka 120a6e
  m_scrubRange                     = std::make_pair(0, -1);
Shinya Kitaoka 120a6e
  if (m_audioColumn) m_audioColumn = 0;
Shinya Kitaoka 120a6e
  if (m_xsheet) m_xsheet           = 0;
Shinya Kitaoka 120a6e
  m_fps                            = 0;
Shinya Kitaoka 120a6e
  emit scrubStopped();
Toshihiro Shimizu 890ddd
}