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.