1 #pragma once
2 
3 #include "common/common_pch.h"
4 
5 #include "mkvtoolnix-gui/merge/source_file.h"
6 
7 #include <QStandardItemModel>
8 #include <QList>
9 #include <QSet>
10 #include <QVector>
11 
12 namespace mtx::gui::Merge {
13 
14 class SourceFileModel;
15 using SourceFileModelPtr = std::shared_ptr<SourceFileModel>;
16 
17 class TrackModel;
18 class AttachedFileModel;
19 
20 class SourceFileModel : public QStandardItemModel {
21   Q_OBJECT
22 
23 protected:
24   QList<SourceFilePtr> *m_sourceFiles;
25   QHash<quint64, SourceFilePtr> m_sourceFileMap;
26   TrackModel *m_tracksModel;
27   AttachedFileModel *m_attachedFilesModel;
28   bool m_nonAppendedSelected, m_appendedSelected, m_additionalPartSelected;
29   QVector<int> m_availableColorIndexes;
30   int m_nextColorIndex{};
31 
32 public:
33   SourceFileModel(QObject *parent);
34   virtual ~SourceFileModel();
35 
36   virtual void retranslateUi();
37 
38   virtual void setSourceFiles(QList<SourceFilePtr> &sourceFiles);
39   virtual void setOtherModels(TrackModel *tracksModel, AttachedFileModel *attachedFilesModel);
40   virtual void addOrAppendFilesAndTracks(QVector<SourceFilePtr> const &files, QModelIndex const &fileToAddToIdx, bool append);
41   virtual void addAdditionalParts(QStringList const &fileNames, QModelIndex const &fileToAddToIdx);
42   virtual void removeFiles(QList<SourceFile *> const &files);
43   virtual void removeFile(SourceFile *fileToBeRemoved);
44 
45   virtual void moveSourceFilesUpOrDown(QList<SourceFile *> files, bool up);
46 
47   virtual SourceFilePtr fromIndex(QModelIndex const &idx) const;
48   virtual QModelIndex indexFromSourceFile(SourceFile *sourceFile) const;
49 
50   virtual Qt::DropActions supportedDropActions() const;
51   virtual Qt::ItemFlags flags(QModelIndex const &index) const;
52 
53   virtual QStringList mimeTypes() const;
54   virtual QMimeData *mimeData(QModelIndexList const &indexes) const;
55 
56   virtual bool canDropMimeData(QMimeData const *data, Qt::DropAction action, int row, int column, QModelIndex const &parent) const override;
57   virtual bool dropMimeData(QMimeData const *data, Qt::DropAction action, int row, int column, QModelIndex const &parent) override;
58 
59 public Q_SLOTS:
60   void updateSelectionStatus();
61   void updateSourceFileLists();
62   void updateFileColors();
63 
64 protected:
65   virtual void addFilesAndTracks(QVector<SourceFilePtr> const &files);
66   virtual QModelIndex addFileAtAppropriatePlace(SourceFilePtr const &file, bool sortByType);
67   virtual QModelIndex addFileSortedByType(SourceFilePtr const &file);
68   virtual void appendFilesAndTracks(QVector<SourceFilePtr> const &files, QModelIndex const &fileToAddToIdx);
69 
70   void assignColorIndex(SourceFile &file);
71   void initializeColorIndexes();
72 
73   void setItemsFromSourceFile(QList<QStandardItem *> const &items, SourceFile *sourceFile) const;
74   QList<QStandardItem *> createRow(SourceFile *sourceFile) const;
75   void createAndAppendRow(QStandardItem *item, SourceFilePtr const &file, int position = -1);
76   void dumpSourceFiles(QString const &label) const;
77 
78   quint64 storageValueFromIndex(QModelIndex const &idx) const;
79 
80   bool dropSourceFiles(QMimeData const *data, Qt::DropAction action, int row, const QModelIndex &parent);
81 
82   QModelIndex indexFromSourceFile(quint64 value, QModelIndex const &parent) const;
83 
84   void sourceFileUpdated(SourceFile *sourceFile);
85 
86   void sortSourceFiles(QList<SourceFile *> &files, bool reverse = false);
87 
88   std::pair<int, int> countAppendedAndAdditionalParts(QStandardItem *parentItem);
89 };
90 
91 }
92