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 GMTRACKVIEW_H
20 #define GMTRACKVIEW_H
21 
22 class GMList;
23 class GMTrackList;
24 class GMSource;
25 class GMTrackItem;
26 class GMAlbumList;
27 class GMAlbumListItem;
28 
29 
30 class GMTrackView : public FXPacker {
31 FXDECLARE(GMTrackView)
32 protected:
33   FX4Splitter       * browsersplit      = nullptr;
34   FX4Splitter       * tagsplit          = nullptr;
35   FXVerticalFrame   * taglistframe      = nullptr;
36   FXHorizontalFrame * filterframe       = nullptr;
37   GMTextField       * filterfield       = nullptr;
38   GMTrackList       * tracklist         = nullptr;
39   GMList            * taglist           = nullptr;
40   GMList            * artistlist        = nullptr;
41   GMAlbumList       * albumlist         = nullptr;
42   GMHeaderButton    * taglistheader     = nullptr;
43   GMHeaderButton    * artistlistheader  = nullptr;
44   GMHeaderButton    * albumlistheader   = nullptr;
45   FXMenuPtr           columnmenu;
46   FXMenuPtr           sortmenu;
47   FXMenuPtr           filtermenu;
48 protected:
49   FXFontPtr           font_listhead;
50 protected:
51   GMColumnList        columns;
52   GMSource          * source = nullptr;
53   FXuint              sort_seed = 0;
54   FXuint              shuffle_seed = 0;
55   FXuint              filtermask = 0;
56   FXuint              view = 0;
57 public:
58   static FXbool reverse_artist;
59   static FXbool reverse_album;
60   static FXbool album_by_year;
61 protected:
62   FXint tracklist_dragging = 0;
63   FXint tracklist_lastline = 0;
64   FXint tracklist_lastposy = 0;
65   FXint tracklist_dropitem = 0;
66   FXint tracklist_posx     = 0;
67   FXint tracklist_posy     = 0;
68 protected:
GMTrackView()69   GMTrackView(){}
70   void initSelection(GMList * list,const FXchar *,const FXString & section="window");
71   void initSelection(GMAlbumList * list,const FXchar *,const FXString & section="window");
72   void saveSelection(GMList * list,const FXchar *,const FXString & section="window") const;
73   void saveSelection(GMAlbumList * list,const FXchar *,const FXString & section="window") const;
74   void configureView(FXuint);
75 protected:
76   void init_track_context_menu(FXMenuPane *pane,FXbool selected);
77   void setAlbumListSort();
78 private:
79   GMTrackView(const GMTrackView&);
80   GMTrackView& operator=(const GMTrackView&);
81 public:
82   enum {
83     ID_ARTIST_LIST_HEADER = FX4Splitter::ID_LAST,
84     ID_ALBUM_LIST_HEADER,
85     ID_TAG_LIST_HEADER,
86     ID_ARTIST_LIST,
87     ID_ALBUM_LIST,
88     ID_TAG_LIST,
89     ID_TRACK_LIST,
90     ID_TRACK_LIST_HEADER,
91     ID_FILTER,
92     ID_FILTER_MODE,
93     ID_TOGGLE_BROWSER,
94     ID_TOGGLE_TAGS,
95     ID_TOGGLE_FILTER,
96     ID_CLOSE_FILTER,
97     ID_COPY,
98     ID_CUT,
99     ID_PASTE,
100     ID_SHOW_CURRENT,
101     ID_COLUMN_FIRST,
102     ID_COLUMN_LAST=ID_COLUMN_FIRST+20,
103     ID_SORT_FIRST,
104     ID_SORT_LAST=ID_SORT_FIRST+20,
105     ID_SORT_SHUFFLE,
106     ID_SORT_BROWSE,
107     ID_SORT_REVERSE,
108     ID_SORT_DEFAULT,
109     ID_CONFIGURE_COLUMNS,
110     ID_FILTER_TRACK,
111     ID_FILTER_ALBUM,
112     ID_FILTER_ARTIST,
113     ID_FILTER_TAG,
114     ID_FILTER_LAST = ID_FILTER_TAG,
115     ID_ALBUMS_VIEW_LIST,
116     ID_ALBUMS_VIEW_BROWSER,
117     ID_COVERSIZE_SMALL,
118     ID_COVERSIZE_MEDIUM,
119     ID_COVERSIZE_BIG,
120     ID_LAST,
121     };
122 public:
123   long onCmdSortTagList(FXObject*,FXSelector,void*);
124   long onCmdSortArtistList(FXObject*,FXSelector,void*);
125   long onCmdSortAlbumList(FXObject*,FXSelector,void*);
126 
127   long onCmdTagSelected(FXObject*,FXSelector,void*);
128   long onCmdArtistSelected(FXObject*,FXSelector,void*);
129   long onCmdAlbumSelected(FXObject*,FXSelector,void*);
130 
131   long onTagContextMenu(FXObject*,FXSelector,void*);
132   long onArtistContextMenu(FXObject*,FXSelector,void*);
133   long onAlbumContextMenu(FXObject*,FXSelector,void*);
134   long onTrackContextMenu(FXObject*,FXSelector,void*);
135   long onTrackHeaderContextMenu(FXObject*,FXSelector,void*);
136 
137   long onCmdTagKeyPress(FXObject*,FXSelector,void*);
138   long onCmdArtistKeyPress(FXObject*,FXSelector,void*);
139   long onCmdAlbumKeyPress(FXObject*,FXSelector,void*);
140   long onCmdTrackKeyPress(FXObject*,FXSelector,void*);
141 
142   long onCmdFilter(FXObject*,FXSelector,void*);
143 
144   long onCmdFilterMask(FXObject*,FXSelector,void*);
145   long onUpdFilterMask(FXObject*,FXSelector,void*);
146 
147 
148   long onCmdBeginDrag(FXObject*,FXSelector,void*);
149   long onCmdDragged(FXObject*,FXSelector,void*);
150   long onCmdEndDrag(FXObject*,FXSelector,void*);
151 
152   long onDndTrackEnter(FXObject*,FXSelector,void*);
153   long onDndTrackLeave(FXObject*,FXSelector,void*);
154   long onDndTrackMotion(FXObject*,FXSelector,void*);
155   long onDndTrackDrop(FXObject*,FXSelector,void*);
156 
157   long onDndMotion(FXObject*,FXSelector,void*);
158   long onDndDrop(FXObject*,FXSelector,void*);
159   long onDndRequest(FXObject*,FXSelector,void*);
160 
161   long onCmdPlayTrack(FXObject*,FXSelector,void*);
162 
163   long onCmdPaste(FXObject*,FXSelector,void*);
164   long onUpdPaste(FXObject*,FXSelector,void*);
165 
166   long onCmdCopy(FXObject*,FXSelector,void*);
167   long onUpdCopy(FXObject*,FXSelector,void*);
168 
169   long onCmdToggleBrowser(FXObject*,FXSelector,void*);
170   long onUpdToggleBrowser(FXObject*,FXSelector,void*);
171 
172   long onCmdToggleTags(FXObject*,FXSelector,void*);
173   long onUpdToggleTags(FXObject*,FXSelector,void*);
174 
175   long onCmdToggleFilter(FXObject*,FXSelector,void*);
176   long onUpdToggleFilter(FXObject*,FXSelector,void*);
177 
178   long onCmdShowCurrent(FXObject*,FXSelector,void*);
179   long onUpdShowCurrent(FXObject*,FXSelector,void*);
180 
181   long onCmdShowColumn(FXObject*,FXSelector,void*);
182   long onUpdShowColumn(FXObject*,FXSelector,void*);
183 
184   long onCmdSortDefault(FXObject*,FXSelector,void*);
185   long onCmdSort(FXObject*,FXSelector,void*);
186   long onUpdSort(FXObject*,FXSelector,void*);
187   long onUpdSortReverse(FXObject*,FXSelector,void*);
188   long onCmdSortBrowse(FXObject*,FXSelector,void*);
189   long onUpdSortBrowse(FXObject*,FXSelector,void*);
190   long onCmdSortShuffle(FXObject*,FXSelector,void*);
191   long onUpdSortShuffle(FXObject*,FXSelector,void*);
192 
193   long onCmdAlbumListView(FXObject*,FXSelector,void*);
194   long onUpdAlbumListView(FXObject*,FXSelector,void*);
195 
196   long onCmdCoverSize(FXObject*,FXSelector,void*);
197   long onUpdCoverSize(FXObject*,FXSelector,void*);
198 
199   long onCmdConfigureColumns(FXObject*,FXSelector,void*);
200 public:
201   GMTrackView(FXComposite* p);
202 
203   void updateFont();
204 
205   void updateColors();
206 
207   void updateIcons();
208 
209   void updateTrackItem(FXint index);
210 
getColumnMenu()211   FXMenuPane * getColumnMenu() const { return columnmenu; }
212 
getSortMenu()213   FXMenuPane * getSortMenu() const { return sortmenu; }
214 
215   FXint numTrackSelected() const;
216 
217   FXbool trackSelected() const;
218 
219   FXbool hasTracks() const;
220 
221   FXbool hasBrowser() const;
222 
223   void getSelectedTags(FXIntList & tags) const;
224 
225   void getSelectedArtists(FXIntList & artists) const;
226 
227   void getSelectedAlbums(FXIntList & albums) const;
228 
229   void getSelectedTracks(FXIntList & tracks) const;
230 
231   void getTracks(FXIntList & tracks) const;
232 
233   FXint findTrackIndexById(FXint id) const;
234 
235   GMTrackItem * getTrackItem(FXint i) const;
236 
237   GMTrackItem * getCurrentTrackItem() const;
238 
239   GMAlbumListItem * getCurrentAlbumItem() const;
240 
241   FXbool isTrackItemSelected(FXint i) const;
242 
243   FXint getNumTracks() const;
244 
245   void selectTagItem(FXint item);
246 
247   void selectAlbumItem(FXint item);
248 
249   void selectArtistItem(FXint item);
250 
251   void selectTrackItem(FXint item);
252 
253   FXint getTag(FXint index) const;
254 
255   FXint getArtist(FXint index) const;
256 
257   FXint getAlbum(FXint index) const;
258 
259   FXint getTrack(FXint index) const;
260 
261   FXbool listTags();
262 
263   FXbool listArtists(FXbool showplaying=true);
264 
265   FXbool listAlbums(FXbool showplaying=true);
266 
267   FXbool listTracks();
268 
269   FXint getActive() const;
270 
271   FXint getCurrent() const;
272 
273   FXint getNextPlayable(FXint,FXbool) const;
274 
275   FXint getNext(FXbool wrap=false);
276 
277   FXint getPreviousPlayable(FXint,FXbool) const;
278 
279   FXint getPrevious();
280 
281   void setSource(GMSource * src);
282 
getSource()283   GMSource * getSource() const { return source; }
284 
285   void sortTags() const;
286 
287   void sortArtists() const;
288 
289   void sortAlbums() const;
290 
291   void sortTracks() const;
292 
293   void resort();
294 
295   void init(GMSource * src);
296 
297   void refreshUpdate();
298 
299   void refresh(FXbool showplaying=true);
300 
301   void clear();
302 
303   void redrawAlbumList();
304 
305   void redrawTrackList();
306 
307   void setActive(FXint item,FXbool show=true);
308 
309   void setCurrent(FXint item);
310 
311   void showCurrent();
312 
313   void setSortMethod(FXint hdr,FXbool reverse=false);
314 
315   FXbool getSortReverse() const;
316 
317   void loadSettings(const FXString & key);
318 
319   void saveSettings(const FXString & key) const;
320 
321   void loadTrackSettings(const FXString & key);
322 
323   void saveTrackSettings(const FXString & key) const;
324 
325   void saveView() const;
326 
327   FXbool focusNext();
328 
329   void selectNext();
330 
331   void selectPrevious();
332 
333   virtual ~GMTrackView();
334   };
335 
336 
337 
338 #endif
339