Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/fxsettings.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/keyframenavigator.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvdialog.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/fxhistogramrender.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/histogram.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tmacrofx.h"
Toshihiro Shimizu 890ddd
#include "tstream.h"
Toshihiro Shimizu 890ddd
#include "tparamcontainer.h"
Toshihiro Shimizu 890ddd
#include "tspectrumparam.h"
Toshihiro Shimizu 890ddd
#include "tfxattributes.h"
Toshihiro Shimizu 890ddd
#include "toutputproperties.h"
Toshihiro Shimizu 890ddd
#include "pluginhost.h"
Toshihiro Shimizu 890ddd
#include "tenv.h"
shun-iwasawa 5b724a
#include "tsystem.h"
manongjohn b13816
#include "docklayout.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzfolders.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnfx.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tobjecthandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/scenefx.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
#include "tw/stringtable.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qvboxlayout></qvboxlayout>
Toshihiro Shimizu 890ddd
#include <qtoolbar></qtoolbar>
Toshihiro Shimizu 890ddd
#include <qicon></qicon>
Toshihiro Shimizu 890ddd
#include <qaction></qaction>
Toshihiro Shimizu 890ddd
#include <qstackedwidget></qstackedwidget>
Toshihiro Shimizu 890ddd
#include <qlabel></qlabel>
Toshihiro Shimizu 890ddd
#include <qmap></qmap>
Toshihiro Shimizu 890ddd
#include <qpainter></qpainter>
Toshihiro Shimizu 890ddd
#include <qcheckbox></qcheckbox>
Toshihiro Shimizu 890ddd
#include <qpushbutton></qpushbutton>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qdesktopservices></qdesktopservices>
Toshihiro Shimizu 890ddd
#include <qurl></qurl>
shun-iwasawa 1b1839
#include <qguiapplication></qguiapplication>
shun-iwasawa 1b1839
#include <qscreen></qscreen>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace DVGui;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TFxP getCurrentFx(const TFxP ¤tFx, std::wstring actualId) {
Shinya Kitaoka 120a6e
  if (currentFx->getFxId() == actualId) return currentFx;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < currentFx->getInputPortCount(); i++) {
Shinya Kitaoka 120a6e
    TFxP fx = getCurrentFx(currentFx->getInputPort(i)->getFx(), actualId);
Shinya Kitaoka 120a6e
    if (fx.getPointer()) return fx;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool hasEmptyInputPort(const TFxP ¤tFx) {
Shinya Kitaoka 120a6e
  if (!currentFx.getPointer()) return true;
Shinya Kitaoka 120a6e
  if (currentFx->getInputPortCount() == 0) return false;
Shinya Kitaoka 120a6e
  return hasEmptyInputPort(currentFx->getInputPort(0)->getFx());
Toshihiro Shimizu 890ddd
}
shun-iwasawa 3ca3c2
shun-iwasawa 3ca3c2
// find the field by parameter name and register the field and its label widget
shun-iwasawa 3ca3c2
bool findItemByParamName(QLayout *layout, std::string name,
shun-iwasawa 3ca3c2
                         QList<qwidget *=""> &ret) {</qwidget>
shun-iwasawa 3ca3c2
  for (int i = 0; i < layout->count(); i++) {
shun-iwasawa 3ca3c2
    QLayoutItem *item = layout->itemAt(i);
shun-iwasawa 3ca3c2
    if (!item) continue;
shun-iwasawa 3ca3c2
    if (item->widget()) {
shun-iwasawa 3ca3c2
      ParamField *pf = dynamic_cast<paramfield *="">(item->widget());</paramfield>
shun-iwasawa 3ca3c2
      if (pf && pf->getParamName().toStdString() == name) {
shun-iwasawa 3ca3c2
        ret.push_back(pf);
shun-iwasawa 3ca3c2
        if (i > 0 && layout->itemAt(i - 1)->widget()) {
shun-iwasawa 3ca3c2
          QLabel *label =
shun-iwasawa 3ca3c2
              dynamic_cast<qlabel *="">(layout->itemAt(i - 1)->widget());</qlabel>
shun-iwasawa 3ca3c2
          if (label) ret.push_back(label);
shun-iwasawa 3ca3c2
        }
shun-iwasawa 3ca3c2
        return true;
shun-iwasawa 3ca3c2
      }
shun-iwasawa 3ca3c2
      // the widget may be a container of another layout
shun-iwasawa 3ca3c2
      else if (item->widget()->layout()) {
shun-iwasawa 3ca3c2
        if (findItemByParamName(item->widget()->layout(), name, ret))
shun-iwasawa 3ca3c2
          return true;
shun-iwasawa 3ca3c2
      }
shun-iwasawa 3ca3c2
    } else if (item->layout()) {
shun-iwasawa 3ca3c2
      if (findItemByParamName(item->layout(), name, ret)) return true;
shun-iwasawa 3ca3c2
    }
shun-iwasawa 3ca3c2
  }
shun-iwasawa 3ca3c2
  return false;
shun-iwasawa 3ca3c2
};
shun-iwasawa cac18a
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// ParamViewer
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParamsPage::ParamsPage(QWidget *parent, ParamViewer *paramViewer)
Shinya Kitaoka 120a6e
    : QFrame(parent)
Shinya Kitaoka 120a6e
    , m_paramViewer(paramViewer)
Shinya Kitaoka 120a6e
    , m_horizontalLayout(NULL)
Shinya Kitaoka 120a6e
    , m_groupLayout(NULL) {
Shinya Kitaoka 120a6e
  m_fxHistogramRender = new FxHistogramRender();
Shinya Kitaoka 120a6e
  setFrameStyle(QFrame::StyledPanel);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_mainLayout = new QGridLayout(this);
Shinya Kitaoka 120a6e
  m_mainLayout->setMargin(12);
Shinya Kitaoka 120a6e
  m_mainLayout->setVerticalSpacing(10);
Shinya Kitaoka 120a6e
  m_mainLayout->setHorizontalSpacing(5);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_mainLayout->setColumnStretch(0, 0);
Shinya Kitaoka 120a6e
  m_mainLayout->setColumnStretch(1, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  setLayout(m_mainLayout);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
ParamsPage::~ParamsPage() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPage::setPageField(TIStream &is, const TFxP &fx, bool isVertical) {
Shinya Kitaoka 120a6e
  // m_horizontalLayout dovrebbe essere stato inizializzato prima di entrare nel
Shinya Kitaoka 120a6e
  // metodo, per sicurezza verifico.
Shinya Kitaoka 120a6e
  if (isVertical == false && !m_horizontalLayout) {
Shinya Kitaoka 120a6e
    m_horizontalLayout = new QHBoxLayout();
Shinya Kitaoka 120a6e
    m_horizontalLayout->setMargin(0);
Shinya Kitaoka 120a6e
    m_horizontalLayout->setSpacing(5);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*--
Shinya Kitaoka 120a6e
   * HBoxLayoutを挿入するとき、最初のパラメータ名はGridlayoutのColumn0に入れるため
Shinya Kitaoka 120a6e
   * --*/
Shinya Kitaoka 120a6e
  bool isFirstParamInRow = true;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  while (!is.matchEndTag()) {
Shinya Kitaoka 120a6e
    std::string tagName;
Shinya Kitaoka 120a6e
    if (!is.matchTag(tagName)) throw TException("expected tag");
Shinya Kitaoka 120a6e
    if (tagName == "control") {
Shinya Kitaoka 120a6e
      /*--- 設定ファイルからインタフェースの桁数を決める (PairSliderのみ実装。)
Shinya Kitaoka 120a6e
       * ---*/
shun-iwasawa d76928
      int decimals            = -1;
Shinya Kitaoka 120a6e
      std::string decimalsStr = is.getTagAttribute("decimals");
Shinya Kitaoka 120a6e
      if (decimalsStr != "") {
Shinya Kitaoka 120a6e
        decimals = QString::fromStdString(decimalsStr).toInt();
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      std::string name;
Shinya Kitaoka 120a6e
      is >> name;
Shinya Kitaoka 120a6e
      is.matchEndTag();
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
      /*-- Layout設定名とFxParameterの名前が一致するものを取得 --*/
Shinya Kitaoka 120a6e
      TParamP param = fx->getParams()->getParam(name);
shun-iwasawa 6d5bbe
      bool isHidden =
shun-iwasawa 6d5bbe
          (param) ? fx->getParams()->getParamVar(name)->isHidden() : true;
shun-iwasawa 6d5bbe
shun-iwasawa 6d5bbe
      if (param && !isHidden) {
Shinya Kitaoka 120a6e
        std::string paramName = fx->getFxType() + "." + name;
Shinya Kitaoka 120a6e
        QString str =
Shinya Kitaoka 120a6e
            QString::fromStdWString(TStringTable::translate(paramName));
Shinya Kitaoka 120a6e
        ParamField *field = ParamField::create(this, str, param);
Shinya Kitaoka 120a6e
        if (field) {
shun-iwasawa d76928
          if (decimals >= 0) field->setPrecision(decimals);
Shinya Kitaoka 120a6e
          m_fields.push_back(field);
Shinya Kitaoka 120a6e
          /*-- hboxタグに挟まれているとき --*/
Shinya Kitaoka 120a6e
          if (isVertical == false) {
Shinya Kitaoka 120a6e
            assert(m_horizontalLayout);
Shinya Kitaoka 120a6e
            QLabel *label = new QLabel(str, this);
Shinya Kitaoka 120a6e
            label->setObjectName("FxSettingsLabel");
Shinya Kitaoka 120a6e
            if (isFirstParamInRow) {
Shinya Kitaoka 120a6e
              int currentRow = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
              m_mainLayout->addWidget(label, currentRow, 0,
Shinya Kitaoka 120a6e
                                      Qt::AlignRight | Qt::AlignVCenter);
Shinya Kitaoka 120a6e
              isFirstParamInRow = false;
Shinya Kitaoka 120a6e
            } else
Shinya Kitaoka 120a6e
              m_horizontalLayout->addWidget(label, 0,
Shinya Kitaoka 120a6e
                                            Qt::AlignRight | Qt::AlignVCenter);
Shinya Kitaoka 120a6e
            m_horizontalLayout->addWidget(field);
Shinya Kitaoka 120a6e
            m_horizontalLayout->addSpacing(10);
Shinya Kitaoka 120a6e
          } else {
Shinya Kitaoka 120a6e
            int currentRow = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
            QLabel *label  = new QLabel(str, this);
Shinya Kitaoka 120a6e
            label->setObjectName("FxSettingsLabel");
Shinya Kitaoka 120a6e
            m_mainLayout->addWidget(label, currentRow, 0,
Shinya Kitaoka 120a6e
                                    Qt::AlignRight | Qt::AlignVCenter);
Shinya Kitaoka 120a6e
            m_mainLayout->addWidget(field, currentRow, 1);
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
          connect(field, SIGNAL(currentParamChanged()), m_paramViewer,
Shinya Kitaoka 120a6e
                  SIGNAL(currentFxParamChanged()));
Shinya Kitaoka 120a6e
          connect(field, SIGNAL(actualParamChanged()), m_paramViewer,
Shinya Kitaoka 120a6e
                  SIGNAL(actualFxParamChanged()));
Shinya Kitaoka 120a6e
          connect(field, SIGNAL(paramKeyToggle()), m_paramViewer,
Shinya Kitaoka 120a6e
                  SIGNAL(paramKeyChanged()));
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } else if (tagName == "label") {
Shinya Kitaoka 120a6e
      std::string name;
Shinya Kitaoka 120a6e
      is >> name;
Shinya Kitaoka 120a6e
      is.matchEndTag();
Shinya Kitaoka 120a6e
      QString str;
Shinya Kitaoka 120a6e
      if (isVertical == false) {
Shinya Kitaoka 120a6e
        assert(m_horizontalLayout);
Shinya Kitaoka 120a6e
        m_horizontalLayout->addWidget(new QLabel(str.fromStdString(name)));
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        int currentRow = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
        m_mainLayout->addWidget(new QLabel(str.fromStdString(name)), currentRow,
Shinya Kitaoka 120a6e
                                0, 1, 2);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } else if (tagName == "separator") {
Shinya Kitaoka 120a6e
      // <separator> o <separator label="xxx"></separator></separator>
Shinya Kitaoka 120a6e
      std::string label = is.getTagAttribute("label");
Shinya Kitaoka 120a6e
      QString str;
Shinya Kitaoka 120a6e
      Separator *sep = new Separator(str.fromStdString(label), this);
Shinya Kitaoka 120a6e
      int currentRow = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
      m_mainLayout->addWidget(sep, currentRow, 0, 1, 2);
Shinya Kitaoka 120a6e
      m_mainLayout->setRowStretch(currentRow, 0);
Shinya Kitaoka 120a6e
    } else if (tagName == "histogram") {
Shinya Kitaoka 120a6e
      Histogram *histogram = new Histogram();
Shinya Kitaoka 120a6e
      m_fxHistogramRender->setHistograms(histogram->getHistograms());
Shinya Kitaoka 120a6e
      if (isVertical == false) {
Shinya Kitaoka 120a6e
        assert(m_horizontalLayout);
Shinya Kitaoka 120a6e
        m_horizontalLayout->addWidget(histogram);
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        int currentRow = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
        m_mainLayout->addWidget(histogram, currentRow, 0, 1, 2);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } else if (tagName == "test") {
Shinya Kitaoka 120a6e
      // <test></test>
Shinya Kitaoka 120a6e
      // box->add(new WidgetBox(new TestSeparator(page)));
Shinya Kitaoka 120a6e
    } else if (tagName == "hbox") {
Shinya Kitaoka 120a6e
      int currentRow     = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
      m_horizontalLayout = new QHBoxLayout();
Shinya Kitaoka 120a6e
      m_horizontalLayout->setMargin(0);
Shinya Kitaoka 120a6e
      m_horizontalLayout->setSpacing(5);
Shinya Kitaoka 120a6e
      setPageField(is, fx, false);
shun_iwasawa a0fb33
      m_mainLayout->addLayout(m_horizontalLayout, currentRow, 1, 1, 2);
Shinya Kitaoka 120a6e
    } else if (tagName == "vbox") {
shun-iwasawa 6e910b
      int shrink                   = 0;
shun-iwasawa 6e910b
      std::string shrinkStr        = is.getTagAttribute("shrink");
shun-iwasawa 6e910b
      std::string modeSensitiveStr = is.getTagAttribute("modeSensitive");
shun-iwasawa 6e910b
      if (shrinkStr != "" || modeSensitiveStr != "") {
shun-iwasawa 6e910b
        QWidget *tmpWidget;
shun-iwasawa 6e910b
        if (shrinkStr != "") {
shun-iwasawa 6e910b
          shrink              = QString::fromStdString(shrinkStr).toInt();
shun-iwasawa 6e910b
          std::string label   = is.getTagAttribute("label");
shun-iwasawa 6e910b
          QCheckBox *checkBox = new QCheckBox(this);
shun-iwasawa 6e910b
          QHBoxLayout *sepLay = new QHBoxLayout();
shun-iwasawa 6e910b
          sepLay->setMargin(0);
shun-iwasawa 6e910b
          sepLay->setSpacing(5);
shun-iwasawa 6e910b
          sepLay->addWidget(checkBox, 0);
shun-iwasawa 6e910b
          sepLay->addWidget(new Separator(QString::fromStdString(label), this),
shun-iwasawa 6e910b
                            1);
shun-iwasawa 6e910b
          int currentRow = m_mainLayout->rowCount();
shun-iwasawa 6e910b
          m_mainLayout->addLayout(sepLay, currentRow, 0, 1, 2);
shun-iwasawa 6e910b
          m_mainLayout->setRowStretch(currentRow, 0);
shun-iwasawa 1b1839
          tmpWidget = new ModeSensitiveBox(this, checkBox);
shun-iwasawa 6e910b
          checkBox->setChecked(shrink == 1);
shun-iwasawa 6e910b
          tmpWidget->setVisible(shrink == 1);
shun-iwasawa 6e910b
        } else {  // modeSensitiveStr != ""
shun-iwasawa 6e910b
          QList<int> modes;</int>
shun-iwasawa 443318
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
shun-iwasawa 443318
          QStringList modeListStr =
shun-iwasawa 443318
              QString::fromStdString(is.getTagAttribute("mode"))
shun-iwasawa 443318
                  .split(',', Qt::SkipEmptyParts);
shun-iwasawa 443318
#else
shun-iwasawa 6e910b
          QStringList modeListStr =
shun-iwasawa 6e910b
              QString::fromStdString(is.getTagAttribute("mode"))
shun-iwasawa 6e910b
                  .split(',', QString::SkipEmptyParts);
shun-iwasawa 443318
#endif
shun-iwasawa 6e910b
          for (QString modeNum : modeListStr) modes.push_back(modeNum.toInt());
shun-iwasawa 6e910b
          // find the mode combobox
shun-iwasawa 6e910b
          ModeChangerParamField *modeChanger = nullptr;
shun-iwasawa 6e910b
          for (int r = 0; r < m_mainLayout->rowCount(); r++) {
shun-iwasawa 6e910b
            QLayoutItem *li = m_mainLayout->itemAtPosition(r, 1);
shun-iwasawa 6e910b
            if (!li || !li->widget()) continue;
shun-iwasawa 6e910b
            ModeChangerParamField *field =
shun-iwasawa 6e910b
                dynamic_cast<modechangerparamfield *="">(li->widget());</modechangerparamfield>
shun-iwasawa 6e910b
            if (!field ||
shun-iwasawa 6e910b
                field->getParamName().toStdString() != modeSensitiveStr)
shun-iwasawa 6e910b
              continue;
shun-iwasawa 6e910b
            modeChanger = field;
shun-iwasawa 6e910b
            break;
shun-iwasawa 6e910b
          }
shun-iwasawa 6d5bbe
          // modeChanger may be in another vbox in the page
shun-iwasawa 6d5bbe
          if (!modeChanger) {
shun-iwasawa 6d5bbe
            QList<modechangerparamfield *=""> allModeChangers =</modechangerparamfield>
shun-iwasawa 6d5bbe
                findChildren<modechangerparamfield *="">();</modechangerparamfield>
shun-iwasawa 6d5bbe
            for (auto field : allModeChangers) {
shun-iwasawa 6d5bbe
              if (field->getParamName().toStdString() == modeSensitiveStr) {
shun-iwasawa 6d5bbe
                modeChanger = field;
shun-iwasawa 6d5bbe
                break;
shun-iwasawa 6d5bbe
              }
shun-iwasawa 6d5bbe
            }
shun-iwasawa 6d5bbe
          }
shun-iwasawa 6e910b
          assert(modeChanger);
shun-iwasawa 6e910b
          tmpWidget = new ModeSensitiveBox(this, modeChanger, modes);
shun-iwasawa 6e910b
        }
shun-iwasawa 6e910b
shun-iwasawa 6e910b
        int currentRow           = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
        QGridLayout *keepMainLay = m_mainLayout;
shun-iwasawa 6e910b
        // temporary switch the layout
shun-iwasawa 6e910b
        m_mainLayout = new QGridLayout();
shun-iwasawa 6e910b
        m_mainLayout->setMargin(0);
Shinya Kitaoka 120a6e
        m_mainLayout->setVerticalSpacing(10);
Shinya Kitaoka 120a6e
        m_mainLayout->setHorizontalSpacing(5);
Shinya Kitaoka 120a6e
        m_mainLayout->setColumnStretch(0, 0);
Shinya Kitaoka 120a6e
        m_mainLayout->setColumnStretch(1, 1);
Shinya Kitaoka 120a6e
        setPageField(is, fx, true);
shun-iwasawa 832993
Shinya Kitaoka 120a6e
        tmpWidget->setLayout(m_mainLayout);
shun-iwasawa 6e910b
        // turn back the layout
Shinya Kitaoka 120a6e
        m_mainLayout = keepMainLay;
shun-iwasawa 6e910b
        m_mainLayout->addWidget(tmpWidget, currentRow, 0, 1, 2);
Shinya Kitaoka 120a6e
      } else
Shinya Kitaoka 120a6e
        setPageField(is, fx, true);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    /*-- PixelParamFieldが2つあるとき、一方のRGB値を他方にコピーするボタン --*/
Shinya Kitaoka 120a6e
    else if (tagName == "rgb_link_button") {
Shinya Kitaoka 120a6e
      /*-- リンクさせたいパラメータを2つ得る --*/
Shinya Kitaoka 120a6e
      std::string name1, name2;
Shinya Kitaoka 120a6e
      is >> name1;
Shinya Kitaoka 120a6e
      is >> name2;
Shinya Kitaoka 120a6e
      is.matchEndTag();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      /*-- 既に作ってあるGUIを探索し、対応する2つを得て格納 --*/
Shinya Kitaoka 120a6e
      PixelParamField *ppf1 = 0;
Shinya Kitaoka 120a6e
      PixelParamField *ppf2 = 0;
Shinya Kitaoka 120a6e
      for (int r = 0; r < m_mainLayout->rowCount(); r++) {
Shinya Kitaoka 120a6e
        QLayoutItem *li = m_mainLayout->itemAtPosition(r, 1);
Shinya Kitaoka 120a6e
        if (!li) continue;
Shinya Kitaoka 120a6e
        QWidget *w = li->widget();
Shinya Kitaoka 120a6e
        if (!w) continue;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        ParamField *pf = dynamic_cast<paramfield *="">(w);</paramfield>
Shinya Kitaoka 120a6e
        if (pf) {
Shinya Kitaoka 120a6e
          PixelParamField *ppf = dynamic_cast<pixelparamfield *="">(pf);</pixelparamfield>
Shinya Kitaoka 120a6e
          if (ppf) {
Shinya Kitaoka 120a6e
            if (ppf1 == 0 && ppf->getParamName().toStdString() == name1)
Shinya Kitaoka 120a6e
              ppf1 = ppf;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
            if (ppf2 == 0 && ppf->getParamName().toStdString() == name2)
Shinya Kitaoka 120a6e
              ppf2 = ppf;
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      if (ppf1 == 0 || ppf2 == 0) continue;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      /*-- ボタンのラベルのため 翻訳する --*/
Shinya Kitaoka 120a6e
      std::string paramName1 = fx->getFxType() + "." + name1;
Shinya Kitaoka 120a6e
      std::string paramName2 = fx->getFxType() + "." + name2;
Shinya Kitaoka 120a6e
      QString str1 =
Shinya Kitaoka 120a6e
          QString::fromStdWString(TStringTable::translate(paramName1));
Shinya Kitaoka 120a6e
      QString str2 =
Shinya Kitaoka 120a6e
          QString::fromStdWString(TStringTable::translate(paramName2));
Shinya Kitaoka 120a6e
shun-iwasawa cac18a
      RgbLinkButtons *linkBut =
shun-iwasawa cac18a
          new RgbLinkButtons(str1, str2, this, ppf1, ppf2);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      int currentRow = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
      m_mainLayout->addWidget(linkBut, currentRow, 1,
Shinya Kitaoka 120a6e
                              Qt::AlignLeft | Qt::AlignVCenter);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    /*-- チェックボックスによって他のインタフェースを表示/非表示させる ---*/
Shinya Kitaoka 120a6e
    else if (tagName == "visibleToggle") {
Shinya Kitaoka 120a6e
      BoolParamField *controller_bpf = 0;
Shinya Kitaoka 120a6e
      QList<qwidget *=""> on_items;</qwidget>
Shinya Kitaoka 120a6e
      QList<qwidget *=""> off_items;</qwidget>
Shinya Kitaoka 120a6e
      while (!is.matchEndTag()) {
Shinya Kitaoka 120a6e
        std::string tagName;
Shinya Kitaoka 120a6e
        if (!is.matchTag(tagName)) throw TException("expected tag");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        if (tagName ==
Shinya Kitaoka 120a6e
                "controller" || /*-- 表示をコントロールするチェックボックス --*/
Shinya Kitaoka 120a6e
            tagName == "on" || /*-- ONのとき表示されるインタフェース --*/
Shinya Kitaoka 120a6e
            tagName == "off") /*-- OFFのとき表示されるインタフェース --*/
Shinya Kitaoka 120a6e
        {
Shinya Kitaoka 120a6e
          std::string name;
Shinya Kitaoka 120a6e
          is >> name;
Shinya Kitaoka 120a6e
          is.matchEndTag();
shun-iwasawa 3ca3c2
shun-iwasawa 3ca3c2
          QList<qwidget *=""> widgets;</qwidget>
shun-iwasawa 3ca3c2
          if (findItemByParamName(m_mainLayout, name, widgets)) {
shun-iwasawa 3ca3c2
            if (tagName == "controller") {
shun-iwasawa 3ca3c2
              controller_bpf = dynamic_cast<boolparamfield *="">(widgets[0]);</boolparamfield>
shun-iwasawa 3ca3c2
            } else if (tagName == "on")
shun-iwasawa 3ca3c2
              on_items.append(widgets);
shun-iwasawa 3ca3c2
            else if (tagName == "off")
shun-iwasawa 3ca3c2
              off_items.append(widgets);
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
        } else
Shinya Kitaoka 120a6e
          throw TException("unexpected tag " + tagName);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      /*-- 表示コントロールをconnect --*/
shun-iwasawa 1b1839
      if (controller_bpf && (!on_items.isEmpty() || !off_items.isEmpty())) {
Shinya Kitaoka 120a6e
        /*-- ラベルとWidgetを両方表示/非表示 --*/
Shinya Kitaoka 120a6e
        for (int i = 0; i < on_items.size(); i++) {
Shinya Kitaoka 120a6e
          connect(controller_bpf, SIGNAL(toggled(bool)), on_items[i],
Shinya Kitaoka 120a6e
                  SLOT(setVisible(bool)));
Shinya Kitaoka 120a6e
          on_items[i]->hide();
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
        for (int i = 0; i < off_items.size(); i++) {
Shinya Kitaoka 120a6e
          connect(controller_bpf, SIGNAL(toggled(bool)), off_items[i],
Shinya Kitaoka 120a6e
                  SLOT(setHidden(bool)));
Shinya Kitaoka 120a6e
          off_items[i]->show();
Shinya Kitaoka 120a6e
        }
shun-iwasawa 1b1839
        connect(controller_bpf, SIGNAL(toggled(bool)), this,
shun-iwasawa 1b1839
                SIGNAL(preferredPageSizeChanged()));
Shinya Kitaoka 120a6e
      } else
Shinya Kitaoka 120a6e
        std::cout << "controller_bpf NOT found!" << std::endl;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      throw TException("unexpected tag " + tagName);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (isVertical == false && m_horizontalLayout) {
Shinya Kitaoka 120a6e
    m_horizontalLayout->addStretch(1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
shun-iwasawa 8cac36
// add a slider for global control
shun-iwasawa 8cac36
void ParamsPage::addGlobalControl(const TFxP &fx) {
shun-iwasawa 8cac36
  if (!fx->getAttributes()->hasGlobalControl()) return;
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  std::string name = "globalIntensity";
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  TParamP param = fx->getParams()->getParam(name);
shun-iwasawa 8cac36
  if (!param) return;
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  assert(param->hasUILabel());
shun-iwasawa 8cac36
  QString str       = QString::fromStdString(param->getUILabel());
shun-iwasawa 8cac36
  ParamField *field = ParamField::create(this, str, param);
shun-iwasawa 8cac36
  if (!field) return;
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  int currentRow = m_mainLayout->rowCount();
shun-iwasawa 8cac36
  if (!m_fields.isEmpty()) {
shun-iwasawa 8cac36
    Separator *sep = new Separator("", this);
shun-iwasawa 8cac36
    m_mainLayout->addWidget(sep, currentRow, 0, 1, 2);
shun-iwasawa 8cac36
    m_mainLayout->setRowStretch(currentRow, 0);
shun-iwasawa 8cac36
    currentRow = m_mainLayout->rowCount();
shun-iwasawa 8cac36
  }
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  m_fields.push_back(field);
shun-iwasawa 8cac36
  QLabel *label = new QLabel(str, this);
shun-iwasawa 8cac36
  label->setObjectName("FxSettingsLabel");
shun-iwasawa 8cac36
  m_mainLayout->addWidget(label, currentRow, 0,
shun-iwasawa 8cac36
                          Qt::AlignRight | Qt::AlignVCenter);
shun-iwasawa 8cac36
  m_mainLayout->addWidget(field, currentRow, 1);
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  connect(field, SIGNAL(currentParamChanged()), m_paramViewer,
shun-iwasawa 8cac36
          SIGNAL(currentFxParamChanged()));
shun-iwasawa 8cac36
  connect(field, SIGNAL(actualParamChanged()), m_paramViewer,
shun-iwasawa 8cac36
          SIGNAL(actualFxParamChanged()));
shun-iwasawa 8cac36
  connect(field, SIGNAL(paramKeyToggle()), m_paramViewer,
shun-iwasawa 8cac36
          SIGNAL(paramKeyChanged()));
shun-iwasawa 8cac36
}
shun-iwasawa 8cac36
shun-iwasawa 8cac36
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPage::setPageSpace() {
Shinya Kitaoka 120a6e
  if (m_fields.count() != 0) {
Shinya Kitaoka 120a6e
    int currentRow = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
    for (int i = 0; i < currentRow; i++) m_mainLayout->setRowStretch(i, 0);
Shinya Kitaoka 120a6e
    m_mainLayout->setRowStretch(currentRow, 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
void ParamsPage::beginGroup(const char *name) {
Shinya Kitaoka 120a6e
  m_groupLayout = new QGridLayout();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QGroupBox *group = new QGroupBox(QString::fromUtf8(name), this);
Shinya Kitaoka 120a6e
  group->setLayout(m_groupLayout);
Shinya Kitaoka 120a6e
  m_mainLayout->addWidget(group, m_mainLayout->rowCount(), 0, 1, 2);
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void ParamsPage::endGroup() { m_groupLayout = NULL; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void ParamsPage::addWidget(QWidget *field, bool isVertical) {
Shinya Kitaoka 120a6e
  QLabel *label  = NULL;
Shinya Kitaoka 120a6e
  ParamField *pf = qobject_cast<paramfield *="">(field);</paramfield>
Shinya Kitaoka 120a6e
  if (pf) {
Shinya Kitaoka 120a6e
    label = new QLabel(pf->getUIName(), this);
Shinya Kitaoka 120a6e
    label->setObjectName("FxSettingsLabel");
Shinya Kitaoka 120a6e
    if (!pf->getDescription().isEmpty())
Shinya Kitaoka 120a6e
      label->setToolTip(pf->getDescription());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (isVertical) {
Shinya Kitaoka 120a6e
    if (m_groupLayout) {
Shinya Kitaoka 120a6e
      int row = m_groupLayout->rowCount();
Shinya Kitaoka 120a6e
      if (label)
Shinya Kitaoka 120a6e
        m_groupLayout->addWidget(label, row, 0,
Shinya Kitaoka 120a6e
                                 Qt::AlignRight | Qt::AlignVCenter);
Shinya Kitaoka 120a6e
      m_groupLayout->addWidget(field, row, 1);
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      int row = m_mainLayout->rowCount();
Shinya Kitaoka 120a6e
      if (label)
Shinya Kitaoka 120a6e
        m_mainLayout->addWidget(label, row, 0,
Shinya Kitaoka 120a6e
                                Qt::AlignRight | Qt::AlignVCenter);
Shinya Kitaoka 120a6e
      m_mainLayout->addWidget(field, row, 1);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    if (!m_horizontalLayout) {
Shinya Kitaoka 120a6e
      m_horizontalLayout = new QHBoxLayout();
Shinya Kitaoka 120a6e
      m_horizontalLayout->setMargin(0);
Shinya Kitaoka 120a6e
      m_horizontalLayout->setSpacing(5);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_horizontalLayout->addWidget(field);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
#define TOONZ_DEFINE_NEW_COMPONENT(NAME, MAKE)                                 \
Shinya Kitaoka 120a6e
  QWidget *ParamsPage::NAME(TFx *fx, const char *name) {                       \
Shinya Kitaoka 120a6e
    TParamP param = fx->getParams()->getParam(name);                           \
Shinya Kitaoka 120a6e
    if (!param) return NULL;                                                   \
Shinya Kitaoka 120a6e
    QString const paramName =                                                  \
Shinya Kitaoka 120a6e
        QString::fromStdString(fx->getFxType() + "." + name);                  \
Shinya Kitaoka 120a6e
    ParamField *field = MAKE(this, paramName, param);                          \
Shinya Kitaoka 120a6e
    if (!field) return NULL;                                                   \
Shinya Kitaoka 120a6e
    m_fields.push_back(field);                                                 \
Shinya Kitaoka 120a6e
    connect(field, SIGNAL(currentParamChanged()), m_paramViewer,               \
Shinya Kitaoka 120a6e
            SIGNAL(currentFxParamChanged()));                                  \
Shinya Kitaoka 120a6e
    connect(field, SIGNAL(actualParamChanged()), m_paramViewer,                \
Shinya Kitaoka 120a6e
            SIGNAL(actualFxParamChanged()));                                   \
Shinya Kitaoka 120a6e
    connect(field, SIGNAL(paramKeyToggle()), m_paramViewer,                    \
Shinya Kitaoka 120a6e
            SIGNAL(paramKeyChanged()));                                        \
Shinya Kitaoka 120a6e
    return field;                                                              \
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TOONZ_DEFINE_NEW_COMPONENT(newParamField, ParamField::create);
Toshihiro Shimizu 890ddd
TOONZ_DEFINE_NEW_COMPONENT(newLineEdit, make_lineedit);
Toshihiro Shimizu 890ddd
TOONZ_DEFINE_NEW_COMPONENT(newSlider, make_slider);
Toshihiro Shimizu 890ddd
TOONZ_DEFINE_NEW_COMPONENT(newSpinBox, make_spinbox);
Toshihiro Shimizu 890ddd
TOONZ_DEFINE_NEW_COMPONENT(newCheckBox, make_checkbox);
Toshihiro Shimizu 890ddd
TOONZ_DEFINE_NEW_COMPONENT(newRadioButton, make_radiobutton);
Toshihiro Shimizu 890ddd
TOONZ_DEFINE_NEW_COMPONENT(newComboBox, make_combobox);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 810553
#undef TOONZ_DEFINE_NEW_COMPONENT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPage::setFx(const TFxP ¤tFx, const TFxP &actualFx, int frame) {
Shinya Kitaoka 120a6e
  assert(currentFx);
Shinya Kitaoka 120a6e
  assert(actualFx);
Shinya Kitaoka 120a6e
  for (int i = 0; i < (int)m_fields.size(); i++) {
Shinya Kitaoka 120a6e
    ParamField *field = m_fields[i];
Shinya Kitaoka 120a6e
    QString fieldName = field->getParamName();
shun-iwasawa 6d5bbe
    TFxP fx           = getCurrentFx(currentFx, actualFx->getFxId());
Shinya Kitaoka 120a6e
    assert(fx.getPointer());
Shinya Kitaoka 120a6e
    TParamP currentParam =
Shinya Kitaoka 120a6e
        currentFx->getParams()->getParam(fieldName.toStdString());
Shinya Kitaoka 120a6e
    TParamP actualParam =
Shinya Kitaoka 120a6e
        actualFx->getParams()->getParam(fieldName.toStdString());
Shinya Kitaoka 120a6e
    assert(currentParam);
Shinya Kitaoka 120a6e
    assert(actualParam);
Shinya Kitaoka 120a6e
    field->setParam(currentParam, actualParam, frame);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (actualFx->getInputPortCount() > 0)
Shinya Kitaoka 120a6e
    m_fxHistogramRender->computeHistogram(actualFx->getInputPort(0)->getFx(),
Shinya Kitaoka 120a6e
                                          frame);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPage::setPointValue(int index, const TPointD &p) {
Shinya Kitaoka 120a6e
  if (0 <= index && index < (int)m_fields.size())
Shinya Kitaoka 120a6e
    m_fields[index]->setPointValue(p);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPage::update(int frame) {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < (int)m_fields.size(); i++) {
Shinya Kitaoka 120a6e
    ParamField *field = m_fields[i];
Shinya Kitaoka 120a6e
    field->update(frame);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
shun_iwasawa a0fb33
QSize getItemSize(QLayoutItem *item) {
shun_iwasawa a0fb33
  // layout case
shun_iwasawa a0fb33
  QHBoxLayout *hLay = dynamic_cast<qhboxlayout *="">(item->layout());</qhboxlayout>
shun_iwasawa a0fb33
  if (hLay) {
shun_iwasawa a0fb33
    int tmpWidth = 0, tmpHeight = 0;
shun_iwasawa a0fb33
    for (int c = 0; c < hLay->count(); c++) {
shun_iwasawa a0fb33
      QLayoutItem *subItem = hLay->itemAt(c);
shun_iwasawa a0fb33
      if (!subItem) continue;
shun_iwasawa a0fb33
      QSize subItemSize = getItemSize(subItem);
shun_iwasawa a0fb33
      tmpWidth += subItemSize.width();
shun_iwasawa a0fb33
      if (tmpHeight < subItemSize.height()) tmpHeight = subItemSize.height();
shun_iwasawa a0fb33
    }
shun_iwasawa a0fb33
    tmpWidth += (hLay->count() - 1) * 5;
shun_iwasawa a0fb33
    return QSize(tmpWidth, tmpHeight);
shun_iwasawa a0fb33
  }
shun_iwasawa a0fb33
shun_iwasawa a0fb33
  ParamField *pF = dynamic_cast<paramfield *="">(item->widget());</paramfield>
luz paz f71e6c
  if (pF) return pF->getPreferredSize();
shun_iwasawa a0fb33
shun_iwasawa a0fb33
  Separator *sep = dynamic_cast<separator *="">(item->widget());</separator>
shun_iwasawa a0fb33
  if (sep) return QSize(0, 16);
shun_iwasawa a0fb33
shun_iwasawa a0fb33
  Histogram *histo = dynamic_cast<histogram *="">(item->widget());</histogram>
shun_iwasawa a0fb33
  if (histo) return QSize(278, 162);
shun_iwasawa a0fb33
shun-iwasawa cac18a
  RgbLinkButtons *linkBut = dynamic_cast<rgblinkbuttons *="">(item->widget());</rgblinkbuttons>
shun_iwasawa a0fb33
  if (linkBut) return QSize(0, 21);
shun_iwasawa a0fb33
shun_iwasawa a0fb33
  return QSize();
shun_iwasawa a0fb33
}
shun_iwasawa a0fb33
Shinya Kitaoka 120a6e
void updateMaximumPageSize(QGridLayout *layout, int &maxLabelWidth,
Shinya Kitaoka 120a6e
                           int &maxWidgetWidth, int &fieldsHeight) {
Shinya Kitaoka 120a6e
  /*-- Label側の横幅の最大値を得る --*/
Shinya Kitaoka 120a6e
  for (int r = 0; r < layout->rowCount(); r++) {
Shinya Kitaoka 120a6e
    /*-- アイテムが無ければ次の行へ --*/
Shinya Kitaoka 120a6e
    if (!layout->itemAtPosition(r, 0)) continue;
Shinya Kitaoka 120a6e
    /*-- ラベルの横幅を得て、最大値を更新していく --*/
Shinya Kitaoka 120a6e
    QLabel *label =
Shinya Kitaoka 120a6e
        dynamic_cast<qlabel *="">(layout->itemAtPosition(r, 0)->widget());</qlabel>
Shinya Kitaoka 120a6e
    QGroupBox *gBox =
Shinya Kitaoka 120a6e
        dynamic_cast<qgroupbox *="">(layout->itemAtPosition(r, 0)->widget());</qgroupbox>
Shinya Kitaoka 120a6e
    if (label) {
shun-iwasawa 443318
      int tmpWidth = label->fontMetrics().horizontalAdvance(label->text());
Shinya Kitaoka 120a6e
      if (maxLabelWidth < tmpWidth) maxLabelWidth = tmpWidth;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    /*-- PlugInFxのGroupパラメータのサイズ --*/
Shinya Kitaoka 120a6e
    else if (gBox) {
Shinya Kitaoka 120a6e
      QGridLayout *gridLay = dynamic_cast<qgridlayout *="">(gBox->layout());</qgridlayout>
Shinya Kitaoka 120a6e
      if (gridLay) {
Shinya Kitaoka 120a6e
        updateMaximumPageSize(gridLay, maxLabelWidth, maxWidgetWidth,
Shinya Kitaoka 120a6e
                              fieldsHeight);
Shinya Kitaoka 120a6e
        /*-- GroupBoxのマージン --*/
Shinya Kitaoka 120a6e
        maxLabelWidth += 10;
Shinya Kitaoka 120a6e
        maxWidgetWidth += 10;
Shinya Kitaoka 120a6e
        fieldsHeight += 20;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
shun-iwasawa 1b1839
  int itemCount = 0;
Shinya Kitaoka 120a6e
  /*-- Widget側の最適な縦サイズおよび横幅の最大値を得る --*/
Shinya Kitaoka 120a6e
  for (int r = 0; r < layout->rowCount(); r++) {
Shinya Kitaoka 120a6e
    /*-- Column1にある可能性のあるもの:ParamField, Histogram, Layout,
shun-iwasawa cac18a
     * RgbLinkButtons --*/
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QLayoutItem *item = layout->itemAtPosition(r, 1);
shun-iwasawa 1b1839
    if (!item || (item->widget() && item->widget()->isHidden())) continue;
shun_iwasawa a0fb33
shun-iwasawa 6e910b
    ModeSensitiveBox *box = dynamic_cast<modesensitivebox *="">(item->widget());</modesensitivebox>
shun-iwasawa 6e910b
    if (box) {
shun-iwasawa 1b1839
      if (!box->isActive()) continue;
shun-iwasawa 6e910b
      // if (box->isHidden()) continue;
shun-iwasawa 6e910b
      QGridLayout *innerLay = dynamic_cast<qgridlayout *="">(box->layout());</qgridlayout>
shun-iwasawa 6e910b
      if (!innerLay) continue;
shun-iwasawa 6e910b
      int tmpHeight = 0;
shun-iwasawa 6e910b
      updateMaximumPageSize(innerLay, maxLabelWidth, maxWidgetWidth, tmpHeight);
shun-iwasawa 6e910b
shun-iwasawa 1b1839
      fieldsHeight += tmpHeight;
shun-iwasawa 1b1839
shun-iwasawa 6e910b
      innerLay->setColumnMinimumWidth(0, maxLabelWidth);
shun-iwasawa 6e910b
      continue;
shun-iwasawa 6e910b
    }
shun-iwasawa 6e910b
shun-iwasawa cac18a
    QSize itemSize = getItemSize(item);
shun_iwasawa a0fb33
    if (maxWidgetWidth < itemSize.width()) maxWidgetWidth = itemSize.width();
shun_iwasawa a0fb33
    fieldsHeight += itemSize.height();
shun-iwasawa 1b1839
    itemCount++;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
shun-iwasawa 1b1839
  if (itemCount >= 1) fieldsHeight += itemCount * 10;
Toshihiro Shimizu 890ddd
}
shun-iwasawa cac18a
};  // namespace
Toshihiro Shimizu 890ddd
shun-iwasawa 0ed559
QSize ParamsPage::getPreferredSize() {
Shinya Kitaoka 120a6e
  int maxLabelWidth  = 0;
Shinya Kitaoka 120a6e
  int maxWidgetWidth = 0;
Shinya Kitaoka 120a6e
  int fieldsHeight   = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  updateMaximumPageSize(m_mainLayout, maxLabelWidth, maxWidgetWidth,
Shinya Kitaoka 120a6e
                        fieldsHeight);
shun_iwasawa a0fb33
  return QSize(maxLabelWidth + maxWidgetWidth +
shun_iwasawa a0fb33
                   m_mainLayout->horizontalSpacing() +
shun_iwasawa a0fb33
                   2 * m_mainLayout->margin(),
shun_iwasawa a0fb33
               fieldsHeight + 2 * m_mainLayout->margin() +
shun_iwasawa a0fb33
                   31 /* spacing for the swatch */);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// ParamsPageSet
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParamsPageSet::ParamsPageSet(QWidget *parent, Qt::WindowFlags flags)
Shinya Kitaoka 120a6e
    : QWidget(parent, flags)
shun-iwasawa 0ed559
    , m_preferredSize(0, 0)
Shinya Kitaoka 120a6e
    , m_helpFilePath("")
Shinya Kitaoka 120a6e
    , m_helpCommand("") {
Shinya Kitaoka 120a6e
  // TabBar
Shinya Kitaoka 120a6e
  m_tabBar = new TabBar(this);
Shinya Kitaoka 120a6e
  // This widget is used to set the background color of the tabBar
Kite 521c84
  // using the styleSheet and to draw the two lines on the bottom size.
Shinya Kitaoka 120a6e
  m_tabBarContainer = new TabBarContainter(this);
Shinya Kitaoka 120a6e
  m_pagesList       = new QStackedWidget(this);
Shinya Kitaoka 120a6e
Kite 521c84
  m_helpButton = new QPushButton(tr(""), this);
Kite 521c84
  m_helpButton->setIconSize(QSize(20, 20));
Kite 521c84
  m_helpButton->setIcon(createQIcon("help"));
Kite 521c84
  m_helpButton->setFixedWidth(28);
Kite 521c84
  m_helpButton->setToolTip(tr("View help page"));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_parent = dynamic_cast<paramviewer *="">(parent);</paramviewer>
Shinya Kitaoka 120a6e
  m_pageFxIndexTable.clear();
Shinya Kitaoka 120a6e
  m_tabBar->setDrawBase(false);
Shinya Kitaoka 120a6e
  m_tabBar->setObjectName("FxSettingsTabBar");
Shinya Kitaoka 120a6e
  m_helpButton->setFixedHeight(20);
Shinya Kitaoka 120a6e
  m_helpButton->setObjectName("FxSettingsHelpButton");
Shinya Kitaoka 120a6e
  m_helpButton->setFocusPolicy(Qt::NoFocus);
Shinya Kitaoka 120a6e
shun-iwasawa 481b59
  m_warningMark = new QLabel(this);
shun-iwasawa 481b59
  static QIcon warningIcon(":Resources/paramignored_on.svg");
shun-iwasawa 481b59
  m_warningMark->setPixmap(warningIcon.pixmap(QSize(22, 22)));
shun-iwasawa 481b59
  m_warningMark->setFixedSize(22, 22);
shun-iwasawa 481b59
  m_warningMark->setStyleSheet(
shun-iwasawa 481b59
      "margin: 0px; padding: 0px; background-color: rgba(0,0,0,0);");
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
  //----layout
Shinya Kitaoka 120a6e
  QVBoxLayout *mainLayout = new QVBoxLayout();
Kite 521c84
  mainLayout->setMargin(0);
Shinya Kitaoka 120a6e
  mainLayout->setSpacing(0);
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    QHBoxLayout *hLayout = new QHBoxLayout();
Shinya Kitaoka 120a6e
    hLayout->setMargin(0);
Kite 521c84
    hLayout->addSpacing(0);
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      hLayout->addWidget(m_tabBar);
shun-iwasawa 481b59
      hLayout->addWidget(m_warningMark);
Shinya Kitaoka 120a6e
      hLayout->addStretch(1);
Shinya Kitaoka 120a6e
      hLayout->addWidget(m_helpButton);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_tabBarContainer->setLayout(hLayout);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    mainLayout->addWidget(m_tabBarContainer);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    mainLayout->addWidget(m_pagesList);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    mainLayout->addWidget(new Separator("", this), 0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  setLayout(mainLayout);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(m_tabBar, SIGNAL(currentChanged(int)), this, SLOT(setPage(int)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_helpButton->hide();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
ParamsPageSet::~ParamsPageSet() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::setPage(int index) {
Shinya Kitaoka 120a6e
  if (m_tabBar->count() == 0 || m_pagesList->count() == 0) return;
Shinya Kitaoka 120a6e
  assert(index >= 0 && index < m_pagesList->count());
Shinya Kitaoka 120a6e
  m_pagesList->setCurrentIndex(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::setFx(const TFxP ¤tFx, const TFxP &actualFx,
Shinya Kitaoka 120a6e
                          int frame) {
Shinya Kitaoka 120a6e
  TMacroFx *currentFxMacro = dynamic_cast<tmacrofx *="">(currentFx.getPointer());</tmacrofx>
Shinya Kitaoka 120a6e
  if (currentFxMacro) {
Shinya Kitaoka 120a6e
    TMacroFx *actualFxMacro = dynamic_cast<tmacrofx *="">(actualFx.getPointer());</tmacrofx>
Shinya Kitaoka 120a6e
    assert(actualFxMacro);
Shinya Kitaoka 120a6e
    const std::vector<tfxp> ¤tFxMacroFxs = currentFxMacro->getFxs();</tfxp>
Shinya Kitaoka 120a6e
    const std::vector<tfxp> &actualFxMacroFxs  = actualFxMacro->getFxs();</tfxp>
Shinya Kitaoka 120a6e
    assert(currentFxMacroFxs.size() == actualFxMacroFxs.size());
Shinya Kitaoka 120a6e
    for (int i = 0; i < m_pagesList->count(); i++) {
Shinya Kitaoka 120a6e
      ParamsPage *page = getParamsPage(i);
Shinya Kitaoka 120a6e
      if (!page || !m_pageFxIndexTable.contains(page)) continue;
Shinya Kitaoka 120a6e
      int index = m_pageFxIndexTable[page];
Shinya Kitaoka 120a6e
      page->setFx(currentFxMacroFxs[index], actualFxMacroFxs[index], frame);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    for (int i = 0; i < m_pagesList->count(); i++) {
Shinya Kitaoka 120a6e
      ParamsPage *page = getParamsPage(i);
Shinya Kitaoka 120a6e
      if (!page) continue;
Shinya Kitaoka 120a6e
      page->setFx(currentFx, actualFx, frame);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::updatePage(int frame, bool onlyParam) {
Shinya Kitaoka 120a6e
  if (!m_pagesList) return;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < m_pagesList->count(); i++) {
Shinya Kitaoka 120a6e
    ParamsPage *page = getParamsPage(i);
Shinya Kitaoka 120a6e
    if (!page) continue;
Shinya Kitaoka 120a6e
    page->update(frame);
Shinya Kitaoka 120a6e
    if (!onlyParam) page->getFxHistogramRender()->invalidateFrame(frame);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::setScene(ToonzScene *scene) {
Shinya Kitaoka 120a6e
  if (!m_pagesList) return;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < m_pagesList->count(); i++) {
Shinya Kitaoka 120a6e
    ParamsPage *page = getParamsPage(i);
Shinya Kitaoka 120a6e
    if (!page) continue;
Shinya Kitaoka 120a6e
    page->getFxHistogramRender()->setScene(scene);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::setIsCameraViewMode(bool isCameraViewMode) {
Shinya Kitaoka 120a6e
  if (!m_pagesList) return;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < m_pagesList->count(); i++) {
Shinya Kitaoka 120a6e
    ParamsPage *page = getParamsPage(i);
Shinya Kitaoka 120a6e
    if (!page) continue;
Shinya Kitaoka 120a6e
    page->getFxHistogramRender()->setIsCameraViewMode(isCameraViewMode);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
ParamsPage *ParamsPageSet::createParamsPage() {
Shinya Kitaoka 120a6e
  return new ParamsPage(this, m_parent);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::addParamsPage(ParamsPage *page, const char *name) {
Shinya Kitaoka 120a6e
  /*-- このFxで最大サイズのページに合わせてダイアログをリサイズ --*/
shun-iwasawa 0ed559
  QSize pagePreferredSize = page->getPreferredSize();
shun-iwasawa 0ed559
  m_preferredSize         = m_preferredSize.expandedTo(
shun-iwasawa 832993
      pagePreferredSize + QSize(m_tabBarContainer->height() + 2,
shun-iwasawa 3ca3c2
                                        2)); /*-- 2は上下左右のマージン --*/
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QScrollArea *pane = new QScrollArea(this);
Shinya Kitaoka 120a6e
  pane->setWidgetResizable(true);
Shinya Kitaoka 120a6e
  pane->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Shinya Kitaoka 120a6e
  pane->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
Shinya Kitaoka 120a6e
  pane->setWidget(page);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_tabBar->addSimpleTab(QString::fromUtf8(name));
Shinya Kitaoka 120a6e
  m_pagesList->addWidget(pane);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::createControls(const TFxP &fx, int index) {
Shinya Kitaoka 120a6e
  if (TMacroFx *macroFx = dynamic_cast<tmacrofx *="">(fx.getPointer())) {</tmacrofx>
Shinya Kitaoka 120a6e
    const std::vector<tfxp> &fxs = macroFx->getFxs();</tfxp>
Shinya Kitaoka 120a6e
    for (int i = 0; i < (int)fxs.size(); i++) createControls(fxs[i], i);
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (RasterFxPluginHost *plugin =
Shinya Kitaoka 120a6e
          dynamic_cast<rasterfxpluginhost *="">(fx.getPointer())) {</rasterfxpluginhost>
Shinya Kitaoka 120a6e
    plugin->build(this);
Shinya Kitaoka 120a6e
    std::string url = plugin->getUrl();
Shinya Kitaoka 120a6e
    if (!url.empty()) {
Shinya Kitaoka 120a6e
      connect(m_helpButton, SIGNAL(pressed()), this, SLOT(openHelpUrl()));
Shinya Kitaoka 120a6e
      m_helpButton->show();
Shinya Kitaoka 120a6e
      m_helpUrl = url;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFilePath fp = ToonzFolder::getProfileFolder() + "layouts" + "fxs" +
Shinya Kitaoka 120a6e
                 (fx->getFxType() + ".xml");
shun-iwasawa 5b724a
Shinya Kitaoka 120a6e
  TIStream is(fp);
Shinya Kitaoka 120a6e
  if (!is) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (fx->getParams()->getParamCount()) {
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      std::string tagName;
Shinya Kitaoka 120a6e
      if (!is.matchTag(tagName) || tagName != "fxlayout")
Shinya Kitaoka 120a6e
        throw TException("expected <fxlayout>");</fxlayout>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      m_helpFilePath = is.getTagAttribute("help_file");
Shinya Kitaoka 120a6e
      if (m_helpFilePath != "") {
Shinya Kitaoka 120a6e
        connect(m_helpButton, SIGNAL(pressed()), this, SLOT(openHelpFile()));
Shinya Kitaoka 120a6e
        m_helpButton->show();
Shinya Kitaoka 120a6e
        /*-- pdfファイルのページ指定など、引数が必要な場合の追加fragmentを取得
Shinya Kitaoka 120a6e
         * --*/
Shinya Kitaoka 120a6e
        m_helpCommand = is.getTagAttribute("help_command");
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      while (!is.matchEndTag()) createPage(is, fx, index);
Shinya Kitaoka 120a6e
    } catch (TException const &) {
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // else createEmptyPage();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
ParamsPage *ParamsPageSet::getCurrentParamsPage() const {
Shinya Kitaoka 120a6e
  QScrollArea *scrollAreaPage =
Shinya Kitaoka 120a6e
      dynamic_cast<qscrollarea *="">(m_pagesList->currentWidget());</qscrollarea>
Shinya Kitaoka 120a6e
  assert(scrollAreaPage);
Shinya Kitaoka 120a6e
  return dynamic_cast<paramspage *="">(scrollAreaPage->widget());</paramspage>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
ParamsPage *ParamsPageSet::getParamsPage(int index) const {
Shinya Kitaoka 120a6e
  QScrollArea *scrollAreaPage =
Shinya Kitaoka 120a6e
      dynamic_cast<qscrollarea *="">(m_pagesList->widget(index));</qscrollarea>
Shinya Kitaoka 120a6e
  assert(scrollAreaPage);
Shinya Kitaoka 120a6e
  return dynamic_cast<paramspage *="">(scrollAreaPage->widget());</paramspage>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::createPage(TIStream &is, const TFxP &fx, int index) {
Shinya Kitaoka 120a6e
  std::string tagName;
Shinya Kitaoka 120a6e
  if (!is.matchTag(tagName) || tagName != "page")
Shinya Kitaoka 120a6e
    throw TException("expected <page>");</page>
shun-iwasawa d76928
  std::string pageName = is.getTagAttribute("name");
Shinya Kitaoka 120a6e
  if (pageName == "") pageName = "page";
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ParamsPage *paramsPage = new ParamsPage(this, m_parent);
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  bool isFirstPageOfFx;
shun-iwasawa 8cac36
  if (index < 0)
shun-iwasawa 8cac36
    isFirstPageOfFx = (m_pagesList->count() == 0);
shun-iwasawa 8cac36
  else  // macro fx case
shun-iwasawa 8cac36
    isFirstPageOfFx = !(m_pageFxIndexTable.values().contains(index));
shun-iwasawa 8cac36
shun-iwasawa 8cac36
  paramsPage->setPage(is, fx, isFirstPageOfFx);
Shinya Kitaoka 120a6e
shun-iwasawa 0ed559
  connect(paramsPage, SIGNAL(preferredPageSizeChanged()), this,
shun-iwasawa 0ed559
          SLOT(recomputePreferredSize()));
shun-iwasawa 0ed559
Shinya Kitaoka 120a6e
  /*-- このFxで最大サイズのページに合わせてダイアログをリサイズ --*/
shun-iwasawa 0ed559
  QSize pagePreferredSize = paramsPage->getPreferredSize();
shun-iwasawa 0ed559
  m_preferredSize         = m_preferredSize.expandedTo(
shun-iwasawa 832993
      pagePreferredSize + QSize(m_tabBarContainer->height() + 2,
shun-iwasawa 3ca3c2
                                        2)); /*-- 2は上下左右のマージン --*/
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QScrollArea *scrollAreaPage = new QScrollArea(this);
Shinya Kitaoka 120a6e
  scrollAreaPage->setWidgetResizable(true);
Shinya Kitaoka 120a6e
  scrollAreaPage->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
Shinya Kitaoka 120a6e
  scrollAreaPage->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
Shinya Kitaoka 120a6e
  scrollAreaPage->setWidget(paramsPage);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QString str;
Shinya Kitaoka 120a6e
  m_tabBar->addSimpleTab(str.fromStdString(pageName));
Shinya Kitaoka 120a6e
  m_pagesList->addWidget(scrollAreaPage);
Shinya Kitaoka 120a6e
  if (index >= 0) m_pageFxIndexTable[paramsPage] = index;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun-iwasawa 0ed559
void ParamsPageSet::recomputePreferredSize() {
shun-iwasawa 0ed559
  QSize newSize(0, 0);
shun-iwasawa 0ed559
  for (int i = 0; i < m_pagesList->count(); i++) {
shun-iwasawa 0ed559
    QScrollArea *area = dynamic_cast<qscrollarea *="">(m_pagesList->widget(i));</qscrollarea>
shun-iwasawa 0ed559
    if (!area) continue;
shun-iwasawa 0ed559
    ParamsPage *page = dynamic_cast<paramspage *="">(area->widget());</paramspage>
shun-iwasawa 0ed559
    if (!page) continue;
shun-iwasawa 0ed559
    QSize pagePreferredSize = page->getPreferredSize();
shun-iwasawa 0ed559
    newSize                 = newSize.expandedTo(pagePreferredSize +
shun-iwasawa 3ca3c2
                                                 QSize(m_tabBarContainer->height() + 2, 2));
shun-iwasawa 0ed559
  }
shun-iwasawa 0ed559
  if (!newSize.isEmpty()) {
shun-iwasawa 0ed559
    m_preferredSize = newSize;
shun-iwasawa 0ed559
    // resize the parent FxSettings
shun-iwasawa 0ed559
    m_parent->notifyPreferredSizeChanged(m_preferredSize + QSize(2, 50));
shun-iwasawa 0ed559
  }
shun-iwasawa 0ed559
}
shun-iwasawa 0ed559
shun-iwasawa 0ed559
//-----------------------------------------------------------------------------
shun-iwasawa 0ed559
Toshihiro Shimizu 890ddd
/* TODO: Webサイト内のヘルプに対応すべきか検討 2016.02.01 shun_iwasawa */
Shinya Kitaoka 120a6e
void ParamsPageSet::openHelpFile() {
Shinya Kitaoka 120a6e
  if (m_helpFilePath == "") return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // if (m_helpCommand != "")
Shinya Kitaoka 120a6e
  //	commandString += m_helpCommand + " ";
Shinya Kitaoka 120a6e
shun-iwasawa 5b724a
  // Get UI language as set in "Preferences"
shun-iwasawa 5b724a
  QString currentLanguage = Preferences::instance()->getCurrentLanguage();
shun-iwasawa 5b724a
  std::string helpDocLang = currentLanguage.toStdString();
shun-iwasawa 5b724a
shun-iwasawa 5b724a
  // Assume associated language subdir exists
shun-iwasawa 5b724a
  TFilePath helpFp = TEnv::getStuffDir() + "doc" + helpDocLang + m_helpFilePath;
shun-iwasawa 5b724a
shun-iwasawa 5b724a
  // Verify subdir exists; if not, default to standard doc dir
shun-iwasawa 5b724a
  if (!TFileStatus(helpFp).doesExist()) {
shun-iwasawa 5b724a
    helpFp = TEnv::getStuffDir() + "doc" + m_helpFilePath;
shun-iwasawa 5b724a
  }
shun-iwasawa 5b724a
Shinya Kitaoka 120a6e
  // commandString +=
Shinya Kitaoka 120a6e
  // QString::fromStdWString(helpFp.getWideString()).toStdString();
Shinya Kitaoka 120a6e
  // QString command = QString::fromStdString(m_helpFilePath);
Shinya Kitaoka 120a6e
  // system(commandString.c_str());
Shinya Kitaoka 120a6e
  // QProcess process;
Shinya Kitaoka 120a6e
  // process.start(command);
Shinya Kitaoka 120a6e
  QDesktopServices::openUrl(
Shinya Kitaoka 120a6e
      QUrl::fromLocalFile(QString::fromStdWString(helpFp.getWideString())));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamsPageSet::openHelpUrl() {
Shinya Kitaoka 120a6e
  QDesktopServices::openUrl(QUrl(QString(m_helpUrl.c_str())));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
void ParamsPageSet::updateWarnings(const TFxP ¤tFx, bool isFloat) {
shun-iwasawa 481b59
  if (!isFloat) {
shun-iwasawa 481b59
    m_warningMark->hide();
shun-iwasawa 481b59
    return;
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa 481b59
  bool isFloatSupported = true;
shun-iwasawa 481b59
shun-iwasawa 481b59
  TMacroFx *currentFxMacro = dynamic_cast<tmacrofx *="">(currentFx.getPointer());</tmacrofx>
shun-iwasawa 481b59
  if (currentFxMacro) {
shun-iwasawa 481b59
    const std::vector<tfxp> ¤tFxMacroFxs = currentFxMacro->getFxs();</tfxp>
shun-iwasawa 481b59
    for (auto fxP : currentFxMacroFxs) {
shun-iwasawa 481b59
      TRasterFx *rasFx = dynamic_cast<trasterfx *="">(fxP.getPointer());</trasterfx>
shun-iwasawa 481b59
      if (rasFx) {
shun-iwasawa 481b59
        isFloatSupported = isFloatSupported & rasFx->canComputeInFloat();
shun-iwasawa 481b59
      }
shun-iwasawa 481b59
      if (!isFloatSupported) break;
shun-iwasawa 481b59
    }
shun-iwasawa 481b59
  } else {
shun-iwasawa 481b59
    TRasterFx *rasFx = dynamic_cast<trasterfx *="">(currentFx.getPointer());</trasterfx>
shun-iwasawa 481b59
    if (rasFx) {
shun-iwasawa 481b59
      isFloatSupported = rasFx->canComputeInFloat();
shun-iwasawa 481b59
    }
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa 481b59
  bool showFloatWarning = isFloat && !isFloatSupported;
shun-iwasawa 481b59
  if (!showFloatWarning) {
shun-iwasawa 481b59
    m_warningMark->hide();
shun-iwasawa 481b59
    return;
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa 481b59
  QString warningTxt;
shun-iwasawa 481b59
  if (showFloatWarning) {
shun-iwasawa 481b59
    warningTxt +=
shun-iwasawa 481b59
        tr("This Fx does not support rendering in floating point channel width "
shun-iwasawa 481b59
           "(32bit).\n"
shun-iwasawa 481b59
           "The output pixel values from this fx will be clamped to 0.0 - 1.0\n"
shun-iwasawa 481b59
           "and tone may be slightly discretized.");
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
  m_warningMark->setToolTip(warningTxt);
shun-iwasawa 481b59
  m_warningMark->show();
shun-iwasawa 481b59
}
shun-iwasawa 481b59
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// ParamViewer
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParamViewer::ParamViewer(QWidget *parent, Qt::WindowFlags flags)
Shinya Kitaoka 120a6e
    : QFrame(parent, flags), m_fx(0) {
Shinya Kitaoka 120a6e
  m_tablePageSet = new QStackedWidget(this);
Shinya Kitaoka 120a6e
  m_tablePageSet->addWidget(new QWidget());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- SwatchViewerを表示/非表示するボタン --*/
Shinya Kitaoka 120a6e
  QPushButton *showSwatchButton = new QPushButton("", this);
Shinya Kitaoka 120a6e
  QLabel *swatchLabel           = new QLabel(tr("Swatch Viewer"), this);
Shinya Kitaoka 120a6e
shun_iwasawa b102ca
  swatchLabel->setObjectName("TitleTxtLabel");
Kite 521c84
  showSwatchButton->setObjectName("menuToggleButton");
Shinya Kitaoka 120a6e
  showSwatchButton->setFixedSize(15, 15);
Kite 521c84
  showSwatchButton->setIcon(createQIcon("menu_toggle"));
Shinya Kitaoka 120a6e
  showSwatchButton->setCheckable(true);
Shinya Kitaoka 120a6e
  showSwatchButton->setChecked(false);
Shinya Kitaoka 120a6e
  showSwatchButton->setFocusPolicy(Qt::NoFocus);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QVBoxLayout *mainLayout = new QVBoxLayout(this);
Kite 521c84
  mainLayout->setMargin(0);
Shinya Kitaoka 120a6e
  mainLayout->setSpacing(0);
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    mainLayout->addWidget(m_tablePageSet, 1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QHBoxLayout *showPreviewButtonLayout = new QHBoxLayout(this);
Shinya Kitaoka 120a6e
    showPreviewButtonLayout->setMargin(3);
Shinya Kitaoka 120a6e
    showPreviewButtonLayout->setSpacing(3);
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      showPreviewButtonLayout->addWidget(showSwatchButton, 0);
Shinya Kitaoka 120a6e
      showPreviewButtonLayout->addWidget(swatchLabel, 0);
Shinya Kitaoka 120a6e
      showPreviewButtonLayout->addStretch(1);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    mainLayout->addLayout(showPreviewButtonLayout, 0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  setLayout(mainLayout);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(showSwatchButton, SIGNAL(toggled(bool)), this,
Shinya Kitaoka 120a6e
          SIGNAL(showSwatchButtonToggled(bool)));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
ParamViewer::~ParamViewer() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamViewer::setFx(const TFxP ¤tFx, const TFxP &actualFx, int frame,
Shinya Kitaoka 120a6e
                        ToonzScene *scene) {
Shinya Kitaoka 120a6e
  if (!actualFx) {
Shinya Kitaoka 120a6e
    m_tablePageSet->setCurrentIndex(0);
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  std::string name = actualFx->getFxType();
Shinya Kitaoka 120a6e
  if (name == "macroFx") {
Shinya Kitaoka 120a6e
    TMacroFx *macroFx = dynamic_cast<tmacrofx *="">(currentFx.getPointer());</tmacrofx>
Shinya Kitaoka 120a6e
    if (macroFx) name = macroFx->getMacroFxType();
shun-iwasawa 6d5bbe
  } else {
shun-iwasawa 6d5bbe
    name += std::to_string(actualFx->getFxVersion());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int currentIndex = -1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMap<std::string, int="">::iterator it;</std::string,>
Shinya Kitaoka 120a6e
  it = m_tableFxIndex.find(name);
Shinya Kitaoka 120a6e
  if (it == m_tableFxIndex.end()) {
Shinya Kitaoka 120a6e
    ParamsPageSet *pageSet = new ParamsPageSet(this);
Shinya Kitaoka 120a6e
    currentIndex           = m_tablePageSet->addWidget(pageSet);
Shinya Kitaoka 120a6e
    m_tableFxIndex[name]   = currentIndex;
Shinya Kitaoka 120a6e
    pageSet->createControls(actualFx);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    currentIndex = it.value();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  assert(currentIndex >= 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_tablePageSet->setCurrentIndex(currentIndex);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  getCurrentPageSet()->setScene(scene);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_fx != currentFx) {
Shinya Kitaoka 120a6e
    getCurrentPageSet()->setFx(currentFx, actualFx, frame);
manongjohn b13816
    if (m_actualFx != actualFx) {
manongjohn b13816
      m_actualFx = actualFx;
shun-iwasawa 0ed559
      QSize pageViewerPreferredSize =
shun-iwasawa 0ed559
          getCurrentPageSet()->getPreferredSize() + QSize(2, 50);
shun-iwasawa 0ed559
      emit preferredSizeChanged(pageViewerPreferredSize);
manongjohn b13816
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamViewer::setScene(ToonzScene *scene) {
Shinya Kitaoka 120a6e
  ParamsPageSet *paramsPageSet = getCurrentPageSet();
Shinya Kitaoka 120a6e
  if (!paramsPageSet) return;
Shinya Kitaoka 120a6e
  paramsPageSet->setScene(scene);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamViewer::setIsCameraViewMode(bool isCameraViewMode) {
Shinya Kitaoka 120a6e
  ParamsPageSet *paramsPageSet = getCurrentPageSet();
Shinya Kitaoka 120a6e
  if (!paramsPageSet) return;
Shinya Kitaoka 120a6e
  paramsPageSet->setIsCameraViewMode(isCameraViewMode);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamViewer::update(int frame, bool onlyParam) {
Shinya Kitaoka 120a6e
  ParamsPageSet *paramsPageSet = getCurrentPageSet();
Shinya Kitaoka 120a6e
  if (!paramsPageSet) return;
Shinya Kitaoka 120a6e
  paramsPageSet->updatePage(frame, onlyParam);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void ParamViewer::setPointValue(int index, const TPointD &p) {
Shinya Kitaoka 120a6e
  // Search the index-th param among all pages
Shinya Kitaoka 120a6e
  ParamsPageSet *pageSet = getCurrentPageSet();
Shinya Kitaoka 120a6e
  ParamsPage *page       = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (int i = 0; i < pageSet->getParamsPageCount(); ++i) {
Shinya Kitaoka 120a6e
    page            = pageSet->getParamsPage(i);
Shinya Kitaoka 120a6e
    int paramsCount = page->m_fields.count();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    if (index <= paramsCount) break;
Shinya Kitaoka 120a6e
    index -= paramsCount;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (page) page->setPointValue(index, p);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
ParamsPageSet *ParamViewer::getCurrentPageSet() const {
Shinya Kitaoka 120a6e
  return dynamic_cast<paramspageset *="">(m_tablePageSet->currentWidget());</paramspageset>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
//-----------------------------------------------------------------------------
shun-iwasawa 481b59
// show warning if the current Fx does not support float / linear rendering
shun-iwasawa 481b59
void ParamViewer::updateWarnings(const TFxP ¤tFx, bool isFloat) {
shun-iwasawa 481b59
  if (getCurrentPageSet())
shun-iwasawa 481b59
    getCurrentPageSet()->updateWarnings(currentFx, isFloat);
shun-iwasawa 481b59
}
shun-iwasawa 481b59
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// FxSettings
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
FxSettings::FxSettings(QWidget *parent, const TPixel32 &checkCol1,
Shinya Kitaoka 120a6e
                       const TPixel32 &checkCol2)
Shinya Kitaoka 120a6e
    : QSplitter(Qt::Vertical, parent)
Shinya Kitaoka 120a6e
    , m_frameHandle(0)
Shinya Kitaoka 120a6e
    , m_fxHandle(0)
Shinya Kitaoka 120a6e
    , m_xsheetHandle(0)
Shinya Kitaoka 120a6e
    , m_sceneHandle(0)
Shinya Kitaoka 120a6e
    , m_levelHandle(0)
Shinya Kitaoka 120a6e
    , m_objectHandle(0)
Shinya Kitaoka 120a6e
    , m_checkCol1(checkCol1)
Shinya Kitaoka 120a6e
    , m_checkCol2(checkCol2)
Shinya Kitaoka 120a6e
    , m_isCameraModeView(false)
manongjohn b13816
    , m_container_height(184)
manongjohn b13816
    , m_container_width(390) {
Shinya Kitaoka 120a6e
  // param viewer
Shinya Kitaoka 120a6e
  m_paramViewer = new ParamViewer(this);
Shinya Kitaoka 120a6e
  // swatch
Shinya Kitaoka 120a6e
  QWidget *swatchContainer = new QWidget(this);
Shinya Kitaoka 120a6e
  m_viewer                 = new SwatchViewer(swatchContainer);
Shinya Kitaoka 120a6e
  setWhiteBg();
Shinya Kitaoka 120a6e
  createToolBar();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_paramViewer->setMinimumHeight(50);
Shinya Kitaoka 120a6e
  swatchContainer->setSizePolicy(QSizePolicy::MinimumExpanding,
Shinya Kitaoka 120a6e
                                 QSizePolicy::MinimumExpanding);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //---layout
Shinya Kitaoka 120a6e
  addWidget(m_paramViewer);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QVBoxLayout *swatchLayout = new QVBoxLayout(swatchContainer);
Shinya Kitaoka 120a6e
  swatchLayout->setMargin(0);
Shinya Kitaoka 120a6e
  swatchLayout->setSpacing(0);
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    swatchLayout->addWidget(m_viewer, 0, Qt::AlignHCenter);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QHBoxLayout *toolBarLayout = new QHBoxLayout(swatchContainer);
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      toolBarLayout->addWidget(m_toolBar, 0,
Shinya Kitaoka 120a6e
                               Qt::AlignHCenter | Qt::AlignBottom);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    swatchLayout->addLayout(toolBarLayout);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  swatchContainer->setLayout(swatchLayout);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  addWidget(swatchContainer);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //---signal-slot connections
Shinya Kitaoka 120a6e
  bool ret = true;
Shinya Kitaoka 120a6e
  ret      = ret && connect(m_paramViewer, SIGNAL(currentFxParamChanged()),
shun-iwasawa 3ca3c2
                            SLOT(updateViewer()));
shun-iwasawa d76928
  ret      = ret &&
Shinya Kitaoka 120a6e
        connect(m_viewer, SIGNAL(pointPositionChanged(int, const TPointD &)),
Shinya Kitaoka 120a6e
                SLOT(onPointChanged(int, const TPointD &)));
shun-iwasawa 0ed559
  ret = ret && connect(m_paramViewer, SIGNAL(preferredSizeChanged(QSize)), this,
shun-iwasawa 0ed559
                       SLOT(onPreferredSizeChanged(QSize)));
Shinya Kitaoka 120a6e
  ret = ret && connect(m_paramViewer, SIGNAL(showSwatchButtonToggled(bool)),
Shinya Kitaoka 120a6e
                       this, SLOT(onShowSwatchButtonToggled(bool)));
Shinya Kitaoka 120a6e
  assert(ret);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  swatchContainer->hide();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Swatch updates should happen only at the end of a separator resize op.
Shinya Kitaoka 120a6e
  setStretchFactor(0, 1);
Shinya Kitaoka 120a6e
  setStretchFactor(1, 0);
Shinya Kitaoka 120a6e
  setOpaqueResize(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
FxSettings::~FxSettings() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setFxHandle(TFxHandle *fxHandle) {
Shinya Kitaoka 120a6e
  m_fxHandle = fxHandle;
Shinya Kitaoka 120a6e
  m_keyframeNavigator->setFxHandle(m_fxHandle);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ParamField::setFxHandle(m_fxHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setFrameHandle(TFrameHandle *frameHandle) {
Shinya Kitaoka 120a6e
  m_frameHandle = frameHandle;
Shinya Kitaoka 120a6e
  m_keyframeNavigator->setFrameHandle(m_frameHandle);
Shinya Kitaoka 120a6e
  m_frameNavigator->setFrameHandle(m_frameHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setXsheetHandle(TXsheetHandle *xsheetHandle) {
Shinya Kitaoka 120a6e
  m_xsheetHandle = xsheetHandle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setSceneHandle(TSceneHandle *sceneHandle) {
Shinya Kitaoka 120a6e
  m_sceneHandle = sceneHandle;
Shinya Kitaoka 120a6e
  setCurrentScene();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setLevelHandle(TXshLevelHandle *levelHandle) {
Shinya Kitaoka 120a6e
  m_levelHandle = levelHandle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setObjectHandle(TObjectHandle *objectHandle) {
Shinya Kitaoka 120a6e
  m_objectHandle = objectHandle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::createToolBar() {
Shinya Kitaoka 120a6e
  m_toolBar = new QToolBar(this);
Shinya Kitaoka 120a6e
  m_toolBar->setMovable(false);
Kite 521c84
  m_toolBar->setFixedHeight(24);
Kite 521c84
  m_toolBar->setIconSize(QSize(20, 20));
shun_iwasawa 4a5f42
  m_toolBar->setObjectName("MediumPaddingToolBar");
Shinya Kitaoka 120a6e
  // m_toolBar->setSizePolicy(QSizePolicy::MinimumExpanding,
Shinya Kitaoka 120a6e
  // QSizePolicy::MinimumExpanding);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // View mode
Shinya Kitaoka 120a6e
  QActionGroup *viewModeActGroup = new QActionGroup(m_toolBar);
Shinya Kitaoka 120a6e
  viewModeActGroup->setExclusive(false);
Shinya Kitaoka 120a6e
  // camera
Kite 521c84
  QIcon camera       = createQIcon("camera");
Shinya Kitaoka 120a6e
  QAction *cameraAct = new QAction(camera, tr("&Camera Preview"), m_toolBar);
Shinya Kitaoka 120a6e
  cameraAct->setCheckable(true);
Shinya Kitaoka 120a6e
  viewModeActGroup->addAction(cameraAct);
Shinya Kitaoka 120a6e
  m_toolBar->addAction(cameraAct);
Shinya Kitaoka 120a6e
  // preview
Kite 521c84
  QIcon preview       = createQIcon("preview");
Shinya Kitaoka 120a6e
  QAction *previewAct = new QAction(preview, tr("&Preview"), m_toolBar);
Shinya Kitaoka 120a6e
  previewAct->setCheckable(true);
Shinya Kitaoka 120a6e
  viewModeActGroup->addAction(previewAct);
Shinya Kitaoka 120a6e
  m_toolBar->addAction(previewAct);
Shinya Kitaoka 120a6e
  connect(viewModeActGroup, SIGNAL(triggered(QAction *)),
Shinya Kitaoka 120a6e
          SLOT(onViewModeChanged(QAction *)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_toolBar->addSeparator();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QActionGroup *viewModeGroup = new QActionGroup(m_toolBar);
Shinya Kitaoka 120a6e
  viewModeGroup->setExclusive(true);
Shinya Kitaoka 120a6e
Kite 521c84
  QAction *whiteBg = new QAction(createQIcon("preview_white"),
Shinya Kitaoka 120a6e
                                 tr("&White Background"), m_toolBar);
Shinya Kitaoka 120a6e
  whiteBg->setCheckable(true);
Shinya Kitaoka 120a6e
  whiteBg->setChecked(true);
Shinya Kitaoka 120a6e
  viewModeGroup->addAction(whiteBg);
Shinya Kitaoka 120a6e
  connect(whiteBg, SIGNAL(triggered()), this, SLOT(setWhiteBg()));
Shinya Kitaoka 120a6e
  m_toolBar->addAction(whiteBg);
Shinya Kitaoka 120a6e
Kite 521c84
  QAction *blackBg = new QAction(createQIcon("preview_black"),
Shinya Kitaoka 120a6e
                                 tr("&Black Background"), m_toolBar);
Shinya Kitaoka 120a6e
  blackBg->setCheckable(true);
Shinya Kitaoka 120a6e
  viewModeGroup->addAction(blackBg);
Shinya Kitaoka 120a6e
  connect(blackBg, SIGNAL(triggered()), this, SLOT(setBlackBg()));
Shinya Kitaoka 120a6e
  m_toolBar->addAction(blackBg);
Shinya Kitaoka 120a6e
Kite 521c84
  m_checkboardBg = new QAction(createQIcon("preview_checkboard"),
Shinya Kitaoka 120a6e
                               tr("&Checkered Background"), m_toolBar);
Shinya Kitaoka 120a6e
  m_checkboardBg->setCheckable(true);
Shinya Kitaoka 120a6e
  viewModeGroup->addAction(m_checkboardBg);
Shinya Kitaoka 120a6e
  connect(m_checkboardBg, SIGNAL(triggered()), this, SLOT(setCheckboardBg()));
Shinya Kitaoka 120a6e
  m_toolBar->addAction(m_checkboardBg);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_toolBar->addSeparator();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_keyframeNavigator = new FxKeyframeNavigator(m_toolBar);
Shinya Kitaoka 120a6e
  m_toolBar->addWidget(m_keyframeNavigator);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_toolBar->addSeparator();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_frameNavigator = new FrameNavigator(m_toolBar);
Shinya Kitaoka 120a6e
  m_frameNavigator->setFrameHandle(m_frameHandle);
Shinya Kitaoka 120a6e
  m_toolBar->addWidget(m_frameNavigator);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setFx(const TFxP ¤tFx, const TFxP &actualFx) {
Shinya Kitaoka 120a6e
  // disconnecting from the fxChanged() signals avoid useless and dangerous
Shinya Kitaoka 120a6e
  // updates!!!
Shinya Kitaoka 120a6e
  if (m_fxHandle)
Shinya Kitaoka 120a6e
    disconnect(m_fxHandle, SIGNAL(fxChanged()), this,
Shinya Kitaoka 120a6e
               SLOT(updateParamViewer()));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TFxP currentFxWithoutCamera = 0;
Shinya Kitaoka 120a6e
  if (currentFx && actualFx)
Shinya Kitaoka 120a6e
    currentFxWithoutCamera = getCurrentFx(currentFx, actualFx->getFxId());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (currentFxWithoutCamera)
Shinya Kitaoka 120a6e
    TFxUtil::setKeyframe(currentFxWithoutCamera, m_frameHandle->getFrameIndex(),
Shinya Kitaoka 120a6e
                         actualFx, m_frameHandle->getFrameIndex());
Toshihiro Shimizu 890ddd
shun-iwasawa d76928
  ToonzScene *scene = 0;
Shinya Kitaoka 120a6e
  if (m_sceneHandle) scene = m_sceneHandle->getScene();
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
  // check if the current render settings are float
shun-iwasawa 481b59
  bool isFloat = false;
shun-iwasawa 481b59
  if (scene) {
shun-iwasawa 481b59
    const TRenderSettings ps =
shun-iwasawa 481b59
        scene->getProperties()->getPreviewProperties()->getRenderSettings();
shun-iwasawa 481b59
    const TRenderSettings os =
shun-iwasawa 481b59
        scene->getProperties()->getOutputProperties()->getRenderSettings();
shun-iwasawa 481b59
    isFloat = (ps.m_bpp == 128) || (os.m_bpp == 128);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa d76928
  int frameIndex = 0;
Shinya Kitaoka 120a6e
  if (m_frameHandle) frameIndex = m_frameHandle->getFrameIndex();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramViewer->setFx(currentFxWithoutCamera, actualFx, frameIndex, scene);
Shinya Kitaoka 120a6e
  m_paramViewer->setIsCameraViewMode(m_isCameraModeView);
shun-iwasawa 481b59
  // show warning if the current Fx does not support float / linear rendering
shun-iwasawa 481b59
  m_paramViewer->updateWarnings(currentFxWithoutCamera, isFloat);
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
  m_viewer->setCameraMode(m_isCameraModeView);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TDimension cameraSize = TDimension(-1, -1);
Shinya Kitaoka 120a6e
  if (scene) cameraSize = scene->getCurrentCamera()->getRes();
Shinya Kitaoka 120a6e
  m_viewer->setCameraSize(cameraSize);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_viewer->setFx(currentFx, actualFx, frameIndex);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_fxHandle)
Shinya Kitaoka 120a6e
    connect(m_fxHandle, SIGNAL(fxChanged()), this, SLOT(updateParamViewer()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setCurrentFrame() {
Shinya Kitaoka 120a6e
  int frame = m_frameHandle->getFrameIndex();
Shinya Kitaoka 120a6e
  m_paramViewer->update(frame, false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // if(m_isCameraModeView)
Shinya Kitaoka 120a6e
  setCurrentFx();
Shinya Kitaoka 120a6e
  m_viewer->updateFrame(frame);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::changeTitleBar(TFx *fx) {
manongjohn b13816
  DockWidget *popup = dynamic_cast<dockwidget *="">(parentWidget());</dockwidget>
Shinya Kitaoka 120a6e
  if (!popup) return;
Toshihiro Shimizu 890ddd
shun-iwasawa 86dc52
  QString titleText(tr("Fx Settings"));
Shinya Kitaoka 120a6e
  if (fx) {
Shinya Kitaoka 120a6e
    titleText += tr(" : ");
Shinya Kitaoka 120a6e
    titleText += QString::fromStdWString(fx->getName());
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  popup->setWindowTitle(titleText);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setCurrentFx() {
Shinya Kitaoka 120a6e
  TFx *currFx = m_fxHandle->getFx();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFxP actualFx, currentFx;
Shinya Kitaoka 120a6e
  if (!currFx || 0 != dynamic_cast<txsheetfx *="">(currFx)) {</txsheetfx>
Shinya Kitaoka 120a6e
    actualFx = currentFx = TFxP();
Shinya Kitaoka 120a6e
    setFx(actualFx, currentFx);
Shinya Kitaoka 120a6e
    changeTitleBar(currentFx.getPointer());
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TFxP fx(currFx);
Shinya Kitaoka 120a6e
  bool hasEmptyInput = false;
Shinya Kitaoka 120a6e
  if (TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx.getPointer()))</tzerarycolumnfx>
Shinya Kitaoka 120a6e
    fx = zfx->getZeraryFx();
Shinya Kitaoka 120a6e
  else
shun-iwasawa d76928
    hasEmptyInput = hasEmptyInputPort(fx);
Shinya Kitaoka 120a6e
  int frame         = m_frameHandle->getFrame();
Shinya Kitaoka 120a6e
  ToonzScene *scene = m_sceneHandle->getScene();
Shinya Kitaoka 120a6e
  actualFx          = fx;
Shinya Kitaoka 120a6e
  bool isEnabled    = actualFx->getAttributes()->isEnabled();
Shinya Kitaoka 120a6e
  actualFx->getAttributes()->enable(true);
Shinya Kitaoka 120a6e
  if (hasEmptyInput)
Shinya Kitaoka 120a6e
    currentFx = actualFx;
shun-iwasawa da0933
  else if (m_viewer->isEnabled()) {
Shinya Kitaoka 120a6e
    if (!m_isCameraModeView)
Shinya Kitaoka 120a6e
      currentFx = buildSceneFx(scene, frame, actualFx, false);
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      const TRenderSettings rs =
Shinya Kitaoka 120a6e
          scene->getProperties()->getPreviewProperties()->getRenderSettings();
Shinya Kitaoka 120a6e
      currentFx = buildPartialSceneFx(scene, (double)frame, actualFx, 1, false);
Shinya Kitaoka 120a6e
    }
shun-iwasawa da0933
  } else
shun-iwasawa da0933
    currentFx = TFxP();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (currentFx) currentFx = currentFx->clone(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // se al frame corrente non c'e' il livello a cui e' applicato l'effetto:
Shinya Kitaoka 120a6e
  // current=0, actual!=0
Shinya Kitaoka 120a6e
  if (!currentFx) currentFx = actualFx->clone(false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  actualFx->getAttributes()->enable(isEnabled);
Shinya Kitaoka 120a6e
  setFx(currentFx, actualFx);
Shinya Kitaoka 120a6e
  changeTitleBar(currentFx.getPointer());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setCurrentScene() {
Shinya Kitaoka 120a6e
  ToonzScene *scene = m_sceneHandle->getScene();
Shinya Kitaoka 120a6e
  m_paramViewer->setScene(scene);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::notifySceneChanged() {
Shinya Kitaoka 120a6e
  TPixel32 col1, col2;
Shinya Kitaoka 120a6e
  Preferences::instance()->getChessboardColors(col1, col2);
Shinya Kitaoka 120a6e
  setCheckboardColors(col1, col2);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::showEvent(QShowEvent *event) {
Shinya Kitaoka 120a6e
  setCurrentFx();
Shinya Kitaoka 120a6e
  setCurrentFrame();
Shinya Kitaoka 120a6e
  connect(m_frameHandle, SIGNAL(frameSwitched()), SLOT(setCurrentFrame()));
Shinya Kitaoka 120a6e
  if (m_fxHandle) {
Shinya Kitaoka 120a6e
    connect(m_paramViewer, SIGNAL(actualFxParamChanged()), m_fxHandle,
Shinya Kitaoka 120a6e
            SIGNAL(fxChanged()));
Shinya Kitaoka 120a6e
    connect(m_fxHandle, SIGNAL(fxChanged()), SLOT(updateParamViewer()));
Shinya Kitaoka 120a6e
    connect(m_fxHandle, SIGNAL(fxSettingsShouldBeSwitched()),
Shinya Kitaoka 120a6e
            SLOT(setCurrentFx()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_sceneHandle) {
Shinya Kitaoka 120a6e
    connect(m_sceneHandle, SIGNAL(sceneChanged()), this,
Shinya Kitaoka 120a6e
            SLOT(notifySceneChanged()));
Shinya Kitaoka 120a6e
    connect(m_sceneHandle, SIGNAL(sceneSwitched()), this,
Shinya Kitaoka 120a6e
            SLOT(setCurrentScene()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_xsheetHandle)
Shinya Kitaoka 120a6e
    connect(m_xsheetHandle, SIGNAL(xsheetChanged()), SLOT(setCurrentFx()));
Shinya Kitaoka 120a6e
  if (m_levelHandle)
Shinya Kitaoka 120a6e
    connect(m_levelHandle, SIGNAL(xshLevelChanged()), SLOT(setCurrentFx()));
Shinya Kitaoka 120a6e
  if (m_objectHandle)
Shinya Kitaoka 120a6e
    connect(m_objectHandle, SIGNAL(objectChanged(bool)), SLOT(setCurrentFx()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::hideEvent(QHideEvent *) {
Shinya Kitaoka 120a6e
  setFx(0, 0);
Shinya Kitaoka 120a6e
  disconnect(m_frameHandle, SIGNAL(frameSwitched()), this,
Shinya Kitaoka 120a6e
             SLOT(setCurrentFrame()));
Shinya Kitaoka 120a6e
  if (m_fxHandle) {
Shinya Kitaoka 120a6e
    disconnect(m_fxHandle, SIGNAL(fxChanged()), this, SLOT(setCurrentFx()));
Shinya Kitaoka 120a6e
    disconnect(m_fxHandle, SIGNAL(fxChanged()), this,
Shinya Kitaoka 120a6e
               SLOT(updateParamViewer()));
Shinya Kitaoka 120a6e
    disconnect(m_fxHandle, SIGNAL(fxSettingsShouldBeSwitched()), this,
Shinya Kitaoka 120a6e
               SLOT(setCurrentFx()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_sceneHandle) {
Shinya Kitaoka 120a6e
    disconnect(m_sceneHandle, SIGNAL(sceneChanged()), this,
Shinya Kitaoka 120a6e
               SLOT(notifySceneChanged()));
Shinya Kitaoka 120a6e
    disconnect(m_sceneHandle, SIGNAL(sceneSwitched()), this,
Shinya Kitaoka 120a6e
               SLOT(setCurrentScene()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_xsheetHandle)
Shinya Kitaoka 120a6e
    disconnect(m_xsheetHandle, SIGNAL(xsheetChanged()), this,
Shinya Kitaoka 120a6e
               SLOT(setCurrentFx()));
Shinya Kitaoka 120a6e
  if (m_levelHandle)
Shinya Kitaoka 120a6e
    disconnect(m_levelHandle, SIGNAL(xshLevelChanged()), this,
Shinya Kitaoka 120a6e
               SLOT(setCurrentFx()));
Shinya Kitaoka 120a6e
  if (m_objectHandle)
Shinya Kitaoka 120a6e
    disconnect(m_objectHandle, SIGNAL(objectChanged(bool)), this,
Shinya Kitaoka 120a6e
               SLOT(setCurrentFx()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setCheckboardColors(const TPixel32 &col1,
Shinya Kitaoka 120a6e
                                     const TPixel32 &col2) {
Shinya Kitaoka 120a6e
  m_checkCol1 = col1;
Shinya Kitaoka 120a6e
  m_checkCol2 = col2;
Shinya Kitaoka 120a6e
  if (m_checkboardBg->isChecked())
Shinya Kitaoka 120a6e
    m_viewer->setBgPainter(m_checkCol1, m_checkCol2);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setWhiteBg() { m_viewer->setBgPainter(TPixel32::White); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setBlackBg() { m_viewer->setBgPainter(TPixel32::Black); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::setCheckboardBg() {
Shinya Kitaoka 120a6e
  m_viewer->setBgPainter(m_checkCol1, m_checkCol2);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::updateViewer() {
Shinya Kitaoka 120a6e
  if (m_viewer->isEnabled())
Shinya Kitaoka 120a6e
    m_viewer->updateFrame(m_frameHandle->getFrameIndex());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::updateParamViewer() {
Shinya Kitaoka 120a6e
  if (!m_paramViewer || !m_frameHandle) return;
Shinya Kitaoka 120a6e
  m_paramViewer->update(m_frameHandle->getFrameIndex(), true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::onPointChanged(int index, const TPointD &p) {
Shinya Kitaoka 120a6e
  m_paramViewer->setPointValue(index, p);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::onViewModeChanged(QAction *triggeredAct) {
Shinya Kitaoka 120a6e
  setFocus();
Shinya Kitaoka 120a6e
  QString name             = triggeredAct->text();
Shinya Kitaoka 120a6e
  bool actIsChecked        = triggeredAct->isChecked();
Shinya Kitaoka 120a6e
  QList<qaction *=""> actions = m_toolBar->actions();</qaction>
Shinya Kitaoka 120a6e
  QAction *cameraAct       = actions[0];
Shinya Kitaoka 120a6e
  QAction *previewAct      = actions[1];
Shinya Kitaoka 120a6e
  if (name == previewAct->text()) {
Shinya Kitaoka 120a6e
    if (cameraAct->isChecked()) cameraAct->setChecked(false);
Shinya Kitaoka 120a6e
    if (actIsChecked) {
Shinya Kitaoka 120a6e
      m_isCameraModeView = false;
Shinya Kitaoka 120a6e
      m_paramViewer->setIsCameraViewMode(false);
Shinya Kitaoka 120a6e
      setCurrentFx();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_viewer->setEnable(actIsChecked);
Shinya Kitaoka 120a6e
  } else if (name == cameraAct->text()) {
Shinya Kitaoka 120a6e
    if (previewAct->isChecked()) previewAct->setChecked(false);
Shinya Kitaoka 120a6e
    if (actIsChecked) {
Shinya Kitaoka 120a6e
      m_isCameraModeView = true;
Shinya Kitaoka 120a6e
      m_paramViewer->setIsCameraViewMode(true);
Shinya Kitaoka 120a6e
      setCurrentFx();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_viewer->setEnable(actIsChecked);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun-iwasawa 0ed559
void FxSettings::onPreferredSizeChanged(QSize pvBestSize) {
shun-iwasawa 1b1839
  DockWidget *popup = dynamic_cast<dockwidget *="">(parentWidget());</dockwidget>
shun-iwasawa 1b1839
  if (!popup || !popup->isFloating()) return;
shun-iwasawa 1b1839
Shinya Kitaoka 120a6e
  QSize popupBestSize = pvBestSize;
manongjohn b13816
shun-iwasawa 1b1839
  static int maximumHeight =
shun-iwasawa 1b1839
      (QGuiApplication::primaryScreen()->geometry().height()) * 0.9;
shun-iwasawa 1b1839
manongjohn b13816
  // Set minimum size, just in case
shun-iwasawa 1b1839
  popupBestSize.setHeight(
shun-iwasawa 1b1839
      std::min(std::max(popupBestSize.height(), 85), maximumHeight));
manongjohn b13816
  popupBestSize.setWidth(std::max(popupBestSize.width(), 390));
manongjohn b13816
Shinya Kitaoka 120a6e
  if (m_toolBar->isVisible()) {
manongjohn b13816
    popupBestSize += QSize(0, m_viewer->height() + m_toolBar->height() + 4);
manongjohn b13816
    popupBestSize.setWidth(
manongjohn b13816
        std::max(popupBestSize.width(), m_viewer->width() + 13));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
shun-iwasawa 1b1839
  QRect geom = popup->geometry();
shun-iwasawa 1b1839
  geom.setSize(popupBestSize);
shun-iwasawa 1b1839
  popup->setGeometry(geom);
shun-iwasawa 1b1839
  popup->update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void FxSettings::onShowSwatchButtonToggled(bool on) {
Shinya Kitaoka 120a6e
  QWidget *bottomContainer = widget(1);
Toshihiro Shimizu 890ddd
manongjohn b13816
  if (!on) {
Shinya Kitaoka 120a6e
    m_container_height =
Shinya Kitaoka 120a6e
        bottomContainer->height() + handleWidth() /* ハンドル幅 */;
manongjohn b13816
    m_container_width = m_viewer->width() + 13;
manongjohn b13816
  }
Shinya Kitaoka 120a6e
  bottomContainer->setVisible(on);
Toshihiro Shimizu 890ddd
manongjohn b13816
  DockWidget *popup = dynamic_cast<dockwidget *="">(parentWidget());</dockwidget>
manongjohn b13816
  if (popup && popup->isFloating()) {
Shinya Kitaoka 120a6e
    QRect geom = popup->geometry();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    int height_change = (on) ? m_container_height : -m_container_height;
manongjohn b13816
    int width_change  = 0;
manongjohn b13816
manongjohn b13816
    if (on && m_container_width > geom.width())
manongjohn b13816
      width_change = m_container_width - geom.width();
Toshihiro Shimizu 890ddd
manongjohn b13816
    geom.setSize(geom.size() + QSize(width_change, height_change));
Shinya Kitaoka 120a6e
    popup->setGeometry(geom);
Shinya Kitaoka 120a6e
    popup->update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------