#ifndef FLIPBOOK_H
#define FLIPBOOK_H
#include "toonzqt/flipconsole.h"
#include "imageviewer.h"
#include "tlevel_io.h"
#include "tpalette.h"
#include "tsound.h"
#include "filebrowserpopup.h"
#include "tfx.h"
#include "toonz/txsheet.h"
#include <QTimer>
#include "toonzqt/flipconsoleowner.h"
class QPoint;
class TPalette;
class TFilePath;
class FlipBook;
//=============================================================================
class SaveImagesPopup : public FileBrowserPopup
{
Q_OBJECT
FlipBook *m_flip;
public:
SaveImagesPopup(FlipBook *flip);
bool execute();
};
class LoadImagesPopup : public FileBrowserPopup
{
Q_OBJECT
LineEdit *m_fromField;
LineEdit *m_toField;
LineEdit *m_stepField;
LineEdit *m_shrinkField;
int m_minFrame, m_maxFrame;
int m_from, m_to, m_step, m_shrink;
QStringList m_appendFilterTypes;
QStringList m_loadFilterTypes;
FlipBook *m_flip;
public:
LoadImagesPopup(FlipBook *flip);
bool execute();
bool executeApply();
bool doLoad(bool append);
public slots:
void onFilePathClicked(const TFilePath &);
void onEditingFinished();
};
//=============================================================================
// FlipBookPool
//-----------------------------------------------------------------------------
class FlipBook;
class FlipBookPool
{
map<int, FlipBook *> m_pool;
map<int, QRect> m_geometryPool;
int m_overallFlipCount;
TFilePath m_historyPath;
public:
FlipBookPool();
~FlipBookPool();
static FlipBookPool *instance();
void load(const TFilePath &historyPath);
void save() const;
FlipBook *pop();
void push(FlipBook *flipbook);
};
//=============================================================================
// FlipBook
//-----------------------------------------------------------------------------
class TSoundOutputDevice;
class TSoundTrack;
class SaveImagesPopup;
class LoadImagesPopup;
class TFx;
class TXsheet;
class TXshSimpleLevel;
class TPanelTitleBar;
class TPanelTitleBarButton;
class FlipBook : public QWidget, public TSoundOutputDeviceListener, public FlipConsoleOwner
{
Q_OBJECT
protected:
int m_poolIndex;
QString m_viewerTitle;
QString m_title, m_title1;
ImageViewer *m_imageViewer;
FlipConsole *m_flipConsole;
int m_shrink;
int m_framesCount;
TRect m_loadbox;
TDimension m_dim;
map<string, TRect> m_loadboxes; //id in the cash, rect loaded actually
class Level
{
public:
Level(const TLevelP &level, const TFilePath &fp, int fromIndex, int toIndex, int step)
: m_level(level), m_fp(fp), m_fromIndex(fromIndex), m_toIndex(toIndex), m_step(step), m_randomAccessRead(false), m_incrementalIndexing(false)
{
}
TLevelP m_level;
int m_fromIndex, m_toIndex, m_step;
bool m_incrementalIndexing;
bool m_randomAccessRead;
TFilePath m_fp;
TFrameId flipbookIndexToLevelFrame(int index);
int getIndexesCount();
};
vector<Level> m_levels;
vector<QString> m_levelNames;
TPalette *m_palette;
bool m_playSound;
vector<string> m_addedInCache;
TSoundOutputDevice *m_player;
TSoundTrack *m_snd;
//bool m_doCompare;
//questi sono per il saving dei frame
TLevelWriterP m_lw;
TLevelReaderP m_lr;
TXshSimpleLevel *m_xl;
int m_currentFrameToSave;
SaveImagesPopup *m_savePopup;
LoadImagesPopup *m_loadPopup;
bool m_isPreviewFx;
TFxP m_previewedFx;
TXsheetP m_previewXsh;
QTimer m_previewUpdateTimer;
bool m_freezed;
UCHAR m_flags;
TPanelTitleBarButton *m_freezeButton;
public:
enum Flags { eDontKeepFilesOpened = 0x1 };
FlipBook(QWidget *parent = 0,
QString viewerTitle = QString(),
UINT flipConsoleButtonMask = FlipConsole::cFullConsole & (~(FlipConsole::eFilledRaster | FlipConsole::eDefineSubCamera)),
UCHAR flags = 0,
bool isColorModel = false);
~FlipBook();
void setLevel(const TFilePath &path, TPalette *palette = 0, int from = -1, int to = -1, int step = 1, int shrink = 1,
TSoundTrack *snd = 0, bool append = false, bool isToonzOutput = false);
void setLevel(TFx *previewedFx, TXsheet *xsh, TLevel *level, TPalette *palette = 0, int from = -1, int to = -1, int step = 1, int currentFrame = 1, TSoundTrack *snd = 0);
void setLevel(TXshSimpleLevel *xl);
void onPlayCompleted() {}
bool doSaveImages(TFilePath fp);
int getCurrentFrame() { return m_flipConsole->getCurrentFrame(); }
QString getLevelZoomTitle() const { return m_title1 + m_title; }
void setTitle(const QString &title);
QString getTitle() const { return m_viewerTitle; }
void showFrame(int frame);
TFx *getPreviewedFx() const;
TXsheet *getPreviewXsheet() const;
bool isFreezed() const { return m_freezed; }
TRectD getPreviewedImageGeometry() const;
void schedulePreviewedFxUpdate();
bool canAppend();
bool isSavable() const;
void setPoolIndex(int poolIndex) { m_poolIndex = poolIndex; }
int getPoolIndex() const { return m_poolIndex; }
// show / hide the red border line indicating the frame is under rendering
void setIsRemakingPreviewFx(bool on)
{
m_imageViewer->setIsRemakingPreviewFx(on);
}
void addFreezeButtonToTitleBar();
void setProgressBarStatus(const std::vector<UCHAR> *pbStatus);
const std::vector<UCHAR> *getProgressBarStatus() const;
void adaptGeometry(const TRect &interestingImgRect, const TRect &imgRect);
// When Fx preview is called without the subcamera,
// render the full region of camera by resize flipbook and
// zoom-out the rendered image.
void adaptGeometryForFullPreview(const TRect &imgRect);
void reset();
void onDrawFrame(int frame, const ImagePainter::VisualSettings &vs);
void minimize(bool doMinimize);
ImageViewer *getImageViewer() { return m_imageViewer; }
TRect getLoadbox() const { return m_loadbox; }
void setLoadbox(const TRect &box);
TDimension getImageSize() const { return m_dim; }
void swapBuffers();
void changeSwapBehavior(bool enable);
private:
// When viewing the tlv, try to cache all frames at the beginning.
// NOTE : fromFrame and toFrame are frame numbers displayed on the flipbook
void loadAndCacheAllTlvImages(Level level, int fromFrame, int toFrame);
friend class PreviewFxManager;
protected:
void clearCache();
void adaptWidGeometry(const TRect &interestWidRect, const TRect &imgWidRect, bool keepPosition);
void dragEnterEvent(QDragEnterEvent *e);
void dropEvent(QDropEvent *e);
void playAudioFrame(int frame);
TImageP getCurrentImage(int frame);
void showEvent(QShowEvent *e);
void hideEvent(QHideEvent *e);
void focusInEvent(QFocusEvent *e);
void resizeEvent(QResizeEvent *e);
void enterEvent(QEvent *e) { m_flipConsole->makeCurrent(); }
signals:
void closeFlipBook(FlipBook *);
// when freeze button is released, emit the signal to PreviewFxManager for re-rendering
void unfreezed(FlipBook *);
// when using the flip module, this signal is to show the loaded level names in application's title bar
void imageLoaded(QString &);
protected slots:
void onDoubleClick(QMouseEvent *me);
void onButtonPressed(FlipConsole::EGadget button);
void onCloseButtonPressed();
void saveImage();
void freeze(bool on);
public slots:
void saveImages();
void loadImages();
void performFxUpdate();
void regenerate();
void regenerateFrame();
void clonePreview();
void freezePreview();
void unfreezePreview();
};
//utility
void viewFile(const TFilePath &fp, int from = -1, int to = -1, int step = -1, int shrink = -1,
TSoundTrack *snd = 0, FlipBook *flipbook = 0,
bool append = false, bool isToonzOutput = false);
#endif // FLIPBOOK_H