Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "fileviewerpopup.h"
Toshihiro Shimizu 890ddd
#include "menubarcommand.h"
Toshihiro Shimizu 890ddd
#include "menubarcommandids.h"
Toshihiro Shimizu 890ddd
#include "viewerpane.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qhboxlayout></qhboxlayout>
Toshihiro Shimizu 890ddd
#include <qdragenterevent></qdragenterevent>
Toshihiro Shimizu 890ddd
#include <qurl></qurl>
Toshihiro Shimizu 890ddd
#include <qpainter></qpainter>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonz/toonzimageutils.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "timagecache.h"
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
#include "imageviewer.h"
Toshihiro Shimizu 890ddd
#include "tdata.h"
Toshihiro Shimizu 890ddd
#include "tw/mainshell.h"
Toshihiro Shimizu 890ddd
#include "tlevel_io.h"
Toshihiro Shimizu 890ddd
#include "vcrpanel.h"
Toshihiro Shimizu 890ddd
#include "tframe.h"
Toshihiro Shimizu 890ddd
#include "tsound.h"
Toshihiro Shimizu 890ddd
#include "tsop.h"
Toshihiro Shimizu 890ddd
#include "toonz/application.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toutputproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/tabscene.h"
Toshihiro Shimizu 890ddd
class TSoundTrack;
Toshihiro Shimizu 890ddd
using namespace TwConsts;*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// FileViewer
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050500
Toshihiro Shimizu 890ddd
FileViewer::FileViewer(QWidget *parent, Qt::WindowFlags flags)
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
FileViewer::FileViewer(QWidget *parent, Qt::WFlags flags)
Toshihiro Shimizu 890ddd
#endif
Shinya Kitaoka 120a6e
    : QWidget(parent), m_fileSize(0), m_player(0), m_snd(0), m_soundOn(false) {
Shinya Kitaoka 120a6e
  setAcceptDrops(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewer::dragEnterEvent(QDragEnterEvent *event) {
Shinya Kitaoka 120a6e
  if (event->mimeData()->hasUrls()) event->acceptProposedAction();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewer::dropEvent(QDropEvent *event) {
Shinya Kitaoka 120a6e
  QList<qurl> urls = event->mimeData()->urls();</qurl>
Shinya Kitaoka 120a6e
  TFilePath path   = TFilePath(urls[0].toLocalFile().toStdString());
Shinya Kitaoka 120a6e
  if (path.isEmpty()) return;
Shinya Kitaoka 120a6e
  setPath(path);
Shinya Kitaoka 120a6e
  event->acceptProposedAction();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewer::setPath(const TFilePath &fp, int from, int to, int step,
Shinya Kitaoka 120a6e
                         TSoundTrack *snd) {
Shinya Kitaoka 120a6e
  if ((int)m_fids.size() > 0) clearViewerCache();
Shinya Kitaoka 120a6e
  m_path = fp;
Shinya Kitaoka 120a6e
  m_snd  = snd;
Shinya Kitaoka 120a6e
  m_fids.clear();
Shinya Kitaoka 120a6e
  m_index    = -1;
Shinya Kitaoka 120a6e
  m_fileSize = 0;
Shinya Kitaoka 120a6e
  m_fileDate = "";
Shinya Kitaoka 120a6e
  if (fp.getDots() == "..") {
Shinya Kitaoka 120a6e
    m_levelName = fp.withoutParentDir().withFrame().getWideString();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    m_levelName = fp.withoutParentDir().getWideString();
Shinya Kitaoka 120a6e
    updateFileInfo(m_path);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_lr = TLevelReaderP();
Shinya Kitaoka 120a6e
  if (step != 0)  // e' un render
Shinya Kitaoka 120a6e
    for (int i = from; i <= to; i += step) m_fids.push_back(TFrameId(i));
Shinya Kitaoka 120a6e
  else if (fp != TFilePath() &&
Shinya Kitaoka 120a6e
           TSystem::doesExistFileOrLevel(fp))  // e' un view
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      m_lr          = TLevelReaderP(fp);
Shinya Kitaoka 120a6e
      TLevelP level = m_lr->loadInfo();
Shinya Kitaoka 120a6e
      if (!level || level->getFrameCount() == 0) return;
Shinya Kitaoka 120a6e
      m_palette = level->getPalette();
Shinya Kitaoka 120a6e
      if (!m_palette && (fp.getType() == "tzp" || fp.getType() == "tzu"))
Shinya Kitaoka 120a6e
        m_palette =
Shinya Kitaoka 120a6e
            ToonzImageUtils::loadTzPalette(fp.withType("plt").withNoFrame());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      for (TLevel::Iterator it = level->begin(); it != level->end(); ++it)
Shinya Kitaoka 120a6e
        m_fids.push_back(it->first);
Shinya Kitaoka 120a6e
      showFrame(0);
Shinya Kitaoka 120a6e
    } catch (...) {
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    m_image = TImageP();
Shinya Kitaoka 120a6e
  //  else
Shinya Kitaoka 120a6e
  //    setImage(TImageP());
Shinya Kitaoka 120a6e
  // resetZoom();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  showFrame(0);
Shinya Kitaoka 120a6e
  // configureNotify();
Shinya Kitaoka 120a6e
  //  if(m_listener) m_listener->onPathChange(fp);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewer::clearViewerCache() {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < (int)m_fids.size(); i++) {
Shinya Kitaoka 120a6e
    TFrameId fid = m_fids[i];
Shinya Kitaoka 120a6e
    string id    = toString(m_levelName) + toString(fid.getNumber());
Shinya Kitaoka 120a6e
    if (TImageCache::instance()->isCached(id))
Shinya Kitaoka 120a6e
      TImageCache::instance()->remove(id);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewer::updateFileInfo(const TFilePath &fp) {
Shinya Kitaoka 120a6e
  TFileStatus fs(fp);
Shinya Kitaoka 120a6e
  if (fs.doesExist()) {
Shinya Kitaoka 120a6e
    m_fileSize = (int)((fs.getSize() + 1023) / 1024);
Shinya Kitaoka 120a6e
    m_fileDate = fs.getLastModificationTime().getFormattedString();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    m_fileSize = 0;
Shinya Kitaoka 120a6e
    m_fileDate = "";
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewer::showFrame(int index) {
Shinya Kitaoka 120a6e
  if (m_fids.empty()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  index   = tcrop(index, 0, (int)(m_fids.size() - 1));
Shinya Kitaoka 120a6e
  m_index = index;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFrameId fid = m_fids[index];
Shinya Kitaoka 120a6e
  string id    = toString(m_levelName) + toString(fid.getNumber());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    TImageP img;
Shinya Kitaoka 120a6e
    if (TImageCache::instance()->isCached(id))
Shinya Kitaoka 120a6e
      img = TImageCache::instance()->get(id, false);
Shinya Kitaoka 120a6e
    else if (m_lr) {
Shinya Kitaoka 120a6e
      TImageReaderP ir = m_lr->getFrameReader(fid);
Shinya Kitaoka 120a6e
      if (m_path.getDots() == "..") {
Shinya Kitaoka 120a6e
        if (ir)
Shinya Kitaoka 120a6e
          updateFileInfo(ir->getFilePath());
Shinya Kitaoka 120a6e
        else {
Shinya Kitaoka 120a6e
          m_fileSize = 0;
Shinya Kitaoka 120a6e
          m_fileDate = "";
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      img = ir->load();
Shinya Kitaoka 120a6e
      if (img) {
Shinya Kitaoka 120a6e
        if (!img->getPalette() && m_palette)
Shinya Kitaoka 120a6e
          img->setPalette(m_palette.getPointer());
Shinya Kitaoka 120a6e
        TImageCache::instance()->add(id, img);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_image = img;
Shinya Kitaoka 120a6e
    //    setImage(img);
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    m_image = TImageP();
Shinya Kitaoka 120a6e
    //    setImage(TImageP());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  //  invalidate();
Shinya Kitaoka 120a6e
  update();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //  if(m_listener)
Shinya Kitaoka 120a6e
  //  {
Shinya Kitaoka 120a6e
  //      m_listener->onFrameChange(getFrameId());
Shinya Kitaoka 120a6e
  //  }
Shinya Kitaoka 120a6e
  //  playSound();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewer::paintEvent(QPaintEvent *) { QPainter p(this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FileViewerPanel::FileViewerPanel(TWidget *parent, string name)
Toshihiro Shimizu 890ddd
: ImageViewer(parent, name)
Toshihiro Shimizu 890ddd
, m_listener(0)
Toshihiro Shimizu 890ddd
, m_fileSize(0)
Toshihiro Shimizu 890ddd
, m_player(0)
Toshihiro Shimizu 890ddd
, m_snd(0)
Toshihiro Shimizu 890ddd
, m_soundOn(false)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  enableDropTarget(this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDropSource::DropEffect FileViewerPanel::onEnter (const Event &event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  return TDropSource::Copy;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDropSource::DropEffect FileViewerPanel::onOver (const Event &event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  return TDropSource::Copy;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileViewerPanel::onLeave ()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDropSource::DropEffect FileViewerPanel::onDrop (const Event &event)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 120a6e
  const TFilePathListData *fd =
Toshihiro Shimizu 890ddd
    dynamic_cast<const *="" tfilepathlistdata="">(event.m_data);</const>
Toshihiro Shimizu 890ddd
  if( fd && fd->getFilePathCount()==1)
Toshihiro Shimizu 890ddd
    {
Shinya Kitaoka 120a6e
          setPath(fd->getFilePath(0));
Shinya Kitaoka 120a6e
          return TDropSource::Copy;
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  else
Toshihiro Shimizu 890ddd
    return TDropSource::None;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileViewerPanel::updateFileInfo(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  TFileStatus fs(fp);
Toshihiro Shimizu 890ddd
  if(fs.doesExist())
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
     m_fileSize = (int)((fs.getSize()+1023)/1024);
Toshihiro Shimizu 890ddd
     m_fileDate = fs.getLastModificationTime().getFormattedString();
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  else
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
     m_fileSize = 0;
Toshihiro Shimizu 890ddd
     m_fileDate = "";
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewerPanel::setPath(const TFilePath &fp, int from, int to, int step,
Shinya Kitaoka 120a6e
TSoundTrack*snd)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 120a6e
  if ((int)m_fids.size() > 0)
Shinya Kitaoka 120a6e
        clearViewerCache();
Toshihiro Shimizu 890ddd
  m_path = fp;
Toshihiro Shimizu 890ddd
  m_snd = snd;
Toshihiro Shimizu 890ddd
  m_fids.clear();
Toshihiro Shimizu 890ddd
  m_index = -1;
Toshihiro Shimizu 890ddd
  m_fileSize = 0;
Toshihiro Shimizu 890ddd
  m_fileDate = "";
Toshihiro Shimizu 890ddd
  if(fp.getDots()=="..")
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
     m_levelName = fp.withoutParentDir().withFrame().getWideString();
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  else
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
     m_levelName = fp.withoutParentDir().getWideString();
Toshihiro Shimizu 890ddd
     updateFileInfo(m_path);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  m_lr = TLevelReaderP();
Toshihiro Shimizu 890ddd
  if (step!=0) //e' un render
Toshihiro Shimizu 890ddd
    for (int i=from; i<=to; i+=step)
Toshihiro Shimizu 890ddd
      m_fids.push_back(TFrameId(i));
Toshihiro Shimizu 890ddd
  else if(fp != TFilePath() && TSystem::doesExistFileOrLevel(fp)) //e' un view
Toshihiro Shimizu 890ddd
    {
Shinya Kitaoka 120a6e
    try
Toshihiro Shimizu 890ddd
       {
Toshihiro Shimizu 890ddd
       m_lr = TLevelReaderP(fp);
Toshihiro Shimizu 890ddd
       TLevelP level = m_lr->loadInfo();
Toshihiro Shimizu 890ddd
       if(!level || level->getFrameCount()==0) return;
Toshihiro Shimizu 890ddd
       m_palette = level->getPalette();
Toshihiro Shimizu 890ddd
       if (!m_palette && (fp.getType()=="tzp" || fp.getType()=="tzu"))
Shinya Kitaoka 120a6e
         m_palette =
Shinya Kitaoka 120a6e
ToonzImageUtils::loadTzPalette(fp.withType("plt").withNoFrame());
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
       for(TLevel::Iterator it = level->begin(); it != level->end(); ++it)
Toshihiro Shimizu 890ddd
           m_fids.push_back(it->first);
Toshihiro Shimizu 890ddd
       showFrame(0);
Toshihiro Shimizu 890ddd
       } catch(...) {return;}
Toshihiro Shimizu 890ddd
     }
Toshihiro Shimizu 890ddd
   else
Toshihiro Shimizu 890ddd
     setImage(TImageP());
Toshihiro Shimizu 890ddd
  //resetZoom();
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
 showFrame(0);
Toshihiro Shimizu 890ddd
 configureNotify();
Toshihiro Shimizu 890ddd
  if(m_listener) m_listener->onPathChange(fp);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileViewerPanel::resetZoom()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  ImageViewer::resetZoom();
Toshihiro Shimizu 890ddd
  if(m_listener) m_listener->onZoomChange();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FileViewerPanel::zoom(const TPoint ¢er, double factor, bool
Shinya Kitaoka 120a6e
isZoomWheel)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  ImageViewer::zoom(center, factor, isZoomWheel);
Toshihiro Shimizu 890ddd
  if(m_listener) m_listener->onZoomChange();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileViewerPanel::playSound()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  static bool first = true;
Toshihiro Shimizu 890ddd
  static bool audioCardInstalled;
Toshihiro Shimizu 890ddd
  if (!m_snd || !m_soundOn)
Toshihiro Shimizu 890ddd
    return;
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
  if (first)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
    audioCardInstalled = TSoundOutputDevice::installed();
Toshihiro Shimizu 890ddd
    first = false;
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  if (!audioCardInstalled)
Toshihiro Shimizu 890ddd
    return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  if (!m_player)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
    m_player = new TSoundOutputDevice();
Toshihiro Shimizu 890ddd
    m_player->attach(this);
Toshihiro Shimizu 890ddd
    m_player->setVolume(1);
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  if (m_player)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
    int fps = TApplication::instance()->getCurrentScene()->getProperties()
Toshihiro Shimizu 890ddd
              ->getOutputProperties()->getFrameRate();
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
    int samplePerFrame = (int) m_snd->getSampleRate() / fps;
Toshihiro Shimizu 890ddd
    TINT32 firstSample = (m_fids[m_index].getNumber()-1) * samplePerFrame;
Toshihiro Shimizu 890ddd
    TINT32 lastSample = firstSample + samplePerFrame;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    try
Shinya Kitaoka 120a6e
      {
Toshihiro Shimizu 890ddd
      m_player->play(m_snd, firstSample, lastSample, false, false);
Toshihiro Shimizu 890ddd
      if(m_player->isPlaying())
Toshihiro Shimizu 890ddd
        m_player->setVolume(1);
Toshihiro Shimizu 890ddd
      }
Toshihiro Shimizu 890ddd
    catch (TSoundDeviceException &e)
Shinya Kitaoka 120a6e
          {
Toshihiro Shimizu 890ddd
      string msg;
Toshihiro Shimizu 890ddd
      if (e.getType() == TSoundDeviceException::UnsupportedFormat)
Shinya Kitaoka 120a6e
          {
Toshihiro Shimizu 890ddd
        try {
Shinya Kitaoka 120a6e
          TSoundTrackFormat fmt =
Shinya Kitaoka 120a6e
m_player->getPreferredFormat(m_snd->getFormat());
Shinya Kitaoka 120a6e
          m_player->play( TSop::convert(m_snd, fmt), firstSample, lastSample,
Shinya Kitaoka 120a6e
false, false);
Toshihiro Shimizu 890ddd
          if(m_player->isPlaying())
Toshihiro Shimizu 890ddd
            m_player->setVolume(1);
Shinya Kitaoka 120a6e
          }
Toshihiro Shimizu 890ddd
        catch (TSoundDeviceException &ex) {
Toshihiro Shimizu 890ddd
          throw TException(ex.getMessage());
Toshihiro Shimizu 890ddd
          return;
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
                  }
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
void FileViewerPanel::showFrame(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  if(m_fids.empty()) return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  index = tcrop(index, 0, (int)(m_fids.size()-1));
Toshihiro Shimizu 890ddd
  m_index = index;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  TFrameId fid = m_fids[index];
Toshihiro Shimizu 890ddd
  string id = toString(m_levelName) + toString(fid.getNumber());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  try
Toshihiro Shimizu 890ddd
    {
Shinya Kitaoka 120a6e
                TImageP img;
Shinya Kitaoka 120a6e
                if(TImageCache::instance()->isCached(id))
Shinya Kitaoka 120a6e
                  img = TImageCache::instance()->get(id,false);
Shinya Kitaoka 120a6e
          else if (m_lr)
Shinya Kitaoka 120a6e
            {
Shinya Kitaoka 120a6e
                  TImageReaderP ir = m_lr->getFrameReader(fid);
Toshihiro Shimizu 890ddd
      if(m_path.getDots()=="..")
Toshihiro Shimizu 890ddd
        {
Shinya Kitaoka 120a6e
                          if(ir) updateFileInfo(ir->getFilePath());
Toshihiro Shimizu 890ddd
        else {m_fileSize=0;m_fileDate="";}
Shinya Kitaoka 120a6e
                    }
Toshihiro Shimizu 890ddd
      img = ir->load();
Toshihiro Shimizu 890ddd
      if (img)
Toshihiro Shimizu 890ddd
        {
Toshihiro Shimizu 890ddd
        if(!img->getPalette() && m_palette)
Shinya Kitaoka 120a6e
                     img->setPalette(m_palette.getPointer());
Toshihiro Shimizu 890ddd
        TImageCache::instance()->add(id,img);
Shinya Kitaoka 120a6e
              }
Shinya Kitaoka 120a6e
            }
Toshihiro Shimizu 890ddd
    setImage(img);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  catch(...)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
    setImage(TImageP());
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  invalidate();
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
  if(m_listener)
Toshihiro Shimizu 890ddd
  {
Shinya Kitaoka 120a6e
        //if(m_path.getDots()=="..")
Shinya Kitaoka 120a6e
        //  m_listener->onPathChange(m_path);
Toshihiro Shimizu 890ddd
  //  else
Toshihiro Shimizu 890ddd
      m_listener->onFrameChange(getFrameId());
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  playSound();
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileViewerPanel::clearViewerCache()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  int i;
Toshihiro Shimizu 890ddd
  for(i = 0; i<(int)m_fids.size(); i++)
Toshihiro Shimizu 890ddd
  {
Shinya Kitaoka 120a6e
        TFrameId fid = m_fids[i];
Toshihiro Shimizu 890ddd
    string id = toString(m_levelName) + toString(fid.getNumber());
Toshihiro Shimizu 890ddd
    if(TImageCache::instance()->isCached(id))
Shinya Kitaoka 120a6e
          TImageCache::instance()->remove(id);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileViewerPanel::onTimer(int)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  if(m_fids.empty() || m_index>=(int)(m_fids.size()-1))
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
     showFrame(0);
Toshihiro Shimizu 890ddd
     stopTimer();
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
  else
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
     showFrame(m_index+1);
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FileViewerPopup : public TPopup, public FileViewerPanel::Listener {
Toshihiro Shimizu 890ddd
  FileViewerPanel *m_viewer;
Toshihiro Shimizu 890ddd
  FlipPanel *m_flipPanel;
Toshihiro Shimizu 890ddd
  const int m_topBarHeight, m_botBarHeight;
Toshihiro Shimizu 890ddd
  TRect m_titleBox, m_frameBox;
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  FileViewerPopup(string name)
Toshihiro Shimizu 890ddd
  : TPopup(TMainshell::getMainshell(), name)
Toshihiro Shimizu 890ddd
  , m_topBarHeight(15)
Toshihiro Shimizu 890ddd
  , m_botBarHeight(20+15) {
Toshihiro Shimizu 890ddd
    m_isMenu = false;
Toshihiro Shimizu 890ddd
    m_viewer = new FileViewerPanel(this, "imageViewer");
Toshihiro Shimizu 890ddd
    m_viewer->setListener(this);
Toshihiro Shimizu 890ddd
    m_flipPanel = new FlipPanel(this, FlipPanel::WITH_COLORFILTER|
Shinya Kitaoka 120a6e
                                            FlipPanel::WITH_SPEEDSLIDER);
Toshihiro Shimizu 890ddd
    m_flipPanel->setVCR(m_viewer);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    setSize(600,400);
Toshihiro Shimizu 890ddd
    setCaption("Viewer");
Toshihiro Shimizu 890ddd
    m_viewer->resetZoom();
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  void configureNotify(const TDimension &size) {
Toshihiro Shimizu 890ddd
    m_titleBox = TRect(4,size.ly-m_topBarHeight+1,getLx()-5,size.ly-2);
Toshihiro Shimizu 890ddd
    m_frameBox = m_titleBox;
Shinya Kitaoka 120a6e
    m_viewer->setGeometry(1,m_botBarHeight+2,size.lx-2,size.ly-m_topBarHeight-2);
Toshihiro Shimizu 890ddd
    TDimension vcrSize(size.lx-8,m_botBarHeight);
Toshihiro Shimizu 890ddd
    TPoint p((size.lx-vcrSize.lx)/2,1);
Toshihiro Shimizu 890ddd
    m_flipPanel->setGeometry(p, vcrSize);
Toshihiro Shimizu 890ddd
    m_viewer->invalidate();
Toshihiro Shimizu 890ddd
    invalidate();
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  void drawTitle() {
Toshihiro Shimizu 890ddd
    TPoint p(m_titleBox.getP00()+TPoint(4,1));
Toshihiro Shimizu 890ddd
    setColor(Black);
Toshihiro Shimizu 890ddd
    wstring nameStr = m_viewer->getLevelName();
Toshihiro Shimizu 890ddd
    TFrameId fid = m_viewer->getFrameId();
Toshihiro Shimizu 890ddd
    string fidStr;
Toshihiro Shimizu 890ddd
    if(fid.getNumber()>0) fidStr = m_viewer->getFrameId().expand();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    string framesStr = toString(m_viewer->getFrameCount())+" fr";
Toshihiro Shimizu 890ddd
    string sizeStr = toString(m_viewer->getFileSize()) + "K";
Toshihiro Shimizu 890ddd
    string dateStr = m_viewer->getFileDate();
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
    wstring w = nameStr + L" ::";
Toshihiro Shimizu 890ddd
    drawText(p,w);
Toshihiro Shimizu 890ddd
    p.x += getTextSize(w).lx;
Toshihiro Shimizu 890ddd
    m_frameBox.x0 = p.x;
Toshihiro Shimizu 890ddd
    string s = " " + fidStr + " ";
Toshihiro Shimizu 890ddd
    drawText(p,s);
Toshihiro Shimizu 890ddd
    p.x += getTextSize(s).lx;
Toshihiro Shimizu 890ddd
    m_frameBox.x1 = p.x;
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
    s = ":: " + framesStr + " :: " + sizeStr + " :: " +  dateStr;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        drawText(p,s);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        string zoomStr = "zoom "+toString(troundp(m_viewer->getZoomFactor())) +
Shinya Kitaoka 120a6e
"%";
Shinya Kitaoka 120a6e
        TPoint p1(m_titleBox.getP10());
Shinya Kitaoka 120a6e
        p1.x -= getTextSize(zoomStr).lx+4;
Shinya Kitaoka 120a6e
        drawText(p1,zoomStr);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  void repaint() {
Toshihiro Shimizu 890ddd
    TDimension size = getSize();
Toshihiro Shimizu 890ddd
    int lx = size.lx;
Toshihiro Shimizu 890ddd
    int ly = size.ly;
Toshihiro Shimizu 890ddd
    int y = ly-1-m_topBarHeight;
Toshihiro Shimizu 890ddd
    TRect r(1,y+1,lx-2,ly-1);
Toshihiro Shimizu 890ddd
    setColor(ToonzBgColor);
Toshihiro Shimizu 890ddd
    fillRect(r);
Toshihiro Shimizu 890ddd
    drawTitle();
Toshihiro Shimizu 890ddd
    r.y0=1;r.y1=m_botBarHeight;
Toshihiro Shimizu 890ddd
    setColor(Gray210);
Toshihiro Shimizu 890ddd
    fillRect(r);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    setColor(Gray150);
Toshihiro Shimizu 890ddd
    drawLine(1,y,lx-2,y);
Toshihiro Shimizu 890ddd
    y = m_botBarHeight+1;
Toshihiro Shimizu 890ddd
    drawLine(1,y,lx-2,y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    setColor(Black);
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
    TFrame::drawCorner(this, 0,0,1,1);
Toshihiro Shimizu 890ddd
    TFrame::drawCorner(this, lx-1,0,-1,1);
Toshihiro Shimizu 890ddd
    TFrame::drawCorner(this, 0,ly-1,1,-1);
Toshihiro Shimizu 890ddd
    TFrame::drawCorner(this, lx-1,ly-1,-1,-1);
Toshihiro Shimizu 890ddd
    int d = 3;
Toshihiro Shimizu 890ddd
    drawLine(0,d,0,ly-1-d);
Toshihiro Shimizu 890ddd
    drawLine(lx-1,d,lx-1,ly-1-d);
Toshihiro Shimizu 890ddd
    drawLine(d,ly-1,lx-1-d,ly-1);
Toshihiro Shimizu 890ddd
    drawLine(d,0,lx-1-d,0);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  void setFrameRate(int frameRate)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
    m_flipPanel->setFrameRate(frameRate);
Toshihiro Shimizu 890ddd
    }
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
  void load(const TFilePath &fp) {
Toshihiro Shimizu 890ddd
    m_flipPanel->enableAudioButton(false);
Toshihiro Shimizu 890ddd
    m_viewer->setPath(fp);
Toshihiro Shimizu 890ddd
    m_flipPanel->reset();
Toshihiro Shimizu 890ddd
    m_flipPanel->setLevel(m_viewer->getLevelFids());
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  void load(const TFilePath &fp, int from, int to, int step, TSoundTrack* snd) {
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
    m_viewer->setPath(fp, from, to, step, snd);
Toshihiro Shimizu 890ddd
    m_flipPanel->enableAudioButton(snd!=0);
Toshihiro Shimizu 890ddd
    m_flipPanel->setLevel(m_viewer->getLevelFids());
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool onClose()
Toshihiro Shimizu 890ddd
  {
Shinya Kitaoka 120a6e
        m_viewer->setPath(TFilePath());
Toshihiro Shimizu 890ddd
    return true;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  void onPathChange(const TFilePath &fp) {invalidate(m_titleBox);}
Shinya Kitaoka 120a6e
  void onFrameChange(const TFrameId &fid) {m_flipPanel->onViewerRepaint();
Shinya Kitaoka 120a6e
invalidate(m_frameBox); }
Toshihiro Shimizu 890ddd
  void onZoomChange() {invalidate(m_titleBox);}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
namespace {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FileViewerPopupPool { // singleton
Shinya Kitaoka 120a6e
  public:
Toshihiro Shimizu 890ddd
  std::vector<fileviewerpopup*> m_popups;</fileviewerpopup*>
Toshihiro Shimizu 890ddd
  int m_index;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  FileViewerPopupPool() : m_index(-1){}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  static FileViewerPopupPool *instance() {
Toshihiro Shimizu 890ddd
    static FileViewerPopupPool _instance;
Toshihiro Shimizu 890ddd
    return &_instance;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  FileViewerPopup *getNew(bool doOpen) {
Toshihiro Shimizu 890ddd
    // prima cerco fra i chiusi
Toshihiro Shimizu 890ddd
    for(int i=0;i<(int)m_popups.size();i++)
Toshihiro Shimizu 890ddd
      if(!m_popups[i]->isOpen())
Toshihiro Shimizu 890ddd
        {
Toshihiro Shimizu 890ddd
         m_index = i;
Toshihiro Shimizu 890ddd
         if (doOpen)
Toshihiro Shimizu 890ddd
           m_popups[m_index]->openPopup();
Toshihiro Shimizu 890ddd
         return m_popups[m_index];
Toshihiro Shimizu 890ddd
        }
Toshihiro Shimizu 890ddd
    string name("fileViewerPopup");
Toshihiro Shimizu 890ddd
    if(m_popups.size()>0)
Toshihiro Shimizu 890ddd
      name += toString((int)m_popups.size()+1);
Toshihiro Shimizu 890ddd
    FileViewerPopup *popup = new FileViewerPopup(name);
Toshihiro Shimizu 890ddd
    m_index = m_popups.size();
Toshihiro Shimizu 890ddd
    m_popups.push_back(popup);
Toshihiro Shimizu 890ddd
    if (doOpen)
Toshihiro Shimizu 890ddd
      popup->openPopup();
Toshihiro Shimizu 890ddd
    return popup;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  FileViewerPopup *getCurrent(bool doOpen=true) {
Toshihiro Shimizu 890ddd
    if(0<=m_index && m_index<(int)m_popups.size() &&
Toshihiro Shimizu 890ddd
       m_popups[m_index]->isOpen())
Toshihiro Shimizu 890ddd
      return m_popups[m_index];
Toshihiro Shimizu 890ddd
    return getNew(doOpen);
Toshihiro Shimizu 890ddd
  }
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
}//namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void setFrameRateInViewers(int frameRate)
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
  for (UINT i=0; i<fileviewerpopuppool::instance()->m_popups.size(); i++)</fileviewerpopuppool::instance()->
Toshihiro Shimizu 890ddd
    FileViewerPopupPool::instance()->m_popups[i]->setFrameRate(frameRate);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void resetViewer()
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
  FileViewerPopupPool::instance()->getCurrent(false)->onClose();
Toshihiro Shimizu 890ddd
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
Toshihiro Shimizu 890ddd
void viewFile(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 120a6e
  if(fp != TFilePath())
Toshihiro Shimizu 890ddd
    FileViewerPopupPool::instance()->getCurrent()->load(fp);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void viewFile(const TFilePath &fp, int from, int to, int step, TSoundTrack* snd)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 120a6e
  if(fp != TFilePath())
Shinya Kitaoka 120a6e
    FileViewerPopupPool::instance()->getCurrent()->load(fp, from, to, step,
Shinya Kitaoka 120a6e
snd);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class OpenFileViewerCommand : public TGuiCommandExecutor
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  OpenFileViewerCommand()
Toshihiro Shimizu 890ddd
  : TGuiCommandExecutor("MI_OpenFileViewer")
Toshihiro Shimizu 890ddd
  {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  void onCommand() {
Toshihiro Shimizu 890ddd
    FileViewerPopupPool::instance()->getNew(true);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} openFileViewerCommand;
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// FileViewerPopup
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050500
Toshihiro Shimizu 890ddd
FileViewerPopup::FileViewerPopup(QWidget *parent, Qt::WindowFlags flags)
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
FileViewerPopup::FileViewerPopup(QWidget *parent, Qt::WFlags flags)
Toshihiro Shimizu 890ddd
#endif
Shinya Kitaoka 120a6e
    : QWidget(parent) {
Shinya Kitaoka 120a6e
  setWindowTitle(tr("Viewer"));
Shinya Kitaoka 120a6e
  QHBoxLayout *layout    = new QHBoxLayout(this);
Shinya Kitaoka 120a6e
  FileViewer *fileViewer = new FileViewer(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  layout->addWidget(fileViewer);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  setLayout(layout);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
OpenPopupCommandHandler<fileviewerpopup> openPltGizmoPopup(MI_OpenFileViewer);</fileviewerpopup>