Playlist

We're now ready to create a new widget: the playlist. We'll need the following new dependencies:

[dependencies]
id3 = "^0.2.0"
m3u = "^1.0.0"

Add their corresponding extern crate statements:

extern crate id3;
extern crate m3u;

Let's create a new module for our playlist:

mod playlist;

In the src/playlist.rs file, we start by creating our model:

use gtk::ListStore;

pub struct Model {
    current_song: Option<String>,
    model: ListStore,
    relm: Relm<Playlist>,
}

The Relm type comes from the relm crate:

use relm::Relm;

It is useful to send messages to a widget. We'll learn more about that in the section about widget communication. Let's add the model initialization function:

use gdk_pixbuf::Pixbuf;
use gtk::{StaticType, Type};

#[widget]
impl Widget for Playlist {
    fn model(relm: &Relm<Self>, _: ()) -> Model {
        Model {
            current_song: None,
            model: ListStore::new(&[
                Pixbuf::static_type(),
                Type::String,
                Type::String,
                Type::String,
                Type::String,
                Type::String,
                Type::String,
                Type::String,
                Pixbuf::static_type(),
            ]),
            relm: relm.clone(),
        }
    }
}

Here, we notice that we use a different signature for the model() method. How is this possible? The method of the trait cannot change, right? It is another convenience brought by the #[widget] crate. In many cases, we don't need these parameters, so they are automatically added if they are needed. The first parameter is relm and we save a copy of it in the model. The second parameter is the model initialization parameter. The ListStore is the same as in Chapter 5, Creating a Music Player, we only save it in our model because we'll need it later.