/*
* Copyright (c) 2011-2021 Meltytech, LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
#include
#include
#include
#include "mltcontroller.h"
#include "mltxmlchecker.h"
#define EXIT_RESTART (42)
namespace Ui {
class MainWindow;
}
class Player;
class RecentDock;
class EncodeDock;
class JobsDock;
class PlaylistDock;
class QUndoStack;
class QActionGroup;
class FilterController;
class ScopeController;
class FiltersDock;
class TimelineDock;
class AutoSaveFile;
class QNetworkReply;
class KeyframesDock;
class MarkersDock;
class NotesDock;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
enum LayoutMode {
Custom = 0,
Logging,
Editing,
Effects,
Color,
Audio,
PlayerOnly
};
static MainWindow &singleton();
~MainWindow();
void open(Mlt::Producer *producer);
bool continueModified();
bool continueJobsRunning();
QUndoStack *undoStack() const;
bool saveXML(const QString &filename, bool withRelativePaths = true);
static void changeTheme(const QString &theme);
PlaylistDock *playlistDock() const
{
return m_playlistDock;
}
FilterController *filterController() const
{
return m_filterController;
}
Mlt::Playlist *playlist() const;
bool isPlaylistValid() const;
Mlt::Producer *multitrack() const;
bool isMultitrackValid() const;
void doAutosave();
void setFullScreen(bool isFullScreen);
QString removeFileScheme(QUrl &url);
QString untitledFileName() const;
void setProfile(const QString &profile_name);
QString fileName() const
{
return m_currentFile;
}
bool isSourceClipMyProject(QString resource = MLT.resource(), bool withDialog = true);
bool keyframesDockIsVisible() const;
void keyPressEvent(QKeyEvent *);
void keyReleaseEvent(QKeyEvent *);
void hideSetDataDirectory();
QMenu *customProfileMenu() const
{
return m_customProfileMenu;
}
QAction *actionAddCustomProfile() const;
QAction *actionProfileRemove() const;
QActionGroup *profileGroup() const
{
return m_profileGroup;
}
void buildVideoModeMenu(QMenu *topMenu, QMenu *&customMenu, QActionGroup *group, QAction *addAction,
QAction *removeAction);
void newProject(const QString &filename, bool isProjectFolder = false);
void addCustomProfile(const QString &name, QMenu *menu, QAction *action, QActionGroup *group);
void removeCustomProfiles(const QStringList &profiles, QDir &dir, QMenu *menu, QAction *action);
QUuid timelineClipUuid(int trackIndex, int clipIndex);
void replaceInTimeline(const QUuid &uuid, Mlt::Producer &producer);
Mlt::ClipInfo *timelineClipInfoByUuid(const QUuid &uuid, int &trackIndex, int &clipIndex);
void replaceAllByHash(const QString &hash, Mlt::Producer &producer, bool isProxy = false);
bool isClipboardNewer() const
{
return m_clipboardUpdatedAt > m_sourceUpdatedAt;
}
signals:
void audioChannelsChanged();
void producerOpened(bool withReopen = true);
void profileChanged();
void openFailed(QString);
void aboutToShutDown();
void renameRequested();
void serviceInChanged(int delta, Mlt::Service *);
void serviceOutChanged(int delta, Mlt::Service *);
protected:
MainWindow();
bool eventFilter(QObject *target, QEvent *event);
void dragEnterEvent(QDragEnterEvent *);
void dropEvent(QDropEvent *);
void closeEvent(QCloseEvent *);
void showEvent(QShowEvent *);
void hideEvent(QHideEvent *event);
private:
void connectFocusSignals();
void registerDebugCallback();
void connectUISignals();
void setupAndConnectUndoStack();
void setupAndConnectPlayerWidget();
void setupLayoutSwitcher();
void centerLayoutInRemainingToolbarSpace();
void setupAndConnectDocks();
void setupMenuView();
void connectVideoWidgetSignals();
void setupAndConnectLeapNetworkListener();
void setupSettingsMenu();
void setupOpenOtherMenu();
QAction *addProfile(QActionGroup *actionGroup, const QString &desc, const QString &name);
QAction *addLayout(QActionGroup *actionGroup, const QString &name);
void readPlayerSettings();
void readWindowSettings();
void writeSettings();
void configureVideoWidget();
void setCurrentFile(const QString &filename);
void changeAudioChannels(bool checked, int channels);
void changeDeinterlacer(bool checked, const char *method);
void changeInterpolation(bool checked, const char *method);
bool checkAutoSave(QString &url);
void stepLeftBySeconds(int sec);
bool saveRepairedXmlFile(MltXmlChecker &checker, QString &fileName);
void setAudioChannels(int channels);
void showSaveError();
void setPreviewScale(int scale);
void setVideoModeMenu();
void resetVideoModeMenu();
void resetDockCorners();
void showIncompatibleProjectMessage(const QString &shotcutVersion);
void restartAfterChangeTheme();
Ui::MainWindow *ui;
Player *m_player;
QDockWidget *m_propertiesDock;
RecentDock *m_recentDock;
EncodeDock *m_encodeDock;
JobsDock *m_jobsDock;
PlaylistDock *m_playlistDock;
TimelineDock *m_timelineDock;
QString m_currentFile;
bool m_isKKeyPressed;
QUndoStack *m_undoStack;
QDockWidget *m_historyDock;
QActionGroup *m_profileGroup;
QActionGroup *m_externalGroup;
QActionGroup *m_keyerGroup;
QActionGroup *m_layoutGroup;
QActionGroup *m_previewScaleGroup;
FiltersDock *m_filtersDock;
FilterController *m_filterController;
ScopeController *m_scopeController;
QMenu *m_customProfileMenu;
QMenu *m_keyerMenu;
QStringList m_multipleFiles;
bool m_isPlaylistLoaded;
QActionGroup *m_languagesGroup;
QSharedPointer m_autosaveFile;
QMutex m_autosaveMutex;
QTimer m_autosaveTimer;
int m_exitCode;
int m_navigationPosition;
QScopedPointer m_statusBarAction;
QNetworkAccessManager m_network;
QString m_upgradeUrl;
KeyframesDock *m_keyframesDock;
QDateTime m_clipboardUpdatedAt;
QDateTime m_sourceUpdatedAt;
MarkersDock *m_markersDock;
NotesDock *m_notesDock;
#ifdef WITH_LIBLEAP
LeapListener m_leapListener;
#endif
public slots:
bool isCompatibleWithGpuMode(MltXmlChecker &checker);
bool isXmlRepaired(MltXmlChecker &checker, QString &fileName);
void open(QString url, const Mlt::Properties * = nullptr, bool play = true);
void openMultiple(const QStringList &paths);
void openMultiple(const QList &urls);
void openVideo();
void openCut(Mlt::Producer *producer, bool play = false);
void hideProducer();
void closeProducer();
void showStatusMessage(QAction *action, int timeoutSeconds = 5);
void showStatusMessage(const QString &message, int timeoutSeconds = 5,
QPalette::ColorRole role = QPalette::ToolTipBase);
void onStatusMessageClicked();
void seekPlaylist(int start);
void seekTimeline(int position, bool seekPlayer = true);
void seekKeyframes(int position);
QWidget *loadProducerWidget(Mlt::Producer *producer);
void onProducerOpened(bool withReopen = true);
void onGpuNotSupported();
void stepLeftOneFrame();
void stepRightOneFrame();
void stepLeftOneSecond();
void stepRightOneSecond();
void setInToCurrent(bool ripple);
void setOutToCurrent(bool ripple);
void onShuttle(float x);
void onPropertiesDockTriggered(bool checked = true);
bool on_actionSave_triggered();
private slots:
void showUpgradePrompt();
void on_actionAbout_Shotcut_triggered();
void on_actionOpenOther_triggered();
void onProducerChanged();
bool on_actionSave_As_triggered();
void onEncodeTriggered(bool checked = true);
void onCaptureStateChanged(bool started);
void onJobsDockTriggered(bool = true);
void onRecentDockTriggered(bool checked = true);
void onPlaylistDockTriggered(bool checked = true);
void onTimelineDockTriggered(bool checked = true);
void onHistoryDockTriggered(bool checked = true);
void onFiltersDockTriggered(bool checked = true);
void onKeyframesDockTriggered(bool checked = true);
void onMarkersDockTriggered(bool = true);
void onNotesDockTriggered(bool = true);
void onPlaylistCreated();
void onPlaylistLoaded();
void onPlaylistCleared();
void onPlaylistClosed();
void onPlaylistModified();
void onMultitrackCreated();
void onMultitrackClosed();
void onMultitrackModified();
void onMultitrackDurationChanged();
void onNoteModified();
void onCutModified();
void onProducerModified();
void onFilterModelChanged();
void updateMarkers();
void updateThumbnails();
void on_actionUndo_triggered();
void on_actionRedo_triggered();
void on_actionFAQ_triggered();
void on_actionForum_triggered();
void on_actionEnter_Full_Screen_triggered();
void on_actionRealtime_triggered(bool checked);
void on_actionProgressive_triggered(bool checked);
void on_actionChannels1_triggered(bool checked);
void on_actionChannels2_triggered(bool checked);
void on_actionChannels6_triggered(bool checked);
void on_actionOneField_triggered(bool checked);
void on_actionLinearBlend_triggered(bool checked);
void on_actionYadifTemporal_triggered(bool checked);
void on_actionYadifSpatial_triggered(bool checked);
void on_actionNearest_triggered(bool checked);
void on_actionBilinear_triggered(bool checked);
void on_actionBicubic_triggered(bool checked);
void on_actionHyper_triggered(bool checked);
void on_actionJack_triggered(bool checked);
void on_actionGPU_triggered(bool checked);
void onExternalTriggered(QAction *);
void onKeyerTriggered(QAction *);
void onProfileTriggered(QAction *);
void onProfileChanged();
void on_actionAddCustomProfile_triggered();
void processMultipleFiles();
void onLanguageTriggered(QAction *);
void on_actionSystemTheme_triggered();
void on_actionFusionDark_triggered();
void on_actionJobPriorityLow_triggered();
void on_actionJobPriorityNormal_triggered();
void on_actionFusionLight_triggered();
void on_actionTutorials_triggered();
void on_actionRestoreLayout_triggered();
void on_actionShowTitleBars_triggered(bool checked);
void on_actionShowToolbar_triggered(bool checked);
void onToolbarVisibilityChanged(bool visible);
void on_menuExternal_aboutToShow();
void on_actionUpgrade_triggered();
void on_actionOpenXML_triggered();
void onAutosaveTimeout();
void on_actionGammaSRGB_triggered(bool checked);
void on_actionGammaRec709_triggered(bool checked);
void onFocusChanged(QWidget *old, QWidget *now) const;
void onFocusObjectChanged(QObject *obj) const;
void onFocusWindowChanged(QWindow *window) const;
void onTimelineClipSelected();
void onAddAllToTimeline(Mlt::Playlist *playlist, bool skipProxy);
void on_actionScrubAudio_triggered(bool checked);
#if !defined(Q_OS_MAC)
void onDrawingMethodTriggered(QAction *);
#endif
void on_actionApplicationLog_triggered();
void on_actionClose_triggered();
void onPlayerTabIndexChanged(int index);
void onUpgradeCheckFinished(QNetworkReply *reply);
void onUpgradeTriggered();
void onTimelineSelectionChanged();
void on_actionCut_triggered();
void on_actionCopy_triggered();
void on_actionPaste_triggered();
void onClipCopied();
void on_actionExportEDL_triggered();
void on_actionExportFrame_triggered();
void onGLWidgetImageReady();
void on_actionAppDataSet_triggered();
void on_actionAppDataShow_triggered();
void on_actionNew_triggered();
void on_actionKeyboardShortcuts_triggered();
void on_actionLayoutLogging_triggered();
void on_actionLayoutEditing_triggered();
void on_actionLayoutEffects_triggered();
void on_actionLayoutColor_triggered();
void on_actionLayoutAudio_triggered();
void on_actionLayoutPlayer_triggered();
void on_actionLayoutPlaylist_triggered();
void on_actionLayoutClip_triggered();
void on_actionLayoutAdd_triggered();
void onLayoutTriggered(QAction *);
void on_actionProfileRemove_triggered();
void on_actionLayoutRemove_triggered();
void on_actionOpenOther2_triggered();
void onOpenOtherTriggered(QWidget *widget);
void onOpenOtherTriggered();
void on_actionClearRecentOnExit_toggled(bool arg1);
void onSceneGraphInitialized();
void on_actionShowTextUnderIcons_toggled(bool b);
void on_actionShowSmallIcons_toggled(bool b);
void onPlaylistInChanged(int in);
void onPlaylistOutChanged(int out);
void on_actionPreviewNone_triggered(bool checked);
void on_actionPreview360_triggered(bool checked);
void on_actionPreview540_triggered(bool checked);
void on_actionPreview720_triggered(bool checked);
void on_actionTopics_triggered();
void on_actionSync_triggered();
void on_actionUseProxy_triggered(bool checked);
void on_actionProxyStorageSet_triggered();
void on_actionProxyStorageShow_triggered();
void on_actionProxyUseProjectFolder_triggered(bool checked);
void on_actionProxyUseHardware_triggered(bool checked);
void on_actionProxyConfigureHardware_triggered();
void updateLayoutSwitcher();
void clearCurrentLayout();
void onClipboardChanged();
void sourceUpdated();
void resetSourceUpdated();
void on_actionExportChapters_triggered();
void on_actionAudioVideoDevice_triggered();
};
#define MAIN MainWindow::singleton()
#endif // MAINWINDOW_H