We're now ready to add the playlist widget to our music player.
We'll use new crates, so add the following to the main.rs file:
extern crate gdk_pixbuf; extern crate id3;
The crate gdk_pixbuf will be used to show and manipulate the cover and the id3 crate to get the metadata from MP3 files.
Also, add the following to Cargo.toml:
gdk-pixbuf = "^0.3.0" id3 = "^0.2.0"
Next, we'll create a new module to contain this new widget:
mod playlist;
We'll start this module by adding a bunch of use statements:
use std::path::Path; use gdk_pixbuf::{InterpType, Pixbuf, PixbufLoader}; use gtk::{ CellLayoutExt, CellRendererPixbuf, CellRendererText, ListStore, ListStoreExt, ListStoreExtManual, StaticType, ToValue, TreeIter, TreeModelExt, TreeSelectionExt, TreeView, TreeViewColumn, TreeViewColumnExt, TreeViewExt, Type, WidgetExt, }; use id3::Tag;
These will be followed by some constants:
const THUMBNAIL_COLUMN: u32 = 0; const TITLE_COLUMN: u32 = 1; const ARTIST_COLUMN: u32 = 2; const ALBUM_COLUMN: u32 = 3; const GENRE_COLUMN: u32 = 4; const YEAR_COLUMN: u32 = 5; const TRACK_COLUMN: u32 = 6; const PATH_COLUMN: u32 = 7; const PIXBUF_COLUMN: u32 = 8; const IMAGE_SIZE: i32 = 256; const THUMBNAIL_SIZE: i32 = 64;
The *_COLUMN constant represents the column we'll show in the playlist. The last one, PIXBUF_COLUMN, is a bit special: it will be a hidden column holding the cover of a bigger size so that we can show this image in the cover widget we created earlier.
Next, we'll create a new structure to hold the widget and its model:
pub struct Playlist { model: ListStore, treeview: TreeView, }