Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "pane.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Tnz6 includes
Toshihiro Shimizu 890ddd
#include "tapp.h"
Toshihiro Shimizu 890ddd
#include "mainwindow.h"
Toshihiro Shimizu 890ddd
#include "tenv.h"
shun-iwasawa 7a6807
#include "saveloadqsettings.h"
shun-iwasawa 9b2afe
#include "custompanelmanager.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzfolders.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qpainter></qpainter>
Toshihiro Shimizu 890ddd
#include <qstyleoptiondockwidget></qstyleoptiondockwidget>
Toshihiro Shimizu 890ddd
#include <qmouseevent></qmouseevent>
Toshihiro Shimizu 890ddd
#include <qmainwindow></qmainwindow>
Toshihiro Shimizu 890ddd
#include <qsettings></qsettings>
Toshihiro Shimizu 890ddd
#include <qtoolbar></qtoolbar>
Toshihiro Shimizu 890ddd
#include <qmap></qmap>
Toshihiro Shimizu 890ddd
#include <qapplication></qapplication>
Toshihiro Shimizu 890ddd
#include <qfile></qfile>
shun_iwasawa 064d70
#include <qdrawutil.h></qdrawutil.h>
Toshihiro Shimizu 890ddd
#include <assert.h></assert.h>
shun-iwasawa 7a6807
#include <qdesktopwidget></qdesktopwidget>
shun-iwasawa 1f6fa7
#include <qdialog></qdialog>
Martin van Zijl 624982
#include <qlineedit></qlineedit>
shun-iwasawa dfd2f7
#include <qtextedit></qtextedit>
shun-iwasawa b272a7
#include <qscreen></qscreen>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
extern TEnv::StringVar EnvSafeAreaName;
shun-iwasawa 02ac7e
extern TEnv::IntVar EnvViewerPreviewBehavior;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TPanel
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanel::TPanel(QWidget *parent, Qt::WindowFlags flags,
Shinya Kitaoka 120a6e
               TDockWidget::Orientation orientation)
Shinya Kitaoka 120a6e
    : TDockWidget(parent, flags)
Shinya Kitaoka 120a6e
    , m_panelType("")
Shinya Kitaoka 120a6e
    , m_isMaximizable(true)
Shinya Kitaoka 120a6e
    , m_isMaximized(false)
Shinya Kitaoka 120a6e
    , m_panelTitleBar(0)
Shinya Kitaoka 120a6e
    , m_multipleInstancesAllowed(true) {
Shinya Kitaoka 120a6e
  // setFeatures(QDockWidget::DockWidgetMovable |
Shinya Kitaoka 120a6e
  // QDockWidget::DockWidgetFloatable);
Shinya Kitaoka 120a6e
  // setFloating(false);
Shinya Kitaoka 120a6e
  m_panelTitleBar = new TPanelTitleBar(this, orientation);
Shinya Kitaoka 120a6e
  setTitleBarWidget(m_panelTitleBar);
Shinya Kitaoka 120a6e
  // connect(m_panelTitleBar,SIGNAL(doubleClick()),this,SLOT(onDoubleClick()));
Shinya Kitaoka 120a6e
  connect(m_panelTitleBar, SIGNAL(doubleClick(QMouseEvent *)), this,
Shinya Kitaoka 120a6e
          SIGNAL(doubleClick(QMouseEvent *)));
Shinya Kitaoka 120a6e
  connect(m_panelTitleBar, SIGNAL(closeButtonPressed()), this,
Shinya Kitaoka 120a6e
          SLOT(onCloseButtonPressed()));
Shinya Kitaoka 120a6e
  setOrientation(orientation);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun-iwasawa 7a6807
TPanel::~TPanel() {
luz paz 6454c4
  // On quitting, save the floating panel's geometry and state in order to
shun-iwasawa 7a6807
  // restore them when opening the floating panel next time
shun-iwasawa 7a6807
  if (isFloating()) {
shun-iwasawa 7a6807
    TFilePath savePath =
shun-iwasawa 7a6807
        ToonzFolder::getMyModuleDir() + TFilePath("popups.ini");
shun-iwasawa 7a6807
    QSettings settings(QString::fromStdWString(savePath.getWideString()),
shun-iwasawa 7a6807
                       QSettings::IniFormat);
shun-iwasawa 7a6807
    settings.beginGroup("Panels");
shun-iwasawa 7a6807
    settings.beginGroup(QString::fromStdString(m_panelType));
shun-iwasawa 7a6807
    settings.setValue("geometry", geometry());
shun-iwasawa 7a6807
    if (SaveLoadQSettings *persistent =
shun-iwasawa 7a6807
            dynamic_cast<saveloadqsettings *="">(widget()))</saveloadqsettings>
shun-iwasawa 7a6807
      persistent->save(settings);
shun-iwasawa 7a6807
  }
shun-iwasawa 7a6807
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanel::paintEvent(QPaintEvent *e) {
Shinya Kitaoka 120a6e
  QPainter painter(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (widget()) {
Shinya Kitaoka 120a6e
    QRect dockRect = widget()->geometry();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    dockRect.adjust(0, 0, -1, -1);
Shinya Kitaoka 120a6e
    painter.fillRect(dockRect, m_bgcolor);
Shinya Kitaoka 120a6e
    painter.setPen(Qt::black);
Shinya Kitaoka 120a6e
    painter.drawRect(dockRect);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  painter.end();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanel::onCloseButtonPressed() {
Shinya Kitaoka 120a6e
  emit closeButtonPressed();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Currently, Toonz panels that get closed indeed just remain hidden -
Shinya Kitaoka 120a6e
  // ready to reappair if they are needed again. However, the user expects
Shinya Kitaoka 120a6e
  // a new panel to be created - so we just reset the panel here.
Shinya Kitaoka 120a6e
  // reset();    //Moved to panel invocation in floatingpanelcommand.cpp
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Also, remove widget from its dock layout control
Shinya Kitaoka 120a6e
  if (parentLayout()) parentLayout()->removeWidget(this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! activate the panel and set focus specified widget when mouse enters
shun-iwasawa 7a6807
 */
Shinya Kitaoka 120a6e
void TPanel::enterEvent(QEvent *event) {
Shinya Kitaoka 120a6e
  // Only when Toonz application is active
shun-iwasawa 1f6fa7
  QWidget *w = qApp->activeWindow();
shun-iwasawa 1f6fa7
  if (w) {
Martin van Zijl 61c133
    // grab the focus, unless a line-edit is focused currently
Martin van Zijl 61c133
    QWidget *focusWidget = qApp->focusWidget();
shun-iwasawa dfd2f7
    if (focusWidget && (dynamic_cast<qlineedit *="">(focusWidget) ||</qlineedit>
shun-iwasawa dfd2f7
                        dynamic_cast<qtextedit *="">(focusWidget))) {</qtextedit>
shun-iwasawa 3cf6a3
      event->accept();
shun-iwasawa 3cf6a3
      return;
Martin van Zijl 624982
    }
Martin van Zijl 624982
shun-iwasawa 3cf6a3
    widgetFocusOnEnter();
Martin van Zijl 624982
Shinya Kitaoka 120a6e
    // Some panels (e.g. Viewer, StudioPalette, Palette, ColorModel) are
Shinya Kitaoka 120a6e
    // activated when mouse enters. Viewer is activatable only when being
Shinya Kitaoka 120a6e
    // docked.
shun-iwasawa 1f6fa7
    // Active windows will NOT switch when the current active window is dialog.
shun-iwasawa 1f6fa7
    if (qobject_cast<qdialog *="">(w) == 0 && isActivatableOnEnter())</qdialog>
shun-iwasawa 1f6fa7
      activateWindow();
Shinya Kitaoka 120a6e
    event->accept();
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    event->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! clear focus when mouse leaves
shun-iwasawa 7a6807
 */
shun-iwasawa 3cf6a3
void TPanel::leaveEvent(QEvent *event) {
shun-iwasawa 3cf6a3
  QWidget *focusWidget = qApp->focusWidget();
shun-iwasawa 3cf6a3
  if (focusWidget && dynamic_cast<qlineedit *="">(focusWidget)) {</qlineedit>
shun-iwasawa 3cf6a3
    return;
shun-iwasawa 3cf6a3
  }
shun-iwasawa 3cf6a3
  widgetClearFocusOnLeave();
shun-iwasawa 3cf6a3
}
Toshihiro Shimizu 890ddd
shun-iwasawa 7a6807
//-----------------------------------------------------------------------------
shun-iwasawa 7a6807
/*! load and restore previous geometry and state of the floating panel.
shun-iwasawa 7a6807
    called from the function OpenFloatingPanel::getOrOpenFloatingPanel()
shun-iwasawa 7a6807
    in floatingpanelcommand.cpp
shun-iwasawa 7a6807
*/
shun-iwasawa 7a6807
void TPanel::restoreFloatingPanelState() {
shun-iwasawa 7a6807
  TFilePath savePath = ToonzFolder::getMyModuleDir() + TFilePath("popups.ini");
shun-iwasawa 7a6807
  QSettings settings(QString::fromStdWString(savePath.getWideString()),
shun-iwasawa 7a6807
                     QSettings::IniFormat);
shun-iwasawa 7a6807
  settings.beginGroup("Panels");
shun-iwasawa 7a6807
shun-iwasawa 7a6807
  if (!settings.childGroups().contains(QString::fromStdString(m_panelType)))
shun-iwasawa 7a6807
    return;
shun-iwasawa 7a6807
shun-iwasawa 7a6807
  settings.beginGroup(QString::fromStdString(m_panelType));
shun-iwasawa 7a6807
shun-iwasawa 7a6807
  QRect geom = settings.value("geometry", saveGeometry()).toRect();
shun-iwasawa 7a6807
  // check if it can be visible in the current screen
shun-iwasawa 7a6807
  if (!(geom & QApplication::desktop()->availableGeometry(this)).isEmpty())
shun-iwasawa 7a6807
    setGeometry(geom);
shun-iwasawa 7a6807
  // load optional settings
shun-iwasawa 7a6807
  if (SaveLoadQSettings *persistent =
shun-iwasawa 7a6807
          dynamic_cast<saveloadqsettings *="">(widget()))</saveloadqsettings>
shun-iwasawa 7a6807
    persistent->load(settings);
shun-iwasawa 7a6807
}
shun-iwasawa 7a6807
shun-iwasawa b272a7
//-----------------------------------------------------------------------------
shun-iwasawa b272a7
// if the panel has no contents to be zoomed, simply resize the panel here
shun-iwasawa b272a7
// currently only Flipbook and Color Model panels support resizing of contents
shun-iwasawa b272a7
void TPanel::zoomContentsAndFitGeometry(bool forward) {
shun-iwasawa b272a7
  if (!m_floating) return;
shun-iwasawa b272a7
shun-iwasawa b272a7
  auto getScreen = [&]() {
shun-iwasawa b272a7
    QScreen *ret = nullptr;
shun-iwasawa b272a7
    ret          = QGuiApplication::screenAt(geometry().topLeft());
shun-iwasawa b272a7
    if (ret) return ret;
shun-iwasawa b272a7
    ret = QGuiApplication::screenAt(geometry().topRight());
shun-iwasawa b272a7
    if (ret) return ret;
shun-iwasawa b272a7
    ret = QGuiApplication::screenAt(geometry().center());
shun-iwasawa b272a7
    if (ret) return ret;
shun-iwasawa b272a7
    ret = QGuiApplication::screenAt(geometry().bottomLeft());
shun-iwasawa b272a7
    if (ret) return ret;
shun-iwasawa b272a7
    ret = QGuiApplication::screenAt(geometry().bottomRight());
shun-iwasawa b272a7
    return ret;
shun-iwasawa b272a7
  };
shun-iwasawa b272a7
shun-iwasawa b272a7
  // Get screen geometry
shun-iwasawa b272a7
  QScreen *screen = getScreen();
shun-iwasawa b272a7
  if (!screen) return;
shun-iwasawa b272a7
  QRect screenGeom = screen->availableGeometry();
shun-iwasawa b272a7
shun-iwasawa b272a7
  QSize newSize;
shun-iwasawa b272a7
  if (forward)
shun-iwasawa b272a7
    // x1.2 scale
shun-iwasawa b272a7
    newSize = QSize(width() * 6 / 5, height() * 6 / 5);
shun-iwasawa b272a7
  else
shun-iwasawa b272a7
    // 1/1.2 scale
shun-iwasawa b272a7
    newSize = QSize(width() * 5 / 6, height() * 5 / 6);
shun-iwasawa b272a7
shun-iwasawa b272a7
  QRect newGeom(geometry().topLeft(), newSize);
shun-iwasawa b272a7
  if (!screenGeom.contains(newGeom)) {
shun-iwasawa b272a7
    if (newGeom.width() > screenGeom.width())
shun-iwasawa b272a7
      newGeom.setWidth(screenGeom.width());
shun-iwasawa b272a7
    if (newGeom.right() > screenGeom.right())
shun-iwasawa b272a7
      newGeom.moveRight(screenGeom.right());
shun-iwasawa b272a7
    else if (newGeom.left() < screenGeom.left())
shun-iwasawa b272a7
      newGeom.moveLeft(screenGeom.left());
shun-iwasawa b272a7
shun-iwasawa b272a7
    if (newGeom.height() > screenGeom.height())
shun-iwasawa b272a7
      newGeom.setHeight(screenGeom.height());
shun-iwasawa b272a7
    if (newGeom.bottom() > screenGeom.bottom())
shun-iwasawa b272a7
      newGeom.moveBottom(screenGeom.bottom());
shun-iwasawa b272a7
    else if (newGeom.top() < screenGeom.top())
shun-iwasawa b272a7
      newGeom.moveTop(screenGeom.top());
shun-iwasawa b272a7
  }
shun-iwasawa b272a7
  setGeometry(newGeom);
shun-iwasawa b272a7
}
shun-iwasawa b272a7
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TPanelTitleBarButton
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanelTitleBarButton::TPanelTitleBarButton(QWidget *parent,
Kite 521c84
                                           const QString &standardPixmapName)
Shinya Kitaoka 120a6e
    : QWidget(parent)
Shinya Kitaoka 120a6e
    , m_standardPixmap(standardPixmapName)
Kite 521c84
    , m_standardPixmapName(standardPixmapName)
Shinya Kitaoka 120a6e
    , m_rollover(false)
Shinya Kitaoka 120a6e
    , m_pressed(false)
Shinya Kitaoka 120a6e
    , m_buttonSet(0)
Shinya Kitaoka 120a6e
    , m_id(0) {
Shinya Kitaoka 120a6e
  setFixedSize(m_standardPixmap.size());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun_iwasawa 3cc41f
TPanelTitleBarButton::TPanelTitleBarButton(QWidget *parent,
Kite 521c84
                                           const QPixmap &standardPixmap)
shun_iwasawa 3cc41f
    : QWidget(parent)
shun_iwasawa 3cc41f
    , m_standardPixmap(standardPixmap)
shun_iwasawa 3cc41f
    , m_rollover(false)
shun_iwasawa 3cc41f
    , m_pressed(false)
shun_iwasawa 3cc41f
    , m_buttonSet(0)
shun_iwasawa 3cc41f
    , m_id(0) {
shun_iwasawa 3cc41f
  setFixedSize(m_standardPixmap.size() / m_standardPixmap.devicePixelRatio());
shun_iwasawa 3cc41f
}
shun_iwasawa 3cc41f
shun_iwasawa 3cc41f
//-----------------------------------------------------------------------------
shun_iwasawa 3cc41f
Shinya Kitaoka 120a6e
void TPanelTitleBarButton::setButtonSet(TPanelTitleBarButtonSet *buttonSet,
Shinya Kitaoka 120a6e
                                        int id) {
Shinya Kitaoka 120a6e
  m_buttonSet = buttonSet;
Shinya Kitaoka 120a6e
  m_id        = id;
Shinya Kitaoka 120a6e
  m_buttonSet->add(this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButton::setPressed(bool pressed) {
Shinya Kitaoka 120a6e
  if (pressed != m_pressed) {
Shinya Kitaoka 120a6e
    m_pressed = pressed;
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButton::paintEvent(QPaintEvent *event) {
Kite c50ec4
  // Set unique pressed colors if filename contains the following words:
Kite c50ec4
  QColor bgColor = getPressedColor();
Kite c50ec4
  if (m_standardPixmapName.contains("freeze", Qt::CaseInsensitive))
Kite c50ec4
    bgColor = getFreezeColor();
Kite c50ec4
  if (m_standardPixmapName.contains("preview", Qt::CaseInsensitive))
Kite c50ec4
    bgColor = getPreviewColor();
Kite c50ec4
Kite c50ec4
  QPixmap panePixmap    = recolorPixmap(svgToPixmap(m_standardPixmapName));
Kite c50ec4
  QPixmap panePixmapOff = compositePixmap(panePixmap, 0.8);
Kite c50ec4
  QPixmap panePixmapOver =
Kite c50ec4
      compositePixmap(panePixmap, 1, QSize(), 0, 0, getOverColor());
Kite c50ec4
  QPixmap panePixmapOn = compositePixmap(panePixmap, 1, QSize(), 0, 0, bgColor);
Kite 521c84
Kite c50ec4
  QPainter painter(this);
shun-iwasawa 9b2afe
  painter.drawPixmap(0, 0,
shun-iwasawa 9b2afe
                     m_pressed    ? panePixmapOn
shun-iwasawa 9b2afe
                     : m_rollover ? panePixmapOver
shun-iwasawa 9b2afe
                                  : panePixmapOff);
Shinya Kitaoka 120a6e
  painter.end();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButton::mouseMoveEvent(QMouseEvent *event) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButton::enterEvent(QEvent *) {
Shinya Kitaoka 120a6e
  if (!m_rollover) {
Shinya Kitaoka 120a6e
    m_rollover = true;
Shinya Kitaoka 120a6e
    if (!m_pressed) update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButton::leaveEvent(QEvent *) {
Shinya Kitaoka 120a6e
  if (m_rollover) {
Shinya Kitaoka 120a6e
    m_rollover = false;
Shinya Kitaoka 120a6e
    if (!m_pressed) update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButton::mousePressEvent(QMouseEvent *e) {
Shinya Kitaoka 120a6e
  if (m_buttonSet) {
Shinya Kitaoka 120a6e
    if (m_pressed) return;
Shinya Kitaoka 120a6e
    m_buttonSet->select(this);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    m_pressed = !m_pressed;
Shinya Kitaoka 120a6e
    emit toggled(m_pressed);
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TPanelTitleBarButtonForSafeArea
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButtonForSafeArea::getSafeAreaNameList(
Shinya Kitaoka 120a6e
    QList<qstring> &nameList) {</qstring>
Jeremy Bullock 1d47b8
  TFilePath fp                = TEnv::getConfigDir();
Shinya Kitaoka 120a6e
  QString currentSafeAreaName = QString::fromStdString(EnvSafeAreaName);
Toshihiro Shimizu 890ddd
Jeremy Bullock 1d47b8
  std::string safeAreaFileName = "safearea.ini";
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  while (!TFileStatus(fp + safeAreaFileName).doesExist() && !fp.isRoot() &&
Shinya Kitaoka 120a6e
         fp.getParentDir() != TFilePath())
Shinya Kitaoka 120a6e
    fp = fp.getParentDir();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  fp = fp + safeAreaFileName;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (TFileStatus(fp).doesExist()) {
Shinya Kitaoka 120a6e
    QSettings settings(toQString(fp), QSettings::IniFormat);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // find the current safearea name from the list
Shinya Kitaoka 120a6e
    QStringList groups = settings.childGroups();
Shinya Kitaoka 120a6e
    for (int g = 0; g < groups.size(); g++) {
Shinya Kitaoka 120a6e
      settings.beginGroup(groups.at(g));
Shinya Kitaoka 120a6e
      nameList.push_back(settings.value("name", "").toString());
Shinya Kitaoka 120a6e
      settings.endGroup();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButtonForSafeArea::mousePressEvent(QMouseEvent *e) {
Shinya Kitaoka 120a6e
  if (e->button() != Qt::RightButton) {
Shinya Kitaoka 120a6e
    m_pressed = !m_pressed;
Shinya Kitaoka 120a6e
    emit toggled(m_pressed);
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButtonForSafeArea::contextMenuEvent(QContextMenuEvent *e) {
Shinya Kitaoka 120a6e
  QMenu menu(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QList<qstring> safeAreaNameList;</qstring>
Shinya Kitaoka 120a6e
  getSafeAreaNameList(safeAreaNameList);
Shinya Kitaoka 120a6e
  for (int i = 0; i < safeAreaNameList.size(); i++) {
Shinya Kitaoka 120a6e
    QAction *action = new QAction(safeAreaNameList.at(i), this);
Shinya Kitaoka 120a6e
    action->setData(safeAreaNameList.at(i));
Shinya Kitaoka 120a6e
    connect(action, SIGNAL(triggered()), this, SLOT(onSetSafeArea()));
Shinya Kitaoka 120a6e
    if (safeAreaNameList.at(i) == QString::fromStdString(EnvSafeAreaName)) {
Shinya Kitaoka 120a6e
      action->setCheckable(true);
Shinya Kitaoka 120a6e
      action->setChecked(true);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    menu.addAction(action);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  menu.exec(e->globalPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButtonForSafeArea::onSetSafeArea() {
Shinya Kitaoka 120a6e
  QString safeAreaName = qobject_cast<qaction *="">(sender())->data().toString();</qaction>
Shinya Kitaoka 120a6e
  // change safearea if the different one is selected
Shinya Kitaoka 120a6e
  if (QString::fromStdString(EnvSafeAreaName) != safeAreaName) {
Shinya Kitaoka 120a6e
    EnvSafeAreaName = safeAreaName.toStdString();
Shinya Kitaoka 120a6e
    // emit sceneChanged without setting dirty flag
Shinya Kitaoka 120a6e
    TApp::instance()->getCurrentScene()->notifySceneChanged(false);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
shun-iwasawa 02ac7e
// TPanelTitleBarButtonForPreview
shun-iwasawa 02ac7e
//-----------------------------------------------------------------------------
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
void TPanelTitleBarButtonForPreview::mousePressEvent(QMouseEvent *e) {
shun-iwasawa 02ac7e
  if (e->button() != Qt::RightButton) {
shun-iwasawa 02ac7e
    m_pressed = !m_pressed;
shun-iwasawa 02ac7e
    emit toggled(m_pressed);
shun-iwasawa 02ac7e
    update();
shun-iwasawa 02ac7e
  }
shun-iwasawa 02ac7e
}
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
//-----------------------------------------------------------------------------
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
void TPanelTitleBarButtonForPreview::contextMenuEvent(QContextMenuEvent *e) {
shun-iwasawa 02ac7e
  QMenu menu(this);
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
  // 0: current frame
shun-iwasawa 02ac7e
  // 1: all frames in the preview range
shun-iwasawa 02ac7e
  // 2: selected cell, auto play once & stop
shun-iwasawa 02ac7e
  QStringList behaviorsStrList = {tr("Current frame"),
shun-iwasawa 02ac7e
                                  tr("All preview range frames"),
shun-iwasawa 02ac7e
                                  tr("Selected cells - Auto play")};
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
  QActionGroup *behaviorGroup = new QActionGroup(this);
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
  for (int i = 0; i < behaviorsStrList.size(); i++) {
shun-iwasawa 02ac7e
    QAction *action = menu.addAction(behaviorsStrList.at(i));
shun-iwasawa 02ac7e
    action->setData(i);
shun-iwasawa 02ac7e
    connect(action, SIGNAL(triggered()), this, SLOT(onSetPreviewBehavior()));
shun-iwasawa 02ac7e
    action->setCheckable(true);
shun-iwasawa 02ac7e
    behaviorGroup->addAction(action);
shun-iwasawa 02ac7e
    if (i == EnvViewerPreviewBehavior) action->setChecked(true);
shun-iwasawa 02ac7e
  }
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
  menu.exec(e->globalPos());
shun-iwasawa 02ac7e
}
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
//-----------------------------------------------------------------------------
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
void TPanelTitleBarButtonForPreview::onSetPreviewBehavior() {
shun-iwasawa 02ac7e
  int behaviorId = qobject_cast<qaction *="">(sender())->data().toInt();</qaction>
shun-iwasawa 02ac7e
  // change safearea if the different one is selected
shun-iwasawa 02ac7e
  if (EnvViewerPreviewBehavior != behaviorId) {
shun-iwasawa 02ac7e
    EnvViewerPreviewBehavior = behaviorId;
shun-iwasawa 02ac7e
    // emit sceneChanged without setting dirty flag
shun-iwasawa 02ac7e
    TApp::instance()->getCurrentScene()->notifySceneChanged(false);
shun-iwasawa 02ac7e
  }
shun-iwasawa 02ac7e
}
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
//-----------------------------------------------------------------------------
shun-iwasawa 02ac7e
shun-iwasawa 02ac7e
//=============================================================================
Toshihiro Shimizu 890ddd
// TPanelTitleBarButtonSet
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanelTitleBarButtonSet::TPanelTitleBarButtonSet() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanelTitleBarButtonSet::~TPanelTitleBarButtonSet() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButtonSet::add(TPanelTitleBarButton *button) {
Shinya Kitaoka 120a6e
  m_buttons.push_back(button);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBarButtonSet::select(TPanelTitleBarButton *button) {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < (int)m_buttons.size(); i++)
Shinya Kitaoka 120a6e
    m_buttons[i]->setPressed(button == m_buttons[i]);
Shinya Kitaoka 120a6e
  emit selected(button->getId());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// PaneTitleBar
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanelTitleBar::TPanelTitleBar(QWidget *parent,
Shinya Kitaoka 120a6e
                               TDockWidget::Orientation orientation)
shun-iwasawa 32f84c
    : QFrame(parent), m_closeButtonHighlighted(false) {
Shinya Kitaoka 120a6e
  setMouseTracking(true);
Shinya Kitaoka 120a6e
  setFocusPolicy(Qt::NoFocus);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QSize TPanelTitleBar::minimumSizeHint() const { return QSize(20, 18); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBar::paintEvent(QPaintEvent *) {
Shinya Kitaoka 120a6e
  QPainter painter(this);
Shinya Kitaoka 120a6e
  QRect rect = this->rect();
Shinya Kitaoka 120a6e
shun_iwasawa 064d70
  bool isPanelActive;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPanel *dw = qobject_cast<tpanel *="">(parentWidget());</tpanel>
Shinya Kitaoka 120a6e
  Q_ASSERT(dw != 0);
shun_iwasawa 064d70
  // docked panel
Shinya Kitaoka 120a6e
  if (!dw->isFloating()) {
shun_iwasawa 064d70
    isPanelActive = dw->widgetInThisPanelIsFocused();
shun_iwasawa 064d70
    qDrawBorderPixmap(&painter, rect, QMargins(3, 3, 3, 3),
shun_iwasawa 064d70
                      (isPanelActive) ? m_activeBorderPm : m_borderPm);
shun_iwasawa 064d70
  }
shun_iwasawa 064d70
  // floating panel
shun_iwasawa 064d70
  else {
shun_iwasawa 064d70
    isPanelActive = isActiveWindow();
shun_iwasawa 064d70
    qDrawBorderPixmap(
shun_iwasawa 064d70
        &painter, rect, QMargins(3, 3, 3, 3),
shun_iwasawa 064d70
        (isPanelActive) ? m_floatActiveBorderPm : m_floatBorderPm);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (dw->getOrientation() == TDockWidget::vertical) {
Shinya Kitaoka 120a6e
    QString titleText = painter.fontMetrics().elidedText(
Shinya Kitaoka 120a6e
        dw->windowTitle(), Qt::ElideRight, rect.width() - 50);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    painter.setBrush(Qt::NoBrush);
shun_iwasawa 064d70
    painter.setPen(isPanelActive ? m_activeTitleColor : m_titleColor);
Kite 521c84
    painter.drawText(QPointF(8, 13), titleText);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (dw->isFloating()) {
Kite 521c84
    QIcon paneCloseIcon = createQIcon("pane_close");
shun_iwasawa 3cc41f
    const static QPixmap closeButtonPixmap(
Kite 521c84
        paneCloseIcon.pixmap(20, 18, QIcon::Normal, QIcon::Off));
Shinya Kitaoka 120a6e
    const static QPixmap closeButtonPixmapOver(
Kite 521c84
        paneCloseIcon.pixmap(20, 18, QIcon::Active));
Shinya Kitaoka 120a6e
Kite 521c84
    QPoint closeButtonPos(rect.right() - 20, rect.top());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_closeButtonHighlighted)
shun_iwasawa 3cc41f
      painter.drawPixmap(closeButtonPos, closeButtonPixmapOver);
Shinya Kitaoka 120a6e
    else
shun_iwasawa 3cc41f
      painter.drawPixmap(closeButtonPos, closeButtonPixmap);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  painter.end();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBar::mousePressEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  TDockWidget *dw = static_cast<tdockwidget *="">(parentWidget());</tdockwidget>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QPoint pos = event->pos();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (dw->isFloating()) {
Shinya Kitaoka 120a6e
    QRect rect = this->rect();
Kite 521c84
    QRect closeButtonRect(rect.right() - 20, rect.top() + 1, 20, 18);
Shinya Kitaoka 120a6e
    if (closeButtonRect.contains(pos) && dw->isFloating()) {
Shinya Kitaoka 120a6e
      event->accept();
Shinya Kitaoka 120a6e
      dw->hide();
Shinya Kitaoka 120a6e
      m_closeButtonHighlighted = false;
Shinya Kitaoka 120a6e
      emit closeButtonPressed();
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  event->ignore();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBar::mouseMoveEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  TDockWidget *dw = static_cast<tdockwidget *="">(parentWidget());</tdockwidget>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (dw->isFloating()) {
Shinya Kitaoka 120a6e
    QPoint pos = event->pos();
Shinya Kitaoka 120a6e
    QRect rect = this->rect();
Kite 62f3e4
    QRect closeButtonRect(rect.right() - 18, rect.top() + 1, 18, 18);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    if (closeButtonRect.contains(pos) && dw->isFloating())
Shinya Kitaoka 120a6e
      m_closeButtonHighlighted = true;
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      m_closeButtonHighlighted = false;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  update();
Shinya Kitaoka 120a6e
  event->ignore();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBar::mouseDoubleClickEvent(QMouseEvent *me) {
Shinya Kitaoka 120a6e
  emit doubleClick(me);
Shinya Kitaoka 120a6e
  me->ignore();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBar::add(const QPoint &pos, QWidget *widget) {
Shinya Kitaoka 120a6e
  m_buttons.push_back(std::make_pair(pos, widget));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TPanelTitleBar::resizeEvent(QResizeEvent *e) {
Shinya Kitaoka 120a6e
  QWidget::resizeEvent(e);
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < (int)m_buttons.size(); i++) {
Shinya Kitaoka 120a6e
    QPoint p   = m_buttons[i].first;
Shinya Kitaoka 120a6e
    QWidget *w = m_buttons[i].second;
Shinya Kitaoka 120a6e
    if (p.x() < 0) p.setX(p.x() + width());
Shinya Kitaoka 120a6e
    w->move(p);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TPanelFactory
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanelFactory::TPanelFactory(QString panelType) : m_panelType(panelType) {
2fc36c
  assert(tableInstance().count(panelType) == 0);
2fc36c
  tableInstance()[m_panelType] = this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
2fc36c
TPanelFactory::~TPanelFactory() { tableInstance().remove(m_panelType); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun_iwasawa 2732f7
QMap<qstring, *="" tpanelfactory=""> &TPanelFactory::tableInstance() {</qstring,>
2fc36c
  static QMap<qstring, *="" tpanelfactory=""> table;</qstring,>
2fc36c
  return table;
2fc36c
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanel *TPanelFactory::createPanel(QWidget *parent, QString panelType) {
Shinya Kitaoka 120a6e
  TPanel *panel = 0;
Toshihiro Shimizu 890ddd
2fc36c
  QMap<qstring, *="" tpanelfactory="">::iterator it = tableInstance().find(panelType);</qstring,>
2fc36c
  if (it == tableInstance().end()) {
shun-iwasawa 9b2afe
    if (panelType.startsWith("Custom_")) {
shun-iwasawa 9b2afe
      panelType = panelType.right(panelType.size() - 7);
shun-iwasawa 9b2afe
      return CustomPanelManager::instance()->createCustomPanel(panelType,
shun-iwasawa 9b2afe
                                                               parent);
shun-iwasawa 9b2afe
    }
shun-iwasawa 9b2afe
Shinya Kitaoka 120a6e
    TPanel *panel = new TPanel(parent);
Shinya Kitaoka 120a6e
    panel->setPanelType(panelType.toStdString());
Shinya Kitaoka 120a6e
    return panel;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    TPanelFactory *factory = it.value();
Shinya Kitaoka 120a6e
    TPanel *panel          = factory->createPanel(parent);
Shinya Kitaoka 120a6e
    panel->setPanelType(panelType.toStdString());
Shinya Kitaoka 120a6e
    return panel;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPanel *TPanelFactory::createPanel(QWidget *parent) {
Shinya Kitaoka 120a6e
  TPanel *panel = new TPanel(parent);
Shinya Kitaoka 120a6e
  panel->setObjectName(getPanelType());
Shinya Kitaoka 120a6e
  panel->setWindowTitle(getPanelType());
Shinya Kitaoka 120a6e
  initialize(panel);
Shinya Kitaoka 120a6e
  return panel;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------