1 /*******************************************************************************
2 *                         Goggles Music Manager                                *
3 ********************************************************************************
4 *           Copyright (C) 2006-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 GMSOURCE_H
20 #define GMSOURCE_H
21 
22 #ifndef GMTRACKLIST_H
23 #include "GMTrackList.h"
24 #endif
25 
26 class GMList;
27 class GMAlbumList;
28 class GMCoverCache;
29 
30 /*
31 enum {
32   FLAG_CAN_AUTOPLAY	 =0x1,
33   FLAG_CAN_FILTER		 =0x2,
34   FLAG_CAN_BROWSE		 =0x4,
35   FLAG_DEFAULT_BROWSE=0x8
36   };
37 */
38 
39 enum {
40   FILTER_TRACK    = 0x1,
41   FILTER_ARTIST   = 0x2,
42   FILTER_ALBUM    = 0x4,
43   FILTER_TAG      = 0x8,
44   FILTER_ALL      = (FILTER_TRACK|FILTER_ARTIST|FILTER_ALBUM|FILTER_TAG),
45   FILTER_DEFAULT  = (FILTER_TRACK|FILTER_ARTIST|FILTER_ALBUM)
46   };
47 
48 enum {
49   SOURCE_UNKNOWN  = -1,
50   SOURCE_INVALID  = -1,
51   SOURCE_PLAYQUEUE,
52   SOURCE_DATABASE,
53   SOURCE_DATABASE_FILTER,
54   SOURCE_DATABASE_PLAYLIST,
55   SOURCE_FILESYSTEM,
56   SOURCE_INTERNET_RADIO,
57   SOURCE_PODCAST,
58   SOURCE_ALBUM,
59   SOURCE_ARTIST,
60   SOURCE_AUDIOCD
61   };
62 
63 enum {
64   HEADER_DEFAULT=0,
65   HEADER_SHUFFLE=1,
66   HEADER_BROWSE,
67   HEADER_QUEUE,
68   HEADER_TRACK,
69   HEADER_TITLE,
70   HEADER_ALBUM,
71   HEADER_ARTIST,
72   HEADER_TIME,
73   HEADER_TAG, /// WAS HEADER_GENRE
74   HEADER_BITRATE,
75   HEADER_RATING,
76   HEADER_YEAR,
77   HEADER_DISC,
78   HEADER_ALBUM_ARTIST,
79   HEADER_PLAYCOUNT,
80   HEADER_PLAYDATE,
81   HEADER_FILENAME,
82   HEADER_FILETYPE,
83   HEADER_COMPOSER,
84   HEADER_CONDUCTOR,
85   HEADER_DATE,
86   HEADER_STATUS,
87   HEADER_AUDIOFORMAT,
88   HEADER_NONE
89   };
90 
91 
92 /// Sort Function
93 class GMTrackItem;
94 typedef FXint (*GMTrackListSortFunc)(const GMTrackItem*,const GMTrackItem*);
95 
96 
97 
98 
99 
100 class GMSource : public FXObject {
101 FXDECLARE(GMSource)
102 protected:
103   FXint               current_track = -1;
104 private:
105   GMSource(const GMSource&);
106   GMSource& operator=(const GMSource&);
107 public:
108   enum {
109     ID_TRACK_PLAYED = 1,
110     ID_EDIT_GENRE,
111     ID_EDIT_ARTIST,
112     ID_EDIT_ALBUM,
113     ID_EDIT_TRACK,
114     ID_COPY_ARTIST,
115     ID_COPY_ALBUM,
116     ID_COPY_TRACK,
117     ID_DELETE_TAG,
118     ID_DELETE_ARTIST,
119     ID_DELETE_ALBUM,
120     ID_DELETE_TRACK,
121     ID_DELETE_TAG_ADV,
122     ID_DELETE_ARTIST_ADV,
123     ID_DELETE_ALBUM_ADV,
124     ID_DELETE_TRACK_ADV,
125     ID_PASTE,
126     ID_DROP,
127     ID_EXPORT,
128     ID_TIP_TEXT,
129     ID_LAST
130     };
131 public:
132   GMSource();
133 
134   /// Configure the columns in the tracklist
configure(GMColumnList &)135   virtual void configure(GMColumnList&) {}
136 
shuffle(GMTrackList *,FXuint)137   virtual void shuffle(GMTrackList*,FXuint) const{}
138 
getSortBrowse(FXbool)139   virtual GMTrackListSortFunc getSortBrowse(FXbool /*album_list_mode=false*/) const { return nullptr; }
140 
getSortColumn(FXbool browse)141   virtual FXint getSortColumn(FXbool browse) const { if (browse) return HEADER_BROWSE; else return HEADER_ARTIST; }
142 
setCurrentTrack(FXint t)143   void setCurrentTrack(FXint t) { current_track=t; }
144 
getCurrentTrack()145   FXint getCurrentTrack() const { return current_track; }
146 
hasCurrentTrack(GMSource *)147   virtual FXbool hasCurrentTrack(GMSource * ) const { return false; }
148 
hasTrack(const FXString &,FXint &)149   virtual FXbool hasTrack(const FXString &,FXint &) { return false; }
150 
resetCurrent()151   virtual void resetCurrent() { current_track=-1; }
152 
153   virtual void markCurrent(const GMTrackItem*);
154 
155   virtual FXbool findCurrent(GMTrackList * tracklist,GMSource * src);
156 
157   virtual FXbool findCurrentArtist(GMList * tracklist,GMSource * src);
158 
159   virtual FXbool findCurrentAlbum(GMAlbumList *,GMSource * src);
160 
161   virtual FXint getNumTracks() const;
162 
163   virtual FXbool getTrack(GMTrack & info) const;
164 
setTrack(GMTrack &)165   virtual FXbool setTrack(GMTrack &) const { return false; }
166 
getType()167   virtual FXint getType() const { return SOURCE_INVALID; }
168 
getQueueColumn(FXbool)169   virtual FXbool getQueueColumn(FXbool) const { return false; }
170 
canBrowse()171   virtual FXbool canBrowse() const { return true; }
172 
canFilter()173   virtual FXbool canFilter() const { return false; }
174 
defaultBrowse()175   virtual FXbool defaultBrowse() const { return true; }
176 
defaultTags()177   virtual FXbool defaultTags() const { return false; }
178 
autoPlay()179   virtual FXbool autoPlay() const { return true; }
180 
hasArtistList()181   virtual FXbool hasArtistList() const { return true; }
182 
getName()183   virtual FXString getName() const { return FXString::null; }
184 
getAlbumName()185   virtual const FXchar * getAlbumName() const { return fxtr("Albums"); }
186 
187   virtual FXIcon* getAlbumIcon() const;
188 
getCoverCache()189   virtual GMCoverCache * getCoverCache() const { return nullptr; }
190 
loadCovers()191   virtual void loadCovers() {}
192 
updateCovers()193   virtual void updateCovers() {}
194 
195   /// Items have been dragged around.
196   virtual void dragged(GMTrackList*);
197 
198   /// Sorting is about to be changed.
sorted(GMTrackList *,FXint)199   virtual void sorted(GMTrackList*,FXint) {}
200 
settingKey()201   virtual FXString settingKey() const { return "nokey"; }
202 
203   // unhide to keep compiler happy over hiding virtual
204   using FXObject::load;
205   using FXObject::save;
206 
load(FXSettings &)207   virtual void load(FXSettings&) {}
208 
save(FXSettings &)209   virtual void save(FXSettings&) const {}
210 
save(GMTrackList *)211   virtual void save(GMTrackList*) {}
212 
setFilter(const FXString &,FXuint)213   virtual FXbool setFilter(const FXString&,FXuint) {return false;}
214 
listGenres(GMList *,FXIcon *)215   virtual FXbool listGenres(GMList *,FXIcon *) { return false; }
216 
listTags(GMList *,FXIcon *)217   virtual FXbool listTags(GMList *,FXIcon *) { return false; }
218 
listArtists(GMList *,FXIcon *,const FXIntList &)219   virtual FXbool listArtists(GMList *,FXIcon *,const FXIntList &) { return false; }
220 
listComposers(GMList *,FXIcon *,const FXIntList &)221   virtual FXbool listComposers(GMList *,FXIcon *,const FXIntList &) { return false; }
222 
listAlbums(GMAlbumList *,const FXIntList &,const FXIntList &)223   virtual FXbool listAlbums(GMAlbumList *,const FXIntList &,const FXIntList &) { return false; }
224 
listTracks(GMTrackList *,const FXIntList &,const FXIntList &)225   virtual FXbool listTracks(GMTrackList*,const FXIntList &,const FXIntList &) { return false; }
226 
updateSelectedTracks(GMTrackList *)227   virtual FXbool updateSelectedTracks(GMTrackList*) { return false; }
228 
genre_context_menu(FXMenuPane *)229   virtual FXbool genre_context_menu(FXMenuPane*) { return false; }
230 
artist_context_menu(FXMenuPane *)231   virtual FXbool artist_context_menu(FXMenuPane*) { return false; }
232 
album_context_menu(FXMenuPane *)233   virtual FXbool album_context_menu(FXMenuPane*) { return false; }
234 
track_context_menu(FXMenuPane *)235   virtual FXbool track_context_menu(FXMenuPane*) { return false; }
236 
source_context_menu(FXMenuPane *)237   virtual FXbool source_context_menu(FXMenuPane*) { return false; }
238 
source_menu(FXMenuPane *)239   virtual FXbool source_menu(FXMenuPane*) { return false; }
240 
dnd_accepts(FXDragType *,FXuint)241   virtual FXbool dnd_accepts(FXDragType*,FXuint) { return false; }
242 
dnd_provides(FXDragType[])243   virtual FXuint dnd_provides(FXDragType []) {return 0;}
244 
track_double_click()245   virtual FXbool track_double_click() { return false; }
246 
247   virtual ~GMSource();
248   };
249 
250 typedef FXObjectListOf<GMSource> GMSourceList;
251 
252 
253 
254 #endif
255