refactoring: unify viewer and comboviewer classes

This commit is contained in:
shun-iwasawa 2022-12-15 18:04:45 +09:00 committed by manongjohn
parent 67d7d16507
commit b387bd82b6
5 changed files with 266 additions and 1129 deletions

View file

@ -1,78 +1,30 @@
// TnzCore includes
#include "tconvert.h"
#include "tgeometry.h"
#include "tgl.h"
#include "trop.h"
#include "tstopwatch.h"
#include "tsystem.h"
// TnzLib includes
#include "toonz/tscenehandle.h"
#include "toonz/txsheethandle.h"
#include "toonz/tframehandle.h"
#include "toonz/tcolumnhandle.h"
#include "toonz/txshlevelhandle.h"
#include "toonz/toonzscene.h"
#include "toonz/sceneproperties.h"
#include "toonz/txsheet.h"
#include "toonz/stage.h"
#include "toonz/stage2.h"
#include "toonz/txshlevel.h"
#include "toonz/txshcell.h"
#include "toonz/tcamera.h"
#include "toonz/tstageobjecttree.h"
#include "toonz/tobjecthandle.h"
#include "toonz/tpalettehandle.h"
#include "toonz/tonionskinmaskhandle.h"
#include "toutputproperties.h"
#include "toonz/palettecontroller.h"
#include "toonz/toonzfolders.h"
#include "toonz/preferences.h"
#include "toonz/tproject.h"
// TnzQt includes // TnzQt includes
#include "toonzqt/menubarcommand.h"
#include "toonzqt/dvdialog.h"
#include "toonzqt/gutil.h"
#include "toonzqt/imageutils.h" #include "toonzqt/imageutils.h"
#include "toonzqt/flipconsole.h"
// TnzTools includes // TnzTools includes
#include "tools/toolhandle.h"
#include "tools/tooloptions.h" #include "tools/tooloptions.h"
// Tnz6 includes // Tnz6 includes
#include "tapp.h" #include "tapp.h"
#include "mainwindow.h" #include "toolbar.h"
#include "sceneviewer.h"
#include "xsheetdragtool.h"
#include "ruler.h" #include "ruler.h"
#include "menubarcommandids.h" #include "menubarcommandids.h"
#include "toolbar.h"
// Qt includes // Qt includes
#include <QPainter>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QGridLayout>
#include <QAction> #include <QAction>
#include <QDialogButtonBox>
#include <QAbstractButton>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QLabel>
#include <QRadioButton>
#include <QLineEdit>
#include <QSlider>
#include <QButtonGroup>
#include <QMenu> #include <QMenu>
#include <QToolBar>
#include <QMainWindow>
#include <QSettings> #include <QSettings>
#include "comboviewerpane.h" #include "comboviewerpane.h"
using namespace DVGui; // this enum is to keep comaptibility with older versions
enum CV_Parts {
CVPARTS_None = 0,
CVPARTS_TOOLBAR = 0x1,
CVPARTS_TOOLOPTIONS = 0x2,
CVPARTS_FLIPCONSOLE = 0x4,
CVPARTS_End = 0x8,
CVPARTS_ALL = CVPARTS_TOOLBAR | CVPARTS_TOOLOPTIONS | CVPARTS_FLIPCONSOLE
};
//============================================================================= //=============================================================================
// //
// ComboViewerPanel // ComboViewerPanel
@ -81,60 +33,26 @@ using namespace DVGui;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#if QT_VERSION >= 0x050500
ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WindowFlags flags) ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WindowFlags flags)
#else : BaseViewerPanel(parent, flags) {
ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags)
#endif
: QFrame(parent) {
TApp *app = TApp::instance();
setFrameStyle(QFrame::StyledPanel);
setObjectName("ComboViewerPanel"); setObjectName("ComboViewerPanel");
TApp *app = TApp::instance();
// ToolBar // ToolBar
m_toolbar = new Toolbar(this, true); m_toolbar = new Toolbar(this, true);
// Tool Options // Tool Options
m_toolOptions = new ToolOptions(); m_toolOptions = new ToolOptions();
m_toolOptions->setObjectName("ComboViewerToolOptions"); m_toolOptions->setObjectName("ComboViewerToolOptions");
// Rulers
// Viewer
ImageUtils::FullScreenWidget *fsWidget =
new ImageUtils::FullScreenWidget(this);
fsWidget->setWidget(m_sceneViewer = new SceneViewer(fsWidget));
m_sceneViewer->setIsStyleShortcutSwitchable();
#if defined(Q_OS_WIN) && (QT_VERSION >= 0x050500) && (QT_VERSION < 0x050600)
// Workaround for QTBUG-48288
// This code should be removed after updating Qt.
// Qt may crash in handling WM_SIZE of m_sceneViewer in splash.finish(&w)
// in main.cpp. To suppress sending WM_SIZE, set window position here.
// WM_SIZE will not be sent if window position is not changed.
::SetWindowPos(reinterpret_cast<HWND>(m_sceneViewer->winId()), HWND_TOP, 0, 0,
0, 0, SWP_NOMOVE | SWP_NOSIZE);
#endif
m_vRuler = new Ruler(this, m_sceneViewer, true); m_vRuler = new Ruler(this, m_sceneViewer, true);
m_hRuler = new Ruler(this, m_sceneViewer, false); m_hRuler = new Ruler(this, m_sceneViewer, false);
m_sceneViewer->setRulers(m_vRuler, m_hRuler); m_sceneViewer->setRulers(m_vRuler, m_hRuler);
m_keyFrameButton = new ViewerKeyframeNavigator(this, app->getCurrentFrame());
m_keyFrameButton->setObjectHandle(app->getCurrentObject());
m_keyFrameButton->setXsheetHandle(app->getCurrentXsheet());
// FlipConsole
std::vector<int> buttonMask = {FlipConsole::eFilledRaster,
FlipConsole::eDefineLoadBox,
FlipConsole::eUseLoadBox};
/* --- layout --- */ /* --- layout --- */
QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->setMargin(0);
mainLayout->setSpacing(0);
{ {
mainLayout->addWidget(m_toolbar, 0); m_mainLayout->insertWidget(0, m_toolbar, 0);
mainLayout->addWidget(m_toolOptions, 0); m_mainLayout->insertWidget(1, m_toolOptions, 0);
QGridLayout *viewerL = new QGridLayout(); QGridLayout *viewerL = new QGridLayout();
viewerL->setMargin(0); viewerL->setMargin(0);
@ -142,68 +60,20 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags)
{ {
viewerL->addWidget(m_vRuler, 1, 0); viewerL->addWidget(m_vRuler, 1, 0);
viewerL->addWidget(m_hRuler, 0, 1); viewerL->addWidget(m_hRuler, 0, 1);
viewerL->addWidget(fsWidget, 1, 1); viewerL->addWidget(m_fsWidget, 1, 1);
} }
mainLayout->addLayout(viewerL, 1); viewerL->setRowStretch(1, 1);
m_flipConsole = viewerL->setColumnStretch(1, 1);
new FlipConsole(mainLayout, buttonMask, false, m_keyFrameButton, m_mainLayout->insertLayout(2, viewerL, 1);
"SceneViewerConsole", this, true);
} }
setLayout(mainLayout); setLayout(m_mainLayout);
m_flipConsole->enableButton(FlipConsole::eMatte, false, false);
m_flipConsole->enableButton(FlipConsole::eSave, false, false);
m_flipConsole->enableButton(FlipConsole::eCompare, false, false);
m_flipConsole->enableButton(FlipConsole::eSaveImg, false, false);
m_flipConsole->enableButton(FlipConsole::eGRed, false, false);
m_flipConsole->enableButton(FlipConsole::eGGreen, false, false);
m_flipConsole->enableButton(FlipConsole::eGBlue, false, false);
// m_flipConsole->enableButton(FlipConsole::eSound, false, false);
m_flipConsole->setFrameRate(app->getCurrentScene()
->getScene()
->getProperties()
->getOutputProperties()
->getFrameRate());
m_flipConsole->setFrameHandle(TApp::instance()->getCurrentFrame());
bool ret = true; bool ret = true;
// When zoom changed, only if the viewer is active, change window title.
ret =
ret && connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)),
this, SLOT(onButtonPressed(FlipConsole::EGadget)));
ret = connect(m_sceneViewer, SIGNAL(onZoomChanged()),
SLOT(changeWindowTitle()));
ret = ret && connect(m_sceneViewer, SIGNAL(previewToggled()), ret = ret && connect(m_sceneViewer, SIGNAL(previewToggled()),
SLOT(changeWindowTitle())); SLOT(changeWindowTitle()));
ret = ret &&
connect(m_flipConsole, SIGNAL(playStateChanged(bool)),
TApp::instance()->getCurrentFrame(), SLOT(setPlaying(bool)));
ret = ret && connect(m_flipConsole, SIGNAL(playStateChanged(bool)), this,
SLOT(onPlayingStatusChanged(bool)));
ret = ret &&
connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)),
m_sceneViewer, SLOT(onButtonPressed(FlipConsole::EGadget)));
ret = ret && connect(m_sceneViewer, SIGNAL(previewStatusChanged()), this,
SLOT(update()));
ret = ret && connect(m_sceneViewer, SIGNAL(onFlipHChanged(bool)), this,
SLOT(setFlipHButtonChecked(bool)));
ret = ret && connect(m_sceneViewer, SIGNAL(onFlipVChanged(bool)), this,
SLOT(setFlipVButtonChecked(bool)));
ret = ret && connect(app->getCurrentScene(), SIGNAL(sceneSwitched()), this,
SLOT(onSceneSwitched()));
assert(ret); assert(ret);
m_flipConsole->setChecked(FlipConsole::eSound, true);
m_playSound = m_flipConsole->isChecked(FlipConsole::eSound);
m_flipConsole->setFrameRate(app->getCurrentScene()
->getScene()
->getProperties()
->getOutputProperties()
->getFrameRate());
UINT mask = 0; UINT mask = 0;
mask = mask | eShowVcr; mask = mask | eShowVcr;
mask = mask | eShowFramerate; mask = mask | eShowFramerate;
@ -216,10 +86,8 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags)
m_flipConsole->setCustomizemask(mask); m_flipConsole->setCustomizemask(mask);
// initial state of the parts // initial state of the parts
m_visiblePartsFlag = CVPARTS_ALL; m_visiblePartsFlag = VPPARTS_COMBO_ALL;
updateShowHide(); updateShowHide();
setFocusProxy(m_sceneViewer);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -228,25 +96,13 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags)
void ComboViewerPanel::updateShowHide() { void ComboViewerPanel::updateShowHide() {
// toolbar // toolbar
m_toolbar->setVisible(m_visiblePartsFlag & CVPARTS_TOOLBAR); m_toolbar->setVisible(m_visiblePartsFlag & VPPARTS_TOOLBAR);
// tool options bar // tool options bar
m_toolOptions->setVisible(m_visiblePartsFlag & CVPARTS_TOOLOPTIONS); m_toolOptions->setVisible(m_visiblePartsFlag & VPPARTS_TOOLOPTIONS);
// flip console // flip console
m_flipConsole->showHidePlaybar(m_visiblePartsFlag & CVPARTS_PLAYBAR); BaseViewerPanel::updateShowHide();
m_flipConsole->showHideFrameSlider(m_visiblePartsFlag & CVPARTS_FRAMESLIDER);
update();
} }
//-----------------------------------------------------------------------------
/*! showing the show/hide commands
*/
// void ComboViewerPanel::contextMenuEvent(QContextMenuEvent *event) {
// QMenu *menu = new QMenu(this);
// addShowHideContextMenu(menu);
// menu->exec(event->globalPos());
//}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void ComboViewerPanel::addShowHideContextMenu(QMenu *menu) { void ComboViewerPanel::addShowHideContextMenu(QMenu *menu) {
@ -258,20 +114,20 @@ void ComboViewerPanel::addShowHideContextMenu(QMenu *menu) {
QAction *frameSliderSHAct = showHideMenu->addAction(tr("Frame Slider")); QAction *frameSliderSHAct = showHideMenu->addAction(tr("Frame Slider"));
toolbarSHAct->setCheckable(true); toolbarSHAct->setCheckable(true);
toolbarSHAct->setChecked(m_visiblePartsFlag & CVPARTS_TOOLBAR); toolbarSHAct->setChecked(m_visiblePartsFlag & VPPARTS_TOOLBAR);
toolbarSHAct->setData((UINT)CVPARTS_TOOLBAR); toolbarSHAct->setData((UINT)VPPARTS_TOOLBAR);
toolOptionsSHAct->setCheckable(true); toolOptionsSHAct->setCheckable(true);
toolOptionsSHAct->setChecked(m_visiblePartsFlag & CVPARTS_TOOLOPTIONS); toolOptionsSHAct->setChecked(m_visiblePartsFlag & VPPARTS_TOOLOPTIONS);
toolOptionsSHAct->setData((UINT)CVPARTS_TOOLOPTIONS); toolOptionsSHAct->setData((UINT)VPPARTS_TOOLOPTIONS);
playbarSHAct->setCheckable(true); playbarSHAct->setCheckable(true);
playbarSHAct->setChecked(m_visiblePartsFlag & CVPARTS_PLAYBAR); playbarSHAct->setChecked(m_visiblePartsFlag & VPPARTS_PLAYBAR);
playbarSHAct->setData((UINT)CVPARTS_PLAYBAR); playbarSHAct->setData((UINT)VPPARTS_PLAYBAR);
frameSliderSHAct->setCheckable(true); frameSliderSHAct->setCheckable(true);
frameSliderSHAct->setChecked(m_visiblePartsFlag & CVPARTS_FRAMESLIDER); frameSliderSHAct->setChecked(m_visiblePartsFlag & VPPARTS_FRAMESLIDER);
frameSliderSHAct->setData((UINT)CVPARTS_FRAMESLIDER); frameSliderSHAct->setData((UINT)VPPARTS_FRAMESLIDER);
QActionGroup *showHideActGroup = new QActionGroup(this); QActionGroup *showHideActGroup = new QActionGroup(this);
showHideActGroup->setExclusive(false); showHideActGroup->setExclusive(false);
@ -295,630 +151,18 @@ void ComboViewerPanel::addShowHideContextMenu(QMenu *menu) {
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/*! slot function for show/hide the parts
*/
void ComboViewerPanel::onShowHideActionTriggered(QAction *act) { void ComboViewerPanel::checkOldVersionVisblePartsFlags(QSettings &settings) {
CV_Parts part = (CV_Parts)act->data().toUInt(); if (!settings.contains("visibleParts")) return;
assert(part < CVPARTS_End); UINT oldVisiblePartsFlag =
settings.value("visibleParts", CVPARTS_ALL).toUInt();
m_visiblePartsFlag ^= part; m_visiblePartsFlag = VPPARTS_None;
if (oldVisiblePartsFlag & CVPARTS_TOOLBAR)
updateShowHide(); m_visiblePartsFlag |= VPPARTS_TOOLBAR;
} if (oldVisiblePartsFlag & CVPARTS_TOOLOPTIONS)
m_visiblePartsFlag |= VPPARTS_TOOLOPTIONS;
//----------------------------------------------------------------------------- if (oldVisiblePartsFlag & CVPARTS_FLIPCONSOLE)
m_visiblePartsFlag |= VPPARTS_PLAYBAR | VPPARTS_FRAMESLIDER;
void ComboViewerPanel::onDrawFrame(int frame, settings.remove("visibleParts");
const ImagePainter::VisualSettings &settings, settings.setValue("viewerVisibleParts", m_visiblePartsFlag);
QElapsedTimer *, qint64) {
TApp *app = TApp::instance();
m_sceneViewer->setVisual(settings);
TFrameHandle *frameHandle = app->getCurrentFrame();
if (m_sceneViewer->isPreviewEnabled()) {
class Previewer *pr = Previewer::instance(m_sceneViewer->getPreviewMode() ==
SceneViewer::SUBCAMERA_PREVIEW);
pr->getRaster(frame - 1); // the 'getRaster' starts the render of the frame
// is not already started
int curFrame = frame;
if (frameHandle->isPlaying() &&
!pr->isFrameReady(
frame - 1)) // stops on last rendered frame until current is ready!
{
while (frame > 0 && !pr->isFrameReady(frame - 1)) frame--;
if (frame == 0)
frame = curFrame; // if no frame is ready, I stay on current...no use
// to rewind
m_flipConsole->setCurrentFrame(frame);
}
}
assert(frame >= 0);
if (frame != frameHandle->getFrameIndex() + 1) {
int oldFrame = frameHandle->getFrame();
frameHandle->setCurrentFrame(frame);
if (!frameHandle->isPlaying() && !frameHandle->isEditingLevel() &&
oldFrame != frameHandle->getFrame())
frameHandle->scrubXsheet(
frame - 1, frame - 1,
TApp::instance()->getCurrentXsheet()->getXsheet());
}
else if (settings.m_blankColor != TPixel::Transparent)
m_sceneViewer->update();
}
//-----------------------------------------------------------------------------
ComboViewerPanel::~ComboViewerPanel() {}
//-----------------------------------------------------------------------------
void ComboViewerPanel::showEvent(QShowEvent *event) {
TApp *app = TApp::instance();
TFrameHandle *frameHandle = app->getCurrentFrame();
TSceneHandle *sceneHandle = app->getCurrentScene();
TXshLevelHandle *levelHandle = app->getCurrentLevel();
TObjectHandle *objectHandle = app->getCurrentObject();
TXsheetHandle *xshHandle = app->getCurrentXsheet();
bool ret = true;
/*!
onSceneChanged(): called when the scene changed
- set new scene's FPS
- update the range of frame slider with a new framehandle
- set the marker
- update key frames
*/
ret =
connect(xshHandle, SIGNAL(xsheetChanged()), this, SLOT(onSceneChanged()));
ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this,
SLOT(onSceneChanged()));
ret = ret && connect(sceneHandle, SIGNAL(sceneChanged()), this,
SLOT(onSceneChanged()));
/*!
changeWindowTitle(): called when the scene / level / frame is changed
- chenge the title text
*/
ret = ret && connect(sceneHandle, SIGNAL(nameSceneChanged()), this,
SLOT(changeWindowTitle()));
ret =
ret && connect(sceneHandle, SIGNAL(preferenceChanged(const QString &)),
m_flipConsole, SLOT(onPreferenceChanged(const QString &)));
ret = ret && connect(levelHandle, SIGNAL(xshLevelChanged()), this,
SLOT(changeWindowTitle()));
ret = ret && connect(frameHandle, SIGNAL(frameSwitched()), this,
SLOT(changeWindowTitle()));
// onXshLevelSwitched(TXshLevel*) changeWindowTitle() + updateFrameRange()
ret = ret && connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this,
SLOT(onXshLevelSwitched(TXshLevel *)));
ret = ret && connect(levelHandle, SIGNAL(xshLevelTitleChanged()), this,
SLOT(changeWindowTitle()));
// updateFrameRange(): update the frame slider's range
ret = ret && connect(levelHandle, SIGNAL(xshLevelChanged()), this,
SLOT(updateFrameRange()));
// onFrameTypeChanged(): reset the marker positions in the flip console
ret = ret && connect(frameHandle, SIGNAL(frameTypeChanged()), this,
SLOT(onFrameTypeChanged()));
// onFrameChanged(): update the flipconsole according to the current frame
ret = ret && connect(frameHandle, SIGNAL(frameSwitched()), this,
SLOT(onFrameChanged()));
ret = ret && connect(app->getCurrentTool(), SIGNAL(toolSwitched()),
m_sceneViewer, SLOT(onToolSwitched()));
assert(ret);
m_flipConsole->setActive(true);
m_flipConsole->onPreferenceChanged("");
// refresh
onSceneChanged();
changeWindowTitle();
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::hideEvent(QHideEvent *event) {
TApp *app = TApp::instance();
disconnect(app->getCurrentFrame(), 0, this, 0);
disconnect(app->getCurrentScene(), 0, this, 0);
disconnect(app->getCurrentLevel(), 0, this, 0);
disconnect(app->getCurrentObject(), 0, this, 0);
disconnect(app->getCurrentXsheet(), 0, this, 0);
disconnect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer,
SLOT(onToolSwitched()));
disconnect(app->getCurrentScene(), SIGNAL(preferenceChanged(const QString &)),
m_flipConsole, SLOT(onPreferenceChanged(const QString &)));
m_flipConsole->setActive(false);
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) {
bool ret = true;
TPanelTitleBarButtonSet *viewModeButtonSet;
m_referenceModeBs = viewModeButtonSet = new TPanelTitleBarButtonSet();
int x = -272;
int iconWidth = 20;
TPanelTitleBarButton *button;
// buttons for show / hide toggle for the field guide and the safe area
TPanelTitleBarButtonForSafeArea *safeAreaButton =
new TPanelTitleBarButtonForSafeArea(
titleBar, getIconThemePath("actions/20/pane_safe.svg"));
safeAreaButton->setToolTip(tr("Safe Area (Right Click to Select)"));
titleBar->add(QPoint(x, 0), safeAreaButton);
ret = ret && connect(safeAreaButton, SIGNAL(toggled(bool)),
CommandManager::instance()->getAction(MI_SafeArea),
SLOT(trigger()));
ret = ret && connect(CommandManager::instance()->getAction(MI_SafeArea),
SIGNAL(triggered(bool)), safeAreaButton,
SLOT(setPressed(bool)));
// initialize state
safeAreaButton->setPressed(
CommandManager::instance()->getAction(MI_SafeArea)->isChecked());
button = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_grid.svg"));
button->setToolTip(tr("Grids and Overlays\nRight click to adjust."));
x += 1 + iconWidth;
titleBar->add(QPoint(x, 0), button);
ret = ret && connect(button, SIGNAL(toggled(bool)),
CommandManager::instance()->getAction(MI_FieldGuide),
SLOT(trigger()));
ret = ret && connect(CommandManager::instance()->getAction(MI_FieldGuide),
SIGNAL(triggered(bool)), button, SLOT(setPressed(bool)));
// initialize state
button->setPressed(
CommandManager::instance()->getAction(MI_FieldGuide)->isChecked());
TPanelTitleBarButtonForGrids *gridMoreButton =
new TPanelTitleBarButtonForGrids(
titleBar, getIconThemePath("actions/9/pane_more.svg"));
gridMoreButton->setToolTip(tr("Grids and Overlays Settings"));
x += 1 + iconWidth;
titleBar->add(QPoint(x, 0), gridMoreButton);
connect(gridMoreButton, &TPanelTitleBarButtonForGrids::updateViewer,
[=]() { m_sceneViewer->update(); });
// view mode toggles
button = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_table.svg"));
button->setToolTip(tr("Camera Stand View"));
x += 10 + iconWidth;
titleBar->add(QPoint(x, 0), button);
button->setButtonSet(viewModeButtonSet, SceneViewer::NORMAL_REFERENCE);
button->setPressed(true);
button = new TPanelTitleBarButton(titleBar,
getIconThemePath("actions/20/pane_3d.svg"));
button->setToolTip(tr("3D View"));
x += +1 + iconWidth;
titleBar->add(QPoint(x, 0), button);
button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA3D_REFERENCE);
button = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_cam.svg"));
button->setToolTip(tr("Camera View"));
x += +1 + iconWidth;
titleBar->add(QPoint(x, 0), button);
button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA_REFERENCE);
TPanelTitleBarButtonForCameraView *camTransparencyButton =
new TPanelTitleBarButtonForCameraView(
titleBar, getIconThemePath("actions/9/pane_more.svg"));
camTransparencyButton->setToolTip(tr("Change camera view transparency."));
x += 1 + iconWidth;
titleBar->add(QPoint(x, 0), camTransparencyButton);
connect(camTransparencyButton,
&TPanelTitleBarButtonForCameraView::updateViewer,
[=]() { m_sceneViewer->update(); });
ret = ret && connect(viewModeButtonSet, SIGNAL(selected(int)), m_sceneViewer,
SLOT(setReferenceMode(int)));
// freeze button
button = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_freeze.svg"));
x += 10 + iconWidth;
button->setToolTip(tr("Freeze"));
titleBar->add(QPoint(x, 0), button);
ret = ret && connect(button, SIGNAL(toggled(bool)), m_sceneViewer,
SLOT(freeze(bool)));
// preview toggles
m_previewButton = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_preview.svg"));
x += 10 + iconWidth;
titleBar->add(QPoint(x, 0), m_previewButton);
m_previewButton->setToolTip(tr("Preview"));
ret = ret && connect(m_previewButton, SIGNAL(toggled(bool)),
SLOT(enableFullPreview(bool)));
m_subcameraPreviewButton = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_subpreview.svg"));
x += +1 + 24; // width of pane_preview.svg = 24px
titleBar->add(QPoint(x, 0), m_subcameraPreviewButton);
m_subcameraPreviewButton->setToolTip(tr("Sub-camera Preview"));
ret = ret && connect(m_subcameraPreviewButton, SIGNAL(toggled(bool)),
SLOT(enableSubCameraPreview(bool)));
assert(ret);
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::enableFullPreview(bool enabled) {
m_subcameraPreviewButton->setPressed(false);
m_sceneViewer->enablePreview(enabled ? SceneViewer::FULL_PREVIEW
: SceneViewer::NO_PREVIEW);
m_flipConsole->setProgressBarStatus(
&Previewer::instance(false)->getProgressBarStatus());
enableFlipConsoleForCamerastand(enabled);
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::enableSubCameraPreview(bool enabled) {
m_previewButton->setPressed(false);
m_sceneViewer->enablePreview(enabled ? SceneViewer::SUBCAMERA_PREVIEW
: SceneViewer::NO_PREVIEW);
m_flipConsole->setProgressBarStatus(
&Previewer::instance(true)->getProgressBarStatus());
enableFlipConsoleForCamerastand(enabled);
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::enableFlipConsoleForCamerastand(bool on) {
m_flipConsole->enableButton(FlipConsole::eMatte, on, false);
m_flipConsole->enableButton(FlipConsole::eSave, on, false);
m_flipConsole->enableButton(FlipConsole::eCompare, on, false);
m_flipConsole->enableButton(FlipConsole::eSaveImg, on, false);
m_flipConsole->enableButton(FlipConsole::eGRed, on, false);
m_flipConsole->enableButton(FlipConsole::eGGreen, on, false);
m_flipConsole->enableButton(FlipConsole::eGBlue, on, false);
m_flipConsole->enableButton(FlipConsole::eBlackBg, on, false);
m_flipConsole->enableButton(FlipConsole::eWhiteBg, on, false);
m_flipConsole->enableButton(FlipConsole::eCheckBg, on, false);
m_flipConsole->enableProgressBar(on);
update();
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::onXshLevelSwitched(TXshLevel *) {
changeWindowTitle();
m_sceneViewer->update();
// If the level is switched by using the combobox in the film strip, the
// current level switches without change in the frame type (level or scene).
// For such case, update the frame range of the console here.
if (TApp::instance()->getCurrentFrame()->isEditingLevel()) updateFrameRange();
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::onPlayingStatusChanged(bool playing) {
if (playing) {
m_playing = true;
} else {
m_playing = false;
m_first = true;
}
if (Preferences::instance()->getOnionSkinDuringPlayback()) return;
OnionSkinMask osm =
TApp::instance()->getCurrentOnionSkin()->getOnionSkinMask();
if (playing) {
m_onionSkinActive = osm.isEnabled();
if (m_onionSkinActive) {
osm.enable(false);
TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(osm);
TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged();
}
} else {
if (m_onionSkinActive) {
osm.enable(true);
TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(osm);
TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged();
}
}
m_sceneViewer->invalidateToolStatus();
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::changeWindowTitle() {
TApp *app = TApp::instance();
ToonzScene *scene = app->getCurrentScene()->getScene();
if (!scene) return;
if (!parentWidget()) return;
int frame = app->getCurrentFrame()->getFrame();
// put the titlebar texts in this string
QString name;
// if the frame type is "scene editing"
if (app->getCurrentFrame()->isEditingScene()) {
TProject *project = scene->getProject();
QString sceneName = QString::fromStdWString(scene->getSceneName());
if (sceneName.isEmpty()) sceneName = tr("Untitled");
if (app->getCurrentScene()->getDirtyFlag()) sceneName += QString("*");
name = tr("Scene: ") + sceneName;
if (frame >= 0)
name =
name + tr(" :: Frame: ") + tr(std::to_string(frame + 1).c_str());
int col = app->getCurrentColumn()->getColumnIndex();
if (col < 0) {
if ((m_sceneViewer->getIsFlippedX() || m_sceneViewer->getIsFlippedY()) &&
!m_sceneViewer->is3DView()) {
name = name + tr(" (Flipped)");
}
parentWidget()->setWindowTitle(name);
return;
}
TXsheet *xsh = app->getCurrentXsheet()->getXsheet();
TXshCell cell = xsh->getCell(frame, col);
if (cell.isEmpty()) {
if ((m_sceneViewer->getIsFlippedX() || m_sceneViewer->getIsFlippedY()) &&
!m_sceneViewer->is3DView()) {
name = name + tr(" (Flipped)");
}
parentWidget()->setWindowTitle(name);
return;
}
assert(cell.m_level.getPointer());
TFilePath fp(cell.m_level->getName());
QString imageName =
QString::fromStdWString(fp.withFrame(cell.m_frameId).getWideString());
name = name + tr(" :: Level: ") + imageName;
if (!m_sceneViewer->is3DView()) {
TAffine aff = m_sceneViewer->getViewMatrix() *
m_sceneViewer->getNormalZoomScale().inv();
if (m_sceneViewer->getIsFlippedX()) aff = aff * TScale(-1, 1);
if (m_sceneViewer->getIsFlippedY()) aff = aff * TScale(1, -1);
name = name + " :: Zoom : " +
QString::number(tround(100.0 * sqrt(aff.det()))) + "%";
}
// If the current level exists and some option is set in the preference,
// set the zoom value to the current level's dpi
else if (Preferences::instance()
->isActualPixelViewOnSceneEditingModeEnabled() &&
TApp::instance()->getCurrentLevel()->getSimpleLevel() &&
!CleanupPreviewCheck::instance()
->isEnabled() // cleanup preview must be OFF
&& !CameraTestCheck::instance() // camera test mode must be OFF
// neither
->isEnabled() &&
!m_sceneViewer->is3DView()) {
TAffine aff = m_sceneViewer->getViewMatrix() *
m_sceneViewer->getNormalZoomScale().inv();
if (m_sceneViewer->getIsFlippedX()) aff = aff * TScale(-1, 1);
if (m_sceneViewer->getIsFlippedY()) aff = aff * TScale(1, -1);
name = name + " :: Zoom : " +
QString::number(tround(100.0 * sqrt(aff.det()))) + "%";
}
}
// if the frame type is "level editing"
else {
TXshLevel *level = app->getCurrentLevel()->getLevel();
if (level) {
TFilePath fp(level->getName());
QString imageName = QString::fromStdWString(
fp.withFrame(app->getCurrentFrame()->getFid()).getWideString());
name = name + tr("Level: ") + imageName;
if (!m_sceneViewer->is3DView()) {
TAffine aff = m_sceneViewer->getViewMatrix() *
m_sceneViewer->getNormalZoomScale().inv();
if (m_sceneViewer->getIsFlippedX()) aff = aff * TScale(-1, 1);
if (m_sceneViewer->getIsFlippedY()) aff = aff * TScale(1, -1);
name = name + " :: Zoom : " +
QString::number(tround(100.0 * sqrt(aff.det()))) + "%";
}
}
}
if ((m_sceneViewer->getIsFlippedX() || m_sceneViewer->getIsFlippedY()) &&
!m_sceneViewer->is3DView()) {
name = name + tr(" (Flipped)");
}
parentWidget()->setWindowTitle(name);
}
//-----------------------------------------------------------------------------
/*! update the frame range according to the current frame type
*/
void ComboViewerPanel::updateFrameRange() {
TFrameHandle *fh = TApp::instance()->getCurrentFrame();
int frameIndex = fh->getFrameIndex();
int maxFrameIndex = fh->getMaxFrameIndex();
if (frameIndex > maxFrameIndex) frameIndex = maxFrameIndex;
m_flipConsole->setFrameRange(1, maxFrameIndex + 1, 1, frameIndex + 1);
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::onSceneChanged() {
TFrameHandle *fh = TApp::instance()->getCurrentFrame();
int frameIndex = fh->getFrameIndex();
int maxFrameIndex = fh->getMaxFrameIndex();
if (frameIndex > maxFrameIndex) maxFrameIndex = frameIndex;
// update fps only when the scene settings is changed
m_flipConsole->setFrameRate(TApp::instance()
->getCurrentScene()
->getScene()
->getProperties()
->getOutputProperties()
->getFrameRate(),
false);
// update the frame slider's range with new frameHandle
m_flipConsole->setFrameRange(1, maxFrameIndex + 1, 1, frameIndex + 1);
// set the markers
int fromIndex, toIndex, dummy;
XsheetGUI::getPlayRange(fromIndex, toIndex, dummy);
m_flipConsole->setMarkers(fromIndex, toIndex);
// update the key frames
if (m_keyFrameButton && (m_keyFrameButton->getCurrentFrame() != frameIndex))
m_keyFrameButton->setCurrentFrame(frameIndex);
hasSoundtrack();
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::onSceneSwitched() {
m_previewButton->setPressed(false);
m_subcameraPreviewButton->setPressed(false);
enableFlipConsoleForCamerastand(false);
m_sceneViewer->enablePreview(SceneViewer::NO_PREVIEW);
m_flipConsole->setChecked(FlipConsole::eDefineSubCamera, false);
m_flipConsole->setFrameRate(TApp::instance()
->getCurrentScene()
->getScene()
->getProperties()
->getOutputProperties()
->getFrameRate());
m_sceneViewer->setEditPreviewSubcamera(false);
onSceneChanged();
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::onFrameChanged() {
int frameIndex = TApp::instance()->getCurrentFrame()->getFrameIndex();
m_flipConsole->setCurrentFrame(frameIndex + 1);
if (m_keyFrameButton && (m_keyFrameButton->getCurrentFrame() != frameIndex))
m_keyFrameButton->setCurrentFrame(frameIndex);
if (m_playing && m_playSound) {
if (m_first == true && hasSoundtrack()) {
playAudioFrame(frameIndex);
} else if (m_hasSoundtrack) {
playAudioFrame(frameIndex);
}
}
}
//-----------------------------------------------------------------------------
/*! reset the marker positions in the flip console
*/
void ComboViewerPanel::onFrameTypeChanged() {
if (TApp::instance()->getCurrentFrame()->getFrameType() ==
TFrameHandle::LevelFrame &&
m_sceneViewer->isPreviewEnabled()) {
m_previewButton->setPressed(false);
m_subcameraPreviewButton->setPressed(false);
enableFlipConsoleForCamerastand(false);
m_sceneViewer->enablePreview(SceneViewer::NO_PREVIEW);
}
m_flipConsole->setChecked(FlipConsole::eDefineSubCamera, false);
m_sceneViewer->setEditPreviewSubcamera(false);
updateFrameRange();
// if in the scene editing mode, get the preview marker positions
if (TApp::instance()->getCurrentFrame()->isEditingScene()) {
// set the markers
int fromIndex, toIndex, dummy;
XsheetGUI::getPlayRange(fromIndex, toIndex, dummy);
m_flipConsole->setMarkers(fromIndex, toIndex);
}
// if in the level editing mode, ignore the preview marker
else
m_flipConsole->setMarkers(0, -1);
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::playAudioFrame(int frame) {
if (m_first) {
m_first = false;
m_fps = TApp::instance()
->getCurrentScene()
->getScene()
->getProperties()
->getOutputProperties()
->getFrameRate();
m_samplesPerFrame = m_sound->getSampleRate() / std::abs(m_fps);
}
if (!m_sound) return;
m_viewerFps = m_flipConsole->getCurrentFps();
double s0 = frame * m_samplesPerFrame, s1 = s0 + m_samplesPerFrame;
// make the sound stop if the viewerfps is higher so the next sound can play
// on time.
if (m_fps < m_viewerFps)
TApp::instance()->getCurrentXsheet()->getXsheet()->stopScrub();
TApp::instance()->getCurrentXsheet()->getXsheet()->play(m_sound, s0, s1,
false);
}
//-----------------------------------------------------------------------------
bool ComboViewerPanel::hasSoundtrack() {
if (m_sound != NULL) {
m_sound = NULL;
m_hasSoundtrack = false;
m_first = true;
}
TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
TXsheet::SoundProperties *prop = new TXsheet::SoundProperties();
if (!m_sceneViewer->isPreviewEnabled()) prop->m_isPreview = true;
m_sound = xsheetHandle->getXsheet()->makeSound(prop);
if (m_sound == NULL) {
m_hasSoundtrack = false;
return false;
} else {
m_hasSoundtrack = true;
return true;
}
}
void ComboViewerPanel::onButtonPressed(FlipConsole::EGadget button) {
if (button == FlipConsole::eSound) {
m_playSound = !m_playSound;
}
}
void ComboViewerPanel::setFlipHButtonChecked(bool checked) {
m_flipConsole->setChecked(FlipConsole::eFlipHorizontal, checked);
}
void ComboViewerPanel::setFlipVButtonChecked(bool checked) {
m_flipConsole->setChecked(FlipConsole::eFlipVertical, checked);
}
//-----------------------------------------------------------------------------
void ComboViewerPanel::setVisiblePartsFlag(UINT flag) {
m_visiblePartsFlag = flag;
updateShowHide();
}
// SaveLoadQSettings
void ComboViewerPanel::save(QSettings &settings, bool forPopupIni) const {
settings.setValue("visibleParts", m_visiblePartsFlag);
}
void ComboViewerPanel::load(QSettings &settings) {
m_visiblePartsFlag = settings.value("visibleParts", CVPARTS_ALL).toUInt();
updateShowHide();
} }

View file

@ -3,140 +3,34 @@
#ifndef COMBOVIEWER_PANE_INCLUDED #ifndef COMBOVIEWER_PANE_INCLUDED
#define COMBOVIEWER_PANE_INCLUDED #define COMBOVIEWER_PANE_INCLUDED
#include "sceneviewer.h" #include "viewerpane.h"
#include "toonzqt/intfield.h"
#include "toonzqt/keyframenavigator.h"
#include "toonzqt/flipconsoleowner.h"
#include "saveloadqsettings.h"
#include <QFrame>
class QPoint;
class QToolBar;
class QLabel;
class QSlider;
class QActionGroup;
class QButtonGroup;
class QToolBar;
class Ruler;
class Toolbar; class Toolbar;
class TPanel;
class Ruler;
class FlipConsole;
class TXshLevel;
class ToolOptions; class ToolOptions;
//============================================================================= //=============================================================================
// ComboViewerPanel // ComboViewerPanel
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
enum CV_Parts {
CVPARTS_None = 0,
CVPARTS_TOOLBAR = 0x1,
CVPARTS_TOOLOPTIONS = 0x2,
CVPARTS_PLAYBAR = 0x4,
CVPARTS_FRAMESLIDER = 0x8,
CVPARTS_End = 0x16,
CVPARTS_ALL = CVPARTS_TOOLBAR | CVPARTS_TOOLOPTIONS | CVPARTS_PLAYBAR |
CVPARTS_FRAMESLIDER
};
//----------------------------------------------------------------------------- class ComboViewerPanel final : public BaseViewerPanel {
class ComboViewerPanel final : public QFrame,
public FlipConsoleOwner,
public SaveLoadQSettings {
Q_OBJECT Q_OBJECT
SceneViewer *m_sceneViewer;
FlipConsole *m_flipConsole;
ViewerKeyframeNavigator *m_keyFrameButton;
TPanelTitleBarButtonSet *m_referenceModeBs;
Toolbar *m_toolbar; Toolbar *m_toolbar;
ToolOptions *m_toolOptions; ToolOptions *m_toolOptions;
Ruler *m_vRuler; Ruler *m_vRuler;
Ruler *m_hRuler; Ruler *m_hRuler;
UINT m_visiblePartsFlag;
bool m_onionSkinActive = false;
bool m_playSound = true;
bool m_hasSoundtrack = false;
bool m_playing = false;
double m_fps;
int m_viewerFps;
double m_samplesPerFrame;
bool m_first = true;
TSoundTrack *m_sound = NULL;
TPanelTitleBarButton *m_previewButton;
TPanelTitleBarButton *m_subcameraPreviewButton;
public: public:
#if QT_VERSION >= 0x050500
ComboViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0); ComboViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0);
#else ~ComboViewerPanel() {}
ComboViewerPanel(QWidget *parent = 0, Qt::WFlags flags = 0);
#endif
~ComboViewerPanel();
SceneViewer *getSceneViewer() { return m_sceneViewer; }
ToolOptions *getToolOptions() { return m_toolOptions; } ToolOptions *getToolOptions() { return m_toolOptions; }
// toggle show/hide of the widgets according to m_visiblePartsFlag void updateShowHide() override;
void setVisiblePartsFlag(UINT flag); void addShowHideContextMenu(QMenu *) override;
void updateShowHide();
void addShowHideContextMenu(QMenu *);
void onDrawFrame(int frame, const ImagePainter::VisualSettings &settings,
QElapsedTimer *timer, qint64 targetInstant) override;
void onEnterPanel() {
m_sceneViewer->setFocus(Qt::OtherFocusReason);
// activate shortcut key for this flipconsole
m_flipConsole->makeCurrent();
}
void onLeavePanel() { m_sceneViewer->clearFocus(); }
// SaveLoadQSettings
virtual void save(QSettings &settings,
bool forPopupIni = false) const override;
virtual void load(QSettings &settings) override;
void initializeTitleBar(TPanelTitleBar *titleBar);
protected: protected:
void showEvent(QShowEvent *) override; void checkOldVersionVisblePartsFlags(QSettings &settings) override;
void hideEvent(QHideEvent *) override;
void createFrameToolBar();
void createPlayToolBar();
void addColorMaskButton(QWidget *parent, const char *iconSVGName, int id);
// void contextMenuEvent(QContextMenuEvent *event) override;
void playAudioFrame(int frame);
bool hasSoundtrack();
public slots:
void onSceneChanged();
void changeWindowTitle();
void updateFrameRange();
void onXshLevelSwitched(TXshLevel *);
void onPlayingStatusChanged(bool playing);
// for showing/hiding the parts
void onShowHideActionTriggered(QAction *);
void enableFlipConsoleForCamerastand(bool on);
void onButtonPressed(FlipConsole::EGadget button);
void setFlipHButtonChecked(bool checked);
void setFlipVButtonChecked(bool checked);
protected slots:
void onFrameChanged();
// need to update the preview marker as well as the frame range in flipconsole
void onFrameTypeChanged();
void onSceneSwitched();
void enableFullPreview(bool enabled);
void enableSubCameraPreview(bool enabled);
}; };
#endif #endif

View file

@ -1909,18 +1909,11 @@ void SceneViewer::onContextMenu(const QPoint &pos, const QPoint &globalPos) {
menu->addLevelCommands(columnIndices); menu->addLevelCommands(columnIndices);
ComboViewerPanel *cvp = BaseViewerPanel *bvp =
qobject_cast<ComboViewerPanel *>(parentWidget()->parentWidget()); qobject_cast<BaseViewerPanel *>(parentWidget()->parentWidget());
if (cvp) { if (bvp) {
menu->addSeparator(); menu->addSeparator();
cvp->addShowHideContextMenu(menu); bvp->addShowHideContextMenu(menu);
}
SceneViewerPanel *svp = qobject_cast<SceneViewerPanel *>(
parentWidget()->parentWidget()->parentWidget());
if (svp) {
menu->addSeparator();
svp->addShowHideContextMenu(menu);
} }
menu->exec(globalPos); menu->exec(globalPos);

View file

@ -1,4 +1,3 @@
#include "viewerpane.h"
// TnzCore includes // TnzCore includes
#include "tconvert.h" #include "tconvert.h"
@ -63,64 +62,31 @@
#include <QMainWindow> #include <QMainWindow>
#include <QSettings> #include <QSettings>
enum CV_Parts { #include "viewerpane.h"
CVPARTS_None = 0,
CVPARTS_PLAYBAR = 0x1,
CVPARTS_FRAMESLIDER = 0x4,
CVPARTS_End = 0x8,
CVPARTS_ALL = CVPARTS_PLAYBAR | CVPARTS_FRAMESLIDER
};
using namespace DVGui; using namespace DVGui;
//============================================================================= //=============================================================================
// //
// SceneViewerPanel // BaseViewerPanel
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#if QT_VERSION >= 0x050500 BaseViewerPanel::BaseViewerPanel(QWidget *parent, Qt::WindowFlags flags)
SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WindowFlags flags)
#else
SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags)
#endif
: QFrame(parent) { : QFrame(parent) {
setFrameStyle(QFrame::StyledPanel); TApp *app = TApp::instance();
setObjectName("ViewerPanel");
QVBoxLayout *mainLayout = new QVBoxLayout(this); setFrameStyle(QFrame::StyledPanel);
mainLayout->setMargin(0);
mainLayout->setSpacing(0); m_mainLayout = new QVBoxLayout();
m_mainLayout->setMargin(0);
m_mainLayout->setSpacing(0);
// Viewer // Viewer
QWidget *viewer = new QWidget(this); m_fsWidget = new ImageUtils::FullScreenWidget(this);
QGridLayout *viewerL = new QGridLayout(viewer); m_fsWidget->setWidget(m_sceneViewer = new SceneViewer(m_fsWidget));
ImageUtils::FullScreenWidget *fsWidget =
new ImageUtils::FullScreenWidget(viewer);
fsWidget->setWidget(m_sceneViewer = new SceneViewer(fsWidget));
m_sceneViewer->setIsStyleShortcutSwitchable(); m_sceneViewer->setIsStyleShortcutSwitchable();
bool ret = true;
ret = ret && connect(m_sceneViewer, SIGNAL(onZoomChanged()),
SLOT(changeWindowTitle()));
Ruler *vRuler = new Ruler(viewer, m_sceneViewer, true);
Ruler *hRuler = new Ruler(viewer, m_sceneViewer, false);
m_sceneViewer->setRulers(vRuler, hRuler);
viewerL->setMargin(0);
viewerL->setSpacing(0);
viewerL->addWidget(vRuler, 1, 0);
viewerL->addWidget(hRuler, 0, 1);
viewerL->addWidget(fsWidget, 1, 1, 19, 13);
viewer->setMinimumHeight(200);
viewer->setLayout(viewerL);
mainLayout->addWidget(viewer, Qt::AlignCenter);
TApp *app = TApp::instance();
m_keyFrameButton = new ViewerKeyframeNavigator(0, app->getCurrentFrame()); m_keyFrameButton = new ViewerKeyframeNavigator(0, app->getCurrentFrame());
m_keyFrameButton->setObjectHandle(app->getCurrentObject()); m_keyFrameButton->setObjectHandle(app->getCurrentObject());
m_keyFrameButton->setXsheetHandle(app->getCurrentXsheet()); m_keyFrameButton->setXsheetHandle(app->getCurrentXsheet());
@ -130,9 +96,9 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags)
FlipConsole::eUseLoadBox}; FlipConsole::eUseLoadBox};
m_flipConsole = m_flipConsole =
new FlipConsole(mainLayout, buttonMask, false, m_keyFrameButton, new FlipConsole(m_mainLayout, buttonMask, false, m_keyFrameButton,
"SceneViewerConsole", this, true); "SceneViewerConsole", this, true);
mainLayout->addWidget(m_flipConsole); m_mainLayout->addWidget(m_flipConsole);
m_flipConsole->enableButton(FlipConsole::eMatte, false, false); m_flipConsole->enableButton(FlipConsole::eMatte, false, false);
m_flipConsole->enableButton(FlipConsole::eSave, false, false); m_flipConsole->enableButton(FlipConsole::eSave, false, false);
@ -144,9 +110,20 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags)
m_flipConsole->enableButton(FlipConsole::eBlackBg, false, false); m_flipConsole->enableButton(FlipConsole::eBlackBg, false, false);
m_flipConsole->enableButton(FlipConsole::eWhiteBg, false, false); m_flipConsole->enableButton(FlipConsole::eWhiteBg, false, false);
m_flipConsole->enableButton(FlipConsole::eCheckBg, false, false); m_flipConsole->enableButton(FlipConsole::eCheckBg, false, false);
m_flipConsole->setChecked(FlipConsole::eSound, true);
m_playSound = m_flipConsole->isChecked(FlipConsole::eSound);
m_flipConsole->setFrameRate(app->getCurrentScene()
->getScene()
->getProperties()
->getOutputProperties()
->getFrameRate());
m_flipConsole->setFrameHandle(TApp::instance()->getCurrentFrame()); m_flipConsole->setFrameHandle(TApp::instance()->getCurrentFrame());
bool ret = true;
// When zoom changed, only if the viewer is active, change window titl
ret = ret && connect(m_sceneViewer, SIGNAL(onZoomChanged()),
SLOT(changeWindowTitle()));
ret = ret && ret = ret &&
connect(m_flipConsole, SIGNAL(playStateChanged(bool)), connect(m_flipConsole, SIGNAL(playStateChanged(bool)),
TApp::instance()->getCurrentFrame(), SLOT(setPlaying(bool))); TApp::instance()->getCurrentFrame(), SLOT(setPlaying(bool)));
@ -157,7 +134,6 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags)
ret = ret && ret = ret &&
connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)), connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)),
m_sceneViewer, SLOT(onButtonPressed(FlipConsole::EGadget))); m_sceneViewer, SLOT(onButtonPressed(FlipConsole::EGadget)));
ret = ret =
ret && connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)), ret && connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)),
this, SLOT(onButtonPressed(FlipConsole::EGadget))); this, SLOT(onButtonPressed(FlipConsole::EGadget)));
@ -173,13 +149,6 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags)
SLOT(onSceneSwitched())); SLOT(onSceneSwitched()));
assert(ret); assert(ret);
m_flipConsole->setChecked(FlipConsole::eSound, true);
m_playSound = m_flipConsole->isChecked(FlipConsole::eSound);
m_flipConsole->setFrameRate(app->getCurrentScene()
->getScene()
->getProperties()
->getOutputProperties()
->getFrameRate());
UINT mask = 0; UINT mask = 0;
mask = mask | eShowVcr; mask = mask | eShowVcr;
@ -192,13 +161,6 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags)
mask = mask & ~eShowHisto; mask = mask & ~eShowHisto;
m_flipConsole->setCustomizemask(mask); m_flipConsole->setCustomizemask(mask);
updateFrameRange(), updateFrameMarkers();
setLayout(mainLayout);
m_visiblePartsFlag = CVPARTS_ALL;
updateShowHide();
setFocusProxy(m_sceneViewer); setFocusProxy(m_sceneViewer);
} }
@ -208,10 +170,10 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags)
/*! toggle show/hide of the widgets according to m_visibleFlag /*! toggle show/hide of the widgets according to m_visibleFlag
*/ */
void SceneViewerPanel::updateShowHide() { void BaseViewerPanel::updateShowHide() {
// flip console // flip console
m_flipConsole->showHidePlaybar(m_visiblePartsFlag & CVPARTS_PLAYBAR); m_flipConsole->showHidePlaybar(m_visiblePartsFlag & VPPARTS_PLAYBAR);
m_flipConsole->showHideFrameSlider(m_visiblePartsFlag & CVPARTS_FRAMESLIDER); m_flipConsole->showHideFrameSlider(m_visiblePartsFlag & VPPARTS_FRAMESLIDER);
update(); update();
} }
@ -219,7 +181,7 @@ void SceneViewerPanel::updateShowHide() {
/*! showing the show/hide commands /*! showing the show/hide commands
*/ */
// void SceneViewerPanel::contextMenuEvent(QContextMenuEvent *event) { // void BaseViewerPanel::contextMenuEvent(QContextMenuEvent *event) {
// QMenu *menu = new QMenu(this); // QMenu *menu = new QMenu(this);
// addShowHideContextMenu(menu); // addShowHideContextMenu(menu);
// menu->exec(event->globalPos()); // menu->exec(event->globalPos());
@ -227,7 +189,7 @@ void SceneViewerPanel::updateShowHide() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::addShowHideContextMenu(QMenu *menu) { void BaseViewerPanel::addShowHideContextMenu(QMenu *menu) {
QMenu *showHideMenu = menu->addMenu(tr("GUI Show / Hide")); QMenu *showHideMenu = menu->addMenu(tr("GUI Show / Hide"));
// actions // actions
@ -235,12 +197,12 @@ void SceneViewerPanel::addShowHideContextMenu(QMenu *menu) {
QAction *frameSliderSHAct = showHideMenu->addAction(tr("Frame Slider")); QAction *frameSliderSHAct = showHideMenu->addAction(tr("Frame Slider"));
playbarSHAct->setCheckable(true); playbarSHAct->setCheckable(true);
playbarSHAct->setChecked(m_visiblePartsFlag & CVPARTS_PLAYBAR); playbarSHAct->setChecked(m_visiblePartsFlag & VPPARTS_PLAYBAR);
playbarSHAct->setData((UINT)CVPARTS_PLAYBAR); playbarSHAct->setData((UINT)VPPARTS_PLAYBAR);
frameSliderSHAct->setCheckable(true); frameSliderSHAct->setCheckable(true);
frameSliderSHAct->setChecked(m_visiblePartsFlag & CVPARTS_FRAMESLIDER); frameSliderSHAct->setChecked(m_visiblePartsFlag & VPPARTS_FRAMESLIDER);
frameSliderSHAct->setData((UINT)CVPARTS_FRAMESLIDER); frameSliderSHAct->setData((UINT)VPPARTS_FRAMESLIDER);
QActionGroup *showHideActGroup = new QActionGroup(this); QActionGroup *showHideActGroup = new QActionGroup(this);
showHideActGroup->setExclusive(false); showHideActGroup->setExclusive(false);
@ -265,18 +227,20 @@ void SceneViewerPanel::addShowHideContextMenu(QMenu *menu) {
/*! slot function for show/hide the parts /*! slot function for show/hide the parts
*/ */
void SceneViewerPanel::onShowHideActionTriggered(QAction *act) { void BaseViewerPanel::onShowHideActionTriggered(QAction *act) {
CV_Parts part = (CV_Parts)act->data().toUInt(); VP_Parts part = (VP_Parts)act->data().toUInt();
assert(part < CVPARTS_End); assert(part < VPPARTS_End);
m_visiblePartsFlag ^= part; m_visiblePartsFlag ^= part;
updateShowHide(); updateShowHide();
} }
void SceneViewerPanel::onDrawFrame(int frame, //-----------------------------------------------------------------------------
const ImagePainter::VisualSettings &settings,
QElapsedTimer *, qint64) { void BaseViewerPanel::onDrawFrame(int frame,
const ImagePainter::VisualSettings &settings,
QElapsedTimer *, qint64) {
TApp *app = TApp::instance(); TApp *app = TApp::instance();
m_sceneViewer->setVisual(settings); m_sceneViewer->setVisual(settings);
@ -295,7 +259,10 @@ void SceneViewerPanel::onDrawFrame(int frame,
!pr->isFrameReady( !pr->isFrameReady(
frame - 1)) // stops on last rendered frame until current is ready! frame - 1)) // stops on last rendered frame until current is ready!
{ {
while (frame > 1 && !pr->isFrameReady(frame - 1)) frame--; while (frame > 0 && !pr->isFrameReady(frame - 1)) frame--;
if (frame == 0)
frame = curFrame; // if no frame is ready, I stay on current...no use
// to rewind
m_flipConsole->setCurrentFrame(frame); m_flipConsole->setCurrentFrame(frame);
} }
} }
@ -317,22 +284,22 @@ void SceneViewerPanel::onDrawFrame(int frame,
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
SceneViewerPanel::~SceneViewerPanel() {} void BaseViewerPanel::showEvent(QShowEvent *event) {
//-----------------------------------------------------------------------------
void SceneViewerPanel::showEvent(QShowEvent *event) {
TApp *app = TApp::instance(); TApp *app = TApp::instance();
TFrameHandle *frameHandle = app->getCurrentFrame(); TFrameHandle *frameHandle = app->getCurrentFrame();
TSceneHandle *sceneHandle = app->getCurrentScene(); TSceneHandle *sceneHandle = app->getCurrentScene();
TXshLevelHandle *levelHandle = app->getCurrentLevel(); TXshLevelHandle *levelHandle = app->getCurrentLevel();
TObjectHandle *objectHandle = app->getCurrentObject();
TXsheetHandle *xshHandle = app->getCurrentXsheet(); TXsheetHandle *xshHandle = app->getCurrentXsheet();
onSceneChanged();
bool ret = true; bool ret = true;
/*!
onSceneChanged(): called when the scene changed
- set new scene's FPS
- update the range of frame slider with a new framehandle
- set the marker
- update key frames
*/
ret = ret && connect(xshHandle, SIGNAL(xsheetChanged()), this, ret = ret && connect(xshHandle, SIGNAL(xsheetChanged()), this,
SLOT(onSceneChanged())); SLOT(onSceneChanged()));
ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this, ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), this,
@ -340,90 +307,66 @@ void SceneViewerPanel::showEvent(QShowEvent *event) {
ret = ret && connect(sceneHandle, SIGNAL(sceneChanged()), this, ret = ret && connect(sceneHandle, SIGNAL(sceneChanged()), this,
SLOT(onSceneChanged())); SLOT(onSceneChanged()));
/*!
changeWindowTitle(): called when the scene / level / frame is changed
- chenge the title text
*/
ret = ret && connect(sceneHandle, SIGNAL(nameSceneChanged()), this, ret = ret && connect(sceneHandle, SIGNAL(nameSceneChanged()), this,
SLOT(changeWindowTitle())); SLOT(changeWindowTitle()));
ret =
ret && connect(sceneHandle, SIGNAL(preferenceChanged(const QString &)),
m_flipConsole, SLOT(onPreferenceChanged(const QString &)));
ret = ret && connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this,
SLOT(onXshLevelSwitched(TXshLevel *)));
ret = ret && connect(levelHandle, SIGNAL(xshLevelChanged()), this, ret = ret && connect(levelHandle, SIGNAL(xshLevelChanged()), this,
SLOT(changeWindowTitle())); SLOT(changeWindowTitle()));
ret = ret && connect(levelHandle, SIGNAL(xshLevelTitleChanged()), this, ret = ret && connect(levelHandle, SIGNAL(xshLevelTitleChanged()), this,
SLOT(changeWindowTitle())); SLOT(changeWindowTitle()));
ret = ret && connect(frameHandle, SIGNAL(frameSwitched()), this,
SLOT(changeWindowTitle()));
// updateFrameRange(): update the frame slider's range
ret = ret && connect(levelHandle, SIGNAL(xshLevelChanged()), this, ret = ret && connect(levelHandle, SIGNAL(xshLevelChanged()), this,
SLOT(updateFrameRange())); SLOT(updateFrameRange()));
ret = ret && connect(frameHandle, SIGNAL(frameSwitched()), this, // onFrameTypeChanged(): reset the marker positions in the flip console
SLOT(changeWindowTitle()));
ret = ret && connect(frameHandle, SIGNAL(frameSwitched()), this,
SLOT(onFrameSwitched()));
ret = ret && connect(frameHandle, SIGNAL(frameTypeChanged()), this, ret = ret && connect(frameHandle, SIGNAL(frameTypeChanged()), this,
SLOT(onFrameTypeChanged())); SLOT(onFrameTypeChanged()));
// onXshLevelSwitched(TXshLevel*)<29>F changeWindowTitle() + updateFrameRange()
ret = ret && connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this,
SLOT(onXshLevelSwitched(TXshLevel *)));
// onFrameSwitched(): update the flipconsole according to the current frame
ret = ret && connect(frameHandle, SIGNAL(frameSwitched()), this,
SLOT(onFrameSwitched()));
ret = ret && connect(app->getCurrentTool(), SIGNAL(toolSwitched()), ret = ret && connect(app->getCurrentTool(), SIGNAL(toolSwitched()),
m_sceneViewer, SLOT(onToolSwitched())); m_sceneViewer, SLOT(onToolSwitched()));
ret =
ret && connect(sceneHandle, SIGNAL(preferenceChanged(const QString &)),
m_flipConsole, SLOT(onPreferenceChanged(const QString &)));
assert(ret); assert(ret);
// Aggiorno FPS al valore definito nel viewer corrente.
// frameHandle->setPreviewFrameRate(m_fpsSlider->value());
m_flipConsole->setActive(true); m_flipConsole->setActive(true);
m_flipConsole->onPreferenceChanged(""); m_flipConsole->onPreferenceChanged("");
// refresh
onSceneChanged();
changeWindowTitle();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::hideEvent(QHideEvent *event) { void BaseViewerPanel::hideEvent(QHideEvent *event) {
TApp *app = TApp::instance(); TApp *app = TApp::instance();
TFrameHandle *frameHandle = app->getCurrentFrame(); disconnect(app->getCurrentFrame(), nullptr, this, nullptr);
TSceneHandle *sceneHandle = app->getCurrentScene(); disconnect(app->getCurrentScene(), nullptr, this, nullptr);
TXshLevelHandle *levelHandle = app->getCurrentLevel(); disconnect(app->getCurrentLevel(), nullptr, this, nullptr);
TObjectHandle *objectHandle = app->getCurrentObject(); disconnect(app->getCurrentXsheet(), nullptr, this, nullptr);
TXsheetHandle *xshHandle = app->getCurrentXsheet();
disconnect(xshHandle, SIGNAL(xsheetChanged()), this, SLOT(onSceneChanged()));
disconnect(sceneHandle, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged()));
disconnect(sceneHandle, SIGNAL(nameSceneChanged()), this,
SLOT(changeWindowTitle()));
disconnect(sceneHandle, SIGNAL(sceneSwitched()), this,
SLOT(onSceneChanged()));
disconnect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this,
SLOT(onXshLevelSwitched(TXshLevel *)));
disconnect(levelHandle, SIGNAL(xshLevelChanged()), this,
SLOT(changeWindowTitle()));
disconnect(levelHandle, SIGNAL(xshLevelTitleChanged()), this,
SLOT(changeWindowTitle()));
disconnect(levelHandle, SIGNAL(xshLevelChanged()), this,
SLOT(updateFrameRange()));
disconnect(frameHandle, SIGNAL(frameSwitched()), this,
SLOT(changeWindowTitle()));
disconnect(frameHandle, SIGNAL(frameSwitched()), this,
SLOT(onFrameSwitched()));
disconnect(frameHandle, SIGNAL(frameTypeChanged()), this,
SLOT(onFrameTypeChanged()));
disconnect(app->getCurrentTool(), SIGNAL(toolSwitched()), m_sceneViewer,
SLOT(onToolSwitched()));
disconnect(app->getCurrentScene(), SIGNAL(preferenceChanged(const QString &)),
m_flipConsole, SLOT(onPreferenceChanged(const QString &)));
m_flipConsole->setActive(false); m_flipConsole->setActive(false);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::resizeEvent(QResizeEvent *e) { void BaseViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) {
QWidget::resizeEvent(e);
repaint();
m_sceneViewer->update();
}
//-----------------------------------------------------------------------------
void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) {
bool ret = true; bool ret = true;
TPanelTitleBarButtonSet *viewModeButtonSet; TPanelTitleBarButtonSet *viewModeButtonSet;
@ -483,14 +426,14 @@ void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) {
button = new TPanelTitleBarButton(titleBar, button = new TPanelTitleBarButton(titleBar,
getIconThemePath("actions/20/pane_3d.svg")); getIconThemePath("actions/20/pane_3d.svg"));
button->setToolTip(tr("3D View")); button->setToolTip(tr("3D View"));
x += +1 + iconWidth; x += 1 + iconWidth;
titleBar->add(QPoint(x, 0), button); titleBar->add(QPoint(x, 0), button);
button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA3D_REFERENCE); button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA3D_REFERENCE);
button = new TPanelTitleBarButton( button = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_cam.svg")); titleBar, getIconThemePath("actions/20/pane_cam.svg"));
button->setToolTip(tr("Camera View")); button->setToolTip(tr("Camera View"));
x += +1 + iconWidth; x += 1 + iconWidth;
titleBar->add(QPoint(x, 0), button); titleBar->add(QPoint(x, 0), button);
button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA_REFERENCE); button->setButtonSet(viewModeButtonSet, SceneViewer::CAMERA_REFERENCE);
@ -512,7 +455,7 @@ void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) {
titleBar, getIconThemePath("actions/20/pane_freeze.svg")); titleBar, getIconThemePath("actions/20/pane_freeze.svg"));
x += 10 + iconWidth; x += 10 + iconWidth;
button->setToolTip(tr("Freeze")); // RC1 button->setToolTip(tr("Freeze"));
titleBar->add(QPoint(x, 0), button); titleBar->add(QPoint(x, 0), button);
ret = ret && connect(button, SIGNAL(toggled(bool)), m_sceneViewer, ret = ret && connect(button, SIGNAL(toggled(bool)), m_sceneViewer,
SLOT(freeze(bool))); SLOT(freeze(bool)));
@ -528,7 +471,7 @@ void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) {
m_subcameraPreviewButton = new TPanelTitleBarButton( m_subcameraPreviewButton = new TPanelTitleBarButton(
titleBar, getIconThemePath("actions/20/pane_subpreview.svg")); titleBar, getIconThemePath("actions/20/pane_subpreview.svg"));
x += +1 + 24; // width of pane_preview.svg = 24px x += 1 + 24; // width of pane_preview.svg = 24px
titleBar->add(QPoint(x, 0), m_subcameraPreviewButton); titleBar->add(QPoint(x, 0), m_subcameraPreviewButton);
m_subcameraPreviewButton->setToolTip(tr("Sub-camera Preview")); m_subcameraPreviewButton->setToolTip(tr("Sub-camera Preview"));
@ -540,7 +483,7 @@ void SceneViewerPanel::initializeTitleBar(TPanelTitleBar *titleBar) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::enableFullPreview(bool enabled) { void BaseViewerPanel::enableFullPreview(bool enabled) {
m_subcameraPreviewButton->setPressed(false); m_subcameraPreviewButton->setPressed(false);
m_sceneViewer->enablePreview(enabled ? SceneViewer::FULL_PREVIEW m_sceneViewer->enablePreview(enabled ? SceneViewer::FULL_PREVIEW
: SceneViewer::NO_PREVIEW); : SceneViewer::NO_PREVIEW);
@ -551,7 +494,7 @@ void SceneViewerPanel::enableFullPreview(bool enabled) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::enableSubCameraPreview(bool enabled) { void BaseViewerPanel::enableSubCameraPreview(bool enabled) {
m_previewButton->setPressed(false); m_previewButton->setPressed(false);
m_sceneViewer->enablePreview(enabled ? SceneViewer::SUBCAMERA_PREVIEW m_sceneViewer->enablePreview(enabled ? SceneViewer::SUBCAMERA_PREVIEW
: SceneViewer::NO_PREVIEW); : SceneViewer::NO_PREVIEW);
@ -562,7 +505,7 @@ void SceneViewerPanel::enableSubCameraPreview(bool enabled) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::enableFlipConsoleForCamerastand(bool on) { void BaseViewerPanel::enableFlipConsoleForCamerastand(bool on) {
m_flipConsole->enableButton(FlipConsole::eMatte, on, false); m_flipConsole->enableButton(FlipConsole::eMatte, on, false);
m_flipConsole->enableButton(FlipConsole::eSave, on, false); m_flipConsole->enableButton(FlipConsole::eSave, on, false);
m_flipConsole->enableButton(FlipConsole::eCompare, on, false); m_flipConsole->enableButton(FlipConsole::eCompare, on, false);
@ -575,27 +518,23 @@ void SceneViewerPanel::enableFlipConsoleForCamerastand(bool on) {
m_flipConsole->enableButton(FlipConsole::eCheckBg, on, false); m_flipConsole->enableButton(FlipConsole::eCheckBg, on, false);
m_flipConsole->enableProgressBar(on); m_flipConsole->enableProgressBar(on);
// m_flipConsole->enableBlanks(on); // blank frames are now always enabled
// m_flipConsole->update();
update(); update();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::onXshLevelSwitched(TXshLevel *) { void BaseViewerPanel::onXshLevelSwitched(TXshLevel *) {
changeWindowTitle(); changeWindowTitle();
m_sceneViewer->update(); m_sceneViewer->update();
// If the level switched by using the level choose combo box in the film // If the level is switched by using the combobox in the film strip, the
// strip, // current level switches without change in the frame type (level or scene).
// the current level switches without change in the frame type (level or
// scene).
// For such case, update the frame range of the console here. // For such case, update the frame range of the console here.
if (TApp::instance()->getCurrentFrame()->isEditingLevel()) updateFrameRange(); if (TApp::instance()->getCurrentFrame()->isEditingLevel()) updateFrameRange();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::onPlayingStatusChanged(bool playing) { void BaseViewerPanel::onPlayingStatusChanged(bool playing) {
if (playing) { if (playing) {
m_playing = true; m_playing = true;
} else { } else {
@ -624,14 +563,17 @@ void SceneViewerPanel::onPlayingStatusChanged(bool playing) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::changeWindowTitle() { void BaseViewerPanel::changeWindowTitle() { // —vŠm”F
TApp *app = TApp::instance(); TApp *app = TApp::instance();
// zoom = sqrt(m_sceneViewer->getViewMatrix().det());
ToonzScene *scene = app->getCurrentScene()->getScene(); ToonzScene *scene = app->getCurrentScene()->getScene();
if (!scene) return; if (!scene) return;
if (!parentWidget()) return; if (!parentWidget()) return;
int frame = app->getCurrentFrame()->getFrame(); int frame = app->getCurrentFrame()->getFrame();
// put the titlebar texts in this string
QString name; QString name;
// if the frame type is "scene editing"
if (app->getCurrentFrame()->isEditingScene()) { if (app->getCurrentFrame()->isEditingScene()) {
TProject *project = scene->getProject(); TProject *project = scene->getProject();
QString sceneName = QString::fromStdWString(scene->getSceneName()); QString sceneName = QString::fromStdWString(scene->getSceneName());
@ -671,7 +613,9 @@ void SceneViewerPanel::changeWindowTitle() {
QString imageName = QString imageName =
QString::fromStdWString(fp.withFrame(cell.m_frameId).getWideString()); QString::fromStdWString(fp.withFrame(cell.m_frameId).getWideString());
name = name + tr(" :: Level: ") + imageName; name = name + tr(" :: Level: ") + imageName;
} else { }
// if the frame type is "level editing"
else {
TXshLevel *level = app->getCurrentLevel()->getLevel(); TXshLevel *level = app->getCurrentLevel()->getLevel();
if (level) { if (level) {
TFilePath fp(level->getName()); TFilePath fp(level->getName());
@ -696,8 +640,9 @@ void SceneViewerPanel::changeWindowTitle() {
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/*! update the frame range according to the current frame type
void SceneViewerPanel::updateFrameRange() { */
void BaseViewerPanel::updateFrameRange() {
TFrameHandle *fh = TApp::instance()->getCurrentFrame(); TFrameHandle *fh = TApp::instance()->getCurrentFrame();
int frameIndex = fh->getFrameIndex(); int frameIndex = fh->getFrameIndex();
int maxFrameIndex = fh->getMaxFrameIndex(); int maxFrameIndex = fh->getMaxFrameIndex();
@ -707,7 +652,7 @@ void SceneViewerPanel::updateFrameRange() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::updateFrameMarkers() { void BaseViewerPanel::updateFrameMarkers() {
int fromIndex, toIndex, dummy; int fromIndex, toIndex, dummy;
XsheetGUI::getPlayRange(fromIndex, toIndex, dummy); XsheetGUI::getPlayRange(fromIndex, toIndex, dummy);
TFrameHandle *fh = TApp::instance()->getCurrentFrame(); TFrameHandle *fh = TApp::instance()->getCurrentFrame();
@ -720,7 +665,7 @@ void SceneViewerPanel::updateFrameMarkers() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::onSceneChanged() { void BaseViewerPanel::onSceneChanged() {
updateFrameRange(); updateFrameRange();
updateFrameMarkers(); updateFrameMarkers();
changeWindowTitle(); changeWindowTitle();
@ -735,8 +680,6 @@ void SceneViewerPanel::onSceneChanged() {
->getOutputProperties() ->getOutputProperties()
->getFrameRate(), ->getFrameRate(),
false); false);
// vinz: perche veniva fatto?
// m_flipConsole->updateCurrentFPS(scene->getProperties()->getOutputProperties()->getFrameRate());
int frameIndex = TApp::instance()->getCurrentFrame()->getFrameIndex(); int frameIndex = TApp::instance()->getCurrentFrame()->getFrameIndex();
if (m_keyFrameButton->getCurrentFrame() != frameIndex) if (m_keyFrameButton->getCurrentFrame() != frameIndex)
@ -746,7 +689,7 @@ void SceneViewerPanel::onSceneChanged() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::onSceneSwitched() { void BaseViewerPanel::onSceneSwitched() {
m_previewButton->setPressed(false); m_previewButton->setPressed(false);
m_subcameraPreviewButton->setPressed(false); m_subcameraPreviewButton->setPressed(false);
enableFlipConsoleForCamerastand(false); enableFlipConsoleForCamerastand(false);
@ -764,7 +707,7 @@ void SceneViewerPanel::onSceneSwitched() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::onFrameSwitched() { void BaseViewerPanel::onFrameSwitched() {
int frameIndex = TApp::instance()->getCurrentFrame()->getFrameIndex(); int frameIndex = TApp::instance()->getCurrentFrame()->getFrameIndex();
m_flipConsole->setCurrentFrame(frameIndex + 1); m_flipConsole->setCurrentFrame(frameIndex + 1);
if (m_keyFrameButton->getCurrentFrame() != frameIndex) if (m_keyFrameButton->getCurrentFrame() != frameIndex)
@ -780,8 +723,9 @@ void SceneViewerPanel::onFrameSwitched() {
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/*! reset the marker positions in the flip console
void SceneViewerPanel::onFrameTypeChanged() { */
void BaseViewerPanel::onFrameTypeChanged() {
if (TApp::instance()->getCurrentFrame()->getFrameType() == if (TApp::instance()->getCurrentFrame()->getFrameType() ==
TFrameHandle::LevelFrame) { TFrameHandle::LevelFrame) {
if (m_sceneViewer->isPreviewEnabled()) { if (m_sceneViewer->isPreviewEnabled()) {
@ -803,7 +747,7 @@ void SceneViewerPanel::onFrameTypeChanged() {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::playAudioFrame(int frame) { void BaseViewerPanel::playAudioFrame(int frame) {
if (m_first) { if (m_first) {
m_first = false; m_first = false;
m_fps = TApp::instance() m_fps = TApp::instance()
@ -828,7 +772,7 @@ void SceneViewerPanel::playAudioFrame(int frame) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool SceneViewerPanel::hasSoundtrack() { bool BaseViewerPanel::hasSoundtrack() {
if (m_sound != NULL) { if (m_sound != NULL) {
m_sound = NULL; m_sound = NULL;
m_hasSoundtrack = false; m_hasSoundtrack = false;
@ -855,21 +799,21 @@ bool SceneViewerPanel::hasSoundtrack() {
} }
} }
void SceneViewerPanel::onButtonPressed(FlipConsole::EGadget button) { void BaseViewerPanel::onButtonPressed(FlipConsole::EGadget button) {
if (button == FlipConsole::eSound) { if (button == FlipConsole::eSound) {
m_playSound = !m_playSound; m_playSound = !m_playSound;
} }
} }
void SceneViewerPanel::setFlipHButtonChecked(bool checked) { void BaseViewerPanel::setFlipHButtonChecked(bool checked) {
m_flipConsole->setChecked(FlipConsole::eFlipHorizontal, checked); m_flipConsole->setChecked(FlipConsole::eFlipHorizontal, checked);
} }
void SceneViewerPanel::setFlipVButtonChecked(bool checked) { void BaseViewerPanel::setFlipVButtonChecked(bool checked) {
m_flipConsole->setChecked(FlipConsole::eFlipVertical, checked); m_flipConsole->setChecked(FlipConsole::eFlipVertical, checked);
} }
void SceneViewerPanel::changeSceneFps(int value) { void BaseViewerPanel::changeSceneFps(int value) {
double oldFps = TApp::instance() double oldFps = TApp::instance()
->getCurrentScene() ->getCurrentScene()
->getScene() ->getScene()
@ -892,7 +836,7 @@ void SceneViewerPanel::changeSceneFps(int value) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::setVisiblePartsFlag(UINT flag) { void BaseViewerPanel::setVisiblePartsFlag(UINT flag) {
m_visiblePartsFlag = flag; m_visiblePartsFlag = flag;
updateShowHide(); updateShowHide();
} }
@ -900,15 +844,17 @@ void SceneViewerPanel::setVisiblePartsFlag(UINT flag) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// SaveLoadQSettings // SaveLoadQSettings
void SceneViewerPanel::save(QSettings &settings, bool forPopupIni) const { void BaseViewerPanel::save(QSettings &settings, bool forPopupIni) const {
settings.setValue("visibleParts", m_visiblePartsFlag); settings.setValue("viewerVisibleParts", m_visiblePartsFlag);
settings.setValue("consoleParts", m_flipConsole->getCustomizeMask()); settings.setValue("consoleParts", m_flipConsole->getCustomizeMask());
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SceneViewerPanel::load(QSettings &settings) { void BaseViewerPanel::load(QSettings &settings) {
m_visiblePartsFlag = settings.value("visibleParts", CVPARTS_ALL).toUInt(); checkOldVersionVisblePartsFlags(settings);
m_visiblePartsFlag =
settings.value("viewerVisibleParts", m_visiblePartsFlag).toUInt();
updateShowHide(); updateShowHide();
UINT mask = 0; UINT mask = 0;
mask = mask | eShowVcr; mask = mask | eShowVcr;
@ -922,3 +868,47 @@ void SceneViewerPanel::load(QSettings &settings) {
m_flipConsole->setCustomizemask( m_flipConsole->setCustomizemask(
settings.value("consoleParts", mask).toUInt()); settings.value("consoleParts", mask).toUInt());
} }
//=============================================================================
//
// SceneViewerPanel
//
//-----------------------------------------------------------------------------
SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WindowFlags flags)
: BaseViewerPanel(parent, flags) {
setObjectName("ViewerPanel");
setMinimumHeight(200);
Ruler *vRuler = new Ruler(this, m_sceneViewer, true);
Ruler *hRuler = new Ruler(this, m_sceneViewer, false);
m_sceneViewer->setRulers(vRuler, hRuler);
{
QGridLayout *viewerL = new QGridLayout();
viewerL->setMargin(0);
viewerL->setSpacing(0);
{
viewerL->addWidget(vRuler, 1, 0);
viewerL->addWidget(hRuler, 0, 1);
viewerL->addWidget(m_fsWidget, 1, 1);
}
viewerL->setRowStretch(1, 1);
viewerL->setColumnStretch(1, 1);
m_mainLayout->insertLayout(0, viewerL, 1);
}
setLayout(m_mainLayout);
// initial state of the parts
m_visiblePartsFlag = VPPARTS_ALL;
updateShowHide();
}
//-----------------------------------------------------------------------------
void SceneViewerPanel::checkOldVersionVisblePartsFlags(QSettings &settings) {
if (!settings.contains("visibleParts")) return;
m_visiblePartsFlag =
settings.value("visibleParts", m_visiblePartsFlag).toUInt();
settings.remove("visibleParts");
settings.setValue("viewerVisibleParts", m_visiblePartsFlag);
}

View file

@ -27,16 +27,29 @@ class Ruler;
class FlipConsole; class FlipConsole;
class TXshLevel; class TXshLevel;
class SceneViewerPanel final : public QFrame, enum VP_Parts {
public FlipConsoleOwner, VPPARTS_None = 0,
public SaveLoadQSettings { VPPARTS_PLAYBAR = 0x1,
Q_OBJECT VPPARTS_FRAMESLIDER = 0x2,
VPPARTS_TOOLBAR = 0x4,
VPPARTS_TOOLOPTIONS = 0x8,
VPPARTS_End = 0x10,
VPPARTS_ALL = VPPARTS_PLAYBAR | VPPARTS_FRAMESLIDER,
VPPARTS_COMBO_ALL = VPPARTS_ALL | VPPARTS_TOOLBAR | VPPARTS_TOOLOPTIONS
};
class BaseViewerPanel : public QFrame,
public FlipConsoleOwner,
public SaveLoadQSettings {
Q_OBJECT
protected:
friend class SceneViewer; friend class SceneViewer;
QVBoxLayout *m_mainLayout;
SceneViewer *m_sceneViewer; SceneViewer *m_sceneViewer;
ImageUtils::FullScreenWidget *m_fsWidget;
FlipConsole *m_flipConsole; FlipConsole *m_flipConsole;
ViewerKeyframeNavigator *m_keyFrameButton; ViewerKeyframeNavigator *m_keyFrameButton;
TPanelTitleBarButtonSet *m_referenceModeBs; TPanelTitleBarButtonSet *m_referenceModeBs;
TPanelTitleBarButton *m_previewButton; TPanelTitleBarButton *m_previewButton;
TPanelTitleBarButton *m_subcameraPreviewButton; TPanelTitleBarButton *m_subcameraPreviewButton;
@ -52,17 +65,14 @@ class SceneViewerPanel final : public QFrame,
TSoundTrack *m_sound = NULL; TSoundTrack *m_sound = NULL;
public: public:
#if QT_VERSION >= 0x050500 BaseViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0);
SceneViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0); ~BaseViewerPanel() {}
#else
SceneViewerPanel(QWidget *parent = 0, Qt::WFlags flags = 0); virtual void updateShowHide();
#endif virtual void addShowHideContextMenu(QMenu *);
~SceneViewerPanel();
// toggle show/hide of the widgets according to m_visiblePartsFlag // toggle show/hide of the widgets according to m_visiblePartsFlag
void setVisiblePartsFlag(UINT flag); void setVisiblePartsFlag(UINT flag);
void updateShowHide();
void addShowHideContextMenu(QMenu *);
void onDrawFrame(int frame, const ImagePainter::VisualSettings &settings, void onDrawFrame(int frame, const ImagePainter::VisualSettings &settings,
QElapsedTimer *timer, qint64 targetInstant) override; QElapsedTimer *timer, qint64 targetInstant) override;
@ -82,25 +92,21 @@ public:
void initializeTitleBar(TPanelTitleBar *titleBar); void initializeTitleBar(TPanelTitleBar *titleBar);
protected: protected:
// void contextMenuEvent(QContextMenuEvent *event) override;
void showEvent(QShowEvent *) override; void showEvent(QShowEvent *) override;
void hideEvent(QHideEvent *) override; void hideEvent(QHideEvent *) override;
void resizeEvent(QResizeEvent *) override;
void createFrameToolBar();
void createPlayToolBar();
void addColorMaskButton(QWidget *parent, const char *iconSVGName, int id);
// reimplementation of TPanel::widgetFocusOnEnter
void enableFlipConsoleForCamerastand(bool on); void enableFlipConsoleForCamerastand(bool on);
void playAudioFrame(int frame); void playAudioFrame(int frame);
bool hasSoundtrack(); bool hasSoundtrack();
// void contextMenuEvent(QContextMenuEvent *event) override;
virtual void checkOldVersionVisblePartsFlags(QSettings &settings) = 0;
public slots: public slots:
void changeWindowTitle(); void changeWindowTitle();
void updateFrameRange();
void onSceneChanged(); void onSceneChanged();
void onXshLevelSwitched(TXshLevel *); void onXshLevelSwitched(TXshLevel *);
void updateFrameRange();
void updateFrameMarkers(); void updateFrameMarkers();
void onButtonPressed(FlipConsole::EGadget button); void onButtonPressed(FlipConsole::EGadget button);
void setFlipHButtonChecked(bool checked); void setFlipHButtonChecked(bool checked);
@ -118,5 +124,15 @@ protected slots:
void enableFullPreview(bool enabled); void enableFullPreview(bool enabled);
void enableSubCameraPreview(bool enabled); void enableSubCameraPreview(bool enabled);
}; };
class SceneViewerPanel final : public BaseViewerPanel {
Q_OBJECT
public:
SceneViewerPanel(QWidget *parent = 0, Qt::WindowFlags flags = 0);
~SceneViewerPanel() {}
protected:
void checkOldVersionVisblePartsFlags(QSettings &settings) override;
};
#endif #endif