Sayonara Player
AbstractLibrary.h
1 /* AbstractLibrary.h */
2 
3 /* Copyright (C) 2011-2016 Lucio Carreras
4  *
5  * This file is part of sayonara player
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 
22 
23 #ifndef ABSTRACTLIBRARY_H
24 #define ABSTRACTLIBRARY_H
25 
26 
27 #include "LibraryNamespaces.h"
28 #include "Helper/Filter.h"
29 #include "Helper/Settings/SayonaraClass.h"
30 #include "Helper/Tagging/Tagging.h"
31 #include "Helper/Set.h"
32 
33 #include "Helper/MetaData/Artist.h"
34 #include "Helper/MetaData/Album.h"
35 #include "Helper/MetaData/MetaDataList.h"
36 
37 #include "Components/Library/Sorting.h"
38 
39 #include <QFile>
40 
41 #define prepare_tracks_for_playlist_files static_cast<void (AbstractLibrary::*) (const QStringList&)>(&AbstractLibrary::psl_prepare_tracks_for_playlist)
42 #define prepare_tracks_for_playlist_idxs static_cast<void (AbstractLibrary::*) (const IdxList&)>(&AbstractLibrary::psl_prepare_tracks_for_playlist)
43 
44 
45 typedef int ArtistID;
46 typedef int AlbumID;
47 typedef int TrackID;
48 
49 class PlaylistHandler;
50 class AbstractLibrary : public QObject, protected SayonaraClass
51 {
52  Q_OBJECT
53 
54 public:
55 
56  explicit AbstractLibrary(QObject *parent=nullptr);
57  virtual ~AbstractLibrary();
58 
59 signals:
60  void sig_track_mime_data_available(const MetaDataList&);
61  void sig_all_tracks_loaded (const MetaDataList&);
62  void sig_all_albums_loaded(const AlbumList&);
63  void sig_all_artists_loaded(const ArtistList&);
64 
65  void sig_reloading_library(const QString& message, int progress);
66  void sig_reloading_library_finished();
67 
68  void sig_delete_answer(QString);
69  void sig_import_dialog_requested();
70 
71 
72 
73 public slots:
74 
75  virtual void load();
76 
77  virtual void psl_reload_library(bool clear_first, Library::ReloadQuality quality)=0;
78 
79  /* Clears all filters and searchstrings and fetches everything again */
80  virtual void refetch();
81 
82 
83  /* refetches everything from database as it is, keeping selected elements,
84  the user won't recognize anything at all */
85  virtual void refresh();
86 
87 
88 
89  /* selection changed */
90  virtual void psl_selected_artists_changed(const SP::Set<int>& idx_lst);
91  virtual void psl_selected_albums_changed(const SP::Set<int>& idx_lst);
92  virtual void psl_selected_tracks_changed(const SP::Set<int>& idx_lst);
93 
94 
95  // [albums|artist|track[s]] double clicked -> send tracks to playlist
96  virtual void psl_prepare_album_for_playlist(int idx, bool new_playlist);
97  virtual void psl_prepare_artist_for_playlist(int idx, bool new_playlist);
98 
99 
100  // Those two functions are identical (1) calls (2)
101  virtual void psl_prepare_track_for_playlist(int idx, bool new_playlist);
102  virtual void psl_prepare_tracks_for_playlist(bool new_playlist);
103  virtual void psl_prepare_tracks_for_playlist(const SP::Set<int>& indexes, bool new_playlist);
104  virtual void psl_prepare_tracks_for_playlist(const QStringList& file_paths, bool new_playlist);
105 
106 
107  /* append tracks after current played track in playlist */
108  virtual void psl_play_next_all_tracks();
109  virtual void psl_play_next_tracks(const SP::Set<int>& idx_lst);
110 
111 
112  /* append tracks after last track in playlist */
113  virtual void psl_append_all_tracks();
114  virtual void psl_append_tracks(const SP::Set<int>& idx_lst);
115 
116 
117  /* triggered from outside, when something important has been changed*/
118  virtual void psl_metadata_changed(const MetaData&);
119 
120  /* triggered from outside, when playing time*/
121  virtual void psl_dur_changed(const MetaData&);
122 
123 
124  /* triggered by tagedit */
125  virtual void psl_metadata_id3_changed(const MetaDataList&, const MetaDataList&);
126 
127  // calls fetch_by_filter and emits
128  virtual void psl_filter_changed(const Filter&, bool force=false);
129 
130  /* write new rating to database */
131  virtual void psl_track_rating_changed(int idx, int rating);
132  virtual void psl_album_rating_changed(int idx, int rating);
133 
134  /* a searchfilter has been entered, nothing is emitted */
135  virtual void fetch_by_filter(const Filter& filter, bool force);
136 
137 
138  virtual void delete_tracks(const MetaDataList& v_md, Library::TrackDeletionMode mode)=0;
139 
140  virtual void delete_tracks_by_idx(const SP::Set<int>& indexes, Library::TrackDeletionMode mode);
141  virtual void delete_all_tracks();
142  virtual void delete_current_tracks(Library::TrackDeletionMode mode);
143 
144  virtual void insert_tracks(const MetaDataList& v_md);
145  virtual void import_files(const QStringList& files);
146 
147 
148  /* Check for current selected artist if out of date and
149  * fetch new data */
150  virtual void refresh_artist()=0;
151  virtual void refresh_albums()=0;
152  virtual void refresh_tracks()=0;
153 
154 
155 protected slots:
156  virtual void _sl_sortorder_changed();
157 
158 
159 protected:
160 
161  PlaylistHandler* _playlist=nullptr;
162 
163  MetaDataList _vec_md;
164  AlbumList _vec_albums;
165  ArtistList _vec_artists;
166 
167  // contains ID for artists, albums, tracks
168  SP::Set<ArtistID> _selected_artists;
169  SP::Set<AlbumID> _selected_albums;
170  SP::Set<TrackID> _selected_tracks;
171 
172  Filter _filter;
173  LibSortOrder _sortorder;
174 
175 
176  /* Emit 3 signals with shown artists, shown album, shown tracks */
177  virtual void emit_stuff();
178 
179 
180  virtual void get_all_artists(ArtistList& artists, LibSortOrder so)=0;
181  virtual void get_all_artists_by_searchstring(Filter filter, ArtistList& artists, LibSortOrder so)=0;
182 
183  virtual void get_all_albums(AlbumList& albums, LibSortOrder so)=0;
184  virtual void get_all_albums_by_artist(IDList artist_ids, AlbumList& albums, Filter filter, LibSortOrder so)=0;
185  virtual void get_all_albums_by_searchstring(Filter filter, AlbumList& albums, LibSortOrder so)=0;
186 
187 
188  virtual void get_all_tracks(MetaDataList& v_md, LibSortOrder so)=0;
189  virtual void get_all_tracks(const QStringList& paths, MetaDataList& v_md)=0;
190  virtual void get_all_tracks_by_artist(IDList artist_ids, MetaDataList& v_md, Filter filter, LibSortOrder so)=0;
191  virtual void get_all_tracks_by_album(IDList album_ids, MetaDataList& v_md, Filter filter, LibSortOrder so)=0;
192  virtual void get_all_tracks_by_searchstring(Filter filter, MetaDataList& v_md, LibSortOrder so)=0;
193 
194  virtual void get_album_by_id(int album_id, Album& album)=0;
195  virtual void get_artist_by_id(int artist_id, Artist& artist)=0;
196 
197  virtual void update_track(const MetaData& md)=0;
198  virtual void update_album(const Album& album)=0;
199 
200 
201 private:
202  void set_playlist_action_after_double_click();
203 
204  virtual void restore_artist_selection();
205  virtual void restore_track_selection();
206  virtual void restore_album_selection();
207 
208  virtual MetaDataList change_track_selection(const SP::Set<int>& idx_list);
209  virtual void change_artist_selection(const SP::Set<int>& idx_list);
210  virtual void change_album_selection(const SP::Set<int>& idx_list);
211 
212 };
213 
214 #endif // ABSTRACTLIBRARY_H
Definition: Sorting.h:75
Definition: Filter.h:31
The SayonaraClass class provides access to Settings and notifications.
Definition: SayonaraClass.h:31
Definition: MetaData.h:49
Definition: AbstractLibrary.h:50
Definition: MetaDataList.h:44
The AlbumList class.
Definition: Album.h:72
ArtistList.
Definition: Artist.h:64
The Album class.
Definition: Album.h:40
Global handler for playlists.
Definition: PlaylistHandler.h:47
The Artist class.
Definition: Artist.h:36