Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "outputsettingspopup.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Tnz6 includes
Toshihiro Shimizu 890ddd
#include "menubarcommandids.h"
Toshihiro Shimizu 890ddd
#include "formatsettingspopups.h"
Toshihiro Shimizu 890ddd
#include "tapp.h"
Toshihiro Shimizu 890ddd
#include "camerasettingspopup.h"
Toshihiro Shimizu 890ddd
#include "pane.h"
shun-iwasawa cd4694
#include "boardsettingspopup.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/filefield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/doublefield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/checkbox.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
#include "toutputproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
shun-iwasawa cd4694
#include "toonz/boardsettings.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "trasterfx.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tiio.h"
Toshihiro Shimizu 890ddd
#include "tlevel_io.h"
Toshihiro Shimizu 890ddd
#include "tenv.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tstream.h"
shun-iwasawa 694080
#include "tfiletype.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qlabel></qlabel>
Toshihiro Shimizu 890ddd
#include <qpushbutton></qpushbutton>
Toshihiro Shimizu 890ddd
#include <qcombobox></qcombobox>
Toshihiro Shimizu 890ddd
#include <qmainwindow></qmainwindow>
Toshihiro Shimizu 890ddd
#include <qframe></qframe>
Toshihiro Shimizu 890ddd
#include <qmessagebox></qmessagebox>
shun-iwasawa 59726b
#include <qmap></qmap>
shun-iwasawa f36064
#include <qlistwidget></qlistwidget>
shun-iwasawa f36064
#include <qscrollarea></qscrollarea>
shun-iwasawa f36064
#include <qpropertyanimation></qpropertyanimation>
shun-iwasawa f36064
#include <qspaceritem></qspaceritem>
shun-iwasawa c7ddce
#include <qevent></qevent>
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
enum ResampleOption {
shun-iwasawa 59726b
  c_standard = 0,
Shinya Kitaoka 120a6e
  c_improved,
Shinya Kitaoka 120a6e
  c_high,
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  c_triangle,
Shinya Kitaoka 120a6e
  c_mitchell,
Shinya Kitaoka 120a6e
  c_cubic5,
Shinya Kitaoka 120a6e
  c_cubic75,
Shinya Kitaoka 120a6e
  c_cubic1,
Shinya Kitaoka 120a6e
  c_hann2,
Shinya Kitaoka 120a6e
  c_hann3,
Shinya Kitaoka 120a6e
  c_hamming2,
Shinya Kitaoka 120a6e
  c_hamming3,
Shinya Kitaoka 120a6e
  c_lanczos2,
Shinya Kitaoka 120a6e
  c_lanczos3,
Shinya Kitaoka 120a6e
  c_gauss,
Shinya Kitaoka 120a6e
  c_closestPixel,
shun-iwasawa 59726b
  c_bilinear,
shun-iwasawa 59726b
  ResampleOptionCount
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
shun-iwasawa 59726b
struct resampleInfo {
shun-iwasawa 59726b
  QString idString;
shun-iwasawa 59726b
  TRenderSettings::ResampleQuality quality;
shun-iwasawa 59726b
  QString uiString = "";
shun-iwasawa 59726b
  resampleInfo(QString _idStr = "",
shun-iwasawa 59726b
               TRenderSettings::ResampleQuality _quality =
shun-iwasawa 59726b
                   TRenderSettings::StandardResampleQuality)
shun-iwasawa 59726b
      : idString(_idStr), quality(_quality), uiString("") {}
shun-iwasawa 59726b
};
shun-iwasawa 59726b
shun-iwasawa 59726b
QMap<resampleoption, resampleinfo=""> resampleInfoMap = {</resampleoption,>
shun-iwasawa 59726b
    {c_standard,
shun-iwasawa 59726b
     resampleInfo("Standard", TRenderSettings::StandardResampleQuality)},
shun-iwasawa 59726b
    {c_improved,
shun-iwasawa 59726b
     resampleInfo("Improved", TRenderSettings::ImprovedResampleQuality)},
shun-iwasawa 59726b
    {c_high, resampleInfo("High", TRenderSettings::HighResampleQuality)},
shun-iwasawa 59726b
    {c_triangle, resampleInfo("Triangle filter",
shun-iwasawa 59726b
                              TRenderSettings::Triangle_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_mitchell, resampleInfo("Mitchell-Netravali filter",
shun-iwasawa 59726b
                              TRenderSettings::Mitchell_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_cubic5, resampleInfo("Cubic convolution, a = .5",
shun-iwasawa 59726b
                            TRenderSettings::Cubic5_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_cubic75, resampleInfo("Cubic convolution, a = .75",
shun-iwasawa 59726b
                             TRenderSettings::Cubic75_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_cubic1, resampleInfo("Cubic convolution, a = 1",
shun-iwasawa 59726b
                            TRenderSettings::Cubic1_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_hann2, resampleInfo("Hann window, rad = 2",
shun-iwasawa 59726b
                           TRenderSettings::Hann2_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_hann3, resampleInfo("Hann window, rad = 3",
shun-iwasawa 59726b
                           TRenderSettings::Hann3_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_hamming2, resampleInfo("Hamming window, rad = 2",
shun-iwasawa 59726b
                              TRenderSettings::Hamming2_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_hamming3, resampleInfo("Hamming window, rad = 3",
shun-iwasawa 59726b
                              TRenderSettings::Hamming3_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_lanczos2, resampleInfo("Lanczos window, rad = 2",
shun-iwasawa 59726b
                              TRenderSettings::Lanczos2_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_lanczos3, resampleInfo("Lanczos window, rad = 3",
shun-iwasawa 59726b
                              TRenderSettings::Lanczos3_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_gauss, resampleInfo("Gaussian convolution",
shun-iwasawa 59726b
                           TRenderSettings::Gauss_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_closestPixel,
shun-iwasawa 59726b
     resampleInfo("Closest Pixel (Nearest Neighbor)",
shun-iwasawa 59726b
                  TRenderSettings::ClosestPixel_FilterResampleQuality)},
shun-iwasawa 59726b
    {c_bilinear,
shun-iwasawa 59726b
     resampleInfo("Bilinear",
shun-iwasawa 59726b
                  TRenderSettings::Bilinear_FilterResampleQuality)}};
shun-iwasawa 59726b
shun-iwasawa 59726b
ResampleOption quality2index(TRenderSettings::ResampleQuality quality) {
shun-iwasawa 59726b
  QMapIterator<resampleoption, resampleinfo=""> i(resampleInfoMap);</resampleoption,>
shun-iwasawa 59726b
  while (i.hasNext()) {
shun-iwasawa 59726b
    i.next();
shun-iwasawa 59726b
    if (i.value().quality == quality) return i.key();
shun-iwasawa 59726b
  }
shun-iwasawa 59726b
  return c_standard;
shun-iwasawa 59726b
}
shun-iwasawa 59726b
shun-iwasawa 481b59
enum ChannelWidth { c_8bit, c_16bit, c_32bit };  // 32bit: compute in float
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
enum DominantField { c_odd, c_even, c_none };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
enum ThreadsOption {
Shinya Kitaoka 120a6e
  c_single,
Shinya Kitaoka 120a6e
  c_half,
Shinya Kitaoka 120a6e
  c_all,
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
enum GranularityOption { c_off, c_large, c_medium, c_small };
Toshihiro Shimizu 890ddd
shun-iwasawa 694080
bool checkForSeqNum(QString type) {
shun-iwasawa 694080
  TFileType::Type typeInfo = TFileType::getInfoFromExtension(type);
shun-iwasawa 694080
  if ((typeInfo & TFileType::IMAGE) && !(typeInfo & TFileType::LEVEL))
shun-iwasawa 694080
    return true;
shun-iwasawa 694080
  else
shun-iwasawa 694080
    return false;
shun-iwasawa 694080
}
Shinya Kitaoka 120a6e
}  // anonymous namespace
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*! \class OutputSettingsPopup
Shinya Kitaoka 120a6e
                \brief The OutputSettingsPopup class provides a output settings
Shinya Kitaoka 120a6e
   dialog.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                Inherits \b Dialog.
Shinya Kitaoka 120a6e
                This class allows to set output properties of current scene.
Shinya Kitaoka 120a6e
                It's composed of a list of field to set this preperties:
Shinya Kitaoka 120a6e
                a \b DVGui::FileField to set output directory, a LineEdit for
Shinya Kitaoka 120a6e
   output name,
Shinya Kitaoka 120a6e
                a \b QComboBox to choose format, a button near QComboBox that
Shinya Kitaoka 120a6e
   open a popup
Shinya Kitaoka 120a6e
                to change format chosen settings, other QComboBox to choose
Shinya Kitaoka 120a6e
   camera,
Shinya Kitaoka 120a6e
                resample balance, channel width and dominant field and other
Shinya Kitaoka 120a6e
   number field
Shinya Kitaoka 120a6e
                to set values for frame and time stretch.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
OutputSettingsPopup::OutputSettingsPopup(bool isPreview)
shun-iwasawa f36064
    : Dialog(TApp::instance()->getMainWindow(), false, isPreview,
Shinya Kitaoka 120a6e
             isPreview ? "PreviewSettings" : "OutputSettings")
shun-iwasawa f36064
    , m_subcameraChk(nullptr)
shun-iwasawa f36064
    , m_applyShrinkChk(nullptr)
shun-iwasawa f36064
    , m_outputCameraOm(nullptr)
Shinya Kitaoka 120a6e
    , m_isPreviewSettings(isPreview)
justburner 69bbaf
    , m_allowMT(Preferences::instance()->getFfmpegMultiThread())
shun-iwasawa 481b59
    , m_presetCombo(nullptr)
shun-iwasawa 481b59
    , m_syncColorSettingsButton(nullptr) {
Shinya Kitaoka 120a6e
  setWindowTitle(isPreview ? tr("Preview Settings") : tr("Output Settings"));
shun-iwasawa f36064
  if (!isPreview) setObjectName("OutputSettingsPopup");
shun-iwasawa f36064
  // create panel
shun-iwasawa f36064
  QFrame *panel = createPanel(isPreview);
shun-iwasawa f36064
shun-iwasawa f36064
  // preview settings
shun-iwasawa f36064
  if (isPreview) {
shun-iwasawa f36064
    m_topLayout->setMargin(5);
shun-iwasawa f36064
    m_topLayout->addWidget(panel, 0);
shun-iwasawa f36064
    return;
shun-iwasawa f36064
  }
shun-iwasawa f36064
shun-iwasawa f36064
  // outputsettings with category list & scrollable panel
shun-iwasawa f36064
  QPushButton *addPresetButton    = new QPushButton(tr("Add"), this);
shun-iwasawa f36064
  QPushButton *removePresetButton = new QPushButton(tr("Remove"), this);
shun-iwasawa f36064
  m_presetCombo                   = new QComboBox(this);
shun-iwasawa f36064
shun-iwasawa f36064
  addPresetButton->setObjectName("PushButton_NoPadding");
shun-iwasawa f36064
  removePresetButton->setObjectName("PushButton_NoPadding");
shun-iwasawa f36064
  QString tooltip =
shun-iwasawa f36064
      tr("Save current output settings.\nThe parameters to be saved are:\n- "
shun-iwasawa f36064
         "Camera settings\n- Project folder to be saved in\n- File format\n- "
shun-iwasawa 481b59
         "File options\n- Resample Balance\n- Channel width\n- Linear Color "
shun-iwasawa 481b59
         "Space\n- Color Space Gamma");
shun-iwasawa f36064
  addPresetButton->setToolTip(tooltip);
shun-iwasawa f36064
  /*-- プリセットフォルダを調べ、コンボボックスにアイテムを格納する --*/
shun-iwasawa f36064
  updatePresetComboItems();
shun-iwasawa f36064
shun-iwasawa f36064
  QListWidget *categoryList = new QListWidget(this);
shun-iwasawa f36064
  QStringList categories;
shun-iwasawa 481b59
  categories << tr("Camera") << tr("Color") << tr("File") << tr("More");
shun-iwasawa f36064
  categoryList->addItems(categories);
shun-iwasawa f36064
  categoryList->setFixedWidth(100);
shun-iwasawa f36064
  categoryList->setCurrentRow(0);
shun-iwasawa f36064
shun-iwasawa f36064
  m_scrollArea = new QScrollArea(this);
shun-iwasawa f36064
  m_scrollArea->setWidgetResizable(true);
shun-iwasawa f36064
  m_scrollArea->setWidget(panel);
shun-iwasawa f36064
shun-iwasawa f36064
  QPushButton *renderButton = new QPushButton(tr("Render"), this);
shun-iwasawa f36064
  renderButton->setIcon(createQIcon("render"));
shun-iwasawa f36064
  renderButton->setIconSize(QSize(20, 20));
shun-iwasawa f36064
  renderButton->setFixedWidth(200);
shun-iwasawa f36064
shun-iwasawa f36064
  m_topLayout->setMargin(5);
shun-iwasawa f36064
  {
shun-iwasawa f36064
    QHBoxLayout *presetLay = new QHBoxLayout();
shun-iwasawa f36064
    presetLay->setMargin(0);
shun-iwasawa f36064
    presetLay->setSpacing(5);
shun-iwasawa f36064
    {
shun-iwasawa f36064
      presetLay->addStretch(1);
shun-iwasawa f36064
      presetLay->addWidget(new QLabel(tr("Presets:"), this), 1,
shun-iwasawa f36064
                           Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
      presetLay->addWidget(m_presetCombo, 1);
shun-iwasawa f36064
      presetLay->addWidget(addPresetButton, 0);
shun-iwasawa f36064
      presetLay->addWidget(removePresetButton, 0);
shun-iwasawa f36064
    }
shun-iwasawa f36064
    m_topLayout->addLayout(presetLay, 0);
shun-iwasawa f36064
shun-iwasawa f36064
    QHBoxLayout *middleLay = new QHBoxLayout();
shun-iwasawa f36064
    middleLay->setMargin(0);
shun-iwasawa f36064
    middleLay->setSpacing(5);
shun-iwasawa f36064
    {
shun-iwasawa f36064
      middleLay->addWidget(categoryList, 0);
shun-iwasawa f36064
      middleLay->addWidget(m_scrollArea, 1);
shun-iwasawa f36064
    }
shun-iwasawa f36064
    m_topLayout->addLayout(middleLay, 1);
shun-iwasawa f36064
shun-iwasawa f36064
    m_topLayout->addSpacing(5);
shun-iwasawa f36064
    m_topLayout->addWidget(renderButton, 0, Qt::AlignCenter);
shun-iwasawa f36064
  }
shun-iwasawa f36064
shun-iwasawa f36064
  bool ret = true;
shun-iwasawa f36064
  ret      = ret &&
shun-iwasawa f36064
        connect(renderButton, SIGNAL(pressed()), this, SLOT(onRenderClicked()));
shun-iwasawa f36064
  ret = ret && connect(addPresetButton, SIGNAL(pressed()), this,
shun-iwasawa f36064
                       SLOT(onAddPresetButtonPressed()));
shun-iwasawa f36064
  ret = ret && connect(removePresetButton, SIGNAL(pressed()), this,
shun-iwasawa f36064
                       SLOT(onRemovePresetButtonPressed()));
shun-iwasawa f36064
  ret = ret && connect(m_presetCombo, SIGNAL(activated(const QString &)), this,
shun-iwasawa f36064
                       SLOT(onPresetSelected(const QString &)));
shun-iwasawa f36064
  ret = ret && connect(categoryList, SIGNAL(itemClicked(QListWidgetItem *)),
shun-iwasawa f36064
                       this, SLOT(onCategoryActivated(QListWidgetItem *)));
shun-iwasawa f36064
  assert(ret);
shun-iwasawa f36064
}
shun-iwasawa f36064
shun-iwasawa f36064
//-----------------------------------------------------------------------------
shun-iwasawa f36064
shun-iwasawa f36064
void OutputSettingsPopup::onCategoryActivated(QListWidgetItem *item) {
shun-iwasawa f36064
  AnimatedLabel *label;
shun-iwasawa f36064
  QFrame *frame;
shun-iwasawa f36064
  if (item->text() == tr("Camera")) {
shun-iwasawa f36064
    label = m_cameraLabel;
shun-iwasawa f36064
    frame = m_cameraBox;
shun-iwasawa 481b59
  } else if (item->text() == tr("Color")) {
shun-iwasawa 481b59
    label = m_colorLabel;
shun-iwasawa 481b59
    frame = m_colorBox;
shun-iwasawa f36064
  } else if (item->text() == tr("File")) {
shun-iwasawa f36064
    label = m_fileLabel;
shun-iwasawa f36064
    frame = m_fileBox;
shun-iwasawa eb8f34
  } else if (item->text() == tr("More")) {
shun-iwasawa eb8f34
    label = m_moreLabel;
shun-iwasawa eb8f34
    frame = m_moreBox;
shun-iwasawa f36064
  } else
shun-iwasawa f36064
    return;
shun-iwasawa f36064
shun-iwasawa f36064
  m_scrollArea->ensureWidgetVisible(frame);
shun-iwasawa f36064
  QPropertyAnimation *a = new QPropertyAnimation(label, "color");
shun-iwasawa f36064
  a->setDuration(1000);
shun-iwasawa f36064
  a->setStartValue(QColor(255, 255, 0, 128));
shun-iwasawa f36064
  a->setEndValue(QColor(255, 255, 0, 0));
shun-iwasawa f36064
  a->setEasingCurve(QEasingCurve::OutBack);
shun-iwasawa f36064
  a->start(QPropertyAnimation::DeleteWhenStopped);
shun-iwasawa f36064
}
Shinya Kitaoka 120a6e
shun-iwasawa f36064
//-----------------------------------------------------------------------------
shun-iwasawa f36064
shun-iwasawa f36064
QFrame *OutputSettingsPopup::createPanel(bool isPreview) {
shun-iwasawa f36064
  QFrame *panel = new QFrame(this);
shun-iwasawa f36064
shun-iwasawa f36064
  m_cameraLabel = new AnimatedLabel(tr("Camera Settings"), this);
shun-iwasawa 481b59
  m_colorLabel  = new AnimatedLabel(tr("Color Settings"), this);
shun-iwasawa 481b59
  if (isPreview)
shun-iwasawa 481b59
    m_syncColorSettingsButton =
shun-iwasawa 481b59
        new DVGui::CheckBox(tr("Sync with Output Settings"));
shun-iwasawa 481b59
  m_fileLabel = new AnimatedLabel(tr("File Settings"), this);
shun-iwasawa 481b59
  m_cameraBox = createCameraSettingsBox(isPreview);
shun-iwasawa 481b59
  m_colorBox  = createColorSettingsBox(isPreview);
shun-iwasawa 481b59
  m_fileBox   = createFileSettingsBox(isPreview);
Shinya Kitaoka 120a6e
  if (!isPreview) {
shun-iwasawa eb8f34
    m_moreLabel = new AnimatedLabel(tr("More Settings"), this);
shun-iwasawa eb8f34
    m_moreBox   = createMoreSettingsBox();
shun-iwasawa f36064
  }
shun-iwasawa f36064
  QVBoxLayout *lay = new QVBoxLayout();
shun-iwasawa f36064
  lay->setMargin(5);
shun-iwasawa f36064
  lay->setSpacing(3);
shun-iwasawa f36064
  {
shun-iwasawa f36064
    lay->addWidget(m_cameraLabel, 0);
shun-iwasawa f36064
    lay->addWidget(m_cameraBox, 0);
shun-iwasawa f36064
    lay->addSpacing(10);
Shinya Kitaoka 120a6e
shun-iwasawa 481b59
    QHBoxLayout *colorLabelLay = new QHBoxLayout();
shun-iwasawa 481b59
    colorLabelLay->setMargin(0);
shun-iwasawa 481b59
    colorLabelLay->setSpacing(0);
shun-iwasawa 481b59
    {
shun-iwasawa 481b59
      colorLabelLay->addWidget(m_colorLabel, 0);
shun-iwasawa 481b59
      colorLabelLay->addStretch(1);
shun-iwasawa 481b59
      if (isPreview && m_syncColorSettingsButton)
shun-iwasawa 481b59
        colorLabelLay->addWidget(m_syncColorSettingsButton, 0);
shun-iwasawa 481b59
    }
shun-iwasawa 481b59
    lay->addLayout(colorLabelLay, 0);
shun-iwasawa 481b59
    lay->addWidget(m_colorBox, 0);
shun-iwasawa 481b59
    lay->addSpacing(10);
shun-iwasawa 481b59
shun-iwasawa f36064
    lay->addWidget(m_fileLabel, 0);
shun-iwasawa f36064
    lay->addWidget(m_fileBox, 0);
shun-iwasawa f36064
shun-iwasawa f36064
    if (!isPreview) {
shun-iwasawa f36064
      lay->addSpacing(10);
shun-iwasawa eb8f34
      lay->addWidget(m_moreLabel, 0);
shun-iwasawa eb8f34
      lay->addWidget(m_moreBox, 0);
shun-iwasawa f36064
    }
shun-iwasawa f36064
    lay->addStretch(1);
Shinya Kitaoka 120a6e
  }
shun-iwasawa f36064
  panel->setLayout(lay);
shun-iwasawa 481b59
shun-iwasawa 481b59
  if (isPreview && m_syncColorSettingsButton) {
shun-iwasawa 481b59
    bool ret = connect(m_syncColorSettingsButton, SIGNAL(stateChanged(int)),
shun-iwasawa 481b59
                       SLOT(onSyncColorSettingsChecked(int)));
shun-iwasawa 481b59
    assert(ret);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa f36064
  return panel;
shun-iwasawa f36064
}
shun-iwasawa f36064
shun-iwasawa f36064
//-----------------------------------------------------------------------------
shun-iwasawa f36064
shun-iwasawa f36064
QFrame *OutputSettingsPopup::createCameraSettingsBox(bool isPreview) {
shun-iwasawa f36064
  QFrame *cameraSettingsBox = new QFrame(this);
shun-iwasawa f36064
  cameraSettingsBox->setObjectName("OutputSettingsBox");
shun-iwasawa f36064
Shinya Kitaoka 120a6e
  // Output Camera
Shinya Kitaoka 120a6e
  m_outputCameraOm = new QComboBox();
Shinya Kitaoka 120a6e
  // Frame Start-End
Shinya Kitaoka 120a6e
  m_startFld = new DVGui::IntLineEdit(this);
Shinya Kitaoka 120a6e
  m_endFld   = new DVGui::IntLineEdit(this);
Shinya Kitaoka 120a6e
  // Step-Shrink
Shinya Kitaoka 120a6e
  m_stepFld   = new DVGui::IntLineEdit(this);
Shinya Kitaoka 120a6e
  m_shrinkFld = new DVGui::IntLineEdit(this);
shun-iwasawa f36064
shun-iwasawa f36064
  QFrame *cameraParametersBox = nullptr;
shun-iwasawa f36064
  if (!isPreview) {
shun-iwasawa f36064
    m_cameraSettings    = new CameraSettingsPopup();
shun-iwasawa f36064
    cameraParametersBox = new QFrame(this);
shun-iwasawa f36064
    cameraParametersBox->setObjectName("OutputSettingsCameraBox");
shun-iwasawa c7ddce
    m_outputCameraOm->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa c7ddce
    m_outputCameraOm->installEventFilter(this);
shun-iwasawa f36064
  } else {
shun-iwasawa f36064
    // Subcamera checkbox
shun-iwasawa f36064
    m_subcameraChk = new DVGui::CheckBox(tr("Use Sub-Camera"));
Shinya Kitaoka 120a6e
    m_applyShrinkChk =
Shinya Kitaoka 120a6e
        new DVGui::CheckBox(tr("Apply Shrink to Main Viewer"), this);
shun-iwasawa f36064
  }
shun-iwasawa f36064
  m_outputCameraOm->setSizeAdjustPolicy(QComboBox::AdjustToContents);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  //-----
shun-iwasawa cd4694
shun-iwasawa f36064
  QVBoxLayout *lay = new QVBoxLayout();
shun-iwasawa f36064
  lay->setMargin(10);
shun-iwasawa f36064
  lay->setSpacing(10);
shun-iwasawa f36064
  {
shun-iwasawa f36064
    // Output Camera
shun-iwasawa f36064
    QHBoxLayout *outCamLay = new QHBoxLayout();
shun-iwasawa f36064
    outCamLay->setMargin(0);
shun-iwasawa f36064
    outCamLay->setSpacing(5);
shun-iwasawa f36064
    {
shun-iwasawa f36064
      outCamLay->addWidget(new QLabel(tr("Output Camera:"), this), 0);
shun-iwasawa f36064
      outCamLay->addWidget(m_outputCameraOm, 0);
shun-iwasawa f36064
      outCamLay->addStretch(1);
shun-iwasawa f36064
    }
shun-iwasawa f36064
    lay->addLayout(outCamLay);
shun-iwasawa cd4694
shun-iwasawa f36064
    if (!isPreview) {
shun-iwasawa f36064
      QVBoxLayout *camParamLay = new QVBoxLayout();
shun-iwasawa f36064
      camParamLay->setMargin(5);
shun-iwasawa f36064
      camParamLay->setSpacing(0);
shun-iwasawa f36064
      { camParamLay->addWidget(m_cameraSettings); }
shun-iwasawa f36064
      cameraParametersBox->setLayout(camParamLay);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
      lay->addWidget(cameraParametersBox);
shun-iwasawa f36064
    }
Shinya Kitaoka 120a6e
shun-iwasawa f36064
    // Frame start/end
shun-iwasawa f36064
    QGridLayout *frameShrinkLay = new QGridLayout();
shun-iwasawa f36064
    frameShrinkLay->setMargin(0);
shun-iwasawa f36064
    frameShrinkLay->setHorizontalSpacing(5);
shun-iwasawa f36064
    frameShrinkLay->setVerticalSpacing(10);
shun-iwasawa f36064
    {
shun-iwasawa f36064
      frameShrinkLay->addWidget(new QLabel(tr("Frame Start:"), this), 0, 0,
shun-iwasawa f36064
                                Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
      frameShrinkLay->addWidget(m_startFld, 0, 1);
shun-iwasawa f36064
      frameShrinkLay->addItem(
shun-iwasawa f36064
          new QSpacerItem(3, 1, QSizePolicy::Fixed, QSizePolicy::Fixed), 0, 2);
shun-iwasawa f36064
      frameShrinkLay->addWidget(new QLabel(tr("End:"), this), 0, 3,
shun-iwasawa f36064
                                Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
      frameShrinkLay->addWidget(m_endFld, 0, 4);
shun-iwasawa f36064
      frameShrinkLay->addItem(
shun-iwasawa f36064
          new QSpacerItem(10, 1, QSizePolicy::Fixed, QSizePolicy::Fixed), 0, 5);
shun-iwasawa f36064
      frameShrinkLay->addWidget(new QLabel(tr("Step:"), this), 0, 6,
shun-iwasawa f36064
                                Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
      frameShrinkLay->addWidget(m_stepFld, 0, 7);
shun-iwasawa f36064
shun-iwasawa f36064
      frameShrinkLay->addWidget(new QLabel(tr("Shrink:"), this), 1, 0,
shun-iwasawa f36064
                                Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
      frameShrinkLay->addWidget(m_shrinkFld, 1, 1);
shun-iwasawa f36064
shun-iwasawa f36064
      if (isPreview)
shun-iwasawa f36064
        frameShrinkLay->addWidget(m_applyShrinkChk, 1, 4, 1, 5,
shun-iwasawa f36064
                                  Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    }
shun-iwasawa f36064
    frameShrinkLay->setColumnStretch(8, 1);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
    lay->addLayout(frameShrinkLay);
shun-iwasawa f36064
  }
shun-iwasawa f36064
  cameraSettingsBox->setLayout(lay);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  //-----
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  bool ret = true;
shun-iwasawa f36064
  ret      = ret &&
shun-iwasawa f36064
        connect(m_outputCameraOm, SIGNAL(currentIndexChanged(const QString &)),
shun-iwasawa f36064
                SLOT(onCameraChanged(const QString &)));
shun-iwasawa f36064
  ret = ret && connect(m_startFld, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onFrameFldEditFinished()));
shun-iwasawa f36064
  ret = ret && connect(m_endFld, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onFrameFldEditFinished()));
shun-iwasawa f36064
  ret = ret && connect(m_stepFld, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onFrameFldEditFinished()));
shun-iwasawa f36064
  ret = ret && connect(m_shrinkFld, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onFrameFldEditFinished()));
shun-iwasawa f36064
  if (!isPreview) {
shun-iwasawa f36064
    ret = ret && connect(m_cameraSettings, SIGNAL(changed()), this,
shun-iwasawa f36064
                         SLOT(onCameraSettingsChanged()));
shun-iwasawa f36064
  } else {
shun-iwasawa f36064
    ret = ret && connect(m_applyShrinkChk, SIGNAL(stateChanged(int)),
shun-iwasawa f36064
                         SLOT(onApplyShrinkChecked(int)));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  assert(ret);
shun-iwasawa f36064
  return cameraSettingsBox;
shun-iwasawa f36064
}
Shinya Kitaoka 120a6e
shun-iwasawa f36064
//-----------------------------------------------------------------------------
shun-iwasawa f36064
shun-iwasawa 481b59
QFrame *OutputSettingsPopup::createColorSettingsBox(bool isPreview) {
shun-iwasawa 481b59
  QFrame *colorSettingsBox = new QFrame(this);
shun-iwasawa 481b59
  colorSettingsBox->setObjectName("OutputSettingsBox");
shun-iwasawa 481b59
shun-iwasawa 481b59
  // Channel Width
shun-iwasawa 481b59
  m_channelWidthOm = new QComboBox();
shun-iwasawa 481b59
  // Linear Color Space
shun-iwasawa 481b59
  m_linearColorSpaceChk = new DVGui::CheckBox();
shun-iwasawa 481b59
  // color space gamma
shun-iwasawa 481b59
  m_colorSpaceGammaFld = new DVGui::DoubleLineEdit(this, 2.2);
shun-iwasawa 481b59
shun-iwasawa 481b59
  // Channel Width
shun-iwasawa 481b59
  m_channelWidthOm->addItem(tr("8 bit"), "8 bit");
shun-iwasawa 481b59
  m_channelWidthOm->addItem(tr("16 bit"), "16 bit");
shun-iwasawa 481b59
  m_channelWidthOm->addItem(tr("32 bit Floating point"), "32 bit");
shun-iwasawa 481b59
shun-iwasawa 481b59
  m_linearColorSpaceChk->setToolTip(
shun-iwasawa 481b59
      tr("On rendering, color values will be temporarily converted to linear "
shun-iwasawa 481b59
         "light from nonlinear RGB values by using color space gamma."));
shun-iwasawa 481b59
  if (m_isPreviewSettings)
shun-iwasawa 481b59
    m_colorSpaceGammaFld->setRange(-1.0, 5.0);
shun-iwasawa 481b59
  else
shun-iwasawa 481b59
    m_colorSpaceGammaFld->setRange(1.0, 5.0);
shun-iwasawa 481b59
  m_colorSpaceGammaFld->setDecimals(3);
shun-iwasawa 481b59
  QString colorSpaceGammaTooltip =
shun-iwasawa 481b59
      tr("Color Space Gamma value is used for conversion between the linear "
shun-iwasawa 481b59
         "and nonlinear color spaces,\n"
shun-iwasawa 481b59
         "when the \"Linear Color Space\" option is enabled.");
shun-iwasawa 481b59
  if (m_isPreviewSettings)
shun-iwasawa 481b59
    colorSpaceGammaTooltip +=
shun-iwasawa 481b59
        tr("\nInput less than 1.0 to sync the value with the output settings.");
shun-iwasawa 481b59
  m_colorSpaceGammaFld->setToolTip(colorSpaceGammaTooltip);
shun-iwasawa 481b59
shun-iwasawa 481b59
  if (!isPreview) {
shun-iwasawa 481b59
    m_channelWidthOm->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa 481b59
  QGridLayout *gridLay = new QGridLayout();
shun-iwasawa 481b59
  gridLay->setMargin(5);
shun-iwasawa 481b59
  gridLay->setHorizontalSpacing(5);
shun-iwasawa 481b59
  gridLay->setVerticalSpacing(10);
shun-iwasawa 481b59
  {
shun-iwasawa 481b59
    // Channel Width
shun-iwasawa 481b59
    gridLay->addWidget(new QLabel(tr("Channel Width:"), this), 0, 0,
shun-iwasawa 481b59
                       Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa 481b59
    gridLay->addWidget(m_channelWidthOm, 0, 1, 1, 2,
shun-iwasawa 481b59
                       Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa 481b59
shun-iwasawa 481b59
    // Linear Color Space and Color SpaceGamma
shun-iwasawa 481b59
    gridLay->addWidget(new QLabel(tr("Linear Color Space:"), this), 1, 0,
shun-iwasawa 481b59
                       Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa 481b59
    gridLay->addWidget(m_linearColorSpaceChk, 1, 1,
shun-iwasawa 481b59
                       Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa 481b59
    gridLay->addWidget(new QLabel(tr("Color Space Gamma:"), this), 1, 2,
shun-iwasawa 481b59
                       Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa 481b59
    gridLay->addWidget(m_colorSpaceGammaFld, 1, 3);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
  gridLay->setColumnStretch(2, 1);
shun-iwasawa 481b59
  colorSettingsBox->setLayout(gridLay);
shun-iwasawa 481b59
shun-iwasawa 481b59
  bool ret = true;
shun-iwasawa 481b59
  ret      = ret && connect(m_channelWidthOm, SIGNAL(currentIndexChanged(int)),
shun-iwasawa 481b59
                            SLOT(onChannelWidthChanged(int)));
shun-iwasawa 481b59
  ret      = ret && connect(m_linearColorSpaceChk, SIGNAL(stateChanged(int)),
shun-iwasawa 481b59
                            SLOT(onLinearColorSpaceChecked(int)));
shun-iwasawa 481b59
shun-iwasawa 481b59
  ret = ret && connect(m_colorSpaceGammaFld, SIGNAL(editingFinished()),
shun-iwasawa 481b59
                       SLOT(onColorSpaceGammaEdited()));
shun-iwasawa 481b59
  assert(ret);
shun-iwasawa 481b59
  return colorSettingsBox;
shun-iwasawa 481b59
}
shun-iwasawa 481b59
shun-iwasawa 481b59
//-----------------------------------------------------------------------------
shun-iwasawa 481b59
shun-iwasawa f36064
QFrame *OutputSettingsPopup::createFileSettingsBox(bool isPreview) {
shun-iwasawa f36064
  QFrame *fileSettingsBox = new QFrame(this);
Shinya Kitaoka 120a6e
  fileSettingsBox->setObjectName("OutputSettingsBox");
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  // Resample Balance
shun-iwasawa f36064
  m_resampleBalanceOm = new QComboBox();
shun-iwasawa f36064
  // Threads
shun-iwasawa f36064
  m_threadsComboOm = new QComboBox();
shun-iwasawa f36064
  // Granularity
shun-iwasawa f36064
  m_rasterGranularityOm = new QComboBox();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Resample Balance
shun-iwasawa 59726b
  translateResampleOptions();
shun-iwasawa 59726b
  for (int i = 0; i < ResampleOptionCount; i++) {
shun-iwasawa 59726b
    m_resampleBalanceOm->addItem(resampleInfoMap[(ResampleOption)i].uiString,
shun-iwasawa 59726b
                                 resampleInfoMap[(ResampleOption)i].idString);
shun-iwasawa 59726b
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QStringList threadsChoices;
Shinya Kitaoka 120a6e
  threadsChoices << tr("Single") << tr("Half") << tr("All");
Shinya Kitaoka 120a6e
  m_threadsComboOm->addItems(threadsChoices);
Shinya Kitaoka 120a6e
  QStringList granularityChoices;
Shinya Kitaoka 120a6e
  granularityChoices << tr("None") << tr("Large") << tr("Medium")
Shinya Kitaoka 120a6e
                     << tr("Small");
Shinya Kitaoka 120a6e
  m_rasterGranularityOm->addItems(granularityChoices);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  if (!isPreview) {
shun-iwasawa f36064
    // Save In
shun-iwasawa f36064
    m_saveInFileFld = new DVGui::FileField(0, QString(""));
shun-iwasawa f36064
    // File Name
shun-iwasawa f36064
    m_fileNameFld = new DVGui::LineEdit(QString(""));
shun-iwasawa f36064
    // File Format
shun-iwasawa f36064
    m_fileFormat       = new QComboBox();
shun-iwasawa f36064
    m_fileFormatButton = new QPushButton(tr("Options"));
Shinya Kitaoka 120a6e
shun-iwasawa f36064
    // File Format
shun-iwasawa f36064
    QStringList formats;
shun-iwasawa f36064
    TImageWriter::getSupportedFormats(formats, true);
shun-iwasawa f36064
    TLevelWriter::getSupportedFormats(formats, true);
shun-iwasawa f36064
    Tiio::Writer::getSupportedFormats(formats, true);
shun-iwasawa f36064
    formats.sort();
shun-iwasawa f36064
    m_fileFormat->addItems(formats);
shun-iwasawa c7ddce
    m_fileFormat->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa c7ddce
    m_resampleBalanceOm->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa c7ddce
    m_threadsComboOm->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa c7ddce
    m_rasterGranularityOm->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa c7ddce
    m_fileFormat->installEventFilter(this);
shun-iwasawa c7ddce
    m_resampleBalanceOm->installEventFilter(this);
shun-iwasawa c7ddce
    m_channelWidthOm->installEventFilter(this);
shun-iwasawa c7ddce
    m_threadsComboOm->installEventFilter(this);
shun-iwasawa c7ddce
    m_rasterGranularityOm->installEventFilter(this);
shun-iwasawa f36064
  }
shun-iwasawa f36064
shun-iwasawa f36064
  //-----
shun-iwasawa f36064
shun-iwasawa f36064
  QVBoxLayout *lay = new QVBoxLayout();
shun-iwasawa f36064
  lay->setMargin(10);
shun-iwasawa f36064
  lay->setSpacing(10);
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    if (!isPreview) {
shun-iwasawa f36064
      QGridLayout *upperGridLay = new QGridLayout();
shun-iwasawa f36064
      upperGridLay->setMargin(0);
shun-iwasawa f36064
      upperGridLay->setHorizontalSpacing(5);
shun-iwasawa f36064
      upperGridLay->setVerticalSpacing(10);
Shinya Kitaoka 120a6e
      {
shun-iwasawa f36064
        // Save In
shun-iwasawa f36064
        upperGridLay->addWidget(new QLabel(tr("Save in:"), this), 0, 0,
shun-iwasawa f36064
                                Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
        upperGridLay->addWidget(m_saveInFileFld, 0, 1, 1, 3);
shun-iwasawa f36064
        // File Name
shun-iwasawa f36064
        upperGridLay->addWidget(new QLabel(tr("Name:"), this), 1, 0,
shun-iwasawa f36064
                                Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
        upperGridLay->addWidget(m_fileNameFld, 1, 1);
shun-iwasawa f36064
        // File Format
shun-iwasawa f36064
        upperGridLay->addWidget(m_fileFormat, 1, 2);
shun-iwasawa f36064
        upperGridLay->addWidget(m_fileFormatButton, 1, 3);
Shinya Kitaoka 120a6e
      }
shun-iwasawa f36064
      upperGridLay->setColumnStretch(1, 1);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
      lay->addLayout(upperGridLay);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
shun-iwasawa f36064
    QGridLayout *bottomGridLay = new QGridLayout();
shun-iwasawa f36064
    bottomGridLay->setMargin(0);
shun-iwasawa f36064
    bottomGridLay->setHorizontalSpacing(5);
shun-iwasawa f36064
    bottomGridLay->setVerticalSpacing(10);
Shinya Kitaoka 120a6e
    {
shun-iwasawa f36064
      // Resample Balance
shun-iwasawa f36064
      bottomGridLay->addWidget(new QLabel(tr("Resample Balance:"), this), 0, 0,
shun-iwasawa f36064
                               Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
      bottomGridLay->addWidget(m_resampleBalanceOm, 0, 1, 1, 2,
shun-iwasawa f36064
                               Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa 481b59
shun-iwasawa f36064
      // Threads
shun-iwasawa 481b59
      bottomGridLay->addWidget(new QLabel(tr("Dedicated CPUs:"), this), 1, 0,
shun-iwasawa f36064
                               Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa 481b59
      bottomGridLay->addWidget(m_threadsComboOm, 1, 1);
shun-iwasawa f36064
      // Granularity
shun-iwasawa 481b59
      bottomGridLay->addWidget(new QLabel(tr("Render Tile:"), this), 2, 0,
shun-iwasawa f36064
                               Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa 481b59
      bottomGridLay->addWidget(m_rasterGranularityOm, 2, 1);
shun-iwasawa f36064
      if (m_subcameraChk) {
shun-iwasawa 481b59
        bottomGridLay->addWidget(m_subcameraChk, 3, 1, 1, 2);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
shun-iwasawa f36064
    bottomGridLay->setColumnStretch(2, 1);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
    lay->addLayout(bottomGridLay);
Shinya Kitaoka 120a6e
  }
shun-iwasawa f36064
  fileSettingsBox->setLayout(lay);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  //-----
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  bool ret = true;
Shinya Kitaoka 120a6e
  if (!isPreview) {
Shinya Kitaoka 120a6e
    ret = ret && connect(m_saveInFileFld, SIGNAL(pathChanged()), this,
Shinya Kitaoka 120a6e
                         SLOT(onPathChanged()));
Shinya Kitaoka 120a6e
    ret = ret && connect(m_fileNameFld, SIGNAL(editingFinished()),
Shinya Kitaoka 120a6e
                         SLOT(onNameChanged()));
Shinya Kitaoka 120a6e
    ret = ret &&
Shinya Kitaoka 120a6e
          connect(m_fileFormat, SIGNAL(currentIndexChanged(const QString &)),
Shinya Kitaoka 120a6e
                  SLOT(onFormatChanged(const QString &)));
Shinya Kitaoka 120a6e
    ret = ret && connect(m_fileFormatButton, SIGNAL(pressed()), this,
Shinya Kitaoka 120a6e
                         SLOT(openSettingsPopup()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  ret = ret && connect(m_resampleBalanceOm, SIGNAL(currentIndexChanged(int)),
Shinya Kitaoka 120a6e
                       SLOT(onResampleChanged(int)));
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
  ret = ret && connect(m_threadsComboOm, SIGNAL(currentIndexChanged(int)),
Shinya Kitaoka 120a6e
                       SLOT(onThreadsComboChanged(int)));
Shinya Kitaoka 120a6e
  ret = ret && connect(m_rasterGranularityOm, SIGNAL(currentIndexChanged(int)),
Shinya Kitaoka 120a6e
                       SLOT(onRasterGranularityChanged(int)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_subcameraChk)
Shinya Kitaoka 120a6e
    ret = ret && connect(m_subcameraChk, SIGNAL(stateChanged(int)),
Shinya Kitaoka 120a6e
                         SLOT(onSubcameraChecked(int)));
shun-iwasawa f36064
  assert(ret);
shun-iwasawa f36064
  return fileSettingsBox;
shun-iwasawa f36064
}
shun-iwasawa f36064
shun-iwasawa f36064
//-----------------------------------------------------------------------------
shun-iwasawa f36064
shun-iwasawa eb8f34
QFrame *OutputSettingsPopup::createMoreSettingsBox() {
shun-iwasawa eb8f34
  QFrame *moreSettingsBox = new QFrame(this);
shun-iwasawa eb8f34
  moreSettingsBox->setObjectName("OutputSettingsBox");
shun-iwasawa f36064
shun-iwasawa f36064
  // Board
shun-iwasawa f36064
  m_addBoard         = new DVGui::CheckBox(tr("Add Clapperboard"), this);
shun-iwasawa f36064
  m_boardSettingsBtn = new QPushButton(tr("Edit Clapperboard..."), this);
shun-iwasawa f36064
  // Gamma
shun-iwasawa f36064
  m_gammaFld = new DVGui::DoubleLineEdit();
shun-iwasawa f36064
  // Dominant Field
shun-iwasawa f36064
  m_dominantFieldOm = new QComboBox();
shun-iwasawa f36064
shun-iwasawa f36064
  // Stretch
shun-iwasawa f36064
  TRenderSettings rs = getProperties()->getRenderSettings();
shun-iwasawa f36064
shun-iwasawa f36064
  // Scene Settings FPS
shun-iwasawa f36064
  double frameRate = getProperties()->getFrameRate();
shun-iwasawa f36064
  m_frameRateFld   = new DVGui::DoubleLineEdit(this, frameRate);
shun-iwasawa f36064
  m_stretchFromFld = new DVGui::DoubleLineEdit(this, rs.m_timeStretchFrom);
shun-iwasawa f36064
  m_stretchToFld   = new DVGui::DoubleLineEdit(this, rs.m_timeStretchTo);
shun-iwasawa f36064
  m_multimediaOm   = new QComboBox(this);
shun-iwasawa f36064
  m_doStereoscopy  = new DVGui::CheckBox(tr("Do stereoscopy"), this);
shun-iwasawa f36064
  m_stereoShift    = new DVGui::DoubleLineEdit(this, 0.05);
shun-iwasawa f36064
shun-iwasawa f36064
  // Dominant Field
shun-iwasawa f36064
  QStringList dominantField;
shun-iwasawa f36064
  dominantField << tr("Odd (NTSC)") << tr("Even (PAL)") << tr("None");
shun-iwasawa f36064
  m_dominantFieldOm->addItems(dominantField);
shun-iwasawa c7ddce
  m_dominantFieldOm->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa c7ddce
  m_dominantFieldOm->installEventFilter(this);
shun-iwasawa f36064
  m_stretchFromFld->setRange(1, 1000);
shun-iwasawa f36064
  m_stretchToFld->setRange(1, 1000);
shun-iwasawa f36064
  m_stretchFromFld->setDecimals(2);
shun-iwasawa f36064
  m_stretchToFld->setDecimals(2);
shun-iwasawa f36064
  // Multimedia rendering enum
shun-iwasawa f36064
  QStringList multimediaTypes;
shun-iwasawa f36064
  multimediaTypes << tr("None") << tr("Fx Schematic Flows")
shun-iwasawa f36064
                  << tr("Fx Schematic Terminal Nodes");
shun-iwasawa f36064
  m_multimediaOm->addItems(multimediaTypes);
shun-iwasawa c7ddce
  m_multimediaOm->setFocusPolicy(Qt::StrongFocus);
shun-iwasawa c7ddce
  m_multimediaOm->installEventFilter(this);
shun-iwasawa f36064
  m_stereoShift->setEnabled(false);
shun-iwasawa f36064
shun-iwasawa f36064
  //-----
shun-iwasawa f36064
shun-iwasawa f36064
  QGridLayout *lay = new QGridLayout();
shun-iwasawa f36064
  lay->setMargin(5);
shun-iwasawa f36064
  lay->setHorizontalSpacing(5);
shun-iwasawa f36064
  lay->setVerticalSpacing(10);
shun-iwasawa f36064
  {
shun-iwasawa f36064
    // clapperboard
shun-iwasawa f36064
    lay->addWidget(m_addBoard, 0, 0);
shun-iwasawa f36064
    lay->addWidget(m_boardSettingsBtn, 0, 1, 1, 3,
shun-iwasawa f36064
                   Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
shun-iwasawa f36064
    // Gamma
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("Gamma:"), this), 1, 0,
shun-iwasawa f36064
                   Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(m_gammaFld, 1, 1, Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
    // Dominant Field
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("Dominant Field:"), this), 2, 0,
shun-iwasawa f36064
                   Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(m_dominantFieldOm, 2, 1, 1, 2,
shun-iwasawa f36064
                   Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
    // Scene Settings' FPS
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("Frame Rate:"), this), 3, 0,
shun-iwasawa f36064
                   Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(m_frameRateFld, 3, 1, Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("(linked to Scene Settings)"), this), 3, 2, 1,
shun-iwasawa f36064
                   2, Qt::AlignLeft | Qt::AlignVCenter);
luz paz 6454c4
    // Stretch
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("Stretch from FPS:"), this), 4, 0,
shun-iwasawa f36064
                   Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(m_stretchFromFld, 4, 1, Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("  To:"), this), 4, 2,
shun-iwasawa f36064
                   Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(m_stretchToFld, 4, 3, Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
    // new in V6.1
shun-iwasawa f36064
    // Multimedia rendering enum
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("Multiple Rendering:"), this), 5, 0,
shun-iwasawa f36064
                   Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(m_multimediaOm, 5, 1, 1, 3,
shun-iwasawa f36064
                   Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
shun-iwasawa f36064
    lay->addWidget(m_doStereoscopy, 6, 0);
shun-iwasawa f36064
    lay->addWidget(new QLabel(tr("Camera Shift:")), 6, 1, 1, 2,
shun-iwasawa f36064
                   Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa f36064
    lay->addWidget(m_stereoShift, 6, 3, Qt::AlignLeft | Qt::AlignVCenter);
shun-iwasawa f36064
  }
shun-iwasawa f36064
  lay->setColumnStretch(4, 1);
shun-iwasawa f36064
shun-iwasawa eb8f34
  moreSettingsBox->setLayout(lay);
Shinya Kitaoka 120a6e
shun-iwasawa f36064
  //-----
shun-iwasawa f36064
shun-iwasawa f36064
  bool ret = true;
shun-iwasawa f36064
  // clapperboard
shun-iwasawa f36064
  ret = ret && connect(m_addBoard, SIGNAL(stateChanged(int)), this,
shun-iwasawa f36064
                       SLOT(onAddBoardChecked(int)));
shun-iwasawa f36064
  ret = ret && connect(m_boardSettingsBtn, SIGNAL(clicked()), this,
shun-iwasawa f36064
                       SLOT(onBoardSettingsBtnClicked()));
shun-iwasawa f36064
shun-iwasawa f36064
  ret = ret && connect(m_gammaFld, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onGammaFldEditFinished()));
shun-iwasawa f36064
  ret = ret && connect(m_dominantFieldOm, SIGNAL(currentIndexChanged(int)),
shun-iwasawa f36064
                       SLOT(onDominantFieldChanged(int)));
shun-iwasawa f36064
  ret = ret && connect(m_frameRateFld, SIGNAL(editingFinished()), this,
shun-iwasawa f36064
                       SLOT(onFrameRateEditingFinished()));
shun-iwasawa f36064
  ret = ret && connect(m_stretchFromFld, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onStretchFldEditFinished()));
shun-iwasawa f36064
  ret = ret && connect(m_stretchToFld, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onStretchFldEditFinished()));
shun-iwasawa f36064
  ret = ret && connect(m_multimediaOm, SIGNAL(currentIndexChanged(int)), this,
shun-iwasawa f36064
                       SLOT(onMultimediaChanged(int)));
shun-iwasawa f36064
  ret = ret && connect(m_doStereoscopy, SIGNAL(stateChanged(int)),
shun-iwasawa f36064
                       SLOT(onStereoChecked(int)));
shun-iwasawa f36064
  ret = ret && connect(m_stereoShift, SIGNAL(editingFinished()),
shun-iwasawa f36064
                       SLOT(onStereoChanged()));
Shinya Kitaoka 120a6e
  assert(ret);
shun-iwasawa eb8f34
  return moreSettingsBox;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return current \b ToonzScene scene.
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
ToonzScene *OutputSettingsPopup::getCurrentScene() const {
Shinya Kitaoka 120a6e
  ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
  return scene;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!	Return current scene output properties \b TOutputProperties, if
Shinya Kitaoka 120a6e
                current scene is not empty.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
TOutputProperties *OutputSettingsPopup::getProperties() const {
Shinya Kitaoka 120a6e
  ToonzScene *scene = getCurrentScene();
Shinya Kitaoka 120a6e
  if (!scene) return 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return m_isPreviewSettings ? scene->getProperties()->getPreviewProperties()
Shinya Kitaoka 120a6e
                             : scene->getProperties()->getOutputProperties();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::showEvent(QShowEvent *) {
Shinya Kitaoka 120a6e
  TSceneHandle *sceneHandle   = TApp::instance()->getCurrentScene();
Shinya Kitaoka 120a6e
  TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
Shinya Kitaoka 120a6e
  bool ret =
Shinya Kitaoka 120a6e
      connect(sceneHandle, SIGNAL(sceneChanged()), this, SLOT(updateField()));
Shinya Kitaoka 120a6e
  ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this,
Shinya Kitaoka 120a6e
                       SLOT(updateField()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ret = ret && connect(xsheetHandle, SIGNAL(xsheetChanged()), this,
Shinya Kitaoka 120a6e
                       SLOT(updateField()));
Shinya Kitaoka 120a6e
  updateField();
Shinya Kitaoka 120a6e
  assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::hideEvent(QHideEvent *e) {
Shinya Kitaoka 120a6e
  TSceneHandle *sceneHandle   = TApp::instance()->getCurrentScene();
Shinya Kitaoka 120a6e
  TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
Shinya Kitaoka 120a6e
  bool ret = disconnect(sceneHandle, SIGNAL(sceneChanged()), this,
Shinya Kitaoka 120a6e
                        SLOT(updateField()));
shun-iwasawa f36064
  ret      = ret && disconnect(sceneHandle, SIGNAL(sceneSwitched()), this,
shun-iwasawa 41f8d2
                               SLOT(updateField()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ret = ret && disconnect(xsheetHandle, SIGNAL(xsheetChanged()), this,
Shinya Kitaoka 120a6e
                          SLOT(updateField()));
Shinya Kitaoka 120a6e
  assert(ret);
Shinya Kitaoka 120a6e
  Dialog::hideEvent(e);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
shun-iwasawa c7ddce
// ignore wheelevent on comboboxes
shun-iwasawa c7ddce
bool OutputSettingsPopup::eventFilter(QObject *obj, QEvent *e) {
shun-iwasawa c7ddce
  if (e->type() == QEvent::Wheel) {
shun-iwasawa c7ddce
    QComboBox *combo = qobject_cast<qcombobox *="">(obj);</qcombobox>
shun-iwasawa c7ddce
    if (combo && !combo->hasFocus()) return true;
shun-iwasawa c7ddce
  }
shun-iwasawa c7ddce
  return QObject::eventFilter(obj, e);
shun-iwasawa c7ddce
}
shun-iwasawa c7ddce
shun-iwasawa c7ddce
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onApplyShrinkChecked(int state) {
Shinya Kitaoka 120a6e
  TRenderSettings rs       = getProperties()->getRenderSettings();
Shinya Kitaoka 120a6e
  rs.m_applyShrinkToViewer = (state == Qt::Checked);
Shinya Kitaoka 120a6e
  getProperties()->setRenderSettings(rs);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onSubcameraChecked(int state) {
Shinya Kitaoka 120a6e
  getProperties()->setSubcameraPreview(state == Qt::Checked);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Jeremy Bullock 4a76fd
void OutputSettingsPopup::onRenderClicked() {
Jeremy Bullock 4a76fd
  CommandManager::instance()->execute("MI_Render");
Jeremy Bullock 4a76fd
}
Jeremy Bullock 4a76fd
Jeremy Bullock 4a76fd
//-----------------------------------------------------------------------------
Jeremy Bullock 4a76fd
Toshihiro Shimizu 890ddd
/*!	Update all field value take care current scene output properties.
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::updateField() {
Shinya Kitaoka 120a6e
  ToonzScene *scene       = getCurrentScene();
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  if (!prop) {
Shinya Kitaoka 120a6e
    if (!m_isPreviewSettings) {
Shinya Kitaoka 120a6e
      m_saveInFileFld->setPath(QString());
Shinya Kitaoka 120a6e
      m_fileNameFld->setText(QString());
Shinya Kitaoka 120a6e
      m_fileFormat->setCurrentIndex(0);
Shinya Kitaoka 120a6e
      m_gammaFld->setText(QString());
Shinya Kitaoka 120a6e
      m_dominantFieldOm->setCurrentIndex(c_none);
Shinya Kitaoka 120a6e
      m_frameRateFld->setText(QString());
Shinya Kitaoka 120a6e
      m_stretchFromFld->setText(QString());
Shinya Kitaoka 120a6e
      m_stretchToFld->setText(QString());
Shinya Kitaoka 120a6e
      m_multimediaOm->setCurrentIndex(0);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (m_outputCameraOm) m_outputCameraOm->setCurrentIndex(0);
Shinya Kitaoka 120a6e
    m_startFld->setText(QString());
Shinya Kitaoka 120a6e
    m_endFld->setText(QString());
Shinya Kitaoka 120a6e
    m_stepFld->setText(QString());
Shinya Kitaoka 120a6e
    m_shrinkFld->setText(QString());
Shinya Kitaoka 120a6e
    if (m_applyShrinkChk) m_applyShrinkChk->setCheckState(Qt::Unchecked);
Shinya Kitaoka 120a6e
    m_resampleBalanceOm->setCurrentIndex(c_standard);
Shinya Kitaoka 120a6e
    m_channelWidthOm->setCurrentIndex(c_8bit);
Shinya Kitaoka 120a6e
    m_threadsComboOm->setCurrentIndex(0);
Shinya Kitaoka 120a6e
    m_rasterGranularityOm->setCurrentIndex(0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_subcameraChk) m_subcameraChk->setCheckState(Qt::Unchecked);
shun-iwasawa 481b59
    m_linearColorSpaceChk->setCheckState(Qt::Unchecked);
shun-iwasawa 481b59
    m_colorSpaceGammaFld->setText(QString());
shun-iwasawa 481b59
    if (m_syncColorSettingsButton)
shun-iwasawa 481b59
      m_syncColorSettingsButton->setCheckState(Qt::Unchecked);
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRenderSettings renderSettings = prop->getRenderSettings();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!m_isPreviewSettings) {
Shinya Kitaoka 120a6e
    TFilePath path = prop->getPath();
Shinya Kitaoka 120a6e
    QString name   = QString::fromStdWString(path.getWideName());
Shinya Kitaoka 120a6e
    if (name.isEmpty())
Shinya Kitaoka 120a6e
      name = QString::fromStdString(scene->getScenePath().getName());
Shinya Kitaoka 120a6e
    m_saveInFileFld->setPath(toQString(path.getParentDir()));
Shinya Kitaoka 120a6e
    m_fileNameFld->setText(name);
Shinya Kitaoka 120a6e
    // RenderController::instance()->setMovieExt(path.getType());
Shinya Kitaoka 120a6e
    m_fileFormat->setCurrentIndex(
Shinya Kitaoka 120a6e
        m_fileFormat->findText(QString::fromStdString(path.getType())));
Shinya Kitaoka 120a6e
    m_multimediaOm->setCurrentIndex(prop->getMultimediaRendering());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
justburner 69bbaf
  // Refresh format if allow-multithread was toggled
justburner 69bbaf
  if (m_allowMT != Preferences::instance()->getFfmpegMultiThread()) {
justburner 69bbaf
    onFormatChanged(m_fileFormat->currentText());
justburner 69bbaf
  }
justburner 69bbaf
Shinya Kitaoka 120a6e
  // camera
Shinya Kitaoka 120a6e
  if (m_outputCameraOm) {
Shinya Kitaoka 120a6e
    m_outputCameraOm->blockSignals(true);
Shinya Kitaoka 120a6e
    m_outputCameraOm->clear();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TStageObjectTree *tree  = scene->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  int cameraCount         = tree->getCameraCount();
Shinya Kitaoka 120a6e
  TStageObjectId cameraId = m_isPreviewSettings
Shinya Kitaoka 120a6e
                                ? tree->getCurrentPreviewCameraId()
Shinya Kitaoka 120a6e
                                : tree->getCurrentCameraId();
Shinya Kitaoka 120a6e
  QStringList cameras;
Shinya Kitaoka 120a6e
  int tmpCameraId = 0;
Shinya Kitaoka 120a6e
  int index       = 0;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < cameraCount;) {
Shinya Kitaoka 120a6e
    /*-- Deleteされたカメラの場合tmpCameraIdだけIncrementする --*/
Shinya Kitaoka 120a6e
    if (!tree->getStageObject(TStageObjectId::CameraId(tmpCameraId), false)) {
Shinya Kitaoka 120a6e
      tmpCameraId++;
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    std::string name =
Shinya Kitaoka 120a6e
        tree->getStageObject(TStageObjectId::CameraId(tmpCameraId))->getName();
Shinya Kitaoka 120a6e
    cameras.append(QString::fromStdString(name));
Shinya Kitaoka 120a6e
    if (name == tree->getStageObject(cameraId)->getName()) index = i;
Shinya Kitaoka 120a6e
    i++;
Shinya Kitaoka 120a6e
    tmpCameraId++;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_outputCameraOm) {
Shinya Kitaoka 120a6e
    m_outputCameraOm->addItems(cameras);
Shinya Kitaoka 120a6e
    m_outputCameraOm->blockSignals(false);
Shinya Kitaoka 120a6e
    m_outputCameraOm->setCurrentIndex(index);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_subcameraChk)
Shinya Kitaoka 120a6e
    m_subcameraChk->setCheckState(prop->isSubcameraPreview() ? Qt::Checked
Shinya Kitaoka 120a6e
                                                             : Qt::Unchecked);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // start,end,step
Shinya Kitaoka 120a6e
  int r0 = 0, r1 = -1, step;
Shinya Kitaoka 120a6e
  prop->getRange(r0, r1, step);
Shinya Kitaoka 120a6e
  if (r0 > r1) {
shun-iwasawa f36064
    r0 = 0;
shun-iwasawa f36064
    r1 = scene->getFrameCount() - 1;
Shinya Kitaoka 120a6e
    if (r1 < 0) r1 = 0;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_startFld->setValue(r0 + 1);
Shinya Kitaoka 120a6e
  m_endFld->setValue(r1 + 1);
Shinya Kitaoka 120a6e
  m_stepFld->setValue(step);
Shinya Kitaoka 120a6e
  m_shrinkFld->setValue(renderSettings.m_shrinkX);
Shinya Kitaoka 120a6e
  if (m_applyShrinkChk)
Shinya Kitaoka 120a6e
    m_applyShrinkChk->setCheckState(
Shinya Kitaoka 120a6e
        renderSettings.m_applyShrinkToViewer ? Qt::Checked : Qt::Unchecked);
Shinya Kitaoka 120a6e
  // resample
shun-iwasawa 59726b
  m_resampleBalanceOm->setCurrentIndex(
shun-iwasawa 59726b
      (int)quality2index(renderSettings.m_quality));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // channel width
Shinya Kitaoka 120a6e
  switch (renderSettings.m_bpp) {
Shinya Kitaoka 120a6e
  case 64:
Shinya Kitaoka 120a6e
    m_channelWidthOm->setCurrentIndex(c_16bit);
Shinya Kitaoka 120a6e
    break;
shun-iwasawa 481b59
  case 128:
shun-iwasawa 481b59
    m_channelWidthOm->setCurrentIndex(c_32bit);
shun-iwasawa 481b59
    break;
Shinya Kitaoka 120a6e
  default:
Shinya Kitaoka 120a6e
    m_channelWidthOm->setCurrentIndex(c_8bit);
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
shun-iwasawa 481b59
  m_linearColorSpaceChk->setCheckState(
shun-iwasawa 481b59
      renderSettings.m_linearColorSpace ? Qt::Checked : Qt::Unchecked);
shun-iwasawa 481b59
  // currently bpp should be 128 when the linearColorSpace is ON
shun-iwasawa 481b59
  m_channelWidthOm->setDisabled(renderSettings.m_linearColorSpace &&
shun-iwasawa 481b59
                                renderSettings.m_bpp == 128);
shun-iwasawa 481b59
shun-iwasawa 481b59
  m_colorSpaceGammaFld->setValue(renderSettings.m_colorSpaceGamma);
shun-iwasawa 481b59
shun-iwasawa 481b59
  if (m_isPreviewSettings && m_syncColorSettingsButton) {
shun-iwasawa 481b59
    m_syncColorSettingsButton->setChecked(
shun-iwasawa 481b59
        getProperties()->isColorSettingsSynced());
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
  // Threads
Shinya Kitaoka 120a6e
  m_threadsComboOm->setCurrentIndex(prop->getThreadIndex());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Raster granularity
Shinya Kitaoka 120a6e
  m_rasterGranularityOm->setCurrentIndex(prop->getMaxTileSizeIndex());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_isPreviewSettings) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_doStereoscopy->setChecked(renderSettings.m_stereoscopic);
Shinya Kitaoka 120a6e
  m_stereoShift->setValue(renderSettings.m_stereoscopicShift);
Shinya Kitaoka 120a6e
  m_stereoShift->setEnabled(renderSettings.m_stereoscopic);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // gamma
Shinya Kitaoka 120a6e
  m_gammaFld->setValue(renderSettings.m_gamma);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // dominant field
Shinya Kitaoka 120a6e
  switch (renderSettings.m_fieldPrevalence) {
Shinya Kitaoka 120a6e
  case TRenderSettings::OddField:
Shinya Kitaoka 120a6e
    m_dominantFieldOm->setCurrentIndex(c_odd);
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case TRenderSettings::EvenField:
Shinya Kitaoka 120a6e
    m_dominantFieldOm->setCurrentIndex(c_even);
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case TRenderSettings::NoField:
Shinya Kitaoka 120a6e
  default:
Shinya Kitaoka 120a6e
    m_dominantFieldOm->setCurrentIndex(c_none);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_dominantFieldOm->setEnabled(!renderSettings.m_stereoscopic);
Shinya Kitaoka 120a6e
  // time stretch
Shinya Kitaoka 120a6e
  m_stretchFromFld->setValue(renderSettings.m_timeStretchFrom);
Shinya Kitaoka 120a6e
  m_stretchToFld->setValue(renderSettings.m_timeStretchTo);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_frameRateFld->setValue(prop->getFrameRate());
shun-iwasawa cd4694
shun-iwasawa cd4694
  // clapperboard
shun-iwasawa cd4694
  BoardSettings *boardSettings = prop->getBoardSettings();
shun-iwasawa cd4694
  m_addBoard->setChecked(boardSettings->isActive());
shun-iwasawa cd4694
  // clapperboard is only available with movie formats
shun-iwasawa cd4694
  if (isMovieType(m_fileFormat->currentText().toStdString())) {
shun-iwasawa cd4694
    m_addBoard->setEnabled(true);
shun-iwasawa cd4694
    m_boardSettingsBtn->setEnabled(m_addBoard->isChecked());
shun-iwasawa cd4694
  } else {
shun-iwasawa cd4694
    m_addBoard->setEnabled(false);
shun-iwasawa cd4694
    m_boardSettingsBtn->setEnabled(false);
shun-iwasawa cd4694
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output path to new path modified in popup field.
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onPathChanged() {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QString text = m_saveInFileFld->getPath();
Shinya Kitaoka 120a6e
  TFilePath newFp(text.toStdWString());
Shinya Kitaoka 120a6e
  newFp = TApp::instance()->getCurrentScene()->getScene()->codeFilePath(newFp);
Shinya Kitaoka 120a6e
  m_saveInFileFld->setPath(QString::fromStdWString(newFp.getWideString()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  TFilePath fp            = prop->getPath();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (fp == newFp) return;
Shinya Kitaoka 120a6e
  fp = fp.withParentDir(newFp);
Shinya Kitaoka 120a6e
  prop->setPath(fp);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output name to new name modified in popup field.
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onNameChanged() {
Shinya Kitaoka 120a6e
  ToonzScene *scene = getCurrentScene();
Shinya Kitaoka 120a6e
  if (!scene) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QString name = m_fileNameFld->text();
Shinya Kitaoka 120a6e
  if (!isValidFileName(name)) {
Shinya Kitaoka 120a6e
    DVGui::error(
Shinya Kitaoka 120a6e
        "A filename cannot be empty or contain any of the following "
Shinya Kitaoka 120a6e
        "characters:\n \\ / : * ? \" < > |");
Shinya Kitaoka 120a6e
    TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
    TFilePath fp            = prop->getPath();
Shinya Kitaoka 120a6e
    QString name            = QString::fromStdString(fp.getName());
Shinya Kitaoka 120a6e
    if (name.isEmpty())
Shinya Kitaoka 120a6e
      name = QString::fromStdString(scene->getScenePath().getName());
Shinya Kitaoka 120a6e
    m_fileNameFld->setText(name);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
manongjohn 7f3150
  if (isReservedFileName_message(name)) {
manongjohn 7f3150
    TOutputProperties *prop = getProperties();
Kite 521c84
    TFilePath fp            = prop->getPath();
Kite 521c84
    QString name            = QString::fromStdString(fp.getName());
manongjohn 7f3150
    if (name.isEmpty())
manongjohn 7f3150
      name = QString::fromStdString(scene->getScenePath().getName());
manongjohn 7f3150
    m_fileNameFld->setText(name);
manongjohn 7f3150
manongjohn 7f3150
    return;
manongjohn 7f3150
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::wstring wname = name.toStdWString();
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    // It could be possible that users add an extension to the level name.
Shinya Kitaoka 120a6e
    // This is not supported, and the extension must be removed.
Shinya Kitaoka 120a6e
    // Observe that leaving wname as is WOULD be a bug (see Bugzilla #6578).
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    const std::wstring &actualWName = TFilePath(wname).getWideName();
Shinya Kitaoka 120a6e
    if (wname != actualWName) {
Shinya Kitaoka 120a6e
      wname = actualWName;
Shinya Kitaoka 120a6e
      m_fileNameFld->setText(QString::fromStdWString(wname));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // In case the output level name is reverted back to the scene name, we assume
Shinya Kitaoka 120a6e
  // that
Shinya Kitaoka 120a6e
  // a "Save Scene As..." command should move the value to the *new* scene name
Shinya Kitaoka 120a6e
  if (wname == scene->getScenePath().getWideName())
Shinya Kitaoka 120a6e
    wname = std::wstring();  // An empty name is redirected to the scene name
Shinya Kitaoka 120a6e
  // directly by the render procedure, let's use this!
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  TFilePath fp            = prop->getPath();
Shinya Kitaoka 120a6e
shun-iwasawa 694080
  TFilePath newFp = fp.withName(wname);
shun-iwasawa 694080
  if (newFp == fp) return;  // Already had the right name
Shinya Kitaoka 120a6e
shun-iwasawa 694080
  prop->setPath(newFp);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output format to new format set in popup field.
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onFormatChanged(const QString &str) {
justburner 69bbaf
  auto isMultiRenderInvalid = [](std::string ext, bool allowMT) -> bool {
justburner 69bbaf
    return (!allowMT && (ext == "mp4" || ext == "gif" || ext == "webm")) ||
shun-iwasawa 24c6ea
           ext == "spritesheet";
shun-iwasawa 24c6ea
  };
shun-iwasawa 24c6ea
shun-iwasawa fc0d80
  TOutputProperties *prop = getProperties();
justburner 69bbaf
  bool wasMultiRenderInvalid =
justburner 69bbaf
      isMultiRenderInvalid(prop->getPath().getType(), m_allowMT);
shun-iwasawa 694080
  // remove sepchar, ..
shun-iwasawa 694080
  TFilePath fp = prop->getPath().withNoFrame().withType(str.toStdString());
shun-iwasawa 694080
  // .. then add sepchar for sequencial image formats
shun-iwasawa 694080
  if (checkForSeqNum(str)) fp = fp.withFrame(prop->formatTemplateFId());
shun-iwasawa 694080
shun-iwasawa 41f8d2
  if (prop->getPath() != fp) {
shun-iwasawa 41f8d2
    prop->setPath(fp);
shun-iwasawa 41f8d2
    TApp::instance()->getCurrentScene()->setDirtyFlag(true);
shun-iwasawa 41f8d2
  }
justburner 69bbaf
  m_allowMT = Preferences::instance()->getFfmpegMultiThread();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
justburner 69bbaf
  if (isMultiRenderInvalid(str.toStdString(), m_allowMT)) {
turtletooth 04d8fd
    m_threadsComboOm->setDisabled(true);
turtletooth 04d8fd
    m_threadsComboOm->setCurrentIndex(0);
turtletooth 04d8fd
  } else {
turtletooth 04d8fd
    m_threadsComboOm->setDisabled(false);
shun-iwasawa 24c6ea
    if (wasMultiRenderInvalid) m_threadsComboOm->setCurrentIndex(2);
turtletooth 04d8fd
  }
shun-iwasawa cd4694
shun-iwasawa cd4694
  // clapperboard is only available with movie formats
shun-iwasawa cd4694
  if (isMovieType(str.toStdString())) {
shun-iwasawa cd4694
    m_addBoard->setEnabled(true);
shun-iwasawa cd4694
    m_boardSettingsBtn->setEnabled(m_addBoard->isChecked());
shun-iwasawa cd4694
  } else {
shun-iwasawa cd4694
    m_addBoard->setEnabled(false);
shun-iwasawa cd4694
    m_boardSettingsBtn->setEnabled(false);
shun-iwasawa cd4694
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Open a popup output format settings popup to set current output format
Shinya Kitaoka 120a6e
                settings.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void OutputSettingsPopup::openSettingsPopup() {
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  std::string ext         = prop->getPath().getType();
shun-iwasawa fc0d80
shun-iwasawa fc0d80
  TFrameId oldTmplFId = prop->formatTemplateFId();
shun-iwasawa fc0d80
shun-iwasawa fc0d80
  bool ret =
shun-iwasawa fc0d80
      openFormatSettingsPopup(this, ext, prop->getFileFormatProperties(ext),
shun-iwasawa fc0d80
                              &prop->formatTemplateFId(), false);
shun-iwasawa fc0d80
shun-iwasawa fc0d80
  if (!ret) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
shun-iwasawa fc0d80
shun-iwasawa fc0d80
  if (oldTmplFId.getZeroPadding() !=
shun-iwasawa fc0d80
          prop->formatTemplateFId().getZeroPadding() ||
shun-iwasawa fc0d80
      oldTmplFId.getStartSeqInd() !=
shun-iwasawa fc0d80
          prop->formatTemplateFId().getStartSeqInd()) {
shun-iwasawa fc0d80
    TFilePath fp =
shun-iwasawa fc0d80
        prop->getPath().withNoFrame().withFrame(prop->formatTemplateFId());
shun-iwasawa fc0d80
    prop->setPath(fp);
shun-iwasawa fc0d80
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output camera to camera set in popup field.
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onCameraChanged(const QString &str) {
Shinya Kitaoka 120a6e
  ToonzScene *scene = getCurrentScene();
Shinya Kitaoka 120a6e
  if (!scene) return;
Shinya Kitaoka 120a6e
  TStageObjectTree *tree = scene->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  int cameraCount        = tree->getCameraCount();
Shinya Kitaoka 120a6e
  /*-- 注:CameraCountはDeleteされたCameraは入らないがIndexは欠番になる。
Shinya Kitaoka 120a6e
          ので、CameraCountとIndexの最大値は必ずしも一致しない
Shinya Kitaoka 120a6e
  --*/
Shinya Kitaoka 120a6e
  int tmpCameraId = 0;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < cameraCount;) {
Shinya Kitaoka 120a6e
    if (!tree->getStageObject(TStageObjectId::CameraId(tmpCameraId), false)) {
Shinya Kitaoka 120a6e
      tmpCameraId++;
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    std::string name =
Shinya Kitaoka 120a6e
        tree->getStageObject(TStageObjectId::CameraId(tmpCameraId))->getName();
Shinya Kitaoka 120a6e
    if (name == str.toStdString()) break;
Shinya Kitaoka 120a6e
    tmpCameraId++;
Shinya Kitaoka 120a6e
    i++;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (i >= cameraCount) return;
Shinya Kitaoka 120a6e
  TApp *app                      = TApp::instance();
Shinya Kitaoka 120a6e
  TStageObjectId cameraId        = TStageObjectId::CameraId(i);
Shinya Kitaoka 120a6e
  TStageObjectId currentCameraId = m_isPreviewSettings
Shinya Kitaoka 120a6e
                                       ? tree->getCurrentPreviewCameraId()
Shinya Kitaoka 120a6e
                                       : tree->getCurrentCameraId();
Shinya Kitaoka 120a6e
  if (currentCameraId != cameraId) {
Shinya Kitaoka 120a6e
    TXsheetHandle *xsheetHandle = app->getCurrentXsheet();
Shinya Kitaoka 120a6e
    disconnect(xsheetHandle, SIGNAL(xsheetChanged()), this,
Shinya Kitaoka 120a6e
               SLOT(updateField()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_isPreviewSettings)
Shinya Kitaoka 120a6e
      tree->setCurrentPreviewCameraId(cameraId);
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      tree->setCurrentCameraId(cameraId);
Shinya Kitaoka 120a6e
    app->getCurrentScene()->setDirtyFlag(true);
Shinya Kitaoka 120a6e
    xsheetHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    connect(xsheetHandle, SIGNAL(xsheetChanged()), this, SLOT(updateField()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output frame values: start frame, end frame, step and
Shinya Kitaoka 120a6e
                shrink, to current field values.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onStereoChecked(int) {
Shinya Kitaoka 120a6e
  m_stereoShift->setEnabled(m_doStereoscopy->isChecked());
Shinya Kitaoka 120a6e
  if (m_dominantFieldOm)
Shinya Kitaoka 120a6e
    m_dominantFieldOm->setEnabled(!m_doStereoscopy->isChecked());
Shinya Kitaoka 120a6e
  onStereoChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onStereoChanged() {
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  TRenderSettings rs      = prop->getRenderSettings();
Shinya Kitaoka 120a6e
  rs.m_stereoscopic       = m_doStereoscopy->isChecked();
Shinya Kitaoka 120a6e
  rs.m_stereoscopicShift  = m_stereoShift->getValue();
Shinya Kitaoka 120a6e
  prop->setRenderSettings(rs);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
void OutputSettingsPopup::onSyncColorSettingsChecked(int state) {
shun-iwasawa 481b59
  assert(m_isPreviewSettings);
shun-iwasawa 481b59
  bool doSync = (state == Qt::Checked);
shun-iwasawa 481b59
  m_colorBox->setDisabled(doSync);
shun-iwasawa 481b59
  getProperties()->syncColorSettings(doSync);
shun-iwasawa 481b59
  // take values from the output settings
shun-iwasawa 481b59
  if (doSync) {
shun-iwasawa 481b59
    TRenderSettings out_rs = getCurrentScene()
shun-iwasawa 481b59
                                 ->getProperties()
shun-iwasawa 481b59
                                 ->getOutputProperties()
shun-iwasawa 481b59
                                 ->getRenderSettings();
shun-iwasawa 481b59
    TRenderSettings rs    = getProperties()->getRenderSettings();
shun-iwasawa 481b59
    rs.m_bpp              = out_rs.m_bpp;
shun-iwasawa 481b59
    rs.m_linearColorSpace = out_rs.m_linearColorSpace;
shun-iwasawa 481b59
    rs.m_colorSpaceGamma  = out_rs.m_colorSpaceGamma;
shun-iwasawa 481b59
    getProperties()->setRenderSettings(rs);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
  // dirty flag will be set here
shun-iwasawa 481b59
  TApp::instance()->getCurrentScene()->notifySceneChanged();
shun-iwasawa 481b59
}
shun-iwasawa 481b59
shun-iwasawa 481b59
//----------------------------------------------
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onFrameFldEditFinished() {
Shinya Kitaoka 120a6e
  ToonzScene *scene = getCurrentScene();
Shinya Kitaoka 120a6e
  if (!scene) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int maxR0  = std::max(0, scene->getFrameCount() - 1);
Shinya Kitaoka 120a6e
  int r0     = (int)m_startFld->getValue() - 1;
Shinya Kitaoka 120a6e
  int r1     = (int)m_endFld->getValue() - 1;
Shinya Kitaoka 120a6e
  int step   = (int)m_stepFld->getValue();
Shinya Kitaoka 120a6e
  int shrink = (int)m_shrinkFld->getValue();
Shinya Kitaoka 120a6e
shun-iwasawa 41f8d2
  bool error            = false;
shun-iwasawa 41f8d2
  bool somethingChanged = false;
shun-iwasawa 41f8d2
Shinya Kitaoka 120a6e
  if (r0 < 0) {
Shinya Kitaoka 120a6e
    error = true;
Shinya Kitaoka 120a6e
    r0    = 0;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (r0 > maxR0) {
Shinya Kitaoka 120a6e
    error = true;
Shinya Kitaoka 120a6e
    r0    = maxR0;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (r1 < r0) {
Shinya Kitaoka 120a6e
    error = true;
Shinya Kitaoka 120a6e
    r1    = r0;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (r1 > maxR0) {
Shinya Kitaoka 120a6e
    error = true;
Shinya Kitaoka 120a6e
    r1    = maxR0;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (error) {
Shinya Kitaoka 120a6e
    m_startFld->setValue(r0 + 1);
Shinya Kitaoka 120a6e
    m_endFld->setValue(r1 + 1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (step < 1) {
Shinya Kitaoka 120a6e
    step = 1;
Shinya Kitaoka 120a6e
    m_stepFld->setValue(step);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (shrink < 1) {
Shinya Kitaoka 120a6e
    shrink = 1;
Shinya Kitaoka 120a6e
    m_shrinkFld->setValue(shrink);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (r0 == 0 && r1 == maxR0) {
Shinya Kitaoka 120a6e
    r0 = 0;
Shinya Kitaoka 120a6e
    r1 = -1;
Shinya Kitaoka 120a6e
  }
shun-iwasawa 41f8d2
  int oldR0, oldR1, oldStep;
shun-iwasawa 41f8d2
  prop->getRange(oldR0, oldR1, oldStep);
shun-iwasawa 41f8d2
  if (r0 != oldR0 || r1 != oldR1 || step != oldStep) {
shun-iwasawa 41f8d2
    prop->setRange(r0, r1, step);
shun-iwasawa 41f8d2
    somethingChanged = true;
shun-iwasawa 41f8d2
  }
shun-iwasawa 41f8d2
  TRenderSettings rs   = prop->getRenderSettings();
shun-iwasawa 41f8d2
  int oldShrink        = rs.m_shrinkX;
shun-iwasawa 41f8d2
  bool old_applyShrink = rs.m_applyShrinkToViewer;
shun-iwasawa 41f8d2
Shinya Kitaoka 120a6e
  rs.m_shrinkX = rs.m_shrinkY = shrink;
Shinya Kitaoka 120a6e
  rs.m_applyShrinkToViewer =
Shinya Kitaoka 120a6e
      m_applyShrinkChk ? m_applyShrinkChk->checkState() == Qt::Checked : false;
Shinya Kitaoka 120a6e
shun-iwasawa 41f8d2
  if (rs.m_shrinkX != oldShrink ||
shun-iwasawa 41f8d2
      rs.m_applyShrinkToViewer != old_applyShrink) {
shun-iwasawa 41f8d2
    prop->setRenderSettings(rs);
shun-iwasawa 41f8d2
    somethingChanged = true;
shun-iwasawa 41f8d2
  }
Shinya Kitaoka 120a6e
shun-iwasawa 41f8d2
  if (somethingChanged) TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output resample balance to balance identified by \b type
Shinya Kitaoka 120a6e
                index in popup QComboBox.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onResampleChanged(int type) {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
shun-iwasawa 41f8d2
  TOutputProperties *prop                      = getProperties();
shun-iwasawa 41f8d2
  TRenderSettings rs                           = prop->getRenderSettings();
shun-iwasawa 41f8d2
  TRenderSettings::ResampleQuality old_quality = rs.m_quality;
shun-iwasawa 59726b
  rs.m_quality = resampleInfoMap[(ResampleOption)type].quality;
shun-iwasawa 41f8d2
  if (rs.m_quality == old_quality) return;
Shinya Kitaoka 120a6e
  prop->setRenderSettings(rs);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output channel width to value identified by \b type
Shinya Kitaoka 120a6e
                index in popup QComboBox.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onChannelWidthChanged(int type) {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  TRenderSettings rs      = prop->getRenderSettings();
shun-iwasawa 41f8d2
  int old_bpp             = rs.m_bpp;
Shinya Kitaoka 120a6e
  if (type == c_8bit)
Shinya Kitaoka 120a6e
    rs.m_bpp = 32;
shun-iwasawa 481b59
  else if (type == c_16bit)
Shinya Kitaoka 120a6e
    rs.m_bpp = 64;
shun-iwasawa 481b59
  else
shun-iwasawa 481b59
    rs.m_bpp = 128;
shun-iwasawa 481b59
shun-iwasawa 41f8d2
  if (rs.m_bpp == old_bpp) return;
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
  prop->setRenderSettings(rs);
shun-iwasawa 481b59
shun-iwasawa 481b59
  // sync output settings value to the preview settings
shun-iwasawa 481b59
  if (!m_isPreviewSettings && getCurrentScene()
shun-iwasawa 481b59
                                  ->getProperties()
shun-iwasawa 481b59
                                  ->getPreviewProperties()
shun-iwasawa 481b59
                                  ->isColorSettingsSynced()) {
shun-iwasawa 481b59
    TRenderSettings prev_rs = getCurrentScene()
shun-iwasawa 481b59
                                  ->getProperties()
shun-iwasawa 481b59
                                  ->getPreviewProperties()
shun-iwasawa 481b59
                                  ->getRenderSettings();
shun-iwasawa 481b59
    prev_rs.m_bpp = rs.m_bpp;
shun-iwasawa 481b59
    getCurrentScene()
shun-iwasawa 481b59
        ->getProperties()
shun-iwasawa 481b59
        ->getPreviewProperties()
shun-iwasawa 481b59
        ->setRenderSettings(prev_rs);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
shun-iwasawa 481b59
  // dirty flag will be set here
shun-iwasawa 481b59
  TApp::instance()->getCurrentScene()->notifySceneChanged();
shun-iwasawa 481b59
}
shun-iwasawa 481b59
//-----------------------------------------------------------------------------
shun-iwasawa 481b59
shun-iwasawa 481b59
void OutputSettingsPopup::onLinearColorSpaceChecked(int state) {
shun-iwasawa 481b59
  if (!getCurrentScene()) return;
shun-iwasawa 481b59
  TOutputProperties *prop = getProperties();
shun-iwasawa 481b59
  TRenderSettings rs      = prop->getRenderSettings();
shun-iwasawa 481b59
  rs.m_linearColorSpace   = (state == Qt::Checked);
shun-iwasawa 481b59
  // force floating point when compute in linear color space
shun-iwasawa 481b59
  if (rs.m_linearColorSpace) {
shun-iwasawa 481b59
    prop->setNonlinearBpp(rs.m_bpp);
shun-iwasawa 481b59
    rs.m_bpp = 128;
shun-iwasawa 481b59
  } else
shun-iwasawa 481b59
    rs.m_bpp = prop->getNonlinearBpp();
shun-iwasawa 481b59
  prop->setRenderSettings(rs);
shun-iwasawa 481b59
shun-iwasawa 481b59
  // sync output settings value to the preview settings
shun-iwasawa 481b59
  TOutputProperties *prev_prop =
shun-iwasawa 481b59
      getCurrentScene()->getProperties()->getPreviewProperties();
shun-iwasawa 481b59
  if (!m_isPreviewSettings && prev_prop->isColorSettingsSynced()) {
shun-iwasawa 481b59
    TRenderSettings prev_rs    = prev_prop->getRenderSettings();
shun-iwasawa 481b59
    prev_rs.m_linearColorSpace = (state == Qt::Checked);
shun-iwasawa 481b59
    if (prev_rs.m_linearColorSpace) {
shun-iwasawa 481b59
      prev_prop->setNonlinearBpp(prev_rs.m_bpp);
shun-iwasawa 481b59
      prev_rs.m_bpp = 128;
shun-iwasawa 481b59
    } else
shun-iwasawa 481b59
      prev_rs.m_bpp = prev_prop->getNonlinearBpp();
shun-iwasawa 481b59
    getCurrentScene()
shun-iwasawa 481b59
        ->getProperties()
shun-iwasawa 481b59
        ->getPreviewProperties()
shun-iwasawa 481b59
        ->setRenderSettings(prev_rs);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa 481b59
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
shun-iwasawa 481b59
  // dirty flag will be set here
shun-iwasawa 481b59
  TApp::instance()->getCurrentScene()->notifySceneChanged();
shun-iwasawa 481b59
}
shun-iwasawa 481b59
shun-iwasawa 481b59
//-----------------------------------------------------------------------------
shun-iwasawa 481b59
shun-iwasawa 481b59
void OutputSettingsPopup::onColorSpaceGammaEdited() {
shun-iwasawa 481b59
  if (!getCurrentScene()) return;
shun-iwasawa 481b59
  TOutputProperties *prop = getProperties();
shun-iwasawa 481b59
  TRenderSettings rs      = prop->getRenderSettings();
shun-iwasawa 481b59
shun-iwasawa 481b59
  double colorSpaceGamma = m_colorSpaceGammaFld->getValue();
shun-iwasawa 481b59
shun-iwasawa 481b59
  rs.m_colorSpaceGamma = colorSpaceGamma;
shun-iwasawa 481b59
  prop->setRenderSettings(rs);
shun-iwasawa 481b59
shun-iwasawa 481b59
  // sync output settings value to the preview settings
shun-iwasawa 481b59
  if (!m_isPreviewSettings && getCurrentScene()
shun-iwasawa 481b59
                                  ->getProperties()
shun-iwasawa 481b59
                                  ->getPreviewProperties()
shun-iwasawa 481b59
                                  ->isColorSettingsSynced()) {
shun-iwasawa 481b59
    TRenderSettings prev_rs = getCurrentScene()
shun-iwasawa 481b59
                                  ->getProperties()
shun-iwasawa 481b59
                                  ->getPreviewProperties()
shun-iwasawa 481b59
                                  ->getRenderSettings();
shun-iwasawa 481b59
    prev_rs.m_colorSpaceGamma = colorSpaceGamma;
shun-iwasawa 481b59
    getCurrentScene()
shun-iwasawa 481b59
        ->getProperties()
shun-iwasawa 481b59
        ->getPreviewProperties()
shun-iwasawa 481b59
        ->setRenderSettings(prev_rs);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa 481b59
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
shun-iwasawa 481b59
  // dirty flag will be set here
shun-iwasawa 481b59
  TApp::instance()->getCurrentScene()->notifySceneChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output gamma value to current value in popup gamma field.
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onGammaFldEditFinished() {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double gamma = m_gammaFld->getValue();
Shinya Kitaoka 120a6e
  m_gammaFld->setCursorPosition(0);
Shinya Kitaoka 120a6e
  if (gamma <= 0) {
Shinya Kitaoka 120a6e
    gamma = 0.001;
Shinya Kitaoka 120a6e
    m_gammaFld->setValue(gamma);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TRenderSettings rs = prop->getRenderSettings();
shun-iwasawa 41f8d2
  if (rs.m_gamma == gamma) return;
shun-iwasawa 41f8d2
  rs.m_gamma = gamma;
Shinya Kitaoka 120a6e
  prop->setRenderSettings(rs);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current scene output dominant field to value identified by \b type
Shinya Kitaoka 120a6e
                index in popup QComboBox. If time stretch velue from-to are
Shinya Kitaoka 120a6e
   different
Shinya Kitaoka 120a6e
                and dominant field is different from none show a message error.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onDominantFieldChanged(int type) {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  TRenderSettings rs      = prop->getRenderSettings();
shun-iwasawa 41f8d2
  TRenderSettings::FieldPrevalence oldFieldPrevalence = rs.m_fieldPrevalence;
Shinya Kitaoka 120a6e
  if (type != c_none &&
Shinya Kitaoka 120a6e
      m_stretchFromFld->getValue() != m_stretchToFld->getValue()) {
Shinya Kitaoka 120a6e
    DVGui::error("Can't apply field rendering in a time stretched scene");
Shinya Kitaoka 120a6e
    rs.m_fieldPrevalence = TRenderSettings::NoField;
Shinya Kitaoka 120a6e
    m_dominantFieldOm->setCurrentIndex(c_none);
Shinya Kitaoka 120a6e
  } else if (type == c_odd)
Shinya Kitaoka 120a6e
    rs.m_fieldPrevalence = TRenderSettings::OddField;
Shinya Kitaoka 120a6e
  else if (type == c_even)
Shinya Kitaoka 120a6e
    rs.m_fieldPrevalence = TRenderSettings::EvenField;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    rs.m_fieldPrevalence = TRenderSettings::NoField;
Shinya Kitaoka 120a6e
  m_doStereoscopy->setEnabled(rs.m_fieldPrevalence == TRenderSettings::NoField);
Shinya Kitaoka 120a6e
  m_stereoShift->setEnabled(rs.m_fieldPrevalence == TRenderSettings::NoField);
shun-iwasawa 41f8d2
  if (rs.m_fieldPrevalence == oldFieldPrevalence) return;
Shinya Kitaoka 120a6e
  prop->setRenderSettings(rs);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If dominant field is different from none set time stretch field values to
Shinya Kitaoka 120a6e
                current scene output time stretch values; otherwise set current
Shinya Kitaoka 120a6e
   scene
Shinya Kitaoka 120a6e
                output time stretch values to current field values.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onStretchFldEditFinished() {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  TRenderSettings rs      = prop->getRenderSettings();
Shinya Kitaoka 120a6e
  if (m_dominantFieldOm->currentIndex() != c_none) {
Shinya Kitaoka 120a6e
    DVGui::error("Can't stretch time in a field rendered scene\n");
Shinya Kitaoka 120a6e
    m_stretchFromFld->setValue(rs.m_timeStretchFrom);
Shinya Kitaoka 120a6e
    m_stretchToFld->setValue(rs.m_timeStretchTo);
shun-iwasawa 41f8d2
    return;
shun-iwasawa 41f8d2
  } else if (rs.m_timeStretchFrom == m_stretchFromFld->getValue() &&
shun-iwasawa 41f8d2
             rs.m_timeStretchTo == m_stretchToFld->getValue()) {
shun-iwasawa 41f8d2
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
shun-iwasawa 41f8d2
  rs.m_timeStretchFrom = m_stretchFromFld->getValue();
shun-iwasawa 41f8d2
  rs.m_timeStretchTo   = m_stretchToFld->getValue();
shun-iwasawa 41f8d2
  prop->setRenderSettings(rs);
shun-iwasawa 41f8d2
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onMultimediaChanged(int state) {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
shun-iwasawa 41f8d2
  if (prop->getMultimediaRendering() == state) return;
Shinya Kitaoka 120a6e
  prop->setMultimediaRendering(state);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onThreadsComboChanged(int type) {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
shun-iwasawa 41f8d2
  if (prop->getThreadIndex() == type) return;
Shinya Kitaoka 120a6e
  prop->setThreadIndex(type);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onRasterGranularityChanged(int type) {
Shinya Kitaoka 120a6e
  if (!getCurrentScene()) return;
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
shun-iwasawa 41f8d2
  if (prop->getMaxTileSizeIndex() == type) return;
Shinya Kitaoka 120a6e
  prop->setMaxTileSizeIndex(type);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! OutputSettingsのPreset登録
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onAddPresetButtonPressed() {
Shinya Kitaoka 120a6e
  //*-- プリセット名を取得 --*/
Shinya Kitaoka 120a6e
  bool ok;
Shinya Kitaoka 120a6e
  QString qs = DVGui::getText(
Shinya Kitaoka 120a6e
      tr("Add preset"), tr("Enter the name for the output settings preset."),
Shinya Kitaoka 120a6e
      "", &ok);
Shinya Kitaoka 120a6e
  if (!ok || qs.isEmpty()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!qs.endsWith(".txt")) qs.append(".txt");
Shinya Kitaoka 120a6e
  TFilePath fp = TEnv::getConfigDir() + "outputpresets";
Shinya Kitaoka 120a6e
  if (!TFileStatus(fp).doesExist()) TSystem::mkDir(fp);
Shinya Kitaoka 120a6e
  fp = fp + qs.toStdString();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- すでに存在する場合、上書きを確認 --*/
Shinya Kitaoka 120a6e
  if (TFileStatus(fp).doesExist()) {
Shinya Kitaoka 120a6e
    int ret = QMessageBox::question(
Shinya Kitaoka 120a6e
        this, tr("Add output settings preset"),
Shinya Kitaoka 120a6e
        QString("The file %1 does already exist.\nDo you want to overwrite it?")
Shinya Kitaoka 120a6e
            .arg(qs),
Shinya Kitaoka 120a6e
        QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Save);
Shinya Kitaoka 120a6e
    if (ret == QMessageBox::Cancel) return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TSystem::touchFile(fp);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TOStream os(fp, false);
Shinya Kitaoka 120a6e
  if (!os.checkStatus()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  os.openChild("outputsettingspreset");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- カメラ設定 --*/
Shinya Kitaoka 120a6e
  os.openChild("camera");
Shinya Kitaoka 120a6e
  TXsheet *xsheet         = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
  TStageObjectId cameraId = xsheet->getStageObjectTree()->getCurrentCameraId();
Shinya Kitaoka 120a6e
  TCamera *camera         = xsheet->getStageObject(cameraId)->getCamera();
Shinya Kitaoka 120a6e
  camera->saveData(os);
Shinya Kitaoka 120a6e
  os.closeChild();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*--  Saveinのプロジェクトフォルダ部分 --*/
Shinya Kitaoka 120a6e
  QString saveInPath = m_saveInFileFld->getPath();
Shinya Kitaoka 120a6e
  if (saveInPath.startsWith("+")) {
Shinya Kitaoka 120a6e
    QString projectFolderName = (saveInPath.contains("\\"))
Shinya Kitaoka 120a6e
                                    ? saveInPath.left(saveInPath.indexOf("\\"))
Shinya Kitaoka 120a6e
                                    : saveInPath;
Shinya Kitaoka 120a6e
    os.child("savein_projectfolder") << projectFolderName.toStdString();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- ファイル形式 --*/
Shinya Kitaoka 120a6e
  QString format = m_fileFormat->currentText();
Shinya Kitaoka 120a6e
  os.child("format") << format.toStdString();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- ファイルオプション --*/
Shinya Kitaoka 120a6e
  os.openChild("formatsProperties");
Shinya Kitaoka 120a6e
  std::vector<std::string> fileExtensions;</std::string>
Shinya Kitaoka 120a6e
  prop->getFileFormatPropertiesExtensions(fileExtensions);
Shinya Kitaoka 120a6e
  for (int i = 0; i < (int)fileExtensions.size(); i++) {
Shinya Kitaoka 120a6e
    std::string ext    = fileExtensions[i];
Shinya Kitaoka 120a6e
    TPropertyGroup *pg = prop->getFileFormatProperties(ext);
Shinya Kitaoka 120a6e
    assert(pg);
Shinya Kitaoka 120a6e
    std::map<std::string, std::string=""> attr;</std::string,>
Shinya Kitaoka 120a6e
    attr["ext"] = ext;
Shinya Kitaoka 120a6e
    os.openChild("formatProperties", attr);
Shinya Kitaoka 120a6e
    pg->saveData(os);
Shinya Kitaoka 120a6e
    os.closeChild();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  os.closeChild();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Resample Balance
shun-iwasawa 59726b
  QString resq =
shun-iwasawa 59726b
      resampleInfoMap[(ResampleOption)m_resampleBalanceOm->currentIndex()]
shun-iwasawa 59726b
          .idString;
Shinya Kitaoka 120a6e
  os.child("resquality") << resq.toStdString();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Channel Width
shun-iwasawa 59726b
  QString chanw = m_channelWidthOm->currentData().toString();
Shinya Kitaoka 120a6e
  os.child("bpp") << chanw.toStdString();
shun-iwasawa 481b59
  // Linear Color Space & Color Space Gamma
shun-iwasawa 481b59
  std::string linearStr = (m_linearColorSpaceChk->isChecked()) ? "1" : "0";
shun-iwasawa 481b59
  os.child("linearColorSpace") << linearStr;
shun-iwasawa 481b59
  os.child("colorSpaceGamma") << m_colorSpaceGammaFld->text().toStdString();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // 140503 iwasawa Frame Rate (Scene Settings)
Shinya Kitaoka 120a6e
  os.child("frameRate") << m_frameRateFld->text().toStdString();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // 140325 iwasawa stretch FPS
Shinya Kitaoka 120a6e
  os.child("stretchFrom") << m_stretchFromFld->text().toStdString();
Shinya Kitaoka 120a6e
  os.child("stretchTo") << m_stretchToFld->text().toStdString();
Shinya Kitaoka 120a6e
  // 140325 iwasawa gamma
Shinya Kitaoka 120a6e
  os.child("gamma") << m_gammaFld->text().toStdString();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  os.closeChild();  // outputsettingspreset
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_presetCombo->blockSignals(true);
Shinya Kitaoka 120a6e
  updatePresetComboItems();
Shinya Kitaoka 120a6e
  m_presetCombo->setCurrentIndex(
Shinya Kitaoka 120a6e
      m_presetCombo->findText(QString::fromStdString(fp.getName())));
Shinya Kitaoka 120a6e
  m_presetCombo->blockSignals(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! プリセットフォルダを調べ、コンボボックスにアイテムを格納する
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::updatePresetComboItems() {
Shinya Kitaoka 120a6e
  m_presetCombo->clear();
Shinya Kitaoka 120a6e
  m_presetCombo->addItem(tr("<custom>"));</custom>
Shinya Kitaoka 120a6e
  TFilePath folder = TEnv::getConfigDir() + "outputpresets";
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFileStatus fs(folder);
Shinya Kitaoka 120a6e
  if (!fs.doesExist()) TSystem::mkDir(folder);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFilePathSet paths = TSystem::readDirectory(folder);
Shinya Kitaoka 120a6e
  for (TFilePathSet::iterator it = paths.begin(); it != paths.end(); it++) {
Shinya Kitaoka 120a6e
    std::cout << it->getName() << std::endl;
Shinya Kitaoka 120a6e
    m_presetCombo->addItem(QString::fromStdString(it->getName()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_presetCombo->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
shun-iwasawa 59726b
shun-iwasawa 59726b
void OutputSettingsPopup::translateResampleOptions() {
shun-iwasawa 59726b
  resampleInfoMap[c_standard].uiString = tr("Standard");
shun-iwasawa 59726b
  resampleInfoMap[c_improved].uiString = tr("Improved");
shun-iwasawa 59726b
  resampleInfoMap[c_high].uiString     = tr("High");
shun-iwasawa 59726b
  resampleInfoMap[c_triangle].uiString = tr("Triangle filter");
shun-iwasawa 59726b
  resampleInfoMap[c_mitchell].uiString = tr("Mitchell-Netravali filter");
shun-iwasawa 59726b
  resampleInfoMap[c_cubic5].uiString   = tr("Cubic convolution, a = .5");
shun-iwasawa 59726b
  resampleInfoMap[c_cubic75].uiString  = tr("Cubic convolution, a = .75");
shun-iwasawa 59726b
  resampleInfoMap[c_cubic1].uiString   = tr("Cubic convolution, a = 1");
shun-iwasawa 59726b
  resampleInfoMap[c_hann2].uiString    = tr("Hann window, rad = 2");
shun-iwasawa 59726b
  resampleInfoMap[c_hann3].uiString    = tr("Hann window, rad = 3");
shun-iwasawa 59726b
  resampleInfoMap[c_hamming2].uiString = tr("Hamming window, rad = 2");
shun-iwasawa 59726b
  resampleInfoMap[c_hamming3].uiString = tr("Hamming window, rad = 3");
shun-iwasawa 59726b
  resampleInfoMap[c_lanczos2].uiString = tr("Lanczos window, rad = 2");
shun-iwasawa 59726b
  resampleInfoMap[c_lanczos3].uiString = tr("Lanczos window, rad = 3");
shun-iwasawa 59726b
  resampleInfoMap[c_gauss].uiString    = tr("Gaussian convolution");
shun-iwasawa 59726b
  resampleInfoMap[c_closestPixel].uiString =
shun-iwasawa 59726b
      tr("Closest Pixel (Nearest Neighbor)");
shun-iwasawa 59726b
  resampleInfoMap[c_bilinear].uiString = tr("Bilinear");
shun-iwasawa 59726b
}
shun-iwasawa 59726b
shun-iwasawa 59726b
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! OutputSettingsのPreset削除
shun-iwasawa f36064
 */
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onRemovePresetButtonPressed() {
Shinya Kitaoka 120a6e
  int index = m_presetCombo->currentIndex();
Shinya Kitaoka 120a6e
  if (index <= 0) return;
shun-iwasawa f36064
  int ret = QMessageBox::question(this, tr("Remove preset"),
shun-iwasawa f36064
                                  QString("Deleting \"%1\".\nAre you sure?")
shun-iwasawa f36064
                                      .arg(m_presetCombo->currentText()),
shun-iwasawa f36064
                                  QMessageBox::Ok | QMessageBox::Cancel,
shun-iwasawa f36064
                                  QMessageBox::Ok);
Shinya Kitaoka 120a6e
  if (ret == QMessageBox::Cancel) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFilePath fp =
Shinya Kitaoka 120a6e
      TEnv::getConfigDir() + "outputpresets" +
Shinya Kitaoka 120a6e
      QString("%1.txt").arg(m_presetCombo->currentText()).toStdString();
Shinya Kitaoka 120a6e
  if (TFileStatus(fp).doesExist()) TSystem::deleteFile(fp);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_presetCombo->blockSignals(true);
Shinya Kitaoka 120a6e
  m_presetCombo->removeItem(index);
Shinya Kitaoka 120a6e
  m_presetCombo->setCurrentIndex(0);
Shinya Kitaoka 120a6e
  m_presetCombo->blockSignals(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onPresetSelected(const QString &str) {
Shinya Kitaoka 120a6e
  /*-- "<custom>"を選択したら何もせずreturn --*/</custom>
Shinya Kitaoka 120a6e
  if (m_presetCombo->currentIndex() == 0) return;
Shinya Kitaoka 120a6e
  TFilePath fp = TEnv::getConfigDir() + "outputpresets" +
Shinya Kitaoka 120a6e
                 QString("%1.txt").arg(str).toStdString();
Shinya Kitaoka 120a6e
  if (!TFileStatus(fp).doesExist()) {
Shinya Kitaoka 120a6e
    QMessageBox::warning(this, tr("Warning"),
Shinya Kitaoka 120a6e
                         QString("The preset file %1.txt not found").arg(str),
Shinya Kitaoka 120a6e
                         QMessageBox::Ok, QMessageBox::Ok);
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TIStream is(fp);
Shinya Kitaoka 120a6e
  if (!is) {
Shinya Kitaoka 120a6e
    QMessageBox::warning(
Shinya Kitaoka 120a6e
        this, tr("Warning"),
Shinya Kitaoka 120a6e
        QString("Failed to open the preset file %1.txt").arg(str),
Shinya Kitaoka 120a6e
        QMessageBox::Ok, QMessageBox::Ok);
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::string tagName = "";
Shinya Kitaoka 120a6e
  if (!is.matchTag(tagName) || tagName != "outputsettingspreset") {
Shinya Kitaoka 120a6e
    QMessageBox::warning(this, tr("Warning"),
Shinya Kitaoka 120a6e
                         QString("Bad file format: %1.txt").arg(str),
Shinya Kitaoka 120a6e
                         QMessageBox::Ok, QMessageBox::Ok);
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TOutputProperties *prop = getProperties();
Shinya Kitaoka 120a6e
  TRenderSettings rs      = prop->getRenderSettings();
shun-iwasawa 481b59
shun-iwasawa 481b59
  // set back the linear settings to default
shun-iwasawa 481b59
  // in order to make old presets properly reproduce the settings before the
shun-iwasawa 481b59
  // implementation of linear rendering
shun-iwasawa 481b59
  rs.m_linearColorSpace = false;
shun-iwasawa 481b59
  rs.m_colorSpaceGamma  = 2.2;
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
  while (is.matchTag(tagName)) {
Shinya Kitaoka 120a6e
    // Camera
Shinya Kitaoka 120a6e
    if (tagName == "camera") {
Shinya Kitaoka 120a6e
      TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
      TStageObjectId cameraId =
Shinya Kitaoka 120a6e
          xsheet->getStageObjectTree()->getCurrentCameraId();
Shinya Kitaoka 120a6e
      TCamera *camera = xsheet->getStageObject(cameraId)->getCamera();
Shinya Kitaoka 120a6e
      camera->loadData(is);
Shinya Kitaoka 120a6e
    }  // if "camera"
Shinya Kitaoka 120a6e
    /*-- Saveinのプロジェクトフォルダ部分 --*/
Shinya Kitaoka 120a6e
    else if (tagName == "savein_projectfolder") {
Shinya Kitaoka 120a6e
      std::string projectFolderName;
Shinya Kitaoka 120a6e
      is >> projectFolderName;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      QString newProjectFolder = QString::fromStdString(projectFolderName);
Shinya Kitaoka 120a6e
      QString fp = QString::fromStdWString(prop->getPath().getWideString());
Shinya Kitaoka 120a6e
      /*-- 出力パスがプロジェクトフォルダで始まっている場合は、差し替える --*/
Shinya Kitaoka 120a6e
      if (!newProjectFolder.isEmpty() && fp.startsWith("+")) {
Shinya Kitaoka 120a6e
        if (fp.indexOf("\\") >= 0)
Shinya Kitaoka 120a6e
          fp = QString("%1\\%2")
Shinya Kitaoka 120a6e
                   .arg(newProjectFolder)
Shinya Kitaoka 120a6e
                   .arg(fp.right(fp.size() - fp.indexOf("\\") - 1));
Shinya Kitaoka 120a6e
        else
Shinya Kitaoka 120a6e
          fp = newProjectFolder;
Shinya Kitaoka 120a6e
        prop->setPath(TFilePath(fp.toStdWString()));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // File format
Shinya Kitaoka 120a6e
    else if (tagName == "format") {
Shinya Kitaoka 120a6e
      std::string formatName;
Shinya Kitaoka 120a6e
      is >> formatName;
Shinya Kitaoka 120a6e
      TFilePath fp = prop->getPath().withType(formatName);
Shinya Kitaoka 120a6e
      prop->setPath(fp);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // File options
Shinya Kitaoka 120a6e
    else if (tagName == "formatsProperties") {
Shinya Kitaoka 120a6e
      while (is.matchTag(tagName)) {
Shinya Kitaoka 120a6e
        if (tagName == "formatProperties") {
Shinya Kitaoka 120a6e
          std::string ext    = is.getTagAttribute("ext");
Shinya Kitaoka 120a6e
          TPropertyGroup *pg = prop->getFileFormatProperties(ext);
Shinya Kitaoka 120a6e
          if (ext == "avi") {
Shinya Kitaoka 120a6e
            TPropertyGroup appProperties;
Shinya Kitaoka 120a6e
            appProperties.loadData(is);
Shinya Kitaoka 120a6e
            if (pg->getPropertyCount() != 1 ||
Shinya Kitaoka 120a6e
                appProperties.getPropertyCount() != 1) {
Shinya Kitaoka 120a6e
              is.closeChild();
Shinya Kitaoka 120a6e
              continue;
Shinya Kitaoka 120a6e
            }
Shinya Kitaoka 120a6e
            TEnumProperty *enumProp =
Shinya Kitaoka 120a6e
                dynamic_cast<tenumproperty *="">(pg->getProperty(0));</tenumproperty>
Shinya Kitaoka 120a6e
            TEnumProperty *enumAppProp =
Shinya Kitaoka 120a6e
                dynamic_cast<tenumproperty *="">(appProperties.getProperty(0));</tenumproperty>
Shinya Kitaoka 120a6e
            assert(enumAppProp && enumProp);
Shinya Kitaoka 120a6e
            if (enumAppProp && enumProp) {
Shinya Kitaoka 120a6e
              try {
Shinya Kitaoka 120a6e
                enumProp->setValue(enumAppProp->getValue());
Shinya Kitaoka 120a6e
              } catch (TProperty::RangeError &) {
Shinya Kitaoka 120a6e
              }
Shinya Kitaoka 120a6e
            } else
Shinya Kitaoka 120a6e
              throw TException();
Shinya Kitaoka 120a6e
          } else
Shinya Kitaoka 120a6e
            pg->loadData(is);
Shinya Kitaoka 120a6e
          is.closeChild();
Shinya Kitaoka 120a6e
        } else
Shinya Kitaoka 120a6e
          throw TException("unexpected tag: " + tagName);
Shinya Kitaoka 120a6e
      }  // end while
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // Resample Balance
Shinya Kitaoka 120a6e
    else if (tagName == "resquality") {
Shinya Kitaoka 120a6e
      std::string resq;
Shinya Kitaoka 120a6e
      is >> resq;
shun-iwasawa 59726b
      // first, search in the combobox item data.
shun-iwasawa 59726b
      int index = m_resampleBalanceOm->findData(QString::fromStdString(resq));
shun-iwasawa 59726b
      // second, search in the combobox ui text (which may be translated).
shun-iwasawa 59726b
      // the second search is kept in order to keep backward compatibility.
shun-iwasawa 59726b
      if (index < 0)
shun-iwasawa 59726b
        index = m_resampleBalanceOm->findText(QString::fromStdString(resq));
shun-iwasawa 59726b
      if (index >= 0) {
shun-iwasawa 59726b
        m_resampleBalanceOm->setCurrentIndex(index);
shun-iwasawa 59726b
        rs.m_quality = resampleInfoMap[(ResampleOption)index].quality;
shun-iwasawa 59726b
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // Channel Width
Shinya Kitaoka 120a6e
    else if (tagName == "bpp") {
Shinya Kitaoka 120a6e
      std::string chanw;
Shinya Kitaoka 120a6e
      is >> chanw;
shun-iwasawa 59726b
      // first, search in the combobox item data.
shun-iwasawa 59726b
      int index = m_channelWidthOm->findData(QString::fromStdString(chanw));
shun-iwasawa 59726b
      // second, search in the combobox ui text (which may be translated).
shun-iwasawa 59726b
      // the second search is kept in order to keep backward compatibility.
shun-iwasawa 59726b
      if (index < 0)
shun-iwasawa 59726b
        index = m_channelWidthOm->findText(QString::fromStdString(chanw));
shun-iwasawa 59726b
      if (index >= 0) {
shun-iwasawa 59726b
        m_channelWidthOm->setCurrentIndex(index);
shun-iwasawa 59726b
        if (index == c_8bit)
shun-iwasawa 59726b
          rs.m_bpp = 32;
shun-iwasawa 481b59
        else if (index == c_16bit)
shun-iwasawa 59726b
          rs.m_bpp = 64;
shun-iwasawa 481b59
        else
shun-iwasawa 481b59
          rs.m_bpp = 128;
shun-iwasawa 59726b
      }
Shinya Kitaoka 120a6e
    }
shun-iwasawa 481b59
    // Linear Color Space & Color Space Gamma
shun-iwasawa 481b59
    else if (tagName == "linearColorSpace") {
shun-iwasawa 481b59
      std::string linearStr;
shun-iwasawa 481b59
      is >> linearStr;
shun-iwasawa 481b59
      rs.m_linearColorSpace = (linearStr != "0");
shun-iwasawa 481b59
    } else if (tagName == "colorSpaceGamma") {
shun-iwasawa 481b59
      std::string gamma;
shun-iwasawa 481b59
      is >> gamma;
shun-iwasawa 481b59
      rs.m_colorSpaceGamma = QString::fromStdString(gamma).toDouble();
shun-iwasawa 481b59
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Frame Rate (Scene Settings)
Shinya Kitaoka 120a6e
    else if (tagName == "frameRate") {
Shinya Kitaoka 120a6e
      std::string strFps;
Shinya Kitaoka 120a6e
      is >> strFps;
Shinya Kitaoka 120a6e
      prop->setFrameRate(QString::fromStdString(strFps).toDouble());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // stretch FPS
Shinya Kitaoka 120a6e
    else if (tagName == "stretchFrom") {
Shinya Kitaoka 120a6e
      std::string strFrm;
Shinya Kitaoka 120a6e
      is >> strFrm;
Shinya Kitaoka 120a6e
      rs.m_timeStretchFrom = QString::fromStdString(strFrm).toDouble();
Shinya Kitaoka 120a6e
    } else if (tagName == "stretchTo") {
Shinya Kitaoka 120a6e
      std::string strTo;
Shinya Kitaoka 120a6e
      is >> strTo;
Shinya Kitaoka 120a6e
      rs.m_timeStretchTo = QString::fromStdString(strTo).toDouble();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // gamma
Shinya Kitaoka 120a6e
    else if (tagName == "gamma") {
Shinya Kitaoka 120a6e
      std::string gamma;
Shinya Kitaoka 120a6e
      is >> gamma;
Shinya Kitaoka 120a6e
      rs.m_gamma = QString::fromStdString(gamma).toDouble();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    is.closeChild();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- renderSettingsを戻す --*/
Shinya Kitaoka 120a6e
  prop->setRenderSettings(rs);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->notifySceneChanged();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_presetCombo->blockSignals(true);
Shinya Kitaoka 120a6e
  m_presetCombo->setCurrentIndex(m_presetCombo->findText(str));
Shinya Kitaoka 120a6e
  m_presetCombo->blockSignals(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onCameraSettingsChanged() {
Shinya Kitaoka 120a6e
  if (m_presetCombo) m_presetCombo->setCurrentIndex(0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutputSettingsPopup::onFrameRateEditingFinished() {
Shinya Kitaoka 120a6e
  double frameRate         = getProperties()->getFrameRate();
Shinya Kitaoka 120a6e
  double frameRateFldValue = m_frameRateFld->getValue();
Shinya Kitaoka 120a6e
  if (frameRate == frameRateFldValue) return;
Shinya Kitaoka 120a6e
  getProperties()->setFrameRate(frameRateFldValue);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->getScene()->updateSoundColumnFrameRate();
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->notifySceneChanged();
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentXsheet()->getXsheet()->updateFrameCount();
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun-iwasawa cd4694
void OutputSettingsPopup::onAddBoardChecked(int state) {
shun-iwasawa cd4694
  BoardSettings *boardSettings = getProperties()->getBoardSettings();
shun-iwasawa cd4694
  boardSettings->setActive(state == Qt::Checked);
shun-iwasawa cd4694
shun-iwasawa cd4694
  m_boardSettingsBtn->setEnabled(state == Qt::Checked);
shun-iwasawa cd4694
}
shun-iwasawa cd4694
shun-iwasawa cd4694
void OutputSettingsPopup::onBoardSettingsBtnClicked() {
shun-iwasawa cd4694
  std::cout << "board settings button clicked" << std::endl;
shun-iwasawa cd4694
  BoardSettingsPopup popup(this);
shun-iwasawa cd4694
  popup.exec();
shun-iwasawa cd4694
}
shun-iwasawa cd4694
shun-iwasawa cd4694
//-----------------------------------------------------------------------------
shun-iwasawa cd4694
Shinya Kitaoka 120a6e
OpenPopupCommandHandler<outputsettingspopup> openOutputSettingsPopup(</outputsettingspopup>
Shinya Kitaoka 120a6e
    MI_OutputSettings);
Shinya Kitaoka 120a6e
OpenPopupCommandHandler<previewsettingspopup> openPreviewSettingsPopup(</previewsettingspopup>
Shinya Kitaoka 120a6e
    MI_PreviewSettings);