1 #pragma once
2 
3 #include "common/common_pch.h"
4 
5 #include "mkvtoolnix-gui/main_window/tool_base.h"
6 #include "mkvtoolnix-gui/merge/file_identification_pack.h"
7 #include "mkvtoolnix-gui/util/settings.h"
8 
9 #include <QList>
10 
11 class QLineEdit;
12 class QStandardItem;
13 
14 namespace mtx::bcp47 {
15 class language_c;
16 }
17 
18 namespace mtx::bluray::disc_library {
19 struct info_t;
20 }
21 
22 namespace mtx::gui::Merge {
23 
24 enum class InitialDirMode {
25     ContentLastOpenDir
26   , ContentFirstInputFileLastOpenDir
27 };
28 
29 class MuxConfig;
30 
31 class TabPrivate;
32 class Tab : public QWidget {
33   Q_OBJECT
34 
35 protected:
36   MTX_DECLARE_PRIVATE(TabPrivate)
37 
38   std::unique_ptr<TabPrivate> const p_ptr;
39 
40 public:
41   explicit Tab(QWidget *parent);
42   ~Tab();
43 
44   virtual bool hasBeenModified();
45   virtual bool isEmpty();
46   virtual bool hasSourceFiles() const;
47   virtual bool hasDestinationFileName() const;
48   virtual bool hasTitle() const;
49   virtual bool hasSelectedNotAppendedRegularTracks() const;
50 
51   virtual QString const &fileName() const;
52   virtual QString title() const;
53   virtual void load(QString const &fileName);
54   virtual void cloneConfig(MuxConfig const &config);
55 
56   virtual void setChaptersFileName(QString const &fileName);
57   virtual void setTagsFileName(QString const &fileName);
58   virtual void setSegmentInfoFileName(QString const &fileName);
59 
60   virtual QList<SourceFilePtr> const &sourceFiles();
61   virtual QModelIndex fileModelIndexForFileNum(unsigned int num);
62 
63   virtual void addOrAppendIdentifiedFiles(QVector<SourceFilePtr> const &identifiedFiles, QModelIndex const &fileModelIdx, IdentificationPack::AddMode addMode);
64   virtual void addIdentifiedFilesAsAdditionalParts(QVector<SourceFilePtr> const &identifiedFiles, QModelIndex const &fileModelIdx);
65 
66   virtual void toggleSpecificTrackFlag(unsigned int wantedId);
67   virtual void changeTrackLanguage(QString const &formattedLanguage);
68 
69 Q_SIGNALS:
70   void removeThisTab();
71   void titleChanged();
72 
73 public Q_SLOTS:
74   // Input tab:
75   virtual void onSaveConfig();
76   virtual void onSaveConfigAs();
77   virtual void onSaveOptionFile();
78   virtual void onAddFiles();
79   virtual void onAddAdditionalParts();
80   virtual void onAppendFiles();
81   virtual void onRemoveFiles();
82   virtual void onRemoveAllFiles();
83   virtual void onShowCommandLine();
84 
85   virtual void selectAllTracks();
86   virtual void selectAllVideoTracks();
87   virtual void selectAllAudioTracks();
88   virtual void selectAllSubtitlesTracks();
89   virtual void selectAllTracksFromSelectedFiles();
90   virtual void enableAllTracks();
91   virtual void disableAllTracks();
92 
93   virtual void toggleMuxThisForSelectedTracks();
94   virtual void toggleMuxThisForSelectedAttachedFiles();
95 
96   virtual void onOpenFilesInMediaInfo();
97   virtual void onOpenTracksInMediaInfo();
98 
99   virtual void onTrackSelectionChanged();
100 
101   virtual void onMoveFilesUp();
102   virtual void onMoveFilesDown();
103   virtual void onMoveTracksUp();
104   virtual void onMoveTracksDown();
105   virtual void onMoveAttachmentsUp();
106   virtual void onMoveAttachmentsDown();
107   virtual void setupMoveUpDownButtons();
108   virtual void enableMoveFilesButtons();
109 
110   virtual void setupInputLayout();
111 
112   virtual void onTrackNameChanged(QString newValue);
113   virtual void onTrackItemChanged(QStandardItem *item);
114   virtual void onMuxThisChanged(int selected);
115   virtual void onTrackLanguageChanged(mtx::bcp47::language_c const &newLanguage);
116   virtual void onDefaultTrackFlagChanged(int newValue);
117   virtual void onForcedTrackFlagChanged(int newValue);
118   virtual void onTrackEnabledFlagChanged(int newValue);
119   virtual void onHearingImpairedFlagChanged(int newValue);
120   virtual void onVisualImpairedFlagChanged(int newValue);
121   virtual void onTextDescriptionsFlagChanged(int newValue);
122   virtual void onOriginalFlagChanged(int newValue);
123   virtual void onCommentaryFlagChanged(int newValue);
124   virtual void onCompressionChanged(int newValue);
125   virtual void onTrackTagsChanged(QString newValue);
126   virtual void onDelayChanged(QString newValue);
127   virtual void onStretchByChanged(QString newValue);
128   virtual void onDefaultDurationChanged(QString newValue);
129   virtual void onTimestampsChanged(QString newValue);
130   virtual void onBrowseTimestamps();
131   virtual void onFixBitstreamTimingInfoChanged(bool newValue);
132   virtual void onBrowseTrackTags();
133   virtual void onSetAspectRatio();
134   virtual void onSetDisplayDimensions();
135   virtual void onAspectRatioChanged(QString newValue);
136   virtual void onDisplayWidthChanged(QString newValue);
137   virtual void onDisplayHeightChanged(QString newValue);
138   virtual void onStereoscopyChanged(int newValue);
139   virtual void onCroppingChanged(QString newValue);
140   virtual void onAacIsSBRChanged(int newValue);
141   virtual void onReduceAudioToCoreChanged(bool newValue);
142   virtual void onRemoveDialogNormalizationGainChanged(bool newValue);
143   virtual void onSubtitleCharacterSetChanged(int newValue);
144   virtual void onCuesChanged(int newValue);
145   virtual void onAdditionalTrackOptionsChanged(QString newValue);
146   virtual void onPreviewChapterCharacterSet();
147   virtual void setChapterCharacterSet(QString const &characterSet);
148   virtual void onCopyFirstFileNameToTitle();
149   virtual void onCopyOutputFileNameToTitle();
150   virtual void onCopyTitleToOutputFileName();
151   virtual void setDestinationFileNameFromSelectedFile();
152 
153   virtual void addToJobQueue(bool startNow, std::optional<Util::Settings::ClearMergeSettingsAction> clearSettings = std::nullopt);
154 
155   virtual void reinitFilesTracksControls();
156 
157   virtual void onFileRowsInserted(QModelIndex const &parentIdx, int first, int last);
158   virtual void onTrackRowsInserted(QModelIndex const &parentIdx, int first, int last);
159 
160   virtual void showFilesContextMenu(QPoint const &pos);
161   virtual void showTracksContextMenu(QPoint const &pos);
162   virtual void showAttachedFilesContextMenu(QPoint const &pos);
163   virtual void showAttachmentsContextMenu(QPoint const &pos);
164 
165   // Output tab:
166   virtual void setupOutputFileControls();
167   virtual void setDestination(QString const &newValue);
168   virtual void clearDestination();
169   virtual void clearDestinationMaybe();
170   virtual void clearTitle();
171   virtual void clearTitleMaybe();
172 
173   virtual void onTitleChanged(QString newValue);
174   virtual void onBrowseOutput();
175   virtual void showRecentlyUsedOutputDirs();
176   virtual void changeOutputDirectoryTo(QString const &directory);
177   virtual void onGlobalTagsChanged(QString newValue);
178   virtual void onBrowseGlobalTags();
179   virtual void onSegmentInfoChanged(QString newValue);
180   virtual void onBrowseSegmentInfo();
181   virtual void onSplitModeChanged(int newMode);
182   virtual void onSplitOptionsChanged(QString newValue);
183   virtual void onLinkFilesClicked(bool newValue);
184   virtual void onSplitMaxFilesChanged(int newValue);
185   virtual void onSegmentUIDsChanged(QString newValue);
186   virtual void onPreviousSegmentUIDChanged(QString newValue);
187   virtual void onNextSegmentUIDChanged(QString newValue);
188   virtual void onChaptersChanged(QString newValue);
189   virtual void onBrowseSegmentUID();
190   virtual void onBrowsePreviousSegmentUID();
191   virtual void onBrowseNextSegmentUID();
192   virtual void onBrowseChapters();
193   virtual void onChapterTitleNumberChanged(int newValue);
194   virtual void onChapterLanguageChanged(mtx::bcp47::language_c const &newLanguage);
195   virtual void onChapterCharacterSetChanged(QString newValue);
196   virtual void onChapterDelayChanged(QString newValue);
197   virtual void onChapterStretchByChanged(QString newValue);
198   virtual void onChapterCueNameFormatChanged(QString newValue);
199   virtual void onWebmClicked(bool newValue);
200   virtual void onAdditionalOptionsChanged(QString newValue);
201   virtual void onEditAdditionalOptions();
202   virtual void onPreviewSubtitleCharacterSet();
203   virtual void setSubtitleCharacterSet(QString const &characterSet);
204   virtual void onChapterGenerationModeChanged();
205   virtual void onChapterGenerationNameTemplateChanged();
206   virtual void onChapterGenerationIntervalChanged();
207 
208   // Attachments tab:
209   virtual void onAttachmentSelectionChanged();
210   virtual void onAttachmentNameChanged(QString newValue);
211   virtual void onAttachmentDescriptionChanged(QString newValue);
212   virtual void onAttachmentMIMETypeChanged(QString newValue);
213   virtual void onAttachmentStyleChanged(int newValue);
214   virtual void onAddAttachments();
215   virtual void onRemoveAttachments();
216   virtual void onRemoveAllAttachments();
217   virtual void onSelectAllAttachments();
218   virtual void addAttachments(QStringList const &fileNames);
219 
220   virtual void enableDisableAllAttachedFiles(bool enable);
221   virtual void enableDisableSelectedAttachedFiles(bool enable);
222   virtual void attachedFileItemChanged(QStandardItem *item);
223 
224   virtual void retranslateUi();
225   virtual void handleClearingMergeSettings(Util::Settings::ClearMergeSettingsAction action);
226 
227   virtual void signalRemovalOfThisTab();
228 
229   virtual void setupHorizontalScrollAreaInputLayout();
230   virtual void setupHorizontalTwoColumnsInputLayout();
231   virtual void setupVerticalTabWidgetInputLayout();
232 
233 protected:
234   virtual void setupAttachmentsControls();
235   virtual void setupControlLists();
236   virtual void setupInputControls();
237   virtual void setupOutputControls();
238   virtual void setupPredefinedTrackNames();
239 
240   virtual void setupInputToolTips();
241   virtual void setupOutputToolTips();
242   virtual void setupSplitModeLabelAndToolTips();
243   virtual void setupAttachmentsToolTips();
244 
245   virtual void retranslateInputUI();
246   virtual void retranslateOutputUI();
247   virtual void retranslateAttachmentsUI();
248 
249   virtual QStringList selectFilesToAdd(QString const &title);
250   virtual QStringList selectAttachmentsToAdd();
251   virtual void selectFilesAndIdentifyForAddingOrAppending(IdentificationPack::AddMode addMode);
252   virtual void setDefaultsFromSettingsForAddedFiles(QVector<SourceFilePtr> const &files);
253 
254   virtual void enableFilesActions();
255   virtual void enableTracksActions();
256   virtual void enableAttachedFilesActions();
257   virtual void enableAttachmentsActions();
258   virtual void enableAttachmentControls(bool enable);
259   virtual void setInputControlValues(Track *track);
260   virtual void setOutputControlValues();
261   virtual void setAttachmentControlValues(Attachment *attachment);
262   virtual void clearInputControlValues();
263   virtual void setControlValuesFromConfig();
264   virtual MuxConfig &updateConfigFromControlValues();
265   virtual void withSelectedTracks(std::function<void(Track &)> code, bool notIfAppending = false, QWidget *widget = nullptr);
266   virtual void withSelectedAttachedFiles(std::function<void(Track &)> code);
267   virtual void withSelectedAttachments(std::function<void(Attachment &)> code);
268   virtual void addOrRemoveEmptyComboBoxItem(bool add);
269   virtual QString getOpenFileName(QString const &title, QString const &filter, QLineEdit *lineEdit, InitialDirMode intialDirMode = InitialDirMode::ContentLastOpenDir);
270   virtual QString getSaveFileName(QString const &title, QString const &defaultFileName, QString const &filter, QLineEdit *lineEdit, QString const &defaultSuffix);
271   virtual QString determineInitialDirForOpening(QLineEdit *lineEdit, InitialDirMode mode) const;
272   virtual QString determineInitialDirForSaving(QLineEdit *lineEdit) const;
273   virtual QString defaultFileNameForSaving(QString const &ext);
274 
275   virtual void moveSourceFilesUpOrDown(bool up);
276   virtual void moveTracksUpOrDown(bool up);
277   virtual void moveAttachmentsUpOrDown(bool up);
278 
279   virtual void moveOutputFileNameToGlobal();
280   virtual void moveOutputFileNameToOutputTab();
281 
282   virtual QModelIndex selectedSourceFile() const;
283   virtual QList<SourceFile *> selectedSourceFiles() const;
284   virtual void selectSourceFiles(QList<SourceFile *> const &files);
285 
286   virtual QList<Track *> selectedTracks() const;
287   virtual void selectTracks(QList<Track *> const &tracks);
288   virtual void selectAllTracksOfType(std::optional<TrackType> type);
289 
290   virtual QList<Track *> selectedAttachedFiles() const;
291   virtual QList<Attachment *> selectedAttachments() const;
292   virtual void selectAttachments(QList<Attachment *> const &attachments);
293   virtual std::optional<QString> findExistingAttachmentFileName(QString const &fileName);
294   virtual AttachmentPtr prepareFileForAttaching(QString const &fileName, bool alwaysAdd);
295   virtual void addAttachmentsFromIdentifiedBluray(mtx::bluray::disc_library::info_t const &info);
296 
297   virtual bool isReadyForMerging();
298   virtual bool checkIfOverwritingIsOK();
299   virtual bool checkIfMissingAudioTrackIsOK();
300   virtual QString findExistingDestination() const;
301 
302   virtual void setTitleMaybe(QVector<SourceFilePtr> const &files);
303   virtual void setTitleMaybe(QString const &title);
304 
305   virtual void setOutputFileNameMaybe(bool force = false);
306   virtual QString suggestOutputFileNameExtension() const;
307   virtual QString generateUniqueOutputFileName(QString const &baseName, QDir const &outputDir, bool removeUniquenessSuffix = false);
308 
309   virtual void enableDisableAllTracks(bool enable);
310 
311   virtual QString currentState();
312 
313   virtual QString mediaInfoLocation();
314   virtual void openFilesInMediaInfo(QStringList const &fileNames);
315 
316   virtual void addSegmentUIDFromFile(QLineEdit &lineEdit, bool append);
317   virtual void addDataFromIdentifiedBlurayFiles(QVector<SourceFilePtr> const &files);
318 };
319 
320 }
321