1 #pragma once
2 
3 #include <QAction>
4 #include <QIcon>
5 #include <QList>
6 #include <QModelIndex>
7 #include <QPoint>
8 #include <QPointer>
9 #include <QUrl>
10 #include <QVariant>
11 
12 #include "library/basetracksetfeature.h"
13 #include "library/crate/cratestorage.h"
14 #include "library/crate/cratetablemodel.h"
15 #include "library/treeitemmodel.h"
16 #include "preferences/usersettings.h"
17 #include "track/track_decl.h"
18 #include "util/parented_ptr.h"
19 
20 // forward declaration(s)
21 class Library;
22 class WLibrarySidebar;
23 
24 class CrateFeature : public BaseTrackSetFeature {
25     Q_OBJECT
26   public:
27     CrateFeature(Library* pLibrary,
28                  UserSettingsPointer pConfig);
29     ~CrateFeature() override = default;
30 
31     QVariant title() override;
32     QIcon getIcon() override;
33 
34     bool dropAcceptChild(const QModelIndex& index,
35             const QList<QUrl>& urls,
36             QObject* pSource) override;
37     bool dragMoveAcceptChild(const QModelIndex& index, const QUrl& url) override;
38 
39     void bindLibraryWidget(WLibrary* libraryWidget,
40                     KeyboardEventFilter* keyboard) override;
41     void bindSidebarWidget(WLibrarySidebar* pSidebarWidget) override;
42 
43     TreeItemModel* getChildModel() override;
44 
45   public slots:
46     void activateChild(const QModelIndex& index) override;
47     void onRightClick(const QPoint& globalPos) override;
48     void onRightClickChild(const QPoint& globalPos, const QModelIndex& index) override;
49     void slotCreateCrate();
50 
51   private slots:
52     void slotDeleteCrate();
53     void slotRenameCrate();
54     void slotDuplicateCrate();
55     void slotAutoDjTrackSourceChanged();
56     void slotToggleCrateLock();
57     void slotImportPlaylist();
58     void slotImportPlaylistFile(const QString &playlist_file);
59     void slotCreateImportCrate();
60     void slotExportPlaylist();
61     // Copy all of the tracks in a crate to a new directory (like a thumbdrive).
62     void slotExportTrackFiles();
63     void slotAnalyzeCrate();
64     void slotCrateTableChanged(CrateId crateId);
65     void slotCrateContentChanged(CrateId crateId);
66     void htmlLinkClicked(const QUrl& link);
67     void slotTrackSelected(TrackPointer pTrack);
68     void slotResetSelectedTrack();
69     void slotUpdateCrateLabels(const QSet<CrateId>& updatedCrateIds);
70 
71   private:
72     void initActions();
73     void connectLibrary(Library* pLibrary);
74     void connectTrackCollection();
75 
76     bool activateCrate(CrateId crateId);
77 
78     std::unique_ptr<TreeItem> newTreeItemForCrateSummary(
79             const CrateSummary& crateSummary);
80     void updateTreeItemForCrateSummary(
81             TreeItem* pTreeItem,
82             const CrateSummary& crateSummary) const;
83 
84     QModelIndex rebuildChildModel(CrateId selectedCrateId = CrateId());
85     void updateChildModel(const QSet<CrateId>& updatedCrateIds);
86 
87     CrateId crateIdFromIndex(const QModelIndex& index) const;
88     QModelIndex indexFromCrateId(CrateId crateId) const;
89 
90     bool readLastRightClickedCrate(Crate* pCrate) const;
91 
92     QString formatRootViewHtml() const;
93 
94     const QIcon m_cratesIcon;
95     const QIcon m_lockedCrateIcon;
96 
97     TrackCollection* const m_pTrackCollection;
98 
99     CrateTableModel m_crateTableModel;
100     TreeItemModel m_childModel;
101 
102     QModelIndex m_lastRightClickedIndex;
103     TrackPointer m_pSelectedTrack;
104 
105     parented_ptr<QAction> m_pCreateCrateAction;
106     parented_ptr<QAction> m_pDeleteCrateAction;
107     parented_ptr<QAction> m_pRenameCrateAction;
108     parented_ptr<QAction> m_pLockCrateAction;
109     parented_ptr<QAction> m_pDuplicateCrateAction;
110     parented_ptr<QAction> m_pAutoDjTrackSourceAction;
111     parented_ptr<QAction> m_pImportPlaylistAction;
112     parented_ptr<QAction> m_pCreateImportPlaylistAction;
113     parented_ptr<QAction> m_pExportPlaylistAction;
114     parented_ptr<QAction> m_pExportTrackFilesAction;
115     parented_ptr<QAction> m_pAnalyzeCrateAction;
116 
117     QPointer<WLibrarySidebar> m_pSidebarWidget;
118 };
119