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