Things that can be shown in the right pane:
* playlists - reorderable, not sortable, with save button, with search filter box
* smart playlists - not reorderable, with search filter box
* CD song list - not reorderable, with rip button
* Entire libraries - not reorderable, with search filter box
Thing Reorderable Sortable Drag source Drop target
----- ----------- -------- ----------- -----------
Playlist in database Yes No Yes Yes
Playlist from file Yes No Yes Yes
CD No Yes Yes No
Entire library No Yes Yes No
Album from clicking it in library No Yes Yes No
Smart playlist (library filter) No Yes Yes No
iPod No Yes Yes No
TrackViewPane
BrowserPane
FileBrowserModel
LibraryBrowserModel
BrowserComboBoxModel
or
BrowserPane::Widget
BrowserPane::FileModel
BrowserPane::LibraryModel
BrowserPane::ComboBoxModel
PlaylistPane::Widget
PlaylistPane::PlaylistModel
----------------------------------------------------
Database:
Config: Name, Value
Artists: ArtistID, ArtistName
Albums: AlbumID, ArtistID, AlbumName, AlbumReleaseDate
Tracks: TrackID, AlbumID, TrackName, TrackNumber, TrackRating, TrackURI
Libraries: LibraryID, LibraryName, LibraryIcon
LibraryTracks: LibraryID, TrackID
Playlists: PlaylistID, PlaylistName
PlaylistTracks: PlaylistID, TrackID, PlaylistOrder
MemoryPlaylists: PlaylistID, PlaylistName
MemoryPlaylistTracks: TrackID, PlaylistID, PlaylistOrder, ArtistName, AlbumName,
AlbumReleaseDate, TrackName, TrackNumber, TrackURI
Or, if accessing playlists from the TreeView is too slow, change that too:
Library_<LibraryID>: LibraryOrderID, TrackID
Playlist_<PlaylistID>: PlaylistOrderID, TrackID
MemoryPlaylist_<MemoryPlaylistID>: PlaylistOrderID, ArtistName, AlbumName, etc.
so that the TreeView row is also the sqlite primary key
Database::tidy_up()
- Make sure every artist has at least one album and every album has at least one artist
- For each Album, if all tracks have the same release date set that as the album release date
- Tell sqlite to tidy up unused space in it's database too?
- Call after updating the libraries
-------
Research to see if there's a way to monitor an entire directory tree using something like inotify
------------------
Database/Database
Database/Library : PlaySource
Database/Album : PlaySource
Database/Artist : PlaySource
Database/Playlist : PlaySource
PlaySource
CDSource : PlaySource
NetworkLibrary : PlaySource
RadioSource : PlaySource
Track
typedef boost::shared_ptr<Library> LibraryRef;
typedef boost::shared_ptr<Playlist> PlaylistRef;
typedef boost::shared_ptr<Artist> ArtistRef;
typedef boost::shared_ptr<Album> AlbumRef;
typedef boost::shared_ptr<vector<LibraryRef> > LibraryListRef;
typedef boost::shared_ptr<vector<PlaylistRef> > PlaylistListRef;
typedef boost::shared_ptr<vector<ArtistRef> > ArtistListRef;
typedef boost::shared_ptr<vector<AlbumRef> > AlbumListRef;
Database::get_libraries() : LibraryListRef
Database::get_playlists() : PlaylistListRef
Library::get_artists() : ArtistListRef
Library::get_track(int index) : const Track&
Library::get_name() : const Glib::ustring&
Artist::get_albums() : AlbumListRef
Artist::get_track(int index) : const Track&
Artist::get_name() : const Glib::ustring&
Album::get_track(int index) : const Track&
Album::get_name() : const Glib::ustring&
Playlist::get_track(int index) : const Track&
Playlist::get_name() : const Glib::ustring&
--
- Album/Artist should just use the same infrastructure as the "Search" feature. They could
store a reference to the Library PlaySource inside them, and use the Search to find all
tracks in their album/artist, and pass through any extra search terms