#pragma once
#ifndef PREFERENCES_H
#define PREFERENCES_H
#include <memory>
// TnzCore includes
#include "tcommon.h"
#include "tgeometry.h"
#include "tpixel.h"
// TnzLib includes
#include "toonz/levelproperties.h"
// Qt includes
#include <QString>
#include <QObject>
#include <QMap>
#include <QRegExp>
#undef DVAPI
#undef DVVAR
#ifdef TOONZLIB_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
//==============================================================
// Forward declarations
class TFilePath;
class QSettings;
//==============================================================
//**********************************************************************************
// Preferences declaration
//**********************************************************************************
/*!
\brief Stores application-wide preferences used throughout Toonz.
*/
class DVAPI Preferences : public QObject // singleton
{
Q_OBJECT
public:
struct LevelFormat {
QString m_name; //!< Name displayed for the format.
QRegExp m_pathFormat; //!< <TT>[default: ".*"]</TT>Used to recognize levels in
//! the format. It's case <I>in</I>sensitive.
LevelOptions m_options; //!< Options associated to levels in the format.
int m_priority; //!< <TT>[default: 1]</TT> Priority value for the format.
//! Higher priority means that the format is matched first.
public:
LevelFormat(const QString &name = QString())
: m_name(name), m_pathFormat(".*", Qt::CaseInsensitive), m_priority(1) {}
bool matches(const TFilePath &fp) const;
};
enum ColumnIconLoadingPolicy {
LoadAtOnce, /**< it tells to load and display column icon
\b at \b once when the scene is opened; */
LoadOnDemand /**< it tells to load display icon \b on
\b demand (generally by clicking on the column header) */
};
public:
static Preferences *instance();
// General settings tab
void setUndoMemorySize(int memorySize);
int getUndoMemorySize() const { return m_undoMemorySize; }
void setDefaultTaskChunkSize(int chunkSize);
int getDefaultTaskChunkSize() const
{
return m_chunkSize;
}
void enableDefaultViewer(bool on);
bool isDefaultViewerEnabled() const
{
return m_defaultViewerEnabled;
}
void enableRasterOptimizedMemory(bool on);
bool isRasterOptimizedMemory() const
{
return m_rasterOptimizedMemory;
}
void enableAutosave(bool on);
bool isAutosaveEnabled() const
{
return m_autosaveEnabled;
}
void setAutosavePeriod(int minutes);
int getAutosavePeriod() const
{
return m_autosavePeriod;
} // minutes
void enableLevelsBackup(bool enabled);
bool isLevelsBackupEnabled() const { return m_levelsBackupEnabled; }
void enableSceneNumbering(bool enabled);
bool isSceneNumberingEnabled() const { return m_sceneNumberingEnabled; }
void enableReplaceAfterSaveLevelAs(bool on);
bool isReplaceAfterSaveLevelAsEnabled() const
{
return m_replaceAfterSaveLevelAs;
}
// Interface tab
void setCurrentLanguage(int currentLanguage);
QString getCurrentLanguage() const;
QString getLanguage(int index) const;
int getLanguageCount() const;
void setCurrentStyleSheet(int currentStyleSheet);
QString getCurrentStyleSheet() const;
QString getStyleSheet(int index) const;
int getStyleSheetCount() const;
void setUnits(std::string s);
QString getUnits() const { return m_units; }
void setCameraUnits(std::string s);
QString getCameraUnits() const { return m_cameraUnits; }
//void setRoomChoice(std::string s);
//QString getRoomChoice() const { return m_roomChoice; }
void setCurrentRoomChoice(int currentRoomChoice);
void setCurrentRoomChoice(QString currentRoomChoice);
QString getCurrentRoomChoice() const;
int getRoomChoiceCount() const;
QString getRoomChoice(int index) const;
void enableGeneratedMovieView(bool on);
bool isGeneratedMovieViewEnabled() const
{
return m_generatedMovieViewEnabled;
}
void setViewValues(int shrink, int step);
void getViewValues(int &shrink, int &step) const
{
shrink = m_shrink, step = m_step;
}
void setIconSize(const TDimension &dim);
TDimension getIconSize() const { return m_iconSize; }
void setViewerBGColor(const TPixel32 &color, bool isDragging);
TPixel getViewerBgColor() const { return m_viewerBGColor; }
void setPreviewBGColor(const TPixel32 &color, bool isDragging);
TPixel getPreviewBgColor() const { return m_previewBGColor; }
void setChessboardColor1(const TPixel32 &color, bool isDragging);
void setChessboardColor2(const TPixel32 &color, bool isDragging);
void getChessboardColors(TPixel32 &col1, TPixel32 &col2) const
{
col1 = m_chessboardColor1;
col2 = m_chessboardColor2;
}
void enableShowRasterImagesDarkenBlendedInViewer(bool on);
bool isShowRasterImagesDarkenBlendedInViewerEnabled() const
{
return m_showRasterImagesDarkenBlendedInViewer;
}
void enableActualPixelViewOnSceneEditingMode(bool on);
bool isActualPixelViewOnSceneEditingModeEnabled() const
{
return m_actualPixelViewOnSceneEditingMode;
}
void setViewerZoomCenter(int type);
int getViewerZoomCenter() const
{
return m_viewerZoomCenter;
}
void enableShowFrameNumberWithLetters(bool on);
bool isShowFrameNumberWithLettersEnabled() const
{
return m_showFrameNumberWithLetters;
}
void enableLevelNameOnEachMarker(bool on);
bool isLevelNameOnEachMarkerEnabled() const
{
return m_levelNameOnEachMarker;
}
void setColumnIconLoadingPolicy(ColumnIconLoadingPolicy cilp);
ColumnIconLoadingPolicy getColumnIconLoadingPolicy() const
{
return (ColumnIconLoadingPolicy)m_columnIconLoadingPolicy;
}
void enableMoveCurrent(bool on);
bool isMoveCurrentEnabled() const
{
return m_moveCurrentFrameByClickCellArea;
}
// Visualization tab
void setShow0ThickLines(bool on);
bool getShow0ThickLines() const
{
return m_show0ThickLines;
}
void setRegionAntialias(bool on);
bool getRegionAntialias() const
{
return m_regionAntialias;
}
// Loading tab
void enableAutoExpose(bool on);
bool isAutoExposeEnabled() const
{
return m_autoExposeEnabled;
}
void enableSubsceneFolder(bool on);
bool isSubsceneFolderEnabled() const
{
return m_subsceneFolderEnabled;
}
int addLevelFormat(const LevelFormat &format); //!< Inserts a new level format. \return The associated format index.
void removeLevelFormat(int formatIdx); //!< Removes a level format.
const LevelFormat &levelFormat(int formatIdx) const; //!< Retrieves a level format.
int levelFormatsCount() const; //!< Returns the number of stored level formats.
/*! \return Either the index of a matching format, or \p -1 if none
was found. */
int matchLevelFormat(const TFilePath &fp) const; //!< Returns the \a nonnegative index of the first level format
//! matching the specified file path, <I>or \p -1 if none</I>.
void setInitialLoadTlvCachingBehavior(int type);
int getInitialLoadTlvCachingBehavior() const
{
return m_initialLoadTlvCachingBehavior;
}
void enableRemoveSceneNumberFromLoadedLevelName(bool on);
bool isRemoveSceneNumberFromLoadedLevelNameEnabled() const
{
return m_removeSceneNumberFromLoadedLevelName;
}
void setPaletteTypeOnLoadRasterImageAsColorModel(int type);
int getPaletteTypeOnLoadRasterImageAsColorModel() const
{
return m_paletteTypeOnLoadRasterImageAsColorModel;
}
// Drawing tab
void setScanLevelType(std::string s);
QString getScanLevelType() const { return m_scanLevelType; }
void setDefLevelType(int levelType);
int getDefLevelType() const { return m_defLevelType; }
void setDefLevelWidth(double width);
double getDefLevelWidth() const { return m_defLevelWidth; }
void setDefLevelHeight(double height);
double getDefLevelHeight() const { return m_defLevelHeight; }
void setDefLevelDpi(double dpi);
double getDefLevelDpi() const { return m_defLevelDpi; }
void setAutocreationType(int s);
int getAutocreationType() const { return m_autocreationType; }
bool isAutoCreateEnabled() const
{
return m_autocreationType > 0;
}
bool isAnimationSheetEnabled() const
{
return m_autocreationType == 2;
}
void enableSaveUnpaintedInCleanup(bool on);
bool isSaveUnpaintedInCleanupEnable() const
{
return m_saveUnpaintedInCleanup;
}
void enableMinimizeSaveboxAfterEditing(bool on);
bool isMinimizeSaveboxAfterEditing() const
{
return m_minimizeSaveboxAfterEditing;
}
void setFillOnlySavebox(bool on);
bool getFillOnlySavebox() const { return m_fillOnlySavebox; }
void enableMultiLayerStylePicker(bool on);
bool isMultiLayerStylePickerEnabled() const
{
return m_multiLayerStylePickerEnabled;
}
// Xsheet tab
void setXsheetStep(int step); //!< Sets the step used for the <I>next/prev step</I> commands.
int getXsheetStep() const { return m_xsheetStep; } //!< Returns the step used for the <I>next/prev step</I> commands.
void enableXsheetAutopan(bool on); //!< Enables/disables xsheet panning during playback.
bool isXsheetAutopanEnabled() const
{
return m_xsheetAutopanEnabled;
} //!< Returns whether xsheet pans during playback.
void enableIgnoreAlphaonColumn1(bool on); //!< Enables/disables xsheet panning during playback.
bool isIgnoreAlphaonColumn1Enabled() const
{
return m_ignoreAlphaonColumn1Enabled;
} //!< Returns whether xsheet pans during playback.
void setDragCellsBehaviour(int dragCellsBehaviour);
int getDragCellsBehaviour() const { return m_dragCellsBehaviour; }
void enableShowKeyframesOnXsheetCellArea(bool on);
bool isShowKeyframesOnXsheetCellAreaEnabled() const
{
return m_showKeyframesOnXsheetCellArea;
}
// Animation tab
void setKeyframeType(int s);
int getKeyframeType() const { return m_keyframeType; }
void setAnimationStep(int s);
int getAnimationStep() const { return m_animationStep; }
// Preview tab
void setBlankValues(int blanksCount, TPixel32 blankColor);
void getBlankValues(int &blanksCount, TPixel32 &blankColor) const
{
blanksCount = m_blanksCount, blankColor = m_blankColor;
}
void enablePreviewAlwaysOpenNewFlip(bool on);
bool previewAlwaysOpenNewFlipEnabled() const
{
return m_previewAlwaysOpenNewFlipEnabled;
}
void enableRewindAfterPlayback(bool on);
bool rewindAfterPlaybackEnabled() const
{
return m_rewindAfterPlaybackEnabled;
}
void enableFitToFlipbook(bool on);
bool fitToFlipbookEnabled() const
{
return m_fitToFlipbookEnabled;
}
// Onion Skin tab
void enableOnionSkin(bool on);
bool isOnionSkinEnabled() const
{
return m_onionSkinEnabled;
}
void setOnionPaperThickness(int thickness);
int getOnionPaperThickness() const { return m_onionPaperThickness; }
void setOnionData(const TPixel &frontOnionColor, const TPixel &backOnionColor, bool inksOnly);
void getOnionData(TPixel &frontOnionColor, TPixel &backOnionColor, bool &inksOnly) const
{
frontOnionColor = m_frontOnionColor, backOnionColor = m_backOnionColor, inksOnly = m_inksOnly;
}
// Transparency Check tab
void setTranspCheckData(const TPixel &bg, const TPixel &ink, const TPixel &paint);
void getTranspCheckData(TPixel &bg, TPixel &ink, TPixel &paint) const
{
bg = m_transpCheckBg;
ink = m_transpCheckInk;
paint = m_transpCheckPaint;
}
// Version Control tab
void enableSVN(bool on);
bool isSVNEnabled() const { return m_SVNEnabled; }
void enableAutomaticSVNFolderRefresh(bool on);
bool isAutomaticSVNFolderRefreshEnabled() const
{
return m_automaticSVNFolderRefreshEnabled;
}
// Uncategorized - internals
void setAskForOverrideRender(bool on);
bool askForOverrideRender() const { return m_askForOverrideRender; }
void setLineTestFpsCapture(int lineTestFpsCapture);
int getLineTestFpsCapture() const { return m_lineTestFpsCapture; }
int getTextureSize() const { return m_textureSize; }
bool useDrawPixel() { return m_textureSize == 0; }
int getShmMax() const { return m_shmmax; } //! \sa The \p sysctl unix command.
int getShmSeg() const { return m_shmseg; } //! \sa The \p sysctl unix command.
int getShmAll() const { return m_shmall; } //! \sa The \p sysctl unix command.
int getShmMni() const { return m_shmmni; } //! \sa The \p sysctl unix command.
std::string getLayerNameEncoding() const {return m_layerNameEncoding; };
Q_SIGNALS :
void
stopAutoSave();
void startAutoSave();
private:
std::unique_ptr<QSettings> m_settings;
QMap<int, QString> m_languageMaps,
m_styleSheetMaps,
m_roomMaps;
std::vector<LevelFormat> m_levelFormats;
QString m_units,
m_cameraUnits,
m_scanLevelType,
m_currentRoomChoice;
double m_defLevelWidth,
m_defLevelHeight,
m_defLevelDpi;
TDimension m_iconSize;
TPixel32 m_blankColor,
m_frontOnionColor,
m_backOnionColor,
m_transpCheckBg,
m_transpCheckInk,
m_transpCheckPaint;
int m_autosavePeriod, // minutes
m_chunkSize,
m_blanksCount,
m_onionPaperThickness,
m_step,
m_shrink,
m_textureSize,
m_autocreationType,
m_keyframeType,
m_animationStep;
int m_currentLanguage,
m_currentStyleSheet,
m_undoMemorySize, // in megabytes
m_dragCellsBehaviour,
m_lineTestFpsCapture,
m_defLevelType,
m_xsheetStep,
m_shmmax,
m_shmseg,
m_shmall,
m_shmmni;
bool m_autoExposeEnabled,
m_autoCreateEnabled,
m_subsceneFolderEnabled,
m_generatedMovieViewEnabled,
m_xsheetAutopanEnabled,
m_ignoreAlphaonColumn1Enabled,
m_previewAlwaysOpenNewFlipEnabled,
m_rewindAfterPlaybackEnabled,
m_fitToFlipbookEnabled,
m_autosaveEnabled,
m_defaultViewerEnabled;
bool m_rasterOptimizedMemory,
m_saveUnpaintedInCleanup,
m_askForOverrideRender,
m_automaticSVNFolderRefreshEnabled,
m_SVNEnabled,
m_levelsBackupEnabled,
m_minimizeSaveboxAfterEditing,
m_sceneNumberingEnabled,
m_animationSheetEnabled,
m_inksOnly;
bool m_fillOnlySavebox,
m_show0ThickLines,
m_regionAntialias;
TPixel32 m_viewerBGColor,
m_previewBGColor,
m_chessboardColor1,
m_chessboardColor2;
bool m_showRasterImagesDarkenBlendedInViewer,
m_actualPixelViewOnSceneEditingMode;
int m_viewerZoomCenter; // MOUSE_CURSOR = 0, VIEWER_CENTER = 1
// used in the load level popup. ON_DEMAND = 0, ALL_ICONS = 1, ALL_ICONS_AND_IMAGES = 2
int m_initialLoadTlvCachingBehavior;
// automatically remove 6 letters of scene number from the level name ("c0001_A.tlv" -> "A")
bool m_removeSceneNumberFromLoadedLevelName;
// after save level as command, replace the level with "save-as"ed level
bool m_replaceAfterSaveLevelAs;
// convert the last one digit of the frame number to alphabet
// Ex. 12 -> 1B 21 -> 2A 30 -> 3
bool m_showFrameNumberWithLetters;
// display level name on each marker in the xsheet cell area
bool m_levelNameOnEachMarker;
// whether to load the column icon(thumbnail) at once / on demand
int m_columnIconLoadingPolicy;
bool m_moveCurrentFrameByClickCellArea;
bool m_onionSkinEnabled;
bool m_multiLayerStylePickerEnabled;
/*--
Color Modelにラスタ画像を読み込んだとき、パレットをどのように作るか
0 : 全ての異なるピクセルの色を別のStyleにする, 1 : 似ている色をまとめて1つのStyleにする
--*/
int m_paletteTypeOnLoadRasterImageAsColorModel;
bool m_showKeyframesOnXsheetCellArea;
std::string m_layerNameEncoding = "SJIS"; // Fixed to SJIS for now. You can add interface if you wanna change encoding.
private:
Preferences();
~Preferences();
};
#endif // PREFERENCES_H