tahoma2d/toonz/sources/stopmotion/stopmotioncontroller.h

471 lines
14 KiB
C
Raw Normal View History

#pragma once
#ifndef STOPMOTIONCONTROLLER_H
#define STOPMOTIONCONTROLLER_H
// TnzCore includes
#include "stopmotion.h"
#include "toonzqt/dvdialog.h"
#include "toonzqt/lineedit.h"
2021-08-06 21:23:11 +12:00
#include "tfilepath.h"
2021-09-27 15:17:07 +13:00
#include "toonz/tproject.h"
#include "filebrowserpopup.h"
2021-08-06 21:23:11 +12:00
// TnzQt includes
#include "toonzqt/tabbar.h"
#include "toonzqt/gutil.h"
2020-04-25 19:30:38 +12:00
#include "toonzqt/colorfield.h"
#include "toonzqt/doublefield.h"
// Qt includes
#include <QWidget>
#include <QFrame>
#include <QTabBar>
#include <QSlider>
#include <QScrollArea>
#include <QPointF>
#undef DVAPI
#undef DVVAR
#ifdef TOONZQT_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
//=============================================
// Forward declarations
class TColorStyle;
class TPalette;
class TXshLevelHandle;
class QGridLayout;
class QLabel;
class QStackedWidget;
class QSlider;
class QRadioButton;
class QButtonGroup;
class QTabWidget;
class QToolBar;
class QTimer;
2020-04-25 19:30:38 +12:00
class QGroupBox;
class QPushButton;
class CameraCaptureLevelControl;
class QRegExpValidator;
class QCheckBox;
class QComboBox;
namespace DVGui {
class FileField;
class IntField;
class IntLineEdit;
} // namespace DVGui
//=============================================================================
// FrameNumberLineEdit
// a special Line Edit which accepts imputting alphabets if the preference
// option
// "Show ABC Appendix to the Frame Number in Xsheet Cell" is active.
//-----------------------------------------------------------------------------
2021-09-27 15:17:07 +13:00
class FrameNumberLineEdit : public DVGui::LineEdit,
public TProjectManager::Listener {
Q_OBJECT
/* having two validators and switch them according to the preferences*/
2021-08-06 21:23:11 +12:00
QRegExpValidator *m_regexpValidator, *m_regexpValidator_alt;
void updateValidator();
void updateSize();
QString m_textOnFocusIn;
public:
2022-08-14 08:13:21 +12:00
FrameNumberLineEdit(QWidget *parent = 0, TFrameId fId = TFrameId(1),
2021-08-06 21:23:11 +12:00
bool acceptLetter = true);
~FrameNumberLineEdit() {}
/*! Set text in field to \b value. */
2021-08-06 21:23:11 +12:00
void setValue(TFrameId fId);
/*! Return an integer with text field value. */
2021-08-06 21:23:11 +12:00
TFrameId getValue();
2021-09-27 15:17:07 +13:00
// TProjectManager::Listener
void onProjectSwitched() override;
void onProjectChanged() override;
protected:
/*! If focus is lost and current text value is out of range emit signal
\b editingFinished.*/
void focusInEvent(QFocusEvent *) override;
void focusOutEvent(QFocusEvent *) override;
void showEvent(QShowEvent *event) override { updateValidator(); }
};
//=============================================================================
class LevelNameLineEdit : public DVGui::LineEdit {
Q_OBJECT
QString m_textOnFocusIn;
public:
LevelNameLineEdit(QWidget *parent = 0);
protected:
void focusInEvent(QFocusEvent *e);
protected slots:
void onEditingFinished();
signals:
void levelNameEdited();
};
//=============================================================================
// PencilTestSaveInFolderPopup
//-----------------------------------------------------------------------------
class StopMotionSaveInFolderPopup : public DVGui::Dialog {
Q_OBJECT
DVGui::FileField *m_parentFolderField;
QLineEdit *m_projectField, *m_episodeField, *m_sequenceField, *m_sceneField,
*m_subFolderNameField;
QCheckBox *m_subFolderCB, *m_autoSubNameCB, *m_createSceneInFolderCB;
QComboBox *m_subNameFormatCombo;
void createSceneInFolder();
public:
StopMotionSaveInFolderPopup(QWidget *parent = 0);
QString getPath();
QString getParentPath();
void updateParentFolder();
protected:
void showEvent(QShowEvent *event);
protected slots:
void updateSubFolderName();
void onAutoSubNameCBClicked(bool);
void onShowPopupOnLaunchCBClicked(bool);
void onCreateSceneInFolderCBClicked(bool);
void onSetAsDefaultBtnPressed();
void onOkPressed();
};
//=============================================================================
// StopMotionController
//-----------------------------------------------------------------------------
class StopMotionController final : public QWidget {
Q_OBJECT
StopMotion *m_stopMotion;
QWidget *m_parent;
TXshLevelHandle
*m_levelHandle; //!< for clearing the level cache when the color changed
DVGui::TabBar *m_tabBar;
QFrame *m_mainControlsPage;
QFrame *m_cameraSettingsPage;
QFrame *m_optionsPage;
2020-04-25 19:30:38 +12:00
QFrame *m_motionPage;
QFrame *m_lightPage;
2020-05-20 17:43:46 +12:00
QFrame *m_testsPage;
QFrame *m_pathsPage;
2020-04-28 17:02:21 +12:00
QFrame *m_dslrFrame;
QFrame *m_webcamFrame;
2022-03-04 17:37:45 +13:00
QFrame *m_commonFrame;
2020-04-28 17:02:21 +12:00
QFrame *m_noCameraFrame;
QStackedWidget *m_stackedChooser;
2020-04-25 19:30:38 +12:00
TabBarContainter *m_tabBarContainer; //!< Tabs container for pages
2020-05-03 09:54:05 +12:00
QPushButton *m_toggleLiveViewButton, *m_setToCurrentXSheetFrameButton,
2020-05-22 09:06:28 +12:00
*m_alwaysUseLiveViewImagesButton, *m_takeTestButton,
*m_settingsTakeTestButton;
2020-05-03 09:54:05 +12:00
QPushButton *m_captureButton, *m_zoomButton, *m_fileFormatOptionButton,
*m_pickZoomButton, *m_focusNearButton, *m_focusFarButton,
*m_focusNear2Button, *m_focusNear3Button, *m_focusFar2Button,
2020-04-25 19:30:38 +12:00
*m_focusFar3Button, *m_captureFilterSettingsBtn, *m_testLightsButton;
QHBoxLayout *m_focusAndZoomLayout;
QLabel *m_frameInfoLabel, *m_cameraSettingsLabel, *m_cameraModeLabel,
2022-08-14 08:13:21 +12:00
*m_resolutionLabel, *m_cameraStatusLabel, *m_apertureLabel,
*m_kelvinValueLabel, *m_isoLabel, *m_shutterSpeedLabel, *m_webcamLabel,
*m_liveViewCompensationLabel;
QToolButton *m_previousLevelButton, *m_previousFrameButton,
*m_previousXSheetFrameButton;
2020-04-14 09:21:13 +12:00
QSlider *m_apertureSlider, *m_shutterSpeedSlider, *m_isoSlider,
2020-04-28 17:02:21 +12:00
*m_kelvinSlider, *m_webcamFocusSlider, *m_webcamWhiteBalanceSlider,
*m_webcamExposureSlider, *m_webcamBrightnessSlider,
2020-05-22 09:06:28 +12:00
*m_webcamContrastSlider, *m_webcamGainSlider, *m_webcamSaturationSlider,
2022-08-14 08:13:21 +12:00
*m_liveViewCompensationSlider, *m_manualFocusSlider;
2020-05-03 09:54:05 +12:00
QComboBox *m_cameraListCombo, *m_exposureCombo, *m_fileTypeCombo,
2022-08-14 08:13:21 +12:00
*m_whiteBalanceCombo, *m_resolutionCombo, *m_imageQualityCombo, *m_imageSizeCombo,
*m_pictureStyleCombo, *m_controlDeviceCombo, *m_captureFramesCombo,
*m_colorTypeCombo;
LevelNameLineEdit *m_levelNameEdit;
2020-05-27 14:31:52 +12:00
QCheckBox *m_blackScreenForCapture, *m_placeOnXSheetCB, *m_directShowCB,
*m_liveViewOnAllFramesCB, *m_useMjpgCB, *m_useNumpadCB, *m_drawBeneathCB,
*m_playSound, *m_showScene1, *m_showScene2,
*m_showScene3; //, *m_upsideDownCB;
CameraCaptureLevelControl *m_camCapLevelControl;
DVGui::FileField *m_saveInFileFld;
DVGui::IntLineEdit *m_xSheetFrameNumberEdit;
FrameNumberLineEdit *m_frameNumberEdit;
DVGui::IntField *m_onionOpacityFld, *m_subsamplingFld;
DVGui::DoubleField *m_postCaptureReviewFld;
StopMotionSaveInFolderPopup *m_saveInFolderPopup;
DVGui::DoubleField *m_timerIntervalFld;
2020-04-25 19:30:38 +12:00
DVGui::ColorField *m_screen1ColorFld, *m_screen2ColorFld, *m_screen3ColorFld;
QGroupBox *m_screen1Box;
QGroupBox *m_screen2Box;
QGroupBox *m_screen3Box;
2020-05-03 20:13:00 +12:00
QGroupBox *m_webcamAutoFocusGB;
QGroupBox *m_timerCB;
2020-04-25 19:30:38 +12:00
QTimer *m_lightTestTimer;
2020-05-20 17:43:46 +12:00
// tests variables
std::vector<QPixmap> m_testImages;
std::vector<TFilePath> m_testFullResListVector;
std::vector<QHBoxLayout *> m_testHBoxes;
std::vector<QString> m_testTooltips;
2020-05-20 17:43:46 +12:00
QVBoxLayout *m_testsOutsideLayout;
QVBoxLayout *m_testsInsideLayout;
int m_testsImagesPerRow;
// calibration feature
struct CalibrationUI {
QPushButton *capBtn, *newBtn, *loadBtn, *cancelBtn, *exportBtn;
QLabel *label;
QGroupBox *groupBox;
} m_calibrationUI;
void captureCalibrationRefImage(cv::Mat &procImage);
QString getCurrentCalibFilePath();
public:
StopMotionController(QWidget *parent = 0);
~StopMotionController();
protected:
void updateStopMotion();
2020-04-28 17:02:21 +12:00
void showEvent(QShowEvent *event) override;
void hideEvent(QHideEvent *event) override;
// void mousePressEvent(QMouseEvent *event) override;
// void keyPressEvent(QKeyEvent *event);
2020-04-09 15:45:17 +12:00
void keyPressEvent(QKeyEvent *event) override;
2020-05-20 17:43:46 +12:00
void resizeEvent(QResizeEvent *event) override;
void reflowTestShots();
protected slots:
2020-04-16 10:02:02 +12:00
void refreshCameraList(QString activeCamera = "");
void refreshCameraListCalled();
void refreshOptionsLists();
void onCameraListComboActivated(int index);
void onResolutionComboActivated(const QString &itemText);
void onCaptureFilterSettingsBtnPressed();
2020-05-03 09:54:05 +12:00
void onFileFormatOptionButtonPressed();
void onLevelNameEdited();
void onNextName();
void onPreviousName();
void onNextFrame();
void onPreviousFrame();
void onNextNewLevel();
void onLastFrame();
2020-04-28 17:02:21 +12:00
2020-05-03 09:54:05 +12:00
void onFileTypeActivated();
void onFrameNumberChanged();
void onXSheetFrameNumberChanged();
void onCaptureFramesChanged(int index);
void onCaptureNumberOfFramesChanged(int frames);
void onFrameCaptured(QImage &image);
void onOnionOpacityFldEdited();
void onOnionOpacitySliderChanged(bool ignore);
void onLiveViewToggleClicked();
void onCaptureButtonClicked(bool);
void setPage(int);
void onBlackScreenForCaptureChanged(int checked);
void onPlaceOnXSheetChanged(int checked);
void onUseMjpgChanged(int checked);
void onUseDirectShowChanged(int checked);
void onLiveViewOnAllFramesChanged(int checked);
void onUseNumpadChanged(int checked);
2020-04-10 18:01:27 +12:00
void onDrawBeneathChanged(int checked);
void updateDimensions();
void onSaveInPathEdited();
void onSceneSwitched();
void onPreviousXSheetFrame();
void onNextXSheetFrame();
void setToCurrentXSheetFrame();
2020-04-25 19:30:38 +12:00
// motion control
2020-04-19 14:29:13 +12:00
void serialPortChanged(int);
2020-04-25 19:30:38 +12:00
// time lapse
2020-04-25 11:44:28 +12:00
void onIntervalTimerCBToggled(bool);
void onIntervalSliderValueChanged(bool);
void onIntervalCaptureTimerTimeout();
void onIntervalCountDownTimeout();
void onIntervalAmountChanged(int);
void onIntervalToggled(bool);
void onIntervalStarted();
void onIntervalStopped();
2020-04-10 11:06:47 +12:00
// sound
void onPlaySoundToggled(bool);
2020-04-25 19:30:38 +12:00
// lights and screens
void setScreen1Color(const TPixel32 &value, bool isDragging);
void setScreen2Color(const TPixel32 &value, bool isDragging);
void setScreen3Color(const TPixel32 &value, bool isDragging);
void onScreen1OverlayToggled(bool);
void onScreen2OverlayToggled(bool);
void onScreen3OverlayToggled(bool);
void onTestLightsPressed();
void onTestLightsTimeout();
2020-05-20 17:43:46 +12:00
void updateLightsEnabled();
2020-04-25 19:30:38 +12:00
void onScreen1ColorChanged(TPixel32);
void onScreen2ColorChanged(TPixel32);
void onScreen3ColorChanged(TPixel32);
void onScreen1OverlayChanged(bool);
void onScreen2OverlayChanged(bool);
void onScreen3OverlayChanged(bool);
void onShowScene1Toggled(bool);
void onShowScene2Toggled(bool);
void onShowScene3Toggled(bool);
void onShowSceneOn1Changed(bool);
void onShowSceneOn2Changed(bool);
void onShowSceneOn3Changed(bool);
2020-04-25 19:30:38 +12:00
2022-08-14 08:13:21 +12:00
// DSLR stuff
void onApertureChanged(int index);
void onShutterSpeedChanged(int index);
void onIsoChanged(int index);
void onExposureChanged(int index);
void onWhiteBalanceChanged(int index);
void onColorTemperatureChanged(int index);
void onImageQualityChanged(int index);
2022-08-14 08:13:21 +12:00
void onImageSizeChanged(int index);
void onPictureStyleChanged(int index);
2020-05-22 09:06:28 +12:00
void onLiveViewCompensationChanged(int index);
2022-08-14 08:13:21 +12:00
void onManualFocusChanged(int index);
void onZoomPressed();
void onPickZoomPressed();
void onFocusNear();
void onFocusFar();
void onFocusNear2();
void onFocusFar2();
void onFocusNear3();
void onFocusFar3();
2020-04-10 11:06:47 +12:00
void onApertureChangedSignal(QString);
void onIsoChangedSignal(QString);
void onShutterSpeedChangedSignal(QString);
void onExposureChangedSignal(QString);
void onWhiteBalanceChangedSignal(QString);
void onColorTemperatureChangedSignal(QString);
void onImageQualityChangedSignal(QString);
2022-08-14 08:13:21 +12:00
void onImageSizeChangedSignal(QString);
2020-04-10 11:06:47 +12:00
void onPictureStyleChangedSignal(QString);
2020-05-22 09:06:28 +12:00
void onLiveViewCompensationChangedSignal(int);
2020-04-10 11:06:47 +12:00
void refreshApertureList();
void refreshShutterSpeedList();
void refreshIsoList();
void refreshExposureList();
void refreshWhiteBalanceList();
void refreshColorTemperatureList();
void refreshImageQualityList();
2022-08-14 08:13:21 +12:00
void refreshImageSizeList();
2020-04-10 11:06:47 +12:00
void refreshPictureStyleList();
void refreshMode();
2022-08-14 08:13:21 +12:00
void refreshManualFocusRange();
2020-04-16 10:02:02 +12:00
void onFocusCheckToggled(bool on);
void onPickFocusCheckToggled(bool on);
2020-05-03 09:54:05 +12:00
void onAlwaysUseLiveViewImagesButtonClicked();
void onAlwaysUseLiveViewImagesToggled(bool);
2020-04-10 11:06:47 +12:00
void onCaptureReviewFldEdited();
void onCaptureReviewSliderChanged(bool ignore);
void onSubsamplingFldEdited();
void onSubsamplingSliderChanged(bool ignore);
void onSubsamplingChanged(int);
void onFilePathChanged(QString);
void onLevelNameChanged(QString);
2020-05-03 09:54:05 +12:00
void onFileTypeChanged(QString);
void onXSheetFrameNumberChanged(int);
void onFrameNumberChanged(int);
void onFrameInfoTextChanged(QString);
void onOpacityChanged(int opacity);
void onBlackCaptureSignal(bool);
void onLiveViewOnAllFramesSignal(bool);
void onPlaceOnXSheetSignal(bool);
void onUseMjpgSignal(bool);
void onUseDirectShowSignal(bool);
void onReviewTimeChangedSignal(int);
void onPlayCaptureSignal(bool);
void onUseNumpadSignal(bool);
2020-04-10 18:01:27 +12:00
void onDrawBeneathSignal(bool);
void onLiveViewChanged(bool);
2022-08-14 08:13:21 +12:00
void onNewCameraSelected(int);
2022-02-17 04:03:44 +13:00
void onCameraIndexChanged(int);
2022-08-14 08:13:21 +12:00
void onUpdateStopMotionControls();
2020-04-28 17:02:21 +12:00
// webcam
void onWebcamResolutionsChanged();
void onNewWebcamResolutionSelected(int);
2020-04-28 17:02:21 +12:00
void onWebcamAutofocusToggled(bool);
void onWebcamFocusSliderChanged(int value);
void onWebcamExposureSliderChanged(int value);
void onWebcamBrightnessSliderChanged(int value);
void onWebcamContrastSliderChanged(int value);
void onWebcamGainSliderChanged(int value);
void onWebcamSaturationSliderChanged(int value);
void getWebcamStatus();
void onColorTypeComboChanged(int index);
void onUpdateHistogramCalled(cv::Mat img);
2020-05-20 17:43:46 +12:00
void onTakeTestButtonClicked();
void onRefreshTests();
void clearTests();
void onCalibCapBtnClicked();
void onCalibNewBtnClicked();
void resetCalibSettingsFromFile();
void onCalibLoadBtnClicked();
void onCalibExportBtnClicked();
void onCalibImageCaptured();
void onCalibReadme();
public slots:
void openSaveInFolderPopup();
};
//=============================================================================
class ExportCalibrationFilePopup final : public GenericSaveFilePopup {
Q_OBJECT
public:
ExportCalibrationFilePopup(QWidget *parent);
protected:
void showEvent(QShowEvent *) override;
};
//=============================================================================
class LoadCalibrationFilePopup final : public GenericLoadFilePopup {
Q_OBJECT
public:
LoadCalibrationFilePopup(QWidget *parent);
protected:
void showEvent(QShowEvent *) override;
};
#endif // STOPMOTIONCONTROLLER_H