Adding a playlist

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,
}