1 /*******************************************************************************
2 *                         Goggles Music Manager                                *
3 ********************************************************************************
4 *           Copyright (C) 2007-2021 by Sander Jansen. All Rights Reserved      *
5 *                               ---                                            *
6 * This program is free software: you can redistribute it and/or modify         *
7 * it under the terms of the GNU General Public License as published by         *
8 * the Free Software Foundation, either version 3 of the License, or            *
9 * (at your option) any later version.                                          *
10 *                                                                              *
11 * This program is distributed in the hope that it will be useful,              *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of               *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                *
14 * GNU General Public License for more details.                                 *
15 *                                                                              *
16 * You should have received a copy of the GNU General Public License            *
17 * along with this program.  If not, see http://www.gnu.org/licenses.           *
18 ********************************************************************************/
19 #ifndef GMDATABASESOURCE_H
20 #define GMDATABASESOURCE_H
21 
22 #ifndef GMCLIPBOARD_H
23 #include "GMClipboard.h"
24 #endif
25 
26 class GMSource;
27 class GMTrackDatabase;
28 
29 class GMDatabaseClipboardData : public GMClipboardData {
30 public:
31   GMTrackDatabase * db;
32   FXIntList         tracks;
33 public:
34   FXbool request(FXDragType target,GMClipboard * clipboard);
35 
~GMDatabaseClipboardData()36   ~GMDatabaseClipboardData() {
37     db=nullptr;
38     }
39   };
40 
41 
42 
43 
44 class GMDatabaseSource : public GMSource {
45 FXDECLARE(GMDatabaseSource)
46 protected:
47   static GMDatabaseSource * filterowner;
48   static GMCoverCache     * covercache;
49 protected:
50   GMTrackDatabase   * db         = nullptr;
51   FXint               playlist   = 0;
52   FXString            filter;
53   FXuint              filtermask = FILTER_DEFAULT;
54   FXbool              hasfilter  = false;
55   FXbool              hasview    = false;
56   FXString            dndfiles;
57 protected:
GMDatabaseSource()58   GMDatabaseSource(){}
59 private:
60   GMDatabaseSource(const GMDatabaseSource&);
61   GMDatabaseSource& operator=(const GMDatabaseSource&);
62 protected:
63   void removeFiles(const FXStringList & files);
hasFilter()64   FXbool hasFilter() const { return hasfilter; }
65 public:
66   enum {
67     ID_NEW_PLAYLIST = GMSource::ID_LAST,
68     ID_IMPORT_PLAYLIST,
69     ID_IMPORT_FILES,
70     ID_CLEAR,
71     ID_COLUMN_TRACK,
72     ID_COLUMN_QUEUE,
73     ID_COLUMN_ARTIST,
74     ID_COLUMN_ALBUM,
75     ID_COLUMN_GENRE,
76     ID_COLUMN_TIME,
77     ID_LOAD_ALBUM_ICONS,
78     ID_OPEN_FOLDER,
79     ID_EDIT_RATING,
80     ID_ADD_COVER,
81     ID_SEARCH_COVER,
82     ID_SEARCH_COVER_ALBUM,
83     ID_LOAD_COVERS,
84     ID_NEW_FILTER,
85     ID_LAST
86     };
87 public:
88   long onCmdEditTrack(FXObject*,FXSelector,void*);
89   long onCmdDelete(FXObject*,FXSelector,void*);
90   long onCmdCopyArtistAlbum(FXObject*,FXSelector,void*);
91   long onCmdCopyTrack(FXObject*,FXSelector,void*);
92   long onCmdRequestArtistAlbum(FXObject*,FXSelector,void*);
93   long onCmdRequestTrack(FXObject*,FXSelector,void*);
94   long onCmdExport(FXObject*,FXSelector,void*);
95   long onUpdExport(FXObject*,FXSelector,void*);
96   long onCmdDrop(FXObject*,FXSelector,void*);
97   long onCmdPaste(FXObject*,FXSelector,void*);
98   long onUpdPaste(FXObject*,FXSelector,void*);
99   long onCmdNewPlayList(FXObject*,FXSelector,void*);
100   long onCmdImportPlayList(FXObject*,FXSelector,void*);
101   long onCmdClear(FXObject*,FXSelector,void*);
102   long onCmdTrackPlayed(FXObject*,FXSelector,void*);
103   long onCmdShowColumn(FXObject*,FXSelector,void*);
104   long onUpdShowColumn(FXObject*,FXSelector,void*);
105   long onQueryTip(FXObject*,FXSelector,void*);
106   long onCmdOpenFolder(FXObject*,FXSelector,void*);
107   long onCmdEditRating(FXObject*,FXSelector,void*);
108   long onDndImportFiles(FXObject*,FXSelector,void*);
109   long onCmdAddCover(FXObject*,FXSelector,void*);
110   long onCmdSearchCover(FXObject*,FXSelector,void*);
111   long onCmdMainWindow(FXObject*,FXSelector,void*);
112   long onCmdLoadCovers(FXObject*,FXSelector,void*);
113   long onCmdNewFilter(FXObject*,FXSelector,void*);
114 public:
115   GMDatabaseSource(GMTrackDatabase * db);
116 
117   void shutdown();
118 
119 
120   virtual GMTrackListSortFunc getSortBrowse(FXbool album_list_mode=false) const override;
121 
122 
123   virtual void addTracks(GMSource * src,const FXIntList & tracks);
124 
getCoverCache()125   GMCoverCache* getCoverCache() const override { return covercache; }
126 
127   void loadCovers() override;
128 
129   void updateCovers() override;
130 
canFilter()131   FXbool canFilter() const override { return true; }
132 
133   void shuffle(GMTrackList*,FXuint) const override;
134 
135   void configure(GMColumnList&) override;
136 
137   FXbool hasCurrentTrack(GMSource * ) const override;
138 
139   FXbool hasTrack(const FXString & mrl,FXint & id) override;
140 
141   FXbool findCurrent(GMTrackList * tracklist,GMSource * src) override;
142 
143   FXbool findCurrentArtist(GMList * tracklist,GMSource * src) override;
144 
145   FXbool findCurrentAlbum(GMAlbumList *,GMSource * src) override;
146 
getName()147   FXString getName() const override { return fxtr("Music Library"); }
148 
149   FXint getNumTracks() const override;
150 
151   FXbool getTrack(GMTrack & info) const override;
152 
getType()153   FXint getType() const override { return SOURCE_DATABASE; }
154 
settingKey()155   FXString settingKey() const override { return "database"; }
156 
157   FXbool setFilter(const FXString&,FXuint) override;
158 
159   FXbool listTags(GMList * taglist,FXIcon * icon) override;
160 
161   FXbool listArtists(GMList * artistlist,FXIcon * icon,const FXIntList & taglist) override;
162 
163   FXbool listAlbums(GMAlbumList *,const FXIntList &,const FXIntList &) override;
164 
165   FXbool listTracks(GMTrackList * tracklist,const FXIntList & albumlist,const FXIntList & taglist) override;
166 
167   FXbool updateSelectedTracks(GMTrackList*) override;
168 
169   FXbool genre_context_menu(FXMenuPane * pane) override;
170 
171   FXbool artist_context_menu(FXMenuPane * pane) override;
172 
173   FXbool album_context_menu(FXMenuPane * pane) override;
174 
175   FXbool track_context_menu(FXMenuPane * pane) override;
176 
177   FXbool source_context_menu(FXMenuPane * pane) override;
178 
179   FXbool source_menu(FXMenuPane * pane) override;
180 
181   FXbool dnd_accepts(FXDragType*,FXuint) override;
182 
183   FXuint dnd_provides(FXDragType types[]) override;
184 
185   virtual ~GMDatabaseSource();
186   };
187 
188 
189 extern void gm_import_files(const FXStringList & files,FXint playlist,FXuint whence);
190 
191 #endif
192