The other feature to add is to show a bigger cover when we click the play button. We'll start by adding a function to get the image from the selection in the playlist:
pub fn pixbuf(&self) -> Option<Pixbuf> { let selection = self.treeview.get_selection(); if let Some((_, iter)) = selection.get_selected() { let value = self.model.get_value(&iter, PIXBUF_COLUMN as i32); return value.get::<Pixbuf>(); } None }
This method to be added to the Playlist structure starts by getting the selection; if there's one, it simply gets the pixbuf from the model and returns it. Otherwise, it returns None.
We can now write a function that will fetch the cover from the playlist and show the image:
use gtk::Image; use playlist::Playlist; fn set_cover(cover: &Image, playlist: &Playlist) { cover.set_from_pixbuf(playlist.pixbuf().as_ref()); cover.show(); }
Add this function in the toolbar module. And, finally, we can call this function from the click event handler of the play button:
let playlist = self.playlist.clone(); let cover = self.cover.clone(); self.toolbar.play_button.connect_clicked(move |_| { if play_button.get_stock_id() == Some(PLAY_STOCK.to_string()) { play_button.set_stock_id(PAUSE_STOCK); set_cover(&cover, &playlist); } else { play_button.set_stock_id(PLAY_STOCK); } });
Here's the result after adding a song and clicking play:
Figure 5.9