Jeremy Bullock f15907
#include "stopmotion.h"
Jeremy Bullock f15907
Jeremy Bullock f15907
// TnzCore includes
Jeremy Bullock f15907
#include "menubarcommandids.h"
Jeremy Bullock f15907
#include "tapp.h"
Jeremy Bullock f15907
#include "tenv.h"
Jeremy Bullock f15907
#include "tsystem.h"
Jeremy Bullock f15907
#include "filebrowsermodel.h"
Jeremy Bullock f15907
#include "penciltestpopup.h"
Jeremy Bullock f15907
#include "tlevel_io.h"
Jeremy Bullock f15907
#include "toutputproperties.h"
shun-iwasawa 31accf
#include "filebrowserpopup.h"
shun-iwasawa 31accf
#include "tunit.h"
Jeremy Bullock f15907
Jeremy Bullock f15907
#include "toonz/namebuilder.h"
Jeremy Bullock f15907
#include "toonz/preferences.h"
Jeremy Bullock f15907
#include "toonz/tcamera.h"
Jeremy Bullock f15907
#include "toonz/tcolumnhandle.h"
Jeremy Bullock f15907
#include "toonz/tframehandle.h"
Jeremy Bullock f15907
#include "toonz/levelset.h"
Jeremy Bullock f15907
#include "toonz/sceneproperties.h"
Jeremy Bullock f15907
#include "toonz/toonzscene.h"
Jeremy Bullock f15907
#include "toonz/tscenehandle.h"
Jeremy Bullock f15907
#include "toonz/stage.h"
Jeremy Bullock f15907
#include "toonz/txsheethandle.h"
Jeremy Bullock f15907
#include "toonz/txshlevelhandle.h"
Jeremy Bullock f15907
#include "toonz/levelproperties.h"
Jeremy Bullock f15907
#include "toonz/tstageobjecttree.h"
Jeremy Bullock f15907
#include "toonzqt/menubarcommand.h"
Jeremy Bullock f15907
Jeremy Bullock f15907
#include <qapplication></qapplication>
Jeremy Bullock f15907
#include <qcamera></qcamera>
Jeremy Bullock f15907
#include <qcamerainfo></qcamerainfo>
Jeremy Bullock f15907
#include <qcoreapplication></qcoreapplication>
Jeremy Bullock f15907
#include <qdesktopwidget></qdesktopwidget>
Jeremy Bullock f15907
#include <qdialog></qdialog>
Jeremy Bullock f15907
#include <qfile></qfile>
Jeremy Bullock f15907
#include <qstring></qstring>
Jeremy Bullock f15907
#include <qtimer></qtimer>
shun-iwasawa 31accf
#include <qxmlstreamwriter></qxmlstreamwriter>
shun-iwasawa 31accf
#include <qxmlstreamreader></qxmlstreamreader>
Jeremy Bullock f15907
Jeremy Bullock f15907
// Connected camera
Jeremy Bullock f15907
TEnv::IntVar StopMotionOpacity("StopMotionOpacity", 100);
Jeremy Bullock f15907
TEnv::IntVar StopMotionAlwaysLiveView("StopMotionAlwaysLiveView", 0);
Jeremy Bullock f15907
TEnv::IntVar StopMotionPlaceOnXSheet("StopMotionPlaceOnXSheet", 1);
Jeremy Bullock f15907
TEnv::IntVar StopMotionReviewTime("StopMotionReviewTime", 1);
Jeremy Bullock f15907
TEnv::IntVar StopMotionUseNumpad("StopMotionUseNumpad", 0);
shun-iwasawa 31accf
TEnv::IntVar StopMotionDrawBeneathLevels("StopMotionDrawBeneathLevels", 1);
Jeremy Bullock f15907
Jeremy Bullock f15907
// Connected camera
Jeremy Bullock f15907
TEnv::StringVar StopMotionCameraName("CamCapCameraName", "");
Jeremy Bullock f15907
// Camera resolution
Jeremy Bullock f15907
TEnv::StringVar StopMotionCameraResolution("CamCapCameraResolution", "");
Jeremy Bullock f15907
Jeremy Bullock f15907
namespace {
Jeremy Bullock f15907
Jeremy Bullock f15907
TPointD getCurrentCameraDpi() {
Jeremy Bullock f15907
  TCamera *camera =
Jeremy Bullock f15907
      TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera();
Jeremy Bullock f15907
  TDimensionD size = camera->getSize();
Jeremy Bullock f15907
  TDimension res   = camera->getRes();
Jeremy Bullock f15907
  return TPointD(res.lx / size.lx, res.ly / size.ly);
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
bool findCell(TXsheet *xsh, int col, const TXshCell &targetCell,
Jeremy Bullock f15907
              int &bottomRowWithTheSameLevel) {
Jeremy Bullock f15907
  bottomRowWithTheSameLevel = -1;
Jeremy Bullock f15907
  TXshColumnP column        = const_cast<txsheet *="">(xsh)->getColumn(col);</txsheet>
Jeremy Bullock f15907
  if (!column) return false;
Jeremy Bullock f15907
Jeremy Bullock f15907
  TXshCellColumn *cellColumn = column->getCellColumn();
Jeremy Bullock f15907
  if (!cellColumn) return false;
Jeremy Bullock f15907
Jeremy Bullock f15907
  int r0, r1;
Jeremy Bullock f15907
  if (!cellColumn->getRange(r0, r1)) return false;
Jeremy Bullock f15907
Jeremy Bullock f15907
  for (int r = r0; r <= r1; r++) {
Jeremy Bullock f15907
    TXshCell cell = cellColumn->getCell(r);
Jeremy Bullock f15907
    if (cell == targetCell) {
Jeremy Bullock f15907
      bottomRowWithTheSameLevel = r;
Jeremy Bullock f15907
      return true;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    if (cell.m_level == targetCell.m_level) bottomRowWithTheSameLevel = r;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  return false;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
QChar numToLetter(int letterNum) {
Jeremy Bullock f15907
  switch (letterNum) {
Jeremy Bullock f15907
  case 0:
Jeremy Bullock f15907
    return QChar();
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 1:
Jeremy Bullock f15907
    return 'A';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 2:
Jeremy Bullock f15907
    return 'B';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 3:
Jeremy Bullock f15907
    return 'C';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 4:
Jeremy Bullock f15907
    return 'D';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 5:
Jeremy Bullock f15907
    return 'E';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 6:
Jeremy Bullock f15907
    return 'F';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 7:
Jeremy Bullock f15907
    return 'G';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 8:
Jeremy Bullock f15907
    return 'H';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  case 9:
Jeremy Bullock f15907
    return 'I';
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  default:
Jeremy Bullock f15907
    return QChar();
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
QString convertToFrameWithLetter(int value, int length = -1) {
Jeremy Bullock f15907
  QString str;
Jeremy Bullock f15907
  str.setNum((int)(value / 10));
Jeremy Bullock f15907
  while (str.length() < length) str.push_front("0");
Jeremy Bullock f15907
  QChar letter = numToLetter(value % 10);
Jeremy Bullock f15907
  if (!letter.isNull()) str.append(letter);
Jeremy Bullock f15907
  return str;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
QString fidsToString(const std::vector<tframeid> &fids,</tframeid>
Jeremy Bullock f15907
                     bool letterOptionEnabled) {
Jeremy Bullock f15907
  if (fids.empty()) return StopMotion::tr("No", "frame id");
Jeremy Bullock f15907
  QString retStr("");
Jeremy Bullock f15907
  if (letterOptionEnabled) {
Jeremy Bullock f15907
    bool beginBlock = true;
Jeremy Bullock f15907
    for (int f = 0; f < fids.size() - 1; f++) {
Jeremy Bullock f15907
      int num      = fids[f].getNumber();
Jeremy Bullock f15907
      int next_num = fids[f + 1].getNumber();
Jeremy Bullock f15907
Jeremy Bullock f15907
      if (num % 10 == 0 && num + 10 == next_num) {
Jeremy Bullock f15907
        if (beginBlock) {
Jeremy Bullock f15907
          retStr += convertToFrameWithLetter(num) + " - ";
Jeremy Bullock f15907
          beginBlock = false;
Jeremy Bullock f15907
        }
Jeremy Bullock f15907
      } else {
Jeremy Bullock f15907
        retStr += convertToFrameWithLetter(num) + ", ";
Jeremy Bullock f15907
        beginBlock = true;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    retStr += convertToFrameWithLetter(fids.back().getNumber());
Jeremy Bullock f15907
  } else {
Jeremy Bullock f15907
    bool beginBlock = true;
Jeremy Bullock f15907
    for (int f = 0; f < fids.size() - 1; f++) {
Jeremy Bullock f15907
      int num      = fids[f].getNumber();
Jeremy Bullock f15907
      int next_num = fids[f + 1].getNumber();
Jeremy Bullock f15907
      if (num + 1 == next_num) {
Jeremy Bullock f15907
        if (beginBlock) {
Jeremy Bullock f15907
          retStr += QString::number(num) + " - ";
Jeremy Bullock f15907
          beginBlock = false;
Jeremy Bullock f15907
        }
Jeremy Bullock f15907
      } else {
Jeremy Bullock f15907
        retStr += QString::number(num) + ", ";
Jeremy Bullock f15907
        beginBlock = true;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    retStr += QString::number(fids.back().getNumber());
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  return retStr;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
bool getRasterLevelSize(TXshLevel *level, TDimension &dim) {
Jeremy Bullock f15907
  std::vector<tframeid> fids;</tframeid>
Jeremy Bullock f15907
  level->getFids(fids);
Jeremy Bullock f15907
  if (fids.empty()) return false;
Jeremy Bullock f15907
  TXshSimpleLevel *simpleLevel = level->getSimpleLevel();
Jeremy Bullock f15907
  if (!simpleLevel) return false;
Jeremy Bullock f15907
  TRasterImageP rimg = (TRasterImageP)simpleLevel->getFrame(fids[0], false);
Jeremy Bullock f15907
  if (!rimg || rimg->isEmpty()) return false;
Jeremy Bullock f15907
Jeremy Bullock f15907
  dim = rimg->getRaster()->getSize();
Jeremy Bullock f15907
  return true;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
};  // namespace
Jeremy Bullock f15907
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
StopMotion::StopMotion() {
shun-iwasawa 31accf
  m_opacity = StopMotionOpacity;
Jeremy Bullock f15907
shun-iwasawa 31accf
  m_webcam = new Webcam();
shun-iwasawa 31accf
  m_canon  = Canon::instance();
shun-iwasawa 31accf
  m_serial = new StopMotionSerial();
shun-iwasawa 31accf
  m_light  = new StopMotionLight();
Jeremy Bullock f15907
shun-iwasawa 31accf
  m_alwaysLiveView = StopMotionAlwaysLiveView;
Jeremy Bullock f15907
Jeremy Bullock f15907
  m_placeOnXSheet      = StopMotionPlaceOnXSheet;
Jeremy Bullock f15907
  m_reviewTime         = StopMotionReviewTime;
Jeremy Bullock f15907
  m_useNumpadShortcuts = StopMotionUseNumpad;
shun-iwasawa 31accf
  m_drawBeneathLevels  = StopMotionDrawBeneathLevels;
Jeremy Bullock f15907
  m_numpadForStyleSwitching =
Jeremy Bullock f15907
      Preferences::instance()->isUseNumpadForSwitchingStylesEnabled();
Jeremy Bullock f15907
  setUseNumpadShortcuts(m_useNumpadShortcuts);
Jeremy Bullock f15907
  m_turnOnRewind = Preferences::instance()->rewindAfterPlaybackEnabled();
Jeremy Bullock f15907
  m_timer        = new QTimer(this);
Jeremy Bullock f15907
  m_reviewTimer  = new QTimer(this);
Jeremy Bullock f15907
  m_reviewTimer->setSingleShot(true);
shun-iwasawa 31accf
  m_intervalTimer      = new QTimer(this);
shun-iwasawa 31accf
  m_countdownTimer     = new QTimer(this);
shun-iwasawa 31accf
  m_webcamOverlayTimer = new QTimer(this);
Jeremy Bullock f15907
shun-iwasawa 31accf
  // Make the interval timer single-shot. When the capture finished, restart
shun-iwasawa 31accf
  // timer for next frame.
shun-iwasawa 31accf
  // This is because capturing and saving the image needs some time.
shun-iwasawa 31accf
  m_intervalTimer->setSingleShot(true);
shun-iwasawa 31accf
  m_webcamOverlayTimer->setSingleShot(true);
Jeremy Bullock f15907
Jeremy Bullock f15907
  TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
Jeremy Bullock f15907
  TSceneHandle *sceneHandle   = TApp::instance()->getCurrentScene();
Jeremy Bullock f15907
  TFrameHandle *frameHandle   = TApp::instance()->getCurrentFrame();
Jeremy Bullock f15907
  bool ret                    = true;
Jeremy Bullock f15907
Jeremy Bullock f15907
  ret = ret &&
Jeremy Bullock f15907
        connect(xsheetHandle, SIGNAL(xsheetSwitched()), this, SLOT(update()));
Jeremy Bullock f15907
  ret = ret && connect(m_reviewTimer, SIGNAL(timeout()), this,
Jeremy Bullock f15907
                       SLOT(onReviewTimeout()));
Jeremy Bullock f15907
  ret = ret && connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
shun-iwasawa 31accf
Jeremy Bullock f15907
  ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this,
Jeremy Bullock f15907
                       SLOT(onSceneSwitched()));
Jeremy Bullock f15907
  ret = ret && connect(frameHandle, SIGNAL(isPlayingStatusChanged()), this,
Jeremy Bullock f15907
                       SLOT(onPlaybackChanged()));
shun-iwasawa 31accf
  ret = ret && connect(m_intervalTimer, SIGNAL(timeout()), this,
shun-iwasawa 31accf
                       SLOT(onIntervalCaptureTimerTimeout()));
shun-iwasawa 31accf
  ret = ret && connect(m_webcamOverlayTimer, SIGNAL(timeout()), this,
shun-iwasawa 31accf
                       SLOT(captureWebcamOnTimeout()));
shun-iwasawa 31accf
  ret = ret && connect(m_canon, SIGNAL(newCanonImageReady()), this,
shun-iwasawa 31accf
                       SLOT(importImage()));
shun-iwasawa 31accf
  assert(ret);
shun-iwasawa 31accf
  ret = ret && connect(m_canon, SIGNAL(canonCameraChanged(QString)), this,
shun-iwasawa 31accf
                       SLOT(onCanonCameraChanged(QString)));
Jeremy Bullock f15907
  assert(ret);
Jeremy Bullock f15907
Jeremy Bullock f15907
  ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Jeremy Bullock f15907
Jeremy Bullock f15907
  setToNextNewLevel();
Jeremy Bullock f15907
  m_filePath = scene->getDefaultLevelPath(OVL_TYPE, m_levelName.toStdWString())
Jeremy Bullock f15907
                   .getParentDir()
Jeremy Bullock f15907
                   .getQString();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
StopMotion::~StopMotion() {
shun-iwasawa 31accf
  disconnectAllCameras();
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  m_canon->closeAll();
shun-iwasawa 31accf
#endif
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::onSceneSwitched() {
shun-iwasawa 31accf
  disconnectAllCameras();
shun-iwasawa 31accf
Jeremy Bullock f15907
  TApp *app         = TApp::instance();
Jeremy Bullock f15907
  ToonzScene *scene = app->getCurrentScene()->getScene();
Jeremy Bullock f15907
  TXsheet *xsh      = TApp::instance()->getCurrentXsheet()->getXsheet();
Jeremy Bullock f15907
  setToNextNewLevel();
Jeremy Bullock f15907
  m_filePath = scene->getDefaultLevelPath(OVL_TYPE, m_levelName.toStdWString())
Jeremy Bullock f15907
                   .getParentDir()
Jeremy Bullock f15907
                   .getQString();
shun-iwasawa 31accf
  m_frameNumber = 1;
shun-iwasawa 31accf
  m_liveViewImageMap.clear();
Jeremy Bullock f15907
Jeremy Bullock f15907
  TLevelSet *levelSet = scene->getLevelSet();
Jeremy Bullock f15907
  std::vector<txshlevel *=""> levels;</txshlevel>
Jeremy Bullock f15907
  levelSet->listLevels(levels);
shun-iwasawa 31accf
  int size   = levels.size();
shun-iwasawa 31accf
  bool found = false;
Jeremy Bullock f15907
  for (int i = 0; i < size; i++) {
Jeremy Bullock f15907
    TXshLevel *level = levels[i];
Jeremy Bullock f15907
    if (level->getType() == OVL_XSHLEVEL) {
Jeremy Bullock f15907
      TXshSimpleLevel *sl    = 0;
Jeremy Bullock f15907
      sl                     = level->getSimpleLevel();
Jeremy Bullock f15907
      bool isStopMotionLevel = sl->getProperties()->isStopMotionLevel();
Jeremy Bullock f15907
      if (isStopMotionLevel) {
Jeremy Bullock f15907
        m_filePath    = sl->getPath().getParentDir().getQString();
Jeremy Bullock f15907
        m_levelName   = QString::fromStdWString(sl->getName());
Jeremy Bullock f15907
        m_frameNumber = sl->getFrameCount() + 1;
Jeremy Bullock f15907
        setXSheetFrameNumber(xsh->getFrameCount() + 1);
shun-iwasawa 31accf
        loadXmlFile();
shun-iwasawa 31accf
        buildLiveViewMap(sl);
shun-iwasawa 6bac0f
        m_sl  = sl;
shun-iwasawa 31accf
        found = true;
Jeremy Bullock f15907
        break;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (!found) {
shun-iwasawa 31accf
    setXSheetFrameNumber(1);
shun-iwasawa 31accf
  }
Jeremy Bullock f15907
  emit(levelNameChanged(m_levelName));
Jeremy Bullock f15907
  emit(filePathChanged(m_filePath));
Jeremy Bullock f15907
  emit(frameNumberChanged(m_frameNumber));
Jeremy Bullock f15907
  emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
Jeremy Bullock f15907
  refreshFrameInfo();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
bool StopMotion::buildLiveViewMap(TXshSimpleLevel *sl) {
shun-iwasawa 31accf
  m_liveViewImageMap.clear();
shun-iwasawa 31accf
  TApp *app         = TApp::instance();
shun-iwasawa 31accf
  ToonzScene *scene = app->getCurrentScene()->getScene();
shun-iwasawa 31accf
  TXsheet *xsh      = scene->getXsheet();
shun-iwasawa 31accf
shun-iwasawa 31accf
  std::wstring levelName = m_levelName.toStdWString();
shun-iwasawa 31accf
  if (levelName.empty()) {
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (m_usingWebcam) {
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath liveViewFolder = scene->decodeFilePath(
shun-iwasawa 31accf
      TFilePath(m_filePath) + TFilePath(levelName + L"_LiveView"));
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath levelFp = TFilePath(m_filePath) +
shun-iwasawa 31accf
                      TFilePath(levelName + L".." + m_fileType.toStdWString());
shun-iwasawa 31accf
  TFilePath actualLevelFp = scene->decodeFilePath(levelFp);
shun-iwasawa 31accf
  TFilePath liveViewFp =
shun-iwasawa 31accf
      scene->decodeFilePath(liveViewFolder + TFilePath(levelName + L"..jpg"));
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (!TSystem::doesExistFileOrLevel(liveViewFolder)) return false;
shun-iwasawa 31accf
shun-iwasawa 31accf
  int count = sl->getFrameCount();
shun-iwasawa 31accf
  std::vector<tframeid> fids;</tframeid>
shun-iwasawa 31accf
  sl->getFids(fids);
shun-iwasawa 31accf
  for (TFrameId id : fids) {
shun-iwasawa 31accf
    int frameNumber = id.getNumber();
shun-iwasawa 31accf
    if (TSystem::doesExistFileOrLevel(liveViewFp.withFrame(frameNumber))) {
shun-iwasawa 31accf
      TRaster32P image;
shun-iwasawa 31accf
      JpgConverter::loadJpg(liveViewFp.withFrame(frameNumber), image);
shun-iwasawa 31accf
      m_liveViewImageMap.insert(std::pair<int, traster32p="">(frameNumber, image));</int,>
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (m_liveViewImageMap.size() > 0) {
shun-iwasawa 31accf
    return true;
shun-iwasawa 31accf
  } else
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::disconnectAllCameras() {
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  if (m_liveViewStatus > LiveViewClosed) {
shun-iwasawa 31accf
    m_canon->resetCanon(true);
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    m_canon->resetCanon(false);
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (m_usingWebcam) {
shun-iwasawa 31accf
    m_webcam->releaseWebcam();
shun-iwasawa 31accf
    m_usingWebcam = false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  m_webcam->clearWebcam();
shun-iwasawa 31accf
shun-iwasawa 31accf
  m_liveViewStatus = LiveViewClosed;
shun-iwasawa 31accf
  setTEnvCameraName("");
shun-iwasawa 31accf
shun-iwasawa 31accf
  m_isTimeLapse     = false;
shun-iwasawa 31accf
  m_intervalStarted = false;
shun-iwasawa 31accf
  m_intervalTimer->stop();
shun-iwasawa 31accf
  m_countdownTimer->stop();
shun-iwasawa 31accf
  emit(intervalToggled(false));
shun-iwasawa 31accf
shun-iwasawa 31accf
  emit(liveViewChanged(false));
shun-iwasawa 31accf
  emit(liveViewStopped());
shun-iwasawa 31accf
  emit(newCameraSelected(0, false));
shun-iwasawa 31accf
  toggleNumpadShortcuts(false);
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
Jeremy Bullock f15907
void StopMotion::onPlaybackChanged() {
shun-iwasawa 31accf
  if (TApp::instance()->getCurrentFrame()->isPlaying() ||
shun-iwasawa 31accf
      m_liveViewStatus == LiveViewClosed)
Jeremy Bullock f15907
    return;
Jeremy Bullock f15907
Jeremy Bullock f15907
  int r0, r1, step;
Jeremy Bullock f15907
  ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Jeremy Bullock f15907
  scene->getProperties()->getPreviewProperties()->getRange(r0, r1, step);
Jeremy Bullock f15907
  if (r1 > -1) return;
Jeremy Bullock f15907
Jeremy Bullock f15907
  int frame     = TApp::instance()->getCurrentFrame()->getFrame();
Jeremy Bullock f15907
  int lastFrame = TApp::instance()->getCurrentFrame()->getMaxFrameIndex();
Jeremy Bullock f15907
  if (frame == 0 || frame == lastFrame) {
Jeremy Bullock f15907
    TApp::instance()->getCurrentFrame()->setFrame(m_xSheetFrameNumber - 1);
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setOpacity(int opacity) {
Jeremy Bullock f15907
  m_opacity         = opacity;
Jeremy Bullock f15907
  StopMotionOpacity = m_opacity;
Jeremy Bullock f15907
  emit(opacityChanged(m_opacity));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::lowerOpacity() {
Jeremy Bullock f15907
  int opacity = round((double)m_opacity / 255.0 * 10.0);
Jeremy Bullock f15907
  opacity *= 10;
Jeremy Bullock f15907
  opacity -= 10;
Jeremy Bullock f15907
  m_opacity         = double(opacity) / 100.0 * 255.0;
otakuto 158f9f
  m_opacity         = std::max(0, m_opacity);
Jeremy Bullock f15907
  StopMotionOpacity = m_opacity;
Jeremy Bullock f15907
  emit(opacityChanged(m_opacity));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::raiseOpacity() {
Jeremy Bullock f15907
  int opacity = round((double)m_opacity / 255.0 * 10.0);
Jeremy Bullock f15907
  opacity *= 10;
Jeremy Bullock f15907
  opacity += 10;
Jeremy Bullock f15907
  m_opacity         = double(opacity) / 100.0 * 255.0;
otakuto 158f9f
  m_opacity         = std::min(255, m_opacity);
Jeremy Bullock f15907
  StopMotionOpacity = m_opacity;
Jeremy Bullock f15907
  emit(opacityChanged(m_opacity));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setAlwaysLiveView(bool on) {
Jeremy Bullock f15907
  m_alwaysLiveView         = on;
Jeremy Bullock f15907
  StopMotionAlwaysLiveView = int(on);
Jeremy Bullock f15907
  emit(liveViewOnAllFramesSignal(on));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setPlaceOnXSheet(bool on) {
Jeremy Bullock f15907
  m_placeOnXSheet         = on;
Jeremy Bullock f15907
  StopMotionPlaceOnXSheet = int(on);
Jeremy Bullock f15907
  emit(placeOnXSheetSignal(on));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setReviewTime(int time) {
Jeremy Bullock f15907
  m_reviewTime         = time;
Jeremy Bullock f15907
  StopMotionReviewTime = time;
Jeremy Bullock f15907
  emit(reviewTimeChangedSignal(time));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
void StopMotion::jumpToCameraFrame() {
shun-iwasawa 31accf
  if (m_liveViewStatus == LiveViewPaused && !m_userCalledPause) {
shun-iwasawa 31accf
    m_liveViewStatus = LiveViewOpen;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  if (m_hasLineUpImage) m_showLineUpImage = true;
shun-iwasawa 31accf
  TApp::instance()->getCurrentFrame()->setFrame(m_xSheetFrameNumber - 1);
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
void StopMotion::removeStopMotionFrame() {
shun-iwasawa 31accf
  if (m_xSheetFrameNumber == 1) return;
shun-iwasawa 31accf
  TApp *app         = TApp::instance();
shun-iwasawa 31accf
  ToonzScene *scene = app->getCurrentScene()->getScene();
shun-iwasawa 31accf
  TXsheet *xsh      = scene->getXsheet();
shun-iwasawa 31accf
shun-iwasawa 31accf
  int row = m_xSheetFrameNumber - 2;
shun-iwasawa 31accf
shun-iwasawa 31accf
  // find which column the level is on.
shun-iwasawa 31accf
  // check with the current column first
shun-iwasawa 31accf
  int col       = app->getCurrentColumn()->getColumnIndex();
shun-iwasawa 31accf
  TXshCell cell = xsh->getCell(row, col);
shun-iwasawa 31accf
  TXshSimpleLevelP sl;
shun-iwasawa 31accf
  bool found = false;
shun-iwasawa 31accf
  if (!cell.isEmpty()) {
shun-iwasawa 31accf
    if (cell.getSimpleLevel() != 0) {
shun-iwasawa 31accf
      sl = cell.getSimpleLevel();
shun-iwasawa 31accf
      if (sl.getPointer()->getName() == m_levelName.toStdWString()) {
shun-iwasawa 31accf
        found = true;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (!found) {
shun-iwasawa 31accf
    int cols = xsh->getColumnCount();
shun-iwasawa 31accf
    for (int i = 0; i < cols; i++) {
shun-iwasawa 31accf
      cell = xsh->getCell(row, i);
shun-iwasawa 31accf
      if (!cell.isEmpty()) {
shun-iwasawa 31accf
        if (cell.getSimpleLevel() != 0) {
shun-iwasawa 31accf
          sl = cell.getSimpleLevel();
shun-iwasawa 31accf
          if (sl.getPointer()->getName() == m_levelName.toStdWString()) {
shun-iwasawa 31accf
            found = true;
shun-iwasawa 31accf
            col   = i;
shun-iwasawa 31accf
            break;
shun-iwasawa 31accf
          }
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  if (!found) {
shun-iwasawa 31accf
    // DVGui::error(tr("Could not find an xsheet level with  the current
shun-iwasawa 31accf
    // level"));
shun-iwasawa 31accf
    return;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  TXshCellColumn *xshCellColumn = xsh->getColumn(col)->getCellColumn();
shun-iwasawa 31accf
  if (!xshCellColumn) return;
shun-iwasawa 31accf
shun-iwasawa 31accf
  xshCellColumn->removeCells(row, 1);
shun-iwasawa 31accf
shun-iwasawa 31accf
  app->getCurrentScene()->getScene()->getXsheet()->updateFrameCount();
shun-iwasawa 31accf
  setXSheetFrameNumber(m_xSheetFrameNumber - 1);
shun-iwasawa 31accf
  app->getCurrentFrame()->prevFrame();
shun-iwasawa 31accf
  app->getCurrentScene()->notifySceneChanged();
shun-iwasawa 31accf
  app->getCurrentXsheet()->notifyXsheetChanged();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setUseNumpadShortcuts(bool on) {
Jeremy Bullock f15907
  m_useNumpadShortcuts = on;
Jeremy Bullock f15907
  StopMotionUseNumpad  = int(on);
Jeremy Bullock f15907
  emit(useNumpadSignal(on));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::setDrawBeneathLevels(bool on) {
shun-iwasawa 31accf
  m_drawBeneathLevels         = on;
shun-iwasawa 31accf
  StopMotionDrawBeneathLevels = int(on);
shun-iwasawa 31accf
  emit(drawBeneathLevelsSignal(on));
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::toggleInterval(bool on) {
shun-iwasawa 31accf
  m_isTimeLapse = on;
shun-iwasawa 31accf
  emit(intervalToggled(on));
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::startInterval() {
shun-iwasawa 31accf
  if (m_liveViewStatus > 1) {
shun-iwasawa 31accf
    m_intervalTimer->start(m_intervalTime * 1000);
shun-iwasawa 31accf
    if (m_intervalTime != 0) m_countdownTimer->start(100);
shun-iwasawa 31accf
    m_intervalStarted = true;
shun-iwasawa 31accf
    emit(intervalStarted());
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    DVGui::warning(tr("Please start live view before using time lapse."));
shun-iwasawa 31accf
    m_intervalStarted = false;
shun-iwasawa 31accf
    emit(intervalStopped());
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::stopInterval() {
shun-iwasawa 31accf
  m_intervalTimer->stop();
shun-iwasawa 31accf
  m_countdownTimer->stop();
shun-iwasawa 31accf
  m_intervalStarted = false;
shun-iwasawa 31accf
  emit(intervalStopped());
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::setIntervalAmount(int value) {
shun-iwasawa 31accf
  m_intervalTime = value;
shun-iwasawa 31accf
  emit(intervalAmountChanged(value));
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::onIntervalCaptureTimerTimeout() {
shun-iwasawa 31accf
  if (m_liveViewStatus > 0) {
shun-iwasawa 31accf
    captureImage();
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    DVGui::warning(tr("Please start live view before using time lapse."));
shun-iwasawa 31accf
    m_intervalStarted = false;
shun-iwasawa 31accf
    emit(intervalStopped());
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::restartInterval() {
shun-iwasawa 31accf
  // restart interval timer for capturing next frame (it is single shot)
shun-iwasawa 31accf
  if (m_isTimeLapse && m_intervalStarted) {
shun-iwasawa 31accf
    m_intervalTimer->start(m_intervalTime * 1000);
shun-iwasawa 31accf
    // restart the count down as well (for aligning the timing. It is not
shun-iwasawa 31accf
    // single shot)
shun-iwasawa 31accf
    if (m_intervalTime != 0) m_countdownTimer->start(100);
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
Jeremy Bullock f15907
void StopMotion::toggleNumpadShortcuts(bool on) {
Jeremy Bullock f15907
  // can't just return if this feature is off
Jeremy Bullock f15907
  // it could have been toggled while the camera was active
Jeremy Bullock f15907
  if (!m_useNumpadShortcuts) on = false;
shun-iwasawa 6bac0f
  CommandManager *comm = CommandManager::instance();
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (on) {
shun-iwasawa 31accf
    m_oldActionMap.clear();
Jeremy Bullock f15907
    // if turning it on, get all old shortcuts
Jeremy Bullock f15907
    if (m_numpadForStyleSwitching) {
shun-iwasawa 2c27a4
      Preferences::instance()->setValue(useNumpadForSwitchingStyles, false);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    std::string shortcut;
Jeremy Bullock f15907
    QAction *action;
Jeremy Bullock f15907
    for (int i = 0; i <= 9; i++) {
Jeremy Bullock f15907
      shortcut = QString::number(i).toStdString();
Jeremy Bullock f15907
      action   = comm->getActionFromShortcut(shortcut);
Jeremy Bullock f15907
      if (action) {
Jeremy Bullock f15907
        m_oldActionMap.insert(
Jeremy Bullock f15907
            std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
Jeremy Bullock f15907
        action->setShortcut(QKeySequence(""));
Jeremy Bullock f15907
        action = NULL;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    shortcut = "+";
Jeremy Bullock f15907
    action   = comm->getActionFromShortcut(shortcut);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      m_oldActionMap.insert(
Jeremy Bullock f15907
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    shortcut = "-";
Jeremy Bullock f15907
    action   = comm->getActionFromShortcut(shortcut);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      m_oldActionMap.insert(
Jeremy Bullock f15907
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
      action = NULL;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    shortcut = "Enter";
shun-iwasawa 31accf
    action   = comm->getActionFromShortcut(shortcut);
shun-iwasawa 31accf
    if (action) {
shun-iwasawa 31accf
      m_oldActionMap.insert(
shun-iwasawa 31accf
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
      action = NULL;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    shortcut = "Backspace";
shun-iwasawa 31accf
    action   = comm->getActionFromShortcut(shortcut);
shun-iwasawa 31accf
    if (action) {
shun-iwasawa 31accf
      m_oldActionMap.insert(
shun-iwasawa 31accf
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    shortcut = "Return";
Jeremy Bullock f15907
    action   = comm->getActionFromShortcut(shortcut);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      m_oldActionMap.insert(
Jeremy Bullock f15907
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    shortcut = "*";
Jeremy Bullock f15907
    action   = comm->getActionFromShortcut(shortcut);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      m_oldActionMap.insert(
Jeremy Bullock f15907
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
      action = NULL;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    shortcut = ".";
shun-iwasawa 31accf
    action   = comm->getActionFromShortcut(shortcut);
shun-iwasawa 31accf
    if (action) {
shun-iwasawa 31accf
      m_oldActionMap.insert(
shun-iwasawa 31accf
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
      action = NULL;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    shortcut = "/";
shun-iwasawa 31accf
    action   = comm->getActionFromShortcut(shortcut);
shun-iwasawa 31accf
    if (action) {
shun-iwasawa 31accf
      m_oldActionMap.insert(
shun-iwasawa 31accf
          std::pair<std::string, *="" qaction="">(shortcut, action));</std::string,>
shun-iwasawa 31accf
      action->setShortcut(QKeySequence(""));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
Jeremy Bullock f15907
    // now set all new shortcuts
shun-iwasawa 31accf
    action = comm->getAction(MI_PrevFrame);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      action->setShortcut(QKeySequence("1"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    action = comm->getAction(MI_StopMotionNextFrame);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      action->setShortcut(QKeySequence("2"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    action = comm->getAction(MI_StopMotionJumpToCamera);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      action->setShortcut(QKeySequence("3"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    action = comm->getAction(MI_Loop);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      action->setShortcut(QKeySequence("8"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    action = comm->getAction(MI_Play);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      action->setShortcut(QKeySequence("0"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    action = comm->getAction(MI_StopMotionRaiseOpacity);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      action->setShortcut(QKeySequence("+"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    action = comm->getAction(MI_StopMotionLowerOpacity);
Jeremy Bullock f15907
    if (action) {
Jeremy Bullock f15907
      action->setShortcut(QKeySequence("-"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    action = comm->getAction(MI_StopMotionCapture);
Jeremy Bullock f15907
    if (action) {
shun-iwasawa 31accf
      action->setShortcut(QKeySequence("Return"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    action = comm->getAction(MI_StopMotionRemoveFrame);
Jeremy Bullock f15907
    if (action) {
shun-iwasawa 31accf
      action->setShortcut(QKeySequence("Backspace"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    action = comm->getAction(MI_StopMotionToggleLiveView);
Jeremy Bullock f15907
    if (action) {
shun-iwasawa 31accf
      action->setShortcut(QKeySequence("5"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    action = comm->getAction(MI_StopMotionToggleUseLiveViewImages);
Jeremy Bullock f15907
    if (action) {
shun-iwasawa 31accf
      action->setShortcut(QKeySequence("."));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    action = comm->getAction(MI_StopMotionToggleZoom);
Jeremy Bullock f15907
    if (action) {
shun-iwasawa 31accf
      action->setShortcut(QKeySequence("*"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    action = comm->getAction(MI_StopMotionPickFocusCheck);
Jeremy Bullock f15907
    if (action) {
shun-iwasawa 31accf
      action->setShortcut(QKeySequence("/"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    action = comm->getAction(MI_ShortPlay);
Jeremy Bullock f15907
    if (action) {
shun-iwasawa 31accf
      action->setShortcut(QKeySequence("6"));
Jeremy Bullock f15907
      action = NULL;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    // unset the new shortcuts first
shun-iwasawa 31accf
    if (m_oldActionMap.size() > 0) {
Jeremy Bullock f15907
      QAction *action;
shun-iwasawa 31accf
      action = comm->getAction(MI_PrevFrame);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
Jeremy Bullock f15907
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionNextFrame);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionJumpToCamera);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_Loop);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_Play);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionCapture);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionLowerOpacity);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionRaiseOpacity);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionToggleLiveView);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionToggleUseLiveViewImages);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionToggleZoom);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_ShortPlay);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionPickFocusCheck);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionRemoveFrame);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(
shun-iwasawa 31accf
            QKeySequence(comm->getShortcutFromAction(action).c_str()));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
shun-iwasawa 31accf
      // now put back the old shortcuts
shun-iwasawa 31accf
      auto it = m_oldActionMap.begin();
shun-iwasawa 31accf
      while (it != m_oldActionMap.end()) {
shun-iwasawa 31accf
        it->second->setShortcut(QKeySequence(it->first.c_str()));
shun-iwasawa 31accf
        it++;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (m_numpadForStyleSwitching) {
shun-iwasawa 31accf
        std::string shortcut;
shun-iwasawa 31accf
        QAction *action;
shun-iwasawa 31accf
        for (int i = 0; i <= 9; i++) {
shun-iwasawa 31accf
          shortcut = QString::number(i).toStdString();
shun-iwasawa 31accf
          action   = comm->getActionFromShortcut(shortcut);
shun-iwasawa 31accf
          if (action) {
shun-iwasawa 31accf
            action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
            action = NULL;
shun-iwasawa 31accf
          }
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
        Preferences::instance()->setValue(useNumpadForSwitchingStyles, true);
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::toggleNumpadForFocusCheck(bool on) {
shun-iwasawa 31accf
  CommandManager *comm = CommandManager::instance();
shun-iwasawa 31accf
  if (m_useNumpadShortcuts) {
shun-iwasawa 31accf
    if (on) {
shun-iwasawa 31accf
      QAction *action;
shun-iwasawa 31accf
      action = comm->getAction(MI_PrevFrame);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionNextFrame);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionJumpToCamera);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_Loop);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_Play);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionToggleLiveView);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_ShortPlay);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionCapture);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence(""));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
    } else {
shun-iwasawa 31accf
      QAction *action;
shun-iwasawa 31accf
      action = comm->getAction(MI_PrevFrame);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("1"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionNextFrame);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("2"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionJumpToCamera);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("3"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_Loop);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("8"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_Play);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("0"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionToggleLiveView);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("5"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_ShortPlay);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("6"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      action = comm->getAction(MI_StopMotionCapture);
shun-iwasawa 31accf
      if (action) {
shun-iwasawa 31accf
        action->setShortcut(QKeySequence("Return"));
shun-iwasawa 31accf
        action = NULL;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::setXSheetFrameNumber(int frameNumber) {
shun-iwasawa 31accf
  m_xSheetFrameNumber = frameNumber;
shun-iwasawa 31accf
  TApp::instance()->getCurrentFrame()->setFrame(frameNumber - 1);
shun-iwasawa 31accf
  loadLineUpImage();
shun-iwasawa 31accf
  emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
shun-iwasawa 31accf
  m_serial->sendSerialData();
shun-iwasawa 31accf
  TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
bool StopMotion::loadLineUpImage() {
shun-iwasawa 31accf
  if (m_liveViewStatus == LiveViewClosed || m_userCalledPause) return false;
shun-iwasawa 31accf
  int row;
shun-iwasawa 31accf
  if (m_xSheetFrameNumber == 1) {
shun-iwasawa 31accf
    row = 0;
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    row = m_xSheetFrameNumber - 2;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  m_hasLineUpImage = loadLiveViewImage(row, m_lineUpImage);
shun-iwasawa 31accf
  return m_hasLineUpImage;
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
bool StopMotion::loadLiveViewImage(int row, TRaster32P &image) {
shun-iwasawa 31accf
  // first see if the level exists in the current level set
shun-iwasawa 31accf
  ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene();
shun-iwasawa 31accf
  TLevelSet *levelSet      = currentScene->getLevelSet();
shun-iwasawa 31accf
shun-iwasawa 31accf
  std::wstring levelName = m_levelName.toStdWString();
shun-iwasawa 31accf
shun-iwasawa 31accf
  // level with the same name
shun-iwasawa 31accf
  TXshLevel *level_sameName = levelSet->getLevel(levelName);
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath levelFp = TFilePath(m_filePath) +
shun-iwasawa 31accf
                      TFilePath(levelName + L".." + m_fileType.toStdWString());
shun-iwasawa 31accf
shun-iwasawa 31accf
  // level with the same path
shun-iwasawa 31accf
  TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp);
shun-iwasawa 31accf
shun-iwasawa 31accf
  // TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp);
shun-iwasawa 31accf
  TXshSimpleLevelP sl;
shun-iwasawa 31accf
  if (level_sameName && level_samePath && level_sameName == level_samePath) {
shun-iwasawa 31accf
    sl                 = dynamic_cast<txshsimplelevel *="">(level_sameName);</txshsimplelevel>
Jeremy Bullock f15907
    bool isRasterLevel = sl && (sl->getType() == OVL_XSHLEVEL);
Jeremy Bullock f15907
    if (!isRasterLevel) {
Jeremy Bullock f15907
      return false;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  } else
Jeremy Bullock f15907
    return false;
Jeremy Bullock f15907
Jeremy Bullock f15907
  // next we need to find the column the level is on
Jeremy Bullock f15907
  TApp *app    = TApp::instance();
Jeremy Bullock f15907
  TXsheet *xsh = currentScene->getXsheet();
shun-iwasawa 31accf
  int col      = app->getCurrentColumn()->getColumnIndex();
Jeremy Bullock f15907
Jeremy Bullock f15907
  int foundCol = -1;
Jeremy Bullock f15907
  // most possibly, it's in the current column
Jeremy Bullock f15907
  int rowCheck;
Jeremy Bullock f15907
  findCell(xsh, col, TXshCell(level_sameName, TFrameId(1)), rowCheck);
Jeremy Bullock f15907
  if (rowCheck >= 0) {
Jeremy Bullock f15907
    foundCol = col;
Jeremy Bullock f15907
  } else {
Jeremy Bullock f15907
    // search entire xsheet
Jeremy Bullock f15907
    for (int c = 0; c < xsh->getColumnCount(); c++) {
Jeremy Bullock f15907
      if (c == col) continue;
Jeremy Bullock f15907
      findCell(xsh, c, TXshCell(level_sameName, TFrameId(1)), rowCheck);
Jeremy Bullock f15907
      if (rowCheck >= 0) {
Jeremy Bullock f15907
        foundCol = c;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  if (rowCheck < 0) return false;
Jeremy Bullock f15907
Jeremy Bullock f15907
  // note found row represents the last row found that uses
Jeremy Bullock f15907
  // the active level
shun-iwasawa 31accf
  TXshCell cell = xsh->getCell(row, foundCol);
shun-iwasawa 31accf
  if (!(cell.getSimpleLevel() != 0 &&
shun-iwasawa 31accf
        cell.getSimpleLevel() == level_sameName->getSimpleLevel())) {
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
Jeremy Bullock f15907
  TFrameId frameId = xsh->getCell(row, foundCol).getFrameId();
Jeremy Bullock f15907
Jeremy Bullock f15907
  int frameNumber = frameId.getNumber();
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (m_usingWebcam) {
Jeremy Bullock f15907
    if (frameNumber > 0) {
shun-iwasawa 31accf
      image = sl->getFrame(frameId, false)->raster();
Jeremy Bullock f15907
      return true;
Jeremy Bullock f15907
    } else
Jeremy Bullock f15907
      return false;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
shun-iwasawa 31accf
  // first check if the image is in the live view map
shun-iwasawa 31accf
  std::map<int, traster32p="">::iterator it;</int,>
shun-iwasawa 31accf
  it = m_liveViewImageMap.find(frameNumber);
shun-iwasawa 31accf
  if (it != m_liveViewImageMap.end()) {
shun-iwasawa 31accf
    image = m_liveViewImageMap.find(frameNumber)->second;
shun-iwasawa 31accf
    return true;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  // it's not in the map
shun-iwasawa 31accf
  // now check to see if a file actually exists
shun-iwasawa 31accf
  // then put it in the map
Jeremy Bullock f15907
  TFilePath liveViewFolder = currentScene->decodeFilePath(
Jeremy Bullock f15907
      TFilePath(m_filePath) + TFilePath(levelName + L"_LiveView"));
Jeremy Bullock f15907
  TFilePath liveViewFp = currentScene->decodeFilePath(
Jeremy Bullock f15907
      liveViewFolder + TFilePath(levelName + L"..jpg"));
Jeremy Bullock f15907
  TFilePath liveViewFile(liveViewFp.withFrame(frameNumber));
Jeremy Bullock f15907
  if (TFileStatus(liveViewFile).doesExist()) {
shun-iwasawa 31accf
    if (JpgConverter::loadJpg(liveViewFile, image)) {
shun-iwasawa 31accf
      m_liveViewImageMap.insert(std::pair<int, traster32p="">(frameNumber, image));</int,>
Jeremy Bullock f15907
      return true;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  return false;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setFrameNumber(int frameNumber) {
Jeremy Bullock f15907
  m_frameNumber = frameNumber;
Jeremy Bullock f15907
  emit(frameNumberChanged(m_frameNumber));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::nextFrame() {
Jeremy Bullock f15907
  if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) {
Jeremy Bullock f15907
    int f = m_frameNumber;
Jeremy Bullock f15907
    if (f % 10 == 0)  // next number
Jeremy Bullock f15907
      m_frameNumber = ((int)(f / 10) + 1) * 10;
Jeremy Bullock f15907
    else  // next alphabet
Jeremy Bullock f15907
      m_frameNumber = f + 1;
Jeremy Bullock f15907
  } else
Jeremy Bullock f15907
    m_frameNumber = m_frameNumber + 1;
Jeremy Bullock f15907
  emit(frameNumberChanged(m_frameNumber));
Jeremy Bullock f15907
  refreshFrameInfo();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::lastFrame() {}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::previousFrame() {
Jeremy Bullock f15907
  int f = m_frameNumber;
Jeremy Bullock f15907
  if (f > 1) {
Jeremy Bullock f15907
    if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) {
Jeremy Bullock f15907
      if (f % 10 == 0)  // next number
Jeremy Bullock f15907
        m_frameNumber = ((int)(f / 10) - 1) * 10;
Jeremy Bullock f15907
      else  // next alphabet
Jeremy Bullock f15907
        m_frameNumber = f - 1;
Jeremy Bullock f15907
    } else
Jeremy Bullock f15907
      m_frameNumber = f - 1;
Jeremy Bullock f15907
    emit(frameNumberChanged(m_frameNumber));
Jeremy Bullock f15907
    refreshFrameInfo();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setLevelName(QString levelName) { m_levelName = levelName; }
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::nextName() {
Jeremy Bullock f15907
  std::unique_ptr<flexiblenamecreator> nameCreator(new FlexibleNameCreator());</flexiblenamecreator>
Jeremy Bullock f15907
  if (!nameCreator->setCurrent(m_levelName.toStdWString())) {
Jeremy Bullock f15907
    setToNextNewLevel();
Jeremy Bullock f15907
    return;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  std::wstring levelName = nameCreator->getNext();
Jeremy Bullock f15907
  updateLevelNameAndFrame(levelName);
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::previousName() {
Jeremy Bullock f15907
  std::unique_ptr<flexiblenamecreator> nameCreator(new FlexibleNameCreator());</flexiblenamecreator>
Jeremy Bullock f15907
Jeremy Bullock f15907
  std::wstring levelName;
Jeremy Bullock f15907
luz paz 6454c4
  // if the current level name is non-sequential, then try to switch the last
luz paz 6454c4
  // sequential level in the scene.
Jeremy Bullock f15907
  if (!nameCreator->setCurrent(m_levelName.toStdWString())) {
Jeremy Bullock f15907
    TLevelSet *levelSet =
Jeremy Bullock f15907
        TApp::instance()->getCurrentScene()->getScene()->getLevelSet();
Jeremy Bullock f15907
    nameCreator->setCurrent(L"ZZ");
Jeremy Bullock f15907
    for (;;) {
Jeremy Bullock f15907
      levelName = nameCreator->getPrevious();
Jeremy Bullock f15907
      if (levelSet->getLevel(levelName) != 0) break;
Jeremy Bullock f15907
      if (levelName == L"A") {
Jeremy Bullock f15907
        setToNextNewLevel();
Jeremy Bullock f15907
        return;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  } else
Jeremy Bullock f15907
    levelName = nameCreator->getPrevious();
Jeremy Bullock f15907
Jeremy Bullock f15907
  updateLevelNameAndFrame(levelName);
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setFileType(QString fileType) {
Jeremy Bullock f15907
  m_fileType = fileType;
Jeremy Bullock f15907
  emit(fileTypeChanged(m_fileType));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setFilePath(QString filePath) {
Jeremy Bullock f15907
  m_filePath = filePath;
Jeremy Bullock f15907
Jeremy Bullock f15907
  ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Jeremy Bullock f15907
  TFilePath saveInPath(filePath.toStdWString());
Jeremy Bullock f15907
  scene->getProperties()->setCameraCaptureSaveInPath(saveInPath);
Jeremy Bullock f15907
  refreshFrameInfo();
Jeremy Bullock f15907
Jeremy Bullock f15907
  emit(filePathChanged(m_filePath));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setSubsamplingValue(int subsampling) {
Jeremy Bullock f15907
  m_subsampling = subsampling;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::getSubsampling() {
Jeremy Bullock f15907
  ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene();
Jeremy Bullock f15907
  TLevelSet *levelSet      = currentScene->getLevelSet();
Jeremy Bullock f15907
Jeremy Bullock f15907
  std::wstring levelName = m_levelName.toStdWString();
Jeremy Bullock f15907
Jeremy Bullock f15907
  // level with the same name
Jeremy Bullock f15907
  TXshLevel *level_sameName = levelSet->getLevel(levelName);
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath levelFp = TFilePath(m_filePath) +
Jeremy Bullock f15907
                      TFilePath(levelName + L".." + m_fileType.toStdWString());
Jeremy Bullock f15907
Jeremy Bullock f15907
  // level with the same path
Jeremy Bullock f15907
  TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp);
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp);
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (level_sameName && level_samePath && level_sameName == level_samePath) {
Jeremy Bullock f15907
    TXshSimpleLevelP m_sl;
Jeremy Bullock f15907
    m_sl               = dynamic_cast<txshsimplelevel *="">(level_sameName);</txshsimplelevel>
Jeremy Bullock f15907
    bool isRasterLevel = m_sl && (m_sl->getType() == OVL_XSHLEVEL);
Jeremy Bullock f15907
    if (isRasterLevel) {
Jeremy Bullock f15907
      int currSubsampling = m_sl->getProperties()->getSubsampling();
Jeremy Bullock f15907
      m_subsampling       = currSubsampling;
Jeremy Bullock f15907
      emit(subsamplingChanged(m_subsampling));
Jeremy Bullock f15907
    } else
Jeremy Bullock f15907
      emit(subsamplingChanged(-1));
Jeremy Bullock f15907
  } else
Jeremy Bullock f15907
    emit(subsamplingChanged(-1));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::update() { getSubsampling(); }
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setSubsampling() {
Jeremy Bullock f15907
  ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene();
Jeremy Bullock f15907
  TLevelSet *levelSet      = currentScene->getLevelSet();
Jeremy Bullock f15907
Jeremy Bullock f15907
  std::wstring levelName = m_levelName.toStdWString();
Jeremy Bullock f15907
Jeremy Bullock f15907
  // level with the same name
Jeremy Bullock f15907
  TXshLevel *level_sameName = levelSet->getLevel(levelName);
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath levelFp = TFilePath(m_filePath) +
Jeremy Bullock f15907
                      TFilePath(levelName + L".." + m_fileType.toStdWString());
Jeremy Bullock f15907
Jeremy Bullock f15907
  // level with the same path
Jeremy Bullock f15907
  TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp);
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp);
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (level_sameName && level_samePath && level_sameName == level_samePath) {
Jeremy Bullock f15907
    TXshSimpleLevelP m_sl;
Jeremy Bullock f15907
    m_sl               = dynamic_cast<txshsimplelevel *="">(level_sameName);</txshsimplelevel>
Jeremy Bullock f15907
    bool isRasterLevel = m_sl && (m_sl->getType() & RASTER_TYPE);
Jeremy Bullock f15907
    if (isRasterLevel) {
Jeremy Bullock f15907
      int currSubsampling = m_sl->getProperties()->getSubsampling();
Jeremy Bullock f15907
      int newSubsampling  = m_subsampling;
Jeremy Bullock f15907
      if (currSubsampling != newSubsampling) {
Jeremy Bullock f15907
        m_sl->getProperties()->setSubsampling(newSubsampling);
Jeremy Bullock f15907
        m_sl->invalidateFrames();
Jeremy Bullock f15907
        TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Jeremy Bullock f15907
        TApp::instance()
Jeremy Bullock f15907
            ->getCurrentXsheet()
Jeremy Bullock f15907
            ->getXsheet()
Jeremy Bullock f15907
            ->getStageObjectTree()
Jeremy Bullock f15907
            ->invalidateAll();
Jeremy Bullock f15907
        TApp::instance()->getCurrentLevel()->notifyLevelChange();
Jeremy Bullock f15907
        emit(subsamplingChanged(m_subsampling));
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::onTimeout() {
Jeremy Bullock f15907
  int currentFrame = TApp::instance()->getCurrentFrame()->getFrame();
shun-iwasawa 31accf
shun-iwasawa 31accf
  if ((m_liveViewStatus > LiveViewClosed && m_liveViewStatus < LiveViewPaused &&
shun-iwasawa 31accf
       !TApp::instance()->getCurrentFrame()->isPlaying()) ||
shun-iwasawa 31accf
      (m_liveViewStatus == LiveViewPaused && !m_userCalledPause)) {
shun-iwasawa 31accf
    if (getAlwaysLiveView() || (currentFrame >= m_xSheetFrameNumber - 2)) {
shun-iwasawa 31accf
      if (!m_usingWebcam) {
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
        bool success = m_canon->downloadEVFData();
shun-iwasawa 31accf
        if (success) {
shun-iwasawa 31accf
          setLiveViewImage();
shun-iwasawa 31accf
        } else {
shun-iwasawa 31accf
          m_hasLiveViewImage = false;
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
      } else {
shun-iwasawa 31accf
        bool success = m_webcam->getWebcamImage(m_liveViewImage);
shun-iwasawa 31accf
        if (success) {
shun-iwasawa 31accf
          setLiveViewImage();
shun-iwasawa 31accf
        } else {
shun-iwasawa 31accf
          m_hasLiveViewImage = false;
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if ((!getAlwaysLiveView() &&
shun-iwasawa 31accf
           !(currentFrame >= m_xSheetFrameNumber - 2)) ||
shun-iwasawa 31accf
          m_canon->m_pickLiveViewZoom) {
Jeremy Bullock f15907
        m_showLineUpImage = false;
Jeremy Bullock f15907
      } else {
Jeremy Bullock f15907
        m_showLineUpImage = true;
Jeremy Bullock f15907
      }
shun-iwasawa 31accf
    } else if (m_liveViewStatus == LiveViewOpen) {
shun-iwasawa 31accf
      m_liveViewStatus = LiveViewPaused;
Jeremy Bullock f15907
      TApp::instance()->getCurrentScene()->notifySceneChanged();
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
  //  else if (m_liveViewStatus == LiveViewPaused && !m_userCalledPause) {
shun-iwasawa 31accf
  //    if (getAlwaysLiveView() || (currentFrame == m_xSheetFrameNumber - 1)) {
shun-iwasawa 31accf
  //      if (!m_usingWebcam) {
shun-iwasawa 31accf
  //#ifdef WITH_CANON
shun-iwasawa 31accf
  //        bool success = m_canon->downloadEVFData();
shun-iwasawa 31accf
  //        if (success) {
shun-iwasawa 31accf
  //          setLiveViewImage();
shun-iwasawa 31accf
  //        } else {
shun-iwasawa 31accf
  //          m_hasLiveViewImage = false;
shun-iwasawa 31accf
  //        }
shun-iwasawa 31accf
  //#endif
shun-iwasawa 31accf
  //      } else {
shun-iwasawa 31accf
  //        bool success = m_webcam->getWebcamImage(m_liveViewImage);
shun-iwasawa 31accf
  //        if (success) {
shun-iwasawa 31accf
  //          setLiveViewImage();
shun-iwasawa 31accf
  //        } else {
shun-iwasawa 31accf
  //          m_hasLiveViewImage = false;
shun-iwasawa 31accf
  //        }
shun-iwasawa 31accf
  //      }
shun-iwasawa 31accf
  //    }
shun-iwasawa 31accf
  //  }
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
void StopMotion::setLiveViewImage() {
shun-iwasawa 31accf
  m_hasLiveViewImage = true;
shun-iwasawa 31accf
shun-iwasawa 31accf
  // make sure not to set to LiveViewOpen if it has been turned off
shun-iwasawa 31accf
  if (m_liveViewStatus > LiveViewClosed && !m_userCalledPause) {
shun-iwasawa 31accf
    m_liveViewStatus = LiveViewOpen;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (m_liveViewDpi.x == 0.0 || m_liveViewImageDimensions.lx == 0) {
shun-iwasawa 31accf
    TCamera *camera =
shun-iwasawa 31accf
        TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera();
shun-iwasawa 31accf
    TDimensionD size = camera->getSize();
shun-iwasawa 31accf
    m_liveViewImageDimensions =
shun-iwasawa 31accf
        TDimension(m_liveViewImage->getLx(), m_liveViewImage->getLy());
shun-iwasawa 31accf
    double minimumDpi = std::min(m_liveViewImageDimensions.lx / size.lx,
shun-iwasawa 31accf
                                 m_liveViewImageDimensions.ly / size.ly);
shun-iwasawa 6bac0f
    m_liveViewDpi     = TPointD(minimumDpi, minimumDpi);
shun-iwasawa 31accf
shun-iwasawa 31accf
    if (!m_usingWebcam) {
shun-iwasawa 6bac0f
      minimumDpi     = std::min(m_fullImageDimensions.lx / size.lx,
shun-iwasawa 31accf
                            m_fullImageDimensions.ly / size.ly);
shun-iwasawa 31accf
      m_fullImageDpi = TPointD(minimumDpi, minimumDpi);
shun-iwasawa 31accf
    } else {
shun-iwasawa 31accf
      m_fullImageDimensions = m_liveViewImageDimensions;
shun-iwasawa 31accf
      m_fullImageDpi        = m_liveViewDpi;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
shun-iwasawa 31accf
    emit(newDimensions());
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  emit(newLiveViewImageReady());
shun-iwasawa 31accf
}
shun-iwasawa 31accf
//
shun-iwasawa 31accf
////-----------------------------------------------------------------------------
shun-iwasawa 31accf
//
shun-iwasawa 31accf
// void StopMotion::setLiveViewImage() {
shun-iwasawa 31accf
//    m_hasLiveViewImage = true;
shun-iwasawa 31accf
//    m_liveViewStatus = LiveViewOpen;
shun-iwasawa 31accf
//    if (m_hasLiveViewImage &&
shun-iwasawa 31accf
//        (m_liveViewDpi.x == 0.0 || m_liveViewImageDimensions.lx == 0)) {
shun-iwasawa 31accf
//        TCamera* camera =
shun-iwasawa 31accf
//            TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera();
shun-iwasawa 31accf
//        TDimensionD size = camera->getSize();
shun-iwasawa 31accf
//        m_liveViewImageDimensions =
shun-iwasawa 31accf
//            TDimension(m_liveViewImage->getLx(), m_liveViewImage->getLy());
shun-iwasawa 31accf
//        double minimumDpi = std::min(m_liveViewImageDimensions.lx / size.lx,
shun-iwasawa 31accf
//            m_liveViewImageDimensions.ly / size.ly);
shun-iwasawa 31accf
//        m_liveViewDpi = TPointD(minimumDpi, minimumDpi);
shun-iwasawa 31accf
//
shun-iwasawa 31accf
//        m_fullImageDimensions = m_liveViewImageDimensions;
shun-iwasawa 31accf
//
shun-iwasawa 31accf
//        m_fullImageDpi = m_liveViewDpi;
shun-iwasawa 31accf
//
shun-iwasawa 31accf
//        emit(newDimensions());
shun-iwasawa 31accf
//    }
shun-iwasawa 31accf
//
shun-iwasawa 31accf
//    emit(newLiveViewImageReady());
shun-iwasawa 31accf
//}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
shun-iwasawa 31accf
Jeremy Bullock f15907
void StopMotion::onReviewTimeout() {
shun-iwasawa 31accf
  if (m_liveViewStatus > LiveViewClosed) {
shun-iwasawa 31accf
    m_liveViewStatus = LiveViewOpen;
Jeremy Bullock f15907
    m_timer->start(40);
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  TApp::instance()->getCurrentFrame()->setFrame(m_xSheetFrameNumber - 1);
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
bool StopMotion::importImage() {
Jeremy Bullock f15907
  TApp *app         = TApp::instance();
Jeremy Bullock f15907
  ToonzScene *scene = app->getCurrentScene()->getScene();
Jeremy Bullock f15907
  TXsheet *xsh      = scene->getXsheet();
Jeremy Bullock f15907
Jeremy Bullock f15907
  std::wstring levelName = m_levelName.toStdWString();
Jeremy Bullock f15907
  if (levelName.empty()) {
Jeremy Bullock f15907
    DVGui::error(
Jeremy Bullock f15907
        tr("No level name specified: please choose a valid level name"));
Jeremy Bullock f15907
    return false;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (m_usingWebcam) {
Jeremy Bullock f15907
    m_newImage = m_liveViewImage;
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  m_light->hideOverlays();
shun-iwasawa 31accf
Jeremy Bullock f15907
  int frameNumber = m_frameNumber;
Jeremy Bullock f15907
Jeremy Bullock f15907
  /* create parent directory if it does not exist */
Jeremy Bullock f15907
  TFilePath parentDir     = scene->decodeFilePath(TFilePath(m_filePath));
Jeremy Bullock f15907
  TFilePath fullResFolder = scene->decodeFilePath(
Jeremy Bullock f15907
      TFilePath(m_filePath) + TFilePath(levelName + L"_FullRes"));
Jeremy Bullock f15907
  TFilePath liveViewFolder = scene->decodeFilePath(
Jeremy Bullock f15907
      TFilePath(m_filePath) + TFilePath(levelName + L"_LiveView"));
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath levelFp = TFilePath(m_filePath) +
Jeremy Bullock f15907
                      TFilePath(levelName + L".." + m_fileType.toStdWString());
Jeremy Bullock f15907
  TFilePath actualLevelFp = scene->decodeFilePath(levelFp);
shun-iwasawa 31accf
  TFilePath actualFile(actualLevelFp.withFrame(frameNumber));
Jeremy Bullock f15907
  TFilePath fullResFp =
Jeremy Bullock f15907
      scene->decodeFilePath(fullResFolder + TFilePath(levelName + L"..jpg"));
Jeremy Bullock f15907
  TFilePath fullResFile(fullResFp.withFrame(frameNumber));
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath liveViewFp =
Jeremy Bullock f15907
      scene->decodeFilePath(liveViewFolder + TFilePath(levelName + L"..jpg"));
Jeremy Bullock f15907
  TFilePath liveViewFile(liveViewFp.withFrame(frameNumber));
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath tempFile = parentDir + "temp.jpg";
Jeremy Bullock f15907
Jeremy Bullock f15907
  TXshSimpleLevel *sl = 0;
Jeremy Bullock f15907
  TXshLevel *level    = scene->getLevelSet()->getLevel(levelName);
Jeremy Bullock f15907
  enum State { NEWLEVEL = 0, ADDFRAME, OVERWRITE } state;
Jeremy Bullock f15907
Jeremy Bullock f15907
  /* if the level already exists in the scene cast */
Jeremy Bullock f15907
  if (level) {
Jeremy Bullock f15907
    /* if the existing level is not a raster level, then return */
Jeremy Bullock f15907
    if (level->getType() != OVL_XSHLEVEL) {
Jeremy Bullock f15907
      DVGui::error(
Jeremy Bullock f15907
          tr("The level name specified is already used: please choose a "
Jeremy Bullock f15907
             "different level name."));
Jeremy Bullock f15907
      return false;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    /* if the existing level does not match file path and pixel size, then
Jeremy Bullock f15907
     * return */
Jeremy Bullock f15907
    sl = level->getSimpleLevel();
Jeremy Bullock f15907
    if (scene->decodeFilePath(sl->getPath()) != actualLevelFp) {
Jeremy Bullock f15907
      DVGui::error(
Jeremy Bullock f15907
          tr("The save in path specified does not match with the existing "
Jeremy Bullock f15907
             "level."));
Jeremy Bullock f15907
      return false;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    if (sl->getProperties()->getImageRes() !=
Jeremy Bullock f15907
        TDimension(m_newImage->getLx(), m_newImage->getLy())) {
Jeremy Bullock f15907
      DVGui::error(tr(
Jeremy Bullock f15907
          "The captured image size does not match with the existing level."));
Jeremy Bullock f15907
      return false;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    /* if the level already have the same frame, then ask if overwrite it */
Jeremy Bullock f15907
    TFilePath frameFp(actualLevelFp.withFrame(frameNumber));
Jeremy Bullock f15907
    if (TFileStatus(frameFp).doesExist()) {
Jeremy Bullock f15907
      QString question =
Jeremy Bullock f15907
          tr("File %1 already exists.\nDo you want to overwrite it?")
Jeremy Bullock f15907
              .arg(toQString(frameFp));
Jeremy Bullock f15907
      int ret = DVGui::MsgBox(question, QObject::tr("Overwrite"),
Jeremy Bullock f15907
                              QObject::tr("Cancel"));
Jeremy Bullock f15907
      if (ret == 0 || ret == 2) return false;
Jeremy Bullock f15907
      state = OVERWRITE;
Jeremy Bullock f15907
    } else
Jeremy Bullock f15907
      state = ADDFRAME;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  /* if the level does not exist in the scene cast */
Jeremy Bullock f15907
  else {
Jeremy Bullock f15907
    /* if the file does exist, load it first */
Jeremy Bullock f15907
    if (TSystem::doesExistFileOrLevel(actualLevelFp)) {
Jeremy Bullock f15907
      level = scene->loadLevel(actualLevelFp);
Jeremy Bullock f15907
      if (!level) {
Jeremy Bullock f15907
        DVGui::error(tr("Failed to load %1.").arg(toQString(actualLevelFp)));
Jeremy Bullock f15907
        return false;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
Jeremy Bullock f15907
      /* if the loaded level does not match in pixel size, then return */
Jeremy Bullock f15907
      sl = level->getSimpleLevel();
shun-iwasawa 6bac0f
      if (!sl || sl->getProperties()->getImageRes() !=
shun-iwasawa 6bac0f
                     TDimension(m_newImage->getLx(), m_newImage->getLy())) {
Jeremy Bullock f15907
        DVGui::error(
Jeremy Bullock f15907
            tr("The captured image size does not match with the existing "
Jeremy Bullock f15907
               "level."));
Jeremy Bullock f15907
        return false;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
Jeremy Bullock f15907
      /* confirm overwrite */
Jeremy Bullock f15907
      TFilePath frameFp(actualLevelFp.withFrame(frameNumber));
Jeremy Bullock f15907
      if (TFileStatus(frameFp).doesExist()) {
Jeremy Bullock f15907
        QString question =
Jeremy Bullock f15907
            tr("File %1 already exists.\nDo you want to overwrite it?")
Jeremy Bullock f15907
                .arg(toQString(frameFp));
Jeremy Bullock f15907
        int ret = DVGui::MsgBox(question, QObject::tr("Overwrite"),
Jeremy Bullock f15907
                                QObject::tr("Cancel"));
Jeremy Bullock f15907
        if (ret == 0 || ret == 2) return false;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    /* if the file does not exist, then create a new level */
Jeremy Bullock f15907
    else {
Jeremy Bullock f15907
      TXshLevel *level = scene->createNewLevel(OVL_XSHLEVEL, levelName,
Jeremy Bullock f15907
                                               TDimension(), 0, levelFp);
shun-iwasawa 6bac0f
      sl               = level->getSimpleLevel();
Jeremy Bullock f15907
      sl->setPath(levelFp, true);
Jeremy Bullock f15907
      sl->getProperties()->setDpiPolicy(LevelProperties::DP_CustomDpi);
Jeremy Bullock f15907
      TPointD dpi;
Jeremy Bullock f15907
      // Right now always set the dpi to scale to the camera width
Jeremy Bullock f15907
      if (Preferences::instance()->getPixelsOnly() && false)
Jeremy Bullock f15907
        dpi = getCurrentCameraDpi();
Jeremy Bullock f15907
      // Compute the dpi so that the image will fit
Jeremy Bullock f15907
      // to the camera frame
Jeremy Bullock f15907
      else {
Jeremy Bullock f15907
        TCamera *camera =
Jeremy Bullock f15907
            TApp::instance()->getCurrentScene()->getScene()->getCurrentCamera();
Jeremy Bullock f15907
        TDimensionD size  = camera->getSize();
Jeremy Bullock f15907
        double minimumDpi = std::min(m_newImage->getLx() / size.lx,
Jeremy Bullock f15907
                                     m_newImage->getLy() / size.ly);
shun-iwasawa 6bac0f
        dpi               = TPointD(minimumDpi, minimumDpi);
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      sl->getProperties()->setDpi(dpi.x);
Jeremy Bullock f15907
      sl->getProperties()->setImageDpi(dpi);
Jeremy Bullock f15907
      sl->getProperties()->setImageRes(
Jeremy Bullock f15907
          TDimension(m_newImage->getLx(), m_newImage->getLy()));
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
Jeremy Bullock f15907
    state = NEWLEVEL;
Jeremy Bullock f15907
    getSubsampling();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (!TFileStatus(parentDir).doesExist()) {
Jeremy Bullock f15907
    QString question;
Jeremy Bullock f15907
    question = tr("Folder %1 doesn't exist.\nDo you want to create it?")
Jeremy Bullock f15907
                   .arg(toQString(parentDir));
Jeremy Bullock f15907
    int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"));
Jeremy Bullock f15907
    if (ret == 0 || ret == 2) return false;
Jeremy Bullock f15907
    try {
Jeremy Bullock f15907
      TSystem::mkDir(parentDir);
Jeremy Bullock f15907
      DvDirModel::instance()->refreshFolder(parentDir.getParentDir());
Jeremy Bullock f15907
    } catch (...) {
Jeremy Bullock f15907
      DVGui::error(tr("Unable to create") + toQString(parentDir));
Jeremy Bullock f15907
      return false;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  if (!m_usingWebcam) {
Jeremy Bullock f15907
    if (!TFileStatus(fullResFolder).doesExist()) {
Jeremy Bullock f15907
      try {
Jeremy Bullock f15907
        TSystem::mkDir(fullResFolder);
Jeremy Bullock f15907
        DvDirModel::instance()->refreshFolder(fullResFolder.getParentDir());
Jeremy Bullock f15907
      } catch (...) {
Jeremy Bullock f15907
        DVGui::error(tr("Unable to create") + toQString(fullResFolder));
Jeremy Bullock f15907
        return false;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    if (!TFileStatus(liveViewFolder).doesExist()) {
Jeremy Bullock f15907
      try {
Jeremy Bullock f15907
        TSystem::mkDir(liveViewFolder);
Jeremy Bullock f15907
        DvDirModel::instance()->refreshFolder(liveViewFolder.getParentDir());
Jeremy Bullock f15907
      } catch (...) {
Jeremy Bullock f15907
        DVGui::error(tr("Unable to create") + toQString(liveViewFolder));
Jeremy Bullock f15907
        return false;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  // move the temp file
Jeremy Bullock f15907
  if (!m_usingWebcam) {
shun-iwasawa 31accf
    if (m_canon->m_useScaledImages) {
Jeremy Bullock f15907
      TSystem::copyFile(fullResFile, tempFile);
Jeremy Bullock f15907
      TSystem::deleteFile(tempFile);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    if (m_hasLineUpImage) {
shun-iwasawa 31accf
      JpgConverter::saveJpg(m_lineUpImage, liveViewFile);
shun-iwasawa 31accf
      // check the live view image map to see if there is already
shun-iwasawa 31accf
      // an image with this framenumber.  Overwrite if it exists
shun-iwasawa 31accf
      std::map<int, traster32p="">::iterator it;</int,>
shun-iwasawa 31accf
      it = m_liveViewImageMap.find(frameNumber);
shun-iwasawa 31accf
      if (it != m_liveViewImageMap.end()) {
shun-iwasawa 31accf
        m_liveViewImageMap.find(frameNumber)->second = m_lineUpImage;
shun-iwasawa 31accf
        return true;
shun-iwasawa 31accf
      } else {
shun-iwasawa 31accf
        m_liveViewImageMap.insert(
shun-iwasawa 31accf
            std::pair<int, traster32p="">(m_frameNumber, m_lineUpImage));</int,>
shun-iwasawa 31accf
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFrameId fid(frameNumber);
Jeremy Bullock f15907
  TPointD levelDpi = sl->getDpi();
Jeremy Bullock f15907
  /* create the raster */
Jeremy Bullock f15907
  TRaster32P raster = m_newImage;
Jeremy Bullock f15907
Jeremy Bullock f15907
  TRasterImageP ri(raster);
Jeremy Bullock f15907
  ri->setDpi(levelDpi.x, levelDpi.y);
Jeremy Bullock f15907
Jeremy Bullock f15907
  /* setting the frame */
Jeremy Bullock f15907
  sl->setFrame(fid, ri);
Jeremy Bullock f15907
Jeremy Bullock f15907
  /* set dirty flag */
Jeremy Bullock f15907
  sl->getProperties()->setDirtyFlag(true);
Jeremy Bullock f15907
  sl->getProperties()->setIsStopMotion(true);
Jeremy Bullock f15907
  sl->setIsReadOnly(true);
Jeremy Bullock f15907
Jeremy Bullock f15907
  // if (m_saveOnCaptureCB->isChecked()) sl->save();
Jeremy Bullock f15907
  // for now always save.  This can be tweaked later
Jeremy Bullock f15907
  sl->save();
shun-iwasawa 31accf
  m_sl = sl;
shun-iwasawa 31accf
  if (getReviewTime() > 0 && !m_isTimeLapse) {
shun-iwasawa 31accf
    m_liveViewStatus = LiveViewPaused;
shun-iwasawa 31accf
    m_reviewTimer->start(getReviewTime() * 1000);
shun-iwasawa 31accf
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  /* placement in xsheet */
Jeremy Bullock f15907
  if (!getPlaceOnXSheet()) {
Jeremy Bullock f15907
    postImportProcess();
Jeremy Bullock f15907
    return true;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  int row = m_xSheetFrameNumber - 1;
Jeremy Bullock f15907
  int col = app->getCurrentColumn()->getColumnIndex();
Jeremy Bullock f15907
Jeremy Bullock f15907
  // if the level is newly created or imported, then insert a new column
Jeremy Bullock f15907
  if (state == NEWLEVEL) {
Jeremy Bullock f15907
    if (!xsh->isColumnEmpty(col)) {
Jeremy Bullock f15907
      col += 1;
Jeremy Bullock f15907
      xsh->insertColumn(col);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    xsh->insertCells(row, col);
Jeremy Bullock f15907
    xsh->setCell(row, col, TXshCell(sl, fid));
Jeremy Bullock f15907
    app->getCurrentColumn()->setColumnIndex(col);
shun-iwasawa 31accf
    if (getReviewTime() == 0 || m_isTimeLapse)
shun-iwasawa 31accf
      app->getCurrentFrame()->setFrame(row + 1);
Jeremy Bullock f15907
    m_xSheetFrameNumber = row + 2;
Jeremy Bullock f15907
    emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
Jeremy Bullock f15907
    postImportProcess();
Jeremy Bullock f15907
    // if (m_newImage->getLx() > 2000) {
Jeremy Bullock f15907
    //  m_subsampling = 4;
Jeremy Bullock f15907
    //  setSubsampling();
Jeremy Bullock f15907
    //}
Jeremy Bullock f15907
    return true;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  // state == OVERWRITE, ADDFRAME
Jeremy Bullock f15907
Jeremy Bullock f15907
  // if the same cell is already in the column, then just replace the content
Jeremy Bullock f15907
  // and do not set a new cell
Jeremy Bullock f15907
  int foundCol, foundRow = -1;
Jeremy Bullock f15907
  // most possibly, it's in the current column
Jeremy Bullock f15907
  int rowCheck;
Jeremy Bullock f15907
  if (findCell(xsh, col, TXshCell(sl, fid), rowCheck)) {
Jeremy Bullock f15907
    postImportProcess();
Jeremy Bullock f15907
    return true;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  if (rowCheck >= 0) {
Jeremy Bullock f15907
    foundRow = rowCheck;
Jeremy Bullock f15907
    foundCol = col;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  // search entire xsheet
Jeremy Bullock f15907
  for (int c = 0; c < xsh->getColumnCount(); c++) {
Jeremy Bullock f15907
    if (c == col) continue;
Jeremy Bullock f15907
    if (findCell(xsh, c, TXshCell(sl, fid), rowCheck)) {
Jeremy Bullock f15907
      postImportProcess();
Jeremy Bullock f15907
      return true;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    if (rowCheck >= 0) {
Jeremy Bullock f15907
      foundRow = rowCheck;
Jeremy Bullock f15907
      foundCol = c;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  // note found row represents the last row found that uses
Jeremy Bullock f15907
  // the active level
Jeremy Bullock f15907
Jeremy Bullock f15907
  // if there is a column containing the same level
Jeremy Bullock f15907
  if (foundRow >= 0) {
Jeremy Bullock f15907
    // put the cell at the bottom
Jeremy Bullock f15907
    xsh->insertCells(row, foundCol);
Jeremy Bullock f15907
    xsh->setCell(row, foundCol, TXshCell(sl, fid));
Jeremy Bullock f15907
    app->getCurrentColumn()->setColumnIndex(foundCol);
shun-iwasawa 31accf
    if (getReviewTime() == 0 || m_isTimeLapse)
shun-iwasawa 31accf
      app->getCurrentFrame()->setFrame(row + 1);
Jeremy Bullock f15907
    m_xSheetFrameNumber = row + 2;
Jeremy Bullock f15907
    emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  // if the level is registered in the scene, but is not placed in the xsheet,
Jeremy Bullock f15907
  // then insert a new column
Jeremy Bullock f15907
  else {
Jeremy Bullock f15907
    if (!xsh->isColumnEmpty(col)) {
Jeremy Bullock f15907
      col += 1;
Jeremy Bullock f15907
      xsh->insertColumn(col);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    xsh->setCell(row, col, TXshCell(sl, fid));
Jeremy Bullock f15907
    app->getCurrentColumn()->setColumnIndex(col);
shun-iwasawa 31accf
    if (getReviewTime() == 0 || m_isTimeLapse)
shun-iwasawa 31accf
      app->getCurrentFrame()->setFrame(row + 1);
Jeremy Bullock f15907
    m_xSheetFrameNumber = row + 2;
Jeremy Bullock f15907
    emit(xSheetFrameNumberChanged(m_xSheetFrameNumber));
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  postImportProcess();
Jeremy Bullock f15907
  return true;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::captureImage() {
shun-iwasawa 31accf
  if (m_isTimeLapse && !m_intervalStarted) {
shun-iwasawa 31accf
    startInterval();
shun-iwasawa 31accf
    return;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  if (m_isTimeLapse && m_intervalStarted && m_intervalTimer->isActive()) {
shun-iwasawa 31accf
    stopInterval();
shun-iwasawa 31accf
    return;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  if (!m_hasLiveViewImage || m_liveViewStatus != LiveViewOpen) {
shun-iwasawa 31accf
    DVGui::warning(tr("Cannot capture image unless live view is active."));
shun-iwasawa 31accf
    return;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  bool sessionOpen = false;
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  sessionOpen = m_canon->m_sessionOpen;
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
  if ((!m_usingWebcam && !sessionOpen) || m_userCalledPause) {
shun-iwasawa 2c27a4
    DVGui::warning(tr("Please start live view before capturing an image."));
Jeremy Bullock f15907
    return;
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
Jeremy Bullock f15907
  if (m_usingWebcam) {
shun-iwasawa 31accf
    captureWebcamImage();
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    captureDslrImage();
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::captureWebcamImage() {
shun-iwasawa 31accf
  if (m_light->useOverlays()) {
shun-iwasawa 31accf
    m_light->showOverlays();
shun-iwasawa 31accf
    m_webcamOverlayTimer->start(500);
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    if (getReviewTime() > 0 && !m_isTimeLapse) {
Jeremy Bullock f15907
      m_timer->stop();
shun-iwasawa 31accf
      if (m_liveViewStatus > LiveViewClosed) {
shun-iwasawa 31accf
        // m_liveViewStatus = LiveViewPaused;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    m_lineUpImage    = m_liveViewImage;
Jeremy Bullock f15907
    m_hasLineUpImage = true;
Jeremy Bullock f15907
    emit(newLiveViewImageReady());
Jeremy Bullock f15907
    importImage();
Jeremy Bullock f15907
    return;
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
}
Jeremy Bullock f15907
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
shun-iwasawa 31accf
void StopMotion::captureWebcamOnTimeout() {
shun-iwasawa 31accf
  if (getReviewTime() > 0 && !m_isTimeLapse) {
shun-iwasawa 31accf
    m_timer->stop();
shun-iwasawa 31accf
    if (m_liveViewStatus > LiveViewClosed) {
shun-iwasawa 31accf
      // m_liveViewStatus = LiveViewPaused;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
  m_lineUpImage    = m_liveViewImage;
shun-iwasawa 31accf
  m_hasLineUpImage = true;
shun-iwasawa 31accf
  emit(newLiveViewImageReady());
shun-iwasawa 31accf
  importImage();
shun-iwasawa 31accf
  return;
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
void StopMotion::captureDslrImage() {
shun-iwasawa 31accf
  m_light->showOverlays();
Jeremy Bullock f15907
shun-iwasawa 31accf
  if (getReviewTime() > 0 && !m_isTimeLapse) {
Jeremy Bullock f15907
    m_timer->stop();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
shun-iwasawa 31accf
  if (m_liveViewStatus > LiveViewClosed && !m_isTimeLapse) {
shun-iwasawa 31accf
    // m_liveViewStatus = LiveViewPaused;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (m_hasLiveViewImage) {
Jeremy Bullock f15907
    m_lineUpImage    = m_liveViewImage;
Jeremy Bullock f15907
    m_hasLineUpImage = true;
Jeremy Bullock f15907
    emit(newLiveViewImageReady());
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  TApp *app         = TApp::instance();
Jeremy Bullock f15907
  ToonzScene *scene = app->getCurrentScene()->getScene();
Jeremy Bullock f15907
Jeremy Bullock f15907
  int frameNumber        = m_frameNumber;
Jeremy Bullock f15907
  std::wstring levelName = m_levelName.toStdWString();
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath parentDir = scene->decodeFilePath(TFilePath(m_filePath));
Jeremy Bullock f15907
  TFilePath tempFile  = parentDir + "temp.jpg";
Jeremy Bullock f15907
Jeremy Bullock f15907
  if (!TFileStatus(parentDir).doesExist()) {
Jeremy Bullock f15907
    TSystem::mkDir(parentDir);
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  m_tempFile = tempFile.getQString();
Jeremy Bullock f15907
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  m_canon->takePicture();
Jeremy Bullock f15907
#endif
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::postImportProcess() {
shun-iwasawa 31accf
  saveXmlFile();
Jeremy Bullock f15907
  if (Preferences::instance()->isShowFrameNumberWithLettersEnabled()) {
Jeremy Bullock f15907
    int f = m_frameNumber;
Jeremy Bullock f15907
    if (f % 10 == 0)  // next number
Jeremy Bullock f15907
      m_frameNumber = ((int)(f / 10) + 1) * 10;
Jeremy Bullock f15907
    else  // next alphabet
Jeremy Bullock f15907
      m_frameNumber = f + 1;
Jeremy Bullock f15907
  } else
Jeremy Bullock f15907
    m_frameNumber += 1;
Jeremy Bullock f15907
  emit(frameNumberChanged(m_frameNumber));
Jeremy Bullock f15907
  /* notify */
Jeremy Bullock f15907
  refreshFrameInfo();
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (m_isTimeLapse && m_intervalStarted) restartInterval();
shun-iwasawa 31accf
Jeremy Bullock f15907
  TApp::instance()->getCurrentScene()->notifySceneChanged();
Jeremy Bullock f15907
  TApp::instance()->getCurrentScene()->notifyCastChange();
Jeremy Bullock f15907
  TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
void StopMotion::saveXmlFile() {
shun-iwasawa 31accf
  TApp *app         = TApp::instance();
shun-iwasawa 31accf
  ToonzScene *scene = app->getCurrentScene()->getScene();
shun-iwasawa 31accf
  TXsheet *xsh      = scene->getXsheet();
shun-iwasawa 31accf
shun-iwasawa 31accf
  std::wstring levelName = m_levelName.toStdWString();
shun-iwasawa 31accf
  TFilePath parentDir    = scene->decodeFilePath(TFilePath(m_filePath));
shun-iwasawa 31accf
  TFilePath tempFile     = parentDir + TFilePath(levelName + L".xml");
shun-iwasawa 31accf
  QString xmlFileName    = tempFile.getQString();
shun-iwasawa 31accf
  QFile xmlFile(xmlFileName);
shun-iwasawa 31accf
  xmlFile.open(QIODevice::WriteOnly);
shun-iwasawa 31accf
  QXmlStreamWriter xmlWriter(&xmlFile);
shun-iwasawa 31accf
  xmlWriter.setAutoFormatting(true);
shun-iwasawa 31accf
  xmlWriter.writeStartDocument();
shun-iwasawa 31accf
  xmlWriter.writeStartElement("body");
shun-iwasawa 31accf
  xmlWriter.writeStartElement("SceneInfo");
shun-iwasawa 31accf
  xmlWriter.writeTextElement("LevelName", QString::fromStdWString(levelName));
shun-iwasawa 31accf
  xmlWriter.writeTextElement("CurrentFrame",
shun-iwasawa 31accf
                             QString::number(m_xSheetFrameNumber));
shun-iwasawa 31accf
  xmlWriter.writeEndElement();
shun-iwasawa 31accf
shun-iwasawa 31accf
  xmlWriter.writeStartElement("CameraInfo");
shun-iwasawa 31accf
  if (m_usingWebcam) {
shun-iwasawa 31accf
    xmlWriter.writeTextElement("Webcam", "yes");
shun-iwasawa 31accf
    xmlWriter.writeTextElement("CameraName", m_webcam->getWebcamDescription());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("CameraResolutionX",
shun-iwasawa 31accf
                               QString::number(m_webcam->getWebcamWidth()));
shun-iwasawa 31accf
    xmlWriter.writeTextElement("CameraResolutionY",
shun-iwasawa 31accf
                               QString::number(m_webcam->getWebcamHeight()));
shun-iwasawa 31accf
  } else {
shun-iwasawa 31accf
    xmlWriter.writeTextElement("Webcam", "no");
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
    xmlWriter.writeTextElement("CameraName",
shun-iwasawa 31accf
                               QString::fromStdString(m_canon->m_cameraName));
shun-iwasawa 31accf
    xmlWriter.writeTextElement("Aperture", m_canon->getCurrentAperture());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("ShutterSpeed",
shun-iwasawa 31accf
                               m_canon->getCurrentShutterSpeed());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("ISO", m_canon->getCurrentIso());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("PictureStyle",
shun-iwasawa 31accf
                               m_canon->getCurrentPictureStyle());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("ImageQuality",
shun-iwasawa 31accf
                               m_canon->getCurrentImageQuality());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("WhiteBalance",
shun-iwasawa 31accf
                               m_canon->getCurrentWhiteBalance());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("ColorTemperature",
shun-iwasawa 31accf
                               m_canon->getCurrentColorTemperature());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("ExposureCompensation",
shun-iwasawa 31accf
                               m_canon->getCurrentExposureCompensation());
shun-iwasawa 31accf
    xmlWriter.writeTextElement("FocusCheckLocationX",
shun-iwasawa 31accf
                               QString::number(m_canon->m_finalZoomPoint.x));
shun-iwasawa 31accf
    xmlWriter.writeTextElement("FocusCheckLocationY",
shun-iwasawa 31accf
                               QString::number(m_canon->m_finalZoomPoint.y));
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  xmlWriter.writeEndElement();
shun-iwasawa 31accf
shun-iwasawa 31accf
  xmlWriter.writeStartElement("Images");
shun-iwasawa 31accf
  xmlWriter.writeTextElement("Frame", "Yes");
shun-iwasawa 31accf
  xmlWriter.writeEndElement();
shun-iwasawa 31accf
  xmlWriter.writeEndElement();
shun-iwasawa 31accf
  xmlWriter.writeEndDocument();
shun-iwasawa 31accf
  xmlFile.close();
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
bool StopMotion::loadXmlFile() {
shun-iwasawa 31accf
  TApp *app         = TApp::instance();
shun-iwasawa 31accf
  ToonzScene *scene = app->getCurrentScene()->getScene();
shun-iwasawa 31accf
  TXsheet *xsh      = scene->getXsheet();
shun-iwasawa 31accf
shun-iwasawa 31accf
  bool webcam      = false;
shun-iwasawa 31accf
  bool foundCamera = false;
shun-iwasawa 31accf
  QString text;
shun-iwasawa 31accf
  int x;
shun-iwasawa 31accf
  int y;
shun-iwasawa 31accf
shun-iwasawa 31accf
  std::wstring levelName = m_levelName.toStdWString();
shun-iwasawa 31accf
  TFilePath parentDir    = scene->decodeFilePath(TFilePath(m_filePath));
shun-iwasawa 31accf
  TFilePath tempFile     = parentDir + TFilePath(levelName + L".xml");
shun-iwasawa 31accf
  QString xmlFileName    = tempFile.getQString();
shun-iwasawa 31accf
  QFile xmlFile(xmlFileName);
shun-iwasawa 31accf
  if (!xmlFile.exists()) return false;
shun-iwasawa 31accf
  xmlFile.open(QIODevice::ReadOnly);
shun-iwasawa 31accf
shun-iwasawa 31accf
  QXmlStreamReader xmlReader;
shun-iwasawa 31accf
  xmlReader.setDevice(&xmlFile);
shun-iwasawa 31accf
  xmlReader.readNext();
shun-iwasawa 31accf
  while (!xmlReader.atEnd()) {
shun-iwasawa 31accf
    if (xmlReader.isStartElement()) {
shun-iwasawa 31accf
      if (xmlReader.name() == "Webcam") {
shun-iwasawa 6bac0f
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (text == "yes") webcam = true;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "CameraName") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (webcam) {
shun-iwasawa 31accf
          QList<qcamerainfo> cameras = QCameraInfo::availableCameras();</qcamerainfo>
shun-iwasawa 31accf
          if (cameras.size() > 0) {
shun-iwasawa 31accf
            for (int i = 0; i < cameras.size(); i++) {
shun-iwasawa 31accf
              if (cameras.at(i).description() == text) {
shun-iwasawa 31accf
                changeCameras(i + 1);
shun-iwasawa 31accf
                foundCamera = true;
shun-iwasawa 31accf
                break;
shun-iwasawa 31accf
              }
shun-iwasawa 31accf
            }
shun-iwasawa 31accf
          }
shun-iwasawa 31accf
        } else {
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
          QString camName = "";
shun-iwasawa 31accf
          if (m_canon->getCameraCount() > 0) {
shun-iwasawa 31accf
            m_canon->openCameraSession();
shun-iwasawa 31accf
            camName = QString::fromStdString(m_canon->getCameraName());
shun-iwasawa 31accf
            m_canon->closeCameraSession();
shun-iwasawa 31accf
          }
shun-iwasawa 31accf
          if (text == camName) {
shun-iwasawa 31accf
            changeCameras(-1);
shun-iwasawa 31accf
            foundCamera = true;
shun-iwasawa 31accf
          }
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "CameraResolutionX") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        x    = text.toInt();
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "CameraResolutionY") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        y    = text.toInt();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == true) {
shun-iwasawa 31accf
          setWebcamResolution(
shun-iwasawa 31accf
              QString(QString::number(x) + " x " + QString::number(y)));
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
      if (xmlReader.name() == "Aperture") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setAperture(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "ShutterSpeed") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setShutterSpeed(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "ISO") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setIso(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "PictureStyle") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setPictureStyle(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "ImageQuality") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setImageQuality(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "WhiteBalance") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setWhiteBalance(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "ColorTemperature") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setColorTemperature(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "ExposureCompensation") {
shun-iwasawa 31accf
        text = xmlReader.readElementText();
shun-iwasawa 31accf
        if (foundCamera == true && webcam == false) {
shun-iwasawa 31accf
          m_canon->setExposureCompensation(text);
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "FocusCheckLocationX") {
shun-iwasawa 31accf
        text                        = xmlReader.readElementText();
shun-iwasawa 31accf
        m_canon->m_finalZoomPoint.x = text.toInt();
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
      if (xmlReader.name() == "FocusCheckLocationY") {
shun-iwasawa 31accf
        text                        = xmlReader.readElementText();
shun-iwasawa 31accf
        m_canon->m_finalZoomPoint.y = text.toInt();
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    xmlReader.readNext();
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  return true;
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
bool StopMotion::exportImageSequence() {
shun-iwasawa 31accf
  TApp *app         = TApp::instance();
shun-iwasawa 31accf
  ToonzScene *scene = app->getCurrentScene()->getScene();
shun-iwasawa 31accf
  TXsheet *xsh      = scene->getXsheet();
shun-iwasawa 31accf
shun-iwasawa 31accf
  std::wstring levelName = m_levelName.toStdWString();
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (levelName.empty()) {
shun-iwasawa 31accf
    DVGui::error(
shun-iwasawa 31accf
        tr("No level name specified: please choose a valid level name"));
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  int frameNumber = m_frameNumber;
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath parentDir     = scene->decodeFilePath(TFilePath(m_filePath));
shun-iwasawa 31accf
  TFilePath fullResFolder = scene->decodeFilePath(
shun-iwasawa 31accf
      TFilePath(m_filePath) + TFilePath(levelName + L"_FullRes"));
shun-iwasawa 31accf
  TFilePath liveViewFolder = scene->decodeFilePath(
shun-iwasawa 31accf
      TFilePath(m_filePath) + TFilePath(levelName + L"_LiveView"));
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath levelFp = TFilePath(m_filePath) +
shun-iwasawa 31accf
                      TFilePath(levelName + L".." + m_fileType.toStdWString());
shun-iwasawa 31accf
  TFilePath actualLevelFp = scene->decodeFilePath(levelFp);
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath fullResFp =
shun-iwasawa 31accf
      scene->decodeFilePath(fullResFolder + TFilePath(levelName + L"..jpg"));
shun-iwasawa 31accf
  TFilePath fullResFile(fullResFp.withFrame(frameNumber));
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath liveViewFp =
shun-iwasawa 31accf
      scene->decodeFilePath(liveViewFolder + TFilePath(levelName + L"..jpg"));
shun-iwasawa 31accf
  TFilePath liveViewFile(liveViewFp.withFrame(frameNumber));
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath tempFile = parentDir + "temp.jpg";
shun-iwasawa 31accf
shun-iwasawa 31accf
  TXshSimpleLevel *sl = 0;
shun-iwasawa 31accf
  TXshLevel *level    = scene->getLevelSet()->getLevel(levelName);
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (level == NULL) {
shun-iwasawa 31accf
    DVGui::error(tr("No level exists with the current name."));
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  /* if the existing level is not a raster level, then return */
shun-iwasawa 31accf
  if (level->getType() != OVL_XSHLEVEL) {
shun-iwasawa 31accf
    DVGui::error(tr("This is not an image level."));
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  if (!level->getSimpleLevel()->getProperties()->isStopMotionLevel()) {
shun-iwasawa 31accf
    DVGui::error(tr("This is not a stop motion level."));
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  sl = level->getSimpleLevel();
shun-iwasawa 31accf
shun-iwasawa 31accf
  if (scene->decodeFilePath(sl->getPath()) != actualLevelFp) {
shun-iwasawa 31accf
    DVGui::error(
shun-iwasawa 31accf
        tr("The save in path specified does not match with the existing "
shun-iwasawa 31accf
           "level."));
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  // find which column the level is on.
shun-iwasawa 31accf
  // check with the first column
shun-iwasawa 31accf
  int col = TApp::instance()->getCurrentColumn()->getColumnIndex();
shun-iwasawa 31accf
  int r0, r1, row;
shun-iwasawa 31accf
  xsh->getColumn(col)->getRange(r0, r1);
shun-iwasawa 31accf
  TXshSimpleLevel *colLevel = xsh->getCell(r0, col).getSimpleLevel();
shun-iwasawa 31accf
  if (colLevel != sl) {
shun-iwasawa 31accf
    int cols = xsh->getColumnCount();
shun-iwasawa 31accf
    for (int i = 0; i < cols; i++) {
shun-iwasawa 31accf
      xsh->getColumn(col)->getRange(r0, r1);
shun-iwasawa 31accf
      colLevel = xsh->getCell(r0, col).getSimpleLevel();
shun-iwasawa 31accf
      if (colLevel == sl) {
shun-iwasawa 31accf
        col = i;
shun-iwasawa 31accf
        break;
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    DVGui::error(tr("Could not find an xsheet level with  the current level"));
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  row = r0;
shun-iwasawa 31accf
  xsh->getColumn(col)->getLevelRange(row, r0, r1);
shun-iwasawa 31accf
shun-iwasawa 31accf
  GenericSaveFilePopup *m_saveSequencePopup =
shun-iwasawa 31accf
      new GenericSaveFilePopup("Export Image Sequence");
shun-iwasawa 31accf
  m_saveSequencePopup->setFileMode(true);
shun-iwasawa 31accf
  TFilePath fp = m_saveSequencePopup->getPath();
shun-iwasawa 31accf
  if (fp == TFilePath()) {
shun-iwasawa 31accf
    DVGui::error(tr("No export path given."));
shun-iwasawa 31accf
    return false;
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
  TFilePath sourceFile;
shun-iwasawa 31accf
  TFilePath exportFilePath =
shun-iwasawa 31accf
      scene->decodeFilePath(fp + TFilePath(levelName + L"..jpg"));
shun-iwasawa 31accf
  TFilePath exportFile;
shun-iwasawa 31accf
  int exportFrameNumber = 1;
shun-iwasawa 31accf
  for (int i = r0; i <= r1; i++) {
shun-iwasawa 31accf
    int cellNumber = xsh->getCell(i, col).getFrameId().getNumber();
shun-iwasawa 31accf
    fullResFile    = fullResFp.withFrame(cellNumber);
shun-iwasawa 31accf
    if (TFileStatus(fullResFile).doesExist()) {
shun-iwasawa 31accf
      sourceFile = fullResFile;
shun-iwasawa 31accf
    } else {
shun-iwasawa 31accf
      sourceFile = actualLevelFp.withFrame(cellNumber);
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
shun-iwasawa 31accf
    if (!TFileStatus(sourceFile).doesExist()) {
shun-iwasawa 31accf
      DVGui::error(tr("Could not find the source file."));
shun-iwasawa 31accf
      return false;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    exportFile = exportFilePath.withFrame(exportFrameNumber);
shun-iwasawa 31accf
    if (TFileStatus(exportFile).doesExist()) {
shun-iwasawa 31accf
      QString question = tr("Overwrite existing files?");
shun-iwasawa 31accf
      int ret          = DVGui::MsgBox(question, QObject::tr("Overwrite"),
shun-iwasawa 31accf
                              QObject::tr("Cancel"));
shun-iwasawa 31accf
      if (ret == 0 || ret == 2) return false;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    TSystem::copyFile(exportFile, sourceFile);
shun-iwasawa 31accf
    exportFrameNumber++;
shun-iwasawa 31accf
    if (!TFileStatus(exportFile).doesExist()) {
shun-iwasawa 31accf
      DVGui::error(tr("An error occurred.  Aborting."));
shun-iwasawa 31accf
      return false;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa c7f5f4
  QString msg = tr("Successfully exported %1 images.")
shun-iwasawa c7f5f4
                    .arg(QString::number(exportFrameNumber - 1));
shun-iwasawa c7f5f4
  DVGui::MsgBoxInPopup(DVGui::MsgType(DVGui::INFORMATION), msg);
shun-iwasawa 31accf
  return true;
shun-iwasawa 31accf
}
shun-iwasawa 31accf
shun-iwasawa 31accf
//-----------------------------------------------------------------------------
shun-iwasawa 31accf
shun-iwasawa 31accf
// Refresh information that how many & which frames are saved for the current
shun-iwasawa 31accf
// level
shun-iwasawa 31accf
void StopMotion::refreshFrameInfo() {
shun-iwasawa 31accf
  bool sessionOpen = false;
shun-iwasawa 31accf
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  sessionOpen = m_canon->m_sessionOpen;
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
shun-iwasawa 31accf
  if ((!sessionOpen && m_liveViewStatus < LiveViewOpen) && !m_usingWebcam) {
Jeremy Bullock f15907
    m_frameInfoText = "";
Jeremy Bullock f15907
    return;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  QString tooltipStr, labelStr;
Jeremy Bullock f15907
  enum InfoType { NEW = 0, ADD, OVERWRITE, WARNING } infoType(WARNING);
Jeremy Bullock f15907
Jeremy Bullock f15907
  static QColor infoColors[4] = {Qt::cyan, Qt::green, Qt::yellow, Qt::red};
Jeremy Bullock f15907
Jeremy Bullock f15907
  ToonzScene *currentScene = TApp::instance()->getCurrentScene()->getScene();
Jeremy Bullock f15907
  TLevelSet *levelSet      = currentScene->getLevelSet();
Jeremy Bullock f15907
Jeremy Bullock f15907
  std::wstring levelName = m_levelName.toStdWString();
Jeremy Bullock f15907
  int frameNumber        = m_frameNumber;
Jeremy Bullock f15907
Jeremy Bullock f15907
  TDimension stopMotionRes;
shun-iwasawa 6bac0f
  bool checkRes = true;
shun-iwasawa 31accf
  if (m_usingWebcam) stopMotionRes = m_liveViewImageDimensions;
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  else if (m_canon->m_useScaledImages ||
shun-iwasawa 31accf
           !m_canon->getCurrentImageQuality().contains("Large")) {
shun-iwasawa 31accf
    stopMotionRes = m_canon->m_proxyImageDimensions;
shun-iwasawa 31accf
    if (m_canon->m_proxyImageDimensions == TDimension(0, 0)) {
Jeremy Bullock f15907
      checkRes = false;
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
  else
Jeremy Bullock f15907
    stopMotionRes = m_fullImageDimensions;
Jeremy Bullock f15907
Jeremy Bullock f15907
  bool letterOptionEnabled =
Jeremy Bullock f15907
      Preferences::instance()->isShowFrameNumberWithLettersEnabled();
Jeremy Bullock f15907
Jeremy Bullock f15907
  // level with the same name
Jeremy Bullock f15907
  TXshLevel *level_sameName = levelSet->getLevel(levelName);
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath levelFp = TFilePath(m_filePath) +
Jeremy Bullock f15907
                      TFilePath(levelName + L".." + m_fileType.toStdWString());
Jeremy Bullock f15907
Jeremy Bullock f15907
  // level with the same path
Jeremy Bullock f15907
  TXshLevel *level_samePath = levelSet->getLevel(*(currentScene), levelFp);
Jeremy Bullock f15907
Jeremy Bullock f15907
  TFilePath actualLevelFp = currentScene->decodeFilePath(levelFp);
Jeremy Bullock f15907
Jeremy Bullock f15907
  // level existence
Jeremy Bullock f15907
  bool levelExist = TSystem::doesExistFileOrLevel(actualLevelFp);
Jeremy Bullock f15907
Jeremy Bullock f15907
  // frame existence
Jeremy Bullock f15907
  TFilePath frameFp(actualLevelFp.withFrame(frameNumber));
shun-iwasawa 6bac0f
  bool frameExist = false;
Jeremy Bullock f15907
  if (levelExist) frameExist = TFileStatus(frameFp).doesExist();
Jeremy Bullock f15907
Jeremy Bullock f15907
  // reset acceptable camera size
Jeremy Bullock f15907
  m_allowedCameraSize = QSize();
Jeremy Bullock f15907
Jeremy Bullock f15907
  // ### CASE 1 ###
Jeremy Bullock f15907
  // If there is no same level registered in the scene cast
Jeremy Bullock f15907
  if (!level_sameName && !level_samePath) {
Jeremy Bullock f15907
    // If there is a level in the file system
Jeremy Bullock f15907
    if (levelExist) {
Jeremy Bullock f15907
      TLevelReaderP lr;
Jeremy Bullock f15907
      TLevelP level_p;
Jeremy Bullock f15907
      try {
Jeremy Bullock f15907
        lr = TLevelReaderP(actualLevelFp);
Jeremy Bullock f15907
      } catch (...) {
Jeremy Bullock f15907
        // TODO: output something
Jeremy Bullock f15907
        m_frameInfoText = tr("UNDEFINED WARNING");
Jeremy Bullock f15907
        return;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      if (!lr) {
Jeremy Bullock f15907
        // TODO: output something
Jeremy Bullock f15907
        m_frameInfoText = tr("UNDEFINED WARNING");
Jeremy Bullock f15907
        return;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      try {
Jeremy Bullock f15907
        level_p = lr->loadInfo();
Jeremy Bullock f15907
      } catch (...) {
Jeremy Bullock f15907
        // TODO: output something
Jeremy Bullock f15907
        m_frameInfoText = tr("UNDEFINED WARNING");
Jeremy Bullock f15907
        return;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      if (!level_p) {
Jeremy Bullock f15907
        // TODO: output something
Jeremy Bullock f15907
        m_frameInfoText = tr("UNDEFINED WARNING");
Jeremy Bullock f15907
        return;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      int frameCount      = level_p->getFrameCount();
Jeremy Bullock f15907
      TLevel::Iterator it = level_p->begin();
Jeremy Bullock f15907
      std::vector<tframeid> fids;</tframeid>
Jeremy Bullock f15907
      for (int i = 0; it != level_p->end(); ++it, ++i)
Jeremy Bullock f15907
        fids.push_back(it->first);
Jeremy Bullock f15907
Jeremy Bullock f15907
      tooltipStr +=
Jeremy Bullock f15907
          tr("The level is not registered in the scene, but exists in the file "
Jeremy Bullock f15907
             "system.");
Jeremy Bullock f15907
Jeremy Bullock f15907
      // check resolution
Jeremy Bullock f15907
      const TImageInfo *ii;
Jeremy Bullock f15907
      try {
Jeremy Bullock f15907
        ii = lr->getImageInfo(fids[0]);
Jeremy Bullock f15907
      } catch (...) {
Jeremy Bullock f15907
        // TODO: output something
Jeremy Bullock f15907
        m_frameInfoText = tr("UNDEFINED WARNING");
Jeremy Bullock f15907
        return;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      TDimension dim(ii->m_lx, ii->m_ly);
Jeremy Bullock f15907
      // if the saved images has not the same resolution as the current camera
Jeremy Bullock f15907
      // resolution
Jeremy Bullock f15907
      if (checkRes && m_hasLiveViewImage && stopMotionRes != dim) {
Jeremy Bullock f15907
        tooltipStr += tr("\nWARNING : Image size mismatch. The saved image "
Jeremy Bullock f15907
                         "size is %1 x %2.")
Jeremy Bullock f15907
                          .arg(dim.lx)
Jeremy Bullock f15907
                          .arg(dim.ly);
Jeremy Bullock f15907
        labelStr += tr("WARNING ");
Jeremy Bullock f15907
        infoType = WARNING;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      // if the resolutions are matched
Jeremy Bullock f15907
      {
Jeremy Bullock f15907
        if (frameCount == 1)
Jeremy Bullock f15907
          tooltipStr += tr("\nFrame %1 exists.")
Jeremy Bullock f15907
                            .arg(fidsToString(fids, letterOptionEnabled));
Jeremy Bullock f15907
        else
Jeremy Bullock f15907
          tooltipStr += tr("\nFrames %1 exist.")
Jeremy Bullock f15907
                            .arg(fidsToString(fids, letterOptionEnabled));
Jeremy Bullock f15907
        // if the frame exists, then it will be overwritten
Jeremy Bullock f15907
        if (frameExist) {
Jeremy Bullock f15907
          labelStr += tr("OVERWRITE 1 of");
Jeremy Bullock f15907
          infoType = OVERWRITE;
Jeremy Bullock f15907
        } else {
Jeremy Bullock f15907
          labelStr += tr("ADD to");
Jeremy Bullock f15907
          infoType = ADD;
Jeremy Bullock f15907
        }
Jeremy Bullock f15907
        if (frameCount == 1)
Jeremy Bullock f15907
          labelStr += tr(" %1 frame").arg(frameCount);
Jeremy Bullock f15907
        else
Jeremy Bullock f15907
          labelStr += tr(" %1 frames").arg(frameCount);
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      m_allowedCameraSize = QSize(dim.lx, dim.ly);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    // If no level exists in the file system, then it will be a new level
Jeremy Bullock f15907
    else {
Jeremy Bullock f15907
      tooltipStr += tr("The level will be newly created.");
Jeremy Bullock f15907
      labelStr += tr("NEW");
Jeremy Bullock f15907
      infoType = NEW;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  // ### CASE 2 ###
Jeremy Bullock f15907
  // If there is already the level registered in the scene cast
Jeremy Bullock f15907
  else if (level_sameName && level_samePath &&
Jeremy Bullock f15907
           level_sameName == level_samePath) {
Jeremy Bullock f15907
    tooltipStr += tr("The level is already registered in the scene.");
Jeremy Bullock f15907
    if (!levelExist) tooltipStr += tr("\nNOTE : The level is not saved.");
Jeremy Bullock f15907
Jeremy Bullock f15907
    std::vector<tframeid> fids;</tframeid>
Jeremy Bullock f15907
    level_sameName->getFids(fids);
Jeremy Bullock f15907
Jeremy Bullock f15907
    // check resolution
Jeremy Bullock f15907
    TDimension dim;
Jeremy Bullock f15907
    bool ret = getRasterLevelSize(level_sameName, dim);
Jeremy Bullock f15907
    if (!ret) {
Jeremy Bullock f15907
      tooltipStr +=
Jeremy Bullock f15907
          tr("\nWARNING : Failed to get image size of the existing level %1.")
Jeremy Bullock f15907
              .arg(QString::fromStdWString(levelName));
Jeremy Bullock f15907
      labelStr += tr("WARNING ");
Jeremy Bullock f15907
      infoType = WARNING;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    // if the saved images has not the same resolution as the current camera
Jeremy Bullock f15907
    // resolution
Jeremy Bullock f15907
    else if (checkRes && m_hasLiveViewImage && stopMotionRes != dim) {
Jeremy Bullock f15907
      tooltipStr += tr("\nWARNING : Image size mismatch. The existing level "
Jeremy Bullock f15907
                       "size is %1 x %2.")
Jeremy Bullock f15907
                        .arg(dim.lx)
Jeremy Bullock f15907
                        .arg(dim.ly);
Jeremy Bullock f15907
      labelStr += tr("WARNING ");
Jeremy Bullock f15907
      infoType = WARNING;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    // if the resolutions are matched
Jeremy Bullock f15907
    {
Jeremy Bullock f15907
      int frameCount = fids.size();
Jeremy Bullock f15907
      if (fids.size() == 1)
Jeremy Bullock f15907
        tooltipStr += tr("\nFrame %1 exists.")
Jeremy Bullock f15907
                          .arg(fidsToString(fids, letterOptionEnabled));
Jeremy Bullock f15907
      else
Jeremy Bullock f15907
        tooltipStr += tr("\nFrames %1 exist.")
Jeremy Bullock f15907
                          .arg(fidsToString(fids, letterOptionEnabled));
Jeremy Bullock f15907
      // Check if the target frame already exist in the level
Jeremy Bullock f15907
      bool hasFrame = false;
Jeremy Bullock f15907
      for (int f = 0; f < frameCount; f++) {
Jeremy Bullock f15907
        if (fids.at(f).getNumber() == frameNumber) {
Jeremy Bullock f15907
          hasFrame = true;
Jeremy Bullock f15907
          break;
Jeremy Bullock f15907
        }
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      // If there is already the frame then it will be overwritten
Jeremy Bullock f15907
      if (hasFrame) {
Jeremy Bullock f15907
        labelStr += tr("OVERWRITE 1 of");
Jeremy Bullock f15907
        infoType = OVERWRITE;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      // Or, the frame will be added to the level
Jeremy Bullock f15907
      else {
Jeremy Bullock f15907
        labelStr += tr("ADD to");
Jeremy Bullock f15907
        infoType = ADD;
Jeremy Bullock f15907
      }
Jeremy Bullock f15907
      if (frameCount == 1)
Jeremy Bullock f15907
        labelStr += tr(" %1 frame").arg(frameCount);
Jeremy Bullock f15907
      else
Jeremy Bullock f15907
        labelStr += tr(" %1 frames").arg(frameCount);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    m_allowedCameraSize = QSize(dim.lx, dim.ly);
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  // ### CASE 3 ###
Jeremy Bullock f15907
  // If there are some conflicts with the existing level.
Jeremy Bullock f15907
  else {
Jeremy Bullock f15907
    if (level_sameName) {
Jeremy Bullock f15907
      TFilePath anotherPath = level_sameName->getPath();
Jeremy Bullock f15907
      tooltipStr +=
Jeremy Bullock f15907
          tr("WARNING : Level name conflicts. There already is a level %1 in the scene with the path\
Jeremy Bullock f15907
                        \n          %2.")
Jeremy Bullock f15907
              .arg(QString::fromStdWString(levelName))
Jeremy Bullock f15907
              .arg(toQString(anotherPath));
Jeremy Bullock f15907
      // check resolution
Jeremy Bullock f15907
      TDimension dim;
Jeremy Bullock f15907
      bool ret = getRasterLevelSize(level_sameName, dim);
Jeremy Bullock f15907
      if (ret && checkRes && m_hasLiveViewImage && stopMotionRes != dim)
Jeremy Bullock f15907
        tooltipStr += tr("\nWARNING : Image size mismatch. The size of level "
Jeremy Bullock f15907
                         "with the same name is is %1 x %2.")
Jeremy Bullock f15907
                          .arg(dim.lx)
Jeremy Bullock f15907
                          .arg(dim.ly);
Jeremy Bullock f15907
      m_allowedCameraSize = QSize(dim.lx, dim.ly);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    if (level_samePath) {
Jeremy Bullock f15907
      std::wstring anotherName = level_samePath->getName();
Jeremy Bullock f15907
      if (!tooltipStr.isEmpty()) tooltipStr += QString("\n");
Jeremy Bullock f15907
      tooltipStr +=
Jeremy Bullock f15907
          tr("WARNING : Level path conflicts. There already is a level with the path %1\
Jeremy Bullock f15907
                        \n          in the scene with the name %2.")
Jeremy Bullock f15907
              .arg(toQString(levelFp))
Jeremy Bullock f15907
              .arg(QString::fromStdWString(anotherName));
Jeremy Bullock f15907
      // check resolution
Jeremy Bullock f15907
      TDimension dim;
Jeremy Bullock f15907
      bool ret = getRasterLevelSize(level_samePath, dim);
Jeremy Bullock f15907
      if (ret && checkRes && m_hasLiveViewImage && stopMotionRes != dim)
Jeremy Bullock f15907
        tooltipStr += tr("\nWARNING : Image size mismatch. The size of level "
Jeremy Bullock f15907
                         "with the same path is %1 x %2.")
Jeremy Bullock f15907
                          .arg(dim.lx)
Jeremy Bullock f15907
                          .arg(dim.ly);
Jeremy Bullock f15907
      m_allowedCameraSize = QSize(dim.lx, dim.ly);
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
    labelStr += tr("WARNING");
Jeremy Bullock f15907
    infoType = WARNING;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  QColor infoColor   = infoColors[(int)infoType];
Jeremy Bullock f15907
  m_infoColorName    = infoColor.name();
Jeremy Bullock f15907
  m_frameInfoText    = labelStr;
Jeremy Bullock f15907
  m_frameInfoToolTip = tooltipStr;
Jeremy Bullock f15907
  emit(frameInfoTextChanged(m_frameInfoText));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::updateLevelNameAndFrame(std::wstring levelName) {
Jeremy Bullock f15907
  if (levelName != m_levelName.toStdWString()) {
Jeremy Bullock f15907
    m_levelName = QString::fromStdWString(levelName);
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
  m_liveViewImageMap.clear();
Jeremy Bullock f15907
  emit(levelNameChanged(m_levelName));
Jeremy Bullock f15907
  // m_previousLevelButton->setDisabled(levelName == L"A");
Jeremy Bullock f15907
Jeremy Bullock f15907
  // set the start frame 10 if the option in preferences
Jeremy Bullock f15907
  // "Show ABC Appendix to the Frame Number in Xsheet Cell" is active.
Jeremy Bullock f15907
  // (frame 10 is displayed as "1" with this option)
Jeremy Bullock f15907
  bool withLetter =
Jeremy Bullock f15907
      Preferences::instance()->isShowFrameNumberWithLettersEnabled();
Jeremy Bullock f15907
Jeremy Bullock f15907
  TLevelSet *levelSet =
Jeremy Bullock f15907
      TApp::instance()->getCurrentScene()->getScene()->getLevelSet();
Jeremy Bullock f15907
  TXshLevel *level_p = levelSet->getLevel(levelName);
Jeremy Bullock f15907
  int startFrame;
Jeremy Bullock f15907
  if (!level_p) {
Jeremy Bullock f15907
    startFrame = withLetter ? 10 : 1;
Jeremy Bullock f15907
  } else {
Jeremy Bullock f15907
    std::vector<tframeid> fids;</tframeid>
Jeremy Bullock f15907
    level_p->getFids(fids);
Jeremy Bullock f15907
    if (fids.empty()) {
Jeremy Bullock f15907
      startFrame = withLetter ? 10 : 1;
Jeremy Bullock f15907
    } else {
Jeremy Bullock f15907
      int lastNum = fids.back().getNumber();
Jeremy Bullock f15907
      startFrame  = withLetter ? ((int)(lastNum / 10) + 1) * 10 : lastNum + 1;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
  if (level_p) {
shun-iwasawa 31accf
    TXshSimpleLevel *sl = level_p->getSimpleLevel();
shun-iwasawa 31accf
    if (sl && sl->getType() == OVL_XSHLEVEL &&
shun-iwasawa 31accf
        sl->getProperties()->isStopMotionLevel()) {
shun-iwasawa 31accf
      buildLiveViewMap(sl);
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  loadLineUpImage();
Jeremy Bullock f15907
  m_frameNumber = startFrame;
Jeremy Bullock f15907
  emit(frameNumberChanged(startFrame));
Jeremy Bullock f15907
  refreshFrameInfo();
Jeremy Bullock f15907
  getSubsampling();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setToNextNewLevel() {
Jeremy Bullock f15907
  const std::unique_ptr<namebuilder> nameBuilder(NameBuilder::getBuilder(L""));</namebuilder>
Jeremy Bullock f15907
Jeremy Bullock f15907
  TLevelSet *levelSet =
Jeremy Bullock f15907
      TApp::instance()->getCurrentScene()->getScene()->getLevelSet();
Jeremy Bullock f15907
  ToonzScene *scene      = TApp::instance()->getCurrentScene()->getScene();
Jeremy Bullock f15907
  std::wstring levelName = L"";
Jeremy Bullock f15907
Jeremy Bullock f15907
  // Select a different unique level name in case it already exists (either in
Jeremy Bullock f15907
  // scene or on disk)
Jeremy Bullock f15907
  TFilePath fp;
Jeremy Bullock f15907
  TFilePath actualFp;
Jeremy Bullock f15907
  for (;;) {
Jeremy Bullock f15907
    levelName = nameBuilder->getNext();
Jeremy Bullock f15907
Jeremy Bullock f15907
    if (levelSet->getLevel(levelName) != 0) continue;
Jeremy Bullock f15907
Jeremy Bullock f15907
    fp = TFilePath(m_filePath) +
Jeremy Bullock f15907
         TFilePath(levelName + L".." + m_fileType.toStdWString());
Jeremy Bullock f15907
    actualFp = scene->decodeFilePath(fp);
Jeremy Bullock f15907
Jeremy Bullock f15907
    if (TSystem::doesExistFileOrLevel(actualFp)) {
Jeremy Bullock f15907
      continue;
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
Jeremy Bullock f15907
    break;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  updateLevelNameAndFrame(levelName);
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
void StopMotion::refreshCameraList() {
shun-iwasawa 31accf
  QString camera = "";
shun-iwasawa 31accf
  bool hasCamera = false;
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  if (m_canon->m_sessionOpen && m_canon->getCameraCount() > 0 &&
shun-iwasawa 31accf
      !m_usingWebcam && m_canon->m_cameraName == m_canon->getCameraName()) {
shun-iwasawa 31accf
    hasCamera = true;
shun-iwasawa 31accf
    camera    = QString::fromStdString(m_canon->m_cameraName);
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
  if (m_usingWebcam) {
shun-iwasawa 31accf
    QList<qcamerainfo> cameras = QCameraInfo::availableCameras();</qcamerainfo>
shun-iwasawa 31accf
    if (m_usingWebcam && cameras.size() > 0) {
shun-iwasawa 31accf
      for (int i = 0; i < cameras.size(); i++) {
shun-iwasawa 31accf
        if (cameras.at(i).description() == m_webcam->getWebcamDescription()) {
shun-iwasawa 31accf
          hasCamera = true;
shun-iwasawa 31accf
          camera    = m_webcam->getWebcamDescription();
shun-iwasawa 31accf
          break;
shun-iwasawa 31accf
        }
shun-iwasawa 31accf
      }
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
  if (!hasCamera) disconnectAllCameras();
shun-iwasawa 31accf
  emit(updateCameraList(camera));
shun-iwasawa 31accf
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::changeCameras(int index) {
shun-iwasawa 31accf
  // note: index is negative if this is called to load DSLR from load settings
shun-iwasawa 31accf
Jeremy Bullock f15907
  QList<qcamerainfo> cameras = QCameraInfo::availableCameras();</qcamerainfo>
Jeremy Bullock f15907
Jeremy Bullock f15907
  // if selected the non-connected state, then disconnect the current camera
Jeremy Bullock f15907
  if (index == 0) {
shun-iwasawa 31accf
    disconnectAllCameras();
shun-iwasawa 31accf
    stopInterval();
Jeremy Bullock f15907
    return;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  // There is a "Select Camera" as the first index
Jeremy Bullock f15907
  index -= 1;
shun-iwasawa 31accf
shun-iwasawa 31accf
  // first see if the index didn't actually change
shun-iwasawa 31accf
  if (cameras.size() > 0 && index < cameras.size() && index >= 0) {
shun-iwasawa 31accf
    if (cameras.at(index).deviceName() == m_webcam->getWebcamDeviceName()) {
shun-iwasawa 31accf
      return;
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  if ((index > cameras.size() - 1) && m_canon->m_sessionOpen) return;
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
shun-iwasawa 31accf
  // close live view if open
shun-iwasawa 31accf
  if (m_liveViewStatus > LiveViewClosed) {
shun-iwasawa 31accf
    toggleLiveView();
shun-iwasawa 31accf
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  // Check if its a webcam or DSLR
Jeremy Bullock f15907
  // Webcams are listed first, so see if one of them is selected
shun-iwasawa 31accf
  if (index < 0 || index > cameras.size() - 1) {
Jeremy Bullock f15907
    m_usingWebcam = false;
Jeremy Bullock f15907
  } else {
Jeremy Bullock f15907
    m_usingWebcam = true;
shun-iwasawa 31accf
    m_webcam->setWebcamIndex(index);
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
Jeremy Bullock f15907
  // in case the camera is not changed
Jeremy Bullock f15907
  if (m_usingWebcam) {
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
    if (m_canon->m_sessionOpen && m_canon->getCameraCount() > 0) {
shun-iwasawa 31accf
      m_canon->closeCameraSession();
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
#endif
Jeremy Bullock f15907
shun-iwasawa 31accf
    m_webcam->setWebcam(new QCamera(cameras.at(index)));
shun-iwasawa 31accf
    m_webcam->setWebcamDeviceName(cameras.at(index).deviceName());
shun-iwasawa 31accf
    m_webcam->setWebcamDescription(cameras.at(index).description());
shun-iwasawa 31accf
Jeremy Bullock f15907
    // loading new camera
shun-iwasawa 31accf
    m_webcam->getWebcam()->load();
Jeremy Bullock f15907
shun-iwasawa 31accf
    m_webcam->refreshWebcamResolutions();
Jeremy Bullock f15907
shun-iwasawa 31accf
    QList<qsize> webcamResolutions = m_webcam->getWebcamResolutions();</qsize>
shun-iwasawa 31accf
    int sizeCount                  = webcamResolutions.count() - 1;
Jeremy Bullock f15907
Jeremy Bullock f15907
    int width;
Jeremy Bullock f15907
    int height;
shun-iwasawa 31accf
    for (int s = 0; s < webcamResolutions.size(); s++) {
shun-iwasawa 31accf
      width  = webcamResolutions.at(s).width();
shun-iwasawa 31accf
      height = webcamResolutions.at(s).height();
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
    // see if we can set the webcam resolution to the current camera resolution
shun-iwasawa 31accf
    TDimension res = TApp::instance()
shun-iwasawa 31accf
                         ->getCurrentScene()
shun-iwasawa 31accf
                         ->getScene()
shun-iwasawa 31accf
                         ->getCurrentCamera()
shun-iwasawa 31accf
                         ->getRes();
shun-iwasawa 31accf
    if (webcamResolutions.contains(QSize(res.lx, res.ly))) {
shun-iwasawa 31accf
      width     = res.lx;
shun-iwasawa 31accf
      height    = res.ly;
shun-iwasawa 31accf
      sizeCount = webcamResolutions.indexOf(QSize(res.lx, res.ly));
Jeremy Bullock f15907
    }
Jeremy Bullock f15907
shun-iwasawa 31accf
    m_webcam->getWebcam()->unload();
Jeremy Bullock f15907
Jeremy Bullock f15907
    setWebcamResolution(
Jeremy Bullock f15907
        QString(QString::number(width) + " x " + QString::number(height)));
shun-iwasawa 31accf
    setTEnvCameraName(m_webcam->getWebcamDescription().toStdString());
Jeremy Bullock f15907
    emit(newCameraSelected(index + 1, true));
Jeremy Bullock f15907
    emit(webcamResolutionsChanged());
shun-iwasawa 31accf
    emit(newWebcamResolutionSelected(sizeCount));
Jeremy Bullock f15907
Jeremy Bullock f15907
  } else {
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
    m_canon->openCameraSession();
shun-iwasawa 31accf
    setTEnvCameraName(m_canon->getCameraName());
shun-iwasawa 31accf
    if (index == -2) {
shun-iwasawa 31accf
      index = cameras.size();
Jeremy Bullock f15907
    }
shun-iwasawa 31accf
    m_webcam->clearWebcam();
Jeremy Bullock f15907
shun-iwasawa 31accf
    emit(newCameraSelected(index + 1, false));
Jeremy Bullock f15907
#endif
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
  if (m_useNumpadShortcuts) toggleNumpadShortcuts(true);
shun-iwasawa 31accf
  m_liveViewDpi      = TPointD(0.0, 0.0);
shun-iwasawa 31accf
  m_hasLineUpImage   = false;
shun-iwasawa 31accf
  m_hasLiveViewImage = false;
shun-iwasawa 31accf
  if (m_isTimeLapse && m_intervalStarted) {
shun-iwasawa 31accf
    stopInterval();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
  emit(liveViewStopped());
shun-iwasawa 31accf
  emit(liveViewChanged(false));
shun-iwasawa 31accf
  refreshFrameInfo();
shun-iwasawa 31accf
  // after all live view data is cleared, start it again.
shun-iwasawa 31accf
  toggleLiveView();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::setWebcamResolution(QString resolution) {
shun-iwasawa 31accf
  m_webcam->releaseWebcam();
Jeremy Bullock f15907
Jeremy Bullock f15907
  // resolution is written in the itemText with the format "<width> x</width>
Jeremy Bullock f15907
  // <height>" (e.g. "800 x 600")</height>
Jeremy Bullock f15907
  QStringList texts = resolution.split(' ');
shun-iwasawa 31accf
  // the split text must be "<width>" "x" and "<height>"</height></width>
Jeremy Bullock f15907
  if (texts.size() != 3) return;
shun-iwasawa 31accf
Jeremy Bullock f15907
  int tempStatus   = m_liveViewStatus;
shun-iwasawa 31accf
  m_liveViewStatus = LiveViewClosed;
shun-iwasawa 31accf
shun-iwasawa 31accf
  bool startTimer = false;
Jeremy Bullock f15907
  if (m_timer->isActive()) {
Jeremy Bullock f15907
    m_timer->stop();
Jeremy Bullock f15907
    startTimer = true;
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
Jeremy Bullock f15907
  qApp->processEvents(QEventLoop::AllEvents, 1000);
Jeremy Bullock f15907
shun-iwasawa 31accf
  m_webcam->setWebcamWidth(texts[0].toInt());
shun-iwasawa 31accf
  m_webcam->setWebcamHeight(texts[2].toInt());
Jeremy Bullock f15907
Jeremy Bullock f15907
  m_liveViewDpi    = TPointD(0.0, 0.0);
Jeremy Bullock f15907
  m_liveViewStatus = tempStatus;
Jeremy Bullock f15907
  if (startTimer) m_timer->start(40);
Jeremy Bullock f15907
Jeremy Bullock f15907
  // update env
Jeremy Bullock f15907
  setTEnvCameraResolution(resolution.toStdString());
Jeremy Bullock f15907
Jeremy Bullock f15907
  refreshFrameInfo();
Jeremy Bullock f15907
shun-iwasawa 31accf
  int index = m_webcam->getIndexOfResolution();
Jeremy Bullock f15907
  emit(newWebcamResolutionSelected(index));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
bool StopMotion::toggleLiveView() {
shun-iwasawa 31accf
  bool sessionOpen = false;
Jeremy Bullock f15907
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
  sessionOpen = m_canon->m_sessionOpen;
shun-iwasawa 31accf
#endif
Jeremy Bullock f15907
shun-iwasawa 31accf
  if ((sessionOpen || m_usingWebcam) && m_liveViewStatus == LiveViewClosed) {
Jeremy Bullock f15907
    m_liveViewDpi             = TPointD(0.0, 0.0);
Jeremy Bullock f15907
    m_liveViewImageDimensions = TDimension(0, 0);
Jeremy Bullock f15907
    if (!m_usingWebcam) {
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
      m_canon->startCanonLiveView();
shun-iwasawa 31accf
#endif
Jeremy Bullock f15907
    } else
shun-iwasawa 31accf
      m_liveViewStatus = LiveViewStarting;
Jeremy Bullock f15907
    loadLineUpImage();
Jeremy Bullock f15907
    m_timer->start(40);
Jeremy Bullock f15907
    emit(liveViewChanged(true));
Jeremy Bullock f15907
    Preferences::instance()->setValue(rewindAfterPlayback, false);
shun-iwasawa 2c27a4
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Jeremy Bullock f15907
    return true;
shun-iwasawa 31accf
  } else if ((sessionOpen || m_usingWebcam) &&
shun-iwasawa 31accf
             m_liveViewStatus > LiveViewClosed) {
shun-iwasawa 31accf
    if (!m_usingWebcam) {
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
      m_canon->endCanonLiveView();
shun-iwasawa 31accf
#endif
shun-iwasawa 31accf
    } else {
shun-iwasawa 31accf
      m_webcam->releaseWebcam();
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
Jeremy Bullock f15907
    m_timer->stop();
shun-iwasawa 31accf
    emit(liveViewStopped());
Jeremy Bullock f15907
    emit(liveViewChanged(false));
Jeremy Bullock f15907
    if (m_turnOnRewind) {
shun-iwasawa 2c27a4
      Preferences::instance()->setValue(rewindAfterPlayback, true);
Jeremy Bullock f15907
    }
shun-iwasawa 2c27a4
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
shun-iwasawa 31accf
    m_liveViewStatus = LiveViewClosed;
Jeremy Bullock f15907
    return false;
Jeremy Bullock f15907
  } else {
Jeremy Bullock f15907
    DVGui::warning(tr("No camera selected."));
Jeremy Bullock f15907
    return false;
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
Jeremy Bullock f15907
void StopMotion::pauseLiveView() {
shun-iwasawa 31accf
  if (m_liveViewStatus == LiveViewOpen) {
shun-iwasawa 31accf
    m_liveViewStatus  = LiveViewPaused;
Jeremy Bullock f15907
    m_userCalledPause = true;
Jeremy Bullock f15907
    emit(liveViewStopped());
shun-iwasawa 31accf
  } else if (m_liveViewStatus == LiveViewPaused) {
shun-iwasawa 31accf
    m_liveViewStatus  = LiveViewOpen;
Jeremy Bullock f15907
    m_userCalledPause = false;
shun-iwasawa 31accf
  } else if (m_liveViewStatus == LiveViewClosed) {
shun-iwasawa 31accf
    toggleLiveView();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
void StopMotion::toggleAlwaysUseLiveViewImages() {
shun-iwasawa 31accf
  m_alwaysUseLiveViewImages = !m_alwaysUseLiveViewImages;
shun-iwasawa 31accf
  emit(alwaysUseLiveViewImagesToggled(m_alwaysUseLiveViewImages));
shun-iwasawa 31accf
  TApp::instance()->getCurrentScene()->notifySceneChanged();
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
Jeremy Bullock f15907
shun-iwasawa 31accf
void StopMotion::onCanonCameraChanged(QString camera) {
shun-iwasawa 31accf
  emit(cameraChanged(camera));
Jeremy Bullock f15907
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//-----------------------------------------------------------------
shun-iwasawa 31accf
std::string StopMotion::getTEnvCameraName() { return StopMotionCameraName; }
shun-iwasawa 31accf
//-----------------------------------------------------------------
shun-iwasawa 31accf
void StopMotion::setTEnvCameraName(std::string name) {
shun-iwasawa 31accf
  StopMotionCameraName = name;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
//-----------------------------------------------------------------
shun-iwasawa 31accf
std::string StopMotion::getTEnvCameraResolution() {
shun-iwasawa 31accf
  return StopMotionCameraResolution;
Jeremy Bullock f15907
}
Jeremy Bullock f15907
//-----------------------------------------------------------------
shun-iwasawa 31accf
void StopMotion::setTEnvCameraResolution(std::string resolution) {
shun-iwasawa 31accf
  StopMotionCameraResolution = resolution;
shun-iwasawa 31accf
}
Jeremy Bullock f15907
Jeremy Bullock f15907
//=============================================================================
Jeremy Bullock f15907
Jeremy Bullock f15907
class StopMotionCaptureCommand : public MenuItemHandler {
Jeremy Bullock f15907
public:
Jeremy Bullock f15907
  StopMotionCaptureCommand() : MenuItemHandler(MI_StopMotionCapture) {}
Jeremy Bullock f15907
  void execute() {
Jeremy Bullock f15907
    StopMotion *sm = StopMotion::instance();
Jeremy Bullock f15907
    if (sm->m_liveViewStatus > 0) sm->captureImage();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
} StopMotionCaptureCommand;
Jeremy Bullock f15907
Jeremy Bullock f15907
//=============================================================================
Jeremy Bullock f15907
Jeremy Bullock f15907
class StopMotionRaiseOpacityCommand : public MenuItemHandler {
Jeremy Bullock f15907
public:
Jeremy Bullock f15907
  StopMotionRaiseOpacityCommand()
Jeremy Bullock f15907
      : MenuItemHandler(MI_StopMotionRaiseOpacity) {}
Jeremy Bullock f15907
  void execute() {
Jeremy Bullock f15907
    StopMotion *sm = StopMotion::instance();
Jeremy Bullock f15907
    if (sm->m_liveViewStatus > 0) sm->raiseOpacity();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
} StopMotionRaiseOpacityCommand;
Jeremy Bullock f15907
Jeremy Bullock f15907
//=============================================================================
Jeremy Bullock f15907
Jeremy Bullock f15907
class StopMotionLowerOpacityCommand : public MenuItemHandler {
Jeremy Bullock f15907
public:
Jeremy Bullock f15907
  StopMotionLowerOpacityCommand()
Jeremy Bullock f15907
      : MenuItemHandler(MI_StopMotionLowerOpacity) {}
Jeremy Bullock f15907
  void execute() {
Jeremy Bullock f15907
    StopMotion *sm = StopMotion::instance();
Jeremy Bullock f15907
    if (sm->m_liveViewStatus > 0) sm->lowerOpacity();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
} StopMotionLowerOpacityCommand;
Jeremy Bullock f15907
Jeremy Bullock f15907
//=============================================================================
Jeremy Bullock f15907
Jeremy Bullock f15907
class StopMotionToggleLiveViewCommand : public MenuItemHandler {
Jeremy Bullock f15907
public:
Jeremy Bullock f15907
  StopMotionToggleLiveViewCommand()
Jeremy Bullock f15907
      : MenuItemHandler(MI_StopMotionToggleLiveView) {}
Jeremy Bullock f15907
  void execute() {
Jeremy Bullock f15907
    StopMotion *sm = StopMotion::instance();
Jeremy Bullock f15907
    sm->pauseLiveView();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
} StopMotionToggleLiveViewCommand;
Jeremy Bullock f15907
Jeremy Bullock f15907
//=============================================================================
Jeremy Bullock f15907
Jeremy Bullock f15907
class StopMotionLowerSubsamplingCommand : public MenuItemHandler {
Jeremy Bullock f15907
public:
Jeremy Bullock f15907
  StopMotionLowerSubsamplingCommand()
Jeremy Bullock f15907
      : MenuItemHandler(MI_StopMotionLowerSubsampling) {}
Jeremy Bullock f15907
  void execute() {
Jeremy Bullock f15907
    StopMotion *sm = StopMotion::instance();
Jeremy Bullock f15907
    sm->setSubsamplingValue(std::max(1, sm->getSubsamplingValue() - 1));
Jeremy Bullock f15907
    sm->setSubsampling();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
} StopMotionLowerSubsamplingCommand;
Jeremy Bullock f15907
Jeremy Bullock f15907
//=============================================================================
Jeremy Bullock f15907
Jeremy Bullock f15907
class StopMotionRaiseSubsamplingCommand : public MenuItemHandler {
Jeremy Bullock f15907
public:
Jeremy Bullock f15907
  StopMotionRaiseSubsamplingCommand()
Jeremy Bullock f15907
      : MenuItemHandler(MI_StopMotionRaiseSubsampling) {}
Jeremy Bullock f15907
  void execute() {
Jeremy Bullock f15907
    StopMotion *sm = StopMotion::instance();
Jeremy Bullock f15907
    sm->setSubsamplingValue(std::min(30, sm->getSubsamplingValue() + 1));
Jeremy Bullock f15907
    sm->setSubsampling();
Jeremy Bullock f15907
  }
Jeremy Bullock f15907
} StopMotionRaiseSubsamplingCommand;
Jeremy Bullock f15907
Jeremy Bullock f15907
//=============================================================================
Jeremy Bullock f15907
Jeremy Bullock f15907
class StopMotionJumpToCameraCommand : public MenuItemHandler {
Jeremy Bullock f15907
public:
Jeremy Bullock f15907
  StopMotionJumpToCameraCommand()
Jeremy Bullock f15907
      : MenuItemHandler(MI_StopMotionJumpToCamera) {}
Jeremy Bullock f15907
  void execute() {
Jeremy Bullock f15907
    StopMotion *sm = StopMotion::instance();
Jeremy Bullock f15907
    sm->jumpToCameraFrame();
Jeremy Bullock f15907
  }
shun-iwasawa 31accf
} StopMotionJumpToCameraCommand;
shun-iwasawa 31accf
shun-iwasawa 31accf
//=============================================================================
shun-iwasawa 31accf
shun-iwasawa 31accf
class StopMotionExportImageSequence : public MenuItemHandler {
shun-iwasawa 31accf
public:
shun-iwasawa 31accf
  StopMotionExportImageSequence()
shun-iwasawa 31accf
      : MenuItemHandler(MI_StopMotionExportImageSequence) {}
shun-iwasawa 31accf
  void execute() {
shun-iwasawa 31accf
    StopMotion *sm = StopMotion::instance();
shun-iwasawa 31accf
    sm->exportImageSequence();
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
} StopMotionExportImageSequence;
shun-iwasawa 31accf
shun-iwasawa 31accf
//=============================================================================
shun-iwasawa 31accf
shun-iwasawa 31accf
class StopMotionRemoveFrame : public MenuItemHandler {
shun-iwasawa 31accf
public:
shun-iwasawa 31accf
  StopMotionRemoveFrame() : MenuItemHandler(MI_StopMotionRemoveFrame) {}
shun-iwasawa 31accf
  void execute() {
shun-iwasawa 31accf
    StopMotion *sm = StopMotion::instance();
shun-iwasawa 31accf
    sm->removeStopMotionFrame();
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
} StopMotionRemoveFrame;
shun-iwasawa 31accf
shun-iwasawa 31accf
//=============================================================================
shun-iwasawa 31accf
shun-iwasawa 31accf
class StopMotionNextFrame : public MenuItemHandler {
shun-iwasawa 31accf
public:
shun-iwasawa 31accf
  StopMotionNextFrame() : MenuItemHandler(MI_StopMotionNextFrame) {}
shun-iwasawa 31accf
  void execute() {
shun-iwasawa 31accf
    StopMotion *sm = StopMotion::instance();
shun-iwasawa 31accf
    int index      = TApp::instance()->getCurrentFrame()->getFrameIndex();
shun-iwasawa 31accf
    int maxInXSheet =
shun-iwasawa 31accf
        TApp::instance()->getCurrentXsheet()->getXsheet()->getFrameCount();
shun-iwasawa 31accf
    int max = std::max(maxInXSheet, sm->getXSheetFrameNumber() - 1);
shun-iwasawa 31accf
    if (index < max) {
shun-iwasawa 31accf
      TApp::instance()->getCurrentFrame()->setFrame(index + 1);
shun-iwasawa 31accf
    }
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
} StopMotionNextFrame;
shun-iwasawa 31accf
shun-iwasawa 31accf
//=============================================================================
shun-iwasawa 31accf
shun-iwasawa 31accf
class StopMotionToggleUseLiveViewImagesCommand : public MenuItemHandler {
shun-iwasawa 31accf
public:
shun-iwasawa 31accf
  StopMotionToggleUseLiveViewImagesCommand()
shun-iwasawa 31accf
      : MenuItemHandler(MI_StopMotionToggleUseLiveViewImages) {}
shun-iwasawa 31accf
  void execute() {
shun-iwasawa 31accf
    StopMotion *sm = StopMotion::instance();
shun-iwasawa 31accf
    sm->toggleAlwaysUseLiveViewImages();
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
} StopMotionToggleUseLiveViewImagesCommand;
shun-iwasawa 31accf
shun-iwasawa 31accf
#ifdef WITH_CANON
shun-iwasawa 31accf
//=============================================================================
shun-iwasawa 31accf
shun-iwasawa 31accf
class StopMotionPickFocusCheck : public MenuItemHandler {
shun-iwasawa 31accf
public:
shun-iwasawa 31accf
  StopMotionPickFocusCheck() : MenuItemHandler(MI_StopMotionPickFocusCheck) {}
shun-iwasawa 31accf
  void execute() {
shun-iwasawa 31accf
    StopMotion *sm = StopMotion::instance();
shun-iwasawa 31accf
    sm->m_canon->toggleZoomPicking();
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
} StopMotionPickFocusCheck;
shun-iwasawa 31accf
shun-iwasawa 31accf
//=============================================================================
shun-iwasawa 31accf
shun-iwasawa 31accf
class StopMotionToggleZoomCommand : public MenuItemHandler {
shun-iwasawa 31accf
public:
shun-iwasawa 31accf
  StopMotionToggleZoomCommand() : MenuItemHandler(MI_StopMotionToggleZoom) {}
shun-iwasawa 31accf
  void execute() {
shun-iwasawa 31accf
    StopMotion *sm = StopMotion::instance();
shun-iwasawa 31accf
    sm->m_canon->zoomLiveView();
shun-iwasawa 31accf
  }
shun-iwasawa 31accf
} StopMotionToggleZoomCommand;
shun-iwasawa 31accf
#endif