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