4a76fd864f
close #795
1580 lines
57 KiB
C++
1580 lines
57 KiB
C++
|
||
|
||
#include "outputsettingspopup.h"
|
||
|
||
// Tnz6 includes
|
||
#include "menubarcommandids.h"
|
||
#include "formatsettingspopups.h"
|
||
#include "tapp.h"
|
||
#include "camerasettingspopup.h"
|
||
#include "pane.h"
|
||
|
||
// TnzQt includes
|
||
#include "toonzqt/menubarcommand.h"
|
||
#include "toonzqt/gutil.h"
|
||
#include "toonzqt/filefield.h"
|
||
#include "toonzqt/doublefield.h"
|
||
#include "toonzqt/checkbox.h"
|
||
|
||
// TnzLib includes
|
||
#include "toonz/tscenehandle.h"
|
||
#include "toonz/txsheethandle.h"
|
||
#include "toonz/toonzscene.h"
|
||
#include "toonz/txsheet.h"
|
||
#include "toonz/tstageobjecttree.h"
|
||
#include "toonz/preferences.h"
|
||
#include "toutputproperties.h"
|
||
#include "toonz/tcamera.h"
|
||
|
||
// TnzBase includes
|
||
#include "trasterfx.h"
|
||
|
||
// TnzCore includes
|
||
#include "tiio.h"
|
||
#include "tlevel_io.h"
|
||
#include "tenv.h"
|
||
#include "tsystem.h"
|
||
#include "tstream.h"
|
||
|
||
// Qt includes
|
||
#include <QLabel>
|
||
#include <QPushButton>
|
||
#include <QComboBox>
|
||
#include <QMainWindow>
|
||
#include <QFrame>
|
||
#include <QMessageBox>
|
||
|
||
//-----------------------------------------------------------------------------
|
||
namespace {
|
||
|
||
enum ResampleOption {
|
||
c_standard,
|
||
c_improved,
|
||
c_high,
|
||
|
||
c_triangle,
|
||
c_mitchell,
|
||
c_cubic5,
|
||
c_cubic75,
|
||
c_cubic1,
|
||
c_hann2,
|
||
c_hann3,
|
||
c_hamming2,
|
||
c_hamming3,
|
||
c_lanczos2,
|
||
c_lanczos3,
|
||
c_gauss,
|
||
c_closestPixel,
|
||
c_bilinear
|
||
};
|
||
|
||
enum ChannelWidth { c_8bit, c_16bit };
|
||
|
||
enum DominantField { c_odd, c_even, c_none };
|
||
|
||
enum ThreadsOption {
|
||
c_single,
|
||
c_half,
|
||
c_all,
|
||
};
|
||
|
||
enum GranularityOption { c_off, c_large, c_medium, c_small };
|
||
|
||
} // anonymous namespace
|
||
//-----------------------------------------------------------------------------
|
||
|
||
//=============================================================================
|
||
/*! \class OutputSettingsPopup
|
||
\brief The OutputSettingsPopup class provides a output settings
|
||
dialog.
|
||
|
||
Inherits \b Dialog.
|
||
This class allows to set output properties of current scene.
|
||
It's composed of a list of field to set this preperties:
|
||
a \b DVGui::FileField to set output directory, a LineEdit for
|
||
output name,
|
||
a \b QComboBox to choose format, a button near QComboBox that
|
||
open a popup
|
||
to change format chosen settings, other QComboBox to choose
|
||
camera,
|
||
resample balance, channel width and dominant field and other
|
||
number field
|
||
to set values for frame and time stretch.
|
||
*/
|
||
OutputSettingsPopup::OutputSettingsPopup(bool isPreview)
|
||
: Dialog(TApp::instance()->getMainWindow(), false,
|
||
Preferences::instance()->getCurrentLanguage() == "English",
|
||
isPreview ? "PreviewSettings" : "OutputSettings")
|
||
, m_subcameraChk(0)
|
||
, m_applyShrinkChk(0)
|
||
, m_outputCameraOm(0)
|
||
, m_isPreviewSettings(isPreview)
|
||
, m_presetCombo(0) {
|
||
setWindowTitle(isPreview ? tr("Preview Settings") : tr("Output Settings"));
|
||
|
||
QLabel *cameraSettingsLabel = new QLabel(tr("Camera Settings"), this);
|
||
QLabel *fileSettingsLabel = new QLabel(tr("File Settings"), this);
|
||
QFrame *cameraSettingsBox = new QFrame(this);
|
||
QFrame *fileSettingsBox = new QFrame(this);
|
||
QFrame *cameraParametersBox;
|
||
if (!isPreview) {
|
||
// Save In
|
||
m_saveInFileFld = new DVGui::FileField(0, QString(""));
|
||
// File Name
|
||
m_fileNameFld = new DVGui::LineEdit(QString(""));
|
||
// File Format
|
||
m_fileFormat = new QComboBox();
|
||
m_fileFormatButton = new QPushButton(tr("Options"));
|
||
|
||
m_cameraSettings = new CameraSettingsPopup();
|
||
cameraParametersBox = new QFrame(this);
|
||
}
|
||
// Output Camera
|
||
m_outputCameraOm = new QComboBox();
|
||
// m_outputCameraOm->hide();
|
||
if (isPreview) {
|
||
// Subcamera checkbox
|
||
m_subcameraChk = new DVGui::CheckBox(tr("Use Sub-Camera"));
|
||
}
|
||
|
||
// Frame Start-End
|
||
m_startFld = new DVGui::IntLineEdit(this);
|
||
m_endFld = new DVGui::IntLineEdit(this);
|
||
// Step-Shrink
|
||
m_stepFld = new DVGui::IntLineEdit(this);
|
||
m_shrinkFld = new DVGui::IntLineEdit(this);
|
||
if (isPreview)
|
||
m_applyShrinkChk =
|
||
new DVGui::CheckBox(tr("Apply Shrink to Main Viewer"), this);
|
||
else
|
||
m_applyShrinkChk = 0;
|
||
// Resample Balance
|
||
m_resampleBalanceOm = new QComboBox();
|
||
// Channel Width
|
||
m_channelWidthOm = new QComboBox();
|
||
|
||
QPushButton *showOtherSettingsButton = NULL;
|
||
QLabel *otherSettingsLabel = NULL;
|
||
QFrame *otherSettingsFrame = NULL;
|
||
QPushButton *showCameraSettingsButton = NULL;
|
||
QPushButton *addPresetButton = NULL;
|
||
QPushButton *removePresetButton = NULL;
|
||
|
||
m_dominantFieldOm = 0;
|
||
if (!isPreview) {
|
||
showOtherSettingsButton = new QPushButton("", this);
|
||
otherSettingsLabel = new QLabel(tr("Other Settings"), this);
|
||
otherSettingsFrame = new QFrame(this);
|
||
m_renderButton = new QPushButton(tr("Render"), this);
|
||
// Gamma
|
||
m_gammaFld = new DVGui::DoubleLineEdit();
|
||
// Dominant Field
|
||
m_dominantFieldOm = new QComboBox();
|
||
|
||
// Stretch
|
||
TRenderSettings rs = getProperties()->getRenderSettings();
|
||
|
||
// Scene Settings FPS
|
||
double frameRate = getProperties()->getFrameRate();
|
||
m_frameRateFld = new DVGui::DoubleLineEdit(this, frameRate);
|
||
|
||
m_stretchFromFld = new DVGui::DoubleLineEdit(this, rs.m_timeStretchFrom);
|
||
m_stretchToFld = new DVGui::DoubleLineEdit(this, rs.m_timeStretchTo);
|
||
m_multimediaOm = new QComboBox(this);
|
||
|
||
showCameraSettingsButton = new QPushButton("", this);
|
||
addPresetButton = new QPushButton(tr("Add"), this);
|
||
removePresetButton = new QPushButton(tr("Remove"), this);
|
||
m_presetCombo = new QComboBox(this);
|
||
|
||
m_doStereoscopy = new DVGui::CheckBox(tr("Do stereoscopy"), this);
|
||
m_stereoShift = new DVGui::DoubleLineEdit(this, 0.05);
|
||
}
|
||
// Threads
|
||
m_threadsComboOm = new QComboBox();
|
||
// Granularity
|
||
m_rasterGranularityOm = new QComboBox();
|
||
|
||
//----プロパティの設定
|
||
|
||
cameraSettingsLabel->setObjectName("OutputSettingsLabel");
|
||
fileSettingsLabel->setObjectName("OutputSettingsLabel");
|
||
cameraSettingsBox->setObjectName("OutputSettingsBox");
|
||
fileSettingsBox->setObjectName("OutputSettingsBox");
|
||
|
||
if (!isPreview) {
|
||
// File Format
|
||
QStringList formats;
|
||
TImageWriter::getSupportedFormats(formats, true);
|
||
TLevelWriter::getSupportedFormats(formats, true);
|
||
Tiio::Writer::getSupportedFormats(formats, true);
|
||
formats.sort();
|
||
m_fileFormat->addItems(formats);
|
||
cameraParametersBox->setObjectName("OutputSettingsCameraBox");
|
||
}
|
||
|
||
// Resample Balance
|
||
QStringList resampleBalance;
|
||
resampleBalance << tr("Standard") << tr("Improved") << tr("High")
|
||
<< tr("Triangle filter") << tr("Mitchell-Netravali filter")
|
||
<< tr("Cubic convolution, a = .5")
|
||
<< tr("Cubic convolution, a = .75")
|
||
<< tr("Cubic convolution, a = 1")
|
||
<< tr("Hann window, rad = 2") << tr("Hann window, rad = 3")
|
||
<< tr("Hamming window, rad = 2")
|
||
<< tr("Hamming window, rad = 3")
|
||
<< tr("Lanczos window, rad = 2")
|
||
<< tr("Lanczos window, rad = 3") << tr("Gaussian convolution")
|
||
<< tr("Closest Pixel (Nearest Neighbor)") << tr("Bilinear");
|
||
|
||
m_resampleBalanceOm->addItems(resampleBalance);
|
||
|
||
// Channel Width
|
||
QStringList chWidth;
|
||
chWidth << tr("8 bit") << tr("16 bit");
|
||
m_channelWidthOm->addItems(chWidth);
|
||
|
||
if (!isPreview) {
|
||
showOtherSettingsButton->setObjectName("OutputSettingsShowButton");
|
||
showOtherSettingsButton->setFixedSize(15, 15);
|
||
showOtherSettingsButton->setCheckable(true);
|
||
showOtherSettingsButton->setChecked(false);
|
||
showOtherSettingsButton->setFocusPolicy(Qt::NoFocus);
|
||
otherSettingsLabel->setObjectName("OutputSettingsLabel");
|
||
otherSettingsFrame->setObjectName("OutputSettingsBox");
|
||
otherSettingsFrame->setVisible(false);
|
||
|
||
// Dominant Field
|
||
QStringList dominantField;
|
||
dominantField << tr("Odd (NTSC)") << tr("Even (PAL)") << tr("None");
|
||
m_dominantFieldOm->addItems(dominantField);
|
||
m_stretchFromFld->setRange(1, 1000);
|
||
m_stretchToFld->setRange(1, 1000);
|
||
m_stretchFromFld->setDecimals(2);
|
||
m_stretchToFld->setDecimals(2);
|
||
|
||
// Multimedia rendering enum
|
||
QStringList multimediaTypes;
|
||
multimediaTypes << tr("None") << tr("Fx Schematic Flows")
|
||
<< tr("Fx Schematic Terminal Nodes");
|
||
m_multimediaOm->addItems(multimediaTypes);
|
||
|
||
showCameraSettingsButton->setObjectName("OutputSettingsShowButton");
|
||
showCameraSettingsButton->setFixedSize(15, 15);
|
||
showCameraSettingsButton->setCheckable(true);
|
||
showCameraSettingsButton->setChecked(true);
|
||
showCameraSettingsButton->setFocusPolicy(Qt::NoFocus);
|
||
|
||
addPresetButton->setObjectName("PushButton_NoPadding");
|
||
removePresetButton->setObjectName("PushButton_NoPadding");
|
||
/*-- OutputSettingsのプリセット登録の説 明--*/
|
||
QString tooltip(
|
||
"Save current output settings.\nThe parameters to be saved are:\n\
|
||
- Camera settings\n- Project folder to be saved in\n- File format\n- File options\n- Resample Balance\n- Channel width");
|
||
addPresetButton->setToolTip(tooltip);
|
||
/*-- プリセットフォルダを調べ、コンボボックスにアイテムを格納する --*/
|
||
updatePresetComboItems();
|
||
m_stereoShift->setEnabled(false);
|
||
}
|
||
|
||
QStringList threadsChoices;
|
||
threadsChoices << tr("Single") << tr("Half") << tr("All");
|
||
m_threadsComboOm->addItems(threadsChoices);
|
||
QStringList granularityChoices;
|
||
granularityChoices << tr("None") << tr("Large") << tr("Medium")
|
||
<< tr("Small");
|
||
m_rasterGranularityOm->addItems(granularityChoices);
|
||
|
||
//----layout
|
||
|
||
m_topLayout->setMargin(5);
|
||
m_topLayout->setSpacing(3);
|
||
{
|
||
if (!isPreview) {
|
||
QHBoxLayout *presetLay = new QHBoxLayout();
|
||
presetLay->setMargin(0);
|
||
presetLay->setSpacing(5);
|
||
{
|
||
presetLay->addStretch(1);
|
||
presetLay->addWidget(new QLabel(tr("Presets:"), this), 1,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
presetLay->addWidget(m_presetCombo, 1);
|
||
presetLay->addWidget(addPresetButton, 0);
|
||
presetLay->addWidget(removePresetButton, 0);
|
||
}
|
||
m_topLayout->addLayout(presetLay, 0);
|
||
}
|
||
|
||
QHBoxLayout *cameraSettingsLabelLay = new QHBoxLayout();
|
||
cameraSettingsLabelLay->setMargin(0);
|
||
cameraSettingsLabelLay->setSpacing(3);
|
||
{
|
||
if (!isPreview)
|
||
cameraSettingsLabelLay->addWidget(showCameraSettingsButton, 0);
|
||
cameraSettingsLabelLay->addWidget(cameraSettingsLabel, 0);
|
||
cameraSettingsLabelLay->addStretch(1);
|
||
}
|
||
m_topLayout->addLayout(cameraSettingsLabelLay, 0);
|
||
|
||
QVBoxLayout *camSetBoxLay = new QVBoxLayout();
|
||
camSetBoxLay->setMargin(10);
|
||
camSetBoxLay->setSpacing(10);
|
||
{
|
||
// Output Camera
|
||
QHBoxLayout *outCamLay = new QHBoxLayout();
|
||
outCamLay->setMargin(0);
|
||
outCamLay->setSpacing(5);
|
||
{
|
||
outCamLay->addWidget(new QLabel(tr("Output Camera:"), this), 0);
|
||
outCamLay->addWidget(m_outputCameraOm, 1);
|
||
}
|
||
camSetBoxLay->addLayout(outCamLay);
|
||
|
||
if (!isPreview) {
|
||
QVBoxLayout *camParamLay = new QVBoxLayout();
|
||
camParamLay->setMargin(5);
|
||
camParamLay->setSpacing(0);
|
||
{ camParamLay->addWidget(m_cameraSettings); }
|
||
cameraParametersBox->setLayout(camParamLay);
|
||
|
||
camSetBoxLay->addWidget(cameraParametersBox);
|
||
}
|
||
|
||
// Frame start/end
|
||
QHBoxLayout *frameLay = new QHBoxLayout();
|
||
frameLay->setMargin(0);
|
||
frameLay->setSpacing(5);
|
||
{
|
||
frameLay->addWidget(new QLabel(tr("Frame Start:"), this), 0);
|
||
frameLay->addWidget(m_startFld, 0);
|
||
frameLay->addSpacing(3);
|
||
frameLay->addWidget(new QLabel(tr("End:"), this), 0);
|
||
frameLay->addWidget(m_endFld, 0);
|
||
frameLay->addSpacing(10);
|
||
frameLay->addWidget(new QLabel(tr("Step:"), this), 0);
|
||
frameLay->addWidget(m_stepFld, 0);
|
||
frameLay->addStretch(1);
|
||
}
|
||
camSetBoxLay->addLayout(frameLay);
|
||
|
||
// Frame Shrink
|
||
QHBoxLayout *shrinkLay = new QHBoxLayout();
|
||
shrinkLay->setMargin(0);
|
||
shrinkLay->setSpacing(5);
|
||
{
|
||
shrinkLay->addWidget(new QLabel(tr("Shrink:"), this), 0);
|
||
shrinkLay->addWidget(m_shrinkFld, 0);
|
||
shrinkLay->addStretch();
|
||
// Apply Shrink to MainViewer
|
||
if (isPreview) shrinkLay->addWidget(m_applyShrinkChk, 0);
|
||
}
|
||
camSetBoxLay->addLayout(shrinkLay);
|
||
}
|
||
cameraSettingsBox->setLayout(camSetBoxLay);
|
||
m_topLayout->addWidget(cameraSettingsBox, 0);
|
||
|
||
m_topLayout->addSpacing(10);
|
||
|
||
// File Settings
|
||
m_topLayout->addWidget(fileSettingsLabel, 0);
|
||
|
||
QVBoxLayout *fileSetBoxLay = new QVBoxLayout();
|
||
fileSetBoxLay->setMargin(10);
|
||
fileSetBoxLay->setSpacing(10);
|
||
{
|
||
if (!isPreview) {
|
||
QGridLayout *upperGridLay = new QGridLayout();
|
||
upperGridLay->setMargin(0);
|
||
upperGridLay->setHorizontalSpacing(5);
|
||
upperGridLay->setVerticalSpacing(10);
|
||
{
|
||
// Save In
|
||
upperGridLay->addWidget(new QLabel(tr("Save in:"), this), 0, 0,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
upperGridLay->addWidget(m_saveInFileFld, 0, 1, 1, 3);
|
||
// File Name
|
||
upperGridLay->addWidget(new QLabel(tr("Name:"), this), 1, 0,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
upperGridLay->addWidget(m_fileNameFld, 1, 1);
|
||
// File Format
|
||
upperGridLay->addWidget(m_fileFormat, 1, 2);
|
||
upperGridLay->addWidget(m_fileFormatButton, 1, 3);
|
||
}
|
||
upperGridLay->setColumnStretch(0, 0);
|
||
upperGridLay->setColumnStretch(1, 1);
|
||
upperGridLay->setColumnStretch(2, 0);
|
||
upperGridLay->setColumnStretch(3, 0);
|
||
|
||
fileSetBoxLay->addLayout(upperGridLay);
|
||
}
|
||
|
||
QGridLayout *bottomGridLay = new QGridLayout();
|
||
bottomGridLay->setMargin(0);
|
||
bottomGridLay->setHorizontalSpacing(5);
|
||
bottomGridLay->setVerticalSpacing(10);
|
||
{
|
||
// Resample Balance
|
||
bottomGridLay->addWidget(new QLabel(tr("Resample Balance:"), this), 0,
|
||
0, Qt::AlignRight | Qt::AlignVCenter);
|
||
bottomGridLay->addWidget(m_resampleBalanceOm, 0, 1, 1, 2);
|
||
// Channel Width
|
||
bottomGridLay->addWidget(new QLabel(tr("Channel Width:"), this), 1, 0,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
bottomGridLay->addWidget(m_channelWidthOm, 1, 1, 1, 2);
|
||
// Threads
|
||
bottomGridLay->addWidget(new QLabel(tr("Dedicated CPUs:"), this), 2, 0,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
bottomGridLay->addWidget(m_threadsComboOm, 2, 1, 1, 2);
|
||
// Granularity
|
||
bottomGridLay->addWidget(new QLabel(tr("Render Tile:"), this), 3, 0,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
bottomGridLay->addWidget(m_rasterGranularityOm, 3, 1, 1, 2);
|
||
if (m_subcameraChk) {
|
||
bottomGridLay->addWidget(m_subcameraChk, 4, 1, 1, 2);
|
||
}
|
||
}
|
||
bottomGridLay->setColumnStretch(0, 0);
|
||
bottomGridLay->setColumnStretch(1, 1);
|
||
|
||
fileSetBoxLay->addLayout(bottomGridLay);
|
||
|
||
// shrinkable settings
|
||
if (!isPreview) {
|
||
fileSetBoxLay->addSpacing(5);
|
||
|
||
QHBoxLayout *otherSettingsLabelLay = new QHBoxLayout();
|
||
otherSettingsLabelLay->setMargin(0);
|
||
otherSettingsLabelLay->setSpacing(3);
|
||
{
|
||
otherSettingsLabelLay->addWidget(showOtherSettingsButton, 0);
|
||
otherSettingsLabelLay->addWidget(otherSettingsLabel, 0);
|
||
otherSettingsLabelLay->addStretch(1);
|
||
}
|
||
fileSetBoxLay->addLayout(otherSettingsLabelLay, 0);
|
||
|
||
QGridLayout *otherSettingsLay = new QGridLayout();
|
||
otherSettingsLay->setMargin(5);
|
||
otherSettingsLay->setHorizontalSpacing(5);
|
||
otherSettingsLay->setVerticalSpacing(10);
|
||
{
|
||
// Gamma
|
||
otherSettingsLay->addWidget(new QLabel(tr("Gamma:"), this), 0, 0,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
otherSettingsLay->addWidget(m_gammaFld, 0, 1, 1, 3);
|
||
// Dominant Field
|
||
otherSettingsLay->addWidget(new QLabel(tr("Dominant Field:"), this),
|
||
1, 0, Qt::AlignRight | Qt::AlignVCenter);
|
||
otherSettingsLay->addWidget(m_dominantFieldOm, 1, 1, 1, 4);
|
||
// Scene Settings' FPS
|
||
otherSettingsLay->addWidget(
|
||
new QLabel(tr("Frame Rate (linked to Scene Settings):"), this), 2,
|
||
0, Qt::AlignRight | Qt::AlignVCenter);
|
||
otherSettingsLay->addWidget(m_frameRateFld, 2, 1, 1, 3);
|
||
// Strech
|
||
otherSettingsLay->addWidget(new QLabel(tr("Stretch from FPS:"), this),
|
||
3, 0, Qt::AlignRight | Qt::AlignVCenter);
|
||
otherSettingsLay->addWidget(m_stretchFromFld, 3, 1);
|
||
otherSettingsLay->addWidget(new QLabel(tr(" To:"), this), 3, 2,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
otherSettingsLay->addWidget(m_stretchToFld, 3, 3);
|
||
// new in V6.1
|
||
// Multimedia rendering enum
|
||
otherSettingsLay->addWidget(
|
||
new QLabel(tr("Multiple Rendering:"), this), 4, 0,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
otherSettingsLay->addWidget(m_multimediaOm, 4, 1, 1, 4);
|
||
|
||
otherSettingsLay->addWidget(m_doStereoscopy, 5, 0);
|
||
otherSettingsLay->addWidget(new QLabel(tr("Camera Shift:")), 5, 1,
|
||
Qt::AlignRight | Qt::AlignVCenter);
|
||
otherSettingsLay->addWidget(m_stereoShift, 5, 2);
|
||
|
||
otherSettingsLay->addLayout(bottomGridLay, 6, 0, 4, 5);
|
||
}
|
||
otherSettingsLay->setColumnStretch(0, 0);
|
||
otherSettingsLay->setColumnStretch(1, 0);
|
||
otherSettingsLay->setColumnStretch(2, 0);
|
||
otherSettingsLay->setColumnStretch(3, 0);
|
||
otherSettingsLay->setColumnStretch(4, 1);
|
||
|
||
otherSettingsFrame->setLayout(otherSettingsLay);
|
||
fileSetBoxLay->addWidget(otherSettingsFrame, 0);
|
||
}
|
||
}
|
||
fileSettingsBox->setLayout(fileSetBoxLay);
|
||
m_topLayout->addWidget(fileSettingsBox, 0);
|
||
if (!isPreview) {
|
||
m_topLayout->addWidget(m_renderButton);
|
||
}
|
||
m_topLayout->addStretch(1);
|
||
}
|
||
|
||
//----signal-slot connections
|
||
bool ret = true;
|
||
|
||
if (!isPreview) {
|
||
ret = ret && connect(m_saveInFileFld, SIGNAL(pathChanged()), this,
|
||
SLOT(onPathChanged()));
|
||
ret = ret && connect(m_fileNameFld, SIGNAL(editingFinished()),
|
||
SLOT(onNameChanged()));
|
||
ret = ret &&
|
||
connect(m_fileFormat, SIGNAL(currentIndexChanged(const QString &)),
|
||
SLOT(onFormatChanged(const QString &)));
|
||
ret = ret && connect(m_fileFormatButton, SIGNAL(pressed()), this,
|
||
SLOT(openSettingsPopup()));
|
||
ret = ret && connect(m_renderButton, SIGNAL(pressed()), this,
|
||
SLOT(onRenderClicked()));
|
||
}
|
||
ret = ret &&
|
||
connect(m_outputCameraOm, SIGNAL(currentIndexChanged(const QString &)),
|
||
SLOT(onCameraChanged(const QString &)));
|
||
ret = ret && connect(m_startFld, SIGNAL(editingFinished()),
|
||
SLOT(onFrameFldEditFinished()));
|
||
ret = ret && connect(m_endFld, SIGNAL(editingFinished()),
|
||
SLOT(onFrameFldEditFinished()));
|
||
ret = ret && connect(m_stepFld, SIGNAL(editingFinished()),
|
||
SLOT(onFrameFldEditFinished()));
|
||
ret = ret && connect(m_shrinkFld, SIGNAL(editingFinished()),
|
||
SLOT(onFrameFldEditFinished()));
|
||
|
||
if (isPreview) {
|
||
ret = ret && connect(m_applyShrinkChk, SIGNAL(stateChanged(int)),
|
||
SLOT(onApplyShrinkChecked(int)));
|
||
}
|
||
|
||
ret = ret && connect(m_resampleBalanceOm, SIGNAL(currentIndexChanged(int)),
|
||
SLOT(onResampleChanged(int)));
|
||
ret = ret && connect(m_channelWidthOm, SIGNAL(currentIndexChanged(int)),
|
||
SLOT(onChannelWidthChanged(int)));
|
||
|
||
if (!isPreview) {
|
||
ret = ret && connect(m_gammaFld, SIGNAL(editingFinished()),
|
||
SLOT(onGammaFldEditFinished()));
|
||
ret = ret && connect(m_dominantFieldOm, SIGNAL(currentIndexChanged(int)),
|
||
SLOT(onDominantFieldChanged(int)));
|
||
ret = ret && connect(m_frameRateFld, SIGNAL(editingFinished()), this,
|
||
SLOT(onFrameRateEditingFinished()));
|
||
ret = ret && connect(m_stretchFromFld, SIGNAL(editingFinished()),
|
||
SLOT(onStretchFldEditFinished()));
|
||
ret = ret && connect(m_stretchToFld, SIGNAL(editingFinished()),
|
||
SLOT(onStretchFldEditFinished()));
|
||
ret = ret && connect(m_multimediaOm, SIGNAL(currentIndexChanged(int)), this,
|
||
SLOT(onMultimediaChanged(int)));
|
||
ret = ret && connect(showOtherSettingsButton, SIGNAL(toggled(bool)),
|
||
otherSettingsFrame, SLOT(setVisible(bool)));
|
||
ret = ret && connect(showCameraSettingsButton, SIGNAL(toggled(bool)),
|
||
cameraSettingsBox, SLOT(setVisible(bool)));
|
||
ret = ret && connect(addPresetButton, SIGNAL(pressed()), this,
|
||
SLOT(onAddPresetButtonPressed()));
|
||
ret = ret && connect(removePresetButton, SIGNAL(pressed()), this,
|
||
SLOT(onRemovePresetButtonPressed()));
|
||
ret = ret && connect(m_presetCombo, SIGNAL(activated(const QString &)),
|
||
this, SLOT(onPresetSelected(const QString &)));
|
||
ret = ret && connect(m_cameraSettings, SIGNAL(changed()), this,
|
||
SLOT(onCameraSettingsChanged()));
|
||
ret = ret && connect(m_doStereoscopy, SIGNAL(stateChanged(int)),
|
||
SLOT(onStereoChecked(int)));
|
||
ret = ret && connect(m_stereoShift, SIGNAL(editingFinished()),
|
||
SLOT(onStereoChanged()));
|
||
}
|
||
|
||
ret = ret && connect(m_threadsComboOm, SIGNAL(currentIndexChanged(int)),
|
||
SLOT(onThreadsComboChanged(int)));
|
||
ret = ret && connect(m_rasterGranularityOm, SIGNAL(currentIndexChanged(int)),
|
||
SLOT(onRasterGranularityChanged(int)));
|
||
|
||
if (m_subcameraChk)
|
||
ret = ret && connect(m_subcameraChk, SIGNAL(stateChanged(int)),
|
||
SLOT(onSubcameraChecked(int)));
|
||
|
||
assert(ret);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Return current \b ToonzScene scene.
|
||
*/
|
||
ToonzScene *OutputSettingsPopup::getCurrentScene() const {
|
||
ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
|
||
return scene;
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Return current scene output properties \b TOutputProperties, if
|
||
current scene is not empty.
|
||
*/
|
||
TOutputProperties *OutputSettingsPopup::getProperties() const {
|
||
ToonzScene *scene = getCurrentScene();
|
||
if (!scene) return 0;
|
||
|
||
return m_isPreviewSettings ? scene->getProperties()->getPreviewProperties()
|
||
: scene->getProperties()->getOutputProperties();
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::showEvent(QShowEvent *) {
|
||
TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene();
|
||
TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
|
||
bool ret =
|
||
connect(sceneHandle, SIGNAL(sceneChanged()), this, SLOT(updateField()));
|
||
ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this,
|
||
SLOT(updateField()));
|
||
|
||
ret = ret && connect(xsheetHandle, SIGNAL(xsheetChanged()), this,
|
||
SLOT(updateField()));
|
||
updateField();
|
||
assert(ret);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::hideEvent(QHideEvent *e) {
|
||
TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene();
|
||
TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
|
||
bool ret = disconnect(sceneHandle, SIGNAL(sceneChanged()), this,
|
||
SLOT(updateField()));
|
||
ret = ret && disconnect(sceneHandle, SIGNAL(sceneSwitched()), this,
|
||
SLOT(updateField()));
|
||
|
||
ret = ret && disconnect(xsheetHandle, SIGNAL(xsheetChanged()), this,
|
||
SLOT(updateField()));
|
||
assert(ret);
|
||
Dialog::hideEvent(e);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onApplyShrinkChecked(int state) {
|
||
TRenderSettings rs = getProperties()->getRenderSettings();
|
||
rs.m_applyShrinkToViewer = (state == Qt::Checked);
|
||
getProperties()->setRenderSettings(rs);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onSubcameraChecked(int state) {
|
||
getProperties()->setSubcameraPreview(state == Qt::Checked);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onRenderClicked() {
|
||
CommandManager::instance()->execute("MI_Render");
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
/*! Update all field value take care current scene output properties.
|
||
*/
|
||
void OutputSettingsPopup::updateField() {
|
||
ToonzScene *scene = getCurrentScene();
|
||
TOutputProperties *prop = getProperties();
|
||
if (!prop) {
|
||
if (!m_isPreviewSettings) {
|
||
m_saveInFileFld->setPath(QString());
|
||
m_fileNameFld->setText(QString());
|
||
m_fileFormat->setCurrentIndex(0);
|
||
m_gammaFld->setText(QString());
|
||
m_dominantFieldOm->setCurrentIndex(c_none);
|
||
m_frameRateFld->setText(QString());
|
||
m_stretchFromFld->setText(QString());
|
||
m_stretchToFld->setText(QString());
|
||
m_multimediaOm->setCurrentIndex(0);
|
||
}
|
||
if (m_outputCameraOm) m_outputCameraOm->setCurrentIndex(0);
|
||
m_startFld->setText(QString());
|
||
m_endFld->setText(QString());
|
||
m_stepFld->setText(QString());
|
||
m_shrinkFld->setText(QString());
|
||
if (m_applyShrinkChk) m_applyShrinkChk->setCheckState(Qt::Unchecked);
|
||
m_resampleBalanceOm->setCurrentIndex(c_standard);
|
||
m_channelWidthOm->setCurrentIndex(c_8bit);
|
||
m_threadsComboOm->setCurrentIndex(0);
|
||
m_rasterGranularityOm->setCurrentIndex(0);
|
||
|
||
if (m_subcameraChk) m_subcameraChk->setCheckState(Qt::Unchecked);
|
||
return;
|
||
}
|
||
|
||
TRenderSettings renderSettings = prop->getRenderSettings();
|
||
|
||
if (!m_isPreviewSettings) {
|
||
TFilePath path = prop->getPath();
|
||
QString name = QString::fromStdWString(path.getWideName());
|
||
if (name.isEmpty())
|
||
name = QString::fromStdString(scene->getScenePath().getName());
|
||
m_saveInFileFld->setPath(toQString(path.getParentDir()));
|
||
m_fileNameFld->setText(name);
|
||
// RenderController::instance()->setMovieExt(path.getType());
|
||
m_fileFormat->setCurrentIndex(
|
||
m_fileFormat->findText(QString::fromStdString(path.getType())));
|
||
m_multimediaOm->setCurrentIndex(prop->getMultimediaRendering());
|
||
}
|
||
|
||
// camera
|
||
if (m_outputCameraOm) {
|
||
m_outputCameraOm->blockSignals(true);
|
||
m_outputCameraOm->clear();
|
||
}
|
||
TStageObjectTree *tree = scene->getXsheet()->getStageObjectTree();
|
||
int cameraCount = tree->getCameraCount();
|
||
TStageObjectId cameraId = m_isPreviewSettings
|
||
? tree->getCurrentPreviewCameraId()
|
||
: tree->getCurrentCameraId();
|
||
QStringList cameras;
|
||
int tmpCameraId = 0;
|
||
int index = 0;
|
||
int i;
|
||
for (i = 0; i < cameraCount;) {
|
||
/*-- Deleteされたカメラの場合tmpCameraIdだけIncrementする --*/
|
||
if (!tree->getStageObject(TStageObjectId::CameraId(tmpCameraId), false)) {
|
||
tmpCameraId++;
|
||
continue;
|
||
}
|
||
|
||
std::string name =
|
||
tree->getStageObject(TStageObjectId::CameraId(tmpCameraId))->getName();
|
||
cameras.append(QString::fromStdString(name));
|
||
if (name == tree->getStageObject(cameraId)->getName()) index = i;
|
||
i++;
|
||
tmpCameraId++;
|
||
}
|
||
if (m_outputCameraOm) {
|
||
m_outputCameraOm->addItems(cameras);
|
||
m_outputCameraOm->blockSignals(false);
|
||
m_outputCameraOm->setCurrentIndex(index);
|
||
}
|
||
if (m_subcameraChk)
|
||
m_subcameraChk->setCheckState(prop->isSubcameraPreview() ? Qt::Checked
|
||
: Qt::Unchecked);
|
||
|
||
// start,end,step
|
||
int r0 = 0, r1 = -1, step;
|
||
prop->getRange(r0, r1, step);
|
||
if (r0 > r1) {
|
||
r0 = 0;
|
||
r1 = scene->getFrameCount() - 1;
|
||
if (r1 < 0) r1 = 0;
|
||
}
|
||
m_startFld->setValue(r0 + 1);
|
||
m_endFld->setValue(r1 + 1);
|
||
m_stepFld->setValue(step);
|
||
m_shrinkFld->setValue(renderSettings.m_shrinkX);
|
||
if (m_applyShrinkChk)
|
||
m_applyShrinkChk->setCheckState(
|
||
renderSettings.m_applyShrinkToViewer ? Qt::Checked : Qt::Unchecked);
|
||
// resample
|
||
switch (renderSettings.m_quality) {
|
||
case TRenderSettings::ImprovedResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_improved);
|
||
break;
|
||
case TRenderSettings::HighResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_high);
|
||
break;
|
||
case TRenderSettings::StandardResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_standard);
|
||
break;
|
||
|
||
case TRenderSettings::Mitchell_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_mitchell);
|
||
break;
|
||
case TRenderSettings::Cubic5_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_cubic5);
|
||
break;
|
||
case TRenderSettings::Cubic75_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_cubic75);
|
||
break;
|
||
case TRenderSettings::Cubic1_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_cubic1);
|
||
break;
|
||
case TRenderSettings::Hann2_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_hann2);
|
||
break;
|
||
case TRenderSettings::Hann3_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_hann3);
|
||
break;
|
||
case TRenderSettings::Hamming2_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_hamming2);
|
||
break;
|
||
case TRenderSettings::Hamming3_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_hamming3);
|
||
break;
|
||
case TRenderSettings::Lanczos2_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_lanczos2);
|
||
break;
|
||
case TRenderSettings::Lanczos3_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_lanczos3);
|
||
break;
|
||
case TRenderSettings::Gauss_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_gauss);
|
||
break;
|
||
case TRenderSettings::ClosestPixel_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_closestPixel);
|
||
break;
|
||
case TRenderSettings::Bilinear_FilterResampleQuality:
|
||
m_resampleBalanceOm->setCurrentIndex(c_bilinear);
|
||
break;
|
||
default:
|
||
m_resampleBalanceOm->setCurrentIndex(c_standard);
|
||
break;
|
||
}
|
||
|
||
// channel width
|
||
switch (renderSettings.m_bpp) {
|
||
case 64:
|
||
m_channelWidthOm->setCurrentIndex(c_16bit);
|
||
break;
|
||
default:
|
||
m_channelWidthOm->setCurrentIndex(c_8bit);
|
||
break;
|
||
}
|
||
|
||
// Threads
|
||
m_threadsComboOm->setCurrentIndex(prop->getThreadIndex());
|
||
|
||
// Raster granularity
|
||
m_rasterGranularityOm->setCurrentIndex(prop->getMaxTileSizeIndex());
|
||
|
||
if (m_isPreviewSettings) return;
|
||
|
||
m_doStereoscopy->setChecked(renderSettings.m_stereoscopic);
|
||
m_stereoShift->setValue(renderSettings.m_stereoscopicShift);
|
||
m_stereoShift->setEnabled(renderSettings.m_stereoscopic);
|
||
|
||
// gamma
|
||
m_gammaFld->setValue(renderSettings.m_gamma);
|
||
|
||
// dominant field
|
||
switch (renderSettings.m_fieldPrevalence) {
|
||
case TRenderSettings::OddField:
|
||
m_dominantFieldOm->setCurrentIndex(c_odd);
|
||
break;
|
||
case TRenderSettings::EvenField:
|
||
m_dominantFieldOm->setCurrentIndex(c_even);
|
||
break;
|
||
case TRenderSettings::NoField:
|
||
default:
|
||
m_dominantFieldOm->setCurrentIndex(c_none);
|
||
}
|
||
m_dominantFieldOm->setEnabled(!renderSettings.m_stereoscopic);
|
||
// time stretch
|
||
m_stretchFromFld->setValue(renderSettings.m_timeStretchFrom);
|
||
m_stretchToFld->setValue(renderSettings.m_timeStretchTo);
|
||
|
||
m_frameRateFld->setValue(prop->getFrameRate());
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output path to new path modified in popup field.
|
||
*/
|
||
void OutputSettingsPopup::onPathChanged() {
|
||
if (!getCurrentScene()) return;
|
||
|
||
QString text = m_saveInFileFld->getPath();
|
||
TFilePath newFp(text.toStdWString());
|
||
newFp = TApp::instance()->getCurrentScene()->getScene()->codeFilePath(newFp);
|
||
m_saveInFileFld->setPath(QString::fromStdWString(newFp.getWideString()));
|
||
|
||
TOutputProperties *prop = getProperties();
|
||
TFilePath fp = prop->getPath();
|
||
|
||
if (fp == newFp) return;
|
||
fp = fp.withParentDir(newFp);
|
||
prop->setPath(fp);
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output name to new name modified in popup field.
|
||
*/
|
||
void OutputSettingsPopup::onNameChanged() {
|
||
ToonzScene *scene = getCurrentScene();
|
||
if (!scene) return;
|
||
|
||
QString name = m_fileNameFld->text();
|
||
if (!isValidFileName(name)) {
|
||
DVGui::error(
|
||
"A filename cannot be empty or contain any of the following "
|
||
"characters:\n \\ / : * ? \" < > |");
|
||
TOutputProperties *prop = getProperties();
|
||
TFilePath fp = prop->getPath();
|
||
QString name = QString::fromStdString(fp.getName());
|
||
if (name.isEmpty())
|
||
name = QString::fromStdString(scene->getScenePath().getName());
|
||
m_fileNameFld->setText(name);
|
||
|
||
return;
|
||
}
|
||
|
||
std::wstring wname = name.toStdWString();
|
||
{
|
||
// It could be possible that users add an extension to the level name.
|
||
// This is not supported, and the extension must be removed.
|
||
// Observe that leaving wname as is WOULD be a bug (see Bugzilla #6578).
|
||
|
||
const std::wstring &actualWName = TFilePath(wname).getWideName();
|
||
if (wname != actualWName) {
|
||
wname = actualWName;
|
||
m_fileNameFld->setText(QString::fromStdWString(wname));
|
||
}
|
||
}
|
||
|
||
// In case the output level name is reverted back to the scene name, we assume
|
||
// that
|
||
// a "Save Scene As..." command should move the value to the *new* scene name
|
||
if (wname == scene->getScenePath().getWideName())
|
||
wname = std::wstring(); // An empty name is redirected to the scene name
|
||
// directly by the render procedure, let's use this!
|
||
TOutputProperties *prop = getProperties();
|
||
TFilePath fp = prop->getPath();
|
||
|
||
if (fp.getWideName() == wname) return; // Already had the right name
|
||
|
||
fp = fp.withName(wname);
|
||
prop->setPath(fp);
|
||
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output format to new format set in popup field.
|
||
*/
|
||
void OutputSettingsPopup::onFormatChanged(const QString &str) {
|
||
// string ext = RenderController::instance()->format2ext(str.toStdString());
|
||
// RenderController::instance()->setMovieExt(ext);
|
||
|
||
TOutputProperties *prop = getProperties();
|
||
TFilePath fp = prop->getPath().withType(str.toStdString());
|
||
prop->setPath(fp);
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
if (str == "mp4" || str == "gif" || str == "webm" || str == "spritesheet") {
|
||
m_threadsComboOm->setDisabled(true);
|
||
m_threadsComboOm->setCurrentIndex(0);
|
||
} else {
|
||
m_threadsComboOm->setDisabled(false);
|
||
m_threadsComboOm->setCurrentIndex(2);
|
||
}
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Open a popup output format settings popup to set current output format
|
||
settings.
|
||
*/
|
||
void OutputSettingsPopup::openSettingsPopup() {
|
||
TOutputProperties *prop = getProperties();
|
||
std::string ext = prop->getPath().getType();
|
||
openFormatSettingsPopup(this, ext, prop->getFileFormatProperties(ext));
|
||
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output camera to camera set in popup field.
|
||
*/
|
||
void OutputSettingsPopup::onCameraChanged(const QString &str) {
|
||
ToonzScene *scene = getCurrentScene();
|
||
if (!scene) return;
|
||
TStageObjectTree *tree = scene->getXsheet()->getStageObjectTree();
|
||
int cameraCount = tree->getCameraCount();
|
||
/*-- 注:CameraCountはDeleteされたCameraは入らないがIndexは欠番になる。
|
||
ので、CameraCountとIndexの最大値は必ずしも一致しない
|
||
--*/
|
||
int tmpCameraId = 0;
|
||
int i;
|
||
for (i = 0; i < cameraCount;) {
|
||
if (!tree->getStageObject(TStageObjectId::CameraId(tmpCameraId), false)) {
|
||
tmpCameraId++;
|
||
continue;
|
||
}
|
||
std::string name =
|
||
tree->getStageObject(TStageObjectId::CameraId(tmpCameraId))->getName();
|
||
if (name == str.toStdString()) break;
|
||
tmpCameraId++;
|
||
i++;
|
||
}
|
||
if (i >= cameraCount) return;
|
||
TApp *app = TApp::instance();
|
||
TStageObjectId cameraId = TStageObjectId::CameraId(i);
|
||
TStageObjectId currentCameraId = m_isPreviewSettings
|
||
? tree->getCurrentPreviewCameraId()
|
||
: tree->getCurrentCameraId();
|
||
if (currentCameraId != cameraId) {
|
||
TXsheetHandle *xsheetHandle = app->getCurrentXsheet();
|
||
disconnect(xsheetHandle, SIGNAL(xsheetChanged()), this,
|
||
SLOT(updateField()));
|
||
|
||
if (m_isPreviewSettings)
|
||
tree->setCurrentPreviewCameraId(cameraId);
|
||
else
|
||
tree->setCurrentCameraId(cameraId);
|
||
app->getCurrentScene()->setDirtyFlag(true);
|
||
xsheetHandle->notifyXsheetChanged();
|
||
|
||
connect(xsheetHandle, SIGNAL(xsheetChanged()), this, SLOT(updateField()));
|
||
}
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output frame values: start frame, end frame, step and
|
||
shrink, to current field values.
|
||
*/
|
||
|
||
void OutputSettingsPopup::onStereoChecked(int) {
|
||
m_stereoShift->setEnabled(m_doStereoscopy->isChecked());
|
||
if (m_dominantFieldOm)
|
||
m_dominantFieldOm->setEnabled(!m_doStereoscopy->isChecked());
|
||
onStereoChanged();
|
||
}
|
||
|
||
void OutputSettingsPopup::onStereoChanged() {
|
||
TOutputProperties *prop = getProperties();
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
rs.m_stereoscopic = m_doStereoscopy->isChecked();
|
||
rs.m_stereoscopicShift = m_stereoShift->getValue();
|
||
prop->setRenderSettings(rs);
|
||
}
|
||
|
||
//----------------------------------------------
|
||
|
||
void OutputSettingsPopup::onFrameFldEditFinished() {
|
||
ToonzScene *scene = getCurrentScene();
|
||
if (!scene) return;
|
||
TOutputProperties *prop = getProperties();
|
||
|
||
int maxR0 = std::max(0, scene->getFrameCount() - 1);
|
||
int r0 = (int)m_startFld->getValue() - 1;
|
||
int r1 = (int)m_endFld->getValue() - 1;
|
||
int step = (int)m_stepFld->getValue();
|
||
int shrink = (int)m_shrinkFld->getValue();
|
||
|
||
bool error = false;
|
||
if (r0 < 0) {
|
||
error = true;
|
||
r0 = 0;
|
||
}
|
||
if (r0 > maxR0) {
|
||
error = true;
|
||
r0 = maxR0;
|
||
}
|
||
if (r1 < r0) {
|
||
error = true;
|
||
r1 = r0;
|
||
}
|
||
if (r1 > maxR0) {
|
||
error = true;
|
||
r1 = maxR0;
|
||
}
|
||
if (error) {
|
||
m_startFld->setValue(r0 + 1);
|
||
m_endFld->setValue(r1 + 1);
|
||
}
|
||
if (step < 1) {
|
||
step = 1;
|
||
m_stepFld->setValue(step);
|
||
}
|
||
if (shrink < 1) {
|
||
shrink = 1;
|
||
m_shrinkFld->setValue(shrink);
|
||
}
|
||
if (r0 == 0 && r1 == maxR0) {
|
||
r0 = 0;
|
||
r1 = -1;
|
||
}
|
||
prop->setRange(r0, r1, step);
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
rs.m_shrinkX = rs.m_shrinkY = shrink;
|
||
rs.m_applyShrinkToViewer =
|
||
m_applyShrinkChk ? m_applyShrinkChk->checkState() == Qt::Checked : false;
|
||
|
||
prop->setRenderSettings(rs);
|
||
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output resample balance to balance identified by \b type
|
||
index in popup QComboBox.
|
||
*/
|
||
void OutputSettingsPopup::onResampleChanged(int type) {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
if (type == c_improved)
|
||
rs.m_quality = TRenderSettings::ImprovedResampleQuality;
|
||
else if (type == c_high)
|
||
rs.m_quality = TRenderSettings::HighResampleQuality;
|
||
else if (type == c_standard)
|
||
rs.m_quality = TRenderSettings::StandardResampleQuality;
|
||
else if (type == c_triangle)
|
||
rs.m_quality = TRenderSettings::Triangle_FilterResampleQuality;
|
||
else if (type == c_mitchell)
|
||
rs.m_quality = TRenderSettings::Mitchell_FilterResampleQuality;
|
||
else if (type == c_cubic5)
|
||
rs.m_quality = TRenderSettings::Cubic5_FilterResampleQuality;
|
||
else if (type == c_cubic75)
|
||
rs.m_quality = TRenderSettings::Cubic75_FilterResampleQuality;
|
||
else if (type == c_cubic1)
|
||
rs.m_quality = TRenderSettings::Cubic1_FilterResampleQuality;
|
||
else if (type == c_hann2)
|
||
rs.m_quality = TRenderSettings::Hann2_FilterResampleQuality;
|
||
else if (type == c_hann3)
|
||
rs.m_quality = TRenderSettings::Hann3_FilterResampleQuality;
|
||
else if (type == c_hamming2)
|
||
rs.m_quality = TRenderSettings::Hamming2_FilterResampleQuality;
|
||
else if (type == c_hamming3)
|
||
rs.m_quality = TRenderSettings::Hamming3_FilterResampleQuality;
|
||
else if (type == c_lanczos2)
|
||
rs.m_quality = TRenderSettings::Lanczos2_FilterResampleQuality;
|
||
else if (type == c_lanczos3)
|
||
rs.m_quality = TRenderSettings::Lanczos3_FilterResampleQuality;
|
||
else if (type == c_gauss)
|
||
rs.m_quality = TRenderSettings::Gauss_FilterResampleQuality;
|
||
else if (type == c_closestPixel)
|
||
rs.m_quality = TRenderSettings::ClosestPixel_FilterResampleQuality;
|
||
else if (type == c_bilinear)
|
||
rs.m_quality = TRenderSettings::Bilinear_FilterResampleQuality;
|
||
else
|
||
rs.m_quality = TRenderSettings::StandardResampleQuality;
|
||
prop->setRenderSettings(rs);
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output channel width to value identified by \b type
|
||
index in popup QComboBox.
|
||
*/
|
||
void OutputSettingsPopup::onChannelWidthChanged(int type) {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
if (type == c_8bit)
|
||
rs.m_bpp = 32;
|
||
else
|
||
rs.m_bpp = 64;
|
||
prop->setRenderSettings(rs);
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output gamma value to current value in popup gamma field.
|
||
*/
|
||
void OutputSettingsPopup::onGammaFldEditFinished() {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
|
||
double gamma = m_gammaFld->getValue();
|
||
m_gammaFld->setCursorPosition(0);
|
||
if (gamma <= 0) {
|
||
gamma = 0.001;
|
||
m_gammaFld->setValue(gamma);
|
||
}
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
rs.m_gamma = gamma;
|
||
prop->setRenderSettings(rs);
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! Set current scene output dominant field to value identified by \b type
|
||
index in popup QComboBox. If time stretch velue from-to are
|
||
different
|
||
and dominant field is different from none show a message error.
|
||
*/
|
||
void OutputSettingsPopup::onDominantFieldChanged(int type) {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
if (type != c_none &&
|
||
m_stretchFromFld->getValue() != m_stretchToFld->getValue()) {
|
||
DVGui::error("Can't apply field rendering in a time stretched scene");
|
||
rs.m_fieldPrevalence = TRenderSettings::NoField;
|
||
m_dominantFieldOm->setCurrentIndex(c_none);
|
||
} else if (type == c_odd)
|
||
rs.m_fieldPrevalence = TRenderSettings::OddField;
|
||
else if (type == c_even)
|
||
rs.m_fieldPrevalence = TRenderSettings::EvenField;
|
||
else
|
||
rs.m_fieldPrevalence = TRenderSettings::NoField;
|
||
m_doStereoscopy->setEnabled(rs.m_fieldPrevalence == TRenderSettings::NoField);
|
||
m_stereoShift->setEnabled(rs.m_fieldPrevalence == TRenderSettings::NoField);
|
||
prop->setRenderSettings(rs);
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! If dominant field is different from none set time stretch field values to
|
||
current scene output time stretch values; otherwise set current
|
||
scene
|
||
output time stretch values to current field values.
|
||
*/
|
||
void OutputSettingsPopup::onStretchFldEditFinished() {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
if (m_dominantFieldOm->currentIndex() != c_none) {
|
||
DVGui::error("Can't stretch time in a field rendered scene\n");
|
||
m_stretchFromFld->setValue(rs.m_timeStretchFrom);
|
||
m_stretchToFld->setValue(rs.m_timeStretchTo);
|
||
} else {
|
||
rs.m_timeStretchFrom = m_stretchFromFld->getValue();
|
||
rs.m_timeStretchTo = m_stretchToFld->getValue();
|
||
prop->setRenderSettings(rs);
|
||
}
|
||
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onMultimediaChanged(int state) {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
prop->setMultimediaRendering(state);
|
||
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onThreadsComboChanged(int type) {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
prop->setThreadIndex(type);
|
||
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onRasterGranularityChanged(int type) {
|
||
if (!getCurrentScene()) return;
|
||
TOutputProperties *prop = getProperties();
|
||
prop->setMaxTileSizeIndex(type);
|
||
|
||
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! OutputSettingsのPreset登録
|
||
*/
|
||
void OutputSettingsPopup::onAddPresetButtonPressed() {
|
||
//*-- プリセット名を取得 --*/
|
||
bool ok;
|
||
QString qs = DVGui::getText(
|
||
tr("Add preset"), tr("Enter the name for the output settings preset."),
|
||
"", &ok);
|
||
if (!ok || qs.isEmpty()) return;
|
||
|
||
if (!qs.endsWith(".txt")) qs.append(".txt");
|
||
TFilePath fp = TEnv::getConfigDir() + "outputpresets";
|
||
if (!TFileStatus(fp).doesExist()) TSystem::mkDir(fp);
|
||
fp = fp + qs.toStdString();
|
||
|
||
/*-- すでに存在する場合、上書きを確認 --*/
|
||
if (TFileStatus(fp).doesExist()) {
|
||
int ret = QMessageBox::question(
|
||
this, tr("Add output settings preset"),
|
||
QString("The file %1 does already exist.\nDo you want to overwrite it?")
|
||
.arg(qs),
|
||
QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Save);
|
||
if (ret == QMessageBox::Cancel) return;
|
||
}
|
||
TSystem::touchFile(fp);
|
||
|
||
TOStream os(fp, false);
|
||
if (!os.checkStatus()) return;
|
||
|
||
os.openChild("outputsettingspreset");
|
||
|
||
/*-- カメラ設定 --*/
|
||
os.openChild("camera");
|
||
TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
|
||
TStageObjectId cameraId = xsheet->getStageObjectTree()->getCurrentCameraId();
|
||
TCamera *camera = xsheet->getStageObject(cameraId)->getCamera();
|
||
camera->saveData(os);
|
||
os.closeChild();
|
||
|
||
/*-- Saveinのプロジェクトフォルダ部分 --*/
|
||
QString saveInPath = m_saveInFileFld->getPath();
|
||
if (saveInPath.startsWith("+")) {
|
||
QString projectFolderName = (saveInPath.contains("\\"))
|
||
? saveInPath.left(saveInPath.indexOf("\\"))
|
||
: saveInPath;
|
||
os.child("savein_projectfolder") << projectFolderName.toStdString();
|
||
}
|
||
|
||
/*-- ファイル形式 --*/
|
||
QString format = m_fileFormat->currentText();
|
||
os.child("format") << format.toStdString();
|
||
|
||
TOutputProperties *prop = getProperties();
|
||
|
||
/*-- ファイルオプション --*/
|
||
os.openChild("formatsProperties");
|
||
std::vector<std::string> fileExtensions;
|
||
prop->getFileFormatPropertiesExtensions(fileExtensions);
|
||
for (int i = 0; i < (int)fileExtensions.size(); i++) {
|
||
std::string ext = fileExtensions[i];
|
||
TPropertyGroup *pg = prop->getFileFormatProperties(ext);
|
||
assert(pg);
|
||
std::map<std::string, std::string> attr;
|
||
attr["ext"] = ext;
|
||
os.openChild("formatProperties", attr);
|
||
pg->saveData(os);
|
||
os.closeChild();
|
||
}
|
||
os.closeChild();
|
||
|
||
// Resample Balance
|
||
QString resq = m_resampleBalanceOm->currentText();
|
||
os.child("resquality") << resq.toStdString();
|
||
|
||
// Channel Width
|
||
QString chanw = m_channelWidthOm->currentText();
|
||
os.child("bpp") << chanw.toStdString();
|
||
|
||
// 140503 iwasawa Frame Rate (Scene Settings)
|
||
os.child("frameRate") << m_frameRateFld->text().toStdString();
|
||
|
||
// 140325 iwasawa stretch FPS
|
||
os.child("stretchFrom") << m_stretchFromFld->text().toStdString();
|
||
os.child("stretchTo") << m_stretchToFld->text().toStdString();
|
||
// 140325 iwasawa gamma
|
||
os.child("gamma") << m_gammaFld->text().toStdString();
|
||
|
||
os.closeChild(); // outputsettingspreset
|
||
|
||
m_presetCombo->blockSignals(true);
|
||
updatePresetComboItems();
|
||
m_presetCombo->setCurrentIndex(
|
||
m_presetCombo->findText(QString::fromStdString(fp.getName())));
|
||
m_presetCombo->blockSignals(false);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! プリセットフォルダを調べ、コンボボックスにアイテムを格納する
|
||
*/
|
||
void OutputSettingsPopup::updatePresetComboItems() {
|
||
m_presetCombo->clear();
|
||
m_presetCombo->addItem(tr("<custom>"));
|
||
TFilePath folder = TEnv::getConfigDir() + "outputpresets";
|
||
|
||
TFileStatus fs(folder);
|
||
if (!fs.doesExist()) TSystem::mkDir(folder);
|
||
|
||
TFilePathSet paths = TSystem::readDirectory(folder);
|
||
for (TFilePathSet::iterator it = paths.begin(); it != paths.end(); it++) {
|
||
std::cout << it->getName() << std::endl;
|
||
m_presetCombo->addItem(QString::fromStdString(it->getName()));
|
||
}
|
||
m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
/*! OutputSettingsのPreset削除
|
||
*/
|
||
void OutputSettingsPopup::onRemovePresetButtonPressed() {
|
||
int index = m_presetCombo->currentIndex();
|
||
if (index <= 0) return;
|
||
int ret = QMessageBox::question(
|
||
this, tr("Remove preset"), QString("Deleting \"%1\".\nAre you sure?")
|
||
.arg(m_presetCombo->currentText()),
|
||
QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
|
||
if (ret == QMessageBox::Cancel) return;
|
||
|
||
TFilePath fp =
|
||
TEnv::getConfigDir() + "outputpresets" +
|
||
QString("%1.txt").arg(m_presetCombo->currentText()).toStdString();
|
||
if (TFileStatus(fp).doesExist()) TSystem::deleteFile(fp);
|
||
|
||
m_presetCombo->blockSignals(true);
|
||
m_presetCombo->removeItem(index);
|
||
m_presetCombo->setCurrentIndex(0);
|
||
m_presetCombo->blockSignals(false);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onPresetSelected(const QString &str) {
|
||
/*-- "<custom>"を選択したら何もせずreturn --*/
|
||
if (m_presetCombo->currentIndex() == 0) return;
|
||
TFilePath fp = TEnv::getConfigDir() + "outputpresets" +
|
||
QString("%1.txt").arg(str).toStdString();
|
||
if (!TFileStatus(fp).doesExist()) {
|
||
QMessageBox::warning(this, tr("Warning"),
|
||
QString("The preset file %1.txt not found").arg(str),
|
||
QMessageBox::Ok, QMessageBox::Ok);
|
||
return;
|
||
}
|
||
TIStream is(fp);
|
||
if (!is) {
|
||
QMessageBox::warning(
|
||
this, tr("Warning"),
|
||
QString("Failed to open the preset file %1.txt").arg(str),
|
||
QMessageBox::Ok, QMessageBox::Ok);
|
||
return;
|
||
}
|
||
|
||
std::string tagName = "";
|
||
if (!is.matchTag(tagName) || tagName != "outputsettingspreset") {
|
||
QMessageBox::warning(this, tr("Warning"),
|
||
QString("Bad file format: %1.txt").arg(str),
|
||
QMessageBox::Ok, QMessageBox::Ok);
|
||
return;
|
||
}
|
||
|
||
TOutputProperties *prop = getProperties();
|
||
TRenderSettings rs = prop->getRenderSettings();
|
||
while (is.matchTag(tagName)) {
|
||
// Camera
|
||
if (tagName == "camera") {
|
||
TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
|
||
TStageObjectId cameraId =
|
||
xsheet->getStageObjectTree()->getCurrentCameraId();
|
||
TCamera *camera = xsheet->getStageObject(cameraId)->getCamera();
|
||
camera->loadData(is);
|
||
} // if "camera"
|
||
/*-- Saveinのプロジェクトフォルダ部分 --*/
|
||
else if (tagName == "savein_projectfolder") {
|
||
std::string projectFolderName;
|
||
is >> projectFolderName;
|
||
|
||
QString newProjectFolder = QString::fromStdString(projectFolderName);
|
||
QString fp = QString::fromStdWString(prop->getPath().getWideString());
|
||
/*-- 出力パスがプロジェクトフォルダで始まっている場合は、差し替える --*/
|
||
if (!newProjectFolder.isEmpty() && fp.startsWith("+")) {
|
||
if (fp.indexOf("\\") >= 0)
|
||
fp = QString("%1\\%2")
|
||
.arg(newProjectFolder)
|
||
.arg(fp.right(fp.size() - fp.indexOf("\\") - 1));
|
||
else
|
||
fp = newProjectFolder;
|
||
prop->setPath(TFilePath(fp.toStdWString()));
|
||
}
|
||
}
|
||
// File format
|
||
else if (tagName == "format") {
|
||
std::string formatName;
|
||
is >> formatName;
|
||
TFilePath fp = prop->getPath().withType(formatName);
|
||
prop->setPath(fp);
|
||
}
|
||
// File options
|
||
else if (tagName == "formatsProperties") {
|
||
while (is.matchTag(tagName)) {
|
||
if (tagName == "formatProperties") {
|
||
std::string ext = is.getTagAttribute("ext");
|
||
TPropertyGroup *pg = prop->getFileFormatProperties(ext);
|
||
if (ext == "avi") {
|
||
TPropertyGroup appProperties;
|
||
appProperties.loadData(is);
|
||
if (pg->getPropertyCount() != 1 ||
|
||
appProperties.getPropertyCount() != 1) {
|
||
is.closeChild();
|
||
continue;
|
||
}
|
||
TEnumProperty *enumProp =
|
||
dynamic_cast<TEnumProperty *>(pg->getProperty(0));
|
||
TEnumProperty *enumAppProp =
|
||
dynamic_cast<TEnumProperty *>(appProperties.getProperty(0));
|
||
assert(enumAppProp && enumProp);
|
||
if (enumAppProp && enumProp) {
|
||
try {
|
||
enumProp->setValue(enumAppProp->getValue());
|
||
} catch (TProperty::RangeError &) {
|
||
}
|
||
} else
|
||
throw TException();
|
||
} else
|
||
pg->loadData(is);
|
||
is.closeChild();
|
||
} else
|
||
throw TException("unexpected tag: " + tagName);
|
||
} // end while
|
||
}
|
||
// Resample Balance
|
||
else if (tagName == "resquality") {
|
||
std::string resq;
|
||
is >> resq;
|
||
int index = m_resampleBalanceOm->findText(QString::fromStdString(resq));
|
||
if (index >= 0) m_resampleBalanceOm->setCurrentIndex(index);
|
||
}
|
||
// Channel Width
|
||
else if (tagName == "bpp") {
|
||
std::string chanw;
|
||
is >> chanw;
|
||
int index = m_channelWidthOm->findText(QString::fromStdString(chanw));
|
||
if (index >= 0) m_channelWidthOm->setCurrentIndex(index);
|
||
}
|
||
|
||
// Frame Rate (Scene Settings)
|
||
else if (tagName == "frameRate") {
|
||
std::string strFps;
|
||
is >> strFps;
|
||
prop->setFrameRate(QString::fromStdString(strFps).toDouble());
|
||
}
|
||
|
||
// stretch FPS
|
||
else if (tagName == "stretchFrom") {
|
||
std::string strFrm;
|
||
is >> strFrm;
|
||
rs.m_timeStretchFrom = QString::fromStdString(strFrm).toDouble();
|
||
} else if (tagName == "stretchTo") {
|
||
std::string strTo;
|
||
is >> strTo;
|
||
rs.m_timeStretchTo = QString::fromStdString(strTo).toDouble();
|
||
}
|
||
// gamma
|
||
else if (tagName == "gamma") {
|
||
std::string gamma;
|
||
is >> gamma;
|
||
rs.m_gamma = QString::fromStdString(gamma).toDouble();
|
||
}
|
||
|
||
is.closeChild();
|
||
}
|
||
|
||
/*-- renderSettingsを戻す --*/
|
||
prop->setRenderSettings(rs);
|
||
|
||
TApp::instance()->getCurrentScene()->notifySceneChanged();
|
||
|
||
m_presetCombo->blockSignals(true);
|
||
m_presetCombo->setCurrentIndex(m_presetCombo->findText(str));
|
||
m_presetCombo->blockSignals(false);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onCameraSettingsChanged() {
|
||
if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
void OutputSettingsPopup::onFrameRateEditingFinished() {
|
||
double frameRate = getProperties()->getFrameRate();
|
||
double frameRateFldValue = m_frameRateFld->getValue();
|
||
if (frameRate == frameRateFldValue) return;
|
||
getProperties()->setFrameRate(frameRateFldValue);
|
||
TApp::instance()->getCurrentScene()->getScene()->updateSoundColumnFrameRate();
|
||
TApp::instance()->getCurrentScene()->notifySceneChanged();
|
||
TApp::instance()->getCurrentXsheet()->getXsheet()->updateFrameCount();
|
||
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
|
||
OpenPopupCommandHandler<OutputSettingsPopup> openOutputSettingsPopup(
|
||
MI_OutputSettings);
|
||
OpenPopupCommandHandler<PreviewSettingsPopup> openPreviewSettingsPopup(
|
||
MI_PreviewSettings);
|